robojournal-0.4.2/0000775000175000017500000000000012215171100012541 5ustar willwillrobojournal-0.4.2/license.txt0000644000175000017500000010451312211723646014744 0ustar willwill 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 . robojournal-0.4.2/en_US.dic0000644000175000017500000224621712211723646014265 0ustar willwill56029 0/nm 0th/pt 1/n1 1st/p 1th/tc 2/nm 2nd/p 2th/tc 3/nm 3rd/p 3th/tc 4/nm 4th/pt 5/nm 5th/pt 6/nm 6th/pt 7/nm 7th/pt 8/nm 8th/pt 9/nm 9th/pt A/SM AA/M AAA AB/M ABA ABC/M ABM/SM ABS AC/M ACLU ACT ACTH/M AD/M ADC ADD ADP/M AF AFAIK/S AFB AFC AFDC AFN AFT AI/SM AIDS/M AIDSes AK AL AM/M AMA ANSI/S ANZUS AOL/M AP APB APO APR AR ARC ASAP ASCII/SM ASL/M ASPCA ATM/M ATP/M ATV AV AWACS AWOL/M AZ/M AZT/M Aachen Aaliyah/M Aaren/M Aarika/M Aaron Ab/M Abagael/M Abagail/M Abba/S Abbasid Abbe/M Abbey/M Abbi/M Abbie/M Abbot/M Abbott/M Abby/M Abbye/M Abdel/M Abdul/M Abe/M Abel/M Abelard Abelson/M Aberdeen/M Abernathy/M Abeu/M Abey/M Abidjan/M Abie/M Abigael/M Abigail Abigale/M Abilene Abner/M Aborigine/MS Abra/M Abraham/M Abrahan/M Abram/MS Abramo/M Abran/M Absalom Abuja Abyssinia/M Abyssinian/M Ac/M Acadia/M Acapulco/M Accra/M Acevedo/M Achaean/M Achebe/M Achernar Acheson/M Achilles/M Aconcagua/M Acosta/M Acropolis Acrux/M Actaeon Acton Acts Acuff/M Ad/MN Ada/SM Adah/M Adair/M Adaline/M Adam/SM Adamo/M Adan/M Adana Adar/M Adara/M Adda/M Addams Adderley/M Addi/M Addia/M Addie/M Addison Addy/M Ade/M Adel/M Adela/M Adelaida/M Adelaide/M Adelbert/M Adele/M Adelheid/M Adelice/M Adelina/M Adelind/M Adeline/M Adella/M Adelle/M Aden/M Adena/M Adenauer Adey/M Adham/M Adhara/M Adi/M Adiana/M Adidas/M Adina/M Adirondack/MS Adirondacks/M Adkins/M Adlai/M Adler Adm Admiralty Ado/M Adolf/M Adolfo/M Adolph/M Adolphe/M Adolpho/M Adolphus/M Adonis/MS Adora/M Adore/M Adoree/M Adorne/M Adrea/M Adrenalin/MS Adria/MX Adrian Adriana/M Adriane/M Adrianna/M Adrianne/M Adriano/M Adriatic/M Adrien/M Adriena/M Adrienne/M Advent/MS Adventist/MS Advil/M Aegean/M Aelfric/M Aeneas/M Aeneid/M Aeolus/M Aeriel/M Aeriela/M Aeriell/M Aeroflot/M Aeschylus/M Aesculapius/M Aesop/M Afghan/SM Afghanistan/M Afr Africa/M African/SM Afrikaans/M Afrikaner/SM Afro/SM Afrocentric Afrocentrism Afton/M Ag/M Agace/M Agamemnon/M Agana Agassi/M Agassiz/M Agata/M Agatha/M Agathe/M Aggi/M Aggie Aggy/M Aglaia Agna/M Agnella/M Agnes Agnese/M Agnesse/M Agneta/M Agnew/M Agni/M Agnola/M Agosto/M Agra Agretha/M Agricola Agrippa/M Agrippina/M Aguascalientes Aguie/M Aguilar/M Aguinaldo/M Aguirre/M Aguistin/M Aguste/M Agustin/M Ahab/M Aharon/M Ahmad/M Ahmadabad Ahmed/M Ahriman/M Aida/M Aidan/M Aigneis/M Aiken Aila/M Ailbert/M Aile/M Ailee/M Aileen/M Ailene/M Ailey/M Aili/SM Ailina/M Ailsun/M Ailyn/M Aime/M Aimee/M Aimil/M Aindrea/M Ainslee/M Ainsley/M Ainslie/M Ainu Airedale/MS Aisha Ajax/M Ajay/M Akbar Akhmatova/M Akihito Akim/M Akita Akkad Akron/M Aksel/M Al/MY Ala/S Alabama/M Alabaman/MS Alabamian/SM Aladdin/M Alain/M Alaine/M Alair/M Alameda/M Alamo/M Alamogordo/M Alan/M Alana/M Alanah/M Aland/M Alane/M Alanna/M Alano/M Alanson/M Alar/M Alard/M Alaric Alasdair/M Alaska/M Alaskan/MS Alastair/M Alasteir/M Alaster/M Alayne/M Alba Albania/M Albanian/MS Albany/M Albee Alberik/M Alberio/M Albert Alberta/M Albertan Albertina/M Albertine/M Alberto/M Albie/M Albigensian Albina/M Albion Albireo/M Albrecht/M Albuquerque/M Alcatraz Alcestis Alcibiades Alcmena/M Alcoa/M Alcott Alcuin Alcyone Aldan Aldebaran/M Alden Alderamin/M Aldin/M Aldis/M Aldo/M Aldon/M Aldous/M Aldric/M Aldrich/M Aldridge/M Aldrin/M Aldus/M Aldwin/M Alec/M Alecia/M Aleda/M Aleece/M Aleen/M Aleichem/M Alejandra/M Alejandrina/M Alejandro/M Alejoa/M Aleksandr/M Alembert/M Alena/M Alene/M Aleppo/M Alessandra/M Alessandro/M Aleta/M Alethea/M Aleut/MS Aleutian/SM Alex/M Alexa/M Alexander/MS Alexandr/M Alexandra Alexandre/M Alexandria/M Alexandrian Alexandrina/M Alexandro/MS Alexei/M Alexi/MS Alexia/M Alexina/M Alexine/M Alexio/M Alf/M Alfi/M Alfie/M Alfons/M Alfonse/M Alfonso/M Alfonzo/M Alford/M Alfred Alfreda/M Alfredo Alfy/M Algenib/M Alger Algeria/M Algerian/SM Algernon/M Algieba/M Algiers/M Algol/M Algonquian/SM Algonquin/MS Alhambra Alhena/M Ali/S Alia/M Alic/M Alica/M Alice/M Alicea/M Alicia/M Alick/M Alida/M Alidia/M Alie/M Alighieri/M Alika/M Alikee/M Alina/M Aline/M Alioth/M Alisa/M Alisander/M Alisha/M Alison/M Alissa/M Alistair/M Alister/M Alisun/M Alix/M Aliza/M Alkaid/M Alla/M Allah/M Allahabad Allan/M Allard/M Allayne/M Alleen/M Alleghenies/M Allegheny/S Allegra/M Allen Allende/M Allene/M Allentown Alley/M Alleyn/M Allhallows/M Alli/SM Allianora/M Allie/M Allin/M Allina/M Allison/M Allissa/M Allister/M Allistir/M Allix/M Allstate/M Allsun/M Allx/M Ally/SM Allyce/M Allyn/M Allys Allyson/M Alma/M Almach/M Almaty/M Almeda/M Almeria/M Almeta/M Almighty/M Almira/M Almire/M Almohad/M Almoravid/M Alnilam/M Alnitak/M Aloin/M Aloise/M Aloisia/M Alon/M Alonso/M Alonzo/M Aloysia/M Aloysius/M Alpert/M Alphard/M Alphecca/M Alpheratz/M Alphonse/M Alphonso/M Alpine Alpo/M Alps/M Alric/M Alsace/M Alsatian/SM Alsop/M Alston/M Alta Altai/M Altaic/M Altair Altamira Althea/M Altiplano/M Altman/M Altoids/M Alton/M Aludra/M Aluin/M Aluino/M Alva Alvan/M Alvarado/M Alvarez/M Alvaro/M Alvera/M Alverta/M Alvie/M Alvin/M Alvina/M Alvinia/M Alvira/M Alvis/M Alvy/M Alwin/M Alwyn/M Alyce/M Alyda/M Alyosha/M Alys/M Alysa/M Alyse/M Alysia/M Alyson/M Alyss Alyssa/M Alzheimer/M Am/MNR Amabel/M Amabelle/M Amadeus/M Amado/M Amalea/M Amalee/M Amaleta/M Amalia/M Amalie/M Amalita/M Amalle/M Amanda/M Amandi/M Amandie/M Amandy/M Amara/M Amargo/M Amarillo Amaru/M Amata/M Amaterasu/M Amati Amazon/SM Amazonian Amber/MY Amberly/M Amble/M Ambros/M Ambrose Ambrosi/M Ambrosio/M Ambrosius/M Ambur/M Amby/M Ame/M Amelia/M Amelie/M Amelina/M Ameline/M Amelita/M Amen/M Amenhotep/M Amerasian America/SM American/MS Americana/M Americanism/SM Americanization/SM Americanize/DSG Amerigo/M Amerind/SM Amerindian/SM Amery/M Ameslan/M Amharic/M Amherst Ami/M Amie/M Amiga/M Amii/M Amil/M Amish/M Amitie/M Amity/M Ammamaria/M Amman/M Amoco/M Amory/M Amos Amparo/M Ampere/M Amritsar Amsterdam/M Amtrak Amundsen Amur/M Amway/M Amy/M Amye/M Ana/M Anabal/M Anabaptist/M Anabel/M Anabella/M Anabelle/M Anacin/M Anacreon Anaheim Analects/M Analiese/M Analise/M Anallese/M Anallise/M Ananias/M Anasazi Anastasia Anastasie/M Anastassia/M Anatol/M Anatola/M Anatole/M Anatolia/M Anatolian/M Anatollo/M Anaxagoras Ancell/M Anchorage/M Andalusia/M Andalusian Andaman Andean Andee/M Andeee/M Anderea/M Anders/N Andersen/M Anderson Andes/M Andi/M Andie/M Andonis/M Andorra/M Andorran/SM Andra/MS Andre/MS Andrea/SM Andreana/M Andree/M Andrei/M Andrej/M Andrew/SM Andrey/M Andria/M Andriana/M Andrianampoinimerina/M Andriette/M Andris Andromache Andromeda/M Andropov Andros Andrus/M Andy/M Anestassia/M Anet/M Anett/M Anetta/M Anette/M Angara Ange/M Angel/M Angela/M Angele/M Angeli/M Angelia/M Angelica Angelico Angelika/M Angelina/M Angeline/M Angelique/M Angelita/M Angelle/M Angelo/M Angelou Angevin/M Angie/M Angil/M Angkor Angle/MS Anglia Anglican/SM Anglicanism/MS Anglicism/MS Anglicization Anglicize Anglo Anglophile Anglophobe Angola/M Angolan/MS Angora/SM Angstrom Anguilla/M Angus/M Angy/M Ania/M Aniakchak/M Anibal/M Anica/M Anissa/M Anita/M Anitra/M Anjanette/M Anjela/M Ankara/M Ann/M Anna Annabal/M Annabel/M Annabela/M Annabell/M Annabella/M Annabelle/M Annadiana/M Annadiane/M Annalee/M Annaliese/M Annalise/M Annam/M Annamaria/M Annamarie/M Annapolis/M Annapurna/M Anne Annecorinne/M Anneliese/M Annelise/M Annemarie/M Annetta/M Annette/M Anni/SM Annice/M Annie/M Annissa/M Annmaria/M Annmarie/M Annnora/M Annora/M Annunciation/MS Anny/M Anouilh Ansel/M Ansell/M Anselm Anselma/M Anselmo/M Anshan/M Ansley/M Anson/M Anstice/M Antaeus Antananarivo/M Antarctic/M Antarctica/M Antares/M Anthe/M Anthea/M Anthia/M Anthiathia/M Anthony Antichrist/MS Antietam Antigone/M Antigua/M Antillean Antilles/M Antin/M Antioch Antipas/M Antipodes Antofagasta/M Antoine/M Antoinette Anton/MS Antone/M Antonella/M Antonetta/M Antoni/M Antonia/M Antonie/M Antonietta/M Antonin/M Antonina/M Antonino/M Antoninus Antonio/M Antonius Antony/M Antwan/M Antwerp/M Anubis/M Any/M Anya/M Anzac Apache/SM Apalachicola/M Apennines Aphrodite/M Apia Apocalypse/M Apocrypha/M Apollinaire Apollo/SM Apollonian Appalachia/M Appalachian/S Appaloosa/SM Apple/M Appleseed Appleton Appolonia/M Appomattox Apr/M April/MS Aprilette/M Apuleius Aquafresh/M Aquarius/MS Aquila Aquinas/M Aquino/M Aquitaine/M Ar/MY Ara/M Arab/SM Arabel/M Arabela/M Arabele/M Arabella/M Arabelle/M Arabia/M Arabian/MS Arabic/M Arabist/MS Araby Araceli/M Arafat/M Araguaya/M Aral/M Araldo/M Aramaic/M Aramco/M Arapaho/MS Arapahoes Ararat/M Araucanian Arawak/M Arawakan/M Arbitron/M Arcadia/M Arcadian/M Arch/R Archaimbaud/M Archambault/M Archean Archibald/M Archibaldo/M Archibold/M Archie/M Archimedes Archy/M Arctic/M Arcturus/M Arda/MH Ardabil Ardath/M Ardeen/M Ardelia/M Ardelis/M Ardella/M Ardelle/M Arden Ardene/M Ardenia/M Ardine/M Ardis/M Ardisj/M Ardith/M Ardra/M Ardyce/M Ardys Ardyth/M Arel/M Arequipa Ares Aretha/M Argentina/M Argentine Argentinean Argentinian/MS Argo/S Argonaut/MS Argonne/M Argus/M Ari/M Ariadne/M Ariana/M Arianism/M Aridatha/M Arie/SM Ariel Ariela/M Ariella/M Arielle/M Aries/MS Arin/M Ario/M Ariosto Aristarchus/M Aristides Aristophanes/M Aristotelian/M Aristotle/M Arius/M Ariz Arizona/M Arizonan/SM Arizonian/MS Arjuna Ark Arkansan/MS Arkansas/M Arkhangelsk Arkwright Arlan/M Arlana/M Arlee/M Arleen/M Arlen/M Arlena/M Arlene/M Arleta/M Arlette/M Arley/M Arleyne/M Arlie/M Arliene/M Arlin/M Arlina/M Arlinda/M Arline/M Arlington Arluene/M Arly/M Arlyn/M Arlyne/M Armageddon/SM Armagnac/M Arman/M Armand/M Armando/M Armani/M Armenia/M Armenian/SM Armin/M Arminius/M Armonk/M Armour/M Armstrong/M Arnaldo/M Arne Arneb/M Arney/M Arnhem Arni/M Arnie/M Arno/M Arnold Arnoldo/M Arnuad/M Arnulfo/M Arny/M Aron/M Arrhenius Arri/M Arron/M Art/M Artair/M Artaxerxes/M Arte/M Artemas Artemis/M Artemus/M Arther/M Arthur/M Arthurian Artie/M Artur/M Arturo/M Artus/M Arty/M Aruba/M Arv/M Arvie/M Arvin/M Arvy/M Aryan/MS Aryn/M Asa/M Asama/M Ascella/M Ascension/M Ase/M Asgard Ash/MRY Ashanti Ashbey/M Ashby/M Ashcroft Ashe/Y Ashely/M Ashgabat Ashia/M Ashien/M Ashikaga/M Ashil/M Ashkenazim Ashkhabad/M Ashla/M Ashlan/M Ashlee/M Ashleigh/M Ashlen/M Ashley/M Ashli/M Ashlie/M Ashlin/M Ashly/M Ashmolean/M Ashton Ashurbanipal Asia/M Asian/MS Asiatic/SM Asimov Asmara Asoka Aspell/M Aspen/M Aspidiske/M Asquith Assad/M Assam/M Assamese/M Assembly Assisi Assyria/M Assyrian/SM Astaire Astana/M Astarte/M Aston Astor Astoria Astra/M Astrakhan Astrid/M Astrix/M AstroTurf Asturias Asuncion/M Aswan/M At/SM Atacama/M Atahualpa Atalanta Atari/M Ataturk/M Athabasca/M Athabaskan/MS Athena/M Athene/M Athenian/SM Athens/M Atkins/M Atkinson Atlanta/M Atlante/SM Atlantic/M Atlantis/M Atlas/MS Atman Atreus Atria/M Atropos/M Attic/M Attica/M Attila/M Attlee Attn Attucks Atwood/M Au/M Aube Auberon/M Aubert/M Auberta/M Aubine/M Aubree/M Aubrette/M Aubrey Aubrie/M Aubry/M Auckland Auden/M Audi/M Audie/M Audion/M Audra/M Audre/M Audrey/M Audrie/M Audry/M Audrye/M Audubon Audy/M Aug/M Augean Augie/M Augsburg August/MS Augusta/M Augustan Auguste/M Augustin/M Augustina/M Augustine/M Augustinian/MS Augusto/M Augustus/M Augy/M Aundrea/M Aura/M Aurangzeb Aurea/M Aurel/M Aurelea/M Aurelia/M Aurelie/M Aurelio/M Aurelius Aureomycin/M Auria/M Aurie/M Auriga/M Aurilia/M Aurlie/M Auroora/M Aurora/M Aurore/M Aurthur/M Auschwitz Aussie/MS Austen Austerlitz/M Austin/MS Austina/M Austine/M Australasia/M Australasian Australia/M Australian/MS Australoid Australopithecus/M Austria/M Austrian/SM Austronesian/M Autumn/M Av/M Ava/M Avalon Ave Aveline/M Aventine Averell/M Averil/M Averill/M Avernus Averroes Avery/M Averyl/M Avesta/M Avicenna Avictor/M Avie/M Avigdor/M Avignon Avila/M Avior/M Avis Aviva/M Avivah/M Avogadro Avon Avram/M Avril/M Avrit/M Avrom/M Ax/M Axe/M Axel Axis Axum Ayala/M Ayers Aylmar/M Aylmer/M Aymara Aymer/M Ayn/M Ayrshire/M Ayurveda Ayyubid/M Azana/M Azania/M Azazel Azerbaijan/M Azerbaijani/MS Azores/M Azov Aztec/SM Aztecan/M Aztlan/M B/MNRTG BA/M BASIC/SM BB/M BBB BBC BBQ BBS BBSes BC/M BIA BIOS BITNET/S BLT/SM BM/M BMW/M BO BPOE BR BS/M BSA BSD/S BTU BTW BYOB Ba/M Baal/SM Bab/SM Babara/M Babb/M Babbage Babbette/M Babbie/M Babbitt Babel/MS Babette/M Babita/M Babylon/MS Babylonia/M Babylonian/SM Bacall/M Bacardi Bacchanalia/M Bacchic Bacchus/M Bach/M Backus/M Bacon/M Bactria Baden Badlands/M Baedeker/MS Baez Baffin/M Baggies Baghdad/M Baguio Baha'i Baha'ullah Bahama/SM Bahamanian Bahamas/M Bahamian/MS Bahia Bahrain/M Baikal Bail/M Bailey/M Bailie/M Baillie/M Baily/M Baird Bakelite/M Baker Bakersfield Baku/M Bakunin Balanchine Balaton Balboa Bald/MR Balder/M Balduin/M Baldwin/SM Bale/M Balearic/M Balfour Bali/M Balinese/M Balkan/S Balkhash Ball Ballard/M Balthazar Baltic/M Baltimore/M Baluchistan Balzac/M Bamako/M Bambi/M Bambie/M Bamby/M Ban/M Banach/M Bancroft/M Bandung/M Bangalore Bangkok/M Bangladesh/M Bangladeshi/MS Bangor Bangui/M Banjarmasin/M Banjul Bank/SM Banky/M Banneker/M Bannister Banting Bantu/MS Baotou/M Baptist/SM Baptiste/M Bar/H Barabbas Barb/MR Barbabas/M Barbabra/M Barbadian/SM Barbados/M Barbara/M Barbaraanne/M Barbarella/M Barbarossa/M Barbary/M Barbe/M Barbee/M Barbette/M Barbey/M Barbi/M Barbie Barbour/M Barbra/M Barbuda/M Barby/M Barcelona/M Barclay/M Bard/M Barde/M Bardeen/M Barents/M Bari/M Barker/M Barkley/M Barlow/M Barn/M Barnabas Barnabe/M Barnaby/M Barnard Barnaul Barnebas/M Barnes Barnett/M Barney/M Barnie/M Barnum Barny/M Baroda Baron/M Barquisimeto Barr/M Barranquilla Barrera/M Barret/M Barrett/M Barri/MS Barrie/M Barron/M Barry Barrymore Bart Bartel/M Barth/S Barthel/M Bartholdi/M Bartholemy/M Bartholomeo/M Bartholomeus/M Bartholomew Bartie/M Bartlet/M Bartlett Bartok Bartolemo/M Bartolomeo/M Barton Bartram/M Barty/M Baruch Bary/M Baryram/M Baryshnikov Base/M Basel/M Basho/M Basia/M Basie Basil Basile/M Basilio/M Basilius/M Basque/MS Basra Bass/M Basseterre/M Bastian/M Bastien/M Bastille/M Basutoland/M Bat/M Bataan/M Bates Batholomew/M Bathsheba Batista Batman/M Batsheva/M Battle/M Batu/M Baudelaire/M Baudoin/M Baudouin/M Bauer Bauhaus/M Baum Bavaria/M Bavarian Bax Baxie/M Baxter/M Baxy/M Bay/MR Bayamon Bayard Bayer/M Bayes Bayesian Bayeux/M Baylor/M Bayonne/M Bayreuth Baywatch/M Be/MH Bea/M Beach/M Beadle Beale/M Bealle/M Bean/M Bear/M Beard/M Beardmore/M Beardsley Bearnaise/M Bearnard/M Beasley/M Beatlemania/M Beatles/M Beatrice/M Beatrisa/M Beatrix/M Beatriz/M Beau/M Beaufort Beaujolais/M Beaumarchais Beaumont Beauregard/M Beauvoir Bebe/M Becca/M Bechtel/M Beck/MR Becka/M Becker/M Becket/M Beckett/M Becki/M Beckie/M Becky/M Becquerel Bede Bedouin/SM Bee/M Beebe/M Beecher Beefaroni/M Beelzebub/M Beerbohm Beethoven/M Beeton/M Begin Behan Behring Beiderbecke Beijing/M Beilul/M Beirut/M Beitris/M Bekesy/M Bekki/M Bel/M Bela/M Belarus/M Belau/M Belem/M Belfast/M Belg Belgian/SM Belgium/M Belgrade/M Belia/M Belicia/M Belinda/M Belita/M Belize/M Bell/M Bella/M Bellamy/M Bellanca/M Bellatrix/M Belle/M Bellina/M Bellini Bellow Belmont/M Belmopan Belorussian/MS Belshazzar/M Beltane Beltran/M Belushi/M Belva/M Belvia/M Ben/M Benacerraf/M Benchley/M Bender/M Bendick/M Bendicty/M Bendite/M Bendix/M Benedetta/M Benedetto/M Benedick/M Benedict/M Benedicta/M Benedictine/SM Benedicto/M Benedikt/M Benedikta/M Benelux/M Benet Benetta/M Benetton/M Bengal/SM Bengali/M Benghazi/M Bengt/M Beniamino/M Benin/M Beninese/M Benita/M Benito/M Benjamen/M Benjamin Benji/M Benjie/M Benjy/M Benn/M Bennett Benni/M Bennie/M Benny/M Benoit/M Benoite/M Benson/M Bent/M Bentham Bentlee/M Bentley Benton Benyamin/M Benz Benzedrine/M Beowulf Ber/MG Berber/SM Berenice/M Beret Beretta/M Berg/NR Bergen/M Berger/M Bergerac Berget/M Bergman Bergson Beria Berk/MY Berke/M Berkeley/M Berkie/M Berkley/M Berkly/M Berkshire/SM Berky/M Berle/M Berlin/SZMR Berliner/M Berlioz Berlitz/M Bermuda/SM Bermudan/SM Bermudian/SM Bern/M Berna/M Bernadene/M Bernadette Bernadina/M Bernadine/M Bernard Bernardina/M Bernardine Bernardo/M Bernarr/M Bernays/M Bernbach/M Bernelle/M Bernese Bernete/M Bernetta/M Bernette/M Bernhard/M Bernhardt Berni/M Bernice/M Bernie/M Bernini Bernita/M Bernoulli Bernstein Berny/M Berra/M Berri/M Berrie/M Berry Bert/M Berta/M Berte/M Bertelsmann/M Bertha/M Berthe/M Berti/M Bertie/M Bertillon/M Bertina/M Bertine/M Berton/M Bertram/M Bertrand/M Bertrando/M Berty/M Beryl/M Beryle/M Berzelius Bess Bessel Bessemer/M Bessie Bessy/M Best/M Betelgeuse/M Beth/M Bethanne/M Bethany Bethe Bethena/M Bethesda Bethina/M Bethlehem Bethune Betsey/M Betsy/M Betta/M Bette/M Betteann/M Betteanne/M Betti Bettie/M Bettina/M Bettine/M Betty/M Bettye/M Beulah Bevan Beverie/M Beverlee/M Beverley/M Beverlie/M Beverly/M Bevin Bevon/M Bevvy/M Beyer Bhopal Bhutan/M Bhutanese/M Bhutto/M Bi/M Bialystok Bianca/M Bianka/M Bib Bibbie/M Bibby/M Bibbye/M Bibi/M Bible/MS Bic/M Biddie/M Biddle Biddy/M Bidget/M Bierce Bigfoot/M Biggles/M Biko/M Bil/MY Bilbao Bilbo/M Bili/M Bill/MJ Billi/M Billie/M Billings/M Billy/M Billye/M Bimini/M Bink/M Binky/M Binni/M Binnie/M Binny/M Bioko/M Birch/M Bird Birdie/M Birdseye/M Birgit/M Birgitta/M Birk/M Birkenstock Birmingham/M Biro/M Biron/M Biscay Biscayne/M Bishkek Bishop/M Bismarck/M Bismark/M Bisquick/M Bissau/M Bizet Bjorn/M Bk/M Blackbeard/M Blackburn/M Blackfeet Blackfoot/M Blackpool/M Blackshirt/M Blackstone Blackwell Blaine/M Blair/M Blaire/M Blake Blakelee/M Blakeley/M Blanca/M Blanch/M Blancha/M Blanchard/M Blanche/M Blane/M Blankenship/M Blantyre/M Blatz/M Blavatsky Blayne/M Blenheim/M Blevins/M Bligh/M Blinni/M Blinnie/M Blinny/M Bliss Blisse/M Blithe/M Bloch Blockbuster/M Bloemfontein/M Blondel/M Blondell/M Blondelle/M Blondie/M Blondy/M Bloom/MR Bloomfield Bloomingdale/M Bloomsbury Blucher/M Bluebeard/M Blvd Blythe/M Bo/MRZ Boadicea Boas/M Bob/M Bobbe/M Bobbee/M Bobbette/M Bobbi/M Bobbie/M Bobbitt/M Bobby/M Bobbye/M Bobette/M Bobina/M Bobine/M Bobinette/M Boccaccio Bodhidharma/M Bodhisattva/M Boeing/M Boeotia/M Boeotian Boer/M Boethius Bogart/M Bogey/M Bogota/M Bohemia Bohemian/SM Bohr Boigie/M Boise/M Bojangles/M Boleyn/M Bolivar/M Bolivia/M Bolivian/MS Bologna/M Bolshevik/SM Bolshevism Bolshevist Bolshoi/M Bolton Boltzmann Bombay/M Bonaparte Bonaventure Bond/M Bondie/M Bondon/M Bondy/M Bone/M Bonhoeffer/M Boniface Bonita/M Bonn/MR Bonnee/M Bonner/M Bonneville/M Bonni/M Bonnibelle/M Bonnie/M Bonny Booker/M Boole/M Boolean Boone/M Boonie/M Boony/M Boot/M Boote/MS Bootes/M Booth Boothe/M Bord/MN Bordeaux/M Borden/M Bordie/M Bordon/M Bordy/M Boreas/M Borg/SM Borges Borgia Borglum Boris Bork/M Borlaug/M Born Borneo/M Borobudur/M Borodin Boru/M Bosch Bose Bosnia/M Bosnian Bosporus/M Boston/MS Bostonian Boswell Botswana/M Botticelli Boulder Boulez/M Bourbaki/M Bourbon/SM Bourke/M Bournemouth Bovary/M Bowditch/M Bowell/M Bowen/M Bowers Bowery/M Bowie Bowman/M Boy/MR Boyce/M Boycey/M Boycie/M Boyd Boyer/M Boyle Br/MNT Brad/MNY Bradan/M Bradbury Braddock/M Brade/M Braden/M Bradford Bradley Bradly/M Bradney/M Bradshaw/M Bradstreet/M Brady Bragg/M Brahe Brahma/MS Brahmagupta/M Brahman/MS Brahmani Brahmanism/SM Brahmaputra/M Brahms/M Braille/MS Brain/M Bram/M Brampton/M Bran/M Brana/M Branch/M Brand/MNR Brandais/M Brande/M Brandea/M Brandeis Branden/M Brandenburg Brander/M Brandi/M Brandice/M Brandie/M Brandise/M Brando Brandon/M Brandt Brandtr/M Brandy/M Brandyn/M Brannon/M Brant/M Brantley/M Braque Brasilia/M Bratislava Brattain/M Bray/M Brazil/M Brazilian/MS Brazos/M Brazzaville/M Breanne/M Brear/M Breathalyzer Brecht Breckenridge/M Bree/M Breena/M Bremen Bren/M Brena/M Brenda/M Brendan/M Brenden/M Brendin/M Brendis/M Brendon/M Brenn/MNR Brenna/M Brennan/M Brennen/M Brenner/M Brent/M Brenton/M Bret/M Breton/M Brett/M Brew/MR Brewer/M Brewster Brezhnev Bria/M Brian/M Briana/M Brianna/M Brianne/M Briano/M Briant/M Brice/M Bridalveil/M Bride/M Bridgeport/M Bridger/M Bridges Bridget/M Bridgetown Bridgett/M Bridgette/M Bridgman Bridie/M Brie/RSM Brien/M Brier/M Brietta/M Brig Brigadoon Brigg/MS Brigham/M Bright Brighton/M Brigid/M Brigida/M Brigit/M Brigitta/M Brigitte/M Brillo Brina/M Briney/M Brinkley/M Brinn/M Brinna/M Briny/M Brion/M Brisbane/M Bristol/M Brit/SM Brita/M Britain/M Britannia Britannic Britannica/M Briticism/SM British/MRZ Britisher/M Britney/M Britni/M Briton/MS Britt/MN Britta/M Brittan/M Brittaney/M Brittani/M Brittany/SM Britte/M Britteny/M Brittne/M Brittney/M Brittni/M Brnaba/M Brnaby/M Brno Broadway/SM Brobdingnag/M Brobdingnagian Brock/M Brockie/M Brocky/M Brod/M Broddie/M Broddy/M Broderic/M Broderick/M Brodie/M Brody/M Brok/M Brokaw/M Bron/M Bronnie/M Bronny/M Bronson/M Bronte Bronx/M Brook/MS Brooke Brooklyn/M Bros Brose/M Brown/G Browne Brownian/M Brownie/S Brownshirt Brownsville Brubeck Bruce/M Brucie/M Bruckner Bruegel Bruis/M Brummel/M Brunei/M Bruneian/MS Brunelleschi Brunhilda/M Brunhilde/M Bruno Brunswick/M Brussels/M Brut/M Brutus/M Bryan Bryana/M Bryant Bryanty/M Bryce/M Bryn/M Bryna/M Brynn/MR Brynna/M Brynne/M Brynner/M Bryon/M Brzezinski/M Btu/M Buber Buchanan/M Bucharest/M Buchenwald Buchwald/M Buck Buckie/M Buckingham Buckley/M Buckner/M Bucky/M Bud/M Budapest/M Budd/M Buddha/SM Buddhism/SM Buddhist/SM Buddie/M Buddy/M Budweiser/M Buffalo/M Buffy/M Buford/M Bugatti/M Buick/M Buiron/M Bujumbura/M Bukhara Bukharin Bulawayo Bulfinch Bulganin Bulgar Bulgaria/M Bulgarian/SM Bullock/M Bullwinkle/M Bultmann/M Bumppo/M Bunche Bundestag Bunin Bunker/M Bunni/M Bunnie/M Bunny/M Bunsen Bunuel/M Bunyan/M Burbank Burch/M Burg/MR Burger/M Burgess Burgoyne/M Burgundian Burgundy/SM Burk/SM Burke Burl/M Burlie/M Burlington/M Burma/M Burmese/M Burnaby/M Burnard/M Burnett Burns Burnside Burr Burris/M Burroughs Bursa Burt/M Burtie/M Burton/M Burty/M Burundi/M Burundian/MS Busch/M Bush/M Bushido Bushnell/M Butch/M Butler Butterfingers/M Buxtehude Byblos/M Byers/M Byram/M Byran/M Byrann/M Byrd Byrle/M Byrom/M Byron Byronic Byzantine/MS Byzantium/M C/SMDY CA CAD/M CAI CAM CAP CARE CATV CB CBC/M CBS CCTV CCU CD/M CDC CDT CEO/M CF CFC/M CFO CIA/M CID CNN CNS/M CO/M COBOL/SM COD COL COLA CPA/M CPI/M CPO CPR/M CPU/M CRT/SM CST/M CT/M CV CZ Ca/M Cabernet/M Cabot Cabral Cabrera/M Cabrini Cacilia/M Cacilie/M Cad/M Caddric/M Cadette Cadillac Cadiz/M Caedmon/M Caerphilly Caesar/SM Cage Cagney/M Cahokia/M Cahra/M Caiaphas Cain/SM Cairistiona/M Cairo/M Caitlin/M Caitrin/M Cajun/MS Cal/Y Calais Calcutta/M Calder Calderon/M Caldwell Cale/M Caleb/M Caledonia Calgary/M Calhoun Cali Caliban Calida/M Calif California/M Californian/MS Caligula Calla/MS Callaghan Callahan/M Callao Callean/M Calley/M Calli/M Callida/M Callie/M Calliope/M Callisto/M Cally/M Caloocan/M Calv/M Calvary/M Calvert Calvin/M Calvinism/MS Calvinist/MS Calvinistic Calypso Cam Camacho/M Camala/M Cambodia/M Cambodian/SM Cambrian/SM Cambridge/M Camden/M Camel/M Camella/M Camellia/M Camelopardalis Camelot/MS Camembert/MS Cameron/M Cameroon/SM Cameroonian/SM Camey/M Cami/M Camila/M Camile/M Camilla/M Camille/M Cammi/M Cammie/M Cammy/M Camoens/M Campbell Campinas Campos Camry/M Camus Can Canaan/M Canaanite/MS Canad Canada/M Canadian/SM Canadianism Canaletto Canaries/M Canaveral Canberra/M Cancer/SM Cancun/M Candace/M Candi/MS Candice/M Candida/M Candide/M Candie/M Candra/M Candy/M Cannes/M Cannon/M Canon/M Canopus Cantabrigian/M Canterbury Canton/M Cantonese/M Cantor/M Cantrell/M Cantu/M Canute Capek/M Capella/M Capet Capetian Capetown/M Caph/M Capistrano/M Capitol/SM Capitoline Capone Capote Capra/M Capri/M Caprice/M Capricorn/MS Capt Capulet/M Car/MNY Cara/M Caracalla Caracas/M Caralie/M Caravaggio Carboloy/M Carboniferous/M Carborundum Carce/M Cardenas/M Cardiff/M Cardin/M Cardozo/M Care/M Caren/M Carena/M Caresa/M Caressa/M Caresse/M Carey Cari/M Caria Carib/MS Caribbean/MS Carie/M Caril/M Carilyn/M Carin/M Carina Carine/M Cariotta/M Carissa/M Carita/M Caritta/M Carl/GMN Carla/M Carlee/M Carleen/M Carlen/M Carlene/M Carleton/M Carley/M Carlie/M Carlin/M Carlina/M Carline/M Carling/M Carlita/M Carlo/MS Carlota Carlotta/M Carlsbad Carlson/M Carlton Carly/M Carlye/M Carlyle Carlyn/M Carlynn/M Carlynne/M Carma/M Carmel Carmela/M Carmelia/M Carmelina/M Carmelita/M Carmella/M Carmelle/M Carmelo/M Carmen/M Carmencita/M Carmichael/M Carmina/M Carmine/M Carmita/M Carmon/M Carnap Carnation/M Carnegie/M Carney/M Carnot Carny/M Caro/M Carol/M Carola/M Carolan/M Carolann/M Carole/M Carolee/M Carolin/M Carolina Caroline Carolingian Carolinian/M Caroljean/M Carolus/M Carolyn/M Carolyne/M Carolynn/M Caron/M Carpathian/MS Carpenter Carr/M Carranza/M Carree/M Carri/MR Carrie/M Carrier/M Carrillo/M Carrissa/M Carrol/M Carroll/M Carry/M Carson Cart/MR Carter/M Cartesian Carthage/M Carthaginian/MS Cartier Cartwright Caruso Carver Cary Caryl/M Caryn/M Casablanca/M Casals Casandra/M Casanova/SM Casar/M Cascades/M Case/M Casey/M Cash Casi/M Casie/M Casio/M Caspar Casper/M Caspian Cass/M Cassandra/SM Cassandre/M Cassandry/M Cassatt Cassaundra/M Cassey/M Cassi/M Cassie/M Cassiopeia/M Cassius/M Cassondra/M Cassy/M Castaneda/M Castillo/M Castlereagh Castor/M Castries/M Castro Catalan/SM Catalina/M Catalonia/M Catarina/M Catawba/M Cate/M Caterina/M Caterpillar/M Catha/M Catharina/M Catharine/M Cathay/M Cathe/MR Cathee/M Catherin/M Catherina/M Catherine/M Cathi/M Cathie/M Cathleen/M Cathlene/M Catholic/MS Catholicism/SM Cathrin/M Cathrine/M Cathryn/M Cathy/M Cathyleen/M Cati/M Catie/M Catiline Catina/M Catlaina/M Catlee/M Catlin/M Cato Catrina/M Catriona/M Catskill/SM Catskills/M Catt Catullus Caty/M Caucasian/MS Caucasoid Caucasus/M Cauchy Cavendish Cavour Caxton Caye/M Cayenne Cayla/M Cayman/M Cayuga/SM Cayuse Caz/M Cazzie/M Cb Cchaddie/M Cd/M Ce/M Ceausescu/M Cebu/M Cebuano/M Cece/M Cecelia/M Cecil Cecile/M Ceciley/M Cecilia Cecilio/M Cecilius/M Cecilla/M Cecily/M Ced/M Cedric/M Ceil/M Cele/M Celene/M Celesta/M Celeste/M Celestia/M Celestina/M Celestine/M Celestyn/M Celestyna/M Celia/M Celie/M Celina/M Celinda/M Celine/M Celinka/M Celisse/M Celka/M Celle/M Cellini Cello/M Celsius Celt/SM Celtic/SM Cenozoic/M Centaurus/M Centigrade Central Cepheid Cepheus/M Cerberus/M Cerenkov Ceres/M Cerf/M Cervantes/M Cesar/M Cesare/M Cesarean Cesaro/M Cessna/M Cesya/M Cetus Ceylon/M Ceylonese Cezanne Cf/M Ch'in Ch/NRS Chablis/M Chad/M Chadd/M Chaddie/M Chaddy/M Chadian/MS Chadwick Chagall Chaim/M Chaitanya/M Chaitin/M Chaldea Chaldean Challenger/M Chalmers Chamberlain Chambers Champlain Champollion Chan/M Chance/M Chancellorsville/M Chancey/M Chanda/M Chandal/M Chandigarh Chandler Chandra/M Chandragupta Chandrasekhar/M Chane/M Chanel Chaney/M Chang/M Changchun Changsha Channa/M Chantal/M Chantalle/M Chantilly Chaplin Chapman Chappaquiddick/M Chapultepec/M Chara Charbray/M Chardonnay/M Charil/M Charin/M Chariot/M Charis Charissa/M Charisse/M Charita/M Charity/M Charla/M Charlean/M Charleen/M Charlemagne/M Charlena/M Charlene/M Charles/M Charleston/MS Charley Charlie Charline/M Charlot/M Charlotta/M Charlotte/M Charlottetown/M Charlton Charmain/M Charmaine/M Charmane/M Charmian/M Charmin/M Charmine/M Charmion/M Charo/M Charolais/M Charon/M Chartism/M Chartres Charybdis/M Charyl/M Chas Chase Chasity/M Chastity/M Chateaubriand/M Chattahoochee/M Chattanooga/M Chatterley/M Chatterton Chaucer/M Chaunce/M Chauncey/M Chautauqua Chavez/M Chayefsky/M Che/M Chechen Chechnya/M Cheddar Cheer/M Cheerios/M Cheetos/M Cheever Chekhov/M Chekhovian Chelsae/M Chelsea Chelsey/M Chelsie/M Chelsy/M Chelyabinsk/M Chen/M Cheney/M Chengdu Chennai/M Cheops Chere/M Cherey/M Cheri/M Cherianne/M Cherice/M Cherida/M Cherie/M Cherilyn/M Cherilynn/M Cherin/M Cherise/M Cherish/M Cherlyn/M Chernenko/M Chernobyl/M Chernomyrdin/M Cherokee/MS Cherri/M Cherrita/M Cherry/M Chery/M Cherye/M Cheryl/M Chesapeake Cheshire Cheslie/M Chester/M Chesterfield Chesterton Cheston/M Chet/M Chev/M Chevalier Cheviot/M Chevrolet/M Chevron/M Chevy/M Cheyenne/SM Chi/M Chianti/MS Chiarra/M Chiba Chibcha Chic/M Chicago/M Chicagoan Chicana Chicano Chick/M Chickasaw/MS Chickie/M Chicky/M Chiclets/M Chico/M Chihuahua/MS Chile/M Chilean/MS Chilton/M Chimborazo/M Chimera/MS Chimu/M Chin/M China/M Chinatown Chinese/M Chinook/MS Chip/M Chipewyan/M Chippendale/M Chippewa/SM Chiquia/M Chiquita/M Chirico Chisholm/M Chisinau/M Chittagong Chivas/M Chlo/M Chloe Chloette/M Chloris/M Choctaw/SM Chomsky Chongqing Chopin/M Chopra/M Chou Chretien/M Chris/M Chrisse/M Chrissie/M Chrissy/M Christ/MNS Christa/M Christabel/M Christabella/M Christal/M Christalle/M Christan/M Christchurch Christean/M Christel/M Christen/M Christendom/SM Christensen/M Christi/M Christian/SM Christiana/M Christiane/M Christianity/SM Christianize Christiano/M Christie Christin/M Christina Christine/M Christlike Christmas/MS Christmastide/MS Christmastime/MS Christoffer/M Christoforo/M Christoper/M Christoph/MR Christophe Christopher/M Christophorus/M Christos/M Christye/M Christyna/M Chrisy/M Chronicles Chrotoem/M Chrysa/M Chrysler/M Chrysostom Chrystal/M Chryste/M Chrystel/M Chucho/M Chuck/M Chukchi Chumash Chung/M Church Churchill/M Churriguera/M Chuvash/M Ci Cicely/M Cicero/M Cicily/M Cid Ciel/M Cilka/M Cimabue/M Cincinnati Cinda/M Cindee/M Cindelyn/M Cinderella/MS Cindi/M Cindie/M Cindra/M Cindy/M CinemaScope/M Cinerama Cinnamon/M Cipro/M Circe/M Cirillo/M Cirilo/M Ciro/M Cissiee/M Cissy/M Citibank/M Citroen/M Cl/MV Claiborn/M Claiborne/M Clair/M Claire/M Clairol/M Clancy/M Clapeyron/M Clapton/M Clara/M Clarabelle/M Clarance/M Clare Clarence/M Clarendon Claresta/M Clareta/M Claretta/M Clarette/M Clarey/M Clari/M Claribel/M Clarice/M Clarie/M Clarinda/M Clarine/M Clarissa/M Clarisse/M Clarita/M Clark Clarke/M Clary/M Claude/M Claudell/M Claudelle/M Claudetta/M Claudette/M Claudia/M Claudian/M Claudianus/M Claudie/M Claudina/M Claudine/M Claudio/M Claudius/M Claus/M Clausewitz Clausius Clay Clayborn/M Clayborne/M Claybourne/M Clayson/M Clayton/M Clea/M Clearasil/M Cleavland/M Clem/XM Clemence/M Clemenceau Clement/MS Clemente/M Clementia/M Clementina/M Clementine/M Clementius/M Clemmie/M Clemmy/M Clemons Clemson/M Cleo/M Cleon Cleopatra/M Clerc/M Clerissa/M Cletis Cletus/M Cleve/M Cleveland/M Clevey/M Clevie/M Cliburn/M Cliff/M Clifford Clifton/M Clim/M Cline/M Clint/M Clinton/M Clio/M Clo/M Cloe/M Clorets/M Cloris/M Clorox/M Clotho/M Clotilda/M Clouseau/M Clovis/M Cly/M Clyde Clydesdale/M Clytemnestra Clyve/M Clywd/M Cm/M Cmdr Co/SM Cob/M Cobain/M Cobb Cobbie/M Cobby/M Cochabamba Cochin Cochise Cochran/M Cockney/M Cocteau Cod Codee/M Codi/M Codie/M Cody Coffey/M Cognac/M Cohan Cohen Coimbatore Cointon/M Cointreau Coke/SM Col Colan/M Colas Colbert/M Colby Cole Coleen/M Coleman/M Colene/M Coleridge/M Colet Coletta/M Colette Colfax/M Colgate/M Colin/M Colleen/M Collen/M Collete/M Collette/M Collie/M Collier/M Collin/SM Colline/M Colly/RM Colman/M Colo Cologne/M Colombia/M Colombian/MS Colombo/M Colon/M Coloradan/SM Colorado/M Coloradoan Colosseum Colt/M Coltrane Columbia/M Columbine Columbus/M Colver/M Com Comanche/MS Combs/M Comdr Comintern Commons Commonwealth Communion/SM Communism Communist/SM Como Comoran Comoros/M Compaq/M Compton CompuServe/M Comte Con Conakry/M Conan/M Conant/M Concepcion Concetta/M Concettina/M Conchita/M Concord/SM Concorde Concordia/M Condillac Condorcet Conestoga/M Confederacy/M Confederate/MS Confucian/SM Confucianism/MS Confucius/M Cong Congo/M Congolese/M Congregational Congregationalist/MS Congress/MS Congressional Congreve Conley/M Conn/R Connecticut/M Connemara Conner/M Connery/M Conney/M Conni/M Connie/M Connolly/M Connor/SM Conny/M Conrad Conrade/M Conrado/M Conrail/M Conroy/M Consalve/M Conservative Consolata/M Constable Constance Constancia/M Constancy/M Constanta/M Constantia Constantin/M Constantina/M Constantine Constantino/M Constantinople/M Constitution Consuela/M Consuelo/M Continent/M Continental Contreras/M Conway Cook Cooke/M Cookie/M Cooley/M Coolidge/M Coop/MR Cooperstown/M Coors/M Copacabana/M Copeland/M Copenhagen/M Copernican Copernicus/M Copland Copley Copperfield/M Coppertone/M Coppola/M Coptic/M Cora/M Corabel/M Corabella/M Corabelle/M Coral/M Coralie/M Coraline/M Coralyn/M Corbet/M Corbett/M Corbie/M Corbin/M Corby Cord/M Cordelia/M Cordelie/M Cordell/M Cordey/M Cordi/M Cordie/M Cordilleras Cordoba/M Cordula/M Cordy/M Coreen/M Corella/M Corenda/M Corene/M Coretta/M Corette/M Corey/M Corfu Cori/M Corie/M Corilla/M Corina/M Corine/M Corinna/M Corinne/M Corinth/M Corinthian/SM Coriolanus Coriolis/M Coriss/M Corissa/M Cork Corleone/M Corliss/M Corly/M Cormack/M Cornall/M Corneille Cornela/M Cornelia/M Cornelius/M Cornell/M Cornelle/M Corney/M Cornie/M Corning/M Cornish/MS Cornwall/M Cornwallis Corny/M Coronado Corot Corp Correggio Correna/M Correy/M Corri/M Corrianne/M Corrie/M Corrina/M Corrine/M Corrinne/M Corry/M Corsica/M Corsican Cort/M Cortes/MS Cortie/M Cortland/M Cortney/M Corty/M Corvallis/M Corvette/M Corvus/M Cory/M Cosby/M Cosetta/M Cosette/M Cosimo/M Cosme/M Cosmo/M Cossack Costa/M Costanza/M Costco/M Costello/M Costner/M Cote/M Cotonou Cotopaxi/M Cotswold/M Cotton/M Coulomb Couperin Courbet Court/M Courtenay/M Courtnay/M Courtney/M Cousteau Coventry/SM Coward Cowley Cowper Cox Coy/M Cozmo/M Cozumel/M Cpl Cr/MT Crabbe Craft/M Craggie/M Craggy/M Craig Cranach Crane Cranmer Crater/M Crawford/M Cray/M Crayola/M Creation/M Creator/M Crecy/M Cree/DSM Creek/SM Creigh/M Creight/M Creighton/M Creole/SM Creon Crest/M Cretaceous/M Cretan/SM Crete/M Crichton Crick Crimea/M Crimean Crin/M Criollo Cris/M Crisco/M Crissie/M Crissy/M Crista/M Cristabel/M Cristal/M Cristen/M Cristi/M Cristian/M Cristiano/M Cristie/M Cristin/M Cristina/M Cristine/M Cristionna/M Cristobal/M Cristy/M Croat/SM Croatia/M Croatian/MS Croce Crockett Croesus Cromwell/M Cromwellian Cronin/M Cronkite/M Cronus/M Crookes Crosby Cross Crow/SM Crowley/M Crucifixion/MS Cruikshank Cruise/M Crusoe/M Crux/M Cruz/M Cryptozoic/M Crysta/M Crystal/M Crystie/M Csonka/M Ct Ctesiphon Cthrine/M Cu/M Cuba/M Cuban/SM Cuchulain/M Cuisinart Culbertson Cull/MN Cullan/M Cullen/M Culley/M Cullie/M Cullin/M Cully/M Culver/M Cumberland/M Cummings Cunard/M Cunningham/M Cupid/M Curacao/M Curcio/M Curie Curitiba Curr/M Curran/M Currey/M Currie/MR Currier/M Curry Curt/M Curtice/M Curtis/M Custer Cuvier/M Cuzco Cy Cyb/M Cybele/M Cybil/M Cybill/M Cyclades/M Cyclopes/M Cyclops/M Cygnus/M Cymbre/M Cynde/M Cyndi/M Cyndia/M Cyndie/M Cyndy/M Cynthea/M Cynthia/M Cynthie/M Cynthy/M Cyprian/M Cypriot/MS Cyprus/M Cyrano/M Cyril Cyrill/M Cyrille/M Cyrillic/M Cyrillus/M Cyrus Czech/M Czechoslovak Czechoslovakia/M Czechoslovakian/MS Czechs Czerny D'Arcy D/MN DA/M DAR DAT/M DBMS/M DC/M DD/M DDS/M DDT/S DE DEA DEC/SDG DH DI DJ DMD/M DMZ DNA/M DOA DOB DOD DOE DOS/M DOT DP/SM DPT DST DTP DUI DVD DWI Dacey/M Dachau/M Dacia Dacie/M Dacron/SM Dacy/M Dada/M Dadaism/M Daedalus/M Dael/M Daffi/M Daffie/M Daffy/M Dag/M Dagmar/M Dagny/M Daguerre Dagwood Dahlia/M Dahomey/M Daile/M Daimler/M Daisey/M Daisi/M Daisie/M Daisy Dakar/M Dakota/SM Dakotan Dal/M Dale Dalenna/M Daley/M Dali/S Dalia/M Dalian/M Dalila/M Dall/M Dallas/M Dalli/MS Dallon/M Dalmatia/M Dalmatian/SM Daloris/M Dalston/M Dalt/M Dalton/M Damara/M Damaris/M Damascus/M Dame/N Damian/M Damiano/M Damien Damion/M Damita/M Damocles Damon/M Dan Dana/M Danae Dane/SM Danelaw Danell/M Danella/M Danette/M Dangerfield/M Dani/M Dania/M Danial/M Danica/M Danice/M Danie/M Daniel/SM Daniela/M Daniele/M Daniella/M Danielle/M Danika/M Danila/M Danish/M Danit/M Danita/M Danna/M Dannel/M Danni/M Dannie/M Danny/M Dannye/M Dante/M Danton Danube/M Danubian Danya/M Danyelle/M Danyette/M Daphene/M Daphna/M Daphne/M Dar/MNH Dara/M Darb/M Darbee/M Darbie/M Darby/M Darcee/M Darcey/M Darci/M Darcie/M Darcy/M Darda/M Dardanelles/M Dare Dareen/M Darell/M Darelle/M Daren/M Dari/M Daria/M Darice/M Darill/M Darin/M Dario/M Darius Darjeeling Darla/M Darleen/M Darlene/M Darline/M Darling/M Darlleen/M Darn/M Darnall/M Darnell/M Daron/M Darrel/M Darrell/M Darrelle/M Darren/M Darrick/M Darrin/M Darrow Darryl/M Darsey/M Darsie/M Darth/M Dartmoor Dartmouth Darvon/M Darwin/M Darwinian Darwinism/SM Darwinist Darya/M Daryl/M Daryle/M Daryn/M Dasha/M Dasi/M Dasie/M Dasya/M Datamation/S Datha/M Daugherty/M Daumier Daune/M Dav/MN Davao Dave/M Daveen/M Daven/M Davenport Daveta/M Davey/M David/MS Davida/M Davidde/M Davide/M Davidson/M Davie/MS Davin/M Davina/M Davine/M Davis Davita/M Davon/M Davy Dawes Dawn/M Dawna/M Dawson Day Dayan Dayle/M Dayna/M Dayton Ddene/M De/RSMN DeGeneres/M Deadhead/M Dean Deana/M Deandre/M Deane/M Deann/M Deanna/M Deanne/M Deb/SM Debbi/M Debbie/M Debby/M Debee/M Debera/M Debi/M Debian/M Debor/M Debora/M Deborah Debouillet/M Debra/M Debussy Dec/M Decalogue/M Decatur Decca/M Deccan December/SM Deck/MR Dede/M Dedekind/M Dedie/M Dedra/M Dee Deeann/M Deeanne/M Deedee/M Deena/M Deerdre/M Deere/M Deeyn/M Defoe Degas Dehlia/M Deidre/M Deimos Deina/M Deirdre Deity Dejesus/M Del/Y Dela/M Delacroix Delacruz/M Delainey/M Delaney/M Delano/M Delaware/MS Delawarean/MS Delbert/M Delcina/M Delcine/M Deleon/M Delgado Delhi/M Delia/M Delibes Delicious/M Delila/M Delilah/M Delilahs Delinda/M Delius Dell/M Della/M Delly/M Delmar/M Delmarva/M Delmer/M Delmonico Delmor/M Delmore/M Delora/M Delores/M Deloria/M Deloris/M Delphi/M Delphic Delphine/M Delphinia/M Delphinus/M Delta Dem/G Demavend/M Demerol/M Demeter/M Demetra/M Demetre/M Demetri/SM Demetria/M Demetrius/M Deming/M Democrat/SM Democratic Democritus Demosthenes/M Demott/M Dempsey Dena/M Denali Dene Deneb Denebola/M Deng/M Deni/SM Denice/M Denise/M Denmark/M Denna/M Dennet/M Denney/M Denni/MS Dennie/M Dennison/M Denny/M Denver/M Deny/M Denys Denyse/M Deon/M Deonne/M Der/M Derby Derek/M Derick/M Derk/M Dermot/M Derrek/M Derrick/M Derrida/M Derrik/M Derril/M Derron/M Derry Derward/M Derwin/M Descartes/M Desdemona/M Desi/M Desirae/M Desiree/M Desiri/M Desmond/M Desmund/M Detroit/M Deuteronomy/M Dev/M Deva/M Devan/M Devanagari/M Devi/M Devin/M Devina/M Devinne/M Devland/M Devlen/M Devlin/M Devon/M Devondra/M Devonian/M Devonna/M Devonne/M Devora/M Devy/M Dew/M Dewain/M Dewar/M Dewayne/M Dewey/M Dewie/M Dewitt/M Dex/M Dexedrine/M Dexter Dhaka/M Dhaulagiri/M Di/S DiCaprio/M DiMaggio Diaghilev Diahann/M Dial/M Dian/M Diana/M Diandra/M Diane/M Dianemarie/M Diann/M Dianna/M Dianne/M Diannne/M Diarmid/M Dias Diaspora/MS Dick/X Dickensian Dickerson/M Dickie/M Dickinson Dickson/M Dicky/M Dictaphone/SM Diderot Didi/M Dido/M Didrikson/M Diefenbaker Diego/M Diem/M Diena/M Dierdre/M Dieter/M Dietrich Dijkstra/M Dijon Dilan/M Dilbert/MS Dill/M Dillard/M Dillie/M Dillinger/M Dillon/M Dilly/M Dimitri/M Dimitry/M Dina/M Dinah Dinnie/M Dinny/M Dino/M Diocletian Diogenes Dion/M Dione Dionis/M Dionisio/M Dionne/M Dionysian Dionysus/M Diophantine/M Dior Dipper/M Dir Dirac Dirichlet Dirk/M Dis/M Disney Disneyland Disraeli Dita/M Divine/M Diwali/M Dix Dixie/M Dixiecrat Dixieland/SM Dixon/M Djibouti/M Dmitri/M Dnepropetrovsk Dniester Dniren/M Dobbin/M Doberman/M Dobro Doctor Doctorow/M Dode/M Dodge/M Dodgson/M Dodi/M Dodie/M Dodoma/M Dodson/M Dody/M Doe Doha/M Dolby Dole/M Dolf/M Doll/M Dolley/M Dolli/M Dollie/M Dolly/M Dolores/M Dolorita/SM Dolph/M Dom Domenic/M Domenico/M Domeniga/M Domesday/M Dominga/M Domingo/M Dominguez/M Domini/M Dominic Dominica/M Dominican/MS Dominick/M Dominik/M Dominion Dominique/M Domitian Don/SM Dona Donahue/M Donal/M Donald/M Donaldson/M Donall/M Donalt/M Donatello Donaugh/M Donavon/M Donella/M Donelle/M Donetsk/M Donetta/M Donia/M Donica/M Donielle/M Donizetti/M Donn/MR Donna Donnamarie/M Donne/M Donnell/M Donner/M Donni/M Donnie/M Donny/M Donovan/M Dooley/M Doolittle Doonesbury/M Doppler Dora/M Doralia/M Doralin/M Doralyn/M Doralynn/M Doralynne/M Dorcas Dore/M Doreen/M Dorelia/M Dorella/M Dorelle/M Dorena/M Dorene/M Doretta/M Dorette/M Dorey/M Dori/SM Doria/M Dorian/M Doric/M Dorice/M Dorie/M Dorine/M Doris/M Dorisa/M Dorise/M Dorita/M Doritos/M Doro/M Dorolice/M Dorolisa/M Dorotea/M Doroteya/M Dorothea/M Dorothee/M Dorothy/M Dorree/M Dorri/SM Dorrie/M Dorry/M Dorset Dorsey/M Dorthea/M Dorthy/M Dortmund Dory/M Dosi/M Dostoevsky/M Dot/M Doti/M Dotson/M Dotti/M Dottie/M Dotty/M Douala/M Douay/M Doubleday/M Doug/M Dougie/M Douglas Douglass Dougy/M Douro Dov/MR Dover/M Dow Downs Downy/M Doy/M Doyle Dr Draco/M Draconian Dracula/M Drake Dramamine/SM Drambuie Drano/M Dravidian/M Dre/M Dreddy/M Dredi/M Dreiser Dresden/M Drew/M Dreyfus/M Dristan/M Drona/M Dru/M Druci/M Drucie/M Drucill/M Drucy/M Drud/M Drugi/M Drusi/M Drusie/M Drusilla/M Drusy/M Dryden Dshubba/M Du DuPont Duane/M Dubai Dubcek/M Dubhe/M Dublin/M Dubrovnik/M Duchamp Dud/M Dudley Duff/M Duffie/M Duffy/M Dugald/M Duisburg Duke/M Dukey/M Dukie/M Duky/M Dulce/M Dulcea/M Dulci/M Dulcia/M Dulciana/M Dulcie/M Dulcine/M Dulcinea/M Dulcy/M Dulles Dulsea/M Duluth Dumas Dumbo/M Dumpster Dun/M Dunant Dunbar Dunc/M Duncan Dundee Dunedin Dunkirk/M Dunlap/M Dunn/M Dunne/M Dunstan Dur/R Duracell/M Duran/M Durand/M Durant Durante/M Durban Durex/M Durham/MS Durkheim Duroc Durocher/M Durward/M Duse/M Dushanbe/M Dusseldorf/M Dustbuster/M Dustin/M Dusty/M Dutch/M Dutchman/M Dutchmen Dutchwoman Duvalier Dvina Dvorak Dwain/M Dwayne/M Dwight/M Dy/M Dyan/M Dyana/M Dyane/M Dyann/M Dyanna/M Dyanne/M Dyer/M Dylan/M Dyna/M Dynah/M Dyson/M Dzerzhinsky/M Dzungaria E/SMY EC ECG/M EDP/M EDT EEC/M EEG/M EEO EEOC EFL EFT EKG/M ELF/M EM EMT ENE/M EOE EPA/M ER ERA ESE/M ESL ESP/M ESPN EST/M ET ETA ETD EU Eachelle/M Eada/M Eadie/M Eadith/M Eadmund/M Eakins Eal/M Ealasaid/M Eamon/M Earhart Earl/M Earle/M Earlene/M Earlie/M Earline/M Early/M Earnest/M Earnestine/M Earnhardt/M Earp/M Eartha/M Earvin/M East/SZMR Easter/M Eastern/R Eastman Eastwood/M Eaton/M Eb/MN Eba/M Ebba/M Eben/M Ebeneezer/M Ebeneser/M Ebenezer/M Eberhard/M Ebert Eberto/M Ebola Ebonee/M Ebonics/M Ebony/M Ebro/M Ecclesiastes Eco/M Ecstasy Ecuador/M Ecuadoran/SM Ecuadorean Ecuadorian/MS Ed/MNX Eda/M Edam/SM Edan/M Edd/M Edda Eddi/M Eddie/M Eddington/M Eddy/M Ede Edee/M Edeline/M Eden/M Edgar Edgard/M Edgardo/M Edi/MH Edie/M Edik/M Edin/M Edinburgh/M Edison/M Edita/M Edith/M Editha/M Edithe/M Ediva/M Edlin/M Edmon/M Edmond/M Edmonton/M Edmund/M Edna/M Edouard/M Edsel Eduard/M Eduardo/M Eduino/M Edvard/M Edward/SM Edwardian/M Edwardo/M Edwin Edwina/M Edy/M Edyth/M Edythe/M Eeyore/M Effie/M Efrain/M Efrem/M Efren/M Egan/M Egbert Eggo/M Egon/M Egor/M Egypt/M Egyptian/MS Egyptology/M Ehrenberg/M Ehrlich Eichmann Eiffel Eileen/M Eilis/M Eimile/M Einstein/MS Eire/M Eirena/M Eisenhower/M Eisenstein Eisner/M Ekaterina/M El/Y Elaina/M Elaine Elam Elana/M Elane/M Elanor/M Elayne/M Elba Elbe/M Elbert Elberta/M Elbertina/M Elbertine/M Elbrus Elden/M Eldin/M Eldon/M Eldredge/M Eldridge/M Eleanor/M Eleanora/M Eleanore/M Eleazar/M Electra/M Eleen/M Elena/M Elene/M Eleni/M Elenore/M Eleonora/M Eleonore/M Elfie/M Elfreda/M Elfrida/M Elfrieda/M Elga/M Elgar Eli Elia/S Elianora/M Elianore/M Elicia/M Elie/M Elihu/M Elijah/M Elinor/M Elinore/M Eliot Elisa/M Elisabet/M Elisabeth Elisabetta/M Elise/M Eliseo/M Elisha Elissa/M Elita/M Eliza/M Elizabet/M Elizabeth/M Elizabethan/MS Elka/M Elke/M Ella/M Elladine/M Ellary/M Elle/M Ellen/M Ellene/M Ellerey/M Ellery/M Ellesmere/M Ellette/M Elli/SM Ellie/M Ellington Elliot/M Elliott/M Ellison/M Ellissa/M Ellswerth/M Ellsworth/M Ellwood/M Elly/M Ellyn/M Ellynn/M Elma/M Elmer/M Elmira/M Elmo/M Elmore/M Elna/MH Elnar/M Elnath/M Elnora/M Elnore/M Elohim Eloisa/M Eloise/M Elonore/M Elora/M Eloy/M Elroy/M Elsa/M Elsbeth/M Else/M Elset/M Elsey/M Elsi/M Elsie/M Elsinore Elspeth/M Elston/M Elsworth/M Elsy/M Eltanin/M Elton/M Elul/M Elva/M Elvera/M Elvia/M Elvin/M Elvina/M Elvira/M Elvis/M Elvyn/M Elwin/M Elwira/M Elwood/M Elwyn/M Elyn/M Elyse/M Elysee/M Elysha/M Elysia Elysian Elysium/SM Elyssa/M Em/M Ema/M Emacs/M Emalee/M Emalia/M Emanuel/M Emanuele/M Emelda/M Emelen/M Emelia/M Emelina/M Emeline/M Emelita/M Emelyne/M Emera/M Emerson Emery/M Emil/M Emile/M Emilee/M Emili/M Emilia/M Emilie/M Emiline/M Emilio/M Emily/M Eminence Emlen/M Emlyn/M Emlynn/M Emlynne/M Emma/M Emmalee/M Emmaline/M Emmalyn/M Emmalynn/M Emmalynne/M Emmanuel Emmeline/M Emmerich/M Emmery/M Emmet/M Emmett/M Emmey/M Emmi/M Emmie/M Emmit/M Emmott/M Emmy Emmye/M Emogene/M Emory/M Emyle/M Emylee/M Encarta/M Endymion Eng Engelbert/M Engels/M England/M Englebert/M English/MRS Englishman/M Englishmen Englishwoman/M Englishwomen Engracia/M Enid Enif/M Eniwetok/M Enkidu/M Ennis Enoch Enos Enrica/M Enrichetta/M Enrico/M Enrika/M Enrique/M Enriqueta/M Enron/M Enterprise/M Eocene/M Eolanda/M Eolande/M Epcot/M Ephesian/S Ephesus Ephraim Ephrayim/M Ephrem/M Epictetus Epicurean Epicurus/M Epimethius/M Epiphany/SM Episcopal Episcopalian/MS Epistle Epsom Epstein Equuleus Er/M Eran/M Erasmus/M Erastus/M Erato/M Eratosthenes/M Erda/M Erebus/M Erector Erek/M Erena/M Erhard Erhart/M Eric/M Erica/M Erich/M Ericha/M Erick/M Ericka/M Erickson/M Eridanus Erie Erik/M Erika/M Erin Erina/M Erinn/M Erinna/M Eris/MS Eritrea/M Eritrean/SM Erl/M Erlenmeyer/M Erma/M Ermanno/M Ermengarde/M Ermentrude/M Ermin/M Ermina/M Erminia/M Erminie/M Erna/M Ernaline/M Ernest/M Ernesta/M Ernestine/M Ernesto/M Ernestus/M Ernie/M Ernst Erny/M Eros/MS Errick/M Errol/M Erroll/M Erse/M Erskine Ertha/M Erv/M ErvIn/M Erwin/M Eryn/M Esau/M Escher/M Escherichia/M Escondido Esdras Eskimo/MS Esma/M Esmaria/M Esme/M Esmeralda/M Esperanto/M Esperanza/M Espinoza/M Esq/M Esquire/MS Esra/M Essa/M Essen/M Essene Essequibo Essex Essie/M Essy/M Esta/M Establishment Esteban/M Estel/M Estela/M Estele/M Estell/M Estella/M Estelle/M Ester/M Esterhazy/M Estes Estevan/M Esther/M Estonia/M Estonian/SM Estrada/M Estrella/M Estrellita/M Etan/M Ethan/M Ethe/M Ethel/M Ethelbert Ethelda/M Ethelin/M Ethelind/M Etheline/M Ethelred/M Ethelyn/M Ethernet Ethiopia/M Ethiopian/SM Ethyl/M Etienne/M Etna/M Eton Etruria Etruscan Etta/M Etti/M Ettie/M Ettore/M Etty/M Eu/M Eucharist/MS Eucharistic Euclid/M Eudora/M Euell/M Eugen/M Eugene Eugenia/M Eugenie/M Eugenio/M Eugenius/M Eugine/M Eula/M Eulalie/M Euler Eumenides/M Eunice/M Euphemia/M Euphrates/M Eur Eurasia/M Eurasian/MS Euripides Eurodollar/MS Europa/M Europe/M European/MS Eurydice/M Eustace/M Eustachian/M Eustacia/M Euterpe/M Ev/MN Eva/M Evaleen/M Evan/SM Evangelia/M Evangelical Evangelin/M Evangelina/M Evangeline/M Evangelist Evania/M Evanne/M Evansville Eve/M Eveleen/M Evelin/M Evelina/M Eveline/M Evelyn Even/M Evenki/M EverReady/M Everard/M Evered/M Everest/M Everett/M Everette/M Everglades/M Evert/M Evey/M Evian/M Evie/M Evin/M Evita/M Evonne/M Evvie/M Evvy/M Evy/M Evyn/M Ewan/M Eward/M Ewart/M Ewell/M Ewen/M Ewing/M Excalibur/M Excedrin/M Excellency/SM Exchequer Exercycle Exocet/M Exodus/M Exxon/M Eyck/M Eyde/M Eydie/M Eyre Eysenck/M Ezechiel/M Ezekiel Ezequiel/M Eziechiele/M Ezmeralda/M Ezra Ezri/M F/MD FAA FAQ/SM FBI/M FCC FD FDA FDIC/M FDR/M FHA/M FICA/M FIFO FL FM/SM FNMA/M FOFL FORTRAN/M FPO FSLIC FTC FUD/S FWD FY FYI Fabe/RM Faber/M Faberge Fabian/MS Fabiano/M Fabien/M Fabio/M Fae/M Faeroe/M Fafnir Fagin/M Fahd/M Fahrenheit Faina/M Fair/M Fairbanks Fairfax Fairleigh/M Fairlie/M Faisal/M Faisalabad Faith Falasha Falito/M Falkland/SM Falkner Fallon/M Fallopian/M Falstaff/M Falwell/M Fan Fanchette/M Fanchon/M Fancie/M Fancy/M Fanechka/M Fania/M Fanni/M Fannie/M Fanny/M Fanya/M Far/MY Fara/M Faraday/M Farah/M Farand/M Fargo/M Farica/M Farlay/M Farlee/M Farleigh/M Farley/M Farlie/M Farly/M Farmer Farr/M Farra/M Farragut Farrah/M Farrakhan/M Farrand/M Farrel/M Farrell/M Farris/M Farrow/M Farsi/M Fassbinder/M Fatah/M Fates Father/SM Fatima Fatimid Faulkner/M Faulknerian Faun/M Faunie/M Fauntleroy/M Faust/M Faustian Faustina/M Faustine/M Faustino/M Faustus/M Fawkes Fawn/M Fawne/M Fawnia/M Fax/M Fay/M Faydra/M Faye/M Fayette/M Fayina/M Fayre/M Fayth/M Faythe/M Fe/M Feb/M February/SM Fed/SM FedEx Federal/MS Federalist/M Federica/M Federico/M Fedora/M Fee/M Felecia/M Felic/M Felicdad/M Felice/M Felicia/M Felicio/M Felicity/M Felicle/M Felike/M Feliks/M Felipa/M Felipe/M Felisha/M Felita/M Felix/M Feliza/M Felizio/M Fellini Fenelia/M Fenian Feodor/M Feodora/M Ferber/M Ferd/M Ferdie/M Ferdinand Ferdinanda/M Ferdinande/M Ferdy/M Fergus Ferguson/M Ferlinghetti/M Fermat/M Fermi Fern/M Fernanda/M Fernande/M Fernandez/M Fernandina/M Fernando/M Ferne/M Ferrari/M Ferraro/M Ferrel/M Ferrell/M Ferris Fey/M Feynman/M Fez Fiann/M Fianna Fiat/M Fiberglas Fibonacci/M Fichte Fidel/M Fidela/M Fidelia/M Fidelio/M Fidelity/M Fido/M Fidole/M Field/GS Fifi/M Fifine/M Figaro/M Figueroa/M Fiji/M Fijian/MS Filbert/M Filberte/M Filberto/M Filia/M Filide/M Filip/M Filipino/MS Filippa/M Filippo/M Fillmore/M Filmer/M Filmore/M Filofax Fin Fina/M Finch/M Findlay/M Findley/M Finland/M Finlay/M Finley/M Finn/SM Finnbogadottir/M Finnegan/M Finnish/M Fiona/M Fionna/M Fionnula/M Fiorenze/M Firefox/M Firestone/M Fischer Fisher Fisk/M Fitch/M Fitz/M Fitzgerald Fitzpatrick/M Fitzroy/M Fizeau/M Fla Flanagan/M Flanders/M Flathead Flatt/M Flaubert Fleischer/M Flem/G Flemish/M Flemming/M Fletch/MR Fleur/M Fleurette/M Flin/M Flinn/M Flint Flintstones Flo/M Flor/M Flora Florance/M Flore/SM Florella/M Florence/M Florencia/M Florentia/M Florentine Florenza/M Florette/M Flori/SM Floria/M Florian/M Florida/M Floridan Floridian/SM Florie/M Florina/M Florinda/M Florine/M Florri/M Florrie/M Florry/M Florsheim/M Flory/M Flossi/M Flossie/M Flossy/M Flowers Floyd Flss/M Flynn/M Fm/M Foch Fokker Foley Folgers Folsom Fomalhaut Fonda Fons Fonsie/M Fonz/M Fonzie/M Foosball/M Forbes Ford/M Foreman/M Forest/MR Formica/MS Formosa/M Formosan/M Forrest/R Forrester/M Forster Fortaleza Foss/M Foster Fotomat/M Foucault Fourier Fourneyron/M Fourth Fowler Fox/MS Fr/MD Fragonard Fran/SM France/SM Francene/M Francesca Francesco/M Franchot/M Francine/M Francis Francisca/M Franciscan/SM Francisco/M Franciska/M Franciskus/M Franck Francklin/M Francklyn/M Franco Francois/M Francoise/M Francyne/M Franglais Frank/SM Frankel/M Frankenstein Frankfort/M Frankfurt/MR Frankie/M Frankish Franklin Franklyn/M Franky/M Franni/M Frannie/M Franny/M Fransisco/M Frants/M Franz/MN Franzen/M Frasco/M Fraser Frasier/M Frasquito/M Frau/MN Fraulein Frayda/M Fraze/RM Frazier/M Fred/M Freda/M Freddi/M Freddie/M Freddy/M Fredek/M Fredelia/M Frederic/M Frederica/M Frederich/M Frederick Fredericka/M Frederico/M Fredericton/M Frederigo/M Frederik/M Frederique/M Fredi/M Fredia/M Fredra/M Fredric/M Fredrick/M Fredrika/M Free/M Freedman/M Freeland/M Freeman/M Freemason/SM Freemasonry/SM Freemon/M Freetown/M Freida/M Fremont French/MS Frenchman/M Frenchmen Frenchwoman/M Frenchwomen Freon Fresnel/M Fresno/M Freud/M Freudian Frey/M Freya/M Fri/M Friday/SM Frieda/M Friedan Friederike/M Friedman Friedrich Friedrick/M Friend/SM Frigga/M Frigidaire Frisbee Frisco Frisian/MS Frito/M Fritz/M Frobisher Froissart Fromm Fronde Frontenac/M Frost/M Frostbelt Frunze/M Fry Frye/M Fuchs/M Fuentes Fugger Fuji/M Fujitsu/M Fujiwara/M Fujiyama/M Fukuoka/M Fulani/M Fulbright Fuller Fullerton Fulton/M Fulvia/M Funafuti Fundy Furies/M Furtwangler/M Fushun Fuzhou/M Fuzzbuster G/MNRB GA GAO GATT/M GB/M GDP/M GE/M GED GHQ/M GI GIGO GM GMAT GMT/M GNP/M GOP/M GP/M GPA GPO GSA GTE/M GU GUI/M Ga/M Gabbey/M Gabbi/M Gabbie/M Gabby/M Gabe/M Gabey/M Gabi/M Gabie/M Gabon/M Gabonese/M Gaborone/M Gabriel Gabriela/M Gabriele/M Gabriell/M Gabriella/M Gabrielle/M Gabriellia/M Gabriello/M Gabrila/M Gaby/M Gacrux/M Gadsden/M Gae/M Gaea/M Gael/SM Gaelan/M Gaelic/M Gagarin Gage Gail/M Gaile/M Gaines/M Gainsborough/M Gal/N Galahad/SM Galapagos/M Galatea Galatia Galatians Galaxy Galbraith Gale/M Galibi Galilean/SM Galilee Galileo/M Galina/M Gall/M Gallagher/M Gallard/M Gallegos/M Gallic Gallicism/SM Gallo/M Galloway/M Gallup Galois/M Galsworthy Galvan/M Galvani Galven/M Galveston/M Galvin/M Gama Gamaliel/M Gamay Gambia/M Gambian/SM Gamble/M Gamow/M Gan/M Gandhi/M Gandhian Ganesha/M Ganges/M Gangtok/M Gannie/M Gannon/M Ganny/M Gantry/M Ganymede/M Gap/M Gar/MH Garald/M Garbo Garcia/M Gard Gardener/M Gardie/M Gardiner Gardner/M Gardy/M Gare/MH Garek/M Gareth/M Garey/M Garfield/M Garfunkel/M Gargantua Garibaldi/M Garik/M Garland Garner Garnet/M Garnette/M Garold/M Garrard/M Garrek/M Garret/M Garreth/M Garrett/M Garrick Garrik/M Garrison Garrot/M Garrott/M Garry/M Garth/M Garv/M Garvey Garvin/M Garvy/M Garwin/M Garwood/M Gary Garza/M Gascony/M Gaspar Gaspard/M Gasparo/M Gasper/M Gasser Gaston/M Gates Gatling/M Gatorade/M Gatsby/M Gatun/M Gauguin/M Gaul/SM Gaulish Gaultiero/M Gauss/M Gaussian Gautama/M Gauthier/M Gautier Gav/MN Gavan/M Gaven/M Gavin/M Gavra/M Gavrielle/M Gawain/M Gawen/M Gay Gaye/M Gayel/M Gayelord/M Gayla/M Gayle/RM Gayleen/M Gaylene/M Gayler/M Gaylor/M Gaylord/M Gaynor/M Gaza Gaziantep Gd/M Gdansk/M Ge/M Gearalt/M Gearard/M Geffen/M Gehenna/M Gehrig Geiger/M Gelbvieh/M Geller/M Gelya/M Gemini/MS Gena/M Genaro/M Gene/M Genesis/M Genet/M Geneva/M Genevieve/M Genevra/M Genghis/M Genia/M Genna/M Genni/M Gennie/M Gennifer/M Genny/M Geno/M Genoa/SM Genovera/M Gentoo Gentry/M Genvieve/M Geo/M Geoff/M Geoffrey/M Geoffry/M Georas/M Geordie Georg/M George/MS Georgeanna/M Georgeanne/M Georgena/M Georgeta/M Georgetown/M Georgetta/M Georgette Georgi/M Georgia/M Georgian/MS Georgiana/M Georgianna/M Georgianne/M Georgie/M Georgina/M Georgine/M Georgy/M Gerald/M Geralda/M Geraldine/M Gerard/M Gerardo/M Gerber/M Gerda/M Gerek/M Gerhard/M Gerhardine/M Gerhardt/M Geri/M Gerianna/M Gerianne/M Gerick/M Gerik/M Geritol/M Gerladina/M Germain/M Germaine/M German/MS Germana/M Germanic/M Germany/M Germayne/M Gerome/M Geronimo Gerrard/M Gerri/M Gerrie/M Gerrilee/M Gerry/M Gershwin Gert/M Gerta/M Gerti/M Gertie/M Gertrud/M Gertruda/M Gertrude/M Gertrudis/M Gerty/M Gery/M Gestapo/SM Gethsemane Getty Gettysburg/M Gewurztraminer Ghana/M Ghanaian Ghats Ghazvanid/M Ghent Gherardo/M Ghibelline Giacinta/M Giacobo/M Giacometti Giacomo/M Giacopo/M Gian/M Giana/M Gianina/M Gianna/M Gianni/M Giannini/M Giauque/M Giavani/M Gib/M Gibb/SM Gibbie/M Gibbon Gibby/M Gibraltar/MS Gibson Gide Gideon Gielgud Gienah/M Giff/MR Giffard/M Giffer/M Giffie/M Gifford/M Giffy/M Gigi/M Gil/MY Gila/M Gilbert/M Gilberta/M Gilberte/M Gilbertina/M Gilbertine Gilberto/M Gilburt/M Gilchrist/M Gilda/M Gilead Gilemette/M Giles Gilgamesh Gill Gillan/M Gilles Gillespie Gillette/M Gilli/M Gilliam/M Gillian/M Gillie/M Gilligan/M Gilly/M Gilmore/M Gina/M Ginelle/M Ginevra/M Ginger/M Gingrich/M Ginni/M Ginnie/M Ginnifer/M Ginny/M Gino/M Ginsberg Ginsburg/M Ginsu/M Giordano/M Giorgi/M Giorgia/M Giorgio/M Giorgione Giotto Giovanna/M Giovanni/M Giralda/M Giraldo/M Giraud Giraudoux Gisela/M Giselbert/M Gisele/M Gisella/M Giselle/M Gish Giuditta/M Giulia/M Giuliani/M Giulietta/M Giulio/M Giuseppe/M Giustina/M Giustino/M Giusto/M Giza/M Gizela/M Gk Glad/M Gladi/M Gladstone/MS Gladys Glaser Glasgow/M Glass/M Glastonbury/M Glaswegian/SM Glaxo/M Gleason/M Gleda/M Glen/M Glenda/M Glendale Glenden/M Glendon/M Glenine/M Glenlivet/M Glenn/M Glenna/M Glennie/M Glennis/M Glori/M Gloria Gloriana/M Gloriane/M Glory/M Gloucester Glover/M Glyn/M Glynda/M Glynis/M Glynn/M Glynnis/M Gnni/M Gnostic Gnosticism/M Goa Gobi/M God/M Godard Godart/M Goddard Goddart/M Godel/M Godfree/M Godfrey/M Godfry/M Godhead/M Godiva/M Godot/M Godspeed/SM Godthaab Godunov Godwin Godzilla/M Goebbels Goering Goethals/M Goethe/M Goff/M Gog Gogol Goiania/M Golan/M Golconda Golda/M Goldarina/M Goldberg/M Golden/M Goldi/M Goldia/M Goldie/M Goldilocks/M Goldina/M Golding Goldman/M Goldsmith Goldwater/M Goldwyn Goldy/M Golgi Golgotha/M Goliath Gomez/M Gomorrah/M Gompers Gomulka Gondwanaland/M Gonzales Gonzalez/M Gonzalo/M Goober/M Good/M Goodall/M Goodman Goodrich/M Goodwill/M Goodwin/M Goodyear Google/M Gopher Goran/M Goraud/M Gorbachev Gordan/M Gorden/M Gordian/M Gordie/M Gordimer Gordon Gordy/M Gore Goren/M Gorey/M Gorgas Gorgon/M Gorgonzola Gorky/M Gospel/MS Goteborg/M Goth/M Gotham Gothart/M Gothic/MS Goths Gottfried/M Gouda/SM Gould Gounod Governor Goya Gr Gracchus Grace Graceland/M Gracia/M Gracie/M Graciela/M Gradeigh/M Gradey/M Grady/M Graehme/M Graeme/M Graffias/M Grafton/M Graham Grahame Graig/M Grail Gram/M Grammy Grampians Gran/M Granada/M Grange/R Grannie/M Granny/M Grant/M Grantham/M Granthem/M Grantley/M Granville/M Grass Grata/M Gratia/M Gratiana/M Graves Gray Grayce/M Grazia/M Grecian Greece/M Greek/SM Greeley Green/SM Greene Greenland/M Greenlandic Greenpeace/M Greensboro/M Greensleeves/M Greenspan/M Greenwich/M Greer/M Greg/M Gregg/M Greggory/M Gregoire/M Gregoor/M Gregor/M Gregorian Gregorio/M Gregorius/M Gregory/M Grenada/M Grenadian/MS Grenadines Grendel Grenoble Grenville Gresham Greta/M Gretal/M Gretchen/M Grete/M Gretel/M Grethel/M Gretna/M Gretta/M Gretzky/M Grey Grieg Grier/M Griff/M Griffie/M Griffin/M Griffith Griffy/M Grimes Grimm/M Grinch/M Gris Griselda Grissel/M Griswold/M Griz/M Gromyko Gropius/M Gross Grosz Grotius Grove/RM Grover/M Grozny Grumman/M Grundy Grunewald/M Grus/M Gruyere/SM Guadalajara/M Guadalcanal/M Guadalquivir Guadalupe/M Guadeloupe/M Guallatiri/M Gualterio/M Guam/M Guamanian Guangzhou/M Guantanamo/M Guarani/M Guarnieri/M Guatemala/M Guatemalan/SM Guayaquil/M Gucci/M Guelph Guendolen/M Guenevere/M Guenna/M Guernsey/MS Guerra/M Guerrero Guevara Guggenheim Guglielma/M Guglielmo/M Gui/M Guiana/M Guido/M Guilbert/M Guillaume/M Guillema/M Guillemette/M Guillermo/M Guinea/M Guinean/MS Guinevere/M Guinna/M Guinness/M Guiyang Guizot Gujarat/M Gujarati/M Gujranwala Gullah Gulliver/M Gumbel/M Gun/M Gunar/M Gunilla/M Gunner/M Guntar/M Gunter Gunther Guofeng/M Gupta/M Gurkha/M Gus/M Gusella/M Guss Gussi/M Gussie/M Gussy/M Gusta/M Gustaf/M Gustav/M Gustave/M Gustavo/M Gustavus/M Gusti/M Gustie/M Gusty/M Gutenberg Guthrey/M Guthrie Guthry/M Gutierrez/M Guy/M Guyana/M Guyanese/M Guzman/M Gwalior Gwen/M Gwendolen/M Gwendolin/M Gwendoline/M Gwendolyn/M Gweneth/M Gwenette/M Gwenneth/M Gwenni/M Gwennie/M Gwenny/M Gwenora/M Gwenore/M Gwyn/M Gwyneth/M Gwynne/M Gypsy/SM H/M HBO HDTV HF/M HHS HI HIV/M HM HMO/M HMS HOV HP/M HQ/M HR HRH HS HST HT HTML/M HTTP HUD/M Ha Haas/M Habakkuk Haber/M Had/M Hadar/M Hades/M Hadlee/M Hadleigh/M Hadley/M Hadria/M Hadrian Hafiz/M Hagan/M Hagar Hagen Haggai Hagiographa/M Hague Hahn Haida/SM Haifa/M Hailee/M Hailey/M Haily/M Haiphong Haiti/M Haitian/MS Hakeem/M Hakim/M Hakka/M Hakluyt Hal/SMY Haldane Hale Haleakala Haleigh/M Halette/M Haley/M Hali/M Halie/M Halifax/M Halimeda/M Hall Halley Halli/M Hallie/M Hallmark/M Halloween/MS Hallstatt Hallsy/M Hally/M Halon/M Halsey Halsy/M Ham/M Haman/M Hamburg/MS Hamel/M Hamhung Hamid/M Hamil/M Hamilcar/M Hamill/M Hamilton/M Hamiltonian Hamish/M Hamitic/M Hamlen/M Hamlet Hamlin/M Hammad/M Hammarskjold Hammerstein Hammett/M Hammond Hammurabi Hamnet/M Hampshire/M Hampton Hamsun Han/S Hana/M Hanan/M Hancock Handel/M Handy Haney/M Hangul/M Hangzhou/M Hank/M Hanna/M Hannah Hanni/SM Hannibal/M Hannie/M Hanny/M Hanoi/M Hanover/M Hanoverian/M Hansel/M Hansen/M Hansiain/M Hanson/M Hanuka Hanukkah/M Hanukkahs Happy/M Hapsburg/M Harald/M Harare/M Harbert/M Harbin Harcourt/M Hardin/M Harding/M Hardy Hargreaves Harlan/M Harland/M Harlem/M Harlen/M Harlene/M Harlequin Harley Harli/M Harlie/M Harlin/M Harlow Harman/M Harmon/M Harmonia/M Harmonie/M Harmony/M Harold/M Haroun/M Harp/MR Harper/M Harpy/SM Harrell/M Harri/SM Harrie/M Harriet/M Harriett/M Harrietta/M Harriette/M Harrington/M Harriot/M Harriott/M Harrisburg/M Harrison/M Harrods Harry/M Hart Harte Hartford/M Hartley Hartline/M Hartman/M Hartwell/M Harv/M Harvard/M Harvey Harwell/M Harwilll/M Hasbro/M Hasheem/M Hashim/M Hasidim Haskel/M Haskell/M Haslett/M Hastie/M Hastings/M Hasty/M Hatfield Hathaway Hatsheput/M Hatteras Hatti/M Hattie/M Hatty/M Hauptmann Hausa/M Hausdorff/M Havana/MS Havarti Havel Haven/M Havoline/M Haw Hawaii/M Hawaiian/SM Hawking Hawkins Hawks Hawthorne Hay/SM Hayden/M Haydn/M Haydon/M Hayes/M Hayley/M Haynes Hayward Haywood/M Hayyim/M Haze/M Hazel/M Hazlett/M Hazlitt He/M Head/M Heall/M Hearst Heath/R Heather/M Heaviside Heb Hebe Hebert/M Hebraic Hebraism/SM Hebrew/MS Hebrides/M Hecate Hector/M Hecuba Heda/M Hedda/M Heddi/M Heddie/M Hedi/M Hedvig/M Hedvige/M Hedwig/M Hedwiga/M Hedy/M Heep/M Hefner/M Hegel/M Hegelian Hegira Heida/M Heidegger Heidelberg Heidi/M Heidie/M Heifetz Heimlich/M Heindrick/M Heine Heineken/M Heinlein/M Heinrich/M Heinrick/M Heinrik/M Heinz Heisenberg Heisman/M Helaina/M Helaine/M Helen/M Helena/M Helene/M Helenka/M Helga/M Helge/M Helicon Heliopolis Helios/M Hellene/SM Hellenic/M Hellenism/MS Hellenist Hellenistic Hellenization Hellenize Heller Hellespont/M Helli/M Hellman Helmholtz/M Heloise/M Helsa/M Helsinki/M Helvetian Helvetius/M Helyn/M Hemingway/M Hench/M Henderson/M Hendrick/MS Hendrik/M Hendrika/M Hendrix Henka/M Henley Henri/M Henrie/M Henrieta/M Henrietta/M Henriette/M Henrik/M Henry/M Henryetta/M Hensley/M Henson/M Hepburn Hephaestus/M Hephzibah/M Hepplewhite Hera/M Heracles/M Heraclitus Herakles/M Herb/M Herbart Herbert Herbie/M Herby/M Herc/M Herculaneum/M Hercule/MS Herculean Hercules/M Herculie/M Herder Hereford/SM Herero Heriberto/M Herman/M Hermann/M Hermaphroditus Hermes/M Hermia/M Hermie/M Hermina/M Hermine/M Herminia/M Hermione/M Hermitage Hermite/M Hermon Hermosillo/M Hermy/M Hernandez/M Hernando/M Herod/M Herodotus/M Herold/M Herr/MG Herrera/M Herrick Herring/M Hersch/M Herschel Hersey/M Hersh/M Hershel/M Hershey/M Herta/M Hertha/M Hertz/M Hertzsprung/M Herve/M Hervey/M Herzegovina Herzl Heshvan/M Hesiod Hesperus Hess Hesse Hessian Hester/M Hesther/M Hestia/M Heston/M Hetti/M Hettie/M Hetty/M Hew/M Hewe/M Hewet/M Hewett/M Hewie/M Hewitt/M Hewlett/M Heyerdahl Heywood Hezbollah/M Hezekiah Hf/M Hg/M Hi/M Hialeah Hiawatha/M Hibernia/M Hibernian Hickman/M Hickok Hicks/M Hieronymus Higashiosaka Higgins/M Highlander/MS Highlands Highness/M Hilario/M Hilarius/M Hilary/M Hilbert Hilda/M Hildagard/M Hildagarde/M Hilde/M Hildebrand Hildegaard/M Hildegarde/M Hildy/M Hilfiger/M Hill Hillard/M Hillary Hillel Hillery/M Hilliard Hilliary/M Hillie/M Hillier/M Hilly/RM Hillyer/M Hilton Himalaya/SM Himalayan Himmler Hinayana/M Hinda/M Hindemith Hindenburg Hindi Hindu/SM Hinduism/SM Hindustan/M Hindustani/SM Hines Hinton/M Hinze/M Hipparchus Hippocrates/M Hippocratic Hiram Hirobumi/M Hirohito Hiroshima/M Hirsch/M Hispanic/SM Hispaniola/M Hiss/M Hitachi/M Hitchcock Hitler/MS Hittite/SM Hmong Ho/M Hobard/M Hobart/M Hobbes Hobbs Hobey/M Hobie/M Hockney/M Hodge/SM Hodgkin Hoebart/M Hoff/M Hoffa/M Hoffman/M Hofstadter/M Hogan/M Hogarth Hogwarts/M Hohenlohe Hohenstaufen Hohenzollern/M Hohhot/M Hohokam Hokkaido/M Hokusai Holbein Holcomb/M Holden/M Holder/M Holiday Holiness Holland/ZSMR Hollander/M Hollerith/M Holley/M Holli/SM Hollie/M Holloway/M Holly Hollyanne/M Hollywood/M Holman/M Holmes/M Holocaust Holocene/M Holst Holstein/SM Holt Homer/M Homere/M Homeric Homerus/M Hon Honda/M Honduran/MS Honduras/M Honecker/M Honey/M Honeywell/M Honiara Honolulu/M Honor/B Honoria/M Honshu/M Hood Hooke/R Hooper/M Hoosier/MS Hooters/M Hoover/MS Hope Hopewell/M Hopi/SM Hopkins Hopper Horace Horacio/M Horatia/M Horatio/M Horatius/M Hormel/M Hormuz Horn Hornblower/M Horne/M Horowitz Horst/M Hort/MN Horten/M Hortense Hortensia/M Horthy Horton/M Horus/M Hosea/M Host/SM Hotpoint/M Hottentot/SM Houdini House Housman Houston/M Houyhnhnm/M Howard Howe Howell/MS Howey/M Howie/M Howrah Hoyle Hoyt/M Hrothgar/M Hts Huang Hubbard Hubble/M Hube/RM Huber/M Hubert/M Huberto/M Hubey/M Hubie/M Huck/M Huddersfield Hudson/M Huerta/M Huey/M Huff/M Huffman/M Huggins Hugh/MS Hughie Hugibert/M Hugo/M Huguenot/MS Hugues/M Hui Huitzilopitchli/M Hulda/M Hull/M Humbert/M Humberto/M Humboldt Hume Humfrey/M Humfrid/M Humfried/M Humphrey Humvee Hun/SM Hunfredo/M Hung Hungarian/SM Hungary/M Hunt/R Hunter/M Huntington/M Huntlee/M Huntley/M Huntsville Hurlee/M Hurleigh/M Hurley/M Huron Hurst/M Hus Husein/M Hussein Husserl Hussite Huston Hutchinson Hutton/M Hutu Huxley/M Huygens Hy/M Hyacinth/M Hyacintha/M Hyacinthe/M Hyacinthia/M Hyacinthie/M Hyades/M Hyatt/M Hyde Hyderabad Hydra/M Hyman/M Hymen/M Hymie Hynda/M Hyperion/M Hyundai/M Hz/M I'd I'll I'm I've I/M IA IBM/M ICBM/SM ICC ICU ID/SM IE IL IMF/M IMHO IMNSHO IMO IN INRI INS IOU/M IPA IQ/M IRA/SM IRS/M ISBN ISO IT IUD IV/SM Ia Iaccoca/M Iago/M Iain/M Ian/M Ianthe/M Iapetus/M Ibadan Ibbie/M Ibby/M Iberia/M Iberian Ibiza Iblis/M Ibo Ibrahim/M Ibsen/M Icahn/M Icarus/M Ice Iceland/MRZ Icelander/M Icelandic/M Ichabod/M Ida Idaho/SM Idahoan/MS Idahoes Idalia/M Idalina/M Idaline/M Idell/M Idelle/M Idette/M Ieyasu Iggie/M Iggy/M Ignace/M Ignacio/M Ignacius/M Ignatius Ignaz/M Ignazio/M Igor/M Iguassu/M Ijsselmeer/M Ike/M Ikey/M Ikhnaton Ila Ilaire/M Ilario/M Ileana/M Ileane/M Ilene/M Iliad/SM Ilise/M Ilka/M Ill Illa/M Illinois/M Illinoisan/MS Illuminati Ilsa/M Ilse/M Ilysa/M Ilyse/M Ilyssa/M Ilyushin/M Imelda/M Immanuel Imodium/M Imogen/M Imogene/M Imojean/M Imus/M In/MP Ina/M Inc Inca/SM Inchon/M Incorporated Ind Independence/M India/M Indian/MS Indiana/M Indianan/SM Indianapolis/M Indianian Indira/M Indochina/M Indochinese Indonesia/M Indonesian/MS Indore Indra/M Indus/M Indy/SM Ines Inesita/M Inessa/M Inez/M Inga/M Ingaberg/M Ingaborg/M Ingamar/M Ingar/M Inge/R Ingeberg/M Ingeborg/M Ingelbert/M Ingemar/M Inger/M Inglebert/M Inglewood Inglis/M Ingmar/M Ingra/M Ingram/M Ingres Ingrid/M Ingrim/M Ingunna/M Inigo/M Inna/M Inness/M Innis/M Innocent/M Innsbruck Inonu/M Inquisition Inst Instamatic/M Intel/M Intelsat Internationale/M Internet/S Interpol Inuit/MS Inuktitut/M Invar/M Io/M Iolande/M Iolanthe/M Iona Ionesco Ionian/MS Ionic/SM Iorgo/MS Iormina/M Iosep/M Iowa/SM Iowan/MS Iphigenia Ipswich Iqaluit/M Iqbal Iquitos Ir/M Ira/M Iran/M Iranian/SM Iraq/M Iraqi/MS Ireland/M Irena/M Irene Irina/M Iris Irish/MR Irishman/M Irishmen Irishwoman/M Irishwomen Irita/M Irkutsk Irma/M Iroquoian/SM Iroquois/M Irrawaddy Irtish/M Irv/MG Irvin/M Irvine Irwin/M Irwinn/M Isa Isaac/M Isaak/M Isabel/M Isabelita/M Isabella Isabelle/M Isac/M Isacco/M Isador/M Isadora/M Isadore/M Isahella/M Isaiah Isak/M Iscariot Iseabal/M Isfahan Isherwood Ishim/M Ishmael Ishtar/M Isiah/M Isiahi/M Isidor/M Isidora/M Isidore/M Isidoro/M Isidro/M Isis/M Islam/MS Islamabad/M Islamic Ismael/M Ismail/M Isobel/M Isolde Ispell/M Israel/SM Israeli/SM Israelite Issac/M Issachar Issi/M Issiah/M Issie/M Issy/M Istanbul/M Isuzu/M It Itaipu/M Ital Italian/SM Italianate Italy/M Itasca/M Itch/M Ithaca Ithacan Ito Iva/M Ivan Ivanhoe/M Ivar/M Ive/RSM Iver/M Ivett/M Ivette/M Ivie/M Ivonne/M Ivor/M Ivorian Ivory/M Ivy Iyar/M Izaak/M Izabel/M Izak/M Izanagi/M Izanami/M Izhevsk Izmir Izod/M Izvestia/M Izzy/M J/MDNX JCS JD JFK/M JP JV Jabez/M Jacenta/M Jacinda/M Jacinta/M Jacintha/M Jacinthe/M Jack Jackelyn/M Jacki/M Jackie/M Jacklin/M Jacklyn/M Jackquelin/M Jackqueline/M Jackson/M Jacksonian Jacksonville/M Jacky/M Jaclin/M Jaclyn/M Jacob/SM Jacobean/M Jacobi Jacobin/M Jacobite/M Jacobo/M Jacobson/M Jacquard Jacquelin/M Jacqueline/M Jacquelyn/M Jacquelynn/M Jacquenetta/M Jacquenette/M Jacques Jacquetta/M Jacquette/M Jacqui/M Jacquie/M Jacuzzi Jacynth/M Jada/M Jade/M Jae/M Jagger/M Jagiellon/M Jaguar/M Jahangir/M Jaime/M Jaimie/M Jain Jaine/M Jainism/M Jaipur Jakarta/M Jake/M Jakie/M Jakob/M Jamaal/M Jamaica/M Jamaican/SM Jamal/M Jamar/M Jame/SM Jamel/M James/M Jameson Jamestown Jamesy/M Jamey/M Jami/M Jamie/M Jamil/M Jamill/M Jamima/M Jamison/M Jammal/M Jammie/M Jan/M Jana/M Janacek/M Janaya/M Janaye/M Jandy/M Jane Janean/M Janeczka/M Janeen/M Janek/M Janel/M Janela/M Janell/M Janella/M Janelle/M Janene/M Janenna/M Janessa/M Janet Janeta/M Janetta/M Janette/M Janeva/M Janey/M Jania/M Janice/M Janie/M Janifer/M Janina Janine/M Janis/M Janissary/M Janith/M Janka/M Janna/M Jannel/M Jannelle/M Jannie/M Janos/M Janot/M Jansen/M Jansenist/M January/SM Janus/M Jany/M Japan/M Japanese/MS Japura/M Jaquelin/M Jaquelyn/M Jaquenetta/M Jaquenette/M Jaquith/M Jarad/M Jard/M Jareb/M Jared/M Jarib/M Jarid/M Jarlsberg Jarrad/M Jarred/M Jarret/M Jarrett/M Jarrid/M Jarrod/M Jarvis/M Jase/M Jasen/M Jasmin/M Jasmina/M Jasmine/M Jason/M Jasper/M Jasun/M Jataka Java/SM JavaScript/M Javanese/M Javier/M Jaxartes Jay Jayapura/M Jayawardene/M Jaycee/S Jaye/M Jayme/M Jaymee/M Jaymie/M Jayne/M Jaynell/M Jayson/M Jazmin/M Jdavie/M Jean/M Jeana/M Jeane/M Jeanelle/M Jeanette/M Jeanie/M Jeanine/M Jeanna/M Jeanne/M Jeannette/M Jeannie/M Jeannine/M Jecho/M Jed/M Jedd/M Jeddy/M Jedediah/M Jedi/M Jedidiah/M Jeep Jeeves/M Jeff/M Jefferey/M Jefferson/M Jeffersonian Jeffery/M Jeffie/M Jeffrey Jeffry/M Jeffy/M Jehanna/M Jehoshaphat Jehovah/M Jehu Jekyll/M Jelene/M Jemie/M Jemima/M Jemimah/M Jemmie/M Jemmy/M Jen/M Jena/M Jenda/M Jenelle/M Jeni/M Jenica/M Jeniece/M Jenifer/M Jeniffer/M Jenilee/M Jenine/M Jenkins Jenn/MRJ Jenna/M Jennee/M Jennette/M Jenni/M Jennica/M Jennie/M Jennifer/M Jennilee/M Jennine/M Jennings/M Jenny/M Jeno/M Jensen/M Jephthah Jerad/M Jerald/M Jeralee/M Jeramey/M Jeramie/M Jere/M Jereme/M Jeremiah/M Jeremiahs Jeremias/M Jeremie/M Jeremy/M Jeri/M Jericho/M Jermain/M Jermaine/M Jermayne/M Jeroboam Jerold/M Jerome Jeromy/M Jerri/M Jerrie/M Jerrilee/M Jerrilyn/M Jerrine/M Jerrod/M Jerrold/M Jerrome/M Jerry/M Jerrylee/M Jersey/MS Jerusalem/M Jervis/M Jess/M Jessa/M Jessalin/M Jessalyn/M Jessamine/M Jessamyn/M Jesse Jessee/M Jesselyn/M Jessey/M Jessi/M Jessica/M Jessie/M Jessika/M Jessy/M Jesuit/MS Jesus Jeth/M Jethro Jetway Jew/SM Jewel/M Jewell/M Jewelle/M Jewess/MS Jewish/P Jewry Jezebel/SM Jidda Jilin Jill Jillana/M Jillane/M Jillayne/M Jilleen/M Jillene/M Jilli/M Jillian/M Jillie/M Jilly/M Jim/M Jimenez/M Jimmie/M Jimmy/M Jinan Jinnah Jinny/M Jivaro Jo/MY Joachim Joan Joana/M Joane/M Joanie/M Joann/M Joanna/M Joanne/SM Joaquin/M Job/SM Jobey/M Jobi/M Jobie/M Jobina/M Joby/M Jobye/M Jobyna/M Jocasta Jocelin/M Joceline/M Jocelyn/M Jocelyne/M Jock Jockey Jocko/M Jodee/M Jodi/M Jodie/M Jody/M Joe Joeann/M Joel/Y Joela/M Joelie/M Joell/MN Joella/M Joelle/M Joellen/M Joelly/M Joellyn/M Joelynn/M Joesph/M Joete/M Joey/M Jogjakarta/M Johan/M Johann/M Johanna/M Johannah/M Johannes Johannesburg/M John/SM Johna/MH Johnath/M Johnathan/M Johnathon/M Johnette/M Johnie/M Johnna/M Johnnie Johnny/M Johnson/M Johnston/M Johny/M Joice/M Jojo/M Jolee/M Joleen/M Jolene/M Joletta/M Joli/M Jolie/M Joline/M Jolson Joly/M Jolyn/M Jolynn/M Jon/M Jonah/M Jonahs Jonas Jonathan/M Jonathon/M Jone/SM Jonell/M Joni/SM Jonie/M Jonson Joplin Jordain/M Jordan/M Jordana/M Jordanian/MS Jordanna/M Jordon/M Jorey/M Jorgan/M Jorge/M Jori/M Jorie/M Jorrie/M Jorry/M Jory/M Joscelin/M Jose/M Josee/M Josef/M Josefa/M Josefina/M Joseito/M Joseph/M Josepha/M Josephina/M Josephine Josephs Josephson/M Josephus Josey/M Josh Joshia/M Joshua/M Joshuah/M Josi/M Josiah Josias/M Josie/M Josselyn/M Josue/M Josy/M Joule Jourdain/M Jourdan/M Jove/M Jovian Joy/M Joya/M Joyan/M Joyann/M Joyce Joycean Joycelin/M Joye/M Joyner/M Jozef/M Jpn Jr/M Jsandye/M Juan/M Juana/M Juanita/M Juarez/M Jubal Jud Judah Judaic Judaical Judaism/MS Judas/MS Judd/M Jude Judea Judges Judi/MH Judie/M Judith/M Juditha/M Judon/M Judson/M Judy Judye/M Juggernaut/M Juieta/M Jul Jule/SM Julee/M Juli/M Julia/M Julian Juliana Juliane/M Juliann/M Julianna/M Julianne/M Julie/M Julienne/M Juliet Julieta/M Julietta/M Juliette/M Julina/M Juline/M Julio/M Julissa/M Julita/M Julius/M Julliard/M July/SM Jun June/SM Juneau/M Junette/M Jung/M Jungfrau Jungian Junia/M Junie/M Junina/M Junior/SM Junker/SM Juno/M Jupiter/M Jurassic/M Jurua/M Justen/M Justice/M Justin/M Justina/M Justine/M Justinian/M Justinn/M Justino/M Justis/M Justus/M Jutland/M Juvenal Jyoti/M K/SMNRGJ KB/M KC KGB KIA KKK/M KO/M KP KS KY Kaaba Kabul/M Kacey/M Kacie/M Kacy/M Kaela/M Kafka/M Kafkaesque Kagoshima Kahaleel/M Kahlil/M Kahlua/M Kai/M Kaia/M Kaifeng Kaila/M Kaile/M Kailey/M Kain/M Kaine/M Kaiser/MS Kaitlin/M Kaitlyn/M Kaitlynn/M Kaja/M Kakalina/M Kala/M Kalahari/M Kalamazoo Kalashnikov Kalb/M Kale/M Kaleb/M Kaleena/M Kalevala Kalgoorlie Kali/M Kalie/M Kalil/M Kalila/M Kalina/M Kalinda/M Kalindi/M Kalle/M Kalli/M Kally/M Kalmyk Kalvin/M Kama/M Kamchatka Kamehameha/M Kameko/M Kamila/M Kamilah/M Kamillah/M Kampala/M Kampuchea/M Kan/S Kanchenjunga/M Kandace/M Kandahar Kandinsky Kandy Kane/M Kania/M Kannada/M Kano Kanpur Kansan/MS Kansas Kant/M Kantian Kanya/M Kaohsiung Kaposi/M Kara/M Karachi/M Karaganda Karakorum Karalee/M Karalynn/M Karamazov/M Kare/M Karee/M Kareem/M Karel/M Karen/M Karena/M Karenina/M Kari/M Karia/M Karie/M Karil/M Karilynn/M Karim/M Karin/M Karina/M Karine/M Kariotta/M Karisa/M Karissa/M Karita/M Karl/MNX Karla/M Karlan/M Karlee/M Karleen/M Karlen/M Karlene/M Karlie/M Karlik/M Karlis Karloff/M Karlotta/M Karlotte/M Karly/M Karlyn/M Karmen/M Karna/M Karney/M Karo/MY Karol/M Karola/M Karole/M Karolina/M Karoline/M Karoly/M Karon/M Karrah/M Karrie/M Karroo/M Karry/M Kary/M Karyl/M Karylin/M Karyn/M Kasai/M Kasey/M Kashmir/SM Kaspar/M Kasparov/M Kasper/M Kass Kassandra/M Kassey/M Kassi/M Kassia/M Kassie/M Kat/M Kata/M Katalin/M Kate/M Katee/M Katelyn/M Katerina/M Katerine/M Katey/M Kath/M Katha/M Katharina/M Katharine/M Katharyn/M Kathe/M Katherina/M Katherine/M Katheryn/M Kathi/M Kathiawar Kathie/M Kathleen/M Kathlin/M Kathmandu/M Kathrine/M Kathryn/M Kathryne/M Kathy/M Kathye/M Kati/M Katie/M Katina/M Katine/M Katinka/M Katleen/M Katlin/M Katmai Katowice Katrina/M Katrine Katrinka/M Katti/M Kattie/M Katuscha/M Katusha/M Katy/M Katya/M Kauai/M Kaufman/M Kaunas/M Kaunda/M Kawabata/M Kawasaki Kay Kaycee/M Kaye/M Kayla/M Kayle/M Kaylee/M Kayley/M Kaylil/M Kaylyn/M Kayne/M Kazakh/M Kazakhs Kazakhstan/M Kazan/M Kazantzakis Kb/M Kean Keane/M Kearney/M Keary/M Keaton/M Keats Keck/M Keefe/RM Keefer/M Keelby/M Keeley/M Keelia/M Keely/M Keen/M Keenan/M Keene/M Keewatin Keillor/M Keir/M Keisha/M Keith/M Kelbee/M Kelby/M Kelcey/M Kelci/M Kelcie/M Kelcy/M Kele/M Kelila/M Kellby/M Kellen/M Keller Kelley/M Kelli/M Kellia/M Kellie/M Kellina/M Kellogg Kellsie/M Kelly Kellyann/M Kelsey/M Kelsi/M Kelsy/M Kelvin Kelwin/M Kemerovo Kemp/M Kempis Kendal/M Kendall/M Kendell/M Kendra/M Kendre/M Kendrick/MS Kenmore/M Kenn/M Kenna/M Kennan/M Kennedy/M Kenneth/M Kennett/M Kennie/M Kennith/M Kenny/M Kenon/M Kent/M Kenton/M Kentuckian/SM Kentucky/M Kenya/M Kenyan/SM Kenyatta Kenyon/M Keogh/M Keokuk/M Kepler/M Ker/M Kerby/M Kerensky/M Keri/M Keriann/M Kerianne/M Kerk/M Kermie/M Kermit/M Kermy/M Kern Kerouac Kerr Kerri/M Kerrie/M Kerrill/M Kerrin/M Kerry Kerstin/M Kerwin/M Kerwinn/M Kesley/M Keslie/M Kessia/M Kessiah/M Kettering Ketti/M Kettie/M Ketty/M Kev/MN Kevan/M Keven/M Kevin/M Kevina/M Kevlar Kevon/M Kevorkian/M Kevyn/M Kewpie Key Keynes/M Keynesian Khabarovsk Khachaturian Khalid/M Khalil/M Khan/M Kharkov/M Khartoum/M Khayyam/M Khazar/M Khmer/M Khoikhoi/M Khoisan/M Khomeini/M Khorana/M Khrushchev Khufu Khulna/M Khwarizmi/M Khyber/M Ki/M Kiah/M Kial/M Kickapoo Kidd/M Kiel Kiele/M Kienan/M Kierkegaard Kiersten/M Kieth/M Kiev/M Kigali/M Kikelia/M Kikuyu Kilauea Kile/M Kiley/M Kilian/M Kilimanjaro/M Killian/M Killie/M Killy/M Kilroy/M Kim/M Kimball/M Kimbell/M Kimberlee/M Kimberley Kimberli/M Kimberly/M Kimberlyn/M Kimble/M Kimbra/M Kimmi/M Kimmie/M Kimmy/M Kin/M Kincaid/M King/M Kingsley Kingsly/M Kingston/M Kingstown/M Kinko's Kinna/M Kinney/M Kinnie/M Kinny/M Kinsey Kinshasa/M Kinsley/M Kiowa/MS Kip/M Kipling/M Kipp/MR Kippar/M Kipper/M Kippie/M Kippy/M Kira/M Kirbee/M Kirbie/M Kirby/M Kirchhoff Kirchner/M Kirghistan/M Kirghiz/M Kirghizia/M Kiri/M Kiribati/M Kirinyaga/M Kirk Kirkland/M Kirkpatrick/M Kirov Kirsten/M Kirsteni/M Kirsti/M Kirstin/M Kirstyn/M Kisangani Kishinev/M Kislev/M Kissee/M Kissiah/M Kissie/M Kissinger Kit/M Kitakyushu/M Kitchener Kitti/M Kittie/M Kitty/M Kiwanis Kizzee/M Kizzie/M Klan/M Klansman/M Klara/M Klarika/M Klarrisa/M Klaus/M Klee Kleenex/MS Klein/M Klemens/M Klement/M Kleon/M Kliment/M Klimt Kline Klingon/M Klondike/MS Kmart/M Knapp/M Knesset/M Kngwarreye/M Knickerbocker Knievel/M Knight Knopf/M Knossos Knowles Knox Knoxville Knudsen/M Knuth/M Knuths Kobe Koch Kochab/M Kodachrome/M Kodak Kodaly/M Kodiak/M Koenraad/M Koestler Kohinoor Kohl Kojak/M Kolyma Kommunizma/M Kong/M Kongo/M Konrad/M Konstance/M Konstantin/M Konstantine/M Konstanze/M Koo/M Koontz/M Koppel/M Kora/M Koral/M Koralle/M Koran/MS Koranic Kordula/M Kore/M Korea/M Korean/SM Korella/M Koren/M Koressa/M Korey/M Kori/M Korie/M Kornberg/M Korney/M Korrie/M Korry/M Kort/M Kory/M Korzybski Kosciusko Kossuth Kosygin Koufax/M Kowloon Kr/M Kraft/M Krakatoa/M Krakow/M Kramer/M Krasnodar Krasnoyarsk Krebs Kremlin Kremlinologist Kremlinology Kresge/M Kringle/M Kris/M Krisha/M Krishna/M Krishnah/M Krishnamurti/M Krispin/M Krissie/M Krissy/M Krista/M Kristal/M Kristan/M Kriste/M Kristel/M Kristen/M Kristi/MN Kristian/M Kristie/M Kristien/M Kristin/M Kristina/M Kristine/M Kristo/SM Kristofer/M Kristoffer/M Kristofor/M Kristoforo/M Kristopher/M Kristy/M Kristyn/M Kroc/M Kroger/M Kronecker/M Kropotkin Kruger Krugerrand Krupp Krysta/M Krystal/M Krystalle/M Krystle/M Krystyna/M Kshatriya/M Kublai/M Kubrick Kuhn/M Kuibyshev Kunming Kuomintang Kurd Kurdish/M Kurdistan Kurosawa Kurt/M Kurtis/M Kusch/M Kutuzov Kuwait/M Kuwaiti/SM Kuznets/M Kuznetsk/M Kwakiutl/M Kwangju Kwanzaa/MS Ky/H Kyla/M Kyle/M Kylen/M Kylie/M Kylila/M Kylynn/M Kym/M Kynthia/M Kyoto/M Kyrgyzstan Kyrstin/M Kyushu/M L'Amour L'Enfant L'Ouverture L/MN LA LAN/M LBJ/M LC LCD/M LCM LDC LED/M LIFO LL LLB/M LLD/M LNG LOGO LP/M LPG LPN/SM LSAT LSD/M LVN La/M Lab Laban Labrador/SM Labradorean Lacee/M Lacey/M Lachesis/M Lacie/M Lacy/M Ladoga Ladonna/M Lady Ladyship/MS Laetitia/M Lafayette Lafitte/M Lagos/M Lagrange Lagrangian Lahore Laina/M Lainey/M Laird/M Laius Lajos/M Lakeisha/M Lakewood Lakisha/M Lakshmi/M Lalo/M Lamaism/SM Lamar/M Lamarck/M Lamaze Lamb Lambert Lamborghini/M Lambrusco Lamentations Lammond/M Lamond/M Lamont/M Lana/M Lanae/M Lanai/M Lancaster/M Lance/M Lancelot/M Land Landon/M Landry/M Landsat Landsteiner/M Lane/M Lanette/M Laney/M Lang Langerhans/M Langland Langley Langmuir Langsdon/M Langston/M Lani/M Lanie/M Lanita/M Lanna/M Lanni/M Lannie/M Lanny/M Lansing/M Lanzhou/M Lao/SM Laocoon/M Laotian/SM Laplace Lapland/MR Lapp/SM Lara/M Laraine/M Laramie/M Lardner/M Laredo Lari/M Larina/M Larine/M Larisa/M Larissa/M Lark/M Larousse Larry/M Lars/N Larsen/M Larson/M Laryssa/M Lascaux/M Lassa/M Lassen/M Lassie/M Lat Latasha/M Latashia/M Lateran/M Latia/M Latin/MRS Latina Latino/SM Latisha/M Latonya/M Latoya/M Latrena/M Latrina/M Latrobe/M Latvia/M Latvian/MS Laud/R Laue Laughton Launce/M Laundromat Laura/M Lauraine/M Laural/M Lauralee/M Laurasia/M Laure/M Lauree/M Laureen/M Laurel/M Laurella/M Lauren/SM Laurena/M Laurence/M Laurene/M Laurent/M Lauretta/M Laurette/M Lauri/M Laurianne/M Laurice/M Laurie/M Lauritz/M Lauryn/M Laval Lavena/M Lavern/M Laverna/M Laverne/M Lavina/M Lavinia/M Lavinie/M Lavoisier Lavonne/M Law Lawanda/M Lawrence Lawry/M Lawson Lawton/M Lay/M Layamon Layla/M Layne/M Layney/M Layton/M Lazar/M Lazare/M Lazaro/M Lazarus/M Le/SMN Lea/M Leach/M Leadbelly Leah Leakey/M Lean/M Leander Leandra/M Leann/M Leanna/M Leanne/M Leanor/M Leanora/M Lear/M Learjet/M Leary/M Leavenworth Lebanese/M Lebanon/M Lebbie/M Lebesgue/M Leblanc/M Leda Lederberg/M Lee/M Leeann/M Leeanne/M Leeds/M Leela/M Leelah/M Leeland/M Leena/M Leesa/M Leese/M Leeuwenhoek Leeward/M Left Lefty/M Legendre Leger/M Leghorn Lego/M Legra/M Legree/M Lehman/M Leia/M Leibniz/M Leicester/SM Leiden/M Leif/M Leigh Leigha/M Leighton/M Leila/M Leilah/M Leipzig/M Leisha/M Lek/M Lela/M Lelah/M Leland/M Lelia/M Lem/M Lemaitre/M Lemar/M Lemmie/M Lemmy/M Lemuel/M Lemuria/M Len/M Lena/M Lenard/M Lenci/M Lenee/M Lenette/M Lenin/M Leningrad/M Leninism/M Leninist Lenka/M Lenna/M Lennard/M Lennie/M Lennon/M Lenny/M Leno/M Lenoir/M Lenora/M Lenore/M Lent/SMN Leo/SM Leodora/M Leoine/M Leola/M Leoline/M Leon Leona/M Leonanie/M Leonard/M Leonardo/M Leoncavallo Leone/M Leonel/M Leonelle/M Leonerd/M Leonhard/M Leonid Leonidas/M Leonie/M Leonor/M Leonora/M Leonore/M Leontine/M Leontyne/M Leopold/M Leopoldo/M Leora/M Lepidus Lepke/M Lepus/M Lerner Leroi/M Leroy/M Lesa/M Leshia/M Lesley/M Lesli/M Leslie/M Lesly/M Lesotho/M Lesseps Lessie/M Lester/M Lestrade/M Lesya/M Leta/M Letha/M Lethe/M Lethia/M Leticia/M Letisha/M Letitia/M Letizia/M Letta/M Letterman/M Letti/M Lettie/M Letty/M Leupold/M Lev Levant/M Levesque/M Levey/M Levi/SM Leviathan Levin/M Levine/M Leviticus/M Levitt/M Levon/M Levy/M Lew/M Lewes Lewie/M Lewinsky/M Lewis Lewiss Lexi/SM Lexie/M Lexine/M Lexington/M Lexus/M Lexy/M Leyla/M Lezley/M Lezlie/M Lhasa/MS Lhotse/M Li/MY Lia/M Liam/M Lian/M Liana/M Liane/M Lianna/M Lianne/M Lib Libbey/M Libbi/M Libbie/M Libby Liberace/M Liberia/M Liberian/SM Libra/MS Libreville/M Librium/M Libya/M Libyan/SM Licha/M Lichtenstein Lida/M Lidia/M Lie Lieberman/M Liebfraumilch Liechtenstein/ZMR Liechtensteiner/M Lief/M Liege/M Liesa/M Lieut Lil/MY Lila/SM Lilah/M Lilia/MS Lilian/M Liliana/M Liliane/M Lilith/M Liliuokalani Lilla/M Lille Lilli/MS Lillian/M Lillie/M Lilliput/M Lilliputian/SM Lilllie/M Lilly/M Lilongwe/M Lily/M Lilyan/M Lima/M Limbaugh/M Limbo Limburger Limoges Limousin/M Limpopo/M Lin/M Lina/M Linc/M Lincoln/MS Lind Linda/M Lindbergh Lindi/M Lindie/M Lindon/M Lindsay Lindsey Lindsy/M Lindy Linea/M Linell/M Linet/M Linette/M Link/M Linn/M Linnaeus/M Linnea/M Linnell/M Linnet/M Linnie/M Linoel/M Linotype Linton/M Linus/M Linux/S Linwood/M Linzy/M Lionel/M Lionello/M Lipizzaner Lippi Lippmann Lipscomb/M Lipton/M Lira/M Lisa/M Lisabeth/M Lisbeth/M Lisbon/M Lise/M Lisetta/M Lisette/M Lisha/M Lishe/M Lisle/M Lissa/M Lissajous/M Lissi/M Lissie/M Lissy/M Lister/M Listerine/M Liston/M Liszt Lita/M Lithuania/M Lithuanian/MS Little/M Litton/M Liuka/M Liv/M Liva/M Liverpool/M Liverpudlian/MS Livia/M Livingston Livingstone Livonia/M Livvie/M Livvy/M Livvyy/M Livy Liz/M Liza/M Lizabeth/M Lizbeth/M Lizette/M Lizzie/M Lizzy/M Ljubljana/M Llewellyn Lloyd Llywellyn/M Ln Loafer/SM Lobachevsky Lochinvar Lock/M Locke/M Lockean Lockheed/M Lockwood/M Lodge Lodovico/M Lodz/M Loella/M Loewe Loewi Loews/M Logan/M Lohengrin Loire/M Lois/M Loise/M Loki/M Lola/M Loleta/M Lolita Lollard Lollobrigida/M Lolly/M Lombard/M Lombardi/M Lombardy/M Lome/M Lon/M Lona/M London/MRZ Londoner/M Lonee/M Long Longfellow/M Longstreet/M Longueuil Loni/M Lonna/M Lonnard/M Lonni/M Lonnie/M Lonny/M Lopez/M Lora/M Lorain/M Loraine/M Loralee/M Loralie/M Loralyn/M Lorant/M Lord/SM Lordship/SM Loree/M Loreen/M Lorelei/M Lorelle/M Loren/S Lorena/M Lorene/M Lorentz Lorenz Lorenza/M Lorenzo/M Loretta/M Lorette/M Lori/M Loria/M Lorianna/M Lorianne/M Lorie/M Lorilee/M Lorilyn/M Lorin/M Lorinda/M Lorine/M Lorita/M Lorna/M Lorne/M Lorraine/M Lorrayne/M Lorre/M Lorri/M Lorrie/M Lorrin/M Lorry/M Lory/M Lot/M Lothaire/M Lothario/SM Lott/M Lotta/M Lotte/M Lotti/M Lottie/M Lotty/M Lou/M Louella/M Louie/M Louis Louisa/M Louise/M Louisette/M Louisiana/M Louisianan/MS Louisianian/MS Louisville/M Lourdes Loutitia/M Louvre/M Love/M Lovecraft/M Lovelace Lovell Lowe/M Lowell Lowenbrau/M Lowery/M Lowlands Lowrance/M Loy/M Loyang/M Loyd/M Loydie/M Loyola Lr Lt Ltd Lu/M Luanda/M Luann/M Lubavitcher Lubbock Lubumbashi Luca/SM Lucais/M Luce/M Lucho/M Luci/MN Lucia/MS Lucian Luciana/M Luciano/M Lucie/M Lucien/M Lucienne/M Lucifer/M Lucila/M Lucile/M Lucilia/M Lucille/M Lucina Lucinda/M Lucine/M Lucio/M Lucita/M Lucite/SM Lucius/M Lucknow/M Lucky/M Lucretia Lucretius Lucy/M Luddite/MS Ludhiana Ludovico/M Ludovika/M Ludvig/M Ludwig/M Luella/M Luelle/M Lufthansa/M Luftwaffe Luger/M Lugosi/M Luigi/M Luis/M Luisa/M Luise/M Lukas/M Luke/M Lula/M Lulita/M Lully Lulu/M Lumiere/M Luna/M Lupe/M Lupus/M Lura/M Lurette/M Luria/M Lurleen/M Lurlene/M Lurline/M Lusa/M Lusaka/M Lusitania/M Lutero/M Luther/M Lutheran/SM Lutheranism/MS Luvs/M Luxembourg/ZMR Luxembourger/M Luxembourgian Luz/M Luzon/M Lvov Ly/MY LyX/M Lyallpur Lycra Lycurgus Lyda/M Lydia Lydian/SM Lydie/M Lydon/M Lyell Lyle/M Lyman/M Lyme/M Lyn/M Lynch Lynda/M Lynde/M Lyndel/M Lyndell/M Lyndon/M Lyndsay/M Lyndsey/M Lyndsie/M Lyndy/M Lynea/M Lynelle/M Lynett/M Lynette/M Lynn Lynna/M Lynne/M Lynnea/M Lynnell/M Lynnelle/M Lynnet/M Lynnett/M Lynnette/M Lynsey/M Lyon/SM Lyra/M Lysenko Lysistrata/M Lysol/M Lyssa/M M/SMGB MA/M MASH MB/M MBA/M MC MCI/M MD/M MDT ME MEGO/S MFA/M MGM/M MHz/M MI/M MIA MIDI/M MIPS MIPSes MIRV MIT/M MM MN MO MP/M MRI/M MS/M MSG/M MST/M MSW MT/M MTV MVP/M MW Maalox/M Mab Mabel/M Mabelle/M Mable/M Mac MacArthur MacBride/M MacDonald MacLeish/M Macao/M Macaulay Macbeth Maccabees Maccabeus/M Mace Macedon/M Macedonia/M Macedonian/SM Mach Machiavelli/M Machiavellian Macias/M Macintosh/M Mack/M Mackenzie/M Mackinac/M Mackinaw Macmillan Macon Macumba/M Macy/M Mada/M Madagascan/SM Madagascar/M Madalena/M Madalyn/M Maddalena/M Madden/M Maddi/M Maddie/M Maddox/M Maddy/M Madeira/SM Madel/M Madelaine/M Madeleine/M Madelena/M Madelene/M Madelin/M Madelina/M Madeline/M Madella/M Madelle/M Madelon/M Madelyn/M Madge/M Madison/M Madlen/M Madlin/M Madonna/SM Madras/M Madrid/M Madurai/M Mady/M Mae/M Maegan/M Maeterlinck/M Mafia/MS Mafioso Mag/M Magda/M Magdaia/M Magdalen Magdalena Magdalene/M Magellan/M Magellanic Maggee/M Maggi/M Maggie/M Maggy/M Maghreb/M Magi Maginot/M Magnitogorsk Magnum Magog Magoo/M Magritte Magsaysay/M Magus Magyar/SM Mahabharata/M Mahala/M Mahalia/M Maharashtra/M Mahavira/M Mahayana/M Mahayanist/M Mahdi Mahfouz/M Mahican/SM Mahler Mahmoud/M Mahmud/M Mai/M Maia/M Maible/M Maidenform/M Maiga/M Maighdiln/M Maigret/M Mailer Maillol Maiman/M Maimonides Maine/MZR Mainer/M Mair/M Maire/M Maisey/M Maisie/M Maison/M Maitilde/M Maitreya/M Maj Maje/M Majesty Major Majorca/M Majuro Makarios/M Maker Mal Mala/M Malabar/M Malabo/M Malacca Malachi Malagasy Malamud Malanie/M Malaprop/M Malawi/M Malawian/SM Malay/MS Malaya/M Malayalam/M Malayan/MS Malaysia/M Malaysian/MS Malchy/M Malcolm Maldive/MS Maldives/M Maldivian/MS Maldonado/M Male/M Malena/M Mali Malia/M Malian/SM Malibu/M Malina/M Malinda/M Malinde/M Malinowski Malissa/M Malissia/M Mallarme Mallissa/M Mallomars/M Mallorie/M Mallory/M Malone/M Malorie/M Malory/M Malplaquet/M Malraux Malta/M Maltese/M Malthus/M Malthusian/SM Malva/M Malvin/M Malvina/M Malynda/M Mame/M Mameluke Mamet Mamie/M Mamore/M Man/M Managua/M Manama/M Manasseh Manchester/M Manchu/SM Manchuria/M Manchurian Mancini/M Mancunian/MS Manda/M Mandalay/M Mandarin/M Mandel/M Mandela Mandelbrot Mandi/M Mandie/M Mandingo Mandy/M Manet Manfred/M Manhattan/SM Mani Manichean Manila/SM Manitoba/M Manitoulin/M Manley/M Mann/G Mannheim/M Mannie/M Manny/M Mano/M Manolo/M Manon/M Mansfield Manson/M Mantegna Mantle/M Manuel/M Manuela/M Manx/M Manya/M Mao/M Maoism/SM Maoist/SM Maori/MS Mapplethorpe/M Maputo/M Mar/SMN Mara/M Marabel/M Maracaibo Marat Maratha/M Marathi/M Marathon/M Marc Marceau Marcel/M Marcela/M Marcelia/M Marcelino/M Marcella/M Marcelle/M Marcellina/M Marcelline/M Marcello/M Marcellus Marcelo/M March/MS Marchall/M Marchelle/M Marci/M Marcia/M Marciano Marcie/M Marcile/M Marcille/M Marco/MS Marconi Marcus/M Marcuse Marcy/M Marduk/M Mareah/M Maren/M Marena/M Maressa/M Marga/M Margalit/M Margalo/M Margaret Margareta/M Margarete/M Margaretha/M Margarethe/M Margaretta/M Margarette/M Margarita Margarito/M Margaux Marge/M Margeaux/M Margery/M Marget/M Margette/M Margi/M Margie/M Margit/M Margo/M Margot/M Margret/M Margrethe/M Marguerite/M Margy/M Mari/SM Maria/M Mariam/M Marian Mariana/SM Mariann/M Marianna/M Marianne Mariano/M Maribel/M Maribelle/M Maribeth/M Marice/M Maricela/M Maridel/M Marie/M Marieann/M Mariejeanne/M Mariel/M Mariele/M Marielle/M Mariellen/M Marietta/M Mariette/M Marigold/M Marijn/M Marijo/M Marika/M Marilee/M Marilin/M Marillin/M Marilyn/M Marin Marina/M Marine/SM Marinna/M Mario/M Marion/M Mariquilla/M Marisa/M Mariska/M Marisol/M Marissa/M Marita/M Maritain Maritsa Maritza/M Mariupol Marius Mariya/M Marj/M Marja/M Marje/M Marji/M Marjie/M Marjorie/M Marjory/M Marjy/M Mark/SM Markab/M Marketa/M Markham Markos Markov Markus/M Marla/M Marlane/M Marlboro/M Marlborough Marleah/M Marlee/M Marleen/M Marlena/M Marlene/M Marley/M Marlie/M Marlin Marline/M Marlo/M Marlon/M Marlow/M Marlowe Marlyn/M Marmaduke/M Marmara/M Marna/M Marne Marney/M Marni/M Marnia/M Marnie/M Maronite Marple/M Marquesas/M Marquette Marquez/M Marquis Marquita/M Marrakesh/M Marrilee/M Marriott/M Marris/M Marrissa/M Mars/MS Marsala/M Marseillaise/MS Marseilles Marsh/M Marsha/M Marshal/M Marshall/M Marsiella/M Mart/MN Marta/M Martainn/M Martel Martelle/M Marten/M Martguerita/M Martha Marthe/M Marthena/M Marti/M Martial Martian/SM Martica/M Martie/M Martin Martina/M Martinez/M Martinique/M Martino/M Martita/M Marty/M Martyn/M Martynne/M Marv/MN Marva/M Marve/M Marvell/M Marven/M Marvin Marwin/M Marx/M Marxian Marxism/SM Marxist/SM Mary/M Marya/M Maryann/M Maryanna/M Maryanne/M Marybelle/M Marybeth/M Maryellen/M Maryjane/M Maryjo/M Maryl/M Maryland/MR Marylee/M Marylin/M Marylinda/M Marylou/M Marylynne/M Maryrose/M Marys Marysa/M Masada/M Masai/M Masaryk Mascagni Masefield Maserati/M Maseru/M Masha/M Mashhad/M Mason/MS Masonic Masonite/M Mass/MS Massachusetts Massasoit Massenet Massey Massimiliano/M Massimo/M Master/S MasterCard/M Mata/M Matelda/M Mateo/M Mathe/MR Mathew/SM Mathewson/M Mathian/M Mathias Mathilda/M Mathilde/M Mathis Matias/M Matilda Matilde/M Matisse Matt Mattel/M Matteo/M Matterhorn/M Matthaeus/M Mattheus/M Matthew/SM Matthias Matthieu/M Matthiew/M Matthus/M Matti/M Mattias/M Mattie/M Matty/M Maud/M Maude/M Maudie/M Maugham Maui/M Maupassant Maura/M Maure/M Maureen/M Maureene/M Maurene/M Mauriac Maurice Mauricio/M Maurie/M Maurine/M Maurise/M Maurita/M Mauritania/M Mauritanian/MS Mauritian/SM Mauritius/M Maurits/M Maurizia/M Maurizio/M Mauro/M Maurois Maury Mauryan/M Mauser Mavis/M Mavra/M Max/M Maxi/M Maxie/M Maxim Maximilian Maximilianus/M Maximilien/M Maximo/M Maxine/M Maxwell Maxy/M May/SMR Maya/SM Mayan/MS Maybelle/M Maye/M Mayfair Mayflower/M Maynard/M Mayne/M Maynord/M Mayo Mayor/M Maypole Mayra/M Maytag/M Mazama/M Mazarin Mazatlan/M Mazda Mazola/M Mazzini/M Mb/M Mbabane/M Mbini/M McAdam/M McBride/M McCain/M McCall/M McCarthy McCarthyism/M McCartney/M McCarty/M McClain/M McClellan McClure/M McConnell/M McCormick McCoy McCray/M McCullough/M McDaniel/M McDonald/M McDonnell/M McDowell/M McEnroe/M McFadden/M McFarland/M McGee/M McGovern/M McGowan/M McGuffey/M McGuire/M McIntosh/M McIntyre/M McKay/M McKee/M McKenzie/M McKinley/M McKinney/M McKnight/M McLaughlin/M McLean/M McLeod/M McLuhan/M McMahon/M McMillan/M McNamara/M McNaughton/M McNeil/M McPherson/M McQueen/M McVeigh/M Md/M Me Mead Meade Meadows Meagan/M Meaghan/M Meany/M Meara/M Mecca/MS Mechelle/M Medan Medea/M Medellin Media Medicaid/SM Medicare/SM Medici Medina Mediterranean/SM Medusa/M Meg/MN Megan/M Megen/M Meggi/M Meggie/M Meggy/M Meghan/M Meghann/M Mehetabel/M Mei/MR Meier/M Meighen/M Meiji/M Meir Mejia/M Mekong/M Mel/MY Mela/M Melamie/M Melanesia/M Melanesian Melania/M Melanie/M Melantha/M Melany/M Melba Melbourne/M Melchior Melchizedek Melendez/M Melesa/M Melessa/M Melicent/M Melina/M Melinda/M Melinde/M Melisa/M Melisande/M Melisandra/M Melisenda/M Melisent/M Melissa/M Melisse/M Melita/M Melitta/M Mella/M Melli/M Mellicent/M Mellie/M Mellisa/M Mellisent/M Mellon Melloney/M Melly/M Melodee/M Melodie/M Melody/M Melonie/M Melony/M Melosa/M Melpomene/M Melton/M Melva/M Melville/M Melvin/M Melvyn/M Memling Memphis/M Menander Menard/M Mencius Mencken Mendel/M Mendeleev/M Mendelian Mendelssohn Mendez/M Mendie/M Mendocino/M Mendoza Mendy/M Menelaus/M Menelik/M Menes Mengzi Menkalinan/M Menkar/M Menkent/M Mennen/M Mennonite/MS Menominee/M Menotti Mensa Mentholatum/M Menuhin/M Menzies Mephistopheles Merak/M Mercado/M Mercator Mercedes Mercer/M Merci/M Mercia Mercie/M Merck/M Mercurochrome/M Mercury/SM Mercy/M Meredeth/M Meredith Meredithe/M Merell/M Meridel/M Meridith/M Meriel/M Merilee/M Merill/M Merilyn/M Merino Meris Merissa/M Merl/M Merla/M Merle/M Merlin/M Merlina/M Merline/M Merlot Merna/M Merola/M Merovingian Merralee/M Merrel/M Merriam/M Merrick/M Merridie/M Merrie/M Merrielle/M Merrile/M Merrilee/M Merrili/M Merrill/M Merrily/M Merrimack/M Merritt/M Merry/M Mersey Merthiolate/M Merton Merv/M Mervin/M Merwin/M Merwyn/M Meryl/M Mesa Mesabi/M Mesmer/M Mesolithic Mesopotamia/M Mesopotamian Mesozoic/M Messerschmidt/M Messiaen Messiah/M Messiahs Messianic Meta Metamucil/M Methodism/SM Methodist/SM Methuselah Metternich Meuse/M Mex Mexicali Mexican/MS Mexico/M Meyer/MS Meyerbeer Mfume/M Mg/M Mgr MiG Mia/M Miami/MS Miaplacidus/M Mic Micaela/M Micah Micawber Mich Michael Michaela/M Michaelina/M Michaeline/M Michaella/M Michaelmas/MS Michail/M Michal/M Michale/M Micheal/M Micheil/M Michel/M Michelangelo/M Michele/M Michelin/M Michelina/M Micheline/M Michell/M Michelle/M Michelob/M Michelson Michigan/M Michigander/SM Michiganite Mick/M Mickey/M Micki/M Mickie/M Micky/M Micmac/SM Micronesia/M Micronesian Microsoft/M Midas/M Middleton Mideast Mideastern Midge/M Midland/S Midway/M Midwest/M Midwestern/R Mignon/M Mignonne/M Miguel/M Miguela/M Miguelita/M Mikael/M Mikaela/M Mike/M Mikel/M Mikey/M Mikhail/M Mikkel/M Mikol/M Mikoyan/M Mil/MY Milagros/M Milan/M Milanese Mildred/M Mildrid/M Mile/SM Milena/M Milford/M Milicent/M Milissent/M Milka/M Milken/M Mill/SR Millard/M Millay Millet Milli/M Millicent/M Millie/M Millikan Millisent/M Milly/M Milne Milo/M Milosevic/M Milquetoast/M Milt/M Miltiades Miltie/M Milton Miltonic Miltown/M Milty/M Milwaukee/M Milzie/M Mimi/M Mimosa/M Min/MR Mina/M Minamoto/M Minda/M Mindanao Mindoro/M Mindy/M Miner/M Minerva/M Minetta/M Minette/M Mingus/M Minn Minna Minnaminnie/M Minne/M Minneapolis/M Minnelli/M Minnesota/M Minnesotan/SM Minni/M Minnie/M Minnnie/M Minny/M Minoan/MS Minolta/M Minor/M Minos/M Minot/M Minotaur/M Minsk/M Minsky/M Minta/M Mintaka/M Minuit Minuteman/M Miocene/M Miquela/M Mir/M Mira/M Mirabeau Mirabel/M Mirabella/M Mirabelle/M Mirach/M Miran/M Miranda Mireielle/M Mireille/M Mirella/M Mirelle/M Mirfak/M Miriam/M Mirilla/M Mirna/M Miro Mirzam/M Mischa/M Misha/M Miskito Miss Missie/M Mississauga Mississippi/M Mississippian/SM Missouri/M Missourian/MS Missy/M Mistassini Mister Misti Mistress Misty/M Mitch/M Mitchael/M Mitchel/M Mitchell Mitford/M Mithra/M Mithridates/M Mitsubishi/M Mitterrand/M Mitty/M Mitzi/M Mixtec Mizar Mk Mlle Mme/S Mn/M Mnemosyne/M Mo/M Mobil/M Mobile/M Mobutu/M Modesta/M Modestia/M Modestine/M Modesto Modesty/M Modigliani Moe/M Mogadishu Mogul/MS Mohacs/M Mohamed/M Mohammad/M Mohammedan/SM Mohammedanism/MS Mohandas/M Mohandis/M Mohave/SM Mohawk/SM Mohegan Moho/M Mohorovicic/M Moina/M Moira Moise/MS Moiseyev/M Moishe/M Mojave/SM Moldavia/M Moldavian Moldova/M Moldovan Moliere/M Molina Moll/M Mollee/M Molli/M Mollie/M Molly/M Molnar/M Moloch/M Molokai/M Molotov/M Moluccas Mombasa/M Mommy/M Mon/SM Mona/M Monacan Monaco/M Monah/M Mondale/M Monday/SM Mondrian Monegasque/SM Monera/M Monet Mongol/SM Mongolia/M Mongolian/SM Mongolic/M Mongoloid Monica/M Monika/M Monique/M Monk/M Monmouth Monongahela Monro/M Monroe/M Monrovia/M Monsanto/M Monsignor/SM Mont Montague Montaigne Montana/M Montanan/SM Montcalm Monte/M Montenegrin Montenegro/M Monterrey Montesquieu Montessori Monteverdi Montevideo/M Montezuma/M Montgolfier Montgomery/M Monti/M Monticello Montoya/M Montpelier/M Montrachet Montreal/M Montserrat/M Monty/M Moody Moog Moon/M Mooney/M Moor/SM Moore Moorish/M Mora/M Morales/M Moran/M Moravia Moravian Mord/M Mordecai Mordred Mordy/M More Moreen/M Morena/M Moreno/M Morey/M Morgan/SM Morgana/M Morganica/M Morganne/M Morgen/M Morgun/M Moria/M Moriarty/M Morie/M Morin/M Morison/M Morissa/M Morita/M Moritz/M Morlee/M Morley Morly/M Mormon/SM Mormonism/SM Morna/M Moro Moroccan/SM Morocco/M Moroni Morpheus/M Morphy/M Morrie/M Morris Morrison Morrow/M Morry/M Morse/M Mort/MN Morten/M Mortie/M Mortimer Morton/M Morty/M Mosaic/M Moscow/M Mose/SM Moseley Moselle/M Moses/M Moshe/M Mosley/M Moss/M Mosul Motorola/M Motown/M Motrin/M Mott Mount Mountbatten Mountie/MS Moussorgsky Mouthe/M Mouton/M Mowgli/M Moyna/M Moyra/M Mozambican/SM Mozambique/M Mozart/M Mozelle/M Mozes/M Mozilla/M Mr/SM Ms/S Msgr Mt Muawiya/M Mubarak/M Mueller/M Muenster/MS Muffin/M Mufi/M Mufinella/M Mugabe/M Muhammad/M Muhammadan/SM Muhammadanism/SM Muir Muire/M Mujib/M Mulder/M Mullen/M Muller/M Mulligan/M Mullikan/M Mullins Mulroney/M Multan Multics/S Mumford Munch Munchhausen/M Munich/M Munmro/M Munoz/M Munro Munroe/M Munster Muppet/M Murasaki/M Murat Murchison/M Murcia Murdoch Murdock/M Mureil/M Murial/M Muriel/M Murielle/M Murillo Murine/M Murmansk Murphy Murray/M Murrow/M Murrumbidgee Murry/M Murvyn/M Muscat/M Muscovite/M Muscovy/M Muse/M Musharraf/M Musial/M Muskogee/M Muslim/MS Mussolini/M Mussorgsky Mutsuhito/M Muzak My/M Myanmar/M Myca/M Mycah/M Mycenae/M Mycenaean Mychal/M Myer/SM Mylar/MS Myles/M Mylo/M Myra/M Myrah/M Myranda/M Myrdal/M Myriam/M Myrilla/M Myrle/M Myrlene/M Myrna/M Myron Myrta/M Myrtia/M Myrtice/M Myrtie/M Myrtle/M Myrvyn/M Myrwyn/M Mysore Myst/M N'Djamena N/MD NAACP NAFTA NASA/M NASDAQ/M NATO/M NB NBA NBC NBS NC NCAA NCO ND NE/M NEH NF NFC NFL NH NHL NIH NIMBY NJ NLRB NM NORAD/M NOW NP NPR NR NRA NRC NS NSC NSF NT NV NW/M NWT NY NYC NYSE NZ Na/M Nabisco/M Nabokov Nada/M Nadean/M Nadeen/M Nader Nadia/M Nadine/M Nadiya/M Nady/M Nadya/M Nagasaki/M Nagoya Nagpur Nagy Nahuatl/MS Nahum Naipaul/M Nair/M Nairobi/M Naismith/M Nalani/M Nam/M Namath/M Namibia/M Namibian/MS Nan/M Nana/M Nanak Nananne/M Nance/M Nancee/M Nancey/M Nanchang Nanci/M Nancie/M Nancy Nanete/M Nanette/M Nani/M Nanice/M Nanine/M Nanjing/M Nannette/M Nanni/M Nannie/M Nanny/M Nanon/M Nanook/M Nansen Nantes/M Nantucket/M Naoma/M Naomi/M Nap/M Naphtali/M Napier/M Naples/M Napoleon/MS Napoleonic Nappie/M Nappy/M Napster/M Nara Narcissus/M Nari/M Nariko/M Narmada/M Narnia/M Narraganset Narragansett Nash Nashua Nashville/M Nassau/M Nasser/M Nat/M Nata/M Natal/M Natala/M Natale/M Natalee/M Natalia/M Natalie/M Natalina/M Nataline/M Natalya/M Nataniel/M Natasha/M Natassia/M Natchez Nate/MN Nathalia/M Nathalie/M Nathan/S Nathanael Nathanial/M Nathaniel/M Nathanil/M Nationwide/M Natividad/M Nativity/M Natka/M Natty/M Naugahyde Nauru/M Nautilus Navajo/SM Navajoes Navarre Navarro/M Navratilova/M Navy Nazarene Nazareth Nazca Nazi/SM Nazism/MS Nb/M Nd/M Ndjamena/M Ne/M NeWS NeWSes Neal/M Neala/M Neale/M Neall/M Nealon/M Nealson/M Nealy/M Neanderthal/MS Neapolitan Neb Nebr Nebraska/M Nebraskan/MS Nebuchadnezzar Ned/M Neda/M Nedda/M Neddie/M Neddy/M Nedi/M Neel/M Neely/M Nefen/M Nefertiti Negev/M Negress/MS Negritude Negro/MS Negroes Negroid/SM Nehemiah Nehru/M Neil/SM Neila/M Neile/M Neill/M Neilla/M Neille/M Nelda/M Nelia/M Nelie/M Nell/M Nelle/M Nelli/M Nellie/M Nelly/M Nels/N Nelsen/M Nelson Nembutal/M Nemesis/M Neogene Neolithic Nepal/M Nepalese/M Nepali/MS Neptune/M Nereid/M Nerf Nerissa/M Nerita/M Nero Neron/M Nert/M Nerta/M Nerte/M Nerti/M Nertie/M Nerty/M Neruda Nessa/M Nesselrode Nessi/M Nessie/M Nessy/M Nesta/M Nester/M Nestle/M Nestor/M Nestorius Netherlander/MS Netherlands Netscape/M Netta/M Netti/M Nettie/M Nettle/M Netty/M Netzahualcoyotl/M Nev Neva Nevada/M Nevadan/SM Nevadian Nevil/M Nevile/M Neville/M Nevin/MS Nevis/M Nevsa/M Nevsky/M Newark/M Newcastle/M Newfoundland/MRS Newman Newport/M Newsweek/M Newton/M Newtonian/M Nexis Neysa/M Ngaliema/M Nguyen/M Ni Niagara/M Nial/M Niall/M Niamey/M Nibelung Nicaea Nicaragua/M Nicaraguan/SM Niccolo/M Nice/M Nicene Nichiren/M Nichol/SM Nicholas Nichole/M Nicholle/M Nicholson Nick/M Nickelodeon/M Nickey/M Nicki/M Nickie/M Nicklaus Nicko/M Nickola/SM Nickolai/M Nickolaus/M Nicky/M Nico/M Nicobar/M Nicodemus Nicol/M Nicola/SM Nicolai/S Nicole/M Nicolea/M Nicolette/M Nicoli/SM Nicolina/M Nicoline/M Nicolle/M Nicosia/M Niebuhr/M Niel/SM Niels/N Nietzsche Nieves/M Nigel/M Niger/M Nigeria/M Nigerian/MS Nigerien/M Nightingale/M Nijinsky Nikaniki/M Nike/M Niki/M Nikita/M Nikkei Nikki/M Nikkie/M Niko/SM Nikola/SM Nikolai/M Nikolaos/M Nikolaus/M Nikoletta/M Nikolia/M Nikolos/M Nikon/M Nil/SM Nile/SM Nilson/M Nimitz Nimrod Nina/M Ninetta/M Ninette/M Nineveh/M Ninnetta/M Ninnette/M Ninon/M Nintendo Niobe Nippon/M Nipponese/M Nirenberg/M Nirvana Nisan/M Nisei Nissa/M Nissan/M Nisse/M Nissie/M Nissy/M Nita/M Niven/M Nixie Nixon/M Nkrumah No/M NoDoz/M Noach/M Noah/M Noak/M Noam/M Noami/M Nobe/M Nobel Nobelist/MS Nobie/M Noble/M Noby/M Noe/M Noel/SM Noelani/M Noell/M Noella/M Noelle/M Noellyn/M Noelyn/M Noemi/M Nola/M Nolan/M Nolana/M Noland/M Nolie/M Noll/M Nollie/M Nolly/M Nome Nomi/M Nona/M Nonah/M Noni/M Nonie/M Nonna/M Nonnah/M Nora/M Norah/M Norbert/M Norberto/M Norbie/M Norby/M Nordic/MS Norean/M Noreen/M Norene/M Norfolk/M Noriega/M Norina/M Norine/M Norma Norman/MS Normand/M Normandy/M Normie/M Normy/M Norplant Norri/MS Norrie/M Norry/M Norse/M Norseman/M Norsemen North/M Northampton Northeast/MS Northerner/M Northrop/M Northrup/M Norths Northwest/SM Norton/M Norw Norway/M Norwegian/SM Norwich Nosferatu/M Nostradamus Nottingham Nouakchott/M Noumea/M Nov/M Nova Novelia/M November/MS Novgorod Novocain/MS Novocaine Novokuznetsk Novosibirsk/M Nowell/M Noxzema/M Noyce/M Noyes/M Np/M Nubia Nubian Nukualofa Numbers/M Nunavut/M Nunez/M Nunki/M Nuremberg Nureyev NutraSweet/M NyQuil/M Nyasa/M Nydia/M Nye/M Nyerere/M Nyssa/M O'Brien O'Casey O'Connell O'Connor O'Donnell O'Hara O'Higgins O'Keeffe O'Neil O'Neill O'Rourke O'Toole O/SM OAS/M OB OCR OD/SM OE OED OH OHSA/M OJ OK/SM OMB/M ON OPEC/M OR OS/M OSHA/M OSes OT OTB OTC OTOH Oahu/M Oakland/M Oakley Oates Oaxaca/M Ob/MD Obadiah Obadias/M Obed/M Obediah/M Oberlin/M Oberon Obidiah/M Obie Oby/M Occam Occident Occidental/SM Oceania/M Oceanside Oceanus/M Ochoa/M Oct/M Octavia Octavian/M Octavio/M Octavius/M October/SM Ode/RM Odele/M Odelia/M Odelinda/M Odell/M Odella/M Odelle/M Oder/M Odessa/M Odets Odetta/M Odette/M Odey/M Odie/M Odilia/M Odille/M Odin/M Odis/M Odo/M Odom/M Ody/M Odysseus/M Odyssey/M Oedipal Oedipus/M Oersted/M Ofelia/M Ofella/M Offenbach OfficeMax/M Ofilia/M Ogbomosho Ogdan/M Ogden/M Ogdon/M Ogilvy/M Oglethorpe Ohio/M Ohioan/SM Oise/M Ojibwa/SM Okayama Okeechobee Okefenokee Okhotsk Okinawa/M Okinawan Okla Oklahoma/M Oklahoman Oktoberfest Ola/M Olaf/M Olag/M Olajuwon/M Olav/M Oldenburg Oldfield/M Oldsmobile/M Olduvai/M Ole/MV Olen/M Olenek/M Olenka/M Olenolin/M Olga/M Olia/M Oligocene/M Olimpia/M Olin/M Olive/MR Olivero/M Olivette/M Olivetti/M Olivia/M Olivie/MR Oliviero/M Oliy/M Ollie/M Olly/M Olmec Olmsted/M Olsen/M Olson/M Olva/M Olvan/M Olwen/M Olympe/M Olympia/SM Olympiad/MS Olympian/MS Olympic/S Olympie/M Olympus/M Omaha/MS Oman/M Omani/MS Omar/M Omayyad Omdurman/M Omero/M Omnipotent Omsk/M Onassis Ondrea/M Oneal/M Onega Onegin/M Oneida/MS Onfre/M Onfroi/M Onida/M Ono/M Onofredo/M Onondaga/MS Onsager/M Ont Ontarian Ontario/M Oona/M Oort/M Opal/M Opalina/M Opaline/M Opel/M Ophelia/M Ophelie/M Ophiuchus Oppenheimer/M Oprah/M Ora/M Oralee/M Oralia/M Oralie/M Oralla/M Oralle/M Oran/M Orange Oranjestad/M Orazio/M Orbadiah/M Orbison/M Ordovician/M Ore/N Oreg Oregon/M Oregonian/SM Orel Orelee/M Orelia/M Orelie/M Orella/M Orelle/M Oren/M Oreo Orestes Oriana/M Orient Oriental/MS Orin/M Orinoco/M Orion/M Oriya/M Orizaba/M Orkney/M Orlan/M Orland/M Orlando/M Orleans/M Orlon/MS Orly/M Orpheus/M Orphic Orr/MN Orran/M Orren/M Orrin/M Orsa/M Orsola/M Orson/M Ortega/M Ortensia/M Orthodox Ortiz/M Orton/M Orv/M Orval/M Orville/M Orwell Orwellian Osage/MS Osaka/M Osbert/M Osborn/M Osborne Osbourn/M Osbourne/M Oscar/MS Osceola Osgood/M Oshawa Oshkosh/M Osiris/M Oslo/M Osman/M Osmond/M Osmund/M Ossie/M Ostrogoth/M Ostwald Osvaldo/M Oswald Oswell/M Otes Otha/M Othelia/M Othella/M Othello/M Othilia/M Othilie/M Otho/M Otis/M Ottawa/SM Ottilie/M Otto Ottoman Ouagadougou Ouija/MS Ovid Owen/S Oxford/SM Oxnard Oxonian/M Oxus Oxycontin/M Oz Ozark/MS Ozarks/M Ozymandias/M Ozzie/M Ozzy/M P/MN PA/M PAC/M PARC/S PASCAL PBS/M PBX PC/SM PCB PCP/M PD PDQ PDT PE PET/M PFC PG PIN PJ's PLO PM/SMDG PMS/M PO POW/M PP PPS PR PRC/M PRO PS/M PST/M PT PTA PTO PVC/M PW PX Pa/M Paar/M Pablo/M Pablum/M Pabst/M Pace/M Pacheco/M Pacific/M Pacino/M Packard/M Packston/M Paco/M Pacorro/M Padang Paddie/M Paddy/M Paderewski Padget/M Padgett/M Padilla/M Padraic/M Padraig/M Padriac/M Paganini Page Paglia/M Pahlavi Paige/M Pail/M Paine Paiute/SM Pakistan/M Pakistani/SM Palembang Paleocene/M Paleogene Paleolithic Paleozoic/M Palermo/M Palestine/M Palestinian/SM Palestrina Paley Palikir/M Palisades/M Pall/M Palladio Palm/MR Palmerston Palmolive/M Palmyra/M Paloma/M Palomar/M Pam/M Pamela/M Pamelina/M Pamella/M Pamirs Pammi/M Pammie/M Pammy/M Pampers Pan/M Panama/SM Panamanian/MS Panasonic/M Panchito/M Pancho/M Pandora/M Pangaea/M Pankhurst Panmunjom/M Pansie/M Pansy/M Pantagruel Pantaloon/M Pantheon Panza/M Paola/M Paolina/M Paolo/M Papagena/M Papageno/M Paquito/M Paracelsus Paraclete Paradise Paraguay/M Paraguayan/MS Paramaribo/M Paramount/M Parana/M Parcheesi/M Pareto Paris/M Parisian/MS Park/SR Parke/M Parkinson/M Parkman Parliament Parmesan/MS Parnassus/MS Parnell Parr Parrish Parrnell/M Parry Parsifal/M Parsons Parthenon/M Parthia/M Pasadena/M Pascal/SM Pascale/M Pasquale/M Passion/SM Passover/MS Pasternak Pasteur/M Pat/N Patagonia/M Patagonian Pate/M Patel/M Paten/M Paterson Patience/M Patin/M Patna Paton Patric/M Patrica/M Patrice/M Patricia/M Patricio/M Patrick/M Patrizia/M Patrizio/M Patrizius/M Patsy/M Patten/M Patterson/M Patti Pattie/M Pattin/M Patton Patty/M Paul/GM Paula/M Paule/M Pauletta/M Paulette/M Pauli Paulie/M Paulina/M Pauline Paulita/M Paulo/M Pauly/M Pavarotti Pavel/M Pavia/M Pavla/M Pavlov/M Pavlova Pavlovian Pawnee/SM Paxon/M Paxton PayPal/M Payne/M Payton/M Pb/M Pd/M Peabody/M Peace/M Peadar/M Peale Pearce/M Pearl/M Pearla/M Pearle/M Pearlie/M Pearline/M Pearson/M Peary Pebrook/M Pechora Peck/M Peckinpah/M Pecos/M Peder/M Pedro/M Peel/M Peg/M Pegasus/MS Pegeen/M Peggi/M Peggie/M Peggy/M Pei Peiping/M Peirce/M Peking/SM Pekingese/SM Pele/M Pelee/M Peloponnese/M Pembroke/M Pena/M Penderecki/M Penelopa/M Penelope/M Penn Penna Penney/M Penni/M Pennie/M Pennington/M Pennsylvania/M Pennsylvanian/SM Penny/M Pennzoil/M Penrod/M Pensacola/M Pentagon/M Pentateuch/M Pentax/M Pentecost/SM Pentecostal/MS Pentecostalism Pentium/SM Peoria Pepe/M Pepi/M Pepillo/M Pepin/M Pepita/M Pepito/M Pepsi/M Pepys Pequot Perceval Percheron Percival Percy Perelman/M Perez/M Peri/M Peria/M Perice/M Periclean Pericles Perkin/MS Perl/SM Perla/M Perle/M Perm/M Permalloy/M Permian/M Pernell/M Pernod/M Peron Perot/M Perren/M Perri/MR Perrine/M Perry Perseid Persephone/M Persepolis/M Perseus/M Pershing Persia/M Persian/SM Persis Perth/M Peru/M Peruvian/MS Peshawar Pet Peta/M Petain/M Pete/RMZ Peter/M Petersen/M Peterson/M Peterus/M Petey/M Petr/M Petra Petrarch/M Petrina/M Petronella/M Petronia/M Petronilla/M Petronille/M Petty/M Petunia/M Peugeot/M Peyter/M Peyton/M Pfc Pfizer/M PhD/M Phaedra Phaethon/M Phaidra/M Phanerozoic Pharaoh/M Pharaohs Pharisaic Pharisaical Pharisee/MS Phebe Phedra/M Phekda/M Phelia/M Phelps/M Phidias Phil/Y Philadelphia/M Philbert/M Philby/M Philemon Philip/S Philipa/M Philippa/M Philippe/M Philippians Philippine/SM Philis/M Philistine Phillida/M Phillie/M Phillip/S Phillipa/M Phillipe/M Phillipp/M Phillis/M Philly/M Philomena/M Phineas/M Phip/M Phipps/M Phobos Phoebe/M Phoenicia/M Phoenician/SM Phoenix/M Photostat/MS Photostatted Photostatting Phrygia/M Phylis/M Phyllida/M Phyllis/M Phyllys/M Phylys/M Pia/M Piaf/M Piaget/M Pianola/M Picasso/M Piccadilly Pickering/M Pickett Pickford/M Pickwick/M Pict Piedmont/M Pier/M Pierce/M Pierette/M Pierre/M Pierrette/M Pierrot/M Pierson/M Pieter/M Pietra/M Pietrek/M Pietro/M Piggy/M Pike/M Pilate Pilcomayo Pilgrim/S Pillsbury/M Pinatubo/M Pincas/M Pinchas/M Pincus/M Pindar/M Pinkerton Pinocchio/M Pinochet/M Pinter Pinyin Piotr/M Pip/MR Piper/M Pippa/M Pippin/M Pippo/M Pippy/M Piraeus Pirandello Pisa Pisces/M Pisistratus Pissaro/M Pitcairn/M Pitt/S Pittman/M Pittsburgh/M Pius/M Pizarro Pkwy Pl Planck Plano Plantagenet/M Plasticine/M Plataea/M Plath Plato/M Platonic Platonism/M Platonist/M Platte/M Plautus/M PlayStation/M Playboy/M Playtex/M Pleiades's Pleistocene/M Plexiglas/MS Pliny Pliocene/SM Plutarch/M Pluto/M Plymouth/M Pm/M Po/M Pocahontas/M Pocono/SM Podgorica Podhoretz/M Podunk Poe Pogo/M Poincare/M Poiret/M Poirot/M Poisson/M Poitier/M Pokemon/M Pol/Y Poland/M Polanski/M Polaris/M Polaroid/MS Pole/SM Polish/M Politburo Polk/M Pollard/M Pollock Pollux/M Polly/M Pollyanna Polo/M Poltava/M Polyhymnia/M Polynesia/M Polynesian/MS Polyphemus Pomerania Pomeranian/M Pomona Pompadour Pompeian Pompeii/M Pompey/M Ponce Pontchartrain Pontiac/M Pontianak Pooh/M Poole/M Poona Pope Popeye/M Popocatepetl Popper/M Poppins/M Poppy/M Popsicle Porfirio/M Porrima/M Porsche/M Port/R Portia/M Portie/M Portland/M Porto/M Portsmouth Portugal/M Portuguese/M Porty/M Poseidon/M Post/M Potemkin Potomac/M Potsdam Pottawatomie/M Potter Potts/M Poul/M Pound Poussin Powell/M PowerPoint/M Powers Powhatan/M Poznan/M Pr/MN Prado/M Praetorian Prague/M Praia/M Prakrit Pratchett/M Pratt/M Pravda/M Praxiteles Preakness/M Precambrian/M Preminger/M Premyslid/M Pren/M Prensa/M Prent/M Prentice/M Prentiss/M Pres Presbyterian/MS Presbyterianism/SM Prescott/M Presley Preston Pretoria/M Priam/M Pribilof/M Price Priestley Prince/M Princeton/M Principal Principe/M Prinz Pris Prisca/M Priscella/M Priscilla/M Prissie/M Private Procrustean Procrustes/M Procter/M Procyon/M Prof Prohibition Prokofiev Promethean Prometheus/M Prophets Proserpina/M Proserpine/M Protagoras Proterozoic/M Protestant/MS Protestantism/MS Proteus/M Proudhon Proust/M Provencal/MS Provence/M Proverbs Providence/MS Provo Prozac/MS Pru/M Prudence/M Prudential/M Prudi/M Prudy/M Prue/M Pruitt/M Prussia/M Prussian/MS Prut Pryce/M Pryor/M Psalms Psalter/MS Psyche/M Pt/M Ptah/M Ptolemaic Ptolemy/SM Pu/M Puccini Puck Puckett/M Puebla Pueblo Puff/M Puget/M Pugh/M Pulaski Pulitzer Pullman/MS Punch Punic/M Punjab/M Punjabi/M Purana Purcell Purdue/M Purim/MS Purina/M Puritan Puritanism/SM Purus/M Pusan/M Pusey Pushkin Pushtu/M Putin/M Putnam Putnem/M Puzo/M Pvt Pygmalion/M Pygmy/SM Pyle/M Pym Pynchon/M Pyongyang/M Pyotr/M Pyrenees/M Pyrex/MS Pyrrhic Pythagoras/M Pythagorean Pythias Python/M Q QB QC QED QM QWERTY Qaddafi/M Qantas/M Qatar/M Qatari/MS Qingdao Qiqihar/M Qom/M Quaalude/M Quaker/MS Quakerism/SM Quasimodo Quaternary/M Quayle/M Que Quebec/M Quebecois Quechua/M Queen/S Queenie/M Queens/M Queensland/M Quent/M Quentin/M Querida/M Quetzalcoatl/M Quezon/M Quill/M Quillan/M Quincey/M Quincy/M Quinlan/M Quinn Quint/M Quinta/M Quintana/M Quintilian/M Quintilla/M Quintin/M Quintina/M Quinton/M Quintus/M Quirinal Quisling/M Quito/M Quixote Quixotism/M Qumran Quonset R/MG RAF/M RAM/SM RBI RC RCA/M RCMP RD RDA REIT REM/SM RF RFC/S RFD RI RIF RIP RN/M RNA/M ROFL ROM/M ROTC/M RP RR RSFSR RSI RSV RSVP RTFM/GSD RV/SM Ra/M Rab/M Rabat/M Rabbi/M Rabelais/M Rabelaisian Rabi Rabin/M Rachael/M Rachel/M Rachele/M Rachelle/M Rachmaninoff Racine/M Rad/M Radcliffe/M Raddie/M Raddy/M Rae/M Raeann/M Raf/M Rafa/M Rafael/M Rafaela/M Rafaelia/M Rafaelita/M Rafaellle/M Rafaello/M Rafe/M Raff/M Raffaello/M Raffarty/M Rafferty/M Raffles/M Rafi/M Ragnar/M Ragnarok/M Rahal/M Rahel/M Raimondo/M Raimund/M Raimundo/M Raina/M Raine/MR Rainer/M Rainier Rakel/M Raleigh/M Ralf/M Ralina/M Ralph/M Ram Rama/M Ramada/M Ramadan/MS Ramakrishna Ramanujan/M Ramayana Rambo/M Ramirez/M Ramiro/M Ramon/M Ramona/M Ramonda/M Ramos Ramsay Ramses Ramsey/M Rana/M Rance/M Rancell/M Rand Randa/M Randal/M Randall/M Randee/M Randell/M Randene/M Randi/M Randie/M Randolf/M Randolph/M Randy/M Ranee/M Rangoon/M Rani/M Rania/M Ranice/M Ranique/M Rankin Rankine/M Ranna/M Ransell/M Ransom/M Raoul/M Raphael Raphaela/M Rapunzel/M Raquel/M Raquela/M Rasalgethi/M Rasalhague/M Rasia/M Rasla/M Rasmussen/M Rasputin Rastaban/M Rastafarian/M Rather/M Ratliff/M Raul/M Ravel Raven/M Ravi/M Ravid/M Raviv/M Rawalpindi Rawley/M Ray RayBan/M Rayburn/M Raychel/M Raye/M Rayleigh Raymond/M Raymund/M Raymundo/M Rayna/M Raynard/M Raynell/M Rayner/M Raynor/M Rayshell/M Rb/M Rd Re/M Rea/M Read/GM Reade Reading/M Reagan/M Reaganomics/M Reagen/M Realtor Reamonn/M Reasoner/M Reba/M Rebbecca/M Rebe/M Rebeca/M Rebecka/M Rebeka/M Rebekah Rebekkah/M Recife/M Reconstruction/M Redd/M Redeemer/M Redford/M Redgrave/M Redmond Ree/DSM Reeba/M Reebok/M Reece/M Reed/M Reena/M Reese/M Reeta/M Reeva/M Reeves Reformation/MS Refugio/M Reg/N Regan/M Regen/M Reggi/MS Reggie/M Reggy/M Regina/M Reginae Reginald/M Reginauld/M Regine/M Regor/M Regulus/M Rehnquist Reich/M Reid/R Reidar/M Reider/M Reiko/M Reilly/M Reina/M Reinald/M Reinaldo/SM Reine/M Reinhard/M Reinhardt Reinhold/M Reinold/M Reinwald/M Rem/M Remarque Rembrandt/M Remington Remus/M Remy/M Rena/M Renado/M Renae/M Renaissance/SM Renaldo/M Renard/M Renascence Renata/M Renate/M Renato/M Renaud/M Renault/M Rene/M Renee/M Renell/M Renelle/M Renie/M Rennie/M Reno/M Renoir Rep Representative Republican/SM Republicanism Requiem/MS Resistance Restoration/M Resurrection Reta/M Retha/M Reube/M Reuben Reunion Reuters Reuther/M Reuven/M Rev Reva/M Revelation/SM Revere Reverend/M Revkah/M Revlon/M Rex Rey/M Reyes Reykjavik/M Reyna/M Reynaldo/M Reynard/M Reynold/MS Rf/M Rh/M Rhea Rheba/M Rhee Rheingau/M Rhenish Rheta/M Rhett/M Rhetta/M Rhiamon/M Rhianna/M Rhiannon/M Rhianon/M Rhine/M Rhineland/M Rhoda/M Rhodes Rhodesia/M Rhodesian Rhodia/M Rhodie/M Rhody/M Rhona/M Rhonda/M Rhone/M Rhys/M Riane/M Riannon/M Rianon/M Ribbentrop Ric/M Rica/M Ricard/M Ricardo Ricca/M Riccardo/M Rice Rich/M Richard/S Richardo/M Richardson Richart/M Richelieu/M Richie/M Richmond/M Richmound/M Richter Richthofen Richy/M Rici/M Rick/M Rickard/M Rickenbacker/M Rickert/M Rickey/M Ricki/M Rickie/M Rickover Ricky/M Rico/M Ricoriki/M Riddle/M Ride Riefenstahl/M Riel/M Riemann/M Riesling/MS Riga/M Rigel/M Riggs/M Right Rigoberto/M Rigoletto/M Rik/M Riki/M Rikki/M Riley Rilke Rimbaud Rina/M Rinaldo/M Ring/M Ringling/M Ringo/M Rio/SM Riobard/M Riordan/M Rip/M Ripley Risa/M Risorgimento Rita/M Ritalin/M Ritchie/M Ritz/M Riva/SM Rivalee/M Rivera Rivers Riverside Rivi/M Riviera/MS Rivkah/M Rivy/M Riyadh/M Rizal Rn/M Roach/M Roana/M Roanna/M Roanne/M Roanoke/M Roarke/M Rob/MZ Robb/M Robbert/M Robbi/M Robbie/M Robbin/MS Robby/M Robbyn/M Robena/M Robenia/M Robers/M Roberson/M Robert/MS Roberta/M Roberto/M Robertson/M Robeson Robespierre Robin/M Robina/M Robinet/M Robinett/M Robinetta/M Robinette/M Robinia/M Robinson Robitussin/M Robles/M Robson Robt/M Roby/M Robyn/M Rocco/M Roch/M Rocha/M Rochambeau/M Roche/M Rochell/M Rochella/M Rochelle/M Rochester/M Rochette/M Rock Rockefeller Rockey/M Rockford Rockie/M Rockies/M Rockne/M Rockwell Rocky/SM Rod/M Roda/M Rodd/M Roddenberry/M Roddie/M Roddy/M Roderic/M Roderich/M Roderick/M Roderigo/M Rodge/MZR Rodger/M Rodi/M Rodie/M Rodin Rodina/M Rodney Rodolfo/M Rodolph/M Rodolphe/M Rodrick/M Rodrigo/M Rodriguez/M Rodrique/M Rodriquez/M Roeg/M Rog/MRZ Rogelio/M Rogerio/M Roget/M Roi/SM Rojas/M Rolaids/M Roland Rolando/M Roldan/M Rolex/M Roley/M Rolf Rolfe/M Rolland Rollerblade Rollie/M Rollin/MS Rollo Rolodex Rolph/M Rolvaag/M Rom Roma/M Romain/M Roman/MS Romanesque/MS Romania/M Romanian/MS Romano Romanov/M Romansh Romanticism Romany/SM Rome/SM Romeo Romero/M Rommel/M Romney Romola/M Romona/M Romonda/M Romulus/M Romy/M Ron/M Rona/M Ronald/M Ronalda/M Ronda/M Ronica/M Ronna/M Ronni/M Ronnica/M Ronnie/M Ronny/M Ronstadt/M Rontgen Roobbie/M Rooney/M Roosevelt/M Root/M Roquefort/SM Rora/M Rori/M Rorie/M Rorke/M Rorschach Rory/M Ros Rosa/M Rosabel/M Rosabella/M Rosabelle/M Rosaleen/M Rosales/M Rosalia/M Rosalie/M Rosalind/M Rosalinda/M Rosalinde/M Rosaline/M Rosalyn/M Rosalynd/M Rosamond/M Rosamund/M Rosana/M Rosanna/M Rosanne/M Rosario Rosco/M Roscoe/M Rose/M Roseann/M Roseanna/M Roseanne/M Roseau/M Rosecrans/M Roselia/M Roselin/M Roseline/M Rosella/M Roselle/M Rosemaria/M Rosemarie/M Rosemary/M Rosemonde/M Rosenberg/M Rosendo/M Rosene/M Rosenzweig/M Rosetta Rosette/M Roshelle/M Rosicrucian Rosie/M Rosina/M Rosita/M Roslyn/M Rosmunda/M Ross/M Rossetti/M Rossie/M Rossini/M Rossy/M Rostand Rostov/M Rostropovich/M Roswell/M Rosy/M Rotarian/M Roth/M Rothko Rothschild Rotterdam/M Rottweiler/M Rouault Rourke/M Rousseau/M Rouvin/M Rover Row/MN Rowan/M Rowe Rowen/M Rowena/M Rowland/M Rowling/M Rowney/M Roxana/M Roxane/M Roxanna/M Roxanne/M Roxi/M Roxie/M Roxine/M Roxy/M Roy/M Royal Royall/M Royce Roz/M Rozalie/M Rozalin/M Rozamond/M Rozanna/M Rozanne/M Roze/M Rozele/M Rozella/M Rozelle/M Rozina/M Rriocard/M Rte Ru/MH Rubaiyat/M Rubbermaid/M Rube/M Ruben/SM Rubetta/M Rubi/M Rubia/M Rubicon/MS Rubie/M Rubik/M Rubin/M Rubina/M Rubinstein Ruby/M Ruchbah/M Rudd/M Ruddie/M Ruddy/M Rudie/M Rudiger/M Rudolf Rudolfo/M Rudolph/M Rudy/M Rudyard/M Rufe/M Rufus/M Ruggiero/M Ruhr/M Ruiz/M Rukeyser/M Rumpelstiltskin/M Runnymede Runyon Rupert/M Ruperta/M Ruperto/M Ruprecht/M Rurik Rush/M Rushdie/M Rushmore/M Ruskin Russ Russel/M Russell/M Russia/M Russian/SM Russo/M Rustbelt/M Rustie/M Rustin/M Rusty/M Rutger/MS Ruth/M Ruthann/M Ruthanne/M Ruthe/M Rutherford Ruthi/M Ruthie/M Ruthy/M Rutledge/M Rutter/M Ruttger/M Ruy/M Rwanda/MS Rwandan/SM Rwy Rx Ry Ryan/M Ryann/M Rycca/M Rydberg/M Ryder Ryley/M Ryon/M Ryukyu/M Ryun/M S/MNY SA SAC SALT/M SAM/M SASE SAT SBA SC/M SCSI/M SD SDI SE/M SEATO SEC SF SGML/M SIDS/M SJ SK SLR SO/S SOB/M SOP/M SOS/M SOSes SPCA SPF SRO SS SSA SSE/M SSS SST SSW/M ST STD STOL SUSE SUV SW/M SWAK SWAT Saab/M Saar Saarinen Saba/M Sabbath/M Sabbaths Sabik/M Sabin Sabina/M Sabine/M Sabra Sabre/M Sabrina/M Sacajawea Sacco/M Sacha/M Sachs/M Sacramento/M Sada/M Sadat Saddam/M Sadducee Sade/M Sadella/M Sadie/M Sadr/M Sadye/M Safavid Safeway/M Sagan/M Saginaw/M Sagittarius/MS Sahara/M Saharan/M Sahel Saidee/M Saigon/M Saiph/M Sakai Sakha/M Sakhalin/M Sakharov Saki/M Saks Sal/Y Saladin Salado Salaidh/M Salamis Salas/M Salazar/M Saleem/M Salem/M Salerno/M Salim/M Salinas Salinger Salisbury/M Salish/M Salk Sallee/M Salli/M Sallie/M Sallust Sally/M Sallyann/M Sallyanne/M Salmon/M Saloma/M Salome/M Salomi/M Salomo/M Salomon/M Salomone/M Salonika/M Salton/M Salvador/M Salvadoran/SM Salvadorean/MS Salvadorian/MS Salvatore/M Salvidor/M Salween/M Salyut/M Sam Samantha/M Samar/M Samara Samaria Samaritan/MS Samarkand/M Sammie/M Sammy/M Samoa/M Samoan/SM Samoset/M Samoyed/M Sampson/M Samson Samsonite/M Samuel Samuele/M Samuelson/M San San'a Sana/M Sanchez/M Sancho/M Sand Sandburg Sande/MZR Sander/M Sanderson/M Sandi/M Sandie/M Sandinista Sandor/M Sandoval/M Sandra/M Sandro/M Sandy/M Sandye/M Sanford/M Sanforized Sang/MR Sanhedrin Sanka/M Sankara/M Sanskrit/M Sanson/M Sansone/M Santa Santana/M Santayana Santeria Santiago/M Santos Sapphira Sapphire/M Sappho/M Sapporo/M Sara/M Saraann/M Saracen/MS Saragossa/M Sarah Sarajane/M Sarajevo/M Saran/M Sarasota/M Saratov/M Sarawak/M Sardinia/M Saree/M Sarena/M Sarene/M Sarette/M Sargasso/M Sarge/M Sargent Sargon/M Sari/M Sarina/M Sarine/M Sarita/M Sarnoff/M Saroyan/M Sarto Sartre Sascha/M Sasha/M Sashenka/M Sask Saskatchewan/M Saskatoon/M Sasquatch/MS Sassanian Sassoon Sat/M Satan/M Satanism/M Satanist/M Saturday/MS Saturn/M Saturnalia/M Saudi/MS Saudra/M Saul/M Sauncho/M Saunder/MS Saunderson/M Saundra/M Saussure Sauternes Sauveur/M Savage Savannah/M Savina/M Savior/M Savonarola Savoy Savoyard/M Saw/M Sawyer/M Sawyere/M Sax Saxe/M Saxon/MS Saxony/M Say/MRZ Sayer/M Sayre/MS Sb/M Sc/M Scan Scandinavia/M Scandinavian/SM Scaramouch Scarborough Scarface/M Scarlatti Scarlet/M Scarlett/M Scheat/M Schedar/M Scheherazade/M Schelling Schenectady/M Schick/M Schiller Schindler/M Schlesinger/M Schliemann Schlitz/M Schmidt Schnabel Schnauzer/M Schneider/M Schoenberg/M Schopenhauer Schrieffer/M Schrodinger/M Schroeder/M Schubert Schultz/M Schulz/M Schumann Schuyler/M Schuylkill/M Schwartz/M Schwarzenegger/M Schwarzkopf/M Schweitzer Schweppes/M Schwinger/M Schwinn/M Scientology/M Scipio/M Scopes/M Scorpio/SM Scorpius/M Scorsese/M Scot/SM Scotch/MS Scotchman/M Scotchmen Scotchwoman/M Scotchwomen Scotland/M Scotsman/M Scotsmen Scotswoman/M Scotswomen Scott Scotti/M Scottie/SM Scottish/M Scottsdale Scrabble/MS Scranton Scriabin Scribner/M Scripture/SM Scrooge Scruggs/M Scud Sculley/M Scylla/M Scythia Scythian Se/MH Seaborg Seagram/M Seamus/M Sean/M Seana/M Sears/M Seattle/M Sebastian/M Sebastiano/M Sebastien/M Sec Seconal/M Secretariat/M Secretary Seder/MS See/M Seebeck/M Sega/M Segovia/M Segre/M Segundo/M Seiko/M Seine/M Seinfeld/M Sejong/M Seka/M Sela/M Selassie/M Selby/M Selectric/M Selena/M Selene/M Selestina/M Seleucid Seleucus/M Selia/M Selie/M Selig/M Selim/M Selina/M Selinda/M Seline/M Seljuk Selkirk/M Sella/M Selle/MZ Sellers/M Selma/M Selznick/M Semarang Seminole/MS Semiramis Semite/MS Semitic/SM Semtex Sena/M Senate/MS Sendai Seneca/MS Senegal/M Senegalese/M Senghor Senior Sennacherib Sennett/M Sensurround/M Seoul/M Sephardi Sephira/M Sepoy/M Sept/M September/MS Septuagint/SM Sequoya Serb/SM Serbia/M Serbian/MS Serena/M Serene Serengeti/M Serge/M Sergeant/M Sergei/M Sergent/M Sergio/M Serpens Serra/M Serrano/M Set/M Seth/M Seton Seumas/M Seurat Seuss Sevastopol/M Severn Severus Seville/M Sevres Seward Sextans Sexton/M Seychelles/M Seyfert Seymour/M Sgt Shackleton Shadow/M Shae/M Shaffer/M Shaina/M Shaine/M Shaka/M Shaker Shakespeare/M Shakespearean Shalna/M Shalne/M Shalom/M Shamus/M Shana/M Shanan/M Shanda/M Shandee/M Shandeigh/M Shandie/M Shandra/M Shandy/M Shane/M Shanghai/M Shani/M Shanie/M Shanna/M Shannah/M Shannan/M Shannen/M Shannon Shanon/M Shanta/M Shantee/M Shantung Shapiro/M Shara/M Sharai/M Shari Shari'a Sharia/M Sharity/M Sharl/M Sharla/M Sharleen/M Sharlene/M Sharline/M Sharon Sharona/M Sharp/M Sharpe/M Sharron/M Sharyl/M Shasta/M Shaughn/M Shaula/M Shaun/M Shauna/M Shavian/M Shavuot/M Shaw/M Shawn/M Shawna/M Shawnee/SM Shay/M Shayla/M Shaylah/M Shaylyn/M Shaylynn/M Shayna/M Shayne/M Shcharansky/M Shea/M Sheba Shebeli/M Sheela/M Sheelagh/M Sheelah/M Sheena/M Sheeree/M Sheetrock/M Sheff/M Sheffie/M Sheffield/M Sheffy/M Sheila/M Sheilah/M Shel/MY Shela/M Shelagh/M Shelba/M Shelbi/M Shelby/M Shelden/M Sheldon/M Shelia/M Shell/M Shelley Shelli/M Shellie/M Shelly/M Shelton/M Shem/M Shena/M Shenandoah Shenyang/M Sheol Shep/M Shepard/M Shepherd/M Sheppard/M Shepperd/M Sher/M Sheratan/M Sheraton/M Sheree/M Sheri/M Sheridan Sherie/M Sherill/M Sherilyn/M Sherline/M Sherlock Sherlocke/M Sherm/M Sherman Shermie/M Shermy/M Sherpa Sherri/M Sherrie/M Sherry/M Sherwin/M Sherwood Sherwynd/M Sherye/M Sheryl/M Shetland/SM Shevardnadze/M Shevat/M Shi'ite Shields/M Shiite/MS Shijiazhuang Shikoku/M Shillong Shiloh/M Shina/M Shinto/MS Shintoism/MS Shintoist/MS Shir/M Shiraz/M Shirl/M Shirlee/M Shirleen/M Shirlene/M Shirley/M Shirline/M Shiva/M Shockley/M Sholom/M Short/M Shorthorn Shoshana/M Shoshanna/M Shoshone/SM Shostakovitch/M Shreveport Shriner Shropshire Shula/M Shurlock/M Shurlocke/M Shurwood/M Shylock Shylockian/M Si Siam/M Siamese/M Siana/M Sianna/M Sib/M Sibbie/M Sibby/M Sibeal/M Sibel/M Sibelius Sibella/M Sibelle/M Siberia/M Siberian/MS Sibilla/M Sibley/M Sibyl Sibylla/M Sibylle/M Sicilian/SM Sicily/M Sid/M Siddhartha/M Sidnee/M Sidney Sidoney/M Sidonia/M Sidonnie/M Siegfried Siemens Sierpinski/M Sierras Siffre/M Sig Sigfrid/M Sigfried/M Sigismond/M Sigismondo/M Sigismund Sigismundo/M Sigmund Sigrid/M Sigurd Sigvard/M Sihanouk/M Sikh/M Sikhism Sikhs Sikkim Sikkimese Sikorsky Silas/M Sile/M Sileas/M Silesia/M Silurian/SM Silva/M Silvain/M Silvan/M Silvana/M Silvano/M Silvanus/M Silvester/M Silvia/M Silvie/M Silvio/M Sim/SM Simenon/M Simeon/M Simmental Simmonds/M Simmons/M Simon Simona/M Simone/M Simonette/M Simonne/M Simpson/M Sinai/M Sinatra Sinclair Sinclare/M Sindbad/M Sindee/M Sindhi/M Singapore/M Singaporean/SM Singer Singleton/M Sinhalese/M Sinkiang/M Siobhan/M Sioux/M Siouxie/M Sir/SM Sirius/M Sisely/M Sisile/M Sissie/M Sissy/M Sistine Sisyphean Sisyphus/M Siusan/M Siva/M Sivan/M Siward/M Sjaelland/M Skell/M Skelly/M Skinner/M Skip/M Skipp/MR Skipper/M Skippie/M Skippy/M Skipton/M Skopje Sky/M Skye Skylab/M Skylar/M Skyler/M Slackware/M Slade/M Slashdot/M Slater/M Slav/SM Slavic/M Slavonic/M Slinky/M Sloan Sloane/M Slocum/M Slovak/SM Slovakia Slovakian Slovene/SM Slovenia/M Slovenian/MS Slurpee/M Sly/M Sm/M Small/M Smetana Smirnoff/M Smith Smithson Smithsonian/M Smitty/M Smokey/M Smolensk Smollett Smuts Smyrna Sn/M Snake/M Snapple/M Snead/M Snell/M Snickers/M Snider/M Snoopy/M Snow Snowbelt Snyder/M Soave/M Soc Socorro/M Socrates/M Socratic Soddy Sodom/M Sofia/M Sofie/M Soho Sol/MY Solis/M Sollie/M Solly/M Solomon Solon Solzhenitsyn Somali/SM Somalia/M Somalian/MS Somerset Somme/M Somoza/M Son/M Sondheim Sondra/M Songhai/M Songhua/M Sonia/M Sonja/M Sonni/M Sonnie/M Sonnnie/M Sonny/M Sonora/M Sontag/M Sony/M Sonya/M Sophey/M Sophi/M Sophia Sophie/M Sophoclean Sophocles Sophronia/M Sopwith/M Sorbonne/M Sorcha/M Sosa/M Sosanna/M Soto/M Souphanouvong/M Sousa/M South/M Southampton Southeast/MS Southerner/SM Southey Souths Southwest/MS Soviet Soweto/M Soyinka/M Soyuz Sp Spaatz/M Spackle Spahn/M Spain/M Spam/M Span Spanglish Spaniard/SM Spanish/M Sparks Sparta/M Spartacus Spartan/MS Spears Spence/R Spencerian Spengler/M Spenglerian Spense/RM Spenser/M Spenserian Sperry/M Sphinx/M Spica/M Spielberg/M Spike/M Spillane/M Spinoza Spinx/M Spiro/M Spirograph/M Spitsbergen/M Spitz/M Spock Spokane Springfield/M Springsteen/M Sprint/M Sprite/M Sputnik Sq Squanto Squibb/M Sr/M Srinagar Srivijaya/M St Sta Stace/M Stacee/M Stacey/M Staci/M Stacia/M Stacie/M Stacy/M Stael/M Stafani/M Staffard/M Stafford Staford/M StairMaster Stalin/M Stalingrad/M Stalinist Stallone/M Stamford Stan/MY Standford/M Standish Stanfield/M Stanford/M Stanislas/M Stanislaus/M Stanislavsky Stanislaw/M Stanleigh/M Stanley Stanly/M Stanton Stanwood/M Staples/M Star/M Starbucks Stark Starkey/M Starla/M Starlene/M Starlin/M Starr/M Staten/M States Stavro/MS Ste Steadicam Stearn/M Stearne/M Steele Stefa/M Stefan/M Stefania/M Stefanie/M Stefano/M Steffane/M Steffen/M Steffi/M Steffie/M Stein/R Steinbeck Steinem/M Steinmetz/M Steinway/M Stella Stendhal Stengel/M Stepha/M Stephan/M Stephana/M Stephani/M Stephanie/M Stephannie/M Stephanus/M Stephen/S Stephenie/M Stephenson Stephi/M Stephie/M Stephine/M Sterling/M Stern Sterne/M Sterno Stesha/M Stetson/M Steuben/M Stevana/M Steve/M Steven/MS Stevena/M Stevenson Stevie/M Stevy/M Steward/M Stewart/M Stieglitz/M Stillman/M Stillmann/M Stilton/SM Stimson/M Stine/M Stinky/M Stirling Stockhausen/M Stockholm/M Stockton Stoddard/M Stoic/SM Stoicism/MS Stokes/M Stolichnaya/M Stolypin/M Stone Stonehenge Stoppard/M Storm/M Stormi/M Stormie/M Stormy/M Stout Stowe Strabo/M Stradivari Stradivarius Strasbourg Strauss Stravinsky/M Streisand/M Strickland/M Strindberg Stromboli Strong/M Stu/M Stuart/MS Studebaker/M Stuttgart/M Stuyvesant Stygian Styrofoam/SM Styron/M Styx/M Suarez/M Subaru/M Sucre Sucrets/M Sudan/M Sudanese/M Sudetenland/M Sudra/M Sue Suellen/M Suetonius Suez Suffolk Sufi Sufism Suharto/M Sui/M Sukarno Sukey/M Suki/M Sukkot Sula/M Sulawesi/M Suleiman/M Sulla/M Sullivan/M Sully Sumatra/M Sumatran/SM Sumeria/M Sumerian/SM Summer/MS Sumner/M Sumter Sun/SM Sunbeam/M Sunbelt/M Sundanese/M Sundas Sunday/MS Sung Sunkist/M Sunni/SM Sunnite/MS Sunny/M Sunnyvale Sunshine/M Superbowl/M Superfund/M Superglue/M Superior Superman/M Supt Surabaya Surat Suriname/M Surinamese Surya/M Susan/M Susana/M Susanetta/M Susann/M Susanna Susannah/M Susanne/M Susette/M Susi/M Susie/M Susquehanna/M Sussex Susy/M Sutherlan/M Sutherland/M Sutton/M Suva/M Suwanee/M Suzann/M Suzanna/M Suzanne/M Suzette/M Suzhou/M Suzi/M Suzie/M Suzuki/M Suzy/M Svalbard/M Sven/M Svend/M Svengali Sverdlovsk Swahili/SM Swammerdam/M Swanee Swansea/M Swanson/M Swazi/SM Swaziland/M Swed/N Swede/SM Sweden/M Swedenborg/M Swedish/M Sweeney/M Sweet Swen/M Swift/M Swinburne/M Swiss/MS Swissair/M Switz Switzerland/M Sybil/M Sybila/M Sybilla/M Sybille/M Sybyl/M Syd/M Sydel/M Sydelle/M Sydney/M Sykes/M Sylas/M Sylvan/M Sylvester/M Sylvia/M Sylvie/M Syman/M Symon/M Synge Syracuse/M Syria/M Syriac Syrian/MS Szilard/M Szymborska/M T'ang T/MDG TA TB/M TBA TD TDD TEFL TELNET/S TELNETTed TELNETTing TESL TESOL TEirtza/M TGIF THC TKO/M TLC/M TM TN TNT/M TOEFL TQM TV/SM TVA TWA/M TWX TX Ta/M Tab/MR Tabasco/SM Tabatha/M Tabb/M Tabbatha/M Tabbi/M Tabbie/M Tabbitha/M Tabby/M Taber/M Tabernacle/MS Tabina/M Tabitha/M Tabor Tabriz/MS Tacitus Tacoma/M Tad/M Tadd/M Taddeo/M Taddeusz/M Tadeas/M Tadeo/M Tades Tadio/M Tadzhik/M Taegu/M Taejon Taffy/M Taft/M Tagalog/SM Tagore Tagus/M Tahiti/M Tahitian/MS Tahoe Taichung/M Tailor/M Tainan Taine/M Taipei/M Taiping Tait/M Taite/M Taiwan/M Taiwanese/M Taiyuan Tajikistan/M Taklamakan/M Talbert/M Talbot Talia/M Taliban/M Taliesin Tallahassee/M Tallchief/M Talley/M Talleyrand/M Tallia/M Tallie/M Tallinn/M Tallou/M Tallulah/M Tally/M Talmud/MS Talmudic Talmudist Talya/M Talyah/M Tam/M Tamar/M Tamara/M Tamarah/M Tamarra/M Tamas Tameka/M Tamera/M Tamerlane/M Tami/M Tamika/M Tamiko/M Tamil/MS Tamma/M Tammany/M Tammara/M Tammi/M Tammie/M Tammuz/M Tammy/M Tampa/M Tampax/M Tamqrah/M Tamra/M Tamworth Tan Tana Tancred Tandi/M Tandie/M Tandy/M Taney Tanganyika/M Tangier/M Tangshan Tanhya/M Tani/M Tania/M Tanisha/M Tanitansy/M Tann/MR Tanner/M Tanney/M Tannhauser/M Tannie/M Tanny/M Tansy/M Tantalus/M Tanya/M Tanzania/M Tanzanian/SM Tao/M Taoism/MS Taoist/MS Tara/M Tarah/M Tarawa/M Tarazed/M Tarbell/M Target/M Tarim Tarkenton/M Tarkington Tarra/M Tarrah/M Tarrance/M Tartary Tartuffe Taryn/M Tarzan/M Tasha/M Tashkent/M Tasia/M Tasman Tasmania/M Tasmanian Tass Tatar/MS Tate Tatiana/M Tatiania/M Tatum Taurus/MS Tawney Tawnya/M Tawsha/M Taylor/M Tb/M Tbilisi/M Tc/M Tchaikovsky Te/M TeX TeXes Teador/M Teasdale/M Technicolor Tecumseh/M Ted/M Tedd/M Tedda/M Teddi/M Teddie/M Teddy/M Tedi/M Tedie/M Tedman/M Tedmund/M Tedra/M Teena/M Teflon/MS Tegucigalpa/M Tehran TelePrompTer TelePrompter Telemachus Telemann Teletype Tell/MR Telugu/M Temp/M Tempe Templar/M Temple/M Templeton/M Tenn Tennessean/SM Tennessee/M Tennyson Tenochtitlan/M Teodoor/M Teodor/M Teodora/M Teodorico/M Teodoro/M Teotihuacan/M Tera/M Terence Terencio/M Teresa/M Terese/M Tereshkova Teresina Teresita/M Teressa/M Teri/M Teriann/M Terkel/M Terpsichore/M Terr/M Terra/M Terran/M Terrance/M Terrel/M Terrell/M Terrence/M Terri/M Terrie/M Terrijo/M Terrill/M Terry Terrye/M Tersina/M Tertiary/M Terza/M Tesla Tess Tessa/M Tessi/M Tessie/M Tessy/M Tet/M Tethys/M Tetons Teuton/MS Teutonic Tevet/M Tex Texaco/M Texan/MS Texas/M Th/M Thacher/M Thackeray Thad/M Thaddeus Thaddus/M Thadeus/M Thai/SM Thailand/M Thain/M Thaine/M Thales Thalia/M Thames/M Thane/M Thanh/M Thanksgiving/SM Thant Thar/M Tharp/M Thatch/MR Thaxter/M Thayne/M Thea/M Theadora/M Thebault/M Thebes/M Theda/M Thedric/M Thedrick/M Theiler/M Thekla/M Thelma/M Themistocles Theo/M Theobald/M Theocritus Theodor/M Theodora Theodore/M Theodoric/M Theodosia/M Theodosius/M Theosophy Theravada Theresa Therese/M Theresina/M Theresita/M Theressa/M Therine/M Thermopylae/M Thermos Theron/M Theseus/M Thespian Thespis/M Thessalonian/S Thessaloniki/M Thessaly/M Thia/M Thibaud/M Thibaut/M Thieu/M Thimbu Thimphu Thom/M Thoma/SM Thomas/M Thomasa/M Thomasin/M Thomasina/M Thomasine/M Thomism/M Thomistic Thompson Thomson Thor/M Thorazine/M Thoreau/M Thorin/M Thorn Thorndike Thornie/M Thornton/M Thorny/M Thoroughbred Thorpe Thorstein/M Thorsten/M Thorvald/M Thoth/M Thrace/M Thracian/M Thu Thucydides/M Thule/M Thunderbird/M Thur/S Thurber Thurman/M Thurmond/M Thursday/SM Thurstan/M Thurston/M Thutmose/M Ti/M Tia/M Tianjin/M Tiber/M Tiberius Tibet/M Tibetan/MS Tibold/M Ticketmaster/M Ticonderoga Tide/M Tiebold/M Tiebout/M Tiena/M Tienanmen/M Tierney/M Tiertza/M Tiff/M Tiffani/M Tiffanie/M Tiffany Tiffi/M Tiffie/M Tiffy/M Tigris/M Tijuana/M Tilda/M Tildi/M Tildie/M Tildy/M Tiler/M Tillich Tillie/M Tillman/M Tilly/M Tilsit Tim/M Timbuktu/M Timex/M Timi/M Timmi/M Timmie/M Timmy/M Timofei/M Timon/M Timoteo/M Timothea/M Timothee/M Timotheus/M Timothy Timur/M Timurid/M Tina/M Tine/M Ting/M Tinkerbell/M Tinkertoy Tinseltown/M Tintoretto Tiphani/M Tiphanie/M Tiphany/M Tippecanoe/M Tipperary Tirane Tiresias/M Tirol/M Tirolean Tirrell/M Tish/M Tisha/M Tishri/M Titan/SM Titania Titanic Titian/M Titicaca Tito/SM Titus Tl/M Tlaloc/M Tlingit/M Tm/M Tobago/M Tobe/M Tobey Tobi/M Tobiah/M Tobias/M Tobie/M Tobin/M Tobit Toby Tobye/M Tocantins Tocqueville Tod/M Todd Toddie/M Toddy/M Togo/M Togolese/M Toiboid/M Toinette/M Tojo Tokay/M Tokugawa Tokyo/M Tokyoite Toledo/MS Tolkien Tolstoy/M Toltec Tolyatti/M Tom/M Toma/SM Tomasina/M Tomasine/M Tomaso/M Tombaugh/M Tome/M Tomi/M Tomkin/M Tomlin/M Tommi/M Tommie/M Tommy Tompkins/M Tomsk Tonga/M Tongan/MS Toni/M Tonia/M Tonie/M Tonnie/M Tonto/M Tony Tonya/M Tonye/M Tootsie/M Topeka/M Topsy/M Torah/M Torahs Tore/M Torey/M Tori/M Torie/M Torin/M Toronto/M Torquemada Torr/MX Torrance Torre/SM Torrence/M Torrey/M Torricelli/M Torrie/M Torrin/M Torry/M Tortola Tortuga Torvalds/M Tory/SM Tosca/M Toscanini Toshiba/M Toto/M Toulouse Tova/M Tove/M Town/M Townes Towney/M Townie/M Townsend/M Towny/M Toynbee/M Toyoda/M Toyota/M Trace/M Tracee/M Tracey/M Traci/M Tracie/M Tracy/M Trafalgar/M Trailways/M Trajan Tran/M Transcaucasia Transvaal/M Transylvania Trappist/SM Traver/MS Travis/M Travolta/M Travus/M Treasury/SM Treblinka Trefor/M Trekkie/M Tremain/M Tremaine/M Tremayne/M Trenna/M Trent/M Trenton/M Tresa/M Trescha/M Tressa/M Trev/MR Trevar/M Trevelyan Trever/M Trevino/M Trevor/M Trey/M Triangulum/M Triassic/M Tricia/M Trident/M Trieste Trimurti/M Trina/M Trinidad/M Trinidadian/MS Trinity/SM Trip/M Tripitaka Tripoli/M Tripp/M Trippe/M Tris Trish/M Trisha/M Trista/M Tristam/M Tristan/M Triton/M Trix/M Trixi/M Trixie/M Trixy/M Trobriand/M Trojan/MS Trollope Trondheim/M Tropicana/M Trotsky Troy/M Troyes Trstram/M Truckee/M Truda/M Trude/M Trudeau Trudey/M Trudi/M Trudie/M Trudy/M Trueman/M Truffaut/M Trujillo Trula/M Trumaine/M Truman/M Trumann/M Trumbull/M Trump/M Truth Tsimshian/M Tsiolkovsky/M Tsitsihar/M Tswana/M Tu Tuamotu/M Tuareg/M Tubman Tuck/R Tucker/M Tuckie/M Tucky/M Tucson/M Tucuman/M Tudor/SM Tue/S Tues/M Tuesday/MS Tulane/M Tull/M Tulley/M Tully/M Tulsa/M Tums/M Tungus/M Tunguska/M Tunis/M Tunisia/M Tunisian/MS Tunney/M Tupi/M Tupperware Tupungato/M Turgenev Turin/M Turing/M Turk/SM Turkestan/M Turkey/M Turkic/MS Turkish/M Turkmenistan/M Turner Turpin Tuscaloosa/M Tuscan/M Tuscany/M Tuscarora/MS Tuscon/M Tuskegee/M Tussuad/M Tut/M Tutankhamen Tutsi Tutu/M Tuvalu/M Tuvaluan Twain Tweed Tweedledee/M Tweedledum/M Twila/M Twinkies Twp Twyla/M Ty/M Tybalt/M Tybi/M Tybie/M Tycho Tye/M Tylenol/M Tyler/M Tymon/M Tymothy/M Tynan/M Tyndale Tyndall Tyne/M Tyre Tyree/M Tyrolean Tyrone Tyrus/M Tyson/M U/M UAR UAW UCLA/M UFO/SM UHF/M UK/M UL UN/M UNESCO/M UNICEF/M UNIX/M UPC UPI UPS URL/S US/M USA/M USAF USCG USDA USIA USMC USN USO USP USPS USS USSR/M UT/M UV/M Ubangi Ucayali Uccello/M Udale/M Udall Udell/M Ufa/M Uganda/M Ugandan/MS Ugo/M Uighur/M Ujungpandang/M Ukraine/M Ukrainian/SM Ula/M Ulberto/M Ulick/M Ulises/M Ulla/M Ulric/M Ulrica/M Ulrich/M Ulrick/M Ulrika/M Ulrikaumeko/M Ulrike/M Ulster/M Ultrasuede/M Ulyanovsk Ulysses/M Umberto/M Umbriel/M Umeko/M Una/M Underwood/M Ungava Unicode/M Unilever/M Union/SM Unionist Uniroyal/M Unitarian/MS Unitarianism/MS Unitas/M Unix/S Unukalhai/M Ununtu/M Upanishads Updike Upjohn/M Upton/M Ur Ural/S Urania/M Uranus/M Urbain/M Urban/M Urbano/M Urbanus/M Urdu/M Urey Uri/SM Uriah Uriel Urquhart Ursa/M Ursala/M Ursola/M Urson/M Ursula Ursulina/M Ursuline Uruguay/M Uruguayan/MS Urumqi Usenet/MS Ustinov Uta/M Utah/M Utahan/MS Ute/SM Utopia/SM Utopian/SM Utrecht/M Utrillo/M Uzbek/M Uzbekistan/M Uzi/SM V/M VA VAT/M VAX VAXes VCR/M VD/M VDT VDU VF VFW/M VG VGA VHF/M VHS VI/M VIP/SM VISTA VJ VLF/M VOA VP VT VTOL Va Vachel/M Vaclav/M Vader/M Vaduz/M Vail/M Val/MY Valaree/M Valaria/M Valarie/M Valdemar/M Valdez/M Vale/M Valeda/M Valencia/SM Valene/M Valenka/M Valenti/M Valentia/M Valentijn/M Valentin/M Valentina/M Valentine/M Valentino Valenzuela/M Valera Valeria/M Valerian/M Valerie/M Valery Valerye/M Valhalla/M Valida/M Valina/M Valium/MS Valkyrie/SM Valle/M Vallejo Valletta/M Valli/M Vallie/M Vally/M Valma/M Valois Valparaiso/M Valry/M Valvoline/M Van Vance Vancouver/M Vanda/M Vandal/MS Vanderbilt Vandyke Vanessa/M Vang/M Vania/M Vanna/M Vanni/M Vannie/M Vanny/M Vanuatu/M Vanya/M Vanzetti/M Varanasi Varese Vargas Vaseline/SM Vasili/MS Vasily/M Vasquez/M Vassar/M Vassili/M Vassily/M Vatican/M Vauban Vaughan Vaughn/M Vazquez/M Veblen/M Veda/SM Vedanta Vega/SM Vegemite/M Vela Velasquez/M Velazquez Velcro/MS Velez/M Velma/M Velveeta/M Velvet/M Venetian/SM Venezuela/M Venezuelan/SM Venice/M Venita/M Venn/M Ventolin/M Venus/MS Venusian Vera/M Veracruz/M Veradis Verde Verdi Verdun/M Vere/M Verena/M Verene/M Verge/M Veriee/M Verile/M Verina/M Verine/M Verizon/M Verla/M Verlaine/M Vermeer Vermont/ZMR Vermonter/M Vern/MN Verna/M Verne Vernen/M Verney/M Vernice/M Vernon/M Vernor/M Verona/M Veronese Veronica Veronika/M Veronike/M Veronique Versailles/M Vesalius/M Vespasian Vespucci/M Vesta/M Vesuvius/M Vevay/M Vi/M Viacom/M Viagra Vic Vicente/M Vichy Vick/M Vicki/M Vickie/M Vicksburg/M Vicky Victoir/M Victor/M Victoria/M Victorian/MS Victorianism Victrola/M Vida/M Vidal/M Vidovic/M Vidovik/M Vienna/M Viennese Vientiane/M Vietcong Vietminh Vietnam/M Vietnamese/M Vijayanagar/M Vijayawada/M Viki/M Viking/MS Vikki/M Vikky/M Vila/M Vilhelmina/M Villa Villarreal/M Villon Vilma/M Vilnius/M Vilyui/M Vin/M Vina/M Vince/M Vincent/MS Vincenty/M Vincenz/M Vindemiatrix/M Vinita/M Vinni/M Vinnie/M Vinny/M Vinson/M Viola/M Violante/M Viole/M Violet/M Violetta/M Violette/M Virge/M Virgie/M Virgil/M Virgilio/M Virgina/M Virginia/M Virginian/SM Virginie/M Virgo/SM Visa/M Visayans Vishnu/M Visigoth/M Visigoths Vistula/M Vita/M Vite/M Vitia/M Vitim/M Vito/M Vitoria Vittoria/M Vittorio/M Vitus/M Viv/M Viva/M Vivaldi Vivekananda/M Vivi/MN Vivia/M Vivian Viviana/M Vivianna/M Vivianne/M Vivie/M Vivien/M Viviene/M Vivienne/M Viviyan/M Vivyan/M Vivyanne/M Vlad/M Vladamir/M Vladimir Vladivostok/M Vlasic/M Vogue/M Volcker/M Volga/M Volgograd/M Volkswagen/M Volstead/M Volta Voltaire/M Volvo/M Von/M Vonda/M Vonnegut/M Vonni/M Vonnie/M Vonny/M Voronezh Vorster/M Voyager/M Vt Vulcan/M Vulg Vulgate/SM Vyky/M W/MDT WA WAC WASP/M WATS/M WC WHO/M WI WNW/M WP WSW/M WV WW WWI WWII WWW/M WY WYSIWYG Wabash/M Wac Waco Wade Wadsworth/M Wagner/M Wagnerian Wahhabi Waikiki Wain/M Wainwright/M Wait/MR Waite/M Waiter/M Wake/M Wakefield Waksman Wald/MN Waldemar/M Walden/M Waldensian Waldheim Waldo/M Waldon/M Waldorf/M Wales/M Walesa Walgreen/M Walker/M Walkman Wall/SMR Wallace Wallache/M Wallas/M Wallenstein Wallie/M Wallis Walliw/M Walloon Wally/M Walpole/M Walpurgisnacht Walsh/M Walt/MRZ Walther/M Walton/M Waly/M Wanamaker/M Wanda/M Wandie/M Wandis/M Waneta/M Wang/M Wanids/M Wankel/M Ward/N Warde/M Ware/MG Warhol Waring/M Warner/M Warren Warsaw/M Warwick Wasatch/M Wash Washington/M Washingtonian/SM Wassermann Wat/MZ Waterbury Waterford Watergate Waterloo/MS Waters/M Watkins Watson Watt/S Watteau Watusi Waugh Wave Waverley/M Waverly/M Way/M Waylan/M Wayland/M Waylen/M Waylin/M Waylon/M Wayne Weaver/M Web/R Webb Webern/M Webster/MS Wed/M Weddell/M Wedgwood Wednesday/MS Weeks/M Wehrmacht Wei/M Weidar/M Weider/M Weierstrass/M Weill/M Weinberg/M Weiss/M Weizmann Welbie/M Welby/M Weldon/M Welland/M Weller/M Welles Wellington/SM Wells Welsh/M Welshman/M Welshmen Welshwoman Wenda/M Wendall/M Wendel/M Wendeline/M Wendell/M Wendi/M Wendie/M Wendy/M Wendye/M Wenona/M Wenonah/M Werner/M Wernher/M Wes Wesak/M Wesley/M Wesleyan/M Wessex Wesson/M West/SM Westbrook/M Westbrooke/M Western/MRS Westinghouse Westleigh/M Westley/M Westminster Weston/M Westphalia Weyden/M Weylin/M Wezen/M Wharton Wheaties/M Wheatstone/M Wheeler/M Wheeling/M Whig/SM Whipple/M Whirlpool/M Whistler Whit Whitaker Whitby/M White/SM Whitefield/M Whitehall Whitehead Whitehorse/M Whiteley/M Whitfield/M Whitley/M Whitman Whitney/M Whitsunday/SM Whittaker/M Whittier Wiatt/M Wicca Wichita/M Wiemar/M Wiesel/M Wiesenthal/M Wiggins Wigner/M Wilberforce Wilbert/M Wilbur/M Wilburn/M Wilburt/M Wilcox/M Wilda/M Wilde/R Wilden/M Wildon/M Wileen/M Wilek/M Wiley/M Wilford/M Wilfred/M Wilfredo/M Wilfrid/M Wilhelm/M Wilhelmina/M Wilhelmine Wilie/M Wilkerson/M Wilkes Wilkins Wilkinson/M Will/M Willa/M Willabella/M Willamette/M Willamina/M Willard Willdon/M Willem/M Willemstad Willetta/M Willette/M Willey/M Willi/MS William/S Williamson Willie/M Willow/M Willy/M Willyt/M Wilma/M Wilmar/M Wilmer/M Wilmette/M Wilmington/M Wilona/M Wilone/M Wilow/M Wilson/M Wilsonian Wilt/M Wilton/M Wimbledon/M Wimsey/M Win/M Winchell/M Winchester/S Windbreaker Windex/M Windham/M Windhoek Windows Windsor/SM Windward/M Windy/M Winesap/M Winfield/M Winfred/M Winfrey/M Wini/M Winifield/M Winifred/M Winkle/M Winn/M Winna/M Winnah/M Winne/M Winnebago/M Winni/M Winnie Winnifred/M Winnipeg/M Winny/M Winona/M Winonah/M Winslow/M Winston/M Winters Winthrop/M Wis Wisc Wisconsin/M Wisconsinite/SM Wise/M Wit/M Witt/M Wittgenstein/M Wittie/M Witty/M Witwatersrand Wm/M Wobegon/M Wodehouse/M Wolf Wolfe Wolff Wolfgang/M Wolfie/M Wolfy/M Wollongong Wollstonecraft/M Wolsey Wolverhampton Wonder Wonderbra/M Wong/M Wood/S Woodard/M Woodhull/M Woodie/M Woodman Woodrow/M Woodstock/M Woodward/M Woody/M Woolf Woolite/M Woolongong/M Woolworth Wooster/M Wooten/M Worcester/SM Worcestershire Worden/M Wordsworth/M Workman/M Worms Worth Worthington/M Worthy/M Wotan/M Wozniak/M Wozzeck/M Wrangell/M Wren Wrennie/M Wright Wrigley/M Wroclaw/M Wu/M Wuhan Wurlitzer/M Wyatan/M Wyatt Wycherley/M Wycliffe/M Wye/H Wylie/M Wylma/M Wyn/M Wyndham/M Wynn/M Wynne/M Wynnie/M Wynny/M Wyo Wyoming/M Wyomingite/MS X/M XEmacs/M XL/M XML XS XXL Xanadu Xanthippe Xavier Xaviera/M Xe/SM Xena/M Xenakis/M Xenia/M Xenophon Xenos Xerox/MS Xerxes Xever/M Xhosa/M Xi'an Xian/SM Xiaoping/M Ximenes Ximenez/M Xingu/M Xiongnu/M Xmas/MS Xochipilli/M Xuzhou/M Xylia/M Xylina/M Xymenes/M Y/M YMCA YMHA YMMV YT YWCA YWHA Yacc/M Yahtzee/M Yahweh/M Yakima Yakut/M Yakutsk Yale/M Yalonda/M Yalow/M Yalta/M Yalu/M Yamagata/M Yamaha/M Yamoussoukro Yanaton/M Yance/M Yancey/M Yancy/M Yang Yangon/M Yangtze/M Yank/SM Yankee/SM Yaobang/M Yaounde/M Yaqui Yard/M Yardley/M Yaren Yaroslavl Yasmeen/M Yasmin/M Yates Yb/M Yeager/M Yeats/M Yehudi/M Yehudit/M Yekaterinburg Yelena/M Yellowknife Yellowstone/M Yeltsin Yemen/M Yemeni/SM Yemenite Yenisei/M Yerevan Yerkes/M Yesenia/M Yetta/M Yettie/M Yetty/M Yevette/M Yevtushenko/M Yggdrasil Yiddish/M Ymir/M Ynes/M Ynez/M Yoda/M Yoknapatawpha/M Yoko/M Yokohama Yolanda/M Yolande/M Yolane/M Yolanthe/M Yong/M Yonkers Yorgo/MS York/MR Yorke/M Yorker/M Yorkie Yorkshire/MS Yorktown/M Yoruba/M Yosemite/M Yoshi/M Yoshiko/M Young Youngstown Yovonnda/M Ypres/M Ypsilanti Ysabel/M Yuan/M Yucatan/M Yugo Yugoslav/MS Yugoslavia/M Yugoslavian/SM Yukon/M Yul/M Yule/SM Yuletide/MS Yulma/M Yuma/SM Yunnan/M Yuri/M Yurik/M Yves/M Yvette/M Yvon/M Yvonne/M Yvor/M Z/SDNXT Zabrina/M Zaccaria/M Zach Zacharia/SM Zachariah/M Zacharie/M Zachary/M Zacherie/M Zachery/M Zack/M Zackariah/M Zagreb/M Zahara/M Zaire/M Zairian Zak/M Zambezi/M Zambia/M Zambian/SM Zamboni Zamenhof/M Zamora Zandra/M Zane/M Zaneta/M Zanuck/M Zanzibar/M Zapata Zaporozhye Zapotec Zappa/M Zara/M Zarah/M Zarathustra/M Zared/M Zaria/M Zarla/M Zea/M Zeb/M Zebadiah/M Zebedee Zebulen/M Zebulon/M Zechariah Zed/M Zedekiah/M Zedong/M Zeffirelli/M Zeke/M Zelda/M Zelig Zelma/M Zen/M Zena/M Zenger/M Zenia/M Zeno/M Zephaniah Zephyrus Zerk/M Zest/M Zeus/M Zhdanov Zhengzhou Zhivago/M Zhukov Zia/M Zibo/M Ziegfeld Ziegler/M Ziggy/M Zilvia/M Zimbabwe/M Zimbabwean/SM Zimmerman/M Zinfandel/M Zion/SM Zionism/SM Zionist/SM Ziploc Zita/M Zitella/M Zn/M Zoe/M Zola/M Zollie/M Zollverein Zolly/M Zoloft Zomba/M Zonda/M Zondra/M Zonnya/M Zora/M Zorah/M Zorana/M Zorina/M Zorine/M Zorn Zoroaster/M Zoroastrian/MS Zoroastrianism/SM Zorro/M Zosma/M Zr/M Zsazsa/M Zsigmondy Zubenelgenubi/M Zubeneschamali/M Zukor/M Zulema/M Zulu/SM Zululand Zuni Zurich/M Zuzana/M Zwingli/M Zworykin Zyrtec/M Zyuganov/M Zzz a/S aah aardvark/SM ab/SDY aback abacus/MS abaft abalone/SM abandon/LSDG abandonment/M abase/LGDS abasement/M abash/GLDS abashed/UY abashment/M abate/LGDS abated/U abatement/M abattoir/MS abbe/SM abbess/MS abbey/MS abbot/MS abbr abbrev/S abbreviate/XDSGN abbreviation/M abdicate/GNDSX abdication/M abdomen/SM abdominal abduct/DSG abduction/SM abductor/MS abeam aberrant aberration/SM aberrational abet/S abetted abetting abettor/SM abeyance/M abhor/S abhorred abhorrence/M abhorrent/Y abhorring abidance/M abide/GS abiding/Y ability/IEMS abject/YP abjection/M abjectness/M abjuration/MS abjuratory abjure/ZGDRS abjurer/M ablate/XGNVDS ablation/M ablative/MS ablaze able/UT abler abloom ablution/SM abnegate/GNDS abnegation/M abnormal/Y abnormality/SM aboard abode/MS abolish/GDS abolition/M abolitionism/M abolitionist/MS abominable abominably abominate/XDSGN abomination/M aboriginal/MS aborigine/SM aborning abort/GVDS abortion/MS abortionist/SM abortive/Y abound/DSG about above/M aboveboard abracadabra/M abrade/GDS abrasion/MS abrasive/MYSP abrasiveness/M abreast abridge/DSG abridgment/MS abroad abrogate/XGNDS abrogation/M abrogator/MS abrupt/TPRY abruptness/M abs/M abscess/MDSG abscissa/SM abscission/M abscond/ZGSDR absconder/M abseil/MDRSG absence/SM absent/DYSG absentee/MS absenteeism/M absentminded/PY absentmindedness/M absinthe/M absolute/PMYTNRS absoluteness/M absolution/M absolutism/M absolutist/MS absolve/DSG absorb/AGDS absorbed/U absorbency/M absorbent/SM absorber/S absorbing/Y absorption/SM absorptive absorptivity abstain/DRZGS abstainer/M abstemious/YP abstemiousness/M abstention/SM abstinence/M abstinent abstract/TGSPMDRY abstracted/YP abstractedness/M abstraction/SM abstractness/MS abstruse/RPYT abstruseness/M absurd/TPRY absurdity/SM absurdness/M abundance/SM abundant/Y abuse's abuse/EGVDS abuser/MS abusive/YP abusiveness/M abut/SL abutment/MS abutted abutting abuzz abysmal/Y abyss/MS abyssal ac acacia/MS academe/M academia/M academic/SM academical/Y academician/SM academy/SM acanthus/MS accede/GDS accelerate/GNDSX acceleration/M accelerator/SM accelerometer/S accent/MDSG accented/U accentual accentuate/DSGN accentuation/M accept/DSBG acceptability/M acceptableness/M acceptably/U acceptance/SM acceptation/MS accepted/U acceptor/S access/MDSG accessed/A accessibility/IM accessible/I accessibly/I accession/GMDS accessorize/DSG accessory/SM accidence accident/MS accidental/MYS acclaim/MDGS acclamation/SM acclimate/DSGN acclimation/M acclimatisation acclimatise/DSG acclimatization/M acclimatize/DSG acclivity/SM accolade/SM accommodate/DSGNX accommodating/Y accommodation/M accompanied/U accompaniment/SM accompanist/SM accompany/DSG accomplice/SM accomplish/GLDS accomplished/U accomplishment/MS accord/GMDS accordance/M accordant according/Y accordion/MS accordionist/SM accost/GMDS account/MDSBG accountability/M accountable/U accountancy/M accountant/MS accounted/U accounting/M accouter/SGD accouterments/M accoutrement accredit/SGD accreditation/M accredited/U accreted accretion/MS accrual/MS accrue/GDS acct acculturate/GNDS acculturation/M accumulate/DSGNVX accumulation/M accumulator/SM accuracy/ISM accurate/IY accurateness/M accursed/P accursedness/M accusal accusation/MS accusative/MS accusatory accuse/ZGDRS accuser/M accusing/Y accustom/DSG accustomed/U ace/DSMG acerbate/DSG acerbic acerbically acerbity/M acetaminophen/M acetate/MS acetic acetone/M acetonic acetylene/M ache/DSMG achene/MS achievable/U achieve/BLZGDRS achieved/A achievement/SM achiever/M aching/Y achoo/M achromatic achy/TR acid/SMY acidic acidify/GDSN acidity/M acidophiles acidosis/M acidulous acknowledge/DSG acknowledged/U acknowledgment/MS acme/SM acne/M acolyte/MS aconite/MS acorn/MS acoustic/S acoustical/Y acoustics/M acquaint/AGSD acquaintance/MS acquaintanceship/M acquainted/U acquiesce/DSG acquiescence/M acquiescent/Y acquire/ZGBDRSL acquirement/M acquisition/SM acquisitive/YP acquisitiveness/M acquit/S acquittal/MS acquittance acquitted acquitting acre/SM acreage/MS acrid/PTRY acridity/M acridness/M acrimonious/PY acrimoniousness/M acrimony/M acrobat/MS acrobatic/S acrobatically acrobatics/M acronym/MS acrophobia/M acropolis/MS across acrostic/SM acrylic/MS act's act/ASDGV acting/M actinides actinium/M action/ASM actionable activate/ICANGSD activated/U activation/CAIM activations activator/MS active's active/IKY activeness/M actives activism/M activist/MS activity's/I activity/AS actor/AMS actress/MS actual/Y actuality/SM actualization/M actualize/GDS actuarial actuary/SM actuate/GNDS actuation/M actuator/SM acuity/M acumen/M acupressure/M acupuncture/M acupuncturist/SM acute/PMYTRS acuteness/M acyclic acyclovir/M ad/SM adage/MS adagio/MS adamant/MY adapt/BZGVDRS adaptability/M adaptation/SM adapted/U adapter/M adaption/S adaptive/Y adaptivity add/SDRBZG addend/MS addenda addendum/M adder/M addict/GVMDS addiction/SM addictive/P addition/SM additional/Y additive/SMY addle/GDS address's address/AGDS addressable/U addressed/U addressee/SM adduce/GDS adenine/M adenoid/SM adenoidal adept/TMRYPS adeptness/M adequacy/IM adequate/IY adequateness/M adhere/ZGDRS adherence/M adherent/SM adhesion/M adhesive/SPM adhesiveness/M adiabatic adiabatically adieu/MS adios adipose adj adjacency/M adjacent/Y adjectival/Y adjective/MS adjoin/GDS adjourn/DGLS adjournment/MS adjudge/GDS adjudicate/GNVDSX adjudication/M adjudicator/SM adjudicatory adjunct/MS adjuration/SM adjure/GDS adjust/AGDSL adjustable adjusted/U adjuster/SM adjustment/AMS adjutant/SM adman/M admen admin/S administer/SDG administrate/GNVXDS administration/M administrative/Y administrator/SM admirably admiral/MS admiralty/M admiration/M admire/BZGDRS admirer/M admiring/Y admissibility/IM admissible/I admissibly admission/AM admissions admit/AS admittance/SM admitted/Y admitting/A admix/GDS admixture/SM admonish/LDSG admonishment/SM admonition/MS admonitory ado/M adobe/MS adolescence/SM adolescent/SM adopt/AGVDS adoptable adopter/MS adoption/SM adorableness/M adorably adoration/M adore/BZGDRS adorer/M adoring/Y adorn/LGDS adorned/U adornment/MS adrenal/MS adrenalin/M adrenaline/M adrift adroit/PTRY adroitness/M adsorb/SDG adsorbent/MS adsorption/MS adulate/DSGN adulation/M adulator/MS adulatory adult/MS adulterant/MS adulterate/XGNDS adulterated/U adulteration/M adulterer/SM adulteress/MS adulterous adultery/SM adulthood/M adumbrate/GNDS adumbration/M adv advance/LDSMG advancement/SM advantage/EDSMG advantageous/EY advent/SM adventitious/Y adventure/DRSMZG adventurer/M adventuresome adventuress/MS adventurism adventurist/S adventurous/YP adventurousness/M adverb/SM adverbial/SMY adversarial adversary/SM adverse/PRYT adverseness/M adversity/SM advert/SMDG advertise/ZGLDRS advertised/U advertisement/MS advertiser/M advertising/M advertorial/SM advice/SM advisability/IM advisable/I advisably advise/LDRSZGB advised/UY advisedly/I advisement/M adviser/M advisory/SM advocacy/M advocate/MGDS advt adz/MS aegis/M aeolian aerate/DSGN aeration/M aerator/SM aerial/SMY aerialist/MS aerie/MTRS aerobatic/S aerobatics/M aerobic/S aerobically aerobics/M aerobraking aerodrome/MS aerodynamic/S aerodynamically aerodynamics/M aerogram/S aeronautic/S aeronautical aeronautics/M aerosol/MS aerospace/M aesthete/S aesthetic/S aesthetically aestheticism/M aesthetics/M aether afar affability/M affable/TR affably affair/MS affect's affect/EGVDS affectation/SM affected/UY affecting/Y affection/EM affectionate/Y affections afferent affiance/GDS affidavit/SM affiliate's affiliate/EGNDS affiliated/U affiliation/EM affiliations affine affinity/SM affirm/AGDS affirmation/AMS affirmative/MYS affix/GMDS afflatus/M afflict/GDS affliction/SM affluence/M affluent/Y afford/GDSB affordability affordable/U afforest/EGSD afforestation/M affray/MS affront/GMDS afghan/MS aficionado/MS afield afire aflame afloat aflutter afoot aforementioned aforesaid aforethought afoul afraid/U afresh aft/RZ afterbirth/M afterbirths afterburner/SM aftercare/M aftereffect/MS afterglow/SM afterimage/MS afterlife/M afterlives aftermarket/SM aftermath/M aftermaths afternoon/MS aftershave/SM aftershock/SM aftertaste/SM afterthought/MS afterward afterword/MS again against agape/M agar/M agate/MS agave/M age/DSMGJ ageism/M ageist/SM ageless/YP agelessness/M agency/SM agenda/SM agent/AMS ageratum/M agglomerate/XDSMGN agglomeration/M agglutinate/XDSGNV agglutination/M aggrandize/LGDS aggrandizement/M aggravate/GNDSX aggravating/Y aggravation/M aggregate/MGNDSX aggregated/E aggregation/M aggression/SM aggressive/YP aggressiveness/M aggressor/SM aggrieve/DSG aggrieved/Y aggro aghast agile/YTR agility/M aging/M agitate/XGNDS agitated/Y agitation/M agitator/MS agitprop/M agleam aglitter aglow agnostic/MS agnosticism/M ago agog agonize/GDS agonizing/Y agony/SM agoraphobia/M agoraphobic/SM agouti agrarian/MS agrarianism/M agree/EBLDS agreeableness/EM agreeably/E agreeing/E agreement/ESM agribusiness/MS agricultural/Y agriculturalist/MS agriculture/M agriculturist/MS agrochemical/S agronomic agronomist/MS agronomy/M aground ague/M ah aha ahchoo ahead ahem ahoy aid/SMDRZG aide/SM aided/U aigrette/MS ail/SDLG aileron/SM ailment/SM aim/SMDG aimless/YP aimlessness/M ain't air/SMDJG airbag/MS airbase/SM airbed/S airborne airbrush/MDSG airbus/MS aircraft/M aircraftman aircraftmen aircrew/S airdrome/S airdrop/SM airdropped airdropping airfare/SM airfield/SM airflow/M airfoil/SM airframe/S airfreight/M airguns airhead/SM airily airiness/M airing/M airless/P airlessness/M airletters airlift/SGMD airline/RSMZ airliner/M airlock/SM airmail/GSMD airman/M airmen airplane/MS airplay/M airport/SM airship/SM airshow/S airsick/P airsickness/M airspace/M airspeed airstream airstrip/SM airtight airtime/M airwaves/M airway/MS airwoman airwomen airworthiness/M airworthy/TPR airy/PTR aisle/MS aitch/MS ajar aka akimbo akin alabaster/M alack alacrity/M alanine alarm/GMDS alarming/Y alarmist/SM alas alb/SM albacore/SM albatross/MS albedo albeit albinism/M albino/MS album/MNS albumen/M albumin/M albuminous alchemical alchemist/SM alchemy/M alcohol/SM alcoholic/MS alcoholically alcoholism/M alcove/MS aldehyde alder/MS alderman/M aldermen alderwoman/M alderwomen ale/SMV aleatory alehouse/SM alembic/SM alert/TGMDRYPS alertness/M alewife/M alewives alfalfa/M alfresco alga/M algae algal algebra/SM algebraic algebraical/Y algebraist algorithm/SM algorithmic algorithmically alias/GMDS alibi/GMDS alien/BGMDS alienable/IU alienate/DSGN alienation/M alienist/SM alight/GDS align/ALGDS aligned/U aligner/MS alignment/AMS alike/U aliment/MDSG alimentary alimony/M aliphatic aliquot/S aliveness/M aliyah/M aliyahs alkali/M alkalies alkaline alkalinity/M alkalize/DSG alkaloid/SM alkyd/MS all/M allay/GDS allegation/MS allege/GDS alleged/Y allegiance/SM allegoric allegorical/Y allegorist/MS allegory/SM allegretto/MS allegri allegro/MS allele/MS allelic alleluia/SM allergen/SM allergenic allergic allergically allergist/SM allergy/SM alleviate/DSXGN alleviation/M alley/MS alleyway/SM alliance/SM alligator/MS alliterate/DSGNVX alliteration/M alliterative/Y allocatable allocate/ADSGN allocated/U allocation/AM allocations allocator/S allophones allot/LS allotment/SM allotrope allotropic allotted allotting allover allow/EGDS allowable allowably allowance/SM alloy/GMDS alloyed/U allspice/M allude/GDS allure/MGLDS allurement/MS alluring/Y allusion/SM allusive/YP allusiveness/M alluvial/M alluvium/SM ally/GDSM almanac/SM almanack/S almighty almond/MS almoner/SM almost alms/M almshouse/MS aloe/SM aloft aloha/MS alone along alongshore alongside aloof/PY aloofness/M aloud alp/SM alpaca/MS alpha/MS alphabet/SM alphabetic alphabetical/Y alphabetization/MS alphabetize/DRSZG alphabetizer/M alphanumeric alphanumerical/Y alpine/S already alright also alt/S altar/MS altarpiece/SM alter/GDBS alterable/U alteration/MS altercate/XN altercation/M altered/U alternate/XDSMYGNV alternation/M alternative/MYS alternator/MS although altimeter/MS altitude/MS alto/SM altogether altruism/M altruist/SM altruistic altruistically alum/SM alumina/M aluminum/M alumna/M alumnae alumni alumnus/M alveolar/S always am/N amalgam/SM amalgamate/DSGNX amalgamation/M amanuenses amanuensis/M amaranth/M amaranths amaretto/M amaryllis/MS amass/GDS amateur/SM amateurish/PY amateurishness/M amateurism/M amatory amaze/LMGDS amazement/M amazing/Y amazon/MS amazonian ambassador/SM ambassadorial ambassadorship/MS ambassadress/MS amber/M ambergris/M ambiance/MS ambidexterity/M ambidextrous/Y ambient ambiguity/SM ambiguous/UY ambit ambition/MS ambitious/PY ambitiousness/M ambivalence/M ambivalent/Y amble/MZGDRS ambler/M ambrosia/M ambrosial ambulance/MS ambulanceman ambulancemen ambulancewoman ambulancewomen ambulant ambulate/DSXGN ambulation/M ambulatory/SM ambuscade/MGDS ambush/ZGMDS ameliorate/GNVDS amelioration/M amen/B amenability/M amenably amend/BLGDS amended/U amendment/SM amenity/SM amerce/GLDS amercement/MS americium/M amethyst/SM amethystine amiability/M amiable/P amiably amicability/M amicable amicably amid amide/MS amidships amidst amigo/MS amine/S amino amiss amity/M ammeter/SM ammo/M ammonia/M ammonites ammonium ammunition/M amnesia/M amnesiac/MS amnesic/SM amnesty/GDSM amniocenteses amniocentesis/M amnion/MS amniotic amoeba/MS amoebae amoebic amok among amongst amontillado/MS amoral/Y amorality/M amorous/YP amorousness/M amorphous/PY amorphousness/M amortization/MS amortize/DSGB amount/GMDS amour/MS amp/SMY amperage/M ampere/MS ampersand/MS amphetamine/SM amphibian/MS amphibious/Y amphitheater/SM amphora/M amphorae ample/TR amplification/M amplifier/M amplify/DRSZGNX amplitude/SM ampule/MS amputate/GNDSX amputation/M amputee/MS amt amulet/MS amuse/LGDS amused/U amusement/MS amusing/Y amylase/M an/CS anabolic anabolism/M anachronism/SM anachronistic anachronistically anaconda/SM anaerobe/SM anaerobic anaerobically anagram/MS anagrammatic anagrammatically anal/Y analgesia/M analgesic/SM analog/MS analogical/Y analogize/GDS analogous/PY analogousness/M analogue/SM analogy/SM analysand/MS analysis/AM analyst/SM analytic analytical/Y analyzable analyze/ADSG analyzer/SM anamorphic anapest/SM anapestic/MS anaphora anaphoric anarchic anarchical/Y anarchism/M anarchist/MS anarchistic anarchy/M anathema/SM anathematize/DSG anatomic anatomical/Y anatomist/SM anatomize/DSG anatomy/SM ancestor/SM ancestral/Y ancestress/MS ancestry/SM anchor/MDGS anchorage/MS anchorite/MS anchorman/M anchormen anchorpeople anchorperson/MS anchorwoman/M anchorwomen anchovy/SM ancient/SPMRYT ancientness/M ancillary/SM and andante/SM andiron/SM androgen/M androgenic androgynous androgyny/M android/SM anecdotal anecdote/MS anechoic anemia/M anemic anemically anemometer/MS anemone/SM anent aneroid anesthesia/M anesthesiologist/SM anesthesiology/M anesthetic/SM anesthetist/SM anesthetization/M anesthetize/DSG aneurysm/SM anew angel/MS angelfish/MS angelic angelica/M angelical/Y anger/GMDS angina/M angioplasty/SM angiosperm/SM angle/MZGDRS anglepoise angler/M angleworm/MS anglicism/S anglicize/GDS angling/M anglophile/S anglophone/S angora/MS angostura angrily angry/TR angst/M angstrom/MS anguish/GMDS angular angularity/SM anhydrous aniline/M animadversion/MS animadvert/SGD animal/MS animalcule/MS animate/ADSGN animated/Y animation/AM animations animator/MS animism/M animist/SM animistic animosity/SM animus/M anion/MS anionic anise/M aniseed/M anisette/M anisotropic anisotropy/S ankh/M ankhs ankle/MS anklebone/MS anklet/MS annal/S annalist/SM annals/M anneal/GDRS annelid/MS annex/GMDS annexation/MS annihilate/DSGN annihilation/M annihilator/MS anniversary/SM annotate/DSXGNV annotated/U annotation/M annotator/MS announce/DRSLZG announced/U announcement/MS announcer/M annoy/GDS annoyance/MS annoying/Y annoyware/S annual/MYS annualized annuitant/SM annuity/SM annul/LS annular annuli annulled annulling annulment/SM annulus annunciation/MS anode/MS anodize/GDS anodyne/MS anoint/GDLS anointment/M anomalous/Y anomaly/SM anon/S anonymity/M anonymous/Y anopheles/M anorak/MS anorectic/SM anorexia/M anorexic/MS another answer/BMDRGS answerable/U answered/U answerphone/S ant/SMD antacid/SM antagonism/SM antagonist/SM antagonistic antagonistically antagonize/DSG antarctic ante/SM anteater/MS antebellum antecedence/M antecedent/SM antechamber/SM antedate/GDS antediluvian anteing antelope/MS antenatal antenna/SM antennae anterior anteroom/MS anthem/MS anther/MS anthill/SM anthologist/SM anthologize/DSG anthology/SM anthracite/M anthrax/M anthropic anthropocentric anthropogenic anthropoid/SM anthropological/Y anthropologist/MS anthropology/M anthropometric anthropomorphic anthropomorphically anthropomorphism/M anthropomorphizing anthropomorphous anti/SM antiabortion antiabortionist/MS antiaircraft antibacterial/MS antibiotic/SM antibody/SM antic/MS anticancer anticipate/GNVXDS anticipated/U anticipation/M anticipatory anticked anticking anticlerical anticlimactic anticlimactically anticlimax/MS anticline/SM anticlockwise anticoagulant/SM anticommunism/M anticommunist/MS anticyclone/MS anticyclonic antidemocratic antidepressant/MS antidote/MS antifascist/MS antifreeze/M antigen/SM antigenic antigenicity/M antihero/M antiheroes antihistamine/SM antiknock/M antilabor antilogarithm/MS antimacassar/SM antimalarial antimatter/M antimicrobial antimissile antimony/M antinuclear antioxidant/SM antiparticle/MS antipasti antipasto/MS antipathetic antipathy/SM antipersonnel antiperspirant/SM antiphon/SM antiphonal/MYS antipodal/S antipodean/MS antipodes/M antipollution antipoverty antiquarian/MS antiquarianism/M antiquary/SM antiquate/GDS antique/DSMG antiquity/SM antirrhinum/S antisemitic antisemitism/M antisepsis/M antiseptic/SM antiseptically antiserum/MS antislavery antisocial/Y antispasmodic/SM antistatic antisubmarine antisymmetric antisymmetry antitank antitheses antithesis/M antithetic antithetical/Y antitoxin/MS antitrust antivenin/MS antiviral/S antivivisectionist/MS antiwar antler/MDS antonym/SM antonymous antral antsy/TR anus/MS anvil/MS anxiety/SM anxious/YP anxiousness/M any anybody/SM anyhow anymore anyone/M anyplace anything/SM anytime anyway/S anywhere anywise aorist aorta/MS aortic apace apart apartheid/M apartment/MS apathetic apathetically apathy/M apatite/M ape/DSMG apelike aperiodic aperiodically aperitif/MS aperture/SM apex/MS aphasia/M aphasic/MS aphelia aphelion/SM aphid/MS aphorism/MS aphoristic aphoristically aphrodisiac/MS apiarist/SM apiary/SM apical/Y apiece apish/Y aplenty aplomb/M apnea apocalypse/SM apocalyptic apocrypha/M apocryphal/Y apogee/MS apolitical/Y apologetic/U apologetically apologia/SM apologist/MS apologize/GDS apology/SM apoplectic apoplexy/SM apostasy/SM apostate/SM apostatize/DSG apostle/MS apostleship/M apostolic apostrophe/SM apostrophized apothecary/SM apothegm/SM apotheoses apotheosis/M apotheosizes app/S appall/GDS appalling/Y appaloosa/MS apparatchik/S apparatus/MS apparel/MDGS apparent/Y apparition/SM appeal/GMDS appealing/UY appear/AESDG appearance/EAMS appease/LZGDRS appeased/U appeasement/MS appeaser/M appellant/SM appellate/XN appellation/M append/GDS appendage/SM appendectomy/SM appendices appendicitis/M appendix/MS appertain/DGS appetite/SM appetizer/MS appetizing/Y applaud/ZGDRS applauder/M applause/M apple/MS applecart applejack/M applesauce/M applet/MS appliance/SM applicability/M applicable/I applicably applicant/SM application/AM applicative applicator/SM applier/MS applique/DSM appliqueing apply/ANXGDS appoint/AELSVGD appointee/SM appointment's/A appointment/ESM apportion/ALDGS apportionment/AM appose/GDS apposite/PYNV appositeness/M apposition/M appositive/MS appraisal/AMS appraise/ADSG appraisees appraiser/MS appreciable/I appreciably/I appreciate/XDSGNV appreciated/U appreciation/M appreciative/Y appreciator/MS appreciatory apprehend/GDS apprehension/MS apprehensive/PY apprehensiveness/M apprentice/DSMG apprenticeship/MS apprise/GDS approach/GBMDS approachability approachable/IU approbation/EM approbations appropriate/DSPXYGN appropriated/U appropriateness/IM appropriation/M appropriator/MS approval/EM approvals approve/EGDS approved/U approving/EY approx approximate/XYGNDS approximation/M appurtenance/SM appurtenant apricot/MS apron/MS apropos apse/SM apt/IYPT apter aptitude/SM aptness/IM aqua/SM aquaculture/M aqualung/MS aquamarine/SM aquanaut/MS aquaplane/MGDS aquarium/MS aquatic/SM aquatically aquatics/M aquatint/S aquavit/M aqueduct/MS aqueous aquifer/SM aquiline arabesque/MS arability/M arachnid/MS arachnoid arachnophobia arbiter/SM arbitrage/MZGDRS arbitrager/M arbitrageur/MS arbitrament/MS arbitrarily arbitrariness/M arbitrary/P arbitrate/GNDS arbitration/M arbitrator/SM arbor/MS arboreal arbores arboretum/SM arborvitae/SM arbutus/MS arc/SMDG arcade/MGS arcana arcane/PY arch/PZTGVMDRSY archaeological/Y archaeologist/SM archaic archaically archaism/MS archaist/MS archangel/MS archbishop/SM archbishopric/MS archdeacon/SM archdeaconry archdiocesan archdiocese/SM archduchess/MS archduke/MS archenemy/SM archeology/M archeopteryx archer/M archery/M archetypal archetype/MS archfiend/MS archiepiscopal archipelago/MS architect/SM architectonic/S architectonics/M architectural/Y architecture/SM architrave/SM archival archive/DSMG archived/U archivist/MS archness/M archway/SM arctic/MS ardency ardent/Y ardor/MS arduous/YP arduousness/M are/SMB area/SM areal aren't arena/MS argent/M argon/M argosy/SM argot/MS arguable/IU arguably/U argue/ZGDRS arguer/M argument/MS argumentation/M argumentative/YP argumentativeness/M argyle/MS aria/SM arid/TRY aridity/M aright arise/GS arisen aristocracy/SM aristocrat/SM aristocratic aristocratically arithmetic/M arithmetical/Y arithmetician/SM ark/SM arm's arm/EAGDS armada/MS armadillo/SM armament/AEM armaments armature/MS armband/MS armchair/MS armed/U armful/MS armhole/SM armistice/SM armless armlet/MS armload/S armor/ZGMDRS armored/U armorer/M armorial armory/SM armpit/MS armrest/SM army/SM aroma/MS aromatherapist/MS aromatherapy/M aromatic/MS aromatically aromaticity arose around arousal/M arouse/GDS aroused/U arpeggio/MS arr arraign/DGSL arraignment/MS arrange/AESDLG arrangeable arrangement's/E arrangement/ASM arranger/SM arrant arras/MS array/EGMDS arrears/M arrest/AGMDS arrestable arrhythmia/M arrhythmic arrhythmical arrival/MS arrive/GDS arrogance/M arrogant/Y arrogate/GNDS arrogation/M arrow/GMDS arrowhead/MS arrowroot/M arroyo/MS arsed arsenal/MS arsenic/M arsenide arsing arson/M arsonist/SM art/SM artefactual arterial arteriole/MS arteriosclerosis/M artery/SM artful/PY artfulness/M arthritic/MS arthritis/M arthropod/MS arthroscope/SM arthroscopic artichoke/SM article/MDS articulacy/I articular articulate/PXDSYGN articulateness/IM articulation/M articulatory artifact/SM artifice/RSMZ artificer/M artificial/Y artificiality/M artillery/M artilleryman/M artillerymen artiness/M artisan/MS artist/MS artiste/MS artistic/I artistically artistry/M artless/PY artlessness/M artsy/TR artwork/MS arty/PTR arugula arum/SM asap asbestos/M asbestosis ascend/AGDS ascendancy/M ascendant/SM ascension/MS ascent/MS ascertain/BLGDS ascertainment/M ascetic/MS ascetically asceticism/M ascorbic ascot/MS ascribe/GBDS ascription/MS aseptic aseptically asexual/Y asexuality/M ash/MDNSG ashamed/UY ashcan/MS ashlar/MS ashore ashram/MS ashtray/SM ashy/TR aside/MS asinine/Y asininity/SM ask/SDG askance asked/U askew aslant asleep asocial asp/SMNX asparagus/M aspartame/M aspect/MS aspen/M asperity/SM aspersion/MS asphalt/MDGS asphodel/SM asphyxia/M asphyxiate/DSGNX asphyxiation/M aspic/MS aspidistra/MS aspirant/MS aspirate/MGNDSX aspiration/M aspirational aspirator/SM aspire/GDS aspirin/MS ass/MS assail/GBDS assailable/U assailant/SM assailed/U assassin/SM assassinate/GNDSX assassination/M assault/MDRGS assay/ZGMDRS assayer/M assemblage/MS assemble/EADSG assembler/MS assemblies assembly/AM assemblyman/M assemblymen assemblywoman/M assemblywomen assent/GMDS assert/AGVDS assertion/AM assertions assertive/YP assertiveness/M assess/ALGDS assessable assessment/ASM assessor/MS asset/MS asseverate/DSGN asseveration/M asshole/SM! assiduity/M assiduous/PY assiduousness/M assign's assign/ALGDS assignable assignation/SM assigned/U assignees assigner/MS assignment/AMS assignor/MS assimilable assimilate/DSGN assimilation/M assist/GMDS assistance/M assistant/SM assisted/U assize/MS assn assoc associate's associate/EDSGNV associated/U associateship association/EM associational associations associative/Y associativity assonance/M assonant/MS assort/GLDS assortment/SM asst assuage/GDS assuaged/U assume/BGDS assuming/AU assumption/MS assumptive assurance/ASM assure/AGDS assured/MYS astatine/M aster/EMS asterisk/GMDS astern asteroid/MS asthma/M asthmatic/SM asthmatically astigmatic astigmatism/SM astir astonish/DSGL astonishing/Y astonishment/M astound/GDS astounding/Y astraddle astrakhan/M astral/Y astray astride astringency/M astringent/MYS astrolabe/SM astrologer/SM astrological/Y astrologist/SM astrology/M astronaut/MS astronautic/S astronautical astronautics/M astronomer/SM astronomic astronomical/Y astronomy/M astrophysical astrophysicist/MS astrophysics/M astute/PYTR astuteness/M asunder asylum/SM asymmetric asymmetrical/Y asymmetry/SM asymptomatic asymptote/S asymptotic asymptotically asynchronous/Y at atavism/M atavist/SM atavistic ataxia/M ataxic/MS ate atelier/SM atheism/M atheist/MS atheistic atheistically atherosclerosis/M athirst athlete/MS athletic/S athletically athleticism athletics/M athwart atilt atishoo atlantes atlas/MS atmosphere/SM atmospheric/S atmospherically atmospherics/M atoll/MS atom/SM atomic atomically atomicity atomistic atomization atomize/ZGDRS atomizer/M atonal/Y atonality/M atone/LGDS atonement/M atop atria atrial atrium/M atrocious/PY atrociousness/M atrocity/SM atrophy/DSMG atropine/M attach/ALGDS attache/BM attached/U attachment/AM attachments attack/ZGMDRS attacker/M attain/AGDS attainability/M attainable/U attainder/M attained/U attainment/MS attar/M attempt's attempt/ASDG attend/SDRZG attendance/MS attendant/SM attended/U attendee/SM attention/IM attentional attentions attentive/IYP attentiveness/IM attenuate/DSGN attenuated/U attenuation/M attenuator/S attest/SDG attestation/MS attested/U attic/SM attire/DSMG attitude/SM attitudinal attitudinize/GDS attn attorney/MS attract/SGVDB attractant/SM attraction/SM attractive/UPY attractiveness/M attractor/S attributable/U attribute/BXDSMGNV attributed/U attribution/M attributive/SMY attrition/M attune/DSG atty atwitter atypical/Y aubergine/S auburn/M auction/MDGS auctioneer/SM audacious/PY audaciousness/M audacity/M audibility/IM audible/MS audibly/I audience/MS audio/MS audiological audiologist/MS audiology/M audiometer/SM audiophile/MS audiotape/SM audiovisual/S audiovisuals/M audit/GVMDS audited/U audition/SMDG auditor/MS auditorium/SM auditory auger/MS aught/MS augite augment/DRZGS augmentation/SM augmentative augmenter/M augur/GMDS augury/SM august/PTRY augustness/M auk/SM aunt/SM auntie/SM aura/MS aural/Y aureole/SM auric auricle/SM auricular aurora/SM auroral auscultate/XDSGN auscultation/M auspice/SM auspicious/IY auspiciousness/M austere/RYT austerity/SM austral auteur authentic/IU authentically authenticate/GNDSX authenticated/U authentication/M authenticator/S authenticity/M author/SMDG authoress/MS authorial authoritarian/SM authoritarianism/M authoritative/YP authoritativeness/M authority/SM authorization/MS authorize/AGDS authorized/U authorship/M autism/M autistic auto/MS autobahn/SM autobiographer/SM autobiographic autobiographical/Y autobiography/SM autoclave/MS autocracy/SM autocrat/SM autocratic autocratically autocross autocue autodidact/MS autograph/MDG autographs autoignition autoimmune autoimmunity/M automaker/SM automate/GNDS automatic/SM automatically automation/M automatism/M automatize/GDS automaton/SM automobile/MGDS automorphism/S automotive autonomic autonomous/Y autonomy/M autopilot/SM autopsy/GDSM autosuggestion autoworker/MS autumn/SM autumnal aux auxiliary/SM auxin/M av/RZ avail/BGMDS availabilities availability/UM available/U avalanche/SM avarice/M avaricious/YP avast avatar/MS avaunt avdp ave avenge/ZGDRS avenged/U avenger/M avenue/MS average/MYGDS averred averring averse/XNV aversion/M avert/GDS avg avian aviary/SM aviation/M aviator/MS aviatrices aviatrix/MS avid/TRY avidity/M avionic/S avionics/M avitaminosis/M avocado/SM avocation/MS avocational avoid/SDGB avoidable/U avoidably/U avoidance/M avoirdupois/M avouch/DSG avow/EDGS avowal/ESM avowed/Y avuncular/Y aw await/GDS awake/GS awaken/AGDS awakened/U awakening/SM award/GMDS aware/UPT awareness/UM awarer awash away awe/DSMG aweigh awesome/YP awesomeness/M awestruck awful/YP awfuller awfullest awfulness/M awhile awkward/RYPT awkwardness/M awl/SM awn/GJSM awning/M awoke awoken awry ax/MDSG axehead/S axeman axial/Y axillary axiom/SM axiomatic axiomatically axiomatizing axis/MS axle/MS axletree/SM axolotl/SM axon/MS ayah/M ayahs ayatollah/M ayatollahs aye/SM azalea/SM azimuth/M azimuthal azimuths azure/SM b/KDT baa/SMDG babble/MZGDRS babbler/M babe/SM babel/MS baboon/MS babushka/SM baby/TGDRSM babyhood/M babyish babysat babysit/S babysitter/SM babysitting/M baccalaureate/MS baccarat/M bacchanal/MS bacchanalia/M bacchanalian/MS baccy bachelor/SM bachelorhood/M bacillary bacilli bacillus/M back/SJZGMDR backache/MS backbench/S backbit backbite/ZGRS backbiter/M backbitten backboard/SM backbone/MS backbreaking backchat backcloth backcloths backcomb/DSG backdate/GDS backdoor backdrop/MS backer/M backfield/SM backfire/MGDS backgammon/M background/MRSZ backgrounder/M backhand/MDRSZG backhanded/Y backhander/M backhoe/MS backing/M backlash/MS backless backlog/MS backlogged backlogging backpack/ZGMDRS backpacker/M backpacking/M backpedal/SDG backrest/SM backroom/S backscratching/M backseat/SM backside/SM backslapper/MS backslapping/M backslash/MS backslid backslide/RSZG backslider/M backspace/DSMG backspin/M backstabber/MS backstabbing backstage/M backstair/S backstop/SM backstopped backstopping backstreet/S backstretch/MS backstroke/MGDS backtalk/M backtrack/GSD backup/MS backward/SPY backwardness/M backwash/M backwater/SM backwoods/M backwoodsman/M backwoodsmen backyard/SM bacon/M bacteria/SM bacterial bactericidal bactericide/SM bacteriologic bacteriological bacteriologist/MS bacteriology/M bacteriophage bacterium/M bad/MYP badder baddest baddie/MS bade badge/MZDRS badger/GMD badinage/M badlands/M badman/M badmen badminton/M badmouth/GD badmouths badness/M baffle/MZGDRSL bafflement/M baffler/M bag/SM bagatelle/SM bagel/MS bagful/MS baggage/M bagged baggie/M baggily bagginess/M bagging baggy/PTRS bagpipe/MZRS bagpiper/M baguette/MS bah baht/SM bail/SBGMD bailey/S bailiff/S bailiwick/MS bailout/SM bailsman/M bailsmen bairn/MS bait/SGMD baize/M bake/DRSMZG baked/U bakehouse baker/M bakery/SM bakeshop/MS baklava/M baksheesh/M balaclava/MS balalaika/MS balance's balance/UDSG balanced/A balboa/SM balcony/SM bald/STGPDRY balderdash/M baldfaced baldness/M baldric/SM baldy/S bale/DRSMZG baleen/M baleful/PY balefuller balefullest balefulness/M baler/M balk/SGMD balky/RT ball/SGMD ballad/SM ballade/S balladeer/MS balladry/M ballast/GSMD ballcock/MS ballerina/SM ballet/SM balletic ballgame/MS ballgirl/S ballgown/S ballistic/S ballistics/M balloon/SGMD balloonist/MS ballot/SMDG ballpark/MS ballplayer/MS ballpoint/MS ballroom/MS balls/DSG ballsy/RT bally ballyhoo/SMDG balm/SM balminess/M balmy/RTP baloney/M balsa/MS balsam/SM balsamic baluster/SM balustrade/MS bamboo/SM bamboozle/DSG ban/SM banal/RYT banality/SM banana/SM band's band/ESGD bandage/DSMG bandanna/MS bandbox/MS bandeau/M bandeaux bandit/SM banditry/M bandleader/S bandmaster/SM bandoleer/SM bandpass bandsman/M bandsmen bandstand/SM bandwagon/SM bandwidth bandwidths bandy/DRSTG bane/SM baneful banefuller banefullest bang/SGMD bangle/SM bani banish/GLDS banishment/M banister/SM banjo/MS banjoist/SM bank/SZGBMDR bankbook/SM bankcard/SM banker/M banking/M banknote/SM bankroll/SGMD bankrupt/SGMD bankruptcy/SM banned/U banner/SM banning/U bannock/MS banns/M banquet/ZGMDRS banqueter/M banquette/SM banshee/MS bantam/SM bantamweight/SM banter/GSMD bantering/Y banyan/SM banzai/SM baobab/SM bap/S baptism/MS baptismal baptist/S baptistery/SM baptize/ZGDRS baptized/U baptizer/M bar's bar/ECUTS barb/SZGMDR barbarian/SM barbarianism/SM barbaric barbarically barbarism/SM barbarity/SM barbarize/DSG barbarous/Y barbecue/DSMG barbel/SM barbell/MS barber/GMD barberry/SM barbershop/MS barbie/S barbiturate/SM barbwire/M barcarole/SM bard/SM bardic bare/DRSPYG bareback/D barefaced/Y barefoot/D barehanded bareheaded barelegged bareness/M barf/SGMDY barfly/SM bargain/MDRZGS bargainer/M barge/MGDS bargeman/M bargemen bargepole barhop/S barhopped barhopping baritone/MS barium/M bark's bark/CSGD barkeep/ZMRS barkeeper/M barker/SM barley/M barleycorn/S barmaid/MS barman/M barmen barmy/RT barn/SM barnacle/MDS barney/S barnstorm/ZGSDR barnstormer/M barnyard/SM barometer/MS barometric barometrically baron/MS baronage/MS baroness/MS baronet/MS baronetcy/SM baronial barony/SM baroque/M barrack/MDGS barracuda/SM barrage/MGDS barre/MGJDS barred/UEC barrel/GSMD barren/TPSMR barrenness/M barrette/SM barricade/MGDS barrier/MS barring/ECU barrio/SM barrister/MS barroom/MS barrow/SM bartender/SM barter/ZGSMDR barterer/M barycenter barycentric baryon/SM basal/Y basalt/SM basaltic base's base/CDRSLTG baseball/SM baseboard/MS baseless baseline/MS basely baseman/M basemen basement/CMS baseness/M bash/GMDS bashful/PY bashfulness/M bashing/M basic/MS basically basil/M basilica/MS basilisk/MS basin/MS basinful/MS basis/M bask/SGD basket/SM basketball/MS basketful basketry/M basketwork/M basque/S bass/MS basset/SM bassinet/MS bassist/MS basso/MS bassoon/MS bassoonist/MS basswood/MS bast/M bastard/MS bastardization/MS bastardize/GDS bastardy/M baste/ZGNXDRS baster/M bastion/M bat/SM batch/MDSG bate/KACGSD bath/ZGMDRS bathe/M bather/M bathetic bathhouse/MS bathing/M bathmat/MS bathos/M bathrobe/SM bathroom/SM baths bathtub/MS bathwater bathysphere/SM batik/MS batiste/M batman/M batmen baton/MS batsman/M batsmen battalion/SM batted batten/GSMD batter/JZGSMDR batterer/M battery/SM batting/M battle/LDRSMZG battledore/SM battledress battlefield/MS battlefront/SM battleground/MS battlement/SM battler/M battleship/MS batty/RT bauble/SM baud/SM bauxite/M bawd/SM bawdily bawdiness/M bawdy/PRT bawl/SGMD bay/SMDG bayberry/SM bayonet/SMDG bayou/MS bazaar/SM bazillion/S bazooka/SM bbl bdrm be beach/MDSG beachcomber/MS beachfront beachhead/MS beachwear/M beacon/SM bead/SGMD beading/M beadle/SM beady/RT beagle/SM beak/SZMDR beaker/M beam/SGMD bean/SGMD beanbag/MS beanfeast/S beanie/SM beanpole/MS beansprout/S beanstalk/MS bear/SZGBJMR bearable/U bearably/U beard/MDGS beardless bearer/M bearing/M bearish/PY bearishness/M bearlike bearskin/MS beast/MS beastliness/M beastly/TPRM beat/SZGBMNRJ beatable/U beaten/U beater/M beatific beatifically beatification/M beatify/GDSXN beating/M beatitude/SM beatnik/MS beau/SM beaut/MS beauteous/Y beautician/MS beautification/M beautifier/M beautiful/TRY beautify/DRSZGN beauty/SM beaver/SGMD bebop/MS becalm/GSD became because beck/SM beckon/SGD becloud/GDS become/S becoming/UY becquerel/S bed/SM bedaub/GSD bedazzle/GLDS bedazzlement/M bedbug/SM bedchamber/S bedclothes/M bedded bedder bedding/M bedeck/GSD bedevil/LGDS bedevilment/M bedfellow/SM bedhead/S bedim/S bedimmed bedimming bedizen/GDS bedlam/SM bedlinen bedmaker/S bedpan/SM bedpost/SM bedraggle/GDS bedridden bedrock/SM bedroll/SM bedroom/SM bedsheets bedside/SM bedsit/S bedsitter/S bedsore/SM bedspread/SM bedstead/SM bedtime/SM bee/RSMZGJ beebread/M beech/MS beechnut/MS beechwood beef/SGMD beefburger/MS beefcake/MS beefeater beefiness/M beefsteak/MS beefy/RPT beehive/MS beekeeper/MS beekeeping/M beeline/MS been beep/SZGMDR beeper/M beer/M beermat/S beery/TR beeswax/M beet/SM beetle/MGDS beetroot/S beeves befall/SGN befell befit/S befitted befitting/Y befog/S befogged befogging before beforehand befoul/DGS befriend/SGD befuddle/GDSL befuddlement/M beg/S began beget/S begetter/S begetting beggar/MDYGS beggary/M begged begging begin/S beginner/SM beginning/MS begone begonia/SM begot begotten begrime/DSG begrudge/DSG begrudging/Y beguile/DRSZGL beguilement/M beguiler/M beguiling/Y beguine/SM begum/MS begun behalf/M behalves behave/GDS behavior/SM behavioral/Y behaviorism/M behaviorist/SM behead/DGS beheld behemoth/M behemoths behest/MS behind/MS behindhand behold/NRZGS beholder/M behoove/DSG beige/M being/M bejewel/SDG belabor/SDG belated/PY belay/GDS belch/GMDS beleaguer/SGD belfry/SM belie/DS belief/EUM beliefs believability/U believable/U believably/U believe/EDRSZG believed/U believer/EUMS believing/U belittle/DSLG belittlement/M bell/SGMD belladonna/M bellboy/SM belle/MS belled/A belletrist/SM belletristic bellhop/SM bellicose bellicosity/M belligerence/M belligerency/M belligerent/SMY belling/A bellman/M bellmen bellow/MDGS bellwether/MS belly/GDSM bellyache/MGDS bellybutton/MS bellyful/MS belong/JDGS belonging/M beloved/SM below belt/SGMD beltway/SM beluga/MS belying bemire/GDS bemoan/DGS bemuse/LGDS bemused/Y bemusement/M bench/GMDS benchmark/GMS bend/BSZGMDR bender/M bendy/TR beneath benedictine benediction/SM benedictory benefaction/SM benefactor/MS benefactress/MS benefice/SM beneficence/M beneficent/Y beneficial/Y beneficiary/SM benefit/SMDG benevolence/MS benevolent/Y benighted/Y benign/Y benignant benignity/M bent/SM bentwood/M benumb/DSG benzene/M benzine/M bequeath/DG bequeaths bequest/MS berate/GDS bereave/DSLG bereavement/MS bereft beret/MS berg/SM beriberi/M berk/S berkelium/M berm/SM berry/GDSM berrylike berserk berth/GMD berths beryl/MS beryllium/M beseech/ZGRS beseecher/M beseeching/Y beseem/DSG beset/S besetting beside/S besiege/ZGDRS besieger/M besmear/DSG besmirch/GDS besom/MS besot/S besotted besotting besought bespangle/DSG bespatter/GSD bespeak/SG bespectacled bespoke bespoken best/SGMD bestial/Y bestiality/M bestiary/SM bestir/S bestirred bestirring bestow/DGS bestowal/SM bestrew/SDG bestrewn bestridden bestride/SG bestrode bestseller/MS bestselling bet/SM beta/SM betake/GS betaken betcha betel/M bethink/SG bethought betide/GDS betimes betoken/GDS betook betray/DRZGS betrayal/SM betrayer/M betroth/DG betrothal/SM betrothed/M betroths better/MDGLS betterment/M betting bettor/MS between betwixt bevel/JGMDS beverage/SM bevvy/S bevy/SM bewail/DGS beware/GDS bewhiskered bewigged bewilder/SLGD bewildering/Y bewilderment/M bewitch/GLDS bewitching/Y bewitchment/M bey/SM beyond bezel/MS bf bhaji bi/SMRZ biannual/Y bias/GMDS biathlon/SM bib/SM bible/MS biblical biblicists bibliographer/SM bibliographic bibliographical/Y bibliography/SM bibliophile/SM bibulous bicameral bicameralism/M bicarb/MS bicarbonate/MS bicentenary/SM bicentennial/SM bicep/MS biceps/M bicker/MDRZGS bickerer/M biconcave biconvex bicuspid/MS bicycle/DRSMZG bicycler/M bicyclist/SM bid/SMG biddable bidden/U bidder/MS bidding/M biddy/SM bide/S bidet/MS bidirectional/Y biennial/MYS biennium/MS bier/M biff/SGD bifocal/S bifocals/M bifurcate/DSXGN bifurcation/M big/P bigamist/SM bigamous bigamy/M bigger biggest biggie/MS biggish bighead/SM bighearted/P bigheartedness/M bighorn/SM bight/MS bigmouth/M bigmouths bigness/M bigot/MDS bigotry/SM bigwig/MS bijou/M bijoux bike/DRSMZG biker/M bikini/MS bilabial/MS bilateral/Y bilberry/S bile/M bilge/MS bilharzia biliary bilingual/SMY bilingualism/M bilious/P biliousness/M bilk/SZGDR bilker/M bill/SBJGMD billboard/MS billet/GMDS billfold/SM billhook/S billiard/S billiards/M billing/M billingsgate/M billion/MHS billionaire/MS billionth/M billionths billow/GMDS billowy/RT billposters billy/SM billycan/S bimbo/MS bimetallic/SM bimetallism/M bimodal bimonthly/SM bin/SM binary/SM bind's bind/AUGS binder/MS bindery/SM binding/MS bindweed/M binge/MGDS bingo/M binman binmen binnacle/SM binned binning binocular/MS binodal binomial/SM bio/SM biochemical/SMY biochemist/MS biochemistry/M biodegradability/M biodegrade/DSGB biodiversity/M bioengineering bioethics/M biofeedback/M biog biographer/SM biographic biographical/Y biography/SM biol biologic biological/Y biologist/MS biology/M biomass/M biomedical biometric/S biometry biomorph bionic/S bionically bionics/M biophysical biophysicist/MS biophysics/M biopic/MS biopsy/GDSM biorhythm/MS biosphere/SM biota biotechnological biotechnologist biotechnology/M biotic biotin/M bipartisan bipartisanship/M bipartite biped/MS bipedal bipedalism biplane/MS bipolar bipolarity/M biracial birch/GMDS bird/SZGMDR birdbath/M birdbaths birdbrain/SMD birdcage/S birder/M birdhouse/MS birdie/MDS birdieing birdlike birdlime/M birdseed/M birdsong birdtables birdwatcher/MS birdwatching birdying birefringence birefringent biretta/SM birth/GMD birthday/MS birthmark/MS birthplace/MS birthrate/MS birthright/SM births/A birthstone/MS biscuit/SM bisect/DGS bisection/MS bisector/SM bisexual/MYS bisexuality/M bishop/MS bishopric/SM bismuth/M bison/M bisque/M bistable bistro/MS bit/CSMG bitch/GMDS bitchily bitchiness/M bitchy/PRT bite/RSMZ biter/M biting/Y bitmap/S bitten bitter/PMRYTS bittern/SM bitterness/M bitters/M bittersweet/MS bitty/TPR bitumen/M bituminous bivalent bivalve/SM bivouac/MS bivouacked bivouacking biweekly/SM biyearly biz/M bizarre/YP bk bl/D blab/SM blabbed blabber/DGS blabbermouth/M blabbermouths blabbing black/PXTGMDNRYS blackamoor/MS blackball/SMDG blackberry/SMG blackbird/SM blackboard/MS blackcurrant/S blacken/DG blackguard/SM blackhead/MS blacking/M blackish blackjack/MDGS blackleg/S blacklist/MDSG blackmail/MDRSZG blackmailer/M blackness/M blackout/SM blackshirts blacksmith/M blacksmiths blacksnake/SM blackthorn/SM blacktop/SM blacktopped blacktopping bladder/MS blade/MDS blag/S blagged blagging blah/M blahs/M blame/BMGDRS blameless/PY blamelessness/M blameworthiness/M blameworthy/P blammo/GDS blanch/GDS blancmange/MS bland/PTRY blandish/DSLG blandishment/MS blandness/M blank/TGPMDRYS blanket/GMDS blankness/M blare/MGDS blarney/SMDG blase blaspheme/ZGDRS blasphemer/M blasphemous/Y blasphemy/SM blast/ZGMDRS blaster/M blastoff/MS blat/S blatancy/SM blatant/Y blather/SMDG blaze/MZGDRS blazer/M blazon/MDGS bldg bleach/MDRSZG bleached/U bleacher/M bleak/TPRY bleakness/M blear blearily bleariness/M bleary/PRT bleat/GMDS bleed/ZGRS bleeder/M bleeding/M bleep/ZGMDRS bleeper/M blemish/GMDS blemished/U blench/DSG blend/ZGMDRS blender/M bless/GDSJ blessed/TRYP blessedness/M blessing/M bletch blew blight/ZGMDRS blimey blimp/MS blimpish blind/PZTGMDRYS blinder/M blindfold/GSMD blinding/Y blindness/M blindside/DSG blini/MS blink/ZGMDRS blinker/MDG blintz/MS blintze/M blip/SM bliss/M blissful/PY blissfulness/M blister/GMDS blistering/Y blistery blithe/PYTR blitheness/M blither/G blithesome blitz/GMDS blitzkrieg/MS blivet/S blizzard/SM bloat/ZGDRS bloatware/S blob/SM blobbed blobbing bloc/SM block's block/UGDS blockade/MZGDRS blockader/M blockage/MS blockbuster/SM blockbusting/M blocker/MS blockhead/SM blockhouse/MS blog/S blogged blogger blogging bloke/MS blokish blond/PTMRS blondish blondness/M blood/GMDS bloodbath/M bloodbaths bloodcurdling bloodhound/SM bloodied/U bloodily bloodiness/M bloodless/YP bloodlessness/M bloodletting/M bloodline/SM bloodmobile/SM bloodshed/M bloodshot bloodsport/S bloodstain/SMD bloodstock/M bloodstone bloodstream/MS bloodsucker/MS bloodsucking bloodthirstily bloodthirstiness/M bloodthirsty/TPR bloodworm bloody/PTGDRS bloodymindedness bloom/ZGMDRS bloomer/M bloop/ZGMDRS blooper/M blossom/GMDS blossomy blot/SM blotch/GMDS blotchy/TR blotted blotter/MS blotting blotto blouse/MGDS blow/SZGMR blower/M blowfly/SM blowgun/MS blowhard/MS blowhole/S blowlamp/S blown blowout/SM blowpipe/SM blowtorch/MS blowup/MS blowy/TR blowzy/RT blubber/GSMD blubbery bludgeon/MDGS blue/DRSPMTG bluebell/MS blueberry/SM bluebird/MS bluebonnet/SM bluebottle/SM bluefish/MS bluegill/MS bluegrass/M blueish bluejacket/MS bluejeans/M blueness/M bluenose/MS bluepoint/MS blueprint/GMDS bluestocking/MS bluesy/RT bluet/MS bluff/ZTGPMDRYS bluffer/M bluffness/M bluing/M bluish blunder/MDRZGJS blunderbuss/MS blunderer/M blunt/PTGDRYS bluntness/M blur/SM blurb/MS blurred blurriness/M blurring blurry/TRP blurt/GDS blush/ZGMDRS blusher/M blushing/UY bluster/MDRSZG blusterer/M blusterous blustery blvd boa/SM boar/SM board/JZGMDRS boarder/M boardgames boarding/M boardinghouse/SM boardroom/MS boardwalk/MS boast/ZGMDRS boaster/M boastful/PY boastfulness/M boat/SZGMDR boatclubs boater/M boathouse/MS boating/M boatload/S boatman/M boatmen boatswain/SM boatyard/S bob/SM bobbed bobbin/MS bobbing bobble/MGDS bobby/SM bobcat/MS bobolink/SM bobsled/SM bobsledded bobsledder/SM bobsledding bobsleigh/M bobsleighs bobtail/SM bobwhite/MS boccie/M bock/M bod/SMDG bodacious bode/S bodega/MS bodge/GDS bodice/MS bodiless bodily bodkin/MS body/DSM bodybuilder/MS bodybuilding/M bodyguard/MS bodysuit/SM bodywork/M boffin/S boffo bog/SM boga bogey/GMDS bogeyman/M bogeymen bogged bogging boggle/GDS boggling/Y boggy/TR bogometer/S bogon bogosity/S bogotify/DSG bogus bogyman/M bogymen bohemian/SM bohemianism/M boil/SJZGMDR boiled/U boiler/M boilermaker/SM boilerplate/M boink/GDS boisterous/YP boisterousness/M bola/SM bold/PTRY boldface/DM boldness/M bole/SM bolero/MS bolivar/MS bolivares boll/SM bollard/S bollix/GMDS bollocking/S bollocks bologna/M bolshie bolster/GMDS bolt's bolt/USGD bolthole/S bolus/MS bomb/SJZGMDR bombard/GDLS bombardier/MS bombardment/MS bombast/M bombastic bombastically bomber/M bombproof bombshell/SM bombsite/S bonanza/MS bonbon/MS bonce/S bond/SGMD bondage/M bondholder/MS bonding/M bondman/M bondmen bondsman/M bondsmen bondwoman/M bondwomen bone/DRSMZG bonehead/SMD boneless boner/M boneshaker/S bonfire/MS bong/SGMD bongo/MS bonhomie/M boniness/M bonito/MS bonk/SZGD bonnet/MS bonny/TR bonsai/MS bonus/MS bony/PTR boo/SMDHG boob/SGMD booby/SM boodle/MS booger/S boogie/MDS boogieing boogieman/M boohoo/GMDS book/SBJGMD bookbinder/MS bookbindery/SM bookbinding/M bookcase/MS booked/U bookend/MS bookie/MS booking/M bookish bookkeeper/MS bookkeeping/M booklet/MS bookmaker/SM bookmaking/M bookmark/SMDG bookmobile/SM bookplate/MS bookseller/SM bookshelf/M bookshelves bookshop/SM bookstall/S bookstore/MS bookwork bookworm/SM boom/SZGMDR boomerang/MDGS boon/SM boondocks/M boondoggle/MZGDRS boondoggler/M boonies/M boor/SM boorish/PY boorishness/MS boost/ZGMDRS booster/M boot's boot/ASGD bootblack/SM bootee/MS booth/M booths bootlace/S bootleg/MS bootlegged bootlegger/SM bootlegging/M bootless bootprints bootstrap/MS bootstrapped bootstrapping booty/SM booze/MZGDRS boozer/M boozy/TR bop/SM bopped bopping borax/M bordello/MS border/GMDS borderland/SM borderline/SM bore/DRSMZG boredom/M borehole/S borer/M boring/Y born/IAU borne boron/M borough/M boroughs borrow/SDRZGBJ borrower/M borrowing/M borscht/M borstal/S borzoi/SM bosh/M bosom's bosom/US bosomy/RT boson/S boss/DRSGM bossily bossiness/M bossism/M bossy/RTP bot/S botanic botanical/Y botanist/SM botany/M botch/DRSZGM botcher/M both bother/SMDG botheration bothersome bothy bottle/DRSMZG bottleneck/MS bottler/M bottom/SMDG bottomless bottommost botulism/M boudoir/SM bouffant/SM bougainvillea/SM bough/M boughs bought bouillabaisse/SM bouillon/MS boulder/SM boules boulevard/SM bounce/DRSMZG bouncer/M bouncily bounciness/M bouncy/RTP bound/ASMGD boundary/SM boundedness bounden bounder/SM boundless/YP boundlessness/M bounteous/PY bounteousness/M bountiful/PY bountifulness/M bounty/SM bouquet/SM bourbon/SM bourgeois/M bourgeoisie/M boustrophedon/S bout/MS boutique/SM boutonniere/SM bouzouki/MS bovine/SM bovver bow/ZGSMDR bowdlerization/MS bowdlerize/DSG bowed/U bowel/SM bower/M bowie bowl/MDRZGS bowleg/SM bowlegged bowler/M bowlful/SM bowline/SM bowling/M bowman/M bowmen bowsprit/SM bowstring/SM bowwow/SM box/ZGMDNRS boxcar/SM boxer/M boxful boxing/M boxlike boxroom/S boxtops boxwood/M boxy/RT boy/SM boycott/SGMD boyfriend/MS boyhood/SM boyish/YP boyishness/M boyscout boysenberry/SM bozo/MS bps bra/SM brace/MZGDRS braced/U bracelet/MS bracer/M bracero/MS bracing/Y bracken/M bracket/GMDS bracketed/U brackish/P brackishness/M bract/MS brad/SM bradawl/S brae/SM brag/SM braggadocio/MS braggart/SM bragged bragger/MS bragging braid/GMDS braiding/M braille/M brain/GMDS braincell/S brainchild/M brainchildren braininess/M brainless/YP brainpower brainstorm/GSMD brainstorming/M brainteaser/MS brainteasing brainwash/DSG brainwashing/M brainwave/S brainy/PTR braise/GDS brake/MGDS brakeman/M brakemen bramble/MS brambly/TR bran/M branch/GMDS branchlike brand/ZGMDRS branded/U brander/M brandish/DSG brandy/GDSM brash/PTRY brashness/M brass/MS brasserie/MS brassiere/MS brassily brassiness/M brassy/PTR brat/SM bratty/RT bratwurst/SM bravado/M brave/GPMYDTRS braveness/M bravery/M bravo/SM bravura/SM brawl/SDRZGM brawler/M brawn/M brawniness/M brawny/RTP bray/DGSM braze/DRSZG brazen/SDYGP brazenness/M brazer/M brazier/SM breach/GMDS bread/GMDHS breadbasket/SM breadboard/MS breadbox/MS breadcrumb/SM breadfruit/SM breadline/MS breadth/M breadths breadwinner/MS break/BMZGRS breakable/MS breakage/MS breakaway/MS breakdown/MS breaker/M breakfast/GMDS breakfront/MS breakneck breakout/MS breakpoints breakthrough/M breakthroughs breakup/SM breakwater/SM bream/MS breast/SMDG breastbone/MS breastfed breastfeed/GS breastplate/MS breaststroke/MS breastwork/SM breath/MDRSZGBJ breathalyze/ZGDRS breathe breather/M breathing/M breathless/PY breathlessness/M breaths breathtaking/Y breathy/RT breccias brecciated bred/I breech/MS breed/SRZGM breeder/M breeding/IM breeze/DSMG breezeway/SM breezily breeziness/M breezy/RTP brethren breve/SM brevet/SM brevetted brevetting breviary/SM brevity/M brew/MDRZGS brewer/M brewery/SM brewpub/SM bribe/DRSMZG briber/M bribery/M brick/SMDG brickbat/SM brickie/S bricklayer/MS bricklaying/M brickwork/M brickyard/S bridal/SM bride/SM bridegroom/SM bridesmaid/MS bridge/DSMG bridgeable/U bridged/U bridgehead/MS bridgework/M bridle/DSMG bridled/U bridleway/S brie/MZR brief's brief/CSDTGJ briefcase/SM briefer briefing/CM briefly briefness/M brier/M brig/MS brigade/SM brigadier/MS brigand/SM brigandage/M brigantine/SM bright/SPNRYXT brighten/DRZG brightener/M brightness/MS brights/M brill brilliance/M brilliancy/M brilliant/MYS brilliantine/M brim/MS brimful brimless brimmed brimming brimstone/M brindle/DM brine/M bring/SRZG bringer/M brininess/M brink/SM brinkmanship/M briny/RTP brio brioche/SM briquette/MS brisk/SDRYTGP brisket/SM briskness/M bristle/DSMG bristly/TR britches/M brittle/PRMT brittleness/M bro/SMH broach/MDSG broad/SMNRYXTP broadband/M broadcast/AMGS broadcaster/SM broadcasting/M broadcloth/M broaden/DG broadleaved broadloom/M broadminded/P broadness/M broadsheet/SM broadside/MGDS broadsword/MS brocade/DSMG broccoli/M brochette/SM brochure/MS brogan/SM brogue/SM broil/SMDRZG broiler/M broke/G broken/YP brokenhearted/Y brokenness/M broker/SMDG brokerage/MS brolly/S bromide/SM bromidic bromine/M bronc/SM bronchi bronchial bronchitic bronchitis/M bronchus/M bronco/SM broncobuster/MS brontosaur/SM brontosaurus/MS bronze/DSMG brooch/MS brood/SMDRZG brooder/M broodily brooding/MY broodmare/MS broody/RMPT brook/SMDG brooklet/SM broom/SM broomstick/MS broth/MRZ brothel/MS brother/MY brotherhood/SM brotherliness/M broths brougham/SM brought brouhaha/SM brow/MS browbeat/SNG brown/SMDRPTG brownfield brownie/MS brownish brownness/M brownout/SM brownstone/MS browse/DRSMZG browser/M brr bruin/SM bruise/DRSMZG bruised/U bruiser/M bruising/M bruit/SDG brunch/MDSG brunet/SM brunette/MS brunt/M brush/MDSG brushoff/SM brushstroke/S brushwood/M brushwork/M brushy brusque/RPYT brusqueness/M brutal/Y brutality/SM brutalization/M brutalize/GDS brute/SM brutish/PY brutishness/M bu bub/SM bubble/DSMG bubblegum/M bubbly/RMT bubo/M buboes bubonic buccaneer/SMDG buck/MDGS buckaroo/SM buckboard/MS bucket/SGMD bucketful/MS buckeye/MS buckle's buckle/UDSG buckler/MS buckminsterfullerene buckram/M bucksaw/MS buckshot/M buckskin/MS buckteeth bucktooth/MD buckwheat/M bucolic/MS bucolically bud/SM budded budding/S buddy/SM budge/DSG budgerigar/SM budget/SGMD budgetary budgie/SM buff/AMDGS buffalo/MDG buffaloes buffer/SMDG buffet/SMDGJ buffoon/SM buffoonery/M buffoonish bug's bug/CS bugaboo/SM bugbear/SM bugged/C bugger/SMDG buggery bugging/C buggy/RSMT bugle/DRSMZG bugler/M build/SMRZGJ builder/M building/M buildup/SM built/AI bulb/MS bulbous bulge/DSMG bulgy/RT bulimarexia/M bulimia/M bulimic/SM bulk/MDGS bulkhead/MS bulkiness/M bulky/RTP bull/MDGS bulldog/SM bulldogged bulldogging bulldoze/ZGDRS bulldozer/M bullet/SM bulletin/MDGS bulletproof/GSD bullfight/SMRZG bullfighter/M bullfighting/M bullfinch/MS bullfrog/MS bullhead/MDS bullheaded/YP bullheadedness/M bullhorn/MS bullion/M bullish/YP bullishness/M bullock/SM bullpen/SM bullring/MS bullshit/MS! bullshitted/! bullshitter's bullshitter/S! bullshitting/! bullwhip/S bully/DRSMTG bulrush/MS bulwark/MS bum/SM bumbag/S bumble/DRSZG bumblebee/SM bumbler/M bumf bummed bummer/SM bummest bumming bump/MDRZGS bumper/M bumph bumpiness/M bumpkin/MS bumptious/YP bumptiousness/M bumpy/PRT bun/SM bunch/MDSG bunchy/RT bundle/DSMG bundled/U bung/MDGS bungalow/MS bungee/SM bunghole/MS bungle/DRSMZG bungler/M bunion/SM bunk's bunk/CDGS bunker/SM bunkhouse/SM bunkum/M bunny/SM bunt/MDGSJ bunting/M buoy/MDGS buoyancy/M buoyant/Y bur/SMY burble/DSMG burbs/M burden's burden/USGD burdensome burdock/M bureau/SM bureaucracy/SM bureaucrat/SM bureaucratic bureaucratically bureaucratization/M bureaucratize/GDS burg/MRZS burgeon/DSG burger/M burgh/MRZ burgher/M burghs burglar/MS burglarize/GDS burglarproof burglary/SM burgle/DSG burgomaster/MS burgundy/SM burial/ASM buried/U burl/MDS burlap/M burlesque/MGDS burliness/M burly/RPT burn/MDRZGSBJ burnable/SM burned/U burner/M burnish/ZGMDRS burnisher/M burnoose/MS burnout/MS burnt/U burp/MDGS burr/MDGS burrito/MS burro/SM burrow/SMDRZG burrower/M bursa/M bursae bursar/SM bursary/SM bursitis/M burst/SMG bury/ADSG bus/AMS busboy/SM busby/SM bused busgirl/MS bush/MDSGJ bushel/SGMD bushfire bushiness/M bushing/M bushland bushman/M bushmaster/SM bushmen bushwhack/DRSZG bushwhacker/M bushy/RPT busily business/MS businesslike businessman/M businessmen businesspeople businessperson/MS businesswoman/M businesswomen busing/M busk/DRZGS buskin/SM busload/S busmen buss/MD bust/MDRZGS bustard/S buster/M bustle/DSMG busty/RZT busy/DRSTGP busybody/SM busyness/M busywork/M but/ACS butane/M butch/MRSZ butcher/MDG butchery/SM butler/SM butt/MDRZGS butte/SM butted/A butter/MDG butterball/MS buttercup/SM butterfat/M butterfingered butterfingers/M butterfly/GDSM buttermilk/M butternut/SM butterscotch/M buttery/TRSM butting/A buttock/SM button's button/USDG buttonhole/MGDS buttonwood/MS buttress/MDSG butty/S buxom/RT buy/ZGSMR buyback/SM buyer/M buyout/SM buzz/MDRSZG buzzard/MS buzzer/M buzzword/SM bx bxs by/M bye/SM bygone/SM bylaw/SM byline/SM bypass/GMDS bypath/M bypaths byplay/M byproduct/MS byre/S byroad/SM bystander/MS byte/MS byway/SM byword/SM byzantine c/IES ca cab/SMRZ cabal/MS cabala/M caballero/MS cabana/SM cabaret/SM cabbage/MS cabbed cabbing cabdriver/SM cabin/MS cabinet/SM cabinetmaker/SM cabinetmaking/M cabinetry/M cabinetwork/M cable/MGDS cablecast/MGS cablegram/MS cabochon/SM caboodle/M caboose/SM cabriolet/SM cabstand/SM cacao/MS cache/MGDS cachepot/SM cachet/MS cackle/MZGDRS cackler/M cacophonous cacophony/SM cacti cactus/M cad/SM cadaver/SM cadaverous caddish/YP caddishness/M caddy/GDSM cadence/DSM cadenza/SM cadet/MS cadge/ZGDRS cadger/M cadmium/M cadre/MS caducei caduceus/M caesura/SM cafe/SM cafeteria/MS cafetiere/S caff/CS caffeinated caffeine/M caftan/MS cage/DSMG cagey cagier cagiest cagily caginess/M cagoule/S cahoot/MS cairn/MS caisson/SM caitiff/SM cajole/ZGLDRS cajolement/M cajoler/M cajolery/M cake/DSMG cakewalk/SM cal calabash/MS calaboose/SM calamari/SM calamine/M calamitous/Y calamity/SM calcareous calciferous calcification/M calcify/GNDS calcimine/DSMG calcine/DSG calcite/M calcium/M calculable/I calculate/AXGNVDS calculated/Y calculating/Y calculation/AM calculator/MS calculi calculus/M caldera/SM calendar/MDGS calender/MDGS calf/M calfskin/M caliber/SM calibrate/GNDSX calibrated/U calibration/M calibrator/SM calico/M calicoes californium/M caliper/SGMD caliph/M caliphate/MS caliphs calisthenic/S calisthenics/M call/ASGMD calla/MS callable callback/MS called/U caller/MS calligrapher/SM calligraphic calligraphist/MS calligraphy/M calling/SM calliope/MS callosity/SM callous/PGDSY callousness/M callow/RPT callowness/M callus/MDSG calm/PSTGMDRY calmness/M caloric calorie/MS calorific calorimeter/S calorimetry calumet/MS calumniate/DSGN calumniation/M calumniator/MS calumnious calumny/SM calve/GDS calypso/MS calyx/MS cam/SM camaraderie/M camber/MDSG cambial cambium/SM cambric/M camcorder/SM came camel/MS camellia/MS cameo/MS camera/MS camerae cameraman/M cameramen camerawoman/M camerawomen camerawork camiknickers camisole/SM camomile's camouflage/MZGDRS camouflager/M camp's camp/CSTGD campaign/SMDRZG campaigner/M campanile/SM campanological campanologist/SM campanology/M camper/MS campfire/SM campground/SM camphor/M camping/M campsite/SM campus/MS campy/TR camshaft/SM can't can/SMDRJZG canal/MS canalization/M canalize/GDS canape/MS canard/MS canary/SM canasta/M cancan/MS cancel/DRSZG canceled/U canceler/M cancellation/MS cancer/MS cancerous candelabra/SM candelabrum/M candelas candid/RYPT candida candidacy/SM candidate/MS candidature/SM candidness/M candle/MZGDRS candlelight/M candlelit candlepower/M candler/M candlestick/SM candlewick/MS candor/M candy/GDSM candyfloss cane/SM canebrake/MS caner/M canine/MS canister/SM canker/GMDS cankerous cannabis/MS canned cannelloni/M cannery/SM cannibal/SM cannibalism/M cannibalistic cannibalization/M cannibalize/DSG cannily/U canniness/M canning cannon/GMDS cannonade/MGDS cannonball/SM cannot cannula canny/UTR canoe/MDS canoeing canoeist/SM canola/M canon/MS canonical/Y canonization/MS canonize/DSG canoodle/DSG canopy/GDSM canst cant's cant/CZRDGS cantabile cantaloupe/SM cantankerous/PY cantankerousness/M cantata/MS canteen/MS canter/CM cantered cantering canticle/MS cantilever/GSMD canto/MS canton/MLS cantonal cantonment/SM cantor/MS canvas/MGDS canvasback/SM canvass/MDRSZG canvasser/M canyon/MGS cap/SMDRBZ capabilities capability/IM capable/TR capably/I capacious/PY capaciousness/M capacitance/M capacities capacitive capacitor/SM capacity/IM caparison/MDSG cape/SM caper/GMD capeskin/M capillarity/M capillary/SM capital/MSY capitalism/M capitalist/SM capitalistic capitalistically capitalization/M capitalize/ADSG capitation/CSM capitol/SM capitulate/AGNXDS capitulation/AM caplet/MS capo/SM capon/MS capped/UA capping/UA cappuccino/SM caprice/SM capricious/YP capriciousness/M capsicum/SM capsize/DSG capstan/SM capstone/MS capsular capsule/DSMG capsulize/DSG capt captain/SMDG captaincy/SM caption/SMDG captious/YP captiousness/M captivate/DSGN captivation/M captivator/SM captive/SM captivity/SM captor/MS capture/ADSMG car/SMDRZG carafe/MS caramel/SM caramelize/GDS carapace/SM carat/MS caravan/SM caravansary/SM caravel/SM caraway/SM carbide/SM carbine/SM carbohydrate/MS carbolic carbon/MS carbonaceous carbonate/MGNDS carbonation/M carbonic carboniferous carbonize/GDS carbonyl carborundum/M carboy/MS carbuncle/SM carbuncular carburetor/MS carcass/MS carcinogen/SM carcinogenesis carcinogenic/SM carcinogenicity/M carcinoma/MS card/ESGMD cardamom/SM cardamon/S cardboard/M carder/MS cardholder/S cardiac cardie/S cardigan/SM cardinal/SMY cardinality cardiogram/MS cardiograph/M cardiographs cardioid cardiologist/SM cardiology/M cardiopulmonary cardiovascular cardsharp/MRZS cardsharper/M care/SM cared/U careen/DGS career/MDGS careerism careerist/SM carefree careful/YP carefuller carefullest carefulness/M caregiver/SM careless/YP carelessness/M carer/M caress/MDSG caret/MS caretaker/MS careworn carfare/M cargo/M cargoes carhop/MS caribou/SM caricature/MGDS caricaturisation caricaturist/MS caricaturization caries/M carillon/SM caring/M carious carjack/JSDRZG carjacker/M carjacking/M carload/SM carmine/SM carnage/M carnal/Y carnality/M carnation/IMS carnelian/MS carnival/MS carnivore/SM carnivorous/YP carnivorousness/M carny/SM carob/MS carol/ZGMDRS caroler/M carom/GMDS carotene/M carotid/SM carousal/SM carouse/DRSMZG carousel/SM carouser/M carp/SZGMDR carpal/MS carpel/MS carpenter/MDSG carpentry/M carper/M carpet/MDGS carpetbag/MS carpetbagged carpetbagger/MS carpetbagging carpeting/M carpi carpool/SMDG carport/SM carpus/M carrel/MS carriage/SM carriageway/S carrier/M carrion/M carrot/MS carroty/RT carry/ZGDRSM carryall/SM carrycot/S carryout carryover/MS carsick/P carsickness/M cart/SZGMDR cartage/M cartel/MS carter/M carthorse/SM cartilage/SM cartilaginous cartload/SM cartographer/MS cartographic cartography/M carton/MS cartoon/SMDG cartoonist/SM cartridge/MS cartwheel/GMDS carve/JZGDRS carver/M carvery/S carving/M caryatid/MS casaba/MS cascade/DSMG cascara/SM case/LDSJMG casebook/S cased/U caseharden/GSD casein/M caseload/MS casement/MS casework/ZMR caseworker/M cash/GMDS cashbook/MS cashew/MS cashier/GSMD cashless cashmere/M casing/M casino/MS cask/SM casket/MS cassava/SM casserole/DSMG cassette/MS cassia/MS cassock/SM cassowary/SM cast/ASGM castanet/MS castaway/MS caste/JMZRS castellated caster/M castigate/DSGN castigation/M castigator/MS casting/AM castle/MGDS castoff/SM castrate/GNXDS castration/M castrato casual/PMYS casualness/M casualty/SM casuist/SM casuistic casuistry/M cat/SM cataclysm/MS cataclysmal cataclysmic catacomb/SM catafalque/MS catalepsy/M cataleptic/SM catalog/ZGSMDR cataloger/M catalpa/SM catalysis/M catalyst/MS catalytic/M catalyze/GDS catamaran/SM catapult/GMDS cataract/MS catarrh/M catastrophe/SM catastrophic catastrophically catatonia/M catatonic/SM catbird/SM catboat/SM catcall/GSMD catch/ZGJLMRS catchall/MS catcher/M catchment/MS catchpenny catchphrase/MS catchup/M catchword/MS catchy/RT catechism/SM catechist/SM catechize/DSG categorical/Y categorization/MS categorize/GDS category/SM cater/ZGJDRS catercorner caterer/M caterpillar/MS caterwaul/GSMD catfish/MS catgut/M catharses catharsis/M cathartic/SM cathedral/SM catheter/SM catheterize/GDS cathode/SM cathodic catholic catholicity/M cation/MS cationic catkin/MS catlike catnap/MS catnapped catnapping catnip/M catsuit/S cattail/SM catted cattery/S cattily cattiness/M catting cattle/M cattleman/M cattlemen catty/TPR catwalk/SM caucus/MDSG caudal/Y caught/U cauldron/MS cauliflower/SM caulk/ZGMDRS caulker/M caulking/M causal/Y causality/SM causation/M causative cause/MZGDRS causeless causer/M causerie/SM causeway/SM caustic/SM caustically causticity/M cauterization/M cauterize/GDS caution/SMDG cautionary cautious/IY cautiousness/M cavalcade/MS cavalier/SMY cavalry/SM cavalryman/M cavalrymen cave/DRSMZG caveat/MS caveman/M cavemen cavern/MS cavernous/Y caviar/M cavil/ZGJMDRS caviler/M caving/M cavitation cavity/FSM cavort/DGS caw/SMDG cay/CSM cayenne/M cayman/MS cayuse/MS cc cease/CMGDS ceasefire/MS ceaseless/YP ceaselessness/M ceca cecal cecum/M cedar/MS cede/FAGSD ceder/MS cedilla/SM ceilidh ceilidhs ceiling/MS celandine/M celeb/S celebrant/SM celebrate/DSGNX celebrated/U celebration/M celebrator/SM celebratory celebrity/SM celeriac celerity/M celery/M celesta/MS celestial/Y celibacy/M celibate/MS cell/SMD cellar/MS cellist/SM cellmate/SM cello/MS cellophane/M cellphone/MS cellular/SM cellulite/M celluloid/M cellulose/M cement/MDRZGS cementer/M cementum/M cemetery/SM cenobite/MS cenobitic cenotaph/M cenotaphs censer/MS censor/MDGS censored/U censorial censorious/PY censoriousness/M censorship/M censure/BDRSMZG censurer/M census/MDSG cent's cent/AR centaur/SM centavo/SM centenarian/SM centenary/SM centennial/MYS center/MDGS centerboard/SM centerfold/SM centerpiece/SM centigrade centigram/SM centiliter/SM centime/SM centimeter/SM centipede/SM central/TSMRY centralism centralist centrality/M centralization/CM centralize/CDSG centralizer/SM centric/F centrifugal/Y centrifuge/MGDS centripetal/Y centrism/M centrist/MS centroid/S cents centurion/SM century/SM cephalic ceramic/SM ceramicist/SM ceramics/M ceramist/MS cereal/MS cerebellar cerebellum/SM cerebra cerebral cerebrate/GNDS cerebration/M cerebrum/MS cerement/MS ceremonial/SMY ceremonious/UY ceremoniousness/M ceremony/SM cerise/M cerium/M cermet/M cert/S certain/UYT certainer certainty/USM certifiable certifiably certificate/MGNXDS certification/M certify/DSG certitude/IM certitudes cerulean/M cervical cervices cervix/M cesarean/MS cesium/M cessation/MS cession/KAFSM cesspit/S cesspool/MS cetacean/MS cf cg ch/IFVT chad/S chafe/GDS chaff/GMDS chaffinch/MS chagrin/GSMD chain's chain/UGDS chainsaw/MDGS chair/GMDS chairlift/MS chairman/M chairmanship/MS chairmen chairperson/MS chairwoman/M chairwomen chaise/MS chalcedony/M chalet/MS chalice/SM chalk/GMDS chalkboard/SM chalkiness/M chalky/PRT challenge/DRSMZG challenged/U challenger/M challenging/Y challis/M chamber/SMD chamberlain/SM chambermaid/SM chamberpot/S chambray/M chameleon/SM chamois/M chamomile/MS champ/ZGMDS champagne/MS champion/GMDS championship/MS chance/MGDS chancel/SM chancellery/SM chancellor/SM chancellorship/M chancery/SM chanciness/M chancre/SM chancy/PRT chandelier/MS chandler/MS change/MZGDRS changeability/M changeable/P changeableness/M changeably changed/U changeless/Y changeling/SM changeover/SM changer/M changing/U channel/GSMD channelization/M channelize/GDS chanson/SM chant/ZGMDRJS chanter/M chanteuse/MS chantey/SM chanticleer/SM chantry/S chaos/M chaotic chaotically chap/SM chaparral/SM chapati/S chapatti/S chapbook/MS chapeau/SM chapel/MS chaperon/MDGS chaperonage/M chaperoned/U chaplain/MS chaplaincy/SM chaplet/SM chapped chapping chappy/S chapter/SM char/SM charabanc/MS character/MS characterful characteristic/MS characteristically/U characterization/MS characterize/GDS characterless charade/SM charbroil/GDS charcoal/MS chard/M chardonnay/SM charge/EAMGDS chargeable/A charged/U charger/SM charily chariness/M chariot/SM charioteer/SM charisma/M charismatic/SM charismatically charitable/P charitableness/M charitably/U charity/SM charlady/S charlatan/SM charlatanism/M charlatanry/M charlie/S charm/ZGMDRS charmer/M charming/TRY charmless charred charring chart/GMDS charted/U charter's charter/ASGD charterer/MS chartists chartreuse/M charwoman/M charwomen chary/TRP chase/MZGDRS chaser/M chasm/MS chassis/M chaste/PYTR chasten/DGS chasteness/M chastise/DRSZGL chastisement/MS chastiser/M chastity/M chasuble/SM chat/SM chateau/SM chatelaine/SM chatline/S chatted chattel/MS chatter/MDRZGS chatterbox/MS chatterer/M chattily chattiness/M chatting chatty/TPR chauffeur/MDGS chauvinism/M chauvinist/SM chauvinistic chauvinistically cheap/PXTNRY cheapen/DG cheapish cheapness/M cheapo cheapskate/SM cheat/ZGMDRS cheater/M check/AGMDS checkbook/SM checked/U checker/MDGS checkerboard/MS checkers/M checklist/MS checkmate/MGDS checkoff/SM checkout/SM checkpoint/SM checkroom/MS checkup/MS cheddar/M cheek/GMDS cheekbone/SM cheekily cheekiness/M cheeky/TPR cheep/GMDS cheer/ZGMDRS cheerer/M cheerful/YP cheerfuller cheerfullest cheerfulness/M cheerily cheeriness/M cheerio/MS cheerleader/MS cheerless/YP cheerlessness/M cheery/TPR cheese/MGDS cheeseboard/S cheeseburger/MS cheesecake/SM cheesecloth/M cheeseparing/M cheesiness/M cheesy/TPR cheetah/M cheetahs chef/SM chem chemical/SMY chemiluminescence chemiluminescent chemise/MS chemist/MS chemistry/M chemo/M chemosynthesis chemotherapeutic chemotherapy/M chemurgy/M chenille/M cherish/DSG cheroot/MS cherry/SM chert/M cherub/MS cherubic cherubim chervil/M chess/M chessboard/MS chessman/M chessmen chest/MDS chesterfield/MS chestful/SM chestnut/SM chesty/TR chevalier/SM cheviot/M chevron/MS chew/SBZGMDR chewer/M chewiness/M chewy/PTR chg chge chi/SM chiaroscuro/M chic/PTMR chicane/MS chicanery/SM chichi/TMRS chick/XMNS chickadee/SM chicken/MDG chickenfeed/M chickenhearted chickenpox/M chickenshit/S! chickpea/SM chickweed/M chicle/M chicness/M chicory/SM chide/GDS chiding/Y chief/TMRYS chiefdom/M chieftain/MS chieftainship/MS chiffon/M chiffonier/MS chigger/MS chignon/MS chihuahua/SM chilblain/SM child/M childbearing/M childbirth/M childbirths childcare/M childhood/SM childish/PY childishness/M childless/P childlessness/M childlike childminder/S childminding childproof/SGD children chili/M chilies chill/JPZTGMDRS chiller/M chilliness/M chilling/Y chillness/M chilly/TPRS chimaerical chime/MZGDRS chimer/M chimera/MS chimeric chimerical chimney/MS chimp/MS chimpanzee/MS chin/SM china/M chinaware/M chinchilla/MS chine/MS chink/GMDS chinless chinned chinning chino/MS chinstrap/MS chintz/M chintzy/RT chinwag/S chip/SM chipboard chipmunk/SM chipolata/S chipped chipper/MS chippie chipping/S chippy/S chiral chirography/M chiropodist/MS chiropody/M chiropractic/MS chiropractor/MS chirp/GMDS chirpily chirpy/PTR chirrup/GMDS chisel/ZGMDRS chiseler/M chit/SM chitchat/SM chitchatted chitchatting chitin/M chitinous chitterlings/M chivalric chivalrous/PY chivalrousness/M chivalry/M chive/MS chivvy/GDS chlamydia/MS chlamydiae chloral/M chlorate chlordane/M chloride/MS chlorinate/DSGN chlorination/M chlorine/M chlorofluorocarbon/MS chloroform/SMDG chlorophyll/M chloroplast/MS chloroquine chm choc/S chock/GMDS chockablock chocoholic/MS chocolate/MS chocolaty choice/MTRS choir/MS choirboy/MS choirmaster/MS choke/MZGDRS chokecherry/SM choker/M choler/M cholera/M choleric cholesterol/M choline chomp/ZGMDRS choose/ZGRS chooser/M choosiness/M choosy/TPR chop/SM chophouse/SM chopped chopper/MDGS choppily choppiness/M chopping choppy/TPR chopstick/SM choral/MYS chorale/MS chord/MS chordal chordate/SM chore/MS chorea/M choreograph/ZGDR choreographer/M choreographic choreographically choreographs choreography/M chorister/SM choroid/MS chortle/MZGDRS chortler/M chorus/GMDS chose chosen chow/SGMD chowder/MS chrism/M christen/ASGD christened/U christening/SM christian/U chroma chromatic chromatically chromaticism chromatin/M chromatographic chromatography chrome/MGDS chromite chromium/M chromosomal chromosome/MS chronic chronically chronicle/DRSMZG chronicled/U chronicler/M chronograph/M chronographs chronological/Y chronologist/SM chronology/SM chronometer/MS chronometric chrysalis/MS chrysanthemum/MS chub/SM chubbiness/M chubby/TPR chuck/GMDS chuckhole/SM chuckle/MGDS chuff/D chug/SM chugged chugging chukka/MS chum/SM chummed chummily chumminess/M chumming chummy/PTR chump/MS chunder/GDS chunk/MS chunkiness/M chunky/PTR chunter/DGS church/MS churchgoer/SM churchgoing/M churchman/M churchmen churchwarden/SM churchwoman churchwomen churchyard/SM churl/MS churlish/PY churlishness/M churn/ZGMDRS churner/M chute/MS chutney/MS chutzpa/M chutzpah/M chyme/M ciao/S cicada/MS cicatrice/SM cicerone/SM ciceroni cider's cider/S cigar/MS cigarette/MS cigarillo/MS cilantro/M cilia cilium/M cinch/GMDS cinchona/SM cincture/SM cinder/GMDS cine cinema/MS cinematic cinematographer/MS cinematographic cinematography/M cinnabar/M cinnamon/M cipher's cipher/CGDS cir circa circadian circle/MGDS circlet/MS circuit/MDGS circuital circuitous/YP circuitousness/M circuitry/M circuity/M circulant circular/SMY circularity/M circularize/GDS circulate/ADSGN circulation/SM circulatory circumcise/GNDSX circumcised/U circumcision/M circumference/SM circumferential circumflex/MS circumlocution/MS circumlocutory circumnavigate/XDSGN circumnavigation/M circumnavigational circumpolar circumscribe/DSG circumscription/SM circumspect/Y circumspection/M circumstance/DSMG circumstantial/Y circumvent/GDBS circumvention/MS circus/MS cirque/MS cirrhosis/M cirrhotic/SM cirri cirrus/M cistern/MS cit citadel/MS citation/AMS cite's cite/IAGSD citified citizen/MS citizenry/M citizenship/M citrate citric citron/MS citronella/M citrus/MS city/SM cityscape citywide civet/MS civic/S civics/M civil/UY civilian/MS civility/ISM civilization/SM civilize/GDS civilized/U civvies/M ck cl clack/GMDS clad/U cladding/M claim's claim/CKEAGDS claimable claimant/MS claimed/U claimer/CEMS clairvoyance/M clairvoyant/SM clam/SM clambake/MS clamber/ZGMDRS clamberer/M clammed clammily clamminess/M clamming clammy/PTR clamor/GMDS clamorous/Y clamp/GMDS clampdown/MS clan/SM clandestine/Y clang/ZGMDRS clangor/M clangorous/Y clank/GMDS clannish/P clannishness/M clansman/M clansmen clanswoman clanswomen clap/SM clapboard/MDSG clapped clapper/MS clapperboard/S clapping/M claptrap/M claque/MS claret/MS clarification/M clarify/NXDSG clarinet/SM clarinetist/SM clarion/MDGS clarity/M clash/GMDS clasp's clasp/UGDS class/GMDS classic/MS classical/MY classicism/M classicist/SM classifiable/U classification/CAM classifications classificatory classified's classified/U classifieds classifier/SM classify/ACSDGN classiness/M classless/P classmate/MS classroom/MS classwork/M classy/TRP clatter/GMDS clausal clause/MS claustrophobia/M claustrophobic clavichord/SM clavicle/MS clavier/MS claw/SGMD clay/SM clayey clayier clayiest claymore/S clean/BJPZTGDRYS cleaner/M cleaning/M cleanliness/UM cleanly/UTPR cleanness/UM cleanse/ZGDRS cleanser/M cleanup/MS clear/JPTGMDRYS clearance/SM clearheaded clearing/M clearinghouse/SM clearness/M clearway/S cleat/MS cleavage/MS cleave/ZGDRS cleaver/M clef/SM cleft/MS clematis/MS clemency/IM clement/Y clementine/S clench/GMDS clerestory/SM clergy/SM clergyman/M clergymen clergywoman/M clergywomen cleric/MS clerical/Y clericalism/M clerk/GMDS clerkship/M clever/PTRY cleverness/M clevis/MS clew/SGMD cliche/MDS click/ZGMDRS clicker/M client/MS clientele/MS cliff/MS cliffhanger/SM cliffhanging clifftop/S clii climacteric/M climactic climate/SM climatic climatically climatological climatologist/MS climatology/M climax/MDSG climb/SMDRZGB climbable/U climbdown climbed/U climber/M climbing/M clime/SM clinch/MDRSZG clincher/M cling/SMRZG clinger/M clingfilm clingy/RT clinic/SM clinical/Y clinician/SM clink/SMDRZG clinker/M cliometric/S cliometrician/SM cliometrics/M clip/SM clipboard/MS clipped clipper/SM clipping/SM clique/SM cliquey cliquier cliquiest cliquish/YP cliquishness/M clitoral clitorides clitoris/MS clix cloaca/M cloacae cloak's cloak/USDG cloakroom/MS clobber/SMDG cloche/SM clock/SMDG clockmaker clockwise clockwork/SM clod/MS cloddish clodhopper/MS clog's clog/US clogged/U clogging/U cloisonne/M cloister/SMDG cloistral clomp/SDG clonal clone/DSMG clonk/SMDG clop/MS clopped clopping close/DRSMYZTGJP closed/U closefisted closemouthed closeness/M closeout/MS closet/SMDG closeup/SM closing/M closure/ESM clot/MS cloth/M clothe/UDSG clotheshorse/SM clothesline/MS clothespin/SM clothier/MS clothing/M cloths clotted clotting cloture/SM cloud/SMDG cloudburst/SM clouded/U cloudiness/M cloudless cloudscape/S cloudy/RPT clout/SMDG clove/RSMZ cloven clover/M cloverleaf/MS clown/SMDG clownish/PY clownishness/M cloy/DGS cloying/Y club/MS clubbable clubbed clubber/S clubbing clubfeet clubfoot/MD clubhouse/SM clubland clubroom cluck/SMDG clue/MGDS clueless clump/SMDG clumpy/TR clumsily clumsiness/M clumsy/TRP clung clunk/SMDRZG clunker/M clunky/TR cluster/MDSG clutch/GMDS clutter/MDSG cluttered/U clvi clvii clxi clxii clxiv clxix clxvi clxvii cm cnidarian/MS co/ESD coach/MDSG coachload/S coachman/M coachmen coachwork coadjutor/MS coagulant/MS coagulate/GNDS coagulation/M coagulator/MS coal/MDGS coalesce/GDS coalescence/M coalescent coalface/MS coalfield/S coalition/MS coalitionist/MS coalmine/ZS coarse/RYTP coarsen/SDG coarseness/M coast/SMDRZG coastal coaster/M coastguard/S coastline/MS coat/MDGJS coating/M coatroom/S coattail/SM coauthor/MDGS coax/DRSZG coaxer/M coaxial coaxing/Y cob/SM cobalt/M cobber/S cobble/DRSMZG cobbler/M cobblestone/SM cobnut/S cobra/SM cobweb/SM cobwebbed cobwebby/RT coca/M cocaine/M cocci/S coccus/M coccyges coccyx/M cochineal/M cochlea/SM cochleae cochlear cock/MDGS cockade/SM cockamamie cockatoo/SM cockatrice/SM cockchafer/S cockcrow/SM cockerel/SM cockeyed cockfight/MGS cockfighting/M cockily cockiness/M cockle/SM cockleshell/SM cockney/SM cockpit/SM cockroach/MS cockscomb/SM cockshies cocksucker's cocksucker/S! cocksure cocktail/MS cocky/RTP coco/MS cocoa/SM coconut/SM cocoon/SMDG cod/ZSMR coda/MS codded codding coddle/DSG code's code/CAGDS codebreaker codeine/M codename/D codependency/M codependent/MS coder/CSM codeword/S codex/M codfish/MS codger/SM codices codicil/SM codification/M codifier/M codify/DRSNXZG codling codpiece/MS codswallop coed/MS coeducation/M coeducational coefficient/MS coelenterate/SM coequal/MYS coerce/XDRSZGNV coercer/M coercible coercion/M coeval/SMY coexist/DSG coexistence/M coexistent coextensive coffee/SM coffeecake/SM coffeehouse/MS coffeemaker/MS coffeepot/MS coffer/SM cofferdam/MS coffin/SMDG cog/SM cogency/M cogent/Y cogitate/DSXGNV cogitation/M cogitator/MS cognac/SM cognate/MS cognition/AM cognitional cognitive/Y cognizable cognizance/AM cognizant cognomen/SM cognoscente/M cognoscenti cogwheel/SM cohabit/SGD cohabitant/MS cohabitation/M coheir/SM cohere/DSG coherence/IM coherency/M coherent/IY cohesion/M cohesive/YP cohesiveness/M coho/MS cohort/SM coif/MS coiffed coiffing coiffure/DSMG coil's/A coil/UADGS coin/MDRZGS coinage/SM coincide/DSG coincidence/SM coincident coincidental/Y coiner/M coinsurance/M cointreau coir coital coitus/M coke/MGDS col/S cola/MS colander/SM cold/MRYTPS coldblooded coldish coldness/M coleslaw/M coleus/MS coley/S colic/M colicky coliseum/MS colitis/M coll collaborate/GNVXDS collaboration/M collaborationist collaborative/Y collaborator/SM collage/SM collagen collapse/MGDS collapsible collar/SMDG collarbone/SM collard/SM collarless collate/DSXGN collated/U collateral/MY collateralize collation/M collator/MS colleague/MS collect's collect/ASGVD collected/U collectedly collectible/SM collection/ASM collective/SMY collectivism/M collectivist/MS collectivity collectivization/M collectivize/GDS collector/MS colleen/SM college/SM collegial collegiality/M collegian/MS collegiate collide/DSG collie/RSMZ collier/M colliery/SM collimation collimator collinear collision/SM collisional collocate/MGNXDS collocation/M colloid/SM colloidal colloq colloquial/Y colloquialism/MS colloquies colloquium/SM colloquy/M collude/DSG collusion/M collusive cologne/SM colon/SM colonel/SM colonelcy/M colones colonial/SMY colonialism/M colonialist/SM colonic colonist/SM colonization/CAM colonizations colonize/CAGSD colonizer/MS colonnade/MDS colony/SM colophon/SM color's color/AEGDS colorant/SM coloration/EM coloratura/MS colorblind/P colorblindness/M colored's colored/U coloreds colorfast/P colorfastness/M colorful/PY colorfulness/M colorimetric coloring/SM colorist/S colorization/M colorize/DSG colorizing/C colorless/PY colorlessness/M colorway/S colossal/Y colossi colossus/M colostomy/SM colostrum/M colt/MS coltish columbine/SM column/SMD columnar columnist/SM com/JL coma/MS comae comaker/SM comatose comb/MDRZGJS combat/SMDGV combatant/SM combativeness/M combed/U comber/M combination/M combinatorial combine's combine/ADSG combined/U combiner/MS combings/M combo/SM combusted combustibility/M combustible/SM combustion/M combustive come/IMZGRS comeback/MS comedian/MS comedic comedienne/MS comedown/MS comedy/SM comeliness/M comely/RPT comer's comestible/SM comet/SM cometary comeuppance/MS comfit's comfit/ES comfort/ESMDG comfortable/UP comfortableness/M comfortably/U comforter/MS comforting/Y comfortless comfy/RT comic/SM comical/Y comicality/M coming/M comity/M comm comma/SM command/SMDRLZG commandant/MS commandeer/DGS commander/M commanding/Y commandment/SM commando/SM commemorate/XDSGNV commemoration/M commemorator/MS commence/ALDSG commencement/AM commencements commend/ASDBG commendably commendation/ASM commendatory commensurable/I commensurate/IY comment/GSMDR commentary/SM commentate/DSG commentator/SM commerce/M commercial/SMY commercialism/M commercialization/M commercialize/GDS commie/SM commingle/DSG commiserate/DSXGNV commiseration/M commissar/SM commissariat/MS commissary/SM commission's commission/ACGSD commissionaire/S commissioner/SM commit/AS commitment/MS committal/SM committed/AU committee/SM committeeman/M committeemen committeewoman/M committeewomen committing/A commode's commode/EIS commodious/Y commodity/SM commodore/SM common's common/UPRYT commonality/S commonalty/M commoner/MS commonness/UM commonplace/SM commons commonsense commonsensical commonweal/MH commonwealth/M commonwealths commotion/SM communal/Y communality commune/XDSMGN communicability/M communicable/I communicably communicant/SM communicate/XDSGNV communication/M communicative/P communicator/MS communion/M communique/SM communism/M communist/SM communistic communitarian community/SM commutation/MS commutative commutativity commutator/SM commute/BDRSMZG commuter/M comp/MDYGS compact/TGSMDRYP compaction/S compactness/M compactor/SM companion/SMB companionably companionship/M companionway/MS company/SM comparability/M comparable/I comparably/I comparative/SMY comparator/S compare/BDSMG comparison/MS compartment/MS compartmental compartmentalization/M compartmentalize/DSG compass/GMDS compassion/M compassionate/Y compatibility/ISM compatible/IMS compatibly/I compatriot/MS compeer/SM compel/S compelled compelling/Y compendious compendium/SM compensate/DSGNX compensated/U compensation/M compensator compensatory compere/DSG compete/DSG competence/IM competences competencies competency/IM competent/IY competition/MS competitive/UP competitively competitiveness/M competitor/SM compilable/U compilation's compilation/AS compile/BDRSZG compiler/M complacence/M complacency/M complacent/Y complain/DRZGS complainant/MS complainer/M complaining/UY complaint/SM complaisance/M complaisant/Y complected complement/MDGS complementarity complementary complete/PYTGNBXDRS completed/U completeness/IM completion/M complex/TMRSY complexion/MDS complexional complexity/SM compliance/M compliant/Y complicate/GDS complicated/Y complication/M complicit complicity/M compliment/MDSG complimentary/U comply/XDSNG compo/S component/SM comport/LSGD comportment/M compose/AECGSD composedly composer/MS composite/MYNSX composition/CSM compositional compositor/SM compost/SGMD composure/EM compote/SM compound/GMDBS compounded/U comprehend/SDG comprehensibility/IM comprehensible/I comprehensibly/I comprehension/IM comprehensions comprehensive/PMYS comprehensiveness/M compress's compress/CGVDS compressed/U compressibility compressible/I compression/CM compressional compressions compressor/SM comprise/GDS compromise/DSMG comptroller/SM compulsion/MS compulsive/PY compulsiveness/M compulsorily compulsory/SM compunction/MS computability computably computation/MS computational/Y compute/ADSBG computer/MS computerate computerization/M computerize/GDS computing/M comrade/SMY comradeship/M con/GSM concatenate/DSGNX concatenation/M concave/YP concaveness/M conceal/SDRZGBL concealed/U concealer/M concealment/M conceit/SMD conceited/PY conceitedness/M conceivability/I conceivable/I conceivably/I conceive/DSGB concentrate/MGNDSX concentration/M concentrator/S concentrically concept/SM conception/SM conceptional conceptual/Y conceptualization/MS conceptualize/GDS concern/UMD concerned/UY concerning concerns concert's concert/ESDG concerted/Y concertgoer/S concertina/SMDG concertize/DSG concertmaster/SM concerto/SM concessionaire/MS concessional concessionary conch/M conchie/S conchs concierge/MS conciliar conciliate/DSGN conciliation/AM conciliator/MS conciliatory concise/RPYTN conciseness/M concision/M conclave/SM conclude/DSG conclusion/MS conclusive/IPY conclusiveness/IM concoct/SDG concoction/MS concomitant/SMY concord/M concordance/MS concordant concordat/SM concourse/SM concrete/DSMYGNPX concreteness/M concretion/M concubinage/M concubine/MS concupiscence/M concupiscent concur/S concurred concurrence/MS concurrency concurring concuss/V concussion/MS condemn/SBDRZG condemnation/SM condemnatory condemner/M condensate/MNSX condensation/M condense/DRSZG condenser/M condescending/Y condescension/M condign condiment/MS condition's condition/AGSD conditional/SMY conditionality conditioned/U conditioner/SM conditioning/M condo/SM condolence/SM condom/SM condominium/SM condone/DSGB condor/SM conduce/DSGV conduct/SMV conductance/M conductibility/M conductible conduction/M conductivity/SM conductor/MS conductress/MS conduit/SM cone/M confab/SM confabbed confabbing confabulate/XGNDS confabulation/M confection/SMRZ confectioner/M confectionery/SM confectionist confederacy/SM confederate/M confer/SB conferee/SM conference/SMG conferral/M conferred conferrer/MS conferring confessed/Y confession/SM confessional/MS confessor/MS confetti/M confidant/MS confidante/SM confide/DRSZG confidence/SM confident/Y confidential/Y confidentiality/M confider/M confiding/Y configuration/AS configure/ABGDS confined/U confinement/SM confirm/ASDG confirmation/AMS confirmatory confirmed/U confiscate/GNXDS confiscation/M confiscator/SM confiscatory conflagration/SM conflate/XDSGN conflation/M conflict/SGMD conflicting/Y conflictual confluence/MS confluent confocal conformable/U conformal conformance/M conformational conformism/M conformist/SM conformity/M confounded/Y confrere/MS confrontation/SM confrontational confuse/BRZ confused/Y confusing/Y confutation/M confute/DSG conga/SMDG congeal/SLDG congealment/M conger/SM congeries/M congest/SDGV congestion/M conglomerate/XMGNDS conglomeration/M congrats/M congratulate/DSXGN congratulation/M congratulatory congregant/SM congregate/XDSGN congregation/M congregational congregationalism/M congregationalist/MS congress/MS congressional congressman/M congressmen congresspeople congressperson/MS congresswoman/M congresswomen congruence/SM congruency congruent/Y congruential congruity/ISM congruous conic/SM conical/Y conifer/SM coniferous conjectural conjecture/MGDS conjoint conjugacy conjugal/Y conjugate/DSXGN conjugation/M conjunct/VMS conjunctiva/MS conjunctive/MS conjunctivitis/M conjuration/SM conjure/DRSZG conjurer/M conk/MDRZ conman connect/AEDVGS connected/U connectedness connectible connection/ESM connectionless connective/SM connectivity/M connector/MS conned conning conniption/SM connivance/M connive/DRSZG conniver/M connoisseur/MS connoisseurship connotative connubial conquer/ASDG conquerable/U conquered/U conqueror/MS conquest/AM conquistador/SM cons/DSG consanguineous consanguinity/M conscienceless conscientious/PY conscientiousness/M conscionable/U conscious/UPY consciousness/UM consciousnesses conscription/M consecrate/ADSGN consecrated/U consecration/AM consecrations consecutive/Y consensus/MS consent/SMDG consequence/MS consequent/Y consequential/IY conservancy/SM conservation/MS conservationism/M conservationist/SM conservatism/M conservative/PMYS conservatoire/S conservator/SM conservatory/SM consider/AGSD considerable/I considerably considerate/IYNP considerateness/IM consideration/IAM considerations considered/U consign/ASDG consignee/MS consignment/SM consist/SDG consistence/MS consistency/ISM consistent/IY consistory/SM consolable/I consolation/SM consolatory consoled/U consolidate/GNXDS consolidated/U consolidation/M consolidator/SM consoling/Y consomme/M consonance/SM consonant/SMY consonantal consortia consortium/M conspectus/MS conspicuous/IPY conspicuousness/IM conspiracy/SM conspirator/SM conspiratorial/Y conspire/GD constable/SM constabulary/SM constancy/IM constant/MYS constellation/SM consternating consternation/M constipate/DSGN constipation/M constituency/SM constituent/MS constitute/ADSGNV constitution/AM constitutional/MYS constitutionalism constitutionalists constitutionality/UM constitutions constrained/U constraint/MS constrict/SGVD constriction/MS constrictor/SM construable construct's construct/CADVGS constructable construction/CASM constructional constructionist's constructionist/CS constructive/YP constructiveness/M constructivism constructivist constructor/SM construe/GDS consul/KSM consular/K consulate/SM consulship/M consult/AGD consultancy/SM consultant/MS consultation/SM consultative consults consumable/MS consume/BDRSZG consumed/U consumer/M consumerism/M consumerist/SM consummate/YGNDSX consummated/U consumption/SM consumptive/SM cont contact/ASDG contactable contagion/MS contagious/PY contagiousness/M contain/SBLDRZG containable/U container/M containerization/M containerize/GDS containment/M contaminant/SM contaminate/ACDSG contaminated/U contamination/CM contaminator/MS contd contemn/SDG contemplate/XGNVDS contemplation/M contemplative/SMY contemporaneity/M contemporaneous/Y contempt/M contemptible contemptibly contemptuous/YP contemptuousness/M contender/MS content/ESLMDG contented/EY contentedness/M contention/MS contentious/YP contentiousness/M contently contentment/EM conterminous/Y contestable/I contestant/MS contested/U contextualization contextualize/DSG contiguity/M contiguous/Y continence/IM continent/SM continental/SM contingency/SM contingent/SMY continua continuable continual/Y continuance/ESM continuation/ESM continue/EGDS continuity/ESM continuous/EY continuum/M contort/GD contortion/MS contortionist/SM contra/S contraband/M contraception/M contraceptive/SM contract/MDG contractible contractile contraction/S contractual/Y contradict/DGS contradiction/SM contradictorily contradictory contradistinction/SM contraflow/S contrail/MS contraindicate/GNDSX contraindication/M contralto/SM contraption/SM contrapuntal/Y contrariety/M contrarily contrariness/M contrariwise contrary/SMP contrast/MDGVS contrasting/Y contrasty contravene/GDS contravention/SM contretemps/M contribute/GNDX contribution/M contributor/SM contributory contrition/M contrivance/SM contrive/ZGDRS contriver/M control's control/CS controllable/U controlled/UC controller/MS controlling/C controversial/UY controversy/SM controvert/DGS controvertible/I contumacious/Y contumacy/M contumelious contumely/SM contuse/XDSGN contusion/M conundrum/SM conurbation/SM convalesce/GDS convalescence/MS convalescent/SM convect/GVSD convection/M convectional convector/S convene/ADSG convener/MS convenience/IMS convenient/IY convent/SM conventicle/SM convention/MS conventional/UY conventionalism conventionalist conventionality/UM conventionalize/GDS conventioneer/S convergence/SM convergent conversant conversation/MS conversational/Y conversationalist/SM conversazione converse/Y convert's convert/AGSD converted/U converter/SM convertibility/M convertible/SM convex/Y convexity/M convey/SBDG conveyance/MGS conveyor/MS convict/GSMD conviction/SM convince/GDS convinced/U convincing/UY convivial/Y conviviality/M convoke/DSG convoluted convolution/MS convolve/D convoy/SMDG convulse/GNVXDS convulsion/M convulsive/Y cony/SM coo/GSMD cook's cook/ADGS cookbook/MS cooked/U cooker/SM cookery/SM cookhouse/S cookie/SM cooking/M cookout/SM cookware/SM cool/MDRYZTGPS coolant/SM cooler/M coolie/SM coolness/M coon/SM! coonskin/MS coop/MDRZGS cooper/MDG cooperage/M cooperate/DSGNV cooperation/M cooperative/PSMY cooperativeness/M cooperator/MS coordinate/MYGNDS coordinated/U coordination/M coordinator/SM coot/MS cootie/SM cop/GJSMD copacetic copay/M cope/MS copier/M copilot/SM coping/M copious/PY copiousness/M coplanar copped copper/SM copperhead/MS copperplate/M coppery copping copra/M coprocessor/S coprolite coprophagous copse/SM copter/SM copula/SM copulate/XGNVDS copulation/M copulative/SM copulatory copy/DRSMZGB copybook/SM copycat/MS copycatted copycatting copyist/MS copyleft/S copyright/SGMDB copywriter/SM coquetry/SM coquette/DSMG coquettish/Y cor coracle/SM coral/SM coralline corbel/SM cord/EASGDM cordage/M cordial/SMY cordiality/M cordillera/MS cordite/M cordless cordon/SMDG cordovan/M corduroy/MS corduroys/M core/MZGDRS coreligionist/S corer/M corespondent/SM corgi/SM coriander/M cork's cork/UDGS corkage corker/SM corkscrew/SMDG corm/MS cormorant/SM corn/MDRZGS cornball/MS cornbread/M corncob/MS corncrake/S cornea/SM corneal corner/GMD cornerstone/SM cornet/SM cornfield/S cornflake/S cornflakes/M cornflour cornflower/MS cornice/MS cornily corniness/M cornmeal/M cornrow/MDGS cornstalk/SM cornstarch/M cornucopia/MS corny/PRT corolla/MS corollary/SM corona/SM coronal/MS coronary/SM coronation/SM coroner/MS coronet/MS corp corpora corporal/SM corporate/SN corporately corporation/IM corporations corporatism corporatist corporeal/Y corporeality/M corps/MS corpse/M corpsman/M corpsmen corpulence/M corpulent corpus/M corpuscle/MS corpuscular corr corral/SM corralled corralling correct/DRYTGVSBP correctable/U corrected/U correction/MS correctional corrective/MS correctness/IM corrector/S correlate/DSXMGNV correlated/U correlation/M correlative/SM correspond/SDG correspondence/MS correspondent/SM corresponding/Y corridor/SM corrie/S corrigenda corroborate/GNVXDS corroborated/U corroboration/M corroborator/SM corroboratory corrode/GDS corrosion/M corrosive/SMY corrugate/GNXDS corrugation/M corrupt/DRYPSTG corrupted/U corruptibility/IM corruptible/I corruption/SM corruptness/M corsage/MS corsair/MS corset/SGMD cortege/MS cortex/M cortical cortices corticosteroid/S cortisol cortisone/M corundum/M coruscate/GNDS coruscation/M corvette/SM cos/M cosh/DSG cosign/ZGSDR cosignatory/SM cosigner/M cosine/SM cosmetic/SM cosmetically cosmetician/SM cosmetologist/MS cosmetology/M cosmic cosmical/Y cosmogonist/SM cosmogony/SM cosmological/Y cosmologist/MS cosmology/SM cosmonaut/SM cosmopolitan/SM cosmopolitanism/M cosmos/MS cosponsor/SGMD cossacks cosset/SGD cossetted cossetting cost/MYGSJ costar/SM costarred costarring costless costliness/M costly/PTR costume/MZGDRS costumer/M costumier/S cot/SM cotangent/MS cote/MS coterie/MS coterminous cotillion/SM cottage/MZGRS cottager/M cotter/SM cotton/SGMD cottonmouth/M cottonmouths cottonseed/SM cottontail/SM cottonwood/SM cottony cotyledon/MS couch/MDSG couchette/S cougar/SM cough/MDG coughs could couldn't coulee/SM coulis coulomb/MS council/MS councilman/M councilmen councilor/MS councilperson/SM councilwoman/M councilwomen counsel/JMDGS counselor/MS count/ERBZGDMS countability/E countable/U countably/U countdown/MS counted/U countenance's countenance/EGDS counter/EM counteract/GVSD counteraction/MS counterargument/S counterattack/MDGS counterbalance/DSMG counterblast/S counterclaim/SGMD counterclockwise counterculture/SM countered counterespionage/M counterexample/S counterfeit/ZGMDRS counterfeiter/M counterfoil/MS countering counterinsurgency/SM counterintelligence/M counterman/M countermand/MDGS countermeasure/SM countermen counteroffensive/MS counteroffer/SM counterpane/MS counterpart/MS counterpoint/MDGS counterpoise/MGDS counterproductive counterrevolution/MS counterrevolutionary/SM countersign/GMDS countersignature/MS countersink/GMS counterspy/SM counterstrike countersunk countertenor/MS countervail/GDS counterweight/MS countess/MS countless countrified country/SM countryman/M countrymen countryside/MS countrywide countrywoman/M countrywomen county/SM countywide coup's coup/AS coupe/SM couple's couple/CUDSG coupler/S couplet/MS coupling/SM coupon/SM courage/M courageous/YP courageousness/M courgette/S courier/MDSG course/EDGMS coursebook/S courser/MS coursework court/SMDYG courteous/EY courteousness/M courtesan/SM courtesy/ESM courthouse/MS courtier/SM courtliness/M courtly/PRT courtroom/MS courtship/MS courtyard/MS couscous/M cousin/SMY couture/M couturier/MS covalent/Y covariance/S cove/MS coven/SM covenant/MDSG cover's cover/AEUGDS coverage/MS coverall/MS covering's coverings coverlet/MS coversheet covert/SPMY covertness/M covet/SDG covetous/YP covetousness/M covey/SM cow/ZGSMDR coward/SMY cowardice/M cowardliness/M cowbell/MS cowbird/MS cowboy/SM cowcatcher/MS cower/DG cowgirl/MS cowhand/MS cowherd/MS cowhide/MS cowl/MDGSJ cowlick/MS cowling/M cowman/M cowmen coworker/MS cowpat/S cowpoke/MS cowpox/M cowpuncher/SM cowrie/SM cowshed/S cowslip/SM cox/GDS coxcomb/MS coxswain/MS coy/TPRY coyness/M coyote/SM coypu/SM cozen/SDG cozenage/M cozily coziness/M cozy/RSMTP cpd cpl cps crab/MS crabbed crabber/SM crabbily crabbiness/M crabbing crabby/PRT crabgrass/M crablike crabwise crack/SMDRYZGBJ crackable/U crackdown/MS cracker/M crackerjack/MS crackhead/MS crackle/DSJMG crackling/M crackly/TR crackpot/MS crackup/SM cradle/DSMG craft/SMDG craftily craftiness/M craftsman/M craftsmanship/M craftsmen craftspeople craftswoman/M craftswomen crafty/RTP crag/MS cragginess/M craggy/RPT cram/S crammed crammer/S cramming cramp/SMDG cramping/M crampon/SM cranberry/SM crane/DSMG cranial cranium/SM crank/SMDRTG crankcase/SM crankily crankiness/M crankshaft/MS cranky/PRT cranny/DSM crap/MS crape/SM crapped crapper/S crappie/RSMT crapping crappy craps/M crapshooter/SM crash/MDRSZG crashing/Y crass/RYTP crassness/M crate/DRSMZG crater/MDG cravat/SM crave/DSGJ craven/SMYP cravenness/M craving/M craw/MS crawdad/SM crawl/SMDRZG crawler/M crawlspace/MS crawly/TRSM cray/S crayfish/MS crayola/S crayon/GSMD craze/DSMG crazily craziness/M crazy/PRSMT creak/SMDG creakily creakiness/M creaky/RPT cream/SMDRZG creamer/M creamery/SM creamily creaminess/M creamy/RPT crease/ICGMSD creased/U creatable create/KADSGNV created/U creation's/K creation/ASM creationism/SM creationist/SM creative/SMYP creativeness/M creativity/M creator/MS creature/SM creche/SM cred credence/M credential/GSMD credenza/SM credibility/IM credible/I credibly/I credit/EGSBMD creditability creditably/E credited/U creditor/SM creditworthy/P credo/SM credulity/IM credulous/IY credulousness/M creed/SM creek/SM creel/SM creep/SMRZG creeper/M creepily creepiness/M creepy/TPR cremains/M cremate/GNDSX cremation/M crematoria crematorium/SM crematory/SM creme/SM crenelate/GNXDS crenelation/M creole/SM creosote/MGDS crepe/SM crept crepuscular crescendo/CSM crescent/MS cress/M crest/SMDG crestfallen crestless cretaceous cretin/SM cretinism/M cretinous cretonne/M crevasse/SM crevice/MS crew/MDGS crewel/M crewelwork/M crewman/M crewmen crib/MS cribbage/M cribbed cribber/MS cribbing crick/SMDG cricket/MRSZG cricketer/M crier/M crikey crime/SM criminal/MYS criminality/M criminalization/C criminalize/CGDS criminological criminologist/MS criminology/M crimp/SMDG crimson/SMDG cringe/DSMG crinkle/DSMG crinkly/RT crinoline/SM cripes cripple/DRSMZG crippler/M crippleware/S crippling/Y crises crisis/M crisp/SMDRYTGP crispbread/S crispiness/M crispness/M crispy/PRT crisscross/MDSG criteria criterion/M critic/SM critical/UY criticism/MS criticize/ZGDRS criticizer/M critique/MGDS critter/SM croak/SMDG croaky/RT crochet/SMDRZG crocheter/M crocheting/M crock/SMD crockery/M crocodile/SM crocus/MS croft/SRZG croissant/MS crone/SM crony/SM cronyism/M crook/SMDG crooked/PTRY crookedness/M crookneck/SM croon/SMDRZG crooner/M crop/MS cropland/SM cropped cropper/MS cropping croquet/MDG croquette/SM crosier/MS cross's cross/AUGTSD crossbar/SM crossbeam/MS crossbones/M crossbow/SM crossbowman/M crossbowmen crossbred crossbreed/SMG crosscheck/SGMD crosscurrent/SM crosscut/SM crosscutting crosser crossfire/MS crosshatch/DSG crossing/SM crossly crossness/M crossover/MS crosspatch/MS crosspiece/SM crossroad/MS crossroads/M crosstalk crosstown crosswalk/MS crosswind/MS crosswise crossword/MS crotch/MS crotchet/SM crotchety/P crotchless crouch/GMDS croup/M croupier/M croupy/ZTR crouton/MS crow/MDGS crowbar/MS crowd/SMDG crowded/U crowfeet crowfoot/M crown/SMDG crowned/U crucial/Y cruciate crucible/SM crucifiable crucifix/MS crucifixion/MS cruciform/SM crucify/DSG crud/M cruddy/TR crude/RMYTP crudeness/M crudites/M crudity/SM cruel/RYPT cruelness/M cruelty/SM cruet/SM cruft/SDG crufty/S cruise/DRSMZG cruiser/M cruller/MS crumb/SMDYG crumble/MGDS crumbliness/M crumbly/TPR crumby/TR crumminess/M crummy/PTR crumpet/MS crumple/MGDS crunch/ZGMDRS crunchiness/M crunchy/TRP crupper/MS crusade/MZGDRS crusader/M cruse/SM crush/MDRSZG crusher/M crushing/Y crust/SMDG crustacean/SM crustal crustily crustiness/M crusty/TRP crutch/MS crux/MS cry/ZGJDRSM crybaby/SM cryogenic/S cryogenics/M cryonics cryostat cryosurgery/M crypt's crypt/CS cryptanalysis cryptanalyst cryptanalytic cryptic cryptically cryptogram/SM cryptographer/MS cryptographic cryptographically cryptography/M cryptology crystal/SM crystalline crystallization/M crystallize/ADSG crystallographer/S crystallographic crystallography ct ctn ctr cu cub/ZGSJMDR cubbyhole/MS cube/MS cuber/M cubic cubical/Y cubicle/MS cubing/GD cubism/M cubist/SM cubit/SM cuboid/S cuckold/MDSG cuckoldry/M cuckoo/SM cucumber/SM cud/SM cuddle/DSMG cuddly/TRP cudgel/SGMDJ cue/DSMG cuff/MDGS cuisine/SM culinary cull/MDGS culminate/DSXGN culmination/M culotte/SM culpability/M culpable/I culpably culprit/SM cult/MS cultism/M cultist/MS cultivable cultivate/DSBXGN cultivated/U cultivation/M cultivator/MS cultural/Y culture/MGDS cultured/U culvert/MS cum/SM cumber/SDG cumbersome/PY cumbersomeness/M cumbrous cumin/M cummerbund/MS cumming cumulative/Y cumuli cumulonimbi cumulonimbus/M cumulus/M cuneiform/M cunnilingus/M cunning/MRYT cunt/SM! cup/SM cupboard/SM cupcake/MS cupful/SM cupid/SM cupidinously cupidity/M cupola/SMD cuppa/S cupped cupping cupric cur/SMY curability/M curacao curacy/SM curare/M curate/DSMGV curative/MS curator/KMS curatorial curatorships curb/MDGS curbing/M curbside curbstone/SM curd/MS curdle/DSG cure's cure/KZGBDRS cured/U curer/KM curettage/M curfew/SM curia/M curiae curial curie/SM curio/SM curiosity/SM curious/RYTP curiousness/M curium/M curl's curl/UDGS curler/SM curlew/SM curlicue/DSMG curliness/M curling/M curly/RPT curmudgeon/MYS currant/MS currency/SM current's current/FAY currents curricle curricula curricular curriculum/M curry/DSMG currycomb/SGMD curse/DSMGV cursed/TRY cursive's cursive/EAY cursor/SM cursorily cursoriness/M cursory/P curt/RYTP curtail/GDSL curtailment/MS curtain/GMDS curtness/M curtsy/GDSM curvaceous/P curvaceousness/M curvature/SM curve/DSMG curvilinear curvy/RT cushion/MDSG cushy/RT cusp/MS cuspid/SM cuspidor/SM cuss's cuss/EFGSD cussed/PY custard/MS custodial custodian/MS custodianship/M custody/M custom/SZMR customarily customary/U customer/M customhouse/MS customization/MS customize/DSGB cut/TSMR cutaneous cutaway/MS cutback/MS cute/YP cuteness/M cutesy/TR cutey/S cuticle/MS cutie/SM cutlass/MS cutler/SM cutlery/M cutlet/SM cutoff/SM cutout/SM cutter/SM cutthroat/SM cutting/MYS cuttle cuttlefish/MS cutup/SM cutworm/MS cw cwt cyan/M cyanide/M cyanogen cybercafe/S cybernetic/S cybernetics/M cyberpunk/SM cyberspace/MS cyborg/SM cyclamen/MS cycle/ADSMG cycleway/S cyclic cyclical/Y cyclist/MS cycloid cyclometer/MS cyclone/MS cyclonic cyclopedia/MS cyclopes cyclops/M cyclotron/MS cygnet/MS cylinder/MS cylindrical/Y cymbal/MS cymbalist/MS cynic/SM cynical/Y cynicism/M cynosure/MS cypress/MS cyst/MS cysteine cystic cystitis cytochrome cytological cytologist/MS cytology/M cytoplasm/M cytoplasmic cytosine/M cytotoxic czar/MS czarina/SM czarism czarist/SM d'Arezzo d'Estaing d/NXGJ dB dab/SM dabbed dabber/MS dabbing dabble/ZGDRS dabbler/M dace/SM dacha/MS dachshund/MS dactyl/MS dactylic/MS dad/SM dadaism/M dadaist/MS daddy/SM dado/M dadoes daemon/MS daemonic daffiness/M daffodil/SM daffy/PTR daft/PTRY daftness/M dag/S dagger/MS dago/S dagoes daguerreotype/DSMG dahlia/MS dailiness/M daily/PSM daintily daintiness/M dainty/RSMTP daiquiri/MS dairy/GSM dairying/M dairymaid/MS dairyman/M dairymen dairywoman/M dairywomen dais/MS daisy/SM dale/SM dalesman dalliance/MS dallier/M dally/ZGDRS dalmatian/MS dam/SM damage/MGDS damageable damaged/U damages/M damaging/Y damask/MDGS dame/SM dammed damming dammit damn/SBGMD damnably damnation/M damned/TR damning/Y damp/SPXZTGMDNRY dampen/ZGDR dampener/M damper/M dampness/M damsel/MS damselfly/SM damson/MS dance/MZGDRS danceable dancer/M dancing/M dandelion/SM dander/M dandify/GDS dandle/GDS dandruff/M dandy/TRSM dang/SZGDR danger/M dangerous/PY dangle/ZGDRS dangler/M danish/MS dank/PTRY dankness/M danseuse/MS dapper/TR dapple/MGDS dare/DRSMZG daredevil/MS daredevilry/M darer/M daresay daring/MY dark/PXTMNRY darken/ZGDR darkener/M darkie/S darkish darkly/TR darkness/M darkroom/MS darling/MS darn/SZGMDR darned/TR darner/M dart/SZGMDR dartboard/MS darter/M dash/ZGMRS dashboard/SM dasher/M dashiki/MS dashing/Y dastard/MYS dastardliness/M data database/SM date/DRSBMZGV datebook/S dated/U dateless dateline/MGDS dater/M dative/MS datum/MS daub/SZGMDR dauber/M daughter/SMY daunt/GDS daunting/Y dauntless/YP dauntlessness/M dauphin/MS davenport/MS davit/MS dawdle/ZGDRS dawdler/M dawn/SGMD day/SM daybed/MS daybreak/M daycare/M daydream/MDRZGS daydreamer/M daylight/MS daylights/M daylong daysack daytime/M daze/DSMG dazed/Y dazzle/MZGDRS dazzler/M dazzling/Y db dbl dc dd/SDG dded/K dding/K deacon/MS deaconess/MS dead/PXTMNRY deadbeat/MS deadbolt/SM deaden/GD deadhead/SDG deadline/SM deadliness/M deadlock/GSMD deadly/TPR deadpan/MS deadpanned deadpanning deadwood/M deaf/PXTNR deafen/GD deafening/Y deafness/M deal/SJZGMR dealer/M dealership/MS dealing/M dealt dean/M deanery/SM deanship/M dear/SPTMRYH dearest/S dearness/M dearth/M dearths deary/SM death/MY deathbed/SM deathblow/MS deathless/Y deathlike deathly/RT deaths deathtrap/MS deathwatch/MS deaves deb/SM debacle/MS debarkation/M debarment/M debate/BMZR debater/M debating/M debauch/MDSG debauchee/MS debauchery/SM debenture/MS debilitate/GNDS debilitation/M debility/SM debit/D debonair/PY debonairness/M debouch/GDS debris/M debt/SM debtor/MS debugger/S debut/GMD debutant debutante/SM decade/MS decadence/M decadency/M decadent/MYS decaf/MS decaffeinate/GDS decagon/MS decal/MS decampment/M decapitate/XDSGN decapitator/MS decathlete/S decathlon/SM decay/GD deceased/M decedent/MS deceit/MS deceitful/PY deceitfulness/M deceive/UGDS deceiver/MS deceiving/Y decelerate/XDSGN deceleration/M decelerator/MS decency/ISM decennial/SM decent/ITRY deception/MS deceptive/YP deceptiveness/M decibel/MS decidability/U decidable/U decide/BZGDRS decided/Y deciduous deciles deciliter/MS decimal/SM decimalization decimalize decimate/DSGN decimation/M decimeter/MS decipherable/IU decipherment/S decision/IM decisions decisive/IPY decisiveness/IM deck/SGMD deckchair/S deckhand/SM deckle/S declamation/SM declamatory declaration/SM declarative declaratory declare/DRSZGB declared/U declarer/M declension/SM declination/MS decline/DRSMZG decliner/M declivity/SM deco decolletage/MS decollete decompose/B decongestant/MS deconstruct/V deconstructionism deconvolution deconvolve decor/MS decorate/AGNVDS decorated/U decorating/M decoration/AM decorations decorative/Y decorator/MS decorous/IY decorousness/M decorum/M decoupage/DSMG decoy/GMDS decreasing/Y decree/MDS decreeing decrement/GDS decremental decrepit decrepitude/M decriminalization/M decry/GDS decrypt/GD decryption decustomised dedicate/AGDS dedication/SM dedicator/SM dedicatory deduce/GDS deducible deductible/SM deduction/SM deductive/Y deed/GD deejay/MS deem/ASGD deep/SPXTMNRY deepen/GD deepish deepness/M deer/SM deerskin/M deerstalker/S deerstalking def/Z defacement/M defacer/SM defaecate defalcate/XDSGN defalcation/M defamation/M defamatory defame/ZGDRS defamer/M defaulter/SM defeat/MDRZGS defeated/U defeater/M defeatism/M defeatist/MS defecate/GNDS defecation/M defect/MDGVS defection/MS defective/MYSP defectiveness/M defector/MS defendant/SM defended/U defenestrate/NDX defense/DSMGV defenseless/PY defenselessness/M defensibility defensible/I defensibly/I defensive/MYP defensiveness/M deference/M deferential/Y deferral/MS deferred deferring deffer deffest defiant/Y defibrillator/S deficiency/SM deficient deficit/SM defiled/U defilement/M definable/IU definably/I define/AGDRS defined/U definer/MS definite/IYVP definiteness/IM definition/ASM definitional definitive/PY deflate/GNBDS deflation/M deflationary deflect/DGVS deflection/MS deflector/SM defogger/SM defoliant/SM defoliate/DSGN defoliation/M defoliator/MS deform/B deformity/SM defraud/DRZGS defrauder/M defrayal/M defrock/DG defroster/MS deft/PTRY deftness/M defunct defy/GDS deg degauss/GD degeneracy/SM degenerate/MV degrade/B degrease degree/MS dehydrator/SM deicer/MS deictic deification/M deify/NGDS deign/GDS deist/MS deistic deity/SM deject/GDS dejected/Y dejection/M delay/ZDR delectable delectably delectation/M delegate/GD delete/BXGNDRS deleterious/Y deletion/M delft/M delftware/M deli/SM deliberate/YVPX deliberateness/M delicacy/ISM delicate/IY delicateness/M delicatessen/SM delicious/YP deliciousness/M delighted/Y delightful/Y deliminator/S delineate/GNDSX delineation/M delinquency/SM delinquent/SMY deliquesce/GDS deliquescent delirious/PY deliriousness/M delirium/SM deliver/ADGS deliverable/U deliverance/M delivered/U deliverer/SM dell/SM delphinium/MS delta/MS deltoids delude/GDS deluge/MGDS delusion/MS delusional delusive/Y deluxe delve/ZGDRS delver/M demagogic demagogically demagogue/SM demagoguery/M demagogy/M demand/GMDS demanding/U demarcate/XDSGN demarcation/M demean/GDS demeanor/M demented/Y dementia/M demesne/MS demigod/MS demigoddess/MS demijohn/SM demimondaine/SM demimonde/M demise/MGDS demitasse/MS demo/GMD democracy/SM democrat/MS democratic/U democratically/U democratization/M democratize/DSG demode demodulator demographer/MS demographic/MS demographically demographics/M demography/M demolish/DRSG demolition/MS demon/MS demonetization/M demoniac demoniacal/Y demonic demonically demonize/GDS demonology/SM demonstrability demonstrable/I demonstrably demonstrate/GNVXDS demonstration/M demonstrative/SMYP demonstrativeness/M demonstrator/SM demote/GD demotic demount/BG demulcent/SM demur/TMRS demure/PY demureness/M demurral/SM demurred demurrer/SM demurring den/M denationalization denature/DG dendrite/SM dendrochronological dendrochronology dengue/M deniable/U denial/MS denier/M denigrate/DSXGN denigration/M denim/MS denizen/MS denominational denotational denotative denouement/SM denounce/DSGL denouncement/SM dense/PYTR denseness/M density/SM dent/ISGMD dental/Y dentifrice/SM dentin/M dentist/MS dentistry/M dentition/M denture/IMS denuclearize/GDS denudation/M denude/GDS denunciation/MS deny/ZGDRS deodorant/SM deodorization/M deodorize/DRSZG deodorizer/M departed/M department/MS departmental/Y departmentalization/M departmentalize/GDS departure/SM dependability/M dependable/U dependably dependence/IM dependency/SM dependent/IMYS depict/GDS depiction/MS depilatory/SM deplete/GNDS depletion/M deplorably deplore/BGDS deploy/ALGDS deployment/AM deployments deponent/MS deportation/SM deportee/MS deportment/M deposit/AGMDS depositary depositor/MS depository/SM deprave/GDS depravity/SM deprecate/GNXDS deprecating/Y deprecation/M deprecatory depreciate/DSGN depreciation/M depredation/MS depressant/MS depressing/Y depression/MS depressive/MS depressor/MS depressurization deprive/GDS deprogramming depth/M depths deputation/SM depute/DSG deputize/DSG deputy/SM derailleur/MS derailment/MS derangement/M derby/SM derelict/MS dereliction/MS deride/D derision/M derisive/PY derisiveness/M derisory derivation/MS derivative/MYS derive/B dermal dermatitis/M dermatological dermatologist/MS dermatology/M dermis/M derogate/DSGN derogation/M derogatorily derogatory derrick/SM derriere/SM derringer/SM derv dervish/MS desalinate/DSGN desalination/M desalinization/M desalinize/GDS descant/M descend/FGDS descendant/SM descender/S describable/I describer/MS description/SM descriptive/YP descriptiveness/M descriptivism descriptor/S descry/GDS desecrate/DSGN desecration/M deselection desert/SDRZGM deserter/M desertification desertion/SM deserved/UY deserving/U desiccant/SM desiccate/DSGN desiccation/M desiccator/SM desiderata desideratum/M design/MRZB designate/XDSGN designation/M designational designator/S designed/Y desirabilia desirability/UM desirableness/M desirably/U desire/B desired/U desirous desist/SDG desk/SM deskill/G desktop/SM desolate/DSPYGN desolateness/M desolation/M desorption despair/SMDG despairing/Y desperado/M desperadoes desperate/PYN desperateness/M desperation/M despicable despicably despise/DSG despite despoilment/M despond despondence/M despondency/M despondent/Y despotic despotically despotism/M dessert/SM dessertspoon/S dessertspoonful/S dessicated dessication destination/MS destine/DSG destiny/SM destitute/N destitution/M destroy/SBZGDR destroyer/M destruct/GVMDS destructibility/IM destructible/I destruction/M destructive/PY destructiveness/M desuetude/M desultorily desultory/P detach/BLGDS detachment/SM detain/LGDS detainee/MS detainment/M detect/SDGVB detectability/U detectable/U detectably/U detected/U detection/SM detective/SM detector/SM detente/SMNX detention/M deter/SL detergent/SM deteriorate/DSGN deterioration/M determent/M determinable/I determinacy/I determinant/SM determinate/YV determine/AGDS determined/U determinedly determiner/SM determinism/M determinist deterministic deterministically deterred/U deterrence/M deterrent/MS deterring detest/RZB detestably detestation/M dethrone/GL dethronement/M detonate/GNDSX detonated/U detonation/M detonator/SM detox/MDSG detoxification/M detoxify/DSGN detract/GD detriment/SM detrimental/Y detritus/M deuce/SM deuterium/M deuteron devastate/GNDS devastating/Y devastation/M devastator/MS develop/ASGDL developed/U developer/SM development/ASM developmental/Y deviance/M deviancy/M deviant/SM deviate/DSMGNX deviating/U deviation/M devil/SMDGL devilish/YP devilishness/M devilment/M devilry/SM deviltry/SM devious/YP deviousness/M devoid devolution/M devolve/DSG devoted/PY devotee/SM devotion/MS devotional/SM devour/SDRZG devout/PRYT devoutness/M dew/SM dewberry/SM dewclaw/SM dewdrop/SM dewiness/M dewlap/SM dewy/RTP dexterity/M dexterous/YP dexterousness/M dextrose/M dhoti/SM dhow/MS diabetes/M diabetic/SM diabolic diabolical/Y diabolism diachronic diacritic/MS diacritical/S diadem/SM diaereses diaeresis/M diagnosable/U diagnose/DSBG diagnosed/U diagnosis/M diagnostic/S diagnostically diagnostician/MS diagnostics/M diagonal/SMY diagonalize/DSG diagram/SM diagrammatic diagrammatically diagrammed diagramming dial/AMDGS dialect/SM dialectal dialectic/SM dialectical/Y dialectics/M dialer dialing/S dialog/SM dialysis/M dialyzes diam diamante diameter/SM diametric diametrical/Y diamond/SM diamondback/SM diapason/SM diaper/SMDG diaphanous diaphragm/SM diaphragmatic diarist/SM diarrhea/M diary/SM diaspora diastase/M diastole/M diastolic diathermy/M diatom/SM diatomic diatonic diatribe/SM dibble/DSMG dibs/M dice/GDS dicey dichloride dichotomous dichotomy/SM dicier diciest dick/MRXZS dicker/DG dickey/SM dickhead/S dickier dickiest dickybird/S dicotyledon/MS dicotyledonous dict dicta dictate/DSMGNX dictation/M dictator/SM dictatorial/Y dictatorship/SM diction/M dictionary/SM dictum/M did/AU didactic didactically diddle/DRSZG diddler/M diddly diddlysquat diddums didgeridoo/S didn't dido/M didoes didst die/DSM dieing dielectric/MS diereses dieresis/M diesel/SMDG diet/MDRZGS dietary/SM dieter/M dietetic/S dietetics/M dietitian/MS diff/DRZGS differ/DG difference/MGS different/IY differentiability differentiable differential/MYS differentiate/DSGNX differentiated/U differentiation/M differentiators difficult/Y difficulty/SM diffidence/M diffident/Y diffract/GSD diffraction/M diffuse/DRSYZGNVP diffuseness/M diffusion/M diffusional diffusivity dig/SM digerati/M digest/SMDGV digested/U digestibility/M digestible/I digestion/IM digestions digestive/S digger/SM digging/S diggings/M digit/SM digital/Y digitalis/M digitization digitize/ZGDRS dignified/U dignify/DSG dignitary/SM dignity/ISM digraph/M digraphs digress/GVDS digression/SM dihedral dike/MGDS diktat/S dilapidated dilapidation/M dilatation/M dilate/DSGN dilation/M dilator/SM dilatory dildo/S dilemma/MS dilettante/SM dilettantish dilettantism/M diligence/M diligent/Y dill/MS dilly/SM dillydally/GDS diluent dilute/DSGNX diluted/U dilution/M dim/ZPSRY dime/MS dimension/SGMD dimensional/Y dimensionality dimensionless diminish/GBDS diminished/U diminuendo/SM diminution/SM diminutive/SM dimity/M dimmed/U dimmer/SM dimmest dimming dimness/M dimorphic dimorphism dimple/DSMG dimply/RT dimwit/SM dimwitted din/ZGSMDR dinar/SM dine/S diner/M dinette/MS ding/MDG dingbat/MS dinghy/SM dingily dinginess/M dingle/SM dingo/SM dingoes dingus/MS dingy/RPT dink/RT dinky/RSMT dinned dinner/SMDG dinnertime/M dinnerware/M dinning dinosaur/SM dint/MS diocesan/MS diocese/MS diode/SM diopter/S diorama/SM dioxide/SM dioxin/SM dip/SM diphtheria/M diphthong/SM diplexers diploid/SM diploma/SM diplomacy/M diplomat/MS diplomata diplomatic/U diplomatically diplomatist/SM dipole/SM dipped dipper/SM dipping dippy/RT dipso/S dipsomania/M dipsomaniac/MS dipstick/SM dipterous diptych/M diptychs dire/YTPR direct/ASDGVT directed/U directer direction/ISM directional/Y directionality directionless directive/SM directly directness/IM director/MS directorate/SM directorial directorship/SM directory/SM direful dirge/SM dirigible/MS dirk/MS dirndl/SM dirt/M dirtball/S dirtily dirtiness/M dirty/DRSTGP dis/M disable/DSGL disablement/M disaggregation disambiguate/DGN disappointing/Y disarming/Y disassemble/R disastrous/Y disbandment/M disbarment/M disbelieving/Y disbursal/M disburse/LDSG disbursement/SM disc/M discern/LSDG discernible/I discernibly discerning/Y discernment/M discharged/U disciple/SM discipleship/M disciplinarian/MS disciplinary discipline/DSMG disciplined/U disclose/DSG disclosed/U disco/MG discography/SM discoloration/S discombobulate/DSGN discombobulation/M discomfit/GD discomfiture/M discommode/GD disconcerting/Y disconnected/PY disconnectedness/M disconsolate/YN discordance/M discordant/Y discotheque/MS discourage/LGDS discouragement/MS discouraging/Y discover/ASDG discoverable discovered/U discoverer/MS discovery/ASM discreet/PRYT discreetness/M discrepancy/SM discrepant discrete/YNP discreteness/M discretion/IM discretionary discriminant/S discriminate/DSGNV discriminated/U discriminating/U discrimination/M discriminator/MS discriminatory discursiveness/M discus/MS discuss/B discussant/MS discussed/A discussion/MS disdain/SMDG disdainful/Y disembowel/GLSD disembowelment/M disfigurement/MS disfranchisement/M disgorgement/M disgruntle/LDSG disgruntlement/M disguise/GD disgusted/Y disgusting/Y dish/MDSG dishabille/M disharmonious dishcloth/M dishcloths disheartening/Y dishevel/DGSL dishevelment/M dishpan/SM dishrag/SM dishtowel/MS dishware/M dishwasher/SM dishwater/M dishy disillusion/DGL disillusionment/M disinfectant/SM disinfection/M disinterestedness/M disinvest disjoint/P disjointed/PY disjointedness/M disjunction/S disjunctive disjuncture disk/MS diskette/MS dislike/DSMG dislodge/GDS dismal/RYT dismantlement/M dismay/SMDG dismayed/U dismember/LGD dismemberment/M dismissible dismissive/Y disorder/Y disorganization/M disparage/LDSG disparagement/M disparaging/Y disparate/Y dispatcher/MS dispel/S dispelled dispelling dispensary/SM dispensation/MS dispense/BZGDRS dispenser/M dispersal/M dispersant disperse/XZGNVDRS dispersion/M dispersive/Y dispirit/GDS dispirited/Y displace/R displayed/AU displeasure/M disposable/SM disposal/SM disposition/ISM dispossession/M disproof/SM disputable/I disputably/I disputant/MS disputation/MS disputatious/Y dispute/DRSMZGB disputed/U disputer/M disquiet/GSMD disquisition/SM disregardful disrepair/M disrepute/MB disrupt/GVSD disruption/SM disruptive/Y disruptor dissect/SDG dissed dissemblance/M dissemble/ZGDRS dissembler/M disseminate/DSGN dissemination/M dissension/MS dissent/SMDRZG dissenter/M dissertation/MS disses dissidence/M dissident/MS dissimilar dissimilitude/S dissing dissipate/GNVDS dissipated/U dissipation/M dissociate/GNVDS dissociation/M dissociative/Y dissoluble/I dissolute/YNP dissoluteness/M dissolve/AGDS dissolved/U dissonance/SM dissonant dissuade/GDS dissuasive dist distaff/SM distal/Y distance/DSMG distant/Y distaste/SM distention/MS distillate/SMNX distillation/M distillery/SM distinct/IYTVP distincter distinction/SM distinctive/PY distinctiveness/M distinctness/IM distinguish/GDSB distinguishable/I distinguishably/I distinguished/U distort/GDR distorted/U distortion/MS distracted/YP distracting/Y distraction/S distrait distraught distress/DG distressful distressing/Y distribute/AGNVDSB distributed/U distribution/AM distributional distributions distributive/Y distributivity distributor/SM distributorship/S district's district/AS disturb/ZGSDR disturbance/SM disturbed/U disturber/M disturbing/Y disulphide disunion/M disyllabic disyllable ditch/MDSG dither/SMDRZG ditherer/M ditransitive ditsy/RT ditto/SMDG ditty/SM ditz/MS diuresis diuretic/MS diurnal/Y div diva/MS divalent divan/SM dive/MZTGDRS diver/M diverge/DSG divergence/MS divergent diverse/XYNP diverseness/M diversification/M diversify/NGDS diversion/M diversionary diversity/SM divert/SDG diverticulitis/M divest/SLDG divestiture/SM divestment/M divide/DRSMZGB divided/U dividend/MS divider/M divination/M divine/DRSMYZTG diviner/M diving/M divinity/SM divisibility/IM divisible/I division/MS divisional divisive/PY divisiveness/M divisor/SM divorce/DSLMG divorcee/MS divorcement/SM divot/SM divulge/GDS divvy/DSMG dixieland/M dizzily dizziness/M dizzy/DRSPTG djellaba/MS do/SJRHZG doable dob/S dobbed dobbin/SM dobbing doberman/MS doc/SM docent/SM docile/Y docility/M dock/MDRZGS docket/SMDG dockland/S dockside dockworker/SM dockyard/MS doctor/SMDG doctoral doctorate/MS doctrinaire/MS doctrinal/Y doctrine/MS docudrama/SM document/GMDS documentary/SM documentation/SM documented/U dodder/SMDG doddery doddle dodecahedra dodecahedral dodecahedron dodge/DRSMZG dodgem/S dodger/M dodgy/RT dodo/MS doe/SM doer/M does/AU doeskin/MS doesn't doff/DGS dog/SM dogcart/SM dogcatcher/SM doge/MS dogeared dogfight/SM dogfish/MS dogged/PY doggedness/M doggerel/M dogging doggone/TGRS doggy/RSMT doghouse/SM dogie/SM dogleg/SM doglegged doglegging dogma/SM dogmatic dogmatically dogmatism/M dogmatist/SM dogsbody/S dogsled/S dogtrot/MS dogtrotted dogtrotting dogwood/MS doily/SM doing/USM doldrums/M dole's dole/FGDS doleful/YP dolefuller dolefullest dolefulness/M dolerite doll/MDGS dollar/SM dollhouse/SM dollop/SGMD dolly/SM dolmen/SM dolomite/M dolor/M dolorous/Y dolphin/MS dolt/MS doltish/YP doltishness/M domain/SM dome/MGDS domestic/SM domestically domesticate/GNDS domesticated/U domestication/M domesticity/M domicile/DSMG domiciliary dominance/M dominant/SMY dominate/DSGN domination/M dominatrices dominatrix/M domineer/SGD domineering/Y dominion/SM domino/M dominoes don't don/SM dona/MS donate/DSXGN donation/M done/AU dong/MDGS dongle/SM donkey/SM donned donning donnish donnybrook/SM donor/SM donuts/S doodad/SM doodah doodahs doodle/DRSMZG doodlebug/SM doodler/M doohickey/SM doolally doom/MDGS doomsayer/MS doomsday/M doomster/S door's door/IS doorbell/MS doorhandles doorjamb/S doorkeeper/MS doorknob/MS doorknocker/S doorman/M doormat/SM doormen doornail doorplate/SM doorpost/S doorstep/MS doorstepped doorstepping doorstop/MS doorway/SM dooryard/MS dopa/M dopamine dope/MZGDRS doper/M dopey dopier dopiest dopiness/M doping/M doppelganger/S dork/MS dorky/RT dorm/MRZS dormancy/M dormant dormer/M dormice dormitory/SM dormouse/M dorsal/Y dory/SM dosage/SM dose/MGDS dosh dosimeter/SM doss/DRZG dosshouse/S dossier/MS dost dot/ZGSMDR dotage/M dotard/SM dote/S doter/M doting/Y dotted dotting dotty/RPT double's double/ADSG doubleheader/MS doubler doublespeak/M doublet/MS doublethink doubloon/SM doubly doubt/SMDRZG doubter/M doubtful/YP doubtfulness/M doubting/Y doubtless/Y douche/DSMG dough/M doughnut/SM doughs doughty/RT doughy/TR dour/RYTP dourness/M douse/DSG dove/MS dovecot/S dovecote/SM dovetail/MDSG dovish dowager/MS dowdily dowdiness/M dowdy/RSPT dowel/SMDG dower/SMDG down/MDRZGS downbeat/SM downcast downdraft/MS downer/M downfall/SMN downgrade/DSMG downhearted/YP downheartedness/M downhill/MS downland/S download/MDSG downmarket downpipes downplay/DSG downpour/MS downrange downright downriver downscale downshift/SGD downside/MS downsize/GDS downsizing/M downspout/MS downstage downstairs/M downstate/M downstream downswing/MS downtime/M downtown/M downtrend/MS downtrodden downturn/MS downward/YS downwind downy/RT dowry/SM dowse/DRSZG dowser/M doxology/SM doyen/SM doyenne/MS doz/XGDNS doze/M dozen/MH dozily dozy/RTP dpt drab/MYSP drabber drabbest drabness/M drachma/MS draconian draft's draft/ASDG draftboard draftee/SM drafter/SM draftily draftiness/M drafting/M draftsman/M draftsmanship/M draftsmen draftswoman/M draftswomen drafty/RTP drag/MS dragged dragging draggy/TR dragnet/SM dragon/SM dragonfly/SM dragoon/SMDG dragster/S drain/SMDRZG drainage/M drainboard/MS drainer/M drainpipe/MS drake/SM dram/MS drama/SM dramatic/S dramatically dramatics/M dramatist/SM dramatization/MS dramatize/DSG drank drape/DRSMZG draper/M drapery/SM drastic drastically drat dratted draughtboards draughtswoman draughtswomen draw/MRZGSBJ drawback/MS drawbridge/MS drawcord drawer/M drawing/M drawl/SMDG drawn/AI drawstring/MS dray/MS dread/SMDG dreadful/PY dreadfulness/M dreadlocks/M dreadnought/MS dream/SMDRZG dreamboat/MS dreamed/U dreamer/M dreamily dreaminess/M dreamland/M dreamless dreamlike dreamworld/MS dreamy/RPT drear drearily dreariness/M dreary/RPT dredge/DRSMZG dredger/M dregs/M drench/GDS dress/AUGSDM dressage/M dresser/MS dressiness/M dressing/SM dressmaker/SM dressmaking/M dressy/TPR drew/A dribble/MZGDRS dribbler/M driblet/MS drier/M drift/SMDRZG drifter/M driftnet/S driftwood/M drill/SMDRZG driller/M drillmaster/MS drink/SMRBJZG drinkable/U drinker/M drip/MS dripped dripping/SM drippy/TR drive/RSMZGBJ drivel/SZGMDR driveler/M driven driver/M driveway/MS drizzle/MGDS drizzly/TR drogue/SM droid/S droll/RPT drollery/SM drollness/M drolly dromedary/SM drone/DSMG drool/SMDG droop/GSMD droopiness/M drooping/Y droopy/TPR drop/MS dropkick/MS droplet/SM dropout/SM dropped dropper/SM dropping/S droppings/M dropsical dropsy/M dross/M drought/SM drove/RSMZG drover/M drown/GSJD drowning/M drowse/MGDS drowsily drowsiness/M drowsy/RTP drub/S drubbed drubber/SM drubbing/MS drudge/MGDS drudgery/M drug/MS drugged druggie/SM drugging druggist/SM drugstore/MS druid/SM druidism/M drum/MS drumbeat/SM drumlin/SM drummed drummer/SM drumming drumstick/SM drunk/STMNR drunkard/MS drunken/PY drunkenness/M drupe/SM druthers/M dry/ZTGDRSMY dryad/SM dryer/SM dryish dryness/M drys drystone drywall/M dual/YS dualism/M dualist dualistic duality/SM dub/SM dubbed dubber/SM dubbin/M dubbing dubiety/M dubious/YP dubiousness/M ducal ducat/SM duchess/MS duchy/SM duck/JMDGS duckbill/SM duckboards duckling/SM duckpins/M duckpond duckweed/M ducky/TRSM duct's duct/CIFDG ductile ductility/M ductless ducts/IKC dud/GSMD dude/MS dudgeon/M due/SM duel/MDRJZGS dueler/M duelist/SM duenna/MS duet/MS duff/MDRZGS duffel duffer/M dug dugout/MS duh duke/MS dukedom/SM dulcet dulcimer/MS dull/DRPTGS dullard/SM dullness/M dully duly/U dumb/RYPT dumbbell/SM dumbfound/SDG dumbness/M dumbo/S dumbstruck dumbwaiter/SM dumdum/MS dummy/SM dump/MDRZGS dumpiness/M dumpling/SM dumpster/SM dumpy/PTR dun/SM dunce/SM dunderhead/SM dune/MS dung/MDGS dungaree/MS dungeon/SM dunghill/MS dunk/MDGS dunned dunner dunnest dunning dunno duo/SM duodecimal duodena duodenal duodenum/M duologue duopoly/S dupe/MZGDRS duper/M duple duplex/MS duplicability duplicate's duplicate/AGNDS duplication/AM duplications duplicator/MS duplicitous duplicity/SM durability/M durable/S durably durance/M duration/MS duress/M during durst durum/M dusk/M duskiness/M dusky/RTP dust/MDRZGS dustbin/SM dustcart/S dustcover duster/M dustily dustiness/M dustless dustman dustmen dustpan/SM dustsheet/S dusty/RTP dutch duteous/Y dutiable dutiful/YP dutifulness/M duty/SM duvet/SM dwarf/STGMDR dwarfish dwarfism/M dweeb/SM dwell/SJZGR dweller/M dwelling/M dwelt/I dwindle/DSG dyad dyadic dybbuk/SM dybbukim dye's dye/ADSG dyeing/A dyer/MS dyestuff/SM dying's dying/U dynamic/MS dynamical/Y dynamics/M dynamism/M dynamite/MZGDRS dynamiter/M dynamo/SM dynastic dynasty/SM dyne dysentery/M dysfunction/SM dysfunctional dyslectic/SM dyslexia/M dyslexic/SM dyslexically dyspepsia/M dyspeptic/MS dysprosium/M dystrophy dz e'en e'er e/FDST eBay/M ea each eager/PTRY eagerness/M eagle/MS eaglet/MS ear/SMDY earache/SM eardrum/SM earful/SM earl/MS earldom/SM earliness/M earlobe/SM early/RTP earmark/SMDG earmuff/SM earn/DRZTGJS earned/U earner/M earnest/SMYP earnestness/M earnings/M earphone/MS earpiece/S earplug/SM earring/SM earshot/M earsplitting earth's earth/UDYG earthbound earthen earthenware/M earthiness/M earthling/MS earthly/RT earthquake/SM earths/U earthshaking earthward/S earthwork/MS earthworm/MS earthy/RTP earwax/M earwig/SM ease/EDSM easel/SM easement/SM easily/U easiness/UM easing east/MG eastbound easterly/SM eastern/ZR easterner/M easternmost eastward/S easy/URTP easygoing eat/ZGBSNR eatable/SM eaten/U eater/M eatery/SM eave/MS eavesdrop/S eavesdropped eavesdropper/MS eavesdropping ebb/SMDG ebony/SM ebullience/M ebullient/Y ebullition/M eccentric/SM eccentrically eccentricity/SM eccl ecclesiastic/SM ecclesiastical/Y echelon/SM echinoderm/SM echo's echo/ADG echoes/A echoic echolocation/M echos eclair/SM eclat/M eclectic/SM eclectically eclecticism/M eclipse/DSMG ecliptic/M eclogue/SM ecocide/M ecol ecologic ecological/Y ecologist/MS ecology/M econ econometric/S economic/S economical/UY economics/M economist/SM economization economize/DRSZG economizer/M economy/SM ecosystem/MS ecru/M ecstasy/SM ecstatic ecstatically ectopic ectoplasm ecu/S ecumenical/Y ecumenicism/M ecumenism/M eczema/M ed/ACSM eddy/DSMG edelweiss/M edema/SM edge/MZGJDRS edgeless edger/M edgewise edgily edginess/M edging/M edgy/RTP edibility/M edible/SMP edibleness/M edict/SM edification/M edifice/SM edifier/M edify/DRSZGN edifying/U edit's edit/ADGS editable edited/U edition/MS editor/SM editorial/SMY editorialize/GDS editorship/MS educ educability/M educable/I educate/ADSGNV educated/U education/AM educational/Y educationalist/S educationist/S educations educator/MS educe/DSGB eduction edutainment/M eek eel/SM eerie/RT eerily eeriness/M eff/GSD efface/DSLG effacement/M effect/SMDGV effective/IYP effectiveness/IM effector/S effectual/IY effectuate/GDS effeminacy/M effeminate/Y effendi/SM efferent effervesce/GDS effervescence/M effervescent/Y effete/YP effeteness/M efficacious/Y efficacy/IM efficiency/ISM efficient/IY effigy/SM efflorescence/M efflorescent effluence/M effluent/MS effluvia effluvium/M effort/SM effortless/PY effortlessness/M effrontery/M effulgence/M effulgent effuse/DSGNVX effusion/M effusive/YP effusiveness/M egad egalitarian/SM egalitarianism/M egg/GSMD eggbeater/MS eggcup/SM egghead/SM eggnog/M eggplant/MS eggshell/SM eglantine/SM ego/SM egocentric/MS egocentrically egocentricity/M egoism/M egoist/SM egoistic egoistical/Y egomania/M egomaniac/MS egotism/M egotist/SM egotistic egotistical/Y egregious/PY egregiousness/M egress/MS egret/SM eh eider/SM eiderdown/MS eidetic eigenfunction/S eigenstate/S eigenvalue/S eight/SM eighteen/MHS eighteenth/M eighteenths eightfold eighth/M eighths eightieth/M eightieths eightpence eighty/SMH einsteinium/M eisteddfod/S either ejaculate/GNXDS ejaculation/M ejaculatory eject/SDG ejecta ejection/MS ejector/SM eke/DSG elaborate/PYGNDSX elaborateness/M elaboration/M elan/M eland/SM elapse/DSG elastic/MS elastically elasticated elasticity/SM elasticize/DSG elastodynamics elate/DSGN elated/Y elation/M elbow/SMDG elbowroom/M elder/SMY elderberry/SM elderflower eldest elect's elect/ASDGV electability electable/U elected/U election/AMS electioneer/DSG elective/MS elector/MS electoral/Y electorate/MS electric/S electrical/Y electrician/MS electricity/M electrification/M electrifier/M electrify/NZGDRS electrocardiogram/SM electrocardiograph/M electrocardiographs electrocardiography/M electrochemical/Y electrocute/GNDSX electrocution/M electrode/SM electrodynamic/S electroencephalogram/MS electroencephalograph/M electroencephalographic electroencephalographs electroencephalography/M electrologist/SM electroluminescent electrolysis/M electrolyte/MS electrolytic electrolytically electrolyze/GD electromagnet/MS electromagnetic electromagnetically electromagnetism/M electromechanical electromechanics electromotive electron/MS electronegative electronic/S electronically electronics/M electrophoresis electroplate/DSG electroscope/SM electroscopic electroshock/M electrostatic/S electrostatics/M electrotype/MS eleemosynary elegance/IM elegant/IY elegiac/MS elegiacal elegy/SM elem element/MS elemental/Y elementarily elementary elephant/SM elephantiasis/M elephantine elev elevate/XDSGN elevation/M elevator/MS eleven/SMH elevens/S eleventh/M elevenths elf/M elfin elfish elicit/SDG elicitation/M elide/DSG eligibility/IM eligible eligibly/I eliminate/DSXGN elimination/M eliminator/S elision/MS elite/SM elitism/M elitist/MS elixir/SM elk/SM ell/SM ellipse/MS ellipsis/M ellipsoid/SM ellipsoidal elliptic elliptical/Y elm/SM elocution/M elocutionary elocutionist/SM elodea/SM elongate/DSGNX elongation/M elope/DSGL elopement/MS eloquence/M eloquent/Y else elsewhere elucidate/XDSGN elucidation/M elude/DSG elusive/YP elusiveness/M eluted elven elver/SM elves elvish/S em's em/S emaciate/GNDS emaciation/M email/SMDG emanate/XDSGN emanation/M emancipate/GNDS emancipation/M emancipator/SM emancipatory emasculate/DSGN emasculation/M embalm/SZGDR embalmer/M embank/SLGD embankment/SM embargo/MDG embargoes embark/AEGDS embarkation/EM embarkations embarrass/LGDS embarrassed/U embarrassing/Y embarrassment/SM embassy/SM embattled embed/S embeddable embedded embedding/S embellish/LDSG embellishment/SM ember/SM embezzle/ZGLDRS embezzlement/M embezzler/M embitter/GDLS embitterment/M emblazon/GDLS emblazonment/M emblem/SM emblematic emblematically embodiment/EM embodiments embody/AEGSD embolden/DGS embolism/MS embosom emboss/DRSZG embosser/M embouchure/M embower/SGD embrace/DSMG embraceable embrasure/MS embrocation/MS embroider/SDRZG embroiderer/M embroidery/SM embroil/DGLS embroilment/M embryo/SM embryological embryologist/SM embryology/M embryonic emcee/DSM emceeing emend/SDG emendation/SM emerald/MS emerge/ADSG emergence/AM emergency/SM emergent emerita emeritus emery/M emetic/SM emf/S emigrant/SM emigrate/DSXGN emigration/M emigre/SM eminence/MS eminent/Y emir/MS emirate/MS emissary/SM emission/SM emissivity/S emit/S emitted emitter/MS emitting emollient/MS emolument/MS emote/XDSGNV emoticon/SM emotion/M emotional/UY emotionalism/M emotionality emotionalize/DSG emotionless emotive/Y empaneled empaneling empathetic empathetical empathic empathize/DSG empathy/M emperor/MS emphases emphasis/M emphasize/AGDS emphatic/U emphatically emphysema/M empire/SM empiric empirical/Y empiricism/M empiricist/SM emplacement/MS employ's employ/ADGLS employable/U employee/SM employer/SM employment/UAM employments emporium/SM empower/SDGL empowerment/M empress/MS emptily emptiness/M empty/TGPDRSM empyrean/M emu/SM emulate/DSGNVX emulation/M emulator/SM emulsification/M emulsifier/M emulsify/NDRSZG emulsion/MS en/SM enable/DRSZG enabler/M enact/ASLDG enactment/ASM enamel/JSZGMDR enameler/M enamelware/M enamor/SGD enc encamp/LSGD encampment/MS encapsulate/GNXDS encapsulation/M encase/LDSG encasement/M encephalitic encephalitis/M encephalopathy enchain/DGS enchant/ELDGS enchanter/MS enchanting/Y enchantment/EM enchantments enchantress/MS enchilada/SM encipher/SGD encircle/LDSG encirclement/SM encl enclave/MS enclose/GDS enclosed/U enclosure/SM encode/DRSZG encoder/M encomium/MS encompass/GDS encore/DSMG encounter/GSMD encourage/DRSGL encouragement/SM encouraging/Y encroach/GDSL encroachment/SM encrust/DGS encrustation/MS encrypt/DGS encrypted/U encryption encumber/EGSD encumbered/U encumbrance/SM ency encyclical/SM encyclopedia/MS encyclopedic encyst/LSGD encystment/M end/GVSJMD endanger/SGDL endangerment/M endear/SGLD endearing/Y endearment/SM endeavor/GSMD endemic/MS endemically endgame/S ending/M endive/SM endless/PY endlessness/M endmost endocrine/MS endocrinologist/MS endocrinology/M endogenous/Y endomorphism/S endoplasmic endorphin/MS endorse/LZGDRS endorsement/SM endorser/M endoscope/MS endoscopic endoscopy/M endothermic endow/SDLG endowment/MS endpapers endpoint/SM endue/DSG endungeoned endurable/U endurance/M endure/DSBG endways enema/SM enemy/SM energetic/S energetically energize/ZGDRS energizer/M energy/SM enervate/GNDS enervation/M enfeeble/GDSL enfeeblement/M enfilade/DSMG enfold/SGD enforce/LZGDRS enforceability enforceable/U enforced/U enforcement/MS enforcer/M enfranchise/ELGDS enfranchisement/EM enfranchiser engage/EADSG engaged/U engagement/ESM engagingly engender/SGD engine/DSM engineer/MDGS engineering/M engorge/LGDS engorgement/M engram/SM engrave/ZGJDRS engraver/M engraving/M engross/GLDS engrossment/M engulf/SLGD engulfment/M enhance/LZGDRS enhanceable enhancement/SM enharmonic enigma/SM enigmatic enigmatically enjambment/SM enjoin/SGD enjoy/GBLSD enjoyability enjoyably enjoyment/SM enlarge/LZGDRS enlargeable enlargement/MS enlarger/M enlighten/LSGD enlightened/U enlightening/U enlightenment/M enlist/ADGSL enlistee/SM enlistment/AM enlistments enliven/SLDG enlivenment/M enmesh/DSGL enmeshment/M enmity/SM ennoble/DSGL ennoblement/M ennui/M enormity/SM enormous/YP enormousness/M enough/M enplane/DSG enquirer/S enquiringly enrage/GDS enrapture/DSG enrich/DSLG enrichment/M enrobed enroll/DLSG enrollment/MS ensconce/DSG ensemble/SM enshrine/GDSL enshrinement/M enshroud/DGS ensign/MS ensilage/M enslave/DSGL enslavement/M ensnare/DSLG ensnarement/M ensue/DSG ensure/ZGDRS ensurer/M entail/DSGL entailment/M entangle/EDSGL entanglement/EM entanglements entangler entente/SM enter/ASGD entered/U enteritis/M enterprise/SMG enterprising/Y entertain/DRSZGL entertainer/M entertaining/MY entertainment/MS enthalpy/S enthrall/GDSL enthrallment/M enthrone/LGDS enthronement/SM enthuse/DSG enthusiasm/MS enthusiast/MS enthusiastic/U enthusiastically/U entice/GDSL enticement/MS enticing/Y entire/Y entirety/M entitle/DSGL entitlement/SM entity/SM entomb/DSGL entombment/M entomological entomologist/SM entomology/M entourage/SM entr'acte entrails/M entrain/DL entrance/DSLMG entrancement/M entrancing/Y entrant/SM entrap/LS entrapment/M entrapped entrapping entreat/GSD entreating/Y entreaty/SM entree/MS entrench/DSGL entrenchment/MS entrepreneur/MS entrepreneurial entrepreneurship entropic entropy/M entrust/SGD entry/ASM entryphone/S entryway/MS entwine/DSG enumerable enumerate/DSGNX enumeration/M enumerator/SM enunciate/DSGN enunciation/M enuresis/M envelop/SLDRZG envelope/SM enveloper/M envelopment/M envenom/SDG enviable/U enviably envious/PY enviousness/M environ/SL environment/MS environmental/Y environmentalism/M environmentalist/MS environs/M envisage/GDS envision/DGS envoy/SM envy/DSMG envying/Y enzymatic enzyme/SM eolian eon/SM epaulet/SM epee/MS ephedrine/M ephemera/M ephemeral/Y ephemeris epic/MS epically epicenter/MS epicure/SM epicurean/MS epicycles epicycloid epidemic/SM epidemically epidemiological epidemiologist/MS epidemiology/M epidermal epidermic epidermis/MS epidural/S epiglottis/MS epigram/SM epigrammatic epigraph/M epigraphical epigraphs epigraphy/M epilepsy/M epileptic/SM epilogue/MS epinephrine/M epiphany/SM epiphenomena epiphenomenon episcopacy/M episcopal episcopalian episcopate/M episode/SM episodic episodically epistemic epistemological epistemology epistle/SM epistolary epitaph/M epitaphs epitaxial epitaxy epithelial epithelium/M epithet/SM epithetic epitome/SM epitomize/GDS epoch/M epochal epochs eponymous epoxy/DSMG epsilon/SM equability/M equable equably equal/SMDYG equality/ISM equalization/M equalize/ZGDRS equalizer/M equanimity/M equate/DSGNBX equation/M equator/SM equatorial equerry/SM equestrian/SM equestrianism/M equestrienne/SM equiangular equidistant/Y equilateral/MS equilibrating equilibration equilibrium/EM equine/SM equinoctial equinox/MS equip/AS equipage/MS equipartition equipment/MS equipoise/M equipped/UA equipping/A equitable/I equitably/I equitation/M equity/ISM equiv equivalence/SM equivalency/SM equivalent/MYS equivocal/UY equivocalness/M equivocate/XGNDS equivocation/M equivocator/MS er era/SM eradicable/I eradicate/DSGN eradication/M eradicator/MS erase/DRSBZG eraser/M erasure/SM erbium/M ere erect/PSGDY erectile erection/SM erectness/M erector/MS erelong eremite/MS erg/SM ergo ergodic ergonomic/S ergonomically ergonomics/M ergophobia ergosterol/M ergot/M ermine/SM erode/DSG erodible erogenous erosion/M erosional erosive erotic/S erotica/M erotically eroticism/M erotics/S err/GSD errand/SM errant/I errata/SM erratic erratically erratum/M erroneous/Y error/SM ersatz/MS erst erstwhile eruct/SDG eructation/SM erudite/YN erudition/M erupt/SDGV eruption/MS erysipelas/M erythrocyte/MS escalate/CDSGN escalation/CM escalations escalator/MS escallop/SGMD escalope/S escapade/MS escape/LMGDS escapee/MS escapement/MS escapism/M escapist/MS escapologist/S escapology escargot/MS escarole/MS escarpment/SM eschatology eschew/SDG escort/SMDG escorted/U escritoire/MS escrow/SM escudo/SM escutcheon/MS esophageal esophagi esophagus/M esoteric esoterica esoterically esp espadrille/SM espalier/MDSG especial/Y espionage/M esplanade/MS espousal/M espouse/GDS espresso/MS esprit/M espy/DSG esquire/SM essay/SMDRZG essayer/M essayist/SM essence/SM essential/IMS essentialist essentially establish/EASDGL established/U establishment/AEM establishments estate/SM esteem/ESMDG ester/SM esthete's esthetically estimable/I estimate/MGNDSX estimation/M estimator/SM estrange/LDSG estrangement/SM estrogen/M estrous estrus/MS estuarine estuary/SM eta/SM etc etch/DRSZGJ etcher/M etching/M eternal/YP eternalness/M eternity/SM ethane/M ethanol/M ether/M ethereal/Y etherized ethic/SM ethical/UY ethicist ethics/M ethnic/SM ethnically ethnicity/M ethnocentric ethnocentrism/M ethnographer/S ethnographic ethnographically ethnography ethnological/Y ethnologist/MS ethnology/M ethological ethologist/MS ethology/M ethos/M ethyl/M ethylene/M etiolated etiologic etiological etiology/SM etiquette/M etude/SM etymological/Y etymologist/SM etymology/SM eucalypti eucalyptus/MS euchre/DSMG euclidean eugenic/S eugenically eugenicist/MS eugenics/M eukaryote eulogist/MS eulogistic eulogize/ZGDRS eulogizer/M eulogy/SM eunuch/M eunuchs euphemism/SM euphemistic euphemistically euphonious/Y euphonium/S euphony/M euphoria/M euphoric euphorically eureka euro/MS europium/M eutectic euthanasia/M euthanize euthenics/M evacuate/XDSGN evacuation/M evacuee/MS evade/DRSZGB evader/M evaluable evaluate/AGNVDSX evaluated/U evaluation/AM evaluational evaluator/S evanescence/M evanescent evangelic evangelical/SMY evangelicalism/M evangelism/M evangelist/MS evangelistic evangelize/GDS evaporate/GNDS evaporation/M evaporator/SM evasion/SM evasive/YP evasiveness/M eve/ASM even/MDRYTGSJP evenhanded/Y evening/M evenness/UM evensong/M event/SMG eventful/UY eventfulness/M eventide/M eventual/Y eventuality/SM eventuate/GDS ever everglade/SM evergreen/SM everlasting/SMY everliving evermore every everybody/M everyday everyman everyone/M everyplace everything/M everywhere evict/SDG eviction/MS evidence/MGDS evident/Y evidential evil/MRYTSP evildoer/SM evildoing/M eviller evillest evilness/M evince/DSG eviscerate/DSGN evisceration/M evocation/MS evocative/Y evoke/DSG evolute/NX evolution/M evolutionarily evolutionary evolutionism evolutionist/MS evolve/DSG ewe/RSMZ ewer/M ex/MS exacerbate/GNDS exacerbation/M exact/SPDRYTG exacting/Y exaction/M exactitude/M exactness/IM exaggerate/DSGNX exaggerated/Y exaggeration/M exaggerator/SM exalt/SDG exaltation/M exam/MS examinable examination/AMS examine/AGDS examined/U examinees examiner/MS example/MGDS exampled/U exasperate/DSGN exasperated/Y exasperating/Y exasperation/M excavate/GNDSX excavation/M excavator/SM exceed/GSD exceeding/Y excel/S excelled excellence/M excellency/SM excellent/Y excelling excelsior/M except/GSD exception/SMB exceptionable/U exceptional/UY excerpt/MDGS excess/VMS excessive/Y exchange/DRSMZG exchangeable exchequer/SM excise/XDSMGN excision/M excitability/M excitably excitation/SM excite/BDRSLZG excited/Y excitement/SM exciter/M exciting/Y exciton excl/S exclaim/DGS exclamation/MS exclamatory exclude/GDS exclusion/MS exclusionary exclusive/MYPS exclusiveness/M exclusivity/M excommunicate/GNXDS excommunication/M excoriate/DSXGN excoriation/M excrement/M excremental excrescence/MS excrescent excreta/M excrete/XGNDS excretion/M excretory excruciating/Y excruciation exculpate/DSGN exculpation/M exculpatory excursion/MS excursionist/SM excursive/YP excursiveness/M excusable/I excusably/I excuse/DSBMG excused/U exec/MS execked execking execrable execrably execrate/DSGN execration/M execute/BXGNVDS execution/MRZ executioner/M executive/SM executor/MS executrices executrix/M exegeses exegesis/M exegetic exegetical exemplar/SM exemplary exemplification/M exemplify/XGDSN exempt/SGD exemption/SM exercise/DRSBMZG exerciser/M exert/SDG exertion/MS exeunt exfoliate/GNDS exhalation/MS exhale/DSG exhaust/GVMDS exhaustible/I exhaustion/M exhaustive/YP exhaustiveness/M exhibit/GMDS exhibition/ZMRS exhibitionism/M exhibitionist/MS exhibitor/SM exhilarate/GNDS exhilaration/M exhort/SDG exhortation/SM exhumation/MS exhume/DSG exigence/MS exigency/SM exigent exiguity/M exiguous exile/DSMG exist/SDG existence/MS existent existential/Y existentialism/M existentialist/SM existentialistic exit/MDGS exobiology/M exocrine exodus/MS exogenous exonerate/GNDS exoneration/M exorbitance/M exorbitant/Y exorcise/DSG exorcism/SM exorcist/SM exoskeleton/MS exosphere/SM exothermic exothermically exotic/SM exotica exotically exoticism/M exp expand/BGSDR expandability expanded/U expanse/XMNVS expansible expansion/M expansionary expansionism/M expansionist/MS expansive/PY expansiveness/M expat/S expatiate/GNDS expatiation/M expatriate/MGNDS expatriation/M expect/GSD expectancy/SM expectant/Y expectation/MS expectational expectorant/MS expectorate/GNDS expectoration/M expedience/IM expediences expediencies expediency/IM expedient/SMY expedite/DRSZGNX expediter/M expedition/M expeditionary expeditious/YP expeditiousness/M expel/S expelled expelling expend/GSBD expendable/SM expenditure/MS expense/MS expensive/IPY expensiveness/IM experience/IDM experiences experiencing experiential experiment/ZGSMDR experimental/Y experimentalist/S experimentation/M experimenter/M expert/SPMY expertise/M expertize expertness/M expiate/GNDS expiation/M expiatory expiration/M expiratory expire/DSG expired/U expiry/M explain/ADGS explainable/U explained/U explanation/MS explanatory expletive/MS explicable/I explicate/XGNVDS explication/M explicit/PY explicitness/M explode/ZGDRS exploded/U exploit/ZGBMDRS exploitation/MS exploitative exploited/U exploiter/M exploration/MS exploratory explore/BZGDRS explored/U explorer/M explosion/SM explosive/SMYP explosiveness/M expo/MS exponent/MS exponential/Y exponentiation export/BSZGMDR exportability exportation/M exporter/M expose/DSMG exposed/U exposition/SM expositor/SM expository expostulate/GNXDS expostulation/M exposure/MS expound/ZGDRS expounder/M express/GVMDSY expressed/U expressible/I expression/MS expressionism/M expressionist/SM expressionistic expressionless/Y expressive/YP expressiveness/M expressway/MS expropriate/XGNDS expropriation/M expropriator/MS expulsion/MS expunge/GDS expurgate/XDSGN expurgated/U expurgation/M exquisite/YP exquisiteness/M ext extant extemporaneous/YP extemporaneousness/M extempore extemporization/M extemporize/GDS extend/SZGDR extendability extender/M extensibility extensible/I extension/SM extensional/Y extensive/YP extensiveness/M extensors extent/SM extenuate/DSGN extenuation/M exterior/MS exterminate/GNDSX extermination/M exterminator/SM external/MYS externalization/SM externalize/GDS extinct/GDS extinction/MS extinguish/BZGDRS extinguishable/I extinguisher/M extirpate/GNDS extirpation/M extol/S extolled extolling extort/SGD extortion/ZMR extortionate/Y extortioner/M extortionist/SM extra/SM extracellular extract/BMDGVS extraction/MS extractor/MS extracurricular extradite/GNDSBX extradition/M extragalactic extrajudicial extralegal extralinguistic extramarital extramural extraneous/Y extraordinaire extraordinarily extraordinary extrapolate/GNXDS extrapolation/M extrasensory extrasolar extraterrestrial/SM extraterritorial extraterritoriality/M extravagance/SM extravagant/Y extravaganza/SM extravehicular extrema extremal extreme/PMYTRS extremeness/M extremism/M extremist/MS extremity/SM extricable/I extricate/GNDS extrication/M extrinsic extrinsically extroversion/M extrovert/SMD extrude/GDS extrusion/SM extrusive exuberance/M exuberant/Y exudate/N exudation/M exude/DSG exult/SDG exultant/Y exultation/M exulting/Y exurb/SM exurban exurbanite/MS exurbia/M eye/DSMG eyeball/GMDS eyebrow/SM eyedropper/SM eyeful/SM eyeglass/MS eyelash/MS eyeless eyelet/SM eyelid/SM eyeliner/MS eyeopener/MS eyeopening eyepiece/MS eyeshadow eyesight/M eyesore/MS eyestrain/M eyeteeth eyetooth/M eyewash/M eyewitness/MS f/CIAVTR fa/M fab fable/DSM fabric/SM fabricate/DSXGN fabrication/M fabricator/MS fabulists fabulous/Y facade/SM face's face/ACSDG facecloth/M facecloths faceless faceplate facet/SMDG facetious/YP facetiousness/M facial/SMY facile/Y facilitate/GNVDS facilitation/M facilitator/SM facility/SM facing/SM facsimile/DSM facsimileing fact/MS faction/SM factional factionalism/M factious factitious factoid/SM factor/SMDG factorial/MS factorisable factorization/S factorize/GDS factory/SM factotum/SM factual/Y faculty/SM fad/GSMD faddish/P faddist/MS faddy/P fade/MS fadeout fading/U faerie/SM faff/DGS fag/SM fagged fagging fagot/SMG fagoting/M faience/M fail/MDGJS failing/M faille/M failure/SM fain/RT faint/SMDRYTGP fainthearted faintness/M fair/MRYTGJPS fairground/SM fairing/M fairings/S fairish fairness/UM fairway/SM fairy/SM fairyland/SM fairytale faith/M faithful's faithful/UPY faithfulness/UM faithfuls faithless/PY faithlessness/M faiths fajita/SM fajitas/M fake/MZGDRS faker/M fakir/SM falcon/SMRZ falconer/M falconry/M fall/MNRZGS fallacious/Y fallacy/SM fallback fallibility/IM fallible/P fallibleness/M fallibly/I falloff/SM fallopian fallout/M fallow/SMDG false/PRYT falsehood/SM falseness/M falsetto/SM falsie/SM falsifiability falsifiable/U falsification/M falsifier/M falsify/DRSZGXN falsity/SM falter/GSJMD faltering/Y fame's fame/D familial familiar/MYS familiarities familiarity/UM familiarization/M familiarize/GDS family/SM famine/SM famish/DSG famous/IY fan/SM fanatic/SM fanatical/Y fanaticism/M fanciable fancier/M fanciful/PY fancifulness/M fancily fanciness/M fancy/DRSMZTGP fancywork/M fandango/MS fanfare/SM fang/MDS fanlight/SM fanned fanning fanny/SM fantail/MS fantasia/SM fantasist/S fantasize/GDS fantastic fantastical/Y fantasy/DSMG fanzine/MS far farad/SM faradize/DSG faraway farce/SM farcical/Y fare/MGDS farewell/SM farina/M farinaceous farm/MDRZGSJ farmer/M farmhand/SM farmhouse/SM farming/M farmland/MS farmstead/MS farmyard/MS faro/M farrago/M farragoes farrier/MS farrow/SMDG farseeing farsighted/P farsightedness/M fart/MDGS farther farthermost farthest farthing/SM fascia/SM fascicle/SM fascinate/XGNDS fascinating/Y fascination/M fascism/M fascist/MS fascistic fashion/ZGBMDRS fashionable/U fashionably/U fashioner/M fast/MDRTGSP fastback/SM fastball/SM fasten/UAGDS fastener/SM fastening/MS fastidious/YP fastidiousness/M fastness/MS fat/GSPMD fatal/Y fatalism/M fatalist/SM fatalistic fatalistically fatality/SM fatback/M fate/MS fateful/YP fatefulness/M fathead/MDS fatheaded/P father/SGMDY fatherhood/M fatherland/MS fatherless fathom/SMDGB fathomable/U fathomed/U fathomless fatigue/MDSG fatigued/U fatigues/M fatness/M fatso/S fatted fatten/SDG fatter fattest fattiness/M fatty/RSMTP fatuity/M fatuous/YP fatuousness/M fatwa/SM faucet/SM fault/CSMDG faultfinder/MS faultfinding/M faultily faultiness/M faultless/YP faultlessness/M faulty/PRT faun/MS fauna/SM fauvism/M fauvist/SM fave/S favor/ESMDG favorable/U favorably/U favored/U favorite/SM favoritism/M fawn/MDRZGS fawner/M fawning/Y fax/GMDS fay/TSMR faze/GDS fazed/U fealty/M fear/MDGS fearful/YP fearfuller fearfullest fearfulness/M fearless/PY fearlessness/M fearsome/YP feasibility/M feasible/IU feasibly/U feast/SMDG feat/MS feather/SGMD featherbedding/M featherbrained featherless featherlight featherweight/MS feathery/TR feature/DSMG featureless febrile fecal feces/M feckless/PY fecund fecundate/GNDS fecundation/M fecundity/M fed/SM federal/SMY federalism/M federalist/MS federalization/M federalize/GDS federate/FXDSGN federation/FM fedora/SM fee/SM feeble/RTP feebleness/M feebly feed/MRZGSJ feedback/M feedbag/SM feeder/M feeding/M feedlot/SM feedstock feedstuffs feel/MRZGSJ feeler/M feelgood feeling/MY feet feign/SDG feigned/U feint/SMDG feisty/TR feldspar/M felicitate/XGNDS felicitation/M felicitous/Y felicity/ISM feline/SM fell/MDRZTGS fella/S fellatio/M fellow/SM fellowman/M fellowmen fellowship/SM felon/SM felonious felony/SM felt/MDGS fem female/PSM femaleness/M feminine/SMY femininity/M feminism/M feminist/SM feminize/DSG femoral femur/SM fen/SM fence/DRSMZG fenced/U fencepost fencer/M fencing/M fend/CDRZGS fender/CM fenestration/M fenland fennel/M feral ferment/FCMS fermentation/M fermented fermenting fermion/S fermium/M fern/MS ferny/RT ferocious/YP ferociousness/M ferocity/M ferret/GSMD ferric ferrite ferromagnetic ferrous ferrule/MS ferry/DSMG ferryboat/SM ferryman/M ferrymen fertile/I fertility/IM fertilization/M fertilize/DRSZG fertilized/U fertilizer/M ferule/SM fervency/M fervent/Y fervid/Y fervor/M fess/FKGSD fest/MRZVS festal fester/GMD festival/SM festive/YP festiveness/M festivity/SM festoon/GMDS feta/M fetal fetch/DRSZG fetcher/M fetching/Y fete/MGDS fetid/P fetidness/M fetish/MS fetishism/M fetishist/SM fetishistic fetlock/MS fetter's fetter/USGD fettle/M fettuccine/M fetus/MS feud/MDGS feudal feudalism/M feudalistic fever/SMD feverish/YP feverishness/M few/TPMR fewness/M fey fez/M fezzes ff fiance/CM fiancee/MS fiances fiasco/M fiascoes fiat/MS fib/ZSMR fibbed fibber/SM fibbing fiber/MD fiberboard/M fiberfill/M fiberglass/M fibril/SM fibrillate/GNDS fibrillation/M fibrin/M fibroblast/S fibroid fibrosis/M fibrous fibula/M fibulae fibular fices fiche/SM fichu/SM fickle/RPT fickleness/M fiction/MS fictional/Y fictionalization/MS fictionalize/GDS fictitious/Y fictive ficus/M fiddle/DRSJMZG fiddler/M fiddlesticks fiddly/TR fidelity/IM fidget/SGMD fidgety fiduciary/SM fie fief/MS fiefdom/MS field/ISMRZ fielded fielder/IM fielding fieldsman fieldsmen fieldwork/ZMR fieldworker/M fiend/SM fiendish/Y fierce/PRYT fierceness/M fierily fieriness/M fiery/RPT fiesta/SM fife/MZRS fifer/M fifteen/MHS fifteenth/M fifteenths fifth/MY fifths fiftieth/M fiftieths fifty/SMH fig/SLM fight/SMRZG fightback fighter/IMS fighting/IM figment/MS figural figuration/FM figurative/Y figure's figure/EFGSD figurehead/SM figurine/MS filament/MS filamentary filamentous filbert/MS filch/DSG file's/KC file/CAKGDS filer/CSM filial filibuster/ZGSMDR filibusterer/M filigree/DSM filigreeing filing's filings fill's fill/AIDGS filled/U filler/MS fillet/MDGS filling's filling/S fillip/MDGS filly/SM film/MDGS filminess/M filmmaker/SM filmstrip/MS filmy/TPR filo filter/MDRBSZG filtered/U filterer/M filth/M filthily filthiness/M filthy/RPT filtrate's filtrate/IGNDS filtration/IM fin/SMR finagle/DRSZG finagler/M final/SMY finale/MS finalist/SM finality/M finalization/M finalize/DSG finance's finance/ADSG financial/Y financier/MS financing/M finch/MS find/BJMRZGS finder/M finding/M findings/M fine's/F fine/CAFTGDS finely fineness/M finery/AM finespun finesse/DSMG finger/MDGSJ fingerboard/MS fingering/M fingerless fingerling/SM fingermark/S fingernail/SM fingerprint/MDSG fingertip/MS finial/MS finical finickiness/M finicky/RPT finis/MS finish's finish/ADSG finished/U finisher/MS finite/PY fink/MDGS finned finny/TR fir/ZGSJMDRH fire/MS firearm/SM fireball/MS firebomb/MDSJG firebox/MS firebrand/SM firebreak/SM firebrick/SM firebug/SM firecracker/SM fired/U firedamp/M firefight/MRSJZG firefighter/M firefighting/M firefly/SM fireguard/S firehouse/SM firelight/ZMR fireman/M firemen fireplace/SM fireplug/MS firepower/M fireproof/DSG firer/M firesafe firescreen/S fireside/MS firestorm/MS firetrap/MS firetruck/MS firewall/MS firewater/M firewood/M firework/SM firkin firm/MDRYPTGS firmament/SM firmness/M firmware/MS first/SMY firstborn/SM firsthand firth/M firths fiscal/MYS fish/MDRSZG fishbowl/SM fishcake/SM fisher/M fisherman/M fishermen fishery/SM fishhook/SM fishily fishiness/M fishing/M fishmonger/MS fishnet/SM fishpond/MS fishtail/DGS fishwife/M fishwives fishy/TRP fissile fission/BSM fissure/DSM fist/MS fistfight/MS fistful/SM fisticuffs/M fistula/SM fistulous/M fit/KAMS fitful/YP fitfulness/M fitly fitment/S fitness/UM fitted/UA fitter/MS fittest fitting/SMY five/MZRS fivefold fix/ZGBJMDRS fixate/GNVDSX fixation/M fixative/MS fixed/Y fixer/M fixings/M fixity/M fixture/MS fizz/MDSG fizzle/DSMG fizzy/RT fjord/SM fl/JDG flab/M flabbergast/GSD flabbily flabbiness/M flabby/RPT flaccid/Y flaccidity/M flack/SM flag/MS flagella flagellant/S flagellate/GNDS flagellation/M flagellum/M flagged flagging/U flagman/M flagmen flagon/MS flagpole/SM flagrance/M flagrancy/M flagrant/Y flagship/SM flagstaff/MS flagstone/MS flail/SGMD flair/SM flak/M flake/DSMG flakiness/M flaky/TRP flam flamage/S flambe/MS flambeed flambeing flamboyance/M flamboyancy/M flamboyant/Y flame/DRSJMZG flamenco/MS flameproof/DSG flamethrower/MS flamingo/MS flammability/IM flammable/SM flan/MS flange/MDS flank/SZGMDR flanker/M flannel/SGMD flannelet/M flap/MS flapjack/MS flapped flapper/SM flapping flare/DSMG flareup/SM flash/ZTGMDRS flashback/SM flashbulb/SM flashcard/SM flashcube/SM flasher/M flashgun/SM flashily flashiness/M flashing/M flashlight/MS flashy/RTP flask/SM flat/MYPS flatbed/SM flatboat/SM flatcar/SM flatfeet flatfish/MS flatfoot/SMD flatiron/SM flatland/M flatlet/S flatmate/S flatness/M flatted flatten/SDG flatter/SDRZG flatterer/M flattering/Y flattery/M flattest flatting flattish flattop/SM flatulence/M flatulent flatus/M flatware/M flatworm/SM flaunt/MDSG flaunting/Y flautist/SM flavor/MDSGJ flavored/U flavorful flavoring/M flavorless flavorsome flaw/MDGS flawless/PY flawlessness/M flax/MN flay/DRZGS flea/MS fleabag/SM fleabite/S fleapit/S fleck/SGMD fledged/U fledgelings fledgling/MS flee/S fleece/MZGDRS fleecer/M fleeciness/M fleecy/RTP fleeing fleet/STGMDRYP fleetingly/M fleetingness/M fleetness/M flesh/GMDSY fleshless fleshly/TR fleshpot/MS fleshy/RT flew flex/AMS flexed flexibilities flexibility/IM flexible/I flexibly/I flexing flextime/M flibbertigibbet/MS flick/SZGMDR flicker/GMD flickery flier/M flight/MDS flightiness/M flightless flightpath flighty/PTR flimflam/SM flimflammed flimflamming flimsily flimsiness/M flimsy/TRP flinch/GMDS fling/GM flint/SM flintlock/SM flinty/TR flip/MS flippable flippancy/M flippant/Y flipped flipper/MS flippest flipping flippy/S flirt/SGMD flirtation/SM flirtatious/YP flirtatiousness/M flirty flit/MS flitted flitting float/SMDRZG floater/M floaty flocculation flock/SMDG flocking/M floe/MS flog/S flogged flogger/SM flogging/MS flood/SMDRG floodgate/MS floodlight/MDGS floodlit floodplain/MS floodwater/M floor/SMDG floorboard/MS flooring/M floorspace floorwalker/MS floozy/SM flop/MS flophouse/MS flopped flopper floppily floppiness/M flopping floppy/PRSMT flora/SM floral florescence/IM florescent/I floret/SM florid/PY floridness/M florin/SM florist/SM floss/MDSG flossy/RT flotation/SM flotilla/MS flotsam/M flounce/DSMG flouncy/TR flounder/MDSG flour/SMDG flourish/GMDS floury/RT flout/SMDRZG flouter/M flow/IMGS flowchart/SM flowed flower's flower/CSDG flowerbed/MS floweriness/M flowering/S flowerless flowerpot/MS flowery/PTR flown flt flu/M flub/MS flubbed flubbing fluctuate/XGNDS fluctuation/M flue/MS fluency/M fluent/Y fluff/SMDG fluffiness/M fluffy/RPT fluid/SMY fluidity/M fluidized fluke/SM fluky/RT flume/SM flummox/DSG flung flunk/SMDG flunky/SM fluoresce/DSG fluorescence/M fluorescent fluoridate/GNDS fluoridation/M fluoride/SM fluorine/M fluorite/M fluorocarbon/SM fluoroscope/MS fluoroscopic flurry/GDSM flush/MDRSTG fluster/MDSG flute/DSMG fluting/M flutist/MS flutter/MDSG fluttery fluvial flux's flux/ADG fluxes fly/ZTGBDRSM flyaway flyblown flyby/M flybys flycatcher/MS flying/M flyleaf/M flyleaves flyover/MS flypaper/SM flypast/S flysheet/S flyspeck/GMDS flyswatter/MS flytrap/S flyway/SM flyweight/SM flywheel/MS foal/MDGS foam/MDGS foaminess/M foamy/RTP fob/SM fobbed fobbing focal/Y focus's focus/ADSG focused/U fodder/SM foe/SM foetid fog's fog/CS fogbound fogged/C foggily fogginess/M fogging/C foggy/RTP foghorn/MS fogy/SM fogyish foible/SM foil/MDGS foist/SDG fol fold's fold/AUSGD foldaway folder/SM foldout/MS foliage/M foliate folio/SM folk/MS folklore/M folkloric folklorist/MS folksiness/M folksinger/SM folksinging/M folksong folksy/PTR folktale/MS folkway/MS foll follicle/MS follicular follow/SDRZGBJ follower/M following/M followup/S folly/SM foment/SGD fomentation/M fond/RYTP fondant/MS fondle/DSG fondness/M fondue/SM font/MS fontanel/MS foo foobar/S food/MS foodie/SM foodstuff/SM fool/MDGS foolery/SM foolhardily foolhardiness/M foolhardy/PTR foolish/TRYP foolishness/M foolproof foolscap/M foot/MDRZGSJ footage/M football/MRZGS footballer/M footbridge/MS footfall/MS foothill/MS foothold/MS footie footing/M footless footlights/M footling/MS footlocker/SM footloose footman/M footmarks footmen footnote/MGDS footpads footpath/M footpaths footplate/S footprint/SM footrace/MS footrest/MS footsie/SM footslogging footsore footstep/MS footstool/SM footwear/M footwork/M footy fop/SM foppery/M foppish/P foppishness/M for/H fora forage/DRSMZG forager/M foray/SMDG forbade forbear/SMG forbearance/M forbid/S forbidden forbidding/YS forbore forborne force/DSMG forced/U forceful/PY forcefulness/M forceps/M forcible forcibly ford/MDGSB fordable/U fore/MS forearm/GSMD forebear/MS forebode/GJDS foreboding/M forecast/MRZGS forecaster/M forecastle/MS foreclose/DSG foreclosure/SM forecourt/SM foredeck foredoom/DGS forefather/MS forefeet forefinger/SM forefoot/M forefront/SM foregoing foregone foreground/MDGS forehand/MS forehead/MS foreign/ZRP foreigner/M foreignness/M foreknew foreknow/GS foreknowledge/M foreknown foreleg/SM forelimb/MS forelock/MS foreman/M foremast/MS foremen foremost forename/MDS forenoon/MS forensic/MS forensically forensics/M foreordain/GDS forepart/MS forepaws foreperson/SM foreplay/M forequarter/SM forerunner/MS foresail/MS foresaw foresee/RSBZ foreseeability foreseeable/U foreseeing foreseen/U foreseer/M foreshadow/SGD foreshore/S foreshorten/SDG foresight/MD foresightedness/M foreskin/MS forest's forest/ACGDS forestall/SGD forestation/ACM forester/MS forestland/M forestry/M foretaste/DSMG foretell/GS forethought/M foretold forever/M forevermore forewarn/DSG forewent forewoman/M forewomen foreword/MS forfeit/GSMD forfeiture/SM forgather/SDG forgave forge/DRSMZGVJ forger/M forgery/SM forget/S forgetful/PY forgetfulness/M forgettable/U forgetting forging/M forgivable/U forgive/BRSZGP forgiven/U forgiveness/M forgiver/M forgiving/U forgo/RZG forgoer/M forgoes forgone forgot forgotten/U fork/MDGS forkful/SM forklift/MS forlorn/PTRY form's form/CAIFDGS formal/SMY formaldehyde/M formalin formalism/MS formalist/MS formalistic formalities formality/IM formalization/MS formalize/GDS formant format/SMV formation/CFASM formatted/A formatting/M formed/U former/AIFMS formerly formfitting formic formidable formidably formless/PY formlessness/M formula/MS formulaic formulate/ADSGNX formulated/U formulation/AM formulator/SM fornicate/GNDS fornication/M fornicator/MS forsake/GS forsaken forsook forsooth forswear/SG forswore forsworn forsythia/SM fort/MS forte/SM forthcoming/M forthright/PY forthrightness/M forthwith fortieth/M fortieths fortification/M fortified/U fortifier/M fortify/DRSZGNX fortissimo fortitude/M fortnight/MYS fortress/MS fortuitous/PY fortuitousness/M fortuity/M fortunate/UY fortune/MS fortuneteller/SM fortunetelling/M forty/SMH forum/SM forward/MDRYZTGSP forwarder/M forwardness/M forwent fossil/SM fossiliferous fossilization/M fossilize/GDS foster/GSD fought foul/MDRYTGSP foulard/M foulmouthed foulness/M found/FSDG foundation/SM foundational founded/U founder/GMDS foundling/SM foundry/SM fount/SM fountain/SM fountainhead/MS four/MHS fourfold fourpence fourpenny fourposter/MS fourscore/M foursome/SM foursquare fourteen/SMH fourteenth/M fourteenths fourth/MY fourths fowl/MDGS fox/GMDS foxfire/M foxglove/SM foxhole/MS foxhound/SM foxhunt/GS foxily foxiness/M foxtrot/MS foxtrotted foxtrotting foxy/RTP foyer/SM fps fr fracas/MS fractal/SM fraction/IASM fractional/Y fractionate/GND fractious/YP fractiousness/M fracture/MGDS frag/S fragile/RT fragility/M fragment/GMDS fragmentary/M fragmentation/M fragrance/MS fragrant/Y frail/RYTP frailness/M frailty/SM frame/DRSMZG framed/U framer/M framework/SM franc/SM franchise's franchise/EDSG franchisee/SM franchiser/SM francium/M francophone frangibility/M frangible frank/SMDRYTGP frankfurter/MS frankincense/M frankness/M frantic frantically frappe/SM frat/MS fraternal/Y fraternity/FSM fraternization/M fraternize/ZGDRS fraternizer/M fratricidal fratricide/MS fraud's fraud/S fraudster/S fraudulence/M fraudulent/Y fraught fray's fray/CDGS frazzle/MGDS freak/SMDG freakish/YP freakishness/M freaky/RT freckle/DSMG freckly/TR free/YTDRS freebase/MGDS freebie/SM freebooter/SM freeborn freedman/M freedmen freedom/SM freehand freehold/ZMRS freeholder/M freeing freelance/DRSMZG freelancer/M freeload/SDRZG freeloader/M freeman/M freemasonry freemen freephone freesia/S freestanding freestone/SM freestyle/SM freethinker/SM freethinking/M freeware/SM freeway/MS freewheel/DSG freewill freezable freeze's freeze/UAGS freezer/MS freezing's freight/MDRZGS freighter/M french frenetic frenetically frenzied/Y frenzy/DSM freon/S freq frequencies frequency/IM frequent/DRYSZTG frequented/U frequenter/M fresco/M frescoes fresh/PNRYXZT freshen/ZGDR freshener/M freshet/MS freshman/M freshmen freshness/M freshwater/M fret/MS fretboard fretful/YP fretfulness/M fretsaw/MS fretted fretting fretwork/M friable friar/SM friary/SM fricassee/DSM fricasseeing fricative/SM friction/SM frictional frictionless fridge/SM friedcake/MS friend/SM friendless/P friendlies friendlily friendliness/UM friendly's friendly/UTPR friendship/SM frieze/SM frig/S frigate/MS frigged frigging fright/SXGMDN frighten/DZG frightening/Y frightful/PY frightfulness/M frigid/YP frigidity/M frigidness/M frill/SMD frilly/TR fringe's fringe/IDSG frippery/SM frisk/SDG friskily friskiness/M frisky/TRP frisson/S fritter/MDSG fritz/M frivolity/SM frivolous/YP frivolousness/M frizz/MDSYG frizzle/MGDS frizzly/TR frizzy/TR fro frock's frock/CUS frog/MS frogging/DGS frogman/M frogmarch/GDS frogmen frogspawn frolic/SM frolicked frolicker/SM frolicking frolicsome from frond/SM front's front/FSDG frontage/MS frontal/Y frontbench/ZRS frontier/MS frontiersman/M frontiersmen frontierswoman frontierswomen frontispiece/SM frontward/S frosh/M frost's frost/CSDG frostbit frostbite/MGS frostbitten frostily frostiness/M frosting/M frosty/TPR froth/MDG frothiness/M froths frothy/TPR froufrou/M froward/P frowardness/M frown/SMDG frowning/Y frowzily frowziness/M frowzy/TPR froze/AU frozen/UA fructify/DSG fructose/M frugal/Y frugality/M fruit/SMDG fruitcake/MS fruiterer/S fruitful/PY fruitfuller fruitfullest fruitfulness/M fruitiness/M fruition/M fruitless/YP fruitlessness/M fruity/TPR frump/SM frumpish frumpy/TR frustrate/GNDSX frustrated/Y frustrating/Y frustration/M frustum/MS fry/GDSM fryer/SM ft ftp/ZGSR fuchsia/MS fuck/GDRMZS! fucker/M! fuckhead/S! fuddle/DSMG fudge/DSMG fuel's fuel/ADGS fug fugal fuggy fugitive/MS fugue/SM fuhrer/SM fulcrum/MS fulfill/LDGS fulfilled/U fulfillment/M full/MDRZTGSP fullback/MS fuller/M fullish fullness/M fullstops fully fulminate/DSXGN fulmination/M fulsome/PY fulsomeness/M fum/S fumarole/S fumble/DRSMZG fumbler/M fumbling/Y fume/MGDS fumigant/MS fumigate/GNDS fumigation/M fumigator/SM fuming/Y fumy/RT fun/M function/MDGS functional/Y functionalism functionalist/S functionality functionary/SM functionless fund/AMDGS fundamental/SMY fundamentalism/M fundamentalist/MS funded/U fundholders fundholding funding/M fundraiser/MS funeral/MS funerary funereal/Y funfair/S fungal fungi fungible/MS fungicidal fungicide/MS fungoid fungous fungus/M funicular/SM funk/MDGS funkiness/M funky/PRT funnel/MDGS funner funnest funnily funniness/M funny/TPRSM funnyman/M funnymen fur/SM furbelow/M furbish/ADSG furious/Y furl's furl/UDGS furlong/SM furlough/GMD furloughs furn furnace/SM furnish/ADSG furnished/U furnishings/M furniture/M furor/SM furred furrier/M furriness/M furring/M furrow/MDSG furry/ZTRP further/SGD furtherance/M furthermore furthermost furthest furtive/YP furtiveness/M fury/SM furze/M fuse's/A fuse/CAIFGDS fusee/SM fuselage/SM fusibility/M fusible fusilier/SM fusillade/MS fusion/IFKSM fuss/MDSG fussbudget/SM fussily fussiness/M fusspot/SM fussy/TRP fustian/M fustiness/M fusty/TRP fut futile/Y futility/M futon/SM future/MS futurism/M futurist/MS futuristic futurity/SM futurologist/MS futurology/M futz/DSG fuzz/MDSG fuzzball/S fuzzily fuzziness/M fuzzy/PTR fwd fwy g/SNXB gab/SM gabardine/SM gabbed gabbiness/M gabbing gabble/DSMG gabby/RTP gabfest/MS gable/DSM gad/S gadabout/SM gadded gadder/SM gadding gadfly/SM gadget/SM gadgetry/M gadolinium/M gaff/MDRZGS gaffe/SM gaffer/M gag/SM gaga gagged gagging gaggle/SM gaiety/M gaily gain's gain/ADGS gainer/SM gainful/Y gainsaid gainsay/ZGRS gainsayer/M gait/MRZS gaiter/M gal/SM gala/MS galactic galaxy/SM gale's gale/AS galena/M gall/MDGS gallant/SMY gallantry/SM gallbladder/SM galleon/SM galleria/MS gallery/DSM galley/SM gallimaufry/SM gallium/M gallivant/GSD gallon/SM gallop/SMDG gallows/M gallstone/MS galoot/SM galore galosh/MS galumph/DG galumphs galvanic galvanism/M galvanization/M galvanize/DSG galvanometer/MS galvanometric gambit/SM gamble/DRSMZG gambler/M gambling/M gambol/SMDG game/MYZTGDRSP gamecock/MS gamekeeper/SM gameness/M gamesmanship/M gamesmen gamester/MS gamete/SM gametic gamin/SM gamine/SM gaminess/M gaming/M gamma/SM gammon/M gammy gamut/SM gamy/RTP gander/SM gang/MDGS gangbusters/M gangland/M ganglia gangling ganglion/M ganglionic gangplank/SM gangrene/DSMG gangrenous gangsta/S gangster/SM gangsterism gangway/MS ganja gannet/SM gantlet/MS gantry/SM gaolbirds gaolbreak/S gap/GSMD gape/MS gaping/Y gar/SLM garage/DSMG garb/MDGS garbage/M garbageman garbanzo/SM garble/DSG garcon/SM garden/SZGMDR gardener/M gardenia/MS gardening/M garfish/MS gargantuan gargle/DSMG gargoyle/SM garish/PY garishness/M garland/MDGS garlic/M garlicky garment/MS garner/SGD garnet/SM garnish/GLMDS garnishee/DSM garnisheeing garnishment/MS garret/SM garrison/MDSG garrote/MZGDRS garroter/M garrulity/M garrulous/YP garrulousness/M garter/SM gas's gas/CS gasbag/SM gaseous gash/MDSG gasholder/S gasket/SM gaslight/MS gasman gasmen gasohol/M gasoline/M gasometer/S gasp/MDGS gassed/C gasses gassing/C gassy/RT gastric gastritis/M gastroenteritis/M gastrointestinal gastronome/S gastronomic gastronomical/Y gastronomy/M gastropod/SM gasworks/M gate/MGDS gateau/S gateaux gatecrash/DRSZG gatecrasher/M gatehouse/SM gatekeeper/MS gatepost/MS gateway/MS gather/SJZGMDR gathered/I gatherer/M gathering/M gator/SM gauche/RPYT gaucheness/M gaucherie/M gaucho/SM gaudily gaudiness/M gaudy/RPT gauge/DSMG gaunt/RYPT gauntlet/MS gauntness/M gauze/M gauziness/M gauzy/RPT gave gavel/SM gavotte/MS gawd gawk/DGS gawkily gawkiness/M gawky/RPT gawp/DGS gay/TSPMR gayness/M gaze/MZGDRS gazebo/SM gazelle/MS gazer/M gazette/MGDS gazetteer/MS gazillion/S gazpacho/M gazump/DGS gear/MDGS gearbox/MS gearing/M gearshift/MS gearstick gearwheel/SM gecko/SM geddit gee/DS geeing geek/MS geeky/RT geese geezer/MS geisha/M gel/SM gelatin/M gelatinous gelcap/M geld/DJGS gelding/M gelid gelignite/M gelled gelling gem/SM gemological gemologist/MS gemology/M gemstone/MS gendarme/MS gender/MDS genderless gene/MS genealogical/Y genealogist/SM genealogy/SM genera general/SMY generalissimo/SM generalist/MS generality/SM generalization/MS generalize/GBDS generalship/M generate/ACDSGNV generation's/C generation/ASM generational generator/SM generic/SM generically generosity/SM generous/UY generousness/M genes/S genesis/M genetic/S genetically geneticist/SM genetics/M genial/FY geniality/FM genie/SM genii genital/FY genitalia/M genitals/M genitive/MS genitourinary genius/MS genned genning genocidal genocide/MS genome/MS genomic genotype/S genre/SM gent/AMS genteel/RYTP genteelness/M gentian/SM gentile/SM gentility/M gentle/TGDRSP gentlefolk/SM gentlefolks/M gentleman/MY gentlemanly/U gentlemen gentleness/M gentlewoman/M gentlewomen gently gentrification/M gentrify/DSGN gentry/SM genuflect/DGS genuflection/MS genuine/PY genuineness/M genus/M geocentric geocentrically geochemical geochemistry/M geode/SM geodesic/SM geodesy/M geodetic geog geographer/SM geographic geographical/Y geography/SM geologic geological/Y geologist/MS geology/SM geom geomagnetic geomagnetically geomagnetism/M geometer/S geometric geometrical/Y geometry/SM geomorphology geophysical geophysicist/SM geophysics/M geopolitical geopolitics/M geoscientific geostationary geosynchronous geosyncline/SM geothermal geothermic geranium/MS gerbil/MS geriatric/S geriatrician/S geriatrics/M germ/MS germane germanium/M germicidal germicide/MS germinal/M germinate/GNDS germinated/U germination/M gerontocracy gerontological gerontologist/SM gerontology/M gerrymander/SMDG gerrymandering/M gerund/VMS gestalt/S gestapo/MS gestate/GNDS gestation/M gestational gesticulate/XDSGN gesticulation/M gestural gesture/MGDS gesundheit get/SM getaway/SM gettable getter getting getup/M gewgaw/SM geyser/SM ghastliness/M ghastly/TPR ghat/MS ghee gherkin/MS ghetto/SM ghettoize/GDS ghost/SMDYG ghostlike ghostliness/M ghostly/RTP ghostwrite/ZGRS ghostwriter/M ghostwritten ghostwrote ghoul/SM ghoulish/PY ghoulishness/M giant/SM giantess/MS giantkiller gibber/GDS gibberish/M gibbet/GMDS gibbon/MS gibbous gibe/MGDS giblet/SM giddily giddiness/M giddy/RTP gift/MDGS gig/SM gigabyte/MS gigahertz/M gigantic gigantically gigavolt gigged gigging giggle/DRSMZG giggler/M giggly/RT gigolo/SM gild/MDRZGS gilder/M gilding/M gill/MS gillie/S gillion/S gilt/MS gimbals/M gimcrack/SM gimcrackery/M gimlet/GSMD gimme/SM gimmick/MS gimmickry/M gimmicky gimp/MDGS gimpy/RT gin/SM ginger/GSMDY gingerbread/M gingersnap/SM gingery gingham/M gingivitis/M ginkgo/M ginkgoes ginned ginning ginormous ginseng/M giraffe/MS gird/DRZGS girder/M girdle/DSMG girl/MS girlfriend/SM girlhood/SM girlie girlish/YP girlishness/M giro/S girt/MDGS girth/M girths gist/M git/S gite/S give/MZGJRS giveaway/MS giveback/MS given/SM giver/M gizzard/MS glace/S glaceed glaceing glacial/Y glaciate/XGNDS glaciation/M glacier/MS glaciological glaciologist/S glaciology glad/MYSP gladden/GDS gladder gladdest glade/SM gladiator/SM gladiatorial gladiola/SM gladioli gladiolus/M gladly/TR gladness/M gladsome/RT glam glamor/SGMD glamorization/M glamorize/DSG glamorous/Y glance/DSMG gland/SM glandes glandular glans/M glare/DSMG glaring/Y glasnost/M glass/MDSG glassblower/MS glassblowing/M glassful/SM glasshouse/S glassily glassiness/M glassless glassware/M glassy/RTP glaucoma/M glaze/DSMG glazed/U glazier/SM glazing/M gleam/SMDGJ glean/SDRZGJ gleaner/M gleanings/M glee/M gleeful/YP gleefulness/M glen/MS glib/YP glibber glibbest glibness/M glide/DRSMZG glider/M gliding/M glimmer/MDGJS glimmering/M glimpse/MGDS glint/SMDG glissandi glissando/M glisten/MDSG glister/DSG glitch/GMDS glitter/MDSG glitterati glittery glitz/M glitzy/TR gloaming/SM gloat/SMDG gloating/Y glob/MDGS global/Y globalism/M globalist/MS globalization/M globalize/GDS globe/SM globetrotter/MS globetrotting globular globule/MS globulin/M glockenspiel/MS gloom/M gloomily gloominess/M gloomy/TRP glop/M gloppy/TR glorification/M glorify/GNDS glorious/IY glory/DSMG gloss/MDSG glossary/SM glossily glossiness/M glossolalia/M glossy/PTRSM glottal glottis/MS glove/DSMG glow/MDRZGS glower/GMD glowing/Y glowworm/MS glucose/M glue/MGDS glued/U gluey gluier gluiest glum/YP glummer glummest glumness/M gluon glut/MNS glutamate gluten/M glutenous glutinous/Y glutted glutting glutton/MS gluttonous/Y gluttony/M glycerin/M glycerol/M glycine glycogen/M glycol glyph glyphs gm gnarl/SMDG gnarly/TR gnash/MDSG gnat/MS gnaw/DGS gneiss/M gnocchi gnome/SM gnomic gnomish gnostic gnosticism gnu/SM go/SJMRHZG goad/MDGS goal/MS goalie/SM goalkeeper/SM goalkeeping/M goalless goalmouth goalmouths goalpost/MS goalscorer/S goalscoring goaltender/SM goat/MS goatee/SM goatherd/MS goatskin/MS gob/SM gobbed gobbet/SM gobbing gobble/DRSMZG gobbledygook/M gobbler/M goblet/SM goblin/SM gobsmacked gobstopper/S god/SM godawful godchild/M godchildren goddammit goddamn goddaughter/SM goddess/MS godfather/SM godforsaken godhead/M godhood/M godless/PY godlessness/M godlike godliness/UM godly/URTP godmother/SM godparent/SM godsend/SM godson/SM godspeed goer/M goes gofer/SM goggle/DSMG goggles/M going/M goiter/SM gold/MNRTS goldbrick/SZGMDR goldbricker/M golden/TR goldenrod/M goldfield/S goldfinch/MS goldfish/MS goldmine/SM goldsmith/M goldsmiths golf/MDRZGS golfer/M golliwog/S golly/SM gonad/SM gonadal gondola/MS gondolier/SM gone/ZR goner/M gong/MDGS gonk/DGS gonna gonorrhea/M gonorrheal gonzo goo/M goober/SM good/MYSP goodbye/MS goodhearted goodish goodly/TR goodness/M goodnight goods/M goodwill/M goody/SM gooey goof/MDGS goofball/SM goofiness/M goofy/RPT googly/S gooier gooiest gook/MS goon/MS goop/M goose/DSMG gooseberry/SM goosebumps/M goosestep/S goosestepped goosestepping gopher/SM gore/MGDS gorge's gorge/EDSG gorgeous/YP gorgeousness/M gorgon/SM gorilla/MS gorily goriness/M gormandize/DRSZG gormandizer/M gormless gorp/MS gorse/M gory/RTP gosh goshawk/MS gosling/SM gospel/MS gossamer/M gossip/MDRZGS gossiper/M gossipy got gotcha/S goths gotta gotten gouache/S gouge/DRSMZG gouger/M goulash/MS gourd/SM gourde/MS gourmand/SM gourmet/SM gout/M gouty/TR gov govern/DGSBL governable/U governance/M governed/U governess/MS government/MS governmental governor/SM governorship/MS govt gown/MDGS gr grab/MS grabbed grabber/MS grabbing grabby/TR grace/EDSMG graceful/EPY gracefuller gracefullest gracefulness/EM graceless/YP gracelessness/M gracious/UY graciousness/M grackle/MS grad/MRZSBJ gradate/XGNDS gradation/CSM grade's grade/CADSG graded/U grader/M gradient/MS gradual/PY gradualism/M gradualist gradualness/M graduand/S graduate/XMGNDS graduation/M graffiti graffito/M graft/SMDRZG grafter/M graham/S grail/S grain/ISMD graininess/M grainy/PTR gram/KMS grammar/MS grammarian/SM grammatical/UY gramophone/MS grampus/MS gran/S granary/SM grand/SMRYPT grandam/MS grandaunt/MS grandchild/M grandchildren granddad/SM granddaddy/SM granddaughter/MS grandee/MS grandeur/M grandfather/SMDYG grandiloquence/M grandiloquent grandiose/Y grandiosity/M grandma/MS grandmaster/S grandmother/MYS grandnephew/MS grandness/M grandniece/MS grandpa/MS grandparent/MS grandson/MS grandstand/SMDG granduncle/SM grange/SM granite/MS granitic granny/SM granola/M grant/SMDRZG grantee/MS granter/M grantsmanship/M granular granularity/M granulate/GNDS granulation/M granule/MS grape/SM grapefruit/SM grapeshot/M grapevine/SM graph/MDG graphic/MS graphical/Y graphite/M graphologist/SM graphology/M graphs grapnel/MS grapple/MGDS grasp/SMDRBG grass/MDSG grasshopper/SM grassland/MS grassroots grassy/TR grate/DRSMZGJ grateful/UYP gratefuller gratefullest gratefulness/UM grater/M graticule gratification/M gratify/XNGDS gratifying/Y gratin/S grating/MY gratis gratitude/IM gratuitous/YP gratuitousness/M gratuity/SM gravamen/MS grave/DRSMYTGP gravedigger/MS gravel/SGMDY graven graveness/M graveside/MS gravestone/SM graveyard/MS gravid gravimeter/SM gravitas gravitate/GNDS gravitation/M gravitational/Y graviton/S gravity/SM gravy/SM gray/MDRTGSP graybeard/SM grayish grayness/M graze/DRSMZG grazer/M grease/DRSMZG greasepaint/M greaseproof greasily greasiness/M greasy/PTR great/SMRYPT greatcoat/SM greathearted greatness/M grebe/SM greed/M greedily greediness/M greedy/PTR green/GPSMDRYT greenback/MS greenbelt/MS greenery/M greenfield greenfly/S greengage/MS greengrocer/MS greengrocery greenhorn/SM greenhouse/SM greenish greenmail/M greenness/M greenroom/SM greensward/M greenwood/M greet/ZGJSDR greeter/M greeting/M gregarious/PY gregariousness/M gremlin/SM grenade/SM grenadier/MS grenadine/M grep/S grepped grepping grew/A greybeard greyhound/SM greyness gribble/S grid/MS gridded griddle/SM griddlecake/SM gridiron/SM gridlock/SMD grief/SM grievance/MS grieve/ZGDRS griever/M grievous/YP grievousness/M griffin/SM grill/SGMDJ grille/MS grim/DYPG grimace/DSMG grime/SM griminess/M grimmer grimmest grimness/M grimy/TRP grin/MS grind/SZGMRJ grinder/M grindstone/SM gringo/MS grinned grinner grinning grip/MDRSZG gripe/SM griper/M grippe/MZGDR gripper/M grisliness/M grisly/RTP grist/MY gristle/M gristly/RT gristmill/MS grit/MS grits/M gritted gritter/SM grittiness/M gritting gritty/RTP grizzle/DSG grizzly/TRSM groan/SZGMDR groat/SM grocer/MS grocery/SM grog/M groggily grogginess/M groggy/PRT groin/SM grok/S grokked grokking grommet/SM groom/SZGMDR groomer/M grooming/M groomsman/M groomsmen groove/MGDS groovy/RT grope/DRSJMZG groper/M groping/Y grosbeak/MS grosgrain/M gross/PTGMDRSY grossness/M grotesque/SMYP grotesqueness/M grotto/M grottoes grotty/TR grouch/GMDS grouchily grouchiness/M grouchy/RTP ground/ZGMDRJS groundbreaking/MS groundcloth groundcloths grounded/U grounder/M groundhog/MS grounding/M groundless/Y groundnut/MS groundsheet/S groundskeeper/S groundsman groundsmen groundswell/SM groundwater/M groundwork/M group/JSZGMDR grouper/M groupie/MS grouping/M groupware/M grouse/MZGDRS grouser/M grout/SGMD grove/SM grovel/ZGDRS groveler/M grovelled grovelling grow/AHSG grower/MS growing/I growl/SZGMDR growler/M grown/AI grownup/MS growth/AM growths groyne/S grub/MS grubbed grubber/MS grubbily grubbiness/M grubbing grubby/TRP grubstake/M grudge/MGDS grudging/Y grue/S gruel/GJM grueling/Y gruesome/RYTP gruesomeness/M gruff/TPRY gruffness/M grumble/DRSMZGJ grumbler/M grump/SM grumpily grumpiness/M grumpy/PRT grunge/MS grungy/RT grunion/SM grunt/SGMD gt guacamole/M guanine/M guano/M guarani/MS guarantee/MDS guaranteeing guarantor/MS guaranty/GDSM guard/SZGMDR guarded/YP guarder/M guardhouse/SM guardian/SM guardianship/M guardrail/SM guardroom/SM guardsman/M guardsmen guava/SM gubernatorial gudgeon guerrilla/SM guess/ZGBMDRS guessable/U guesser/M guesstimate/DSMG guesswork/M guest/SGMD guesthouse/S guestroom/S guff/M guffaw/MDGS guidance/M guide/DRSMZG guidebook/SM guided/U guideline/SM guidepost/SM guider/M guild/SZMR guilder/M guildhall/MS guile/M guileful guileless/PY guilelessness/M guillemot/S guillotine/DSMG guilt/M guiltily guiltiness/M guiltless guilty/PRT guinea/MS guise/ESM guitar/MS guitarist/SM gulag/SM gulch/MS gulden/MS gulf/MS gull/MDSG gullet/MS gullibility/M gullible gully/SM gulp/MDRSZG gulper/M gum/M gumball/S gumbo/SM gumboil/SM gumboot/S gumdrop/SM gummed gumming gummy/TR gumption/M gumshoe/MDS gumshoeing gumtree/S gun/SM gunboat/SM gunfight/MRZS gunfighter/M gunfire/M gunge gungy gunk/M gunky/TR gunman/M gunmen gunmetal/M gunned gunner/MS gunnery/M gunning gunny/M gunnysack/MS gunpoint/M gunpowder/M gunrunner/MS gunrunning/M gunship/MS gunshot/MS gunslinger/SM gunsmith/M gunsmiths gunwale/MS guppy/SM gurgle/MGDS gurney/MS guru/MS gush/MDRSZG gusher/M gushing/Y gushy/TR gusset/MSDG gussy/DSG gust/EMDSG gustatory gustily gusto/M gusty/RT gut/SM gutless/P gutlessness/M gutsy/RT gutted gutter/SMDG guttersnipe/SM gutting guttural/MYS gutty/RT guv/S guvnor/S guy/SGMD guzzle/DRSZG guzzler/M gym/SM gymkhana/MS gymnasium/MS gymnast/MS gymnastic/S gymnastically gymnastics/M gymnosperm/SM gymslip/S gynecologic gynecological gynecologist/MS gynecology/M gyp/SM gypped gypper/SM gypping gypster/SM gypsum/M gypsy/SM gyrate/DSGNX gyration/M gyrator/SM gyrfalcon/MS gyro/MS gyromagnetic gyroscope/MS gyroscopic gyve/MGDS h'm h/NRSXZGVJ ha/SH haberdasher/MS haberdashery/SM habiliment/SM habit's habit/ISB habitability/M habitat/SM habitation/MS habitual/YP habitualness/M habituate/GNDS habituation/M habitue/SM hacienda/SM hack/BMDRZGS hacker/M hacking/M hackish/SP hackishness/S hackitude/S hackle/MS hackney/SMDG hacksaw/SM hackwork/M had haddock/SM hadn't hadron/S hadst haemorrhoid hafnium/M haft/MS hag/SM haggard/YP haggardness/M haggis/MS haggish haggle/MZGDRS haggler/M hagiographer/SM hagiography/SM hahnium/M haiku/M hail/MDGS hailstone/MS hailstorm/MS hair/MDS hairball/MS hairband/S hairbreadth/M hairbreadths hairbrush/MS haircare haircloth/M haircut/SM hairdo/MS hairdresser/MS hairdressing/M hairdryer/MS hairgrip/S hairiness/M hairless hairlike hairline/SM hairnet/SM hairpiece/MS hairpin/SM hairsbreadth/M hairsbreadths hairsplitter/MS hairsplitting/M hairspray/S hairspring/SM hairstyle/MGS hairstylist/MS hairy/TRP haj hajj/M hajjes hajji/SM hake/MS halal/M halberd/SM halcyon hale/ITGDRS half/M halfback/SM halfbreed halfhearted/YP halfheartedness/M halfpence halfpenny/SM halfpennyworth halftime/MS halftone/MS halfway halfwit/SM halibut/SM halide/S halite/M halitosis/M hall/MS hallelujah/M hallelujahs hallmark/GMDS hallow/DSG hallowed/U hallucinate/DSXGN hallucination/M hallucinatory hallucinogen/SM hallucinogenic/MS hallway/SM halo/MDGS halogen/SM halogenated halon/S halt/MDRZGS halter/GMD halterneck/S halting/Y halve/DSG halyard/MS ham/SM hamburg/SZMR hamburger/M hamlet/MS hammed hammer/MDRSJZG hammerer/M hammerhead/SM hammerlock/SM hammertoe/MS hamming hammock/SM hammy/TR hamper/GMDS hampered/U hamster/MS hamstring/SGM hamstrung hand's hand/UDGS handbag/SM handball/MS handbarrow/SM handbasin handbill/MS handbook/MS handbrake/S handcar/SM handcart/MS handclasp/MS handcraft/SMDG handcuff/MDGS handed/P handful/SM handgun/SM handhold/MS handicap/MS handicapped handicapper/SM handicapping handicraft/MS handily handiness/M handiwork/M handkerchief/SM handle/MZGDRS handlebar/MS handler/M handmade handmaid/XMNS handmaiden/M handout/SM handover/S handpick/GDS handrail/MS handsaw/SM handset/SM handshake/JMGS handsome/PYTR handsomeness/M handspring/MS handstand/SM handwork/M handwoven handwriting/M handwritten handy/UTR handyman/M handymen hang/MDRJZGS hangar/MS hangdog hanger/M hanging/M hangman/M hangmen hangnail/MS hangout/SM hangover/MS hangup/MS hank/MRZS hanker/GJD hankering/M hankie/MS hansom/MS hap/MY haphazard/YP haphazardness/M hapless/YP haplessness/M haploid/MS happen/SDGJ happening/M happenstance/MS happily/U happiness/UM happy/URTP harangue/MGDS harass/LZGDRS harasser/M harassment/M harbinger/SM harbor/GMDS harbormaster/S hard/NRYXTP hardback/MS hardball/M hardboard/M hardbound hardcore hardcover/SM harden/ZGDR hardened/U hardener/M hardhat/MS hardheaded/PY hardheadedness/M hardhearted/PY hardheartedness/M hardihood/M hardily hardiness/M hardliner/MS hardness/M hardscrabble hardship/SM hardstand/SM hardtack/M hardtop/SM hardware/M hardwired hardwood/SM hardworking hardy/PTR hare/MGDS harebell/MS harebrained harelip/SM harelipped harem/SM haricot/S hark/DGS harlequin/SM harlot/SM harlotry/M harm/MDRGS harmed/U harmful/YP harmfulness/M harmless/PY harmlessness/M harmonic/SM harmonica/MS harmonically harmonies harmonious/PY harmoniousness/M harmonium/MS harmonization/M harmonize/ZGDRS harmonizer/M harmony/EM harness's harness/UDSG harp/MDGS harpist/SM harpoon/ZGSMDR harpooner/M harpsichord/SM harpsichordist/MS harpy/SM harridan/MS harrier/M harrow/SMDG harrumph/GD harrumphs harry/DRSZG harsh/RYTP harshness/M hart/MS harvest/SMDRZG harvested/U harvester/M hash/AMDSG hashish/M hasn't hasp/MS hassle/DSMG hassock/SM hast/DNXG haste/SM hasten/DG hastily hastiness/M hasty/RTP hat/ZGSMDR hatband/S hatbox/MS hatch/MDSG hatchback/MS hatcheck/SM hatched/U hatchery/SM hatchet/SM hatching/M hatchway/SM hate/MS hateful/PY hatefulness/M hatemonger/MS hater/M hatpin/S hatred/SM hatstand/S hatted hatter/SM hatting hauberk/SM haughtily haughtiness/M haughty/PRT haul/MDRZGS haulage/M hauler/M haulier/S haunch/MS haunt/SMDRZG haunter/M haunting/Y hauteur/M have/MGS haven't haven/SM havering haversack/SM havoc/M haw/GSMD hawk/MDRZGS hawker/M hawkish/P hawkishness/M hawser/SM hawthorn/MS hay/GSMD haycock/SM hayfield hayloft/SM haymaking haymow/SM hayrick/MS hayride/MS hayseed/MS haystack/SM haywain haywire hazard/SMDG hazardous/Y haze/MZGJDRS hazel/SM hazelnut/MS hazer/M hazily haziness/M hazing/M hazy/RTP hdqrs he'd he'll he/M head/MDRZGJS headache/MS headband/MS headbanger/S headbanging headboard/SM headbutt/DSG headcase/S headcheese headcount/S headdress/MS header/M headfirst headgear/M headhunt/DRSZG headhunter/M headhunting/M headily headiness/M heading/M headlamp/MS headland/MS headless headlight/MS headline/MZGDRS headliner/M headlock/MS headlong headman/M headmaster/SM headmastership headmen headmistress/MS headnote headphone/MS headpiece/MS headpin/SM headquarter/SGD headquarters/M headrest/MS headroom/M headscarf headscarves headset/SM headship/SM headshrinker/MS headsman/M headsmen headstall/SM headstand/SM headstock headstone/SM headstrong headteacher/S headwaiter/MS headwaters/M headway/M headwind/SM headword/SM heady/RTP heal/DRHZGS healed/U healer/M health/M healthful/PY healthfulness/M healthily/U healthiness/UM healths healthy/UTRP heap/MDGS hear/AHGJS heard/AU hearer/SM hearing/AM hearken/SGD hearsay/M hearse's hearse/AS heart/SM heartache/MS heartbeat/MS heartbreak/MSG heartbroken heartburn/M hearten/ESGD heartfelt hearth/M hearthrug/S hearths hearthstone/MS heartily heartiness/M heartland/MS heartless/YP heartlessness/M heartrending/Y heartsick/P heartsickness/M heartstrings/M heartthrob/MS heartwarming heartwood/M hearty/RSMPT heat's heat/ADGS heated/U heatedly heater/SM heath/MNRXZ heathen/M heathendom/M heathenish heathenism/M heather/M heathery heathland heaths heating/M heatproof heatstroke/M heatwave/S heave/DRSMZG heaven/SMY heavenly/TR heavens/M heavenward/S heaver/M heavily heaviness/M heavy/RSMTP heavyhearted heavyset heavyweight/SM heck/M heckle/DRSMZG heckler/M heckling/M hectare/SM hectic hectically hectogram/SM hectoliters hectometer/MS hector/SMDG hedge/DRSMZG hedgehog/MS hedgehop/S hedgehopped hedgehopping hedger/M hedgerow/SM hedonism/M hedonist/MS hedonistic heed/MDGS heeded/U heedful/Y heedless/PY heedlessness/M heehaw/SMDG heel/MDGS heelless heft/MDGS heftily heftiness/M hefty/PRT hegemonic hegemony/M hegira/SM heifer/SM height/XSMN heighten/DG heinous/YP heinousness/M heir/MS heiress/MS heirloom/SM heist/SMDG held helical helices helicopter/SMDG heliocentric heliography heliosphere heliotrope/SM helipad/S heliport/MS helium/M helix/M hell/MS hellbent hellcat/MS hellebore/M hellfire hellhole/MS hellion/MS hellish/YP hellishness/M hello/SM helluva helm/MS helmet/SMD helmsman/M helmsmen helot/SM help/MDRZGSJ helper/M helpful/UY helpfulness/M helping/M helpless/PY helplessness/M helpline/S helpmate/SM helve/SM hem/SM hematite/M hematologic hematological hematologist/SM hematology/M heme/M hemisphere/SM hemispheric hemispherical hemline/SM hemlock/SM hemmed hemmer/SM hemming hemoglobin/M hemophilia/M hemophiliac/SM hemorrhage/MGDS hemorrhagic hemorrhoid/MS hemostat/MS hemp/MN hemstitch/MDSG hen/M hence henceforth henceforward henchman/M henchmen henge henna/SMDG henpeck/GSD hep heparin/M hepatic hepatitis/M hepper heppest heptagon/MS heptagonal heptane heptathlon/SM her/M herald/SMDG heralded/U heraldic heraldry/M herb/MS herbaceous herbage/M herbal/S herbalism herbalist/MS herbicidal herbicide/MS herbivore/SM herbivorous herculean herd/MDRZGS herder/M herdsman/M herdsmen here/M hereabout/S hereafter/SM hereby hereditary heredity/M herein hereinafter hereof hereon heresy/SM heretic/SM heretical hereto heretofore hereunder hereunto hereupon herewith heritability heritable/I heritage/MS hermaphrodite/SM hermaphroditic hermeneutic/S hermetic hermetical/Y hermit/SM hermitage/MS hernia/SM hernial herniate/GNDS herniation/M hero/M heroes heroic/S heroically heroics/M heroin/SM heroine/SM heroism/M heron/SM herpes/M herpetologist/SM herpetology/M herring/MS herringbone/M herself hertz/M hesitance/M hesitancy/M hesitant/Y hesitate/DSGNX hesitating/UY hesitation/M hessian hetero/SM heterodox heterodoxy/M heterogeneity/M heterogeneous/Y heterosexual/MYS heterosexuality/M heterozygous heuristic/MS heuristically heuristics/M hew/ZGSDR hewer/M hex/GMDS hexadecimal/S hexagon/MS hexagonal hexagram/SM hexameter/SM hexane hey heyday/SM hf hgt hgwy hi/SD hiatus/MS hibachi/MS hibernate/GNDS hibernation/M hibernator/SM hibiscus/MS hiccup/GSMD hick/MS hickey/SM hickory/SM hid hidden/U hide/MZGJDRS hideaway/SM hidebound hideous/YP hideousness/M hideout/MS hider/M hiding/M hie/S hieing hierarchic hierarchical/Y hierarchy/SM hieratic hieroglyph/M hieroglyphic/SM hieroglyphs high/MRYZTP highball/SM highborn highboy/MS highbrow/SM highchair/MS highfalutin highhanded/PY highhandedness/M highish highland/MRZS highlander/M highlight/SMDRZG highlighter/M highness/M highpoint highroad/MS highs hightail/DSG highway/MS highwayman/M highwaymen hijack/SJZGMDR hijacker/M hijacking/M hike/MZGDRS hiker/M hiking/M hilarious/PY hilariousness/M hilarity/M hill/MS hillbilly/SM hilliness/M hillock/MS hillside/SM hilltop/MS hillwalking hilly/PRT hilt/MS him/SM himself hind/MRZS hinder/GD hindered/U hindmost hindquarter/MS hindrance/SM hindsight/M hinge's hinge/UDSG hint/MDRZGS hinter/M hinterland/MS hip/SPM hipbath hipbaths hipbone/MS hiphuggers hipness/M hipped hipper hippest hippie/SM hipping hippo/SM hippodrome/SM hippopotamus/MS hipster/MS hire's hire/AGDS hireling/MS hirer hirsute/P hirsuteness/M hiss/MDSGJ hist histamine/MS histogram/MS histological histologist/SM histology/M historian/MS historic historical/Y historicist historicity/M historiographer/MS historiographical historiography/M history/SM histrionic/S histrionically histrionics/M hit/SM hitch's hitch/UDSG hitcher/MS hitchhike/DRSMZG hitchhiker/M hither hitherto hittable hitter/SM hitting hive/MGDS hiya hm ho/SMDRYZ hoar hoard/SZGMDRJ hoarder/M hoarding/M hoarfrost/M hoariness/M hoarse/YTRP hoarseness/M hoary/TRP hoax/MDRSZG hoaxer/M hob/SM hobbit/S hobble/MZGDRS hobbler/M hobby/SM hobbyhorse/MS hobbyist/SM hobgoblin/MS hobnail/SGMD hobnob/S hobnobbed hobnobbing hobo/MS hock/MDSG hockey/M hockshop/MS hod/SM hodgepodge/SM hoe/SM hoecake/SM hoedown/SM hoeing hoer/M hog/SM hogan/SM hogback/SM hogged hogger hogging hoggish/Y hogshead/SM hogtie/DS hogtying hogwash/M hoick/SGD hoist/SGMD hoke/GDS hokey hokier hokiest hokum/M hold/MRBJSZG holdall/S holder/M holding/M holdout/SM holdover/SM holdup/MS hole/MGDS holey holiday/SMDG holidaymaker/S holiness/UM holism holistic holistically holler/MDGS hollow/MDRYPSTG hollowness/M holly/SM hollyhock/MS holmium/M holocaust/SM hologram/MS holograph/M holographic holographs holography/M hols holster/SMDG holy/URPT homage/MS hombre/MS homburg/SM home/MYZGDRS homebody/SM homeboy/SM homecoming/SM homegrown homeland/MS homeless/MP homelessness/M homelike homeliness/M homely/PRT homemade homemaker/SM homemaking/M homeomorphism/S homeopath/M homeopathic homeopaths homeopathy/M homeostasis/M homeostatic homeowner/MS homepage/MS homer/GMD homeroom/MS homeschooling/M homesick/P homesickness/M homespun/M homestead/SMDRZG homesteader/M homestretch/MS hometown/MS homeward homework/MRZG homey/SMP homeyness/M homicidal homicide/MS homier homiest homiletic homily/SM hominid/SM hominy/M homo/MS homoerotic homogenates homogeneity/M homogeneous/Y homogenization/M homogenize/DSG homograph/M homographs homological homologous homologue homology/S homomorphism/S homonym/SM homophobes homophobia/M homophobic homophone/MS homophony homosexual/SMY homosexuality/M homotopy homozygous homunculus hon/SZTGMDR honcho/MS hone/MS honer/M honest/EYT honester honesty/EM honey/SGMD honeybee/SM honeycomb/GMDS honeydew/SM honeylocust/M honeymoon/MDRSZG honeymooner/M honeypot/S honeysuckle/SM honk/MDRSZG honker/M honky/SM honor/ESGMDB honorableness/M honorably/E honorarily honorarium/MS honorary honored/U honoree/SM honorer/SM honorific/MS hooch/M hood/MDSG hoodlum/SM hoodoo/MDSG hoodwink/DGS hooey/M hoof/MDRSZG hook's hook/UDSG hookah/M hookahs hooker/MS hookup/MS hookworm/MS hooky/M hooligan/MS hooliganism/M hoop/MDSG hoopla/M hooray/MDSG hoosegow/SM hoot/MDRSZG hootenanny/SM hooter/M hoover/DSG hooves hop/SGMD hope/MS hoped/U hopeful/PSMY hopefulness/M hopeless/PY hopelessness/M hopped hopper/MS hopping hopscotch/GMDS hora/MS horde/DSMG horehound/SM horizon/SM horizontal/MYS hormonal/Y hormone/SM horn/MDS hornbeam hornblende/M hornet/MS hornless hornlike hornpipe/MS horny/TR horologic horological horologist/MS horology/M horoscope/SM horrendous/Y horrible/P horribleness/M horribly horrid/Y horrific horrifically horrify/DSG horrifying/Y horror/MS horse's horse/UDSG horseback/M horsebox/S horseflesh/M horsefly/SM horsehair/M horsehide/M horselaugh/M horselaughs horseless horseman/M horsemanship/M horsemen horseplay/M horsepower/M horseradish/MS horseshit/! horseshoe/DSM horseshoeing horsetail/SM horsetrading horsewhip/SM horsewhipped horsewhipping horsewoman/M horsewomen horsey horsier horsiest hortatory horticultural horticulturalist/S horticulture/M horticulturist/MS hosanna/SM hose/MGDS hosepipe/S hosier/MS hosiery/M hosp hospice/MS hospitable/I hospitably/I hospital/SM hospitality/M hospitalization/MS hospitalize/GDS host/MDSG hostage/MS hostel/ZGMDRS hosteler/M hostelry/SM hostess/MDSG hostile/MYS hostilities/M hostility/SM hostler/MS hot/SYP hotbed/MS hotblooded hotbox/MS hotcake/SM hotel/SM hotelier/MS hotfoot/MDGS hothead/DSM hotheaded/YP hotheadedness/M hothouse/SM hotlink/S hotness/M hotplate/SM hotpot/S hots/M hotshot/MS hotted hotter hottest hotting hound/SGMD hour/MYS hourglass/MS houri/SM house's house/ADSG houseboat/SM housebound houseboy/SM housebreak/RSZG housebreaker/M housebreaking/M housebroke housebroken housebuilding houseclean/DGS housecleaning/M housecoat/SM housefly/SM houseful/SM household/SMRZ householder/M househusband/MS housekeeper/MS housekeeping/M houselights/M housemaid/SM houseman/M housemaster/S housemate/S housemen housemistress/S housemother/SM housemoving houseparent/SM houseplant/MS houseproud houseroom housetop/SM housewares/M housewarming/MS housewife/MY housewives housework/M housing/MS hove hovel/SM hover/SGDR hovercraft/MS how/SM howbeit howdah/M howdahs howdy however howitzer/SM howl/MDRSZG howler/M howsoever hoyden/MS hoydenish hp hr/S ht huarache/SM hub/SM hubbub/SM hubby/SM hubcap/SM hubris/M huckleberry/SM huckster/SGMD hucksterism/M huddle/DSMG hue/DSM huff/MDSG huffily huffiness/M huffy/PRT hug/STMR huge/YP hugeness/M hugged hugging huh hula/MS hulk/MSG hull/MDRSZG hullabaloo/SM huller/M hum/SM human/SMRYTP humane/PY humaneness/M humanism/M humanist/SM humanistic humanitarian/SM humanitarianism/M humanities/M humanity/ISM humanization/CM humanize/CDSG humanizer/SM humankind/M humanness/M humanoid/SM humble/DRSZTGJP humbleness/M humbler/M humbly humbug/SM humbugged humbugging humdinger/MS humdrum/M humeral humeri humerus/M humid/Y humidification/M humidifier/CM humidify/CZGDRS humidity/M humidor/SM humiliate/XDSGN humiliating/Y humiliation/M humility/M hummable hummed hummer/SM humming hummingbird/SM hummock/SM hummocky hummus/M humongous humor/SMDG humorist/MS humorless/PY humorlessness/M humorous/PY humorousness/M hump/MDSG humpback/MDS humph/DG humphs humus/M hunch/MDSG hunchback/SMD hundred/SMH hundredfold hundredth/M hundredths hundredweight/MS hung hunger/SMDG hungover hungrily hungriness/M hungry/PRT hunk/MRSZ hunker/DG hunky/RT hunt/MDRSZG hunter/M hunting/M huntress/MS huntsman/M huntsmen hurdle/DRSMZG hurdler/M hurdling/M hurl/MDRSZG hurler/M hurling/M hurrah's hurray/GSD hurricane/MS hurried/UY hurry/DSMG hurt/MSG hurtful/YP hurtfulness/M hurtle/DSG husband/GMDS husbandman/M husbandmen husbandry/M hush/MDSG husk/MDRSZG husker/M huskily huskiness/M husky/PRSMT hussar/SM hussy/SM hustings/M hustle/DRSMZG hustler/M hut/SM hutch/MS huzzah/MDG huzzahs hwy hyacinth/M hyacinths hybrid/SM hybridism/M hybridization/M hybridize/DSG hydra/SM hydrangea/SM hydrant/MS hydrate's hydrate/CGNDS hydration/CM hydraulic/S hydraulically hydraulics/M hydrazine hydride hydro/M hydrocarbon/SM hydrocephalus/M hydrochloric hydrochloride hydrodynamic/S hydrodynamical hydrodynamics/M hydroelectric hydroelectrically hydroelectricity/M hydrofluoric hydrofoil/MS hydrogen/M hydrogenate/CDSGN hydrogenation/M hydrogenous hydrological hydrologist/MS hydrology/M hydrolysis/M hydrolyze/DSG hydromagnetic hydromechanics hydrometer/SM hydrometry/M hydrophobia/M hydrophobic hydrophone/MS hydroplane/MGDS hydroponic/S hydroponically hydroponics/M hydrosphere/M hydrostatic/S hydrotherapy/M hydrothermal hydrous hydroxide/SM hyena/SM hygiene/M hygienic/U hygienically hygienist/MS hygrometer/SM hygroscopic hying hymen/SM hymeneal hymn/MDSG hymnal/MS hymnbook/SM hype/MGDRS hyperactive hyperactivity/M hyperbola/SM hyperbole/M hyperbolic hyperboloid/S hypercritical/Y hypercube/S hyperfine hyperglycemia/M hyperinflation hyperlink/SM hypermarket/S hypermedia/M hyperplane/S hypersensitive/P hypersensitiveness/M hypersensitivity/SM hypersonic hyperspace/S hypersphere hypertension/M hypertensive/MS hypertext/M hyperthyroid/M hyperthyroidism/M hypertrophy/GDSM hyperventilate/GNDS hyperventilation/M hyphen/MDSG hyphenate/XDSMGN hyphenated/U hyphenation/M hypnoses hypnosis/M hypnotherapist/S hypnotherapy/M hypnotic/SM hypnotically hypnotism/M hypnotist/MS hypnotize/GDS hypo/MS hypoallergenic hypocaust hypochondria/M hypochondriac/MS hypocrisy/SM hypocrite/MS hypocritical/Y hypodermic/SM hypoglycemia/M hypoglycemic/SM hypotenuse/SM hypothalami hypothalamus/M hypothermia/M hypotheses hypothesis/M hypothesize/GDRS hypothetical/Y hypothyroid/M hypothyroidism/M hypoxia hyssop/M hysterectomy/SM hysteresis hysteria/M hysteric/SM hysterical/Y hysterics/M i/US iamb/MS iambi iambic/SM iambus/MS iatrogenic ibex/MS ibid ibidem ibis/MS ibuprofen/M ice's ice/CDSG iceberg/SM iceboat/SM icebound icebox/MS icebreaker/MS icecap/SM iceman/M icemen icepack icepick/S ichneumon ichthyologist/MS ichthyology/M icicle/SM icily iciness/M icing/SM icky/RT icon/MS iconic iconoclasm/M iconoclast/MS iconoclastic iconographic iconography/M icosahedra icosahedral icosahedron ictus/M icy/TPR id/SMY idea/MS ideal/SMY idealism/M idealist/SM idealistic idealistically idealization/SM idealize/DSG idem idempotent identical/Y identifiable/U identifiably identification/M identified/U identify/ZGNDRSX identikit/S identity/SM ideogram/SM ideograph/M ideographic ideographs ideological/Y ideologist/MS ideologue/MS ideology/SM ides/M idiocy/SM idiolect idiom/SM idiomatic/U idiomatically idiopathic idiosyncrasy/SM idiosyncratic idiosyncratically idiot/SM idiotic idiotically idle/MZTGDRSP idleness/M idler/M idol/MS idolater/SM idolatress/MS idolatrous idolatry/M idolization/M idolize/GDS idyll/SM idyllic idyllically if/SM iffiness/M iffy/RTP igloo/SM igneous ignitable ignite/AGDS ignition/MS ignoble ignobly ignominious/Y ignominy/SM ignoramus/MS ignorance/M ignorant/Y ignore/GDSB iguana/MS ii iii ilea ileitis/M ileum/M ilia ilium/M ilk/SM ill/SMP illegal/MYS illegality/SM illegibility/M illegible illegibly illegitimacy/M illegitimate/Y illiberal/Y illiberality/M illicit/YP illicitness/M illimitable illiquid illiteracy/M illiterate/MYS illness/MS illogical/Y illogicality/M illuminant illuminate/XDSGN illuminating/Y illumination/M illumine/DSBG illus/V illusion/EMS illusionist/SM illusory illustrate/GNVDSX illustrated/U illustration/M illustrative/Y illustrator/SM illustrious/PY illustriousness/M ilmenite image/DSMG imagery/M imaginable/U imaginably/U imaginary imagination/SM imaginative/UY imagine/DSBJG imagined/U imago/M imagoes imam/MS imbalance/DSM imbecile/MS imbecilic imbecility/SM imbibe/ZGDRS imbiber/M imbrication/M imbroglio/SM imbue/DSG imitable/I imitate/DSGNVX imitation/M imitative/PY imitativeness/M imitator/SM immaculate/PY immaculateness/M immanence/M immanency/M immanent/Y immaterial/YP immateriality/M immaterialness/M immature/Y immaturity/M immeasurable immeasurably immediacies/M immediacy/SM immediate/YP immediateness/M immemorial/Y immense/RYTP immensity/SM immerse/XDSGN immersible immersion/M immigrant/SM immigrate/DSGNX immigration/M imminence/M imminent/Y immiscible immobile immobilisers immobility/M immobilization/M immobilize/ZGDRS immoderate/Y immodest/Y immodesty/M immolate/DSGN immolation/M immoral/Y immorality/SM immortal/MYS immortality/M immortalize/GDS immovability/M immovable immovably immune immunity/SM immunization/MS immunize/GDS immunoassay immunodeficiency/M immunodeficient immunologic immunological/Y immunologist/MS immunology/M immure/DSG immutability/M immutable immutably imp/SMR impact/SMDG impaction impair/SDGL impaired/U impairment/SM impala/SM impale/DRSGL impalement/M impalpable impalpably impanel/SDG impart/SDG impartial/Y impartiality/M impassably impasse/BSMV impassibility/M impassible impassibly impassioned impassive/PY impassiveness/M impassivity/M impasto/M impatience/MS impatiens/M impatient/Y impeach/ZGBLDRS impeachable/U impeacher/M impeachment/SM impeccability/M impeccable impeccably impecunious/PY impecuniousness/M impedance/M impede/DSG impeded/U impediment/MS impedimenta/M impel/S impelled impeller/MS impelling impend/SDG impenetrability/M impenetrable impenetrably impenitence/M impenitent/Y imperative/MYS imperceptibility/M imperceptible imperceptibly imperceptive imperf imperfect/SPMY imperfection/SM imperfectness/M imperial/MYS imperialism/M imperialist/SM imperialistic imperialistically imperil/GSLD imperilment/M imperious/PY imperiousness/M imperishable imperishably impermanence/M impermanent/Y impermeability/M impermeable impermeably impermissible impersonal/Y impersonality impersonate/XDSGN impersonation/M impersonator/MS impertinence/MS impertinent/Y imperturbability/M imperturbable imperturbably impervious/Y impetigo/M impetuosity/M impetuous/YP impetuousness/M impetus/MS impiety/SM impinge/LDSG impingement/M impious/PY impiousness/M impish/YP impishness/M implacability/M implacable implacably implant/BSGMD implantation/M implausibility/SM implausible implausibly implement/BZGMDRS implementable/U implementation/SM implemented/UA implementing/A implicate/DSG implication/M implicit/PY implicitness/M implied/Y implode/DSG implore/DSG imploring/Y implosion/MS implosive imply/XDSGN impolite/YP impoliteness/MS impolitic imponderable/SM import/ZGBSMDR importance/M important/Y importation/SM importer/M importing/A importunate/Y importune/GDS importunity/M imposable impose/ADSG imposer/MS imposing/U imposingly imposition/SM impossibility/SM impossible/S impossibly impost/SM impostor/SM imposture/MS impotence/M impotency/M impotent/Y impound/DGS impoverish/LGDS impoverishment/M impracticability impracticable impracticably impractical/Y impracticality/SM imprecate/DSXGN imprecation/M imprecise/PYN impreciseness/M imprecision/M impregnability/M impregnable impregnably impregnate/GNDS impregnation/M impresario/SM impress/MDSGV impressed/U impressibility/M impressible impression/MSB impressionability/M impressionism/M impressionist/SM impressionistic impressive/YP impressiveness/M imprimatur/MS imprint/MDRZGS imprinter/M imprison/SDGL imprisonment/MS improbability/SM improbable improbably impromptu/SM improper/Y impropriety/SM improve/GBDRSL improved/U improvement/SM improvidence/M improvident/Y improvisation/SM improvisational improvisatory improvise/ZGDRS improviser/M imprudence/M imprudent/Y impudence/M impudent/Y impugn/ZGBSDR impugner/M impulse/MGNVDS impulsion/M impulsive/PY impulsiveness/M impunity/M impure/RYT impurity/SM imputation/SM impute/BDSG in/ASM inaction/M inactivity inadequacy/S inadvertence/M inadvertent/Y inalienability/M inalienably inamorata/SM inane/RYT inanimate/PY inanimateness/M inanity/SM inapplicability inappropriate/Y inarticulate/Y inasmuch inaudible inaugural/SM inaugurate/GNDSX inauguration/M inboard/MS inbound inbreed/S inc/TGD incalculably incandescence/M incandescent/Y incant incantation/SM incantatory incapable incapacitate/DSGN incarcerate/GNXDS incarceration/M incarnadine/GDS incarnate/AXGNDS incarnation/AM incendiary/SM incense/MGDS incentive's incentive/ES inception/SM incessant/Y incest/MS incestuous/PY incestuousness/M inch/MDSG inchoate inchworm/SM incidence/SM incident/SM incidental/MYS incinerate/DSGN incineration/M incinerator/SM incipience/M incipient/Y incise/XGNVDS incision/M incisive/YP incisiveness/M incisor/MS incitement/MS inciter/MS incl inclement inclination/EM inclinations incline's incline/EGDS include/GDS inclusion/MS inclusive/YP inclusiveness/M incognito/MS incoherency incombustible incommode/GD incommodious incommunicado incompetent/SM incomplete/Y inconceivability/M incongruous/PY incongruousness/M inconsolably inconstant/Y incontestability/M incontestably incontinent/Y incontrovertibly inconvenience/DG incorporable incorporate/AGNDS incorporated/U incorporation/AM incorporeal incorrect/Y incorrigibility/M incorrigible incorrigibly incorruptibly increasing/Y increment/SMDG incremental/Y incrementation incriminate/GNDS incrimination/M incriminatory incrustation/MS incubate/GNDS incubation/M incubator/SM incubus/MS inculcate/DSGN inculcation/M inculpate/DSG incumbency/SM incumbent/SM incunabula incunabulum/M incur/SB incurable/MS incurably incurious incurred incurring incursion/MS ind indebted/P indebtedness/M indecent/T indeclinable indeed indefatigable indefatigably indefeasible indefeasibly indelible indelibly indemnification/M indemnify/XGNDS indemnity/SM indentation/SM indention/M indenture/DG indescribably indestructibly indeterminably indeterminacy/M indeterminate/Y index/ZGMDRS indexation/SM indexer/M indicant/S indicate/XDSGNV indication/M indicative/SMY indicator/MS indict/GDSBL indictment/SM indie/S indifference/M indigence/M indigenous indigent/SMY indignant/Y indignation/M indigo/M indirect/Y indiscipline indiscreet/Y indiscretion/S indiscriminate/Y indispensability/M indispensable/MS indispensably indispose/D indissolubility indissolubly indite/GDS indium/M individual/MYS individualism/M individualist/SM individualistic individualistically individuality/M individualization/M individualize/DSG individuate/DSGN individuation/M indivisibly indoctrinate/DSXGN indoctrination/M indoctrinator/S indolence/M indolent/Y indomitable indomitably indubitable indubitably induce/DRSZGL inducement/SM inducer/M inducible inductance/M inductee/SM induction/MS inductive/Y inductor/S indulge/DRSG indulgence/MS indulgent/Y industrial/Y industrialism/M industrialist/MS industrialization/M industrialize/GDS industrious/YP industriousness/M industry/SM indwell/SG inebriate/MGNDS inebriation/M inedible ineffability/M ineffable ineffably ineffectual/P inelastic ineligible/MS ineluctable ineluctably inept/YP ineptitude/M ineptness/M ineradicably inert/YP inertia/M inertial inertness/M inescapable inescapably inestimably inevitability/M inevitable/M inevitably inexact/Y inexactitude/S inexhaustibly inexorability inexorable inexorably inexpedient inexpert/Y inexpiable inexplicably inexpressibility inexpressibly inexpressive inextricably inf/ZT infallible infamy/SM infancy/M infant/MS infanticide/SM infantile infantry/SM infantryman/M infantrymen infarct/MS infarction/M infatuate/DSXGN infatuation/M infeasibility infect/AESDVG infected/U infection/ASM infectious/PY infectiousness/M infelicitous inference/SM inferential/Y inferior/MS inferiority/M infernal/Y inferno/MS inferred inferring infest/GDS infestation/SM infidel/MS infidelity/S infiltrate/X infiltrator/SM infinite/MYV infinitesimal/SMY infinitival infinitive/SM infinitude/M infinity/SM infirm infirmary/SM infirmity/SM infix inflame/DSG inflammable inflammation/SM inflammatory inflatable/SM inflate/DSGNB inflation/EM inflationary inflect/SDG inflection/MS inflectional inflict/SDRGV infliction/MS influence/MGDS influenced/U influential/Y influenza/M influx/MS info/M infomercial/MS informal/Y informant/SM informatics information/EM informational informative/UY informativeness/M informatory informed/U infotainment/M infra infrared/M infrasonic infrastructural infrastructure/MS infrequence/M infrequent/Y infringement/MS infuriate/GDS infuriating/Y infuser/SM ingenious/PY ingeniousness/M ingenue/SM ingenuity/M ingenuous/EY ingenuousness/M ingest/SDG ingestion/M inglenook/SM ingoing ingot/SM ingrain/G ingrate/SM ingratiate/GNDS ingratiating/Y ingratiation/M ingredient/MS ingress/MS ingression inguinal inhabit/DG inhabitable/U inhabitant/SM inhabited/U inhalant/SM inhalation/SM inhalator/MS inhaler/SM inharmonious inhere/DSG inherent/Y inherit/EGSD inheritance/EM inheritances inheritor/SM inhibit/GSD inhibition/SM inhibitor/SM inhibitory inhomogeneity/S inhomogeneous inhuman/Y inhumane/Y inimical/Y inimitably iniquitous/Y iniquity/SM initial/SGMDY initialization/S initialize/ADG initialized/U initializes initiate/XMGNVDS initiated/U initiation/M initiative/SM initiator/MS initiatory inject/SDG injection/SM injector/SM injure/DRSZG injured/U injurer/M injurious/Y ink/MD inkblot/SM inkiness/M inkling/SM inkstand/SM inkwell/MS inky/RTP inland/M inline inmate/SM inmost inn/SGMRJ innards/M innate/PY innateness/M innermost innersole/SM innerspring innervate/GNDS innervation/M inning/M innit innkeeper/MS innocence/M innocent/MRYST innocuous/PY innocuousness/M innovate/XDSGNV innovation/M innovator/MS innovatory innuendo/SM innumerably innumerate inoculate/AGDS inoculation/MS inoperative inordinate/Y inorganic inquire/ZGDR inquirer/M inquiring/Y inquiry/SM inquisition/SM inquisitional inquisitive/YP inquisitiveness/M inquisitor/MS inquisitorial/Y inrush/MS insane/T insanity/S insatiability/M insatiably inscriber/SM inscription/SM inscrutability/M inscrutable/P inscrutableness/M inscrutably inseam/SM insecticidal insecticide/SM insectivore/MS insectivorous insecure/Y inseminate/GNDS insemination/M insensate insensible insensitive/Y inseparable/SM insert's insert/AGSD insertion/AM insertions insetting inshore inside/RSMZ insider/M insidious/PY insidiousness/M insight/MS insightful insignia/SM insinuate/GNVXDS insinuating/Y insinuation/M insinuator/SM insipid/PY insipidity/M insist/SGD insistence/M insistent/Y insisting/Y insofar insole/SM insolence/M insolent/Y insoluble insolubly insolvency/S insomnia/M insomniac/SM insomuch insouciance/M insouciant inspect/AGDS inspection/SM inspector/MS inspectorate/SM inspiration/SM inspirational inspired/U inspiring/U inst instability/S install/BLZR installation/SM installer/M installment/MS instance/GD instant/MRYS instantaneous/Y instantiate/GNDSX instate/AGDS instead instigate/DSGN instigation/M instigator/SM instillation/M instinct/VMS instinctive/Y instinctual institute/MZGNXDRS instituter/M institution/M institutional/Y institutionalism institutionalization/M institutionalize/GDS instr instruct/SDGV instructed/U instruction/SM instructional instructive/Y instructor/MS instrument/GMDS instrumental/SMY instrumentalist/MS instrumentality/M instrumentation/M insubordinate insufferable insufferably insular insularity/M insulate/GNDS insulated/U insulation/M insulator/MS insulin/M insult/SMDRG insulting/Y insuperable insuperably insurance/SM insure/DRSZGB insured/SM insurer/M insurgence/SM insurgency/SM insurgent/MS insurmountably insurrection/MS insurrectionist/MS int intact intaglio/MS integer/MS integrability integrable integral/SMY integrand/S integrate/EAVNGSD integration/AEM integrations integrator/S integrity/M integument/SM intellect/MS intellectual/SMY intellectualism/M intellectuality intellectualize/GDS intelligence/MS intelligent/Y intelligentsia/M intelligibility/M intelligible/U intelligibly/U intended/SM intense/YTVR intensification/M intensifier/M intensify/ZGDRSN intensity/S intensive/PMYS intensiveness/M intent/SMYP intention/MDS intentional/UY intentionality intentness/M inter/ESL interact/SGVD interaction/SM interactive/PY interactivity interbank interbred interbreed/SG intercede/GDS intercept/GMDS interception/MS interceptor/SM intercession/MS intercessor/SM intercessory interchange/DSMG interchangeability interchangeable interchangeably intercity intercollegiate intercom/SM intercommunicate/GNDS intercommunication/M interconnect/GSD interconnected/P interconnection/SM intercontinental interconversion intercourse/M intercultural interdenominational interdepartmental interdependence/M interdependency interdependent/Y interdict/GMDS interdiction/M interdisciplinary interest/ESMD interested/UEY interesting/Y interface/MGDS interfaith interfere/GDRS interference/MS interferometer/S interferometric interferometry interferon/M interfile/GDS intergalactic interglacial intergovernmental interim/M interior/SM interj interject/DGS interjection/MS interjectional interlace/GDS interlard/GDS interleave/GDS interleukin/M interline/JGDS interlinear interlingual interlining/M interlink/GDS interlock/GMDS interlocutor/MS interlocutory interlope/ZGDRS interloper/M interlude/MGDS intermarriage/MS intermarry/DSG intermediary/SM intermediate/SMY interment/EM interments intermezzi intermezzo/MS interminably intermingle/DSG intermission/MS intermittent/Y intermix/GDS intermolecular intern/GDL internal/SY internalization/M internalize/DSG international/SMY internationalism/M internationalist/MS internationalization internationalize/GDS internecine internee/SM internet internist/MS internment/MS internship/MS internuclear interocular interoffice interoperability interoperable interpenetrate/GNDS interpersonal interplanetary interplay/MS interpolate/BXGNDS interpolation/M interpose/GDS interposition/M interpret/AGVDS interpretable/U interpretation/ASM interpretative interpreted/U interpreter/MS interpretive/Y interracial interred/E interregnum/MS interrelate/XGNDS interrelated/P interrelation/M interrelationship/MS interring/E interrogate/GNVDSX interrogation/M interrogative/MYS interrogator/SM interrogatory/SM interrupt/ZGMDRS interrupter/M interruptibility interruption/MS interscholastic intersect/GDS intersection/SM intersession/MS intersperse/GNDS interspersion/M interstate/MS interstellar interstice/MS interstitial/Y intertidal intertwine/GDS interurban interval/SM intervene/GDS intervention/SM interventionism/M interventionist/SM interview/MDRZGS interviewee/MS interviewer/M intervocalic interwar interweave/SG interwove interwoven intestacy/M intestate intestinal intestine/MS intifada intimacy/SM intimate/MYGNDSX intimation/M intimidate/GNDS intimidating/Y intimidation/M intimidatory intonation/SM intonational intoxicant/MS intoxicate/GNDS intoxication/M intracellular intramural intramuscular intranet/S intransigence/M intransigent/SMY intrastate intrauterine intravenous/MSY intrepid/Y intrepidity/M intricacy/SM intricate/Y intrigue/DRSMZG intriguer/M intriguing/Y intrinsic intrinsically intro/SM introduce/AGDS introduction/ASM introductory introit/SM introspect/DGVS introspection/M introspective/Y introversion/M introvert/MDS intrude/DRSZG intruder/M intrusion/SM intrusive/YP intrusiveness/M intuit/SDGV intuition/S intuitionist intuitive/YP intuitiveness/M inundate/XDSGN inundation/M inure/DSG invade/DRSZG invader/M invalid/GMDYS invalidism/M invaluable invaluably invariance invasion/MS invasive invective/SM inveigh/GD inveighs inveigle/ZGDRS inveigler/M invent/ASGVD invented/U invention/AMS inventive/PY inventiveness/M inventor/MS inventory/GDSM inverse/SMY invert/SMDRZG invertible invest/ASDGL investigate/DSXGNV investigation/M investigator/MS investigatory investiture/MS investment/EAM investor/SM inveteracy/M inveterate invidious/PY invidiousness/M invigilate/GNDS invigilator/S invigorate/ADSG invigorating/Y invigoration/M invincibility/M invincibly inviolability/M inviolably inviolate invitation/MS invitational/MS invite/DSMG invited/U invitee/SM inviting/Y invoke/DRSZGB involuntariness/M involuntary/P involute/XN involution/M involve/LDSG involved/U involvement/SM inward/SY ioctl iodide/SM iodine/M iodize/DSG ion/USM ionic ionization/UM ionize/UDSG ionized/C ionizer/MS ionosphere/MS ionospheric iota/MS ipecac/SM irascibility/M irascible irascibly irate/RYTP irateness/M ire/M ireful irenic irides iridescence/M iridescent/Y iridium/M iris/MS irk/SGD irksome/YP irksomeness/M iron/MDSG ironclad/MS ironic ironical/Y ironing/M ironmonger/S ironmongery ironstone/M ironware/M ironwood/MS ironwork/MS irony/SM irradiate/DSGN irradiation/M irrational/SMY irrationality/SM irreclaimable irreconcilability/M irreconcilable irreconcilably irrecoverable irrecoverably irredeemable irredeemably irreducibility irreducible irreducibly irrefutable irrefutably irregardless irregular/MYS irregularity/SM irrelevance/SM irrelevancy/SM irrelevant/Y irreligious irremediable irremediably irremovable irreparable irreparably irreplaceable irrepressible irrepressibly irreproachable irreproachably irresistible irresistibly irresolute/PYN irresoluteness/M irresolution/M irresolvable irrespective/Y irresponsibility/M irresponsible irresponsibly irretrievable irretrievably irreverence/M irreverent/Y irreversibility irreversible irreversibly irrevocable irrevocably irrigable irrigate/DSGN irrigation/M irritability/M irritable irritably irritant/SM irritate/DSXGN irritated/Y irritating/Y irritation/M irrupt/DGVS irruption/SM isinglass/M isl island/SZMR islander/M isle/MS islet/SM ism/CM isms isn't isobar/MS isobaric isolate/DSMGN isolation/M isolationism/M isolationist/MS isolator/S isomer/MS isomeric isomerism/M isometric/S isometrically isometrics/M isomorphic isomorphism/S isoperimetrical isosceles isostatic isotherm/SM isothermal/Y isotonic isotope/SM isotopic isotropic isotropically isotropy issuable issuance/M issue/ADSMG issued/U issuer/MS isthmian isthmus/MS it'd it'll it/USM ital italic/SM italicization/M italicize/GDS italics/M itch/MDSG itchiness/M itchy/RPT item/MS itemization/M itemize/GDS iterate/AXGNVDS iteration/AM iterative/Y iterator/S itinerant/SM itinerary/SM itself iv/U ivory/SM ivy/DSM ix j/F jab/SM jabbed jabber/SMDRZG jabberer/M jabbing jabot/SM jacaranda/MS jack/MDGS jackal/SM jackass/MS jackboot/SMD jackdaw/MS jacket/SMD jackhammer/MS jackknife/MGDS jackknives jackpot/MS jackrabbit/SM jackstraw/MS jacquard/M jacuzzi jade/MGDS jaded/PY jadedness/M jadeite/M jag/SM jagged/TPRY jaggedness/M jaggies/S jaguar/SM jail/MDRZGS jailbird/SM jailbreak/SM jailer/M jailhouse/S jalapeno/MS jalopy/SM jalousie/MS jam/SM jamb/MS jambalaya/M jamboree/MS jammed/U jamming/U jammy/RT jangle/DRSMZG jangler/M jangly janitor/SM janitorial japan/SM japanned japanning jape/MGDS jar/SM jardiniere/SM jarful/MS jargon/M jarred jarring/Y jasmine/SM jasper/M jato/MS jaundice/DSMG jaundiced/U jaunt/SGMD jauntily jauntiness/M jaunty/RPT java/M javelin/SM jaw/SGMD jawbone/DSMG jawbreaker/SM jawline/S jay/SM jaybird/SM jaywalk/DRSZG jaywalker/M jaywalking/M jazz/MDSG jazzy/TR jct jealous/Y jealousy/SM jean/MS jeans/M jeep/MS jeer/MDSG jeering/MY jeez jejuna jejune jejunum/M jell/DSG jello/S jelly/GDSM jellybean/MS jellyfish/MS jellylike jellyroll/SM jemmy/GDS jennet/MS jenny/SM jeopardize/DSG jeopardy/M jeremiad/MS jerk/MDSG jerkily jerkin/MS jerkiness/M jerkwater jerky/TRMP jeroboam/S jerrybuilt jerrycan/S jersey/MS jest/MDRSZG jester/M jesting/Y jet/SM jetliner/SM jetport/MS jetsam/M jetted jetting jettison/MDSG jetty/SM jewel/SZGMDR jeweler/M jewelery/S jewelry/SM jg jib/SGMD jibbed jibbing jibe/MS jiff/MS jiffy/SM jig's jig/AS jigged/A jigger's jigger/ASDG jigging/A jiggle/DSMG jiggly/RT jigsaw/SMDG jihad/SM jilt/MDSG jimmy/DSMG jimsonweed/M jingle/DSMG jingly/TR jingo jingoism/M jingoist/SM jingoistic jink/DSG jinn/MS jinrikisha/SM jinx/MDSG jitney/SM jitter/S jitterbug/MS jitterbugged jitterbugger/M jitterbugging jitters/M jittery/RT jive/MGDS job/SM jobbed jobber/SM jobbing jobholder/MS jobless/P joblessness/M jobshare/S jobsworth jobsworths jock/MS jockey/SGMD jockstrap/MS jocose/PY jocoseness/M jocosity/M jocular/Y jocularity/M jocund/Y jocundity/M jodhpurs/M joey/S jog/SM jogged jogger/SM jogging/M joggle/DSMG john/MS johnny/SM johnnycake/MS join's join/AFDSG joiner/FMS joinery/M joint's joint/EGSD jointly/F jointures joist/SM jojoba joke/MZGDRS joker/M jokey jokier jokiest jokily joking/Y jollification/SM jollily jolliness/M jollity/M jolly/TGPDRSM jolt/MDRSZG jolter/M jonquil/SM josh/MDRSZG josher/M jostle/MGDS jot/SM jotted jotter/MS jotting/MS joule/SM jounce/MGDS jouncy/TR journal/MS journalese/M journalism/M journalist/SM journalistic journey/ZGMDRS journeyer/M journeyman/M journeymen journo/S joust/SZGMDR jouster/M jousting/M jovial/Y joviality/M jowl/MS jowly/TR joy/SGMD joyful/YP joyfuller joyfullest joyfulness/M joyless/PY joylessness/M joyous/YP joyousness/M joyridden joyride/RSMZG joyrider/M joyriding/M joyrode joystick/SM jubilant/Y jubilation/M jubilee/SM judder/GDS judge's judge/ADSG judgeship/M judgment/SM judgmental/Y judicatory/SM judicature/M judicial/Y judiciary/SM judicious/IPY judiciousness/IM judo/M jug/SM jugful/MS jugged juggernaut/SM jugging juggle/MZGDRS juggler/M jugglery/M jugular/SM juice/DRSMZG juicer/M juicily juiciness/M juicy/PTR jujitsu/M jujube/MS jukebox/MS julep/SM julienne jumble/MGDS jumbo/SM jump/MDRSZG jumper/M jumpily jumpiness/M jumpsuit/MS jumpy/TRP jun junco/SM junction/FISM juncture/FMS jungle/MS junior/MS juniority juniper/SM junk/MDRSZG junker/M junket/MDSG junketeer/MS junkie/MTRS junkyard/MS junta/SM juridic juridical/Y jurisdiction/SM jurisdictional jurisprudence/M jurisprudential jurist/MS juristic juror/SM jury/ISM juryman/M jurymen jurywoman/M jurywomen jussive just/UYPT juster justice/IMS justifiability justifiable/U justifiably/U justification/M justificatory justified/AU justify/NGDSX justness/M jut/SM jute/M jutted jutting juvenile/SM juxtapose/DSG juxtaposition/MS k/IFGS kHz kW kWh kabob/SM kaboom kabuki/M kaddish/MS kaffeeklatch/MS kaffeeklatsch/MS kahuna/S kaiser/MS kale/M kaleidoscope/SM kaleidoscopic kaleidoscopically kamikaze/MS kangaroo/MS kaolin/M kapok/M kappa/SM kaput karakul/M karaoke/MS karat/SM karate/M karma/M karmic kart/MS katydid/SM kayak/SMDG kayaking/M kayo/MDSG kazoo/SM kc kebab/SM kedgeree keel/MDSG keelhaul/DGS keen/MDRYSTGP keenness/M keep/MRSZG keeper/M keeping/M keepsake/MS keg/SM kelp/MZ kelvin/SM ken/SM kenned kennel/SGMD kenning keno/M kepi/MS kept keratin/M kerbside kerchief/SM kerfuffle/S kerned kernel/SM kerning kerosene/M kestrel/MS ketch/MS ketchup/M kettle/SM kettledrum/SM kettleful key/SGMD keyboard/ZGSMDR keyboarder/M keyboardist/MS keyhole/MS keynote/MZGDRS keynoter/M keypad/SM keypunch/ZGMDRS keypuncher/M keyring keystone/MS keystroke/SM keyword/MS kg khaki/SM khan/MS kibble/DSMG kibbutz/MS kibbutzim kibitz/ZGDRS kibitzer/M kibosh/M kick/MDRSZG kickback/SM kickball/M kickboxing kicker/M kickoff/MS kickstand/MS kicky/RT kid/SM kidded kidder/SM kiddie/SM kidding kiddish kiddo/SM kidnap/S kidnapped kidnapper/MS kidnapping/MS kidney/SM kidskin/M kielbasa/MS kielbasi kike/S kill/JMDRSZG killdeer/SM killer/M killing/M killjoy/SM kiln/MDSG kilo/MS kilobits kilobyte/SM kilocycle/SM kilogram/SM kilohertz/M kilojoules kiloliter/MS kilometer/MS kiloton/SM kilowatt/SM kilt/MDRS kilter/M kimono/MS kin/SM kind's kind/UPRYT kinda kindergarten/MS kindergartner/SM kindhearted/PY kindheartedness/M kindle/AGDS kindliness/M kindling/M kindly/URT kindness/UM kindnesses kindred/M kinds kine/S kinematic/S kinematics/M kinetic/S kinetically kinetics/M kinfolk/SM kinfolks/M king/MYS kingdom/SM kingfisher/MS kingly/RT kingmaker/S kingpin/SM kingship/M kink/MDSG kinkily kinkiness/M kinky/TPR kinsfolk/M kinship/M kinsman/M kinsmen kinswoman/M kinswomen kiosk/SM kip/SM kipped kipper/MDGS kipping kirsch/MS kismet/M kiss/MDRSBZG kisser/M kissoff/SM kissogram/S kit/SGMD kitchen/SM kitchenette/SM kitchenware/M kite/MS kith/M kitsch/M kitschy kitted kitten/MS kittenish kitting kittiwakes kitty/SM kiwi/MS kiwifruit/MS kl klaxon/S kleptomania/M kleptomaniac/MS kludge/GDS kluge/DSG klutz/MS klutziness/M klutzy/TRP km kn knack/SZMR knacker/GD knackwurst/SM knapsack/MS knave/SM knavery/M knavish/Y knead/SZGDR kneader/M knee/MDS kneecap/SM kneecapped kneecapping kneeing kneel/SG knell/SGMD knelt knew knicker/S knickerbockers/M knickers/M knickknack/MS knife/DSMG knight/MDYSG knighthood/MS knightliness/M knish/MS knit/MS knitted knitter/SM knitting/M knitwear/M knives knob/MS knobbly knobby/TR knock/JSZGMDR knockabout knockdown/SM knocker/M knockoff/SM knockout/SM knoll/SM knot/MS knothole/SM knotted knotting knotty/TR know/SB knowing/UTYS knowinger knowledge/M knowledgeable knowledgeably known knuckle/DSMG knuckleduster/S knucklehead/MS knurl/SGMD koala/SM koan/S kohl kohlrabi/M kohlrabies kola/MS kook/MS kookaburra/SM kookiness/M kooky/TPR kopeck/MS korma kosher/DSG kowtow/GMDS kph kraal/SM kraut's kraut/S! kriegspiel krill/M krona/M krone/RM kronor kronur krypton/M kt kuchen/SM kudos/M kudzu/SM kulaks kumquat/MS kvetch/GMDS kw kyle/S l/SDXTGJ la/M lab/SM label's label/ASDG labeled/U labellings/A labia labial/SM labile labium/M labor/SMDRZG laboratory/SM laborer/M laborious/PY laboriousness/M laborsaving laburnum/MS labyrinth/M labyrinthine labyrinths lac/M lace's lace/UGDS lacerate/DSGNX laceration/M lacewing/SM lacework/M lachrymal lachrymose lack/MDSG lackadaisical/Y lackey/SM lackluster laconic laconically lacquer/GMDS lacrosse/M lactate/GNDS lactation/M lacteal lactic lactose/M lacuna/M lacunae lacy/RT lad/SGMDNJ ladder/GSMD laddie/SM laddish/P lade/S laden/U lading/M ladle/DSMG lady/SM ladybird/SM ladybug/MS ladyfinger/MS ladylike/U ladylove/MS ladyship/MS laetrile/M lag/SZMR lager/M laggard/MYS lagged lagging/M lagniappe/SM lagoon/SM laid/IA lain lair/MS laird/SM laity/M lake/MS lakefront/S lakeside lallygag/S lallygagged lallygagging lam/SM lama/MS lamasery/SM lamb/MDSG lambada/MS lambaste/GDS lambda/SM lambency/M lambent/Y lambkin/SM lambskin/SM lambswool lame/MYZTGDRSP lamebrain/MS lameness/M lament/BSMDG lamentably lamentation/MS lamented/U lamina/M laminae laminar laminate/MGNDS lamination/M lammed lamming lamp/MS lampblack/M lamplight/ZMR lamplighter/M lampoon/SGMD lampoonery lamppost/SM lamprey/MS lampshade/SM lanai/SM lance/DRSMZG lancer/M lancet/SM land/MDRSGJ landau/SM landfall/MS landfill/MS landforms landholder/MS landholding/SM landing/M landlady/SM landless/M landlines landlocked landlord/MS landlubber/MS landmark/MS landmass/MS landmine/S landowner/MS landownership landowning/SM landscape/MZGDRS landscaper/M landslid landslide/MGS landslip/S landsman/M landsmen landward/S lane/MS language/MS languid/PY languidness/M languish/DSG languor/SM languorous/Y lank/RYTP lankiness/M lankness/M lanky/RTP lanolin/M lantern/MS lanthanum/M lanyard/MS lap/SM lapboard/SM lapdog/SM lapel/SM lapidary/SM lapin/SM lapped lappet/SM lapping lapse/AKGMSD laptop/SM lapwing/MS larboard/SM larcenist/SM larcenous larceny/SM larch/MS lard/MDRSZG larder/M lardy/RT large/RSPMYT largehearted largeness/M largess/M largish largo/SM lariat/SM lark/MDSG larkspur/SM larva/M larvae larval laryngeal larynges laryngitis/M larynx/M lasagna/MS lascivious/YP lasciviousness/M lase/ZGDRS laser/M lash/MDSGJ lashing/M lass/MS lassie/SM lassitude/M lasso/SMDG last/MDYSG lasting/Y lat/S latch's latch/UDSG latchkey/SM late/YTRP latecomer/MS latency/SM lateness/M latent lateral/MDYSG lateralization latest/M latex/M lath/MDRSZG lathe/M lather/GMD lathery laths latices latish latitude/MS latitudinal latitudinarian/MS latrine/MS latte/RSM latter/MY lattice/MDS latticework/SM laud/MDSGB laudably laudanum/M laudatory laugh/BMDG laughably laughing/MY laughingstock/SM laughs laughter/M launch/AGMDS launcher/SM launchpad/SM launder/DRZGS launderer/M launderette/MS laundress/MS laundromat/SM laundry/SM laundryman/M laundrymen laundrywoman/M laundrywomen laureate/MS laureateship/M laurel/SM lav/SGD lava/MS lavage/M lavaliere/SM lavatorial lavatory/SM lave/S lavender/SM lavish/PTGDRSY lavishness/M law/SM lawbreaker/SM lawbreaking/M lawful/UPY lawfulness/UM lawgiver/MS lawless/PY lawlessness/M lawmaker/MS lawmaking/M lawman/M lawmen lawn/MS lawnmower/SM lawrencium/M lawsuit/MS lawyer/SM lax/TRYP laxative/MS laxity/M laxness/M lay/AICSGM layabout/S layaway/M layer/CSM layered layering/M layette/MS layman/M laymen layoff/SM layout/SM layover/MS laypeople layperson/MS layup/SM laywoman/M laywomen laze/MGDS lazily laziness/M lazuli lazy/DRSTGP lazybones/M lb/S lbw lea/SM leach/DSG lead/MDNRSZG leader/M leaderless leadership/SM leading/M leaf/MDSG leafage/M leafless leaflet/GMDS leafstalk/MS leafy/PRT league/DSMG leak/MDSG leakage/MS leakiness/M leaky/PRT lean/MDRSTGJP leaning/M leanness/M leap/MDRSZG leaper/M leapfrog/MS leapfrogged leapfrogging learn/AUGDS learnedly learner/MS learning's lease/ADSMG leaseback/SM leasehold/MRSZ leaseholder/M leaser/SM leash's leash/UDSG least/M leastwise leather/MS leatherette/M leatherneck/MS leathery leave/DRSMZGJ leaven/SGMD leavened/U leavening/M leaver/M leavings/M lebensraum lech/MDRSZG lecher/M lecherous/PY lecherousness/M lechery/M lecithin/M lectern/MS lecture/MZGDRS lecturer/M lectureship/MS ledge/RSMZ ledger/M lee/RSMZ leech/MDSG leek/MS leer/MDG leeriness/M leering/Y leery/RPT leeward/SM leeway/M left/MRST leftism/M leftist/SM leftmost leftover/SM leftward/S lefty/SM leg/SM legacy/SM legal/SMY legalese/MS legalism/MS legalistic legalistically legality/SM legalization/M legalize/GDS legate/CXMNS legatee/MS legation's/AC legato/SM legend/SM legendarily legendary legerdemain/M legged legginess/M legging/MS leggy/RPT leghorn/MS legibility/M legible legibly legion/SM legionary/SM legionnaire/SM legislate/DSGNV legislation/M legislative/Y legislator/SM legislature/SM legit legitimacy/M legitimate/DSYGN legitimatize/DSG legitimization/M legitimize/DSG legless legman/M legmen legroom/SM legstraps legume/MS leguminous legwarmer/S legwork/M lei/SM leisure/DMY leisureliness/M leisurewear/M leitmotif/MS leitmotiv/MS lemma/S lemme/JG lemming/M lemon/SM lemonade/SM lemongrass lemony lemur/SM lend/RSZG lender/M length/MNX lengthen/GD lengthily lengthiness/M lengths lengthwise lengthy/PRT lenience/M leniency/M lenient/Y lenitive lens/MSG lent lentil/MS lento leonine leopard/SM leopardess/MS leopardskin leotard/SM leper/SM leprechaun/MS leprosy/M leprous lepta lepton/MS lesbian/SM lesbianism/M lesion/MS less/MNRX lessee/MS lessen/GD lesson/MS lessor/MS let/ISM letdown/SM lethal/Y lethality lethargic lethargically lethargy/M letter/ZGMDRS letterbomb/S letterbox/S lettered/U letterer/M letterhead/MS lettering/M letterpress/M letting/S lettuce/MS letup/SM leucotomy/S leukemia/M leukemic/SM leukocyte/MS levee/SM level/PSZTGMDRY leveler/M levelheaded/P levelheadedness/M levelness/M lever/SGMD leverage/DSMG leviathan/MS levier/M levitate/DSGN levitation/M levity/M levy/DRSMZG lewd/RYPT lewdness/M lexeme/S lexer/S lexical/Y lexicographer/SM lexicographic lexicographical/Y lexicography/M lexicon/SM lexis lg liability/ASM liable/A liaise/GDS liaison/MS liar/MS lib/M libation/SM libber/MS libel/SZGMDR libeler/M libelous liberal/MYPS liberalism/M liberality/M liberalization/SM liberalize/DSG liberalness/M liberate/CDSGN liberation/CM liberationists liberator/MS libero libertarian/MS libertarianism libertine/MS liberty/SM libidinal libidinous libido/MS librarian/MS librarianship library/SM librettist/MS libretto/SM lice license/MGDS licensed/U licensee/MS licentiate/MS licentious/YP licentiousness/M lichen/MDS licit/Y lick/MDJSG lickerish licking/M licorice/SM lid/SM lidded lidless lido/MS lie/DSM lied/MR lief/RT liege/SM lien/MS lieu/M lieutenancy/M lieutenant/SM life/MZR lifebelt/S lifeblood/M lifeboat/MS lifeboatmen lifebuoy/MS lifeforms lifeguard/SM lifeless/PY lifelessness/M lifelike lifeline/MS lifelong lifer/M lifesaver/SM lifesaving/M lifespan/S lifestyle/SM lifetaking lifetime/MS lifework/MS lift/MDRSZG lifter/M liftoff/SM ligament/MS ligand/S ligate/GNDS ligation/M ligature/MGDS light's/C light/CASTGD lighted/U lighten/SDRZG lightener/M lighter/SM lightface/MD lightheaded lighthearted/PY lightheartedness/M lighthouse/MS lighting's lightly lightness/M lightning/MDS lightproof lightship/MS lightweight/SM ligneous lignite/M lii likability/M likableness/M like/MYTGPDRSBJ likelihood/UM likelihoods likeliness/UM likely/UPRT liken/SGD likeness/UM likenesses likewise liking/M lilac/SM lilliputian lilo/S lilt/MDSG lily/SM limb/MS limber/UDSTG limberer limberness/M limbless limbo/SM lime/MGDS limeade/SM limekiln limelight/M limerick/SM limescale limestone/M limey/S limit's limit/CSZGDR limitation/CM limitations limited/U limiter's limiting/S limitless/P limitlessness/M limn/DSG limo/MS limousine/MS limp/MDRYSPTG limpet/MS limpid/YP limpidity/M limpidness/M limpness/M limy/RT linage/M linchpin/SM linden/MS line/MZGDRSJ lineage/MS lineal/Y lineament/SM linear/Y linearity/M linearized linebacker/SM lined/U linefeed lineman/M linemen linen/SM linens/M liner/M linesman/M linesmen lineup/MS ling/M linger/ZGJDRS lingerer/M lingerie/M lingering/Y lingo/M lingoes lingual linguine/M linguist/SM linguistic/S linguistically linguistics/M liniment/SM lining/M link/MDRBSZG linkage/MS linkman linkmen linkup/MS linnet/MS lino linoleum/M linseed/M lint's lint/CDSG lintel/MS linty/TR lion/MS lioness/MS lionhearted lionization/M lionize/GDS lip/SM lipase lipid/SM liposuction/M lipped lippy/TR lipread/GRS lipreader/M lipreading/M lipstick/MDSG liq liquefaction/M liquefy/DSG liqueur/SM liquid/MS liquidate/XGNDS liquidation/M liquidator/MS liquidity/M liquidize/ZGDRS liquidizer/M liquor/MDGS liquorish lira/M lire lisle/M lisp/MDRSZG lisper/M lissome/P lissomness list/MDNSJXG listed/U listen/BMDRZG listener/M listeria listing/M listless/YP listlessness/M lit/ZR litany/SM litchi/MS lite liter/M literacy/M literal/SMYP literalism literalistic literalness/M literariness/M literary/P literate/SMY literati/M literature/M lithe/RPYT litheness/M lithesome lithium/M lithograph/ZGMDR lithographer/M lithographic lithographically lithographs lithography/M lithological lithology lithosphere/SM litigant/SM litigate/DSGN litigation/M litigator/MS litigious/P litigiousness/M litmus/M litotes/M litter/MDRSZG litterateur/MS litterbug/MS litterer/M little/MTRP littleness/M littoral/SM liturgical/Y liturgist/SM liturgy/SM livability/M livable/U live/ATGDSB livelihood/MS liveliness/M livelong/S lively/PRT liven/SGD liver's liver/S liveried liverish liverwort/MS liverwurst/M livery/CSM liveryman/CM liverymen/C livestock/M liveware/S livid/Y living/MS lix/K lizard/MS ll llama/SM llano/SM lo load's load/AUGSD loadable loader/MS loading/MS loaf/MDRSZG loafer/M loam/MS loamy/TR loan/MDRSBZG loaner/M loansharking/M loanword/MS loath/JZGDRS loathe loather/M loathing/M loathsome/YP loathsomeness/M loaves lob/SMD lobar lobbed lobber/MS lobbing lobby/GDSM lobbyist/MS lobe/MS lobotomist lobotomize/GDS lobotomy/SM lobster/MS local/SMY locale/MS locality/SM localization/MS localize/DSG locatable/A locate/EAGNVDS location's/A location/ESM locational loci lock/MDRSBZG locked/A locker/M locket/MS lockjaw/M lockout/MS locksmith/M locksmiths lockstep/M lockup/MS loco/S locomotion/M locomotive/MS locoweed/SM locum/S locus/M locust/SM locution/MS lode/MS lodestar/MS lodestone/MS lodge/DRSJMZG lodger/M lodging/M lodgings/M loft/MDSG loftily loftiness/M lofty/PRT log/SM loganberry/SM logarithm/SM logarithmic logarithmically logbook/SM loge/MS logged logger/SM loggerhead/SM loggia/SM logging/M logic/M logical/Y logicality/M logician/MS logistic/S logistical/Y logistics/M logjam/SM logo/MS logotype/SM logrolling/M logy/RT loin/MS loincloth/M loincloths loiter/ZGSDR loiterer/M loitering/M loll/DSG lollipop/SM lollop/GSD lolly/S lone/YZR loneliness/M lonely/PTR loner/M lonesome/YP lonesomeness/M long's long/KDSTG longboat/MS longbow/MS longer longevity/M longhair/MS longhand/M longhorn/MS longhouse/S longing/MYS longish longitude/MS longitudinal/Y longshoreman/M longshoremen longsighted longstanding longsword longtime longueur/SM longways loo loofah/M loofahs look/MDRSZG lookalike/MS looker/M lookout/MS loom/MDSG loon/MS loony/RSMT loop/MDSG loophole/MS loopy/RT loos/NRX loose/UDSTG loosely loosen/UGSD looseness/M loot/MDRSZG looter/M looting/M lop/S lope/MGDS lopped lopper/S lopping lopsided/YP lopsidedness/M loquacious/YP loquaciousness/M loquacity/M lord/MDYSG lordliness/M lordly/TPR lordship/SM lore/M lorgnette/SM loris/MS lorn lorry/SM lorryload/S lose/ZGRSBJ loser/M losing/M loss/MS lost lot/SM lotion/SM lottery/SM lotto/M lotus/MS louche loud/RYTP loudhailer/SM loudly/TR loudmouth/MD loudmouths loudness/M loudspeaker/SM lough loughs lounge/MZGDRS lounger/M lour/DSG louse's louse/CDSG lousily lousiness/M lousy/TPR lout/MS loutish/PY louver/MDS lovableness/M lovably love/MYZGDRSB lovebird/SM lovechild/M loved/U loveless loveliness/M lovelorn lovely/RSMTP lovemaking/M lover/M lovesick lovestruck lovey/S loving/Y low/SZTGMDRYP lowborn lowboy/MS lowbrow/SM lowdown/M lower/GD lowercase/M lowermost lowish lowland/SZMR lowlander/M lowlife/SM lowliness/M lowly/TPR lowness/M lox/M loyal/ETY loyaler loyalism/M loyalist/SM loyalties loyalty/EM lozenge/SM ltd luau/MS lubber/MYS lube/MGDS lubricant/SM lubricate/DSGN lubrication/M lubricator/MS lubricious/Y lubricity/M lucid/PY lucidity/M lucidness/M luck/MDSG luckily/U luckiness/UM luckless lucky/UPTR lucrative/PY lucrativeness/M lucre/M lucubrate/GNDS lucubration/M ludicrous/YP ludicrousness/M ludo luff/DSG lug/SM luge/S luggage/M lugged lugger/MS lugging lughole/S lugsail/SM lugubrious/PY lugubriousness/M lukewarm/YP lukewarmness/M lull/MDSG lullaby/SM lulu/S lumbago/M lumbar lumber/MDRZGS lumberer/M lumbering/M lumberjack/SM lumberman/M lumbermen lumberyard/SM lumen luminance luminary/SM luminescence/M luminescent luminosity/SM luminous/Y lummox/MS lump/MDNSG lumpectomy/S lumpiness/M lumpish lumpy/TRP lunacy/SM lunar lunatic/SM lunch/GMDS lunchbox/S luncheon/SM luncheonette/MS lunchpack lunchroom/MS lunchtime/MS lune lung/MDSG lunge/SM lungfish/MS lungful/S lunkhead/MS lupine/MS lupus/M lurch/GMDS lure/MGDS lurex lurgy lurid/PY luridness/M lurk/DRSZG luscious/PY lusciousness/M lush/MRSYPT lushness/M lust/MDRSG luster/M lusterless lustful/Y lustily lustiness/M lustrous/Y lusty/PTR lutanist/SM lute/MS lutenist/SM lutetium/M luxuriance/M luxuriant/Y luxuriate/DSGN luxuriation/M luxurious/PY luxuriousness/M luxury/SM lvi lvii lxi lxii lxiv lxix lxvi lxvii lyceum/MS lychgate/S lye/MG lying/M lymph/M lymphatic/SM lymphocyte/MS lymphoid lymphoma/SM lynch/JZGDRS lyncher/M lynching/M lynx/MS lyre/MS lyrebird/MS lyric/SM lyrical/Y lyricism/M lyricist/SM lysine m/KAS ma'am ma/SMH mac/SGMD macabre macadam/M macadamia/SM macadamize/GDS macaque/MS macaroni/MS macaroon/MS macaw/SM mace/MS macerate/DSGN maceration/M mach/M machete/SM machinate/GNDSX machination/M machine/DSMGB machinery/M machinist/MS machismo/M macho/M mackerel/SM mackinaw/SM mackintosh/MS macrame/M macro/SM macrobiotic/S macrobiotics/M macrocosm/SM macroeconomic/S macroeconomics/M macrology/S macromolecular macromolecules macron/MS macrophage/S macroscopic macroscopically mad/SMYP madam/SM madame/M madcap/MS madden/DGS maddening/Y madder/MS maddest madding made/AU mademoiselle/SM madhouse/SM madman/M madmen madness/M madras/MS madrigal/SM madwoman/M madwomen maelstrom/SM maestro/SM mafia/SM mafiosi mafioso/M mag/SM magazine/SM magenta/M maggot/MS maggoty/RT magi/M magic/SM magical/Y magician/SM magicked magicking magisterial/Y magistracy/M magistrate/SM magma/SM magmatic magnanimity/M magnanimosity magnanimous/Y magnate/SM magnesia/M magnesium/M magnet/MS magnetic magnetically magnetism/M magnetite/M magnetizable magnetization/CM magnetize/CGDS magneto/SM magnetodynamics magnetohydrodynamical magnetohydrodynamics magnetometer/SM magnetosphere magnetron magnification/M magnificence/M magnificent/Y magnified/U magnifier/M magnify/NZGDRSX magniloquence/M magniloquent magnitude/SM magnolia/MS magnum/MS magpie/MS maharajah/M maharajahs maharani/SM maharishi/SM mahatma/SM mahogany/SM mahout/MS maid/MNSX maiden/MY maidenhair/M maidenhead/SM maidenhood/M maidservant/MS mail/BJMDRSZG mailbag/SM mailbomb/GSD mailbox/MS mailer/M mailing/M maillot/SM mailman/M mailmen mailshot/S maim/DSG main/MYS mainbrace mainframe/SM mainland/MS mainline/MGDS mainmast/MS mainsail/MS mainspring/SM mainstay/MS mainstream/SGMD maintain/ZGDRBS maintainability maintainable/U maintained/U maintenance/M maintop/SM maisonette/MS maize/SM majestic majestically majesty/SM majolica/M major/SGMDY majordomo/MS majorette/MS majority/SM make's/A make/UAGS makeover/MS maker/SM makeshift/SM makeup/MS makeweight/S making/MS makings/M malachite/M maladaptive maladjusted maladjustment/M maladministration maladroit/PY maladroitness/M malady/SM malaise/M malamute/MS malapropism/SM malaria/M malarial malarkey/M malathion/M malcontent/SM male/MPS malediction/MS malefaction/SM malefactor/SM malefic maleficence/M maleficent maleness/M malevolence/M malevolent/Y malfeasance/M malformation/MS malformed malfunction/GSMD malice/M malicious/PY maliciousness/M malign/DSZG malignancy/SM malignant/Y malignity/M malinger/ZGSDR malingerer/M mall/MS mallard/SM malleability/M malleable mallet/MS mallow/MS malnourished malnourishment malnutrition/M malocclusion/M malodorous malpractice/SM malt/MDSG malted/MS maltose/M maltreat/GLDS maltreatment/M malty/TR mam/S mama/MS mamba/SM mambo/SGMD mammal/MS mammalian/MS mammary mammogram/MS mammography/M mammon/M mammoth/M mammoths mammy/SM man's/F man/USY manacle/DSMG manage/ZGDRSL manageability/M manageable/U management/MS manager/M manageress/S managerial/Y managership manana/MS manatee/SM manciple mandala/SM mandamus/MS mandarin/MS mandate/DSMG mandatory mandible/MS mandibular mandolin/MS mandrake/MS mandrel/SM mandrill/MS mane/MDS manege/M maneuver/BJMDGS maneuverability/M manful/Y manganese/M mange/DRMZ manged/S manger/M mangetout/S manginess/M mangle/MZGDRS mango/M mangoes mangrove/MS mangy/TRP manhandle/GDS manhole/SM manhood/M manhunt/SM mania/SM maniac/MS maniacal/Y manic/SM manically manicure/MGDS manicurist/MS manifest/MDYSG manifestation/MS manifesto/SM manifold/GMDS manikin/SM manila/M manioc/MS manipulable manipulate/GNVXDS manipulation/M manipulative/Y manipulator/SM mankind/M manky manlike manliness/M manly/UTR manna/M manned/U mannequin/SM manner/MDYS mannerism/SM mannerist mannerly/P manning/U mannish/YP mannishness/M manoeuvrings manometer/SM manor/SM manorial manpower/M manque mansard/MS manse/SXMN manservant/M mansion/M manslaughter/M manta/SM mantel/MS mantelpiece/MS mantelshelf mantelshelves mantes mantilla/SM mantis/MS mantissa/SM mantle's mantle/EGDS mantra/MS mantrap/S manual/MYS manufacture/MZGDRS manufacturer/M manufacturing/M manumission/SM manumit/S manumitted manumitting manure/MGDS manuscript/SM many/M map's map/AS maple/SM mapmaker/SM mappable mapped/UA mapper/MS mapping/S mar/S marabou/MS maraca/MS maraschino/SM marathon/SMRZ marathoner/M maraud/ZGDRS marauder/M marble/MGDS marbleize/GDS marbling/M march/ZGMDRS marcher/M marchioness/MS mare/MS margarine/M margarita/MS marge margin/MS marginal/YS marginalia/M marginality marginalization/M marginalize/DSG maria/M mariachi/MS marigold/MS marijuana/M marimba/SM marina/MS marinade/DSMG marinara/M marinate/DSGN marination/M marine/MZRS mariner/M marionette/SM marital/Y maritime marjoram/M mark/AMDSG markdown/SM marked/U markedly marker/MS market/MDRZGBS marketability/M marketable/U marketeer/SM marketer/M marketing/M marketplace/SM marking/SM markka/M markkaa marksman/M marksmanship/M marksmen markup/MS marl/MS marlin/MS marlinespike/MS marmalade/M marmoreal marmoset/SM marmot/MS maroon/MDGS marque/MS marquee/SM marquess/MS marquetry/M marquis/MS marquise/M marquisette/M marred/U marriage/ASM marriageability/M marriageable married/SM marring marrow/MS marry/AGDS marsh/MS marshal/SMDG marshaller marshland/SM marshmallow/MS marshy/PRT marsupial/MS mart/MNSX marten/M martial/Y martian/S martin/MS martinet/MS martingale/MS martini/SM martyr/MDGS martyrdom/M marvel/MDGS marvelous/Y marzipan/M masc mascara/GMDS mascot/MS masculine/SM masculinity/M maser/SM mash/MDRSZG masher/M mask's mask/UDSG masker/MS masochism/M masochist/SM masochistic masochistically mason/SM masonic masonry/M masque/MS masquerade/DRSMZG masquerader/M mass/MDSGV massacre/MGDS massage/DSMG masseur/SM masseuse/MS massif/MS massive/PY massiveness/M mast/MDS mastectomy/SM master's master/ADGS masterclass/S masterful/Y masterly mastermind/MDSG masterpiece/SM mastership masterstroke/SM masterwork/MS mastery/M masthead/MS mastic/M masticate/GNDS mastication/M mastiff/SM mastitis mastodon/SM mastoid/SM masturbate/GNDS masturbation/M masturbatory mat/SZGMDRJ matador/SM match/AGMS matchable/U matchbook/SM matchbox/MS matched/U matcher matchless matchlock/SM matchmaker/SM matchmaking/M matchplay matchstick/MS matchwood/M mate/MS material/SMY materialism/M materialist/SM materialistic materialistically materiality materialization/M materialize/CDS materialized/A materializing materiel/M maternal/Y maternity/M matey/S math/M mathematical/Y mathematician/SM mathematics/M maths matinee/SM mating/M matins/M matriarch/M matriarchal matriarchs matriarchy/SM matrices matricidal matricide/MS matriculate/GNDS matriculation/M matrimonial/Y matrimony/M matrix/M matron/MYS matte/DRSMZG matter/MDG matting/M mattock/SM mattress/MS maturate/GNDS maturation/M mature/YTGDRS maturity/SM matzo/SM matzoh/M matzohs matzot maudlin maul/MDRSZG mauler/M maunder/SDG mausoleum/SM mauve/M maven/SM maverick/SM maw/SM mawkish/PY mawkishness/M max/GMDS maxi/MS maxilla/M maxillae maxillary maxim/SM maximal/Y maximality maximization/M maximize/GDRS maximum/SM may/M maybe/SM mayday/MS mayflower/MS mayfly/SM mayhem/M mayn't mayo/M mayonnaise/M mayor/SM mayoral mayoralty/M mayoress/MS maypole/SM mayst maze/MS mazurka/MS mdse me/DS mead/M meadow/MS meadowland meadowlark/MS meager/PY meagerness/M meagreness meal/MS mealiness/M mealtime/SM mealy/TPR mealybug/SM mealymouthed mean/MRYJPSTG meander/SMDJG meanderings/M meanie/MS meaning/M meaningful/YP meaningfulness/M meaningless/PY meaninglessness/M meanness/M meant/U meantime/M meanwhile/M meas measles/M measly/RT measurable/U measurably measure's measure/ADSG measured/U measureless measurement/SM meat/MS meataxe meatball/MS meatiness/M meatless meatloaf/M meatloaves meatpacking/M meaty/TPR mecca/SM mechanic/MS mechanical/Y mechanics/M mechanism/SM mechanist mechanistic mechanistically mechanization/M mechanize/DSBG mechanized/U medal/SM medalist/MS medallion/SM meddle/ZGDRS meddler/M meddlesome media/SM medial/AY median/MS mediate/DSGN mediated/U mediation/AM mediator/MS medic/SM medicaid/M medical/SMY medicament/M medicare/M medicate/GNXDS medication/M medicinal/Y medicine/MS medico/MS medieval medievalist/SM mediocre mediocrity/SM meditate/DSGNVX meditation/M meditative/Y medium/MS medley/MS medulla/SM meed/M meek/RYPT meekness/M meerschaum/SM meet/MRJSG meeting/M meetinghouse/SM meg/S mega megabit/SM megabucks/M megabyte/MS megacycle/SM megadeath/M megadeaths megahertz/M megajoules megalith/M megalithic megaliths megalomania/M megalomaniac/SM megalopolis/MS megaparsec megaphone/DSMG megastar/S megaton/SM megawatt/MS meiosis/M meiotic melamine/M melancholia/M melancholic/S melancholy/SM melange/MS melanin/M melanoma/SM melatonin meld/MDSG melee/SM meliorate/GNVDS melioration/M mellifluous/YP mellifluousness/M mellow/PTGDRYS mellowness/M melodic melodically melodious/YP melodiousness/M melodrama/MS melodramatic/S melodramatically melodramatics/M melody/SM melon/SM melt's melt/ADSG meltdown/SM melter member's member/EAS membership/SM membrane/SM membranous meme/S memento/MS memo/MS memoir/MS memorabilia/M memorability/M memorable/U memorably memorandum/MS memorial/SM memorialize/DSG memorization/M memorize/DSG memorized/U memory/SM memsahib/S men menace/MGDS menacing/Y menage/MS menagerie/MS menarche mend/MDRSZG mendacious/Y mendacity/M mendelevium/M mender/M mendicancy/M mendicant/SM mending/M menfolk/MS menfolks/M menhaden/M menial/MYS meningeal meninges meningitis/M meninx/M menisci meniscus/M menopausal menopause/M menorah/M menorahs mensch/MS menservants menses/M menstrual menstruate/GNDS menstruation/M mensurable mensuration/M menswear/M mental/Y mentalist/SM mentality/SM menthol/M mentholated mention/BGSMD mentioned/U mentor/MDSG menu/MS meow/MDSG mercantile mercantilism/M mercenary/SM mercer/MS mercerize/GDS merchandise/DRSMZG merchandiser/M merchandising/M merchant/MSB merchantability merchantman/M merchantmen merciful/UY merciless/YP mercilessness/M mercurial/Y mercuric mercury/M mercy/SM mere/MYTRS meretricious/PY meretriciousness/M merganser/MS merge/DRSZG merger/M meridian/MS meridional meringue/MS merino/MS merit/CSM merited/U meriting meritocracy/SM meritocratic meritocrats meritorious/YP meritoriousness/M mermaid/SM merman/M mermen meromorphic merrily merriment/M merriness/M merry/TRP merrymaker/MS merrymaking/M mesa/MS mescal/MS mescalin mescaline/M mesdames mesdemoiselles mesh/MDSG mesmeric mesmerism/M mesmerize/ZGDRS mesmerizer/M mesomorph/M mesomorphs meson/SM mesosphere/MS mesozoic mesquite/SM mess/MDSG message/MGDS messeigneurs messenger/SM messiah/M messiahs messianic messieurs messily messiness/M messmate/SM messy/PTR mestizo/MS met meta metabolic metabolically metabolism/SM metabolite/SM metabolize/DSG metacarpal/SM metacarpi metacarpus/M metal/SMD metalanguage/MS metalinguistic metalized metallic metallurgic metallurgical metallurgist/MS metallurgy/M metalwork/MRZG metalworker/M metalworking/M metamorphic metamorphism/M metamorphose/DSG metamorphosis/M metaphor/MS metaphoric metaphorical/Y metaphysical/Y metaphysics/M metastability metastable metastases metastasis/M metastasize/GDS metastatic metatarsal/SM metatarsi metatarsus/M metatheses metathesis/M metathesizes mete/MZGDRS metempsychoses metempsychosis/M meteor/MS meteoric meteorically meteorite/SM meteoroid/SM meteorologic meteorological meteorologist/SM meteorology/M meter/GMD methadone/M methamphetamine/M methane/M methanol/M methinks methionine method/MS methodical/YP methodicalness/M methodological/Y methodology/SM methought meths methyl/M methylated methylene meticulous/YP meticulousness/M metier/MS metonymy metric/S metrical/Y metricate/GNDS metrication/M metricize/GDS metro/SM metronome/MS metronomic metropolis/MS metropolitan mettle/M mettlesome mew/SGMD mewl/DSG mews/M mezzanine/MS mezzo/SM mfg mfr/S mg mgr mi/MNX miasma/MS mic/S mica/M mice micelles mick/S mickey/MS micro/SM microanalyses microbe/MS microbial microbiological microbiologist/SM microbiology/M microbrewery/SM microchip/MS microcircuit/SM microcode microcomputer/SM microcosm/MS microcosmic microdensitometer microdot/SM microeconomics/M microelectronic/S microelectronics/M microfarad microfiber/MS microfiche/M microfilm/GMDS microfloppies/S micrograms micrograph microgravity microgroove/MS microhydrodynamics microlight/SM micromanage/GLDS micromanagement/M micrometeorite/MS micrometer/MS micron/MS microorganism/MS microphone/SM microprocessor/SM microprogram microscope/SM microscopic microscopical/Y microscopist microscopy/M microsecond/SM microsurgery/M microwave/DSMGB microwaveable mid midair/M midday/M midden/MS middle/MGS middlebrow/SM middleman/M middlemen middlemost middleweight/SM middy/SM midfield/RZ midge/SM midget/MS midi/MS midland/MS midlife/M midmost midnight/SM midpoint/MS midrib/MS midriff/MS midsection/MS midshipman/M midshipmen midships midsized midst/M midstream/M midsummer/M midterm/MS midtown/M midway/MS midweek/MS midwicket midwife/MGDS midwifery/SM midwinter/M midwives midyear/MS mien/M miff/DSG might/SM mightily mightiness/M mightn't mighty/TRP mignonette/SM migraine/MS migrant/MS migrate/AGDS migration/SM migratory mikado/MS mike/MGDS mil/SZMR milady/SM milch mild/MRYTP mildew/SMDG mildewy mildness/M mile/MS mileage/SM mileometer/S milepost/MS miler/M milestone/MS milieu/SM militancy/M militant/MYS militarily militarism/M militarist/SM militaristic militarization/CM militarize/CDSG military/M militate/GDS militia/SM militiaman/M militiamen milk/MDRSZG milker/M milkiness/M milkmaid/MS milkman/M milkmen milkshake/SM milksop/MS milkweed/SM milky/RTP mill/MDRSZGJ millage/M millenarian millennial millennium/SM miller/M millet/M milliard/MS millibar/MS milligram/MS milliliter/MS millimeter/MS milliner/MS millinery/M milling/M million/HSM millionaire/MS millionairess/S millionth/M millionths millipede/SM millisecond/MS millpond/SM millrace/SM millstone/SM millstream/MS millwright/MS milquetoast/SM milt/MDSG mime/MGDS mimeograph/MDG mimeographs mimetic mimic/SM mimicked mimicker/SM mimicking mimicry/SM mimosa/SM min minaret/MS minatory mince/DRSMZG mincemeat/M mincer/M mind's mind/ADRSZG mindbogglingly minded/P mindful/YP mindfulness/M mindless/YP mindlessness/M mindset/MS mine/MZGNDRSX minefield/SM miner/M mineral/MS mineralization mineralogical mineralogist/SM mineralogy/M mineshaft minestrone/M minesweeper/MS mineworkers mingle/DSG mingy mini/MS miniature/MS miniaturist/SM miniaturization/M miniaturize/DSG minibar/S minibike/SM minibus/MS minicab/S minicam/MS minicomputer/MS minifloppies/S minim/SM minimal/Y minimalism/M minimalist/MS minimalistic minimality minimization minimize/DRSG minimum/MS mining/M minion/M miniseries/M miniskirt/MS minister/SGMD ministerial/Y ministrant/SM ministration/MS ministry/SM minivan/MS mink/MS minke minnesinger/SM minnow/SM minor/SMDG minority/SM minotaur/S minoxidil/M minster/MS minstrel/SM minstrelsy/M mint/MDRSZG mintage/M minter/M minty/RT minuend/MS minuet/SM minus/MS minuscule/MS minute/PDRSMYTG minuteman/M minutemen minuteness/M minutia/M minutiae minx/MS miracle/MS miraculous/YP mirage/SM mire/MGDS mirror/GSMD mirth/M mirthful/PY mirthfulness/M mirthless/Y miry/RT misaddress/DSG misadventure/SM misaligned misalignment/M misalliance/MS misanalysed misanthrope/SM misanthropic misanthropically misanthropist/SM misanthropy/M misapplication/M misapply/DSGNX misapprehend/SDG misapprehension/MS misappropriate/DSXGN misappropriation/M misbegotten misbehave/GDS misbehavior/M misc miscalculate/GNXDS miscalculation/M miscall/DSG miscarriage/SM miscarry/GDS miscast/SG miscegenation/M miscellanea miscellaneous/Y miscellany/SM mischance/SM mischief/M mischievous/YP mischievousness/M miscibility/M miscible misclassified miscomprehended misconceive/DSG misconception/SM misconduct/MDGS misconfiguration misconstruction/SM misconstrue/DSG miscopying miscount/MDSG miscreant/SM miscue/DSMG misdeal/GMS misdealt misdeed/MS misdemeanor/MS misdiagnose/GDS misdiagnosis/M misdid misdirect/GSD misdirection/SM misdo/JG misdoes misdoing/M misdone miser/SBMY miserableness/M miserably miserliness/M misery/SM misfeasance/M misfeature/S misfield misfile/GDS misfire/MGDS misfit/SM misfitted misfitting misfortune/SM misgiving/MS misgovern/SDLG misgovernment/M misguidance/M misguide/DSG misguided/Y mishandle/DSG mishap/SM mishear/GS misheard mishit/S mishitting mishmash/MS misidentify/GDS misinform/DGS misinformation/M misinterpret/SGD misinterpretation/SM misjudge/DSG misjudgment/MS mislabel/GSD mislaid mislay/GS mislead/GS misleading/Y misled mismanage/LGDS mismanagement/M mismatch/GMDS misname/GDS misnomer/MS misogamist/SM misogamy/M misogynist/SM misogynistic misogynous misogyny/M misplace/GDSL misplacement/M misplay/GMDS mispositioned misprint/GMDS misprision/M mispronounce/GDS mispronunciation/SM misquotation/MS misquote/MGDS misread/GJS misreading/M misremember/DG misreport/MDSG misrepresent/SDG misrepresentation/SM misrule/MGDS miss's miss/EDSGV missal/ESM misshape/GDS misshapen missile/MS missilery/M mission/AMS missionary/SM missioner/SM missive/MS misspeak/GS misspell/GDSJ misspelling/M misspend/GS misspent misspoke misspoken misstate/LGDS misstatement/MS misstep/MS missus/MS mist's mist/CDRSZG mistakable/U mistake/BMGS mistaken/Y mister's mistily mistime/GDS mistiness/M mistletoe/M mistook mistral/MS mistranslated mistranslates mistranslating mistranslation/S mistreat/LDGS mistreatment/M mistress/MS mistrial/MS mistrust/MDSG mistrustful/Y misty/PRT mistype/JGDS misunderstand/GSJ misunderstanding/M misunderstood misuse/DRSMG mite/MZRS miter/MDG mitigate/DSGN mitigated/U mitigation/M mitigatory mitochondria mitochondrial mitoses mitosis/M mitotic mitt/MNSX mitten/M mix/ZGMDRSB mixed/U mixer/M mixture/SM mizzen/MS mizzenmast/SM mks ml mm mnemonic/MS mnemonically mo/CKHS moan/MDRSZG moaner/M moat/MDS mob's mob/CS mobbed/C mobbing/C mobile/MS mobility/SM mobilizable mobilization/CM mobilizations mobilize/CDSG mobilizer/SM mobster/SM moccasin/SM mocha/M mock/DRSZG mocker/M mockery/SM mocking/Y mockingbird/MS mod/STM modal/SM modality/S modded modding mode/MS model/ZGSJMDR modeler/M modeling/M modem/SM moderate/MYGNPDS moderateness/M moderation/M moderator/SM modern/MRYPTS modernism/M modernist/SM modernistic modernity/M modernization/SM modernize/DRSZG modernizer/M modernness/M modest/RYT modesty/M modicum/SM modifiable/U modification/M modified/U modifier/M modify/NDRSZGX modish/YP modishness/M modular modularity modularization modularize/DG modulate/CGNDS modulation/CM modulations modulator/MS module/MS moduli modulo modulus moggy mogul/SM mohair/M moi moiety/SM moil/MDSG moire/SM moist/XTPNRY moisten/DRZG moistener/M moistness/M moisture/M moisturize/ZGDRS moisturizer/M molar/SM molarity/S molasses/M mold/MDRJSZG moldboard/SM molder/GMD moldiness/M molding/M moldy/TPR mole/MS molecular molecularity/M molecule/SM molehill/SM moleskin/M molest/DRZGS molestation/SM molested/U molester/M moll/MS mollification/M mollify/NDSG mollusk/SM molly/SM mollycoddle/MGDS molt/MDNRSZG molter/M molybdenum/M mom/SM moment/MS momenta momentarily momentariness/M momentary/P momentous/YP momentousness/M momentum/M momma/SM mommy/SM monadic monarch/M monarchic monarchical monarchism/M monarchist/SM monarchistic monarchs monarchy/SM monastery/SM monastic/MS monastical/Y monasticism/M monaural monetarily monetarism/M monetarist/SM monetary monetize/CGDS money/SMD moneybag/MS moneybox/S moneychangers moneylender/MS moneyless moneymaker/SM moneymaking/M monger/MDGS mongol/S mongolism/M mongoloid/MS mongoose/MS mongrel/SM monies moniker/SM monism/M monist/MS monition/SM monitor/SMDG monitored/U monitory monk/MS monkey/MDGS monkeyshine/MS monkish monkshood/SM mono/M monochromatic monochrome/SM monocle/DSM monoclonal monocotyledon/MS monocotyledonous monocular monoculture monodic monodist/SM monody/SM monogamist/MS monogamous/Y monogamy/M monogram/SM monogrammed monogramming monograph/M monographs monolayers monolingual/MS monolith/M monolithic monoliths monologist/SM monologue/SM monomania/M monomaniac/MS monomaniacal monomer/SM monomeric monomial/S monomolecular mononucleosis/M monophonic monophthongs monoplane/SM monopole/S monopolist/SM monopolistic monopolization/M monopolize/DRSZG monopolizer/M monopoly/SM monorail/MS monostable monosyllabic monosyllable/MS monotheism/M monotheist/SM monotheistic monotone/MS monotonic monotonically monotonicity monotonous/YP monotonousness/M monotony/M monounsaturated monoxide/MS monseigneur/M monsieur/M monsignor/SM monsoon/SM monsoonal monster/SM monstrance/ASM monstrosity/SM monstrous/Y montage/SM month/MY monthly/SM months monument/MS monumental/Y moo/SGMD mooch/ZGMDRS moocher/M mood/MS moodily moodiness/M moody/TPR moon/MDSG moonbeam/MS moonless moonlight/SMDRZG moonlighter/M moonlighting/M moonlit moonrise moonscape/SM moonshine/MZRS moonshiner/M moonshot/MS moonstone/MS moonstruck moonwalk/MS moor/MDJSG moorhen/S mooring/M moorland/MS moose/M moot/DRSG mop/SZGMDR mope/MS moped/SM moper/M mopey mopier mopiest mopish mopped moppet/MS mopping moraine/SM moral/SMY morale/M moralist/MS moralistic moralistically moralities morality/UM moralization/CM moralize/CGDS moralizer/MS morass/MS moratorium/SM moray/SM morbid/YP morbidity/M morbidness/M mordancy/M mordant/SMY more/MS moreish morel/SM moreover mores/M morgue/MS moribund/Y moribundity morn/MJSG morning/M morocco/M moron/SM moronic moronically morose/YP moroseness/M morph/GD morpheme/MS morphemic morphia/M morphine/M morphing/M morphism/S morphogenesis morphological/Y morphology/SM morphs morrow/MS morsel/MS mortal/MYS mortality/M mortar/MDSG mortarboard/MS mortgage's mortgage/AGDS mortgageable mortgagee/MS mortgagor/MS mortician/MS mortification/M mortify/NGDS mortise/DSMG mortuary/SM mosaic/MS mosey/SGD mosh/DSG mosque/MS mosquito/M mosquitoes moss/MS mossback/SM mossy/TR most/MY mot/SM mote's mote/KCXSVN motel/SM motet/SM moth/M mothball/GMDS mother/MDYSG motherboard/SM motherfucker/MS! motherfucking/! motherhood/M motherland/MS motherless motherliness/M moths motif/SM motile/S motility/M motion/KCM motioned motioning motionless/YP motionlessness/M motivate/CDSG motivated/U motivation/MS motivational motivator/SM motive/MS motiveless motley/MS motlier motliest motocross/MS motor/SGMD motorbike/MGDS motorboat/MS motorcade/MS motorcar/SM motorcycle/DSMG motorcyclist/MS motorist/SM motorization/M motorize/DSG motorman/M motormen motormouth/M motormouths motorway/SM mottle/GDS motto/M mottoes moue/MS mound/SGMD mount/AEDMGS mountable mountain/SM mountaineer/GMDS mountaineering/M mountainous mountainside/SM mountaintop/MS mountebank/MS mounted/UC mounter/MS mounties mounting's mountings mourn/SZGDR mourner/M mournful/YP mournfuller mournfullest mournfulness/M mourning/M mouse/DRSMZG mouser/M mousetrap/SM mousetrapped mousetrapping mousiness/M moussaka/S mousse/MGDS mousy/PTR mouth/GMD mouthful/MS mouthiness/M mouthorgan mouthpiece/MS mouths mouthwash/MS mouthwatering mouthy/PTR mouton/M movable/SM move/AMZGDRSB moved/U movement/SM mover/AM movie/SM moviegoer/SM moving/U movingly mow/SZGMDR mower/M moxie/M mozzarella/M mp mpg mph mt mtg mtge mu/SM much/MP mucilage/M mucilaginous muck/MDSG muckrake/DRSZG muckraker/M mucky/TR mucosa mucous mucus/M mud/M muddily muddiness/M muddle/MGDS muddleheaded muddy/PTGDRS mudflap/S mudflat/MS mudflow/S mudguard/SM mudlarks mudpack/S mudroom/MS mudslide/MS mudslinger/SM mudslinging/M muenster/M muesli muezzin/MS muff/MDSG muffin/MS muffle/ZGDRS muffler/M mufti/SM mug/SM mugful/MS mugged mugger/MS mugginess/M mugging/MS muggins muggy/PTR mugshot/MS mugwump/MS mujaheddin mukluk/MS mulatto/M mulattoes mulberry/SM mulch/GMDS mulct/SGMD mule/MS muleskinner/SM muleteer/MS mulish/PY mulishness/M mull/DSG mullah/M mullahs mullein/M mullet/MS mulligan/SM mulligatawny/M mullion/SMD multichannel multicolor/D multicultural multiculturalism/M multidimensional multidisciplinary multifaceted multifamily multifarious/PY multifariousness/M multiform multifunction multifunctional multilateral/Y multilayer multilevel multilingual multilingualism/M multimedia/M multimeter multimillion multimillionaire/MS multinational/MS multiparty multiphase multiple/MS multiplex/ZGMDRS multiplexer/M multiplicand/SM multiplication/M multiplicative multiplicity/SM multiplier/M multiply/NXZGDRS multiprocessing multiprocessor/SM multiprogramming multipurpose multiracial multistage multistory multitask/SG multitasking/M multitude/SM multitudinous multivalued multivariate multivitamin/SM mum/SM mumble/JMZGDRS mumbler/M mumbletypeg/M mummer/MS mummery/M mummification/M mummify/NGDS mummy/SM mumps/M mun munch/ZGDRS munchies/M munchkin/SM mundane/SY mung/DSG municipal/SMY municipality/SM munificence/M munificent/Y munition/MDGS muons mural/SM muralist/SM murder/ZGMDRS murderer/M murderess/MS murderous/Y murk/MS murkily murkiness/M murky/PTR murmur/ZGJMDRS murmurer/M murmuring/M murmurous murrain/M muscat/MS muscatel/SM muscle/MGDS musclebound muscleman musclemen muscly muscular/Y muscularity/M musculature/M muse/MGDSJ musette/MS museum/MS mush/MDRSZG mushiness/M mushroom/GSMD mushy/PTR music/SM musical/MYS musicale/MS musicality/M musician/SMY musicianship/M musicological musicologist/MS musicology/M musing/MY musk/M muskeg/MS muskellunge/SM musket/MS musketeer/MS musketry/M muskie/M muskiness/M muskmelon/SM muskox/MN muskrat/MS musky/PTRS muslin/M muss/MDSG mussel/MS mussy/TR must/MRSZ mustache/MDS mustachio/SMD mustang/MS mustard/M muster/GMD mustily mustiness/M mustn't musty/PTR mutability/M mutably mutagen/MS mutant/MS mutate/XGNVDS mutation/M mutational mute/MYTGDRSPB muteness/M mutilate/DSGNX mutilated/U mutilation/M mutilator/SM mutineer/SM mutinous/Y mutiny/GDSM mutt/MS mutter/ZGJMDRS mutterer/M muttering/M mutton/M muttonchops/M mutual/Y mutuality/M muumuu/MS muzak muzzily muzzle/DSMG muzzled/U muzzy/P my mycologist/SM mycology/M myelitis/M myna/MS myocardial myopia/M myopic myopically myriad/SM myrmidon/MS myrrh/M myrtle/SM mys myself mysterious/YP mysteriousness/M mystery/SM mystic/SM mystical/Y mysticism/M mystification/CM mystify/CDSGN mystique/M myth/M mythic mythical mythological mythologist/MS mythologize/GDS mythology/SM myths myxomatosis n/IKTH nab/S nabbed nabbing nabob/SM nacelle/SM nacho/SM nacre/M nacreous nadir/SM nae naff/RT nag/SM nagged nagger/MS nagging nagware/S nah naiad/SM naif/MS nail/MDSG nailbrush/MS naive/RYT naivete/M naivety/M naked/TPRY nakedness/M name's name/AGDS nameable/U named/U namedrop namedropping/M nameless/Y namely nameplate/MS namesake/SM naming/S nan/S nanny/SM nanobot/S nanometer/S nanosecond/SM nanotechnology/S nap/SM napalm/MDSG nape/MS naphtha/M naphthalene/M napkin/MS napless napoleon/SM napped napper/MS napping nappy/TRSM narc/MS narcissism/M narcissist/MS narcissistic narcissus/M narcolepsy/M narcoleptic narcoses narcosis/M narcotic/SM narcotization/M narcotize/GDS narky narrate/GNVDSX narration/M narrative/SM narratology narrator/SM narrow/PTGMDRYS narrowness/M narwhal/MS nary nasal/SMY nasality/M nasalization/M nasalize/DSG nascence/AM nascent/A nastily nastiness/M nasturtium/SM nasty/PTR natal natch nation/MS national/MYS nationalism/M nationalist/MS nationalistic nationalistically nationality/SM nationalization/SM nationalize/CGDS nationalized/A nationhood/M nationwide native/MS nativity/SM natl natter/GMDS nattily nattiness/M natty/PTR natural's natural/UPY naturalism/M naturalist/MS naturalistic naturalization/M naturalize/GDS naturalness/UM naturals nature's nature/CS naturism naturist/S naught/MS naughtily naughtiness/M naughty/PTR nausea/M nauseate/GDS nauseating/Y nauseous/YP nauseousness/M nautical/Y nautilus/MS naval nave/MS navel/SM navigability/M navigable/U navigate/DSGN navigation/M navigational navigator/MS navvy/S navy/SM nay/SM naysayer/MS ne'er neanderthal/SM neap/MS near/DRYSPTG nearby nearly/TR nearness/M nearside nearsighted/PY nearsightedness/M neat/NRYPXT neaten/GD neath neatness/M nebula/M nebulae nebular nebulosity nebulous/YP nebulousness/M necessarily/U necessary/SM necessitate/GDS necessitous necessity/SM neck/MDSG neckband/S neckerchief/MS necking/M necklace/MGDSJ neckline/MS necktie/MS necrology/M necromancer/MS necromancy/M necromantic necrophilia necrophiliac/S necropolis/MS necropsy necroses necrosis/M necrotic nectar/M nectarine/MS nee need/MDSG needed/U needful/Y neediness/M needle/MGDS needlecraft needlepoint/M needless/PY needlessness/M needlewoman/M needlewomen needlework/M needn't needy/PTR nefarious/PY nefariousness/M neg negate/DSGNVX negation/M negative/MYGPDS negativeness/M negativism/M negativity/M neglect/SGMD neglectful/PY neglectfulness/M negligee/MS negligence/M negligent/Y negligibility negligible negligibly negotiability/M negotiable/A negotiate/ADSGN negotiation/AM negotiations negotiator/MS negritude/M negro negroid neigh/MDG neighbor/SMDYG neighborhood/SM neighborliness/M neighs neither nelson/SM nematode/SM nemeses nemesis/M neoclassic neoclassical neoclassicism/M neocolonialism/M neocolonialist/MS neoconservative/SM neodymium/M neolithic neologism/SM neon/M neonatal neonate/MS neophilia/S neophyte/MS neoplasm/MS neoplastic neoprene/M nepenthe/M nephew/SM nephrite/M nephritic nephritis/M nepotism/M nepotist/SM nepotistic neptunium/M nerd/MS nerdy/RT nerve's nerve/UDSG nerveless/PY nervelessness/M nerviness/M nervous/YP nervousness/M nervy/TPR nest/BMDSG nestle/GJDS nestling/M net/SM netball nether nethermost netherworld/M netiquette/S netted netter/S netting/M nettle/MGDS nettlesome network/SGMD networking/M neural/Y neuralgia/M neuralgic neurasthenia/M neurasthenic/MS neuritic/MS neuritis/M neurobiology neurological/Y neurologist/MS neurology/M neuron/MS neuronal neurophysiology neuroscience neuroses neurosis/M neurosurgeon/MS neurosurgery/M neurotic/MS neurotically neurotransmitter/SM neut neuter/MDGS neutral/SMY neutralism/M neutralist/SM neutrality/M neutralization/M neutralize/DRSZG neutralizer/M neutrino/SM neutron/SM never nevermore nevertheless nevi nevus/M new/STMRYP newbie/MS newborn/SM newcomer/SM newel/SM newfangled newish newline/S newlywed/SM newness/M news/M newsagent/S newsboy/SM newscast/SMRZ newscaster/M newsdealer/SM newsflash/S newsgirl/SM newsgroup/MS newshound/S newsletter/SM newsman/M newsmen newspaper/MS newspaperman/M newspapermen newspaperwoman/M newspaperwomen newsprint/M newsreader/S newsreel/MS newsroom/MS newsstand/SM newsweekly/SM newswoman/M newswomen newsworthiness/M newsworthy/PRT newsy/TR newt/MS newton/MS next/M nexus/MS niacin/M nib/SM nibble/MZGDRS nibbler/M nice/PYTR niceness/M nicety/SM niche/SM nick/MDRSZG nickel/MS nickelodeon/MS nicker/MDG nickle/S nickname/DSMG nicotine/M niece/SM niff niffy niftily nifty/TR niggard/SMY niggardliness/M nigger/SM! niggle/MZGDRS niggler/M nigh/RT night/SMY nightcap/SM nightclothes/M nightclub/SM nightclubbed nightclubbing nightdress/MS nightfall/M nightgown/SM nighthawk/SM nightie/SM nightingale/MS nightlife/M nightlight/S nightlong nightmare/SM nightmarish nightshade/SM nightshirt/SM nightspot/MS nightstand/SM nightstick/SM nighttime/M nightwatchman nightwatchmen nightwear/M nihilism/M nihilist/MS nihilistic nil/M nimbi nimble/TPR nimbleness/M nimbly nimbus/M nimby nimrod/MS nincompoop/SM nine/MS ninepence ninepin/MS ninepins/M nineteen/SMH nineteenth/M nineteenths ninetieth/M ninetieths ninety/HSM ninja/SM ninny/SM ninth/M ninths niobium/M nip/SM nipped nipper/MS nippiness/M nipping nipple/MS nippy/TPR nirvana/M nisei/M nit/SMR niter/M nitpick/SZGDR nitpicker/M nitpicking/M nitrate/DSMGN nitration/M nitric nitride/S nitrification/M nitrite/SM nitrocellulose/M nitrogen/M nitrogenous nitroglycerin/M nitrous nitwit/MS nix/GMDS no/SM nob/SY nobble/GDS nobelium/M nobility/M noble/RSPMT nobleman/M noblemen nobleness/M noblewoman/M noblewomen nobody/SM nocturnal/Y nocturne/MS nod/SM nodal nodded nodding noddle/MS noddy node/MS nodular nodule/MS noel/MS noes noggin/MS nohow noise/DSMG noiseless/PY noiselessness/M noisemaker/SM noisily noisiness/M noisome noisy/PTR nomad/SM nomadic nomenclature/MS nominal/Y nominate/ACGNVDS nomination's/A nomination/CSM nominative/SM nominator/CSM nominee/MS non nonabrasive nonabsorbent/SM nonacademic nonacceptance/M nonacid nonactive/MS nonaddictive nonadhesive nonadjacent nonadjustable nonadministrative nonage/MS nonagenarian/SM nonaggression/M nonalcoholic nonaligned nonalignment/M nonallergic nonappearance/SM nonassignable nonathletic nonattendance/M nonautomotive nonavailability/M nonbasic nonbeliever/MS nonbelligerent/MS nonbinding nonbreakable nonburnable noncaloric noncancerous nonce/M nonchalance/M nonchalant/Y nonchargeable nonclerical/SM nonclinical noncollectable noncom/MS noncombat noncombatant/SM noncombustible noncommercial/SM noncommittal/Y noncommunicable noncompeting noncompetitive noncompliance/M noncomplying noncomprehending nonconducting nonconductor/SM nonconforming nonconformism nonconformist/SM nonconformity/M nonconsecutive nonconstructive noncontagious noncontinuous noncontributing noncontributory noncontroversial nonconvertible noncooperation/M noncorroding noncorrosive noncredit noncriminal/MS noncritical noncrystalline noncumulative noncustodial nondairy nondeductible/M nondelivery/SM nondemocratic nondenominational nondepartmental nondepreciating nondescript/Y nondestructive nondetachable nondisciplinary nondisclosure/M nondiscrimination/M nondiscriminatory nondramatic nondrinker/SM nondrying none noneducational noneffective nonelastic nonelectric nonelectrical nonempty nonenforceable nonentity/SM nonequivalent/SM nonessential nonesuch/MS nonetheless nonevent/MS nonexchangeable nonexclusive nonexempt/M nonexistence/M nonexistent nonexplosive/SM nonfactual nonfading nonfat nonfatal nonfattening nonferrous nonfiction/M nonfictional nonflammable nonflowering nonfluctuating nonflying nonfood/M nonfreezing nonfunctional nongovernmental nongranular nonhazardous nonhereditary nonhuman nonidentical noninclusive nonindependent nonindustrial noninfectious noninflammatory noninflationary noninflected nonintellectual/SM noninterchangeable noninterference/M nonintervention/M nonintoxicating noninvasive nonirritating nonjudgmental nonjudicial nonlegal nonlethal nonlinear nonliterary nonliving/M nonmagnetic nonmalignant nonmember/MS nonmetal/SM nonmetallic nonmigratory nonmilitant nonmilitary nonnarcotic/SM nonnative/MS nonnegotiable nonnuclear nonnumerical nonobjective nonobligatory nonobservance/M nonobservant nonoccupational nonoccurence/M nonofficial nonoperational nonoperative nonparallel/SM nonparametric nonpareil/MS nonparticipant/MS nonparticipating nonpartisan/MS nonpaying nonpayment/MS nonperformance/M nonperforming nonperishable nonperson/MS nonphysical/Y nonplus/S nonplussed nonplussing nonpoisonous nonpolitical nonpolluting nonporous nonpracticing nonprejudicial nonprescription nonproductive nonprofessional/MS nonprofit/SBM nonproliferation/M nonpublic nonpunishable nonracial nonradioactive nonrandom nonreactive nonreciprocal/MS nonreciprocating nonrecognition/M nonrecoverable nonrecurring nonredeemable nonrefillable nonrefundable nonreligious nonrenewable nonrepresentational nonresident/SM nonresidential nonresidual/M nonresistance/M nonresistant nonrestrictive nonreturnable/SM nonrhythmic nonrigid nonsalaried nonscheduled nonscientific nonscoring nonseasonal nonsectarian nonsecular nonsegregated nonsense/MS nonsensical/Y nonsensitive nonsexist nonsexual nonskid nonslip nonsmoker/SM nonsmoking nonsocial nonspeaking nonspecialist/SM nonspecializing nonspecific nonspiritual/MS nonstaining nonstandard nonstarter/SM nonstick nonstop nonstrategic nonstriking nonstructural nonsuccessive nonsupport/MG nonsurgical nonsustaining nonsympathizer/M nontarnishable nontaxable nontechnical nontenured nontheatrical nonthinking nonthreatening nontoxic nontraditional nontransferable nontransparent nontrivial nontropical nonuniform nonunion nonuser/MS nonvenomous nonverbal nonviable nonviolence/M nonviolent/Y nonvirulent nonvocal nonvocational nonvolatile nonvoter/MS nonvoting nonwhite/MS nonworking nonyielding nonzero noodle/MGDS nook/MS nookie nooky noon/MS noonday/M noontide/M noontime/M noose/SM nope nor nor'easter noradrenalin noradrenaline norm/MDS normal/MYS normalcy/M normality/M normalization/MS normalize/DRSBZG normative north/ZMR northbound northeast/MRZ northeaster/MY northeastern northeastward/S norther/MY northerly/SM northern/ZR northerner/M northernmost northmen northward/S northwest/ZMR northwester/MY northwestern northwestward/S nose/MGDS nosebag/S nosebleed/MS nosecone/SM nosedive/DSMG nosegay/SM nosh/MDRSZG nosher/M nosily nosiness/M nostalgia/M nostalgic nostalgically nostril/MS nostrum/MS nosy/RPT not/B notability/SM notable/SM notably notarial notarization/M notarize/GDS notary/SM notate/GDS notation/FCSM notational/Y notch/GMDS note's note/FCSDG notebook/MS notelet/S notepad/S notepaper/M noteworthiness/M noteworthy/P nothing/PSM nothingness/M notice/MGDS noticeable/U noticeably noticeboard/S noticed/U notifiable notification/M notifier/M notify/NXDRSZG notion/MS notional/Y notoriety/M notorious/Y notwithstanding notwork/S nougat/MS noun/KMS nounal nourish/DSLG nourishment/M nous nova/MS novae novel/SM novelette/SM novelist/SM novelistic novelization/SM novelize/DSG novella/MS novelty/SM novena/MS novene novice/MS novitiate/MS now/M nowadays/M noway/S nowhere/M nowise nowt noxious/YP nozzle/MS nu/SM nuance/MDS nub/SM nubbin/MS nubby/TR nubile nuclear/K nuclease nucleate/DSGN nucleated/A nucleation/M nuclei nucleic nucleoli nucleolus/M nucleon/SM nucleotide/S nucleus/M nude/MTRS nudge/GDSM nudism/M nudist/SM nudity/M nugatory nugget/SM nuisance/MS nuke/MGDS null/S nullification/M nullify/NDSG nullity/M numb/ZTGPDRYS number's number/ASDG numbered/U numbering/S numberless numberplate numbers/S numbing/Y numbness/M numerable/I numeracy/IM numeral/SM numerate/XGNDS numeration/M numerator/MS numeric numerical/Y numerological numerologist/SM numerology/M numerous/Y numinous numismatic/S numismatics/M numismatist/MS numskull/MS nun/SM nuncio/SM nunnery/SM nuptial/MS nurse/MZGDRS nurselings nursemaid/MS nurser/M nursery/SM nurseryman/M nurserymen nursing/M nursling/SM nurture/DRSMZG nurturer/M nut/SM nutation nutcase/S nutcracker/MS nuthatch/MS nuthouse/S nutmeat/SM nutmeg/SM nutpick/SM nutria/SM nutrient/MS nutriment/MS nutrition/M nutritional/Y nutritionist/MS nutritious/YP nutritiousness/M nutritive nutshell/MS nutted nutter/S nuttiness/M nutting nutty/RTP nuzzle/DRSMZG nuzzler/M nybble/DSG nyetwork/S nylon/MS nylons/M nymph/M nymphet/MS nympho/S nympholepsy nymphomania/M nymphomaniac/MS nymphs o o'clock o'er oaf/SM oafish/PY oafishness/M oak/SMN oakum/M oar/SGMD oarlock/SM oarsman/M oarsmen oarswoman/M oarswomen oases oasis/M oat/SMN oatcake/SM oath/M oaths oatmeal/M oats/M ob/S obbligato/MS obduracy/M obdurate/PY obdurateness/M obedience/EM obedient/EY obeisance/SM obeisant obelisk/MS obese obesity/M obey/EDSG obfuscate/GNDSX obfuscation/M obfuscatory obi/SM obit/MS obituary/SM obj object/SGVMD objectify/GDSN objection/BSM objectionable/P objectionably objective/PSMY objectiveness/M objectivity/M objectless objector/MS objurgate/XGNDS objurgation/M oblate/NX oblation/M obligate/DSXGN obligation/M obligatorily obligatory oblige/EGDS obliging/U obligingly oblique/DSMYP obliqueness/M obliquity/M obliterate/GNDS obliteration/M oblivion/M oblivious/PY obliviousness/M oblong/MS obloquy/M obnoxious/YP obnoxiousness/M oboe/MS oboist/MS obscene/RYT obscenity/SM obscurantism/M obscurantist/MS obscuration obscure/DRSLPYTG obscurity/SM obsequies obsequious/PY obsequiousness/M obsequy/M observability observable/S observably observance/SM observant/Y observation/MS observational/Y observatory/SM observe/DRSBZG observed/U observer/M obsess/DSGV obsession/SM obsessional/Y obsessive/SMYP obsessiveness/M obsidian/M obsolesce/DSG obsolescence/M obsolescent obsolete/GDS obstacle/MS obstetric/S obstetrical obstetrician/MS obstetrics/M obstinacy/M obstinate/Y obstreperous/PY obstreperousness/M obstruct/DGVS obstructed/U obstruction/MS obstructionism/M obstructionist/SM obstructive/YP obstructiveness/M obtain/DBLGS obtainable/U obtainment/M obtrude/DSG obtrusion/M obtrusive/UYP obtrusiveness/UM obtuse/YTRP obtuseness/M obverse/SM obviate/DSGN obviation/M obvious/PY obviousness/M ocarina/MS occasion/GMDS occasional/Y occidental/SM occipital occlude/GDS occlusion/SM occlusive occult/MS occultism/M occultist/SM occupancy/SM occupant/SM occupation/AM occupational/Y occupations occupied/U occupier/SM occupy/ADSG occur/AS occurred/A occurrence/SM occurring/A ocean/SM oceanfront/MS oceangoing oceanic/M oceanographer/SM oceanographic oceanography/M oceanology/M ocelot/MS och/ZR ocher/M ocker/S octagon/MS octagonal octahedral octahedron octal octane/MS octant octave/MS octavo/MS octet/SM octogenarian/MS octopus/MS ocular/MS oculist/SM odalisque/SM odd/STRYLP oddball/SM oddity/SM oddment/SM oddness/M odds/M ode/SM odious/YP odiousness/M odium/M odometer/MS odor/MDS odoriferous odorless odorous odyssey/MS oedipal oenology/M oenophile/SM oeuvre/MS of off/SZGDRJ offal/M offbeat/MS offcuts offend/ZGDRS offender/M offense/MS offensive's offensive/IYP offensiveness/IM offensives offer/JGMD offering/M offertory/SM offhand offhanded/YP offhandedness/M office/MZRS officeholder/MS officer/M officership/S official/MYSP officialdom/M officialese officialism/M officiant/SM officiate/DSG officiator/MS officious/YP officiousness/M offing/M offish offline offload/SDG offprint/SM offset/MS offsetting offshoot/MS offshore offside offspring/M offstage/S offtrack oft/TNR often/TR oftentimes ofttimes ogle/MZGDRS ogler/M ogre/MS ogreish ogress/MS oh/M ohm/SM ohmic ohmmeter/MS oho ohs oi oik/S oil/SGMD oilcan/S oilcloth/M oilcloths oilfield/S oiliness/M oilman oilmen oilseed oilskin/MS oilskins/M oily/RPT oink/MDSG ointment/SM okapi/SM okay/MSG okra/MS old/TMNRP oldie/SM oldish oldness/M oldster/MS ole/SMV oleaginous oleander/MS olefin oleo/M oleomargarine/M olfactory/SM oligarch/M oligarchic oligarchical oligarchs oligarchy/SM oligopoly/SM olive/SM olivine om/SMNX ombudsman/M ombudsmen omega/SM omelet/MS omen/M omicron/MS ominous/YP ominousness/M omission/MS omit/S omitted omitting omnibus/MS omnidirectional omnipotence/M omnipotent omnipresence/M omnipresent omniscience/M omniscient omnivore/MS omnivorous/PY omnivorousness/M on/Y once/M oncogene/SM oncologist/MS oncology/M oncoming one/SXMNP oneness/M onerous/PY onerousness/M oneself onetime ongoing onion/M onionskin/M online onlooker/SM onlooking only/T onomatopoeia/M onomatopoeic onomatopoetic onrush/MSG onscreen onset/MS onshore onside onslaught/MS onstage onto ontogeny/M ontological/Y ontology/M onus/MS onward/S onyx/MS oodles/M ooh/GD oohs oolitic oomph oops ooze/MGDS oozy/TR op/SMDG opacity/M opal/MS opalescence/M opalescent opaque/PYTGDRS opaqueness/M ope/S open/ZTGJPMDRYS opencast opened/U opener/M openhanded/P openhandedness/M openhearted opening/M openness/M openwork/M opera/MS operable/I operand/S operate/DSGNVX operatic operatically operation/M operational/Y operative/SM operator/SM operetta/SM ophthalmic/S ophthalmologist/SM ophthalmology/M opiate/SM opine/GNXDS opinion/M opinionated opioid opium/M opossum/MS opp opponent/SM opportune/IY opportunism/M opportunist/MS opportunistic opportunistically opportunity/SM oppose/DSG opposed/U opposite/SMYNX opposition/M oppositional oppress/DSGV oppression/SM oppressive/PY oppressiveness/M oppressor/MS opprobrious/Y opprobrium/M opt/SGD optic/MS optical/Y optician/SM optics/M optima optimal/Y optimality optimism/SM optimist/SM optimistic optimistically optimization/MS optimize/DRSZG optimized/U optimum/SM option/SMDG optional/Y optionality optoelectronic optometrist/MS optometry/M opulence/M opulent/Y opus/MS or oracle/SM oracular oral/MYS orange/SMP orangeade/MS orangery/SM orangutan/SM orate/GNXDS oration/M orator/SM oratorical/Y oratorio/MS oratory/SM orb/SM orbicular orbit/MDRZGS orbital/SM orbiter/M orchard/SM orchestra/MS orchestral orchestrate/XGNDS orchestration/M orchestrator orchid/SM ordain/SDLG ordainment/M ordeal/SM order/EAMDGS ordered/U orderings orderless orderliness/EM orderly/PSM ordinal/SM ordinance/SM ordinands ordinarily ordinariness/M ordinary/RSMPT ordinate/MNSX ordination/M ordnance/M ordure/M ore/SM oregano/M org organ/MS organdy/M organelle/MS organic/SM organically/I organism/MS organismic organist/MS organizable organization/ASM organizational/Y organize/AESDG organized/U organizer/MS organza/M orgasm/SM orgasmic orgiastic orgy/SM oriel/MS orient's orient/AEDGS orientable oriental/MS orientalist/S orientate/EDSGN orientated/A orientates/A orientation/AEM orientations orienteering orifice/MS orig origami/M origin/SM original/MYS originality/M originate/DSGN origination/M originator/MS oriole/SM orison/SM ormolu/M ornament/SGMD ornamental ornamentation/M ornate/YP ornateness/M orneriness/M ornery/PRT ornithological ornithologist/SM ornithology/M orotund orotundity/SM orphan/SMDG orphanage/MS orris/MS orthodontia/M orthodontic/S orthodontics/M orthodontist/SM orthodox/U orthodoxy/SM orthogonal/Y orthogonality orthographic orthographical/Y orthography/SM orthonormal orthopedic/S orthopedics/M orthopedist/MS orthorhombic orzo/M oscillate/XGNDS oscillation/M oscillator/MS oscillatory oscilloscope/MS osculate/DSXGN osculation/M osier/MS osmium/M osmosis/M osmotic osprey/SM ossification/M ossify/GNDS ostensible ostensibly ostentation/M ostentatious/Y osteoarthritis/M osteopath/M osteopathic osteopaths osteopathy/M osteoporosis/M ostler/S ostracism/M ostracize/GDS ostrich/MS other/SP otherwise otherworldly otiose otter/MS ottoman/MS oubliette/MS ouch ought oughtn't ounce/MS our/S ourselves oust/ZGDRS ouster/M out/SJGMDR outage/SM outargue/GDS outback/MS outbalance/GDS outbid/S outbidding outboard/MS outboast/DSG outbound outbox/MS outbreak/MS outbuilding/MS outburst/SM outcast/MS outclass/DSG outcome/MS outcrop/MS outcropped outcropping/MS outcry/SM outdated outdid outdistance/DSG outdo/G outdoes outdone outdoor/S outdoors/M outdoorsy outdraw/GS outdrawn outdrew outermost outerwear/M outface/GDS outfall/S outfield/SMRZ outfielder/M outfight/SG outfit/SM outfitted outfitter/MS outfitting outflank/GSD outflow/MS outfought outfox/GDS outgo/MJG outgoes outgrew outgrow/HGS outgrown outgrowth/M outgrowths outguess/GDS outgun/S outgunned outgunning outhit/S outhitting outhouse/SM outing/M outlaid outlandish/YP outlandishness/M outlast/DSG outlaw/SGMD outlawry outlay/SGM outlet/SM outlier/S outline/MGDS outlive/GDS outlook/MS outlying outmaneuver/SGD outmatch/GDS outmoded outnumber/DSG outpace/GDS outpatient/SM outperform/DSG outplace/L outplacement/M outplay/GDS outpoint/DGS outpost/MS outpouring/MS outproduce/DSG output/SM outputted outputting outrace/GDS outrage/MGDS outrageous/Y outran outrank/GDS outre outreach/MDSG outrider/MS outrigger/SM outright outrun/S outrunning outscore/GDS outsell/GS outset/SM outshine/GS outshone outshout/GDS outside/MZRS outsider/M outsize/MS outskirt/MS outsmart/GDS outsold outsource/DSG outsourcing/M outspend/SG outspent outspoken/PY outspokenness/M outspread/GS outstanding/Y outstation/MS outstay/DGS outstretch/GDS outstrip/S outstripped outstripping outta outtake/MS outvote/GDS outward/YS outwear/GS outweigh/GD outweighs outwit/S outwith outwitted outwitting outwore outwork/MDRSZG outworn ouzo/MS ova oval/MS ovarian ovary/SM ovate/NX ovation/M oven/MS ovenbird/SM ovenproof ovenware over/MYS overabundance/M overabundant overachieve/ZGDRS overachiever/M overact/GVSD overage/SM overaggressive overall/SM overallocation overalls/M overambitious overanxious overarching overarm/GSD overate overattentive overawe/DSG overbalance/DSMG overbear/GS overbearing/Y overbid/SM overbidding overbite/MS overblown overboard overbold overbook/DGS overbore overborne overbought overbuild/SG overbuilt overburden/SDG overbuy/GS overcame overcapacity/M overcapitalize/GDS overcareful overcast/MGS overcautious overcharge/MGDS overclock/SDG overcloud/SDG overcoat/MS overcome/GS overcommitment/S overcompensate/GNDS overcompensation/M overcomplexity overcomplicated overconfidence/M overconfident overconscientious overcook/DGS overcritical overcrowd/GSD overcrowding/M overdecorate/DSG overdependent overdetermined overdevelop/SGD overdid overdo/G overdoes overdone overdose/MGDS overdraft/SM overdraw/GS overdrawn overdress/GMDS overdrew overdrive/SM overdub/SM overdubbed overdubbing overdue overeager overeat/GSN overemotional overemphasis/M overemphasize/DSG overenthusiastic overestimate/DSMGN overestimation/M overexcite/GDS overexercise/DSG overexert/GSD overexertion/M overexpose/GDS overexposure/M overextend/GDS overfed overfeed/GS overfill/DGS overfishing overflew overflight/MS overflow/MDSG overflown overfly/GS overfond overfull overgeneralize/DSG overgenerous overgraze/DSG overgrew overground overgrow/HSG overgrown overgrowth/M overhand/MS overhang/MSG overhasty overhaul/MDSG overhead/MS overhear/SG overheard overheat/DSG overhung overincredulous overindulge/GDS overindulgence/M overindulgent overinflated overjoy/GSD overkill/M overladen overlaid overlain overland overlap/SM overlapped overlapping overlarge overlay/GSM overleaf overlie overload/GMDS overlong overlook/GMDS overlord/MS overly/SG overmanned overmanning overmaster/SGD overmatching overmodest overmuch/S overnice overnight/MS overoptimism/M overoptimistic overpaid overparticular overpass/MS overpay/LGS overplay/GDS overpopulate/GNDS overpopulation/M overpopulous overpower/GSD overpowering/Y overpraise/DSG overprecise overpressure overprice/DSG overprint/GSMD overproduce/DSG overproduction/M overprotect/SDGV overqualified overran overrate/GDS overreach/DSG overreact/SDG overreaction/SM overrefined overrepresented overridden override/MGS overripe/M overrode overrule/GDS overrun/SM overrunning oversampled oversampling oversaw oversea/S oversee/RSZ overseeing overseen overseer/M oversell/GS oversensitive/P oversensitiveness/M oversensitivity oversexed overshadow/GDS overshoe/MS overshoot/SG overshot oversight/SM oversimple oversimplification/M oversimplify/NXDSG oversize oversleep/SG overslept oversold overspecialization/M overspecialize/GDS overspend/GS overspent overspread/GS overstaffed overstate/LDSG overstatement/SM overstay/DSG overstep/S overstepped overstepping overstimulate/DSG overstock/GSD overstress/D overstretch/DSG overstrict overstrung overstuffed oversubscribe/DSG oversubtle oversupply/DSG oversuspicious overt/YP overtake/ZGRS overtaken overtax/GDS overthrew overthrow/GSM overthrown overtightened overtime/MS overtire/GDS overtone/MS overtook overture/MS overturn/DSG overuse/DSMG overvaluation/S overvalue/DSG overview/MS overweening/Y overweight/M overwhelm/GSD overwhelming/Y overwinter/SDG overwork/GMDS overwrite/GS overwritten overwrote overwrought overzealous oviduct/SM oviparous ovoid/MS ovular ovulate/DSGN ovulation/M ovule/MS ovum/M ow owe/DSG owl/SM owlet/MS owlish/Y own/ESGD owned/U owner/MS ownership/SM ox/MNS oxalate oxalic oxblood/M oxbow/MS oxcart/SM oxford/SM oxidant/MS oxidation/M oxide/MS oxidization/M oxidize/ZGDRS oxidizer/M oxtail/S oxyacetylene/M oxygen/M oxygenate/DSGN oxygenation/M oxymora oxymoron/M oyster/SM oz ozone/M p/NRXTGJ pH pa/SMH pablum/M pabulum/M pace/MZGDRS pacemaker/SM pacemen pacer/M pacesetter/MS pacey pachyderm/MS pachysandra/SM pacific pacifically pacification/M pacifier/M pacifism/M pacifist/SM pacifistic pacify/ZGDRSN pack's pack/UADSG packable package's package/AGDS packager/SM packaging/M packer/MS packet/MS packhorse packing's packinghouse/MS packsaddle/MS pact/MS pacy/RT pad/SM padded padding/M paddle/MZGDRS paddler/M paddock/MDGS paddy/SM padlock/MDSG padre/SM paean/SM paella/MS paeony pagan/SM paganism/M page/MZGDRS pageant/MS pageantry/M pageboy/SM pageful pager/M paginate/DSGN pagination/M pagoda/MS pah paid/AU pail/MS pailful/SM pain/MDSG painful/PY painfuller painfullest painfulness/M painkiller/SM painkilling painless/PY painlessness/M painstaking/MY paint/SZGJMDR paintball paintbox/MS paintbrush/MS painted/U painter/MY painting/M paintwork pair/AMDSG paired/U pairing/S pairwise paisley/SM pajama/S pajamas/M pal/SMY palace/MS paladin/SM palaeontologist/S palanquin/SM palatable/U palatal/SM palatalization/M palatalize/GDS palate/MBS palatial/Y palatinate/MS palatine/MS palaver/GSMD pale/MYTGPDRSJ paleface/MS paleness/M paleographer/SM paleographic paleography/M paleolithic paleontological paleontologist/MS paleontology/M palette/SM palfrey/SM palimony/M palimpsest/SM palindrome/MS palindromic paling/M palisade/SM palish pall/MDSG palladium/M pallbearer/MS pallet/MS palliate/DSGNV palliation/M palliative/MS pallid/YP pallidness/M pallor/M palm/MDSG palmate palmetto/SM palmist/SM palmistry/M palmtop/SM palmy/TR palomino/MS palpable palpably palpate/DSGN palpation/M palpitate/GNDSX palpitation/M palsy/GDSM paltriness/M paltry/RPT paludal pampas/M pamper/DSG pamphlet/MS pamphleteer/SM pan/SMD panacea/SM panache/M panama/MS panatella/S pancake/DSMG panchromatic pancreas/MS pancreatic panda/SM pandemic/SM pandemonium/M pander/MDRZGS panderer/M pane/MS panegyric/SM panel/SGJMD paneling/M panelist/MS pang/MS pangolin panhandle/DRSMZG panhandler/M panic/SM panicked panicking panicky/TR panjandrum panned pannier/SM panning panoply/SM panorama/SM panoramic panpipes/M pansy/SM pant/MDSG pantaloons/M pantechnicon/S pantheism/M pantheist/SM pantheistic pantheon/SM panther/MS pantie/MS pantiled pantiles panto/S pantograph pantographs pantomime/MGDS pantomimic pantomimist/MS pantry/SM pantsuit/SM pantyhose/M pantyliner/M pantywaist/SM panzer pap/SM papa/MS papacy/SM papal paparazzi/M paparazzo papaw/SM papaya/MS paper/SZGMDR paperback/SM paperbark/S paperboard/M paperboy/SM paperclip/S paperer/M papergirl/SM paperhanger/MS paperhanging/M paperless paperweight/MS paperwork/M papery papilla/M papillae papillary papist/MS papoose/MS pappy/SM paprika/M papyri papyrus/M par/SZGMDRBJ para/MS parable/MS parabola/SM parabolic paraboloid/S paracetamol/S parachute/DSMG parachutist/SM parade/MZGDRS parader/M paradigm/SM paradigmatic paradisaical paradise/SM paradox/MS paradoxical/Y paraffin/M paragliding paragon/MS paragraph/GMD paragraphs parakeet/SM paralegal/MS paralinguistic parallax/MS parallel/SGMD paralleled/U parallelepiped parallelism/SM parallelogram/SM paralysis/M paralytic/SM paralytically paralyze/DSG paralyzing/Y paramagnetic paramagnetism paramecia paramecium/M paramedic/MS paramedical/SM parameter/MS parametric parametrically parametrization parametrize/DS paramilitary/SM paramount paramountcy paramour/SM paranoia/M paranoiac/MS paranoid/SM paranormal parapet/MS paraphernalia/M paraphrase/MGDS paraplegia/M paraplegic/MS paraprofessional/MS parapsychologist/SM parapsychology/M paraquat/M parascending parasite/SM parasitic parasitical/Y parasitism/M parasitologist parasitology parasol/MS parasympathetic/S parathion/M parathyroid/MS paratroop/RZS paratrooper/M paratroops/M paratyphoid/M parboil/DSG parcel/GMDS parch/LGDS parchment/SM pardner/S pardon/ZGMDRBS pardonable/U pardonably/U pardoner/M pare/S paregoric/M parent/GMDS parentage/M parental parenteral parentheses parenthesis/M parenthesize/GDS parenthetic parenthetical/Y parenthood/M parenting/M parer/M pares/S paresis/M parfait/MS pariah/M pariahs parietal parimutuel/SM paring/M parish/MS parishioner/SM parity/ESM park/MDSG parka/SM parking/M parkland parkway/MS parky parlance/M parlay/GMDS parley/GMDS parliament/SM parliamentarian/MS parliamentary parlor/MS parlormaid parlous parmigiana parochial/Y parochialism/M parochiality parodied/U parodist/SM parody/GDSM parole/MGDS parolee/MS paroxysm/SM paroxysmal parquet/MDSG parquetry/M parred parricidal parricide/MS parring parrot/GMDS parry/GDSM parse/DRSJZG parsec/MS parsimonious/Y parsimony/M parsley/M parsnip/MS parson/MS parsonage/MS part's part/CDSG partake/ZGRS partaken partaker/M parterre/SM parthenogenesis/M partial/MYS partiality/M participant/MS participate/GNVDS participation/M participator/SM participatory participial/M participle/SM particle/SM particleboard/M particular/SMY particularism particularity/SM particularization/M particularize/DSG particulate/MS parting/MS partisan/SM partisanship/M partition's partition/ADG partitions partitive/MS partly partner/MDSG partnership/MS partook partridge/SM parturition/M partway party/GDSM parvenu/MS pascal/MS paschal pasha/SM pass/M passably passage/MS passageway/SM passbook/MS passe/DRSBXZGNV passel/MS passenger/SM passer/M passerby/M passersby passim passing/MY passion/EM passionate/EY passionateness passionflower/MS passionless passivated passive/PMYS passiveness/M passivisation passivised passivises passivising passivity/M passivization passivize/DSG passkey/MS passmark passover passport/MS password/MS past/AMS pasta/SM paste/DSMG pasteboard/M pasted/U pastel/MS pastern/MS pasteurization/M pasteurize/DRSZG pasteurized/U pasteurizer/M pastiche/MS pastie pastille/MS pastime/MS pastiness/M pastis pastor/MS pastoral/MS pastoralism pastorate/MS pastrami/M pastry/SM pasturage/M pasture/DSMG pastureland/M pasty/PTRSM pat/SM patch/EGMDS patchable patchily patchiness/M patchouli patchwork/SM patchy/TPR pate/MS patella/MS patellae patent/GMDYBS paterfamilias/MS paternal/Y paternalism/M paternalist/S paternalistic paternity/M paternoster/SM path/M pathetic pathetically pathfinder/SM pathless pathogen/SM pathogenesis pathogenic pathological/Y pathologist/MS pathology/SM pathos/M paths pathway/MS patience/M patient/IMST patienter patiently patina/MS patine patio/SM patisserie/S patois/M patresfamilias patriarch/M patriarchal patriarchate/SM patriarchs patriarchy/SM patrician/SM patricide/SM patrimonial patrimony/SM patriot/SM patriotic/U patriotically patriotism/M patrol/MS patrolled patrolling patrolman/M patrolmen patrolwoman/M patrolwomen patron/MS patronage/MS patroness/MS patronization patronize/ZGDRS patronizer/M patronizing/Y patronymic/SM patronymically patroon/SM patsy/SM patted patten/S patter/MDGS pattern/SMDG patternless patting patty/SM paucity/M paunch/MS paunchy/RT pauper/MS pauperism/M pauperize/DSG pause/DSMG pave/AGDS paved/U pavement/MS pavilion/SM paving/MS pavlova/S paw/SGMD pawl/MS pawn/MDSG pawnbroker/SM pawnbroking/M pawnshop/MS pay's pay/ASGBL payback/SM paycheck/MS payday/MS payed payee/SM payer/SM payload/SM paymaster/SM payment/ASM payoff/MS payola/M payout/MS payphone/S payroll/SM payslip/SM payware/S pct pd pea/SM peace/SM peaceable peaceably peaceful/PY peacefuller peacefullest peacefulness/M peacekeeper/MS peacekeeping/M peacemaker/SM peacemaking/M peacetime/M peach/MS peachy/TR peacock/MS peafowl/MS peahen/MS peak/MDSG peaky/P peal/AMDSG peanut/MS pear/MYS pearl/SGMD pearly/RT peartrees peasant/SM peasantry/M peashooter/MS peat/M peaty/TR pebble/MGDS pebbly/TR pecan/SM peccadillo/M peccadilloes peccary/SM peck/MDRSZG peckish pecs pectic pectin/M pectoral/MS peculate/GNXDS peculation/M peculator/M peculiar/Y peculiarity/SM pecuniary pedagogic pedagogical/Y pedagogue/SM pedagogy/M pedal/SGMD pedalo/S pedant/MS pedantic pedantically pedantry/M peddle/ZGDRS peddler/M pederast/MS pederasty/M pedestal/MS pedestrian/SM pedestrianization pedestrianize/DSG pediatric/S pediatrician/MS pediatrics/M pedicab/SM pedicure/MGDS pedicurist/MS pedigree/MDS pediment/MS pedology pedometer/MS pedophile/S pedophilia peduncle/MS pee/DRSMZ peeing peek/MDSG peekaboo/M peel/MDRSJZG peeled/U peeler/M peeling/M peen/MS peep/MDRSZG peepbo peeper/M peephole/MS peepshow/MS peer/MDG peerage/SM peeress/MS peerless peeve/DSMG peevish/PY peevishness/M peewee/MS peewit/S peg/SM pegboard/MS pegged pegging peignoir/SM pejoration/M pejorative/SMY peke/MS pekineses pekingese/SM pekoe/M pelagic pelf/M pelican/MS pellagra/M pellet/GMDS pellucid pelmet/S pelt/MDSG pelvic pelvis/MS pemmican/M pen/M penal penalization/M penalize/DSG penalty/SM penance/MS pence penchant/SM pencil/GMDJS pend/CDSG pendant/MS pendent/MS pendulous pendulum/MS penetrability/M penetrable penetrate/XDSGNV penetrating/Y penetration/M penfriend/S penguin/MS penicillin/M penile peninsula/SM peninsular penis/MS penitence/M penitent/SMY penitential penitentiary/SM penknife/M penknives penlight/SM penman/M penmanship/M penmen pennant/MS penned penniless penning pennon/MS penny/SM pennyweight/SM pennyworth penologist/MS penology/M pension/BZGMDRS pensioner/M pensive/PY pensiveness/M pent pentacle/MS pentagon/MS pentagonal pentagram/SM pentameter/MS pentasyllabic pentathlete/SM pentathlon/MS pentatonic pentecostal penthouse/SM penuche/M penultimate/SMY penumbra/MS penumbrae penurious/YP penuriousness/M penury/M peon/MS peonage/M peony/SM people/MGDS pep/SM peperoni pepped pepper/GMDS peppercorn/SM peppermint/MS pepperoni/MS peppery peppiness/M pepping peppy/TPR pepsin/M peptic/MS peptide/S peradventure/M perambulate/DSGNX perambulation/M perambulator/SM percale/MS perceive/BGDS perceived/U percent/MS percentage/SM percentile/SM perceptibility perceptible perceptibly perception/MS perceptional perceptive/YP perceptiveness/M percepts perceptual/Y perch/GMDS perchance perchlorate percipience/M percipient percolate/GNDS percolation/M percolator/SM percuss/GVDS percussion/AM percussionist/SM percussive/Y perdition/M perdurable peregrinate/GNXDS peregrination/M peregrine/MS peremptorily peremptory/P perennial/SMY perestroika/M perfect/PTGMDRYS perfecta/MS perfectibility/M perfectible perfection/SM perfectionism/M perfectionist/MS perfectness/M perfidious/Y perfidy/SM perforate/GNDSX perforation/M perforce perform/BSDRZG performance/SM performed/U performer/M perfume/DRSMZG perfumer/M perfumery/SM perfunctorily perfunctory perfused perfusion pergola/SM perhaps periastron pericardia pericardium/M perigee/SM periglacial perihelia perihelion/M peril/SGMD perilous/Y perimeter/SM perinatal perinea perineum/M period/MS periodic periodical/SMY periodicity/M periodontal periodontics/M periodontist/SM peripatetic/SM peripheral/SMY periphery/SM periphrases periphrasis/M periphrastic periscope/SM perish/BDRSZG perishable/MS peristalses peristalsis/M peristaltic peristyle/SM peritoneal peritoneum/MS peritonitis/M periwig/SM periwinkle/SM perjure/DRSZG perjurer/M perjury/SM perk/MDSG perkily perkiness/M perky/TPR perm/MDSG permafrost/M permanence/M permanency/M permanent/SMY permanganate permeability/M permeable permeate/GNDS permeation/M permissibility permissible permissibly permission/SM permissive/PY permissiveness/M permit/MS permitted permitting permittivity permutation/MS permute/DSG pernicious/PY perniciousness/M peroration/MS peroxidase peroxide/MGDS perpendicular/MYS perpendicularity/M perpetrate/GNDS perpetration/M perpetrator/SM perpetual/SMY perpetuate/GNDS perpetuation/M perpetuity/M perplex/GDS perplexed/Y perplexity/SM perquisite/SM perry persecute/GNDSX persecution/M persecutor/SM perseverance/M persevere/DSG persevering/Y persiflage/M persimmon/SM persist/SGD persistence/M persistent/Y persnickety person/UMS persona/M personable personae personage/MS personal/MYS personality/SM personalization/C personalize/CGDS personalized/U personalty/M personification/M personify/XDSGN personnel/M perspective/SM perspex perspicacious/Y perspicacity/M perspicuity/M perspicuous/Y perspiration/M perspire/GDS persuade/BZGDRS persuaded/U persuader/M persuasion/SM persuasive/YP persuasiveness/M pert/RYPT pertain/GSD pertinacious/Y pertinacity/M pertinence/M pertinent/Y pertness/M perturb/DGS perturbation/MS perturbed/U pertussis/M peruke/MS perusal/MS peruse/GDS perv/S pervade/DSG pervasive/PY pervasiveness/M perverse/PXYN perverseness/M perversion/M perversity/M pervert/SGMD peseta/MS peskily peskiness/M pesky/TPR peso/MS pessary/S pessimal/SDYG pessimism/M pessimist/SM pessimistic pessimistically pest/MRSZ pester/GD pesticide/MS pestiferous pestilence/SM pestilent pestilential pestle/MGDS pesto/M pet/SZMR petal/SMD petard/MS petcock/SM peter/GMD pethidine petiole/SM petite/MS petition/ZGMDRS petitioner/M petrel/MS petrifaction/M petrify/NDSG petrochemical/SM petrodollar/SM petrographic petrographical petrol/M petrolatum/M petroleum/M petrological petrologist/SM petrology/M petted petticoat/MS pettifog/S pettifogged pettifogger/SM pettifoggery/M pettifogging pettily pettiness/M petting/M pettish/YP petty/PTR petulance/M petulant/Y petunia/MS pew/SM pewee/SM pewit/SM pewter/MS peyote/M pf pfennig/MS pg phaeton/MS phage/S phagocyte/SM phalanger/SM phalanges phalanx/MS phalli phallic phallus/M phantasm/MS phantasmagoria/MS phantasmagorical phantasmal phantom/SM pharaoh/M pharaohs pharisaic pharisee/SM pharmaceutic/MS pharmaceutical/MS pharmaceutics/M pharmacist/SM pharmacological pharmacologist/MS pharmacology/M pharmacopoeia/SM pharmacy/SM pharyngeal pharynges pharyngitis/M pharynx/M phase/DSMG phaseout/SM phat pheasant/MS phenacetin/M phenobarbital/M phenol/MS phenolic phenolphthalein phenom/MS phenomena phenomenal/Y phenomenological/Y phenomenology phenomenon/MS phenotype/S phenylalanine pheromone/MS phew phi/SM phial/SM philander/DRSZG philanderer/M philandering/M philanthropic philanthropically philanthropist/SM philanthropy/SM philatelic philatelist/SM philately/M philharmonic/SM philippic/MS philistine/SM philistinism/M philodendron/SM philological philologist/MS philology/M philosopher/SM philosophic philosophical/Y philosophize/ZGDRS philosophizer/M philosophy/SM philter/MS phlebitis/M phlebotomy phlegm/M phlegmatic phlegmatically phloem/M phlogiston phlox/M phobia/MS phobic/MS phoebe/MS phoenix/MS phone/DSMG phonecard/S phoneme/MS phonemic phonemically phonetic/S phonetically phonetician/SM phoneticist phonetics/M phonic/S phonically phonics/M phoniness/M phonograph/M phonographic phonographs phonological/Y phonologist/SM phonology/M phonon phony/PTGDRSM phooey phosphatase phosphate/MS phosphor/MS phosphorescence/M phosphorescent/Y phosphoric phosphorous phosphorus/M photo/SGMD photocell/MS photochemical/Y photochemistry photocopier/M photocopy/DRSMZG photoelectric photoelectrically photoengrave/ZGDRSJ photoengraver/M photoengraving/M photofinishing/M photogenic photogenically photograph/MDRZG photographer/M photographic photographically photographs/A photography/M photojournalism/M photojournalist/MS photolysis photolytic photometer/MS photometric photometrically photometry photomultiplier photon/MS photoreceptor photosensitive photosphere photostat/SM photostatic photostatted photostatting photosynthesis/M photosynthesize/GDS photosynthetic photosynthetically phototypesetter phototypesetting photovoltaic phrasal phrase's phrase/AGDS phrasebook/S phraseology/M phrasing/MS phreaking/S phrenological/Y phrenologist/SM phrenology/M phyla phylactery/SM phylogenetic phylogeny/M phylum/M phys physic/SM physical/MYS physicality physician/SM physicist/SM physicked physicking physics/M physio/S physiognomy/SM physiography/M physiologic physiological/Y physiologist/SM physiology/M physiotherapist/SM physiotherapy/M physique/MS phytoplankton pi/SMDRHZG pianissimo/SM pianist/MS pianistic piano/SM pianoforte/SM pianola/S piaster/MS piazza/MS pibroch/M pibrochs pic/SM pica/M picador/MS picaresque picayune piccalilli/M piccolo/MS pick/MDRSJZG pickax/GMDS picker/M pickerel/MS picket/ZGMDRS pickings/M pickle/MGDS pickpocket/SMG pickup/MS picky/TR picnic/MS picnicked picnicker/SM picnicking picoseconds picot/SM pictogram pictograph/M pictographic pictographs pictorial/MYS picture/MGDS picturesque/YP picturesqueness/M piddle/MGDS piddly pidgin/MS pie/SM piebald/MS piece/DSMG piecemeal piecewise piecework/ZMR pieceworker/M pieing pier/M pierce/JZGDRS piercing/MY piety/M piezoelectric piffle/MG pig/SML pigeon/MS pigeonhole/MGDS pigged piggery/S pigging piggish/PY piggishness/M piggy/TRSM piggyback/MDSG pigheaded/PY pigheadedness/M piglet/MS pigment/MDS pigmentation/M pigpen/MS pigskin/MS pigsty/SM pigswill pigtail/MDS pike/MZGDRS piker/M pikestaff/SM pilaf/SM pilaster/MS pilchard/MS pile/MGDSJ pileup/MS pilfer/ZGDRS pilferage/M pilferer/M pilgrim/MS pilgrimage/MS piling/M pill/MS pillage/MZGDRS pillager/M pillar/MDS pillbox/MS pillion/MS pillock/S pillory/GDSM pillow/GMDS pillowcase/MS pillowslip/MS pilot/DGSM pilothouse/SM pimento/MS pimiento/MS pimp/GMDYS pimpernel/MS pimple/DSM pimply/RT pin/SM pinafore/MS pinata/MS pinball/M pincer/MDS pinch/GMDRS pincushion/MS pine's pine/AGDS pineal pineapple/MS pinewood/S pinfeather/SM ping/GMD pinhead/SM pinhole/SM pinion/SMDG pink/TGPMDRS pinkeye/M pinkie/SM pinkish pinkness/M pinko/MS pinnacle/DSM pinnate pinned/U pinning/U pinny/S pinochle/M pinon/MS pinpoint/SGMD pinprick/MS pinsetter/SM pinstripe/DSM pint/MS pinto/MS pinup/MS pinwheel/GSMD piny/TR pinyin/M pioneer/SGMD pious/YP piousness/M pip/SZGMDR pipe/MS pipeline/SM piper/M pipette/SM pipework piping/M pipit/MS pipped pippin/SM pipping pipsqueak/SM piquancy/M piquant/Y pique/MGDS piracy/M piranha/SM pirate/DSMG piratical/Y pirogi/M pirouette/DSMG piscatorial pismire/SM piss/ZGMDRS pissoir/S pistachio/SM piste/S pistil/SM pistillate pistol/SM piston/SM pit/SM pita/MS pitapat/SM pitch/MDRSZG pitchblende/M pitcher/M pitchfork/MDSG pitchman/M pitchmen piteous/YP piteousness/M pitfall/SM pith/M pithead/S pithily pithiness/M piths pithy/RTP pitiable pitiably pitiful/Y pitifuller pitifullest pitiless/PY pitilessness/M piton/MS pitta/S pittance/MS pitted pitting pituitary/SM pity/GDSM pitying/Y pivot/MDGS pivotal pix/M pixel/MS pixie/MS pizazz/M pizza/MS pizzeria/SM pizzicati pizzicato/M pj's pk pkg pkt pkwy pl placard/SMDG placate/DSGN placation/M placatory place's place/EAGLDS placebo/SM placed/U placeholder/SM placekick/MDRZGS placekicker/M placemen placement/EASM placenta/SM placental/S placer/SM placid/Y placidity/M placings placket/SM plagiarism/MS plagiarist/MS plagiarize/ZGDRS plagiarizer/M plagiary/M plague/DSMG plaice plaid/MS plain/MRYTSP plainchant plainclothes plainclothesman/M plainclothesmen plainness/M plainsman/M plainsmen plainsong/M plainspoken plaint/SMV plaintiff/SM plaintive/Y plait/MDGS plan/ZMRS planar plane's plane/CGDS planeload/MS planer/M planet/SM planetarium/MS planetary planetesimals planetoids plangency/M plangent plank/MDGS planking/M plankton/M planned/U planner/SM planning/S plant/MDRZGSJ plantain/SM plantar plantation/SM planter/M planting/M plantlike plaque/SM plash/MDSG plasma/SM plasmid/S plaster/SZGMDR plasterboard/M plasterer/M plasterwork plastic/SM plasticine plasticity/M plasticize/DSZG plat/XGMDNS plate/MS plateau/SMDG plateful/SM platelet/SM platen/M platform/SGMD plating/M platinum/M platitude/SM platitudinous platonic platoon/SGMD platted platter/SM platting platy/M platypus/MS plaudit/SM plausibility/M plausible plausibly play/AEGMDS playability/U playable/EU playact/SGD playacting/M playback/MS playbill/MS playbook/MS playboy/SM player/SM playfellow/SM playful/PY playfulness/M playgirl/MS playgoer/MS playground/SM playgroup/S playhouse/MS playings playmate/MS playoff/SM playpen/SM playroom/SM playschool/S plaything/SM playtime/M playwright/SM plaza/MS plea/MS plead/DRZGSJ pleader/M pleading/MY pleasant/UTYP pleasanter pleasantness/UM pleasantry/SM please/EDSG pleasing/YS pleasurably pleasure/MGDSB pleasureful pleat/MDGS pleb/S plebby plebe/MS plebeian/MS plebiscite/MS plectra plectrum/MS pledge/DSMG plenary/SM plenipotentiary/SM plenitude/SM plenteous/Y plentiful/Y plenty/M plenum/S pleonasm/MS plethora/M pleura/M pleurae pleural pleurisy/M plexus/MS pliability/M pliable pliancy/M pliant/Y pliers/M plight/SMDG plimsoll/S plinth/M plinths plod/S plodded plodder/MS plodding/S plonk/DRSZG plop/MS plopped plopping plosive/S plot/MS plotted/A plotter/SM plotting plover/SM plow/ZGMDS plowman/M plowmen plowshare/MS ploy's ploy/S pluck/MDRSG pluckily pluckiness/M plucky/RPT plug's plug/US plugged/UA plugging/UA plughole/S plum/GMDS plumage/M plumb/MDRSZGJ plumbago plumbed/U plumber/M plumbing/M plume/MS plummet/SGMD plummy plump/MDRYSTGP plumpness/M plumy/RT plunder/SZGMDR plunderer/M plunge/DRSMZG plunger/M plunk/MDSG pluperfect/SM plural/SM pluralism/M pluralist/MS pluralistic plurality/SM pluralization/M pluralize/GDS plus/MS plush/MRYTP plushness/M plushy/RT plutocracy/SM plutocrat/SM plutocratic plutonium/M pluvial ply/AZGDSM plywood/M pm pneumatic/S pneumatically pneumonia/M poach/DRSZG poacher/M poaching/M pock/GMDS pocket/SMDG pocketbook/SM pocketful/SM pocketknife/M pocketknives pockmark/MDGS pod/SM podcast podded podding podiatrist/SM podiatry/M podium/SM poem/MS poesy/M poet/MS poetaster/MS poetess/MS poetic/S poetical/Y poetry/M pogo pogrom/SM poi/M poignancy/M poignant/Y poikilothermic poinciana/SM poinsettia/SM point/MDRSZG pointblank pointed/PY pointer/M pointillism/M pointillist/SM pointless/YP pointlessness/M pointy/TR poise/MGDS poison/SJZGMDR poisoner/M poisoning/M poisonous/Y poke/MZGDRS poker/M poky/TR pol/SGMD polar polarity/SM polarization/CMS polarize/CDSG pole/MS poleaxe/GDS polecat/MS polemic/MS polemical/Y polemicist/SM polemics/M polestar/SM poleward/S police/DSMG policeman/M policemen policewoman/M policewomen policy/SM policyholder/SM policymaker/S polio/MS poliomyelitis/M polish/ZGMDRSJ polished/U polisher/M politburo/MS polite/RYTP politeness/M politesse/M politic/S political/Y politician/MS politicization/M politicize/CDSG politicking/M politico/SM politics/M polity/SM polka/MDSG poll/XGMDNS pollack/MS pollard/S pollen/M pollinate/GNDS pollination/M pollinator/MS polling/M polliwog/SM pollster/SM pollutant/MS pollute/ZGNDRSX polluted/U polluter/M pollution/M polo/M polonaise/SM polonium/M poltergeist/MS poltroon/SM poly polyandrous polyandry/M polyatomic polycarbonate polychromatic polychrome polyclinic/SM polycrystalline polycyclic polyester/MS polyethylene/M polygamist/MS polygamous polygamy/M polyglot/SM polygon/SM polygonal polygraph/GMD polygraphs polyhedral polyhedron/SM polymath/M polymaths polymer/SM polymerase/S polymeric polymerization/M polymerize/GDS polymorphic polymorphism/S polymorphous polynomial/SMY polyp/MS polypeptide/S polyphonic polyphony/M polypropylene/M polysaccharides polysemous polystyrene/M polysyllabic polysyllable/MS polytechnic/SM polytheism/M polytheist/SM polytheistic polythene polytopes polyunsaturate/DS polyurethane/SM polyvinyl pom/S pomade/DSMG pomander/SM pomegranate/MS pommel/SGMD pommy/S pomp/M pompadour/SMD pompano/MS pompom/SM pomposity/M pompous/YP pompousness/M ponce/GDS poncho/SM poncy pond/MS ponder/SZGDR ponderer/M ponderous/PY ponderousness/M pone/MS pong/GDS pongee/M poniard/MS pontiff/SM pontifical/Y pontificate/MGNDSX pontoon/SM pony/GDSM ponytail/MS poo/SGD pooch/MDSG poodle/SM poof/MS poofter/S pooh/GMD poohs pool/GMDS poolroom/MS poolside/S poop/GMDS poor/TRYP poorboy/M poorhouse/SM poorness/M pop/SM popcorn/M pope/MS popgun/SM popinjay/MS poplar/SM poplin/M popover/SM poppa/MS poppadom/S popped popper/SM poppet/S popping poppy/SM poppycock/M populace/MS popular/Y popularity/UM popularization/SM popularize/DSG populate/ACGDS populated/U population/CM populations populism/M populist/MS populous/P populousness/M porcelain/SM porch/MS porcine porcupine/SM pore/MGDS porgy/SM pork/ZMR porker/M porky/RSMT porn/M porno/M pornographer/MS pornographic pornographically pornography/M porosity/M porous/P porousness/M porphyritic porphyry/M porpoise/MGDS porridge/M porringer/SM port's port/CAEGDS portability/M portable/MS portage/DSMG portal/SM portcullis/MS portend/SGD portent/SM portentous/YP porter/ASM porterage porterhouse/MS portfolio/MS porthole/MS portico/M porticoes portiere/MS portion/KSGMD portliness/M portly/RPT portmanteau/SM portrait/MS portraitist/MS portraiture/M portray/SGD portrayal/MS portulaca/M pose's/A pose/CAKEGDS poser/EKSM poseur/SM posh/TR posit/DSGV position's/KC position/ACKES positionable positional/KC positionally positioned/KA positioning/AK positive/PMYTRS positiveness/M positivism positivist/S positivity positron/MS poss posse/MS possess/AEVGSD possession/ASM possessive/SPMY possessiveness/M possessor/SM possibility/SM possible/RSMT possibly possum/SM post/ZGMDRSJ postage/M postal postbag/S postbox/S postcard/SM postcode/S postconsonantal postdate/DSG postdoc postdoctoral poster/M posterior/SM posterity/M postfixes postgraduate/MS posthaste posthumous/Y posthypnotic postie/S postilion/SM postindustrial posting/M postlude/SM postman/M postmark/SMDG postmaster/MS postmen postmenopausal postmeridian postmistress/MS postmodern postmodernism/M postmodernist/MS postmortem/SM postnasal postnatal postoperative postpaid postpartum postpone/DSGL postponement/MS postprandial postscript/SM postseason/SM postulate/XDSMGN postulation/M postural posture/MGJDS posturing/M postwar postwoman postwomen posy/SM pot/CSM potability/M potable/SM potash/M potassium/M potato/M potatoes potbelly/DSM potboiler/SM potency/M potent/Y potentate/MS potential/MYS potentiality/SM potentiometer/S potful/SM pothead/SM pother/SMDG potherb/SM potholder/MS pothole/DRSMZG pothook/SM potion/SM potluck/MS potpie/SM potpourri/SM potsherd/SM potshot/MS pottage/M potted potter/GSMD pottery/SM potting potty/PRSMT pouch/MDSG pouf/S pouffe/S poulterer/MS poultice/DSMG poultry/M pounce/DSMG pound's pound/KDSG poundage/M pounding/SM pour/GDSBJ pout/ZGMDRS pouter/M poverty/M pow powder/GSMD powdery power/MDSG powerboat/MS powerful/YP powerhouse/SM powerless/YP powerlessness/M powwow/SGMD pox/MS pp ppm ppr pr practicability/SM practicably practical/SMY practicality/SM practice/DSMGB practiced/U practicum/SM practitioner/MS praetor/SM praetorian pragmatic/MS pragmatical/Y pragmatism/M pragmatist/SM prairie/SM praise/EDSMG praiseworthiness/M praiseworthy/P praline/SM pram/MS prance/DRSMZG prancer/M prancing/Y prang/DSG prank/MS prankster/SM praseodymium/M prat/S prate/MZGDRS prater/M pratfall/SM prattle/DRSMZG prattler/M prawn/MDSG pray/ZGDRS prayer/M prayerbook prayerful/Y preach/DRSZGJL preacher/M preachment/M preachy/RT preadolescence/MS preallocate preamble/MGDS preamp preamplifier prearrange/LGDS prearrangement/M preassigned preauthorize prebendary precancel/SMDG precancerous precarious/YP precariousness/M precast precaution/MS precautionary precede/DSG precedence/MS precedent/SM precept/SM preceptor/SM precess/GD precession precinct/MS preciosity/M precious/PY preciousness/M precipice/SM precipitant/SM precipitate/DSXMYGN precipitation/M precipitous/Y precis/M precise/XDRSYTGNP preciseness/M precision/M preclinical preclude/GDS preclusion/M precocious/PY precociousness/M precocity/M precognition/SM precognitive precolonial precomputed preconceive/DSG preconception/MS precondition/GSMD precook/GSD precursor/SM precursory predate/XDSGN predator/MS predatory predawn predecease/GDS predecessor/MS predeclared predefine/DG predesignate/GDS predestination/M predestine/DSG predetermination/M predetermine/DRSZG predeterminer/M predicable predicament/MS predicate/MGNVDS predication/M predicative/Y predict/BGVSD predictability/UM predictable/U predictably/U predicted/U prediction/MS predictor/MS predigest/DSG predilection/SM predispose/GDS predisposition/SM predominance/M predominant/Y predominate/DSYG preemie/SM preeminence/M preeminent/Y preempt/GVSD preemption/M preen/DSG preexist/DGS preexistence/M pref prefab/SM prefabbed prefabbing prefabricate/GNDS prefabrication/M preface/DSMG prefatory prefect/SM prefecture/MS prefer/SBL preferably preference/MS preferential/Y preferment/M preferred preferring prefigure/GDS prefix/MDSG preform/GSD pregame/SM pregnancy/SM pregnant preheat/GSD prehensile prehistoric prehistorical/Y prehistory/M prejudge/GDS prejudgment/MS prejudice/MGDS prejudiced/U prejudicial prekindergarten/SM prelacy/M prelate/SM prelim/SM preliminarily preliminary/SM preliterate preloaded prelude/MS premarital premature/YP prematurity premed/SM premedical premeditate/GNDS premeditated/U premeditation/M premenstrual premier/SGMD premiere/MS premiership/SM premise/DSMG premium/SM premix/GDS premolar/SM premonition/SM premonitory prenatal/Y prenuptial preoccupation/MS preoccupy/DSG preoperative preordain/DSG prep/MS prepackage/DSG prepacked prepaid preparation/MS preparative preparatory prepare/ZGDRS prepared/UP preparedness/UM prepay/GSL prepayment/MS preplanned preponderance/SM preponderant/Y preponderate/GDS preposition/MS prepositional/Y prepossess/GDS prepossessing/U prepossession/SM preposterous/Y prepped prepping preppy/TRSM preprocessed prepubescence/M prepubescent/MS prepuce/MS prequel/MS prerecord/SGD preregister/DGS preregistration/M prerequisite/SM prerogative/SM pres presage/MGDS presbyopia/M presbyter/SM presbytery/SM preschool/SMRZ preschooler/M prescience/M prescient/Y prescribe/DSG prescript/SVM prescription/SM prescriptive/Y prescriptivism prescriptivist preseason/SM preselect/SD presence/SM present/LMDRYZGSB presentably presentation/ASM presentational/A presenter/M presentiment/MS presentment/SM preservation/M preservationist/SM preservative/SM preserve/BDRSMZG preserver/M preset/S presetting preshrank preshrink/SG preshrunk preside/GDS presidency/SM president/MS presidential presidia presidium/M presort/DGS press's press/ACGSD pressed/U presser/MS pressie/S pressing/SMY pressman/M pressmen pressure/DSMG pressurization/M pressurize/CDSG pressurized/U pressurizer/MS prestidigitation/M prestidigitator prestidigitatorial prestige/M prestigious presto/SM presumably presume/GDSB presumption/SM presumptive/Y presumptuous/PY presumptuousness/M presuppose/DSG presupposition/MS pretax preteen/MS pretend/DRZGS pretender/M pretending/U pretense/SXMN pretension/M pretentious/UY pretentiousness/M preterit/SM preterm preternatural/Y pretest/DGS pretext/MS pretreated pretreatment/S pretrial/S prettify/GDS prettily prettiness/M pretty/TGDRSMP pretzel/MS prevail/DGS prevalence/M prevalent/Y prevaricate/GNXDS prevarication/M prevaricator/SM prevent/DBSGV preventable/U preventative/SM prevention/SM preventive/SM preview/MDRSZG previous/Y prevision/MS prewar prey/GMDS prezzie/S priapic price's price/AGDS priceless pricey pricier priciest prick/MDRYSZG pricker/M prickle/MGDS prickliness/M prickly/PRT pride/MGDS prideful/Y prier/M priest/SMY priestess/MS priesthood/MS priestliness/M priestly/PRT prig/MS priggish/YP priggishness/M prim/YP primacy/M primal primarily primary/SM primate/MS prime/MZGDRSP primer/M primeval priming/M primitive/PSMY primitiveness/M primmer primmest primness/M primogenitor/MS primogeniture/M primordial/Y primp/DSG primrose/SM primula/S prince/SMY princedom/SM princeliness/M princely/PRT princess/MS principal/SMY principality/SM principle/DSM principled/U print/AMDSG printable/U printed/U printer/MS printing/SM printmaking printout/SM prion/S prior/MS prioress/MS prioritization prioritize/DSG priority/SM priory/SM prism/MS prismatic prison/SZMR prisoner/M prissily prissiness/M prissy/PTR pristine prithee privacy/M private/XMYTNRS privateer/SM privation/CSM privatization/MS privatize/DSG privet/SM privilege/DSMG privileged/U privily privy/RSMT prize/MGDS prized/A prizefight/MRSZG prizefighter/M prizefighting/M prizewinner/SM prizewinning pro/SM probabilist probabilistic probabilistically probability/SM probable/SM probably probate/MNV probation/ZMR probational probationary probationer/M probe/MGDSBJ probity/M problem/MS problematic/U problematical/Y probosces proboscis/MS procaine/M procedural/Y procedure/SM proceed/GJDS proceeding/M proceeds/M process's process/AGDS processable processed/U procession/DG processional/SM processor/SM proclaim/Z proclamation/MS proclivity/SM procrastinate/GNXDS procrastination/M procrastinator/SM procreate/V procreational procreatory proctor/GMDS proctorial procurement/SM prod/MS prodigal/MYS prodigality/M prodigious/Y prodigy/SM produce's produce/AZGDRS producer/AM producible/A product/M production/ASM productive/UAY productiveness/M productivity/M prof/MS profanation/SM profane/PYGDS profaneness/M profanity/SM professed/Y profession/MS professional/SMY professionalism/M professionalization professionalize/DSG professor/SM professorial/Y professorship/MS proffer/GMDS proficiency/SM proficient/MYS profit/BGD profitability/M profitable/U profitably/U profiteer/MDSG profiteering/M profiterole/MS profitless profligacy/M profligate/SMY proforma/S profound/PRYT profoundness/M profundity/SM profuse/PY profuseness/M progenitor/SM progeny/M progesterone/M prognathous prognoses prognosis/M prognostic/MS prognosticate/XDSGN prognostication/M prognosticator/MS program/CAS programed programing programmable/SM programmatic programmed/CA programmer/MS programming/MS progress/MDSGV progression/SM progressive/SMYP progressiveness/M prohibit/DGVS prohibition/SM prohibitionist/MS prohibitive/Y prohibitory project/GVMDS projected/A projectile/SM projection/SM projectionist/MS projective/Y projector/MS prole/S proletarian/MS proletariat/M proliferate/DSGN proliferation/M prolific prolifically prolix/Y prolixity/M prologize prologue/SM prologuize prolongation/SM prom/M promenade/MZGDRS promethium/M prominence/MS prominent/Y promiscuity/M promiscuous/Y promise/DSMG promising/Y promissory promo/M promontory/SM promote/BDRZG promoter/M promotional prompt/JPSMDRYZTG prompted/U prompter/M prompting/M promptitude/M promptness/M promulgate/XGNDS promulgation/M promulgator/MS prone/P proneness/M prong/MDS pronghorn/MS pronominal/M pronounce/DSLG pronounceable/U pronounced/Y pronouncement/MS pronto pronunciation/MS proof/ADGSM proofread/SZGR proofreader/M prop/MS propaganda/M propagandist/SM propagandize/DSG propagate/DSGN propagation/M propagator/SM propane/M propel/S propellant/MS propelled propeller/SM propelling propensity/SM proper/MRYT property/DSM prophecy/SM prophesier/M prophesy/DRSMZG prophet/SM prophetess/MS prophetic prophetical/Y prophylactic/SM prophylaxes prophylaxis/M propinquity/M propitiate/DSGN propitiation/M propitiatory propitious/Y proponent/SM proportion/ESM proportional/EY proportionality proportionals proportionate/EY proposal/MS propped propping proprietary/SM proprieties/M proprietor/MS proprietorial/Y proprietorship/M proprietress/MS propriety/SM proprioceptive propulsion/M propulsive propylene prorate/DSG prorogation/M prorogue/GD prosaic prosaically proscenium/SM prosciutto/M proscription/MS proscriptive prose/MS prosecute/DSGNBX prosecution/M prosecutor/SM proselyte/DSMG proselytism/M proselytize/ZGDRS proselytizer/M prosodic prosody/SM prospect/MDGVS prospective/Y prospector/MS prospectus/MS prosper/GSD prosperity/M prosperous/Y prostate/MS prostheses prosthesis/M prosthetic prostitute/MGNDS prostitution/M prostrate/GNXDS prostration/M prosy/RT protactinium/M protagonist/MS protean protease protect/GVSD protected/U protection/SM protectionism/M protectionist/MS protective/YP protectiveness/M protector/MS protectorate/SM protege/SM protegee/S protein/SM protestant/S protestantism protestation/SM protists protocol/MS proton/SM protoplasm/M protoplasmic prototype/MGDS prototypical protozoa protozoan/MS protozoic protract/GD protrude/GDS protrusile protrusion/MS protrusive protuberance/MS protuberant proud/RYT prov/ZNRB provability/M provable/EU provably prove/EAGDS proved/U proven/U provenance/SM provender/M provenience/M proverbial/Y provide/BDRSZG provided/U providence/M provident/Y providential/Y provider/M province/MS provincial/SMY provincialism/M provisional/Y proviso/SM provocateur/S provocative/YP provocativeness/M provoke/DRSZG provoked/U provoker/M provoking/Y provolone/M provost/SM prow/MS prowess/M prowl/MDRSZG prowler/M proximal proximate/Y proximity/M proxy/SM prude/MS prudence/M prudent/Y prudential/Y prudery/M prudish/YP prudishness/M prune/MZGDRS pruner/M prurience/M prurient/Y prussic pry/ZTGDRSM psalm/MS psalmist/SM psalter psaltery/SM psephologist/S psephology pseud/S pseudo/S pseudonym/SM pseudonymous pseudopod pseudopodia pseudoscience/MS pseudy pshaw/MS psi/SM psittacosis/M psoriasis/M psst psych/MDSG psyche/M psychedelia psychedelic/SM psychedelically psychiatric psychiatrist/SM psychiatry/M psychic/MS psychical/Y psycho/SM psychoactive psychoanalysis/M psychoanalyst/MS psychoanalytic psychoanalytical/Y psychoanalyze/GDS psychobabble/M psychodrama/SM psychogenic psychokinesis psychokinetic psycholinguistic/S psycholinguists psychological/Y psychologist/SM psychology/SM psychometric psychoneuroses psychoneurosis/M psychopath/M psychopathic psychopathology psychopaths psychopathy/M psychos/S psychosis/M psychosocial psychosomatic psychotherapist/MS psychotherapy/SM psychotic/SM psychotically psychotropic/MS psychs pt/C ptarmigan/MS pterodactyl/SM pterosaurs ptomaine/SM pub/SM pubertal puberty/M pubes/M pubescence/M pubescent pubic pubis/M public/AM publican/AMS publication/AMS publicist/MS publicity/M publicize/GDS publicized/U publicly publish/AGDS publishable/U published/U publisher/MS publishing/M puce/M puck/ZMRS pucker/MDG puckish/YP puckishness/M pud/S pudding/SM puddle/DSMG puddling/M pudenda pudendum/M pudginess/M pudgy/PRT pueblo/SM puerile puerility/M puerperal puff/ZGMDRS puffball/SM puffer/M puffin/SM puffiness/M puffy/PRT pug/SM pugilism/M pugilist/SM pugilistic pugnacious/PY pugnaciousness/M pugnacity/M puissant puke/MGDS pukka pulchritude/M pulchritudinous pule/GDS pull/ZGMDRS pullback/MS puller/M pullet/SM pulley/SM pullout/MS pullover/SM pulmonary pulp/GMDS pulpiness/M pulpit/SM pulpwood/M pulpy/RPT pulsar/SM pulsate/XGNDS pulsation/M pulse/AMGDS pulverization/M pulverize/DSG puma/MS pumice/SM pummel/SGD pump/ZGMDRS pumper/M pumpernickel/M pumpkin/MS pun/SM punch/MDRSBZG punchbag/S punchbowl puncheon/MS puncher/M punchline/S punchy/TR punctilio/M punctilious/YP punctiliousness/M punctual/Y punctuality/M punctuate/XGNDS punctuation/M punctuational puncture/DSMG pundit/SM punditry/M pungency/M pungent/Y puniness/M punish/BLGDS punished/U punishing/Y punishment/SM punitive/Y punk/TMRS punned punnet/S punning punster/SM punt/ZGMDRS punter/M puny/TRP pup/SM pupa/M pupae pupal pupate/DSG pupil/MS pupillage pupped puppet/MS puppeteer/SM puppetry/M pupping puppy/SM purblind purchase/DRSMZGB purchaser/M purdah/M pure/PYTR purebred/SM puree/MDS pureeing pureness/M purgative/SM purgatorial purgatory/SM purge/MZGDRS purger/M purification/M purifier/M purify/DRSZGN purine/MS purism/M purist/MS puristic puritan/SM puritanical/Y puritanism/M purity/SM purl/GMDS purlieu/SM purloin/SGD purple/MTRS purplish purport/SMDG purported/Y purpose/DSMYGV purposeful/PY purposefulness/M purposeless/YP purr/GMDS purse/MZGDRS purser/M pursuance/M pursuant pursue/ZGDRS pursuer/M pursuit/SM purulence/M purulent purvey/DSG purveyance/M purveyor/SM purview/M pus/M push/BZGMDRS pushbike/S pushcart/SM pushchair/S pusher/M pushily pushiness/M pushover/MS pushpin/S pushy/TRP pusillanimity/M pusillanimous/Y puss/MS pussy/TRSM pussycat/MS pussyfoot/DSG pustular pustule/SM put/ISM putative/Y putout/MS putrefaction/M putrefactive putrefy/GDS putrescence/M putrescent putrid putridity putsch/MS putt/ZGMDRS putted/I puttee/MS putter/MDRZG putterer/M putting/I putty/GDSM putz/S puzzle/MZGDRSL puzzlement/M puzzler/M puzzling/Y pvt pygmy/SM pylon/SM pylori pyloric pylorus/M pyorrhea/M pyramid/GSMD pyramidal pyre/MS pyridine pyrimidine/MS pyrite/SM pyrites/M pyrolysis pyrolyze pyromania/M pyromaniac/MS pyrotechnic/S pyrotechnical pyrotechnics/M pyroxene/S python/SM pyx/MS pzazz q qr qt qty qua quack/GMDS quackery/M quackish quad/MS quadrangle/MS quadrangular quadrant/MS quadraphonic quadratic/MS quadratically quadrature/S quadrennial quadrennium/SM quadriceps/MS quadrilateral/MS quadrille/MNSX quadrillion/M quadripartite quadriplegia/M quadriplegic/SM quadrivium/M quadruped/MS quadrupedal quadruple/MGDS quadruplet/SM quadruplicate/DSMGN quadruplication/M quadruply quadrupole quaff/GMDS quagmire/SM quahog/MS quail/GMDS quaint/PRYT quaintness/M quake/MGDS quaky/TR qualification/EM qualified/U qualifier/SM qualify/EXGNDS qualitative/Y quality/SM qualm/MS qualmish quandary/SM quango/S quanta quantifiable/U quantification/M quantified/U quantifier/M quantify/NDRSZG quantitative/Y quantity/SM quantization quantize/D quantum/M quarantine/MGDS quark/MS quarrel/SZGMDR quarreler/M quarrelsome/P quarrelsomeness/M quarry/DSMG quarrymen quart/MS quarter/SGMDY quarterback/SGMD quarterdeck/MS quarterfinal/SM quarterly/SM quartermaster/MS quarterstaff/M quarterstaves quartet/SM quartic/S quartile/S quarto/MS quartz/M quartzite quasar/MS quash/GDS quasi quasilinear quaternary quaternion/S quatrain/MS quaver/MDSG quavery quay/MS quayside/S queasily queasiness/M queasy/TPR queen/GMDYS queenly/RT queer/PTGMDRYS queerness/M quell/GDS quench/ZGDRSB quenchable/U quencher/M quenchless quern querulous/YP querulousness/M query/DSMG ques/S quest/IFAMS quested questing question/BJSMDRZG questionable/U questionably/U questioned/U questioner/M questioning/MY questionnaire/MS queue/MDSG quibble/DRSMZG quibbler/M quiche/SM quick/MNRYXTP quicken/DG quickfire quickie/SM quicklime/M quickness/M quicksand/MS quicksilver/M quickstep/MS quid/MS quiesce/D quiescence/M quiescent/Y quiet/SMDNRYXTGP quieten/DG quietism quietness/M quietude/IEM quietus/MS quiff/S quill/SM quilt/SMDRZG quilter/M quilting/M quin/S quince/SM quincentenary quine/S quinine/M quinquennial quinsy/M quint/SM quintessence/MS quintessential/Y quintet/SM quintic quintillion quintuple/MGDS quintuplet/SM quip/MS quipped quipper quipping quipster/SM quire's quire/IAS quirk/SMDG quirkiness/M quirky/RTP quirt/SM quisling/SM quit/S quitclaim/MS quite quittance/M quitter/SM quitting quiver/SMDG quivering/Y quivery quixotic quixotically quiz/M quizzed quizzer/SM quizzes quizzical/Y quizzing quoin/SM quoit/SMDG quondam quorate/I quorum/SM quot/RB quota/SM quotability/M quotation/SM quote's quote/UDSG quoth quotidian quotient/SM qwerty r/S rabbet/GMDS rabbi/SM rabbinate/M rabbinic rabbinical rabbit/GMDS rabble/MS rabid/PY rabidness/M rabies/M raccoon/MS race/MZGDRS racecourse/MS racegoer/S racehorse/MS raceme/MS racer/M racetrack/MS raceway/MS racial/Y racialism/M racialist/MS racily raciness/M racing/M racism/M racist/SM rack/GMDS racket/SMDG racketeer/GSMD racketeering/M raconteur/SM racquetball/MS racy/PRT rad/SM radar/SM radarscope/MS radder raddest raddled radial/SMY radian/S radiance/M radiant/Y radiate/DSGNVX radiation/M radiative/Y radiator/SM radical/SMY radicalism/M radicalization/M radicalize/DSG radicchio/M radii radio/MDGS radioactive/Y radioactivity/M radioastronomical radiocarbon/M radiogalaxy/S radiogram/MS radiographer/SM radiography/M radioisotope/SM radiological radiologist/SM radiology/M radioman/M radiomen radiometer/SM radiometric radiometry/M radionuclide radiophone/SM radioscopy/M radiosonde/MS radiotelegraph/M radiotelegraphs radiotelegraphy/M radiotelephone/SM radiotherapist/SM radiotherapy/M radish/MS radium/M radius/M radix radon/M raffia/M raffish/YP raffishness/M raffle/DSMG raft/ZGMDRS rafter/M rafting/M rag/SGMD raga/MS ragamuffin/MS ragbag/M rage/MS ragga ragged/RYTP raggedness/M raggedy/RT ragging raging/Y raglan/SM ragout/SM ragtag/S ragtime/M ragweed/M ragwort rah raid/ZGMDRS raider/M rail's rail/CGDS railcard/S railing/SM raillery/SM railroad/SZGMDR railroader/M railroading/M railway/SM railwayman railwaymen raiment/M rain/GMDS rainbow/SM raincloud/S raincoat/SM raindrop/SM rainfall/SM rainless rainmaker/SM rainmaking/M rainproof rainstorm/MS rainswept rainwater/M rainy/RT raise/MZGDRS raiser/M raisin/SM raj rajah/M rajahs rake/MGDS rakish/YP rakishness/M rally/DSMG ram/SM ramble/DRSMZGJ rambler/M rambunctious/PY rambunctiousness/M ramekin/SM ramie/M ramification/M ramify/DSGXN ramjet/SM rammed ramming ramp/MDS rampage/DSMG rampancy/M rampant/Y rampart/SM ramrod/SM ramrodded ramrodding ramshackle ran/A ranch/MDRSZG rancher/M ranching/M rancid/P rancidity/M rancidness/M rancor/M rancorous/Y rand/MS randiness/M random/PSY randomization/M randomize/DSG randomness/MS randy/RTP ranee/MS rang/ZR range's range/CGDS rangefinder/S ranger/M ranginess/M rangy/RTP rank/TGJPMDRYS ranking/M rankle/DSG rankness/M ransack/SGD ransom/SZGMDR ransomer/M rant/ZGMDJRS ranter/M rap/SZGMDR rapacious/PY rapaciousness/M rapacity/M rape/MS raper/M rapeseed/M rapid/PMRYTS rapidity/M rapidness/M rapier/SM rapine/M rapist/SM rapped rappel/SM rappelled rappelling rapper/SM rapping rapport/MS rapporteur/S rapprochement/SM rapscallion/SM rapt/YP raptness/M raptor/S rapture/MS rapturous/Y rare/YTGPDRS rarebit/MS rarefaction/SM rarefy/GDS rareness/M rarity/SM rascal/SMY rash/ZTMRSYP rasher/M rashness/M rasp/GMDRS raspberry/SM raspy/RT raster rat/SM ratatouille/M ratbag/S ratchet/GMDS rate/BJXMZGNDRS rateable rated/U ratepayer/S rater/M rather rathskeller/MS ratification/M ratifier/M ratify/DRSZGNX rating/M ratio/MS ratiocinate/GNDS ratiocination/M ration/MDG rational/SMY rationale/MS rationalism/M rationalist/MS rationalistic rationality/SM rationalization/MS rationalize/GDS ratlike ratline/SM rattan/SM ratted ratter/SM ratting rattle/DRSMZGJ rattlebrain/MDS rattler/M rattlesnake/MS rattletrap/SM rattly/RT rattrap/SM ratty/RT raucous/YP raucousness/M raunchily raunchiness/M raunchy/TRP ravage/DRSMZG ravager/M ravages/M rave/JMZGDRS ravel's ravel/UDSG raveling/S raven/MDSG ravenous/Y ravine/SM raving/MY ravioli/SM ravish/DRSZGL ravisher/M ravishing/Y ravishment/M raw/PTMR rawboned rawhide/M rawness/M ray/SM rayon/M raze/GDS razor/MSG razorback/MS razorbills razorblades razz/GMDS razzmatazz/M rcpt rd re/DSMYTGVJ reach/MDSGB reachable/U reached/U reacquire/DSG reacquisition react/V reactant/SM reactionary/SM read/ZGMRBJS readability/SM reader/M readership/SM readily readiness/M reading/M readmitted readout/SM ready/DRSTGP reafforestation real/TMRYPS realism/M realist/SM realistic/U realistically/U realities reality/UM realizable/U realization/MS realize/DSBG realized/U realm/MS realness/M realpolitik/M realty/M ream/ZGMDRS reamer/M reap/ZGDRS reaper/M rear/GMDS rearguard/MS rearmost rearward/S reason/SMDRZGB reasonable/UP reasonableness/UM reasonably/U reasoned/U reasoner/M reasoning/M reasonless reassuring/Y rebate/M rebel/MS rebellion/MS rebellious/YP rebelliousness/M rebid/S rebidding rebirth/M reboil/SDG rebook rebuild/SG rebuke/DSMG rebuking/Y rebuttal/MS rec'd rec/M recalcitrance/M recalcitrant recalibrate/GN recant/SDG recantation/SM recap/MS recapitalization recce/S recd receipt/SMDG receivables/M receive/DRSZGB received/U receiver/M receivership/M recension recent/YTP recentness/M receptacle/MS reception/MS receptionist/MS receptive/YP receptiveness/M receptivity/M receptor/SM recess/MDSGV recessional/MS recessionary recessive/SM recharge/R recherche recidivism/M recidivist/SM recipe/SM recipient/SM reciprocal/MYS reciprocate/DSGN reciprocation/M reciprocity/M recital/SM recitalist/SM recitative/SM reciter/SM reckless/YP recklessness/M reckon/SJDRG reckoning/M reclaim/BR reclamation/MS recline/DRSZG recliner/M recluse/SMV recognition/S recognizable/U recognizably/U recognizance/S recognize/BDRSZG recognized/U recombinant recombination recommended/U recompense/DSMG recompile/GD recon/S reconcile/GLDSB reconciled/U reconciliation/S recondite reconnaissance/SM reconnection reconnoiter/DGS reconstruct/V reconstructed/U recontribute reconversion recopy/DSG record/RBJZ recorded/U recorder/M recording/M recordists recount/SGMD recoup/DG recouple recourse/M recoverable/U recovery/SM recreant/MS recreational recriminate/GNXDS recrimination/M recriminatory recrudesce/GDS recrudescence/M recrudescent recruit/LSMDRZG recruiter/M recruitment/M recrystallization rectal/Y rectangle/MS rectangular rectifiable rectification/M rectifier/M rectify/NDRSZGX rectilinear rectitude/M recto/MS rector/SM rectory/SM rectum/SM recumbent recuperate/DSGNV recuperation/M recur/S recurred recurrence/SM recurring recursion/S recyclable/MS recycle/BZ recycling/M red/PSM redact/SDG redaction/M redactor/SM redbird/SM redbreast/MS redbrick redcap/SM redcoat/SM redcurrant/S redden/SDG redder reddest reddish redeclaration redeem/RZB redeemed/U redeemer/M redelivery redemption/M redemptive redeposition redesign/DSG redhead/SMD redirection redisplay redistribute/V redistrict/DG redivide/GDS redlining/M redneck/SM redness/M redo/G redolence/M redolent redoubt/SBM redoubtably redound/SDG redraw/SG redshift/S redskin/SM reduce/DRSZG reduced/U reducer/M reducibility reducible reduction/SM reductionism reductionist/S reductive redundancy/SM redundant/Y redwood/SM reediness/M reedy/RTP reef/ZGMDRS reefer/M reek/GMDS reel's reel/UGDS reeve/G reexport/SDG ref/SZM refashion/DGS refection/M refectory/SM refer/B referee/DSM refereed/U refereeing reference/MGDRS referenced/U referencing/U referendum/SM referent/SM referential/Y referral/SM referred referrer/SM referring reffed reffing refill/BJM refined/U refinement/MS refiner/SM refinery/S refitting reflate/XDSGN reflationary reflect/GVSD reflectance reflected/U reflection/SM reflectional reflective/PY reflectivity reflector/MS reflexive/PSMY reflexivity reflexology reflooring reforge/DSG reform/MB reformat/V reformatory/SM reformatting reformed/U reformist/S refortify/DSG refract/SGVD refractors refractory/SM refrain/SGMD refresh/ZGBLDRS refreshed/U refresher/M refreshing/Y refreshment/SM refreshments/M refrigerant/SM refrigerate/DSGN refrigerated/U refrigeration/M refrigerator/MS refuge/SM refugee/SM refulgence/M refulgent refund/B refurbishment/MS refusal/MS refuseniks refutation/MS refute/BDRSZG refuter/M reg regal/DYG regalement/M regalia/M regard/ESMDG regarded/U regardless regards/M regather/DGS regatta/SM regency/SM regeneracy/M regenerate/VX regexp/S reggae/M regicide/MS regime/SM regimen/SM regiment/MDGS regimental regimentation/M region/SM regional/Y regionalism/MS register/GMDS registered/U registrable registrant/MS registrar/MS registration/SM registry/SM regnant regress/MDSGV regression/MS regret/SM regretful/Y regrettable regrettably regretted regretting regrind/GS reground regroup/DGS regular/MYS regularity/SM regularization/M regularize/DSG regulate/CDSGNV regulated/U regulation/CM regulations regulator/MS regulatory regurgitate/GNDS regurgitation/M rehab/MS rehabbed rehabbing rehabilitate/DSGNV rehabilitation/M rehang/SDG rehears/GD rehearsal/MS rehearsed/U rehi rehung rehydrate reign/MDSG reimburse/BLDSG reimbursement/MS reimplementation rein/GD reindeer/M reinforce/GDSL reinforcement/MS reinitialization reinstall/DG reinstatement/M reinsurance reinvestigation reiterate/V reject/GSMD rejection/SM rejoice/JGDS rejoicing/M rejoinder/SM rejuvenate/DSXGN rejuvenation/M rejuvenatory rel relate/DRSXZGNV relatedness/M relater/M relation/M relational/Y relationship/SM relative/MYS relativism/M relativist/S relativistic relativistically relativity/M relax/DRSZG relaxant/MS relaxation/SM relaxer/M relaxing/Y relay/D releasable/U released/U relegate/GNDS relent/SGD relentless/PY relentlessness/M relevance/M relevancy/M relevant/Y reliability/UM reliable/U reliably/U reliance/M reliant relic/MS relict relief/SM relieve/ZGDRS reliever/M religion/SM religiosity religious/MYP religiousness/M reline/DSG relink/GD relinquish/GLDS relinquishment/M reliquary/SM relish/GMDS reluctance/M reluctant/Y rely/GDS rem/M remain/SGD remainder/MDSG remand/SGD remapping remark/B remarkableness/M remarkably remarked/U remediable remedy/GDSM remember/DG remembered/U remembrance/SM reminder/M reminisce/GDS reminiscence/SM reminiscent/Y remiss/PY remissness/M remit/S remittance/SM remitted remitting/U remix/DSG remnant/MS remodel/GDS remold/SGD remonstrant/MS remonstrate/XGNDS remorse/M remorseful/Y remorseless/PY remorselessness/M remote/RSMYTP remoteness/M remould/SDG removal/SM remunerate/DSGNVX remuneration/M renaissance/MS renal renascence/S renationalisation rend/GS render/SGMDJ rendering/M rendezvous/GMDS rendition/MS renegade/DSMG renege/DRSZG reneger/M renew/DSBG renewal/MS rennet/M rennin/M renormalization renounce/DSLG renouncement/M renovate/DSXGN renovation/M renovator/MS renown/MD rent/ZGMDRS rental/SM renter/M renunciation/SM reopen/SDG rep/SM repaint/GDS repairable/U repairer/MS repairman/M repairmen repaper reparable reparation/SM reparations/M repartee/M repatriate/DSXMGN repatriation/M repeat/SMDRZGB repeatability/U repeatable/U repeatably repeated/Y repeater/M repeating/M repel/S repelled repellent/SM repelling/Y repent/SDG repentance/M repentant/UY repercussion/S repertoire/MS repertory/SM repetition/MS repetitious/PY repetitiousness/M repetitive/YP repetitiveness/M rephotograph/GD replaceable replant/GSD replenish/DSGL replenishment/M replete/PDSGN repleteness/M repletion/M replica/SM replicable replicate/DSG replication/M replicator/S replug reply/XRN report/MRBZ reportage/M reported/Y reportorial reposeful repository/SM reprehend/DSG reprehensibility/M reprehensible reprehensibly reprehension/M represent/DGSB representable/U representative/PSM represented/U repression/SM repressive/YP reprieve/DSMG reprimand/GSMD reprisal/SM reprise/SMG reproach/BGMDS reproachful/PY reprobate/MS reproducibility reproducible/U reproducibly reprogrammable reprogramming reproving/Y reptile/SM reptilian/MS republic/S republicanism/M repudiate/XGNDS repudiation/M repudiator/MS repugnance/M repugnant repulsion/SM repulsive/PY repulsiveness/M repurchase/GDS reputability/M reputably/E reputation/MS repute/DSMGB reputed/Y request/GDR requested/U requiem/SM require/LDG requirement/SM requisite/MNXS requisition/GMD requital/M requite/DRSZG requited/U requiter/M reread/SG rerecord/GDS reredos reregistration rerouteing rerunning res/C resat rescind/SDG rescission/M rescue/DRSMZG rescuer/M reseal/B reselect reselection resemble/DSG resend/G resent/LSDG resentful/YP resentfulness/M resentment/SM reserpine/M reservation/SM reserved/UY reservedness/M reservist/SM reservoir/SM resetting reshipping reshow/G residence/SM residency/SM resident/MS residential residua residual/MS residuary residue/SM residuum/M resignal resignation/MS resigned/Y resilience/M resiliency/M resilient/Y resinous resiny resist/SMDRZGV resistance/MS resistant/U resistible resistive/Y resistivity resistless resistor/MS resitting resizing resold resole/DSG resolute/XPYTNR resoluteness/M resolvability resolvable/U resolve/M resolved/U resolvent resonance/SM resonant/Y resonate/GDS resonator/SM resorption/M resound/SGD resounding/Y resourceful/YP resourcefulness/M resp respecify respect/ESGVMD respectability/M respectable respectably respectful/EY respectfulness/M respective/Y respell/SGD respiration/M respirator/SM respiratory respire/DG resplendence/M resplendent/Y respond/SZGDR respondent/MS response/MS responsibility/SM responsible responsibly responsive/UPY responsiveness/UM rest/GVMDS restart/B restate/GDS restaurant/SM restaurateur/MS restful/YP restfuller restfullest restfulness/M restitution/M restive/YP restiveness/M restless/YP restlessness/M restoration/MS restorative/MS restorer/SM restrained/U restraint/MS restrict/SDGV restricted/U restriction/MS restrictive/PY restrictiveness/M restring/SG restroom/SM restructuring/MS resubstitute result/GSMD resultant/SM resume/DSMG resumption/SM resupply/DSG resurgence/MS resurgent resurrect/SGD resurrection/SM resuscitate/GNDS resuscitation/M resuscitator/SM resynchronization retailer/MS retain/SDRZG retainer/M retake/G retaliate/DSGNVX retaliation/M retaliatory retard/SMDRZG retardant/SM retardation/M retarder/M retch/DSG reteach/GS retention/MS retentive/PY retentiveness/M retentivity rethink/SGM rethought reticence/M reticent/Y reticular reticulated reticulation/SM reticule/S reticulum retina/SM retinal retinitis retinue/SM retiree/SM retirement/MS retort/GMD retrace/GDS retract/DBG retractile retraction/S retrain/DGS retread/D retrenchment/SM retribution/MS retributive retrieval/SM retrieve/DRSMZGB retriever/M retro/MS retroactive/Y retrofire/GDS retrofit/SM retrofitted retrofitting retrograde/DSG retrogress/DSGV retrogression/M retrorocket/SM retrospect/GVSMD retrospection/M retrospective/MYS retrovirus/MS retsina/M retuning returnable/MS returnee/SM rev/VM revamping/M revanchist reveal/BGJSD revealed/U revealing/Y reveille/M revel/JMDRSZG revelation/MS revelatory reveler/M revelry/SM revenge/MGDS revenuer/SM reverberant reverberate/DSXGN reverberation/M revere/DSG reverence/DSMG reverend/SM reverent/Y reverential/Y reverie/MS revers/M reversal/SM reverse/YR reversibility reversible reversibly revert/GSD revertible revetment/SM revile/DRSLZG revilement/M reviler/M revise/BXRZN revised/U reviser/M revision/M revisionary revisionism/M revisionist/MS revival/MS revivalism/M revivalist/SM revive/DRSG revivification/M revocable revoke/DRSZG revolt/GD revolting/Y revolution/SM revolutionary/SM revolutionist/SM revolutionize/DSG revolve/BZGDRS revolver/M revue/MS revulsion/M revved revving rewarded/U rewarding/U rewarm/GSD rewash/GDS reweave/GS rewedding rewind/MB rewound rewrite/M rhapsodic rhapsodical rhapsodize/DSG rhapsody/SM rhea/MS rhenium/M rheological rheology rheostat/SM rhesus/MS rhetoric/M rhetorical/Y rhetorician/MS rheum/M rheumatic/MS rheumatically rheumatism/M rheumatoid rheumy/TR rhinestone/SM rhinitis/M rhino/MS rhinoceros/MS rhizome/MS rho/SM rhodium/M rhododendron/SM rhomboid/SM rhomboidal rhombus/MS rhubarb/MS rhyme/MZGDRS rhymer/M rhymester/MS rhythm/SM rhythmic rhythmical/Y rial/MS rib/SM ribald ribaldry/M ribbed ribber/SM ribbing ribbon/SM ribcage riboflavin/M ribonucleic ribosomes rice/MZGDRS ricer/M rich/TMRSYP richness/M rick/GMDS rickets/M rickety/RT rickrack/M rickshaw/MS ricochet/GMDS ricotta/M rid/SR riddance/M ridden ridding riddle/DSMG ride's ride/CZGS rider/M riderless ridership/M ridge/MGDS ridgepole/SM ridgy/RT ridicule/MGDS ridiculous/PY ridiculousness/M riding/M rife/TR riff/GMDS riffle/DSMG riffraff/M rifle/MZGDRS rifleman/M riflemen rifler/M rifling/M rift/GMDS rig/SM rigatoni/M rigged rigger/SM rigging/M right/MDRYSPTG righteous/UP righteously righteousness/UM rightful/PY rightfulness/M rightism/M rightist/SM rightmost rightness/M righto rightsize/DSG rightward/S rigid/YP rigidify/S rigidity/SM rigidness/M rigmarole/MS rigor/MS rigorous/YP rigorousness/M rile/GDS rill/MS rim/SGMD rime/MS rimless rimmed rimming rind/MS ring/ZGMDRJ ringer/M ringgit/MS ringing/Y ringleader/MS ringlet/MS ringlike ringmaster/SM ringside/M ringworm/M rink/MS rinse/MGDS riot/ZGMDRS rioter/M rioting/M riotous/PY rip/SXTMNR riparian ripcord/MS ripe/YP ripen/DG ripened/U ripeness/M ripoff/SM riposte/MGDS ripped ripper/SM ripping ripple/DSMG ripply/TR ripsaw/SM ripstop riptide/MS rise/JMZGRS risen riser/M risibility/M risible rising/M risk/GMDS riskily riskiness/M risky/RPT risotto/MS risque rissole/S rite/MS ritual/SMY ritualism/M ritualistic ritualistically ritualized ritzy/RT riv/ZNR rival/MDSG rivaled/U rivalry/SM rive/CGDS river/M riverbank/SM riverbed/MS riverboat/SM riverfront riverside/MS rivet/MDRSZG riveter/M riveting/Y riviera/S rivulet/MS riyal/MS rm roach/GMDS road/IMS roadbed/SM roadblock/MDSG roadhouse/SM roadie/MS roadkill/M roadrunner/MS roadshow/SM roadside/SM roadsigns roadster/SM roadsweepers roadway/SM roadwork/SM roadworthy roam/ZGDRS roamer/M roaming/M roan/MS roar/ZGMDRS roarer/M roaring/M roast/ZGMDRSJ roaster/M roasting/M rob/S robbed robber/MS robbery/SM robbing robe's robe/EGDS robin/MS robot/MS robotic/S robotics/M robotize/GDS robust/RYPT robustness/M rock/ZGMDRS rockabilly/M rockbound rocker/M rockery/S rocket/MDSG rocketry/M rockfall/SM rockiness/M rocky/TRP rococo/M rod/SM rode rodent/MS rodeo/MS roe/SM roebuck/SM roentgen/MS roger/GDS rogue's rogue/KS roguery/M roguish/YP roguishness/M roil/GDS roister/ZGDRS roisterer/M role/MS roll/MDRZGJS rollback/SM rolled/A roller/M rollerblading rollerskating/M rollick/SDG rollicking/M rollmop/S rollover/SM romaine/MS roman/M romance/MZGDRS romancer/M romantic/MS romantically romanticism/M romanticist/MS romanticize/GDS romeo/MS romp/MDRZGS romper/M rondo/SM rood/MS roof/MDRZGS roofer/M roofgarden roofing/M roofless rooftop/SM rook/MDGS rookery/SM rookie/SM room/MDRZGS roomer/M roomette/SM roomful/SM roominess/M roommate/SM roomy/RTP roost/SMDRZG rooster/M root/MDRZGS rooter/M rootless/P rootlet/SM rootstock rope/MZGDRS roper/M ropey rosary/SM rose/MS roseate rosebud/SM rosebush/MS rosemary/M rosette/SM rosewater/M rosewood/MS rosily rosin/SMDG rosiness/M roster/SMG rostrum/MS rosy/RTP rot/SM rota/S rotary/SM rotate/DSGNBX rotation/M rotational/Y rotators rotatory rote/M rotgut/M rotisserie/SM rotogravure/SM rotor/SM rototiller/MS rotted rotten/TPRY rottenness/M rotter/S rotting rottweiler/S rotund/P rotunda/MS rotundity/M rotundness/M roue/MS rouge/DSMG rough/MDNRYXTGP roughage/M roughcast roughen/GD roughhouse/DSMG roughneck/MDSG roughness/M roughs roughshod roulette/M round/PSMDRYZTG roundabout/SM roundel/S roundelay/MS roundhouse/MS roundish roundness/M roundup/MS roundworm/SM rouse/DSG roust/SDG roustabout/SM rout/MRZS route's route/ADSG router/M routine/MYS routinize/GDS roux rove/ZGDRS rover/M row/SZGMDR rowan/S rowboat/MS rowdily rowdiness/M rowdy/PRSMT rowdyism/M rowel/SMDG rower/M rowing/M rowlock/S royal/SMY royalist/SM royalties/M royalty/SM rpm rps rt rte rub/SM rubato/SM rubbed rubber/SM rubberize/GDS rubberneck/SZGMDR rubbernecker/M rubbery/TR rubbing/S rubbish/MDSG rubbishy rubble/M rubdown/SM rube/MS rubella/M rubicund rubidium/M ruble/SM rubric/SM ruby/RSMT ruched ruck/DGS rucksack/MS ruckus/MS ruction/S rudder/SM rudderless ruddiness/M ruddy/RTP rude/YTRP rudeness/M rudiment/SM rudimentary rue/DSMG rueful/PY ruefulness/M ruff/MDYGS ruffian/MYS ruffle/DSMG ruffled/U ruffly/TR rug/SM rugby/M rugged/PTRY ruggedness/M rugger ruin/MDGS ruination/SM ruinous/Y rule/MZGJDRS rulebook/S ruler/M ruling/M rum/SM rumba/SMDG rumble/DSJMG rumbling/M rumbustious ruminant/MS ruminate/XGNVDS rumination/M ruminative/Y rummage/DSMG rummer rummest rummy/M rumor/SMDG rumormonger/MS rump/MYS rumple/DSMG rumply/RT rumpus/MS run/ASM runabout/MS runaround/SM runaway/MS rundown/SM rune/MS rung/MS runic runlet/SM runnable runnel/SM runner/SM running/M runny/RT runoff/SM runt/MS runty/RT runway/SM rupee/SM rupiah/M rupiahs rupture/MGDS rural/Y ruse/MS rush/MDRSZG rusher/M rushy/RT rusk/MS russet/SM rust/MDGS rustic/SM rustically rusticate/GDS rustication/M rusticity/M rustiness/M rustle/DRSJMZG rustler/M rustproof/SDG rusty/RPNT rut/SM rutabaga/SM ruthenium/M rutherfordium/M ruthless/PY ruthlessness/M rutted rutting rutty/RT rye/M s/NYXB sabbath sabbatical/MS saber/MS sable/MS sabot/MS sabotage/DSMG saboteur/SM sabra/MS sac/SM saccharides saccharin/M saccharine sacerdotal sachem/SM sachet/SM sack/GMDJS sackcloth/M sackful/MS sacking/M sacra sacral sacrament/MS sacramental sacred/YP sacredness/M sacrifice/DSMG sacrificial/Y sacrilege/MS sacrilegious/Y sacristan/MS sacristy/SM sacroiliac/SM sacrosanct/P sacrosanctness/M sacrum/M sad/PY sadden/SDG sadder saddest saddle's saddle/UDSG saddlebag/MS saddler/S saddlery sades sadhu/S sadism/M sadist/SM sadistic sadistically sadness/M sadomasochism/M sadomasochist/SM sadomasochistic safari/SGMD safe's safe/UYTPR safeguard/GSMD safekeeping/SM safeness/M safes safety/SM safflower/MS saffron/MS sag/SM saga/MS sagacious/Y sagacity/M sage/MYTRS sagebrush/M sagged sagging saggy/RT sago/M saguaro/MS sahib/MS said/U sail/GMDSJ sailboard/MRZGS sailboarder/M sailboarding/M sailboat/MS sailcloth/M sailfish/MS sailing/M sailor/SM sailplane/MS saint/MDYS sainthood/M saintlike saintliness/M saintly/PRT saith sake/MS salaam/SMDG salable/U salacious/YP salaciousness/M salacity/M salad/MS salamander/SM salami/SM salary/DSM sale/ABMS saleability saleroom/S salesclerk/MS salesgirl/SM saleslady/SM salesman/M salesmanship/M salesmen salespeople/M salesperson/SM salesroom/S saleswoman/M saleswomen salicylic salience/M salient/SMY saline/SM salinity/M saliva/M salivary salivate/XGNDS salivation/M sallow/RTP sallowness/M sally/DSMG salmon/SM salmonella/M salmonellae salon/MS saloon/SM salsa/MS salt's salt/CTGDS saltbox/MS saltcellar/SM salted/U salter saltine/SM saltiness/M saltpeter/M saltshaker/MS saltwater/M salty/RTP salubrious/I salubrity salutary salutation/MS salutatorian/SM salutatory salute/DSMG salvage/DSMG salvageable salvation/M salve/MZGDRS salver/M salvo/MS samarium/M samba/MDSG same/SP sameness/M samey samizdat/S samosa/S samovar/SM sampan/SM sample/DRSMZGJ sampler/M samurai/SM sanatorium/SM sanctification/M sanctify/NGDS sanctimonious/YP sanctimoniousness/M sanctimony/M sanction/GSMD sanctioned/U sanctity/M sanctuary/SM sanctum/SM sand/ZGMDRS sandal/SM sandalwood/M sandbag/SM sandbagged sandbagging sandbank/MS sandbar/SM sandblast/MDRSZG sandblaster/M sandbox/MS sandcastle/SM sander/M sandhog/SM sandiness/M sandlot/SM sandlotter/MS sandman/M sandmen sandpaper/MDGS sandpiper/MS sandpit/S sandstone/SM sandstorm/SM sandwich/MDSG sandy/RTP sane/IYTR saneness/M sang/S sangfroid/M sangria/M sanguinary sanguine/Y sanitarian/SM sanitarium/SM sanitary/IU sanitation/M sanitize/ZGDRS sanity/IM sank sans sanserif sap/SM sapience/M sapient sapless sapling/MS sapped sapper/S sapphire/SM sappiness/M sapping sappy/PRT saprophyte/MS saprophytic sapsucker/SM sapwood/M saran/M sarcasm/MS sarcastic sarcastically sarcoma/MS sarcophagi sarcophagus/M sardine/MS sardonic sardonically sarge/MS sari/MS sarky sarnie/S sarong/SM sarsaparilla/SM sartorial/Y sash/MS sashay/SGMD sass/GMDS sassafras/MS sassy/RT sat satanic satanical/Y satanism/M satanist/MS satay satchel/MS sate/GDS sateen/M satellite/DSMG satiable/I satiate/GNDS satiation/M satiety/M satin/MS satinwood/SM satiny satire/SM satiric satirical/Y satirist/SM satirize/DSG satisfaction/EM satisfactions satisfactorily/U satisfactory/U satisfiable/U satisfied/U satisfy/EDSG satisfying/U satisfyingly satori/M satrap/SM satsuma/S saturate/DSGN saturated/UC saturation/M saturnalia saturnine satyr/MS satyriasis/M satyric sauce/MZGDRS saucepan/SM saucer/M saucily sauciness/M saucy/RPT sauerkraut/M sauna/MDSG saunter/MDGS saurian sauropod/SM sausage/MS saute/MS sauteed sauteing savage/DRSMYTGP savageness/M savagery/SM savanna/MS savant/SM save/BJMZGDRS saved/U saveloy saver/M saving/M savings/M savior/SM savor/MDSG savoriness/M savory/PTRSM savoy/MS savvy/DRSMTG saw/SGMD sawbones/M sawbuck/MS sawdust/M sawfly/SM sawhorse/SM sawmill/MS sawtooth sawyer/SM sax/MS saxifrage/SM saxophone/MS saxophonist/MS say's say/USG saying/SM scab/MS scabbard/MS scabbed scabbiness/M scabbing scabby/PTR scabies/M scabrous scad/MS scaffold/SMG scaffolding/M scag/S scagged scagging scalability scalable scalar/S scalawag/MS scald/MDSG scale's scale/ACSDG scaled/U scaleless scalene scaliness/M scallion/MS scallop/GSMD scalp/MDRSZG scalpel/SM scalper/M scaly/RTP scam/MS scammed scamming scamp/MRSZ scamper/GMD scampi/M scan's scan/AS scandal/SM scandalize/GDS scandalmonger/SM scandalous/Y scandium/M scanned/A scanner/SM scanning/A scansion/M scant/CDSTG scanter scantily scantiness/M scantly scantness/M scanty/RSPT scape scapegoat/SMDG scapegrace/SM scapula/M scapulae scapular/SM scar/GMDS scarab/SM scarce/RYTP scarceness/M scarcity/SM scare/MS scarecrow/MS scaremonger/MSG scarf/MDSG scarification/M scarify/DSGN scarily scariness/M scarlatina/M scarlet/M scarp/MDRSZG scarper/DG scarred scarring scarves scary/RTP scat/MS scathe/DG scathed/U scathing/Y scatological scatology/M scatted scatter/ZGJSMDR scatterbrain/MDS scattering/M scatting scatty scavenge/ZGDRS scavenger/M scenario/MS scenarist/MS scene/MS scenery/M scenic scenically scent/CMS scented/U scenting scentless scepter/MDS sceptically sch schadenfreude schedule's schedule/ADSG scheduled/U scheduler/S schema schemata schematic/SM schematically schematize/GDS scheme/DRSMZG schemer/M scherzo/MS schilling/MS schism/SM schismatic/SM schist/M schizo/SM schizoid/MS schizophrenia/M schizophrenic/MS schizophrenically schlemiel/SM schlep/SM schlepped schlepping schlock/M schlocky/RT schmaltz/M schmaltzy/RT schmo/M schmoes schmooze/DRSZG schmuck/MS schnapps/M schnauzer/SM schnitzel/SM schnook/MS schnoz/MS schnozzle/SM scholar/MYS scholarship/MS scholastic scholastically scholasticism school/SGMD schoolbag/MS schoolbook/SM schoolboy/MS schoolchild/M schoolchildren schooldays schooled/U schoolfellow/MS schoolfriend schoolgirl/SM schoolhouse/MS schooling/M schoolkid/S schoolmarm/SM schoolmarmish schoolmaster/SM schoolmate/SM schoolmistress/MS schoolroom/SM schoolteacher/SM schoolwork/M schoolyard/SM schooner/SM schuss/GMDS schussboomer/SM schwa/MS sci sciatic sciatica/M science/FMS scientific/U scientifically/U scientist/SM scimitar/SM scintilla/MS scintillate/XDSGN scintillation/M scintillator/S scion/MS scissor/GDS scleroses sclerosis/M sclerotic scoff/MDRSZG scoffer/M scofflaw/MS scold/MDRSGJ scolding/M scoliosis/M sconce/SM scone/MS scoop/MDRSG scoopful/MS scoot/DRSZG scooter/M scope/MGDS scorbutic scorch/MDRSZG scorcher/M score/MZGDRS scoreboard/SM scorecard/MS scorekeeper/MS scoreless scoreline/S scorer/M scorn/MDRSZG scorner/M scornful/Y scorpion/MS scotch/MDSG scotchs scoundrel/MS scour/DRSZG scourer/M scourge/DSMG scout/MDRSZG scouting/M scoutmaster/SM scow/MS scowl/MDSG scrabble/MZGDRS scrabbler/M scrag/MS scraggly/RT scraggy/TR scram/S scramble's scramble/UGDS scrambler/MS scrammed scramming scrap/MDRSZGJ scrapbook/SM scrape/SM scraper/M scrapheap/SM scrapie scrapped scrapper/MS scrapping scrappy/TR scrapyard/SM scratch/GJMDS scratchcard/S scratched/U scratchily scratchiness/M scratchpad/S scratchy/RPT scrawl/SMDG scrawly/TR scrawniness/M scrawny/PTR scream/SMDRZG screamer/M screaming/Y scree/MDS screech/GMDS screechy/TR screed/S screen/SJMDG screening/M screenplay/SM screenwriter/MS screenwriting/M screw's screw/UDSG screwball/MS screwdriver/SM screwiness/M screwworm/SM screwy/PRT scribal scribble/JMZGDRS scribbler/M scribe's scribe/IKCGSD scrim/MS scrimmage/MGDS scrimp/SDG scrimshaw/MDGS scrip/MS script/FSMDG scripted/U scriptorium scriptural scripture/MS scriptwriter/MS scriptwriting scrivener/SM scrod/M scrofula/M scrofulous scrog/S scrogged scrogging scroll/GSBMD scrooge/MS scrota scrotal scrotum/M scrounge/DRSZG scrounger/M scroungy/TR scrub/MS scrubbed scrubber/SM scrubbing scrubby/RT scruff/SM scruffily scruffiness/M scruffy/RPT scrum/S scrumhalf scrumhalves scrummage/GS scrummed scrumming scrump/SGD scrumptious/Y scrumpy scrunch/MDSG scrunchy/SM scruple/MGDS scrupulosity/M scrupulous/UYP scrupulousness/UM scrutineer/S scrutinize/DSG scrutiny/SM scuba/MDSG scud/MS scudded scudding scuff/MDSG scuffle/MGDS scull/MDRSZG sculler/M scullery/SM scullion/SM sculpt/SGD sculptor/SM sculptress/MS sculptural sculpture/DSMG scum/MS scumbag/MS scummed scumming scummy/TR scupper/MDGS scurf/M scurfy/TR scurrility/M scurrilous/YP scurrilousness/M scurry/GDSMJ scurvily scurvy/TRM scutcheon/SM scuttle/MGDS scuttlebutt/M scuzzy/TR scythe/DSMG sea/SM seabed/SM seabird/MS seaboard/SM seaborne seacoast/SM seafarer/SM seafaring/M seafloor/SM seafood/M seafront/SM seagoing seagull/MS seahorse/MS seal's seal/AUSDG sealant/MS sealer/SM sealskin/M seam/GMDNS seamail seaman/M seamanship/M seamless/Y seamstress/MS seamy/RT seance/SM seaplane/SM seaport/MS sear/GMDS search/AZGMDRS searcher/AM searching/Y searchlight/SM searing/Y seascape/SM seashell/SM seashore/SM seasick/P seasickness/M seaside/MS season/SGMDBJ seasonable/U seasonably/U seasonal/Y seasonality seasoned/U seasoning/M seat's seat/UGDS seated/A seating/M seatmate/SM seawall/MS seaward/MS seawater/M seaway/SM seaweed/MS seaworthiness/M seaworthy/TRP sebaceous seborrhea/M sebum sec'y sec/SM secant/SM secateurs secede/DSG secession/MS secessionist/MS seclude/GDS seclusion/M seclusive second/SLZGMDRY secondarily secondary/SM seconder/M secondhand secondment/S secrecy/M secret/STGVMDRY secretarial secretariat/MS secretary/SM secretaryship/M secrete/XNS secretion/M secretive/YP secretiveness/M secretory sect/IMS sectarian/MS sectarianism/M sectary/SM section/AESM sectional/MS sectionalism/M sectioned sectioning sector/ESM sectoral sectored secular secularism/M secularist/SM secularization/M secularize/DSG secure/DRSYTG secured/U security/ISM secy sedan/MS sedate/DRSYTGNVP sedateness/M sedation/M sedative/SM sedentary sedge/MS sedgy/RT sediment/MS sedimentary sedimentation/M sedition/M seditious seduce/DRSZG seducer/M seduction/SM seductive/PY seductiveness/M seductress/MS sedulous/Y see/RSMZ seed's seed/AGDS seedbed/MS seedcase/MS seeded/U seeder/SM seediness/M seedless seedling/MS seedpod/MS seedy/RPT seeing/S seek/ZGRS seeker/M seem/GDS seeming/Y seemliness/UM seemly/URTP seen seep/GDS seepage/M seer/M seersucker/M seesaw/SMDG seethe/DSG segfault/S segment/GSMD segmental segmentation/M segmented/U segregate/CDSGN segregated/U segregation/CM segregationist/SM segue/MDS segueing seigneur/SM seignior/SM seine/MZGDRS seiner/M seismic seismically seismogram seismograph/ZMR seismographer/M seismographic seismographs seismography/M seismologic seismological seismologist/SM seismology/M seismometer/S seize/GDS seizure/MS seldom select/CSGDV selectable selected/UA selection/SM selective/Y selectivity/M selectman/M selectmen selectness/M selector/MS selenium/M selenographer/MS selenography/M selenology self/M selfish/UYP selfishness/UM selfless/YP selflessness/M selfsame sell's sell/AZGRS seller's sellotape/DSG sellout/MS seltzer/MS selvage/MS selves semantic/S semantically semanticist/SM semantics/M semaphore/DSMG semblance/ASM semen/M semester/SM semi/MS semiannual/Y semiarid semiautomatic/MS semibreve/S semicircle/SM semicircular semicolon/MS semiconducting semiconductor/SM semiconscious semidarkness/M semidetached semifinal/SM semifinalist/SM semigloss/S semimonthly/SM seminal seminar/MS seminarian/SM seminary/SM semiofficial semiotic/S semioticians semiotics/M semipermeable semiprecious semiprivate semipro/S semiprofessional/MS semiquaver/S semiretired semiskilled semisolid semisweet semitone/SM semitrailer/SM semitransparent semitropical semivowel/SM semiweekly/SM semiyearly semolina/M sempiternal sempstress/MS senate/SM senator/MS senatorial send/ZGRS sender/M sendoff/MS senescence/M senescent senile senility/M senior/SM seniority/M senna/M senor/MS senora/SM senorita/SM sensation/MS sensational/Y sensationalism/M sensationalist/MS sensationalistic sensationalize/GDS sense/MGDS senseless/PY senselessness/M sensibilities sensibility/IM sensible/PRT sensibleness/M sensibly/I sensitive/SPMY sensitiveness/M sensitivities sensitivity/IM sensitization/CM sensitize/CDSG sensitizers sensor/SM sensory sensual/FY sensualist/MS sensuality/M sensuous/YP sensuousness/M sent/FAU sentence/MGDS sentential sententious/Y sentience/IM sentient/I sentiment/SM sentimental/Y sentimentalism/M sentimentalist/MS sentimentality/M sentimentalization/M sentimentalize/GDS sentinel/MS sentry/SM sepal/MS separability/IM separable separably/I separate/PXMYGNVDS separateness/M separation/M separatism/M separatist/MS separator/MS sepia/M sepsis/M septa septet/SM septic septicemia/M septicemic septuagenarian/MS septum/M sepulcher/GMDS sepulchral seq sequel/SM sequence/MZGDRS sequencing/M sequent/F sequential/FY sequester/GSD sequestrate/XDSGN sequestration/M sequin/SMD sequoia/MS seraglio/MS serape/SM seraph/M seraphic seraphically seraphim's seraphs sere/TR serenade/MGDRS serendipitous/Y serendipity/M serene/RPYT sereneness/M serenity/M serf/MS serfdom/M serge/M sergeant/MS serial/SMY serialization/MS serialize/GDS series/M serif/MDS serigraph/M serigraphs serious/PY seriousness/M sermon/SM sermonize/GDS serology/M serotonin serous serpent/MS serpentine/M serrate/XND serration/M serried serum/MS servant/MS serve's/AF serve/FACGDS server/SM servery/S service/EMS serviceability/M serviceable/U serviced/U serviceman/M servicemen servicewoman/M servicewomen servicing serviette/MS servile/Y servility/M serving's servings servitor/MS servitude/M servo/MS servomechanism/SM servomotor/MS sesame/SM sesquicentennial/MS sessile session/MS set/AISM setback/MS setscrew/SM setsquare/S sett/BJZGRS settable/A settee/MS setter/M setting/M settle's settle/AUGDS settlement/AM settlements settler/SM setup/MS seven/MHS sevenfold sevenpence seventeen/SMH seventeenth/M seventeenths seventh/M sevenths seventieth/M seventieths seventy/SMH sever/ETGDS several/MY severance/SM severe/YPR severeness/M severity/M sew/ASGD sewage/M sewer/MS sewerage/M sewing/M sewn sex/GMDS sexagenarian/SM sexily sexiness/M sexism/M sexist/MS sexless sexologist/MS sexology/M sexpot/MS sextant/SM sextet/MS sexton/MS sextuplet/SM sexual/Y sexuality/SM sexy/PTR sf sh shabbily shabbiness/M shabby/PTR shack/MDSG shackle's shackle/UGDS shad/GMDSJ shade/MS shaded/U shadeless shadily shadiness/M shading/M shadow/SGMD shadowbox/GDS shadowless shadowy/RT shady/RPT shaft/MDSG shag/MS shagged shagginess/M shagging shaggy/TPR shah/M shahs shaikh shaikhs shakable/U shake/MZGRSB shakeable shakedown/SM shaken/U shakeout/MS shaker/M shakeup/MS shakily shakiness/M shaky/RPT shale/M shall shallot/MS shallow/TPMRYS shallowness/M shalom shalt sham/GMDS shaman/SM shamanic shamanism shamanistic shamble/MGDS shambles/M shambolic shame/MS shamefaced/Y shameful/YP shamefulness/M shameless/YP shamelessness/M shammed shamming shampoo/ZGMDRS shampooer/M shamrock/MS shan't shandy/S shanghai/DSG shank/MS shantung/M shanty/SM shantytown/SM shape's shape/AGDS shaped/U shapeless/PY shapelessness/M shapeliness/M shapely/PTR sharable/U shard/MS share/MZGDRSB shareable sharecrop/S sharecropped sharecropper/MS sharecropping shared/U shareholder/MS shareholding/S sharer/M shareware/MS sharia/M shariah shark/MDSG sharkskin/M sharp/MDNRYSPXZTG sharpen/ADGS sharpener/MS sharper/M sharpie/MS sharpish sharpness/M sharpshooter/SM sharpshooting/M shat shatter/GMDS shattering/Y shatterproof shave/MZGDRSJ shaven/U shaver/M shaving/M shawl/MS shay/MS she'd she'll she/DSM sheaf/M shear/MDRSZG shearer/M sheath/JM sheathe/UGDS sheathing/M sheaths sheave/SM shebang/MS shebeen/S shed/MS shedding sheen/M sheeny/TR sheep/M sheepdog/MS sheepfold/SM sheepherder/SM sheepish/YP sheepishness/M sheepskin/MS sheer/MDRSPTG sheerness/M sheet/MDSG sheeting/M sheetlike sheik/MS sheikdom/MS sheila/S shekel/SM shelf/M shell/MDRSG shellac/MS shellacked shellacking/SM shellfire/M shellfish/MS shelter/GMDS shelve/GDS shelving/M shenanigan/SM shepherd/SMDG shepherdess/MS sherbet/SM sheriff/SM sherry/SM shew/GDS shewn shh shiatsu/M shibboleth/M shibboleths shield/MDGS shielded/U shift/ZGMDRS shiftily shiftiness/M shiftless/PY shiftlessness/M shifty/RPT shill/GMDSJ shillelagh/M shillelaghs shilling/M shim/MS shimmed shimmer/SMDG shimmery shimming shimmy/DSMG shin/ZGMDRS shinbone/SM shindig/SM shine/MS shiner/M shingle/DSMG shinguard/M shininess/M shinned shinning shinny/DSG shinsplints/M shiny/TRP ship's ship/ALS shipboard/MS shipborne shipbuilder/MS shipbuilding/M shipload/SM shipmate/SM shipment/AM shipments shipowner/MS shippable shipped/A shipper/SM shipping/M shipshape shipwreck/GMDS shipwright/MS shipyard/SM shire/MS shirk/ZGDRS shirker/M shirr/GMDSJ shirring/M shirt/GMDS shirtfront/SM shirting/M shirtless shirtsleeve/MS shirttail/SM shirtwaist/SM shirty shit's shit/S! shitfaced/! shithead/S! shitload/! shitted/! shitting/! shitty/TR! shiv/ZMRS shiver/MDG shivering/Y shivery shoal/GMDS shoat/MS shock/ZGMDRS shocker/M shocking/Y shockproof shod/U shoddily shoddiness/M shoddy/PRMT shoe/MS shoebox shoehorn/GMDS shoeing shoelace/MS shoeless shoemaker/SM shoeshine/SM shoestring/MS shoetree/MS shogun/MS shogunate/M shone shoo/GDS shook shoot/ZGMRSJ shooter/M shooting/M shootout/MS shop/MS shopaholic/S shopfitter/S shopfitting shopfront/S shopkeeper/MS shopkeeping shoplift/DRZGS shoplifter/M shoplifting/M shoppe/MZGDRS shopper/M shopping/M shoptalk/M shopworn shore/MGDS shorebird/SM shoreline/MS shoreward shoring/M short/XTGMDNRYSP shortage/MS shortbread/M shortcake/MS shortchange/GDS shortcoming/MS shortcrust shortcut/MS shorten/JGD shortening/M shortfall/MS shorthand/MDS shorthorn/MS shortish shortlist/DSG shortness/M shortsighted/PY shortsightedness/M shortstop/MS shortwave/MS shorty/SM shot/MS shotgun/SM shotgunned shotgunning should shoulder/MDGS shouldn't shout/ZGMDRS shouter/M shove/MGDS shovel/MDRSG shovelful/SM show/JZGMDRS showbiz/M showboat/MDGS showcase/MGDS showdown/MS shower/MDG showerproof showery/TR showgirl/MS showground/S showily showiness/M showing/M showjumping showman/M showmanship/M showmen shown showoff/SM showpiece/SM showplace/SM showroom/MS showstopper/SM showstopping showtime showy/TRP shpt shrank shrapnel/M shred/MS shredded shredder/MS shredding shrew/MS shrewd/RYPT shrewdness/M shrewish shriek/MDRSZG shrift/M shrike/MS shrill/DRSPTG shrillness/M shrilly shrimp/MDRSZG shrine/MS shrink/MSBG shrinkage/M shrinking/Y shrive/GDS shrivel/SGD shriven shroud/GMDS shrub/MS shrubbery/SM shrubby/RT shrug/MS shrugged shrugging shrunk/N shtick/MS shuck/GMDS shucks/S shudder/MDSG shuffle/AMGDS shuffleboard/SM shuffler/SM shun/S shunned shunning shunt/MSDG shush/DSG shut/S shutdown/SM shuteye/M shutoff/SM shutout/SM shutter/SMDG shutterbug/MS shutting shuttle/DSMG shuttlecock/MDGS shy/TGDRSMY shyer shyest shyness/M shyster/SM sibilance sibilancy sibilant/SM sibling/SM sibyl/MS sibylline sic/S sick/PXTGDNRYS sickbay/S sickbed/SM sicken/DG sickening/Y sickie/MS sickish sickle/MS sickly/RT sickness/MS sicko/MS sickout/SM sickroom/MS side's side/AGDS sidearm/SM sideband/S sidebar/SM sideboard/SM sideburns/M sidecar/SM sidekick/SM sidelight/MS sideline/DSMG sidelong sideman/M sidemen sidepiece/MS sidereal sidesaddle/MS sideshow/MS sidesplitting sidestep/MS sidestepped sidestepping sidestroke/DSMG sideswipe/DSMG sidetrack/SMDG sidewalk/MS sidewall/MS sidewards sideways sidewinder/MS siding/MS sidle/MGDS siege/MS sienna/M sierra/MS siesta/MS sieve/MGDS sift/ZGDRS sifted/U sifter/M sigh/GMD sighs sight/GMDYSJ sighted/P sighting/M sightless/Y sightly/UTR sightread sightseeing/M sightseer/MS sigma/MS sigmoid sign's sign/AFCGDS signage/M signal/MDRYSZG signaler/M signalization/M signalize/GDS signalman/M signalmen signatory/SM signature/MS signboard/MS signed/U signer/CMS signet/MS significance/IM significances significant/IY signification/M signify/XNDRSG signing's/C signings signor/FMS signora/SM signore signori signorina/MS signorine signpost/GSMD silage/M silence/DRSMZG silencer/M silent/MRYST silhouette/DSMG silica/M silicate/MS siliceous silicon/SM silicone/M silicosis/M silk/MNS silkily silkiness/M silkscreen/SM silkworm/MS silky/TRP sill/MS silliness/M silly/TRSMP silo/MS silt/GMDS siltstone silty/TR silver/GMDS silverfish/MS silversmith/M silversmiths silverware/M silvery/RT simian/MS similar/Y similarity/ESM simile/MS similitude/EM simmer/GMDS simonize/DSG simony/M simpatico simper/GMDS simpering/Y simple/TRP simpleminded simpleness/M simpleton/SM simplex/S simplicity/SM simplification/M simplified/U simplify/XDRSNG simplistic simplistically simply simulacra simulacrum/S simulate/EDSGN simulation/EM simulations simulator/EMS simulcast/GMDS simultaneity/M simultaneous/Y sin/ASM since sincere/IYT sincerer sincerity/IM sine/MS sinecure/MS sinecurist sinew/MS sinewy sinful/PY sinfulness/M sing/BZGMDRYS singalong/S singe/MS singeing singer/M singing/M single/PMGDS singleness/M singles/M singlet/S singleton/SM singletree/SM singsong/SMDG singular/SMY singularity/SM singularization sinister/Y sinistral sink/BZGMRS sinkable/U sinker/M sinkhole/SM sinless sinned sinner/MS sinning sinology sinuosity/M sinuous/Y sinus/MS sinusitis/M sinusoid sinusoidal/Y sip/SM siphon/GMDS sipped sipper/SM sipping sir/SXMN sire/CMGDS siren/M sirloin/SM sirocco/SM sirrah sirree/M sis/MS sisal/M sissified sissy/RSMT sister/ASM sisterhood/MS sisterliness/M sisterly/P sit/ASG sitar/SM sitarist/MS sitcom/SM site/MJDS sitter/SM sitting/SM situate/DSXGN situation/M situational situationist six/MSH sixfold sixpence/MS sixpenny sixshooter/M sixteen/SMH sixteenth/M sixteenths sixth/MY sixths sixtieth/M sixtieths sixty/SMH size/MGBDRS sizing/M sizzle/DRSMZG ska/M skate/MZGDRS skateboard/ZGSMDR skateboarder/M skateboarding/M skater/M skating/M skedaddle/MGDS skeet/ZMR skein/MS skeletal skeleton/SM skeptic/SM skeptical/Y skepticism/M skerries sketch/MDRSZG sketchbook/S sketcher/M sketchily sketchiness/M sketchpad/S sketchy/RTP skew/MDRZGPS skewbald/S skewer/MDG ski/SZGMDR skibob/S skid/MS skidded skidding skidpan/S skier/M skiff/SM skiffle skiing/M skilfully skill's skill/CSD skilled/U skillet/SM skillful/UY skillfulness/M skim/MS skimmed skimmer/SM skimming skimp/SDG skimpily skimpiness/M skimpy/RTP skin/MS skincare/M skinflint/MS skinful skinhead/MS skinless skinned skinner/S skinniness/M skinning skinny/RMTP skint skintight skip/MS skipped skipper/SMDG skipping skirmish/ZGMDRS skirt/SMDG skit/MS skitter/GSD skittish/YP skittishness/M skittle/S skive/DRSZG skivvy/DSMG skoal/SM skua/S skulduggery/M skulk/SDRZG skulker/M skull/SM skullcap/MS skunk/SMDG sky/GSM skycap/SM skydive/DRSZG skydiver/M skydiving/M skyjack/JZGSDR skyjacker/M skyjacking/M skylark/SGMD skylight/MS skyline/SM skyrocket/GSMD skyscraper/SM skyward/S skywriter/SM skywriting/M slab/MS slabbed slabbing slack/PXZTGMDNRYS slacken/DG slacker/M slackness/M slacks/M slag/MS slagged slagging slagheap/S slain slake/GDS slalom/MSDG slam/MS slammed slammer/SM slamming slander/MZGDRS slanderer/M slanderous slang/MG slangy/RT slant/MSDG slanting/Y slantwise slap/MS slapdash slaphappy/RT slapped slapper/S slapping slapstick/M slash/MDRSZG slasher/M slat/MDGS slate/SM slather/SDG slatted slattern/SMY slaughter/MDRJZGS slaughterer/M slaughterhouse/SM slave/DRSMZG slaveholder/MS slaver/MDG slavery/M slavish/PY slavishness/M slaw/M slay/DRZGJS slayer/M slaying/M sleaze/SM sleazebag/S sleazeball/S sleazily sleaziness/M sleazy/PRT sled/MS sledded sledder/SM sledding sledge/DSMG sledgehammer/SMDG sleek/SDRYTGP sleekness/M sleep/SMRZG sleeper/M sleepily sleepiness/M sleepless/PY sleeplessness/M sleepover/SM sleepwalk/ZGSDR sleepwalker/M sleepwalking/M sleepwear/M sleepy/RPT sleepyhead/MS sleet/SMDG sleety/RT sleeve/DSM sleeveless sleigh/MDG sleighs sleight/SM slender/PRYT slenderize/DSG slenderness/M slept sleuth/MG sleuths slew/MDGS slice/DRSMZG sliced/U slicer/M slick/SMDRYZTGP slicker/M slickness/M slid slide/RSMZG slider/M slight/SMDRYTGP slighting/Y slightness/M slim/PS slime/SM sliminess/M slimline slimmed slimmer/S slimmest slimming/M slimness/M slimy/RTP sling/SMG slingback/S slingshot/SM slink/SG slinky/RT slip/MS slipcase/MS slipcover/MS slipknot/MS slippage/MS slipped slipper/SM slipperiness/M slippery/PRT slipping slippy slipshod slipstream/MS slipway/SM slit/MS slither/SGMD slithery slitted slitter slitting sliver/GSMD slob/MS slobbed slobber/MDSG slobbery slobbing sloe/MS slog/MS slogan/SM sloganeering slogged slogging sloop/SM slop/MDGS slope/SM slopped sloppily sloppiness/M slopping sloppy/PTR slops/M slosh/DSG slot/MS sloth/M slothful/PY slothfulness/M sloths slotted slotting slouch/ZGMDRS sloucher/M slouchy/TR slough/GMD sloughs sloven/SMY slovenliness/M slovenly/TPR slow/DRYTGSP slowcoach/S slowdown/SM slowish slowness/M slowpoke/SM sludge/M sludgy/RT slue/MGDS slug/MS sluggard/MS slugged slugger/SM slugging sluggish/YP sluggishness/M sluice/DSMG slum/MS slumber/GSMD slumberous slumlord/MS slummed slummer slumming slummy/RT slump/SMDG slung slunk slur/MS slurp/SMDG slurred slurring slurry/M slush/M slushiness/M slushy/RPT slut/MS sluttish slutty/RT sly/TRY slyness/M smack/SMDRZG smacker/M small/SMRTP smallholder/S smallholding/S smallish smallness/M smallpox/M smalltalk smarmy/RT smart/SMDNRYXTGP smarten/DG smartness/M smarts/M smarty/SM smartypants/M smash/MDRSZG smasher/M smashup/SM smattering/MS smear/SMDG smeary/RT smegma smell/SMDGB smelliness/M smelly/RPT smelt/SMDRZG smelter/M smidgen/MS smilax/M smile/DRSMG smiley/SM smiling/UY smirch/GMDS smirk/SMDG smite/SG smith/M smithereens/M smiths smithy/SM smitten smock/SMDG smocking/M smog/MS smoggy/RT smoke/DRSMZG smokehouse/MS smokeless smoker/M smokescreen/MS smokestack/SM smokey smokiness/M smoking/M smoky/RTP smolder/SGMD smooch/MDSG smoochy smooth/PDRYTG smoothie/MS smoothness/M smooths smorgasbord/SM smote smother/GSMD smudge/DSMG smudgy/TR smug/YP smugger smuggest smuggle/ZGDRS smuggler/M smuggling/M smugness/M smurf/S smut/MS smuttiness/M smutty/TRP snack/SMDG snaffle/DSMG snafu/SM snag/MS snagged snagging snail/SMDG snake/DSMG snakebite/MS snakelike snakeskin snaky/RT snap's snap/US snapdragon/SM snapped/U snapper/MS snappily snappiness/M snapping/U snappish/YP snappishness/M snappy/TRP snapshot/SM snare/DSMG snarf/SDG snark/S snarl's snarl/USDG snarling/Y snarly/TR snatch/ZGMDRS snatcher/M snazzily snazzy/TR sneak/SMDRZG sneaker/M sneakily sneakiness/M sneaking/Y sneaky/TRP sneer/SJMDG sneering/Y sneeze/DSMG snick/SDRZG snicker/MDG snide/RYT sniff/SMDRZG sniffer/M sniffle/DSMG sniffy/RT snifter/SM snip/MDRZGS snipe/SM sniper/M snipped snippet/SM snipping snippy/RT snips/M snit/MS snitch/MDSG snivel/SMDRZG sniveler/M snob/MS snobbery/M snobbish/PY snobbishness/M snobby/RT snog/S snogged snogging snood/SM snooker/MDSG snoop/SMDRZG snooper/M snoopy/TR snoot/SM snootily snootiness/M snooty/PTR snooze/DSMG snore/DRSMZG snorer/M snorkel/ZGMDRS snorkeler/M snorkeling/M snort/SMDRZG snorter/M snot/MS snottily snottiness/M snotty/TPR snout/SM snow/MDGS snowball/GSMD snowbank/SM snowbird/SM snowboard/MDRSZG snowboarder/M snowboarding/M snowbound snowdrift/SM snowdrop/SM snowfall/SM snowfield/SM snowflake/SM snowiness/M snowline snowman/M snowmen snowmobile/DSMG snowplough snowploughs snowplow/SGMD snowshed snowshoe/SM snowshoeing snowstorm/SM snowsuit/SM snowy/PRT snub/MS snubbed snubbing snuff/SMDRYZG snuffbox/MS snuffer/M snuffle/MGDS snuffly/RT snug/MYSP snugged snugger snuggest snugging snuggle/MGDS snugness/M so/M soak/MDGSJ soaking/M soap/MDGS soapbox/MS soapiness/M soapstone/M soapsuds/M soapy/RPT soar/MDGS soaring/Y sob/SM sobbed sobbing/Y sober/SDRYPTG soberness/M sobriety/IM sobriquet/SM soc soccer/M sociability/M sociable/SM sociably social/SMY socialism/M socialist/SM socialistic socialite/SM socialization/M socialize/DSG societal society/SM sociobiology sociocultural socioeconomic socioeconomically sociolinguistic/S sociolinguists sociological/Y sociologist/MS sociology/M sociopath/M sociopaths sociopolitical sock/MDGS socket/SM sockeye/SM sod/SM soda/MS sodded sodden/Y sodding sodium/M sodomite/MS sodomize/GDS sodomy/M soever sofa/MS soft/NRYXTP softback softball/MS softbound softcover soften/DRZG softener/M softhearted softness/M software/M softwood/SM softy/SM soggily sogginess/M soggy/RTP soigne soil/MDGS soiled/U soiree/SM sojourn/ZGMDRS sojourner/M sol/SM solace/DSMG solar solaria solarium/M sold/UR solder/ZGSMDR solderer/M soldier/MDYSG soldiery/M sole/FSDGM solecism/SM solely solemn/PTRY solemness/M solemnify/GDS solemnity/SM solemnization/M solemnize/DSG solemnness/M solenoid/MS solenoidal solicit/GDS solicitation/SM solicited/U solicitor/SM solicitous/YP solicitousness/M solicitude/M solid/PSMRYT solidarity/M solidi solidification/M solidify/DSNG solidity/M solidness/M solidus/M soliloquies soliloquize/GDS soliloquy/M solipsism/MS solipsist/S solipsistic solitaire/MS solitariness/M solitary/SMP solitude/SM solo/MDGS soloist/MS solstice/MS solubility/IM soluble/MS solute's solute/XN solutes solution's/EA solvable/IU solve/ARZBGSD solved/U solvency/IM solvent/IMS solver's somatic somber/PY somberness/M sombrero/MS some somebody/SM someday somehow someone/MS someplace somersault/MDSG somerset/SM somersetted somersetting something/SM sometime/S someway/S somewhat/S somewhere somnambulism/M somnambulist/SM somnolence/M somnolent son/SM sonar/SM sonata/SM sonatina/SM song/MS songbird/SM songbook/SM songfest/SM songster/MS songstress/MS songwriter/MS songwriting sonic sonically sonnet/SM sonny/SM sonogram/SM sonority/SM sonorous/PY sonorousness/M sonsofbitches soon/RT soonish soot/M sooth/MDRSZG soothe soother/M soothing/Y soothsayer/SM soothsaying/M sooty/RT sop/SM sophism/M sophist/MS sophistic sophistical sophisticate/DSMGN sophisticated/U sophistication/M sophistry/SM sophomore/MS sophomoric soporific/MS soporifically sopped sopping soppy/RT soprano/MS sorbet/SM sorcerer/MS sorceress/MS sorcery/M sordid/PY sordidness/M sore/MYTRSP sorehead/MS soreness/M sorghum/M sorority/SM sorrel/SM sorrily sorriness/M sorrow/SMDG sorrowful/PY sorrowfulness/M sorry/RTP sort/FASGDM sorta sortable sorted/U sorter/SM sortie/DSM sortieing sot/SM sottish sou'wester sou/SMH souffle/SM sough/MDG soughs sought/U souk/S soul/MDS soulful/YP soulfulness/M soulless/YP sound/JPSMDRYZTG soundbite/S soundboard/SM sounder/M sounding/M soundless/Y soundness/UM soundproof/DGS soundproofing/M soundtrack/SM soup/MDGS soupcon/MS soupy/RT sour/MDRYTGSP source/ADSMG sourceless sourdough/M sourdoughs sourish sourness/M sourpuss/MS sousaphone/MS souse/DSMG south/M southbound southeast/ZMR southeaster/MY southeastern southeastward/S southerly/SM southern/SZMR southerner/M southernmost southpaw/SM southward/MS southwest/MRZ southwester/MY southwestern southwestward/S souvenir/SM sovereign/SM sovereignty/M soviet/SM sow's sow/ASGD sower/SM sown/A soy/M soybean/MS sozzled spa/SM space/DRSMZGJ spacecraft/MS spaceflight/SM spaceman/M spacemen spaceport/SM spacer/M spaceship/SM spacesuit/SM spacewalk/SGMD spacewoman/M spacewomen spacey spacial spacier spaciest spaciness/M spacing/M spacious/PY spaciousness/M spade/DSMG spadeful/MS spadework/M spadices spadix/M spaghetti/M spake spam/S spamblock/S spammed spamming span/MS spandex/M spandrels spangle/DSMG spangly spaniel/SM spank/SMDRGJ spanking/M spanned/U spanner/SM spanning spar/MS spare/DRSMYTGP spareness/M spareribs/M sparing/UY spark/SMDYG sparkle/DRSMZG sparkler/M sparkling/Y sparky/RT sparred sparring sparrow/SM sparrowhawk/S sparse/RYTP sparseness/M sparsity/M spartan spasm/SM spasmodic spasmodically spastic/SM spat/MS spate/SM spathe/SM spatial/Y spatted spatter/SGMD spatting spatula/SM spavin/MD spawn/SMDG spay/DGS speak/SRZGBJ speakable/U speakeasy/SM speaker/M speakerphone/S spear/SMDG spearfish/GMDS spearhead/GMDS spearmint/M spec/MS special/SPMRY specialism/S specialist/MS specialization/MS specialize/GDS specialty/SM specie/SM species/M specif specifiable specifiably specific/PMS specifically specification/M specificity/M specified/UA specify/XNZDRSG specimen/SM specious/YP speciousness/M speck/SMDG speckle/MGDS specs/M spectacle/SM spectacles/M spectacular/SMY spectate/DSG spectator/SM specter/AMS spectra spectral spectrogram spectrograph spectrometer/SM spectrometric spectrometry spectrophotometer spectrophotometry spectroscope/SM spectroscopic spectroscopically spectroscopy/M spectrum/M specular speculate/XDSGNV speculation/M speculative/Y speculator/MS speculum sped speech/MS speechify/DSG speechless/PY speechlessness/M speechwriter/S speed/SMRZG speedboat/SM speeder/M speedily speediness/M speeding/M speedometer/MS speedster/SM speedup/MS speedway/SM speedwell/M speedy/TPR speleological speleologist/MS speleology/M spell/BJSMDRZG spellbind/RZGS spellbinder/M spellbound spellchecker/S spelldown/SM speller/M spelling/M spelunker/MS spelunking/M spend/BSRZG spender/M spending/M spendthrift/MS spent/U sperm/SM spermatozoa spermatozoon/M spermicidal spermicide/SM spew/MDRZGS spewer/M sphagnum/MS sphere/SM spherical/Y spheroid/SM spheroidal sphincter/MS sphinx/MS spic/S spice/DSMG spicily spiciness/M spicule/MS spicy/PRT spider/SM spiderweb/MS spidery/RT spiel/SMDG spiff/SDG spiffy/TR spigot/SM spike/DSMG spikiness/M spiky/RPT spill/SMDRG spillage/MS spillover/SM spillway/MS spin/MS spinach/M spinal/SMY spindle/MGDS spindly/TR spindrift spine/SM spineless/YP spinet/SM spinnaker/SM spinner/MS spinneret/SM spinney/S spinning/M spinster/SM spinsterhood/M spinsterish spiny/RT spiracle/SM spiral/SGMDY spire's spire/IFAS spirea/SM spirit's spirit/ISGD spirited/Y spiritless spiritual/MYS spiritualism/M spiritualist/MS spiritualistic spirituality/M spirituous spirochete/SM spiry/RT spit/MDGS spitball/SM spite/ASM spiteful/PY spitefuller spitefullest spitefulness/M spitfire/SM spitted spitting spittle/M spittoon/MS spiv/S splash/GMDS splashdown/MS splashily splashiness/M splashy/RTP splat/SM splatted splatter/GSMD splatting splay/SMDG splayfeet splayfoot/MD spleen/SM splendid/RYT splendor/MS splendorous splenetic splice/DRSMZG splicer/M spliff/S spline/S splint/SZGMDR splinter/MDG splintery split/SM splittable splitter/S splitting/MS splodge/S splosh/DSG splotch/MDSG splotchy/TR splurge/DSMG splutter/GMDS spoil's spoil/CSDRZG spoilage/M spoiled/U spoiler/CM spoilsport/MS spoke/SM spoken/U spokeshave/S spokesman/M spokesmen spokespeople spokesperson/SM spokeswoman/M spokeswomen spoliation/CM sponge/DRSMZG spongecake/M sponger/M sponginess/M spongy/RPT sponsor/MDGS sponsorship/MS spontaneity/M spontaneous/Y spoof/SMDG spook/SMDG spookiness/M spooky/RPT spool/SMDG spoon/SMDG spoonbill/MS spoonerism/MS spoonful/SM spoor/SMDG sporadic sporadically spore/DSMG sporran/S sport/SMDGV sportiness/M sporting/Y sportive/Y sportscast/MRZGS sportscaster/M sportsman/M sportsmanlike/U sportsmanship/M sportsmen sportspeople sportsperson sportswear/M sportswoman/M sportswomen sportswriter/SM sporty/TPR spot/CMS spotless/PY spotlessness/M spotlight/SGMD spotlit spotted spotter/MS spottily spottiness/M spotting spotty/TPR spousal/MS spouse/SM spout/SMDG sprain/GSMD sprang sprat/SM sprawl/GSMD spray's spray/ASDG sprayer/MS spread/ZGBSMR spreadeagled spreader/M spreadsheet/SM spree/DSM spreeing sprig/SM sprigged sprightliness/M sprightly/RPT spring/GSMR springboard/MS springbok/MS springily springiness/M springlike springtime/M springy/RPT sprinkle/DRSJMZG sprinkler/M sprinkling/M sprint/ZGSMDR sprinter/M sprite/SM spritz/ZGMDRS spritzer/M sprocket/MS sprog/S sprout/GSMD spruce/DRSPMYTG spruceness/M sprung spry/RYT spryness/M spud/MS spume/DSMG spumoni/M spumy/RT spun spunk/SM spunky/TR spur/MS spurge/M spurious/YP spuriousness/M spurn/SDG spurred spurring spurt/SMDG sputa sputnik/MS sputter/MDGS sputum/M spy/GDSM spyglass/MS spyhole spymaster/S sq sqq squab/SM squabble/MZGDRS squabbler/M squad/SM squadron/MS squalid/PTRY squalidness/M squall/SGMD squally/TR squalor/M squamous squander/GDS square/PDRSMYTG squareness/M squarish squash/GMDS squashy/TR squat/SMP squatness/M squatted squatter/MS squattest squatting squaw/SM squawk/SZGMDR squawker/M squeak/SZGMDR squeaker/M squeakily squeakiness/M squeaky/TRP squeal/SZGMDR squealer/M squeamish/PY squeamishness/M squeegee/MDS squeegeeing squeeze/BMZGDRS squeezebox/S squeezer/M squelch/GMDS squelchy/RT squib/SM squid/SM squidgy squiffy squiggle/DSMG squiggly/RT squint/STGMDR squire/DSMG squirm/SGMD squirmy/RT squirrel/SGMD squirt/SGMD squish/GMDS squishy/RT ssh st stab/MYS stabbed stabber/MS stabbing/MS stability/IM stabilizability stabilization/CM stabilize/CDSG stabilizer/MS stable/DRSMTG stableman/M stablemate/S stablemen stably/U staccato/MS stack/SMDRG stadium/MS staff's staff/ASDG staffer/MS staffing/M staffroom stag/MDGSJ stage/SM stagecoach/MS stagecraft/M stagehand/MS stagestruck stagflation/M stagger/MDGS staggering/Y staging/M stagnancy/M stagnant/Y stagnate/DSGN stagnation/M stagy/RT staid/PRYT staidness/M stain/SMDRG stained/U stainless/M stair/SM staircase/MS stairway/MS stairwell/SM stake/DSMG stakeholder/SM stakeout/SM stalactite/MS stalagmite/SM stale/DRSTGP stalemate/DSMG staleness/M stalk/SMDRJZG stalker/M stalking/M stall's stall/ISDG stallholder/S stallion/MS stalwart/MYS stamen/SM stamina/M stammer/ZGMDRS stammerer/M stammering/Y stamp/SMDRJZG stampede/MGDS stamper/M stance/ISM stanch/TGDRS stanchion/SM stand/SMRJZG standalone standard/MS standardization/SM standardize/GDS standby/M standbys standee/MS stander/M standing/M standoff/MS standoffish standout/MS standpipe/SM standpoint/MS standstill/SM stank stanza/SM stapes staph/M staphylococcal staphylococci staphylococcus/M staple/DRSMZG stapler/M star/MDRZGS starboard/M starch/GMDS starchily starchiness/M starchy/PTR stardom/M stardust/M stare/SM starer/M starfish/MS starfruit stargaze/DRSZG stargazer/M stark/RYPZT starkness/M starless starlet/MS starlight/M starling/SM starlit starred starring starry/TR starstruck start/ASMDG starter/MS startle/GDS startling/Y starvation/M starve/DSJG starveling/SM stash/MDSG stasis stat/MS state/DRSMYGNLX statecraft/M stated/U statehood/M statehouse/SM stateless/P statelessness/M stateliness/M stately/PRT statement/AMS statemented statementing stateroom/MS stateside statesman/M statesmanlike statesmanship/M statesmen stateswoman/M stateswomen statewide static/SM statical/Y station/MDRZG stationary stationer/M stationery/M stationmaster/S statistic/MS statistical/Y statistician/MS stator/S statuary/M statue/SM statuesque statuette/MS stature/MS status/MS statute/MS statutorily statutory staunch/PDRSYTG staunchness/M stave/DMG stay/MDRZGS std stdio stead/SM steadfast/YP steadfastness/M steadily/U steadiness/UM steady/TGPDRSM steak/SM steakhouse/SM steal/SMRHG stealth/M stealthily stealthiness/M stealthy/TRP steam/SMDRZG steamboat/MS steamer/M steamfitter/MS steamfitting/M steaminess/M steamroll/ZGDRS steamroller/MDG steamship/MS steamy/TPR steed/SM steel/SMDG steeliness/M steelmaker/S steelwork/RSZ steelworker/M steelworks/M steely/PTR steelyard/SM steep/SMDNRYPXTG steepen/GD steeple/MS steeplechase/MRS steeplejack/MS steepness/M steer/SMDBG steerage/M steering/M steersman/M steersmen stegosauri stegosaurus/MS stein/SM stellar stellated stem/MS stemless stemmed stemming stemware/M stench/MS stencil/GMDS steno/SM stenographer/MS stenographic stenography/M stentorian step/IMS stepbrother/MS stepchild/M stepchildren stepdaughter/MS stepfather/MS stepladder/MS stepmother/SM stepparent/SM steppe/DRSMZG stepper/M steppingstone/MS stepsister/SM stepson/MS stepwise steradians stereo/SM stereographic stereophonic stereoscope/MS stereoscopic stereoscopically stereoscopy stereotype/DSMG stereotypical/Y sterile sterility/M sterilization/MS sterilize/DRSZG sterilized/U sterilizer/M sterling/M stern/SMRYPT sternness/M sternum/MS steroid/MS steroidal stertorous stet/S stethoscope/SM stetson/MS stetted stetting stevedore/SM stew/MDGS steward/GMDS stewardess/MS stewardship/M stick/SMRZG sticker/M stickily stickiness/M sticking/U stickleback/MS stickler/MS stickpin/MS stickup/MS sticky/PTRSM stiff/SMDNRYPXTG stiffen/ZGDR stiffener/M stiffening/M stiffness/M stifle/DSJG stifling/Y stigma/SM stigmata stigmatic stigmatization/M stigmatize/DSG stile/SM stiletto/SM still's still/ITGSD stillbirth/M stillbirths stillborn stiller stillness/M stilt/SMD stilted/Y stimulant/SM stimulate/DSGNV stimulated/U stimulation/M stimulator stimulatory stimuli stimulus/M sting/ZGSMR stinger/M stingily stinginess/M stingray/SM stingy/RTP stink/ZGSMR stinkbug/SM stinker/M stinky/RT stint/GSMD stipend/SM stipendiary/S stipple/DSMG stippling/M stipulate/XDSGN stipulation/M stir/MS stirred/U stirrer/SM stirring/SY stirrup/SM stitch's stitch/ADSG stitchery/M stitching/M stoat/SM stochastic stock's stock/AGSD stockade/DSMG stockbreeder/MS stockbroker/SM stockbroking/M stockholder/SM stockily stockiness/M stockinette/M stocking/SMD stockist/S stockpile/MGDS stockpot/SM stockroom/MS stocktaking/M stocky/RTP stockyard/MS stodge stodgily stodginess/M stodgy/RTP stogy/SM stoic/SM stoical/Y stoicism/M stoke/DRSZG stoker/M stole/SM stolen stolid/RYTP stolidity/M stolidness/M stolon/MS stoma stomach/MDRZG stomachache/SM stomacher/M stomachs stomata stomp/GSMD stone/DSMG stoneless stonemason/MS stonewall/GSD stoneware/M stonewashed stonework/M stonily stoniness/M stonkered stonking stony/TRP stood stooge/MS stool/SM stoop/GSMD stop's stop/US stopcock/SM stopgap/SM stoplight/MS stopoff stopover/MS stoppable/U stoppage/MS stopped/U stopper/GSMD stopping/U stopple/DSMG stopwatch/MS storage/M store's store/ADSG storefront/SM storehouse/SM storekeeper/MS storeroom/SM stork/SM storm/ZGSMDR stormily storminess/M stormtroopers stormy/RPT story/DSM storyboard/SM storybook/SM storyline storyteller/SM storytelling/M stoup/SM stout/TSMRYP stouthearted stoutness/M stove/SM stovepipe/SM stow/DGS stowage/M stowaway/MS straddle/DRSMZG straddler/M strafe/MGDS straggle/DRSZG straggler/M straggly/TR straight/SXTPMNRY straightaway/SM straightedge/SM straighten/ZGDR straightener/M straightforward/SYP straightforwardness/M straightness/M straightway strain's strain/FADSG strainer/ASM strait/MNSX straiten/GD straitjacket/SMDG straitlaced strand/MDSG strange/PRYZT strangeness/M stranger/M strangle/ZGDRS stranglehold/SM strangler/M strangulate/DSGN strangulation/M strap's strap/US strapless/MS strapped/U strapping/M strata stratagem/SM strategic/S strategical/Y strategics/M strategist/MS strategy/SM strati stratification/M stratify/DSGN stratigraphic stratigraphical stratosphere/MS stratospheric stratospherically stratum/M stratus/M straw/GSMD strawberry/SM stray/GSMD streak/MDRSZG streaker/M streaky/TR stream/MDRSZG streamer/M streamline/GDS street/MS streetcar/MS streetlamp/S streetlight/MS streetwalker/MS streetwise strength/M strengthen/AGSD strengthener/MS strengths strenuous/PY strenuousness/M strep/M streptococcal streptococci streptococcus/M streptomycin/M stress/MDSG stressed/U stressful/P stretch/BZGMDRS stretchability stretchable/U stretcher/MDG stretchmarks stretchy/TRP strew/GSDH strewn stria/M striae striated striation/MS stricken strict/RYPT strictness/M stricture/SM stridden stride/MGRS stridency/M strident/Y strife/M strike/MZGRSJ strikebound strikebreaker/MS strikebreaking strikeout/MS striker/M striking/Y string/MDRSZG stringency/M stringent/Y stringer/M stringiness/M stringy/PTR strip/GSMD stripe/MS stripey stripling/MS stripped stripper/MS stripping striptease/MZGDRS stripteaser/M stripy/RT strive/GS striven strobe/MS stroboscope/MS stroboscopic strode stroke/MGDS stroll/MDRSZG stroller/M stromatolites strong/RYT strongbow strongbox/MS stronghold/MS strongish strongman/M strongmen strongroom/S strontium/M strop/SM strophe/SM strophic stropped stroppily stropping stroppy/TRP strove struck structural/Y structuralism structuralist/S structure's structure/AGDS structured/U structureless strudel/SM struggle/MGDS strum/SM strummed strumming strumpet/MS strung/UA strut/SM strutted strutter strutting strychnine/M stub/MS stubbed stubbing stubble/M stubbly/TR stubborn/RYPT stubbornness/M stubby/RT stucco/MDG stuccoes stuck/U stud/MYS studbook/MS studded studding/M student/SM studentship/S studied/U studiedly studier/S studio/MS studious/YP studiousness/M studly/RT study's study/AGDS stuff/GSMDR stuffily stuffiness/M stuffing/M stuffy/RPT stultification/M stultify/DSNG stumble/DRSMZG stumbler/M stumbling/Y stump/GSMD stumpy/TR stun/S stung stunk stunned stunner/S stunning/Y stunt/GSMD stuntman stuntmen stupefaction/M stupefy/DSG stupefying/Y stupendous/Y stupid/TMRYS stupidity/SM stupor/MS sturdily sturdiness/M sturdy/TRP sturgeon/SM stutter/MDRSZG stutterer/M sty/SM style's style/ADSG styli stylish/PY stylishness/M stylist/SM stylistic/S stylistically stylization stylize/DSG stylus/MS stymie/MDS stymieing styptic/SM styrene suasion/EM suave/RYTP suaveness/M suavity/M sub/SM subaltern/MS subaqua subarctic subarea/MS subatomic subbasement/MS subbed subbing subbranch/MS subcategory/SM subclass/S subclauses subcommittee/SM subcompact/SM subconscious/PMY subconsciousness/M subcontinent/SM subcontinental subcontract/MDSG subcontractor/SM subcultural subculture/SM subcutaneous/Y subdivide/GDS subdivision/MS subducted subduction subdue/DSG subdued/U subeditor/S subfamily/SM subfreezing subgroup/MS subharmonic/S subhead/GJMS subheading/M subhuman/MS subj subject/GVMDS subjection/M subjective/Y subjectivity/M subjoin/GDS subjugate/GNDS subjugation/M subjunctive/MS sublayer sublease/MGDS sublet/SM subletting sublieutenant/S sublimate/GNDS sublimation/M sublime/YTGDRS subliminal/Y sublimity/M sublunary submarginal submarine/MZRS submariner/M submerge/GDS submergence/M submerse/GNDS submersible/MS submersion/M submicroscopic submission's submission/AS submissive/PY submissiveness/M submit/AS submittable submitted/A submitter/S submitting/A subnormal suboptimal suborbital suborder/MS subordinate/MGNDS subordination/IM suborn/SGD subornation/M subplot/MS subpoena/GMDS subprofessional/SM subprogram/S subroutine/MS subscribe/AGDS subscribed/U subscriber/SM subscript/MS subscription/SM subsection/MS subsequent/Y subservience/M subservient/Y subset/SM subside/GDS subsidence/M subsidiarity subsidiary/SM subsidization/M subsidize/ZGDRS subsidized/U subsidizer/M subsidy/SM subsist/SDG subsistence/M subsoil/M subsonic subspace/S subspecies/M substance/SM substandard substantial/IY substantiate/XGNDS substantiated/U substantiation/FM substantive/SMY substation/MS substitute/MGNBXDS substituted/U substitution/M substrata substrate/MS substratum/M substructure/SM subsume/DSG subsurface/M subsystem/SM subteen/SM subtenancy/M subtenant/SM subtend/SDG subterfuge/SM subterranean subtext/SM subtitle/DSMG subtle/TR subtlety/SM subtly/U subtopic/SM subtotal/SGMD subtract/GVSD subtraction/SM subtractive/Y subtrahend/SM subtropic/S subtropical subtropics/M subtype/S subunit/S suburb/MS suburban/SM suburbanite/SM suburbanization suburbia/M subvention/SM subversion/M subversive/SPMY subversiveness/M subvert/SDG subway/MS subzero succeed/GDS success/VMS successful/UY succession/MS successive/Y successor/SM succinct/RYTP succinctness/M succor/SGMD succotash/M succubi succubus succulence/M succulency/M succulent/SM succumb/GDS such suchlike suck/MDRZGSB sucker/GMD suckle/DSJG suckling/M sucrose/M suction/SMDG sud/S sudden/PY suddenness/M suds/M sudsy/TR sue/DSG suede/M suet/M suety suffer/DRZGSJ sufferance/M sufferer/M suffering/M suffice/DSG sufficiency/IM sufficient/IY suffix/MDSG suffixation/M suffocate/GNDS suffocating/Y suffocation/M suffragan/MS suffrage/M suffragette/MS suffragist/MS suffuse/DSGN suffusion/M sugar/GSMD sugarcane/M sugarcoat/DGS sugarless sugarplum/MS sugary/RT suggest/ZGVSDR suggestibility/M suggestible suggestion/SM suggestive/PY suggestiveness/M sugillate suicidal/Y suicide/SM suit/BMDGS suitabilities suitability/UM suitable/UP suitableness/M suitably/U suitcase/SM suite/SM suited/U suiting/M suitor/MS sukiyaki/M sulfa/M sulfate/SM sulfide/SM sulfur/MDSG sulfuric sulfurous sulk/MDGS sulkily sulkiness/M sulky/TRSMP sullen/RYPT sullenness/M sullied/U sully/GDS sultan/MS sultana/SM sultanate/MS sultrily sultriness/M sultry/RPT sum/SM sumac/M summability summable summarily summarize/ZGDRS summary/SM summat summation/FMS summed summer/MDSG summerhouse/MS summertime/M summery/RT summing summit/MS summitry/M summon/JDRSZG summoner/M summons/GMDS sumo/M sump/MS sumptuous/PY sumptuousness/M sun/SM sunbath/ZGMDRS sunbathe sunbather/M sunbathing/M sunbaths sunbeam/SM sunbed/S sunbelt sunblock/MS sunbonnet/SM sunburn/SGMD sunburst/MS suncream sundae/MS sundeck/S sunder/DSG sundial/SM sundown/SM sundress/S sundries/M sundry/S sunfish/MS sunflower/MS sung/U sunglasses/M sunhat/S sunk/N sunlamp/SM sunless sunlight/M sunlit sunned sunniness/M sunning sunny/TRP sunrise/SM sunroof/SM sunscreen/MS sunset/MS sunshade/MS sunshine/M sunshiny sunspot/SM sunspots/S sunstroke/M suntan/MS suntanned suntanning suntrap/S sunup/M sup/SZMR super/M superabundance/SM superabundant superannuate/GNDS superannuation/M superb/RYT supercargo/M supercargoes supercharge/ZGDRS supercharger/M supercilious/PY superciliousness/M supercity/SM supercomputer/MS supercomputing superconducting superconductive superconductivity/M superconductor/SM supercooled supercooling superdense superego/MS supererogation/M supererogatory superficial/Y superficiality/M superfine superfix superfluity/SM superfluous/PY superfluousness/M superglue supergrass/S superheat/D superhero/MS superheroes superhighway/MS superhuman superimpose/DSG superimposition/M superintend/SGD superintendence/M superintendency/M superintendent/SM superior/MS superiority/M superlative/MYS superman/M supermarket/MS supermen supermodel/S supermom/MS supernal supernatant supernatural/YS supernova/MS supernovae supernumerary/SM superordinate superpose/GDS superposition/SM superpower/MS supersaturate/GNDS supersaturation/M superscribe/GDS superscript/MS superscription/M supersede/GDS supersonic supersonically superstar/MS superstate/S superstition/SM superstitious/Y superstore/SM superstructure/SM supertanker/SM superuser/S supervene/GDS supervention/M supervise/GNXDS supervised/U supervision/M supervisor/SM supervisory superwoman/M superwomen supine/Y supp/DRZG supper/M suppertime suppl supplant/SDG supple/TLPR supplement/GMDS supplemental supplementary supplementation/M suppleness/M suppliant/SM supplicant/MS supplicate/GDS supplication/M supplier/M supply/ZGXDRSMN support/MDRSBZGV supportability supportable/IU supported/U supporter/M suppose/GDS supposed/Y supposition/SM suppository/SM suppress/GVDS suppressant/MS suppressed/U suppressible suppression/M suppressor/MS suppurate/DSGN suppuration/M supra supranational supremacist/SM supremacy/M supremal supreme/YTR supremo/S supt surcease/DSMG surcharge/DSMG surcingle/SM surd sure/PYTR surefire surefooted sureness/M surety/SM surf/MDRZGS surface's surface/AGDS surfaced/U surfactant/S surfboard/MDGS surfeit/MDSG surfer/M surfing/M surge/DSMG surgeon/MS surgery/SM surgical/Y surlily surliness/M surly/PTR surmise/MGDS surmount/DGSB surmountable/I surname/MS surpass/GDS surpassed/U surplice/MS surplus/MS surplussed surplussing surprise/DSMGJ surprised/U surprising/UY surreal surrealism/M surrealist/SM surrealistic surrealistically surreality surrender/GMDS surreptitious/YP surreptitiousness/M surrey/MS surrogacy/M surrogate/SM surround/GSDJ surrounding/M surroundings/M surtax/MDSG surtitle/S surveillance/M survey's survey/ADGS surveying/M surveyor/SM survivability survivable/U survival/SM survivalist/MS survive/DSGB survivor/SM susceptibility/SM susceptible/I sushi/M suspect/SMDG suspected/U suspend/SDRZG suspender/M suspense/XMN suspenseful suspension/M suspicion/SM suspicious/Y suss/DSG sustain/SDBG sustainability sustainable/U sustainably sustenance/M sutler/MS suttee suture/MGDS suzerain/MS suzerainty/M svelte/TR swab/MS swabbed swabbing swaddle/DSG swag/MS swagged swagger/SMDRG swagging swain/SM swallow/GSMDR swallowtail/MS swam swami/SM swamp/GSMD swampland/MS swampy/RT swan/MS swank/TGSMDR swankily swankiness/M swanky/RPT swanned swanning swansong/S swap/MS swappable/U swapped swapper/S swapping sward/SM swarm/GSMD swarthy/TR swash/GMDS swashbuckler/SM swashbuckling/M swastika/SM swat/MS swatch/MS swath/GMDS swathe/M swaths swatted swatter/SMDG swatting sway/MDGS swayback/MD swayed/U swear/ZGSR swearer/M swearword/MS sweat/ZGSMDR sweatband/MS sweater/M sweatily sweatpants/M sweats/M sweatshirt/MS sweatshop/MS sweatsuit/S sweaty/RT swede/SM sweep/ZGSMRBJ sweeper/M sweeping/MY sweepings/M sweepstakes/M sweet/XTSMNRYP sweetbread/SM sweetbrier/SM sweetcorn sweetened/U sweetener/MS sweetening/M sweetheart/MS sweetie/SM sweetish sweetmeat/MS sweetness/M sweetshop swell/TGSMDRJ swellhead/MDS swelling/M swelter/SGMD swept sweptback swerve/MGDS swift/PTSMRY swiftness/M swig/MS swigged swigging swill/GSMD swim/MS swimmer/SM swimming/MY swimsuit/SM swimwear swindle/DRSMZG swindler/M swine/SM swineherd/SM swing/ZGSMR swingeing swinger/M swinish swipe/DSMG swirl/GSMD swirly/RT swish/TGMDRS swishy switch/MDRSZGB switchback/SM switchblade/MS switchboard/MS switcher/M switchgear switchover swivel/MDGS swiz swizz swizzle/DSG swollen swoon/SGMD swoop/SGMD swoosh/MDSG sword/SM swordfish/MS swordplay/M swordsman/M swordsmanship/M swordsmen swore sworn swot/S swotted swotting swum swung sybarite/SM sybaritic sycamore/MS sycophancy/M sycophant/SM sycophantic sycophantically syllabary syllabic syllabicate/DSGN syllabication/M syllabification/M syllabify/DSNG syllable/MS syllabub/S syllabus/MS syllogism/MS syllogistic sylph/M sylphic sylphlike sylphs sylvan symbiont symbioses symbiosis/M symbiotic symbiotically symbol/MS symbolic symbolical/Y symbolism/M symbolist symbolization/M symbolize/DSG symmetric symmetrical/Y symmetrization symmetrizing symmetry/SM sympathetic/U sympathetically/U sympathies/M sympathize/ZGDRS sympathizer/M sympathy/SM symphonic symphonists symphony/SM symposium/MS symptom/MS symptomatic symptomatically symptomless syn synagogal synagogue/SM synapse/MS synaptic sync/MDSG synchronicity synchronization/MS synchronize/ADSG synchronous/Y synchrony synchrotron syncopate/DSGN syncopation/M syncope/M syndicalism syndicalist/S syndicate/DSMGN syndication/M syndrome/SM synergism/M synergistic synergy/SM synfuel/MS synod/SM synonym/SM synonymic synonymous/Y synonymy/M synopses synopsis/M synopsizes synoptic syntactic syntactical/Y syntax/M syntheses synthesis/M synthesize/ZGDRS synthesizer/M synthetic/SM synthetically syphilis/M syphilitic/SM syringe/DSMG syrup/SM syrupy sysadmin/S sysop/S system/SM systematic/U systematical/Y systematization/M systematize/GDS systemic/MS systemically systole/SM systolic t/SDNXGBJ ta tab/SM tabbed tabbing tabbouleh/M tabby/SM tabernacle/SM tabla/MS table/MGDS tableau/M tableaux tablecloth/M tablecloths tableland/SM tablespoon/SM tablespoonful/MS tablet/SM tabletop/MS tableware/M tabloid/SM taboo/MDSG tabor/MS tabular tabulate/DSGNX tabulation/M tabulator/SM tachograph tachographs tachometer/SM tachycardia/M tachyon/S tacit/PY tacitness/M taciturn/Y taciturnity/M tack/ZGMDRS tacker/M tackiness/M tackle/DRSMZG tackler/M tacky/RTP taco/MS tact/FM tactful/YP tactfulness/M tactic/SM tactical/Y tactician/MS tactile tactility/M tactless/PY tactlessness/M tactual tad/SM tadpole/MS taffeta/M taffrail/SM taffy/SM tag/SM tagged/U tagger/SM tagging tagliatelle taiga/MS tail/ACSDMG tailback/MS tailboard/S tailbone/S tailcoat/MS tailgate/MZGDRS tailgater/M tailless/P taillight/MS tailor/SGBMD tailoring/M tailpiece/S tailpipe/SM tailplane tailspin/SM tailwind/SM taint/MDSG tainted/U take/AIMS takeaway/S taken/A takeoff/MS takeout/MS takeover/SM taker/MS taking/SM takings/M talc/M talcum/M tale/MS talebearer/SM talent/SMD talented/U talentless tali talisman/MS talk/ZGMDRS talkative/YP talkativeness/M talker/M talkie/RSMT talky tall/TRP tallboy/MS tallier/M tallish tallness/M tallow/M tallowy tally/DRSMZG tallyho/MDGS talon/MS talus/MS tam/SM tamale/SM tamarack/MS tamarind/MS tambourine/MS tame/BYZTGDRSP tamed/U tameness/M tamer/M tamoxifen tamp/ZGDRS tamper/ZGDR tamperer/M tampon/SM tan/SM tanager/MS tanbark/M tandem/SM tandoori/M tang/MS tangelo/MS tangent/MS tangential/Y tangerine/MS tangibility/IM tangible/IMS tangibleness/M tangibly/I tangle's tangle/UDSG tango/MDSG tangy/RT tank/ZGMDRS tankard/MS tanker/M tankful/MS tanned/U tanner/SM tannery/SM tannest tannin/SM tanning/M tansy/M tantalization/M tantalize/ZGDRS tantalizer/M tantalizing/Y tantalum/M tantamount tantra/M tantrum/SM tap/SZGMDR tapas tape/MS tapeline/MS taper/MDG tapestry/SM tapeworm/MS tapioca/M tapir/MS tapped/U tapper/MS tappet/MS tapping taproom/SM taproot/SM tar/SGMD taramasalata tarantella/SM tarantula/SM tarball/S tardily tardiness/M tardy/TPR tare/MS target/MDGS tariff/MS tarmac/MS tarmacadam tarmacked tarmacking tarn/MS tarnish/GMDS tarnished/U taro/MS tarot/MS tarp/MS tarpaulin/MS tarpon/MS tarragon/SM tarred tarring tarry/TGDRS tarsal/MS tarsi tarsus/M tart/PTGMDRYS tartan/MS tartar/MS tartaric tartness/M tarty/T task/GMDS taskmaster/MS taskmistress/MS tassel/MDSG taste/JMZGDRS tasted/U tasteful/EPY tastefulness/EM tasteless/PY tastelessness/M taster/M tastily tastiness/M tasting/M tasty/TRP tat/SZR tatami/MS tater/M tatted tatter/MDSG tatterdemalion/SM tattie tatting/M tattle/MZGDRS tattler/M tattletale/MS tattoo/MDRSZG tattooer/M tattooist/SM tatty/TRS tau/SM taught/UA taunt/ZGMDRS taunter/M taunting/Y taupe/M taut/PXTNRY tauten/DG tautness/M tautological/Y tautologous tautology/SM tavern/MS taverna/S tawdrily tawdriness/M tawdry/RTP tawny/TRM tax/BZGMDRS taxation/M taxed/U taxer/M taxi/GMDS taxicab/SM taxidermist/MS taxidermy/M taximeter/MS taxing/U taxiway/S taxman taxmen taxonomic taxonomist/MS taxonomy/SM taxpayer/MS taxpaying tbs tbsp tea/SM teabag/S teacake/SM teach/ZGRSBJ teachable/U teacher/M teaching/M teacloth teacup/MS teacupful/MS teak/MS teakettle/SM teal/MS tealeaves team/GMDS teammate/MS teamster/MS teamwork/M teapot/MS tear/GMDS tearaway/S teardrop/SM tearful/PY teargas/MS teargassed teargassing tearjerker/SM tearless tearoom/SM teary/TR tease/MZGDRS teasel/MS teaser/M teashop/S teasing/Y teaspoon/SM teaspoonful/MS teat/MS teatime/S tech/M techie/S technetium/M technical/Y technicality/SM technician/MS technicolor technique/SM techno technocracy/SM technocrat/MS technocratic technological/Y technologist/MS technology/SM technophiles technophobe/S technophobia technophobic techs tectonic/S tectonically tectonics/M ted/S teddy/S tedious/PY tediousness/M tedium/M tee/DSMH teeing teem/GDS teen/MS teenage/RZ teenager/M teeny/TR teenybopper/MS teeter/MDSG teethe/GDS teething/M teethmarks teetotal/RZ teetotaler/M teetotalism/M tektite/SM tel telecast/SZGMR telecaster/M telecommunication/SM telecommunications/M telecommute/DRSZG telecommuter/M telecommuting/M telecoms teleconference/MGDS teleconferencing/M telegenic telegram/MS telegraph/MDRZG telegrapher/M telegraphese telegraphic telegraphically telegraphist/SM telegraphs telegraphy/M telekinesis/M telekinetic telemarketer/SM telemarketing/M telemeter/SM telemetry/SM teleological teleology telepathic telepathically telepathy/M telephone/DRSMZG telephoner/M telephonic telephonist/S telephony/M telephoto/SM telephotography/M teleplay/MS teleprinter/SM teleprocessing/M teleprompter/SM telesales telescope/DSMG telescopic telescopically teletext/MS telethon/MS teletype/S teletypewriter/MS televangelism/M televangelist/SM televise/XGNDS television/M televisual teleworker/S teleworking telex/MDSG tell/AGS teller/SM telling/Y telltale/SM tellurium/M telly/SM telnet temblor/MS temerity/M temp/MDRZTGS temper/ESMD tempera/LSM temperament/MS temperamental/Y temperance/IM temperate/IY temperateness/M temperature/MS tempered/U tempering tempest/SM tempestuous/YP tempestuousness/M template's template/S temple/SM tempo/SM temporal/Y temporarily temporariness/M temporary/FSM temporize/ZGDRS temporizer/M tempt/SDRZG temptation/SM tempter/M tempting/Y temptress/MS tempura/M ten/BMH tenability/M tenable/U tenably tenacious/YP tenaciousness/M tenacity/M tenancy/SM tenant/SMDG tenanted/U tenantry/M tench tend/IFEDGS tended/U tendency/SM tendentious/YP tendentiousness/M tender/SMDRYTGP tenderfoot/SM tenderhearted/YP tenderheartedness/M tenderize/ZGDRS tenderizer/M tenderloin/SM tenderness/M tendinitis/M tendon/SM tendril/SM tenement/SM tenet/SM tenfold tenner/S tennis/M tenon/SM tenor/SM tenpin/SM tenpins/M tense/DRSMYTGNXP tenseness/M tensile tension/ESM tensional tensioned tensity/IM tensor/S tent/DGSM tentacle/DSM tentative/PY tentativeness/M tenterhook/MS tenth/MY tenths tenuity/M tenuous/PY tenuousness/M tenure/DSMG tepee/SM tepid/YP tepidity/M tepidness/M tequila/SM terabyte/MS terbium/M tercentenary/SM tercentennial/MS term/MDYGS termagant/MS terminable/IC terminal/MYS terminate/DSGNX terminated/U termination/CMS terminator/S termini terminological/Y terminology/SM terminus/M termite/SM tern/IMS ternary/SM terpsichorean terr terrace/DSMG terracotta/M terraform/D terrain/SM terrapin/MS terrarium/SM terrazzo/MS terrestrial/MYS terrible/P terribleness/M terribly terrier/M terrific terrifically terrify/GDS terrifying/Y terrine/S territorial/SMY territoriality territory/SM terror/SM terrorism/M terrorist/SM terrorize/DSG terry/RMZ terrycloth/M terse/RYTP terseness/M tertiary/S tessellate/XDSGN tessellation/M tesseral test's/AFK test/AKFCDGS testability testable/UF testament/MS testamentary testate/S testator/MS testatrices testatrix/M testbed/S testcard tested/U tester/KMS testes testicle/MS testicular testifier/M testify/ZGDRS testily testimonial/SM testimony/SM testiness/M testings testis/M testosterone/M testy/PRT tetanus/M tetchily tetchy/PRT tether/SMDG tethered/U tetra/SM tetrachloride tetracycline/M tetrahedral tetrahedron/SM tetrameter/MS text/FMS textbook/SM textile/MS textual/FY textural/Y texture/MDS textured/U thalami thalamus/M thalidomide/M thallium/M than thane/SM thank/SDG thankful/PY thankfuller thankfullest thankfulness/M thankless/PY thanklessness/M thanksgiving/MS that/M thatch/MDRSZG thatcher/M thatching/M thaumaturge thaw/MDGS the/JG theater/SM theatergoer/SM theatrical/YS theatricality/M theatricals/M theatrics/M thee/S theft/SM their/S theism/M theist/SM theistic them themas thematic thematically theme/DSM themselves then/M thence thenceforth thenceforward theocracy/SM theocratic theodolite/S theologian/SM theological/Y theologists theology/SM theorem/MS theoretic theoretical/Y theoretician/MS theorist/SM theorize/DSG theory/SM theosophic theosophical theosophist/MS theosophy/M therapeutic/S therapeutically therapeutics/M therapist/SM therapy/SM there/M thereabout/S thereafter thereat thereby therefor therefore therefrom therein thereof thereon thereto theretofore thereunder thereunto thereupon therewith therm/SM thermal/MYS thermionic thermistor/S thermochemical thermocouple/S thermodynamic/S thermodynamical/Y thermodynamics/M thermoelectric thermoluminescence thermometer/SM thermometric thermonuclear thermophile/S thermophilic thermoplastic/MS thermos/MS thermostat/MS thermostatic thermostatically thesauri thesaurus/MS these/S thesis/M thespian/SM theta/SM thew/MS they they'd they'll they're they've thiamine/M thick/PMNRYXT thicken/DRJZG thickener/M thickening/M thicket/MS thickheaded/M thickness/MS thicko/S thickset thief/M thieve/DSG thievery/M thieving/M thievish/P thigh/M thighbone/MS thighs thimble/MS thimbleful/MS thin/YSP thine thing/M thingamabob/SM thingamajig/SM thingumabob/S thingummy/S thingy/S think/SRBZG thinkable/U thinker/M thinking's thinned thinner/MS thinness/M thinnest thinning thinnish third/SMY thirst/SGMD thirstily thirstiness/M thirsty/TPR thirteen/SMH thirteenth/M thirteenths thirtieth/M thirtieths thirty/HSM this thistle/MS thistledown/M thither tho thole/SM thong/SM thoracic thorax/MS thorium/M thorn/SM thorniness/M thorny/PRT thorough/RYPT thoroughbred/MS thoroughfare/MS thoroughgoing thoroughness/M those thou/MS though thought/SM thoughtful/PY thoughtfulness/M thoughtless/PY thoughtlessness/M thousand/MHS thousandfold thousandth/M thousandths thrall/SMDG thralldom/M thrash/JMDRSZG thrasher/M thrashing/M thread/SMDRZG threadbare threader/M threadlike thready/TR threat/SMNX threaten/DG threatening/Y three/SM threefold threepence/M threepenny threescore/MS threesome/SM threnody/SM thresh/MDRSZG thresher/M threshold/SM threw thrice thrift/SM thriftily thriftiness/M thriftless thrifty/PTR thrill/SMDRZG thriller/M thrilling/Y thrive/DSG throat/SM throatily throatiness/M throaty/RTP throb/SM throbbed throbbing throe/SM thrombi thromboses thrombosis/M thrombotic thrombus/M throne's throne/CDS throng/GSMD throttle/DRSMZG throttler/M through throughout throughput/M throw/SMRZG throwaway/SM throwback/SM thrower/M thrown throwout thrum/SM thrummed thrumming thrush/MS thrust/ZGSMR thruway/MS thud/MS thudded thudding thug/MS thuggery/M thuggish thulium/M thumb/SMDG thumbnail/SM thumbprint/SM thumbscrew/SM thumbtack/SM thump/SMDG thumping/M thunder/ZGMDRS thunderbolt/MS thunderclap/MS thundercloud/SM thunderer/M thunderflashes thunderhead/MS thunderous/Y thundershower/SM thunderstorm/MS thunderstruck thundery thunk/S thus thwack/ZGSMDR thwacker/M thwart/GSMD thy thyme/M thymine/M thymus/MS thyristor/S thyroid/MS thyroidal thyself ti/MRZ tiara/SM tibia/M tibiae tibial tic/SM tick/MDRZGS ticker/M ticket/GSMD ticking/M tickle/DRSMZG tickler/M ticklish/PY ticklishness/M ticktacktoe/M ticktock/MS tidal/Y tidbit/SM tiddler/S tiddly tiddlywink/S tiddlywinks/M tide/MGJDS tideland/SM tideless tidemark/S tidewater/MS tideway/MS tidily/U tidiness/UM tidings/M tidy/DRSMTGP tie's tie/AUSD tieback/MS tiebreak/RSZ tiebreaker/M tiepin/S tier/MD tiff/MDGS tiger/SM tigerish tight/SNRYPXT tighten/ZGDR tightener/M tightfisted tightness/M tightrope/MS tights/M tightwad/MS tigress/MS til tilde/SM tile/MZGJDRS tiler/M tiling/M till's till/EDRZGS tillable tillage/M tiller/EM tilt/MDGS timber/SMD timberland/M timberline/SM timbre/SM timbrel/SM time/MYZGJDRS timebase timekeeper/MS timekeeping/M timeless/PY timelessness/M timeliness/UM timely/UPRT timeout/SM timepiece/MS timer/M timescale/S timeserver/MS timeserving/M timeshare/S timestamped timestamps timetable/DSMG timeworn timezone/S timid/RYTP timidity/M timidness/M timing/M timorous/YP timorousness/M timothy/M timpani/M timpanist/SM tin/SM tincture/MGDS tinder/M tinderbox/MS tine/MS tinfoil/M ting/MDYG tinge/SM tingeing tingle/DSMGJ tingling/M tingly/RT tininess/M tinker/ZGSMDR tinkerer/M tinkle/DSMG tinkly tinned tinnily tinniness/M tinning tinnitus/M tinny/PRT tinplate/M tinpot tinsel/GSMD tinsmith/M tinsmiths tint/MDGS tintinnabulation/SM tintype/MS tinware/M tiny/RTP tip/SM tipped tipper/SM tippet/SM tippex/GDS tipping tipple/DRSMZG tippler/M tipsily tipsiness/M tipster/MS tipsy/RPT tiptoe/DSM tiptoeing tiptop/SM tirade/SM tire's tire/AGDS tired/PRYT tiredness/M tireless/PY tirelessness/M tiresome/PY tiresomeness/M tissue/SM tit/SZMR titan/SM titanic titanically titanium/M titch/S titchy tithe/DRSMZG tither/M titian/M titillate/DSGN titillating/Y titillation/M titivate/DSGN titivation/M title/DSMG titled/UA titleholder/SM titling/A titlist/MS titmice titmouse/M titrated titration titter/SGMD tittle/SM titty/S titular tizz tizzy/SM tn tnpk to/IU toad/MS toadded toadding toadstool/MS toady/DSMG toadyism/M toast/SMDRZG toaster/M toastmaster/MS toastmistress/MS toasty/TRS tobacco/MS tobacconist/MS toboggan/ZGSMDR tobogganer/M tobogganing/M toccata/S tocsin/SM today/M toddle/DRSMZG toddler/M toddy/SM toe/DSM toecap/SM toeclip/S toehold/MS toeing toenail/MS toerag/S toff/S toffee/SM tofu/M tog/SM toga/MDS toge together/P togetherness/M togged togging toggle/DSMG togs/M toil/MDRZGS toiler/M toilet/MDGS toiletry/SM toilette/M toilsome toke/MGDS token/SM tokenism/M told/AU tole/M tolerable/I tolerably/I tolerance/IM tolerances tolerant/IY tolerate/GNDS toleration/M toll/MDGS tollbooth/M tollbooths tollgate/SM tollway/SM toluene/M tom/SM tomahawk/SGMD tomato/M tomatoes tomb/MDGS tombola/S tomboy/MS tomboyish tombstone/MS tomcat/MS tome/MS tomfoolery/SM tomographic tomography/M tomorrow/MS tomtit/MS ton/SM tonal/Y tonality/SM tone's tone/IZGDRS tonearm/SM toneless/Y toner/IM tong/MDGS tongue/MGDS tongueless tonic/SM tonight/M tonnage/SM tonne/SM tonsil/MS tonsillectomy/SM tonsillitis/M tonsorial tonsure/DSMG tony/RT too took/A tool's tool/ADGS toolbar toolbox/MS toolkit toolmaker/MS toolmaking toot/MDRZGS tooter/M tooth/MD toothache/MS toothbrush/MS toothily toothless toothmarks toothpaste/MS toothpick/SM toothsome toothy/RT tootle/GDS tootsie/S top/SM topaz/MS topcoat/SM topdressing/MS topee/S topflight topiary/M topic/SM topical/Y topicality/M topknot/SM topless topmast/SM topmost topnotch topographer/MS topographic topographical/Y topography/SM topological/Y topologist/S topology/S topped topper/MS topping/SM topple/GDS topsail/SM topside/SM topsoil/M topspin/M toque/SM tor/SM torch/GMDS torchbearer/MS torchlight/M torchlit tore toreador/MS tori torment/SMDG tormenting/Y tormentor/MS torn tornado/M tornadoes toroid toroidal torpedo/GMD torpedoes torpid/Y torpidity/M torpor/M torque/MGDS torrent/SM torrential torrid/RYPT torridity/M torridness/M tors/S torsion/SM torsional torso/SM tort's tort/EFAS torte/SM tortellini/SM tortilla/MS tortoise/MS tortoiseshell/MS tortoni/M tortuous/PY tortuousness/M torture/DRSMZG torturer/M torturous torus tosh toss/MDRSZG tossup/MS tot/SGMDR total/GSMDY totalitarian/MS totalitarianism/M totality/SM totalizator/MS totalizing tote/MS totem/SM totemic totted totter/ZGMDRS totterer/M totting toucan/MS touch/AGMDS touchdown/SM touche/BJ touched/U touchily touchiness/M touching/Y touchline/S touchpaper/S touchscreen/SM touchstone/MS touchy/RPT tough/XTGMDNRYP toughen/ZGDR toughener/M toughie/SM toughness/M toughs toupee/MS tour/CFSGDM tourer/S tourism/M tourist/MS touristic touristy tourmaline/M tournament/MS tourney/MS tourniquet/MS tousle/GDS tout/MDGS tow/SZGMDR toward/S towboat/MS towel/JGSMD towelette/SM toweling/M tower/GMD towhead/MDS towhee/MS towline/MS town/MS townee/S townhouse/MS townie/MS townsfolk/M township/MS townsman/M townsmen townspeople/M townswoman/M townswomen towpath/M towpaths towrope/SM toxemia/M toxic toxicity/SM toxicological toxicologist/SM toxicology/M toxin/SM toy/SGMD toyboy/S toymaker toyshop tr trace/JDRSMZG traceability traceable/U traceless tracer/M tracery/SM trachea/M tracheae tracheal tracheotomy/SM tracing/M track/ZGSMDR trackball/SM trackbed tracker/M trackless tracksuit/S trackway/S tract's tract/CEKFAS tractability/IM tractable/I tractably/I traction/FEACKM tractor/FCKMS trad trade/JDRSMZG trademark/SMDG trader/M tradesman/M tradesmen tradespeople/M tradeswoman/M tradeswomen trading/M tradition/MS traditional/Y traditionalism/M traditionalist/SM traduce/DRSZG traducer/M traffic/SM trafficked trafficker/SM trafficking/M tragedian/SM tragedienne/MS tragedy/SM tragic tragical/Y tragicomedy/SM tragicomic trail/ZGSMDR trailblazer/MS trailblazing/M trailer/M train/ZGSMDRBJ trained/U trainee/SM trainer/M training/M trainload/MS trainman/M trainmen trainspotter/S trainspotting traipse/DSMG trait/SM traitor/SM traitorous/Y trajectory/SM tram/MS tramcar/S tramlines trammed trammel/SGMD trammeled/U tramming tramp/ZGSMDR tramper/M trample/DRSMZG trampler/M trampoline/DSMG trampolinist tramway/S trance/MS tranche/S tranquil/RYT tranquility/M tranquilize/DRSZG tranquilizer/M tranquillize/DRSZG tranquillizer/M trans/I transact/DGS transaction/SM transactional transactor/MS transatlantic transceiver/SM transcend/SGD transcendence/M transcendent transcendental/SY transcendentalism/M transcendentalist/MS transcontinental transcribe/ZGDRS transcriber/M transcript/MS transcription/MS transcriptional transducer/SM transduction transect/DSG transept/MS transfer/MSB transferability transferal/MS transferee/S transference/M transferred transferring transfiguration/M transfigure/GDS transfinite/Y transfix/DSG transform/SMDRZGB transformation/MS transformational transformed/U transformer/M transfuse/DSGNX transfusion/M transgendered transgenders transgenic transgress/GVDS transgression/MS transgressor/SM transhipment transience/M transiency/M transient/SMY transistor/MS transistorize/DSG transit/SGMD transition/MDGS transitional/Y transitive/IMYS transitiveness/M transitivity/M transitory transl translatable/U translate/BXDSGN translated/U translation/M translational translator/MS transliterate/GNXDS transliteration/M translucence/M translucency/M translucent/Y transmigrate/DSGN transmigration/M transmissible transmission's transmission/AS transmissive transmit/AS transmittable transmittal/M transmittance/M transmitted/A transmitter/MS transmitting/A transmogrification/M transmogrify/NGDS transmutation/MS transmute/DSBG transnational/SM transoceanic transom/SM transonic transpacific transparency/SM transparent/Y transpiration/M transpire/DSG transplant/GMDS transplantation/M transpolar transponder/SM transport/SZGBMDR transportability transportable/U transportation/M transporter/M transpose/DSG transposition/SM transputer/S transsexual/MS transsexualism/M transship/LS transshipment/M transshipped transshipping transubstantiation/M transverse/SMY transvestism/M transvestite/MS trap/MS trapdoor/MS trapeze/SM trapezium/SM trapezoid/SM trapezoidal trappable/U trapped trapper/SM trapping/S trappings/M trapshooting/M trash/GMDS trashcan/MS trashiness/M trashy/RPT trauma/MS traumatic traumatically traumatize/GDS travail/SGMD travel/MDRSZGJ traveled/U traveler/M traveling/M travelogue/MS traversal/SM traverse/DSMG travesty/GDSM trawl/ZGSMDR trawler/M tray/MS treacherous/YP treacherousness/M treachery/SM treacle/M treacly tread/AGSM treader treadle/DSMG treadmill/MS treas treason/BM treasonous treasure/DRSMZG treasurer/M treasurership treasury/SM treat/AGSMD treatable/U treated/U treatise/SM treatment/MS treaty/SM treble/MGDS tree/MDS treeing treeless treelike treeline treetop/SM trefoil/SM trek/MS trekked trekker/SM trekking trellis/GMDS trematode/MS tremble/DSJMG trembling/Y tremendous/Y tremolo/SM tremor/MS tremulous/PY tremulousness/M trench's trench/ADSG trenchancy/M trenchant/Y trencher/MS trencherman/M trenchermen trend/GSMD trendily trendiness/M trendsetter/S trendsetting trendy/RSMPT trepanned trepidation/SM trespass/MDRSZG trespasser/M tress/EMS trestle/MS trews trey/MS triad/SM triadic triage/M trial/ASM trialed trialing trialled trialling triangle/SM triangulable triangular/Y triangulate/XDSGN triangulation/M triathlete/S triathlon/SM triatomic tribal/Y tribalism/M tribe/SM tribesman/M tribesmen tribeswoman/M tribeswomen tribulation/MS tribunal/SM tribune/MS tributary/SM tribute's tribute/FS trice/M tricentennial/SM triceps/MS triceratops/M trichina/M trichinae trichinosis/M trick/GSMD trickery/M trickily trickiness/M trickle/MGDS trickster/SM tricky/TRP tricolor/SM tricycle/SM trident/MS tried/U triennial/MYS trier/SM triffid/S trifle/MZGDRS trifler/M trifocals/M trig/M trigger/MDSG triggest triglyceride/SM trigonometric trigonometrical trigonometry/M trigram/S trike/SM trilateral/S trilby/SM trilingual trill/GSMD trillion/SMH trillionth/M trillionths trillium/M trilobite/SM trilogy/SM trim/PMYS trimaran/MS trimester/SM trimmed/U trimmer/SM trimmest trimming/SM trimmings/M trimness/M trimodal trimonthly trinitrotoluene/M trinity/SM trinket/SM trio/MS trip/MYS tripartite tripe/M triplane triple/MGDS triplet/SM triplex/MS triplicate/MGNDS tripod/MS tripodal tripos/S tripped tripper/SM tripping triptych/M triptychs tripwire/S trireme/SM trisect/SDG trisection/M trisector trite/FPYT triteness/FM triter tritium/M triumph/GMD triumphal triumphalism triumphalist triumphant/Y triumphs triumvir/MS triumvirate/SM trivalent trivet/MS trivia/M trivial/Y triviality/SM trivialization/SM trivialize/GDS trivium/M trochaic trochee/SM trod/AU trodden/AU troglodyte/SM troika/MS troll/SGMD trolley/SM trolleybus/MS trollish trollop/SM trombone/MS trombonist/MS tromp/SGD tron/S tronned tronning troop/SZGMDR trooper/M troopship/MS trope/SM trophy/SM tropic/MS tropical/Y tropics/M tropism/SM tropopause troposphere/MS tropospheric trot/MS troth/M trotted trotter/SM trotting troubadour/MS trouble/DSMG troubled/U troublemaker/SM troubleshoot/ZGDRS troubleshooter/M troubleshooting/M troubleshot troublesome/Y trough/M troughs trounce/DRSZG trouncer/M troupe/MZGDRS trouper/M trouser/SM trousers/M trousseau/M trousseaux trout/SM trove/SM trow/DSG trowel/MDSG troy/S truancy/M truant/GMDS truce/SM truck/SZGMDR trucker/M trucking/M truckle/MGDS truckload/SM truculence/M truculent/Y trudge/MGDS true/MTGDRS truelove/SM truffle/MS trug/S truism/MS truly/U trump/SGMD trumpery/M trumpet/ZGMDRS trumpeter/M truncate/GNXDS truncation/M truncheon/SM trundle/MZGDRS trundler/M trunk/SGM trunnion/S truss/GMDS trust/ESGMD trusted/U trustee/MS trusteeship/SM trustful/EY trustfulness/M trusting/Y trustworthiness/M trustworthy/PTR trusty/TRSM truth/UM truthful/UPY truthfulness/UM truths/U try's try/AGDS trying/Y tryout/SM tryst/SMDG tsarism tsarist/S tsetse/MS tsp tsunami/SM ttys tub/SZGMDR tuba/MS tubae tubal tubby/TR tube/MS tubeless/M tuber/M tubercle/SM tubercular tuberculin/M tuberculosis/M tuberculous tuberose/M tuberous tubful/MS tubing/M tubular tubule/MS tuck/MDRSZG tucker/MDG tuft/MDRSZG tufter/M tug/SM tugboat/MS tugged tugging tuition/IM tularemia/M tulip/SM tulle/M tum/S tumble/DRSMZG tumbledown tumbler/M tumbleweed/SM tumbling/M tumbrel/SM tumescence/M tumescent tumid tumidity/M tummy/SM tumor/SM tumorous tumult/SM tumultuous/Y tumulus tun/SZGMDRBJ tuna/MS tundra/SM tune/MS tuneful/YP tunefulness/M tuneless/Y tuner/M tuneup/SM tungsten/M tunic/SM tunnel/JSMDRZG tunneler/M tunny/SM tuppence/S tuppenny tuque/SM turban/SMD turbid turbidity/M turbine/SM turbo/SM turbocharge/ZGDRS turbocharger/M turbofan/SM turbojet/SM turboprop/SM turbot/SM turbulence/M turbulent/Y turd/MS tureen/SM turf/MDSG turfy/RT turgid/Y turgidity/M turkey/SM turmeric/SM turmoil/MS turn/AMDRSZG turnabout/SM turnaround/SM turnbuckle/SM turncoat/SM turned/U turner/AM turning/MS turnip/SM turnkey/MS turnoff/MS turnout/MS turnover/MS turnpike/MS turnstile/SM turntable/SM turpentine/M turpitude/M turps turquoise/SM turret/SMD turtle/SM turtledove/SM turtleneck/SMD tush/MS tusk/MDS tussle/DSMG tussock/MS tussocky tut/SM tutelage/M tutelary tutor/SMDG tutored/U tutorial/SM tutorship/M tutted tutti/SM tutting tutu/MS tux/MS tuxedo/SM twaddle/MZGDRS twaddler/M twain/M twang/SMDG twangy/RT twas twat/S tweak/SMDG twee/DP tweed/SM tweeds/M tweedy/RT tween tweet/SMDRZG tweeter/M tweezers/M twelfth/M twelfths twelve/SM twelvemonth/M twelvemonths twentieth/M twentieths twenty/SMH twerp/SM twice twiddle/MGDRS twiddly/RT twig/MS twigged twigging twiggy/TR twilight/M twilit twill/MD twin/MDRSZG twine/SM twiner/M twinge/DSMG twink/SY twinkle/MGJDS twinkling/M twinned twinning twinset/S twirl/SMDRZG twirler/M twirly/TR twist's twist/USDG twister/MS twisty/TR twit/MS twitch/GMDS twitchy/RT twitted twitter/MDSG twittery twitting twixt two/SM twofer/SM twofold twopence/SM twopenny twosome/SM twp tycoon/SM tying/AU tyke/MS tympani/M tympanist/MS tympanum/SM type's type/AGDS typecast/GS typed/U typeface/MS typeless typescript/MS typeset/S typesetter/SM typesetting/M typewrite/RSZG typewriter/M typewriting/M typewritten typewrote typhoid/M typhoon/MS typhus/M typical/UY typicality/M typification/M typify/NGDS typing/M typist/SM typo/MS typographer/MS typographic typographical/Y typography/M typological/Y typology/SM tyrannic tyrannical/Y tyrannicide tyrannize/GDS tyrannosaur/SM tyrannosaurus/MS tyrannous tyranny/SM tyrant/SM tyro/MS tyrosine u/S ubiquitous/Y ubiquity/M udder/SM ufologist/SM ufology/M ugh uglification ugliness/M ugly/RTP uh ukase/SM ukulele/SM ulcer/SM ulcerate/XDSGN ulceration/M ulcerous ulna/M ulnae ulnar ulster/MS ult ulterior ultimate/MY ultimatum/MS ultimo ultra/SM ultraconservative/SM ultrahigh ultralight/MS ultramarine/M ultramodern ultramontane ultrasonic/S ultrasonically ultrasound/MS ultraviolet/M ululate/DSGNX ululation/M um umbel/SM umber/M umbilical umbilici umbilicus/M umbra/SM umbrage/M umbrageous umbrella/SM umiak/SM umlaut/MS ump/SGMD umpire/MGDS umpteen/H unabridged/MS unacceptability unacceptable unaccommodating unaccountability unaccountably unadaptive unadventurous unaesthetic unalterably unambiguity unambitious unanimity/M unanimous/Y unapparent unappetizing unappreciative unassertive unassuming/Y unattainably unavailing/Y unaware/S unbeknown unbend/SG unbent unbiased/Y unbiassedly unbid unblinking/Y unbosom/DG unbound/D unbreakability unbreakable unbroken uncanny/T uncap/S uncaring uncatalogued unceasing/Y unchallengeable unchangeable uncharacteristic uncharismatic uncharitable unchaste/RT uncheckable uncial/M uncle/SM unclean/DRPT uncleanly/T unclear/DRT unclench/D uncollimated uncommon/T uncommunicative uncomplicated uncomprehending/Y uncompromisable uncompromising/Y unconditional/Y unconfused uncongenial unconscionably unconscious/M unconstitutional/Y uncontentious uncontrollably uncool uncooperative uncouth/YP uncreative uncross/B uncrushable unction/SM unctuous/YP unctuousness/M uncut undaunted/Y undead undecided/SM undemonstrative/Y undeniably under underachieve/ZGLDRS underachiever/M underact/SDG underage underarm/SM underbelly/SM underbid/S underbidding underbrush/M undercarriage/MS undercharge/DSMG underclass/MS underclassman/M underclassmen underclothes/M underclothing/M undercoat/JGSMD undercoating/M undercooked undercover undercurrent/SM undercut/SM undercutting underdeveloped underdevelopment/M underdog/SM underdone undereducated underemphasis underemployed underemployment/M underestimate/MGNXDS underestimation/M underexploited underexpose/DSG underexposure/MS underfed underfeed/SG underfloor underflow underfoot underframe underfund/GD underfur/M undergarment/SM undergo/G undergoes undergone undergrad/S undergraduate/MS underground/SM undergrowth/M underhand underhanded/YP underhandedness/M underinvestment underlain underlay/SM underlie/S underline/MGJDS underling/MS underlip/SM underloaded underlying undermanned undermentioned undermine/GDS undermost underneath/M underneaths undernourished undernourishment/M underpaid underpants/M underpart/MS underpass/MS underpay/GSL underpayment/MS underperformed underpin/S underpinned underpinning/SM underplay/DGS underpopulated underpopulation underpowered underpricing underprivileged underproduction/M underrate/GDS underrepresented underscore/DSMG undersea/S undersealed undersecretary/SM undersell/SG undersexed undershirt/SM undershoot/SG undershorts/M undershot underside/MS undersign/DSG undersigned/M undersized underskirt/SM undersold underspecification underspecified underspend/G underspent understaffed understand/RGSBJ understandability understandably understanding/MY understate/GDSL understatement/SM understocked understood understorey understory understrength understudy/DSMG undertake/ZGRSJ undertaken undertaker/M undertaking/M underthings/M undertone/MS undertook undertow/SM underused underusing underutilized undervaluation/M undervalue/GDS underwater underway underwear/M underweight/M underwent underwhelm/SDG underworld/SM underwrite/RSZG underwriter/M underwritten underwrote undesirable/SM undies/M undiscerning undisguised/Y undo undoubted/Y undramatic undrinkability undroppable undue undulant undulate/DSXGN undulation/M unearthliness/M unease/M uneasy/T uneatable uneconomic unemployed/M unending unenterprising unequal/DY unergonomic unerring/Y unessential uneven/RYPT unexacting unexceptionably unexcited unexciting unexpected/PY unexpectedness/M unfailing/Y unfair/PTRY unfaltering unfamiliar unfathomably unfed unfeeling/Y unfeminine unfetchable unfit/S unfitting unfix/GDS unflagging/Y unflappability/M unflappable unflappably unflattering unflinching/Y unforgettably unforgivably unfortunate/MS unfriendly/T unfrock/DG unfruitful unfulfillable unfunny unfussy ungainliness/M ungainly/RTP ungentle unglamorous ungodly/T ungraceful/Y ungrudging unguarded unguent/SM ungulate/MS unhandy/T unhappy/T unhealthful unhealthy/T unheroic unhistorical unholy/T unhurt unicameral unicellular unicorn/SM unicycle/SM unicyclist/S unideal unidirectional unifiable unification/AM unifier uniform/SMDRYTG uniformity/M unify/AGDSN unilateral/Y unilateralism unilateralist unimportance unimportant unimpressive uninhibited/Y uninsured unintellectual unintelligent unintended uninteresting uninterrupted/Y unintuitive uninviting union/ASM unionism/M unionist/MS unipolar unique/YTRP uniqueness/M unisex/M unison/M unitary unite/AEGSD unitedly unities unitize/DSG unity/EM univalent univalve/SM universal/MYS universalism universality/M universalize/DSG universe/SM university/SM unixism/S unjam unkempt unkind/T unkindly/T unknightly unknowable/M unknown/SM unleaded/M unless unlike/PB unlikeable unlikely/T unlink/D unlit unlock/DSG unlovable unlovely/TR unloving unlucky/T unmanageably unmanly/T unmannerly unmarried unmeaning unmeetable unmelodious unmentionable/MS unmentionables/M unmet unmindful unmissable unmistakably unmistakeably unmnemonic unmoral unmovable unmusical/Y unnecessary unnerving/Y unobjectionable unobservable unobservant unoffensive unofficial/Y unoriginal unoriginality unorthodoxy unpack/Z unpeople unperceptive unpersuasive unphysical unpick/GDS unpin/S unpleasing unploughed unpoetical unpolitical unpopular unportable unpractical unprecedented/Y unprofessional/Y unpromising unpronounced unpropitious unpunctual unpunctuality unquestioning/Y unquiet/TR unraisable unread/B unreadability unready/TR unreal unreasoning unreceptive unregenerate unrelated unrelenting/Y unrelieved/Y unremarkable unremitting/Y unrepeated unreported unrepresentative unresisting/Y unrest/M unriddle unripe/TR unroll/GDS unromantic unruliness/M unruly/RTP unsafe/T unsaleable unsatisfactory/P unsavory unseal/B unsearchable unseasonal unseaworthiness unseeing/Y unseemly/T unseen/MS unselfconscious/Y unsellable unsentimental unset unshakably unshapely unshorn unshrinking unsighted unsightliness/M unsightly/TP unsociable unsocial unsophistication unsound/PRYT unspeakably unspecific unspectacular unsporting unstable/RT unstack/DG unstamped unsteady/PTR unstinting/Y unstoppably unstrapping unsubstantial unsubtle unsure/P unsuspecting/Y unswerving/Y unsymmetrical untactful untenability unthinkably unthinking/Y unthoughtful untidy/PTR until untimely/T untiring/Y untouchable/SM untoward untrue/RT untrustworthy unusably unutterable unutterably unvarying/Y unwarrantable unwarrantably unwary/T unwed unwedge unwelcome/G unwell unwieldiness/M unwieldy/TRP unwind/B unwisdom unwise/RYT unworried unworthy/T unwound/D unwrapping unyielding up/SM upbeat/MS upbraid/SGD upbringing/MS upchuck/SGD upcoming upcountry/M updatability update/MGDRS updraft/MS upend/SGD upfront upgrade/MGDSBJ upgradeable upheaval/MS upheld uphill/MS uphold/ZGRS upholder/M upholster/ASDG upholsterer/SM upholstery/M upkeep/M upland/MS uplift/JSMDG upload/SDG upmarket upon upped upper/SM uppercase/M upperclassman/M upperclassmen upperclasswoman upperclasswomen uppercut/MS uppercutting uppermost upping uppish uppity upraise/DSG uprate/DG uprear/GSD upright/MYPS uprightness/M uprising/SM upriver uproar/SM uproarious/Y uproot/GSD upscale upset/SM upsetting upshot/SM upside/SM upsilon/MS upstage/GDS upstairs upstanding upstart/MDSG upstate/M upstream upstroke/SM upsurge/MGDS upswing/MS uptake/SM uptempo upthrust/GSM uptick/SM uptight uptown/M uptrend upturn/GSMD upward/SY upwelling upwind uracil/M uranium/M urban urbane/RYT urbanity/M urbanization/M urbanize/DSG urbanologist/SM urbanology/M urchin/SM urea/M uremia/M uremic ureter/SM urethane/M urethra/M urethrae urethral urethritis urge/MGDSJ urgency/M urgent/Y uric urinal/SM urinalyses urinalysis/M urinary urinate/GNDS urination/M urine/M urn/SM urogenital urological urologist/MS urology/M ursine urticaria/M usability/M usable/UA usage/SM use/AEDSMG used/U useful/PY usefulness/M useless/YP uselessness/M user/MS usher/SMDG usherette/SM usu usual's usual/UY usurer/SM usurious usurp/SDRZG usurpation/M usurper/M usury/M utensil/SM uteri uterine uterus/M utilitarian/MS utilitarianism/M utility/SM utilization/M utilize/GBDS utmost/M utopia/SM utter/SDRYTG utterance/SM uttermost/M uvula/SM uvular/MS uxorious v/AS vac/S vacancy/SM vacant/Y vacate/DSG vacation/ZGMDRS vacationer/M vacationist/MS vaccinate/GNDSX vaccination/M vaccine/SM vacillate/XGNDS vacillation/M vacuity/M vacuole/MS vacuous/YP vacuousness/M vacuum/GSMD vagabond/SMDG vagabondage/M vagarious vagary/SM vagina/M vaginae vaginal/Y vagrancy/M vagrant/MS vague/RYTP vagueness/M vain/RYT vainglorious/Y vainglory/M val valance/MS vale/MS valediction/SM valedictorian/SM valedictory/SM valence/MS valency/SM valentine/SM valet/SMDG valetudinarian/MS valetudinarianism/M valiance/M valiant/Y valid/Y validate/IGNDS validated/U validation/IM validations validity/IM validness/M valise/SM valley/SM valor/M valorous/Y valuable/MS valuate/DSG valuation/CAMS value's value/CAGSD valueless valuer/SM valve/DSMG valveless valvular vamoose/DSG vamp/AMDGS vampire/SM van/SM vanadium/M vandal/SM vandalism/M vandalize/DSG vane/MS vanguard/MS vanilla/SM vanish/JDSG vanishing/Y vanity/SM vanned vanning vanquish/ZGDRS vanquished/U vanquisher/M vantage/SM vapid/YP vapidity/M vapidness/M vapor/SM vaporization/M vaporize/DRSZG vaporizer/M vaporous vaporware/S vapory vaquero/MS var/S variability/IM variable/ISM variably/I variance/SM variant's variant/IS variate/NXS variation/M variational varicolored varicose varied/U variegate/DSGN variegation/M varietal/SM variety/SM various/Y varlet/SM varmint/MS varnish/GMDS varnished/U varsity/SM vary/DSG vascular vase/MS vasectomy/SM vasomotor vassal/SM vassalage/M vast/MRYTSP vastness/M vat/SM vatted vatting vaudeville/M vaudevillian/MS vault/SMDRZG vaulter/M vaulting/M vaunt/SMDG vb veal/M vector/SGMD vectorization vectorized veejay/SM veep/MS veer/MDGS veg/M vegan/SM vegeburger/S veges vegetable/SM vegetarian/SM vegetarianism/M vegetate/GNVDS vegetation/M vegetational vegged vegges veggie/SM veggieburger/S vegging vehemence/M vehemency/M vehement/Y vehicle/MS vehicular veil's veil/UDGS vein/MDGS vela velar/SM veld/MS vellum/M velocipede/MS velocity/SM velodrome/S velor velour's velum/M velvet/MS velveteen/MS velvety/TR venal/Y venality/M venation/M vend/DGS vendetta/SM vendible vendor/MS veneer/MDGS venerability/M venerable venerate/DSGN veneration/M venereal venetian vengeance/M vengeful/AY venial venireman/M veniremen venison/M venom/M venomous/Y venous vent's vent/DGS ventilate/GNDS ventilated/U ventilation/M ventilator/MS ventral/Y ventricle/SM ventricular ventriloquism/M ventriloquist/SM ventriloquy/M venture/DSMG venturesome/YP venturesomeness/M venturous/YP venturousness/M venue/ASM veracious/Y veracity/M veranda/SM verb/KMS verbal/MYS verbalization/M verbalize/GDS verbatim verbena/SM verbiage/MS verbose/YP verbosity/M verboten verdant/Y verdict/SM verdigris/MDSG verdure/M verge's verge/FDSG verger/MS verifiability verifiable/U verification/M verified/U verify/DRSNXZG verily verisimilitude/M veritable veritably verity/SM vermicelli/M vermiculite/M vermiform vermilion/M vermin/M verminous vermouth/M vernacular/SM vernal vernier/SM veronica/M verruca/SM verrucae versatile versatility/M verse/AFNGMSDX versed/U versicle versification/M versifier/M versify/NZGDRS version/AFIMS verso/SM versus vertebra/M vertebrae vertebral vertebrate/IMS vertex/MS vertical/MYS vertiginous vertigo/M verve/M very/RT vesicle/SM vesicular vesiculate vesper/MS vessel/MS vest's vest/ILDGS vestal/MS vestibular vestibule/MS vestige/SM vestigial/Y vesting/M vestment/IMS vestry/SM vestryman/M vestrymen vet/SM vetch/MS veteran/SM veterinarian/SM veterinary/SM veto/MDG vetoes vetted vetting vex/GDS vexation/SM vexatious/Y vhf vi via viability/M viable viably viaduct/SM vial/MS viand/SM vibe/MS vibes/M vibraharp/SM vibrancy/M vibrant/Y vibraphone/MS vibraphonist/MS vibrate/GNDSX vibration/M vibrational/Y vibrato/MS vibrator/SM vibratory viburnum/SM vicar/SM vicarage/SM vicarious/YP vicariousness/M vice/CMS viced vicegerent/SM vicennial viceregal viceroy/MS vichyssoise/M vicing vicinity/SM vicious/YP viciousness/M vicissitude/SM victim/MS victimization/M victimize/GDS victimless victor/MS victorious/Y victory/SM victual/SMDG vicuna/MS videlicet video/GSMD videocassette/SM videoconferencing videodisc/MS videodisk/MS videophone/MS videotape/DSMG videotex/S vie/DS view/AMDRBSZG viewer/AM viewership/M viewfinder/MS viewing/SM viewpoint/MS vigesimal vigil/SM vigilance/M vigilant/Y vigilante/SM vigilantism/M vigilantist/M vignette/DSMG vignettist/SM vigor/M vigorous/Y vii viii viking/MS vile/YTPR vileness/M vilification/M vilify/DSNG villa/SM village/RSMZ villager/M villain/SM villainous villainy/SM ville villein/SM villeinage/M villi villus/M vim/M vinaigrette/M vincible/I vindaloos vindicate/XDSGN vindication/M vindicator/MS vindictive/PY vindictiveness/M vine/MS vinegar/SM vinegary vineyard/MS vino/M vinous vintage/MS vintner/MS vinyl/SM viol/MBS viola/SM violable/I violate/GNDSX violation/M violator/SM violence/M violent/Y violet/MS violin/MS violincello/S violinist/SM violist/MS violoncellist/SM violoncello/SM viper/SM viperous virago/M viragoes viral vireo/SM virgin/MS virginal/SM virginity/M virgule/MS virile virility/M virologist/MS virology/M virtual/Y virtue/SM virtuosic virtuosity/M virtuoso/SM virtuous/YP virtuousness/M virulence/M virulent/Y virus/MS visa/MDSG visage/MS viscera visceral/Y viscid/I viscometer viscose/M viscosity/M viscount/SM viscountcy/SM viscountess/MS viscous viscus/M vise/ACMGDS visibility/ISM visible/I visibly/I vision/KGDSM visionary/SM visit's visit/ASGD visitable/U visitant/MS visitation/MS visited/U visitor/MS visor/SM vista/SM visual/SMY visualization/MS visualize/DRSZG visualizer/M vita/M vitae vital/SY vitality/M vitalization/AM vitalize/CAGSD vitals/M vitamin/MS vitiate/GNDS vitiation/M viticulture/M viticulturist/SM vitreous vitrifaction/M vitrification/M vitrify/GNDS vitrine/SM vitriol/M vitriolic vitriolically vittles/M vituperate/GNVDS vituperation/M viva/MS vivace vivacious/PY vivaciousness/M vivacity/M vivaria vivarium/SM vivid/RYTP vividness/M vivify/ADSG viviparous vivisect/DGS vivisection/M vivisectional vivisectionist/SM vixen/SM vixenish/Y viz vizier/SM vocab vocable/MS vocabulary/SM vocal/SMY vocalic vocalist/SM vocalization/MS vocalize/DSG vocation/FIKASM vocational/Y vocative/MS vociferate/DSGN vociferation/M vociferous/PY vociferousness/M vodka/SM voe/S vogue/SM voguish voice/IDSMG voiced/U voiceless/PY voicelessness/M void/MDSGB voila voile/M vol volatile/S volatility/M volatilize/DSG volcanic volcanically volcanism volcano/M volcanoes vole/MS volition/M volitional volley/GSMD volleyball/SM volt/AMS voltage/MS voltaic voltmeter/SM volubility/M voluble volubly volume/SM volumetric voluminous/PY voluminousness/M voluntarily/I voluntarism/M voluntary/SM volunteer/SGMD volunteerism/M voluptuary/SM voluptuous/PY voluptuousness/M volute/SM vomit/SMDG voodoo/GSMD voodooism/M voracious/PY voraciousness/M voracity/M vortex/MS vorticity votary/SM vote's vote/CGVDS voter/SM vouch/DRSZG voucher/M vouchsafe/DSG vow/SGMD vowel/SM voyage/MZGDRS voyager/M voyageur/SM voyeur/MS voyeurism/M voyeuristic vulcanism vulcanization/M vulcanize/GDS vulcanologist vulgar/RYT vulgarian/MS vulgarism/MS vulgarity/SM vulgarization/M vulgarize/ZGDRS vulgarizer/M vulnerabilities vulnerability/IM vulnerable/I vulnerably/I vulpine vulture/SM vulturous vulva/M vulvae vying w/DNXTGVJ wabbit/S wackes wackiness/M wacko/SM wacky/RPT wad/SZGMDR wadded wadding/M waddle/DSMG wade/MS wader/M waders/M wadge/S wadi/MS wafer/SM waffle/MZGDRS waffler/M waft/MDGS wag/SZGMDR wage/MS waged/U wager/ZGMDR wagerer/M wagged waggery/SM wagging waggish/YP waggishness/M waggle/MGDS waggly wagon/ZSMR wagoner/M wagtail/SM waif/MS wail/MDRZGS wailer/M wailing/M wain/MS wainscot/SMDGJ wainscoting/M wainwright/SM waist/SM waistband/MS waistcoat/MS waistline/MS wait/MDRZGS waiter/M waiting/M waitpeople waitperson/MS waitress/MS waitstaff/M waive/DRSZG waiver/M wake/MGJDS wakeful/PY wakefulness/M waken/GSD waldo/S waldoes wale/MGDS walk/BMDRZGS walkabout/S walkaway/MS walker/M walkies walking/M walkout/SM walkover/MS walkway/SM wall/MDGS wallaby/SM wallah wallahs wallboard/M wallchart wallet/MS walleye/DSM wallflower/MS wallop/MDSJG walloping/M wallow/MDSG wallpaper/GSMD wally/S walnut/MS walrus/MS waltz/ZGMDRS waltzer/M wampum/M wan/GPDY wand/MS wander/DRSJZG wanderer/M wanderings/M wanderlust/MS wane/MS wangle/MZGDRS wangler/M wank/DRZGS wanna wannabe/SM wannabee/S wanner wanness/M wannest want/MDGS wanted/U wanton/MDRYSPG wantonness/M wapiti/MS war/SGM warble/MZGDRS warbler/M warbonnet/SM ward/AMDGS warden/MS warder/MS wardress/S wardrobe/SM wardroom/SM wardship ware/MS warehouse/DSMG warehouseman warez/S warfare/M warhead/MS warhorse/SM warily/U wariness/UM warlike warlock/MS warlord/MS warm/PDRYHZTGS warmblooded warmer/M warmhearted/P warmheartedness/M warmish warmness/M warmonger/SMG warmongering/M warmth/M warn/JDGS warned/U warning/MY warp/MDGS warpaint warpath/M warpaths warplane/MS warrant/GMDS warranted/U warranty/DSMG warred warren/MS warring warrior/SM warship/SM wart/MS warthog/SM wartime/M warty/TR wary/UPRT was wash/BJMDRSZG washable/SM washbasin/SM washboard/SM washbowl/SM washcloth/M washcloths washday washed/U washer/M washerwoman/M washerwomen washing/M washout/MS washrag/MS washroom/MS washstand/SM washtub/MS washy/TR wasn't wasp/MS waspish/YP waspishness/M wassail/SMDG wast wastage/M waste/DRSMZG wastebasket/SM wasteful/PY wastefulness/M wasteland/SM wastepaper/M waster/M wastrel/SM watch/BZGMDRS watchable/U watchband/MS watchdog/SM watched/U watcher/M watchful/PY watchfulness/M watchmaker/MS watchmaking/M watchman/M watchmen watchstrap/S watchtower/MS watchword/MS water/GSMD waterbird/SM waterborne watercolor/MS watercolorists watercourse/MS watercraft/M watercress/M waterfall/SM waterfowl/SM waterfront/MS waterhole/SM wateriness/M waterless waterlily/SM waterline/MS waterlogged waterman watermark/MDSG watermelon/SM watermill/MS waterproof/SGMD waterproofing/M waters/M watershed/MS waterside/MS waterspout/MS watertight waterway/MS waterwheel/MS waterworks/M watery/PTR watt/MS wattage/M wattle/MGDS wave/MZGDRS waveband/S waveform/S wavefront waveguide/S wavelength/M wavelengths wavelet/SM wavelike waver/ZGMDR waverer/M wavering/UY wavily waviness/M wavy/PRT wax/GMDNS waxiness/M waxwing/SM waxwork/SM waxy/RPT way/SM waybill/SM wayfarer/MS wayfaring/SM waylaid waylay/RSZG waylayer/M wayleave/S waymarked wayside/SM wayward/PY waywardness/M wazoo/S we we'd we'll we're we've weak/PNRYXT weaken/DRZG weakener/M weakfish/MS weakish weakling/SM weakly/RT weakness/MS weal/MHS wealth/M wealthiness/M wealthy/TRP wean/DGS weanling weapon/MS weaponless weaponry/M wear/MRBJSZG wearable/U wearer/M wearied/U wearily weariness/M wearisome/Y weary/TGDRSP wearying/Y weasel/MDYSG weather/SMDG weatherboard/GS weathercock/SM weathering/M weatherization/M weatherize/DSG weatherman/M weathermen weatherperson/SM weatherproof/SGD weatherstrip/S weatherstripped weatherstripping/M weave/DRSMZG weaver/M weaving/M web/SM webbed webbing/M webfeet webfoot/M webmaster/S website/SM wed/AS wedded/A wedder wedding/SM wedge/DSMG wedgie/MS wedlock/M wee/RSMT weed/MDRSZG weeder/M weedkiller/S weedless weeds/S weedy/TR weeing week/MYS weekday/SM weekend/SZGMDR weekly/SM weeknight/SM ween/DSG weenie/MTRS weensy/RT weeny weep/MRJSZG weeper/M weepy/TRSM weevil/MS weft/MS weigh's weigh/AGD weighbridge/S weighs/A weight/MDSJG weighted/U weightily weightiness/M weightless/YP weightlessness/M weightlifter/SM weightlifting/M weighty/PTR weir/MS weird/PTRY weirdie/MS weirdness/M weirdo/MS welcome/MGDS weld/MDRBSZG welder/M welfare/M welkin/M well/MDPSG wellhead/SM wellie wellington/MS wellness/M wellspring/MS welly/S welsh/ZGDRS welsher/M welt/MDRSZG welter/GMD welterweight/MS wen/M wench/MS wend/DSG went wept were weren't werewolf/M werewolves west/M westbound westerly/SM western/SZMR westerner/M westernization/M westernize/GDS westernmost westward/S wet/SMYP wetback/SM wetland/SM wetness/M wetsuit/S wettable wetter/SM wettest wetting wetware/S whack/SJZGMDR whacker/M whale/DRSMZG whaleboat/MS whalebone/M whaler/M whales/S whaling/M wham/MS whammed whamming whammy/SM wharf/SM wharves what/MS whatchamacallit/MS whatever whatnot/M whatshername whatshisname whatsit/S whatsoever wheal/SM wheat/MN wheatgerm wheatmeal whee wheedle/DRSZG wheedler/M wheel/SMDRZG wheelbarrow/MS wheelbase/SM wheelchair/SM wheelhouse/SM wheelie/SM wheelwright/SM wheeze/DSMG wheezily wheeziness/M wheezy/PRT whelk/SMD whelm/SDG whelp/SMDG when/MS whence whenever whensoever where/SM whereabouts/M whereas whereat whereby wherefore/MS wherein whereof whereon wheresoever whereto whereupon wherever wherewith wherewithal/M wherry/SM whet/S whether whetstone/SM whetted whetting whew whey/M which whichever whiff/SMDG whiffletree/MS while/DSMG whilom whilst whim/MS whimper/MDGS whimsical/Y whimsicality/M whimsy/SM whine/DRSMZG whiner/M whinge/DRSZG whingeing whinny/GDSM whiny/RT whip/MS whipcord/M whiplash/MS whipped whipper/MS whippersnapper/MS whippet/MS whipping/SM whippletree/MS whippoorwill/SM whipsaw/MDGS whir/MS whirl/SMDG whirligig/MS whirlpool/MS whirlwind/MS whirlybird/MS whirred whirring whisk/SMDRZG whisker/MD whiskery whiskey/MS whisper/JMDRSZG whisperer/M whist/M whistle/MZGDRS whistler/M whit/MDNRSXTGJ white/SPMY whitebait whiteboard/S whitecap/SM whitefish/MS whitehead/MS whiten/ZGDRJ whitener/M whiteness/M whitening/M whiteout/SM whitetail/MS whitewall/SM whitewash/GMDS whitewater/M whitey/SM whither whiting/M whitish whittle/ZGDRS whittler/M whiz/M whizkid/M whizzbang/MS whizzed whizzes whizzing who'd who'll who're who've who/M whoa whodunit/MS whoever whole/SMP wholefood/S wholegrain wholehearted/YP wholeheartedness/M wholemeal wholeness/M wholesale/MZGDRS wholesaler/M wholesome/UP wholesomely wholesomeness/UM wholewheat wholly whom whomever whomsoever whoop/SMDRZG whoopee/S whooper/M whoosh/MDSG whop/S whopped whopper/SM whopping whore/SMG whorehouse/SM whoreish whorish whorl/SMD whose whoso whosoever whup/S whupped whupping why'd why/M whys wick/MDRSZ wicked/TPRY wickedness/M wicker/M wickerwork/M wicket/SM wicketkeeper/S wicketkeeping wide/YTRSP widemouthed widen/SDRZG widener/M wideness/M widespread widget/S widow/SMDRZG widower/M widowhood/M width/M widths wield/SDRZG wielder/M wiener/SM wienie/SM wife/MY wifeless wifely/TR wig/SM wigeon/SM wigged wigging wiggle/DRSMZG wiggler/M wiggles/S wiggly/TR wight/SM wiglet/SM wigwag/SM wigwagged wigwagging wigwam/SM wild/MRYSTP wildcat/MS wildcatted wildcatter/MS wildcatting wildebeest/MS wilderness/MS wildfire/MS wildflower/SM wildfowl/M wildlife/M wildness/M wilds/M wile/MGDS wiliness/M will/MDS willful/PY willfulness/M willies/M willing/UTPY willinger willingness/UM williwaw/MS willow/SM willowy/TR willpower/M willy/S wilt/MDSG wily/RTP wimp/MDSG wimpish wimple/DSMG wimpy/RT win/SGMD wince/DSMG winch/MDSG wind's wind/UASG windbag/SM windblown windbreak/ZSMR windbreaker/M windburn/MD windcheater/S windchill/M winded winder/SM windfall/MS windflower/SM windily windiness/M winding/SM windjammer/MS windlass/MS windless windmill/MDGS window/SMDG windowless windowpane/SM windowsill/SM windpipe/MS windproof windrow/SM windscreen/SM windshield/MS windsock/MS windstorm/MS windsurf/ZGDRS windsurfer/M windsurfing/M windswept windup/SM windward/M windy/RTP wine/MS wineglass/MS winegrower/MS winemaker/MS winery/SM wineskin wing/MDRZG wingding/MS wingless winglike wingspan/MS wingspread/SM wingtip/SM wink/MDRSZG winker/M winkle/DSMG winnable winner/SM winning/MYS winnow/ZGSDR winnower/M wino/MS winsome/YTRP winsomeness/M winter/GSMD wintergreen/M winterize/GDS wintertime/M wintry/TR winy/RT wipe/MZGDRS wiper/M wire's wire/AGDS wired/S wirehair/MS wireless/MS wirer wiretap/MS wiretapped wiretapper/SM wiretapping/M wiriness/M wiring/M wiry/RTP wisdom/M wise/MYTGDRS wiseacre/SM wisecrack/GMDS wiseguy/S wisely/TR wish/MDRSZG wishbone/SM wisher/M wishful/Y wisp/MS wispy/RT wist wisteria/SM wistful/YP wistfulness/M wit/SM witch/MDSG witchcraft/M witchdoctor/S witchery/M with withal withdraw/SG withdrawal/MS withdrawn withdrew withe/DRSMZG wither/JGD withering/Y withers/M withheld withhold/SG withholding/M within/M without withstand/SG withstood witless/PY witlessness/M witness/MDSG wits/M witted witter/SGD witticism/SM wittily wittiness/M witting/UY witty/RPT wive/GDS wizard/SMY wizardry/M wizened wk/Y woad/M wobble/MGDRS wobbliness/M wobbly/RTP wodge/S woe/SM woebegone woeful/YP woefuller woefullest woefulness/M wog/S wok/SMN woke wold/MS wolf/MDSG wolfhound/SM wolfish/Y wolfram/M wolverine/SM wolves woman/M womanhood/M womanish womanize/DRSZG womanizer/M womankind/M womanlike/M womanliness/M womanly/RPT womb/MS wombat/MS womble/S women womenfolk/SM womenfolks/M won't won/M wonder/MDGLS wonderful/PY wonderfulness/M wondering/Y wonderland/MS wonderment/M wondrous/Y wonk/MS wonky/TR wont/MD wonted/U woo/SZGDR wood/MDNSG woodbine/M woodblock/MS woodcarver/MS woodcarving/SM woodchuck/MS woodcock/SM woodcraft/M woodcut/SM woodcutter/SM woodcutting/M wooden/RYTP woodenness/M woodiness/M woodland/SM woodlice woodlot/SM woodlouse woodman/M woodmen woodpecker/SM woodpile/SM woods/M woodshed/SM woodsiness/M woodsman/M woodsmen woodsmoke woodsy/RTP woodwind/MS woodwork/MRZG woodworker/M woodworking/M woodworm/S woody/TPRSM wooer/M woof/MDRSZG woofer/M wool/MNYSX woolen/M woolgathering/M wooliness woolliness/M woolly/RSMPT woozily wooziness/M woozy/TRP wop/S! word's word/AJDSG wordage/M wordbook/SM wordily wordiness/M wording's wordless/Y wordplay/M wordsmith wordsmiths wordy/TPR wore work's work/ADJSG workability/U workable/U workaday workaholic/SM workaround/S workbasket/S workbench/MS workbook/MS workday/SM worker/MS workfare/M workforce/SM workhorse/SM workhouse/SM working's workingman/M workingmen workings/M workingwoman/M workingwomen workload/MS workman/M workmanlike workmanship/M workmate/S workmen workout/SM workpeople workpiece/S workplace/MS workroom/MS works/M worksheet/MS workshop/MS workshy workspace workstation/MS worktable/MS worktop/S workup/MS workweek/SM world/SM worldlier worldliness/UM worldly/UTP worldview/SM worldwide worm/MDSG wormhole/MS wormwood/M wormy/TR worn/U worried/Y worrier/M worriment/M worrisome worry/ZGDRSMJ worrying/Y worrywart/SM worse/M worsen/DSG worship/ZGSMDR worshiper/M worshipful worst/SGMD worsted/M wort/M worth/M worthies worthily/U worthiness/UM worthless/YP worthlessness/M worthwhile worthy's worthy/UPRT wost wot wotcha would've would/S wouldn't wouldst wound/SGMDR wove/A woven/AU wow/SGMD wpm wrack/GSMD wraith/M wraiths wrangle/DRSMZGJ wrangler/M wrap's wrap/US wraparound/SM wrapped/U wrapper/SM wrapping/MS wrasse/MS wrath/M wrathful/Y wreak/SGD wreath/MDSG wreathe wreaths wreck/SZGMDR wreckage/M wrecker/M wren/MS wrench/MDSG wrest/SGMD wrestle/MZGDRS wrestler/M wrestling/M wretch/MS wretched/PTRY wretchedness/M wriggle/MZGDRS wriggler/M wriggly/RT wright/MS wring/SZGMR wringer/M wrinkle/MGDS wrinkled/U wrinkly/TRSM wrist/SM wristband/MS wristwatch/MS writ/MRSZ write/ASBJG writer/M writeup writhe/MGDS writing's written/AU wrong/STGMPDRY wrongdoer/SM wrongdoing/SM wrongful/PY wrongfulness/M wrongheaded/YP wrongheadedness/M wrongness/M wrote/A wroth wrought wrung wry/Y wryer wryest wryness/M wt wunderkind/S wurst/SM wuss/MS wussy/RSMT x xci xcii xciv xcix xcvi xcvii xenon/M xenophobe/MS xenophobia/M xenophobic xerographic xerography/M xerox/MDSG xi/SM xii xiii xiv xix xor xref/S xreffed xreffing xterm/M xv xvi xvii xviii xx xxi xxii xxiii xxiv xxix xxv xxvi xxvii xxviii xxx xxxi xxxii xxxiii xxxiv xxxix xxxv xxxvi xxxvii xxxviii xylem/M xylene xylophone/SM xylophonist/SM y y'all ya yacht/SMDG yachting/M yachtsman/M yachtsmen yachtswoman/M yachtswomen yahoo/SM yak/SM yakked yakking yam/SM yammer/SZGMDR yammerer/M yang/M yank/MDSG yap/SM yapped yapping yard/MS yardage/MS yardarm/MS yardman/M yardmaster/SM yardmen yardstick/MS yarmulke/SM yarn/MS yarrow/M yashmak/S yaw/SGMD yawl/MS yawn/MDRSZG yawner/M yawning/Y yaws/M yd ye/RST yea/SM yeah/M yeahs year/MYS yearbook/MS yearling/MS yearlong yearly/SM yearn/GSJD yearning/MY yeast/SM yeasty/RT yegg/MS yell/MDSG yellow/MDRTGPS yellowhammer/S yellowish yellowness/M yellowy yelp/MDSG yen/SM yeoman/M yeomanry/M yeomen yep/SM yes/MS yeshiva/SM yessed yessing yesterday/MS yesteryear/M yet yeti/MS yew/SM yid/S yield/JSGMD yikes yin/M yip/SM yipe yipped yippee yipping yo yob/S yobbo/S yodel/SMDRZG yodeler/M yoga/M yogi/MS yogic yogurt/SM yoke's yoke/UGDS yokel/SM yolk/MDS yon yonder yonks yore/M york/RZ you'd you'll you're you've you/SMH young/TMR youngish youngster/MS your/S yourself yourselves youth/M youthful/YP youthfulness/M youths yow yowl/MDSG yr/S ytterbium/M yttrium/M yuan/M yucca/SM yuck/MDSG yucky/TR yuk/SM yukked yukking yukky yule/M yuletide/M yum yummy/TR yup/SM yuppie/MS yuppify/GDS yurt/MS z/DNXTGJ zaniness/M zany/RSMPT zap/SM zapped zapper/MS zapping zappy zeal/M zealot/MS zealotry/M zealous/YP zealousness/M zebra/SM zebu/MS zed/SM zeitgeist/SM zenith/M zeniths zenned zenning zeolites zephyr/MS zeppelin/MS zero/MDHSG zeroes zest/MS zestful/YP zestfulness/M zesty/RT zeta/MS zeugma zigamorph zigamorphs zigzag/SM zigzagged zigzagging zilch/M zillion/MS zinc/MS zincked zincking zine/S zinfandel/M zing/MDRZG zinger/M zingy/RT zinnia/MS zip's zip/US zipped/U zipper/MDGS zipping/U zippy/TR zircon/MS zirconium/M zit/SM zither/MS zloty/SM zodiac/MS zodiacal zombie/MS zonal/Y zone's zone/AGDS zoning/M zonked zoo/SM zookeeper/SM zoological/Y zoologist/SM zoology/M zoom/MDSG zoophyte/SM zoophytic zorch/GDS zounds zucchini/MS zugzwang zwieback/M zydeco/M zygote/SM zygotic zymurgy/M robojournal-0.4.2/core/0000775000175000017500000000000012214707560013507 5ustar willwillrobojournal-0.4.2/core/settingsmanager.cpp0000644000175000017500000006345712214706512017417 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "core/settingsmanager.h" #include "core/buffer.h" #include #include #include #include #include #include #include #include "ui/firstrun.h" #include "ui_firstrun.h" #include #include #include #include "ui/newconfig.h" /* This class is meant to be a full *replacement* of the ConfigManager class from RoboJournal 0.1-0.3. * Once SettingManager has been fully implemented, ConfigManager is to be deprecated and removed * from the source package. (deprecation completed by 2/26/13) */ SettingsManager::SettingsManager(){} //################################################################################################### // Saves the current splitter position from the MainWindow. This allows someone to customize it once // and have it stay that way. This should only be called when the mainwindow closes. // New feature for 0.5-- Will Kraft, 6/21/13. Backported to 0.4.2 (9/13/13). void SettingsManager::SaveSplitterPos(QByteArray value){ QString config_path=QDir::homePath()+ QDir::separator() + ".robojournal"+ QDir::separator() + "robojournal.ini"; QSettings settings(config_path,QSettings::IniFormat); settings.beginGroup("Behavior"); settings.setValue("mw_splitter_position", value); settings.endGroup(); } //################################################################################################### // Save the behavior if the user opts to disable the tagging nag screen. This function should NOT // be called from the preferences window! New for 0.4.1; 2/26/13 void SettingsManager::SaveNagPreferences(){ QString config_path=QDir::homePath()+ QDir::separator() + ".robojournal"+ QDir::separator() + "robojournal.ini"; QSettings settings(config_path,QSettings::IniFormat); settings.beginGroup("Behavior"); settings.setValue("show_untagged_reminder", Buffer::show_reminder_next_time); settings.endGroup(); // Save and Reload Config after making changes settings.sync(); LoadConfig(); } //################################################################################################### // Why not remember the size of the Preferences window too? I get tired of scrolling. New for 0.4. void SettingsManager::SavePreviewSize(QSize geo){ QString config_path=QDir::homePath()+ QDir::separator() + ".robojournal"+ QDir::separator() + "robojournal.ini"; QSettings settings(config_path,QSettings::IniFormat); settings.beginGroup("Appearance"); settings.setValue("preview_size", geo); settings.endGroup(); } //################################################################################################### // Why not remember the size of the Preferences window too? I get tired of scrolling. New for 0.4. void SettingsManager::SaveConfigSize(QSize geo){ QString config_path=QDir::homePath()+ QDir::separator() + ".robojournal"+ QDir::separator() + "robojournal.ini"; QSettings settings(config_path,QSettings::IniFormat); settings.beginGroup("Appearance"); settings.setValue("config_size", geo); settings.endGroup(); } //################################################################################################### // Now that the Editor is resizable, remember editor's size for the future in case the user changed it. // This code gets called right before the current Editor object gets destroyed. New for 0.4. void SettingsManager::SaveEditorSize(QSize geo){ QString config_path=QDir::homePath()+ QDir::separator() + ".robojournal"+ QDir::separator() + "robojournal.ini"; QSettings settings(config_path,QSettings::IniFormat); settings.beginGroup("Appearance"); settings.setValue("editor_size", geo); settings.endGroup(); //settings.sync(); // LoadConfig(); } //################################################################################################### // Just like SaveEditorsize, this remembers the current size of MainWindow. // This code gets called right before the current MainWindow object gets destroyed. New for 0.4. void SettingsManager::SaveMainWindowSize(QByteArray geo){ QString config_path=QDir::homePath()+ QDir::separator() + ".robojournal"+ QDir::separator() + "robojournal.ini"; QSettings settings(config_path,QSettings::IniFormat); settings.beginGroup("Appearance"); settings.setValue("mainwindow_size", geo); settings.endGroup(); settings.sync(); } //################################################################################################### // install dictionaries to ~/.robojournal folder if necessary. This function makes sure the dictionaries // are available and reinstalls them if necessary. New for 0.4. void SettingsManager::InstallDictionaries(){ using namespace std; QString path= QDir::homePath() + QDir::separator() + ".robojournal" + QDir::separator(); QFile EN_dict(path + "en_US.dic"); QFile EN_dict_aff(path + "en_US.aff"); if((!EN_dict.exists()) || (!EN_dict_aff.exists())){ //qt_ntfs_permission_lookup++; QFile d1(":/en_US.dic"); d1.copy(":/en_US.dic", path + "en_US.dic"); QFile d2(":/en_US.aff"); d2.copy(":/en_US.aff", path + "en_US.aff"); cout << "OUTPUT: Reinstalled (English US) dictionaries to" << path.toStdString() << endl; //qt_ntfs_permission_lookup--; } else{ cout << "OUTPUT: Found default (English US) dictionary at" << path.toStdString() << endl; if((!EN_dict.isWritable()) || (!EN_dict_aff.isWritable())){ cout << "OUTPUT: Making sure the dictionary is writable........"; EN_dict.setPermissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ReadGroup | QFile::ReadOther); EN_dict_aff.setPermissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ReadGroup | QFile::ReadOther); cout << "DONE!" << endl; } else{ cout << "OUTPUT: Dictionary is properly writable. Proceeding with startup." << endl; } } } //################################################################################################### // Get the user's full name QString SettingsManager::FullName(){ using namespace std; QString name = QInputDialog::getText(NULL, "RoboJournal", "Please enter your full name (as you would like it to be shown):", QLineEdit::Normal); //cout << "Name: " << name.toStdString() << endl; return name; } //################################################################################################### // new gender check for 0.4 bool SettingsManager::GenderCheck(){ using namespace std; QMessageBox m; m.setText("Please select your gender:"); m.setWindowTitle("RoboJournal"); m.setIcon(QMessageBox::Question); QPushButton *male=m.addButton("Male",QMessageBox::AcceptRole); QPushButton *female=m.addButton("Female",QMessageBox::AcceptRole); m.setStandardButtons(NULL); m.exec(); bool isMale; if(m.clickedButton() == male){ //cout << "User chose male" << endl; isMale=true; } if(m.clickedButton() == female){ //cout << "User chose female" << endl; isMale=false; } return isMale; } //################################################################################## // Create a new config with some default values plus others from the JournalCreator // or JournalSelector classes. void SettingsManager::NewConfig(QString host, QString db_name, QString port, QString newuser){ using namespace std; QString name; bool isMale; // only show name/gender check if the app is in firstrun mode. Otherwise, use existing values in buffer. if(Buffer::firstrun){ name=FullName(); isMale=GenderCheck(); } else{ name=Buffer::full_name; isMale=Buffer::is_male; } QCoreApplication::setOrganizationName("Will Kraft"); QCoreApplication::setApplicationName("robojournal"); QString config_path=QDir::homePath()+ QDir::separator() + ".robojournal"+ QDir::separator() + "robojournal.ini"; QSettings settings(config_path,QSettings::IniFormat); QString folderpath=QDir::homePath()+ QDir::separator() + ".robojournal"+ QDir::separator(); settings.beginGroup("Backend"); settings.setValue("default_host", host.trimmed()); settings.setValue("default_db", db_name.trimmed()); settings.setValue("default_user", newuser.trimmed()); settings.setValue("db_type", "MySQL"); settings.setValue("port", port); settings.setValue("entry_range", 4); settings.endGroup(); settings.beginGroup("Behavior"); settings.setValue("toolbar_location", 1); settings.setValue("allow_root_login", false); settings.setValue("show_all_entries", true); settings.setValue("always_use_defaults", true); settings.setValue("show_warnings", true); settings.setValue("sort_by_day", false); settings.setValue("alternate_colors", true); settings.setValue("use_time", true); settings.setValue("show_title", true); settings.setValue("use_24_hour_clock", false); settings.setValue("set_date_format", 1); settings.setValue("enable_rich_text", false); settings.setValue("use_dow", true); if((!Buffer::show_icon_labels) && (!Buffer::firstrun)){ settings.setValue("enable_toolbar_button_text", false); } else{ settings.setValue("enable_toolbar_button_text", true); } settings.setValue("autoload_recent_entry", true); settings.setValue("ssl_support", false); settings.setValue("display_year_indicator", false); settings.setValue("use_highlights", true); settings.setValue("trim_whitespace", true); settings.setValue("smart_quotes", true); settings.setValue("html_hyphens", true); settings.setValue("use_spellcheck", false); settings.setValue("default_show_errors", false); // Bugfix: Keep dictionary and AFF blank in new configurations. settings.setValue("spellcheck_dictionary", ""); settings.setValue("spellcheck_dictionary_aff", ""); settings.setValue("misc_processing",true); settings.setValue("name_in_titlebar", true); settings.setValue("show_untagged_reminder", true); settings.endGroup(); settings.beginGroup("Appearance"); settings.setValue("background_image", ""); settings.setValue("use_background", false); settings.setValue("use_theme", false); settings.setValue("use_theme_editor",false); settings.setValue("tile_background", true); settings.setValue("background_tree", false); settings.setValue("background_fixed", true); settings.setValue("font_color", "#000000"); settings.setValue("font_face", ""); settings.setValue("font_size", 16); settings.setValue("datebox_override", false); settings.setValue("highlight_color", 0); settings.setValue("entry_node_icon", 0); settings.endGroup(); settings.beginGroup("Export"); settings.setValue("rounded_corners", true); settings.setValue("system_colors", false); settings.setValue("include_tags", true); settings.setValue("header_font", "Verdana"); settings.setValue("body_font", "Times New Roman"); settings.setValue("header_use_em", true); settings.setValue("body_use_em", true); settings.setValue("header_font_size", 3); settings.setValue("body_font_size", 1.2); settings.endGroup(); settings.beginGroup("User"); settings.setValue("user_gender_male", isMale); settings.setValue("user_full_name", name.trimmed()); // bugfix 12/8/12: Do not set full name to true if no name was given. if(name.isEmpty()){ settings.setValue("use_full_name", false); } else{ settings.setValue("use_full_name", true); } settings.endGroup(); // Save the settings settings.sync(); // Clear Firstrun flag Buffer::firstrun=false; // Bugfix 12/8/12: // Install dictionaries now so they are available immediately after firstrun is finished. InstallDictionaries(); // Firstrun is now finished, allow the program to load normally by reading new config. LoadConfig(); } //################################################################################## void SettingsManager::LoadConfig(){ using namespace std; bool reload=false; QString config_path=QDir::homePath()+ QDir::separator() + ".robojournal"+ QDir::separator() + "robojournal.ini"; // construct a file object where the config file is supposed to be. QFile config(config_path); cout << "OUTPUT: Searching for config file..." << endl; // if config file exists, read its contents if(config.exists()){ #ifdef _WIN32 // Use backslashes to separate dirs on Windows. config_path=config_path.replace("/","\\"); #endif cout << "OUTPUT: Config file found: "<< config_path.toStdString() << endl; QSettings settings(config_path,QSettings::IniFormat); cout << "OUTPUT: Buffering data from config file..."; Buffer::toolbar_pos = settings.value("Behavior/toolbar_location").toInt(); Buffer::allowroot = settings.value("Behavior/allow_root_login").toBool(); Buffer::allentries = settings.value("Behavior/show_all_entries").toBool(); Buffer::alwaysusedefaults = settings.value("Behavior/always_use_defaults").toBool(); Buffer::backend = settings.value("Backend/db_type").toString(); Buffer::showwarnings = settings.value("Behavior/show_warnings").toBool(); Buffer::entryrange = settings.value("Backend/entry_range").toInt(); Buffer::defaulthost = settings.value("Backend/default_host").toString(); Buffer::defaultdatabase = settings.value("Backend/default_db").toString(); Buffer::defaultuser = settings.value("Backend/default_user").toString(); Buffer::databaseport = settings.value("Backend/port").toInt(); Buffer::sortbyday = settings.value("Behavior/sort_by_day").toBool(); Buffer::alternate_rows = settings.value("Behavior/alternate_colors").toBool(); Buffer::use_background = settings.value("Appearance/use_background").toBool(); Buffer::use_custom_theme = settings.value("Appearance/use_theme").toBool(); Buffer::tile_bg = settings.value("Appearance/tile_background").toBool(); Buffer::set_tree_background = settings.value("Appearance/background_tree").toBool(); Buffer::text_hexcolor = settings.value("Appearance/font_color").toString(); Buffer::font_face = settings.value("Appearance/font_face").toString(); Buffer::entry_node_icon = settings.value("Appearance/entry_node_icon").toInt(); Buffer::show_spell_errors_by_default = settings.value("Behavior/default_show_errors").toBool(); Buffer::editor_geometry=settings.value("Appearance/editor_size").toSize(); if(Buffer::editor_geometry.isEmpty()){ QSize *y=new QSize(640,480); Buffer::editor_geometry=*y; settings.beginGroup("Appearance"); settings.setValue("editor_size", *y); settings.endGroup(); reload=true; } Buffer::config_geometry=settings.value("Appearance/config_size").toSize(); if(Buffer::config_geometry.isEmpty()){ QSize *s=new QSize(575,525); Buffer::config_geometry=*s; settings.beginGroup("Appearance"); settings.setValue("config_size", *s); settings.endGroup(); reload=true; } Buffer::preview_geometry=settings.value("Appearance/preview_size").toSize(); Buffer::mainwindow_geometry=settings.value("Appearance/mainwindow_size").toByteArray(); Buffer::use_spellcheck = settings.value("Behavior/use_spellcheck").toBool(); Buffer::current_dictionary= settings.value("Behavior/spellcheck_dictionary").toString(); Buffer::current_dictionary_aff = settings.value("Behavior/spellcheck_dictionary_aff").toString(); int font_value=settings.value("Appearance/font_size").toInt(); switch(font_value){ case 0: Buffer::font_size="8"; break; case 1: Buffer::font_size="9"; break; case 2: Buffer::font_size="10"; break; case 3: Buffer::font_size="11"; break; case 4: Buffer::font_size="12"; break; case 5: Buffer::font_size="14"; break; case 6: Buffer::font_size="16"; break; case 7: Buffer::font_size="18"; break; case 8: Buffer::font_size="20"; break; case 9: Buffer::font_size="22"; break; case 10: Buffer::font_size="24"; break; case 11: Buffer::font_size="26"; break; } Buffer::keep_time = settings.value("Behavior/use_time").toBool(); Buffer::show_title = settings.value("Behavior/show_title").toBool(); Buffer::use_24_hour = settings.value("Behavior/use_24_hour_clock").toBool(); Buffer::date_format = settings.value("Behavior/set_date_format").toInt(); Buffer::background_image = settings.value("Appearance/background_image").toString(); Buffer::show_icon_labels = settings.value("Behavior/enable_toolbar_button_text").toBool(); Buffer::autoload = settings.value("Behavior/autoload_recent_entry").toBool(); Buffer::SSL = settings.value("Behavior/ssl_support").toBool(); Buffer::use_indicator = settings.value("Behavior/display_year_indicator").toBool(); Buffer::is_male = settings.value("User/user_gender_male").toBool(); Buffer::full_name = settings.value("User/user_full_name").toString(); Buffer::use_full_name= settings.value("User/use_full_name").toBool(); // 0.4 specific Buffer::use_rounded_corners = settings.value("Export/rounded_corners").toBool(); Buffer::use_system_colors = settings.value("Export/system_colors").toBool(); Buffer::include_tags_in_export = settings.value("Export/include_tags").toBool(); Buffer::header_font = settings.value("Export/header_font").toString(); Buffer::body_font = settings.value("Export/body_font").toString(); Buffer::header_use_em = settings.value("Export/header_use_em").toBool(); Buffer::body_use_em = settings.value("Export/body_use_em").toBool(); Buffer::header_font_size = settings.value("Export/header_font_size").toString(); Buffer::body_font_size = settings.value("Export/body_font_size").toString(); Buffer::highlight_color = settings.value("Appearance/highlight_color").toInt(); Buffer::bg_is_fixed = settings.value("Behavior/background_fixed").toBool(); Buffer::use_highlight = settings.value("Behavior/use_highlights").toBool(); Buffer::trim_whitespace = settings.value("Behavior/trim_whitespace").toBool(); Buffer::use_smart_quotes = settings.value("Behavior/smart_quotes").toBool(); Buffer::use_html_hyphens = settings.value("Behavior/html_hyphens").toBool(); Buffer::datebox_override = settings.value("Appearance/datebox_override").toBool(); Buffer::use_custom_theme_editor=settings.value("Appearance/use_theme_editor").toBool(); Buffer::use_dow=settings.value("Behavior/use_dow").toBool(); Buffer::use_misc_processing=settings.value("Behavior/misc_processing").toBool(); // 0.4.1 specific Buffer::name_in_titlebar=settings.value("Behavior/name_in_titlebar").toBool(); Buffer::show_untagged_reminder=settings.value("Behavior/show_untagged_reminder").toBool(); // 0.4.2 ( backported to 0.4.2 on 9/13/13) Buffer::mw_splitter_size=settings.value("Behavior/mw_splitter_position").toByteArray(); // added 6/21/13 if(reload){ LoadConfig(); } cout << "Done!" << endl; cout << "OUTPUT: Stage 1 completed, proceeding to Stage 2..." << endl; } // if config doesn't exist, rebuild it. else{ cout << "WARNING: Config file does not exist! Starting first run mode..." << endl; // give the journal creator a way to know its the first run Buffer::firstrun=true; // Launch the firstrun tool FirstRun f; f.exec(); } } //################################################################################## // Update the settings with data from the Newconfig class void SettingsManager::UpdateConfig(){ QString config_path=QDir::homePath()+ QDir::separator() + ".robojournal"+ QDir::separator() + "robojournal.ini"; QSettings settings(config_path,QSettings::IniFormat); settings.clear(); // sort new data into groups and add it, this is much better than the old way. settings.beginGroup("Backend"); settings.setValue("default_host", Newconfig::new_default_host.trimmed()); settings.setValue("default_db", Newconfig::new_default_db.trimmed()); settings.setValue("default_user", Newconfig::new_default_user.trimmed()); settings.setValue("db_type", Newconfig::new_dbtype.trimmed()); settings.setValue("port", Newconfig::new_default_port.trimmed()); settings.setValue("entry_range", Newconfig::new_entry_range); settings.endGroup(); settings.beginGroup("Behavior"); settings.setValue("toolbar_location", Newconfig::new_toolbar_pos); settings.setValue("allow_root_login", Newconfig::new_allow_root); settings.setValue("show_all_entries", Newconfig::new_show_all_entries); settings.setValue("always_use_defaults", Newconfig::new_always_use_defaults); settings.setValue("show_warnings", Newconfig::new_show_confirm); settings.setValue("sort_by_day", Newconfig::new_sort_by_day); settings.setValue("alternate_colors", Newconfig::new_alternate_rows); settings.setValue("use_time", Newconfig::new_record_time); settings.setValue("show_title", Newconfig::new_show_title); settings.setValue("use_24_hour_clock", Newconfig::new_24_hr); settings.setValue("set_date_format", Newconfig::new_date_mode); settings.setValue("enable_rich_text", Newconfig::new_rich_text); settings.setValue("use_dow", Newconfig::new_use_dow); settings.setValue("enable_toolbar_button_text", Newconfig::new_icon_labels); settings.setValue("autoload_recent_entry", Newconfig::new_autoload); settings.setValue("ssl_support", Newconfig::new_SSL); settings.setValue("display_year_indicator", Newconfig::new_indicator); settings.setValue("use_highlights", Newconfig::new_use_highlights); settings.setValue("trim_whitespace", Newconfig::new_trim_whitespace); settings.setValue("smart_quotes", Newconfig::new_use_smart_quotes); settings.setValue("html_hyphens", Newconfig::new_use_html_hyphens); settings.setValue("use_spellcheck", Newconfig::new_use_spellcheck); settings.setValue("default_show_errors", Newconfig::new_show_spell_errors_by_default); settings.setValue("spellcheck_dictionary", Newconfig::new_current_dictionary); settings.setValue("spellcheck_dictionary_aff",Newconfig::new_current_dictionary_aff); settings.setValue("misc_processing",Newconfig::new_use_misc_processing); settings.setValue("name_in_titlebar", Newconfig::new_name_in_titlebar); settings.setValue("show_untagged_reminder", Newconfig::new_show_untagged_reminder); settings.endGroup(); settings.beginGroup("Appearance"); settings.setValue("background_image", Newconfig::new_background_image); settings.setValue("use_background", Newconfig::new_use_background); settings.setValue("use_theme", Newconfig::new_use_custom_theme); settings.setValue("use_theme_editor", Newconfig::new_use_custom_theme_editor); settings.setValue("tile_background", Newconfig::new_tile_bg); settings.setValue("background_tree", Newconfig::new_use_background_in_tree); settings.setValue("font_color", Newconfig::new_text_hexcolor); settings.setValue("font_face", Newconfig::new_font_face); settings.setValue("font_size", Newconfig::new_font_size); settings.setValue("datebox_override", Newconfig::new_datebox_override); settings.setValue("highlight_color", Newconfig::new_highlight_color); settings.setValue("entry_node_icon", Newconfig::new_entry_node_icon); settings.endGroup(); settings.beginGroup("Export"); settings.setValue("rounded_corners", Newconfig::new_use_rounded_corners); settings.setValue("system_colors", Newconfig::new_use_system_colors); settings.setValue("include_tags", Newconfig::new_include_tags_in_export); settings.setValue("header_font", Newconfig::new_header_font); settings.setValue("body_font", Newconfig::new_body_font); settings.setValue("header_use_em", Newconfig::new_header_use_em); settings.setValue("body_use_em", Newconfig::new_body_use_em); settings.setValue("header_font_size", Newconfig::new_header_font_size); settings.setValue("body_font_size", Newconfig::new_body_font_size); settings.endGroup(); settings.beginGroup("User"); settings.setValue("user_gender_male", Newconfig::new_gender_is_male); settings.setValue("user_full_name", Newconfig::new_full_name); settings.setValue("use_full_name", Newconfig::new_use_full_name); settings.endGroup(); // save the settings settings.sync(); } robojournal-0.4.2/core/buffer.cpp0000644000175000017500000001111612214707560015462 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "core/buffer.h" #include // Static variable declaration QString Buffer::defaulthost; QString Buffer::defaultuser; QString Buffer::defaultdatabase; int Buffer::databaseport; int Buffer::entryrange; QString Buffer::backend; int Buffer::toolbar_pos; bool Buffer::alwaysusedefaults; bool Buffer::allowroot; bool Buffer::allentries; bool Buffer::showwarnings; bool Buffer::sortbyday; bool Buffer::firstrun; bool Buffer::alternate_rows; bool Buffer::rich_text; bool Buffer::use_custom_theme; bool Buffer::use_24_hour; bool Buffer::use_background; bool Buffer::use_system_time; bool Buffer::tile_bg; bool Buffer::set_tree_background; bool Buffer::show_icon_labels; bool Buffer::autoload; bool Buffer::SSL; bool Buffer::use_indicator; bool Buffer::login_succeeded; bool Buffer::is_male; bool Buffer::datebox_override; QString Buffer::username; QString Buffer::password; QString Buffer::host; QString Buffer::database_name; QString Buffer::background_image; QString Buffer::font_size; QString Buffer::text_hexcolor; QString Buffer::font_face; bool Buffer::keep_time; bool Buffer::show_title; int Buffer::date_format; QString Buffer::full_name; bool Buffer::needs_upgrade; // if true, journal needs to be upgraded from 0.1 bool Buffer::editmode; //if true, start the Editor in revision mode. If False, create a blank entry QString Buffer::editentry; // the entry id that needs to be edited // Current RoboJournal Version used globally in Program. QString Buffer::version="0.4.2"; // new for 0.4 bool Buffer::use_full_name; bool Buffer::use_highlight; bool Buffer::trim_whitespace; bool Buffer::use_smart_quotes; bool Buffer::use_html_hyphens; bool Buffer::bg_is_fixed; bool Buffer::use_rounded_corners; bool Buffer::use_system_colors; bool Buffer::include_tags_in_export; QString Buffer::header_font; QString Buffer::body_font; bool Buffer::header_use_em; bool Buffer::body_use_em; QString Buffer::header_font_size; QString Buffer::body_font_size; int Buffer::highlight_color; bool Buffer::use_dow; // display date of week QString Buffer::EntryText; QString Buffer::SearchText; int Buffer::entry_scroll_pos; int Buffer::search_scroll_pos; bool Buffer::On_Search; QString Buffer::LastSearchTerm; bool Buffer::use_custom_theme_editor; bool Buffer::show_spell_errors_by_default; bool Buffer::latest_enabled; bool Buffer::previous_enabled; bool Buffer::next_enabled; bool Buffer::write_enabled; bool Buffer::edit_enabled; bool Buffer::export_enabled; bool Buffer::tag_enabled; bool Buffer::delete_enabled; bool Buffer::disconnect_enabled; bool Buffer::use_misc_processing; bool Buffer::use_spellcheck; QString Buffer::current_dictionary; QString Buffer::current_dictionary_aff; // These settings control the STORED STATIC sizes of resizable classes from last session. // These are meant to be read and never changed. QSize Buffer::editor_geometry; QSize Buffer::config_geometry; QSize Buffer::preview_geometry; QByteArray Buffer::mainwindow_geometry; // These settings control the DYNAMIC sizes of resizable classes SET DURING CURRENT RUNTIME. // These values are updated whenever the size of the corresponding window gets changed. These size values (if !null) // become the static sizes the next time the program runs. Yes, it's complicated. QSize Buffer::editor_temporarysize; QSize Buffer::config_temporarysize; bool Buffer::config_sizechanged=false; bool Buffer::editor_sizechanged=false; bool Buffer::updating_dictionary; int Buffer::entry_node_icon; // new for 0.4.1 bool Buffer::name_in_titlebar; bool Buffer::show_untagged_reminder; // settings for tagger and tagger reminder window QList Buffer::records; QString Buffer::reminder_choice; QString Buffer::reminder_title; bool Buffer::show_reminder_next_time; // new for 0.4.2 QByteArray Buffer::mw_splitter_size; // former 0.5 code but backported on 9/13/13. Buffer::Buffer() { } void Buffer::OutputBuffer(){ } robojournal-0.4.2/core/buffer.h0000644000175000017500000001367012214707104015130 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef BUFFER_H #define BUFFER_H #include #include #include class Buffer { public: Buffer(); void OutputBuffer(); static QString host; static QString database_name; static QString username; static QString password; static bool login_succeeded; // did the login attempt work? static QString defaulthost; // default host static QString defaultuser; // default user static QString defaultdatabase; // default db static QString backend; // database backend var static int databaseport; // database port to use for connections static int entryrange; // number of years to show, only used if allentries==false static QString full_name; // ful lname of the user. (new for 0.4) static int toolbar_pos; // Toolbar position... 0=left; 1=top; 2=right static bool alwaysusedefaults; // always use default values if true static bool allowroot; // allow root logins if true static bool allentries; // show all entries if true static bool showwarnings; // show warning dialogs if true static bool sortbyday; // sort list entires by day if true, by month if false static bool SSL; // use SSL encryption static bool use_indicator; // show entry indicator static bool needs_upgrade; static bool is_male; // Gender flag static bool firstrun; // decide if the program is firstrun or not static bool alternate_rows; //whether to show alternate row colors static bool rich_text; // whether to support rich text static bool use_background; // whether to support a background image static bool datebox_override; // use system colors if custom theme is active. static bool keep_time; // keep entry time static bool use_system_time; // use system time if true, use remote server time if false static bool use_24_hour; // use 24 hour clock static bool autoload; // autoload most recent journal entry static bool show_icon_labels; // should toolbar icons have text labels? checked == yes, unchecked == no // date format: 0=International, 1=USA, 2=Japan static int date_format; // theme options; if true, use custom colors, if false use system theme static bool use_custom_theme; static bool use_custom_theme_editor; static bool tile_bg; // tile background if true static bool set_tree_background; // use background_image on entry tree if true; static QString text_hexcolor; // font color in hex format (#FFFFFF) static QString background_image; // path to background image on disk static bool show_title; // whether to show title for entries static QString font_face; // name of font to use in entries static QString font_size; //point size of font to use static bool editmode; // Start Editor in Edit Mode if true static QString editentry; // store entry id to be edited static QString version; // keep track of RoboJournal Version; // new for 0.4 static bool use_full_name; static bool use_highlight; static bool trim_whitespace; static bool use_smart_quotes; static bool use_html_hyphens; static bool bg_is_fixed; static bool use_rounded_corners; static bool use_system_colors; static bool include_tags_in_export; static QString header_font; static QString body_font; static bool header_use_em; static bool body_use_em; static QString header_font_size; static QString body_font_size; static int highlight_color; static bool show_spell_errors_by_default; static bool use_spellcheck; static QString current_dictionary; static QString current_dictionary_aff; static bool use_dow; static QSize editor_geometry; static QSize config_geometry; static QSize preview_geometry; static QByteArray mainwindow_geometry; static bool use_misc_processing; //Buffers for output pane static QString LastSearchTerm; static QString EntryText; static QString SearchText; static int entry_scroll_pos; static int search_scroll_pos; static bool On_Search; // returns true if the search tab is active /* Remember if toolbar widgets were enabled. This is required for switching between search mode and entry mode. */ static bool write_enabled; static bool edit_enabled; static bool tag_enabled; static bool delete_enabled; static bool export_enabled; static bool disconnect_enabled; static bool latest_enabled; static bool previous_enabled; static bool next_enabled; static QSize editor_temporarysize; static QSize config_temporarysize; static bool editor_sizechanged; static bool config_sizechanged; static bool updating_dictionary; // not used! static int entry_node_icon; // new for 0.4.1 static bool name_in_titlebar; static bool show_untagged_reminder; static QString reminder_choice; //id number used for tagger in reminder mode static QString reminder_title; // title used for current entry (shown in tagger titlebar) static QList records; static bool show_reminder_next_time; // save value of the checkbox on the Tag Reminder Window. // new for 0.4.2 static QByteArray mw_splitter_size; }; #endif // BUFFER_H robojournal-0.4.2/core/settingsmanager.h0000644000175000017500000000124012214706562017047 0ustar willwill#ifndef SETTINGSMANAGER_H #define SETTINGSMANAGER_H #include class SettingsManager { public: SettingsManager(); void LoadConfig(); void UpdateConfig(); void NewConfig(QString host,QString db_name, QString port, QString newuser); QString FullName(); bool GenderCheck(); void InstallDictionaries(); void SaveEditorSize(QSize geo); void SaveConfigSize(QSize geo); void SavePreviewSize(QSize geo); void SaveMainWindowSize(QByteArray geo); void SaveNagPreferences(); void SaveSplitterPos(QByteArray value); private: //extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; }; #endif // SETTINGSMANAGER_H robojournal-0.4.2/ui/0000775000175000017500000000000012215133056013166 5ustar willwillrobojournal-0.4.2/ui/mainwindow.ui0000775000175000017500000010566612214754041015724 0ustar willwill MainWindow 0 0 734 551 RoboJournal 0.1 :/icons/robojournal.ico:/icons/robojournal.ico 0 0 0 0 Previous Entry Previous :/icons/resultset_first.png:/icons/resultset_first.png Qt::ToolButtonTextBesideIcon Next Entry Next :/icons/resultset_last.png:/icons/resultset_last.png Qt::ToolButtonTextBesideIcon RoboJournal Preferences Preferences :/icons/wrench.png:/icons/wrench.png Qt::ToolButtonTextBesideIcon Modify Entry Modify Entry :/icons/modify2.png:/icons/modify2.png Qt::ToolButtonTextBesideIcon Disconnect Disconnect :/icons/disconnect.png:/icons/disconnect.png Qt::ToolButtonTextBesideIcon Manage Tags Manage Tags :/icons/tag_orange.png:/icons/tag_orange.png Qt::ToolButtonTextBesideIcon Connect Connect :/icons/connect.png:/icons/connect.png Qt::ToolButtonTextBesideIcon Write in Journal Write in Journal :/icons/write2.png:/icons/write2.png Qt::ToolButtonTextBesideIcon Latest Latest :/icons/latest.png:/icons/latest.png Qt::ToolButtonTextBesideIcon Delete Entry Delete Entry :/icons/bin.png:/icons/bin.png Qt::ToolButtonTextBesideIcon Export Content Export Content :/icons/external.png:/icons/external.png Qt::ToolButtonTextBesideIcon 0 0 Qt::Horizontal QTabWidget::South QTabWidget::Rounded 0 true :/icons/document-tree.png:/icons/document-tree.png &Entries 0 0 0 0 Qt::ScrollBarAsNeeded QAbstractItemView::NoEditTriggers false true true true true 2 false true 300 false 3 false true Journal entries Entry name sorted by year, month, and day. Entry ID This is the row number in the database that the entry corresponds to. :/icons/binocular.png:/icons/binocular.png &Search Term Click to run a search with the current parameters. Search :/icons/binocular.png:/icons/binocular.png 0 Search by Tag Pattern Match: Title Only Pattern Match: Body Only Pattern Match: Title + Body <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Click to clear everything (search term, results list, and the entry currently being viewed).</span></p></body></html> Clear All Search for &whole words Selected Tag: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-weight:600;">Search</span> to display all entries marked with the currently-selected tag.</p></body></html> Qt::Vertical QSizePolicy::Fixed 20 6 Qt::Horizontal false false true false true true false false Entry Date Hits id 0 results Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Verdana 14 Test true User: None Status message Qt::Vertical QSizePolicy::Fixed 20 4 Entries: 0 0 0 734 25 File Edit Help Window Show Toolbar position Database Journal Qt::PreventContextMenu Main Toolbar Qt::LeftToRight Qt::LeftToolBarArea|Qt::RightToolBarArea|Qt::TopToolBarArea 16 16 Qt::ToolButtonTextBesideIcon false LeftToolBarArea false :/icons/write2.png:/icons/write2.png Write in Journal F4 true Preferences QAction::ApplicationSpecificRole true Main Toolbar QAction::NoRole true :/icons/cut.png:/icons/cut.png Cut true :/icons/copy.gif:/icons/copy.gif Copy true :/icons/action_paste.gif:/icons/action_paste.gif Paste true Select All :/icons/wrench.png:/icons/wrench.png Preferences true :/icons/connect.png:/icons/connect.png Connect F2 :/icons/disconnect.png:/icons/disconnect.png Disconnect F3 :/icons/tag_orange.png:/icons/tag_orange.png Manage Tags :/icons/bin.png:/icons/bin.png Delete Entry Del true :/icons/modify2.png:/icons/modify2.png Modify Entry F5 true Keyword Search F8 Documentation F1 About RoboJournal true true Main toolbar Left false Top (default) false false Right false true true Toolbar Quit Esc :/icons/latest.png:/icons/latest.png Latest Entry F7 true :/icons/resultset_first.png:/icons/resultset_first.png Previous Entry Left true :/icons/resultset_last.png:/icons/resultset_last.png Next Entry Right true :/icons/wand.png:/icons/wand.png Setup Wizard true :/icons/printer.png:/icons/printer.png Print Ctrl+P true :/icons/disk.png:/icons/disk.png Export Entry Save current entry :/icons/tag_orange.png:/icons/tag_orange.png Manage Tags F6 true :/icons/database_add.png:/icons/database_add.png Journal Creator Create a new (blank) journal true :/icons/book.png:/icons/book.png Journal Selector true :/icons/external.png:/icons/external.png Export Content Export content from your journal to a HTML or text file Ctrl+S true true :/icons/application_side_expand.png :/icons/application_side_contract.png:/icons/application_side_expand.png Entry List F11 New Preferences robojournal-0.4.2/ui/SpellTextEdit.h0000775000175000017500000000350512142060704016075 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA Will Kraft (11/27/12): This code was originally Jan Sundermeyer's work (sunderme@web.de). I made some minor changes and adapted it for RoboJournal >= 0.4. RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef SPELLTEXTEDIT_H_ #define SPELLTEXTEDIT_H_ #include #include #include #include "ui/hunspell/hunspell.hxx" #include "ui/highlighter.h" class SpellTextEdit : public QTextEdit { Q_OBJECT public: SpellTextEdit(QWidget *parent = 0,QString SpellDic=""); ~SpellTextEdit(); QStringList getWordPropositions(const QString word); bool setDict(const QString SpellDic); signals: void addWord(QString word); protected: void createActions(); void contextMenuEvent(QContextMenuEvent *event); private slots: void correctWord(); void slot_addWord(); void slot_ignoreWord(); private: enum { MaxWords = 8 }; QAction *misspelledWordsActs[MaxWords]; QString spell_dic; Hunspell *pChecker; QPoint lastPos; QStringList addedWords; }; #endif /*SPELLTEXTEDIT_H_*/ robojournal-0.4.2/ui/aboutrj.ui0000775000175000017500000025645712157657524015241 0ustar willwill AboutRJ 0 0 395 491 Dialog :/icons/robojournal-icon.png:/icons/robojournal-icon.png :/icons/robojournal.png Qt::Vertical QSizePolicy::Fixed 20 6 0 About RoboJournal Program Information Copyright © 2012, 2013 by Will Kraft. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.sourceforge.net/projects/robojournal"><span style=" text-decoration: underline;">http://www.sourceforge.net/projects/robojournal</span></a></p></body></html> true Qt::TextBrowserInteraction Qt::Vertical QSizePolicy::Fixed 20 10 Version X Build Date: true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">From the author:</span><span style=" font-size:10pt;"> RoboJournal was primarily inspired by the various log entries on the computer teminals which are found throughout the </span><span style=" font-size:10pt; font-style:italic;">Fallout 3™ and Fallout: New Vegas™</span><span style=" font-size:10pt;"> games. (Even &quot;Robo&quot; is a homage to &quot;RobCo&quot;, the fictional pre-war terminal manufacturer) I feel that these log entries are a big part of what brought those games to life and made it feel real and immersive, even if the respective writer(s) of those entries never made an actual appearance in-game. (as was the case in many instances)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">RoboJournal is my attempt to recapture that same feel but with a modern GUI and a few extra features. After being so intrigued by the log entries in the game, I thought it would be nice to have a similar journaling tool in real life. Since none of the other alternative tools I initially tried had quite what I was looking for, I decided to make my own. I hope you enjoy using it. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Note: </span><span style=" font-size:8pt; font-style:italic;">Fallout 3</span><span style=" font-size:8pt;"> and </span><span style=" font-size:8pt; font-style:italic;">Fallout: New Vegas</span><span style=" font-size:8pt;"> are registered trademarks of Bethesda Softworks and I do </span><span style=" font-size:8pt; text-decoration: underline;">not</span><span style=" font-size:8pt;"> claim ownership or affiliation in any way. </span></p></body></html> Credits <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Author</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt; font-weight:600;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Will Kraft &lt;</span><a href="mailto:pwizard@gmail.com"><span style=" font-size:10pt; text-decoration: underline; color:#7e0b0b;">pwizard@gmail.com</span></a><span style=" font-size:10pt;">&gt;</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Third-Party Content</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt; font-weight:600;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Export Preview sample text: </span><span style=" font-size:10pt;">Generated by </span><a href="http://www.lipsum.org"><span style=" font-size:10pt; text-decoration: underline; color:#539fa3;">lipsum.org</span></a><span style=" font-size:10pt;">. Used with permission.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Spell checker: </span><span style=" font-size:10pt;">Jan Sundermeyer. Licensed under the GPL. RoboJournal uses the </span><a href="http://hunspell.sourceforge.net/"><span style=" font-size:10pt; text-decoration: underline; color:#539fa3;">Hunspell</span></a><span style=" font-size:10pt;"> spellcheck engine, available under the GPL/LGPL/MPL licenses. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">English (US) dictionary for Hunspell:</span><span style=" font-size:10pt;"> Kevin Atkinson. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">RoboJournal ≥ 0.4 contains some code from </span><a href="http://www.clementine-player.org/"><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; text-decoration: underline; color:#0000ff;">Clementine</span></a><span style=" font-size:10pt;"> 1.0.1</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">, licensed under the GPL.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; text-decoration: underline; color:#2b74c7;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Artwork</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt; font-weight:600;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Original ( &lt; v0.4) Icons:</span><span style=" font-size:10pt;"> </span><span style=" font-size:10pt; font-style:italic;">Silk Icons</span><span style=" font-size:10pt;"> by Mark James (</span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:10pt; text-decoration: underline; color:#7e0b0b;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:10pt;">). Licensed under a Creative Commons Attribution 2.5 or 3.0 License. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Additional Icons: </span><span style=" font-size:10pt; font-style:italic;">Fugue Icons </span><span style=" font-size:10pt;">by Yusuke Kamiyamane (</span><a href="http://p.yusukekamiyamane.com/"><span style=" font-size:10pt; text-decoration: underline; color:#539fa3;">http://p.yusukekamiyamane.com/</span></a><span style=" font-size:10pt;">). All rights reserved. Licensed under a Creative Commons Attribution 3.0 License. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">RoboJournal program icon: </span><span style=" font-size:10pt;">Derived from various icons in Matthieu James' </span><a href="http://gnome-look.org/content/show.php/Faenza?content=128143"><span style=" font-size:10pt; text-decoration: underline; color:#7e0b0b;">Faenza</span></a><span style=" font-size:10pt;"> icon pack. Special thanks to Matthieu for allowing me to use his icons as a base to create my own. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Beta Testers</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt; font-weight:600;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Sandra Goodhew</span></p></body></html> true License <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">GNU GENERAL PUBLIC LICENSE</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Version 3, 29 June 2007 </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright © 2007 Free Software Foundation, Inc. &lt;</span><a href="http://fsf.org/"><span style=" font-size:10pt; text-decoration: underline; color:#7e0b0b;">http://fsf.org/</span></a><span style=" font-size:10pt;">&gt;</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="preamble"></a><span style=" font-size:10pt; font-weight:600;">P</span><span style=" font-size:10pt; font-weight:600;">reamble</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">The GNU General Public License is a free, copyleft license for software and other kinds of works. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">The precise terms and conditions for copying, distribution and modification follow. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="terms"></a><span style=" font-size:10pt; font-weight:600;">T</span><span style=" font-size:10pt; font-weight:600;">ERMS AND CONDITIONS</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section0"></a><span style=" font-size:10pt; font-weight:600;">0</span><span style=" font-size:10pt; font-weight:600;">. Definitions.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">“This License” refers to version 3 of the GNU General Public License. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">“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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">A “covered work” means either the unmodified Program or a work based on the Program. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section1"></a><span style=" font-size:10pt; font-weight:600;">1</span><span style=" font-size:10pt; font-weight:600;">. Source Code.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">The Corresponding Source for a work in source code form is that same work. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section2"></a><span style=" font-size:10pt; font-weight:600;">2</span><span style=" font-size:10pt; font-weight:600;">. Basic Permissions.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section3"></a><span style=" font-size:10pt; font-weight:600;">3</span><span style=" font-size:10pt; font-weight:600;">. Protecting Users' Legal Rights From Anti-Circumvention Law.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section4"></a><span style=" font-size:10pt; font-weight:600;">4</span><span style=" font-size:10pt; font-weight:600;">. Conveying Verbatim Copies.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section5"></a><span style=" font-size:10pt; font-weight:600;">5</span><span style=" font-size:10pt; font-weight:600;">. Conveying Modified Source Versions.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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: </span></p> <ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-size:10pt;" style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">a) The work must carry prominent notices stating that you modified it, and giving a relevant date. </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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”. </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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. </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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. </li></ul> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section6"></a><span style=" font-size:10pt; font-weight:600;">6</span><span style=" font-size:10pt; font-weight:600;">. Conveying Non-Source Forms.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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: </span></p> <ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-size:10pt;" style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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. </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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. </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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. </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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. </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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. </li></ul> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">“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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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). </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section7"></a><span style=" font-size:10pt; font-weight:600;">7</span><span style=" font-size:10pt; font-weight:600;">. Additional Terms.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">“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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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: </span></p> <ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-size:10pt;" style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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 </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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 </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">d) Limiting the use for publicity purposes of names of licensors or authors of the material; or </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or </li> <li style=" font-size:10pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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. </li></ul> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section8"></a><span style=" font-size:10pt; font-weight:600;">8</span><span style=" font-size:10pt; font-weight:600;">. Termination.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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). </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section9"></a><span style=" font-size:10pt; font-weight:600;">9</span><span style=" font-size:10pt; font-weight:600;">. Acceptance Not Required for Having Copies.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section10"></a><span style=" font-size:10pt; font-weight:600;">1</span><span style=" font-size:10pt; font-weight:600;">0. Automatic Licensing of Downstream Recipients.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section11"></a><span style=" font-size:10pt; font-weight:600;">1</span><span style=" font-size:10pt; font-weight:600;">1. Patents.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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”. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section12"></a><span style=" font-size:10pt; font-weight:600;">1</span><span style=" font-size:10pt; font-weight:600;">2. No Surrender of Others' Freedom.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section13"></a><span style=" font-size:10pt; font-weight:600;">1</span><span style=" font-size:10pt; font-weight:600;">3. Use with the GNU Affero General Public License.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section14"></a><span style=" font-size:10pt; font-weight:600;">1</span><span style=" font-size:10pt; font-weight:600;">4. Revised Versions of this License.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section15"></a><span style=" font-size:10pt; font-weight:600;">1</span><span style=" font-size:10pt; font-weight:600;">5. Disclaimer of Warranty.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section16"></a><span style=" font-size:10pt; font-weight:600;">1</span><span style=" font-size:10pt; font-weight:600;">6. Limitation of Liability.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="section17"></a><span style=" font-size:10pt; font-weight:600;">1</span><span style=" font-size:10pt; font-weight:600;">7. Interpretation of Sections 15 and 16.</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">END OF TERMS AND CONDITIONS </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="howto"></a><span style=" font-size:10pt; font-weight:600;">H</span><span style=" font-size:10pt; font-weight:600;">ow to Apply These Terms to Your New Programs</span><span style=" font-size:10pt;"> </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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. </span></p> <p style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> &lt;one line to give the program's name and a brief idea of what it does.&gt;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> Copyright (C) &lt;year&gt; &lt;name of author&gt;</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Courier New,courier'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> This program is free software: you can redistribute it and/or modify</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> it under the terms of the GNU General Public License as published by</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> the Free Software Foundation, either version 3 of the License, or</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> (at your option) any later version.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Courier New,courier'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> This program is distributed in the hope that it will be useful,</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> GNU General Public License for more details.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Courier New,courier'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> You should have received a copy of the GNU General Public License</span></p> <p style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Also add information on how to contact you by electronic and paper mail. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: </span></p> <p style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> &lt;program&gt; Copyright (C) &lt;year&gt; &lt;name of author&gt;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> This is free software, and you are welcome to redistribute it</span></p> <p style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-size:10pt;"> under certain conditions; type `show c' for details. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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”. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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 &lt;</span><a href="http://www.gnu.org/licenses/"><span style=" font-size:10pt; text-decoration: underline; color:#7e0b0b;">http://www.gnu.org/licenses/</span></a><span style=" font-size:10pt;">&gt;. </span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">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 &lt;</span><a href="http://www.gnu.org/philosophy/why-not-lgpl.html"><span style=" font-size:10pt; text-decoration: underline; color:#7e0b0b;">http://www.gnu.org/philosophy/why-not-lgpl.html</span></a><span style=" font-size:10pt;">&gt;. </span></p></body></html> true Qt::Vertical QSizePolicy::Fixed 20 6 Qt::Vertical QSizePolicy::Maximum 20 13 Qt::Horizontal Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() AboutRJ accept() 248 254 157 274 buttonBox rejected() AboutRJ reject() 316 260 286 274 robojournal-0.4.2/ui/configurationeditor.h0000644000175000017500000000251212211723646017421 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef CONFIGURATIONEDITOR_H #define CONFIGURATIONEDITOR_H #include namespace Ui { class ConfigurationEditor; } class ConfigurationEditor : public QWidget { Q_OBJECT public: explicit ConfigurationEditor(QWidget *parent = 0); ~ConfigurationEditor(); void GetChanges(); private: Ui::ConfigurationEditor *ui; void PopulateForm(); QString aff_file; QString Find_AFF_File(QString dict); private slots: void on_BrowseButton_clicked(); void on_UseSpellCheck_clicked(bool checked); }; #endif // CONFIGURATIONEDITOR_H robojournal-0.4.2/ui/journalselector.ui0000775000175000017500000002322512142060704016745 0ustar willwill JournalSelector 0 0 510 379 Journal Selector :/icons/robojournal.ico:/icons/robojournal.ico false 1 Backend Database type Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 1 SQLite :/icons/sqlite_icon.png:/icons/sqlite_icon.png MySQL :/icons/mysql_icon2.png:/icons/mysql_icon2.png Connection Settings Use default host and port Host Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Port Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 4 Username Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Password Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter QLineEdit::Password Qt::Vertical QSizePolicy::MinimumExpanding 20 10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Search the specified <span style=" font-weight:600;">Host</span> for databases associated with the <span style=" font-weight:600;">Username</span> and<span style=" font-weight:600;"> Password</span> you provided. </p></body></html> Search for Journals :/icons/binocular.png:/icons/binocular.png true Qt::Vertical 20 40 Qt::Vertical QSizePolicy::Fixed 20 10 Qt::Horizontal Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() JournalSelector accept() 248 254 157 274 buttonBox rejected() JournalSelector reject() 316 260 286 274 robojournal-0.4.2/ui/journalselector.cpp0000644000175000017500000002213412211723646017113 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/journalselector.h" #include "ui_journalselector.h" #include "sql/mysqlcore.h" #include #include #include #include #include "core/settingsmanager.h" #include "core/buffer.h" #include "ui/firstrun.h" #include "ui_firstrun.h" JournalSelector::JournalSelector(QWidget *parent) : QDialog(parent), ui(new Ui::JournalSelector) { ui->setupUi(this); // hide question mark button in title bar when running on Windows this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); int width=this->width(); int height=this->height(); this->setMaximumSize(width,height); this->setMinimumSize(width,height); //Disable ok button until we select something QPushButton *okbutton=ui->buttonBox->button(QDialogButtonBox::Ok); okbutton->setDisabled(true); //disable other db options for now b/c we only have mysql support ui->DBType->setEnabled(true); ui->DBType->removeItem(0); ui->Username->setFocus(); // Select the use defaults button when the class is instantiated. // Bugfix 12/8/12: It should always be checked if we're in firstrun mode. if((Buffer::alwaysusedefaults) || (Buffer::firstrun)){ ui->UseDefaults->click(); } } //################################################################################################ // Validate user/pass and allows the connection to be made. Allowing blank username/pass breaks //other database connections so it should be stopped here. bool JournalSelector::Validate(){ bool valid=true; QMessageBox b; bool no_Username=ui->Username->text().isEmpty(); bool no_Password=ui->Password->text().isEmpty(); bool no_host=ui->Host->text().isEmpty(); bool no_port=ui->Port->text().isEmpty(); if((no_Username) && (no_Password)){ valid=false; b.critical(this,"RoboJournal","You must enter a username and password!"); } else{ if(no_Username){ valid=false; b.critical(this,"RoboJournal","You must enter a username!"); ui->Username->setFocus(); } if(no_Password){ valid=false; b.critical(this,"RoboJournal","You must enter a password!"); ui->Password->setFocus(); } } if(no_host){ valid=false; b.critical(this,"RoboJournal","You must enter a hostname!"); ui->Host->setFocus(); } if(no_port){ valid=false; b.critical(this,"RoboJournal","You must enter the port that Host should use!"); ui->Port->setFocus(); } return valid; } //################################################################################################ // Forward the settings to the config file. This function has NO validation so it must be validated before it gets called! // If not, bad things will probably happen. void JournalSelector::SetPreferences(){ // get values QString user=ui->Username->text(); QString host=ui->Host->text(); QString port=ui->Port->text(); QTreeWidgetItem *selected=ui->JournalList->currentItem(); QString database=selected->text(0); // get confirmarmation if this !firstrun and warnings are enabled. if((Buffer::showwarnings) && (!Buffer::firstrun)){ QMessageBox a; int choice=a.question(this,"RoboJournal","You are about to make " + database + " your default journal.

" "This action will partially replace your current configuration with default settings." " Are you sure you want to proceed?",QMessageBox::Yes | QMessageBox::No,QMessageBox::No); if(choice==QMessageBox::Yes){ SettingsManager b; b.NewConfig(host,database,port,user); QMessageBox m; m.information(this,"RoboJournal", "" + database + " is now your default journal."); this->accept(); } else{ // do nothing } } // firstrun or blind (no confirm) mode else{ SettingsManager sm; sm.NewConfig(host,database,port,user); QMessageBox m; m.information(this,"RoboJournal", "" + database + " is now your default journal."); this->accept(); } } //################################################################################################ // Query the database to see what type of databases we have available, and return the query as a qstringlist void JournalSelector::JournalSearch(){ QString hostname; QString port; this->setCursor(Qt::WaitCursor); if(ui->Host->text().isEmpty()){ hostname=ui->Host->placeholderText(); } else{ hostname=ui->Host->text(); } if(ui->Port->text().isEmpty()){ port=ui->Port->placeholderText(); } else{ port=ui->Port->text(); } QString username=ui->Username->text(); QString password=ui->Password->text(); MySQLCore m; QStringList journals=m.GetDatabaseList(hostname,port,username,password); journals.sort(); CreateTree(journals); this->setCursor(Qt::ArrowCursor); } //################################################################################################ // Create Tree void JournalSelector::CreateTree(QStringList journals){ ui->JournalList->clear(); ui->JournalList->setRootIsDecorated(false); ui->JournalList->setHeaderLabel("Available Journals"); QIcon server(":/icons/server.png"); QIcon db(":/icons/database.png"); QString parent=ui->Host->text(); if(parent==""){ parent=ui->Host->placeholderText(); } QString user=ui->Username->text(); QTreeWidgetItem *root=new QTreeWidgetItem(ui->JournalList); root->setText(0, user + "@" + parent); root->setIcon(0,server); ui->JournalList->addTopLevelItem(root); // Add each entry in the QStringList to the tree for(int i=0; i < journals.size(); i++){ QTreeWidgetItem *item=new QTreeWidgetItem(root); item->setIcon(0,db); item->setText(0,journals[i]); } ui->JournalList->expandAll(); if(journals.size()==0){ ui->JournalList->clear(); } } //################################################################################################ JournalSelector::~JournalSelector() { delete ui; } //################################################################################################ void JournalSelector::on_SearchButton_clicked() { bool valid=Validate(); if(valid){ JournalSearch(); } } //################################################################################################ void JournalSelector::on_UseDefaults_clicked(bool checked) { if(checked){ ui->Host->setText("localhost"); ui->Port->setText("3306"); ui->Host->setReadOnly(true); ui->Port->setReadOnly(true); } else{ ui->Host->setReadOnly(false); ui->Port->setReadOnly(false); ui->Port->clear(); ui->Host->clear(); } } //################################################################################################ void JournalSelector::on_JournalList_itemClicked(QTreeWidgetItem *item, int column) { // only allow the OK button to be clicked when we are on a DB node if(item->text(column)!= ui->Username->text() + "@" + ui->Host->text()){ QAbstractButton *ok=ui->buttonBox->button(QDialogButtonBox::Ok); ok->setEnabled(true); } // do not allow the user to proceed if the root node is selected else{ QAbstractButton *ok=ui->buttonBox->button(QDialogButtonBox::Ok); ok->setDisabled(true); } } //################################################################################################ void JournalSelector::on_buttonBox_accepted() { SetPreferences(); } //################################################################################################ void JournalSelector::on_buttonBox_rejected() { // If this is the firstrun, return to the FirstRun class. It doesn't exist anymore at this //point, so create a new one. No one will ever know. if(Buffer::firstrun){ this->reject(); FirstRun f; f.exec(); } else{ this->reject(); } } void JournalSelector::on_JournalList_itemDoubleClicked(QTreeWidgetItem *item, int column) { if(item->text(column)!= ui->Username->text() + "@" + ui->Host->text()){ SetPreferences(); } } robojournal-0.4.2/ui/configurationexport.cpp0000644000175000017500000001274412211723646020017 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "configurationexport.h" #include "ui_configurationexport.h" #include #include #include #include "core/buffer.h" #include "ui/newconfig.h" #include "ui/exportpreview.h" ConfigurationExport::ConfigurationExport(QWidget *parent) : QWidget(parent), ui(new Ui::ConfigurationExport) { ui->setupUi(this); PopulateForm(); } ConfigurationExport::~ConfigurationExport() { delete ui; } void ConfigurationExport::PopulateForm(){ ProcessUnits(true,ui->HeaderUnit->currentIndex()); ProcessUnits(false,ui->BodyUnit->currentIndex()); ui->IncludeTags->setChecked(Buffer::include_tags_in_export); ui->RoundCorners->setChecked(Buffer::use_rounded_corners); ui->SystemColors->setChecked(Buffer::use_system_colors); // Bugfix: Hide "Include Tags" option for now. (implement in 0.5) ui->IncludeTags->setVisible(false); QFont hf(Buffer::header_font); QFont bf(Buffer::body_font); ui->HeaderFont->setCurrentFont(hf); ui->BodyFont->setCurrentFont(bf); if(Buffer::header_use_em){ ui->HeaderUnit->setCurrentIndex(1); ProcessUnits(true,ui->HeaderUnit->currentIndex()); } else{ ui->HeaderUnit->setCurrentIndex(0); ProcessUnits(true,ui->HeaderUnit->currentIndex()); } if(Buffer::body_use_em){ ui->BodyUnit->setCurrentIndex(1); ProcessUnits(false,ui->BodyUnit->currentIndex()); } else{ ui->BodyUnit->setCurrentIndex(0); ProcessUnits(false,ui->BodyUnit->currentIndex()); } for(int i=0; iHeaderSize->count(); i++){ if(ui->HeaderSize->itemText(i)==Buffer::header_font_size){ //cout << "Item: " << i << endl; ui->HeaderSize->setCurrentIndex(i); break; } } for(int j=0; jBodySize->count(); j++){ if(ui->BodySize->itemText(j)==Buffer::body_font_size){ //cout << "Item: " << i << endl; ui->BodySize->setCurrentIndex(j); break; } } } void ConfigurationExport::ProcessUnits(bool header, int index){ QStringList units; // Set header units if(header){ switch(index){ case 0: units << "14" << "16" << "18" << "20" << "22" << "24" << "30"; break; case 1: units << "2" << "2.5" << "3" << "3.5" << "4"; break; } ui->HeaderSize->clear(); ui->HeaderSize->addItems(units); } // Set body units else{ switch(index){ case 0: units << "8" << "9" << "10" << "11" << "12" << "14" << "16"; break; case 1: units << "0.5" << "0.7" << "1" << "1.1" << "1.2" << "1.3" << "1.4" << "1.5"; break; } ui->BodySize->clear(); ui->BodySize->addItems(units); } } void ConfigurationExport::on_HeaderUnit_currentIndexChanged(int index) { ProcessUnits(true,index); } void ConfigurationExport::on_BodyUnit_currentIndexChanged(int index) { ProcessUnits(false,index); } void ConfigurationExport::GetChanges(){ Newconfig::new_use_rounded_corners=ui->RoundCorners->isChecked(); Newconfig::new_use_system_colors=ui->SystemColors->isChecked(); Newconfig::new_include_tags_in_export=ui->IncludeTags->isChecked(); Newconfig::new_header_font=ui->HeaderFont->currentText(); Newconfig::new_body_font=ui->BodyFont->currentText(); Newconfig::new_header_font_size=ui->HeaderSize->currentText(); Newconfig::new_body_font_size=ui->BodySize->currentText(); switch(ui->BodyUnit->currentIndex()){ case 0: Newconfig::new_body_use_em=false; break; case 1: Newconfig::new_body_use_em=true; break; } switch(ui->HeaderUnit->currentIndex()){ case 0: Newconfig::new_header_use_em=false; break; case 1: Newconfig::new_header_use_em=true; break; } } void ConfigurationExport::on_PreviewFonts_clicked() { ExportPreview::header_font=ui->HeaderFont->currentText(); ExportPreview::body_font=ui->BodyFont->currentText(); ExportPreview::body_size=ui->BodySize->currentText(); ExportPreview::header_size=ui->HeaderSize->currentText(); switch(ui->BodyUnit->currentIndex()){ case 0: ExportPreview::use_em_body=false; break; case 1: ExportPreview::use_em_body=true; break; } switch(ui->HeaderUnit->currentIndex()){ case 0: ExportPreview::use_em_header=false; break; case 1: ExportPreview::use_em_header=true; break; } ExportPreview::use_rounded=ui->RoundCorners->isChecked(); ExportPreview::use_system_colors=ui->SystemColors->isChecked(); ExportPreview e(this); e.exec(); } robojournal-0.4.2/ui/tagger.ui0000775000175000017500000001557712142060704015016 0ustar willwill Tagger 0 0 389 235 Dialog :/icons/robojournal.ico:/icons/robojournal.ico 75 true true QAbstractItemView::NoEditTriggers true false QAbstractItemView::NoDragDrop true QAbstractItemView::SingleSelection Qt::ElideNone QListView::LeftToRight true QListView::SinglePass 10 QListView::ListMode 0 false true true <p>Declare a new tag and add it to the <b>Available Tags</b> list.</p> &New Tag Qt::Vertical QSizePolicy::Expanding 20 10 Available Tags Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter <p>Show all available tags</p> false -1 QComboBox::InsertAtTop <p>Tag this entry with the current item in the <b>Available Tags</b> list.</p> &Apply Tag <p>Remove the selected tag from this entry.</p> &Remove Tag Qt::Vertical QSizePolicy::Fixed 20 6 Qt::Horizontal Qt::Horizontal QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok false buttonBox accepted() Tagger accept() 248 254 157 274 buttonBox rejected() Tagger reject() 316 260 286 274 robojournal-0.4.2/ui/tagreminder.cpp0000644000175000017500000002152012211723646016177 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "tagreminder.h" #include "ui_tagreminder.h" #include "core/buffer.h" #include "sql/mysqlcore.h" #include #include #include #include "ui/tagger.h" #include #include "core/settingsmanager.h" #include #include TagReminder::TagReminder(QWidget *parent) : QDialog(parent), ui(new Ui::TagReminder) { ui->setupUi(this); PrimaryConfig(); } //############################################################################################ TagReminder::~TagReminder() { delete ui; } //############################################################################################ // The Reject() slot is called if the user clicks the Close button. void TagReminder::reject(){ using namespace std; // 3/13/13: Store the current state of the ShowReminder box in the Buffer. This value is then // used in the SettingsManager class to update the configuration if necessary. if(!ui->ShowReminder->isChecked()){ Buffer::show_reminder_next_time=false; } // Hide the dialog because this function breaks the normal close() function. this->hide(); } //############################################################################################ // This is a stealth function that detects the number of untagged entries and returns the value // as an int. If the int > 0, the form is displayed; otherwise, RoboJournal does nothing with // the information. int TagReminder::Lookup(){ using namespace std; int untagged_count=0; if(Buffer::backend=="MySQL"){ MySQLCore n; Buffer::records=n.NullSearch(); untagged_count=Buffer::records.size(); //cout << "Number of records (in Lookup() function): " << untagged_count << endl; } return untagged_count; } //############################################################################################ // Setup form; typical for all RoboJournal classes. void TagReminder::PrimaryConfig(){ setWindowTitle("Tag Reminder - RoboJournal"); // hide question mark button in title bar when running on Windows this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); int width=this->width(); int height=this->height(); this->setMaximumSize(width,height); this->setMinimumSize(width,height); // define header titles for item list. They are displayed in the order they are fed into the StringList. ui->EntryList->setColumnCount(3); QStringList header; header << "Entry Title" << "Date" << "ID"; ui->EntryList->setHeaderLabels(header); // Hide ID column ui->EntryList->setColumnHidden(2,true); // hide unnecessary node inset by hiding root. (we have no root node anyway). ui->EntryList->setRootIsDecorated(false); //show alternating row colors if config allows it if(Buffer::alternate_rows){ ui->EntryList->setAlternatingRowColors(true); } else{ ui->EntryList->setAlternatingRowColors(false); } // 3/26/13: Enable sort functionality ui->EntryList->sortByColumn(1,Qt::DescendingOrder); // Bugfix 3/13/13: Set the showReminder value to true to begin with. If the user unchecks the ShowReminder box // this value gets set to false (and the config gets updated ot reflect this) when the dialog is closed. Buffer::show_reminder_next_time=true; // Create the list of untagged entries... Lookup(); // ...and display it. CreateList(); } //############################################################################################ // 2/26/13: This function populates the list/treewidget with the results of the MySQL query. This function // uses the 'records' QList that was populated bythe Lookup() function; this function does NOT // do another SQL call. void TagReminder::CreateList(){ using namespace std; QListIterator a(Buffer::records); //cout << "Number of items in list: " << records.size() << endl; QString iconpath; // set node icon according to software preferences switch(Buffer::entry_node_icon){ case 0: iconpath=":/icons/pencil.png"; break; case 1: iconpath=":/icons/pencil2.png"; break; case 2: iconpath=":/icons/pencil-small.png"; break; case 3: iconpath=":/icons/balloon-quotation.png"; break; case 4: iconpath=":/icons/node.png"; break; case 5: iconpath=":/icons/bullet_black.png"; break; case 6: iconpath=":/icons/bullet_blue.png"; break; } QIcon node(iconpath); // create a node for each item in the records Qlist while(a.hasNext()){ QStringList nextitem=a.next(); QTreeWidgetItem *item = new QTreeWidgetItem(ui->EntryList); QString title=nextitem.at(1); QString date=nextitem.at(2); QString id=nextitem.at(0); //Process date from QString into actual QDate object so it sorts correctly. QDate realdate; QStringList datearray=date.split("-"); int month, day, year; month=datearray.at(0).toInt(); day=datearray.at(1).toInt(); year=datearray.at(2).toInt(); realdate.setDate(year,month,day); // add item data to the node columns. item->setText(0,title + " "); // title column item->setIcon(0,node); item->setData(1,Qt::DisplayRole,realdate); item->setText(2,id); // invisible id column; this value is passed to the tagger. } //Resize columns to eliminate horizontal scroll if possible. for(int i=0; i < ui->EntryList->columnCount(); i++){ ui->EntryList->resizeColumnToContents(i); } // Set item count message. int count=Buffer::records.size(); QString num=QString::number(count); if(count > 1){ ui->ItemCount->setText(num + " entries need to be tagged."); } else{ ui->ItemCount->setText(num + " entry needs to be tagged."); } // Auto-select the first item in the list to prevent a segfault if the user clicks // Manage Tags w/o making a selection first. ui->EntryList->setCurrentItem(ui->EntryList->topLevelItem(0)); } //############################################################################################ void TagReminder::LaunchTagger(){ if(ui->EntryList->currentItem()->isSelected()){ Tagger t(this); // pass currently selected index to the Tagger class. t.id_num=Buffer::reminder_choice; t.setWindowTitle(Buffer::reminder_title.trimmed() + " - Manage Tags"); t.exec(); // Clean up after the tagger Buffer::reminder_title.clear(); Buffer::reminder_choice.clear(); t.id_num.clear(); RefreshList(); } else{ QMessageBox m; m.critical(this,"RoboJournal","Please select an entry to tag."); } } //############################################################################################ // 2/25/13: force a manual refresh of the tag list. This should only be used after the user tags an entry on the list. void TagReminder::RefreshList(){ // purge and recreate the list. ui->EntryList->clear(); Buffer::records.clear(); Lookup(); CreateList(); // auto-close the dialog if there are no more entries to tag. if(Buffer::records.count()==0){ QMessageBox b; b.information(this,"RoboJournal","All entries have been successfully tagged. " "RoboJournal will automatically close the Tag Reminder window now."); this->accept(); } } //############################################################################################ void TagReminder::on_ManageTags_clicked() { LaunchTagger(); } //############################################################################################ // This slot keeps the static values for id number and title syncronized whenever the user // changes the current index on the EntryList. void TagReminder::on_EntryList_itemSelectionChanged() { QTreeWidgetItem *selected=ui->EntryList->currentItem(); Buffer::reminder_choice=selected->text(2); Buffer::reminder_title=selected->text(0); } robojournal-0.4.2/ui/configurationjournal.h0000775000175000017500000000263112142060704017604 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef CONFIGURATIONJOURNAL_H #define CONFIGURATIONJOURNAL_H #include namespace Ui { class ConfigurationJournal; } class ConfigurationJournal : public QWidget { Q_OBJECT public: explicit ConfigurationJournal(QWidget *parent = 0); ~ConfigurationJournal(); void GetChanges(); private: Ui::ConfigurationJournal *ui; void PrimaryConfig(); void PopulateForm(); private slots: void on_ShowAllEntries_clicked(bool checked); void on_Highlight_clicked(bool checked); void on_FullName_textChanged(const QString &arg1); }; #endif // CONFIGURATIONJOURNAL_H robojournal-0.4.2/ui/newconfig.ui0000775000175000017500000000757712142060704015525 0ustar willwill Newconfig 0 0 614 477 Preferences :/icons/robojournal.ico:/icons/robojournal.ico false 180 16777215 false true false 1 QFrame::NoFrame QFrame::Plain 0 Qt::ScrollBarAlwaysOff true 0 0 408 405 Qt::Vertical QSizePolicy::Fixed 20 4 Qt::Horizontal Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() Newconfig accept() 248 254 157 274 buttonBox rejected() Newconfig reject() 316 260 286 274 robojournal-0.4.2/ui/exportpreview.h0000775000175000017500000000264312142060704016270 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef EXPORTPREVIEW_H #define EXPORTPREVIEW_H #include namespace Ui { class ExportPreview; } class ExportPreview : public QDialog { Q_OBJECT public: explicit ExportPreview(QWidget *parent = 0); ~ExportPreview(); static QString header_font; static QString body_font; static QString header_size; static QString body_size; static bool use_rounded; static bool use_system_colors; static bool use_em_header; static bool use_em_body; private slots: private: Ui::ExportPreview *ui; QString PrepareHTML(); }; #endif // EXPORTPREVIEW_H robojournal-0.4.2/ui/configurationexport.h0000644000175000017500000000257412211723646017464 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef CONFIGURATIONEXPORT_H #define CONFIGURATIONEXPORT_H #include namespace Ui { class ConfigurationExport; } class ConfigurationExport : public QWidget { Q_OBJECT public: explicit ConfigurationExport(QWidget *parent = 0); ~ConfigurationExport(); void GetChanges(); private: Ui::ConfigurationExport *ui; void ProcessUnits(bool header, int index); void PopulateForm(); private slots: void on_HeaderUnit_currentIndexChanged(int index); void on_BodyUnit_currentIndexChanged(int index); void on_PreviewFonts_clicked(); }; #endif // CONFIGURATIONEXPORT_H robojournal-0.4.2/ui/exportpreview.cpp0000775000175000017500000001752112142060704016624 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/exportpreview.h" #include "ui_exportpreview.h" #include "core/buffer.h" #include #include #include #include #include "core/settingsmanager.h" QString ExportPreview::header_font; QString ExportPreview::body_font; QString ExportPreview::body_size; QString ExportPreview::header_size; bool ExportPreview::use_em_body; bool ExportPreview::use_em_header; bool ExportPreview::use_rounded; bool ExportPreview::use_system_colors; //########################################################################################################### ExportPreview::ExportPreview(QWidget *parent) : QDialog(parent), ui(new Ui::ExportPreview) { ui->setupUi(this); // hide question mark button in title bar when running on Windows this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); QString output=PrepareHTML(); ui->webView->setHtml(output); if(!Buffer::preview_geometry.isEmpty()){ resize(Buffer::preview_geometry); } } //########################################################################################################### ExportPreview::~ExportPreview() { // remember size setting if(!this->isMaximized()){ QSize geo=this->size(); SettingsManager s; s.SavePreviewSize(geo); } delete ui; } //########################################################################################################### // This function prepares the html code and returns it as a QString. Really simple... the original plan was to // create a temporary file to hold the HTML code but this works just as well w/ less overhead. QString ExportPreview::PrepareHTML(){ using namespace std; QString lipsum; lipsum.append("

FYI: This is the classic Lorem Ipsum text that has been used" " for placeholder purposes throughout the print industry since the 1500s." " Its purpose here is to test how large blocks of text will look with the fonts and sizes you have selected." " These results are generally consistent but may vary slightly depending on which browser you use (This example is rendered with Webkit).

"); lipsum.append("

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque laoreet vestibulum libero vitae accumsan. "); lipsum.append("Nullam et nulla nunc, non luctus elit. Etiam aliquam, turpis nec pellentesque interdum, purus nulla dictum tortor, "); lipsum.append("nec lacinia orci turpis ac lectus. Suspendisse dignissim, lectus nec posuere consectetur, massa quam rhoncus velit, "); lipsum.append("eu viverra est risus ac enim. Nullam augue lacus, imperdiet ac iaculis eu, scelerisque quis nulla. Donec tempor "); lipsum.append("lacus molestie arcu aliquam scelerisque. Proin vitae augue quis quam imperdiet porttitor id sed magna. Nulla non "); lipsum.append("urna purus. Vivamus dui diam, eleifend a laoreet sit amet, dignissim vel odio. Pellentesque adipiscing sodales ante "); lipsum.append("at tempor. Vestibulum libero risus, malesuada vel scelerisque ut, facilisis ac nulla. Nam congue urna non diam pretium "); lipsum.append("dapibus.

"); lipsum.append("

Proin viverra odio a dolor lacinia tincidunt. Nunc tempor adipiscing dolor, id condimentum leo facilisis a. Aliquam "); lipsum.append("erat volutpat. Cras vitae ligula mauris. Etiam nec orci ac velit mattis semper vel ut metus. Pellentesque sagittis "); lipsum.append("ultricies nisi, at commodo metus posuere a. Sed neque nunc, sagittis non elementum ut, imperdiet eget purus. "); lipsum.append("Nulla non tortor sit amet ipsum porttitor suscipit. Maecenas ipsum erat, porta id porta ac, convallis sit amet erat. "); lipsum.append("Nunc libero felis, blandit id vehicula dapibus, vehicula quis erat. Nam feugiat, elit a vestibulum sagittis, diam "); lipsum.append("metus faucibus nulla, hendrerit ullamcorper mi nulla sit amet tellus. Praesent placerat velit quis lectus lacinia "); lipsum.append("sed laoreet magna sagittis. Maecenas lacinia, metus at ultrices sodales, quam orci ullamcorper neque, viverra "); lipsum.append("molestie metus dolor vel velit. Mauris ligula orci, ullamcorper at adipiscing ornare, euismod sed augue. Praesent "); lipsum.append("nec leo arcu, id elementum leo. Aliquam fringilla semper nulla, eget congue turpis volutpat sed.

"); QString css_header_spec; if(use_em_header){ css_header_spec=header_size + "em"; } else{ css_header_spec=header_size + "pt"; } QString css_body_spec; if(use_em_body){ css_body_spec=body_size + "em"; } else{ css_body_spec=body_size + "pt"; } QString bgcolor; QString datebox_color; if(use_system_colors){ // use system colors for datebox QPalette pal; QColor bg=pal.highlight().color(); QColor fg=pal.highlightedText().color(); bgcolor=bg.name(); datebox_color=fg.name(); } else{ bgcolor="#e2e2e2"; datebox_color="#000000"; } QString output; output.append("\n"); output.append("\n"); output.append("\n"); output.append("\n"); output.append("Sample Entry\n"); output.append("\n"); output.append("\n"); output.append("\n"); output.append("

Sample Entry

\n"); output.append("
  On [date] at [time], [user] wrote:
\n"); output.append(lipsum); output.append("
\n"); output.append("

This file was generated by RoboJournal " + Buffer::version +" on [export date & timestamp].

"); output.append("\n"); output.append(""); return output; } robojournal-0.4.2/ui/mainwindow.cpp0000644000175000017500000035307112215133025016051 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/mainwindow.h" #include "ui_mainwindow.h" #include "ui_editor.h" #include "ui/editor.h" #include #include "core/buffer.h" #include "ui/dblogin.h" #include "ui_dblogin.h" #include #include "sql/psqlcore.h" #include #include "sql/mysqlcore.h" #include "sql/sqlitecore.h" #include "ui/aboutrj.h" #include "ui_aboutrj.h" #include #include #include #include #include #include "ui/firstrun.h" #include "ui_firstrun.h" #include #include #include #include #include #include #include "ui/tagger.h" #include "ui_tagger.h" #include "ui/journalcreator.h" #include "ui_journalcreator.h" #include "ui/journalselector.h" #include "ui_journalselector.h" #include "ui/entryexporter.h" #include "ui_entryexporter.h" #include "ui_firstrun.h" #include "ui/firstrun.h" #include "ui/newconfig.h" #include "ui_newconfig.h" #include "core/settingsmanager.h" #include #include #include #include "ui/tagreminder.h" #include "ui_tagreminder.h" #include #include // 0.4.1: Consolidate the clear search results code into its own function since it needs to be called // more than once. //################################################################################################ void MainWindow::ClearSearchResults(){ has_search_results=false; ui->SearchTerm->clear(); ui->SearchList->clear(); ui->SearchList->setColumnWidth(0,100); ui->SearchCount->clear(); ui->Output->clear(); ui->SearchTerm->setFocus(); ui->ClearButton->setDisabled(true); // Clean the buffer Buffer::SearchText.clear(); Buffer::LastSearchTerm.clear(); } // This function buffers/restores the text in the output pane depending on which tab is active. //################################################################################################ void MainWindow::SwitchTab(int index){ QScrollBar *vbar = ui->Output->verticalScrollBar(); switch(index){ case 0: // Entries Tab is active Buffer::On_Search=false; ui->Output->setText(Buffer::EntryText); vbar->setValue(Buffer::entry_scroll_pos); //re-enable buttons based on whether they were enabled before we switched to search mode ui->TodayButton->setEnabled(Buffer::latest_enabled); ui->LastEntry->setEnabled(Buffer::previous_enabled); ui->NextEntry->setEnabled(Buffer::next_enabled); ui->WriteButton->setEnabled(Buffer::write_enabled); ui->EditEntryButton->setEnabled(Buffer::edit_enabled); ui->DeleteEntry->setEnabled(Buffer::delete_enabled); ui->ExportEntry->setEnabled(Buffer::export_enabled); ui->Tag->setEnabled(Buffer::tag_enabled); ui->DisconnectButton->setEnabled(Buffer::disconnect_enabled); ui->actionLatest_Entry->setEnabled(Buffer::latest_enabled); ui->actionNext_Entry->setEnabled(Buffer::next_enabled); ui->actionPrevious_Entry->setEnabled(Buffer::previous_enabled); ui->actionDelete_Current_Entry->setEnabled(Buffer::delete_enabled); ui->actionEdit_Selected_Entry->setEnabled(Buffer::edit_enabled); ui->actionWrite->setEnabled(Buffer::write_enabled); ui->actionManage_Tags_2->setEnabled(Buffer::tag_enabled); ui->actionExport_Entry->setEnabled(Buffer::export_enabled); ui->actionDisconnect->setEnabled(Buffer::disconnect_enabled); break; case 1: // Search Tab is active Buffer::On_Search=true; ui->Output->setText(Buffer::SearchText); vbar->setValue(Buffer::search_scroll_pos); ui->SearchButton->setDefault(true); ui->SearchTerm->setFocus(); // remember what toolbar buttons were enabled and disable them in search mode. Buffer::latest_enabled=ui->TodayButton->isEnabled(); Buffer::previous_enabled=ui->LastEntry->isEnabled(); Buffer::next_enabled=ui->NextEntry->isEnabled(); Buffer::write_enabled=ui->WriteButton->isEnabled(); Buffer::edit_enabled=ui->EditEntryButton->isEnabled(); Buffer::delete_enabled=ui->DeleteEntry->isEnabled(); Buffer::export_enabled=ui->ExportEntry->isEnabled(); Buffer::tag_enabled=ui->Tag->isEnabled(); Buffer::disconnect_enabled=ui->DisconnectButton->isEnabled(); // Disable the buttons while in search mode. ui->TodayButton->setDisabled(true); ui->LastEntry->setDisabled(true); ui->NextEntry->setDisabled(true); ui->WriteButton->setDisabled(true); ui->EditEntryButton->setDisabled(true); ui->DeleteEntry->setDisabled(true); ui->ExportEntry->setDisabled(true); ui->Tag->setDisabled(true); ui->DisconnectButton->setDisabled(true); ui->actionLatest_Entry->setDisabled(true); ui->actionNext_Entry->setDisabled(true); ui->actionPrevious_Entry->setDisabled(true); ui->actionDelete_Current_Entry->setDisabled(true); ui->actionEdit_Selected_Entry->setDisabled(true); ui->actionWrite->setDisabled(true); ui->actionManage_Tags_2->setDisabled(true); ui->actionExport_Entry->setDisabled(true); ui->actionDisconnect->setDisabled(true); break; } } // Process highlighting in search result active entry //################################################################################################ QStringList MainWindow::HighlightResults(QString entry, QString title, QString term, int index){ using namespace std; term=term.trimmed(); // allow the search to highlight matches that contain HTML hyphens if(Buffer::use_html_hyphens){ QRegExp longdash("(--)|(---)"); term=term.replace(longdash,"—"); } QString color; // assign a color based on stored int value. switch(Buffer::highlight_color){ case 0: //yellow color="#ffff00"; break; case 1: // orange color="#ff9933"; break; case 2: // pink color="#ff99cc"; break; case 3: // lime color="#99ff99"; break; case 4: // cyan color="#00ffff"; break; case 5: //purple color="#cc99ff"; break; } // decide what gets highlighted according to search filter int value. if(ui->WholeWords->isChecked()){ // Use a regular expression to find occurrences of the term in the body text. The regex should match // word bounds (white space) before the term *and* word bounds OR punctuation after the term. QRegExp reg("(\\b)(" + term + ")(\\b)|(.,:;'\"\')"); reg.setCaseSensitivity(Qt::CaseSensitive); /* QStringList matches=reg.capturedTexts(); // View Regexp results. (for debugging purposes only... this block should be commented out in final builds.) cout << "Capture Count: " << reg.captureCount() << endl; for(int i=0; i < matches.count(); i++){ cout << "Match " << i <<": " << matches.at(i).toStdString() << endl; cout << reg.cap(i).toStdString() << endl; } */ switch(index){ case 0: //do nothing... no search term because tag list is enabled. break; case 1: // highlight title only title=title.replace(reg,"" + term + ""); break; case 2: // highlight body only entry=entry.replace(reg,"" + term + ""); break; case 3: // highlight title and body title=title.replace(reg,"" + term + ""); entry=entry.replace(reg,"" + term + ""); break; } } // not whole words. else{ switch(index){ case 0: //do nothing... no search term because tag list is enabled. break; case 1: // highlight title only title=title.replace(term,"" + term + ""); break; case 2: // highlight body only entry=entry.replace(term,"" + term + ""); break; case 3: // highlight title and body title=title.replace(term,"" + term + ""); entry=entry.replace(term,"" + term + ""); break; } } // build a stringlist of highlighted values and export them back out. QStringList highlighted; highlighted << entry << title; return highlighted; } // Function that searches the database and shows it in the new Search tab. New for 0.4. //################################################################################################ void MainWindow::SearchDatabase(){ using namespace std; if(Buffer::backend=="MySQL"){ int count=0; int index=ui->SearchFilter->currentIndex(); QString tags=ui->TagList->currentText(); QString searchterm=ui->SearchTerm->text(); if((searchterm.isEmpty()) && (ui->SearchFilter->currentIndex() !=0)){ QMessageBox m; m.critical(this,"RoboJournal","Please enter one or more words to search for."); ui->SearchTerm->setFocus(); } else{ //Prevent multiple consecutive searches of the same term to reduce unnecessary database overhead. if((Buffer::LastSearchTerm != searchterm) || (ui->SearchFilter->currentIndex() ==0)){ this->setCursor(Qt::WaitCursor); // prevent crash by telling the app we have no search results before clearing the form. Otherwise, the app // will call GetEntry() on a null id number. The reason for this is the SearchList::currentitemChanged // slot is auto-triggered every time SearchList is changed. (clearing counts as a change) has_search_results=false; // allow the search to return matches that contain HTML hyphens. if((Buffer::use_html_hyphens) || (Buffer::use_smart_quotes)){ // replace 2 >= adjacent dashes with a clean mdash searchterm=searchterm.replace(QRegExp("-{2,}"),"—"); // replace 2 >= adjacent dots with ellipsis char. searchterm=searchterm.replace(QRegExp("\\.{2,}\\s*?"),"…"); // This also helps to break SQL injection. searchterm=searchterm.replace(QRegExp("\'"),"’"); } // clean up stuff from last search ui->SearchList->clear(); ui->Output->clear(); Buffer::SearchText.clear(); ui->SearchCount->clear(); ui->ClearButton->setEnabled(true); // run the next search MySQLCore n; QList results=n.SearchDatabase(searchterm,index,tags,ui->WholeWords->isChecked()); QListIterator a(results); QString iconpath; switch(Buffer::entry_node_icon){ case 0: iconpath=":/icons/pencil.png"; break; case 1: iconpath=":/icons/pencil2.png"; break; case 2: iconpath=":/icons/pencil-small.png"; break; case 3: iconpath=":/icons/balloon-quotation.png"; break; case 4: iconpath=":/icons/node.png"; break; case 5: iconpath=":/icons/bullet_black.png"; break; case 6: iconpath=":/icons/bullet_blue.png"; break; } while(a.hasNext()){ QTreeWidgetItem *item = new QTreeWidgetItem(ui->SearchList); QStringList nextitem=a.next(); QIcon entryicon(iconpath); QString tooltip; if(index == 0){ tooltip="The number of hits for current search term is non-applicable in tag search mode."; } else{ tooltip="Entry contains " + nextitem.at(3) + " occurence(s) of the search term \"" + searchterm + "\"."; } // entry title + a small bit of space to pad it out. item->setText(0,nextitem.at(1) + " "); // Convert QString date to QDate to make it sort correctly/ // QDate automatically inherits system date settings so we should let it do the work // instead of manually reformatting the date. QDate entrydate; QString id=nextitem.at(2); QStringList date=id.split("/"); int month, day, year; switch(Buffer::date_format){ case 0: // European month=date.at(1).toInt(); day=date.at(0).toInt(); year=date.at(2).toInt(); break; case 1: // USA Style month=date.at(0).toInt(); day=date.at(1).toInt(); year=date.at(2).toInt(); break; case 2: // ISO month=date.at(1).toInt(); day=date.at(2).toInt(); year=date.at(0).toInt(); break; } // add to date column entrydate.setYMD(year,month,day); item->setData(1,Qt::DisplayRole,entrydate); item->setTextAlignment(1,Qt::AlignLeft); if(index==0){ // use an icon to represent n/a if we are in tag search mode. QIcon na(":/icons/na.png"); //item->setData(2,Qt::DisplayRole,na); item->setIcon(2,na); item->setToolTip(2,tooltip); } else{ // hits column. value should be an int instead of a string so it sorts correctly. int hits=nextitem.at(3).toInt(); item->setData(2,Qt::DisplayRole,hits); item->setToolTip(2,tooltip); item->setTextAlignment(2,Qt::AlignLeft); } // invisible ID column item->setText(3,nextitem.at(0)); item->setIcon(0,entryicon); // add one to the count count++; } if(count==1){ ui->SearchCount->setText("Search complete: " + QString::number(count) + " result"); has_search_results=true; this->setCursor(Qt::ArrowCursor); } else{ ui->SearchCount->setText("Search complete: " + QString::number(count) + " results"); has_search_results=true; this->setCursor(Qt::ArrowCursor); // Show notification if search returns null. That way, people won't be scratching their heads wondering // what happened. if((count==0) && (ui->SearchFilter->currentIndex() != 0)){ this->setCursor(Qt::ArrowCursor); QMessageBox j; j.information(this,"RoboJournal","No results for search term \"" + searchterm + "\"."); ui->SearchTerm->setFocus(); ui->SearchList->setColumnWidth(0,100); has_search_results=false; } // This block gets executed if there are no matches and the user is in tag search mode. // This normally won't happen but is possible if someone removes a specific tag from all entries that // have it WITHOUT refreshing the tag list afterward. If triggered, this block forces an automatic tag refresh to fix the problem. if((count==0) && (ui->SearchFilter->currentIndex() == 0)){ this->setCursor(Qt::ArrowCursor); QMessageBox j; if(ui->TagList->count()==0){ j.critical(this,"RoboJournal","RoboJournal could not locate any tag data! You must declare at least two tags before you can use the Tag Search feature."); } else{ j.information(this,"RoboJournal","No entries are tagged with \"" + ui->TagList->currentText() + "\"." " This only happens if the tag list is out of date and needs to be refreshed (or you've just found a bug)."); } // force tag refresh to fix the situation ui->TagList->clear(); GetTagList(); ui->Output->clear(); Buffer::SearchText.clear(); has_search_results=false; } } if(count > 0){ //Resize columns to eliminate horizontal scroll if possible. for(int i=0; i < ui->SearchList->columnCount(); i++){ ui->SearchList->resizeColumnToContents(i); } } } } // update last search term with current term Buffer::LastSearchTerm=searchterm; } } // function that gets current tag list for search pane. New for 0.4 //################################################################################################ void MainWindow::GetTagList(){ if(Buffer::backend=="MySQL"){ MySQLCore b; QStringList tag_list; // list that holds all existing tags. Each tag should only be listed ONCE. QList tags=b.TagSearch(); QListIterator i(tags); while(i.hasNext()){ QString line=i.next(); QStringList tag_array=line.split(";"); for(int x=0; xTagList->addItem(tagicon,text); } } } // Launch Entry Exporter //################################################################################################ void MainWindow::ExportEntry(){ if(CurrentID!="-1"){ QTreeWidgetItem *selected=ui->EntryList->currentItem(); EntryExporter e(this); EntryExporter::title=selected->text(0); e.setWindowTitle("Export Content"); e.exec(); } } // feed in raw tag data from the database and return the formatted string //################################################################################################ QString MainWindow::FormatTags(QString tags, QString color1, QString color2){ QStringList tags_array=tags.split(";"); QString output_tags; bool has_tags=true; for(int i=0; i " + nexttag + "  "; output_tags=output_tags+nexttag; if((tags_array.at(0)=="Null") || (tags_array.at(0)=="null")){ has_tags=false; } } if((Buffer::use_custom_theme) && (!Buffer::datebox_override)){ color1=Buffer::text_hexcolor; color2=InvertColor(Buffer::text_hexcolor); } QString div="
  Tags

"; if(has_tags){ // add HR output_tags= div + "  " + output_tags; } else{ output_tags= div + "  This entry has not been tagged yet."; } if(tags_array.at(0).isEmpty()){ output_tags= div + "  No tags for this post."; } return output_tags; } // Launch Tagger function //################################################################################################ void MainWindow::Tag(){ using namespace std; QTreeWidgetItem *selected=ui->EntryList->currentItem(); // fixes crash that occurs when a null selection is passed to Tagger if(selected !=NULL){ QString title=selected->text(0); // sort by day causes problems with using regex if(Buffer::sortbyday){ // so we do nothing because title should stay as it is } else{ // truncate date from front of title int startpoint=title.indexOf(":")+2; title=title.section("",startpoint,title.size()); title=title.trimmed(); } // pass title and id to Tagger class Tagger::title=title; Tagger::id_num=selected->text(1); // prevent Tagger from opening when we are positioned on a non-entry or DB title // after all, we don't want to tag those things. if((CurrentID != "-1") && (title != Buffer::database_name)){ // pass title and id to Tagger class Tagger::title=title; Tagger::id_num=selected->text(1); Tagger t(this); t.setWindowTitle("Manage Tags"); t.exec(); // refresh entry GetEntry(CurrentID,false); } else{ cout << "OUTPUT: Tagging not allowed on invalid record!" << endl; } } } //################################################################################################ // Confirm the user's intention to quit the program. This function replaces Quit(); void MainWindow::closeEvent(QCloseEvent *event){ using namespace std; event->ignore(); // Make RoboJournal show confirmation dialogs if config says so if(Buffer::showwarnings){ // dialog that gets shown if user is connected to a journal // bugfix (12/4/12) for 0.4: show warning if the user is connected but is currently on the search tab. if((ui->DisconnectButton->isEnabled()) || (ui->tabWidget->currentIndex()==1)){ QMessageBox q(this); q.setText("Currently connected to " + Buffer::database_name + "@" + Buffer::host + "!"); q.setWindowTitle("RoboJournal"); q.setInformativeText("Do you really want to quit?"); q.setStandardButtons(QMessageBox::Cancel); QPushButton *quit=q.addButton("&Quit",QMessageBox::AcceptRole); q.setIcon(QMessageBox::Question); q.setDefaultButton(QMessageBox::Cancel); q.exec(); if(q.clickedButton() == quit){ cout << "OUTPUT: User quit the program" << endl; event->accept(); } else{ //do nothing event->ignore(); } } // dialog that gets shown if user is NOT connected to a journal // update: Don't show dialog if there is no journal active b/c it can get annoying after awhile else{ cout << "OUTPUT: User quit the program" << endl; event->accept(); } } // just quit silently if user has turned off confirm dialogs else{ cout << "OUTPUT: User quit the program" << endl; event->accept(); } } //################################################################################################ // Private function to auto-update Currentid whenever new function is selected void MainWindow::UpdateSelectedEntry(QString id){ using namespace std; // CurrentID is called by several different functions so it should ALWAYS be up // to date so you don't accidentally change the wrong entry CurrentID=id; //cout << "Current index: " << CurrentID.toStdString() << endl; } //################################################################################################ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ using namespace std; ui->setupUi(this); // Do initial UI configuration (set up toolbar, statusbar, etc.) before showing the main window PrimaryConfig(); } //################################################################################################ // Create Stylesheets for Decorate_GUI() to allow the user to apply a custom // background and font to RoboJournal GUI. This feature was requested by Sandra Goodhew // because she thought people would want to use their own backgrounds and fonts. QString MainWindow::CreateStyleSheet(bool for_entrylist, bool is_TextEdit){ using namespace std; QList stylelist; // if the user wants to use a background image, apply it if(Buffer::use_background){ // apply style to entire QTextEdit class type if(is_TextEdit){ stylelist.append("QTextEdit { "); } // create style for QTextEdit // get system colors for border/background. That way, it will look //good no matter what scheme user has QPalette pal; QBrush bg=pal.window(); QBrush border=pal.dark(); QColor swatch=bg.color(); QColor c_border=border.color(); stylelist.append("background: " + swatch.name() + " url(" + Buffer::background_image + "); "); stylelist.append("border: solid 2px " + c_border.name() + "; "); // don't tile background if config says not to if(!Buffer::tile_bg){ stylelist.append("background-repeat: no-repeat; "); } //bg should be fixed? if(Buffer::bg_is_fixed){ stylelist.append("background-attachment: fixed; "); } } stylelist.append("color: " + Buffer::text_hexcolor + "; "); // New for 0.4: Use QFont instead of CSS. CSS unfortunately affects the context menu font as well. QFont font; font.setFamily(Buffer::font_face); font.setPointSize(Buffer::font_size.toInt()); // prevent font size/style from being applied to entrylist if user doesn't want it to be if(!for_entrylist){ ui->Output->setFont(font); } else{ ui->Output->setFont(font); ui->EntryList->setFont(font); ui->SearchList->setFont(font); } //close the QTextEdit class if(is_TextEdit){ stylelist.append(" }"); } QString stylesheet; QListIterator styleiterator(stylelist); while(styleiterator.hasNext()){ stylesheet.append(styleiterator.next()); } //cout << "Style: " << stylesheet.toStdString() << endl; return stylesheet; } //################################################################################################ // Call updater void MainWindow::UpgradeJournal(){ using namespace std; QInputDialog d(this); d.setWindowTitle("Authenticate"); d.setLabelText("Provide root password for " + Buffer::host); d.setTextEchoMode(QLineEdit::Password); bool accept=d.exec(); if(accept){ QString root_pass=d.textValue(); MySQLCore my; my.UpgradeJournal(root_pass); QMessageBox m; if(my.db.isOpenError()){ m.critical(this,"RoboJournal","Could not connect! Please make sure the root password is correct and try again."); UpgradeJournal(); } else{ m.information(this,"RoboJournal", "" + Buffer::database_name + " has been upgraded successfully. Click the Connect button (or press F2) to log in."); cout << "DONE!" << endl; } } else{ cout << "FAILED!" << endl; d.close(); } } //################################################################################################ // Print current entry void MainWindow::Print(){ QPrinter p; QPrintDialog *d=new QPrintDialog(&p, this); d->setWindowTitle("Print Current Entry"); int choice=d->exec(); switch(choice){ case QPrintDialog::Accepted: ui->Output->print(&p); break; case QPrintDialog::Rejected: // do nothing break; } } //################################################################################################ // Save current entry as a text file bool MainWindow::SaveEntry(){ bool saved=true; return saved; } //################################################################################################ // Function that returns the inverse Hex color of the provided text color. // Since the text color is used for the date bar bg if custom theme is used, we want to make sure // that the text displayed is always readable. Inverse colors provide the best contrast. QString MainWindow::InvertColor(QString textcolor){ using namespace std; QColor input; input.setNamedColor(textcolor); int ired, igreen, iblue; ired=input.red(); igreen=input.green(); iblue=input.blue(); //cout << "Input RGB: " << ired << igreen << iblue << endl; int ored, ogreen, oblue; ored=255-ired; ogreen=255-igreen; oblue=255-iblue; //cout << "Output RGB: " << ored << ogreen << oblue << endl; QColor output=QColor::fromRgb(ored,ogreen,oblue); QString invertcolor=output.name(); //cout << "Inverse hex: " << invertcolor.toStdString() << endl; return invertcolor; } //################################################################################################ // Function to style GUI with custom background, font, etc. void MainWindow::Decorate_GUI(){ // Alternating Row colors can be very good or very bad depending on color scheme. //Users have a way to turn it off at long last if(!Buffer::alternate_rows){ ui->EntryList->setAlternatingRowColors(false); ui->SearchList->setAlternatingRowColors(false); } else{ ui->EntryList->setAlternatingRowColors(true); ui->SearchList->setAlternatingRowColors(true); } // remove icon labels if user doesn't want them if(!Buffer::show_icon_labels){ ui->ConnectButton->setToolButtonStyle(Qt::ToolButtonIconOnly); ui->DisconnectButton->setToolButtonStyle(Qt::ToolButtonIconOnly); ui->LastEntry->setToolButtonStyle(Qt::ToolButtonIconOnly); ui->WriteButton->setToolButtonStyle(Qt::ToolButtonIconOnly); ui->EditEntryButton->setToolButtonStyle(Qt::ToolButtonIconOnly); ui->DeleteEntry->setToolButtonStyle(Qt::ToolButtonIconOnly); ui->NextEntry->setToolButtonStyle(Qt::ToolButtonIconOnly); ui->TodayButton->setToolButtonStyle(Qt::ToolButtonIconOnly); ui->ConfigButton->setToolButtonStyle(Qt::ToolButtonIconOnly); ui->Tag->setToolButtonStyle(Qt::ToolButtonIconOnly); ui->ExportEntry->setToolButtonStyle(Qt::ToolButtonIconOnly); } else{ // restore values in case user wishes to enable them at runime ui->ConnectButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->DisconnectButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->LastEntry->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->WriteButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->EditEntryButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->DeleteEntry->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->NextEntry->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->TodayButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->ConfigButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->Tag->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->ExportEntry->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); } if(Buffer::use_custom_theme){ QString stylesheet=CreateStyleSheet(false,true); ui->Output->setStyleSheet(stylesheet); if(Buffer::set_tree_background){ stylesheet=CreateStyleSheet(true,false); ui->EntryList->setStyleSheet(stylesheet); } } // clear all styles if the user disables them during runtime else{ ui->Output->setStyleSheet(NULL); if(!Buffer::set_tree_background){ ui->EntryList->setStyleSheet(NULL); } } // QPalette winstyle; // QBrush b=winstyle.dark(); // QColor color=b.color(); // winstyle.setColor(QPalette::ToolTipBase,color); // ui->EntriesTab->setPalette(winstyle); // ui->SearchTab->setPalette(winstyle); } //################################################################################################ // New for 0.4.1 (3/26/13): This displays the help file by launching Qt Assistant as a QProcess. Qt Assistant // is stored in different places depending on operating system; thiscode looks for it in the most // likely places. Invoking robojournal.qhc causes Qt Assistant to override its default settings by showing ONLY // the RoboJournal documentation. void MainWindow::ShowHelp(){ using namespace std; this->setCursor(Qt::WaitCursor); QString assistant, compiled_help_path, collection_path; /* Use separate #ifdef blocks to set the paths for Windows and Unix-like operating systems like * Linux b/c the file structure is completely different on the two OSes. RoboJournal on Windows * requires Qt Assistantto be installed locally (in the same directory) while Linux is able to * make use of global system resources. * * -- Will Kraft, 3/31/13. */ #ifdef _WIN32 // Qt Assistant should be installed in the same folder as robojournal.exe on Win32. assistant=QDir::currentPath() + QDir::separator() + "assistant.exe"; compiled_help_path=QDir::currentPath() + QDir::separator() + "robojournal.qch"; collection_path=QDir::currentPath() + QDir::separator() + "robojournal.qhc"; #endif #ifdef unix // post-release bugfix for Fedora users (4/26/13) // have RoboJournal use the Fedora path to Assistant if applicable. QFile fedoracheck("/usr/bin/assistant-qt4"); if(fedoracheck.exists()){ assistant="/usr/bin/assistant-qt4"; } else{ assistant="/usr/bin/assistant"; } compiled_help_path="/usr/share/doc/robojournal/robojournal.qch"; collection_path="/usr/share/doc/robojournal/robojournal.qhc"; #endif QFile assistant_exec(assistant); if(assistant_exec.exists()){ QFile collection_file(collection_path); QFile documentation_file(compiled_help_path); cout << "OUTPUT: Attempting to find help collection file located at " << collection_file.fileName().toStdString() << endl; cout << "OUTPUT: Attempting to find compiled documentation file located at " << documentation_file.fileName().toStdString() << endl; if((collection_file.exists()) && (documentation_file.exists())){ QProcess *p=new QProcess(); QStringList args; #ifdef _WIN32 args << "-collectionFile" << "robojournal.qhc" << "-enableRemoteControl"; #endif #ifdef unix args << "-collectionFile" << collection_path << "-enableRemoteControl"; #endif // Spawn the Assistant process with the OS-specific path-to-binary and args. p->start(assistant, args); // Instruct Qt Assistant to completely expand the TOC immediately after launch. This saves // the user lots of pointless clicking but the expand instruction doesn't always work properly. // Addendum 3/31/13: Hide the Index tab b/c that part isn't finished yet (and probably // won't be for some time). QByteArray input; input.append("expandToc -1;"); input.append("hide index\n"); p->write(input); if (!p->waitForStarted()){ return; } this->setCursor(Qt::ArrowCursor); } else{ // Share this messagebox object between several conditionals... it's just more efficient. // In all cases, show appropriate errors if one or more files is missing. QMessageBox b; if((!collection_file.exists()) && (!documentation_file.exists())){ QString location; #ifdef _WIN32 location=QDir::current().path(); #endif #ifdef unix location="/usr/share/doc/robojournal"; #endif b.critical(this,"RoboJournal","RoboJournal could not locate the collection file" " (robojournal.qhc) or the compiled help file (robojournal.qch). Please" " locate these two files and copy them into " + location + "."); this->setCursor(Qt::ArrowCursor); } else{ if(!collection_file.exists()){ b.critical(this,"RoboJournal","RoboJournal cannot display the documentation because the Collection File " "needed by Qt Assistant is missing. Please copy the Collection File to " + collection_path + " and try again."); this->setCursor(Qt::ArrowCursor); } if(!documentation_file.exists()){ b.critical(this,"RoboJournal","RoboJournal cannot display the documentation because the Compiled Help File " "needed by Qt Assistant is missing. Please copy the Compiled Help File to " + compiled_help_path + " and try again."); this->setCursor(Qt::ArrowCursor); } } } } // Show error if Qt assistant is not installed else{ QMessageBox c; c.critical(this,"RoboJournal","RoboJournal cannot display the documentation because Qt Assistant" " is not installed correctly. Please install (or move) the Qt Assistant executable to " + assistant + " and try again."); this->setCursor(Qt::ArrowCursor); } } //################################################################################################ // Fetch entry based on ID void MainWindow::GetEntry(QString id, bool fromSearch){ using namespace std; // Current record should be the ID of the most recent selected entry Record=id; if(Buffer::backend=="MySQL"){ MySQLCore my; QString entry=my.RetrieveEntry(id); QString datestamp=my.TimeStamp(id); // pass ddatestamp to global date variable. We need this for the EntryExporter class. Global_Datestamp=datestamp; // convert plain text linebreaks to html entry.replace("\n","
"); // trim whitespace from entry entry=entry.simplified(); // find and use system colors QPalette pal; QBrush bg=pal.highlight(); QBrush fg=pal.highlightedText(); QColor bgcolor=bg.color(); QColor fgcolor=fg.color(); QString color1=bgcolor.name(); QString color2=fgcolor.name(); // set masthead and display text QString text; // use timestamp? if(Buffer::keep_time){ // fetch timestamp QString timestamp=my.GetTimestamp(Record); //cout << "Record: " + Record.toStdString() << endl; // get tags QString tags=my.GetTags(Record); //format tags QString output_tags=FormatTags(tags, color1,color2); QString username=Buffer::username; if(Buffer::use_full_name){ username=Buffer::full_name; } // get title if buffer has it if(Buffer::show_title){ QString title=my.GetTitle(id); title="

" + title + "

"; //Highlight the search term if this is triggered from the search function. if((fromSearch) && Buffer::use_highlight){ QStringList highlighted=HighlightResults(entry,title,ui->SearchTerm->text(),ui->SearchFilter->currentIndex()); entry=highlighted.at(0); title=highlighted.at(1); } if((Buffer::use_custom_theme) && (!Buffer::datebox_override)){ QString invertcolor=InvertColor(Buffer::text_hexcolor); text= title + "
  On " + datestamp + " at "+ timestamp + ", " + username + " wrote:

" + entry + "
" + output_tags + "
"; } else{ text= title + "
   On " + datestamp + " at "+ timestamp + ", " + username + " wrote:

" + entry + "
" + output_tags + "
"; } } // do not show title else{ if(Buffer::use_custom_theme){ QString invertcolor=InvertColor(Buffer::text_hexcolor); text="
   On " + datestamp + " at "+ timestamp + ", " + username + " wrote:

" + entry + "
" + output_tags + "
"; } else{ text="
   On " + datestamp + " at "+ timestamp + ", " + username + " wrote:

" + entry + "
" + output_tags + "
"; } } // pass values to entry exporter current_entry_date=datestamp; current_entry_body=entry; current_entry_time=timestamp; } //no timestamp else{ // get title if buffer has it if(Buffer::show_title){ // get tags QString tags=my.GetTags(Record); //format tags QString output_tags=FormatTags(tags,color1,color2); QString title=my.GetTitle(id); title="

" + title + "

"; //Highlight the search term if this is triggered from the search function. if((fromSearch) && Buffer::use_highlight){ QStringList highlighted=HighlightResults(entry,title,ui->SearchTerm->text(),ui->SearchFilter->currentIndex()); entry=highlighted.at(0); title=highlighted.at(1); } if((Buffer::use_custom_theme) && (!Buffer::datebox_override)){ QString invertcolor=InvertColor(Buffer::text_hexcolor); text= title + "
   On " + datestamp + ", " + Buffer::username + " wrote:

" + entry + "
" + output_tags + "
"; } else{ text= title + "
   On " + datestamp + ", " + Buffer::username + " wrote:

" + entry + "
" + output_tags + "
"; } } // do not show title else{ // get tags QString tags=my.GetTags(Record); //format tags QString output_tags=FormatTags(tags,color1,color2); //Highlight the search term if this is triggered from the search function. if((fromSearch) && Buffer::use_highlight){ QStringList highlighted=HighlightResults(entry,"NULL",ui->SearchTerm->text(),ui->SearchFilter->currentIndex()); entry=highlighted.at(0); } if((Buffer::use_custom_theme) && (!Buffer::datebox_override)){ QString invertcolor=InvertColor(Buffer::text_hexcolor); text="
   On " + datestamp + ", " + Buffer::username + " wrote:

" + entry + "
" + output_tags + "
"; } else{ text="
   On " + datestamp + ", " + Buffer::username + " wrote:

" + entry + "
" + output_tags + "
"; } } // pass values to entry exporter current_entry_date=datestamp; current_entry_body=entry; } // set entry text ui->Output->setText(text); // Decide which buffer to place the current text if(Buffer::On_Search){ Buffer::SearchText=text; } else{ Buffer::EntryText=text; } // Update EntryExporter class QTreeWidgetItem *selected=ui->EntryList->currentItem(); // Bugfix 6/29/12: Prevent segfault after editing an entry. The reason for the bug //is that selected returned null. if(selected != NULL){ QString entrytitle=selected->text(0); QString timestamp=my.GetTimestamp(Record); EntryExporter e; e.UpdateValues(entrytitle,datestamp,entry,timestamp); } } } //################################################################################################ // Function that sets up main window GUI when mainwindow is called at startup void MainWindow::PrimaryConfig(){ // Use a nice big png icon for linux/unix.. that little Windows ico file just doesn't cut it. // This is really only noticable on KDE4/Unity environments. (and probably Mac if someone builds for that) QIcon unixicon(":/icons/robojournal-icon-big.png"); this->setWindowIcon(unixicon); // declare magic sizing algorithm for MainWindow splitter. For some unknown reason the TabWidget throws this off // so it is necessary to compensate. splittersize=this->width()/4+95; // previously width/4+30 #ifdef _WIN32 //Windows needs a slightly smaller ratio splittersize=this->width()/4+60; // previously width/4+10 #endif // auto-select entry list mentu entry ui->actionEntry_List->setChecked(true); switch(Buffer::toolbar_pos){ case 0: this->addToolBar(Qt::LeftToolBarArea,ui->mainToolBar); break; case 1: this->addToolBar(Qt::TopToolBarArea,ui->mainToolBar); break; case 2: this->addToolBar(Qt::RightToolBarArea,ui->mainToolBar); break; } // Setup Statusbar ui->TotalCount->clear(); ui->statusBar->addWidget(ui->StatusMessage,1); //############################################################################# // New in 0.3: User notification is a separate statusbar object. ui->statusBar->addPermanentWidget(ui->Status_User,0); ui->Status_User->clear(); ui->statusBar->addPermanentWidget(ui->TotalCount,0); // setup toolbars. Buttons will be added in the order listed here. ui->mainToolBar->addWidget(ui->ConnectButton); ui->mainToolBar->addWidget(ui->DisconnectButton); ui->mainToolBar->addSeparator(); ui->mainToolBar->addWidget(ui->TodayButton); ui->mainToolBar->addWidget(ui->LastEntry); ui->mainToolBar->addWidget(ui->NextEntry); ui->mainToolBar->addWidget(ui->Tag); ui->mainToolBar->addWidget(ui->ExportEntry); ui->mainToolBar->addSeparator(); ui->mainToolBar->addWidget(ui->WriteButton); ui->mainToolBar->addWidget(ui->EditEntryButton); ui->mainToolBar->addWidget(ui->DeleteEntry); ui->mainToolBar->addSeparator(); ui->mainToolBar->addWidget(ui->ConfigButton); //Set up Search Tab QIcon tag(":/icons/tag_orange.png"); QIcon pat(":/icons/funnel.png"); ui->SearchFilter->setItemIcon(0,tag); ui->SearchFilter->setItemIcon(1,pat); ui->SearchFilter->setItemIcon(2,pat); ui->SearchFilter->setItemIcon(3,pat); ui->SearchFilter->setCurrentIndex(3); ui->SearchTerm->setDisabled(true); ui->ClearButton->setDisabled(true); ui->SearchButton->setDisabled(true); ui->TagList->setDisabled(true); ui->SearchFilter->setDisabled(true); ui->WholeWords->setDisabled(true); //ui->HighlightTerm->setDisabled(true); ui->SearchCount->clear(); // hide export entry feature for now... we need to include it in 0.3 ui->actionSave_Current_Entry->setVisible(false); // Set startup toolbar config ui->WriteButton->setDisabled(true); ui->actionPrint->setDisabled(true); ui->Tag->setDisabled(true); ui->ExportEntry->setDisabled(true); ui->NextEntry->setDisabled(true); ui->LastEntry->setDisabled(true); ui->TodayButton->setDisabled(true); ui->SearchButton->setDisabled(true); ui->DeleteEntry->setDisabled(true); ui->EditEntryButton->setDisabled(true); ui->DisconnectButton->setDisabled(true); ui->actionManage_Tags_2->setDisabled(true); ui->actionLatest_Entry->setDisabled(true); ui->actionNext_Entry->setDisabled(true); ui->actionPrevious_Entry->setDisabled(true); ui->actionDisconnect->setDisabled(true); ui->actionWrite->setDisabled(true); ui->actionDelete_Current_Entry->setDisabled(true); ui->actionEdit_Selected_Entry->setDisabled(true); ui->actionExport_Entry->setDisabled(true); QPixmap noicon("qrc:///icons/database_error.png"); ui->StatusMessage->setPixmap(noicon); ui->StatusMessage->setText("Click the Connect button (or press F2) to work with a journal database."); ui->EntryList->setColumnWidth(0,450); //Column 1 (Entry ID) is important since it contains the DB row ID, that we check the DB with // but it's not necessary for the user to see the column since it just // clutters the form ui->EntryList->setColumnWidth(1,70); ui->EntryList->setColumnHidden(1,true); // Deal with pesky splitter spacing issues by setting tooltip this way. ui->WholeWords->setToolTip("If checked, this option requires the search to return matches that consist only of whole words" " (i.e. cat but not category or concatenation)."); ui->SearchTerm->setToolTip("

Enter the pattern (one or more words) you wish to search for in this field and click the Search button to continue.

FYI: The pattern search function is case-sensitive!

"); // Set properties for search list ui->SearchList->setColumnHidden(3,true); ui->SearchList->setHeaderHidden(false); ui->SearchList->setColumnWidth(0,100); ui->SearchList->sortByColumn(1,Qt::DescendingOrder); // define header titles for search list. They are displayed in the order they are fed into the StringList. QStringList header; header << "Entry Title" << "Date" << "Hits" << "id"; ui->SearchList->setHeaderLabels(header); // flip the connection active switch ConnectionActive=false; // keep the program from crashing if the user clicks Modify before selecting an entry CurrentID="-1"; //Decorate the GUI Decorate_GUI(); // Lock search tab prior to login. This is important because if we switch to the search tab before logging in // the toolbar buttons' enable/disable code doesn't work properly anymore. Furthermore, there's no practical reason to have // search enabled at startup anyway. ui->tabWidget->setTabEnabled(1,false); /* // Constructor for testing FirstRun, comment out this block in production builds. FirstRun doesn't need to start on // normal operations... that would just be weird. FirstRun f; f.exec(); */ //############################################################################# // New for RoboJournal 0.4 // force initial 50/50 ratio on splitter. This involves a weird hack that requires the right side to be set to a huge number // that is greater than 100. (the left side should always be 1) For some reason, The Tabbed interface wants to be a certain //size, so we have to grow the right side by a huge amount to compensate. Strange, but it seems to work. // New for 0.5: Force the splitter size ONLY IF a stored value does not exist. // Added 6/21/13. Backported to 0.4.2 on 9/13/13. if(!Buffer::mw_splitter_size.isEmpty()){ ui->splitter->restoreState(Buffer::mw_splitter_size); } else{ QList size; size.append(1); size.append(splittersize); // was originally 225 but fixed values dont work very well ui->splitter->setSizes(size); } launched_editor=false; launched_config=false; // Restore window size from last session if available. If there is no stored data, // use default size. if(!Buffer::mainwindow_geometry.isEmpty()){ this->restoreGeometry(Buffer::mainwindow_geometry); } //############################################################################# //new for RoboJournal 0.4.1: //set tooltips for mainwindow tabs. This way is less messy than doing it in the ui files. ui->tabWidget->setTabToolTip(0,"Display the Chronological Entry List."); ui->tabWidget->setTabToolTip(1,"Search for entries containing specific patterns or tags. " "(requires active connection)"); // bugfix: make it so the search term field triggers the search button when the Enter key is pressed. // In 0.4 the user had to push the enter key twice to make it work. connect(ui->SearchTerm, SIGNAL(returnPressed()), ui->SearchButton,SIGNAL(clicked())); //connect(ui->TagList, SIGNAL(currentIndexChanged(QString)), ui->SearchButton,SIGNAL(clicked())); connect(ui->SearchFilter, SIGNAL(currentIndexChanged(QString)), ui->ClearButton,SIGNAL(clicked())); // Update for 0.4.1: Set titlebar text w/o version number (1/8/13) this->setWindowTitle("RoboJournal"); } //################################################################################################ // Connect to database function void MainWindow::Connect(){ using namespace std; DBLogin l(this); l.setWindowTitle("New Connection [" + Buffer::backend + "]"); bool is_connected=false; // check to see if connection is true l.Refresh(); l.exec(); // if user provided login data if(Buffer::login_succeeded){ this->setCursor(Qt::WaitCursor); if(Buffer::backend=="MySQL"){ this->setCursor(Qt::WaitCursor); MySQLCore my; MySQLCore::dialogX=l.x(); MySQLCore::dialogY=l.y(); bool success=my.Connect(); bool is_sane=my.SanityCheck(); if(!success){ // check to make sure the MYSQL driver is installed, return error if false // If you're using a static build of QT you're probably never going to see this error if(!my.db.isDriverAvailable("QMYSQL")){ this->setCursor(Qt::ArrowCursor); QMessageBox j; j.critical(this,"RoboJournal","The Qt MySQL driver is not available! The most likely cause " " for this problem is that Qt was not built correctly or is incomplete. RoboJournal" " will not be able to use MySQL databases until this problem is fixed."); } // if the user got this far, the driver is good but there was a different problem encountered //logging in. (permission error, bad passwd, etc.) if(my.db.isOpenError()){ this->setCursor(Qt::ArrowCursor); QMessageBox m; QString reason; if((Buffer::host=="localhost") || (Buffer::host=="127.0.0.1")){ reason="Make sure you entered the correct username/password and try again."; } else{ reason="Are you allowed to access " + Buffer::database_name + " from this computer? If so, make sure you entered the correct username/password and try again."; } m.critical(this,"RoboJournal","RoboJournal could not connect to " + Buffer::database_name + "@" + Buffer::host + ".

" + reason ); // allow user to try again l.ResetPassword(); Connect(); } } else{ if(!is_sane){ // does the journal fail sanity check because it is old.... if(Buffer::needs_upgrade){ // show upgrade dialog QMessageBox u(this); u.setIcon(QMessageBox::Question); u.setWindowTitle("RoboJournal"); u.setText("" + Buffer::database_name + " is a valid journal but it must be upgraded before RoboJournal " + Buffer::version + " can use it. After this journal has been upgraded to the new format, it will no longer be " "compatible with older versions of RoboJournal.

Do you want to upgrade this journal now?"); u.setStandardButtons(QMessageBox::Yes | QMessageBox::No); u.setDefaultButton(QMessageBox::Yes); int choice=u.exec(); switch(choice){ case QMessageBox::Yes: // Update journal cout << "OUTPUT: Starting journal upgrade process..."; UpgradeJournal(); break; case QMessageBox::No: // do nothing break; } // reset upgrade flag Buffer::needs_upgrade=false; } // or because it is just 100% invalid due to structure else{ QMessageBox m; m.critical(this,"RoboJournal","Database " + Buffer::database_name + " is not a valid journal!"); cout << "ERROR: Database " << Buffer::database_name.toStdString() << " FAILED sanity check, aborting load sequence!" << endl; } } else{ ui->WriteButton->setEnabled(true); ui->TodayButton->setEnabled(true); ui->SearchButton->setEnabled(true); ui->EditEntryButton->setEnabled(true); ui->DisconnectButton->setEnabled(true); ui->NextEntry->setEnabled(true); ui->LastEntry->setEnabled(true); ui->DeleteEntry->setEnabled(true); ui->actionWrite->setEnabled(true); ui->actionLatest_Entry->setEnabled(true); ui->actionNext_Entry->setEnabled(true); ui->actionPrevious_Entry->setEnabled(true); ui->actionDisconnect->setEnabled(true); ui->actionDelete_Current_Entry->setEnabled(true); ui->actionEdit_Selected_Entry->setEnabled(true); ui->actionPrint->setEnabled(true); ui->Tag->setEnabled(true); ui->ExportEntry->setEnabled(true); ui->actionManage_Tags_2->setEnabled(true); ui->actionConnect->setDisabled(true); ui->ConnectButton->setDisabled(true); ui->actionExport_Entry->setEnabled(true); // prepare Search pane ui->SearchTerm->setDisabled(false); ui->ClearButton->setDisabled(false); ui->SearchButton->setDisabled(false); ui->SearchFilter->setDisabled(false); ui->WholeWords->setDisabled(false); ui->WholeWords->setChecked(true); //ui->HighlightTerm->setDisabled(false); // Get ID list //int year_range=Buffer::entryrange.toInt(); IDList=my.Create_ID_List(Buffer::entryrange); CreateTree(); ui->StatusMessage->setText("Connected to " + Buffer::backend + " database " + Buffer::database_name + " on " + Buffer::host); // provide user notification on statusbar (new for 0.3) ui->Status_User->setTextFormat(Qt::RichText); ui->Status_User->setAlignment(Qt::AlignHCenter | Qt::AlignTop); if(Buffer::is_male){ ui->Status_User->setText("  " + Buffer::username + "  "); } else{ ui->Status_User->setText("  " + Buffer::username + "  "); } ui->Status_User->setToolTip("Logged in as \"" + Buffer::username + "\""); is_connected=true; } //new for 0.4.1 // Add journal name to title bar if config allows it if(Buffer::name_in_titlebar){ this->setWindowTitle(Buffer::database_name +" - RoboJournal"); } this->setCursor(Qt::ArrowCursor); } } if(Buffer::backend=="Postgres"){ PSQLCore po; bool success=po.Connect(); if(!success){ QMessageBox m; m.critical(this,"Error","Connection attempt with " + Buffer::database_name + " on " + Buffer::host + " failed."); } else{ ui->WriteButton->setEnabled(true); ui->TodayButton->setEnabled(true); ui->SearchButton->setEnabled(true); ui->EditEntryButton->setEnabled(true); ui->DisconnectButton->setEnabled(true); ui->NextEntry->setEnabled(true); ui->LastEntry->setEnabled(true); ui->ConnectButton->setDisabled(true); ui->StatusMessage->setText("Connected to " + Buffer::database_name + " on " + Buffer::host); } } } if(Buffer::backend=="SQLite"){ SQLiteCore sl; bool success=sl.Connect(); if(!success){ QMessageBox m; m.critical(this,"Error", Buffer::backend + " connection attempt with " + Buffer::database_name + " on " + Buffer::host + " failed."); } else{ ui->WriteButton->setEnabled(true); ui->TodayButton->setEnabled(true); ui->SearchButton->setEnabled(true); ui->EditEntryButton->setEnabled(true); ui->DisconnectButton->setEnabled(true); ui->NextEntry->setEnabled(true); ui->LastEntry->setEnabled(true); ui->ConnectButton->setDisabled(true); ui->StatusMessage->setText("Connected to " + Buffer::database_name + " on " + Buffer::host); } // create the entry tree CreateTree(); this->setCursor(Qt::ArrowCursor); // flip the connection active switch ConnectionActive=true; } // connect to latest entry automatically if((is_connected && num_records != 0) || (ConnectionActive)){ ui->NextEntry->setEnabled(true); ui->LastEntry->setEnabled(true); ui->TodayButton->setEnabled(true); // only load most recent entry if config allows it if(Buffer::autoload){ MostRecent(); Record=CurrentID; } } // if there are no entries at login, disable a few buttons to prevent crashes else{ if(num_records==0){ ui->TodayButton->setEnabled(false); ui->NextEntry->setEnabled(false); ui->LastEntry->setEnabled(false); ui->DeleteEntry->setEnabled(false); ui->EditEntryButton->setEnabled(false); ui->actionLatest_Entry->setDisabled(true); ui->actionNext_Entry->setDisabled(true); ui->actionPrevious_Entry->setDisabled(true); ui->actionDelete_Current_Entry->setDisabled(true); ui->actionEdit_Selected_Entry->setDisabled(true); } } //unlock search tab if a connection has been made. if(is_connected){ ui->tabWidget->setTabEnabled(1,true); // new for 0.4.1: change tooltip once tab has been unlocked. ui->tabWidget->setTabToolTip(1,"Search for entries containing specific patterns or tags."); } // show tag reminder-- new for 0.4.1 if(Buffer::show_untagged_reminder){ TagReminder t(this); // Bugfix (cheap hack) 2/28/13: Call the Lookup() function on line # 1735 and get int count to see if // the TagReminder dialog should be displayed at all. We don't do anything with this data other than // get a count of the items in the list. It runs again (for real) after the form gets exec()ed. // Kind of kludgy and inefficient but at least it works now without breaking QDialog::showEvent(). int untagged_count=t.Lookup(); if(untagged_count > 0){ t.exec(); // 3/13/13: Update RoboJournal's configuration using data stored in buffer if the "Display this // reminder window next time" box was unchecked when the TagReminder instance was destructed. This // was originally done fro mthe TagReminder class but that produced a bug that sometimes required // the user to click the close button twice. This method is a bit less elegant but it fixes that problem. SettingsManager sm; sm.SaveNagPreferences(); // reload the config b/c we made changes. This prevents the preferences window from // relying on old data and getting out of sync with the real app configuration. sm.LoadConfig(); // Bugfix 3/5/13: Refresh most recent entry (if autoload=true) just in case user added new tags to it // with Tag Reminder. if(Buffer::autoload){ MostRecent(); } } } } //################################################################################################ /* Launch editor in revision mode. QString entry is the selected index. */ void MainWindow::Modify(){ using namespace std; if(CurrentID != "-1"){ this->setCursor(Qt::WaitCursor); ui->statusBar->showMessage("Retrieving requested entry from server, please wait....",0); Buffer::editentry=CurrentID; Buffer::editmode=true; Editor e(this); e.exec(); launched_editor=true; // Update Tree CreateTree(); // refresh entry in Output Pane GetEntry(CurrentID,false); ui->StatusMessage->setText("Connected to " + Buffer::backend + " database " + Buffer::database_name + " on " + Buffer::host); // keep current entry selected HighlightCurrentSelection(CurrentID); this->setCursor(Qt::ArrowCursor); ui->statusBar->clearMessage(); } else{ // show error if no valid entries are selected QMessageBox a; a.critical(this,"RoboJournal","Please select an entry to modify before clicking the Modify Entry button."); } } //################################################################################################ // Delete an entry void MainWindow::DeleteSelectedEntry(){ MySQLCore my; // make sure we're not working with a node, since nodes always have -1 as Current ID if(CurrentID!="-1"){ if(Buffer::showwarnings){ QMessageBox b; int choice=b.question(this,"RoboJournal","Do you really want to delete the selected journal entry?" " This action cannot be undone.",QMessageBox::Cancel,QMessageBox::Ok); switch(choice){ case QMessageBox::Ok: if(Buffer::backend=="MySQL"){ my.DeleteEntry(CurrentID); CreateTree(); ui->StatusMessage->setText("Connected to " + Buffer::backend + " database " + Buffer::database_name + " on " + Buffer::host); ui->Output->setPlainText(NULL); // Bugfix (8/15/12) prevent the deleter from being used again until a different node is clicked CurrentID = -1; ui->EntryList->clearSelection(); } break; case QMessageBox::Cancel: // do nothing break; } } else{ if(Buffer::backend=="MySQL"){ my.DeleteEntry(CurrentID); CreateTree(); ui->StatusMessage->setText("Connected to " + Buffer::backend + " database " + Buffer::database_name + " on " + Buffer::host); ui->Output->setPlainText(NULL); // Bugfix (8/15/12) prevent the deleter from being used again until a different node is clicked CurrentID = -1; ui->EntryList->clearSelection(); } } //Disable the Tagger and Exporter momentarily because RJ will crash if people click on these w/o // an entry selected. // bugfix (8/27/12) Prevent crash by disabling the tagger and entryexporter after posting an entry. ui->Tag->setDisabled(true); ui->ExportEntry->setDisabled(true); ui->actionManage_Tags_2->setDisabled(true); ui->actionExport_Entry->setDisabled(true); } } /* This function doesn't really terminate a connection since there is no persistent connection... all SQL queries are called directly as needed. it just resets the MainWindow class to its intial state so a new connection could be made later. */ //################################################################################################ void MainWindow::Disconnect(){ // Bugfix for 0.4.1 (3/14/13): clear all current search data to prevent a segfault that happens // if the user disconnects while there are active search results in the Search Tab. ClearSearchResults(); ui->WriteButton->setDisabled(true); ui->NextEntry->setDisabled(true); ui->LastEntry->setDisabled(true); ui->Tag->setDisabled(true); ui->actionManage_Tags_2->setDisabled(true); ui->TodayButton->setDisabled(true); ui->SearchButton->setDisabled(true); ui->DeleteEntry->setDisabled(true); ui->EditEntryButton->setDisabled(true); ui->DisconnectButton->setDisabled(true); ui->ConnectButton->setEnabled(true); ui->ExportEntry->setDisabled(true); ui->Output->setText(NULL); ui->EntryList->clear(); ui->actionWrite->setDisabled(true); ui->actionDisconnect->setDisabled(true); ui->actionLatest_Entry->setDisabled(true); ui->actionNext_Entry->setDisabled(true); ui->actionPrevious_Entry->setDisabled(true); ui->actionDelete_Current_Entry->setDisabled(true); ui->actionEdit_Selected_Entry->setDisabled(true); ui->actionConnect->setEnabled(true); ui->EntryList->setHeaderHidden(true); ui->actionWrite->setDisabled(true); ui->actionPrint->setDisabled(true); ui->actionExport_Entry->setDisabled(true); // prepare Search pane ui->SearchTerm->setDisabled(true); ui->ClearButton->setDisabled(true); ui->SearchButton->setDisabled(true); ui->TagList->setDisabled(true); ui->TagList->clear(); ui->SearchList->clear(); ui->SearchTerm->clear(); ui->SearchFilter->setDisabled(true); ui->SearchFilter->setCurrentIndex(3); //ui->HighlightTerm->setDisabled(true); ui->SearchCount->clear(); // Clear the ID list so we don't have data from previous connections on it. That sure would cause problems.... IDList.clear(); // flip the connection active switch ConnectionActive=false; ui->StatusMessage->setText("Terminated connection with " + Buffer::host + ""); ui->TotalCount->clear(); ui->TotalCount->setToolTip(NULL); ui->Status_User->clear(); // Clean buffered entry text Buffer::SearchText.clear(); Buffer::EntryText.clear(); // Re-lock search tab ui->tabWidget->setTabEnabled(1,false); // new for 0.4.1: change tooltip text on disconnect ui->tabWidget->setTabToolTip(1,"Search for entries containing specific patterns or tags. " "(requires active connection)"); /* Bugfix 2/10/13: revert title bar after disconnect. Revert if the name_in_titlebar flag is still active OR if the user disabled the flag during the current connection (otherwise it won't get reverted). */ if((Buffer::name_in_titlebar) || (windowTitle()== Buffer::database_name + " - RoboJournal")){ this->setWindowTitle("RoboJournal"); } //clean out list of untagged entries in buffer. This prevents the list from having items from // multiple sessions. Buffer::records.clear(); } //################################################################################################ // show preferences window void MainWindow::Preferences(){ Newconfig c(this); //c.setWindowTitle("RoboJournal Preferences"); c.exec(); launched_config=true; if(c.MadeChanges){ SettingsManager s; s.LoadConfig(); if((!ConnectionActive) && (ui->DisconnectButton->isEnabled())){ CreateTree(); ui->StatusMessage->setText("Connected to " + Buffer::backend + " database " + Buffer::database_name + " on " + Buffer::host); } // Setup toolbar position again in case user changed it switch(Buffer::toolbar_pos){ case 0: this->addToolBar(Qt::LeftToolBarArea,ui->mainToolBar); break; case 1: this->addToolBar(Qt::TopToolBarArea,ui->mainToolBar); break; case 2: this->addToolBar(Qt::RightToolBarArea,ui->mainToolBar); break; } } //Re-decorate the GUI Decorate_GUI(); //Disable the Tagger and Exporter momentarily because RJ will crash if people click on these w/o // an entry selected. // bugfix (8/15/12) Prevent crash by disabling the tagger and entryexporter after posting an entry. ui->Tag->setDisabled(true); ui->ExportEntry->setDisabled(true); ui->actionManage_Tags_2->setDisabled(true); ui->actionExport_Entry->setDisabled(true); } //################################################################################################ // show credits window void MainWindow::ShowCredits(){ AboutRJ a(this); int width=a.width(); int height=a.height(); a.setMaximumSize(width, height); a.setMinimumSize(width, height); a.setWindowTitle("About RoboJournal"); a.exec(); } //################################################################################################ // Call editor dialog class void MainWindow::Write(){ using namespace std; this->setCursor(Qt::WaitCursor); ui->statusBar->showMessage("Preparing a new entry, please wait...",0); // Start Editor in new entry mode Buffer::editmode=false; // Declare and show a journal editor object Editor e(this); e.setWindowTitle("Untitled Entry - RoboJournal"); e.exec(); launched_editor=true; // Refresh the entry list cout << "OUTPUT: Re-creating entry list to include newest entry." << endl; CreateTree(); // rebuild ID list MySQLCore my; IDList.clear(); IDList=my.Create_ID_List(Buffer::entryrange); // Reset Status bar message ui->StatusMessage->setText("Connected to " + Buffer::backend + " database " + Buffer::database_name + " on " + Buffer::host); // bugfix (8/15/12) Prevent crash by disabling the tagger and entryexporter after posting an entry. // the app will segfault if the user clicks on those buttons if there's no entry selected. ui->Tag->setDisabled(true); ui->ExportEntry->setDisabled(true); ui->actionManage_Tags_2->setDisabled(true); ui->actionExport_Entry->setDisabled(true); this->setCursor(Qt::ArrowCursor); ui->statusBar->clearMessage(); } //################################################################################################ // Function that highlights the tree item corresponding to current entry being viewed void MainWindow::HighlightCurrentSelection(QString CurrentID){ using namespace std; ui->EntryList->clearSelection(); QTreeWidgetItemIterator it(ui->EntryList,QTreeWidgetItemIterator::NoChildren); while (*it) { if ((*it)->text(1) == CurrentID) (*it)->setSelected(true); ++it; // Make sure CurrentID always reflects current highlighted index // This is necessary in case the user wants to edit an entry this->CurrentID=CurrentID; } // make sure that the currentitem and selecteditem are always the same. // if not, the Entryexporter and Tagger usually get out of sync with the entry being viewed. QList current=ui->EntryList->selectedItems(); ui->EntryList->setCurrentItem(current[0]); QTreeWidgetItem *selected=ui->EntryList->currentItem(); // forward the current selected entry to entry exporter if(selected != NULL){ EntryExporter e; // get title QString title=selected->text(0); title=title.trimmed(); title=title.simplified(); // process timestamp if(current_entry_time.isEmpty()){ if(Buffer::backend=="MySQL"){ MySQLCore d; current_entry_time=d.GetTimestamp(selected->text(1)); } } e.UpdateValues(title,current_entry_date,current_entry_body,current_entry_time); } ui->Tag->setEnabled(true); ui->ExportEntry->setEnabled(true); ui->actionManage_Tags_2->setEnabled(true); ui->actionExport_Entry->setEnabled(true); } //################################################################################################ // Return the long date from the short date. (int) This was originally done more than once // in CreateTree() so it made sense to split it into a separate function to prevent redundant code QString MainWindow::GetLongMonth(int month){ QString longmonth; switch(month){ case 1: longmonth="January"; break; case 2: longmonth="February"; break; case 3: longmonth="March"; break; case 4: longmonth="April"; break; case 5: longmonth="May"; break; case 6: longmonth="June"; break; case 7: longmonth="July"; break; case 8: longmonth="August"; break; case 9: longmonth="September"; break; case 10: longmonth="October"; break; case 11: longmonth="November"; break; case 12: longmonth="December"; break; } return longmonth; } //################################################################################################ // All-important function that sets up the Entry tree list. void MainWindow::CreateTree(){ using namespace std; ui->StatusMessage->setText("Populating entry list, please wait..."); QIcon rooticon(":/icons/database.png"); //QIcon monthicon(":/icons/bullet_black.png"); //QIcon yearicon(":/icons/bullet_blue.png"); QString iconpath; switch(Buffer::entry_node_icon){ case 0: iconpath=":/icons/pencil.png"; break; case 1: iconpath=":/icons/pencil2.png"; break; case 2: iconpath=":/icons/pencil-small.png"; break; case 3: iconpath=":/icons/balloon-quotation.png"; break; case 4: iconpath=":/icons/node.png"; break; case 5: iconpath=":/icons/bullet_black.png"; break; case 6: iconpath=":/icons/bullet_blue.png"; break; } QIcon entryicon(iconpath); // get rid of indicator (expand/collapse widget) on root node. Fixed in version 0.3. ui->EntryList->setRootIsDecorated(false); QFont heavy("sans",10); heavy.setWeight(QFont::DemiBold); int totalcount=0; // clear message and tree panes ui->EntryList->clear(); if(!Buffer::On_Search){ ui->Output->clear(); } // MySQL code if(Buffer::backend=="MySQL"){ // sort entries by day if(Buffer::sortbyday){ cout << "OUTPUT: Creating entry list from contents of MySQL database " << Buffer::database_name.toStdString() << " ..."; MySQLCore my; bool NewJournal=true; QList YearList; QList MonthList; QList DayList; QList EntryList; YearList=my.getYear(); QListIterator IteratorYear(YearList); //ui->EntryList->setHeaderLabel("Database contents (chronological)"); //ui->EntryList->setToolTip(NULL); //ui->EntryList->setHeaderHidden(false); QString db=Buffer::database_name; QTreeWidgetItem *root = new QTreeWidgetItem(ui->EntryList); root->setText(0, db); root->setIcon(0,rooticon); root->setToolTip(0, "" + Buffer::database_name + "@" + Buffer::host + ""); for(int y=0; ysetText(0, nextyear); MonthList=my.getMonth(nextyear); QListIterator IteratorMonth(MonthList); for(int m=0; m < MonthList.count(); m++){ QTreeWidgetItem *month = new QTreeWidgetItem(year); //month->setFont(0,heavy); //month->setIcon(0,monthicon); QString itemmonth=IteratorMonth.next(); //cout << "Item month:" << itemmonth.toStdString() < IteratorDay(DayList); int EntryCount=0; // keep track of the number of entries for each month for(int d=0; dsetText(0, itemday + " " + longmonth ); break; case 1: // usa day->setText(0,longmonth + " " + itemday); break; case 2: // japan day->setText(0,longmonth + " " + itemday); break; } EntryList=my.getEntries(itemday,itemmonth); QListIterator IteratorEntry(EntryList); for(int e=0; esetText(0, item[0]); EntryItem->setToolTip(0, tooltip); EntryItem->setText(1, item[1]); EntryItem->setIcon(0,entryicon); // since we know there are entries at this point, NewJournal should be set to false. NewJournal=false; EntryCount++; // auto-increment entry count totalcount++; // update totalcount } //if EntryCount==0, we have a new journal. Show a message if this happens. if(EntryCount==0){ QMessageBox a; a.information(this,"RoboJournal","Welcome to your new journal! Click Write in Journal (or press F4) to get started."); } EntryList.clear(); } DayList.clear(); month->setText(0, longmonth); QString monthcount=QString::number(EntryCount); if(EntryCount==1){ month->setToolTip(0, longmonth + " " + nextyear + " (" + monthcount + " entry)"); } else{ month->setToolTip(0, longmonth + " " + nextyear + " (" + monthcount + " entries)"); } EntryCount=0; } MonthList.clear(); } //if NewJournal is still true, that means we have a new journal. Show a message if this happens. if(NewJournal){ root->setHidden(true); QMessageBox a; a.information(this,"RoboJournal","Welcome to your new journal! Click Write in Journal (or press F4) to get started."); } YearList.clear(); TotalEntryCount(totalcount); } //################################################# // Sort entries by month only //################################################# else{ cout << "OUTPUT: Creating entry list from contents of MySQL database " << Buffer::database_name.toStdString() << " ..."; MySQLCore my; bool NewJournal=true; QList YearList; QList MonthList; QList EntryList; YearList=my.getYear(); QListIterator IteratorYear(YearList); //ui->EntryList->setHeaderLabel("Database contents (chronological)"); //ui->EntryList->setToolTip(NULL); //ui->EntryList->setHeaderHidden(false); QString db=Buffer::database_name; QTreeWidgetItem *root = new QTreeWidgetItem(ui->EntryList); root->setText(0, db); root->setIcon(0,rooticon); root->setToolTip(0, "" + Buffer::database_name + "@" + Buffer::host + ""); //root->setFont(0,heavy); for(int y=0; ysetIcon(0,yearicon); QString nextyear=IteratorYear.next(); year->setText(0, nextyear); //year->setFont(0,heavy); //cout << "Current Year: " << nextyear.toStdString() << endl; MonthList=my.getMonth(nextyear); QListIterator IteratorMonth(MonthList); for(int m=0; m < MonthList.count(); m++){ QTreeWidgetItem *month = new QTreeWidgetItem(year); //month->setFont(0,heavy); //month->setIcon(0,monthicon); QString itemmonth=IteratorMonth.next(); //cout << "Item month:" << itemmonth.toStdString() < IteratorEntry(EntryList); int EntryCount=0; // keep track of the number of entries for each month for(int e=0; esetText(0,entry); EntryItem->setToolTip(0,entry); EntryItem->setText(1,item[0]); EntryItem->setIcon(0, entryicon); // since we know there are entries at this point, NewJournal should be set to false. NewJournal=false; EntryCount++; // auto-increment entry count totalcount++; // update totalcount } EntryList.clear(); QString monthcount=QString::number(EntryCount); month->setText(0, longmonth); // do month post count if(EntryCount==1){ month->setToolTip(0, longmonth + " " + nextyear + " (" + monthcount + " entry)"); } else{ month->setToolTip(0, longmonth + " " + nextyear + " (" + monthcount + " entries)"); } EntryCount=0; } MonthList.clear(); } YearList.clear(); TotalEntryCount(totalcount); //if NewJournal is still true, that means we have a new journal. Show a message if this happens. if(NewJournal){ root->setHidden(true); QMessageBox a; a.information(this,"RoboJournal","Welcome to your new journal! Click Write in Journal (or press F4) to get started."); } } } ui->EntryList->expandAll(); cout << "Done!" << endl; // re-enable a few buttons just in case they were disabled. // (e.g. we log into a new journal and then switch to an existing one) if(num_records > 0){ ui->TodayButton->setEnabled(true); ui->NextEntry->setEnabled(true); ui->LastEntry->setEnabled(true); ui->DeleteEntry->setEnabled(true); ui->EditEntryButton->setEnabled(true); ui->actionLatest_Entry->setDisabled(false); ui->actionNext_Entry->setDisabled(false); ui->actionPrevious_Entry->setDisabled(false); ui->actionDelete_Current_Entry->setDisabled(false); ui->actionEdit_Selected_Entry->setDisabled(false); } else{ ui->TodayButton->setEnabled(false); ui->NextEntry->setEnabled(false); ui->LastEntry->setEnabled(false); ui->DeleteEntry->setEnabled(false); ui->EditEntryButton->setEnabled(false); ui->actionLatest_Entry->setDisabled(true); ui->actionNext_Entry->setDisabled(true); ui->actionPrevious_Entry->setDisabled(true); ui->actionDelete_Current_Entry->setDisabled(true); ui->actionEdit_Selected_Entry->setDisabled(true); } } //################################################################################################ // Update status bar label with total entry count void MainWindow::TotalEntryCount(int totalcount){ QString count=QString::number(totalcount); // update num_count. If num_count==0, the new journal notification will show and we will not //jump to first entry at login num_records=totalcount; ui->TotalCount->setTextFormat(Qt::RichText); // Note: Use space characters here instead of HTML nonbreaking space. For some reason, " " shows up. if(totalcount==1){ ui->TotalCount->setText("  " + count + " entry "); } else{ ui->TotalCount->setText("  " + count + " entries "); } QString indicator; // create status bar messages if(Buffer::allentries){ indicator="Total number of entries to date in " + Buffer::database_name + ""; ui->TotalCount->setToolTip(indicator); //ui->statusBar->showMessage("Displaying all entries in the database...",1500); } else{ if(Buffer::entryrange==1){ //QFrame *div = new QFrame(this); //div->setFrameStyle(); indicator="Total number of entries for current range (" + QString::number(Buffer::entryrange) + " year) in " + Buffer::database_name + ""; ui->TotalCount->setToolTip(indicator); //ui->statusBar->showMessage("Displaying all entries from this year...",1500); // Add year indicator if user decides to use it if(Buffer::use_indicator){ ui->TotalCount->setText(ui->TotalCount->text() + ":" + "  1 year"); } } else{ indicator="Total number of entries for current range (" + QString::number(Buffer::entryrange) + " years) in " + Buffer::database_name + ""; ui->TotalCount->setToolTip(indicator); //ui->statusBar->showMessage("Displaying all entries from the last " + Buffer::entryrange //+ " years...",1500); // Add year indicator if user decides to use it if(Buffer::use_indicator){ QString range=QString::number(Buffer::entryrange); ui->TotalCount->setText(ui->TotalCount->text() + ":" + "  " + range + " years "); } } } } //################################################################################################ // Get the most recent entry from the db void MainWindow::MostRecent(){ if(Buffer::backend=="MySQL"){ MySQLCore c; QString body=c.Recent(); // convert plain text linebreaks to html body.replace("\n","
"); // find and use system colors QPalette pal; QBrush bg=pal.highlight(); QBrush fg=pal.highlightedText(); QColor bgcolor=bg.color(); QColor fgcolor=fg.color(); QString color1=bgcolor.name(); QString color2=fgcolor.name(); //QString timestamp=c.TimeStamp(id); // get tags QString tags=c.GetTags(c.recordnum); //format tags QString output_tags=FormatTags(tags, color1,color2); QString username=Buffer::username; if(Buffer::use_full_name){ username=Buffer::full_name; } // display title above entry if(Buffer::show_title){ QString id=c.recordnum; QString title=c.GetTitle(id); title="

" + title + "

"; if((Buffer::use_custom_theme) && (!Buffer::datebox_override)){ QString invertcolor=InvertColor(Buffer::text_hexcolor); ui->Output->setText(title + "
   " + username + " wrote:

" + body + "
" + output_tags + "
"); } else{ ui->Output->setText(title + "
   " + username + " wrote:

" + body + "
" + output_tags + "
"); } } // don't display title else{ if((Buffer::use_custom_theme) && (!Buffer::datebox_override)){ QString invertcolor=InvertColor(Buffer::text_hexcolor); ui->Output->setText("
   " + username + " wrote:

" + body + "
" + output_tags +"
"); } else{ ui->Output->setText("
   " + username + " wrote:

" + body + "
" + output_tags + "
"); } } QString text=ui->Output->toHtml(); Buffer::EntryText=text; // Set Current ID ui->NextEntry->setDisabled(true); CurrentID=QString::number(c.ID); // Highlight Current Entry HighlightCurrentSelection(CurrentID); QTreeWidgetItem *selected=ui->EntryList->currentItem(); //EntryExporter e(this); EntryExporter::title=selected->text(0); } } //################################################################################################ void MainWindow::GetPrevious(){ if(Buffer::backend=="MySQL"){ MySQLCore c; QString body=c.GetPrevious(); ui->Output->setText(body); } } //################################################################################################ MainWindow::~MainWindow() { // save window sizes SettingsManager s; if((Buffer::editor_sizechanged) && (launched_editor)){ s.SaveEditorSize(Buffer::editor_temporarysize); } if((Buffer::config_sizechanged) && (launched_config)){ s.SaveConfigSize(Buffer::config_temporarysize); } // only save state if window is not maximized. if(!this->isMaximized()){ //Save current window size before destroying window. QByteArray geo=this->saveGeometry(); s.SaveMainWindowSize(geo); } // 6/21/13: remember the splitter position if it has changed. QByteArray current=ui->splitter->saveState(); if(current != Buffer::mw_splitter_size){ s.SaveSplitterPos(current); } delete ui; } //################################################################################################ void MainWindow::on_WriteButton_clicked() { Write(); } //################################################################################################ void MainWindow::on_SearchButton_clicked() { SearchDatabase(); } //################################################################################################ void MainWindow::on_ConnectButton_clicked() { Connect(); } //################################################################################################ void MainWindow::on_DisconnectButton_clicked() { Disconnect(); } //################################################################################################ void MainWindow::on_ConfigButton_clicked() { Preferences(); } //################################################################################################ void MainWindow::on_actionPreferences_2_triggered() { Preferences(); } //################################################################################################ void MainWindow::on_actionConnect_triggered() { Connect(); } //################################################################################################ void MainWindow::on_actionToolbar_triggered(bool checked) { if(!checked){ ui->mainToolBar->hide(); } else{ ui->mainToolBar->show(); } } //################################################################################################ void MainWindow::on_actionCopy_triggered() { ui->Output->copy(); } //################################################################################################ void MainWindow::on_actionSelect_all_triggered() { ui->Output->selectAll(); } //################################################################################################ void MainWindow::on_actionMain_toolbar_triggered(bool checked) { if(!checked){ ui->mainToolBar->hide(); } else{ ui->mainToolBar->show(); } } //################################################################################################ void MainWindow::on_actionLeft_default_triggered() { this->addToolBar(Qt::LeftToolBarArea,ui->mainToolBar); } //################################################################################################ void MainWindow::on_actionTop_triggered() { this->addToolBar(Qt::TopToolBarArea,ui->mainToolBar); } //################################################################################################ void MainWindow::on_actionRight_triggered() { this->addToolBar(Qt::RightToolBarArea,ui->mainToolBar); } //################################################################################################ void MainWindow::on_actionQuit_triggered() { this->close(); } //################################################################################################ void MainWindow::on_actionAbout_RoboJournal_triggered() { ShowCredits(); } //################################################################################################ void MainWindow::on_TodayButton_clicked() { MostRecent(); } //################################################################################################ void MainWindow::on_LastEntry_clicked() { //GetPrevious(); int direction=0; GetAdjacent(direction); } //################################################################################################ void MainWindow::on_actionLatest_Entry_triggered() { MostRecent(); } //################################################################################################ void MainWindow::on_actionDisconnect_triggered() { Disconnect(); } //################################################################################################ // Function that retrieves an entry when its entry is clicked on void MainWindow::on_EntryList_itemClicked(QTreeWidgetItem *item) { using namespace std; // make sure selected item is an entry and not just another subnode if(item->child(0)==NULL){ QString id=item->text(1); GetEntry(id,false); // update selected entry UpdateSelectedEntry(id); // re-enable tagger and Exporter if we click on a valid entry if((!ui->Tag->isEnabled()) || (!ui->ExportEntry->isEnabled())){ ui->Tag->setEnabled(true); ui->ExportEntry->setEnabled(true); ui->actionManage_Tags_2->setEnabled(true); ui->actionExport_Entry->setEnabled(true); } } else{ //cout << "This is **NOT** an entry!" << endl; CurrentID="-1"; } } //################################################################################################ // Function that moves to the next adjacent entry based on row ID. // direction 1=forward; direction 0 =backward; void MainWindow::GetAdjacent(int direction){ using namespace std; if(Record!=NULL){ QListIterator browser(IDList); using namespace std; //go backward one entry if(direction==0){ if(!ui->NextEntry->isEnabled()){ ui->NextEntry->setEnabled(true); ui->actionNext_Entry->setEnabled(true); } int position=IDList.indexOf(Record); position--; //cout << position << endl; QString lastindex=IDList.value(position); QString id=lastindex; //cout << lastindex.toStdString() << endl; if(position<0){ ui->LastEntry->setDisabled(true); ui->actionPrevious_Entry->setDisabled(true); if(!ui->NextEntry->isEnabled()){ ui->NextEntry->setEnabled(true); ui->actionNext_Entry->setEnabled(true); } } else{ if(CurrentID != "-1"){ GetEntry(id,false); Record=lastindex; } } } // go forward one entry if(direction==1){ if(browser.next()==NULL){ ui->NextEntry->setDisabled(true); ui->actionNext_Entry->setDisabled(true); } else{ if(!ui->LastEntry->isEnabled()){ ui->LastEntry->setEnabled(true); ui->actionPrevious_Entry->setEnabled(true); } int position=IDList.indexOf(Record); position++; QString nextindex=IDList.value(position); QString id=nextindex; //cout << nextindex.toStdString() << endl; if(position==IDList.size()){ ui->NextEntry->setDisabled(true); ui->actionNext_Entry->setDisabled(true); if(!ui->LastEntry->isEnabled()){ ui->LastEntry->setEnabled(true); ui->actionPrevious_Entry->setEnabled(true); } } else{ if(CurrentID != "-1"){ GetEntry(id,false); Record=nextindex; } } } } } if(CurrentID != "-1"){ HighlightCurrentSelection(Record); } } //################################################################################################ void MainWindow::on_NextEntry_clicked() { int direction=1; GetAdjacent(direction); } //################################################################################################ void MainWindow::on_actionPrevious_Entry_triggered() { int direction=0; GetAdjacent(direction); } //################################################################################################ void MainWindow::on_actionNext_Entry_triggered() { int direction=1; GetAdjacent(direction); } //################################################################################################ void MainWindow::on_actionEdit_Selected_Entry_triggered() { Modify(); } //################################################################################################ void MainWindow::on_actionSetup_Wizard_2_triggered() { FirstRun f; if(Buffer::showwarnings){ QMessageBox m; int reconfigure=m.question(this,"Reconfigure RoboJournal?", "Running the RoboJournal Setup Wizard again will purge all existing configuration settings. " "(however, any journal databases you have already created will be preserved) " " Are you sure you want to do this?",QMessageBox::Cancel,QMessageBox::Ok); switch(reconfigure){ case QMessageBox::Ok: f.exec(); break; case QMessageBox::Cancel: // do nothing break; } } else{ f.exec(); } } //################################################################################################ void MainWindow::on_actionPrint_triggered() { if(ui->Output->toPlainText()!=NULL){ Print(); //ui->Output->print(); } } //################################################################################################ void MainWindow::on_DeleteEntry_clicked() { DeleteSelectedEntry(); } //################################################################################################ void MainWindow::on_actionDelete_Current_Entry_triggered() { DeleteSelectedEntry(); } //################################################################################################ void MainWindow::on_actionWrite_triggered() { Write(); } //################################################################################################ void MainWindow::on_actionHelp_file_triggered() { ShowHelp(); } //################################################################################################ void MainWindow::on_EditEntryButton_clicked() { Modify(); } //################################################################################################ void MainWindow::on_Tag_clicked() { Tag(); } //################################################################################################ void MainWindow::on_actionManage_Tags_2_triggered() { Tag(); } void MainWindow::on_actionSelect_Default_Journal_triggered() { if((ui->DisconnectButton->isEnabled()) || (Buffer::On_Search)){ //Disconnect first // Switch back to Entry mode before disconnecting so we don't mess up which buttons should be enabled if(Buffer::On_Search){ ui->tabWidget->setCurrentIndex(0); Disconnect(); } else{ Disconnect(); } } // launch JournalSelector JournalSelector j(this); j.exec(); } void MainWindow::on_ExportEntry_clicked() { ExportEntry(); } void MainWindow::on_actionExport_Entry_triggered() { ExportEntry(); } void MainWindow::on_actionEntry_List_toggled(bool arg1) { QList minimized; minimized.append(0); minimized.append(100); QList evensplit; evensplit.append(1); evensplit.append(splittersize); // was 225 if(arg1){ ui->splitter->setSizes(evensplit); } else{ ui->splitter->setSizes(minimized); } } void MainWindow::on_SearchFilter_currentIndexChanged(const QString &arg1) { ui->SearchFilter->setToolTip(arg1); if(arg1=="Search by Tag"){ ui->SearchTerm->setDisabled(true); ui->TagList->setDisabled(false); ui->WholeWords->setDisabled(true); ui->TagList->clear(); ui->TagList->setToolTip("

Click Search to display all entries marked with the currently-selected tag.

"); ui->SearchTerm->setToolTip("

The search pattern input field is not available in tag search mode.

"); GetTagList(); Buffer::LastSearchTerm.clear(); } else{ ui->SearchTerm->setDisabled(false); ui->TagList->setDisabled(true); ui->TagList->setToolTip("

Tag search is not available in pattern-match mode.

"); ui->SearchTerm->setToolTip("

Enter the pattern (one or more words) you wish to search for in this field and click the Search button to continue.

FYI: The pattern search function is case-sensitive!

"); ui->WholeWords->setDisabled(false); ui->SearchTerm->setFocus(); ui->TagList->clear(); Buffer::LastSearchTerm.clear(); } } void MainWindow::on_ClearButton_clicked() { ClearSearchResults(); } void MainWindow::on_actionJournal_Creator_triggered() { //Disconnect first if((ui->DisconnectButton->isEnabled()) || (Buffer::On_Search)){ // Switch back to Entry mode before disconnecting so we don't mess up which buttons should be enabled if(Buffer::On_Search){ ui->tabWidget->setCurrentIndex(0); Disconnect(); } else{ Disconnect(); } } JournalCreator jc(this); jc.exec(); } void MainWindow::on_tabWidget_currentChanged(int index) { QScrollBar *vbar = ui->Output->verticalScrollBar(); switch(index){ case 0: Buffer::search_scroll_pos=vbar->value(); break; case 1: Buffer::entry_scroll_pos=vbar->value(); break; } SwitchTab(index); } void MainWindow::on_WholeWords_clicked() { // Every time this box gets checked, clean the last word searched so we can search again. This is important so // we can do whole word or grep search even if the search term itself has not changed. Buffer::LastSearchTerm.clear(); // bugfix (2/10/13): Auto-focus the search term again in order to save the user a click. // This allows the user to just press Enter to search again. Automation is a good thing. ui->SearchTerm->setFocus(); } void MainWindow::on_SearchList_currentItemChanged(QTreeWidgetItem *current) { if(has_search_results){ QString id=current->text(3); GetEntry(id,true); } } void MainWindow::on_actionJournal_Selector_triggered() { if((ui->DisconnectButton->isEnabled()) || (Buffer::On_Search)){ //Disconnect first // Switch back to Entry mode before disconnecting so we don't mess up which buttons should be enabled if(Buffer::On_Search){ ui->tabWidget->setCurrentIndex(0); Disconnect(); } else{ Disconnect(); } } // launch JournalSelector JournalSelector j(this); j.exec(); } robojournal-0.4.2/ui/editor.cpp0000644000175000017500000010075112215133056015162 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/editor.h" #include "ui_editor.h" #include #include #include #include #include "sql/mysqlcore.h" #include #include #include #include #include #include #include #include #include #include #include #include "ui/SpellTextEdit.h" #include "ui/highlighter.h" #include QString Editor::body; QString Editor::title; int Editor::day; int Editor::month; int Editor::year; void Editor::reject(){ ConfirmExit(); } //############################################################################################################# // Set up form (create toolbars and statusbar) and bind everything to a vbox layout. New for 0.4. void Editor::PrimaryConfig(){ using namespace std; if(Buffer::show_icon_labels){ ui->PostEntry->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->Cancel->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->CutButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->CopyButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->PasteButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->UndoButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->RedoButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->ShowErrors->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); } QToolBar *bar=new QToolBar(this); bar->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); bar->setLayoutDirection(Qt::LeftToRight); bar->setContextMenuPolicy(Qt::NoContextMenu); // set the lower toolbar icon size to 16x16. QSize s(16,16); bar->setIconSize(s); // Bind the Toolbar Buttons to QWidgetActions before adding them to the toolbar. This allows the toolbar overflow // menu to work where it would not if we had added the buttons to the toolbar directly (using QToolBar::addWidget). QWidgetAction* postAction = new QWidgetAction(this); postAction->setDefaultWidget(ui->PostEntry); QWidgetAction* cancelAction = new QWidgetAction(this); cancelAction->setDefaultWidget(ui->Cancel); QWidgetAction* cutAction = new QWidgetAction(this); cutAction->setDefaultWidget(ui->CutButton); QWidgetAction* copyAction = new QWidgetAction(this); copyAction->setDefaultWidget(ui->CopyButton); QWidgetAction* pasteAction = new QWidgetAction(this); pasteAction->setDefaultWidget(ui->PasteButton); QWidgetAction* undoAction = new QWidgetAction(this); undoAction->setDefaultWidget(ui->UndoButton); QWidgetAction* redoAction = new QWidgetAction(this); redoAction->setDefaultWidget(ui->RedoButton); QWidgetAction* spellAction = new QWidgetAction(this); spellAction->setDefaultWidget(ui->ShowErrors); // populate bar. bar->addAction(postAction); bar->addAction(cancelAction); bar->addSeparator(); bar->addAction(cutAction); bar->addAction(copyAction); bar->addAction(pasteAction); bar->addSeparator(); bar->addAction(undoAction); bar->addAction(redoAction); bar->addSeparator(); bar->addAction(spellAction); // Set up spacers for the Title/Date bar (masterbar). These are used to keep the title/date fields from being squished together. QWidget* spacer1 = new QWidget(); spacer1->setMinimumWidth(10); spacer1->setMinimumHeight(30); // add a bit of vertical padding to the upper toolbar. spacer1->setMaximumWidth(10); spacer1->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred); QWidget* spacer2 = new QWidget(); spacer2->setMinimumWidth(15); spacer2->setMaximumWidth(15); spacer2->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred); QWidget* spacer3 = new QWidget(); spacer3->setMinimumWidth(10); spacer3->setMaximumWidth(10); spacer3->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred); QWidget* spacer4 = new QWidget(); spacer4->setMinimumWidth(4); spacer4->setMaximumWidth(4); spacer4->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred); QWidget* spacer5 = new QWidget(); spacer5->setMinimumWidth(4); spacer5->setMaximumWidth(4); spacer5->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred); // Hide buttons on Date Indicator ui->EntryDate->setButtonSymbols(QAbstractSpinBox::NoButtons); ui->EntryDate->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); ui->EntryTitle->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QToolBar *masterbar= new QToolBar(this); masterbar->setLayoutDirection(Qt::LeftToRight); masterbar->setContextMenuPolicy(Qt::PreventContextMenu); masterbar->setIconSize(s); masterbar->addWidget(spacer1); masterbar->addWidget(ui->label); masterbar->addWidget(spacer4); masterbar->addWidget(ui->EntryTitle); masterbar->addWidget(spacer2); masterbar->addWidget(ui->label_2); masterbar->addWidget(spacer5); masterbar->addWidget(ui->EntryDate); masterbar->addWidget(spacer3); QVBoxLayout *layout=new QVBoxLayout(this); layout->setContentsMargins(0,0,0,0); layout->setSpacing(1); // create status bar and populate it QStatusBar *sbar=new QStatusBar(this); sbar->addWidget(ui->WordCount, 0); sbar->addWidget(ui->CharacterCount,0); sbar->addWidget(ui->RemainingCharacters,0); // empty slot to keep everything spaced properly QLabel *spacer=new QLabel(" "); sbar->addWidget(spacer,1); sbar->addWidget(ui->DocumentMode,0); sbar->setSizeGripEnabled(true); layout->addWidget(masterbar); layout->addWidget(ui->line); #ifdef _WIN32 // Delete the toolbar dividing line on Windows. On most Linux window managers it helps to have a divider, but // on Windows it just looks bad. delete ui->line; #endif layout->addWidget(bar,1); // Decide which TextEdit to use depending on whether user enabled spellcheck in preferences: // Option 1: Use Jan Sundermeyer's spellcheck-enabled editor thingy. if(Buffer::use_spellcheck){ spell=new SpellTextEdit(this,Buffer::current_dictionary); high=new Highlighter(spell->document(),Buffer::current_dictionary,true); spell->setDict(Buffer::current_dictionary); high->setDict(Buffer::current_dictionary); // allow the app to detect when the SpellTextEdit adds a word or has its text changed in any way. // The second function is essential for the word count feature to work. connect(spell,SIGNAL(addWord(QString)),high,SLOT(slot_addWord(QString))); connect(spell, SIGNAL(textChanged()), this, SLOT(on_spell_textChanged())); layout->addWidget(spell,true); } // Option 2: If we're not using spellcheck, just use a regular QTextEdit. This is unchanged from =< 0.3. else{ layout->addWidget(ui->EntryPost,true); } layout->addWidget(sbar); this->setLayout(layout); // restore window size from previous session bool usetemp=Buffer::editor_temporarysize.isEmpty(); //cout << " Temporary size is valid : " << usetemp << endl; if(usetemp && startup){ this->resize(Buffer::editor_geometry); } else{ this->resize(Buffer::editor_temporarysize); } // decide what to do with toolbar spellcheck button if(Buffer::use_spellcheck){ ui->ShowErrors->setDisabled(false); if(Buffer::show_spell_errors_by_default){ ui->ShowErrors->setChecked(true); } else{ ui->ShowErrors->setChecked(false); high->enableSpellChecking(false); } } else{ ui->ShowErrors->setDisabled(true); } if(Buffer::editmode){ ui->Cancel->setText("Discard Changes"); ui->Cancel->setToolTip("Discard Changes"); } else{ ui->Cancel->setText("Discard Entry"); ui->Cancel->setToolTip("Discard Entry"); } // clear startup mode. startup=false; } //############################################################################################################# // This function applies Post-processing features to the body text; new for 0.4. QString Editor::Do_Post_Processing(QString rawtext, int wordcount){ using namespace std; body=rawtext; // REMINDER: Escape all regexp character classes (\\w) because Qt uses backslash-style regexp; // the compiler always eats the first backslash so stuff like "\w" won't work. // replace -- with — if(Buffer::use_html_hyphens){ // replace 2 >= adjacent dashes with a clean mdash body=body.replace(QRegExp("\\s*-{2,}\\s*"),"—"); //use En Dash for digits QRegExp shortdash("((\\d+)-(\\d+)(-+)(\\d+))|((\\d+)-(\\d+))"); QStringList digits; int d_count = 0; int d_pos = 0; while ((d_pos = shortdash.indexIn(body, d_pos)) != -1) { ++d_count; d_pos += shortdash.matchedLength(); digits << shortdash.cap(0); } for(int d=0; d < digits.size(); d++){ QString orig=digits.at(d); //cout << "Match: " << open_match.at(i).toStdString() << endl; QString digit=orig.replace("-","–"); //cout << fixedquote.toStdString() << endl; body=body.replace(digits.at(d),digit); } } // replace straight quotes with curvy quotes...this just looks better. // This works by using Regular Expressions to extract quotes from the body text and replace them with // HTML-friendly quotes. if(Buffer::use_smart_quotes){ QRegExp openquotes("\"\\w", Qt::CaseInsensitive); QStringList open_match; int o_count = 0; int o_pos = 0; while ((o_pos = openquotes.indexIn(body, o_pos)) != -1) { ++o_count; o_pos += openquotes.matchedLength(); open_match << openquotes.cap(0); } for(int i=0; i < open_match.size(); i++){ QString orig=open_match.at(i); //cout << "Match: " << open_match.at(i).toStdString() << endl; QString fixedquote=orig.replace("\"","“"); //cout << fixedquote.toStdString() << endl; body=body.replace(open_match.at(i),fixedquote); } QRegExp closequotes("\\w[?!.:,;]?\"", Qt::CaseInsensitive); QStringList close_match; int c_count = 0; int c_pos = 0; while ((c_pos = closequotes.indexIn(body, c_pos)) != -1) { ++c_count; c_pos += closequotes.matchedLength(); close_match << closequotes.cap(0); } for(int j=0; j < close_match.size(); j++){ QString orig=close_match.at(j); //cout << "Match: " << close_match.at(j).toStdString() << endl; QString fixedquote=orig.replace("\"","”"); //cout << fixedquote.toStdString() << endl; body=body.replace(close_match.at(j),fixedquote); } //Do apostrophes and single quotes in the middle of words. QRegExp apos("(\\w+'\\w+'?\\w*)|(\\w+')",Qt::CaseInsensitive); QStringList apos_match; int a_count = 0; int a_pos = 0; while ((a_pos = apos.indexIn(body, a_pos)) != -1) { ++a_count; a_pos += apos.matchedLength(); apos_match << apos.cap(0); } for(int b=0; b < apos_match.size(); b++){ QString orig=apos_match.at(b); //cout << "Match: " << apos_match.at(b).toStdString() << endl; QString fixedquote=orig.replace("\'","’"); //cout << fixedquote.toStdString() << endl; body=body.replace(apos_match.at(b),fixedquote); } } // clean up extra whitespace if the feature is enabled in config AND wordcount is less than 1000. It's a totally arbitrary // amount that may be too low but the program hangs if the entry is too long. if((Buffer::trim_whitespace) && (wordcount < 1000)){ // clean up extra linebreaks between paragraphs. QTextEdit usually uses \n (even on windows) but look for \r\n too // just to be safe. QRegExp linebreak("[\\r\\n]+|[\\n]+", Qt::CaseInsensitive); QStringList break_match; int w_count = 0; int w_pos = 0; while ((w_pos = linebreak.indexIn(body, w_pos)) != -1) { ++w_count; w_pos += linebreak.matchedLength(); break_match << linebreak.cap(0); } for(int b=0; b < break_match.size(); b++){ body=body.replace(break_match.at(b),"\n\n"); } // Remove redundant spaces between words. This isn't noticible in HTML mode but it does interfere // with the editor and plain-text exporting. We're using a Regex and not QString::simplified b/c // in addition to spaces QString::simplified() also eats the line breaks we want to keep. QRegExp spaces("[ ]+[ ]+"); QStringList space_match; int s_count = 0; int s_pos = 0; while ((s_pos = spaces.indexIn(body, s_pos)) != -1) { ++s_count; s_pos += spaces.matchedLength(); space_match << spaces.cap(0); } for(int c=0; c < space_match.size(); c++){ body=body.replace(space_match.at(c)," "); // replace the regexp matches with a single space } // Remove trailing whitespace from the end of the body text. while(body.endsWith("\n")){ body=body.remove(body.length()-2,2); } } // Apply miscellaneous formatting options if config specifies it. Mostly this is cleaning up after sloppy writers. if(Buffer::use_misc_processing){ // get rid of extra periods (.. or . .) but NOT those intended to be ellipsis. DO NOT USE--- BROKEN! //body=body.replace(QRegExp("(( )?(\\.)( )*(\\.))|(( )(\\.))"),". "); // replace 3 >= adjacent dots with ellipsis char. body=body.replace(QRegExp("(\\.)(\\.+)(\\s*)"),"…"); // apply superscript to the "st" in 1st, etc. QRegExp notation("\\d+(st|nd|rd|th)",Qt::CaseInsensitive); QStringList notation_match; int n_count = 0; int n_pos = 0; while ((n_pos = notation.indexIn(body, n_pos)) != -1) { ++n_count; n_pos += notation.matchedLength(); notation_match << notation.cap(0); //cout << "Found match: " << notation.cap(0).toStdString() << endl; } for(int n=0; n < notation_match.size(); n++){ QString next=notation_match.at(n); next=next.toLower(); //cout << "Next: " << next.toStdString() << endl; QString fixed; if((next.contains("st")) || (next.contains("ST"))){ fixed=next.section("",0,next.length()-2); fixed=fixed + "st"; } if((next.contains("nd")) || (next.contains("ND"))){ fixed=next.section("",0,next.length()-2); fixed=fixed + "nd"; } if((next.contains("rd")) || (next.contains("RD"))){ fixed=next.section("",0,next.length()-2); fixed=fixed + "rd"; } if((next.contains("th")) || (next.contains("TH"))){ fixed=next.section("",0,next.length()-2); fixed=fixed + "th"; } body=body.replace(next,fixed); } } return body; } //############################################################################################################# // Set fonts in editor void Editor::Set_Editor_Fonts(){ using namespace std; QFont font; if(Buffer::use_custom_theme_editor){ font.setFamily(Buffer::font_face); int size=Buffer::font_size.toInt(); font.setFixedPitch(true); font.setPointSize(size); /* Bugfix: Prevent segfault by separating the spell and ui.entryPost objects with a conditional. * If spellcheck is disabled, trying to apply font settings to the spell object causes the whole app to crash. * Spell should not get called at all if Buffer::use_spellcheck==false. */ if(Buffer::use_spellcheck){ spell->setFont(font); } else{ ui->EntryPost->setFont(font); } } else{ font.setFamily("Verdana"); font.setFixedPitch(true); font.setPointSize(14); /* Bugfix: Prevent segfault by separating the spell and ui.entryPost objects with a conditional. * If spellcheck is disabled, trying to apply font settings to the spell object causes the whole app to crash. * Spell should not get called at all if Buffer::use_spellcheck==false. */ if(Buffer::use_spellcheck){ spell->setFont(font); } else{ ui->EntryPost->setFont(font); } } } //############################################################################################################# // Ask the user to confirm the desire to exit the editor window. Triggered if ESC is pressed, Abort is clicked, // or window is closed. void Editor::ConfirmExit(){ if(Buffer::showwarnings){ QMessageBox m(this); m.setWindowTitle("RoboJournal"); m.setIcon(QMessageBox::Question); if(Buffer::editmode){ m.setText("Any changes you made to this entry have not been saved yet. Are you sure you want to close the editor now?"); } else{ m.setText("This entry has not been saved. Are you sure you want to close the editor now?"); } m.setStandardButtons(QMessageBox::Yes | QMessageBox::No); m.setDefaultButton(QMessageBox::No); int choice=m.exec(); switch(choice){ case QMessageBox::Yes: this->done(0); break; case QMessageBox::No: // do nothing break; } } else{ this->done(0); } } //############################################################################################################# Editor::Editor(QWidget *parent) : QDialog(parent), ui(new Ui::Editor) { ui->setupUi(this); startup=true; // Set up form PrimaryConfig(); #ifdef unix QIcon unixicon(":/icons/robojournal-icon-big.png"); this->setWindowIcon(unixicon); #endif // hide question mark button in title bar when running on Windows this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); if(Buffer::editmode){ InitiateEditMode(); LoadEntry(Buffer::editentry); } else{ // set todays date if we're writing a new entry SetDate(); } // Only zero everything out if we are creating a new entry. Otherwise, DocumentStats() // gets called when the editor starts up in edit mode and the proper values are pre-loaded. if(!Buffer::editmode){ ui->WordCount->setText(" Word count: 0 "); ui->CharacterCount->setText(" Character count: 0 "); ui->RemainingCharacters->setText(" Remaining characters: 65535 "); ui->DocumentMode->setText(" Write Mode "); } Set_Editor_Fonts(); //Set cursor focus by default. if(Buffer::use_spellcheck){ spell->setFocus(); } else{ ui->EntryPost->setFocus(); } } //############################################################################################################# // Setup the form in EditMode void Editor::InitiateEditMode(){ ui->PostEntry->setText("Save Changes"); ui->DocumentMode->setText(" Edit Mode "); ui->DocumentMode->setAlignment(Qt::AlignRight); ui->PostEntry->setToolTip("Save Changes"); } //############################################################################################################# // Load an entry and populate the form with it if EditMode is true void Editor::LoadEntry(QString entry){ if(Buffer::backend=="MySQL"){ MySQLCore m; QList list=m.RetrieveEntryFull(entry); QString body=list.at(5); // Replace post-processing features with plain text to make the entry easy to edit. This will be a temporary // work-around until Rich Text is fully supported. It would not do to have people see — and wonder what it is. // The special characters will be restored anyway once the user saves the entry. body=body.replace("“","\""); body=body.replace("”","\""); body=body.replace("—","--"); body=body.replace("–","-"); body=body.replace("…","..."); body=body.replace("’","\'"); body=body.replace(QRegExp(""),""); ui->EntryTitle->setText(list.at(0)); if(Buffer::use_spellcheck){ spell->setPlainText(body); } else{ ui->EntryPost->setPlainText(body); } QDate postdate; postdate.setDate(list.at(3).toInt(),list.at(1).toInt(),list.at(2).toInt()); ui->EntryDate->setDate(postdate); // Do document statistics DocumentStats(); } } //############################################################################################################# //Update entry in the database bool Editor::UpdateEntry(){ using namespace std; //Bugfix for 0.2 // clean commas out of the title so it doesn't mess up the array in MainWindow::CreateTree() // Update 0.4: reimplement this as a Regex to make it a bit more robust. QString title=ui->EntryTitle->text(); QRegExp badchars("[,]+|[\"]+|[\']+"); title=title.remove(badchars); QString body; //get word count value. QString count=ui->WordCount->text().section(":",1,-1); //cout << "word count: " + count.toStdString() << endl; int wordcount=count.toInt(); if(Buffer::use_spellcheck){ body=Do_Post_Processing(spell->toPlainText(), wordcount); } else{ body=Do_Post_Processing(ui->EntryPost->toPlainText(), wordcount); } QDate post_date=ui->EntryDate->date(); int day=post_date.day(); int month=post_date.month(); int year=post_date.year(); MySQLCore m; bool success=m.Update(title,month,day,year,body,Buffer::editentry); return success; } //############################################################################################################# void Editor::resizeEvent(QResizeEvent *){ if(!startup){ Buffer::editor_temporarysize=this->size(); Buffer::editor_sizechanged=true; } } //############################################################################################################# // Prepare a new Entry and post it to database bool Editor::NewEntry(){ using namespace std; //get word count value QString count=ui->WordCount->text().section(":",1,-1); //cout << "word count: " + count.toStdString() << endl; int wordcount=count.toInt(); if(Buffer::use_spellcheck){ Editor::body=Do_Post_Processing(spell->toPlainText(),wordcount); } else{ Editor::body=Do_Post_Processing(ui->EntryPost->toPlainText(),wordcount); } //Bugfix for 0.2 // clean commas out of the title so it doesn't mess up the array in MainWindow::CreateTree() // Update 0.4: reimplement this as a Regex to make it a bit more robust. QString title=ui->EntryTitle->text(); QRegExp badchars("[,]+|[\"]+|[\']+"); title=title.remove(badchars); Editor::title=title; QDate post_date=ui->EntryDate->date(); Editor::day=post_date.day(); Editor::month=post_date.month(); Editor::year=post_date.year(); bool success=false; cout << "OUTPUT: Adding new entry \"" + Editor::title.toStdString() + "\" to database " << Buffer::database_name.toStdString() << "..."; if(Buffer::backend=="MySQL"){ MySQLCore my; success=my.AddEntry(); } if(success){ cout << "SUCCESS!" << endl; } else{ cout << "FAILED" << endl; } return success; } //############################################################################################################# Editor::~Editor() { delete ui; } //############################################################################################################# //get current date void Editor::SetDate(){ ui->EntryDate->setDate(QDate::currentDate()); } // Automatically update window title with post title void Editor::setTitle(QString title){ this->setWindowTitle(title + " - RoboJournal"); if(title==NULL){ this->setWindowTitle("Untitled Entry - RoboJournal"); } } //############################################################################################################# void Editor::on_EntryTitle_textChanged(const QString &title) { // pass title string to Editor::SetTitle() function... don't confuse this with QDialog::SetWindowTitle!!! setTitle(title); } //############################################################################################################# // keep track of document statistics void Editor::DocumentStats(){ using namespace std; QString data; if(Buffer::use_spellcheck){ data=spell->toPlainText(); } else{ data=ui->EntryPost->toPlainText(); } int maxlength=65535; int num=data.size(); int remaining=maxlength-num; QString str_num; QString str_rem; str_num.append(QString("%1").arg(num)); str_rem.append(QString("%1").arg(remaining)); QString wordcount=WordCount(data); ui->WordCount->setText(" Word count: " + wordcount + " "); ui->CharacterCount->setText(" Character count: " + str_num + " "); ui->RemainingCharacters->setText(" Remaining characters: " + str_rem + " "); // prevent mysql data overflows, though it must have been one hell of a day if you can't say // what's on your mind in less than 65k chars if(remaining<0){ ui->RemainingCharacters->setText(" Remaining characters: " + str_rem +" "); ui->PostEntry->setDisabled(true); } else{ ui->PostEntry->setEnabled(true); } } //############################################################################################################# // Get word count from body. This needs to return a QString instead // of Int because it needs to be displayed in a QLabel. Sure, we could // return an int but that would require an extra conversion step. QString Editor::WordCount(QString data){ // get rid of extra whitespace that would throw off the correct count data=data.trimmed(); data=data.simplified(); // split the string into an array of words and count the size of array. That's our word count. QStringList words=data.split(" "); int count=words.count(); QString wordcount="0"; // solve a bug that always returns wordcount as 1 even if the body is blank if(data.size()==0){ wordcount="0"; } else{ wordcount=QString::number(count); } return wordcount; } //############################################################################################################# void Editor::on_EntryPost_textChanged() { DocumentStats(); } //############################################################################################################# void Editor::on_spell_textChanged(){ DocumentStats(); } //############################################################################################################# void Editor::on_UndoButton_clicked() { if(Buffer::use_spellcheck){ spell->undo(); } else{ ui->EntryPost->undo(); } } //############################################################################################################# void Editor::on_RedoButton_clicked() { if(Buffer::use_spellcheck){ spell->redo(); } else{ ui->EntryPost->redo(); } } //############################################################################################################# void Editor::on_Cancel_clicked() { if(Buffer::showwarnings){ ConfirmExit(); } else{ this->done(0); } } //############################################################################################################# void Editor::on_CutButton_clicked() { if(Buffer::use_spellcheck){ spell->cut(); } else{ ui->EntryPost->cut(); } } //############################################################################################################# void Editor::on_CopyButton_clicked() { if(Buffer::use_spellcheck){ spell->copy(); } else{ ui->EntryPost->copy(); } } //############################################################################################################# void Editor::on_PasteButton_clicked() { if(Buffer::use_spellcheck){ spell->paste(); } else{ ui->EntryPost->paste(); } } //############################################################################################################# void Editor::on_PostEntry_clicked() { QMessageBox m; if(Buffer::use_spellcheck){ if(Buffer::editmode){ // edit mode if((spell->toPlainText().isEmpty()) || (ui->EntryTitle->text().isEmpty())){ m.critical(this,"RoboJournal","You must fill in the title and body of this entry before " "RoboJournal can save it."); } else{ bool success=UpdateEntry(); if(success){ this->hide(); m.information(this,"RoboJoural", "\"" + ui->EntryTitle->text() + "\" was successfully updated."); close(); } } } else{ // new entry mode if((spell->toPlainText().isEmpty()) || (ui->EntryTitle->text().isEmpty())){ m.critical(this,"RoboJournal","You must fill in the title and body of this entry before " "RoboJournal can save it."); } else{ bool success=NewEntry(); if(success){ this->hide(); m.information(this,"RoboJoural", "\"" + ui->EntryTitle->text() + "\" was successfully added to your journal."); close(); } } } } // Non-Spellcheck Mode else{ if(Buffer::editmode){ // edit mode if((ui->EntryPost->toPlainText().isEmpty()) || (ui->EntryTitle->text().isEmpty())){ m.critical(this,"RoboJournal","You must fill in the title and body of this entry before " "RoboJournal can save it."); } else{ bool success=UpdateEntry(); if(success){ this->hide(); m.information(this,"RoboJoural", "\"" + ui->EntryTitle->text() + "\" was successfully updated."); close(); } } } else{ // new entry mode if((ui->EntryPost->toPlainText().isEmpty()) || (ui->EntryTitle->text().isEmpty())){ m.critical(this,"RoboJournal","You must fill in the title and body of this entry before " "RoboJournal can save it."); } else{ bool success=NewEntry(); if(success){ this->hide(); m.information(this,"RoboJoural", "\"" + ui->EntryTitle->text() + "\" was successfully added to your journal."); close(); } } } } } void Editor::on_ShowErrors_toggled(bool checked) { if(checked){ high->enableSpellChecking(true); } else{ high->enableSpellChecking(false); } } robojournal-0.4.2/ui/entryexporter.ui0000775000175000017500000003051312142060704016462 0ustar willwill EntryExporter 0 0 434 353 Dialog 0 :/icons/page_white.png:/icons/page_white.png Export &Single Entry Export single (currently selected) entry Filename true Export Format <p>Export the entry to a HTML-formatted document that may be viewed with a web browser. This option preserves text formatting. </p> HTML (recommended) <p>Export the entry to a plain text document that may be viewed with a text editor. This option <b>does not</b> preserve text formatting.</p> Plain Text Qt::Vertical QSizePolicy::Expanding 20 64 Filename Options <p>Include the date on which the entry was made in the filename. (recommended)</p> Include Date <p>Include the name of the journal this entry came from in the filename. (recommended)</p> Include Journal Name Qt::Vertical 20 40 :/icons/page_white_stack.png:/icons/page_white_stack.png Export Entire &Journal Export the entire database to one file Filename true Export Format <p>Export the entry to a HTML-formatted document that may be viewed with a web browser. This option preserves text formatting. </p> HTML (recommended) <p>Export the entry to a plain text document that may be viewed with a text editor. This option <b>does not</b> preserve text formatting.</p> Plain Text Qt::Vertical 20 40 File Options Include Export Date Qt::Vertical QSizePolicy::Preferred 20 6 Place oldest entry first Sort Ascending Place newest entry first Sort Descending Qt::Vertical QSizePolicy::Expanding 20 41 Export Directory &Browse :/icons/folder.png:/icons/folder.png Qt::Vertical QSizePolicy::Minimum 406 5 Qt::Horizontal Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() EntryExporter accept() 248 254 157 274 buttonBox rejected() EntryExporter reject() 316 260 286 274 robojournal-0.4.2/ui/configurationmysql.ui0000775000175000017500000000673212142060704017473 0ustar willwill ConfigurationMySQL 0 0 329 266 Form Default Account Hostname Port 4 Default Username Database Security <p><span style=" font-weight:600; color:#ff0000;">(Not Recommended)</span> This option allows the user to log in as root. This is generally a bad idea because it allows unrestricted access to all database functions, including those which can be dangerous. It is much safer to log in with a normal account.</p> Allow root logins on host Qt::Vertical 20 40 robojournal-0.4.2/ui/entryexporter.cpp0000644000175000017500000007000212211723646016627 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/entryexporter.h" #include "ui_entryexporter.h" #include #include #include #include #include #include #include #include #include "core/buffer.h" #include #include #include "sql/mysqlcore.h" #include #include #include #ifdef _WIN32 #include #endif EntryExporter::EntryExporter(QWidget *parent) : QDialog(parent), ui(new Ui::EntryExporter) { ui->setupUi(this); // hide question mark button in title bar when running on Windows this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); int width=this->width(); int height=this->height(); this->setMaximumSize(width,height); this->setMinimumSize(width,height); // do primary config PrimaryConfig(); } QString EntryExporter::title; QString EntryExporter::body; QString EntryExporter::date; QString EntryExporter::timestamp; EntryExporter::~EntryExporter() { delete ui; } //################################################################################################ // Set locakl values for css from Buffer data void EntryExporter::SetupCSS(){ header_font=Buffer::header_font; body_font=Buffer::body_font; if(Buffer::header_use_em){ header_font_size=Buffer::header_font_size + "em"; } else{ header_font_size=Buffer::header_font_size + "pt"; } if(Buffer::body_use_em){ body_font_size=Buffer::body_font_size + "em"; } else{ body_font_size=Buffer::body_font_size + "pt"; } if(Buffer::use_system_colors){ // use system colors for datebox QPalette pal; QColor bg=pal.highlight().color(); QColor fg=pal.highlightedText().color(); datebox_bgcolor=bg.name(); datebox_color=fg.name(); } else{ datebox_bgcolor="#e2e2e2"; datebox_color="#000000"; } } //################################################################################################ // Validation function that checks to see if the file exists before doing an export operation. // This function also serves as a splitter...the current tab determines which export function gets called void EntryExporter::Validate(){ // Do single export if(ui->tabWidget->currentIndex()==0){ QMessageBox c; QString path=ui->ExportLocation->text() + QDir::separator() + ui->FileName->text(); // create an empty file object. This is just a dummy, we don't actually do anything with this here other than see if it exists. QFile file(path); //check to see if file exists already. if so, confirm before overwriting it if(file.exists()){ int choice=c.question(this,"RoboJournal","" + ui->FileName->text() + "
already exists in " + ui->ExportLocation->text() + ".

Do you want to replace the existing file?", QMessageBox::Yes | QMessageBox::No, QMessageBox::No); switch(choice){ case QMessageBox::Yes: Do_Export(); break; case QMessageBox::No: // do nothing break; } } // $filename does not exist so just export data as $filename. else{ Do_Export(); } } // Do mass export else{ QMessageBox m; QString path=ui->ExportLocation->text() + QDir::separator() + ui->FileName_2->text(); // create an empty file object. This is just a dummy, we don't actually do anything with this here other than see if it exists. QFile file(path); //check to see if file exists already. if so, confirm before overwriting it if(file.exists()){ int choice=m.question(this,"RoboJournal","" + ui->FileName_2->text() + "
already exists in " + ui->ExportLocation->text() + ".

Do you want to replace the existing file?", QMessageBox::Yes | QMessageBox::No, QMessageBox::No); switch(choice){ case QMessageBox::Yes: Mass_Export(); break; case QMessageBox::No: // do nothing break; } } // file does not exist else{ Mass_Export(); } } } //################################################################################################ // add line breaks to the body text so everything won't be on one huge line. This is not very important //for HTML export but it is critical for text files. QStringList EntryExporter::Do_Word_Wrap(QString body){ using namespace std; // Wrap lines that have blocks of <=120 chars followed by punctuation or whitespace. QRegExp wrapper("[.|]|[|?|!|,|\\s|\\b|\\n)]?.{0,100}[.|]|[|?|!|,|\\s|\\b|)|\\n]+",Qt::CaseInsensitive); QStringList match; int o_count = 0; int o_pos = 0; while ((o_pos = wrapper.indexIn(body, o_pos)) != -1) { ++o_count; o_pos += wrapper.matchedLength(); match << wrapper.cap(0); //cout << "found match: " << wrapper.cap(0).toStdString(); } QStringList output; for(int i=0; i < match.size(); i++){ QString nextline=match.at(i); #ifdef unix nextline=nextline+"\n"; #endif #ifdef _WIN32 // Use windows-style linebreaks if building on win32. nextline=nextline+"\r\n"; #endif cout << nextline.toStdString(); output.append(nextline); } return output; } //################################################################################################ // Do the export void EntryExporter::Do_Export(){ using namespace std; QString path=ui->ExportLocation->text() + QDir::separator() + ui->FileName->text(); // create an empty file object QFile file(path); //remove date from title title=title.section(":",1); // Get current date and timestamp // get current date and timestamp (NOT the ones from the entry!). This is used in the "this file was generated // by RoboJournal v.X" tagline at the bottom of the document. QDateTime t=QDateTime::currentDateTime(); QString exportdt=t.toString("dddd, MMMM d, yyyy (h:mm ap)."); // check to see if file already exists at location before writing it //cout << "User accepted" << endl; bool use_html=ui->HTML->isChecked(); if(use_html){ // replace newlines with HTML line breaks body=body.replace("\n","
"); } else{ // strip HTML tags body.replace("
","\n"); } // // turn tags into bullet list // if((entry_tags=="null") || (entry_tags=="Null") || (entry_tags.isEmpty())){ // entry_tags="

Tags: No tag data

"; // } // else{ // entry_tags=entry_tags.replace(";","
  • "); // entry_tags="
    • Tags:
    • " + entry_tags + "
    "; // } if(file.open(QIODevice::ReadWrite)) { QTextStream stream(&file); if(use_html){ // Get values for CSS fields SetupCSS(); stream << "" << endl; stream << "" << endl; stream << "" << endl; stream << "" << endl; stream << ""<< title << "" << endl; stream << "" << endl; stream << "" << endl; stream << "" << endl; stream << "

    " << title << "

    " << endl; stream << "
      On " << date << " at " << timestamp << ", " << Buffer::username << " wrote:
    " << endl; stream << "

    " << body << "

    " << endl; //stream << "\t\t

    " << entry_tags << "



    " << endl; stream << "
    " << endl; stream << "

    This file was generated by RoboJournal " << Buffer::version << " on " << exportdt << "

    " << endl; stream << "" << endl; stream << "" << endl; } // do plain text export else{ // Convert HTML Hyphens and dashes to plain text body=body.replace(QRegExp("—"),"--"); body=body.replace(QRegExp("–"),"-"); body=body.replace(QRegExp("…"),"..."); body=body.replace(QRegExp("’"),"\'"); body=body.replace(QRegExp(""),""); // word wrapping is still broken, don't use it. /* QString formatted_body; QStringList body_wrap=Do_Word_Wrap(body); for(int i=0; i" + ui->FileName->text() + "
    was successfully exported."); } //################################################################################################ // Updates static variables. This runs whenever MainWindow:: GetEntry() or MainWindow::Recent() is called. void EntryExporter::UpdateValues(QString new_title, QString new_date, QString new_body, QString new_timestamp){ title=new_title; date=new_date; body=new_body; timestamp=new_timestamp; } //################################################################################################ // Set filename for Mass export void EntryExporter::Set_Mass_Name(){ QString extension; if(ui->HTML_2->isChecked()){ extension=".html"; } else{ extension=".txt"; } QDateTime t=QDateTime::currentDateTime(); QString datestamp; switch(Buffer::date_format){ case 0: datestamp=t.toString("dd-MM-yyyy"); break; case 1: datestamp=t.toString("MM-dd-yyyy"); break; case 2: datestamp=t.toString("yyyy-MM-dd"); break; } QString filename; if(ui->IncludeExportDate->isChecked()){ filename=Buffer::database_name + "_" + datestamp + extension; } else{ filename=Buffer::database_name + extension; } ui->FileName_2->setText(filename); } //################################################################################################ // process filename. This function gets called on load or whenever the filename flags get changed. void EntryExporter::SetName(){ ui->FileName->clear(); QString filename=EntryExporter::title; // if we are sorting by month get rid of The month, day, and colon if(!Buffer::sortbyday){ filename=filename.section(":",1); } // get rid of colons in the filename-- they cause problems with Windows because of that idiotic drive letter naming scheme // that is still around even after 25+ years filename=filename.replace(":","-"); //do initial processing... remove spaces and convert to lowercase filename=filename.simplified(); if(ui->IncludeJournalName->isChecked()){ filename=Buffer::database_name + "_" + filename; } if(ui->IncludeDate->isChecked()){ filename=filename + "_" + EntryExporter::date; } if(ui->HTML->isChecked()){ filename=filename+".html"; } else{ filename=filename+".txt"; } // Bugfix for 0.4: get rid of any commas, brackets, or any other undesired characters filename=filename.replace(QRegExp("(\\,)+|(\\()+|(\\))+|(\\[)+|(\\])+|(\\{)+|(\\})+|(#)+|(%)+"),""); filename=filename.replace("/","-"); // get rid of date slashes filename=filename.replace(QRegExp("\\s"),"_"); #ifdef _WIN32 // Get rid of illegal filename characters on Windows. filename=filename.replace(QRegExp("(:)+|(<)+|(>)+|(:)+|(\")+|(/)+|(\\\\)+|(\\|)+|(\\?)+|(\\*)+"),""); #endif // set the value filename=filename.toLower(); ui->FileName->setText(filename); } //################################################################################################ // Do mass export void EntryExporter::Mass_Export(){ using namespace std; this->setCursor(Qt::WaitCursor); QString path=ui->ExportLocation->text() + QDir::separator() + ui->FileName_2->text(); // create an empty file object QFile file(path); QList journals; bool use_html=ui->HTML_2->isChecked(); bool asc=ui->asc->isChecked(); if(Buffer::backend=="MySQL"){ // Get database dump MySQLCore a; journals=a.DumpDatabase(asc); } QString dumptitle; if(use_html){ dumptitle="Contents of " + Buffer::database_name + ""; } else{ dumptitle="Contents of \"" + Buffer::database_name + "\""; } // get current date and timestamp (NOT the ones from the entry!). This is used in the "this file was generated // by RoboJournal v.X" tagline at the bottom of the document. QDateTime t=QDateTime::currentDateTime(); QString exportdt=t.toString("dddd, MMMM d, yyyy (h:mm ap)."); QListIterator j(journals); int count=0; QString intro; if(asc){ intro="

    All entries have been arranged from oldest to newest.

    "; } else{ intro="

    All entries have been arranged from newest to oldest.

    "; } if(file.open(QIODevice::ReadWrite)) { QTextStream stream(&file); // HTML Export if(use_html){ // Prepare CSS values SetupCSS(); stream << "" << endl; stream << "" << endl; stream << "" << endl; stream << "" << endl; stream << "Contents of "<< Buffer::database_name << "" << endl; stream << "" << endl; stream << "" << endl; stream << "" << endl; stream << "

    " << dumptitle << "

    " << endl; stream << intro << endl; while(j.hasNext()){ count++; QString entrynumber=QString::number(count); QStringList thisentry=j.next(); QString entry_title=thisentry.at(0); QString entry_month=thisentry.at(2); QString entry_day=thisentry.at(1); QString entry_year=thisentry.at(3); QString entry_tags=thisentry.at(4); QString entry_body=thisentry.at(5); QString entry_time=thisentry.at(6); // convert newlines to linebreaks entry_body=entry_body.replace("\n","
    "); // turn tags into bullet list if((entry_tags=="null") || (entry_tags=="Null") || (entry_tags.isEmpty())){ entry_tags="

    Tags: No tag data

    "; } else{ entry_tags=entry_tags.replace(";","
  • "); entry_tags="
    • Tags:
    • " + entry_tags + "
    "; } if(entry_time.isEmpty()){ entry_time="[Unknown Time]"; } QString datestamp= entry_day + "/" + entry_month + "/" + entry_year; stream << "\t

    " << entrynumber << ". " << entry_title << "

    " << endl; stream << "\t\t
      On " << datestamp << " at " << entry_time << ", " << Buffer::username << " wrote:
    " << endl; stream << "\t\t

    " << entry_body << "

    " << endl; stream << "\t\t

    " << entry_tags << "



    " << endl; stream << "\t\t
    " << endl; } stream << "\t

    This file was generated by RoboJournal " << Buffer::version << " on " << exportdt << "

    " << endl; stream << "" << endl; stream << "" << endl; file.close(); } // plain text export else{ QString br="\n"; #ifdef _WIN32 // Use Windows style linebreaks if necessary. A real text editor knows what to do with \n but // we have to assume most people will use Notepad. Why they don't get anything better is something // I'll never understand. br="\r\n"; #endif // remove HTML from intro intro=intro.replace("",""); // add title and header to text file stream << dumptitle << br << br << endl; stream << intro << br << br << endl; stream << "##########################################################" << br << br << endl; while(j.hasNext()){ count++; QString entrynumber=QString::number(count); QStringList thisentry=j.next(); QString entry_title=thisentry.at(0); QString entry_month=thisentry.at(2); QString entry_day=thisentry.at(1); QString entry_year=thisentry.at(3); QString entry_tags=thisentry.at(4); QString entry_body=thisentry.at(5); QString entry_time=thisentry.at(6); entry_body=entry_body.replace("\n",br); // Convert HTML Hyphens and dashes to plain text entry_body=entry_body.replace(QRegExp("—"),"--"); entry_body=entry_body.replace(QRegExp("–"),"-"); entry_body=entry_body.replace(QRegExp("…"),"..."); entry_body=entry_body.replace(QRegExp("’"),"\'"); entry_body=entry_body.replace(QRegExp(""),""); //strip HTML from entry body entry_body=entry_body.replace("",""); if(entry_tags.isEmpty()){ entry_tags="No tag data."; } else{ // turn tags into bullet list QString tagdiv=br + "*"; entry_tags=entry_tags.replace(";",tagdiv); entry_tags= br + "Tags: " + br + br + "*" + entry_tags; } if(entry_time.isEmpty()){ entry_time="[Unknown Time]"; } QString datestamp= entry_day + "/" + entry_month + "/" + entry_year; stream << entrynumber << ". " << entry_title << br << br << endl; stream << "On " << datestamp << " at " << entry_time << ", " << Buffer::username << " wrote:" << br << br<< endl; stream << entry_body << br << br << endl; stream << entry_tags << br << br << endl; stream << "##########################################################" << br << br << endl; } stream << "This file was generated by RoboJournal " << Buffer::version << " on " << exportdt << endl; file.close(); } QMessageBox b; b.information(this,"RoboJournal", "" + ui->FileName_2->text() + "
    was successfully exported."); this->setCursor(Qt::ArrowCursor); } } //################################################################################################ // Show folder selection dialog when user chooses output directory void EntryExporter::Browse(){ QString outputdir=QFileDialog::getExistingDirectory(this, "Select Directory",ui->ExportLocation->text(),QFileDialog::ShowDirsOnly); // only copy the directory to the ExportLocation field if the size is greater than 0. // if the user cancels the QFileDialog, the size WILL be 0 and we don't want this to be blank. if(outputdir.length() != 0){ QFileInfo p(outputdir); if(p.isWritable()){ ui->ExportLocation->clear(); ui->ExportLocation->setText(outputdir); } else{ QMessageBox m; m.critical(this,"RoboJournal","You are not allowed to save files in " + outputdir +"! Please select a different location and try again."); // Browse for another directory outputdir.clear(); Browse(); } } } //################################################################################################ // setup form when PrimaryConfig::exec() is called void EntryExporter::PrimaryConfig(){ using namespace std; // Set export db tab to disabled for now, hopefully i'll get this done by 0.4 //ui->tabWidget->setTabEnabled(1,false); // set defaults ui->HTML->click(); ui->IncludeDate->click(); ui->IncludeJournalName->click(); ui->IncludeExportDate->click(); // mass export tab ui->HTML_2->click(); ui->desc->click(); // add filename and journal name QString homepath=QDir::homePath(); // check for the presence of a ~/Documents folder on Unix. If we find one, use it. #ifdef unix QString documents=homepath+"/Documents"; QDir docs(documents); if(docs.exists()){ homepath=documents; } #endif // add special Windows pathname instructions for Documents folder. Get windows version b/c XP doesn't have a Documents folder. #ifdef _WIN32 DWORD dwVersion = GetVersion(); DWORD dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); homepath=homepath.replace("/","\\"); //Windows XP and older if(dwMajorVersion < 6){ homepath=homepath+QDir::separator()+"My Documents"; } // Windows Vista & newer else{ homepath=homepath+QDir::separator()+"Documents"; } #endif ui->ExportLocation->setText(homepath); ui->ExportLocation->setReadOnly(true); // set filename SetName(); } void EntryExporter::on_BrowseButton_clicked() { Browse(); } void EntryExporter::on_PlainText_clicked() { SetName(); } void EntryExporter::on_HTML_clicked() { SetName(); } void EntryExporter::on_IncludeDate_clicked() { SetName(); } void EntryExporter::on_IncludeJournalName_clicked() { SetName(); } void EntryExporter::on_buttonBox_accepted() { Validate(); } void EntryExporter::on_HTML_2_clicked() { Set_Mass_Name(); } void EntryExporter::on_PlainText_2_clicked() { Set_Mass_Name(); } void EntryExporter::on_IncludeExportDate_clicked() { Set_Mass_Name(); } robojournal-0.4.2/ui/journalselector.h0000644000175000017500000000304312211723646016556 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef JOURNALSELECTOR_H #define JOURNALSELECTOR_H #include #include namespace Ui { class JournalSelector; } class JournalSelector : public QDialog { Q_OBJECT public: explicit JournalSelector(QWidget *parent = 0); ~JournalSelector(); private slots: void on_SearchButton_clicked(); void on_UseDefaults_clicked(bool checked); void on_JournalList_itemClicked(QTreeWidgetItem *item, int column); void on_buttonBox_accepted(); void on_buttonBox_rejected(); void on_JournalList_itemDoubleClicked(QTreeWidgetItem *item, int column); private: Ui::JournalSelector *ui; void JournalSearch(); void CreateTree(QStringList journals); void SetPreferences(); bool Validate(); }; #endif // JOURNALSELECTOR_H robojournal-0.4.2/ui/journalcreator.h0000644000175000017500000000275412211723646016405 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef JOURNALCREATOR_H #define JOURNALCREATOR_H #include namespace Ui { class JournalCreator; } class JournalCreator : public QDialog { Q_OBJECT public: explicit JournalCreator(QWidget *parent = 0); ~JournalCreator(); private slots: void on_DBType_currentIndexChanged(int index); void on_Password2_textChanged(); void on_Password_textChanged(); void on_tabWidget_currentChanged(); void on_buttonBox_accepted(); void on_buttonBox_rejected(); private: Ui::JournalCreator *ui; void ShowDescription(int index); void PasswordMatch(); bool Validate(); void FillIn(); void Clear(); void CreateJournal(); void PrimaryConfig(); }; #endif // JOURNALCREATOR_H robojournal-0.4.2/ui/editor.h0000644000175000017500000000421412211723646014632 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef EDITOR_H #define EDITOR_H #include #include #include "ui/SpellTextEdit.h" #include "ui/highlighter.h" namespace Ui { class Editor; } class Editor : public QDialog { Q_OBJECT public: explicit Editor(QWidget *parent = 0); ~Editor(); bool NewEntry(); void LoadEntry(QString entry); void InitiateEditMode(); bool UpdateEntry(); static QString title; static QString body; static int month; static int day; static int year; SpellTextEdit *spell; Highlighter *high; QTextEdit *regular; private slots: void DocumentStats(); void on_EntryTitle_textChanged(const QString &arg1); void on_EntryPost_textChanged(); void on_UndoButton_clicked(); void on_RedoButton_clicked(); void on_Cancel_clicked(); void on_CutButton_clicked(); void on_CopyButton_clicked(); void on_PasteButton_clicked(); void resizeEvent(QResizeEvent *); void on_PostEntry_clicked(); void on_spell_textChanged(); void on_ShowErrors_toggled(bool checked); private: Ui::Editor *ui; bool startup; void SetDate(); void setTitle(QString title); void PrimaryConfig(); void Set_Editor_Fonts(); QString WordCount(QString data); void ConfirmExit(); QString Do_Post_Processing(QString rawtext, int wordcount); void reject(); }; #endif // EDITOR_H robojournal-0.4.2/ui/firstrun.ui0000775000175000017500000000676112142060704015414 0ustar willwill FirstRun 0 0 424 316 Welcome To RoboJournal :/icons/robojournal-icon.png:/icons/robojournal-icon.png :/icons/robojournal.png Qt::AlignCenter Qt::Vertical QSizePolicy::Fixed 20 13 20 20 What do you want to do? Qt::Vertical QSizePolicy::Preferred 376 10 Create a &new journal database &Connect to an existing journal database Qt::Vertical QSizePolicy::Expanding 20 50 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok robojournal-0.4.2/ui/aboutrj.cpp0000644000175000017500000000275012211723646015350 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/aboutrj.h" #include "ui_aboutrj.h" #include "core/buffer.h" AboutRJ::AboutRJ(QWidget *parent) : QDialog(parent), ui(new Ui::AboutRJ) { ui->setupUi(this); #ifdef unix QIcon unixicon(":/icons/robojournal-icon-big.png"); this->setWindowIcon(unixicon); #endif // hide question mark button in title bar when running on Windows this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); ui->label_2->setText("Version " + Buffer::version); char my_date[] = "Build Date: " __DATE__ " " __TIME__; // New for 0.4.1: set build date ui->BuildDate->setText(my_date); } AboutRJ::~AboutRJ() { delete ui; } void AboutRJ::on_buttonBox_accepted() { close(); } robojournal-0.4.2/ui/dblogin.cpp0000644000175000017500000001143712211723646015322 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/dblogin.h" #include "ui_dblogin.h" #include "ui/mainwindow.h" #include "core/buffer.h" #include #include // Will Kraft: 6/1/13 // Stripped out caps lock checker because it caused more problems during build time than it solved. // The code required direct-linking on some linux distros, which caused huge problems if the makefile wasn't patched beforehand. // Taking this code out greatly simplifies the build process. DBLogin::DBLogin(QWidget *parent) : QDialog(parent), ui(new Ui::DBLogin) { ui->setupUi(this); // use large icon on Linux #ifdef unix QIcon unixicon(":/icons/robojournal-icon.png"); this->setWindowIcon(unixicon); #endif // hide question mark button in title bar when running on Windows this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); int width=this->width(); int height=this->height(); this->setMaximumSize(width,height); this->setMinimumSize(width,height); } DBLogin::~DBLogin() { delete ui; } // function that checks if the config has changed // and refreshes the form if necessary void DBLogin::ResetPassword(){ ui->Password->setText(NULL); } void DBLogin::Refresh(){ // Check to see if defaults are being used if(Buffer::alwaysusedefaults){ ui->UseDBDefault->click(); ui->UseUserDefault->click(); } if(ui->UseDBDefault->isChecked() && ui->UseUserDefault->isChecked()){ ui->Password->setFocus(Qt::PopupFocusReason); } } void DBLogin::on_UseUserDefault_clicked() { if(ui->UseUserDefault->isChecked()){ ui->Username->setReadOnly(true); ui->Username->setText(Buffer::defaultuser); } else{ ui->Username->setReadOnly(false); ui->Username->clear(); } } void DBLogin::on_UseDBDefault_clicked() { if(ui->UseDBDefault->isChecked()){ ui->DBHost->setReadOnly(true); ui->WhichDB->setReadOnly(true); ui->DBHost->setText(Buffer::defaulthost); ui->WhichDB->setText(Buffer::defaultdatabase); } else{ ui->DBHost->setReadOnly(false); ui->WhichDB->setReadOnly(false); ui->DBHost->clear(); ui->WhichDB->clear(); } } void DBLogin::on_buttonBox_accepted() { using namespace std; // triggered if the user tries to log in as root if(ui->Username->text()=="root"){ // decide what to do depending on configuration if(Buffer::allowroot){ QMessageBox b; int choice=b.question(this,"RoboJournal","Logging in as root can be dangerous. Are you sure you want to do this?", QMessageBox::Yes|QMessageBox::No,QMessageBox::No); if(choice==QMessageBox::Yes){ // get data from form and pass it to Buffer class Buffer::login_succeeded=true; Buffer::database_name=ui->WhichDB->text(); Buffer::host=ui->DBHost->text(); Buffer::username=ui->Username->text(); Buffer::password=ui->Password->text(); } else{ // stop the login process if the buffer has previous login data Buffer::login_succeeded=false; this->reject(); } } else{ QMessageBox m; m.critical(this,"RoboJournal","You are not allowed to log in as root. Please enter a different username " "and try again."); // stop the login process if the buffer has previous login data Buffer::login_succeeded=false; this->reject(); } } // process normal logins else{ // get data from form and pass it to Buffer class Buffer::login_succeeded=true; Buffer::database_name=ui->WhichDB->text(); Buffer::host=ui->DBHost->text(); Buffer::username=ui->Username->text(); Buffer::password=ui->Password->text(); } } void DBLogin::on_buttonBox_rejected() { //login_succeeded=0; Buffer::login_succeeded=false; } robojournal-0.4.2/ui/configurationappearance.ui0000775000175000017500000002615012142060704020421 0ustar willwill ConfigurationAppearance 0 0 356 367 Form &Use custom font and/or background image Qt::Vertical QSizePolicy::Fixed 20 6 Style Options Select font and base font size: false 52 0 false 4 8 9 10 11 12 14 16 18 20 22 24 26 Font color: true Choose :/icons/color-swatch.png:/icons/color-swatch.png Qt::Vertical QSizePolicy::Fixed 20 6 Select background image from disk: true 0 0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Browse for an image on your computer (this turns background on)</span></p></body></html> :/icons/folder.png:/icons/folder.png <p>Clear current image (this turns background off)</p> :/icons/clear-text.png:/icons/clear-text.png <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If checked, RoboJournal will repeat the background image on both the X and Y axis. For best results you should use seamless background images.</p></body></html> &Tile background image <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If checked, RoboJournal will apply the background texture to the entry list tree. <span style=" font-weight:600;">FYI: Changes may not take effect until the next time you start RoboJournal.</span></p></body></html> Apply background image to &entry list If checked, the background image will not move when the user scrolls. &Anchor background image in place <p>If checked, the date/timestamp box still uses the same colors as the native system theme. This is feature is best if you wish to use a custom font but no custom background. This option overrides previous functionality which requires the background color of the date/timestamp box to match that of the text. </p> Use &system colors in date/timestamp box Qt::Vertical 20 40 robojournal-0.4.2/ui/dblogin.h0000644000175000017500000000302312211723646014757 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef DBLOGIN_H #define DBLOGIN_H #include namespace Ui { class DBLogin; } class DBLogin : public QDialog { Q_OBJECT public: explicit DBLogin(QWidget *parent = 0); ~DBLogin(); void Refresh(); bool login_succeeded; QString login_host; QString login_user; QString login_pass; QString login_db; //const QString &pUser; //const QString &pPass; //const QString &pDB; //const QString &pHost; QString * pUsername; QString * pHost; QString * pDB; void ResetPassword(); protected: private slots: void on_UseUserDefault_clicked(); void on_UseDBDefault_clicked(); void on_buttonBox_accepted(); void on_buttonBox_rejected(); private: Ui::DBLogin *ui; }; #endif // DBLOGIN_H robojournal-0.4.2/ui/configurationappearance.cpp0000775000175000017500000001467312142060704020575 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "configurationappearance.h" #include "ui_configurationappearance.h" #include "core/buffer.h" #include #include #include #include "ui/newconfig.h" ConfigurationAppearance::ConfigurationAppearance(QWidget *parent) : QWidget(parent), ui(new Ui::ConfigurationAppearance) { ui->setupUi(this); PopulateForm(); } ConfigurationAppearance::~ConfigurationAppearance() { delete ui; } void ConfigurationAppearance::on_UseTheme_clicked(bool checked) { if(checked){ ui->groupBox->setDisabled(false); // Bugfix: Disable background options out of the box. ui->ClearButton->click(); } else{ ui->groupBox->setDisabled(true); } } // Set form fields to match config data in buffer void ConfigurationAppearance::PopulateForm(){ // Hide this for now because the TextEdit doesn't support the background-attachment:fixed property ui->BGFixed->setVisible(false); if(Buffer::use_custom_theme){ ui->UseTheme->click(); QFont font(Buffer::font_face); ui->Font->setCurrentFont(font); for(int i=0; iFontSize->count(); i++){ if(ui->FontSize->itemText(i)==Buffer::font_size){ //cout << "Item: " << i << endl; ui->FontSize->setCurrentIndex(i); break; } } ui->ColorValue->setText(Buffer::text_hexcolor); if(Buffer::use_background){ ui->Entrylist_Background->setChecked(Buffer::set_tree_background); ui->TileBackground->setChecked(Buffer::tile_bg); ui->BGFixed->setChecked(Buffer::bg_is_fixed); ui->BGImage->setText(Buffer::background_image); ui->Entrylist_Background->setDisabled(false); ui->TileBackground->setDisabled(false); } else{ ui->Entrylist_Background->setDisabled(true); ui->TileBackground->setDisabled(true); ui->BGFixed->setDisabled(true); } ui->DateboxOverride->setChecked(Buffer::datebox_override); } else{ // perform a double click to disable the Custom Theme group ui->UseTheme->click(); ui->UseTheme->click(); QFont font(Buffer::font_face); ui->Font->setCurrentFont(font); for(int i=0; iFontSize->count(); i++){ if(ui->FontSize->itemText(i)==Buffer::font_size){ //cout << "Item: " << i << endl; ui->FontSize->setCurrentIndex(i); break; } } // if Bgcolor is null, set black as default if((Buffer::text_hexcolor.isEmpty()) || (Buffer::text_hexcolor=="NULL")){ Buffer::text_hexcolor="#000000"; } ui->ColorValue->setText(Buffer::text_hexcolor); ui->BGImage->setText(Buffer::background_image); ui->Entrylist_Background->setChecked(Buffer::set_tree_background); ui->TileBackground->setChecked(Buffer::tile_bg); ui->DateboxOverride->setChecked(Buffer::datebox_override); } } //################################################################################################ // Background selection function QString ConfigurationAppearance::BackgroundSelect(){ QFileDialog f(this); QString file=f.getOpenFileName(this,"Choose Background Image","","Images (*.png *.jpg *.bmp *.gif)"); return file; } //################################################################################################ //Function that allows the user to select a color and returns the color as RGB hex value QString ConfigurationAppearance::ColorSelect(){ // bugfix for 0.3 8/26/12: make the dialog load the current color when clicked QColor current(ui->ColorValue->text()); QColorDialog d(this); d.setCurrentColor(current); d.setOption(QColorDialog::DontUseNativeDialog,true); d.exec(); QColor choice=d.selectedColor(); QString color=choice.name(); return color; } void ConfigurationAppearance::on_ColorButton_clicked() { QString color=ColorSelect(); color=color.toUpper(); ui->ColorValue->setText(color); } void ConfigurationAppearance::on_BrowseButton_clicked() { QString file=BackgroundSelect(); if(!file.isEmpty()){ ui->BGImage->setText(file); // re-enable background options ui->TileBackground->setEnabled(true); ui->Entrylist_Background->setEnabled(true); ui->BGFixed->setEnabled(true); } } void ConfigurationAppearance::GetChanges(){ Newconfig::new_use_custom_theme=ui->UseTheme->isChecked(); Newconfig::new_font_face=ui->Font->currentText(); Newconfig::new_font_size=ui->FontSize->currentIndex(); Newconfig::new_text_hexcolor=ui->ColorValue->text(); Newconfig::new_background_image=ui->BGImage->text(); Newconfig::new_bg_is_fixed=ui->BGFixed->isChecked(); Newconfig::new_tile_bg=ui->TileBackground->isChecked(); if(!ui->BGImage->text().isEmpty()){ Newconfig::new_use_background=true; } else{ Newconfig::new_use_background=false; } Newconfig::new_use_background_in_tree=ui->Entrylist_Background->isChecked(); Newconfig::new_datebox_override=ui->DateboxOverride->isChecked(); } void ConfigurationAppearance::on_ClearButton_clicked() { ui->BGImage->clear(); ui->TileBackground->setEnabled(false); ui->Entrylist_Background->setEnabled(false); ui->TileBackground->setChecked(false); ui->Entrylist_Background->setChecked(false); ui->BGFixed->setDisabled(true); ui->BGFixed->setChecked(false); } robojournal-0.4.2/ui/configurationeditor.cpp0000644000175000017500000001751012211723646017760 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include #include "configurationeditor.h" #include "ui_configurationeditor.h" #include "core/buffer.h" #include "ui/newconfig.h" #include #include #include ConfigurationEditor::ConfigurationEditor(QWidget *parent) : QWidget(parent), ui(new Ui::ConfigurationEditor) { ui->setupUi(this); // hide spellcheck group box until version 0.5 //ui->groupBox_3->setVisible(false); PopulateForm(); // Will Kraft -- Bugfix 5/6/13: Temporarily disable spellcheck on Linux-based systems due to // the overwhelming problems I've had with it. I hope to have this fixed for good by 0.5 once // I've stripped out the entire spellchecker and replaced it with something better. #ifdef __gnu_linux__ ui->UseSpellCheck->setChecked(false); ui->ShowSpellingErrors->setChecked(false); ui->Dictionary->clear(); ui->UseSpellCheck->setEnabled(false); ui->BrowseButton->setEnabled(false); ui->ShowSpellingErrors->setEnabled(false); ui->Dictionary->setEnabled(false); ui->UseSpellCheck->setToolTip("

    This feature is temporarily unavailable on Linux-based operating systems.

    "); ui->ShowSpellingErrors->setToolTip("

    This feature is temporarily unavailable on Linux-based operating systems.

    "); ui->Dictionary->setToolTip("

    This feature is temporarily unavailable on Linux-based operating systems.

    "); ui->BrowseButton->setToolTip("

    This feature is temporarily unavailable on Linux-based operating systems.

    "); #endif } ConfigurationEditor::~ConfigurationEditor() { delete ui; } //############################################################################################################# void ConfigurationEditor::PopulateForm(){ ui->TrimWhiteSpace->setChecked(Buffer::trim_whitespace); ui->ForceHyphens->setChecked(Buffer::use_html_hyphens); ui->ForceSmartQuotes->setChecked(Buffer::use_smart_quotes); ui->MiscFormatting->setChecked(Buffer::use_misc_processing); if(Buffer::use_custom_theme){ ui->CustomThemeEditor->setDisabled(false); ui->CustomThemeEditor->setChecked(Buffer::use_custom_theme_editor); } else{ ui->CustomThemeEditor->setDisabled(true); ui->CustomThemeEditor->setChecked(false); } if(Buffer::use_spellcheck){ ui->UseSpellCheck->setChecked(true); ui->BrowseButton->setDisabled(false); ui->ShowSpellingErrors->setDisabled(false); ui->Dictionary->setDisabled(false); ui->ShowSpellingErrors->setChecked(Buffer::show_spell_errors_by_default); ui->Dictionary->setText(Buffer::current_dictionary); } else{ ui->UseSpellCheck->setChecked(false); ui->ShowSpellingErrors->setDisabled(true); ui->ShowSpellingErrors->setChecked(false); ui->BrowseButton->setDisabled(true); ui->Dictionary->setDisabled(true); ui->Dictionary->clear(); } } //############################################################################################################# void ConfigurationEditor::GetChanges(){ Newconfig::new_trim_whitespace=ui->TrimWhiteSpace->isChecked(); Newconfig::new_use_html_hyphens=ui->ForceHyphens->isChecked(); Newconfig::new_use_smart_quotes=ui->ForceSmartQuotes->isChecked(); Newconfig::new_use_custom_theme_editor=ui->CustomThemeEditor->isChecked(); Newconfig::new_use_spellcheck=ui->UseSpellCheck->isChecked(); Newconfig::new_show_spell_errors_by_default=ui->ShowSpellingErrors->isChecked(); Newconfig::new_current_dictionary=ui->Dictionary->text(); Newconfig::new_use_misc_processing=ui->MiscFormatting->isChecked(); // Preserve current AFF value if the user didn't make changes this session if(!aff_file.isEmpty()){ Newconfig::new_current_dictionary_aff=aff_file; } else{ Newconfig::new_current_dictionary_aff=Buffer::current_dictionary_aff; } } //############################################################################################################# void ConfigurationEditor::on_BrowseButton_clicked() { QString folderpath=QDir::homePath()+ QDir::separator() + ".robojournal"+ QDir::separator(); // This code is from Jan Sundermeyer's Spellcheck program. QString fileName = QFileDialog::getOpenFileName(this, tr("Select Dictionary"), folderpath, tr("Dictionary (*.dic)")); QString new_Dict=fileName; //Find AFF file and save it. if(!new_Dict.isEmpty()){ aff_file=Find_AFF_File(new_Dict); } if(!new_Dict.isEmpty()){ ui->Dictionary->setText(new_Dict); } else{ ui->UseSpellCheck->setChecked(false); ui->ShowSpellingErrors->setChecked(false); ui->BrowseButton->setEnabled(false); ui->ShowSpellingErrors->setEnabled(false); ui->Dictionary->setEnabled(false); } } //############################################################################################################# // Find and return the AFF file for the chosen dictionary. The AFF file contains grammer rules and more importantly keeps the // app from segfaulting on Windows. QString ConfigurationEditor::Find_AFF_File(QString dict){ using namespace std; QString aff_file="none"; int slashes=dict.count("/"); QString directory=dict.section("/",0,slashes-1); //cout << "Directory: " << directory.toStdString() << endl; QString dict_name=dict.section("/",slashes); dict_name.chop(4); //cout << "Base dict name: " << dict_name.toStdString() << endl; dict_name=dict_name+".aff"; QFile Aff(directory + QDir::separator() + dict_name); if(Aff.exists()){ cout << "OUTPUT: Found AFF File for selected dictionary (" << Aff.fileName().toStdString() << ")" << endl; aff_file=Aff.fileName(); } else{ QMessageBox m; int h=m.critical(this,"RoboJournal","RoboJournal couldn't find the AFF file for " "" + dict + " in the expected location. Do you want to find this file manually?",QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes); switch(h){ case QMessageBox::Yes: aff_file= QFileDialog::getOpenFileName(this, tr("Select Aff File"),dict_name, tr("Aff Files (*.aff)")); break; case QMessageBox::No: // do nothing break; } } return aff_file; } //############################################################################################################# void ConfigurationEditor::on_UseSpellCheck_clicked(bool checked) { if(checked){ ui->BrowseButton->setDisabled(false); ui->Dictionary->setDisabled(false); ui->ShowSpellingErrors->setDisabled(false); ui->ShowSpellingErrors->setChecked(true); if(Buffer::current_dictionary.isEmpty()){ ui->BrowseButton->click(); } else{ ui->Dictionary->setText(Buffer::current_dictionary); } } else{ ui->BrowseButton->setDisabled(true); ui->Dictionary->setDisabled(true); ui->ShowSpellingErrors->setDisabled(true); ui->ShowSpellingErrors->setChecked(false); ui->Dictionary->clear(); } } robojournal-0.4.2/ui/highlighter.h0000775000175000017500000001111412142060704015634 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA Will Kraft (11/27/12): This code was originally Jan Sundermeyer's work (sunderme@web.de) I made some minor changes and adapted it for RoboJournal >= 0.4. RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /**************************************************************************** ** ORIGINAL HEADER: ** ** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. ** ** This file is part of the example classes of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License versions 2.0 or 3.0 as published by the Free Software ** Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Alternatively you may (at ** your option) use any later version of the GNU General Public ** License if such license has been publicly approved by Trolltech ASA ** (or its successors, if any) and the KDE Free Qt Foundation. In ** addition, as a special exception, Trolltech gives you certain ** additional rights. These rights are described in the Trolltech GPL ** Exception version 1.1, which can be found at ** http://www.trolltech.com/products/qt/gplexception/ and in the file ** GPL_EXCEPTION.txt in this package. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. If ** you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** In addition, as a special exception, Trolltech, as the sole ** copyright holder for Qt Designer, grants users of the Qt/Eclipse ** Integration plug-in the right for the Qt/Eclipse Integration to ** link to functionality provided by Qt Designer and its related ** libraries. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not expressly ** granted herein. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #ifndef HIGHLIGHTER_H #define HIGHLIGHTER_H #include #include #include #include "ui/hunspell/hunspell.hxx" class QTextDocument; class Highlighter : public QSyntaxHighlighter { Q_OBJECT public: Highlighter(QTextDocument *parent = 0,QString SpellDic="",bool spellCheckState=false); ~Highlighter(); void clearCheck(); QStringList misspelled(); QStringList correct(); void enableSpellChecking(const bool state); void setSpellCheck(const bool state); bool setDict(const QString SpellDic); //bool checkWord(QString word); int num_errors; public slots: void slot_addWord(QString word); protected: void highlightBlock(const QString &text); void spellCheck(const QString &text); bool checkWord(QString word); private: struct HighlightingRule { QRegExp pattern; QTextCharFormat format; }; QVector highlightingRules; QRegExp commentStartExpression; QRegExp commentEndExpression; QTextCharFormat keywordFormat; QTextCharFormat classFormat; QTextCharFormat singleLineCommentFormat; QTextCharFormat multiLineCommentFormat; QTextCharFormat quotationFormat; QTextCharFormat functionFormat; QString spell_dic, spell_encoding; Hunspell * pChecker; bool spellCheckActive,spellerError; QTextCharFormat spellCheckFormat; QTextCodec *codec; }; #endif robojournal-0.4.2/ui/configurationeditor.ui0000775000175000017500000002140112142060704017602 0ustar willwill ConfigurationEditor 0 0 332 400 Form Post-Processing <p><b>(Recommended)</b> This setting requires the editor to remove extra line breaks and other white space (like redundant spaces between words) from the body text.<br /><br />FYI: Whitespace removal is only applied to entries &lt; 1000 words in length due to performance issues. This feature is still semi-experimental so occasional issues are to be expected.</p> Remove &unnecessary whitespace from entries <p><b>(Recommended)</b> This setting forces the use of HTML-compliant hyphenation and dashes ( i.e. — instead of --). This looks better on most displays.</p> Use HTML-compliant dashes and &hyphens <p><b>(Recommended)</b>This setting requires the editor to apply “curly” quotation marks to all entries in place of &quot;straight&quot; quotes. This function also affects apostrophes and other instances where single quotes are used in words.</p> Use smart (curly) &quotation marks <p><b>(Recommended)</b> This option applies additional post-processing features to text, including replacing three or more periods with the standard ellipsis character (…) and displaying number notation in superscript (i.e. 1<span style=" vertical-align:super;">st</span>).</p> Apply &miscellaneous formatting options Appearance <p>If checked, this will cause the Editor to use the same custom font/font size as defined on the <b>Appearance</b> page. FYI: This option is only available if a custom theme is currently in use.</p> Use custom &theme font in the editor Spell Check <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If checked, this function enables in-line spell checking in the Editor window.</p></body></html> Enable &spell check functionality <p><span style=" font-weight:600;">(Recommended)</span> If checked, this option requires RoboJournal to highlight (<span style=" text-decoration: underline; color:#ff0000;">underline</span>) spelling errors in the current entry each time the editor is displayed. This behavior may be toggled by means of a toolbar button in the editor interface.</p> Highlight spelling &errors in text by default Qt::Vertical QSizePolicy::Fixed 20 6 Select spell check dictionary: true true Browse :/icons/folder.png:/icons/folder.png Qt::Vertical 20 40 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">FYI: Changes to Post-Processing will </span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600;">not</span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;"> affect existing entries.</span></p></body></html> true robojournal-0.4.2/ui/mainwindow.h0000644000175000017500000001277412211723646015532 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); QString Connection; QString hostname; QString username; QString password; QString database; QList IDList; private slots: void on_WriteButton_clicked(); void on_SearchButton_clicked(); void on_ConnectButton_clicked(); void on_DisconnectButton_clicked(); void on_ConfigButton_clicked(); void on_actionPreferences_2_triggered(); void on_actionConnect_triggered(); void on_actionToolbar_triggered(bool checked); void on_actionCopy_triggered(); void on_actionSelect_all_triggered(); void on_actionMain_toolbar_triggered(bool checked); void on_actionLeft_default_triggered(); void on_actionTop_triggered(); void on_actionRight_triggered(); void on_actionQuit_triggered(); void on_actionAbout_RoboJournal_triggered(); void on_TodayButton_clicked(); void on_LastEntry_clicked(); void on_actionLatest_Entry_triggered(); void on_actionDisconnect_triggered(); void on_EntryList_itemClicked(QTreeWidgetItem *item); void on_NextEntry_clicked(); void on_actionPrevious_Entry_triggered(); void on_actionNext_Entry_triggered(); void on_actionEdit_Selected_Entry_triggered(); void on_actionSetup_Wizard_2_triggered(); void on_actionPrint_triggered(); void on_DeleteEntry_clicked(); void on_actionDelete_Current_Entry_triggered(); void on_actionWrite_triggered(); void on_actionHelp_file_triggered(); void on_EditEntryButton_clicked(); void on_Tag_clicked(); void on_actionManage_Tags_2_triggered(); void on_actionSelect_Default_Journal_triggered(); void on_ExportEntry_clicked(); void on_actionExport_Entry_triggered(); void on_actionEntry_List_toggled(bool arg1); void on_SearchFilter_currentIndexChanged(const QString &arg1); void on_ClearButton_clicked(); void on_actionJournal_Creator_triggered(); void on_tabWidget_currentChanged(int index); void on_WholeWords_clicked(); void on_SearchList_currentItemChanged(QTreeWidgetItem *current); void on_actionJournal_Selector_triggered(); private: Ui::MainWindow *ui; void PrimaryConfig(); void CreateTree(); void ChangeSelection(QString rowid, QString rowtitle); void ShowHelp(); void Modify(); void Connect(); void Disconnect(); void Preferences(); void ShowCredits(); void Write(); void MostRecent(); void GetPrevious(); void GetEntry(QString id, bool fromSearch); void GetAdjacent(int direction); void DeleteSelectedEntry(); void TotalEntryCount(int totalcount); void Decorate_GUI(); void Print(); void ExportEntry(); bool SaveEntry(); void UpgradeJournal(); QString GetLongMonth(int month); void closeEvent(QCloseEvent *event); QString FormatTags(QString tags, QString color1, QString color2); void Tag(); void GetTagList(); void SearchDatabase(); QStringList HighlightResults(QString entry, QString title, QString term, int index); void SwitchTab(int index); void ClearSearchResults(); QString InvertColor(QString textcolor); // returns hex color inverse of input text color QString CreateStyleSheet(bool for_entrylist, bool is_TextEdit); // create stylesheet for Decorate_GUI function void UpdateSelectedEntry(QString id); QString CurrentID; // ID of currently selected entry QList hilite_list; // list that contains entries and their index pos as they are added QString Record; // contains the current record number (row id) int num_records; // this int holds the number of records. This is used for several functions. QString Global_Datestamp; // global date used for EntryExporter. When the user fetches a record, this value should hold the date for that entry. QString current_entry_date; // date for entry exporter QString current_entry_body; //body text for extry exporter QString current_entry_time; // timestamp for entry exporter //QTreeWidgetItem current; // returns the current selected tree item. This function is called in the back-and-forth buttons. void HighlightCurrentSelection(QString CurrentID); // should be true if db connection is on, false if it is not bool ConnectionActive; // magic sizing algorithm for splitter: int splittersize; // keep track if search is active or not bool has_search_results; //bool keep track of whether we used the editor or not. bool launched_editor; bool launched_config; }; #endif // MAINWINDOW_H robojournal-0.4.2/ui/editor.ui0000775000175000017500000002401112142060704015012 0ustar willwill Editor Qt::ApplicationModal 0 0 602 441 Write a Journal Entry :/icons/robojournal-icon.png:/icons/robojournal-icon.png false true 4 94 108 16 Character Count: 0 4 40 52 16 TextLabel 4 22 59 16 wordcount 4 4 57 16 remaining 4 58 57 16 Entry Title Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 4 76 59 16 Entry Date Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 4 112 594 54 Verdana 14 IBeamCursor false 4 170 199 29 Verdana 12 75 true 100 4 203 26 25 Save This Entry &Save This Entry :/icons/disk.png:/icons/disk.png 4 232 26 25 Redo Redo :/icons/arrow-curve.png:/icons/arrow-curve.png 4 261 26 25 Discard &Discard :/icons/prohibition-button.png:/icons/prohibition-button.png 4 290 26 25 Undo Undo :/icons/arrow-curve-180-left.png:/icons/arrow-curve-180-left.png 4 319 26 25 Arial false Paste Paste :/icons/paste_plain.png:/icons/paste_plain.png false false 4 348 155 24 0 0 false true QDateTimeEdit::MonthSection MMMM dd, yyyy Qt::LocalTime 4 376 26 25 Arial false Copy Copy :/icons/page_white_copy.png:/icons/page_white_copy.png false 4 405 26 25 Arial 50 false Cut Cut :/icons/cut.png:/icons/cut.png false 4 434 594 16 Qt::Horizontal 220 260 31 23 Show Spelling Errors Show Spelling Errors :/icons/spell-check-error.png:/icons/spell-check-error.png true false Qt::ToolButtonIconOnly robojournal-0.4.2/ui/tagreminder.h0000644000175000017500000000250412211723646015645 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef TAGREMINDER_H #define TAGREMINDER_H #include #include namespace Ui { class TagReminder; } class TagReminder : public QDialog { Q_OBJECT public: explicit TagReminder(QWidget *parent = 0); ~TagReminder(); int Lookup(); int GetEntries(); private slots: void on_ManageTags_clicked(); void on_EntryList_itemSelectionChanged(); void reject(); private: Ui::TagReminder *ui; void PrimaryConfig(); void CreateList(); void LaunchTagger(); void RefreshList(); }; #endif // TAGREMINDER_H robojournal-0.4.2/ui/exportpreview.ui0000775000175000017500000000522712142060704016457 0ustar willwill ExportPreview 0 0 597 491 Export Preview :/icons/robojournal.ico:/icons/robojournal.ico QPainter::Antialiasing|QPainter::HighQualityAntialiasing|QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing Qt::Vertical QSizePolicy::Fixed 20 6 Qt::Horizontal Qt::Horizontal QDialogButtonBox::Close QWebView QWidget
    QtWebKit/QWebView
    buttonBox accepted() ExportPreview accept() 248 254 157 274 buttonBox rejected() ExportPreview reject() 316 260 286 274
    robojournal-0.4.2/ui/hunspell/0000775000175000017500000000000012211723646015026 5ustar willwillrobojournal-0.4.2/ui/hunspell/hashmgr.cxx0000644000175000017500000007340612211723646017213 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "license.hunspell" #include "license.myspell" #ifndef MOZILLA_CLIENT #include #include #include #include #else #include #include #include #include #endif #include "ui/hunspell/hashmgr.hxx" #include "ui/hunspell/csutil.hxx" #include "ui/hunspell/atypes.hxx" #ifdef MOZILLA_CLIENT #ifdef __SUNPRO_CC // for SunONE Studio compiler using namespace std; #endif #else #ifndef WIN32 using namespace std; #endif #endif // build a hash table from a munched word list HashMgr::HashMgr(const char * tpath, const char * apath, const char * key) { tablesize = 0; tableptr = NULL; flag_mode = FLAG_CHAR; complexprefixes = 0; utf8 = 0; langnum = 0; lang = NULL; enc = NULL; csconv = 0; ignorechars = NULL; ignorechars_utf16 = NULL; ignorechars_utf16_len = 0; numaliasf = 0; aliasf = NULL; numaliasm = 0; aliasm = NULL; forbiddenword = FORBIDDENWORD; // forbidden word signing flag load_config(apath, key); int ec = load_tables(tpath, key); if (ec) { /* error condition - what should we do here */ HUNSPELL_WARNING(stderr, "Hash Manager Error : %d\n",ec); if (tableptr) { free(tableptr); tableptr = NULL; } tablesize = 0; } } HashMgr::~HashMgr() { if (tableptr) { // now pass through hash table freeing up everything // go through column by column of the table for (int i=0; i < tablesize; i++) { struct hentry * pt = tableptr[i]; struct hentry * nt = NULL; while(pt) { nt = pt->next; if (pt->astr && (!aliasf || TESTAFF(pt->astr, ONLYUPCASEFLAG, pt->alen))) free(pt->astr); free(pt); pt = nt; } } free(tableptr); } tablesize = 0; if (aliasf) { for (int j = 0; j < (numaliasf); j++) free(aliasf[j]); free(aliasf); aliasf = NULL; if (aliasflen) { free(aliasflen); aliasflen = NULL; } } if (aliasm) { for (int j = 0; j < (numaliasm); j++) free(aliasm[j]); free(aliasm); aliasm = NULL; } #ifndef OPENOFFICEORG #ifndef MOZILLA_CLIENT if (utf8) free_utf_tbl(); #endif #endif if (enc) free(enc); if (lang) free(lang); if (ignorechars) free(ignorechars); if (ignorechars_utf16) free(ignorechars_utf16); } // lookup a root word in the hashtable struct hentry * HashMgr::lookup(const char *word) const { struct hentry * dp; if (tableptr) { dp = tableptr[hash(word)]; if (!dp) return NULL; for ( ; dp != NULL; dp = dp->next) { if (strcmp(word,&(dp->word)) == 0) return dp; } } return NULL; } // add a word to the hash table (private) int HashMgr::add_word(const char * word, int wbl, int wcl, unsigned short * aff, int al, const char * desc, bool onlyupcase) { bool upcasehomonym = false; int descl = desc ? (aliasm ? sizeof(short) : strlen(desc) + 1) : 0; // variable-length hash record with word and optional fields struct hentry* hp = (struct hentry *) malloc (sizeof(struct hentry) + wbl + descl); if (!hp) return 1; char * hpw = &(hp->word); strcpy(hpw, word); if (ignorechars != NULL) { if (utf8) { remove_ignored_chars_utf(hpw, ignorechars_utf16, ignorechars_utf16_len); } else { remove_ignored_chars(hpw, ignorechars); } } if (complexprefixes) { if (utf8) reverseword_utf(hpw); else reverseword(hpw); } int i = hash(hpw); hp->blen = (unsigned char) wbl; hp->clen = (unsigned char) wcl; hp->alen = (short) al; hp->astr = aff; hp->next = NULL; hp->next_homonym = NULL; // store the description string or its pointer if (desc) { hp->var = H_OPT; if (aliasm) { hp->var += H_OPT_ALIASM; // *((char **) (hpw + wbl + 1)) = get_aliasm(atoi(desc)); store_pointer(hpw + wbl + 1, get_aliasm(atoi(desc))); } else { strcpy(hpw + wbl + 1, desc); if (complexprefixes) { if (utf8) reverseword_utf(HENTRY_DATA(hp)); else reverseword(HENTRY_DATA(hp)); } } if (strstr(HENTRY_DATA(hp), MORPH_PHON)) hp->var += H_OPT_PHON; } else hp->var = 0; struct hentry * dp = tableptr[i]; if (!dp) { tableptr[i] = hp; return 0; } while (dp->next != NULL) { if ((!dp->next_homonym) && (strcmp(&(hp->word), &(dp->word)) == 0)) { // remove hidden onlyupcase homonym if (!onlyupcase) { if ((dp->astr) && TESTAFF(dp->astr, ONLYUPCASEFLAG, dp->alen)) { free(dp->astr); dp->astr = hp->astr; dp->alen = hp->alen; free(hp); return 0; } else { dp->next_homonym = hp; } } else { upcasehomonym = true; } } dp=dp->next; } if (strcmp(&(hp->word), &(dp->word)) == 0) { // remove hidden onlyupcase homonym if (!onlyupcase) { if ((dp->astr) && TESTAFF(dp->astr, ONLYUPCASEFLAG, dp->alen)) { free(dp->astr); dp->astr = hp->astr; dp->alen = hp->alen; free(hp); return 0; } else { dp->next_homonym = hp; } } else { upcasehomonym = true; } } if (!upcasehomonym) { dp->next = hp; } else { // remove hidden onlyupcase homonym if (hp->astr) free(hp->astr); free(hp); } return 0; } int HashMgr::add_hidden_capitalized_word(char * word, int wbl, int wcl, unsigned short * flags, int al, char * dp, int captype) { // add inner capitalized forms to handle the following allcap forms: // Mixed caps: OpenOffice.org -> OPENOFFICE.ORG // Allcaps with suffixes: CIA's -> CIA'S if (((captype == HUHCAP) || (captype == HUHINITCAP) || ((captype == ALLCAP) && (flags != NULL))) && !((flags != NULL) && TESTAFF(flags, forbiddenword, al))) { unsigned short * flags2 = (unsigned short *) malloc (sizeof(unsigned short) * (al+1)); if (!flags2) return 1; if (al) memcpy(flags2, flags, al * sizeof(unsigned short)); flags2[al] = ONLYUPCASEFLAG; if (utf8) { char st[BUFSIZE]; w_char w[BUFSIZE]; int wlen = u8_u16(w, BUFSIZE, word); mkallsmall_utf(w, wlen, langnum); mkallcap_utf(w, 1, langnum); u16_u8(st, BUFSIZE, w, wlen); return add_word(st,wbl,wcl,flags2,al+1,dp, true); } else { mkallsmall(word, csconv); mkinitcap(word, csconv); return add_word(word,wbl,wcl,flags2,al+1,dp, true); } } return 0; } // detect captype and modify word length for UTF-8 encoding int HashMgr::get_clen_and_captype(const char * word, int wbl, int * captype) { int len; if (utf8) { w_char dest_utf[BUFSIZE]; len = u8_u16(dest_utf, BUFSIZE, word); *captype = get_captype_utf8(dest_utf, len, langnum); } else { len = wbl; *captype = get_captype((char *) word, len, csconv); } return len; } // remove word (personal dictionary function for standalone applications) int HashMgr::remove(const char * word) { struct hentry * dp = lookup(word); while (dp) { if (dp->alen == 0 || !TESTAFF(dp->astr, forbiddenword, dp->alen)) { unsigned short * flags = (unsigned short *) malloc(sizeof(short *) * (dp->alen + 1)); if (!flags) return 1; for (int i = 0; i < dp->alen; i++) flags[i] = dp->astr[i]; flags[dp->alen] = forbiddenword; dp->astr = flags; dp->alen++; flag_qsort(flags, 0, dp->alen); } dp = dp->next_homonym; } return 0; } /* remove forbidden flag to add a personal word to the hash */ int HashMgr::remove_forbidden_flag(const char * word) { struct hentry * dp = lookup(word); if (!dp) return 1; while (dp) { if (dp->astr && TESTAFF(dp->astr, forbiddenword, dp->alen)) { if (dp->alen == 1) dp->alen = 0; // XXX forbidden words of personal dic. else { unsigned short * flags2 = (unsigned short *) malloc(sizeof(short *) * (dp->alen - 1)); if (!flags2) return 1; int i, j = 0; for (i = 0; i < dp->alen; i++) { if (dp->astr[i] != forbiddenword) flags2[j++] = dp->astr[i]; } dp->alen--; dp->astr = flags2; // XXX allowed forbidden words } } dp = dp->next_homonym; } return 0; } // add a custom dic. word to the hash table (public) int HashMgr::add(const char * word, char * aff) { unsigned short * flags; int al = 0; if (aff) { al = decode_flags(&flags, aff); flag_qsort(flags, 0, al); } else { flags = NULL; } if (remove_forbidden_flag(word)) { int captype; int wbl = strlen(word); int wcl = get_clen_and_captype(word, wbl, &captype); add_word(word, wbl, wcl, flags, al, NULL, false); return add_hidden_capitalized_word((char *) word, wbl, wcl, flags, al, NULL, captype); } return 0; } int HashMgr::add_with_affix(const char * word, const char * example) { // detect captype and modify word length for UTF-8 encoding struct hentry * dp = lookup(example); remove_forbidden_flag(word); if (dp && dp->astr) { int captype; int wbl = strlen(word); int wcl = get_clen_and_captype(word, wbl, &captype); if (aliasf) { add_word(word, wbl, wcl, dp->astr, dp->alen, NULL, false); } else { unsigned short * flags = (unsigned short *) malloc (dp->alen * sizeof(short)); if (flags) { memcpy((void *) flags, (void *) dp->astr, dp->alen * sizeof(short)); add_word(word, wbl, wcl, flags, dp->alen, NULL, false); } else return 1; } return add_hidden_capitalized_word((char *) word, wbl, wcl, dp->astr, dp->alen, NULL, captype); } return 1; } // walk the hash table entry by entry - null at end // initialize: col=-1; hp = NULL; hp = walk_hashtable(&col, hp); struct hentry * HashMgr::walk_hashtable(int &col, struct hentry * hp) const { if (hp && hp->next != NULL) return hp->next; for (col++; col < tablesize; col++) { if (tableptr[col]) return tableptr[col]; } // null at end and reset to start col = -1; return NULL; } // load a munched word list and build a hash table on the fly int HashMgr::load_tables(const char * tpath, const char * key) { int al; char * ap; char * dp; unsigned short * flags; char * ts; // open dictionary file FileMgr * dict = new FileMgr(tpath, key); if (dict == NULL) return 1; // first read the first line of file to get hash table size */ if (!(ts = dict->getline())) { HUNSPELL_WARNING(stderr, "error: empty dic file\n"); delete dict; return 2; } mychomp(ts); /* remove byte order mark */ if (strncmp(ts,"\xEF\xBB\xBF",3) == 0) { memmove(ts, ts+3, strlen(ts+3)+1); HUNSPELL_WARNING(stderr, "warning: dic file begins with byte order mark: possible incompatibility with old Hunspell versions\n"); } if ((*ts < '1') || (*ts > '9')) HUNSPELL_WARNING(stderr, "error - missing word count in dictionary file\n"); tablesize = atoi(ts); if (!tablesize) { delete dict; return 4; } tablesize = tablesize + 5 + USERWORD; if ((tablesize %2) == 0) tablesize++; // allocate the hash table tableptr = (struct hentry **) malloc(tablesize * sizeof(struct hentry *)); if (! tableptr) { delete dict; return 3; } for (int i=0; igetline())) { mychomp(ts); // split each line into word and morphological description dp = strchr(ts,'\t'); char * dp2 = strchr(ts,' '); if (dp2 && (!dp || (dp2 < dp))) dp = dp2; if (dp) { *dp = '\0'; dp++; } else { dp = NULL; } // split each line into word and affix char strings // "\/" signs slash in words (not affix separator) // "/" at beginning of the line is word character (not affix separator) ap = strchr(ts,'/'); while (ap) { if (ap == ts) { ap++; continue; } else if (*(ap - 1) != '\\') break; // replace "\/" with "/" for (char * sp = ap - 1; *sp; *sp = *(sp + 1), sp++); ap = strchr(ap,'/'); } if (ap) { *ap = '\0'; if (aliasf) { int index = atoi(ap + 1); al = get_aliasf(index, &flags); if (!al) { HUNSPELL_WARNING(stderr, "error - bad flag vector alias: %s\n", ts); *ap = '\0'; } } else { al = decode_flags(&flags, ap + 1); flag_qsort(flags, 0, al); } } else { al = 0; ap = NULL; flags = NULL; } int captype; int wbl = strlen(ts); int wcl = get_clen_and_captype(ts, wbl, &captype); // add the word and its index plus its capitalized form optionally if (add_word(ts,wbl,wcl,flags,al,dp, false) || add_hidden_capitalized_word(ts, wbl, wcl, flags, al, dp, captype)) { delete dict; return 5; } } delete dict; return 0; } // the hash function is a simple load and rotate // algorithm borrowed int HashMgr::hash(const char * word) const { long hv = 0; for (int i=0; i < 4 && *word != 0; i++) hv = (hv << 8) | (*word++); while (*word != 0) { ROTATE(hv,ROTATE_LEN); hv ^= (*word++); } return (unsigned long) hv % tablesize; } int HashMgr::decode_flags(unsigned short ** result, char * flags) { int len; switch (flag_mode) { case FLAG_LONG: { // two-character flags (1x2yZz -> 1x 2y Zz) len = strlen(flags); if (len%2 == 1) HUNSPELL_WARNING(stderr, "error: length of FLAG_LONG flagvector is odd: %s\n", flags); len /= 2; *result = (unsigned short *) malloc(len * sizeof(short)); if (!*result) return -1; for (int i = 0; i < len; i++) { (*result)[i] = (((unsigned short) flags[i * 2]) << 8) + (unsigned short) flags[i * 2 + 1]; } break; } case FLAG_NUM: { // decimal numbers separated by comma (4521,23,233 -> 4521 23 233) len = 1; char * src = flags; unsigned short * dest; char * p; for (p = flags; *p; p++) { if (*p == ',') len++; } *result = (unsigned short *) malloc(len * sizeof(short)); if (!*result) return -1; dest = *result; for (p = flags; *p; p++) { if (*p == ',') { *dest = (unsigned short) atoi(src); if (*dest == 0) HUNSPELL_WARNING(stderr, "error: 0 is wrong flag id\n"); src = p + 1; dest++; } } *dest = (unsigned short) atoi(src); if (*dest == 0) HUNSPELL_WARNING(stderr, "error: 0 is wrong flag id\n"); break; } case FLAG_UNI: { // UTF-8 characters w_char w[BUFSIZE/2]; len = u8_u16(w, BUFSIZE/2, flags); *result = (unsigned short *) malloc(len * sizeof(short)); if (!*result) return -1; memcpy(*result, w, len * sizeof(short)); break; } default: { // Ispell's one-character flags (erfg -> e r f g) unsigned short * dest; len = strlen(flags); *result = (unsigned short *) malloc(len * sizeof(short)); if (!*result) return -1; dest = *result; for (unsigned char * p = (unsigned char *) flags; *p; p++) { *dest = (unsigned short) *p; dest++; } } } return len; } unsigned short HashMgr::decode_flag(const char * f) { unsigned short s = 0; switch (flag_mode) { case FLAG_LONG: s = ((unsigned short) f[0] << 8) + (unsigned short) f[1]; break; case FLAG_NUM: s = (unsigned short) atoi(f); break; case FLAG_UNI: u8_u16((w_char *) &s, 1, f); break; default: s = (unsigned short) *((unsigned char *)f); } if (!s) HUNSPELL_WARNING(stderr, "error: 0 is wrong flag id\n"); return s; } char * HashMgr::encode_flag(unsigned short f) { unsigned char ch[10]; if (f==0) return mystrdup("(NULL)"); if (flag_mode == FLAG_LONG) { ch[0] = (unsigned char) (f >> 8); ch[1] = (unsigned char) (f - ((f >> 8) << 8)); ch[2] = '\0'; } else if (flag_mode == FLAG_NUM) { sprintf((char *) ch, "%d", f); } else if (flag_mode == FLAG_UNI) { u16_u8((char *) &ch, 10, (w_char *) &f, 1); } else { ch[0] = (unsigned char) (f); ch[1] = '\0'; } return mystrdup((char *) ch); } // read in aff file and set flag mode int HashMgr::load_config(const char * affpath, const char * key) { char * line; // io buffers int firstline = 1; // open the affix file FileMgr * afflst = new FileMgr(affpath, key); if (!afflst) { HUNSPELL_WARNING(stderr, "Error - could not open affix description file %s\n",affpath); return 1; } // read in each line ignoring any that do not // start with a known line type indicator while ((line = afflst->getline())) { mychomp(line); /* remove byte order mark */ if (firstline) { firstline = 0; if (strncmp(line,"\xEF\xBB\xBF",3) == 0) memmove(line, line+3, strlen(line+3)+1); } /* parse in the try string */ if ((strncmp(line,"FLAG",4) == 0) && isspace(line[4])) { if (flag_mode != FLAG_CHAR) { HUNSPELL_WARNING(stderr, "error: duplicate FLAG parameter\n"); } if (strstr(line, "long")) flag_mode = FLAG_LONG; if (strstr(line, "num")) flag_mode = FLAG_NUM; if (strstr(line, "UTF-8")) flag_mode = FLAG_UNI; if (flag_mode == FLAG_CHAR) { HUNSPELL_WARNING(stderr, "error: FLAG need `num', `long' or `UTF-8' parameter: %s\n", line); } } if (strncmp(line,"FORBIDDENWORD",13) == 0) { char * st = NULL; if (parse_string(line, &st, "FORBIDDENWORD")) { delete afflst; return 1; } forbiddenword = decode_flag(st); free(st); } if (strncmp(line, "SET", 3) == 0) { if (parse_string(line, &enc, "SET")) { delete afflst; return 1; } if (strcmp(enc, "UTF-8") == 0) { utf8 = 1; #ifndef OPENOFFICEORG #ifndef MOZILLA_CLIENT initialize_utf_tbl(); #endif #endif } else csconv = get_current_cs(enc); } if (strncmp(line, "LANG", 4) == 0) { if (parse_string(line, &lang, "LANG")) { delete afflst; return 1; } langnum = get_lang_num(lang); } /* parse in the ignored characters (for example, Arabic optional diacritics characters */ if (strncmp(line,"IGNORE",6) == 0) { if (parse_array(line, &ignorechars, &ignorechars_utf16, &ignorechars_utf16_len, "IGNORE", utf8)) { delete afflst; return 1; } } if ((strncmp(line,"AF",2) == 0) && isspace(line[2])) { if (parse_aliasf(line, afflst)) { delete afflst; return 1; } } if ((strncmp(line,"AM",2) == 0) && isspace(line[2])) { if (parse_aliasm(line, afflst)) { delete afflst; return 1; } } if (strncmp(line,"COMPLEXPREFIXES",15) == 0) complexprefixes = 1; if (((strncmp(line,"SFX",3) == 0) || (strncmp(line,"PFX",3) == 0)) && isspace(line[3])) break; } if (csconv == NULL) csconv = get_current_cs(SPELL_ENCODING); delete afflst; return 0; } /* parse in the ALIAS table */ int HashMgr::parse_aliasf(char * line, FileMgr * af) { if (numaliasf != 0) { HUNSPELL_WARNING(stderr, "error: duplicate AF (alias for flag vector) tables used\n"); return 1; } char * tp = line; char * piece; int i = 0; int np = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { np++; break; } case 1: { numaliasf = atoi(piece); if (numaliasf < 1) { numaliasf = 0; aliasf = NULL; aliasflen = NULL; HUNSPELL_WARNING(stderr, "incorrect number of entries in AF table\n"); return 1; } aliasf = (unsigned short **) malloc(numaliasf * sizeof(unsigned short *)); aliasflen = (unsigned short *) malloc(numaliasf * sizeof(short)); if (!aliasf || !aliasflen) { numaliasf = 0; if (aliasf) free(aliasf); if (aliasflen) free(aliasflen); aliasf = NULL; aliasflen = NULL; return 1; } np++; break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (np != 2) { numaliasf = 0; free(aliasf); free(aliasflen); aliasf = NULL; aliasflen = NULL; HUNSPELL_WARNING(stderr, "error: missing AF table information\n"); return 1; } /* now parse the numaliasf lines to read in the remainder of the table */ char * nl; for (int j=0; j < numaliasf; j++) { if (!(nl = af->getline())) return 1; mychomp(nl); tp = nl; i = 0; aliasf[j] = NULL; aliasflen[j] = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { if (strncmp(piece,"AF",2) != 0) { numaliasf = 0; free(aliasf); free(aliasflen); aliasf = NULL; aliasflen = NULL; HUNSPELL_WARNING(stderr, "error: AF table is corrupt\n"); return 1; } break; } case 1: { aliasflen[j] = (unsigned short) decode_flags(&(aliasf[j]), piece); flag_qsort(aliasf[j], 0, aliasflen[j]); break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (!aliasf[j]) { free(aliasf); free(aliasflen); aliasf = NULL; aliasflen = NULL; numaliasf = 0; HUNSPELL_WARNING(stderr, "error: AF table is corrupt\n"); return 1; } } return 0; } int HashMgr::is_aliasf() { return (aliasf != NULL); } int HashMgr::get_aliasf(int index, unsigned short ** fvec) { if ((index > 0) && (index <= numaliasf)) { *fvec = aliasf[index - 1]; return aliasflen[index - 1]; } HUNSPELL_WARNING(stderr, "error: bad flag alias index: %d\n", index); *fvec = NULL; return 0; } /* parse morph alias definitions */ int HashMgr::parse_aliasm(char * line, FileMgr * af) { if (numaliasm != 0) { HUNSPELL_WARNING(stderr, "error: duplicate AM (aliases for morphological descriptions) tables used\n"); return 1; } char * tp = line; char * piece; int i = 0; int np = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { np++; break; } case 1: { numaliasm = atoi(piece); if (numaliasm < 1) { HUNSPELL_WARNING(stderr, "incorrect number of entries in AM table\n"); return 1; } aliasm = (char **) malloc(numaliasm * sizeof(char *)); if (!aliasm) { numaliasm = 0; return 1; } np++; break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (np != 2) { numaliasm = 0; free(aliasm); aliasm = NULL; HUNSPELL_WARNING(stderr, "error: missing AM alias information\n"); return 1; } /* now parse the numaliasm lines to read in the remainder of the table */ char * nl = line; for (int j=0; j < numaliasm; j++) { if (!(nl = af->getline())) return 1; mychomp(nl); tp = nl; i = 0; aliasm[j] = NULL; piece = mystrsep(&tp, ' '); while (piece) { if (*piece != '\0') { switch(i) { case 0: { if (strncmp(piece,"AM",2) != 0) { HUNSPELL_WARNING(stderr, "error: AM table is corrupt\n"); numaliasm = 0; free(aliasm); aliasm = NULL; return 1; } break; } case 1: { // add the remaining of the line if (*tp) { *(tp - 1) = ' '; tp = tp + strlen(tp); } if (complexprefixes) { if (utf8) reverseword_utf(piece); else reverseword(piece); } aliasm[j] = mystrdup(piece); if (!aliasm[j]) { numaliasm = 0; free(aliasm); aliasm = NULL; return 1; } break; } default: break; } i++; } piece = mystrsep(&tp, ' '); } if (!aliasm[j]) { numaliasm = 0; free(aliasm); aliasm = NULL; HUNSPELL_WARNING(stderr, "error: map table is corrupt\n"); return 1; } } return 0; } int HashMgr::is_aliasm() { return (aliasm != NULL); } char * HashMgr::get_aliasm(int index) { if ((index > 0) && (index <= numaliasm)) return aliasm[index - 1]; HUNSPELL_WARNING(stderr, "error: bad morph. alias index: %d\n", index); return NULL; } robojournal-0.4.2/ui/hunspell/htypes.hxx0000644000175000017500000000734212211723646017077 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef _HTYPES_HXX_ #define _HTYPES_HXX_ #define ROTATE_LEN 5 #define ROTATE(v,q) \ (v) = ((v) << (q)) | (((v) >> (32 - q)) & ((1 << (q))-1)); // hentry options #define H_OPT (1 << 0) #define H_OPT_ALIASM (1 << 1) #define H_OPT_PHON (1 << 2) // see also csutil.hxx #define HENTRY_WORD(h) &(h->word) // approx. number of user defined words #define USERWORD 1000 struct hentry { unsigned char blen; // word length in bytes unsigned char clen; // word length in characters (different for UTF-8 enc.) short alen; // length of affix flag vector unsigned short * astr; // affix flag vector struct hentry * next; // next word with same hash code struct hentry * next_homonym; // next homonym word (with same hash code) char var; // variable fields (only for special pronounciation yet) char word; // variable-length word (8-bit or UTF-8 encoding) }; #endif robojournal-0.4.2/ui/hunspell/hunspell.cxx0000644000175000017500000017435312211723646017417 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "license.hunspell" #include "license.myspell" #ifndef MOZILLA_CLIENT #include #include #include #else #include #include #include #endif #include "ui/hunspell/hunspell.hxx" #include "ui/hunspell/hunspell.h" //#include "config.h" #include "ui/hunspell/csutil.hxx" #ifndef MOZILLA_CLIENT #ifndef WIN32 using namespace std; #endif #endif Hunspell::Hunspell(const char * affpath, const char * dpath, const char * key) { encoding = NULL; csconv = NULL; utf8 = 0; complexprefixes = 0; affixpath = mystrdup(affpath); maxdic = 0; /* first set up the hash manager */ pHMgr[0] = new HashMgr(dpath, affpath, key); if (pHMgr[0]) maxdic = 1; /* next set up the affix manager */ /* it needs access to the hash manager lookup methods */ pAMgr = new AffixMgr(affpath, pHMgr, &maxdic, key); /* get the preferred try string and the dictionary */ /* encoding from the Affix Manager for that dictionary */ char * try_string = pAMgr->get_try_string(); encoding = pAMgr->get_encoding(); csconv = get_current_cs(encoding); langnum = pAMgr->get_langnum(); utf8 = pAMgr->get_utf8(); complexprefixes = pAMgr->get_complexprefixes(); wordbreak = pAMgr->get_breaktable(); /* and finally set up the suggestion manager */ pSMgr = new SuggestMgr(try_string, MAXSUGGESTION, pAMgr); if (try_string) free(try_string); } Hunspell::~Hunspell() { if (pSMgr) delete pSMgr; if (pAMgr) delete pAMgr; for (int i = 0; i < maxdic; i++) delete pHMgr[i]; maxdic = 0; pSMgr = NULL; pAMgr = NULL; #ifdef MOZILLA_CLIENT free(csconv); #endif csconv= NULL; if (encoding) free(encoding); encoding = NULL; if (affixpath) free(affixpath); affixpath = NULL; } // load extra dictionaries int Hunspell::add_dic(const char * dpath, const char * key) { if (maxdic == MAXDIC || !affixpath) return 1; pHMgr[maxdic] = new HashMgr(dpath, affixpath, key); if (pHMgr[maxdic]) maxdic++; else return 1; return 0; } // make a copy of src at destination while removing all leading // blanks and removing any trailing periods after recording // their presence with the abbreviation flag // also since already going through character by character, // set the capitalization type // return the length of the "cleaned" (and UTF-8 encoded) word int Hunspell::cleanword2(char * dest, const char * src, w_char * dest_utf, int * nc, int * pcaptype, int * pabbrev) { unsigned char * p = (unsigned char *) dest; const unsigned char * q = (const unsigned char * ) src; // first skip over any leading blanks while ((*q != '\0') && (*q == ' ')) q++; // now strip off any trailing periods (recording their presence) *pabbrev = 0; int nl = strlen((const char *)q); while ((nl > 0) && (*(q+nl-1)=='.')) { nl--; (*pabbrev)++; } // if no characters are left it can't be capitalized if (nl <= 0) { *pcaptype = NOCAP; *p = '\0'; return 0; } strncpy(dest, (char *) q, nl); *(dest + nl) = '\0'; nl = strlen(dest); if (utf8) { *nc = u8_u16(dest_utf, MAXWORDLEN, dest); // don't check too long words if (*nc >= MAXWORDLEN) return 0; if (*nc == -1) { // big Unicode character (non BMP area) *pcaptype = NOCAP; return nl; } *pcaptype = get_captype_utf8(dest_utf, *nc, langnum); } else { *pcaptype = get_captype(dest, nl, csconv); *nc = nl; } return nl; } int Hunspell::cleanword(char * dest, const char * src, int * pcaptype, int * pabbrev) { unsigned char * p = (unsigned char *) dest; const unsigned char * q = (const unsigned char * ) src; int firstcap = 0; // first skip over any leading blanks while ((*q != '\0') && (*q == ' ')) q++; // now strip off any trailing periods (recording their presence) *pabbrev = 0; int nl = strlen((const char *)q); while ((nl > 0) && (*(q+nl-1)=='.')) { nl--; (*pabbrev)++; } // if no characters are left it can't be capitalized if (nl <= 0) { *pcaptype = NOCAP; *p = '\0'; return 0; } // now determine the capitalization type of the first nl letters int ncap = 0; int nneutral = 0; int nc = 0; if (!utf8) { while (nl > 0) { nc++; if (csconv[(*q)].ccase) ncap++; if (csconv[(*q)].cupper == csconv[(*q)].clower) nneutral++; *p++ = *q++; nl--; } // remember to terminate the destination string *p = '\0'; firstcap = csconv[(unsigned char)(*dest)].ccase; } else { unsigned short idx; w_char t[MAXWORDLEN]; nc = u8_u16(t, MAXWORDLEN, src); for (int i = 0; i < nc; i++) { idx = (t[i].h << 8) + t[i].l; unsigned short low = unicodetolower(idx, langnum); if (idx != low) ncap++; if (unicodetoupper(idx, langnum) == low) nneutral++; } u16_u8(dest, MAXWORDUTF8LEN, t, nc); if (ncap) { idx = (t[0].h << 8) + t[0].l; firstcap = (idx != unicodetolower(idx, langnum)); } } // now finally set the captype if (ncap == 0) { *pcaptype = NOCAP; } else if ((ncap == 1) && firstcap) { *pcaptype = INITCAP; } else if ((ncap == nc) || ((ncap + nneutral) == nc)){ *pcaptype = ALLCAP; } else if ((ncap > 1) && firstcap) { *pcaptype = HUHINITCAP; } else { *pcaptype = HUHCAP; } return strlen(dest); } void Hunspell::mkallcap(char * p) { if (utf8) { w_char u[MAXWORDLEN]; int nc = u8_u16(u, MAXWORDLEN, p); unsigned short idx; for (int i = 0; i < nc; i++) { idx = (u[i].h << 8) + u[i].l; if (idx != unicodetoupper(idx, langnum)) { u[i].h = (unsigned char) (unicodetoupper(idx, langnum) >> 8); u[i].l = (unsigned char) (unicodetoupper(idx, langnum) & 0x00FF); } } u16_u8(p, MAXWORDUTF8LEN, u, nc); } else { while (*p != '\0') { *p = csconv[((unsigned char) *p)].cupper; p++; } } } int Hunspell::mkallcap2(char * p, w_char * u, int nc) { if (utf8) { unsigned short idx; for (int i = 0; i < nc; i++) { idx = (u[i].h << 8) + u[i].l; unsigned short up = unicodetoupper(idx, langnum); if (idx != up) { u[i].h = (unsigned char) (up >> 8); u[i].l = (unsigned char) (up & 0x00FF); } } u16_u8(p, MAXWORDUTF8LEN, u, nc); return strlen(p); } else { while (*p != '\0') { *p = csconv[((unsigned char) *p)].cupper; p++; } } return nc; } void Hunspell::mkallsmall(char * p) { while (*p != '\0') { *p = csconv[((unsigned char) *p)].clower; p++; } } int Hunspell::mkallsmall2(char * p, w_char * u, int nc) { if (utf8) { unsigned short idx; for (int i = 0; i < nc; i++) { idx = (u[i].h << 8) + u[i].l; unsigned short low = unicodetolower(idx, langnum); if (idx != low) { u[i].h = (unsigned char) (low >> 8); u[i].l = (unsigned char) (low & 0x00FF); } } u16_u8(p, MAXWORDUTF8LEN, u, nc); return strlen(p); } else { while (*p != '\0') { *p = csconv[((unsigned char) *p)].clower; p++; } } return nc; } // convert UTF-8 sharp S codes to latin 1 char * Hunspell::sharps_u8_l1(char * dest, char * source) { char * p = dest; *p = *source; for (p++, source++; *(source - 1); p++, source++) { *p = *source; if (*source == '\x9F') *--p = '\xDF'; } return dest; } // recursive search for right ss - sharp s permutations hentry * Hunspell::spellsharps(char * base, char * pos, int n, int repnum, char * tmp, int * info, char **root) { pos = strstr(pos, "ss"); if (pos && (n < MAXSHARPS)) { *pos = '\xC3'; *(pos + 1) = '\x9F'; hentry * h = spellsharps(base, pos + 2, n + 1, repnum + 1, tmp, info, root); if (h) return h; *pos = 's'; *(pos + 1) = 's'; h = spellsharps(base, pos + 2, n + 1, repnum, tmp, info, root); if (h) return h; } else if (repnum > 0) { if (utf8) return checkword(base, info, root); return checkword(sharps_u8_l1(tmp, base), info, root); } return NULL; } int Hunspell::is_keepcase(const hentry * rv) { return pAMgr && rv->astr && pAMgr->get_keepcase() && TESTAFF(rv->astr, pAMgr->get_keepcase(), rv->alen); } /* insert a word to beginning of the suggestion array and return ns */ int Hunspell::insert_sug(char ***slst, char * word, int ns) { char * dup = mystrdup(word); if (!dup) return ns; if (ns == MAXSUGGESTION) { ns--; free((*slst)[ns]); } for (int k = ns; k > 0; k--) (*slst)[k] = (*slst)[k - 1]; (*slst)[0] = dup; return ns + 1; } int Hunspell::spell(const char * word, int * info, char ** root) { struct hentry * rv=NULL; // need larger vector. For example, Turkish capital letter I converted a // 2-byte UTF-8 character (dotless i) by mkallsmall. char cw[MAXWORDUTF8LEN]; char wspace[MAXWORDUTF8LEN]; w_char unicw[MAXWORDLEN]; // Hunspell supports XML input of the simplified API (see manual) if (strcmp(word, SPELL_XML) == 0) return 1; int nc = strlen(word); int wl2 = 0; if (utf8) { if (nc >= MAXWORDUTF8LEN) return 0; } else { if (nc >= MAXWORDLEN) return 0; } int captype = 0; int abbv = 0; int wl = cleanword2(cw, word, unicw, &nc, &captype, &abbv); int info2 = 0; if (wl == 0 || maxdic == 0) return 1; if (root) *root = NULL; // allow numbers with dots and commas (but forbid double separators: "..", ",," etc.) enum { NBEGIN, NNUM, NSEP }; int nstate = NBEGIN; int i; for (i = 0; (i < wl); i++) { if ((cw[i] <= '9') && (cw[i] >= '0')) { nstate = NNUM; } else if ((cw[i] == ',') || (cw[i] == '.') || (cw[i] == '-')) { if ((nstate == NSEP) || (i == 0)) break; nstate = NSEP; } else break; } if ((i == wl) && (nstate == NNUM)) return 1; if (!info) info = &info2; else *info = 0; // LANG_hu section: number(s) + (percent or degree) with suffixes if (langnum == LANG_hu) { if ((nstate == NNUM) && ((cw[i] == '%') || ((!utf8 && (cw[i] == '\xB0')) || (utf8 && (strncmp(cw + i, "\xC2\xB0", 2)==0 || // UTF-8 degree strncmp(cw + i, "\xE2\x80\xB0", 3)==0)))) // UTF-8 per mille && checkword(cw + i, info, root)) return 1; } // END of LANG_hu section switch(captype) { case HUHCAP: case HUHINITCAP: case NOCAP: { rv = checkword(cw, info, root); if ((abbv) && !(rv)) { memcpy(wspace,cw,wl); *(wspace+wl) = '.'; *(wspace+wl+1) = '\0'; rv = checkword(wspace, info, root); } break; } case ALLCAP: { rv = checkword(cw, info, root); if (rv) break; if (abbv) { memcpy(wspace,cw,wl); *(wspace+wl) = '.'; *(wspace+wl+1) = '\0'; rv = checkword(wspace, info, root); if (rv) break; } // Spec. prefix handling for Catalan, French, Italian: // prefixes separated by apostrophe (SANT'ELIA -> Sant'+Elia). if (pAMgr && strchr(cw, '\'')) { wl = mkallsmall2(cw, unicw, nc); char * apostrophe = strchr(cw, '\''); if (utf8) { w_char tmpword[MAXWORDLEN]; *apostrophe = '\0'; wl2 = u8_u16(tmpword, MAXWORDLEN, cw); *apostrophe = '\''; if (wl2 < nc) { mkinitcap2(apostrophe + 1, unicw + wl2 + 1, nc - wl2 - 1); rv = checkword(cw, info, root); if (rv) break; } } else { mkinitcap2(apostrophe + 1, unicw, nc); rv = checkword(cw, info, root); if (rv) break; } mkinitcap2(cw, unicw, nc); rv = checkword(cw, info, root); if (rv) break; } if (pAMgr && pAMgr->get_checksharps() && strstr(cw, "SS")) { char tmpword[MAXWORDUTF8LEN]; wl = mkallsmall2(cw, unicw, nc); memcpy(wspace,cw,(wl+1)); rv = spellsharps(wspace, wspace, 0, 0, tmpword, info, root); if (!rv) { wl2 = mkinitcap2(cw, unicw, nc); rv = spellsharps(cw, cw, 0, 0, tmpword, info, root); } if ((abbv) && !(rv)) { *(wspace+wl) = '.'; *(wspace+wl+1) = '\0'; rv = spellsharps(wspace, wspace, 0, 0, tmpword, info, root); if (!rv) { memcpy(wspace, cw, wl2); *(wspace+wl2) = '.'; *(wspace+wl2+1) = '\0'; rv = spellsharps(wspace, wspace, 0, 0, tmpword, info, root); } } if (rv) break; } } case INITCAP: { wl = mkallsmall2(cw, unicw, nc); memcpy(wspace,cw,(wl+1)); wl2 = mkinitcap2(cw, unicw, nc); if (captype == INITCAP) *info += SPELL_INITCAP; rv = checkword(cw, info, root); if (captype == INITCAP) *info -= SPELL_INITCAP; // forbid bad capitalization // (for example, ijs -> Ijs instead of IJs in Dutch) // use explicit forms in dic: Ijs/F (F = FORBIDDENWORD flag) if (*info & SPELL_FORBIDDEN) { rv = NULL; break; } if (rv && is_keepcase(rv) && (captype == ALLCAP)) rv = NULL; if (rv) break; rv = checkword(wspace, info, root); if (abbv && !rv) { *(wspace+wl) = '.'; *(wspace+wl+1) = '\0'; rv = checkword(wspace, info, root); if (!rv) { memcpy(wspace, cw, wl2); *(wspace+wl2) = '.'; *(wspace+wl2+1) = '\0'; if (captype == INITCAP) *info += SPELL_INITCAP; rv = checkword(wspace, info, root); if (captype == INITCAP) *info -= SPELL_INITCAP; if (rv && is_keepcase(rv) && (captype == ALLCAP)) rv = NULL; break; } } if (rv && is_keepcase(rv) && ((captype == ALLCAP) || // if CHECKSHARPS: KEEPCASE words with \xDF are allowed // in INITCAP form, too. !(pAMgr->get_checksharps() && ((utf8 && strstr(wspace, "\xC3\x9F")) || (!utf8 && strchr(wspace, '\xDF')))))) rv = NULL; break; } } if (rv) return 1; // recursive breaking at break points (not good for morphological analysis) if (wordbreak) { char * s; char r; int corr = 0; // German words beginning with "-" are not accepted if (langnum == LANG_de) corr = 1; int numbreak = pAMgr ? pAMgr->get_numbreak() : 0; for (int j = 0; j < numbreak; j++) { s=(char *) strstr(cw + corr, wordbreak[j]); if (s) { r = *s; *s = '\0'; // examine 2 sides of the break point if (spell(cw) && spell(s + strlen(wordbreak[j]))) { *s = r; return 1; } *s = r; } } } // LANG_hu: compoundings with dashes and n-dashes XXX deprecated! if (langnum == LANG_hu) { int n; // compound word with dash (HU) I18n char * dash; int result = 0; // n-dash dash = (char *) strstr(cw,"\xE2\x80\x93"); if (dash && !wordbreak) { *dash = '\0'; // examine 2 sides of the dash if (spell(cw) && spell(dash + 3)) { *dash = '\xE2'; return 1; } *dash = '\xE2'; } dash = (char *) strchr(cw,'-'); if (dash) { *dash='\0'; // examine 2 sides of the dash if (dash[1] == '\0') { // base word ending with dash if (spell(cw)) return 1; } else { // first word ending with dash: word- char r2 = *(dash + 1); dash[0]='-'; dash[1]='\0'; result = spell(cw); dash[1] = r2; dash[0]='\0'; if (result && spell(dash+1) && ((strlen(dash+1) > 1) || (dash[1] == 'e') || ((dash[1] > '0') && (dash[1] < '9')))) return 1; } // affixed number in correct word if (result && (dash > cw) && (((*(dash-1)<='9') && (*(dash-1)>='0')) || (*(dash-1)>='.'))) { *dash='-'; n = 1; if (*(dash - n) == '.') n++; // search first not a number character to left from dash while (((dash - n)>=cw) && ((*(dash - n)=='0') || (n < 3)) && (n < 6)) { n++; } if ((dash - n) < cw) n--; // numbers: deprecated for(; n >= 1; n--) { if ((*(dash - n) >= '0') && (*(dash - n) <= '9') && checkword(dash - n, info, root)) return 1; } } } } return 0; } struct hentry * Hunspell::checkword(const char * w, int * info, char ** root) { struct hentry * he = NULL; int len, i; char w2[MAXWORDUTF8LEN]; const char * word; char * ignoredchars = pAMgr->get_ignore(); if (ignoredchars != NULL) { strcpy(w2, w); if (utf8) { int ignoredchars_utf16_len; unsigned short * ignoredchars_utf16 = pAMgr->get_ignore_utf16(&ignoredchars_utf16_len); remove_ignored_chars_utf(w2, ignoredchars_utf16, ignoredchars_utf16_len); } else { remove_ignored_chars(w2,ignoredchars); } word = w2; } else word = w; // word reversing wrapper for complex prefixes if (complexprefixes) { if (word != w2) { strcpy(w2, word); word = w2; } if (utf8) reverseword_utf(w2); else reverseword(w2); } // look word in hash table for (i = 0; (i < maxdic) && !he; i ++) { he = (pHMgr[i])->lookup(word); // check forbidden and onlyincompound words if ((he) && (he->astr) && (pAMgr) && TESTAFF(he->astr, pAMgr->get_forbiddenword(), he->alen)) { if (info) *info += SPELL_FORBIDDEN; // LANG_hu section: set dash information for suggestions if (langnum == LANG_hu) { if (pAMgr->get_compoundflag() && TESTAFF(he->astr, pAMgr->get_compoundflag(), he->alen)) { if (info) *info += SPELL_COMPOUND; } } return NULL; } // he = next not needaffix, onlyincompound homonym or onlyupcase word while (he && (he->astr) && ((pAMgr->get_needaffix() && TESTAFF(he->astr, pAMgr->get_needaffix(), he->alen)) || (pAMgr->get_onlyincompound() && TESTAFF(he->astr, pAMgr->get_onlyincompound(), he->alen)) || (info && (*info & SPELL_INITCAP) && TESTAFF(he->astr, ONLYUPCASEFLAG, he->alen)) )) he = he->next_homonym; } // check with affixes if (!he && pAMgr) { // try stripping off affixes */ len = strlen(word); he = pAMgr->affix_check(word, len, 0); // check compound restriction and onlyupcase if (he && he->astr && ( (pAMgr->get_onlyincompound() && TESTAFF(he->astr, pAMgr->get_onlyincompound(), he->alen)) || (info && (*info & SPELL_INITCAP) && TESTAFF(he->astr, ONLYUPCASEFLAG, he->alen)))) { he = NULL; } if (he) { if ((he->astr) && (pAMgr) && TESTAFF(he->astr, pAMgr->get_forbiddenword(), he->alen)) { if (info) *info += SPELL_FORBIDDEN; return NULL; } if (root) { *root = mystrdup(&(he->word)); if (*root && complexprefixes) { if (utf8) reverseword_utf(*root); else reverseword(*root); } } // try check compound word } else if (pAMgr->get_compound()) { he = pAMgr->compound_check(word, len, 0,0,100,0,NULL,0,NULL,NULL,0); // LANG_hu section: `moving rule' with last dash if ((!he) && (langnum == LANG_hu) && (word[len-1]=='-')) { char * dup = mystrdup(word); if (!dup) return NULL; dup[len-1] = '\0'; he = pAMgr->compound_check(dup, len-1, -5,0,100,0,NULL,1,NULL,NULL,0); free(dup); } // end of LANG speficic region if (he) { if (root) { *root = mystrdup(&(he->word)); if (*root && complexprefixes) { if (utf8) reverseword_utf(*root); else reverseword(*root); } } if (info) *info += SPELL_COMPOUND; } } } return he; } int Hunspell::suggest(char*** slst, const char * word) { int onlycmpdsug = 0; char cw[MAXWORDUTF8LEN]; char wspace[MAXWORDUTF8LEN]; if (!pSMgr || maxdic == 0) return 0; w_char unicw[MAXWORDLEN]; *slst = NULL; // process XML input of the simplified API (see manual) if (strncmp(word, SPELL_XML, sizeof(SPELL_XML) - 3) == 0) { return spellml(slst, word); } int nc = strlen(word); if (utf8) { if (nc >= MAXWORDUTF8LEN) return 0; } else { if (nc >= MAXWORDLEN) return 0; } int captype = 0; int abbv = 0; int wl = cleanword2(cw, word, unicw, &nc, &captype, &abbv); if (wl == 0) return 0; int ns = 0; int capwords = 0; switch(captype) { case NOCAP: { ns = pSMgr->suggest(slst, cw, ns, &onlycmpdsug); break; } case INITCAP: { capwords = 1; ns = pSMgr->suggest(slst, cw, ns, &onlycmpdsug); if (ns == -1) break; memcpy(wspace,cw,(wl+1)); mkallsmall2(wspace, unicw, nc); ns = pSMgr->suggest(slst, wspace, ns, &onlycmpdsug); break; } case HUHINITCAP: capwords = 1; case HUHCAP: { ns = pSMgr->suggest(slst, cw, ns, &onlycmpdsug); if (ns != -1) { int prevns; // something.The -> something. The char * dot = strchr(cw, '.'); if (dot && (dot > cw)) { int captype_; if (utf8) { w_char w_[MAXWORDLEN]; int wl_ = u8_u16(w_, MAXWORDLEN, dot + 1); captype_ = get_captype_utf8(w_, wl_, langnum); } else captype_ = get_captype(dot+1, strlen(dot+1), csconv); if (captype_ == INITCAP) { char * st = mystrdup(cw); if (st) st = (char *) realloc(st, wl + 2); if (st) { st[(dot - cw) + 1] = ' '; strcpy(st + (dot - cw) + 2, dot + 1); ns = insert_sug(slst, st, ns); free(st); } } } if (captype == HUHINITCAP) { // TheOpenOffice.org -> The OpenOffice.org memcpy(wspace,cw,(wl+1)); mkinitsmall2(wspace, unicw, nc); ns = pSMgr->suggest(slst, wspace, ns, &onlycmpdsug); } memcpy(wspace,cw,(wl+1)); mkallsmall2(wspace, unicw, nc); if (spell(wspace)) ns = insert_sug(slst, wspace, ns); prevns = ns; ns = pSMgr->suggest(slst, wspace, ns, &onlycmpdsug); if (captype == HUHINITCAP) { mkinitcap2(wspace, unicw, nc); if (spell(wspace)) ns = insert_sug(slst, wspace, ns); ns = pSMgr->suggest(slst, wspace, ns, &onlycmpdsug); } // aNew -> "a New" (instead of "a new") for (int j = prevns; j < ns; j++) { char * space = strchr((*slst)[j],' '); if (space) { int slen = strlen(space + 1); // different case after space (need capitalisation) if ((slen < wl) && strcmp(cw + wl - slen, space + 1)) { w_char w[MAXWORDLEN]; int wc = 0; char * r = (*slst)[j]; if (utf8) wc = u8_u16(w, MAXWORDLEN, space + 1); mkinitcap2(space + 1, w, wc); // set as first suggestion for (int k = j; k > 0; k--) (*slst)[k] = (*slst)[k - 1]; (*slst)[0] = r; } } } } break; } case ALLCAP: { memcpy(wspace, cw, (wl+1)); mkallsmall2(wspace, unicw, nc); ns = pSMgr->suggest(slst, wspace, ns, &onlycmpdsug); if (ns == -1) break; if (pAMgr && pAMgr->get_keepcase() && spell(wspace)) ns = insert_sug(slst, wspace, ns); mkinitcap2(wspace, unicw, nc); ns = pSMgr->suggest(slst, wspace, ns, &onlycmpdsug); for (int j=0; j < ns; j++) { mkallcap((*slst)[j]); if (pAMgr && pAMgr->get_checksharps()) { char * pos; if (utf8) { pos = strstr((*slst)[j], "\xC3\x9F"); while (pos) { *pos = 'S'; *(pos+1) = 'S'; pos = strstr(pos+2, "\xC3\x9F"); } } else { pos = strchr((*slst)[j], '\xDF'); while (pos) { (*slst)[j] = (char *) realloc((*slst)[j], strlen((*slst)[j]) + 2); mystrrep((*slst)[j], "\xDF", "SS"); pos = strchr((*slst)[j], '\xDF'); } } } } break; } } // LANG_hu section: replace '-' with ' ' in Hungarian if (langnum == LANG_hu) { for (int j=0; j < ns; j++) { char * pos = strchr((*slst)[j],'-'); if (pos) { int info; char w[MAXWORDUTF8LEN]; *pos = '\0'; strcpy(w, (*slst)[j]); strcat(w, pos + 1); spell(w, &info, NULL); if ((info & SPELL_COMPOUND) && (info & SPELL_FORBIDDEN)) { *pos = ' '; } else *pos = '-'; } } } // END OF LANG_hu section // try ngram approach since found nothing if ((ns == 0 || onlycmpdsug) && pAMgr && (pAMgr->get_maxngramsugs() != 0)) { switch(captype) { case NOCAP: { ns = pSMgr->ngsuggest(*slst, cw, ns, pHMgr, maxdic); break; } case HUHCAP: { memcpy(wspace,cw,(wl+1)); mkallsmall2(wspace, unicw, nc); ns = pSMgr->ngsuggest(*slst, wspace, ns, pHMgr, maxdic); break; } case INITCAP: { capwords = 1; memcpy(wspace,cw,(wl+1)); mkallsmall2(wspace, unicw, nc); ns = pSMgr->ngsuggest(*slst, wspace, ns, pHMgr, maxdic); break; } case ALLCAP: { memcpy(wspace,cw,(wl+1)); mkallsmall2(wspace, unicw, nc); int oldns = ns; ns = pSMgr->ngsuggest(*slst, wspace, ns, pHMgr, maxdic); for (int j = oldns; j < ns; j++) mkallcap((*slst)[j]); break; } } } // word reversing wrapper for complex prefixes if (complexprefixes) { for (int j = 0; j < ns; j++) { if (utf8) reverseword_utf((*slst)[j]); else reverseword((*slst)[j]); } } // capitalize if (capwords) for (int j=0; j < ns; j++) { mkinitcap((*slst)[j]); } // expand suggestions with dot(s) if (abbv && pAMgr && pAMgr->get_sugswithdots()) { for (int j = 0; j < ns; j++) { (*slst)[j] = (char *) realloc((*slst)[j], strlen((*slst)[j]) + 1 + abbv); strcat((*slst)[j], word + strlen(word) - abbv); } } // remove bad capitalized and forbidden forms if (pAMgr && (pAMgr->get_keepcase() || pAMgr->get_forbiddenword())) { switch (captype) { case INITCAP: case ALLCAP: { int l = 0; for (int j=0; j < ns; j++) { if (!strchr((*slst)[j],' ') && !spell((*slst)[j])) { char s[MAXSWUTF8L]; w_char w[MAXSWL]; int len; if (utf8) { len = u8_u16(w, MAXSWL, (*slst)[j]); } else { strcpy(s, (*slst)[j]); len = strlen(s); } mkallsmall2(s, w, len); free((*slst)[j]); if (spell(s)) { (*slst)[l] = mystrdup(s); if ((*slst)[l]) l++; } else { mkinitcap2(s, w, len); if (spell(s)) { (*slst)[l] = mystrdup(s); if ((*slst)[l]) l++; } } } else { (*slst)[l] = (*slst)[j]; l++; } } ns = l; } } } // remove duplications int l = 0; for (int j = 0; j < ns; j++) { (*slst)[l] = (*slst)[j]; for (int k = 0; k < l; k++) { if (strcmp((*slst)[k], (*slst)[j]) == 0) { free((*slst)[j]); l--; } } l++; } // if suggestions removed by nosuggest, onlyincompound parameters if (l == 0 && *slst) { free(*slst); *slst = NULL; } return l; } void Hunspell::free_list(char *** slst, int n) { freelist(slst, n); } char * Hunspell::get_dic_encoding() { return encoding; } #ifdef HUNSPELL_EXPERIMENTAL // XXX need UTF-8 support int Hunspell::suggest_auto(char*** slst, const char * word) { char cw[MAXWORDUTF8LEN]; char wspace[MAXWORDUTF8LEN]; if (!pSMgr || maxdic == 0) return 0; int wl = strlen(word); if (utf8) { if (wl >= MAXWORDUTF8LEN) return 0; } else { if (wl >= MAXWORDLEN) return 0; } int captype = 0; int abbv = 0; wl = cleanword(cw, word, &captype, &abbv); if (wl == 0) return 0; int ns = 0; *slst = NULL; // HU, nsug in pSMgr->suggest switch(captype) { case NOCAP: { ns = pSMgr->suggest_auto(slst, cw, ns); if (ns>0) break; break; } case INITCAP: { memcpy(wspace,cw,(wl+1)); mkallsmall(wspace); ns = pSMgr->suggest_auto(slst, wspace, ns); for (int j=0; j < ns; j++) mkinitcap((*slst)[j]); ns = pSMgr->suggest_auto(slst, cw, ns); break; } case HUHCAP: { ns = pSMgr->suggest_auto(slst, cw, ns); if (ns == 0) { memcpy(wspace,cw,(wl+1)); mkallsmall(wspace); ns = pSMgr->suggest_auto(slst, wspace, ns); } break; } case ALLCAP: { memcpy(wspace,cw,(wl+1)); mkallsmall(wspace); ns = pSMgr->suggest_auto(slst, wspace, ns); mkinitcap(wspace); ns = pSMgr->suggest_auto(slst, wspace, ns); for (int j=0; j < ns; j++) mkallcap((*slst)[j]); break; } } // word reversing wrapper for complex prefixes if (complexprefixes) { for (int j = 0; j < ns; j++) { if (utf8) reverseword_utf((*slst)[j]); else reverseword((*slst)[j]); } } // expand suggestions with dot(s) if (abbv && pAMgr && pAMgr->get_sugswithdots()) { for (int j = 0; j < ns; j++) { (*slst)[j] = (char *) realloc((*slst)[j], strlen((*slst)[j]) + 1 + abbv); strcat((*slst)[j], word + strlen(word) - abbv); } } // LANG_hu section: replace '-' with ' ' in Hungarian if (langnum == LANG_hu) { for (int j=0; j < ns; j++) { char * pos = strchr((*slst)[j],'-'); if (pos) { int info; char w[MAXWORDUTF8LEN]; *pos = '\0'; strcpy(w, (*slst)[j]); strcat(w, pos + 1); spell(w, &info, NULL); if ((info & SPELL_COMPOUND) && (info & SPELL_FORBIDDEN)) { *pos = ' '; } else *pos = '-'; } } } // END OF LANG_hu section return ns; } #endif int Hunspell::stem(char*** slst, char ** desc, int n) { char result[MAXLNLEN]; char result2[MAXLNLEN]; *slst = NULL; if (n == 0) return 0; *result2 = '\0'; for (int i = 0; i < n; i++) { *result = '\0'; // add compound word parts (except the last one) char * s = (char *) desc[i]; char * part = strstr(s, MORPH_PART); if (part) { char * nextpart = strstr(part + 1, MORPH_PART); while (nextpart) { copy_field(result + strlen(result), part, MORPH_PART); part = nextpart; nextpart = strstr(part + 1, MORPH_PART); } s = part; } char **pl; char tok[MAXLNLEN]; strcpy(tok, s); char * alt = strstr(tok, " | "); while (alt) { alt[1] = MSEP_ALT; alt = strstr(alt, " | "); } int pln = line_tok(tok, &pl, MSEP_ALT); for (int k = 0; k < pln; k++) { // add derivational suffixes if (strstr(pl[k], MORPH_DERI_SFX)) { // remove inflectional suffixes char * is = strstr(pl[k], MORPH_INFL_SFX); if (is) *is = '\0'; char * sg = pSMgr->suggest_gen(&(pl[k]), 1, pl[k]); if (sg) { char ** gen; int genl = line_tok(sg, &gen, MSEP_REC); free(sg); for (int j = 0; j < genl; j++) { sprintf(result2 + strlen(result2), "%c%s%s", MSEP_REC, result, gen[j]); } freelist(&gen, genl); } } else { sprintf(result2 + strlen(result2), "%c%s", MSEP_REC, result); if (strstr(pl[k], MORPH_SURF_PFX)) { copy_field(result2 + strlen(result2), pl[k], MORPH_SURF_PFX); } copy_field(result2 + strlen(result2), pl[k], MORPH_STEM); } } freelist(&pl, pln); } int sln = line_tok(result2, slst, MSEP_REC); return uniqlist(*slst, sln); } int Hunspell::stem(char*** slst, const char * word) { char ** pl; int pln = analyze(&pl, word); int pln2 = stem(slst, pl, pln); freelist(&pl, pln); return pln2; } #ifdef HUNSPELL_EXPERIMENTAL int Hunspell::suggest_pos_stems(char*** slst, const char * word) { char cw[MAXWORDUTF8LEN]; char wspace[MAXWORDUTF8LEN]; if (! pSMgr || maxdic == 0) return 0; int wl = strlen(word); if (utf8) { if (wl >= MAXWORDUTF8LEN) return 0; } else { if (wl >= MAXWORDLEN) return 0; } int captype = 0; int abbv = 0; wl = cleanword(cw, word, &captype, &abbv); if (wl == 0) return 0; int ns = 0; // ns=0 = normalized input *slst = NULL; // HU, nsug in pSMgr->suggest switch(captype) { case HUHCAP: case NOCAP: { ns = pSMgr->suggest_pos_stems(slst, cw, ns); if ((abbv) && (ns == 0)) { memcpy(wspace,cw,wl); *(wspace+wl) = '.'; *(wspace+wl+1) = '\0'; ns = pSMgr->suggest_pos_stems(slst, wspace, ns); } break; } case INITCAP: { ns = pSMgr->suggest_pos_stems(slst, cw, ns); if (ns == 0 || ((*slst)[0][0] == '#')) { memcpy(wspace,cw,(wl+1)); mkallsmall(wspace); ns = pSMgr->suggest_pos_stems(slst, wspace, ns); } break; } case ALLCAP: { ns = pSMgr->suggest_pos_stems(slst, cw, ns); if (ns != 0) break; memcpy(wspace,cw,(wl+1)); mkallsmall(wspace); ns = pSMgr->suggest_pos_stems(slst, wspace, ns); if (ns == 0) { mkinitcap(wspace); ns = pSMgr->suggest_pos_stems(slst, wspace, ns); } break; } } return ns; } #endif // END OF HUNSPELL_EXPERIMENTAL CODE const char * Hunspell::get_wordchars() { return pAMgr->get_wordchars(); } unsigned short * Hunspell::get_wordchars_utf16(int * len) { return pAMgr->get_wordchars_utf16(len); } void Hunspell::mkinitcap(char * p) { if (!utf8) { if (*p != '\0') *p = csconv[((unsigned char)*p)].cupper; } else { int len; w_char u[MAXWORDLEN]; len = u8_u16(u, MAXWORDLEN, p); unsigned short i = unicodetoupper((u[0].h << 8) + u[0].l, langnum); u[0].h = (unsigned char) (i >> 8); u[0].l = (unsigned char) (i & 0x00FF); u16_u8(p, MAXWORDUTF8LEN, u, len); } } int Hunspell::mkinitcap2(char * p, w_char * u, int nc) { if (!utf8) { if (*p != '\0') *p = csconv[((unsigned char)*p)].cupper; } else if (nc > 0) { unsigned short i = unicodetoupper((u[0].h << 8) + u[0].l, langnum); u[0].h = (unsigned char) (i >> 8); u[0].l = (unsigned char) (i & 0x00FF); u16_u8(p, MAXWORDUTF8LEN, u, nc); return strlen(p); } return nc; } int Hunspell::mkinitsmall2(char * p, w_char * u, int nc) { if (!utf8) { if (*p != '\0') *p = csconv[((unsigned char)*p)].clower; } else if (nc > 0) { unsigned short i = unicodetolower((u[0].h << 8) + u[0].l, langnum); u[0].h = (unsigned char) (i >> 8); u[0].l = (unsigned char) (i & 0x00FF); u16_u8(p, MAXWORDUTF8LEN, u, nc); return strlen(p); } return nc; } int Hunspell::add(const char * word) { if (pHMgr[0]) return (pHMgr[0])->add(word, NULL); return 0; } int Hunspell::add_with_affix(const char * word, const char * example) { if (pHMgr[0]) return (pHMgr[0])->add_with_affix(word, example); return 0; } int Hunspell::remove(const char * word) { if (pHMgr[0]) return (pHMgr[0])->remove(word); return 0; } const char * Hunspell::get_version() { return pAMgr->get_version(); } struct cs_info * Hunspell::get_csconv() { return csconv; } void Hunspell::cat_result(char * result, char * st) { if (st) { if (*result) strcat(result, "\n"); strcat(result, st); free(st); } } int Hunspell::analyze(char*** slst, const char * word) { char cw[MAXWORDUTF8LEN]; char wspace[MAXWORDUTF8LEN]; *slst = NULL; if (! pSMgr || maxdic == 0) return 0; int wl = strlen(word); if (utf8) { if (wl >= MAXWORDUTF8LEN) return 0; } else { if (wl >= MAXWORDLEN) return 0; } int captype = 0; int abbv = 0; wl = cleanword(cw, word, &captype, &abbv); if (wl == 0) { if (abbv) { for (wl = 0; wl < abbv; wl++) cw[wl] = '.'; cw[wl] = '\0'; abbv = 0; } else return 0; } char result[MAXLNLEN]; char * st = NULL; *result = '\0'; int n = 0; int n2 = 0; int n3 = 0; // test numbers // LANG_hu section: set dash information for suggestions if (langnum == LANG_hu) { while ((n < wl) && (((cw[n] <= '9') && (cw[n] >= '0')) || (((cw[n] == '.') || (cw[n] == ',')) && (n > 0)))) { n++; if ((cw[n] == '.') || (cw[n] == ',')) { if (((n2 == 0) && (n > 3)) || ((n2 > 0) && ((cw[n-1] == '.') || (cw[n-1] == ',')))) break; n2++; n3 = n; } } if ((n == wl) && (n3 > 0) && (n - n3 > 3)) return 0; if ((n == wl) || ((n>0) && ((cw[n]=='%') || (cw[n]=='\xB0')) && checkword(cw+n, NULL, NULL))) { strcat(result, cw); result[n - 1] = '\0'; if (n == wl) cat_result(result, pSMgr->suggest_morph(cw + n - 1)); else { char sign = cw[n]; cw[n] = '\0'; cat_result(result, pSMgr->suggest_morph(cw + n - 1)); strcat(result, "+"); // XXX SPEC. MORPHCODE cw[n] = sign; cat_result(result, pSMgr->suggest_morph(cw + n)); } return line_tok(result, slst, MSEP_REC); } } // END OF LANG_hu section switch(captype) { case NOCAP: { cat_result(result, pSMgr->suggest_morph(cw)); if (abbv) { memcpy(wspace,cw,wl); *(wspace+wl) = '.'; *(wspace+wl+1) = '\0'; cat_result(result, pSMgr->suggest_morph(wspace)); } break; } case INITCAP: { memcpy(wspace,cw,(wl+1)); mkallsmall(wspace); cat_result(result, pSMgr->suggest_morph(wspace)); cat_result(result, pSMgr->suggest_morph(cw)); if (abbv) { memcpy(wspace,cw,wl); *(wspace+wl) = '.'; *(wspace+wl+1) = '\0'; mkallsmall(wspace); cat_result(result, pSMgr->suggest_morph(wspace)); mkinitcap(wspace); cat_result(result, pSMgr->suggest_morph(wspace)); } break; } case HUHCAP: { cat_result(result, pSMgr->suggest_morph(cw)); #if 0 memcpy(wspace,cw,(wl+1)); mkallsmall(wspace); cat_result(result, pSMgr->suggest_morph(wspace)); #endif break; } case ALLCAP: { memcpy(wspace,cw,(wl+1)); cat_result(result, pSMgr->suggest_morph(wspace)); mkallsmall(wspace); cat_result(result, pSMgr->suggest_morph(wspace)); mkinitcap(wspace); cat_result(result, pSMgr->suggest_morph(wspace)); if (abbv) { memcpy(wspace,cw,(wl+1)); *(wspace+wl) = '.'; *(wspace+wl+1) = '\0'; cat_result(result, pSMgr->suggest_morph(wspace)); mkallsmall(wspace); cat_result(result, pSMgr->suggest_morph(wspace)); mkinitcap(wspace); cat_result(result, pSMgr->suggest_morph(wspace)); } break; } } if (*result) { // word reversing wrapper for complex prefixes if (complexprefixes) { if (utf8) reverseword_utf(result); else reverseword(result); } return line_tok(result, slst, MSEP_REC); } // compound word with dash (HU) I18n char * dash = NULL; int nresult = 0; // LANG_hu section: set dash information for suggestions if (langnum == LANG_hu) dash = (char *) strchr(cw,'-'); if ((langnum == LANG_hu) && dash) { *dash='\0'; // examine 2 sides of the dash if (dash[1] == '\0') { // base word ending with dash if (spell(cw)) return line_tok(pSMgr->suggest_morph(cw), slst, MSEP_REC); } else if ((dash[1] == 'e') && (dash[2] == '\0')) { // XXX (HU) -e hat. if (spell(cw) && (spell("-e"))) { st = pSMgr->suggest_morph(cw); if (st) { strcat(result, st); free(st); } strcat(result,"+"); // XXX spec. separator in MORPHCODE st = pSMgr->suggest_morph("-e"); if (st) { strcat(result, st); free(st); } return line_tok(result, slst, MSEP_REC); } } else { // first word ending with dash: word- XXX ??? char r2 = *(dash + 1); dash[0]='-'; dash[1]='\0'; nresult = spell(cw); dash[1] = r2; dash[0]='\0'; if (nresult && spell(dash+1) && ((strlen(dash+1) > 1) || ((dash[1] > '0') && (dash[1] < '9')))) { st = pSMgr->suggest_morph(cw); if (st) { strcat(result, st); free(st); strcat(result,"+"); // XXX spec. separator in MORPHCODE } st = pSMgr->suggest_morph(dash+1); if (st) { strcat(result, st); free(st); } return line_tok(result, slst, MSEP_REC); } } // affixed number in correct word if (nresult && (dash > cw) && (((*(dash-1)<='9') && (*(dash-1)>='0')) || (*(dash-1)=='.'))) { *dash='-'; n = 1; if (*(dash - n) == '.') n++; // search first not a number character to left from dash while (((dash - n)>=cw) && ((*(dash - n)=='0') || (n < 3)) && (n < 6)) { n++; } if ((dash - n) < cw) n--; // numbers: valami1000000-hoz // examine 100000-hoz, 10000-hoz 1000-hoz, 10-hoz, // 56-hoz, 6-hoz for(; n >= 1; n--) { if ((*(dash - n) >= '0') && (*(dash - n) <= '9') && checkword(dash - n, NULL, NULL)) { strcat(result, cw); result[dash - cw - n] = '\0'; st = pSMgr->suggest_morph(dash - n); if (st) { strcat(result, st); free(st); } return line_tok(result, slst, MSEP_REC); } } } } return 0; } int Hunspell::generate(char*** slst, const char * word, char ** pl, int pln) { *slst = NULL; if (!pSMgr || !pln) return 0; char **pl2; int pl2n = analyze(&pl2, word); int captype = 0; int abbv = 0; char cw[MAXWORDUTF8LEN]; cleanword(cw, word, &captype, &abbv); char result[MAXLNLEN]; *result = '\0'; for (int i = 0; i < pln; i++) { cat_result(result, pSMgr->suggest_gen(pl2, pl2n, pl[i])); } freelist(&pl2, pl2n); if (*result) { // allcap if (captype == ALLCAP) mkallcap(result); // line split int linenum = line_tok(result, slst, MSEP_REC); // capitalize if (captype == INITCAP || captype == HUHINITCAP) { for (int j=0; j < linenum; j++) mkinitcap((*slst)[j]); } // temporary filtering of prefix related errors (eg. // generate("undrinkable", "eats") --> "undrinkables" and "*undrinks") int r = 0; for (int j=0; j < linenum; j++) { if (!spell((*slst)[j])) { free((*slst)[j]); (*slst)[j] = NULL; } else { if (r < j) (*slst)[r] = (*slst)[j]; r++; } } if (r > 0) return r; free(*slst); *slst = NULL; } return 0; } int Hunspell::generate(char*** slst, const char * word, const char * pattern) { char **pl; int pln = analyze(&pl, pattern); int n = generate(slst, word, pl, pln); freelist(&pl, pln); return uniqlist(*slst, n); } // minimal XML parser functions int Hunspell::get_xml_par(char * dest, const char * par, int max) { char * d = dest; if (!par) return 0; char end = *par; char * dmax = dest + max; if (end == '>') end = '<'; else if (end != '\'' && end != '"') return 0; // bad XML for (par++; d < dmax && *par != '\0' && *par != end; par++, d++) *d = *par; *d = '\0'; mystrrep(dest, "<", "<"); mystrrep(dest, "&", "&"); return d - dest; } // return the beginning of the element (attr == NULL) or the attribute const char * Hunspell::get_xml_pos(const char * s, const char * attr) { const char * end = strchr(s, '>'); const char * p = s; if (attr == NULL) return end; do { p = strstr(p, attr); if (!p || p >= end) return 0; } while (*(p-1) != ' ' && *(p-1) != '\n'); return p + strlen(attr); } int Hunspell::check_xml_par(char * q, char * attr, char * value) { char cw[MAXWORDUTF8LEN]; if (get_xml_par(cw, get_xml_pos(q, attr), MAXWORDUTF8LEN - 1) && strcmp(cw, value) == 0) return 1; return 0; } int Hunspell::get_xml_list(char ***slst, char * list, char * tag) { int n = 0; char * p; if (!list) return 0; for (p = list; (p = strstr(p, tag)); p++) n++; if (n == 0) return 0; *slst = (char **) malloc(sizeof(char *) * n); if (!*slst) return 0; for (p = list, n = 0; (p = strstr(p, tag)); p++, n++) { int l = strlen(p); (*slst)[n] = (char *) malloc(l); if (!(*slst)[n]) return (n > 0 ? n - 1 : 0); get_xml_par((*slst)[n], p + strlen(tag) - 1, l); } return n; } int Hunspell::spellml(char*** slst, const char * word) { char *q, *q2; char cw[MAXWORDUTF8LEN], cw2[MAXWORDUTF8LEN]; q = (char *) strstr(word, "'); if (!q2) return 0; // bad XML input q2 = strstr(q2, "'), MAXWORDUTF8LEN)) n = analyze(slst, cw); if (n == 0) return 0; // convert the result to ana1ana2 format for (int i = 0; i < n; i++) s+= strlen((*slst)[i]); char * r = (char *) malloc(6 + 5 * s + 7 * n + 7 + 1); // XXX 5*s->&->& if (!r) return 0; strcpy(r, ""); for (int i = 0; i < n; i++) { int l = strlen(r); strcpy(r + l, ""); strcpy(r + l + 3, (*slst)[i]); mystrrep(r + l + 3, "\t", " "); mystrrep(r + l + 3, "<", "<"); mystrrep(r + l + 3, "&", "&"); strcat(r, ""); free((*slst)[i]); } strcat(r, ""); (*slst)[0] = r; return 1; } else if (check_xml_par(q, "type=", "stem")) { if (get_xml_par(cw, strchr(q2, '>'), MAXWORDUTF8LEN)) return stem(slst, cw); } else if (check_xml_par(q, "type=", "generate")) { int n = get_xml_par(cw, strchr(q2, '>'), MAXWORDUTF8LEN); if (n == 0) return 0; char * q3 = strstr(q2 + 1, "'), MAXWORDUTF8LEN)) { return generate(slst, cw, cw2); } } else { char ** slst2; if ((q2 = strstr(q2 + 1, "'), ""))) { int n2 = generate(slst, cw, slst2, n); freelist(&slst2, n); return uniqlist(*slst, n2); } } } return 0; } #ifdef HUNSPELL_EXPERIMENTAL // XXX need UTF-8 support char * Hunspell::morph_with_correction(const char * word) { char cw[MAXWORDUTF8LEN]; char wspace[MAXWORDUTF8LEN]; if (! pSMgr || maxdic == 0) return NULL; int wl = strlen(word); if (utf8) { if (wl >= MAXWORDUTF8LEN) return NULL; } else { if (wl >= MAXWORDLEN) return NULL; } int captype = 0; int abbv = 0; wl = cleanword(cw, word, &captype, &abbv); if (wl == 0) return NULL; char result[MAXLNLEN]; char * st = NULL; *result = '\0'; switch(captype) { case NOCAP: { st = pSMgr->suggest_morph_for_spelling_error(cw); if (st) { strcat(result, st); free(st); } if (abbv) { memcpy(wspace,cw,wl); *(wspace+wl) = '.'; *(wspace+wl+1) = '\0'; st = pSMgr->suggest_morph_for_spelling_error(wspace); if (st) { if (*result) strcat(result, "\n"); strcat(result, st); free(st); } } break; } case INITCAP: { memcpy(wspace,cw,(wl+1)); mkallsmall(wspace); st = pSMgr->suggest_morph_for_spelling_error(wspace); if (st) { strcat(result, st); free(st); } st = pSMgr->suggest_morph_for_spelling_error(cw); if (st) { if (*result) strcat(result, "\n"); strcat(result, st); free(st); } if (abbv) { memcpy(wspace,cw,wl); *(wspace+wl) = '.'; *(wspace+wl+1) = '\0'; mkallsmall(wspace); st = pSMgr->suggest_morph_for_spelling_error(wspace); if (st) { if (*result) strcat(result, "\n"); strcat(result, st); free(st); } mkinitcap(wspace); st = pSMgr->suggest_morph_for_spelling_error(wspace); if (st) { if (*result) strcat(result, "\n"); strcat(result, st); free(st); } } break; } case HUHCAP: { st = pSMgr->suggest_morph_for_spelling_error(cw); if (st) { strcat(result, st); free(st); } memcpy(wspace,cw,(wl+1)); mkallsmall(wspace); st = pSMgr->suggest_morph_for_spelling_error(wspace); if (st) { if (*result) strcat(result, "\n"); strcat(result, st); free(st); } break; } case ALLCAP: { memcpy(wspace,cw,(wl+1)); st = pSMgr->suggest_morph_for_spelling_error(wspace); if (st) { strcat(result, st); free(st); } mkallsmall(wspace); st = pSMgr->suggest_morph_for_spelling_error(wspace); if (st) { if (*result) strcat(result, "\n"); strcat(result, st); free(st); } mkinitcap(wspace); st = pSMgr->suggest_morph_for_spelling_error(wspace); if (st) { if (*result) strcat(result, "\n"); strcat(result, st); free(st); } if (abbv) { memcpy(wspace,cw,(wl+1)); *(wspace+wl) = '.'; *(wspace+wl+1) = '\0'; if (*result) strcat(result, "\n"); st = pSMgr->suggest_morph_for_spelling_error(wspace); if (st) { strcat(result, st); free(st); } mkallsmall(wspace); st = pSMgr->suggest_morph_for_spelling_error(wspace); if (st) { if (*result) strcat(result, "\n"); strcat(result, st); free(st); } mkinitcap(wspace); st = pSMgr->suggest_morph_for_spelling_error(wspace); if (st) { if (*result) strcat(result, "\n"); strcat(result, st); free(st); } } break; } } if (*result) return mystrdup(result); return NULL; } #endif // END OF HUNSPELL_EXPERIMENTAL CODE Hunhandle *Hunspell_create(const char * affpath, const char * dpath) { return (Hunhandle*)(new Hunspell(affpath, dpath)); } Hunhandle *Hunspell_create_key(const char * affpath, const char * dpath, const char * key) { return (Hunhandle*)(new Hunspell(affpath, dpath, key)); } void Hunspell_destroy(Hunhandle *pHunspell) { delete (Hunspell*)(pHunspell); } int Hunspell_spell(Hunhandle *pHunspell, const char *word) { return ((Hunspell*)pHunspell)->spell(word); } char *Hunspell_get_dic_encoding(Hunhandle *pHunspell) { return ((Hunspell*)pHunspell)->get_dic_encoding(); } int Hunspell_suggest(Hunhandle *pHunspell, char*** slst, const char * word) { return ((Hunspell*)pHunspell)->suggest(slst, word); } int Hunspell_analyze(Hunhandle *pHunspell, char*** slst, const char * word) { return ((Hunspell*)pHunspell)->analyze(slst, word); } int Hunspell_stem(Hunhandle *pHunspell, char*** slst, const char * word) { return ((Hunspell*)pHunspell)->stem(slst, word); } int Hunspell_stem(Hunhandle *pHunspell, char*** slst, char** desc, int n) { return ((Hunspell*)pHunspell)->stem(slst, desc, n); } int Hunspell_generate(Hunhandle *pHunspell, char*** slst, const char * word, const char * word2) { return ((Hunspell*)pHunspell)->generate(slst, word, word2); } int Hunspell_generate(Hunhandle *pHunspell, char*** slst, const char * word, char** desc, int n) { return ((Hunspell*)pHunspell)->generate(slst, word, desc, n); } /* functions for run-time modification of the dictionary */ /* add word to the run-time dictionary */ int Hunspell_add(Hunhandle *pHunspell, const char * word) { return ((Hunspell*)pHunspell)->add(word); } /* add word to the run-time dictionary with affix flags of * the example (a dictionary word): Hunspell will recognize * affixed forms of the new word, too. */ int Hunspell_add_with_affix(Hunhandle *pHunspell, const char * word, const char * example) { return ((Hunspell*)pHunspell)->add_with_affix(word, example); } /* remove word from the run-time dictionary */ int Hunspell_remove(Hunhandle *pHunspell, const char * word) { return ((Hunspell*)pHunspell)->remove(word); } void Hunspell_free_list(Hunhandle *pHunspell, char *** slst, int n) { freelist(slst, n); } robojournal-0.4.2/ui/hunspell/dictmgr.cxx0000644000175000017500000001575612211723646017217 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include #include #include #include #include "ui/hunspell/dictmgr.hxx" using namespace std; DictMgr::DictMgr(const char * dictpath, const char * etype) { // load list of etype entries numdict = 0; pdentry = (dictentry *)malloc(MAXDICTIONARIES*sizeof(struct dictentry)); if (pdentry) { if (parse_file(dictpath, etype)) { numdict = 0; // no dictionary.lst found is okay } } else { numdict = 0; } } DictMgr::~DictMgr() { dictentry * pdict = NULL; if (pdentry) { pdict = pdentry; for (int i=0;ilang) { free(pdict->lang); pdict->lang = NULL; } if (pdict->region) { free(pdict->region); pdict->region=NULL; } if (pdict->filename) { free(pdict->filename); pdict->filename = NULL; } pdict++; } free(pdentry); pdentry = NULL; pdict = NULL; } numdict = 0; } // read in list of etype entries and build up structure to describe them int DictMgr::parse_file(const char * dictpath, const char * etype) { int i; char line[MAXDICTENTRYLEN+1]; dictentry * pdict = pdentry; // open the dictionary list file FILE * dictlst; dictlst = fopen(dictpath,"r"); if (!dictlst) { return 1; } // step one is to parse the dictionary list building up the // descriptive structures // read in each line ignoring any that dont start with etype while (fgets(line,MAXDICTENTRYLEN,dictlst)) { mychomp(line); /* parse in a dictionary entry */ if (strncmp(line,etype,4) == 0) { if (numdict < MAXDICTIONARIES) { char * tp = line; char * piece; i = 0; while ((piece=mystrsep(&tp,' '))) { if (*piece != '\0') { switch(i) { case 0: break; case 1: pdict->lang = mystrdup(piece); break; case 2: if (strcmp (piece, "ANY") == 0) pdict->region = mystrdup(""); else pdict->region = mystrdup(piece); break; case 3: pdict->filename = mystrdup(piece); break; default: break; } i++; } free(piece); } if (i == 4) { numdict++; pdict++; } else { fprintf(stderr,"dictionary list corruption in line \"%s\"\n",line); fflush(stderr); } } } } fclose(dictlst); return 0; } // return text encoding of dictionary int DictMgr::get_list(dictentry ** ppentry) { *ppentry = pdentry; return numdict; } // strip strings into token based on single char delimiter // acts like strsep() but only uses a delim char and not // a delim string char * DictMgr::mystrsep(char ** stringp, const char delim) { char * rv = NULL; char * mp = *stringp; int n = strlen(mp); if (n > 0) { char * dp = (char *)memchr(mp,(int)((unsigned char)delim),n); if (dp) { *stringp = dp+1; int nc = (int)((unsigned long)dp - (unsigned long)mp); rv = (char *) malloc(nc+1); if (rv) { memcpy(rv,mp,nc); *(rv+nc) = '\0'; return rv; } } else { rv = (char *) malloc(n+1); if (rv) { memcpy(rv, mp, n); *(rv+n) = '\0'; *stringp = mp + n; return rv; } } } return NULL; } // replaces strdup with ansi version char * DictMgr::mystrdup(const char * s) { char * d = NULL; if (s) { int sl = strlen(s); d = (char *) malloc(((sl+1) * sizeof(char))); if (d) memcpy(d,s,((sl+1)*sizeof(char))); } return d; } // remove cross-platform text line end characters void DictMgr:: mychomp(char * s) { int k = strlen(s); if ((k > 0) && ((*(s+k-1)=='\r') || (*(s+k-1)=='\n'))) *(s+k-1) = '\0'; if ((k > 1) && (*(s+k-2) == '\r')) *(s+k-2) = '\0'; } robojournal-0.4.2/ui/hunspell/w_char.hxx0000644000175000017500000000613112211723646017021 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef __WCHARHXX__ #define __WCHARHXX__ #ifdef WIN32 typedef struct { #else typedef struct __attribute__ ((packed)) { #endif unsigned char l; unsigned char h; } w_char; // two character arrays struct replentry { char * pattern; char * pattern2; }; #endif robojournal-0.4.2/ui/hunspell/suggestmgr.hxx0000644000175000017500000001516012211723646017747 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef _SUGGESTMGR_HXX_ #define _SUGGESTMGR_HXX_ #define MAXSWL 100 #define MAXSWUTF8L (MAXSWL * 4) #define MAX_ROOTS 100 #define MAX_WORDS 100 #define MAX_GUESS 200 #define MAXNGRAMSUGS 4 #define MAXPHONSUGS 2 // timelimit: max ~1/4 sec (process time on Linux) for a time consuming function #define TIMELIMIT (CLOCKS_PER_SEC >> 2) #define MINTIMER 100 #define MAXPLUSTIMER 100 #define NGRAM_LONGER_WORSE (1 << 0) #define NGRAM_ANY_MISMATCH (1 << 1) #define NGRAM_LOWERING (1 << 2) #include "ui/hunspell/atypes.hxx" #include "ui/hunspell/affixmgr.hxx" #include "ui/hunspell/hashmgr.hxx" #include "ui/hunspell/langnum.hxx" #include enum { LCS_UP, LCS_LEFT, LCS_UPLEFT }; class SuggestMgr { char * ckey; int ckeyl; w_char * ckey_utf; char * ctry; int ctryl; w_char * ctry_utf; AffixMgr* pAMgr; int maxSug; struct cs_info * csconv; int utf8; int langnum; int nosplitsugs; int maxngramsugs; int complexprefixes; public: SuggestMgr(const char * tryme, int maxn, AffixMgr *aptr); ~SuggestMgr(); int suggest(char*** slst, const char * word, int nsug, int * onlycmpdsug); int ngsuggest(char ** wlst, char * word, int ns, HashMgr** pHMgr, int md); int suggest_auto(char*** slst, const char * word, int nsug); int suggest_stems(char*** slst, const char * word, int nsug); int suggest_pos_stems(char*** slst, const char * word, int nsug); char * suggest_morph(const char * word); char * suggest_gen(char ** pl, int pln, char * pattern); char * suggest_morph_for_spelling_error(const char * word); private: int testsug(char** wlst, const char * candidate, int wl, int ns, int cpdsuggest, int * timer, clock_t * timelimit); int checkword(const char *, int, int, int *, clock_t *); int check_forbidden(const char *, int); int capchars(char **, const char *, int, int); int replchars(char**, const char *, int, int); int doubletwochars(char**, const char *, int, int); int forgotchar(char **, const char *, int, int); int swapchar(char **, const char *, int, int); int longswapchar(char **, const char *, int, int); int movechar(char **, const char *, int, int); int extrachar(char **, const char *, int, int); int badcharkey(char **, const char *, int, int); int badchar(char **, const char *, int, int); int twowords(char **, const char *, int, int); int fixstems(char **, const char *, int); int capchars_utf(char **, const w_char *, int wl, int, int); int doubletwochars_utf(char**, const w_char *, int wl, int, int); int forgotchar_utf(char**, const w_char *, int wl, int, int); int extrachar_utf(char**, const w_char *, int wl, int, int); int badcharkey_utf(char **, const w_char *, int wl, int, int); int badchar_utf(char **, const w_char *, int wl, int, int); int swapchar_utf(char **, const w_char *, int wl, int, int); int longswapchar_utf(char **, const w_char *, int, int, int); int movechar_utf(char **, const w_char *, int, int, int); int mapchars(char**, const char *, int, int); int map_related(const char *, int, char ** wlst, int, int, const mapentry*, int, int *, clock_t *); int map_related_utf(w_char *, int, int, int, char ** wlst, int, const mapentry*, int, int *, clock_t *); int ngram(int n, char * s1, const char * s2, int opt); int mystrlen(const char * word); int leftcommonsubstring(char * s1, const char * s2); int commoncharacterpositions(char * s1, const char * s2, int * is_swap); void bubblesort( char ** rwd, char ** rwd2, int * rsc, int n); void lcs(const char * s, const char * s2, int * l1, int * l2, char ** result); int lcslen(const char * s, const char* s2); char * suggest_hentry_gen(hentry * rv, char * pattern); }; #endif robojournal-0.4.2/ui/hunspell/affixmgr.hxx0000644000175000017500000002736212211723646017372 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef _AFFIXMGR_HXX_ #define _AFFIXMGR_HXX_ #ifdef MOZILLA_CLIENT #ifdef __SUNPRO_CC // for SunONE Studio compiler using namespace std; #endif #include #else #include #endif #include "ui/hunspell/atypes.hxx" #include "ui/hunspell/baseaffix.hxx" #include "ui/hunspell/hashmgr.hxx" #include "ui/hunspell/phonet.hxx" // check flag duplication #define dupSFX (1 << 0) #define dupPFX (1 << 1) class AffixMgr { AffEntry * pStart[SETSIZE]; AffEntry * sStart[SETSIZE]; AffEntry * pFlag[CONTSIZE]; AffEntry * sFlag[CONTSIZE]; HashMgr * pHMgr; HashMgr ** alldic; int * maxdic; char * keystring; char * trystring; char * encoding; struct cs_info * csconv; int utf8; int complexprefixes; FLAG compoundflag; FLAG compoundbegin; FLAG compoundmiddle; FLAG compoundend; FLAG compoundroot; FLAG compoundforbidflag; FLAG compoundpermitflag; int checkcompounddup; int checkcompoundrep; int checkcompoundcase; int checkcompoundtriple; FLAG forbiddenword; FLAG nosuggest; FLAG needaffix; int cpdmin; int numrep; replentry * reptable; int nummap; mapentry * maptable; int numbreak; char ** breaktable; int numcheckcpd; replentry * checkcpdtable; int numdefcpd; flagentry * defcpdtable; phonetable * phone; int maxngramsugs; int nosplitsugs; int sugswithdots; int cpdwordmax; int cpdmaxsyllable; char * cpdvowels; w_char * cpdvowels_utf16; int cpdvowels_utf16_len; char * cpdsyllablenum; const char * pfxappnd; // BUG: not stateless const char * sfxappnd; // BUG: not stateless FLAG sfxflag; // BUG: not stateless char * derived; // BUG: not stateless AffEntry * sfx; // BUG: not stateless AffEntry * pfx; // BUG: not stateless int checknum; char * wordchars; unsigned short * wordchars_utf16; int wordchars_utf16_len; char * ignorechars; unsigned short * ignorechars_utf16; int ignorechars_utf16_len; char * version; char * lang; int langnum; FLAG lemma_present; FLAG circumfix; FLAG onlyincompound; FLAG keepcase; FLAG substandard; int checksharps; int havecontclass; // boolean variable char contclasses[CONTSIZE]; // flags of possible continuing classes (twofold affix) flag flag_mode; public: AffixMgr(const char * affpath, HashMgr** ptr, int * md, const char * key = NULL); ~AffixMgr(); struct hentry * affix_check(const char * word, int len, const unsigned short needflag = (unsigned short) 0, char in_compound = IN_CPD_NOT); struct hentry * prefix_check(const char * word, int len, char in_compound, const FLAG needflag = FLAG_NULL); inline int isSubset(const char * s1, const char * s2); struct hentry * prefix_check_twosfx(const char * word, int len, char in_compound, const FLAG needflag = FLAG_NULL); inline int isRevSubset(const char * s1, const char * end_of_s2, int len); struct hentry * suffix_check(const char * word, int len, int sfxopts, AffEntry* ppfx, char ** wlst, int maxSug, int * ns, const FLAG cclass = FLAG_NULL, const FLAG needflag = FLAG_NULL, char in_compound = IN_CPD_NOT); struct hentry * suffix_check_twosfx(const char * word, int len, int sfxopts, AffEntry* ppfx, const FLAG needflag = FLAG_NULL); char * affix_check_morph(const char * word, int len, const FLAG needflag = FLAG_NULL, char in_compound = IN_CPD_NOT); char * prefix_check_morph(const char * word, int len, char in_compound, const FLAG needflag = FLAG_NULL); char * suffix_check_morph (const char * word, int len, int sfxopts, AffEntry * ppfx, const FLAG cclass = FLAG_NULL, const FLAG needflag = FLAG_NULL, char in_compound = IN_CPD_NOT); char * prefix_check_twosfx_morph(const char * word, int len, char in_compound, const FLAG needflag = FLAG_NULL); char * suffix_check_twosfx_morph(const char * word, int len, int sfxopts, AffEntry * ppfx, const FLAG needflag = FLAG_NULL); char * morphgen(char * ts, int wl, const unsigned short * ap, unsigned short al, char * morph, char * targetmorph, int level); int expand_rootword(struct guessword * wlst, int maxn, const char * ts, int wl, const unsigned short * ap, unsigned short al, char * bad, int, char *); short get_syllable (const char * word, int wlen); int cpdrep_check(const char * word, int len); int cpdpat_check(const char * word, int len); int defcpd_check(hentry *** words, short wnum, hentry * rv, hentry ** rwords, char all); int cpdcase_check(const char * word, int len); inline int candidate_check(const char * word, int len); struct hentry * compound_check(const char * word, int len, short wordnum, short numsyllable, short maxwordnum, short wnum, hentry ** words, char hu_mov_rule, int * cmpdstemnum, int * cmpdstem, char is_sug); int compound_check_morph(const char * word, int len, short wordnum, short numsyllable, short maxwordnum, short wnum, hentry ** words, char hu_mov_rule, char ** result, char * partresult); struct hentry * lookup(const char * word); int get_numrep(); struct replentry * get_reptable(); struct phonetable * get_phonetable(); int get_nummap(); struct mapentry * get_maptable(); int get_numbreak(); char ** get_breaktable(); char * get_encoding(); int get_langnum(); char * get_key_string(); char * get_try_string(); const char * get_wordchars(); unsigned short * get_wordchars_utf16(int * len); char * get_ignore(); unsigned short * get_ignore_utf16(int * len); int get_compound(); FLAG get_compoundflag(); FLAG get_compoundbegin(); FLAG get_forbiddenword(); FLAG get_nosuggest(); FLAG get_needaffix(); FLAG get_onlyincompound(); FLAG get_compoundroot(); FLAG get_lemma_present(); int get_checknum(); char * get_possible_root(); const char * get_prefix(); const char * get_suffix(); const char * get_derived(); const char * get_version(); const int have_contclass(); int get_utf8(); int get_complexprefixes(); char * get_suffixed(char ); int get_maxngramsugs(); int get_nosplitsugs(); int get_sugswithdots(void); FLAG get_keepcase(void); int get_checksharps(void); char * encode_flag(unsigned short aflag); private: int parse_file(const char * affpath, const char * key); int parse_flag(char * line, unsigned short * out, const char * name); int parse_num(char * line, int * out, const char * name); int parse_cpdsyllable(char * line); int parse_reptable(char * line, FileMgr * af); int parse_phonetable(char * line, FileMgr * af); int parse_maptable(char * line, FileMgr * af); int parse_breaktable(char * line, FileMgr * af); int parse_checkcpdtable(char * line, FileMgr * af); int parse_defcpdtable(char * line, FileMgr * af); int parse_affix(char * line, const char at, FileMgr * af, char * dupflags); void reverse_condition(char *); void debugflag(char * result, unsigned short flag); int condlen(char *); int encodeit(struct affentry * ptr, char * cs); int build_pfxtree(AffEntry* pfxptr); int build_sfxtree(AffEntry* sfxptr); int process_pfx_order(); int process_sfx_order(); AffEntry * process_pfx_in_order(AffEntry * ptr, AffEntry * nptr); AffEntry * process_sfx_in_order(AffEntry * ptr, AffEntry * nptr); int process_pfx_tree_to_list(); int process_sfx_tree_to_list(); int redundant_condition(char, char * strip, int stripl, const char * cond, char *); }; #endif robojournal-0.4.2/ui/hunspell/affixmgr.cxx0000644000175000017500000043057612211723646017372 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "license.hunspell" #include "license.myspell" #ifndef MOZILLA_CLIENT #include #include #include #include #else #include #include #include #include #endif #include "ui/hunspell/affixmgr.hxx" #include "ui/hunspell/affentry.hxx" #include "ui/hunspell/langnum.hxx" #include "ui/hunspell/csutil.hxx" #ifndef MOZILLA_CLIENT #ifndef WIN32 using namespace std; #endif #endif AffixMgr::AffixMgr(const char * affpath, HashMgr** ptr, int * md, const char * key) { // register hash manager and load affix data from aff file pHMgr = ptr[0]; alldic = ptr; maxdic = md; keystring = NULL; trystring = NULL; encoding=NULL; utf8 = 0; complexprefixes = 0; maptable = NULL; nummap = 0; breaktable = NULL; numbreak = 0; reptable = NULL; numrep = 0; checkcpdtable = NULL; numcheckcpd = 0; defcpdtable = NULL; numdefcpd = 0; phone = NULL; compoundflag = FLAG_NULL; // permits word in compound forms compoundbegin = FLAG_NULL; // may be first word in compound forms compoundmiddle = FLAG_NULL; // may be middle word in compound forms compoundend = FLAG_NULL; // may be last word in compound forms compoundroot = FLAG_NULL; // compound word signing flag compoundpermitflag = FLAG_NULL; // compound permitting flag for suffixed word compoundforbidflag = FLAG_NULL; // compound fordidden flag for suffixed word checkcompounddup = 0; // forbid double words in compounds checkcompoundrep = 0; // forbid bad compounds (may be non compound word with a REP substitution) checkcompoundcase = 0; // forbid upper and lowercase combinations at word bounds checkcompoundtriple = 0; // forbid compounds with triple letters forbiddenword = FORBIDDENWORD; // forbidden word signing flag nosuggest = FLAG_NULL; // don't suggest words signed with NOSUGGEST flag lang = NULL; // language langnum = 0; // language code (see http://l10n.openoffice.org/languages.html) needaffix = FLAG_NULL; // forbidden root, allowed only with suffixes cpdwordmax = -1; // default: unlimited wordcount in compound words cpdmin = -1; // undefined cpdmaxsyllable = 0; // default: unlimited syllablecount in compound words cpdvowels=NULL; // vowels (for calculating of Hungarian compounding limit, O(n) search! XXX) cpdvowels_utf16=NULL; // vowels for UTF-8 encoding (bsearch instead of O(n) search) cpdvowels_utf16_len=0; // vowels pfxappnd=NULL; // previous prefix for counting the syllables of prefix BUG sfxappnd=NULL; // previous suffix for counting a special syllables BUG cpdsyllablenum=NULL; // syllable count incrementing flag checknum=0; // checking numbers, and word with numbers wordchars=NULL; // letters + spec. word characters wordchars_utf16=NULL; // letters + spec. word characters wordchars_utf16_len=0; // letters + spec. word characters ignorechars=NULL; // letters + spec. word characters ignorechars_utf16=NULL; // letters + spec. word characters ignorechars_utf16_len=0; // letters + spec. word characters version=NULL; // affix and dictionary file version string havecontclass=0; // flags of possible continuing classes (double affix) // LEMMA_PRESENT: not put root into the morphological output. Lemma presents // in morhological description in dictionary file. It's often combined with PSEUDOROOT. lemma_present = FLAG_NULL; circumfix = FLAG_NULL; onlyincompound = FLAG_NULL; flag_mode = FLAG_CHAR; // default one-character flags in affix and dic file maxngramsugs = -1; // undefined nosplitsugs = 0; sugswithdots = 0; keepcase = 0; checksharps = 0; substandard = FLAG_NULL; derived = NULL; // XXX not threadsafe variable for experimental stemming sfx = NULL; pfx = NULL; for (int i=0; i < SETSIZE; i++) { pStart[i] = NULL; sStart[i] = NULL; pFlag[i] = NULL; sFlag[i] = NULL; } for (int j=0; j < CONTSIZE; j++) { contclasses[j] = 0; } if (parse_file(affpath, key)) { HUNSPELL_WARNING(stderr, "Failure loading aff file %s\n",affpath); } if (cpdmin == -1) cpdmin = MINCPDLEN; } AffixMgr::~AffixMgr() { // pass through linked prefix entries and clean up for (int i=0; i < SETSIZE ;i++) { pFlag[i] = NULL; PfxEntry * ptr = (PfxEntry *)pStart[i]; PfxEntry * nptr = NULL; while (ptr) { nptr = ptr->getNext(); delete(ptr); ptr = nptr; nptr = NULL; } } // pass through linked suffix entries and clean up for (int j=0; j < SETSIZE ; j++) { sFlag[j] = NULL; SfxEntry * ptr = (SfxEntry *)sStart[j]; SfxEntry * nptr = NULL; while (ptr) { nptr = ptr->getNext(); delete(ptr); ptr = nptr; nptr = NULL; } sStart[j] = NULL; } if (keystring) free(keystring); keystring=NULL; if (trystring) free(trystring); trystring=NULL; if (encoding) free(encoding); encoding=NULL; if (maptable) { for (int j=0; j < nummap; j++) { if (maptable[j].set) free(maptable[j].set); if (maptable[j].set_utf16) free(maptable[j].set_utf16); maptable[j].set = NULL; maptable[j].len = 0; } free(maptable); maptable = NULL; } nummap = 0; if (breaktable) { for (int j=0; j < numbreak; j++) { if (breaktable[j]) free(breaktable[j]); breaktable[j] = NULL; } free(breaktable); breaktable = NULL; } numbreak = 0; if (reptable) { for (int j=0; j < numrep; j++) { free(reptable[j].pattern); free(reptable[j].pattern2); } free(reptable); reptable = NULL; } if (phone && phone->rules) { for (int j=0; j < phone->num + 1; j++) { free(phone->rules[j * 2]); free(phone->rules[j * 2 + 1]); } free(phone->rules); free(phone); phone = NULL; } if (defcpdtable) { for (int j=0; j < numdefcpd; j++) { free(defcpdtable[j].def); defcpdtable[j].def = NULL; } free(defcpdtable); defcpdtable = NULL; } numrep = 0; if (checkcpdtable) { for (int j=0; j < numcheckcpd; j++) { free(checkcpdtable[j].pattern); free(checkcpdtable[j].pattern2); checkcpdtable[j].pattern = NULL; checkcpdtable[j].pattern2 = NULL; } free(checkcpdtable); checkcpdtable = NULL; } numcheckcpd = 0; FREE_FLAG(compoundflag); FREE_FLAG(compoundbegin); FREE_FLAG(compoundmiddle); FREE_FLAG(compoundend); FREE_FLAG(compoundpermitflag); FREE_FLAG(compoundforbidflag); FREE_FLAG(compoundroot); FREE_FLAG(forbiddenword); FREE_FLAG(nosuggest); FREE_FLAG(needaffix); FREE_FLAG(lemma_present); FREE_FLAG(circumfix); FREE_FLAG(onlyincompound); cpdwordmax = 0; pHMgr = NULL; cpdmin = 0; cpdmaxsyllable = 0; if (cpdvowels) free(cpdvowels); if (cpdvowels_utf16) free(cpdvowels_utf16); if (cpdsyllablenum) free(cpdsyllablenum); free_utf_tbl(); if (lang) free(lang); if (wordchars) free(wordchars); if (wordchars_utf16) free(wordchars_utf16); if (ignorechars) free(ignorechars); if (ignorechars_utf16) free(ignorechars_utf16); if (version) free(version); if (derived) free(derived); checknum=0; } // read in aff file and build up prefix and suffix entry objects int AffixMgr::parse_file(const char * affpath, const char * key) { char * line; // io buffers char ft; // affix type // checking flag duplication char dupflags[CONTSIZE]; char dupflags_ini = 1; // first line indicator for removing byte order mark int firstline = 1; // open the affix file FileMgr * afflst = new FileMgr(affpath, key); if (!afflst) { HUNSPELL_WARNING(stderr, "error: could not open affix description file %s\n",affpath); return 1; } // step one is to parse the affix file building up the internal // affix data structures // read in each line ignoring any that do not // start with a known line type indicator while ((line = afflst->getline())) { mychomp(line); /* remove byte order mark */ if (firstline) { firstline = 0; if (strncmp(line,"\xEF\xBB\xBF",3) == 0) { memmove(line, line+3, strlen(line+3)+1); HUNSPELL_WARNING(stderr, "warning: affix file begins with byte order mark: possible incompatibility with old Hunspell versions\n"); } } /* parse in the keyboard string */ if (strncmp(line,"KEY",3) == 0) { if (parse_string(line, &keystring, "KEY")) { delete afflst; return 1; } } /* parse in the try string */ if (strncmp(line,"TRY",3) == 0) { if (parse_string(line, &trystring, "TRY")) { delete afflst; return 1; } } /* parse in the name of the character set used by the .dict and .aff */ if (strncmp(line,"SET",3) == 0) { if (parse_string(line, &encoding, "SET")) { delete afflst; return 1; } if (strcmp(encoding, "UTF-8") == 0) { utf8 = 1; #ifndef OPENOFFICEORG #ifndef MOZILLA_CLIENT if (initialize_utf_tbl()) return 1; #endif #endif } } /* parse COMPLEXPREFIXES for agglutinative languages with right-to-left writing system */ if (strncmp(line,"COMPLEXPREFIXES",15) == 0) complexprefixes = 1; /* parse in the flag used by the controlled compound words */ if (strncmp(line,"COMPOUNDFLAG",12) == 0) { if (parse_flag(line, &compoundflag, "COMPOUNDFLAG")) { delete afflst; return 1; } } /* parse in the flag used by compound words */ if (strncmp(line,"COMPOUNDBEGIN",13) == 0) { if (complexprefixes) { if (parse_flag(line, &compoundend, "COMPOUNDBEGIN")) { delete afflst; return 1; } } else { if (parse_flag(line, &compoundbegin, "COMPOUNDBEGIN")) { delete afflst; return 1; } } } /* parse in the flag used by compound words */ if (strncmp(line,"COMPOUNDMIDDLE",14) == 0) { if (parse_flag(line, &compoundmiddle, "COMPOUNDMIDDLE")) { delete afflst; return 1; } } /* parse in the flag used by compound words */ if (strncmp(line,"COMPOUNDEND",11) == 0) { if (complexprefixes) { if (parse_flag(line, &compoundbegin, "COMPOUNDEND")) { delete afflst; return 1; } } else { if (parse_flag(line, &compoundend, "COMPOUNDEND")) { delete afflst; return 1; } } } /* parse in the data used by compound_check() method */ if (strncmp(line,"COMPOUNDWORDMAX",15) == 0) { if (parse_num(line, &cpdwordmax, "COMPOUNDWORDMAX")) { delete afflst; return 1; } } /* parse in the flag sign compounds in dictionary */ if (strncmp(line,"COMPOUNDROOT",12) == 0) { if (parse_flag(line, &compoundroot, "COMPOUNDROOT")) { delete afflst; return 1; } } /* parse in the flag used by compound_check() method */ if (strncmp(line,"COMPOUNDPERMITFLAG",18) == 0) { if (parse_flag(line, &compoundpermitflag, "COMPOUNDPERMITFLAG")) { delete afflst; return 1; } } /* parse in the flag used by compound_check() method */ if (strncmp(line,"COMPOUNDFORBIDFLAG",18) == 0) { if (parse_flag(line, &compoundforbidflag, "COMPOUNDFORBIDFLAG")) { delete afflst; return 1; } } if (strncmp(line,"CHECKCOMPOUNDDUP",16) == 0) { checkcompounddup = 1; } if (strncmp(line,"CHECKCOMPOUNDREP",16) == 0) { checkcompoundrep = 1; } if (strncmp(line,"CHECKCOMPOUNDTRIPLE",19) == 0) { checkcompoundtriple = 1; } if (strncmp(line,"CHECKCOMPOUNDCASE",17) == 0) { checkcompoundcase = 1; } if (strncmp(line,"NOSUGGEST",9) == 0) { if (parse_flag(line, &nosuggest, "NOSUGGEST")) { delete afflst; return 1; } } /* parse in the flag used by forbidden words */ if (strncmp(line,"FORBIDDENWORD",13) == 0) { if (parse_flag(line, &forbiddenword, "FORBIDDENWORD")) { delete afflst; return 1; } } /* parse in the flag used by forbidden words */ if (strncmp(line,"LEMMA_PRESENT",13) == 0) { if (parse_flag(line, &lemma_present, "LEMMA_PRESENT")) { delete afflst; return 1; } } /* parse in the flag used by circumfixes */ if (strncmp(line,"CIRCUMFIX",9) == 0) { if (parse_flag(line, &circumfix, "CIRCUMFIX")) { delete afflst; return 1; } } /* parse in the flag used by fogemorphemes */ if (strncmp(line,"ONLYINCOMPOUND",14) == 0) { if (parse_flag(line, &onlyincompound, "ONLYINCOMPOUND")) { delete afflst; return 1; } } /* parse in the flag used by `needaffixs' */ if (strncmp(line,"PSEUDOROOT",10) == 0) { if (parse_flag(line, &needaffix, "PSEUDOROOT")) { delete afflst; return 1; } } /* parse in the flag used by `needaffixs' */ if (strncmp(line,"NEEDAFFIX",9) == 0) { if (parse_flag(line, &needaffix, "NEEDAFFIX")) { delete afflst; return 1; } } /* parse in the minimal length for words in compounds */ if (strncmp(line,"COMPOUNDMIN",11) == 0) { if (parse_num(line, &cpdmin, "COMPOUNDMIN")) { delete afflst; return 1; } if (cpdmin < 1) cpdmin = 1; } /* parse in the max. words and syllables in compounds */ if (strncmp(line,"COMPOUNDSYLLABLE",16) == 0) { if (parse_cpdsyllable(line)) { delete afflst; return 1; } } /* parse in the flag used by compound_check() method */ if (strncmp(line,"SYLLABLENUM",11) == 0) { if (parse_string(line, &cpdsyllablenum, "SYLLABLENUM")) { delete afflst; return 1; } } /* parse in the flag used by the controlled compound words */ if (strncmp(line,"CHECKNUM",8) == 0) { checknum=1; } /* parse in the extra word characters */ if (strncmp(line,"WORDCHARS",9) == 0) { if (parse_array(line, &wordchars, &wordchars_utf16, &wordchars_utf16_len, "WORDCHARS", utf8)) { delete afflst; return 1; } } /* parse in the ignored characters (for example, Arabic optional diacretics charachters */ if (strncmp(line,"IGNORE",6) == 0) { if (parse_array(line, &ignorechars, &ignorechars_utf16, &ignorechars_utf16_len, "IGNORE", utf8)) { delete afflst; return 1; } } /* parse in the typical fault correcting table */ if (strncmp(line,"REP",3) == 0) { if (parse_reptable(line, afflst)) { delete afflst; return 1; } } /* parse in the phonetic translation table */ if (strncmp(line,"PHONE",5) == 0) { if (parse_phonetable(line, afflst)) { delete afflst; return 1; } } /* parse in the checkcompoundpattern table */ if (strncmp(line,"CHECKCOMPOUNDPATTERN",20) == 0) { if (parse_checkcpdtable(line, afflst)) { delete afflst; return 1; } } /* parse in the defcompound table */ if (strncmp(line,"COMPOUNDRULE",12) == 0) { if (parse_defcpdtable(line, afflst)) { delete afflst; return 1; } } /* parse in the related character map table */ if (strncmp(line,"MAP",3) == 0) { if (parse_maptable(line, afflst)) { delete afflst; return 1; } } /* parse in the word breakpoints table */ if (strncmp(line,"BREAK",5) == 0) { if (parse_breaktable(line, afflst)) { delete afflst; return 1; } } /* parse in the language for language specific codes */ if (strncmp(line,"LANG",4) == 0) { if (parse_string(line, &lang, "LANG")) { delete afflst; return 1; } langnum = get_lang_num(lang); } if (strncmp(line,"VERSION",7) == 0) { if (parse_string(line, &version, "VERSION")) { delete afflst; return 1; } } if (strncmp(line,"MAXNGRAMSUGS",12) == 0) { if (parse_num(line, &maxngramsugs, "MAXNGRAMSUGS")) { delete afflst; return 1; } } if (strncmp(line,"NOSPLITSUGS",11) == 0) { nosplitsugs=1; } if (strncmp(line,"SUGSWITHDOTS",12) == 0) { sugswithdots=1; } /* parse in the flag used by forbidden words */ if (strncmp(line,"KEEPCASE",8) == 0) { if (parse_flag(line, &keepcase, "KEEPCASE")) { delete afflst; return 1; } } /* parse in the flag used by the affix generator */ if (strncmp(line,"SUBSTANDARD",11) == 0) { if (parse_flag(line, &substandard, "SUBSTANDARD")) { delete afflst; return 1; } } if (strncmp(line,"CHECKSHARPS",11) == 0) { checksharps=1; } /* parse this affix: P - prefix, S - suffix */ ft = ' '; if (strncmp(line,"PFX",3) == 0) ft = complexprefixes ? 'S' : 'P'; if (strncmp(line,"SFX",3) == 0) ft = complexprefixes ? 'P' : 'S'; if (ft != ' ') { if (dupflags_ini) { for (int i = 0; i < CONTSIZE; i++) dupflags[i] = 0; dupflags_ini = 0; } if (parse_affix(line, ft, afflst, dupflags)) { delete afflst; process_pfx_tree_to_list(); process_sfx_tree_to_list(); return 1; } } } delete afflst; // convert affix trees to sorted list process_pfx_tree_to_list(); process_sfx_tree_to_list(); // now we can speed up performance greatly taking advantage of the // relationship between the affixes and the idea of "subsets". // View each prefix as a potential leading subset of another and view // each suffix (reversed) as a potential trailing subset of another. // To illustrate this relationship if we know the prefix "ab" is found in the // word to examine, only prefixes that "ab" is a leading subset of need be examined. // Furthermore is "ab" is not present then none of the prefixes that "ab" is // is a subset need be examined. // The same argument goes for suffix string that are reversed. // Then to top this off why not examine the first char of the word to quickly // limit the set of prefixes to examine (i.e. the prefixes to examine must // be leading supersets of the first character of the word (if they exist) // To take advantage of this "subset" relationship, we need to add two links // from entry. One to take next if the current prefix is found (call it nexteq) // and one to take next if the current prefix is not found (call it nextne). // Since we have built ordered lists, all that remains is to properly intialize // the nextne and nexteq pointers that relate them process_pfx_order(); process_sfx_order(); /* get encoding for CHECKCOMPOUNDCASE */ if (!utf8) { char * enc = get_encoding(); csconv = get_current_cs(enc); free(enc); enc = NULL; char expw[MAXLNLEN]; if (wordchars) { strcpy(expw, wordchars); free(wordchars); } else *expw = '\0'; for (int i = 0; i <= 255; i++) { if ( (csconv[i].cupper != csconv[i].clower) && (! strchr(expw, (char) i))) { *(expw + strlen(expw) + 1) = '\0'; *(expw + strlen(expw)) = (char) i; } } wordchars = mystrdup(expw); } // temporary BREAK definition for German dash handling (OOo issue 64400) if ((langnum == LANG_de) && (!breaktable)) { breaktable = (char **) malloc(sizeof(char *)); if (!breaktable) return 1; breaktable[0] = mystrdup("-"); if (breaktable[0]) numbreak = 1; } return 0; } // we want to be able to quickly access prefix information // both by prefix flag, and sorted by prefix string itself // so we need to set up two indexes int AffixMgr::build_pfxtree(AffEntry* pfxptr) { PfxEntry * ptr; PfxEntry * pptr; PfxEntry * ep = (PfxEntry*) pfxptr; // get the right starting points const char * key = ep->getKey(); const unsigned char flg = (unsigned char) (ep->getFlag() & 0x00FF); // first index by flag which must exist ptr = (PfxEntry*)pFlag[flg]; ep->setFlgNxt(ptr); pFlag[flg] = (AffEntry *) ep; // handle the special case of null affix string if (strlen(key) == 0) { // always inset them at head of list at element 0 ptr = (PfxEntry*)pStart[0]; ep->setNext(ptr); pStart[0] = (AffEntry*)ep; return 0; } // now handle the normal case ep->setNextEQ(NULL); ep->setNextNE(NULL); unsigned char sp = *((const unsigned char *)key); ptr = (PfxEntry*)pStart[sp]; // handle the first insert if (!ptr) { pStart[sp] = (AffEntry*)ep; return 0; } // otherwise use binary tree insertion so that a sorted // list can easily be generated later pptr = NULL; for (;;) { pptr = ptr; if (strcmp(ep->getKey(), ptr->getKey() ) <= 0) { ptr = ptr->getNextEQ(); if (!ptr) { pptr->setNextEQ(ep); break; } } else { ptr = ptr->getNextNE(); if (!ptr) { pptr->setNextNE(ep); break; } } } return 0; } // we want to be able to quickly access suffix information // both by suffix flag, and sorted by the reverse of the // suffix string itself; so we need to set up two indexes int AffixMgr::build_sfxtree(AffEntry* sfxptr) { SfxEntry * ptr; SfxEntry * pptr; SfxEntry * ep = (SfxEntry *) sfxptr; /* get the right starting point */ const char * key = ep->getKey(); const unsigned char flg = (unsigned char) (ep->getFlag() & 0x00FF); // first index by flag which must exist ptr = (SfxEntry*)sFlag[flg]; ep->setFlgNxt(ptr); sFlag[flg] = (AffEntry *) ep; // next index by affix string // handle the special case of null affix string if (strlen(key) == 0) { // always inset them at head of list at element 0 ptr = (SfxEntry*)sStart[0]; ep->setNext(ptr); sStart[0] = (AffEntry*)ep; return 0; } // now handle the normal case ep->setNextEQ(NULL); ep->setNextNE(NULL); unsigned char sp = *((const unsigned char *)key); ptr = (SfxEntry*)sStart[sp]; // handle the first insert if (!ptr) { sStart[sp] = (AffEntry*)ep; return 0; } // otherwise use binary tree insertion so that a sorted // list can easily be generated later pptr = NULL; for (;;) { pptr = ptr; if (strcmp(ep->getKey(), ptr->getKey() ) <= 0) { ptr = ptr->getNextEQ(); if (!ptr) { pptr->setNextEQ(ep); break; } } else { ptr = ptr->getNextNE(); if (!ptr) { pptr->setNextNE(ep); break; } } } return 0; } // convert from binary tree to sorted list int AffixMgr::process_pfx_tree_to_list() { for (int i=1; i< SETSIZE; i++) { pStart[i] = process_pfx_in_order(pStart[i],NULL); } return 0; } AffEntry* AffixMgr::process_pfx_in_order(AffEntry* ptr, AffEntry* nptr) { if (ptr) { nptr = process_pfx_in_order(((PfxEntry*) ptr)->getNextNE(), nptr); ((PfxEntry*) ptr)->setNext((PfxEntry*) nptr); nptr = process_pfx_in_order(((PfxEntry*) ptr)->getNextEQ(), ptr); } return nptr; } // convert from binary tree to sorted list int AffixMgr:: process_sfx_tree_to_list() { for (int i=1; i< SETSIZE; i++) { sStart[i] = process_sfx_in_order(sStart[i],NULL); } return 0; } AffEntry* AffixMgr::process_sfx_in_order(AffEntry* ptr, AffEntry* nptr) { if (ptr) { nptr = process_sfx_in_order(((SfxEntry*) ptr)->getNextNE(), nptr); ((SfxEntry*) ptr)->setNext((SfxEntry*) nptr); nptr = process_sfx_in_order(((SfxEntry*) ptr)->getNextEQ(), ptr); } return nptr; } // reinitialize the PfxEntry links NextEQ and NextNE to speed searching // using the idea of leading subsets this time int AffixMgr::process_pfx_order() { PfxEntry* ptr; // loop through each prefix list starting point for (int i=1; i < SETSIZE; i++) { ptr = (PfxEntry*)pStart[i]; // look through the remainder of the list // and find next entry with affix that // the current one is not a subset of // mark that as destination for NextNE // use next in list that you are a subset // of as NextEQ for (; ptr != NULL; ptr = ptr->getNext()) { PfxEntry * nptr = ptr->getNext(); for (; nptr != NULL; nptr = nptr->getNext()) { if (! isSubset( ptr->getKey() , nptr->getKey() )) break; } ptr->setNextNE(nptr); ptr->setNextEQ(NULL); if ((ptr->getNext()) && isSubset(ptr->getKey() , (ptr->getNext())->getKey())) ptr->setNextEQ(ptr->getNext()); } // now clean up by adding smart search termination strings: // if you are already a superset of the previous prefix // but not a subset of the next, search can end here // so set NextNE properly ptr = (PfxEntry *) pStart[i]; for (; ptr != NULL; ptr = ptr->getNext()) { PfxEntry * nptr = ptr->getNext(); PfxEntry * mptr = NULL; for (; nptr != NULL; nptr = nptr->getNext()) { if (! isSubset(ptr->getKey(),nptr->getKey())) break; mptr = nptr; } if (mptr) mptr->setNextNE(NULL); } } return 0; } // initialize the SfxEntry links NextEQ and NextNE to speed searching // using the idea of leading subsets this time int AffixMgr::process_sfx_order() { SfxEntry* ptr; // loop through each prefix list starting point for (int i=1; i < SETSIZE; i++) { ptr = (SfxEntry *) sStart[i]; // look through the remainder of the list // and find next entry with affix that // the current one is not a subset of // mark that as destination for NextNE // use next in list that you are a subset // of as NextEQ for (; ptr != NULL; ptr = ptr->getNext()) { SfxEntry * nptr = ptr->getNext(); for (; nptr != NULL; nptr = nptr->getNext()) { if (! isSubset(ptr->getKey(),nptr->getKey())) break; } ptr->setNextNE(nptr); ptr->setNextEQ(NULL); if ((ptr->getNext()) && isSubset(ptr->getKey(),(ptr->getNext())->getKey())) ptr->setNextEQ(ptr->getNext()); } // now clean up by adding smart search termination strings: // if you are already a superset of the previous suffix // but not a subset of the next, search can end here // so set NextNE properly ptr = (SfxEntry *) sStart[i]; for (; ptr != NULL; ptr = ptr->getNext()) { SfxEntry * nptr = ptr->getNext(); SfxEntry * mptr = NULL; for (; nptr != NULL; nptr = nptr->getNext()) { if (! isSubset(ptr->getKey(),nptr->getKey())) break; mptr = nptr; } if (mptr) mptr->setNextNE(NULL); } } return 0; } // add flags to the result for dictionary debugging void AffixMgr::debugflag(char * result, unsigned short flag) { char * st = encode_flag(flag); strcat(result, " "); strcat(result, MORPH_FLAG); if (st) { strcat(result, st); free(st); } } // calculate the character length of the condition int AffixMgr::condlen(char * st) { int l = 0; bool group = false; for(; *st; st++) { if (*st == '[') { group = true; l++; } else if (*st == ']') group = false; else if (!group && (!utf8 || (!(*st & 0x80) || ((*st & 0xc0) == 0x80)))) l++; } return l; } int AffixMgr::encodeit(struct affentry * ptr, char * cs) { if (strcmp(cs,".") != 0) { ptr->numconds = (char) condlen(cs); strncpy(ptr->c.conds, cs, MAXCONDLEN); // long condition (end of conds padded by strncpy) if (ptr->c.conds[MAXCONDLEN - 1] && cs[MAXCONDLEN]) { ptr->opts += aeLONGCOND; ptr->c.l.conds2 = mystrdup(cs + MAXCONDLEN_1); if (!ptr->c.l.conds2) return 1; } } else { ptr->numconds = 0; ptr->c.conds[0] = '\0'; } return 0; } // return 1 if s1 is a leading subset of s2 (dots are for infixes) inline int AffixMgr::isSubset(const char * s1, const char * s2) { while (((*s1 == *s2) || (*s1 == '.')) && (*s1 != '\0')) { s1++; s2++; } return (*s1 == '\0'); } // check word for prefixes struct hentry * AffixMgr::prefix_check(const char * word, int len, char in_compound, const FLAG needflag) { struct hentry * rv= NULL; pfx = NULL; pfxappnd = NULL; sfxappnd = NULL; // first handle the special case of 0 length prefixes PfxEntry * pe = (PfxEntry *) pStart[0]; while (pe) { if ( // fogemorpheme ((in_compound != IN_CPD_NOT) || !(pe->getCont() && (TESTAFF(pe->getCont(), onlyincompound, pe->getContLen())))) && // permit prefixes in compounds ((in_compound != IN_CPD_END) || (pe->getCont() && (TESTAFF(pe->getCont(), compoundpermitflag, pe->getContLen())))) ) { // check prefix rv = pe->checkword(word, len, in_compound, needflag); if (rv) { pfx=(AffEntry *)pe; // BUG: pfx not stateless return rv; } } pe = pe->getNext(); } // now handle the general case unsigned char sp = *((const unsigned char *)word); PfxEntry * pptr = (PfxEntry *)pStart[sp]; while (pptr) { if (isSubset(pptr->getKey(),word)) { if ( // fogemorpheme ((in_compound != IN_CPD_NOT) || !(pptr->getCont() && (TESTAFF(pptr->getCont(), onlyincompound, pptr->getContLen())))) && // permit prefixes in compounds ((in_compound != IN_CPD_END) || (pptr->getCont() && (TESTAFF(pptr->getCont(), compoundpermitflag, pptr->getContLen())))) ) { // check prefix rv = pptr->checkword(word, len, in_compound, needflag); if (rv) { pfx=(AffEntry *)pptr; // BUG: pfx not stateless return rv; } } pptr = pptr->getNextEQ(); } else { pptr = pptr->getNextNE(); } } return NULL; } // check word for prefixes struct hentry * AffixMgr::prefix_check_twosfx(const char * word, int len, char in_compound, const FLAG needflag) { struct hentry * rv= NULL; pfx = NULL; sfxappnd = NULL; // first handle the special case of 0 length prefixes PfxEntry * pe = (PfxEntry *) pStart[0]; while (pe) { rv = pe->check_twosfx(word, len, in_compound, needflag); if (rv) return rv; pe = pe->getNext(); } // now handle the general case unsigned char sp = *((const unsigned char *)word); PfxEntry * pptr = (PfxEntry *)pStart[sp]; while (pptr) { if (isSubset(pptr->getKey(),word)) { rv = pptr->check_twosfx(word, len, in_compound, needflag); if (rv) { pfx = (AffEntry *)pptr; return rv; } pptr = pptr->getNextEQ(); } else { pptr = pptr->getNextNE(); } } return NULL; } // check word for prefixes char * AffixMgr::prefix_check_morph(const char * word, int len, char in_compound, const FLAG needflag) { char * st; char result[MAXLNLEN]; result[0] = '\0'; pfx = NULL; sfxappnd = NULL; // first handle the special case of 0 length prefixes PfxEntry * pe = (PfxEntry *) pStart[0]; while (pe) { st = pe->check_morph(word,len,in_compound, needflag); if (st) { strcat(result, st); free(st); } // if (rv) return rv; pe = pe->getNext(); } // now handle the general case unsigned char sp = *((const unsigned char *)word); PfxEntry * pptr = (PfxEntry *)pStart[sp]; while (pptr) { if (isSubset(pptr->getKey(),word)) { st = pptr->check_morph(word,len,in_compound, needflag); if (st) { // fogemorpheme if ((in_compound != IN_CPD_NOT) || !((pptr->getCont() && (TESTAFF(pptr->getCont(), onlyincompound, pptr->getContLen()))))) { strcat(result, st); pfx = (AffEntry *)pptr; } free(st); } pptr = pptr->getNextEQ(); } else { pptr = pptr->getNextNE(); } } if (*result) return mystrdup(result); return NULL; } // check word for prefixes char * AffixMgr::prefix_check_twosfx_morph(const char * word, int len, char in_compound, const FLAG needflag) { char * st; char result[MAXLNLEN]; result[0] = '\0'; pfx = NULL; sfxappnd = NULL; // first handle the special case of 0 length prefixes PfxEntry * pe = (PfxEntry *) pStart[0]; while (pe) { st = pe->check_twosfx_morph(word,len,in_compound, needflag); if (st) { strcat(result, st); free(st); } pe = pe->getNext(); } // now handle the general case unsigned char sp = *((const unsigned char *)word); PfxEntry * pptr = (PfxEntry *)pStart[sp]; while (pptr) { if (isSubset(pptr->getKey(),word)) { st = pptr->check_twosfx_morph(word, len, in_compound, needflag); if (st) { strcat(result, st); free(st); pfx = (AffEntry *)pptr; } pptr = pptr->getNextEQ(); } else { pptr = pptr->getNextNE(); } } if (*result) return mystrdup(result); return NULL; } // Is word a non compound with a REP substitution (see checkcompoundrep)? int AffixMgr::cpdrep_check(const char * word, int wl) { char candidate[MAXLNLEN]; const char * r; int lenr, lenp; if ((wl < 2) || !numrep) return 0; for (int i=0; i < numrep; i++ ) { r = word; lenr = strlen(reptable[i].pattern2); lenp = strlen(reptable[i].pattern); // search every occurence of the pattern in the word while ((r=strstr(r, reptable[i].pattern)) != NULL) { strcpy(candidate, word); if (r-word + lenr + strlen(r+lenp) >= MAXLNLEN) break; strcpy(candidate+(r-word),reptable[i].pattern2); strcpy(candidate+(r-word)+lenr, r+lenp); if (candidate_check(candidate,strlen(candidate))) return 1; r++; // search for the next letter } } return 0; } // forbid compoundings when there are special patterns at word bound int AffixMgr::cpdpat_check(const char * word, int pos) { int len; for (int i = 0; i < numcheckcpd; i++) { if (isSubset(checkcpdtable[i].pattern2, word + pos) && (len = strlen(checkcpdtable[i].pattern)) && (pos > len) && (strncmp(word + pos - len, checkcpdtable[i].pattern, len) == 0)) return 1; } return 0; } // forbid compounding with neighbouring upper and lower case characters at word bounds int AffixMgr::cpdcase_check(const char * word, int pos) { if (utf8) { w_char u, w; const char * p; u8_u16(&u, 1, word + pos); for (p = word + pos - 1; (*p & 0xc0) == 0x80; p--); u8_u16(&w, 1, p); unsigned short a = (u.h << 8) + u.l; unsigned short b = (w.h << 8) + w.l; if (((unicodetoupper(a, langnum) == a) || (unicodetoupper(b, langnum) == b))) return 1; } else { unsigned char a = *(word + pos - 1); unsigned char b = *(word + pos); if ((csconv[a].ccase || csconv[b].ccase) && (a != '-') && (b != '-')) return 1; } return 0; } // check compound patterns int AffixMgr::defcpd_check(hentry *** words, short wnum, hentry * rv, hentry ** def, char all) { signed short btpp[MAXWORDLEN]; // metacharacter (*, ?) positions for backtracking signed short btwp[MAXWORDLEN]; // word positions for metacharacters int btnum[MAXWORDLEN]; // number of matched characters in metacharacter positions short bt = 0; int i; int ok; int w = 0; if (!*words) { w = 1; *words = def; } (*words)[wnum] = rv; for (i = 0; i < numdefcpd; i++) { signed short pp = 0; // pattern position signed short wp = 0; // "words" position int ok2; ok = 1; ok2 = 1; do { while ((pp < defcpdtable[i].len) && (wp <= wnum)) { if (((pp+1) < defcpdtable[i].len) && ((defcpdtable[i].def[pp+1] == '*') || (defcpdtable[i].def[pp+1] == '?'))) { int wend = (defcpdtable[i].def[pp+1] == '?') ? wp : wnum; ok2 = 1; pp+=2; btpp[bt] = pp; btwp[bt] = wp; while (wp <= wend) { if (!(*words)[wp]->alen || !TESTAFF((*words)[wp]->astr, defcpdtable[i].def[pp-2], (*words)[wp]->alen)) { ok2 = 0; break; } wp++; } if (wp <= wnum) ok2 = 0; btnum[bt] = wp - btwp[bt]; if (btnum[bt] > 0) bt++; if (ok2) break; } else { ok2 = 1; if (!(*words)[wp] || !(*words)[wp]->alen || !TESTAFF((*words)[wp]->astr, defcpdtable[i].def[pp], (*words)[wp]->alen)) { ok = 0; break; } pp++; wp++; if ((defcpdtable[i].len == pp) && !(wp > wnum)) ok = 0; } } if (ok && ok2) { int r = pp; while ((defcpdtable[i].len > r) && ((r+1) < defcpdtable[i].len) && ((defcpdtable[i].def[r+1] == '*') || (defcpdtable[i].def[r+1] == '?'))) r+=2; if (defcpdtable[i].len <= r) return 1; } // backtrack if (bt) do { ok = 1; btnum[bt - 1]--; pp = btpp[bt - 1]; wp = btwp[bt - 1] + (signed short) btnum[bt - 1]; } while ((btnum[bt - 1] < 0) && --bt); } while (bt); if (ok && ok2 && (!all || (defcpdtable[i].len <= pp))) return 1; // check zero ending while (ok && ok2 && (defcpdtable[i].len > pp) && ((pp+1) < defcpdtable[i].len) && ((defcpdtable[i].def[pp+1] == '*') || (defcpdtable[i].def[pp+1] == '?'))) pp+=2; if (ok && ok2 && (defcpdtable[i].len <= pp)) return 1; } (*words)[wnum] = NULL; if (w) *words = NULL; return 0; } inline int AffixMgr::candidate_check(const char * word, int len) { struct hentry * rv=NULL; rv = lookup(word); if (rv) return 1; // rv = prefix_check(word,len,1); // if (rv) return 1; rv = affix_check(word,len); if (rv) return 1; return 0; } // calculate number of syllable for compound-checking short AffixMgr::get_syllable(const char * word, int wlen) { if (cpdmaxsyllable==0) return 0; short num=0; if (!utf8) { for (int i=0; i 0; i--) { if (flag_bsearch((unsigned short *) cpdvowels_utf16, ((unsigned short *) w)[i - 1], cpdvowels_utf16_len)) num++; } } return num; } // check if compound word is correctly spelled // hu_mov_rule = spec. Hungarian rule (XXX) struct hentry * AffixMgr::compound_check(const char * word, int len, short wordnum, short numsyllable, short maxwordnum, short wnum, hentry ** words = NULL, char hu_mov_rule = 0, int * cmpdstemnum = NULL, int * cmpdstem = NULL, char is_sug = 0) { int i; short oldnumsyllable, oldnumsyllable2, oldwordnum, oldwordnum2; int oldcmpdstemnum = 0; struct hentry * rv = NULL; struct hentry * rv_first; struct hentry * rwords[MAXWORDLEN]; // buffer for COMPOUND pattern checking char st [MAXWORDUTF8LEN + 4]; char ch; int cmin; int cmax; int checked_prefix; #ifdef HUNSTEM if (cmpdstemnum) { if (wordnum == 0) { *cmpdstemnum = 1; } else { (*cmpdstemnum)++; } } #endif if (utf8) { for (cmin = 0, i = 0; (i < cpdmin) && word[cmin]; i++) { cmin++; for (; (word[cmin] & 0xc0) == 0x80; cmin++); } for (cmax = len, i = 0; (i < (cpdmin - 1)) && cmax; i++) { cmax--; for (; (word[cmax] & 0xc0) == 0x80; cmax--); } } else { cmin = cpdmin; cmax = len - cpdmin + 1; } strcpy(st, word); for (i = cmin; i < cmax; i++) { oldnumsyllable = numsyllable; oldwordnum = wordnum; checked_prefix = 0; // go to end of the UTF-8 character if (utf8) { for (; (st[i] & 0xc0) == 0x80; i++); if (i >= cmax) return NULL; } ch = st[i]; st[i] = '\0'; sfx = NULL; pfx = NULL; // FIRST WORD rv = lookup(st); // perhaps without prefix // search homonym with compound flag while ((rv) && !hu_mov_rule && ((needaffix && TESTAFF(rv->astr, needaffix, rv->alen)) || !((compoundflag && !words && TESTAFF(rv->astr, compoundflag, rv->alen)) || (compoundbegin && !wordnum && TESTAFF(rv->astr, compoundbegin, rv->alen)) || (compoundmiddle && wordnum && !words && TESTAFF(rv->astr, compoundmiddle, rv->alen)) || (numdefcpd && ((!words && !wordnum && defcpd_check(&words, wnum, rv, (hentry **) &rwords, 0)) || (words && defcpd_check(&words, wnum, rv, (hentry **) &rwords, 0)))) ))) { rv = rv->next_homonym; } if (!rv) { if (compoundflag && !(rv = prefix_check(st, i, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN, compoundflag))) { if ((rv = suffix_check(st, i, 0, NULL, NULL, 0, NULL, FLAG_NULL, compoundflag, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN)) && !hu_mov_rule && ((SfxEntry*)sfx)->getCont() && ((compoundforbidflag && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundforbidflag, ((SfxEntry*)sfx)->getContLen())) || (compoundend && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundend, ((SfxEntry*)sfx)->getContLen())))) { rv = NULL; } } if (rv || (((wordnum == 0) && compoundbegin && ((rv = suffix_check(st, i, 0, NULL, NULL, 0, NULL, FLAG_NULL, compoundbegin, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN)) || (rv = prefix_check(st, i, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN, compoundbegin)))) || ((wordnum > 0) && compoundmiddle && ((rv = suffix_check(st, i, 0, NULL, NULL, 0, NULL, FLAG_NULL, compoundmiddle, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN)) || (rv = prefix_check(st, i, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN, compoundmiddle))))) ) checked_prefix = 1; // else check forbiddenwords and needaffix } else if (rv->astr && (TESTAFF(rv->astr, forbiddenword, rv->alen) || TESTAFF(rv->astr, needaffix, rv->alen) || (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)) )) { st[i] = ch; continue; } // check non_compound flag in suffix and prefix if ((rv) && !hu_mov_rule && ((pfx && ((PfxEntry*)pfx)->getCont() && TESTAFF(((PfxEntry*)pfx)->getCont(), compoundforbidflag, ((PfxEntry*)pfx)->getContLen())) || (sfx && ((SfxEntry*)sfx)->getCont() && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundforbidflag, ((SfxEntry*)sfx)->getContLen())))) { rv = NULL; } // check compoundend flag in suffix and prefix if ((rv) && !checked_prefix && compoundend && !hu_mov_rule && ((pfx && ((PfxEntry*)pfx)->getCont() && TESTAFF(((PfxEntry*)pfx)->getCont(), compoundend, ((PfxEntry*)pfx)->getContLen())) || (sfx && ((SfxEntry*)sfx)->getCont() && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundend, ((SfxEntry*)sfx)->getContLen())))) { rv = NULL; } // check compoundmiddle flag in suffix and prefix if ((rv) && !checked_prefix && (wordnum==0) && compoundmiddle && !hu_mov_rule && ((pfx && ((PfxEntry*)pfx)->getCont() && TESTAFF(((PfxEntry*)pfx)->getCont(), compoundmiddle, ((PfxEntry*)pfx)->getContLen())) || (sfx && ((SfxEntry*)sfx)->getCont() && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundmiddle, ((SfxEntry*)sfx)->getContLen())))) { rv = NULL; } // check forbiddenwords if ((rv) && (rv->astr) && (TESTAFF(rv->astr, forbiddenword, rv->alen) || (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)))) { return NULL; } // increment word number, if the second root has a compoundroot flag if ((rv) && compoundroot && (TESTAFF(rv->astr, compoundroot, rv->alen))) { wordnum++; } // first word is acceptable in compound words? if (((rv) && ( checked_prefix || (words && words[wnum]) || (compoundflag && TESTAFF(rv->astr, compoundflag, rv->alen)) || ((oldwordnum == 0) && compoundbegin && TESTAFF(rv->astr, compoundbegin, rv->alen)) || ((oldwordnum > 0) && compoundmiddle && TESTAFF(rv->astr, compoundmiddle, rv->alen))// || // (numdefcpd && ) // LANG_hu section: spec. Hungarian rule || ((langnum == LANG_hu) && hu_mov_rule && ( TESTAFF(rv->astr, 'F', rv->alen) || // XXX hardwired Hungarian dictionary codes TESTAFF(rv->astr, 'G', rv->alen) || TESTAFF(rv->astr, 'H', rv->alen) ) ) // END of LANG_hu section ) && ! (( checkcompoundtriple && // test triple letters (word[i-1]==word[i]) && ( ((i>1) && (word[i-1]==word[i-2])) || ((word[i-1]==word[i+1])) // may be word[i+1] == '\0' ) ) || ( // test CHECKCOMPOUNDPATTERN numcheckcpd && cpdpat_check(word, i) ) || ( checkcompoundcase && cpdcase_check(word, i) )) ) // LANG_hu section: spec. Hungarian rule || ((!rv) && (langnum == LANG_hu) && hu_mov_rule && (rv = affix_check(st,i)) && (sfx && ((SfxEntry*)sfx)->getCont() && ( // XXX hardwired Hungarian dic. codes TESTAFF(((SfxEntry*)sfx)->getCont(), (unsigned short) 'x', ((SfxEntry*)sfx)->getContLen()) || TESTAFF(((SfxEntry*)sfx)->getCont(), (unsigned short) '%', ((SfxEntry*)sfx)->getContLen()) ) ) ) // END of LANG_hu section ) { // LANG_hu section: spec. Hungarian rule if (langnum == LANG_hu) { // calculate syllable number of the word numsyllable += get_syllable(st, i); // + 1 word, if syllable number of the prefix > 1 (hungarian convention) if (pfx && (get_syllable(((PfxEntry *)pfx)->getKey(),strlen(((PfxEntry *)pfx)->getKey())) > 1)) wordnum++; } // END of LANG_hu section #ifdef HUNSTEM if (cmpdstem) cmpdstem[*cmpdstemnum - 1] = i; #endif // NEXT WORD(S) rv_first = rv; rv = lookup((word+i)); // perhaps without prefix // search homonym with compound flag while ((rv) && ((needaffix && TESTAFF(rv->astr, needaffix, rv->alen)) || !((compoundflag && !words && TESTAFF(rv->astr, compoundflag, rv->alen)) || (compoundend && !words && TESTAFF(rv->astr, compoundend, rv->alen)) || (numdefcpd && words && defcpd_check(&words, wnum + 1, rv, NULL,1))))) { rv = rv->next_homonym; } if (rv && words && words[wnum + 1]) return rv; oldnumsyllable2 = numsyllable; oldwordnum2 = wordnum; // LANG_hu section: spec. Hungarian rule, XXX hardwired dictionary code if ((rv) && (langnum == LANG_hu) && (TESTAFF(rv->astr, 'I', rv->alen)) && !(TESTAFF(rv->astr, 'J', rv->alen))) { numsyllable--; } // END of LANG_hu section // increment word number, if the second root has a compoundroot flag if ((rv) && (compoundroot) && (TESTAFF(rv->astr, compoundroot, rv->alen))) { wordnum++; } // check forbiddenwords if ((rv) && (rv->astr) && (TESTAFF(rv->astr, forbiddenword, rv->alen) || (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)))) return NULL; // second word is acceptable, as a root? // hungarian conventions: compounding is acceptable, // when compound forms consist of 2 words, or if more, // then the syllable number of root words must be 6, or lesser. if ((rv) && ( (compoundflag && TESTAFF(rv->astr, compoundflag, rv->alen)) || (compoundend && TESTAFF(rv->astr, compoundend, rv->alen)) ) && ( ((cpdwordmax==-1) || (wordnum+1clen)<=cpdmaxsyllable)) ) && ( (!checkcompounddup || (rv != rv_first)) ) ) { // forbid compound word, if it is a non compound word with typical fault if (checkcompoundrep && cpdrep_check(word,len)) return NULL; return rv; } numsyllable = oldnumsyllable2 ; wordnum = oldwordnum2; // perhaps second word has prefix or/and suffix sfx = NULL; sfxflag = FLAG_NULL; rv = (compoundflag) ? affix_check((word+i),strlen(word+i), compoundflag, IN_CPD_END) : NULL; if (!rv && compoundend) { sfx = NULL; pfx = NULL; rv = affix_check((word+i),strlen(word+i), compoundend, IN_CPD_END); } if (!rv && numdefcpd && words) { rv = affix_check((word+i),strlen(word+i), 0, IN_CPD_END); if (rv && defcpd_check(&words, wnum + 1, rv, NULL, 1)) return rv; rv = NULL; } // check non_compound flag in suffix and prefix if ((rv) && ((pfx && ((PfxEntry*)pfx)->getCont() && TESTAFF(((PfxEntry*)pfx)->getCont(), compoundforbidflag, ((PfxEntry*)pfx)->getContLen())) || (sfx && ((SfxEntry*)sfx)->getCont() && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundforbidflag, ((SfxEntry*)sfx)->getContLen())))) { rv = NULL; } // check forbiddenwords if ((rv) && (rv->astr) && (TESTAFF(rv->astr, forbiddenword, rv->alen) || (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)))) return NULL; // pfxappnd = prefix of word+i, or NULL // calculate syllable number of prefix. // hungarian convention: when syllable number of prefix is more, // than 1, the prefix+word counts as two words. if (langnum == LANG_hu) { // calculate syllable number of the word numsyllable += get_syllable(word + i, strlen(word + i)); // - affix syllable num. // XXX only second suffix (inflections, not derivations) if (sfxappnd) { char * tmp = myrevstrdup(sfxappnd); numsyllable -= get_syllable(tmp, strlen(tmp)); free(tmp); } // + 1 word, if syllable number of the prefix > 1 (hungarian convention) if (pfx && (get_syllable(((PfxEntry *)pfx)->getKey(),strlen(((PfxEntry *)pfx)->getKey())) > 1)) wordnum++; // increment syllable num, if last word has a SYLLABLENUM flag // and the suffix is beginning `s' if (cpdsyllablenum) { switch (sfxflag) { case 'c': { numsyllable+=2; break; } case 'J': { numsyllable += 1; break; } case 'I': { if (TESTAFF(rv->astr, 'J', rv->alen)) numsyllable += 1; break; } } } } // increment word number, if the second word has a compoundroot flag if ((rv) && (compoundroot) && (TESTAFF(rv->astr, compoundroot, rv->alen))) { wordnum++; } // second word is acceptable, as a word with prefix or/and suffix? // hungarian conventions: compounding is acceptable, // when compound forms consist 2 word, otherwise // the syllable number of root words is 6, or lesser. if ((rv) && ( ((cpdwordmax == -1) || (wordnum + 1 < cpdwordmax)) || ((cpdmaxsyllable == 0) || (numsyllable <= cpdmaxsyllable)) ) && ( (!checkcompounddup || (rv != rv_first)) )) { // forbid compound word, if it is a non compound word with typical fault if (checkcompoundrep && cpdrep_check(word, len)) return NULL; return rv; } numsyllable = oldnumsyllable2; wordnum = oldwordnum2; #ifdef HUNSTEM if (cmpdstemnum) oldcmpdstemnum = *cmpdstemnum; #endif // perhaps second word is a compound word (recursive call) if (wordnum < maxwordnum) { rv = compound_check((word+i),strlen(word+i), wordnum+1, numsyllable, maxwordnum, wnum + 1, words, 0, cmpdstemnum, cmpdstem, is_sug); } else { rv=NULL; } if (rv) { // forbid compound word, if it is a non compound word with typical fault if (checkcompoundrep && cpdrep_check(word, len)) return NULL; return rv; } else { #ifdef HUNSTEM if (cmpdstemnum) *cmpdstemnum = oldcmpdstemnum; #endif } } st[i] = ch; wordnum = oldwordnum; numsyllable = oldnumsyllable; } return NULL; } // check if compound word is correctly spelled // hu_mov_rule = spec. Hungarian rule (XXX) int AffixMgr::compound_check_morph(const char * word, int len, short wordnum, short numsyllable, short maxwordnum, short wnum, hentry ** words, char hu_mov_rule = 0, char ** result = NULL, char * partresult = NULL) { int i; short oldnumsyllable, oldnumsyllable2, oldwordnum, oldwordnum2; int ok = 0; struct hentry * rv = NULL; struct hentry * rv_first; struct hentry * rwords[MAXWORDLEN]; // buffer for COMPOUND pattern checking char st [MAXWORDUTF8LEN + 4]; char ch; int checked_prefix; char presult[MAXLNLEN]; int cmin; int cmax; if (utf8) { for (cmin = 0, i = 0; (i < cpdmin) && word[cmin]; i++) { cmin++; for (; (word[cmin] & 0xc0) == 0x80; cmin++); } for (cmax = len, i = 0; (i < (cpdmin - 1)) && cmax; i++) { cmax--; for (; (word[cmax] & 0xc0) == 0x80; cmax--); } } else { cmin = cpdmin; cmax = len - cpdmin + 1; } strcpy(st, word); for (i = cmin; i < cmax; i++) { oldnumsyllable = numsyllable; oldwordnum = wordnum; checked_prefix = 0; // go to end of the UTF-8 character if (utf8) { for (; (st[i] & 0xc0) == 0x80; i++); if (i >= cmax) return 0; } ch = st[i]; st[i] = '\0'; sfx = NULL; // FIRST WORD *presult = '\0'; if (partresult) strcat(presult, partresult); rv = lookup(st); // perhaps without prefix // search homonym with compound flag while ((rv) && !hu_mov_rule && ((needaffix && TESTAFF(rv->astr, needaffix, rv->alen)) || !((compoundflag && !words && TESTAFF(rv->astr, compoundflag, rv->alen)) || (compoundbegin && !wordnum && TESTAFF(rv->astr, compoundbegin, rv->alen)) || (compoundmiddle && wordnum && !words && TESTAFF(rv->astr, compoundmiddle, rv->alen)) || (numdefcpd && ((!words && !wordnum && defcpd_check(&words, wnum, rv, (hentry **) &rwords, 0)) || (words && defcpd_check(&words, wnum, rv, (hentry **) &rwords, 0)))) ))) { rv = rv->next_homonym; } if (rv) { sprintf(presult + strlen(presult), "%c%s%s", MSEP_FLD, MORPH_PART, st); if (!HENTRY_FIND(rv, MORPH_STEM)) { sprintf(presult + strlen(presult), "%c%s%s", MSEP_FLD, MORPH_STEM, st); } // store the pointer of the hash entry // sprintf(presult + strlen(presult), "%c%s%p", MSEP_FLD, MORPH_HENTRY, rv); if (HENTRY_DATA(rv)) { sprintf(presult + strlen(presult), "%c%s", MSEP_FLD, HENTRY_DATA2(rv)); } } if (!rv) { if (compoundflag && !(rv = prefix_check(st, i, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN, compoundflag))) { if ((rv = suffix_check(st, i, 0, NULL, NULL, 0, NULL, FLAG_NULL, compoundflag, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN)) && !hu_mov_rule && ((SfxEntry*)sfx)->getCont() && ((compoundforbidflag && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundforbidflag, ((SfxEntry*)sfx)->getContLen())) || (compoundend && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundend, ((SfxEntry*)sfx)->getContLen())))) { rv = NULL; } } if (rv || (((wordnum == 0) && compoundbegin && ((rv = suffix_check(st, i, 0, NULL, NULL, 0, NULL, FLAG_NULL, compoundbegin, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN)) || (rv = prefix_check(st, i, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN, compoundbegin)))) || ((wordnum > 0) && compoundmiddle && ((rv = suffix_check(st, i, 0, NULL, NULL, 0, NULL, FLAG_NULL, compoundmiddle, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN)) || (rv = prefix_check(st, i, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN, compoundmiddle))))) ) { // char * p = prefix_check_morph(st, i, 0, compound); char * p = NULL; if (compoundflag) p = affix_check_morph(st, i, compoundflag); if (!p || (*p == '\0')) { if (p) free(p); p = NULL; if ((wordnum == 0) && compoundbegin) { p = affix_check_morph(st, i, compoundbegin); } else if ((wordnum > 0) && compoundmiddle) { p = affix_check_morph(st, i, compoundmiddle); } } if (p && (*p != '\0')) { sprintf(presult + strlen(presult), "%c%s%s%s", MSEP_FLD, MORPH_PART, st, line_uniq_app(&p, MSEP_REC)); } if (p) free(p); checked_prefix = 1; } // else check forbiddenwords } else if (rv->astr && (TESTAFF(rv->astr, forbiddenword, rv->alen) || TESTAFF(rv->astr, needaffix, rv->alen))) { st[i] = ch; continue; } // check non_compound flag in suffix and prefix if ((rv) && !hu_mov_rule && ((pfx && ((PfxEntry*)pfx)->getCont() && TESTAFF(((PfxEntry*)pfx)->getCont(), compoundforbidflag, ((PfxEntry*)pfx)->getContLen())) || (sfx && ((SfxEntry*)sfx)->getCont() && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundforbidflag, ((SfxEntry*)sfx)->getContLen())))) { continue; } // check compoundend flag in suffix and prefix if ((rv) && !checked_prefix && compoundend && !hu_mov_rule && ((pfx && ((PfxEntry*)pfx)->getCont() && TESTAFF(((PfxEntry*)pfx)->getCont(), compoundend, ((PfxEntry*)pfx)->getContLen())) || (sfx && ((SfxEntry*)sfx)->getCont() && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundend, ((SfxEntry*)sfx)->getContLen())))) { continue; } // check compoundmiddle flag in suffix and prefix if ((rv) && !checked_prefix && (wordnum==0) && compoundmiddle && !hu_mov_rule && ((pfx && ((PfxEntry*)pfx)->getCont() && TESTAFF(((PfxEntry*)pfx)->getCont(), compoundmiddle, ((PfxEntry*)pfx)->getContLen())) || (sfx && ((SfxEntry*)sfx)->getCont() && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundmiddle, ((SfxEntry*)sfx)->getContLen())))) { rv = NULL; } // check forbiddenwords if ((rv) && (rv->astr) && TESTAFF(rv->astr, forbiddenword, rv->alen)) continue; // increment word number, if the second root has a compoundroot flag if ((rv) && (compoundroot) && (TESTAFF(rv->astr, compoundroot, rv->alen))) { wordnum++; } // first word is acceptable in compound words? if (((rv) && ( checked_prefix || (words && words[wnum]) || (compoundflag && TESTAFF(rv->astr, compoundflag, rv->alen)) || ((oldwordnum == 0) && compoundbegin && TESTAFF(rv->astr, compoundbegin, rv->alen)) || ((oldwordnum > 0) && compoundmiddle && TESTAFF(rv->astr, compoundmiddle, rv->alen)) // LANG_hu section: spec. Hungarian rule || ((langnum == LANG_hu) && // hu_mov_rule hu_mov_rule && ( TESTAFF(rv->astr, 'F', rv->alen) || TESTAFF(rv->astr, 'G', rv->alen) || TESTAFF(rv->astr, 'H', rv->alen) ) ) // END of LANG_hu section ) && ! (( checkcompoundtriple && // test triple letters (word[i-1]==word[i]) && ( ((i>1) && (word[i-1]==word[i-2])) || ((word[i-1]==word[i+1])) // may be word[i+1] == '\0' ) ) || ( // test CHECKCOMPOUNDPATTERN numcheckcpd && cpdpat_check(word, i) ) || ( checkcompoundcase && cpdcase_check(word, i) )) ) // LANG_hu section: spec. Hungarian rule || ((!rv) && (langnum == LANG_hu) && hu_mov_rule && (rv = affix_check(st,i)) && (sfx && ((SfxEntry*)sfx)->getCont() && ( TESTAFF(((SfxEntry*)sfx)->getCont(), (unsigned short) 'x', ((SfxEntry*)sfx)->getContLen()) || TESTAFF(((SfxEntry*)sfx)->getCont(), (unsigned short) '%', ((SfxEntry*)sfx)->getContLen()) ) ) ) // END of LANG_hu section ) { // LANG_hu section: spec. Hungarian rule if (langnum == LANG_hu) { // calculate syllable number of the word numsyllable += get_syllable(st, i); // + 1 word, if syllable number of the prefix > 1 (hungarian convention) if (pfx && (get_syllable(((PfxEntry *)pfx)->getKey(),strlen(((PfxEntry *)pfx)->getKey())) > 1)) wordnum++; } // END of LANG_hu section // NEXT WORD(S) rv_first = rv; rv = lookup((word+i)); // perhaps without prefix // search homonym with compound flag while ((rv) && ((needaffix && TESTAFF(rv->astr, needaffix, rv->alen)) || !((compoundflag && !words && TESTAFF(rv->astr, compoundflag, rv->alen)) || (compoundend && !words && TESTAFF(rv->astr, compoundend, rv->alen)) || (numdefcpd && defcpd_check(&words, wnum + 1, rv, NULL,1))))) { rv = rv->next_homonym; } if (rv && words && words[wnum + 1]) { strcat(*result, presult); strcat(*result, " "); strcat(*result, MORPH_PART); strcat(*result, word+i); if (complexprefixes && HENTRY_DATA(rv)) strcat(*result, HENTRY_DATA2(rv)); if (!HENTRY_FIND(rv, MORPH_STEM)) { strcat(*result, " "); strcat(*result, MORPH_STEM); strcat(*result, HENTRY_WORD(rv)); } // store the pointer of the hash entry // sprintf(*result + strlen(*result), " %s%p", MORPH_HENTRY, rv); if (!complexprefixes && HENTRY_DATA(rv)) { strcat(*result, " "); strcat(*result, HENTRY_DATA2(rv)); } strcat(*result, "\n"); ok = 1; return 0; } oldnumsyllable2 = numsyllable; oldwordnum2 = wordnum; // LANG_hu section: spec. Hungarian rule if ((rv) && (langnum == LANG_hu) && (TESTAFF(rv->astr, 'I', rv->alen)) && !(TESTAFF(rv->astr, 'J', rv->alen))) { numsyllable--; } // END of LANG_hu section // increment word number, if the second root has a compoundroot flag if ((rv) && (compoundroot) && (TESTAFF(rv->astr, compoundroot, rv->alen))) { wordnum++; } // check forbiddenwords if ((rv) && (rv->astr) && TESTAFF(rv->astr, forbiddenword, rv->alen)) { st[i] = ch; continue; } // second word is acceptable, as a root? // hungarian conventions: compounding is acceptable, // when compound forms consist of 2 words, or if more, // then the syllable number of root words must be 6, or lesser. if ((rv) && ( (compoundflag && TESTAFF(rv->astr, compoundflag, rv->alen)) || (compoundend && TESTAFF(rv->astr, compoundend, rv->alen)) ) && ( ((cpdwordmax==-1) || (wordnum+1blen)<=cpdmaxsyllable)) ) && ( (!checkcompounddup || (rv != rv_first)) ) ) { // bad compound word strcat(*result, presult); strcat(*result, " "); strcat(*result, MORPH_PART); strcat(*result, word+i); if (HENTRY_DATA(rv)) { if (complexprefixes) strcat(*result, HENTRY_DATA2(rv)); if (! HENTRY_FIND(rv, MORPH_STEM)) { strcat(*result, " "); strcat(*result, MORPH_STEM); strcat(*result, HENTRY_WORD(rv)); } // store the pointer of the hash entry // sprintf(*result + strlen(*result), " %s%p", MORPH_HENTRY, rv); if (!complexprefixes) { strcat(*result, " "); strcat(*result, HENTRY_DATA2(rv)); } } strcat(*result, "\n"); ok = 1; } numsyllable = oldnumsyllable2 ; wordnum = oldwordnum2; // perhaps second word has prefix or/and suffix sfx = NULL; sfxflag = FLAG_NULL; if (compoundflag) rv = affix_check((word+i),strlen(word+i), compoundflag); else rv = NULL; if (!rv && compoundend) { sfx = NULL; pfx = NULL; rv = affix_check((word+i),strlen(word+i), compoundend); } if (!rv && numdefcpd && words) { rv = affix_check((word+i),strlen(word+i), 0, IN_CPD_END); if (rv && words && defcpd_check(&words, wnum + 1, rv, NULL, 1)) { char * m = NULL; if (compoundflag) m = affix_check_morph((word+i),strlen(word+i), compoundflag); if ((!m || *m == '\0') && compoundend) { if (m) free(m); m = affix_check_morph((word+i),strlen(word+i), compoundend); } strcat(*result, presult); if (m || (*m != '\0')) { sprintf(*result + strlen(*result), "%c%s%s%s", MSEP_FLD, MORPH_PART, word + i, line_uniq_app(&m, MSEP_REC)); } if (m) free(m); strcat(*result, "\n"); ok = 1; } } // check non_compound flag in suffix and prefix if ((rv) && ((pfx && ((PfxEntry*)pfx)->getCont() && TESTAFF(((PfxEntry*)pfx)->getCont(), compoundforbidflag, ((PfxEntry*)pfx)->getContLen())) || (sfx && ((SfxEntry*)sfx)->getCont() && TESTAFF(((SfxEntry*)sfx)->getCont(), compoundforbidflag, ((SfxEntry*)sfx)->getContLen())))) { rv = NULL; } // check forbiddenwords if ((rv) && (rv->astr) && (TESTAFF(rv->astr,forbiddenword,rv->alen)) && (! TESTAFF(rv->astr, needaffix, rv->alen))) { st[i] = ch; continue; } if (langnum == LANG_hu) { // calculate syllable number of the word numsyllable += get_syllable(word + i, strlen(word + i)); // - affix syllable num. // XXX only second suffix (inflections, not derivations) if (sfxappnd) { char * tmp = myrevstrdup(sfxappnd); numsyllable -= get_syllable(tmp, strlen(tmp)); free(tmp); } // + 1 word, if syllable number of the prefix > 1 (hungarian convention) if (pfx && (get_syllable(((PfxEntry *)pfx)->getKey(),strlen(((PfxEntry *)pfx)->getKey())) > 1)) wordnum++; // increment syllable num, if last word has a SYLLABLENUM flag // and the suffix is beginning `s' if (cpdsyllablenum) { switch (sfxflag) { case 'c': { numsyllable+=2; break; } case 'J': { numsyllable += 1; break; } case 'I': { if (rv && TESTAFF(rv->astr, 'J', rv->alen)) numsyllable += 1; break; } } } } // increment word number, if the second word has a compoundroot flag if ((rv) && (compoundroot) && (TESTAFF(rv->astr, compoundroot, rv->alen))) { wordnum++; } // second word is acceptable, as a word with prefix or/and suffix? // hungarian conventions: compounding is acceptable, // when compound forms consist 2 word, otherwise // the syllable number of root words is 6, or lesser. if ((rv) && ( ((cpdwordmax==-1) || (wordnum+1 0) && *s1 && (*s1 == *end_of_s2)) { s1++; end_of_s2--; len--; } return (*s1 == '\0'); } */ inline int AffixMgr::isRevSubset(const char * s1, const char * end_of_s2, int len) { while ((len > 0) && (*s1 != '\0') && ((*s1 == *end_of_s2) || (*s1 == '.'))) { s1++; end_of_s2--; len--; } return (*s1 == '\0'); } // check word for suffixes struct hentry * AffixMgr::suffix_check (const char * word, int len, int sfxopts, AffEntry * ppfx, char ** wlst, int maxSug, int * ns, const FLAG cclass, const FLAG needflag, char in_compound) { struct hentry * rv = NULL; char result[MAXLNLEN]; PfxEntry* ep = (PfxEntry *) ppfx; // first handle the special case of 0 length suffixes SfxEntry * se = (SfxEntry *) sStart[0]; while (se) { if (!cclass || se->getCont()) { // suffixes are not allowed in beginning of compounds if ((((in_compound != IN_CPD_BEGIN)) || // && !cclass // except when signed with compoundpermitflag flag (se->getCont() && compoundpermitflag && TESTAFF(se->getCont(),compoundpermitflag,se->getContLen()))) && (!circumfix || // no circumfix flag in prefix and suffix ((!ppfx || !(ep->getCont()) || !TESTAFF(ep->getCont(), circumfix, ep->getContLen())) && (!se->getCont() || !(TESTAFF(se->getCont(),circumfix,se->getContLen())))) || // circumfix flag in prefix AND suffix ((ppfx && (ep->getCont()) && TESTAFF(ep->getCont(), circumfix, ep->getContLen())) && (se->getCont() && (TESTAFF(se->getCont(),circumfix,se->getContLen()))))) && // fogemorpheme (in_compound || !((se->getCont() && (TESTAFF(se->getCont(), onlyincompound, se->getContLen()))))) && // needaffix on prefix or first suffix (cclass || !(se->getCont() && TESTAFF(se->getCont(), needaffix, se->getContLen())) || (ppfx && !((ep->getCont()) && TESTAFF(ep->getCont(), needaffix, ep->getContLen()))) ) ) { rv = se->checkword(word,len, sfxopts, ppfx, wlst, maxSug, ns, (FLAG) cclass, needflag, (in_compound ? 0 : onlyincompound)); if (rv) { sfx=(AffEntry *)se; // BUG: sfx not stateless return rv; } } } se = se->getNext(); } // now handle the general case unsigned char sp = *((const unsigned char *)(word + len - 1)); SfxEntry * sptr = (SfxEntry *) sStart[sp]; while (sptr) { if (isRevSubset(sptr->getKey(), word + len - 1, len) ) { // suffixes are not allowed in beginning of compounds if ((((in_compound != IN_CPD_BEGIN)) || // && !cclass // except when signed with compoundpermitflag flag (sptr->getCont() && compoundpermitflag && TESTAFF(sptr->getCont(),compoundpermitflag,sptr->getContLen()))) && (!circumfix || // no circumfix flag in prefix and suffix ((!ppfx || !(ep->getCont()) || !TESTAFF(ep->getCont(), circumfix, ep->getContLen())) && (!sptr->getCont() || !(TESTAFF(sptr->getCont(),circumfix,sptr->getContLen())))) || // circumfix flag in prefix AND suffix ((ppfx && (ep->getCont()) && TESTAFF(ep->getCont(), circumfix, ep->getContLen())) && (sptr->getCont() && (TESTAFF(sptr->getCont(),circumfix,sptr->getContLen()))))) && // fogemorpheme (in_compound || !((sptr->getCont() && (TESTAFF(sptr->getCont(), onlyincompound, sptr->getContLen()))))) && // needaffix on prefix or first suffix (cclass || !(sptr->getCont() && TESTAFF(sptr->getCont(), needaffix, sptr->getContLen())) || (ppfx && !((ep->getCont()) && TESTAFF(ep->getCont(), needaffix, ep->getContLen()))) ) ) { rv = sptr->checkword(word,len, sfxopts, ppfx, wlst, maxSug, ns, cclass, needflag, (in_compound ? 0 : onlyincompound)); if (rv) { sfx=(AffEntry *)sptr; // BUG: sfx not stateless sfxflag = sptr->getFlag(); // BUG: sfxflag not stateless if (!sptr->getCont()) sfxappnd=sptr->getKey(); // BUG: sfxappnd not stateless if (cclass || sptr->getCont()) { if (!derived) { derived = mystrdup(word); } else { strcat(result, " "); strcpy(result, MORPH_STEM); strcpy(result, derived); // XXX check size strcat(result, "\n"); strcat(result, " "); strcat(result, MORPH_STEM); strcat(result, word); // store the pointer of the hash entry // sprintf(result + strlen(result), " %s%p", MORPH_HENTRY, rv); free(derived); derived = mystrdup(result); } } return rv; } } sptr = sptr->getNextEQ(); } else { sptr = sptr->getNextNE(); } } return NULL; } // check word for two-level suffixes struct hentry * AffixMgr::suffix_check_twosfx(const char * word, int len, int sfxopts, AffEntry * ppfx, const FLAG needflag) { struct hentry * rv = NULL; // first handle the special case of 0 length suffixes SfxEntry * se = (SfxEntry *) sStart[0]; while (se) { if (contclasses[se->getFlag()]) { rv = se->check_twosfx(word,len, sfxopts, ppfx, needflag); if (rv) return rv; } se = se->getNext(); } // now handle the general case unsigned char sp = *((const unsigned char *)(word + len - 1)); SfxEntry * sptr = (SfxEntry *) sStart[sp]; while (sptr) { if (isRevSubset(sptr->getKey(), word + len - 1, len)) { if (contclasses[sptr->getFlag()]) { rv = sptr->check_twosfx(word,len, sfxopts, ppfx, needflag); if (rv) { sfxflag = sptr->getFlag(); // BUG: sfxflag not stateless if (!sptr->getCont()) sfxappnd=sptr->getKey(); // BUG: sfxappnd not stateless return rv; } } sptr = sptr->getNextEQ(); } else { sptr = sptr->getNextNE(); } } return NULL; } char * AffixMgr::suffix_check_twosfx_morph(const char * word, int len, int sfxopts, AffEntry * ppfx, const FLAG needflag) { char result[MAXLNLEN]; char result2[MAXLNLEN]; char result3[MAXLNLEN]; char * st; result[0] = '\0'; result2[0] = '\0'; result3[0] = '\0'; // first handle the special case of 0 length suffixes SfxEntry * se = (SfxEntry *) sStart[0]; while (se) { if (contclasses[se->getFlag()]) { st = se->check_twosfx_morph(word,len, sfxopts, ppfx, needflag); if (st) { if (ppfx) { if (((PfxEntry *) ppfx)->getMorph()) { strcat(result, ((PfxEntry *) ppfx)->getMorph()); strcat(result, " "); } else debugflag(result, ((PfxEntry *) ppfx)->getFlag()); } strcat(result, st); free(st); if (se->getMorph()) { strcat(result, " "); strcat(result, se->getMorph()); } else debugflag(result, se->getFlag()); strcat(result, "\n"); } } se = se->getNext(); } // now handle the general case unsigned char sp = *((const unsigned char *)(word + len - 1)); SfxEntry * sptr = (SfxEntry *) sStart[sp]; while (sptr) { if (isRevSubset(sptr->getKey(), word + len - 1, len)) { if (contclasses[sptr->getFlag()]) { st = sptr->check_twosfx_morph(word,len, sfxopts, ppfx, needflag); if (st) { sfxflag = sptr->getFlag(); // BUG: sfxflag not stateless if (!sptr->getCont()) sfxappnd=sptr->getKey(); // BUG: sfxappnd not stateless strcpy(result2, st); free(st); result3[0] = '\0'; #ifdef DEBUG unsigned short flag = sptr->getFlag(); if (flag_mode == FLAG_NUM) { sprintf(result3, "<%d>", sptr->getKey()); } else if (flag_mode == FLAG_LONG) { sprintf(result3, "<%c%c>", flag >> 8, (flag << 8) >>8); } else sprintf(result3, "<%c>", flag); strcat(result3, ":"); #endif if (sptr->getMorph()) { strcat(result3, " "); strcat(result3, sptr->getMorph()); } else debugflag(result3, sptr->getFlag()); strlinecat(result2, result3); strcat(result2, "\n"); strcat(result, result2); } } sptr = sptr->getNextEQ(); } else { sptr = sptr->getNextNE(); } } if (*result) return mystrdup(result); return NULL; } char * AffixMgr::suffix_check_morph(const char * word, int len, int sfxopts, AffEntry * ppfx, const FLAG cclass, const FLAG needflag, char in_compound) { char result[MAXLNLEN]; struct hentry * rv = NULL; result[0] = '\0'; PfxEntry* ep = (PfxEntry *) ppfx; // first handle the special case of 0 length suffixes SfxEntry * se = (SfxEntry *) sStart[0]; while (se) { if (!cclass || se->getCont()) { // suffixes are not allowed in beginning of compounds if (((((in_compound != IN_CPD_BEGIN)) || // && !cclass // except when signed with compoundpermitflag flag (se->getCont() && compoundpermitflag && TESTAFF(se->getCont(),compoundpermitflag,se->getContLen()))) && (!circumfix || // no circumfix flag in prefix and suffix ((!ppfx || !(ep->getCont()) || !TESTAFF(ep->getCont(), circumfix, ep->getContLen())) && (!se->getCont() || !(TESTAFF(se->getCont(),circumfix,se->getContLen())))) || // circumfix flag in prefix AND suffix ((ppfx && (ep->getCont()) && TESTAFF(ep->getCont(), circumfix, ep->getContLen())) && (se->getCont() && (TESTAFF(se->getCont(),circumfix,se->getContLen()))))) && // fogemorpheme (in_compound || !((se->getCont() && (TESTAFF(se->getCont(), onlyincompound, se->getContLen()))))) && // needaffix on prefix or first suffix (cclass || !(se->getCont() && TESTAFF(se->getCont(), needaffix, se->getContLen())) || (ppfx && !((ep->getCont()) && TESTAFF(ep->getCont(), needaffix, ep->getContLen()))) ) )) rv = se->checkword(word,len, sfxopts, ppfx, NULL, 0, 0, cclass, needflag); while (rv) { if (ppfx) { if (((PfxEntry *) ppfx)->getMorph()) { strcat(result, ((PfxEntry *) ppfx)->getMorph()); strcat(result, " "); } else debugflag(result, ((PfxEntry *) ppfx)->getFlag()); } if (complexprefixes && HENTRY_DATA(rv)) strcat(result, HENTRY_DATA2(rv)); if (! HENTRY_FIND(rv, MORPH_STEM)) { strcat(result, " "); strcat(result, MORPH_STEM); strcat(result, HENTRY_WORD(rv)); } // store the pointer of the hash entry // sprintf(result + strlen(result), " %s%p", MORPH_HENTRY, rv); if (!complexprefixes && HENTRY_DATA(rv)) { strcat(result, " "); strcat(result, HENTRY_DATA2(rv)); } if (se->getMorph()) { strcat(result, " "); strcat(result, se->getMorph()); } else debugflag(result, se->getFlag()); strcat(result, "\n"); rv = se->get_next_homonym(rv, sfxopts, ppfx, cclass, needflag); } } se = se->getNext(); } // now handle the general case unsigned char sp = *((const unsigned char *)(word + len - 1)); SfxEntry * sptr = (SfxEntry *) sStart[sp]; while (sptr) { if (isRevSubset(sptr->getKey(), word + len - 1, len) ) { // suffixes are not allowed in beginning of compounds if (((((in_compound != IN_CPD_BEGIN)) || // && !cclass // except when signed with compoundpermitflag flag (sptr->getCont() && compoundpermitflag && TESTAFF(sptr->getCont(),compoundpermitflag,sptr->getContLen()))) && (!circumfix || // no circumfix flag in prefix and suffix ((!ppfx || !(ep->getCont()) || !TESTAFF(ep->getCont(), circumfix, ep->getContLen())) && (!sptr->getCont() || !(TESTAFF(sptr->getCont(),circumfix,sptr->getContLen())))) || // circumfix flag in prefix AND suffix ((ppfx && (ep->getCont()) && TESTAFF(ep->getCont(), circumfix, ep->getContLen())) && (sptr->getCont() && (TESTAFF(sptr->getCont(),circumfix,sptr->getContLen()))))) && // fogemorpheme (in_compound || !((sptr->getCont() && (TESTAFF(sptr->getCont(), onlyincompound, sptr->getContLen()))))) && // needaffix on first suffix (cclass || !(sptr->getCont() && TESTAFF(sptr->getCont(), needaffix, sptr->getContLen()))) )) rv = sptr->checkword(word,len, sfxopts, ppfx, NULL, 0, 0, cclass, needflag); while (rv) { if (ppfx) { if (((PfxEntry *) ppfx)->getMorph()) { strcat(result, ((PfxEntry *) ppfx)->getMorph()); strcat(result, " "); } else debugflag(result, ((PfxEntry *) ppfx)->getFlag()); } if (complexprefixes && HENTRY_DATA(rv)) strcat(result, HENTRY_DATA2(rv)); if (! HENTRY_FIND(rv, MORPH_STEM)) { strcat(result, " "); strcat(result, MORPH_STEM); strcat(result, HENTRY_WORD(rv)); } // store the pointer of the hash entry // sprintf(result + strlen(result), " %s%p", MORPH_HENTRY, rv); if (!complexprefixes && HENTRY_DATA(rv)) { strcat(result, " "); strcat(result, HENTRY_DATA2(rv)); } #ifdef DEBUG unsigned short flag = sptr->getFlag(); if (flag_mode == FLAG_NUM) { sprintf(result, "<%d>", sptr->getKey()); } else if (flag_mode == FLAG_LONG) { sprintf(result, "<%c%c>", flag >> 8, (flag << 8) >>8); } else sprintf(result, "<%c>", flag); strcat(result, ":"); #endif if (sptr->getMorph()) { strcat(result, " "); strcat(result, sptr->getMorph()); } else debugflag(result, sptr->getFlag()); strcat(result, "\n"); rv = sptr->get_next_homonym(rv, sfxopts, ppfx, cclass, needflag); } sptr = sptr->getNextEQ(); } else { sptr = sptr->getNextNE(); } } if (*result) return mystrdup(result); return NULL; } // check if word with affixes is correctly spelled struct hentry * AffixMgr::affix_check (const char * word, int len, const FLAG needflag, char in_compound) { struct hentry * rv= NULL; if (derived) free(derived); derived = NULL; // check all prefixes (also crossed with suffixes if allowed) rv = prefix_check(word, len, in_compound, needflag); if (rv) return rv; // if still not found check all suffixes rv = suffix_check(word, len, 0, NULL, NULL, 0, NULL, FLAG_NULL, needflag, in_compound); if (havecontclass) { sfx = NULL; pfx = NULL; if (rv) return rv; // if still not found check all two-level suffixes rv = suffix_check_twosfx(word, len, 0, NULL, needflag); if (rv) return rv; // if still not found check all two-level suffixes rv = prefix_check_twosfx(word, len, IN_CPD_NOT, needflag); } return rv; } // check if word with affixes is correctly spelled char * AffixMgr::affix_check_morph(const char * word, int len, const FLAG needflag, char in_compound) { char result[MAXLNLEN]; char * st = NULL; *result = '\0'; // check all prefixes (also crossed with suffixes if allowed) st = prefix_check_morph(word, len, in_compound); if (st) { strcat(result, st); free(st); } // if still not found check all suffixes st = suffix_check_morph(word, len, 0, NULL, '\0', needflag, in_compound); if (st) { strcat(result, st); free(st); } if (havecontclass) { sfx = NULL; pfx = NULL; // if still not found check all two-level suffixes st = suffix_check_twosfx_morph(word, len, 0, NULL, needflag); if (st) { strcat(result, st); free(st); } // if still not found check all two-level suffixes st = prefix_check_twosfx_morph(word, len, IN_CPD_NOT, needflag); if (st) { strcat(result, st); free(st); } } return mystrdup(result); } char * AffixMgr::morphgen(char * ts, int wl, const unsigned short * ap, unsigned short al, char * morph, char * targetmorph, int level) { // handle suffixes char * stemmorph; char * stemmorphcatpos; char mymorph[MAXLNLEN]; if (!morph && !targetmorph) return NULL; // check substandard flag if (TESTAFF(ap, substandard, al)) return NULL; if (morphcmp(morph, targetmorph) == 0) return mystrdup(ts); // int targetcount = get_sfxcount(targetmorph); // use input suffix fields, if exist if (strstr(morph, MORPH_INFL_SFX) || strstr(morph, MORPH_DERI_SFX)) { stemmorph = mymorph; strcpy(stemmorph, morph); strcat(stemmorph, " "); stemmorphcatpos = stemmorph + strlen(stemmorph); } else { stemmorph = morph; stemmorphcatpos = NULL; } for (int i = 0; i < al; i++) { const unsigned char c = (unsigned char) (ap[i] & 0x00FF); SfxEntry * sptr = (SfxEntry *)sFlag[c]; while (sptr) { if (sptr->getFlag() == ap[i] && ((sptr->getContLen() == 0) || // don't generate forms with substandard affixes !TESTAFF(sptr->getCont(), substandard, sptr->getContLen()))) { if (stemmorphcatpos) strcpy(stemmorphcatpos, sptr->getMorph()); else stemmorph = (char *) sptr->getMorph(); int cmp = morphcmp(stemmorph, targetmorph); if (cmp == 0) { char * newword = sptr->add(ts, wl); if (newword) { hentry * check = pHMgr->lookup(newword); // XXX extra dic if (!check || !check->astr || !TESTAFF(check->astr, forbiddenword, check->alen)) { return newword; } free(newword); } } // recursive call for secondary suffixes if ((level == 0) && (cmp == 1) && (sptr->getContLen() > 0) && // (get_sfxcount(stemmorph) < targetcount) && !TESTAFF(sptr->getCont(), substandard, sptr->getContLen())) { char * newword = sptr->add(ts, wl); if (newword) { char * newword2 = morphgen(newword, strlen(newword), sptr->getCont(), sptr->getContLen(), stemmorph, targetmorph, 1); if (newword2) { free(newword); return newword2; } free(newword); newword = NULL; } } } sptr = (SfxEntry *)sptr ->getFlgNxt(); } } return NULL; } int AffixMgr::expand_rootword(struct guessword * wlst, int maxn, const char * ts, int wl, const unsigned short * ap, unsigned short al, char * bad, int badl, char * phon) { int nh=0; // first add root word to list if ((nh < maxn) && !(al && ((needaffix && TESTAFF(ap, needaffix, al)) || (onlyincompound && TESTAFF(ap, onlyincompound, al))))) { wlst[nh].word = mystrdup(ts); if (!wlst[nh].word) return 0; wlst[nh].allow = (1 == 0); wlst[nh].orig = NULL; nh++; // add special phonetic version if (phon && (nh < maxn)) { wlst[nh].word = mystrdup(phon); if (!wlst[nh].word) return nh - 1; wlst[nh].allow = (1 == 0); wlst[nh].orig = mystrdup(ts); if (!wlst[nh].orig) return nh - 1; nh++; } } // handle suffixes for (int i = 0; i < al; i++) { const unsigned char c = (unsigned char) (ap[i] & 0x00FF); SfxEntry * sptr = (SfxEntry *)sFlag[c]; while (sptr) { if ((sptr->getFlag() == ap[i]) && (!sptr->getKeyLen() || ((badl > sptr->getKeyLen()) && (strcmp(sptr->getAffix(), bad + badl - sptr->getKeyLen()) == 0))) && // check needaffix flag !(sptr->getCont() && ((needaffix && TESTAFF(sptr->getCont(), needaffix, sptr->getContLen())) || (circumfix && TESTAFF(sptr->getCont(), circumfix, sptr->getContLen())) || (onlyincompound && TESTAFF(sptr->getCont(), onlyincompound, sptr->getContLen())))) ) { char * newword = sptr->add(ts, wl); if (newword) { if (nh < maxn) { wlst[nh].word = newword; wlst[nh].allow = sptr->allowCross(); wlst[nh].orig = NULL; nh++; // add special phonetic version if (phon && (nh < maxn)) { char st[MAXWORDUTF8LEN]; strcpy(st, phon); strcat(st, sptr->getKey()); reverseword(st + strlen(phon)); wlst[nh].word = mystrdup(st); if (!wlst[nh].word) return nh - 1; wlst[nh].allow = (1 == 0); wlst[nh].orig = mystrdup(newword); if (!wlst[nh].orig) return nh - 1; nh++; } } else { free(newword); } } } sptr = (SfxEntry *)sptr ->getFlgNxt(); } } int n = nh; // handle cross products of prefixes and suffixes for (int j=1;jgetFlag() == ap[k]) && cptr->allowCross() && (!cptr->getKeyLen() || ((badl > cptr->getKeyLen()) && (strncmp(cptr->getKey(), bad, cptr->getKeyLen()) == 0)))) { int l1 = strlen(wlst[j].word); char * newword = cptr->add(wlst[j].word, l1); if (newword) { if (nh < maxn) { wlst[nh].word = newword; wlst[nh].allow = cptr->allowCross(); wlst[nh].orig = NULL; nh++; } else { free(newword); } } } cptr = (PfxEntry *)cptr ->getFlgNxt(); } } } // now handle pure prefixes for (int m = 0; m < al; m ++) { const unsigned char c = (unsigned char) (ap[m] & 0x00FF); PfxEntry * ptr = (PfxEntry *) pFlag[c]; while (ptr) { if ((ptr->getFlag() == ap[m]) && (!ptr->getKeyLen() || ((badl > ptr->getKeyLen()) && (strncmp(ptr->getKey(), bad, ptr->getKeyLen()) == 0))) && // check needaffix flag !(ptr->getCont() && ((needaffix && TESTAFF(ptr->getCont(), needaffix, ptr->getContLen())) || (circumfix && TESTAFF(ptr->getCont(), circumfix, ptr->getContLen())) || (onlyincompound && TESTAFF(ptr->getCont(), onlyincompound, ptr->getContLen())))) ) { char * newword = ptr->add(ts, wl); if (newword) { if (nh < maxn) { wlst[nh].word = newword; wlst[nh].allow = ptr->allowCross(); wlst[nh].orig = NULL; nh++; } else { free(newword); } } } ptr = (PfxEntry *)ptr ->getFlgNxt(); } } return nh; } // return length of replacing table int AffixMgr::get_numrep() { return numrep; } // return replacing table struct replentry * AffixMgr::get_reptable() { if (! reptable ) return NULL; return reptable; } // return replacing table struct phonetable * AffixMgr::get_phonetable() { if (! phone ) return NULL; return phone; } // return length of character map table int AffixMgr::get_nummap() { return nummap; } // return character map table struct mapentry * AffixMgr::get_maptable() { if (! maptable ) return NULL; return maptable; } // return length of word break table int AffixMgr::get_numbreak() { return numbreak; } // return character map table char ** AffixMgr::get_breaktable() { if (! breaktable ) return NULL; return breaktable; } // return text encoding of dictionary char * AffixMgr::get_encoding() { if (! encoding ) encoding = mystrdup(SPELL_ENCODING); return mystrdup(encoding); } // return text encoding of dictionary int AffixMgr::get_langnum() { return langnum; } // return double prefix option int AffixMgr::get_complexprefixes() { return complexprefixes; } FLAG AffixMgr::get_keepcase() { return keepcase; } int AffixMgr::get_checksharps() { return checksharps; } char * AffixMgr::encode_flag(unsigned short aflag) { return pHMgr->encode_flag(aflag); } // return the preferred ignore string for suggestions char * AffixMgr::get_ignore() { if (!ignorechars) return NULL; return ignorechars; } // return the preferred ignore string for suggestions unsigned short * AffixMgr::get_ignore_utf16(int * len) { *len = ignorechars_utf16_len; return ignorechars_utf16; } // return the keyboard string for suggestions char * AffixMgr::get_key_string() { if (! keystring ) keystring = mystrdup(SPELL_KEYSTRING); return mystrdup(keystring); } // return the preferred try string for suggestions char * AffixMgr::get_try_string() { if (! trystring ) return NULL; return mystrdup(trystring); } // return the preferred try string for suggestions const char * AffixMgr::get_wordchars() { return wordchars; } unsigned short * AffixMgr::get_wordchars_utf16(int * len) { *len = wordchars_utf16_len; return wordchars_utf16; } // is there compounding? int AffixMgr::get_compound() { return compoundflag || compoundbegin || numdefcpd; } // return the compound words control flag FLAG AffixMgr::get_compoundflag() { return compoundflag; } // return the forbidden words control flag FLAG AffixMgr::get_forbiddenword() { return forbiddenword; } // return the forbidden words control flag FLAG AffixMgr::get_nosuggest() { return nosuggest; } // return the forbidden words flag modify flag FLAG AffixMgr::get_needaffix() { return needaffix; } // return the onlyincompound flag FLAG AffixMgr::get_onlyincompound() { return onlyincompound; } // return the compound word signal flag FLAG AffixMgr::get_compoundroot() { return compoundroot; } // return the compound begin signal flag FLAG AffixMgr::get_compoundbegin() { return compoundbegin; } // return the value of checknum int AffixMgr::get_checknum() { return checknum; } // return the value of prefix const char * AffixMgr::get_prefix() { if (pfx) return ((PfxEntry *)pfx)->getKey(); return NULL; } // return the value of suffix const char * AffixMgr::get_suffix() { return sfxappnd; } // return the value of derived form (base word with first suffix). const char * AffixMgr::get_derived() { return derived; } // return the value of suffix const char * AffixMgr::get_version() { return version; } // return lemma_present flag FLAG AffixMgr::get_lemma_present() { return lemma_present; } // utility method to look up root words in hash table struct hentry * AffixMgr::lookup(const char * word) { int i; struct hentry * he = NULL; for (i = 0; i < *maxdic && !he; i++) { he = (alldic[i])->lookup(word); } return he; } // return the value of suffix const int AffixMgr::have_contclass() { return havecontclass; } // return utf8 int AffixMgr::get_utf8() { return utf8; } // return nosplitsugs int AffixMgr::get_maxngramsugs(void) { return maxngramsugs; } // return nosplitsugs int AffixMgr::get_nosplitsugs(void) { return nosplitsugs; } // return sugswithdots int AffixMgr::get_sugswithdots(void) { return sugswithdots; } /* parse flag */ int AffixMgr::parse_flag(char * line, unsigned short * out, const char * name) { char * s = NULL; if (*out != FLAG_NULL && !(*out >= DEFAULTFLAGS)) { HUNSPELL_WARNING(stderr, "error: duplicate %s line\n", name); return 1; } if (parse_string(line, &s, name)) return 1; *out = pHMgr->decode_flag(s); free(s); return 0; } /* parse num */ int AffixMgr::parse_num(char * line, int * out, const char * name) { char * s = NULL; if (*out != -1) { HUNSPELL_WARNING(stderr, "error: duplicate %s line\n", name); return 1; } if (parse_string(line, &s, name)) return 1; *out = atoi(s); free(s); return 0; } /* parse in the max syllablecount of compound words and */ int AffixMgr::parse_cpdsyllable(char * line) { char * tp = line; char * piece; int i = 0; int np = 0; w_char w[MAXWORDLEN]; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { np++; break; } case 1: { cpdmaxsyllable = atoi(piece); np++; break; } case 2: { if (!utf8) { cpdvowels = mystrdup(piece); } else { int n = u8_u16(w, MAXWORDLEN, piece); if (n > 0) { flag_qsort((unsigned short *) w, 0, n); cpdvowels_utf16 = (w_char *) malloc(n * sizeof(w_char)); if (!cpdvowels_utf16) return 1; memcpy(cpdvowels_utf16, w, n * sizeof(w_char)); } cpdvowels_utf16_len = n; } np++; break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (np < 2) { HUNSPELL_WARNING(stderr, "error: missing compoundsyllable information\n"); return 1; } if (np == 2) cpdvowels = mystrdup("aeiouAEIOU"); return 0; } /* parse in the typical fault correcting table */ int AffixMgr::parse_reptable(char * line, FileMgr * af) { if (numrep != 0) { HUNSPELL_WARNING(stderr, "error: duplicate REP tables used\n"); return 1; } char * tp = line; char * piece; int i = 0; int np = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { np++; break; } case 1: { numrep = atoi(piece); if (numrep < 1) { HUNSPELL_WARNING(stderr, "incorrect number of entries in replacement table\n"); return 1; } reptable = (replentry *) malloc(numrep * sizeof(struct replentry)); if (!reptable) return 1; np++; break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (np != 2) { HUNSPELL_WARNING(stderr, "error: missing replacement table information\n"); return 1; } /* now parse the numrep lines to read in the remainder of the table */ char * nl; for (int j=0; j < numrep; j++) { if (!(nl = af->getline())) return 1; mychomp(nl); tp = nl; i = 0; reptable[j].pattern = NULL; reptable[j].pattern2 = NULL; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { if (strncmp(piece,"REP",3) != 0) { HUNSPELL_WARNING(stderr, "error: replacement table is corrupt\n"); numrep = 0; return 1; } break; } case 1: { reptable[j].pattern = mystrrep(mystrdup(piece),"_"," "); break; } case 2: { reptable[j].pattern2 = mystrrep(mystrdup(piece),"_"," "); break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if ((!(reptable[j].pattern)) || (!(reptable[j].pattern2))) { HUNSPELL_WARNING(stderr, "error: replacement table is corrupt\n"); numrep = 0; return 1; } } return 0; } /* parse in the typical fault correcting table */ int AffixMgr::parse_phonetable(char * line, FileMgr * af) { if (phone) { HUNSPELL_WARNING(stderr, "error: duplicate PHONE tables used\n"); return 1; } char * tp = line; char * piece; int i = 0; int np = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { np++; break; } case 1: { phone = (phonetable *) malloc(sizeof(struct phonetable)); phone->num = atoi(piece); phone->rules = NULL; phone->utf8 = (char) utf8; if (!phone) return 1; if (phone->num < 1) { HUNSPELL_WARNING(stderr, "incorrect number of entries in phonelacement table\n"); return 1; } phone->rules = (char * *) malloc(2 * (phone->num + 1) * sizeof(char *)); if (!phone->rules) return 1; np++; break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (np != 2) { HUNSPELL_WARNING(stderr, "error: missing PHONE table information\n"); return 1; } /* now parse the phone->num lines to read in the remainder of the table */ char * nl; for (int j=0; j < phone->num; j++) { if (!(nl = af->getline())) return 1; mychomp(nl); tp = nl; i = 0; phone->rules[j * 2] = NULL; phone->rules[j * 2 + 1] = NULL; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { if (strncmp(piece,"PHONE",5) != 0) { HUNSPELL_WARNING(stderr, "error: PHONE table is corrupt\n"); phone->num = 0; return 1; } break; } case 1: { phone->rules[j * 2] = mystrrep(mystrdup(piece),"_",""); break; } case 2: { phone->rules[j * 2 + 1] = mystrrep(mystrdup(piece),"_",""); break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if ((!(phone->rules[j * 2])) || (!(phone->rules[j * 2 + 1]))) { HUNSPELL_WARNING(stderr, "error: PHONE table is corrupt\n"); phone->num = 0; return 1; } } phone->rules[phone->num * 2] = mystrdup(""); phone->rules[phone->num * 2 + 1] = mystrdup(""); init_phonet_hash(*phone); return 0; } /* parse in the checkcompoundpattern table */ int AffixMgr::parse_checkcpdtable(char * line, FileMgr * af) { if (numcheckcpd != 0) { HUNSPELL_WARNING(stderr, "error: duplicate compound pattern tables used\n"); return 1; } char * tp = line; char * piece; int i = 0; int np = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { np++; break; } case 1: { numcheckcpd = atoi(piece); if (numcheckcpd < 1) { HUNSPELL_WARNING(stderr, "incorrect number of entries in compound pattern table\n"); return 1; } checkcpdtable = (replentry *) malloc(numcheckcpd * sizeof(struct replentry)); if (!checkcpdtable) return 1; np++; break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (np != 2) { HUNSPELL_WARNING(stderr, "error: missing compound pattern table information\n"); return 1; } /* now parse the numcheckcpd lines to read in the remainder of the table */ char * nl; for (int j=0; j < numcheckcpd; j++) { if (!(nl = af->getline())) return 1; mychomp(nl); tp = nl; i = 0; checkcpdtable[j].pattern = NULL; checkcpdtable[j].pattern2 = NULL; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { if (strncmp(piece,"CHECKCOMPOUNDPATTERN",20) != 0) { HUNSPELL_WARNING(stderr, "error: compound pattern table is corrupt\n"); numcheckcpd = 0; return 1; } break; } case 1: { checkcpdtable[j].pattern = mystrdup(piece); break; } case 2: { checkcpdtable[j].pattern2 = mystrdup(piece); break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if ((!(checkcpdtable[j].pattern)) || (!(checkcpdtable[j].pattern2))) { HUNSPELL_WARNING(stderr, "error: compound pattern table is corrupt\n"); numcheckcpd = 0; return 1; } } return 0; } /* parse in the compound rule table */ int AffixMgr::parse_defcpdtable(char * line, FileMgr * af) { if (numdefcpd != 0) { HUNSPELL_WARNING(stderr, "error: duplicate compound rule tables used\n"); return 1; } char * tp = line; char * piece; int i = 0; int np = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { np++; break; } case 1: { numdefcpd = atoi(piece); if (numdefcpd < 1) { HUNSPELL_WARNING(stderr, "incorrect number of entries in compound rule table\n"); return 1; } defcpdtable = (flagentry *) malloc(numdefcpd * sizeof(flagentry)); if (!defcpdtable) return 1; np++; break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (np != 2) { HUNSPELL_WARNING(stderr, "error: missing compound rule table information\n"); return 1; } /* now parse the numdefcpd lines to read in the remainder of the table */ char * nl; for (int j=0; j < numdefcpd; j++) { if (!(nl = af->getline())) return 1; mychomp(nl); tp = nl; i = 0; defcpdtable[j].def = NULL; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { if (strncmp(piece, "COMPOUNDRULE", 12) != 0) { HUNSPELL_WARNING(stderr, "error: compound rule table is corrupt\n"); numdefcpd = 0; return 1; } break; } case 1: { defcpdtable[j].len = pHMgr->decode_flags(&(defcpdtable[j].def), piece); break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (!defcpdtable[j].len) { HUNSPELL_WARNING(stderr, "error: compound rule table is corrupt\n"); numdefcpd = 0; return 1; } } return 0; } /* parse in the character map table */ int AffixMgr::parse_maptable(char * line, FileMgr * af) { if (nummap != 0) { HUNSPELL_WARNING(stderr, "error: duplicate MAP tables used\n"); return 1; } char * tp = line; char * piece; int i = 0; int np = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { np++; break; } case 1: { nummap = atoi(piece); if (nummap < 1) { HUNSPELL_WARNING(stderr, "incorrect number of entries in map table\n"); return 1; } maptable = (mapentry *) malloc(nummap * sizeof(struct mapentry)); if (!maptable) return 1; np++; break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (np != 2) { HUNSPELL_WARNING(stderr, "error: missing map table information\n"); return 1; } /* now parse the nummap lines to read in the remainder of the table */ char * nl; for (int j=0; j < nummap; j++) { if (!(nl = af->getline())) return 1; mychomp(nl); tp = nl; i = 0; maptable[j].set = NULL; maptable[j].len = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { if (strncmp(piece,"MAP",3) != 0) { HUNSPELL_WARNING(stderr, "error: map table is corrupt\n"); nummap = 0; return 1; } break; } case 1: { maptable[j].len = 0; maptable[j].set = NULL; maptable[j].set_utf16 = NULL; if (!utf8) { maptable[j].set = mystrdup(piece); maptable[j].len = strlen(maptable[j].set); } else { w_char w[MAXWORDLEN]; int n = u8_u16(w, MAXWORDLEN, piece); if (n > 0) { flag_qsort((unsigned short *) w, 0, n); maptable[j].set_utf16 = (w_char *) malloc(n * sizeof(w_char)); if (!maptable[j].set_utf16) return 1; memcpy(maptable[j].set_utf16, w, n * sizeof(w_char)); } maptable[j].len = n; } break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if ((!(maptable[j].set || maptable[j].set_utf16)) || (!(maptable[j].len))) { HUNSPELL_WARNING(stderr, "error: map table is corrupt\n"); nummap = 0; return 1; } } return 0; } /* parse in the word breakpoint table */ int AffixMgr::parse_breaktable(char * line, FileMgr * af) { if (numbreak != 0) { HUNSPELL_WARNING(stderr, "error: duplicate word breakpoint tables used\n"); return 1; } char * tp = line; char * piece; int i = 0; int np = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { np++; break; } case 1: { numbreak = atoi(piece); if (numbreak < 1) { HUNSPELL_WARNING(stderr, "incorrect number of entries in BREAK table\n"); return 1; } breaktable = (char **) malloc(numbreak * sizeof(char *)); if (!breaktable) return 1; np++; break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (np != 2) { HUNSPELL_WARNING(stderr, "error: missing word breakpoint table information\n"); return 1; } /* now parse the numbreak lines to read in the remainder of the table */ char * nl; for (int j=0; j < numbreak; j++) { if (!(nl = af->getline())) return 1; mychomp(nl); tp = nl; i = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { if (strncmp(piece,"BREAK",5) != 0) { HUNSPELL_WARNING(stderr, "error: BREAK table is corrupt\n"); numbreak = 0; return 1; } break; } case 1: { breaktable[j] = mystrdup(piece); break; } default: break; } i++; } piece = mystrsep(&tp, 0); } if (!breaktable) { HUNSPELL_WARNING(stderr, "error: BREAK table is corrupt\n"); numbreak = 0; return 1; } } return 0; } void AffixMgr::reverse_condition(char * piece) { int neg = 0; for (char * k = piece + strlen(piece) - 1; k >= piece; k--) { switch(*k) { case '[': { if (neg) *(k+1) = '['; else *k = ']'; break; } case ']': { *k = '['; if (neg) *(k+1) = '^'; neg = 0; break; } case '^': { if (*(k+1) == ']') neg = 1; else *(k+1) = *k; break; } default: { if (neg) *(k+1) = *k; } } } } int AffixMgr::parse_affix(char * line, const char at, FileMgr * af, char * dupflags) { int numents = 0; // number of affentry structures to parse unsigned short aflag = 0; // affix char identifier char ff=0; struct affentry * ptr= NULL; struct affentry * nptr= NULL; char * tp = line; char * nl = line; char * piece; int i = 0; // checking lines with bad syntax #ifdef DEBUG int basefieldnum = 0; #endif // split affix header line into pieces int np = 0; piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { // piece 1 - is type of affix case 0: { np++; break; } // piece 2 - is affix char case 1: { np++; aflag = pHMgr->decode_flag(piece); if (((at == 'S') && (dupflags[aflag] & dupSFX)) || ((at == 'P') && (dupflags[aflag] & dupPFX))) { HUNSPELL_WARNING(stderr, "error: duplicate affix flag %s in line %s\n", piece, nl); // return 1; XXX permissive mode for bad dictionaries } dupflags[aflag] += (char) ((at == 'S') ? dupSFX : dupPFX); break; } // piece 3 - is cross product indicator case 2: { np++; if (*piece == 'Y') ff = aeXPRODUCT; break; } // piece 4 - is number of affentries case 3: { np++; numents = atoi(piece); if (numents == 0) { char * err = pHMgr->encode_flag(aflag); if (err) { HUNSPELL_WARNING(stderr, "error: affix %s header has incorrect entry count in line %s\n", err, nl); free(err); } return 1; } ptr = (struct affentry *) malloc(numents * sizeof(struct affentry)); if (!ptr) return 1; ptr->opts = ff; if (utf8) ptr->opts += aeUTF8; if (pHMgr->is_aliasf()) ptr->opts += aeALIASF; if (pHMgr->is_aliasm()) ptr->opts += aeALIASM; ptr->aflag = aflag; } default: break; } i++; } piece = mystrsep(&tp, 0); } // check to make sure we parsed enough pieces if (np != 4) { char * err = pHMgr->encode_flag(aflag); if (err) { HUNSPELL_WARNING(stderr, "error: affix %s header has insufficient data in line %s\n", err, nl); free(err); } free(ptr); return 1; } // store away ptr to first affentry nptr = ptr; // now parse numents affentries for this affix for (int j=0; j < numents; j++) { if (!(nl = af->getline())) return 1; mychomp(nl); tp = nl; i = 0; np = 0; // split line into pieces piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { // piece 1 - is type case 0: { np++; if (nptr != ptr) nptr->opts = ptr->opts & (char) (aeXPRODUCT + aeUTF8 + aeALIASF + aeALIASM); break; } // piece 2 - is affix char case 1: { np++; if (pHMgr->decode_flag(piece) != aflag) { char * err = pHMgr->encode_flag(aflag); if (err) { HUNSPELL_WARNING(stderr, "error: affix %s is corrupt near line %s\n", err, nl); HUNSPELL_WARNING(stderr, "error: possible incorrect count\n"); free(err); } return 1; } if (nptr != ptr) nptr->aflag = ptr->aflag; break; } // piece 3 - is string to strip or 0 for null case 2: { np++; if (complexprefixes) { if (utf8) reverseword_utf(piece); else reverseword(piece); } nptr->strip = mystrdup(piece); nptr->stripl = (unsigned char) strlen(nptr->strip); if (strcmp(nptr->strip,"0") == 0) { free(nptr->strip); nptr->strip=mystrdup(""); nptr->stripl = 0; } break; } // piece 4 - is affix string or 0 for null case 3: { char * dash; nptr->morphcode = NULL; nptr->contclass = NULL; nptr->contclasslen = 0; np++; dash = strchr(piece, '/'); if (dash) { *dash = '\0'; if (ignorechars) { if (utf8) { remove_ignored_chars_utf(piece, ignorechars_utf16, ignorechars_utf16_len); } else { remove_ignored_chars(piece,ignorechars); } } if (complexprefixes) { if (utf8) reverseword_utf(piece); else reverseword(piece); } nptr->appnd = mystrdup(piece); if (pHMgr->is_aliasf()) { int index = atoi(dash + 1); nptr->contclasslen = (unsigned short) pHMgr->get_aliasf(index, &(nptr->contclass)); if (!nptr->contclasslen) HUNSPELL_WARNING(stderr, "error: bad affix flag alias: \"%s\"\n", dash+1); } else { nptr->contclasslen = (unsigned short) pHMgr->decode_flags(&(nptr->contclass), dash + 1); flag_qsort(nptr->contclass, 0, nptr->contclasslen); } *dash = '/'; havecontclass = 1; for (unsigned short _i = 0; _i < nptr->contclasslen; _i++) { contclasses[(nptr->contclass)[_i]] = 1; } } else { if (ignorechars) { if (utf8) { remove_ignored_chars_utf(piece, ignorechars_utf16, ignorechars_utf16_len); } else { remove_ignored_chars(piece,ignorechars); } } if (complexprefixes) { if (utf8) reverseword_utf(piece); else reverseword(piece); } nptr->appnd = mystrdup(piece); } nptr->appndl = (unsigned char) strlen(nptr->appnd); if (strcmp(nptr->appnd,"0") == 0) { free(nptr->appnd); nptr->appnd=mystrdup(""); nptr->appndl = 0; } break; } // piece 5 - is the conditions descriptions case 4: { np++; if (complexprefixes) { if (utf8) reverseword_utf(piece); else reverseword(piece); reverse_condition(piece); } if (nptr->stripl && (strcmp(piece, ".") != 0) && redundant_condition(at, nptr->strip, nptr->stripl, piece, nl)) strcpy(piece, "."); if (at == 'S') { reverseword(piece); reverse_condition(piece); } if (encodeit(nptr, piece)) return 1; break; } case 5: { np++; if (pHMgr->is_aliasm()) { int index = atoi(piece); nptr->morphcode = pHMgr->get_aliasm(index); } else { if (complexprefixes) { // XXX - fix me for morph. gen. if (utf8) reverseword_utf(piece); else reverseword(piece); } // add the remaining of the line if (*tp) { *(tp - 1) = ' '; tp = tp + strlen(tp); } nptr->morphcode = mystrdup(piece); if (!nptr->morphcode) return 1; } break; } default: break; } i++; } piece = mystrsep(&tp, 0); } // check to make sure we parsed enough pieces if (np < 4) { char * err = pHMgr->encode_flag(aflag); if (err) { HUNSPELL_WARNING(stderr, "error: affix %s is corrupt near line %s\n", err, nl); free(err); } free(ptr); return 1; } #ifdef DEBUG // detect unnecessary fields, excepting comments if (basefieldnum) { int fieldnum = !(nptr->morphcode) ? 5 : ((*(nptr->morphcode)=='#') ? 5 : 6); if (fieldnum != basefieldnum) HUNSPELL_WARNING(stderr, "warning: bad field number:\n%s\n", nl); } else { basefieldnum = !(nptr->morphcode) ? 5 : ((*(nptr->morphcode)=='#') ? 5 : 6); } #endif nptr++; } // now create SfxEntry or PfxEntry objects and use links to // build an ordered (sorted by affix string) list nptr = ptr; for (int k = 0; k < numents; k++) { if (at == 'P') { PfxEntry * pfxptr = new PfxEntry(this,nptr); build_pfxtree((AffEntry *)pfxptr); } else { SfxEntry * sfxptr = new SfxEntry(this,nptr); build_sfxtree((AffEntry *)sfxptr); } nptr++; } free(ptr); return 0; } int AffixMgr::redundant_condition(char ft, char * strip, int stripl, const char * cond, char * warnvar) { int condl = strlen(cond); int i; int j; int neg; int in; if (ft == 'P') { // prefix if (strncmp(strip, cond, condl) == 0) return 1; if (utf8) { } else { for (i = 0, j = 0; (i < stripl) && (j < condl); i++, j++) { if (cond[j] != '[') { if (cond[j] != strip[i]) { HUNSPELL_WARNING(stderr, "warning: incompatible stripping characters and condition:\n%s\n", warnvar); } } else { neg = (cond[j+1] == '^') ? 1 : 0; in = 0; do { j++; if (strip[i] == cond[j]) in = 1; } while ((j < (condl - 1)) && (cond[j] != ']')); if (j == (condl - 1) && (cond[j] != ']')) { HUNSPELL_WARNING(stderr, "error: missing ] in condition:\n%s\n", warnvar); return 0; } if ((!neg && !in) || (neg && in)) { HUNSPELL_WARNING(stderr, "warning: incompatible stripping characters and condition:\n%s\n", warnvar); return 0; } } } if (j >= condl) return 1; } } else { // suffix if ((stripl >= condl) && strcmp(strip + stripl - condl, cond) == 0) return 1; if (utf8) { } else { for (i = stripl - 1, j = condl - 1; (i >= 0) && (j >= 0); i--, j--) { if (cond[j] != ']') { if (cond[j] != strip[i]) { HUNSPELL_WARNING(stderr, "warning: incompatible stripping characters and condition:\n%s\n", warnvar); } } else { in = 0; do { j--; if (strip[i] == cond[j]) in = 1; } while ((j > 0) && (cond[j] != '[')); if ((j == 0) && (cond[j] != '[')) { HUNSPELL_WARNING(stderr, "error: missing ] in condition:\n%s\n", warnvar); return 0; } neg = (cond[j+1] == '^') ? 1 : 0; if ((!neg && !in) || (neg && in)) { HUNSPELL_WARNING(stderr, "warning: incompatible stripping characters and condition:\n%s\n", warnvar); return 0; } } } if (j < 0) return 1; } } return 0; } robojournal-0.4.2/ui/hunspell/license.hunspell0000644000175000017500000000413612211723646020226 0ustar willwill/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ //#include "config.h" robojournal-0.4.2/ui/hunspell/suggestmgr.cxx0000644000175000017500000017333312211723646017751 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "license.hunspell" #include "license.myspell" #ifndef MOZILLA_CLIENT #include #include #include #include #else #include #include #include #include #endif #include "ui/hunspell/suggestmgr.hxx" #include "ui/hunspell/htypes.hxx" #include "ui/hunspell/csutil.hxx" #ifndef MOZILLA_CLIENT #ifndef WIN32 using namespace std; #endif #endif const w_char W_VLINE = { '\0', '|' }; SuggestMgr::SuggestMgr(const char * tryme, int maxn, AffixMgr * aptr) { // register affix manager and check in string of chars to // try when building candidate suggestions pAMgr = aptr; ckeyl = 0; ckey = NULL; ckey_utf = NULL; ctryl = 0; ctry = NULL; ctry_utf = NULL; utf8 = 0; langnum = 0; complexprefixes = 0; maxSug = maxn; nosplitsugs = 0; maxngramsugs = MAXNGRAMSUGS; if (pAMgr) { char * enc = pAMgr->get_encoding(); csconv = get_current_cs(enc); free(enc); langnum = pAMgr->get_langnum(); ckey = pAMgr->get_key_string(); nosplitsugs = pAMgr->get_nosplitsugs(); if (pAMgr->get_maxngramsugs() >= 0) maxngramsugs = pAMgr->get_maxngramsugs(); utf8 = pAMgr->get_utf8(); complexprefixes = pAMgr->get_complexprefixes(); } if (ckey) { if (utf8) { w_char t[MAXSWL]; ckeyl = u8_u16(t, MAXSWL, ckey); ckey_utf = (w_char *) malloc(ckeyl * sizeof(w_char)); if (ckey_utf) memcpy(ckey_utf, t, ckeyl * sizeof(w_char)); } else { ckeyl = strlen(ckey); } } if (tryme) { ctry = mystrdup(tryme); if (ctry) ctryl = strlen(ctry); if (ctry && utf8) { w_char t[MAXSWL]; ctryl = u8_u16(t, MAXSWL, tryme); ctry_utf = (w_char *) malloc(ctryl * sizeof(w_char)); if (ctry_utf) memcpy(ctry_utf, t, ctryl * sizeof(w_char)); else ctryl = 0; } } } SuggestMgr::~SuggestMgr() { pAMgr = NULL; if (ckey) free(ckey); ckey = NULL; if (ckey_utf) free(ckey_utf); ckey_utf = NULL; ckeyl = 0; if (ctry) free(ctry); ctry = NULL; if (ctry_utf) free(ctry_utf); ctry_utf = NULL; ctryl = 0; maxSug = 0; } int SuggestMgr::testsug(char** wlst, const char * candidate, int wl, int ns, int cpdsuggest, int * timer, clock_t * timelimit) { int cwrd = 1; if (ns == maxSug) return maxSug; for (int k=0; k < ns; k++) { if (strcmp(candidate,wlst[k]) == 0) cwrd = 0; } if ((cwrd) && checkword(candidate, wl, cpdsuggest, timer, timelimit)) { wlst[ns] = mystrdup(candidate); if (wlst[ns] == NULL) { for (int j=0; j HTML) if ((nsug < maxSug) && (nsug > -1)) { nsug = (utf8) ? capchars_utf(wlst, word_utf, wl, nsug, cpdsuggest) : capchars(wlst, word, nsug, cpdsuggest); } // perhaps we made a typical fault of spelling if ((nsug < maxSug) && (nsug > -1)) nsug = replchars(wlst, word, nsug, cpdsuggest); // perhaps we made chose the wrong char from a related set if ((nsug < maxSug) && (nsug > -1)) { nsug = mapchars(wlst, word, nsug, cpdsuggest); } // did we swap the order of chars by mistake if ((nsug < maxSug) && (nsug > -1)) { nsug = (utf8) ? swapchar_utf(wlst, word_utf, wl, nsug, cpdsuggest) : swapchar(wlst, word, nsug, cpdsuggest); } // did we swap the order of non adjacent chars by mistake if ((nsug < maxSug) && (nsug > -1)) { nsug = (utf8) ? longswapchar_utf(wlst, word_utf, wl, nsug, cpdsuggest) : longswapchar(wlst, word, nsug, cpdsuggest); } // did we just hit the wrong key in place of a good char (case and keyboard) if ((nsug < maxSug) && (nsug > -1)) { nsug = (utf8) ? badcharkey_utf(wlst, word_utf, wl, nsug, cpdsuggest) : badcharkey(wlst, word, nsug, cpdsuggest); } // did we add a char that should not be there if ((nsug < maxSug) && (nsug > -1)) { nsug = (utf8) ? extrachar_utf(wlst, word_utf, wl, nsug, cpdsuggest) : extrachar(wlst, word, nsug, cpdsuggest); } // only suggest compound words when no other suggestion if ((cpdsuggest == 0) && (nsug > 0)) nocompoundtwowords=1; // did we forgot a char if ((nsug < maxSug) && (nsug > -1)) { nsug = (utf8) ? forgotchar_utf(wlst, word_utf, wl, nsug, cpdsuggest) : forgotchar(wlst, word, nsug, cpdsuggest); } // did we move a char if ((nsug < maxSug) && (nsug > -1)) { nsug = (utf8) ? movechar_utf(wlst, word_utf, wl, nsug, cpdsuggest) : movechar(wlst, word, nsug, cpdsuggest); } // did we just hit the wrong key in place of a good char if ((nsug < maxSug) && (nsug > -1)) { nsug = (utf8) ? badchar_utf(wlst, word_utf, wl, nsug, cpdsuggest) : badchar(wlst, word, nsug, cpdsuggest); } // did we double two characters if ((nsug < maxSug) && (nsug > -1)) { nsug = (utf8) ? doubletwochars_utf(wlst, word_utf, wl, nsug, cpdsuggest) : doubletwochars(wlst, word, nsug, cpdsuggest); } // perhaps we forgot to hit space and two words ran together if ((!nosplitsugs) && (nsug < maxSug) && (nsug > -1)) { nsug = twowords(wlst, word, nsug, cpdsuggest); } } // repeating ``for'' statement compounding support if (nsug < 0) { // we ran out of memory - we should free up as much as possible for (int i = 0; i < maxSug; i++) if (wlst[i] != NULL) free(wlst[i]); free(wlst); wlst = NULL; } if (!nocompoundtwowords && (nsug > 0) && onlycompoundsug) *onlycompoundsug = 1; *slst = wlst; return nsug; } // generate suggestions for a word with typical mistake // pass in address of array of char * pointers #ifdef HUNSPELL_EXPERIMENTAL int SuggestMgr::suggest_auto(char*** slst, const char * w, int nsug) { int nocompoundtwowords = 0; char ** wlst; char w2[MAXWORDUTF8LEN]; const char * word = w; // word reversing wrapper for complex prefixes if (complexprefixes) { strcpy(w2, w); if (utf8) reverseword_utf(w2); else reverseword(w2); word = w2; } if (*slst) { wlst = *slst; } else { wlst = (char **) malloc(maxSug * sizeof(char *)); if (wlst == NULL) return -1; } for (int cpdsuggest=0; (cpdsuggest<2) && (nocompoundtwowords==0); cpdsuggest++) { // perhaps we made a typical fault of spelling if ((nsug < maxSug) && (nsug > -1)) nsug = replchars(wlst, word, nsug, cpdsuggest); // perhaps we made chose the wrong char from a related set if ((nsug < maxSug) && (nsug > -1)) nsug = mapchars(wlst, word, nsug, cpdsuggest); if ((cpdsuggest==0) && (nsug>0)) nocompoundtwowords=1; // perhaps we forgot to hit space and two words ran together if ((nsug < maxSug) && (nsug > -1) && check_forbidden(word, strlen(word))) { nsug = twowords(wlst, word, nsug, cpdsuggest); } } // repeating ``for'' statement compounding support if (nsug < 0) { for (int i=0;i HTML) int SuggestMgr::capchars_utf(char ** wlst, const w_char * word, int wl, int ns, int cpdsuggest) { char candidate[MAXSWUTF8L]; w_char candidate_utf[MAXSWL]; memcpy(candidate_utf, word, wl * sizeof(w_char)); mkallcap_utf(candidate_utf, wl, langnum); u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl); return testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL); } // suggestions for an uppercase word (html -> HTML) int SuggestMgr::capchars(char** wlst, const char * word, int ns, int cpdsuggest) { char candidate[MAXSWUTF8L]; strcpy(candidate, word); mkallcap(candidate, csconv); return testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL); } // suggestions for when chose the wrong char out of a related set int SuggestMgr::mapchars(char** wlst, const char * word, int ns, int cpdsuggest) { clock_t timelimit; int timer; int wl = strlen(word); if (wl < 2 || ! pAMgr) return ns; int nummap = pAMgr->get_nummap(); struct mapentry* maptable = pAMgr->get_maptable(); if (maptable==NULL) return ns; timelimit = clock(); timer = MINTIMER; if (utf8) { w_char w[MAXSWL]; int len = u8_u16(w, MAXSWL, word); ns = map_related_utf(w, len, 0, cpdsuggest, wlst, ns, maptable, nummap, &timer, &timelimit); } else ns = map_related(word, 0, wlst, cpdsuggest, ns, maptable, nummap, &timer, &timelimit); return ns; } int SuggestMgr::map_related(const char * word, int i, char** wlst, int cpdsuggest, int ns, const mapentry* maptable, int nummap, int * timer, clock_t * timelimit) { char c = *(word + i); if (c == 0) { int cwrd = 1; int wl = strlen(word); for (int m=0; m < ns; m++) if (strcmp(word,wlst[m]) == 0) cwrd = 0; if ((cwrd) && checkword(word, wl, cpdsuggest, timer, timelimit)) { if (ns < maxSug) { wlst[ns] = mystrdup(word); if (wlst[ns] == NULL) return -1; ns++; } } return ns; } int in_map = 0; for (int j = 0; j < nummap; j++) { if (strchr(maptable[j].set,c) != 0) { in_map = 1; char * newword = mystrdup(word); if (!newword) return -1; for (int k = 0; k < maptable[j].len; k++) { *(newword + i) = *(maptable[j].set + k); ns = map_related(newword, (i+1), wlst, cpdsuggest, ns, maptable, nummap, timer, timelimit); if (!(*timer)) return ns; } free(newword); } } if (!in_map) { i++; ns = map_related(word, i, wlst, cpdsuggest, ns, maptable, nummap, timer, timelimit); } return ns; } int SuggestMgr::map_related_utf(w_char * word, int len, int i, int cpdsuggest, char** wlst, int ns, const mapentry* maptable, int nummap, int * timer, clock_t * timelimit) { if (i == len) { int cwrd = 1; int wl; char s[MAXSWUTF8L]; u16_u8(s, MAXSWUTF8L, word, len); wl = strlen(s); for (int m=0; m < ns; m++) if (strcmp(s,wlst[m]) == 0) cwrd = 0; if ((cwrd) && checkword(s, wl, cpdsuggest, timer, timelimit)) { if (ns < maxSug) { wlst[ns] = mystrdup(s); if (wlst[ns] == NULL) return -1; ns++; } } return ns; } int in_map = 0; unsigned short c = *((unsigned short *) word + i); for (int j = 0; j < nummap; j++) { if (flag_bsearch((unsigned short *) maptable[j].set_utf16, c, maptable[j].len)) { in_map = 1; for (int k = 0; k < maptable[j].len; k++) { *(word + i) = *(maptable[j].set_utf16 + k); ns = map_related_utf(word, len, i + 1, cpdsuggest, wlst, ns, maptable, nummap, timer, timelimit); if (!(*timer)) return ns; } *((unsigned short *) word + i) = c; } } if (!in_map) { i++; ns = map_related_utf(word, len, i, cpdsuggest, wlst, ns, maptable, nummap, timer, timelimit); } return ns; } // suggestions for a typical fault of spelling, that // differs with more, than 1 letter from the right form. int SuggestMgr::replchars(char** wlst, const char * word, int ns, int cpdsuggest) { char candidate[MAXSWUTF8L]; const char * r; int lenr, lenp; int wl = strlen(word); if (wl < 2 || ! pAMgr) return ns; int numrep = pAMgr->get_numrep(); struct replentry* reptable = pAMgr->get_reptable(); if (reptable==NULL) return ns; for (int i=0; i < numrep; i++ ) { r = word; lenr = strlen(reptable[i].pattern2); lenp = strlen(reptable[i].pattern); // search every occurence of the pattern in the word while ((r=strstr(r, reptable[i].pattern)) != NULL) { strcpy(candidate, word); if (r-word + lenr + strlen(r+lenp) >= MAXSWUTF8L) break; strcpy(candidate+(r-word),reptable[i].pattern2); strcpy(candidate+(r-word)+lenr, r+lenp); ns = testsug(wlst, candidate, wl-lenp+lenr, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; // check REP suggestions with space char * sp = strchr(candidate, ' '); if (sp) { *sp = '\0'; if (checkword(candidate, strlen(candidate), 0, NULL, NULL)) { int oldns = ns; *sp = ' '; ns = testsug(wlst, sp + 1, strlen(sp + 1), ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; if (oldns < ns) { free(wlst[ns - 1]); wlst[ns - 1] = mystrdup(candidate); if (!wlst[ns - 1]) return -1; } } *sp = ' '; } r++; // search for the next letter } } return ns; } // perhaps we doubled two characters (pattern aba -> ababa, for example vacation -> vacacation) int SuggestMgr::doubletwochars(char** wlst, const char * word, int ns, int cpdsuggest) { char candidate[MAXSWUTF8L]; int state=0; int wl = strlen(word); if (wl < 5 || ! pAMgr) return ns; for (int i=2; i < wl; i++ ) { if (word[i]==word[i-2]) { state++; if (state==3) { strcpy(candidate,word); strcpy(candidate+i-1,word+i+1); ns = testsug(wlst, candidate, wl-2, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; state=0; } } else { state=0; } } return ns; } // perhaps we doubled two characters (pattern aba -> ababa, for example vacation -> vacacation) int SuggestMgr::doubletwochars_utf(char ** wlst, const w_char * word, int wl, int ns, int cpdsuggest) { w_char candidate_utf[MAXSWL]; char candidate[MAXSWUTF8L]; int state=0; if (wl < 5 || ! pAMgr) return ns; for (int i=2; i < wl; i++) { if (w_char_eq(word[i], word[i-2])) { state++; if (state==3) { memcpy(candidate_utf, word, (i - 1) * sizeof(w_char)); memcpy(candidate_utf+i-1, word+i+1, (wl-i-1) * sizeof(w_char)); u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl-2); ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; state=0; } } else { state=0; } } return ns; } // error is wrong char in place of correct one (case and keyboard related version) int SuggestMgr::badcharkey(char ** wlst, const char * word, int ns, int cpdsuggest) { char tmpc; char candidate[MAXSWUTF8L]; int wl = strlen(word); strcpy(candidate, word); // swap out each char one by one and try uppercase and neighbor // keyboard chars in its place to see if that makes a good word for (int i=0; i < wl; i++) { tmpc = candidate[i]; // check with uppercase letters candidate[i] = csconv[((unsigned char)tmpc)].cupper; if (tmpc != candidate[i]) { ns = testsug(wlst, candidate, wl, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; candidate[i] = tmpc; } // check neighbor characters in keyboard string if (!ckey) continue; char * loc = strchr(ckey, tmpc); while (loc) { if ((loc > ckey) && (*(loc - 1) != '|')) { candidate[i] = *(loc - 1); ns = testsug(wlst, candidate, wl, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } if ((*(loc + 1) != '|') && (*(loc + 1) != '\0')) { candidate[i] = *(loc + 1); ns = testsug(wlst, candidate, wl, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } loc = strchr(loc + 1, tmpc); } candidate[i] = tmpc; } return ns; } // error is wrong char in place of correct one (case and keyboard related version) int SuggestMgr::badcharkey_utf(char ** wlst, const w_char * word, int wl, int ns, int cpdsuggest) { w_char tmpc; w_char candidate_utf[MAXSWL]; char candidate[MAXSWUTF8L]; memcpy(candidate_utf, word, wl * sizeof(w_char)); // swap out each char one by one and try all the tryme // chars in its place to see if that makes a good word for (int i=0; i < wl; i++) { tmpc = candidate_utf[i]; // check with uppercase letters mkallcap_utf(candidate_utf + i, 1, langnum); if (!w_char_eq(tmpc, candidate_utf[i])) { u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl); ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; candidate_utf[i] = tmpc; } // check neighbor characters in keyboard string if (!ckey) continue; w_char * loc = ckey_utf; while ((loc < (ckey_utf + ckeyl)) && !w_char_eq(*loc, tmpc)) loc++; while (loc < (ckey_utf + ckeyl)) { if ((loc > ckey_utf) && !w_char_eq(*(loc - 1), W_VLINE)) { candidate_utf[i] = *(loc - 1); u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl); ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } if (((loc + 1) < (ckey_utf + ckeyl)) && !w_char_eq(*(loc + 1), W_VLINE)) { candidate_utf[i] = *(loc + 1); u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl); ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } do { loc++; } while ((loc < (ckey_utf + ckeyl)) && !w_char_eq(*loc, tmpc)); } candidate_utf[i] = tmpc; } return ns; } // error is wrong char in place of correct one int SuggestMgr::badchar(char ** wlst, const char * word, int ns, int cpdsuggest) { char tmpc; char candidate[MAXSWUTF8L]; clock_t timelimit = clock(); int timer = MINTIMER; int wl = strlen(word); strcpy(candidate, word); // swap out each char one by one and try all the tryme // chars in its place to see if that makes a good word for (int i=0; i < wl; i++) { tmpc = candidate[i]; for (int j=0; j < ctryl; j++) { if (ctry[j] == tmpc) continue; candidate[i] = ctry[j]; ns = testsug(wlst, candidate, wl, ns, cpdsuggest, &timer, &timelimit); if (ns == -1) return -1; if (!timer) return ns; candidate[i] = tmpc; } } return ns; } // error is wrong char in place of correct one int SuggestMgr::badchar_utf(char ** wlst, const w_char * word, int wl, int ns, int cpdsuggest) { w_char tmpc; w_char candidate_utf[MAXSWL]; char candidate[MAXSWUTF8L]; clock_t timelimit = clock(); int timer = MINTIMER; memcpy(candidate_utf, word, wl * sizeof(w_char)); // swap out each char one by one and try all the tryme // chars in its place to see if that makes a good word for (int i=0; i < wl; i++) { tmpc = candidate_utf[i]; for (int j=0; j < ctryl; j++) { if (w_char_eq(tmpc, ctry_utf[j])) continue; candidate_utf[i] = ctry_utf[j]; u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl); ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, &timer, &timelimit); if (ns == -1) return -1; if (!timer) return ns; candidate_utf[i] = tmpc; } } return ns; } // error is word has an extra letter it does not need int SuggestMgr::extrachar_utf(char** wlst, const w_char * word, int wl, int ns, int cpdsuggest) { char candidate[MAXSWUTF8L]; w_char candidate_utf[MAXSWL]; const w_char * p; w_char * r; if (wl < 2) return ns; // try omitting one char of word at a time memcpy(candidate_utf, word + 1, (wl - 1) * sizeof(w_char)); for (p = word, r = candidate_utf; p < word + wl; ) { u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl - 1); ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; *r++ = *p++; } return ns; } // error is word has an extra letter it does not need int SuggestMgr::extrachar(char** wlst, const char * word, int ns, int cpdsuggest) { char candidate[MAXSWUTF8L]; const char * p; char * r; int wl = strlen(word); if (wl < 2) return ns; // try omitting one char of word at a time strcpy (candidate, word + 1); for (p = word, r = candidate; *p != 0; ) { ns = testsug(wlst, candidate, wl-1, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; *r++ = *p++; } return ns; } // error is missing a letter it needs int SuggestMgr::forgotchar(char ** wlst, const char * word, int ns, int cpdsuggest) { char candidate[MAXSWUTF8L]; const char * p; char * q; clock_t timelimit = clock(); int timer = MINTIMER; int wl = strlen(word); // try inserting a tryme character before every letter strcpy(candidate + 1, word); for (p = word, q = candidate; *p != 0; ) { for (int i = 0; i < ctryl; i++) { *q = ctry[i]; ns = testsug(wlst, candidate, wl+1, ns, cpdsuggest, &timer, &timelimit); if (ns == -1) return -1; if (!timer) return ns; } *q++ = *p++; } // now try adding one to end */ for (int i = 0; i < ctryl; i++) { *q = ctry[i]; ns = testsug(wlst, candidate, wl+1, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } return ns; } // error is missing a letter it needs int SuggestMgr::forgotchar_utf(char ** wlst, const w_char * word, int wl, int ns, int cpdsuggest) { w_char candidate_utf[MAXSWL]; char candidate[MAXSWUTF8L]; const w_char * p; w_char * q; int cwrd; clock_t timelimit = clock(); int timer = MINTIMER; // try inserting a tryme character before every letter memcpy (candidate_utf + 1, word, wl * sizeof(w_char)); for (p = word, q = candidate_utf; p < (word + wl); ) { for (int i = 0; i < ctryl; i++) { *q = ctry_utf[i]; cwrd = 1; u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl + 1); ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, &timer, &timelimit); if (ns == -1) return -1; if (!timer) return ns; } *q++ = *p++; } // now try adding one to end */ for (int i = 0; i < ctryl; i++) { *q = ctry_utf[i]; cwrd = 1; u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl + 1); ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } return ns; } /* error is should have been two words */ int SuggestMgr::twowords(char ** wlst, const char * word, int ns, int cpdsuggest) { char candidate[MAXSWUTF8L]; char * p; int c1, c2; int forbidden = 0; int cwrd; int wl=strlen(word); if (wl < 3) return ns; if (langnum == LANG_hu) forbidden = check_forbidden(word, wl); strcpy(candidate + 1, word); // split the string into two pieces after every char // if both pieces are good words make them a suggestion for (p = candidate + 1; p[1] != '\0'; p++) { p[-1] = *p; // go to end of the UTF-8 character while (utf8 && ((p[1] & 0xc0) == 0x80)) { *p = p[1]; p++; } if (utf8 && p[1] == '\0') break; // last UTF-8 character *p = '\0'; c1 = checkword(candidate,strlen(candidate), cpdsuggest, NULL, NULL); if (c1) { c2 = checkword((p+1),strlen(p+1), cpdsuggest, NULL, NULL); if (c2) { *p = ' '; // spec. Hungarian code (need a better compound word support) if ((langnum == LANG_hu) && !forbidden && // if 3 repeating letter, use - instead of space (((p[-1] == p[1]) && (((p>candidate+1) && (p[-1] == p[-2])) || (p[-1] == p[2]))) || // or multiple compounding, with more, than 6 syllables ((c1 == 3) && (c2 >= 2)))) *p = '-'; cwrd = 1; for (int k=0; k < ns; k++) if (strcmp(candidate,wlst[k]) == 0) cwrd = 0; if (ns < maxSug) { if (cwrd) { wlst[ns] = mystrdup(candidate); if (wlst[ns] == NULL) return -1; ns++; } } else return ns; // add two word suggestion with dash, if TRY string contains // "a" or "-" // NOTE: cwrd doesn't modified for REP twoword sugg. if (ctry && (strchr(ctry, 'a') || strchr(ctry, '-')) && mystrlen(p + 1) > 1 && mystrlen(candidate) - mystrlen(p) > 1) { *p = '-'; for (int k=0; k < ns; k++) if (strcmp(candidate,wlst[k]) == 0) cwrd = 0; if (ns < maxSug) { if (cwrd) { wlst[ns] = mystrdup(candidate); if (wlst[ns] == NULL) return -1; ns++; } } else return ns; } } } } return ns; } // error is adjacent letter were swapped int SuggestMgr::swapchar(char ** wlst, const char * word, int ns, int cpdsuggest) { char candidate[MAXSWUTF8L]; char * p; char tmpc; int wl=strlen(word); // try swapping adjacent chars one by one strcpy(candidate, word); for (p = candidate; p[1] != 0; p++) { tmpc = *p; *p = p[1]; p[1] = tmpc; ns = testsug(wlst, candidate, wl, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; p[1] = *p; *p = tmpc; } // try double swaps for short words // ahev -> have, owudl -> would if (wl == 4 || wl == 5) { candidate[0] = word[1]; candidate[1] = word[0]; candidate[2] = word[2]; candidate[wl - 2] = word[wl - 1]; candidate[wl - 1] = word[wl - 2]; ns = testsug(wlst, candidate, wl, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; if (wl == 5) { candidate[0] = word[0]; candidate[1] = word[2]; candidate[2] = word[1]; ns = testsug(wlst, candidate, wl, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } } return ns; } // error is adjacent letter were swapped int SuggestMgr::swapchar_utf(char ** wlst, const w_char * word, int wl, int ns, int cpdsuggest) { w_char candidate_utf[MAXSWL]; char candidate[MAXSWUTF8L]; w_char * p; w_char tmpc; int len = 0; // try swapping adjacent chars one by one memcpy (candidate_utf, word, wl * sizeof(w_char)); for (p = candidate_utf; p < (candidate_utf + wl - 1); p++) { tmpc = *p; *p = p[1]; p[1] = tmpc; u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl); if (len == 0) len = strlen(candidate); ns = testsug(wlst, candidate, len, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; p[1] = *p; *p = tmpc; } // try double swaps for short words // ahev -> have, owudl -> would, suodn -> sound if (wl == 4 || wl == 5) { candidate_utf[0] = word[1]; candidate_utf[1] = word[0]; candidate_utf[2] = word[2]; candidate_utf[wl - 2] = word[wl - 1]; candidate_utf[wl - 1] = word[wl - 2]; u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl); ns = testsug(wlst, candidate, len, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; if (wl == 5) { candidate_utf[0] = word[0]; candidate_utf[1] = word[2]; candidate_utf[2] = word[1]; u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl); ns = testsug(wlst, candidate, len, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } } return ns; } // error is not adjacent letter were swapped int SuggestMgr::longswapchar(char ** wlst, const char * word, int ns, int cpdsuggest) { char candidate[MAXSWUTF8L]; char * p; char * q; char tmpc; int wl=strlen(word); // try swapping not adjacent chars one by one strcpy(candidate, word); for (p = candidate; *p != 0; p++) { for (q = candidate; *q != 0; q++) { if (abs(p-q) > 1) { tmpc = *p; *p = *q; *q = tmpc; ns = testsug(wlst, candidate, wl, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; *q = *p; *p = tmpc; } } } return ns; } // error is adjacent letter were swapped int SuggestMgr::longswapchar_utf(char ** wlst, const w_char * word, int wl, int ns, int cpdsuggest) { w_char candidate_utf[MAXSWL]; char candidate[MAXSWUTF8L]; w_char * p; w_char * q; w_char tmpc; // try swapping not adjacent chars memcpy (candidate_utf, word, wl * sizeof(w_char)); for (p = candidate_utf; p < (candidate_utf + wl); p++) { for (q = candidate_utf; q < (candidate_utf + wl); q++) { if (abs(p-q) > 1) { tmpc = *p; *p = *q; *q = tmpc; u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl); ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; *q = *p; *p = tmpc; } } } return ns; } // error is a letter was moved int SuggestMgr::movechar(char ** wlst, const char * word, int ns, int cpdsuggest) { char candidate[MAXSWUTF8L]; char * p; char * q; char tmpc; int wl=strlen(word); // try moving a char strcpy(candidate, word); for (p = candidate; *p != 0; p++) { for (q = p + 1; (*q != 0) && ((q - p) < 10); q++) { tmpc = *(q-1); *(q-1) = *q; *q = tmpc; if ((q-p) < 2) continue; // omit swap char ns = testsug(wlst, candidate, wl, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } strcpy(candidate, word); } for (p = candidate + wl - 1; p > candidate; p--) { for (q = p - 1; (q >= candidate) && ((p - q) < 10); q--) { tmpc = *(q+1); *(q+1) = *q; *q = tmpc; if ((p-q) < 2) continue; // omit swap char ns = testsug(wlst, candidate, wl, ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } strcpy(candidate, word); } return ns; } // error is a letter was moved int SuggestMgr::movechar_utf(char ** wlst, const w_char * word, int wl, int ns, int cpdsuggest) { w_char candidate_utf[MAXSWL]; char candidate[MAXSWUTF8L]; w_char * p; w_char * q; w_char tmpc; // try moving a char memcpy (candidate_utf, word, wl * sizeof(w_char)); for (p = candidate_utf; p < (candidate_utf + wl); p++) { for (q = p + 1; (q < (candidate_utf + wl)) && ((q - p) < 10); q++) { tmpc = *(q-1); *(q-1) = *q; *q = tmpc; if ((q-p) < 2) continue; // omit swap char u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl); ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } memcpy (candidate_utf, word, wl * sizeof(w_char)); } for (p = candidate_utf + wl - 1; p > candidate_utf; p--) { for (q = p - 1; (q >= candidate_utf) && ((p - q) < 10); q--) { tmpc = *(q+1); *(q+1) = *q; *q = tmpc; if ((p-q) < 2) continue; // omit swap char u16_u8(candidate, MAXSWUTF8L, candidate_utf, wl); ns = testsug(wlst, candidate, strlen(candidate), ns, cpdsuggest, NULL, NULL); if (ns == -1) return -1; } memcpy (candidate_utf, word, wl * sizeof(w_char)); } return ns; } // generate a set of suggestions for very poorly spelled words int SuggestMgr::ngsuggest(char** wlst, char * w, int ns, HashMgr** pHMgr, int md) { int i, j; int lval; int sc, scphon; int lp, lpphon; int nonbmp = 0; // exhaustively search through all root words // keeping track of the MAX_ROOTS most similar root words struct hentry * roots[MAX_ROOTS]; char * rootsphon[MAX_ROOTS]; int scores[MAX_ROOTS]; int scoresphon[MAX_ROOTS]; for (i = 0; i < MAX_ROOTS; i++) { roots[i] = NULL; scores[i] = -100 * i; rootsphon[i] = NULL; scoresphon[i] = -100 * i; } lp = MAX_ROOTS - 1; lpphon = MAX_ROOTS - 1; scphon = scoresphon[MAX_ROOTS-1]; char w2[MAXWORDUTF8LEN]; char f[MAXSWUTF8L]; char * word = w; // word reversing wrapper for complex prefixes if (complexprefixes) { strcpy(w2, w); if (utf8) reverseword_utf(w2); else reverseword(w2); word = w2; } char mw[MAXSWUTF8L]; w_char u8[MAXSWL]; int nc = strlen(word); int n = (utf8) ? u8_u16(u8, MAXSWL, word) : nc; // set character based ngram suggestion for words with non-BMP Unicode characters if (n == -1) { utf8 = 0; n = nc; nonbmp = 1; } struct hentry* hp = NULL; int col = -1; phonetable * ph = (pAMgr) ? pAMgr->get_phonetable() : NULL; char target[MAXSWUTF8L]; char candidate[MAXSWUTF8L]; if (ph) { strcpy(candidate, word); mkallcap(candidate, csconv); phonet(candidate, target, n, *ph); } for (i = 0; i < md; i++) { while (0 != (hp = (pHMgr[i])->walk_hashtable(col, hp))) { if ((hp->astr) && (pAMgr) && (TESTAFF(hp->astr, pAMgr->get_forbiddenword(), hp->alen) || TESTAFF(hp->astr, ONLYUPCASEFLAG, hp->alen) || TESTAFF(hp->astr, pAMgr->get_nosuggest(), hp->alen) || TESTAFF(hp->astr, pAMgr->get_onlyincompound(), hp->alen))) continue; sc = ngram(3, word, HENTRY_WORD(hp), NGRAM_LONGER_WORSE + NGRAM_LOWERING) + leftcommonsubstring(word, HENTRY_WORD(hp)); // check special pronounciation if ((hp->var & H_OPT_PHON) && copy_field(f, HENTRY_DATA(hp), MORPH_PHON)) { int sc2 = ngram(3, word, f, NGRAM_LONGER_WORSE + NGRAM_LOWERING) + leftcommonsubstring(word, f); if (sc2 > sc) sc = sc2; } if (ph && (sc > 2) && (abs(n - (int) hp->clen) <= 3)) { char target2[MAXSWUTF8L]; strcpy(candidate, HENTRY_WORD(hp)); mkallcap(candidate, csconv); phonet(candidate, target2, -1, *ph); scphon = 2 * ngram(3, target, target2, NGRAM_LONGER_WORSE); } if (sc > scores[lp]) { scores[lp] = sc; roots[lp] = hp; lval = sc; for (j=0; j < MAX_ROOTS; j++) if (scores[j] < lval) { lp = j; lval = scores[j]; } } if (scphon > scoresphon[lpphon]) { scoresphon[lpphon] = scphon; rootsphon[lpphon] = HENTRY_WORD(hp); lval = scphon; for (j=0; j < MAX_ROOTS; j++) if (scoresphon[j] < lval) { lpphon = j; lval = scoresphon[j]; } } }} // find minimum threshhold for a passable suggestion // mangle original word three differnt ways // and score them to generate a minimum acceptable score int thresh = 0; for (int sp = 1; sp < 4; sp++) { if (utf8) { for (int k=sp; k < n; k+=4) *((unsigned short *) u8 + k) = '*'; u16_u8(mw, MAXSWUTF8L, u8, n); thresh = thresh + ngram(n, word, mw, NGRAM_ANY_MISMATCH + NGRAM_LOWERING); } else { strcpy(mw, word); for (int k=sp; k < n; k+=4) *(mw + k) = '*'; thresh = thresh + ngram(n, word, mw, NGRAM_ANY_MISMATCH + NGRAM_LOWERING); } } thresh = thresh / 3; thresh--; // now expand affixes on each of these root words and // and use length adjusted ngram scores to select // possible suggestions char * guess[MAX_GUESS]; char * guessorig[MAX_GUESS]; int gscore[MAX_GUESS]; for(i=0;iexpand_rootword(glst, MAX_WORDS, HENTRY_WORD(rp), rp->blen, rp->astr, rp->alen, word, nc, ((rp->var & H_OPT_PHON) ? copy_field(f, HENTRY_DATA(rp), MORPH_PHON) : NULL)); for (int k = 0; k < nw ; k++) { sc = ngram(n, word, glst[k].word, NGRAM_ANY_MISMATCH + NGRAM_LOWERING) + leftcommonsubstring(word, glst[k].word); if ((sc > thresh)) { if (sc > gscore[lp]) { if (guess[lp]) { free (guess[lp]); if (guessorig[lp]) { free(guessorig[lp]); guessorig[lp] = NULL; } } gscore[lp] = sc; guess[lp] = glst[k].word; guessorig[lp] = glst[k].orig; lval = sc; for (j=0; j < MAX_GUESS; j++) if (gscore[j] < lval) { lp = j; lval = gscore[j]; } } else { free(glst[k].word); if (glst[k].orig) free(glst[k].orig); } } else { free(glst[k].word); if (glst[k].orig) free(glst[k].orig); } } } } free(glst); // now we are done generating guesses // sort in order of decreasing score bubblesort(&guess[0], &guessorig[0], &gscore[0], MAX_GUESS); if (ph) bubblesort(&rootsphon[0], NULL, &scoresphon[0], MAX_ROOTS); // weight suggestions with a similarity index, based on // the longest common subsequent algorithm and resort int is_swap; for (i=0; i < MAX_GUESS; i++) { if (guess[i]) { // lowering guess[i] char gl[MAXSWUTF8L]; int len; if (utf8) { w_char _w[MAXSWL]; len = u8_u16(_w, MAXSWL, guess[i]); mkallsmall_utf(_w, len, langnum); u16_u8(gl, MAXSWUTF8L, _w, len); } else { strcpy(gl, guess[i]); mkallsmall(gl, csconv); len = strlen(guess[i]); } int _lcs = lcslen(word, gl); // same characters with different casing if ((n == len) && (n == _lcs)) { gscore[i] += 2000; break; } // heuristic weigthing of ngram scores gscore[i] += // length of longest common subsequent minus length difference 2 * _lcs - abs((int) (n - len)) + // weight length of the left common substring leftcommonsubstring(word, gl) + // weight equal character positions ((_lcs == commoncharacterpositions(word, gl, &is_swap)) ? 1: 0) + // swap character (not neighboring) ((is_swap) ? 1000 : 0); } } bubblesort(&guess[0], &guessorig[0], &gscore[0], MAX_GUESS); // phonetic version if (ph) for (i=0; i < MAX_ROOTS; i++) { if (rootsphon[i]) { // lowering rootphon[i] char gl[MAXSWUTF8L]; int len; if (utf8) { w_char _w[MAXSWL]; len = u8_u16(_w, MAXSWL, rootsphon[i]); mkallsmall_utf(_w, len, langnum); u16_u8(gl, MAXSWUTF8L, _w, len); } else { strcpy(gl, rootsphon[i]); mkallsmall(gl, csconv); len = strlen(rootsphon[i]); } // heuristic weigthing of ngram scores scoresphon[i] += 2 * lcslen(word, gl) - abs((int) (n - len)) + // weight length of the left common substring leftcommonsubstring(word, gl); } } if (ph) bubblesort(&rootsphon[0], NULL, &scoresphon[0], MAX_ROOTS); // copy over int oldns = ns; int same = 0; for (i=0; i < MAX_GUESS; i++) { if (guess[i]) { if ((ns < oldns + maxngramsugs) && (ns < maxSug) && (!same || (gscore[i] > 1000))) { int unique = 1; // leave only excellent suggestions, if exists if (gscore[i] > 1000) same = 1; for (j = 0; j < ns; j++) { // don't suggest previous suggestions or a previous suggestion with prefixes or affixes if ((!guessorig[i] && strstr(guess[i], wlst[j])) || (guessorig[i] && strstr(guessorig[i], wlst[j])) || // check forbidden words !checkword(guess[i], strlen(guess[i]), 0, NULL, NULL)) unique = 0; } if (unique) { wlst[ns++] = guess[i]; if (guessorig[i]) { free(guess[i]); wlst[ns-1] = guessorig[i]; } } else { free(guess[i]); if (guessorig[i]) free(guessorig[i]); } } else { free(guess[i]); if (guessorig[i]) free(guessorig[i]); } } } oldns = ns; if (ph) for (i=0; i < MAX_ROOTS; i++) { if (rootsphon[i]) { if ((ns < oldns + MAXPHONSUGS) && (ns < maxSug)) { int unique = 1; for (j = 0; j < ns; j++) { // don't suggest previous suggestions or a previous suggestion with prefixes or affixes if (strstr(rootsphon[i], wlst[j]) || // check forbidden words !checkword(rootsphon[i], strlen(rootsphon[i]), 0, NULL, NULL)) unique = 0; } if (unique) { wlst[ns++] = mystrdup(rootsphon[i]); if (!wlst[ns - 1]) return ns - 1; } } } } if (nonbmp) utf8 = 1; return ns; } // see if a candidate suggestion is spelled correctly // needs to check both root words and words with affixes // obsolote MySpell-HU modifications: // return value 2 and 3 marks compounding with hyphen (-) // `3' marks roots without suffix int SuggestMgr::checkword(const char * word, int len, int cpdsuggest, int * timer, clock_t * timelimit) { struct hentry * rv=NULL; int nosuffix = 0; // check time limit if (timer) { (*timer)--; if (!(*timer) && timelimit) { if ((clock() - *timelimit) > TIMELIMIT) return 0; *timer = MAXPLUSTIMER; } } if (pAMgr) { if (cpdsuggest==1) { if (pAMgr->get_compound()) { rv = pAMgr->compound_check(word,len,0,0,0,0,NULL,0,NULL,NULL,1); if (rv) return 3; // XXX obsolote categorisation } return 0; } rv = pAMgr->lookup(word); if (rv) { if ((rv->astr) && (TESTAFF(rv->astr,pAMgr->get_forbiddenword(),rv->alen) || TESTAFF(rv->astr,pAMgr->get_nosuggest(),rv->alen))) return 0; while (rv) { if (rv->astr && (TESTAFF(rv->astr,pAMgr->get_needaffix(),rv->alen) || TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen) || TESTAFF(rv->astr,pAMgr->get_onlyincompound(),rv->alen))) { rv = rv->next_homonym; } else break; } } else rv = pAMgr->prefix_check(word, len, 0); // only prefix, and prefix + suffix XXX if (rv) { nosuffix=1; } else { rv = pAMgr->suffix_check(word, len, 0, NULL, NULL, 0, NULL); // only suffix } if (!rv && pAMgr->have_contclass()) { rv = pAMgr->suffix_check_twosfx(word, len, 0, NULL, FLAG_NULL); if (!rv) rv = pAMgr->prefix_check_twosfx(word, len, 1, FLAG_NULL); } // check forbidden words if ((rv) && (rv->astr) && (TESTAFF(rv->astr,pAMgr->get_forbiddenword(),rv->alen) || TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen) || TESTAFF(rv->astr,pAMgr->get_nosuggest(),rv->alen) || TESTAFF(rv->astr,pAMgr->get_onlyincompound(),rv->alen))) return 0; if (rv) { // XXX obsolote if ((pAMgr->get_compoundflag()) && TESTAFF(rv->astr, pAMgr->get_compoundflag(), rv->alen)) return 2 + nosuffix; return 1; } } return 0; } int SuggestMgr::check_forbidden(const char * word, int len) { struct hentry * rv = NULL; if (pAMgr) { rv = pAMgr->lookup(word); if (rv && rv->astr && (TESTAFF(rv->astr,pAMgr->get_needaffix(),rv->alen) || TESTAFF(rv->astr,pAMgr->get_onlyincompound(),rv->alen))) rv = NULL; if (!(pAMgr->prefix_check(word,len,1))) rv = pAMgr->suffix_check(word,len, 0, NULL, NULL, 0, NULL); // prefix+suffix, suffix // check forbidden words if ((rv) && (rv->astr) && TESTAFF(rv->astr,pAMgr->get_forbiddenword(),rv->alen)) return 1; } return 0; } #ifdef HUNSPELL_EXPERIMENTAL // suggest possible stems int SuggestMgr::suggest_pos_stems(char*** slst, const char * w, int nsug) { char ** wlst; struct hentry * rv = NULL; char w2[MAXSWUTF8L]; const char * word = w; // word reversing wrapper for complex prefixes if (complexprefixes) { strcpy(w2, w); if (utf8) reverseword_utf(w2); else reverseword(w2); word = w2; } int wl = strlen(word); if (*slst) { wlst = *slst; } else { wlst = (char **) calloc(maxSug, sizeof(char *)); if (wlst == NULL) return -1; } rv = pAMgr->suffix_check(word, wl, 0, NULL, wlst, maxSug, &nsug); // delete dash from end of word if (nsug > 0) { for (int j=0; j < nsug; j++) { if (wlst[j][strlen(wlst[j]) - 1] == '-') wlst[j][strlen(wlst[j]) - 1] = '\0'; } } *slst = wlst; return nsug; } #endif // END OF HUNSPELL_EXPERIMENTAL CODE char * SuggestMgr::suggest_morph(const char * w) { char result[MAXLNLEN]; char * r = (char *) result; char * st; struct hentry * rv = NULL; *result = '\0'; if (! pAMgr) return NULL; char w2[MAXSWUTF8L]; const char * word = w; // word reversing wrapper for complex prefixes if (complexprefixes) { strcpy(w2, w); if (utf8) reverseword_utf(w2); else reverseword(w2); word = w2; } rv = pAMgr->lookup(word); while (rv) { if ((!rv->astr) || !(TESTAFF(rv->astr, pAMgr->get_forbiddenword(), rv->alen) || TESTAFF(rv->astr, pAMgr->get_needaffix(), rv->alen) || TESTAFF(rv->astr,pAMgr->get_onlyincompound(),rv->alen))) { if (!HENTRY_FIND(rv, MORPH_STEM)) { strcat(result, " "); strcat(result, MORPH_STEM); strcat(result, word); } if (HENTRY_DATA(rv)) { strcat(result, " "); strcat(result, HENTRY_DATA2(rv)); } strcat(result, "\n"); } rv = rv->next_homonym; } st = pAMgr->affix_check_morph(word,strlen(word)); if (st) { strcat(result, st); free(st); } if (pAMgr->get_compound() && (*result == '\0')) pAMgr->compound_check_morph(word, strlen(word), 0, 0, 100, 0,NULL, 0, &r, NULL); return (*result) ? mystrdup(line_uniq(result, MSEP_REC)) : NULL; } #ifdef HUNSPELL_EXPERIMENTAL char * SuggestMgr::suggest_morph_for_spelling_error(const char * word) { char * p = NULL; char ** wlst = (char **) calloc(maxSug, sizeof(char *)); if (!**wlst) return NULL; // we will use only the first suggestion for (int i = 0; i < maxSug - 1; i++) wlst[i] = ""; int ns = suggest(&wlst, word, maxSug - 1, NULL); if (ns == maxSug) { p = suggest_morph(wlst[maxSug - 1]); free(wlst[maxSug - 1]); } if (wlst) free(wlst); return p; } #endif // END OF HUNSPELL_EXPERIMENTAL CODE /* affixation */ char * SuggestMgr::suggest_hentry_gen(hentry * rv, char * pattern) { char result[MAXLNLEN]; *result = '\0'; int sfxcount = get_sfxcount(pattern); if (get_sfxcount(HENTRY_DATA(rv)) > sfxcount) return NULL; if (HENTRY_DATA(rv)) { char * aff = pAMgr->morphgen(HENTRY_WORD(rv), rv->blen, rv->astr, rv->alen, HENTRY_DATA(rv), pattern, 0); if (aff) { strcat(result, aff); strcat(result, "\n"); free(aff); } } // check all allomorphs char allomorph[MAXLNLEN]; char * p = NULL; if (HENTRY_DATA(rv)) p = (char *) strstr(HENTRY_DATA2(rv), MORPH_ALLOMORPH); while (p) { struct hentry * rv2 = NULL; p += MORPH_TAG_LEN; int plen = fieldlen(p); strncpy(allomorph, p, plen); allomorph[plen] = '\0'; rv2 = pAMgr->lookup(allomorph); while (rv2) { // if (HENTRY_DATA(rv2) && get_sfxcount(HENTRY_DATA(rv2)) <= sfxcount) { if (HENTRY_DATA(rv2)) { char * st = (char *) strstr(HENTRY_DATA2(rv2), MORPH_STEM); if (st && (strncmp(st + MORPH_TAG_LEN, HENTRY_WORD(rv), fieldlen(st + MORPH_TAG_LEN)) == 0)) { char * aff = pAMgr->morphgen(HENTRY_WORD(rv2), rv2->blen, rv2->astr, rv2->alen, HENTRY_DATA(rv2), pattern, 0); if (aff) { strcat(result, aff); strcat(result, "\n"); free(aff); } } } rv2 = rv2->next_homonym; } p = strstr(p + plen, MORPH_ALLOMORPH); } return (*result) ? mystrdup(result) : NULL; } char * SuggestMgr::suggest_gen(char ** desc, int n, char * pattern) { char result[MAXLNLEN]; char result2[MAXLNLEN]; char newpattern[MAXLNLEN]; *newpattern = '\0'; if (n == 0) return 0; *result2 = '\0'; struct hentry * rv = NULL; if (!pAMgr) return NULL; // search affixed forms with and without derivational suffixes while(1) { for (int k = 0; k < n; k++) { *result = '\0'; // add compound word parts (except the last one) char * s = (char *) desc[k]; char * part = strstr(s, MORPH_PART); if (part) { char * nextpart = strstr(part + 1, MORPH_PART); while (nextpart) { copy_field(result + strlen(result), part, MORPH_PART); part = nextpart; nextpart = strstr(part + 1, MORPH_PART); } s = part; } char **pl; char tok[MAXLNLEN]; strcpy(tok, s); char * alt = strstr(tok, " | "); while (alt) { alt[1] = MSEP_ALT; alt = strstr(alt, " | "); } int pln = line_tok(tok, &pl, MSEP_ALT); for (int i = 0; i < pln; i++) { // remove inflectional and terminal suffixes char * is = strstr(pl[i], MORPH_INFL_SFX); if (is) *is = '\0'; char * ts = strstr(pl[i], MORPH_TERM_SFX); while (ts) { *ts = '_'; ts = strstr(pl[i], MORPH_TERM_SFX); } char * st = strstr(s, MORPH_STEM); if (st) { copy_field(tok, st, MORPH_STEM); rv = pAMgr->lookup(tok); while (rv) { char newpat[MAXLNLEN]; strcpy(newpat, pl[i]); strcat(newpat, pattern); char * sg = suggest_hentry_gen(rv, newpat); if (!sg) sg = suggest_hentry_gen(rv, pattern); if (sg) { char ** gen; int genl = line_tok(sg, &gen, MSEP_REC); free(sg); sg = NULL; for (int j = 0; j < genl; j++) { if (strstr(pl[i], MORPH_SURF_PFX)) { int r2l = strlen(result2); result2[r2l] = MSEP_REC; strcpy(result2 + r2l + 1, result); copy_field(result2 + strlen(result2), pl[i], MORPH_SURF_PFX); strcat(result2, gen[j]); } else { sprintf(result2 + strlen(result2), "%c%s%s", MSEP_REC, result, gen[j]); } } freelist(&gen, genl); } rv = rv->next_homonym; } } } freelist(&pl, pln); } if (*result2 || !strstr(pattern, MORPH_DERI_SFX)) break; strcpy(newpattern, pattern); pattern = newpattern; char * ds = strstr(pattern, MORPH_DERI_SFX); while (ds) { strncpy(ds, MORPH_TERM_SFX, MORPH_TAG_LEN); ds = strstr(pattern, MORPH_DERI_SFX); } } return (*result2 ? mystrdup(result2) : NULL); } // generate an n-gram score comparing s1 and s2 int SuggestMgr::ngram(int n, char * s1, const char * s2, int opt) { int nscore = 0; int ns; int l1; int l2; if (utf8) { w_char su1[MAXSWL]; w_char su2[MAXSWL]; l1 = u8_u16(su1, MAXSWL, s1); l2 = u8_u16(su2, MAXSWL, s2); if ((l2 <= 0) || (l1 == -1)) return 0; // lowering dictionary word if (opt & NGRAM_LOWERING) mkallsmall_utf(su2, l2, langnum); for (int j = 1; j <= n; j++) { ns = 0; for (int i = 0; i <= (l1-j); i++) { for (int l = 0; l <= (l2-j); l++) { int k; for (k = 0; (k < j); k++) { w_char * c1 = su1 + i + k; w_char * c2 = su2 + l + k; if ((c1->l != c2->l) || (c1->h != c2->h)) break; } if (k == j) { ns++; break; } } } nscore = nscore + ns; if (ns < 2) break; } } else { char t[MAXSWUTF8L]; l1 = strlen(s1); l2 = strlen(s2); if (l2 == 0) return 0; strcpy(t, s2); if (opt & NGRAM_LOWERING) mkallsmall(t, csconv); for (int j = 1; j <= n; j++) { ns = 0; for (int i = 0; i <= (l1-j); i++) { char c = *(s1 + i + j); *(s1 + i + j) = '\0'; if (strstr(t,(s1+i))) ns++; *(s1 + i + j ) = c; } nscore = nscore + ns; if (ns < 2) break; } } ns = 0; if (opt & NGRAM_LONGER_WORSE) ns = (l2-l1)-2; if (opt & NGRAM_ANY_MISMATCH) ns = abs(l2-l1)-2; ns = (nscore - ((ns > 0) ? ns : 0)); return ns; } // length of the left common substring of s1 and (decapitalised) s2 int SuggestMgr::leftcommonsubstring(char * s1, const char * s2) { if (utf8) { w_char su1[MAXSWL]; w_char su2[MAXSWL]; // decapitalize dictionary word if (complexprefixes) { int l1 = u8_u16(su1, MAXSWL, s1); int l2 = u8_u16(su2, MAXSWL, s2); if (*((short *)su1+l1-1) == *((short *)su2+l2-1)) return 1; } else { int i; u8_u16(su1, 1, s1); u8_u16(su2, 1, s2); unsigned short idx = (su2->h << 8) + su2->l; if (*((short *)su1) != *((short *)su2) && (*((unsigned short *)su1) != unicodetolower(idx, langnum))) return 0; int l1 = u8_u16(su1, MAXSWL, s1); int l2 = u8_u16(su2, MAXSWL, s2); for(i = 1; (i < l1) && (i < l2) && (*((short *)(su1 + i)) == *((short *)(su2 + i))); i++); return i; } } else { if (complexprefixes) { int l1 = strlen(s1); int l2 = strlen(s2); if (*(s2+l1-1) == *(s2+l2-1)) return 1; } else { char * olds = s1; // decapitalise dictionary word if ((*s1 != *s2) && (*s1 != csconv[((unsigned char)*s2)].clower)) return 0; do { s1++; s2++; } while ((*s1 == *s2) && (*s1 != '\0')); return s1 - olds; } } return 0; } int SuggestMgr::commoncharacterpositions(char * s1, const char * s2, int * is_swap) { int num = 0; int diff = 0; int diffpos[2]; *is_swap = 0; if (utf8) { w_char su1[MAXSWL]; w_char su2[MAXSWL]; int l1 = u8_u16(su1, MAXSWL, s1); int l2 = u8_u16(su2, MAXSWL, s2); // decapitalize dictionary word if (complexprefixes) { mkallsmall_utf(su2+l2-1, 1, langnum); } else { mkallsmall_utf(su2, 1, langnum); } for (int i = 0; (i < l1) && (i < l2); i++) { if (((short *) su1)[i] == ((short *) su2)[i]) { num++; } else { if (diff < 2) diffpos[diff] = i; diff++; } } if ((diff == 2) && (l1 == l2) && (((short *) su1)[diffpos[0]] == ((short *) su2)[diffpos[1]]) && (((short *) su1)[diffpos[1]] == ((short *) su2)[diffpos[0]])) *is_swap = 1; } else { int i; char t[MAXSWUTF8L]; strcpy(t, s2); // decapitalize dictionary word if (complexprefixes) { int l2 = strlen(t); *(t+l2-1) = csconv[((unsigned char)*(t+l2-1))].clower; } else { mkallsmall(t, csconv); } for (i = 0; (*(s1+i) != 0) && (*(t+i) != 0); i++) { if (*(s1+i) == *(t+i)) { num++; } else { if (diff < 2) diffpos[diff] = i; diff++; } } if ((diff == 2) && (*(s1+i) == 0) && (*(t+i) == 0) && (*(s1+diffpos[0]) == *(t+diffpos[1])) && (*(s1+diffpos[1]) == *(t+diffpos[0]))) *is_swap = 1; } return num; } int SuggestMgr::mystrlen(const char * word) { if (utf8) { w_char w[MAXSWL]; return u8_u16(w, MAXSWL, word); } else return strlen(word); } // sort in decreasing order of score void SuggestMgr::bubblesort(char** rword, char** rword2, int* rsc, int n ) { int m = 1; while (m < n) { int j = m; while (j > 0) { if (rsc[j-1] < rsc[j]) { int sctmp = rsc[j-1]; char * wdtmp = rword[j-1]; rsc[j-1] = rsc[j]; rword[j-1] = rword[j]; rsc[j] = sctmp; rword[j] = wdtmp; if (rword2) { wdtmp = rword2[j-1]; rword2[j-1] = rword2[j]; rword2[j] = wdtmp; } j--; } else break; } m++; } return; } // longest common subsequence void SuggestMgr::lcs(const char * s, const char * s2, int * l1, int * l2, char ** result) { int n, m; w_char su[MAXSWL]; w_char su2[MAXSWL]; char * b; char * c; int i; int j; if (utf8) { m = u8_u16(su, MAXSWL, s); n = u8_u16(su2, MAXSWL, s2); } else { m = strlen(s); n = strlen(s2); } c = (char *) malloc((m + 1) * (n + 1)); b = (char *) malloc((m + 1) * (n + 1)); if (!c || !b) { if (c) free(c); if (b) free(b); *result = NULL; return; } for (i = 1; i <= m; i++) c[i*(n+1)] = 0; for (j = 0; j <= n; j++) c[j] = 0; for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) { if ((utf8) && (*((short *) su+i-1) == *((short *)su2+j-1)) || (!utf8) && ((*(s+i-1)) == (*(s2+j-1)))) { c[i*(n+1) + j] = c[(i-1)*(n+1) + j-1]+1; b[i*(n+1) + j] = LCS_UPLEFT; } else if (c[(i-1)*(n+1) + j] >= c[i*(n+1) + j-1]) { c[i*(n+1) + j] = c[(i-1)*(n+1) + j]; b[i*(n+1) + j] = LCS_UP; } else { c[i*(n+1) + j] = c[i*(n+1) + j-1]; b[i*(n+1) + j] = LCS_LEFT; } } } *result = b; free(c); *l1 = m; *l2 = n; } int SuggestMgr::lcslen(const char * s, const char* s2) { int m; int n; int i; int j; char * result; int len = 0; lcs(s, s2, &m, &n, &result); if (!result) return 0; i = m; j = n; while ((i != 0) && (j != 0)) { if (result[i*(n+1) + j] == LCS_UPLEFT) { len++; i--; j--; } else if (result[i*(n+1) + j] == LCS_UP) { i--; } else j--; } free(result); return len; } robojournal-0.4.2/ui/hunspell/langnum.hxx0000644000175000017500000000653112211723646017223 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef _LANGNUM_HXX_ #define _LANGNUM_HXX_ /* language numbers for language specific codes see http://l10n.openoffice.org/languages.html */ enum { LANG_ar=96, LANG_az=100, // custom number LANG_bg=41, LANG_ca=37, LANG_cs=42, LANG_da=45, LANG_de=49, LANG_el=30, LANG_en=01, LANG_es=34, LANG_eu=10, LANG_fr=02, LANG_gl=38, LANG_hr=78, LANG_hu=36, LANG_it=39, LANG_la=99, // custom number LANG_lv=101, // custom number LANG_nl=31, LANG_pl=48, LANG_pt=03, LANG_ru=07, LANG_sv=50, LANG_tr=90, LANG_uk=80, LANG_xx=999 }; #endif robojournal-0.4.2/ui/hunspell/dictmgr.hxx0000644000175000017500000000662112211723646017213 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef _DICTMGR_HXX_ #define _DICTMGR_HXX_ #define MAXDICTIONARIES 100 #define MAXDICTENTRYLEN 1024 struct dictentry { char * filename; char * lang; char * region; }; class DictMgr { int numdict; dictentry * pdentry; public: DictMgr(const char * dictpath, const char * etype); ~DictMgr(); int get_list(dictentry** ppentry); private: int parse_file(const char * dictpath, const char * etype); char * mystrsep(char ** stringp, const char delim); char * mystrdup(const char * s); void mychomp(char * s); }; #endif robojournal-0.4.2/ui/hunspell/hunzip.hxx0000644000175000017500000000752512211723646017103 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* hunzip: file decompression for sorted dictionaries with optional encryption, * algorithm: prefix-suffix encoding and 16-bit Huffman encoding */ #ifndef _HUNZIP_HXX_ #define _HUNZIP_HXX_ #define BUFSIZE 65536 #define HZIP_EXTENSION ".hz" #define MSG_OPEN "error: %s: cannot open\n" #define MSG_FORMAT "error: %s: not in hzip format\n" #define MSG_MEMORY "error: %s: missing memory\n" #define MSG_KEY "error: %s: missing or bad password\n" struct bit { unsigned char c[2]; int v[2]; }; class Hunzip { protected: char * filename; FILE * fin; int bufsiz, lastbit, inc, inbits, outc; struct bit * dec; // code table char in[BUFSIZE]; // input buffer char out[BUFSIZE + 1]; // Huffman-decoded buffer char line[BUFSIZE + 50]; // decoded line int getcode(const char * key); int getbuf(); int fail(const char * err, const char * par); public: Hunzip(const char * filename, const char * key = NULL); ~Hunzip(); const char * getline(); }; #endif robojournal-0.4.2/ui/hunspell/affentry.hxx0000644000175000017500000001621012211723646017373 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef _AFFIX_HXX_ #define _AFFIX_HXX_ #include "atypes.hxx" #include "baseaffix.hxx" #include "affixmgr.hxx" /* A Prefix Entry */ class PfxEntry : public AffEntry { AffixMgr* pmyMgr; PfxEntry * next; PfxEntry * nexteq; PfxEntry * nextne; PfxEntry * flgnxt; public: PfxEntry(AffixMgr* pmgr, affentry* dp ); ~PfxEntry(); inline bool allowCross() { return ((opts & aeXPRODUCT) != 0); } struct hentry * checkword(const char * word, int len, char in_compound, const FLAG needflag = FLAG_NULL); struct hentry * check_twosfx(const char * word, int len, char in_compound, const FLAG needflag = NULL); char * check_morph(const char * word, int len, char in_compound, const FLAG needflag = FLAG_NULL); char * check_twosfx_morph(const char * word, int len, char in_compound, const FLAG needflag = FLAG_NULL); inline FLAG getFlag() { return aflag; } inline const char * getKey() { return appnd; } char * add(const char * word, int len); inline short getKeyLen() { return appndl; } inline const char * getMorph() { return morphcode; } inline const unsigned short * getCont() { return contclass; } inline short getContLen() { return contclasslen; } inline PfxEntry * getNext() { return next; } inline PfxEntry * getNextNE() { return nextne; } inline PfxEntry * getNextEQ() { return nexteq; } inline PfxEntry * getFlgNxt() { return flgnxt; } inline void setNext(PfxEntry * ptr) { next = ptr; } inline void setNextNE(PfxEntry * ptr) { nextne = ptr; } inline void setNextEQ(PfxEntry * ptr) { nexteq = ptr; } inline void setFlgNxt(PfxEntry * ptr) { flgnxt = ptr; } inline char * nextchar(char * p); inline int test_condition(const char * st); }; /* A Suffix Entry */ class SfxEntry : public AffEntry { AffixMgr* pmyMgr; char * rappnd; SfxEntry * next; SfxEntry * nexteq; SfxEntry * nextne; SfxEntry * flgnxt; SfxEntry * l_morph; SfxEntry * r_morph; SfxEntry * eq_morph; public: SfxEntry(AffixMgr* pmgr, affentry* dp ); ~SfxEntry(); inline bool allowCross() { return ((opts & aeXPRODUCT) != 0); } struct hentry * checkword(const char * word, int len, int optflags, AffEntry* ppfx, char ** wlst, int maxSug, int * ns, // const FLAG cclass = FLAG_NULL, const FLAG needflag = FLAG_NULL, char in_compound=IN_CPD_NOT); const FLAG cclass = FLAG_NULL, const FLAG needflag = FLAG_NULL, const FLAG badflag = 0); struct hentry * check_twosfx(const char * word, int len, int optflags, AffEntry* ppfx, const FLAG needflag = NULL); char * check_twosfx_morph(const char * word, int len, int optflags, AffEntry* ppfx, const FLAG needflag = FLAG_NULL); struct hentry * get_next_homonym(struct hentry * he); struct hentry * get_next_homonym(struct hentry * word, int optflags, AffEntry* ppfx, const FLAG cclass, const FLAG needflag); inline FLAG getFlag() { return aflag; } inline const char * getKey() { return rappnd; } char * add(const char * word, int len); inline const char * getMorph() { return morphcode; } inline const unsigned short * getCont() { return contclass; } inline short getContLen() { return contclasslen; } inline const char * getAffix() { return appnd; } inline short getKeyLen() { return appndl; } inline SfxEntry * getNext() { return next; } inline SfxEntry * getNextNE() { return nextne; } inline SfxEntry * getNextEQ() { return nexteq; } inline SfxEntry * getLM() { return l_morph; } inline SfxEntry * getRM() { return r_morph; } inline SfxEntry * getEQM() { return eq_morph; } inline SfxEntry * getFlgNxt() { return flgnxt; } inline void setNext(SfxEntry * ptr) { next = ptr; } inline void setNextNE(SfxEntry * ptr) { nextne = ptr; } inline void setNextEQ(SfxEntry * ptr) { nexteq = ptr; } inline void setFlgNxt(SfxEntry * ptr) { flgnxt = ptr; } inline char * nextchar(char * p); inline int test_condition(const char * st, const char * begin); }; #endif robojournal-0.4.2/ui/hunspell/baseaffix.hxx0000644000175000017500000000654012211723646017512 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef _BASEAFF_HXX_ #define _BASEAFF_HXX_ class AffEntry { public: protected: char * appnd; char * strip; unsigned char appndl; unsigned char stripl; char numconds; char opts; unsigned short aflag; union { char conds[MAXCONDLEN]; struct { char conds1[MAXCONDLEN_1]; char * conds2; } l; } c; char * morphcode; unsigned short * contclass; short contclasslen; }; #endif robojournal-0.4.2/ui/hunspell/utf_info.cxx0000644000175000017500000072665512211723646017406 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "ui/hunspell/csutil.hxx" /* fields: Unicode letter, toupper, tolower */ static struct unicode_info utf_lst[] = { { 0x0041, 0x0041, 0x0061 }, { 0x0042, 0x0042, 0x0062 }, { 0x0043, 0x0043, 0x0063 }, { 0x0044, 0x0044, 0x0064 }, { 0x0045, 0x0045, 0x0065 }, { 0x0046, 0x0046, 0x0066 }, { 0x0047, 0x0047, 0x0067 }, { 0x0048, 0x0048, 0x0068 }, { 0x0049, 0x0049, 0x0069 }, { 0x004A, 0x004A, 0x006A }, { 0x004B, 0x004B, 0x006B }, { 0x004C, 0x004C, 0x006C }, { 0x004D, 0x004D, 0x006D }, { 0x004E, 0x004E, 0x006E }, { 0x004F, 0x004F, 0x006F }, { 0x0050, 0x0050, 0x0070 }, { 0x0051, 0x0051, 0x0071 }, { 0x0052, 0x0052, 0x0072 }, { 0x0053, 0x0053, 0x0073 }, { 0x0054, 0x0054, 0x0074 }, { 0x0055, 0x0055, 0x0075 }, { 0x0056, 0x0056, 0x0076 }, { 0x0057, 0x0057, 0x0077 }, { 0x0058, 0x0058, 0x0078 }, { 0x0059, 0x0059, 0x0079 }, { 0x005A, 0x005A, 0x007A }, { 0x0061, 0x0041, 0x0061 }, { 0x0062, 0x0042, 0x0062 }, { 0x0063, 0x0043, 0x0063 }, { 0x0064, 0x0044, 0x0064 }, { 0x0065, 0x0045, 0x0065 }, { 0x0066, 0x0046, 0x0066 }, { 0x0067, 0x0047, 0x0067 }, { 0x0068, 0x0048, 0x0068 }, { 0x0069, 0x0049, 0x0069 }, { 0x006A, 0x004A, 0x006A }, { 0x006B, 0x004B, 0x006B }, { 0x006C, 0x004C, 0x006C }, { 0x006D, 0x004D, 0x006D }, { 0x006E, 0x004E, 0x006E }, { 0x006F, 0x004F, 0x006F }, { 0x0070, 0x0050, 0x0070 }, { 0x0071, 0x0051, 0x0071 }, { 0x0072, 0x0052, 0x0072 }, { 0x0073, 0x0053, 0x0073 }, { 0x0074, 0x0054, 0x0074 }, { 0x0075, 0x0055, 0x0075 }, { 0x0076, 0x0056, 0x0076 }, { 0x0077, 0x0057, 0x0077 }, { 0x0078, 0x0058, 0x0078 }, { 0x0079, 0x0059, 0x0079 }, { 0x007A, 0x005A, 0x007A }, { 0x00AA, 0x00AA, 0x00AA }, { 0x00B5, 0x039C, 0x00B5 }, { 0x00BA, 0x00BA, 0x00BA }, { 0x00C0, 0x00C0, 0x00E0 }, { 0x00C1, 0x00C1, 0x00E1 }, { 0x00C2, 0x00C2, 0x00E2 }, { 0x00C3, 0x00C3, 0x00E3 }, { 0x00C4, 0x00C4, 0x00E4 }, { 0x00C5, 0x00C5, 0x00E5 }, { 0x00C6, 0x00C6, 0x00E6 }, { 0x00C7, 0x00C7, 0x00E7 }, { 0x00C8, 0x00C8, 0x00E8 }, { 0x00C9, 0x00C9, 0x00E9 }, { 0x00CA, 0x00CA, 0x00EA }, { 0x00CB, 0x00CB, 0x00EB }, { 0x00CC, 0x00CC, 0x00EC }, { 0x00CD, 0x00CD, 0x00ED }, { 0x00CE, 0x00CE, 0x00EE }, { 0x00CF, 0x00CF, 0x00EF }, { 0x00D0, 0x00D0, 0x00F0 }, { 0x00D1, 0x00D1, 0x00F1 }, { 0x00D2, 0x00D2, 0x00F2 }, { 0x00D3, 0x00D3, 0x00F3 }, { 0x00D4, 0x00D4, 0x00F4 }, { 0x00D5, 0x00D5, 0x00F5 }, { 0x00D6, 0x00D6, 0x00F6 }, { 0x00D8, 0x00D8, 0x00F8 }, { 0x00D9, 0x00D9, 0x00F9 }, { 0x00DA, 0x00DA, 0x00FA }, { 0x00DB, 0x00DB, 0x00FB }, { 0x00DC, 0x00DC, 0x00FC }, { 0x00DD, 0x00DD, 0x00FD }, { 0x00DE, 0x00DE, 0x00FE }, { 0x00DF, 0x00DF, 0x00DF }, { 0x00E0, 0x00C0, 0x00E0 }, { 0x00E1, 0x00C1, 0x00E1 }, { 0x00E2, 0x00C2, 0x00E2 }, { 0x00E3, 0x00C3, 0x00E3 }, { 0x00E4, 0x00C4, 0x00E4 }, { 0x00E5, 0x00C5, 0x00E5 }, { 0x00E6, 0x00C6, 0x00E6 }, { 0x00E7, 0x00C7, 0x00E7 }, { 0x00E8, 0x00C8, 0x00E8 }, { 0x00E9, 0x00C9, 0x00E9 }, { 0x00EA, 0x00CA, 0x00EA }, { 0x00EB, 0x00CB, 0x00EB }, { 0x00EC, 0x00CC, 0x00EC }, { 0x00ED, 0x00CD, 0x00ED }, { 0x00EE, 0x00CE, 0x00EE }, { 0x00EF, 0x00CF, 0x00EF }, { 0x00F0, 0x00D0, 0x00F0 }, { 0x00F1, 0x00D1, 0x00F1 }, { 0x00F2, 0x00D2, 0x00F2 }, { 0x00F3, 0x00D3, 0x00F3 }, { 0x00F4, 0x00D4, 0x00F4 }, { 0x00F5, 0x00D5, 0x00F5 }, { 0x00F6, 0x00D6, 0x00F6 }, { 0x00F8, 0x00D8, 0x00F8 }, { 0x00F9, 0x00D9, 0x00F9 }, { 0x00FA, 0x00DA, 0x00FA }, { 0x00FB, 0x00DB, 0x00FB }, { 0x00FC, 0x00DC, 0x00FC }, { 0x00FD, 0x00DD, 0x00FD }, { 0x00FE, 0x00DE, 0x00FE }, { 0x00FF, 0x0178, 0x00FF }, { 0x0100, 0x0100, 0x0101 }, { 0x0101, 0x0100, 0x0101 }, { 0x0102, 0x0102, 0x0103 }, { 0x0103, 0x0102, 0x0103 }, { 0x0104, 0x0104, 0x0105 }, { 0x0105, 0x0104, 0x0105 }, { 0x0106, 0x0106, 0x0107 }, { 0x0107, 0x0106, 0x0107 }, { 0x0108, 0x0108, 0x0109 }, { 0x0109, 0x0108, 0x0109 }, { 0x010A, 0x010A, 0x010B }, { 0x010B, 0x010A, 0x010B }, { 0x010C, 0x010C, 0x010D }, { 0x010D, 0x010C, 0x010D }, { 0x010E, 0x010E, 0x010F }, { 0x010F, 0x010E, 0x010F }, { 0x0110, 0x0110, 0x0111 }, { 0x0111, 0x0110, 0x0111 }, { 0x0112, 0x0112, 0x0113 }, { 0x0113, 0x0112, 0x0113 }, { 0x0114, 0x0114, 0x0115 }, { 0x0115, 0x0114, 0x0115 }, { 0x0116, 0x0116, 0x0117 }, { 0x0117, 0x0116, 0x0117 }, { 0x0118, 0x0118, 0x0119 }, { 0x0119, 0x0118, 0x0119 }, { 0x011A, 0x011A, 0x011B }, { 0x011B, 0x011A, 0x011B }, { 0x011C, 0x011C, 0x011D }, { 0x011D, 0x011C, 0x011D }, { 0x011E, 0x011E, 0x011F }, { 0x011F, 0x011E, 0x011F }, { 0x0120, 0x0120, 0x0121 }, { 0x0121, 0x0120, 0x0121 }, { 0x0122, 0x0122, 0x0123 }, { 0x0123, 0x0122, 0x0123 }, { 0x0124, 0x0124, 0x0125 }, { 0x0125, 0x0124, 0x0125 }, { 0x0126, 0x0126, 0x0127 }, { 0x0127, 0x0126, 0x0127 }, { 0x0128, 0x0128, 0x0129 }, { 0x0129, 0x0128, 0x0129 }, { 0x012A, 0x012A, 0x012B }, { 0x012B, 0x012A, 0x012B }, { 0x012C, 0x012C, 0x012D }, { 0x012D, 0x012C, 0x012D }, { 0x012E, 0x012E, 0x012F }, { 0x012F, 0x012E, 0x012F }, { 0x0130, 0x0130, 0x0069 }, { 0x0131, 0x0049, 0x0131 }, { 0x0132, 0x0132, 0x0133 }, { 0x0133, 0x0132, 0x0133 }, { 0x0134, 0x0134, 0x0135 }, { 0x0135, 0x0134, 0x0135 }, { 0x0136, 0x0136, 0x0137 }, { 0x0137, 0x0136, 0x0137 }, { 0x0138, 0x0138, 0x0138 }, { 0x0139, 0x0139, 0x013A }, { 0x013A, 0x0139, 0x013A }, { 0x013B, 0x013B, 0x013C }, { 0x013C, 0x013B, 0x013C }, { 0x013D, 0x013D, 0x013E }, { 0x013E, 0x013D, 0x013E }, { 0x013F, 0x013F, 0x0140 }, { 0x0140, 0x013F, 0x0140 }, { 0x0141, 0x0141, 0x0142 }, { 0x0142, 0x0141, 0x0142 }, { 0x0143, 0x0143, 0x0144 }, { 0x0144, 0x0143, 0x0144 }, { 0x0145, 0x0145, 0x0146 }, { 0x0146, 0x0145, 0x0146 }, { 0x0147, 0x0147, 0x0148 }, { 0x0148, 0x0147, 0x0148 }, { 0x0149, 0x0149, 0x0149 }, { 0x014A, 0x014A, 0x014B }, { 0x014B, 0x014A, 0x014B }, { 0x014C, 0x014C, 0x014D }, { 0x014D, 0x014C, 0x014D }, { 0x014E, 0x014E, 0x014F }, { 0x014F, 0x014E, 0x014F }, { 0x0150, 0x0150, 0x0151 }, { 0x0151, 0x0150, 0x0151 }, { 0x0152, 0x0152, 0x0153 }, { 0x0153, 0x0152, 0x0153 }, { 0x0154, 0x0154, 0x0155 }, { 0x0155, 0x0154, 0x0155 }, { 0x0156, 0x0156, 0x0157 }, { 0x0157, 0x0156, 0x0157 }, { 0x0158, 0x0158, 0x0159 }, { 0x0159, 0x0158, 0x0159 }, { 0x015A, 0x015A, 0x015B }, { 0x015B, 0x015A, 0x015B }, { 0x015C, 0x015C, 0x015D }, { 0x015D, 0x015C, 0x015D }, { 0x015E, 0x015E, 0x015F }, { 0x015F, 0x015E, 0x015F }, { 0x0160, 0x0160, 0x0161 }, { 0x0161, 0x0160, 0x0161 }, { 0x0162, 0x0162, 0x0163 }, { 0x0163, 0x0162, 0x0163 }, { 0x0164, 0x0164, 0x0165 }, { 0x0165, 0x0164, 0x0165 }, { 0x0166, 0x0166, 0x0167 }, { 0x0167, 0x0166, 0x0167 }, { 0x0168, 0x0168, 0x0169 }, { 0x0169, 0x0168, 0x0169 }, { 0x016A, 0x016A, 0x016B }, { 0x016B, 0x016A, 0x016B }, { 0x016C, 0x016C, 0x016D }, { 0x016D, 0x016C, 0x016D }, { 0x016E, 0x016E, 0x016F }, { 0x016F, 0x016E, 0x016F }, { 0x0170, 0x0170, 0x0171 }, { 0x0171, 0x0170, 0x0171 }, { 0x0172, 0x0172, 0x0173 }, { 0x0173, 0x0172, 0x0173 }, { 0x0174, 0x0174, 0x0175 }, { 0x0175, 0x0174, 0x0175 }, { 0x0176, 0x0176, 0x0177 }, { 0x0177, 0x0176, 0x0177 }, { 0x0178, 0x0178, 0x00FF }, { 0x0179, 0x0179, 0x017A }, { 0x017A, 0x0179, 0x017A }, { 0x017B, 0x017B, 0x017C }, { 0x017C, 0x017B, 0x017C }, { 0x017D, 0x017D, 0x017E }, { 0x017E, 0x017D, 0x017E }, { 0x017F, 0x0053, 0x017F }, { 0x0180, 0x0180, 0x0180 }, { 0x0181, 0x0181, 0x0253 }, { 0x0182, 0x0182, 0x0183 }, { 0x0183, 0x0182, 0x0183 }, { 0x0184, 0x0184, 0x0185 }, { 0x0185, 0x0184, 0x0185 }, { 0x0186, 0x0186, 0x0254 }, { 0x0187, 0x0187, 0x0188 }, { 0x0188, 0x0187, 0x0188 }, { 0x0189, 0x0189, 0x0256 }, { 0x018A, 0x018A, 0x0257 }, { 0x018B, 0x018B, 0x018C }, { 0x018C, 0x018B, 0x018C }, { 0x018D, 0x018D, 0x018D }, { 0x018E, 0x018E, 0x01DD }, { 0x018F, 0x018F, 0x0259 }, { 0x0190, 0x0190, 0x025B }, { 0x0191, 0x0191, 0x0192 }, { 0x0192, 0x0191, 0x0192 }, { 0x0193, 0x0193, 0x0260 }, { 0x0194, 0x0194, 0x0263 }, { 0x0195, 0x01F6, 0x0195 }, { 0x0196, 0x0196, 0x0269 }, { 0x0197, 0x0197, 0x0268 }, { 0x0198, 0x0198, 0x0199 }, { 0x0199, 0x0198, 0x0199 }, { 0x019A, 0x023D, 0x019A }, { 0x019B, 0x019B, 0x019B }, { 0x019C, 0x019C, 0x026F }, { 0x019D, 0x019D, 0x0272 }, { 0x019E, 0x0220, 0x019E }, { 0x019F, 0x019F, 0x0275 }, { 0x01A0, 0x01A0, 0x01A1 }, { 0x01A1, 0x01A0, 0x01A1 }, { 0x01A2, 0x01A2, 0x01A3 }, { 0x01A3, 0x01A2, 0x01A3 }, { 0x01A4, 0x01A4, 0x01A5 }, { 0x01A5, 0x01A4, 0x01A5 }, { 0x01A6, 0x01A6, 0x0280 }, { 0x01A7, 0x01A7, 0x01A8 }, { 0x01A8, 0x01A7, 0x01A8 }, { 0x01A9, 0x01A9, 0x0283 }, { 0x01AA, 0x01AA, 0x01AA }, { 0x01AB, 0x01AB, 0x01AB }, { 0x01AC, 0x01AC, 0x01AD }, { 0x01AD, 0x01AC, 0x01AD }, { 0x01AE, 0x01AE, 0x0288 }, { 0x01AF, 0x01AF, 0x01B0 }, { 0x01B0, 0x01AF, 0x01B0 }, { 0x01B1, 0x01B1, 0x028A }, { 0x01B2, 0x01B2, 0x028B }, { 0x01B3, 0x01B3, 0x01B4 }, { 0x01B4, 0x01B3, 0x01B4 }, { 0x01B5, 0x01B5, 0x01B6 }, { 0x01B6, 0x01B5, 0x01B6 }, { 0x01B7, 0x01B7, 0x0292 }, { 0x01B8, 0x01B8, 0x01B9 }, { 0x01B9, 0x01B8, 0x01B9 }, { 0x01BA, 0x01BA, 0x01BA }, { 0x01BB, 0x01BB, 0x01BB }, { 0x01BC, 0x01BC, 0x01BD }, { 0x01BD, 0x01BC, 0x01BD }, { 0x01BE, 0x01BE, 0x01BE }, { 0x01BF, 0x01F7, 0x01BF }, { 0x01C0, 0x01C0, 0x01C0 }, { 0x01C1, 0x01C1, 0x01C1 }, { 0x01C2, 0x01C2, 0x01C2 }, { 0x01C3, 0x01C3, 0x01C3 }, { 0x01C4, 0x01C4, 0x01C6 }, { 0x01C5, 0x01C4, 0x01C6 }, { 0x01C6, 0x01C4, 0x01C6 }, { 0x01C7, 0x01C7, 0x01C9 }, { 0x01C8, 0x01C7, 0x01C9 }, { 0x01C9, 0x01C7, 0x01C9 }, { 0x01CA, 0x01CA, 0x01CC }, { 0x01CB, 0x01CA, 0x01CC }, { 0x01CC, 0x01CA, 0x01CC }, { 0x01CD, 0x01CD, 0x01CE }, { 0x01CE, 0x01CD, 0x01CE }, { 0x01CF, 0x01CF, 0x01D0 }, { 0x01D0, 0x01CF, 0x01D0 }, { 0x01D1, 0x01D1, 0x01D2 }, { 0x01D2, 0x01D1, 0x01D2 }, { 0x01D3, 0x01D3, 0x01D4 }, { 0x01D4, 0x01D3, 0x01D4 }, { 0x01D5, 0x01D5, 0x01D6 }, { 0x01D6, 0x01D5, 0x01D6 }, { 0x01D7, 0x01D7, 0x01D8 }, { 0x01D8, 0x01D7, 0x01D8 }, { 0x01D9, 0x01D9, 0x01DA }, { 0x01DA, 0x01D9, 0x01DA }, { 0x01DB, 0x01DB, 0x01DC }, { 0x01DC, 0x01DB, 0x01DC }, { 0x01DD, 0x018E, 0x01DD }, { 0x01DE, 0x01DE, 0x01DF }, { 0x01DF, 0x01DE, 0x01DF }, { 0x01E0, 0x01E0, 0x01E1 }, { 0x01E1, 0x01E0, 0x01E1 }, { 0x01E2, 0x01E2, 0x01E3 }, { 0x01E3, 0x01E2, 0x01E3 }, { 0x01E4, 0x01E4, 0x01E5 }, { 0x01E5, 0x01E4, 0x01E5 }, { 0x01E6, 0x01E6, 0x01E7 }, { 0x01E7, 0x01E6, 0x01E7 }, { 0x01E8, 0x01E8, 0x01E9 }, { 0x01E9, 0x01E8, 0x01E9 }, { 0x01EA, 0x01EA, 0x01EB }, { 0x01EB, 0x01EA, 0x01EB }, { 0x01EC, 0x01EC, 0x01ED }, { 0x01ED, 0x01EC, 0x01ED }, { 0x01EE, 0x01EE, 0x01EF }, { 0x01EF, 0x01EE, 0x01EF }, { 0x01F0, 0x01F0, 0x01F0 }, { 0x01F1, 0x01F1, 0x01F3 }, { 0x01F2, 0x01F1, 0x01F3 }, { 0x01F3, 0x01F1, 0x01F3 }, { 0x01F4, 0x01F4, 0x01F5 }, { 0x01F5, 0x01F4, 0x01F5 }, { 0x01F6, 0x01F6, 0x0195 }, { 0x01F7, 0x01F7, 0x01BF }, { 0x01F8, 0x01F8, 0x01F9 }, { 0x01F9, 0x01F8, 0x01F9 }, { 0x01FA, 0x01FA, 0x01FB }, { 0x01FB, 0x01FA, 0x01FB }, { 0x01FC, 0x01FC, 0x01FD }, { 0x01FD, 0x01FC, 0x01FD }, { 0x01FE, 0x01FE, 0x01FF }, { 0x01FF, 0x01FE, 0x01FF }, { 0x0200, 0x0200, 0x0201 }, { 0x0201, 0x0200, 0x0201 }, { 0x0202, 0x0202, 0x0203 }, { 0x0203, 0x0202, 0x0203 }, { 0x0204, 0x0204, 0x0205 }, { 0x0205, 0x0204, 0x0205 }, { 0x0206, 0x0206, 0x0207 }, { 0x0207, 0x0206, 0x0207 }, { 0x0208, 0x0208, 0x0209 }, { 0x0209, 0x0208, 0x0209 }, { 0x020A, 0x020A, 0x020B }, { 0x020B, 0x020A, 0x020B }, { 0x020C, 0x020C, 0x020D }, { 0x020D, 0x020C, 0x020D }, { 0x020E, 0x020E, 0x020F }, { 0x020F, 0x020E, 0x020F }, { 0x0210, 0x0210, 0x0211 }, { 0x0211, 0x0210, 0x0211 }, { 0x0212, 0x0212, 0x0213 }, { 0x0213, 0x0212, 0x0213 }, { 0x0214, 0x0214, 0x0215 }, { 0x0215, 0x0214, 0x0215 }, { 0x0216, 0x0216, 0x0217 }, { 0x0217, 0x0216, 0x0217 }, { 0x0218, 0x0218, 0x0219 }, { 0x0219, 0x0218, 0x0219 }, { 0x021A, 0x021A, 0x021B }, { 0x021B, 0x021A, 0x021B }, { 0x021C, 0x021C, 0x021D }, { 0x021D, 0x021C, 0x021D }, { 0x021E, 0x021E, 0x021F }, { 0x021F, 0x021E, 0x021F }, { 0x0220, 0x0220, 0x019E }, { 0x0221, 0x0221, 0x0221 }, { 0x0222, 0x0222, 0x0223 }, { 0x0223, 0x0222, 0x0223 }, { 0x0224, 0x0224, 0x0225 }, { 0x0225, 0x0224, 0x0225 }, { 0x0226, 0x0226, 0x0227 }, { 0x0227, 0x0226, 0x0227 }, { 0x0228, 0x0228, 0x0229 }, { 0x0229, 0x0228, 0x0229 }, { 0x022A, 0x022A, 0x022B }, { 0x022B, 0x022A, 0x022B }, { 0x022C, 0x022C, 0x022D }, { 0x022D, 0x022C, 0x022D }, { 0x022E, 0x022E, 0x022F }, { 0x022F, 0x022E, 0x022F }, { 0x0230, 0x0230, 0x0231 }, { 0x0231, 0x0230, 0x0231 }, { 0x0232, 0x0232, 0x0233 }, { 0x0233, 0x0232, 0x0233 }, { 0x0234, 0x0234, 0x0234 }, { 0x0235, 0x0235, 0x0235 }, { 0x0236, 0x0236, 0x0236 }, { 0x0237, 0x0237, 0x0237 }, { 0x0238, 0x0238, 0x0238 }, { 0x0239, 0x0239, 0x0239 }, { 0x023A, 0x023A, 0x023A }, { 0x023B, 0x023B, 0x023C }, { 0x023C, 0x023B, 0x023C }, { 0x023D, 0x023D, 0x019A }, { 0x023E, 0x023E, 0x023E }, { 0x023F, 0x023F, 0x023F }, { 0x0240, 0x0240, 0x0240 }, { 0x0241, 0x0241, 0x0294 }, { 0x0250, 0x0250, 0x0250 }, { 0x0251, 0x0251, 0x0251 }, { 0x0252, 0x0252, 0x0252 }, { 0x0253, 0x0181, 0x0253 }, { 0x0254, 0x0186, 0x0254 }, { 0x0255, 0x0255, 0x0255 }, { 0x0256, 0x0189, 0x0256 }, { 0x0257, 0x018A, 0x0257 }, { 0x0258, 0x0258, 0x0258 }, { 0x0259, 0x018F, 0x0259 }, { 0x025A, 0x025A, 0x025A }, { 0x025B, 0x0190, 0x025B }, { 0x025C, 0x025C, 0x025C }, { 0x025D, 0x025D, 0x025D }, { 0x025E, 0x025E, 0x025E }, { 0x025F, 0x025F, 0x025F }, { 0x0260, 0x0193, 0x0260 }, { 0x0261, 0x0261, 0x0261 }, { 0x0262, 0x0262, 0x0262 }, { 0x0263, 0x0194, 0x0263 }, { 0x0264, 0x0264, 0x0264 }, { 0x0265, 0x0265, 0x0265 }, { 0x0266, 0x0266, 0x0266 }, { 0x0267, 0x0267, 0x0267 }, { 0x0268, 0x0197, 0x0268 }, { 0x0269, 0x0196, 0x0269 }, { 0x026A, 0x026A, 0x026A }, { 0x026B, 0x026B, 0x026B }, { 0x026C, 0x026C, 0x026C }, { 0x026D, 0x026D, 0x026D }, { 0x026E, 0x026E, 0x026E }, { 0x026F, 0x019C, 0x026F }, { 0x0270, 0x0270, 0x0270 }, { 0x0271, 0x0271, 0x0271 }, { 0x0272, 0x019D, 0x0272 }, { 0x0273, 0x0273, 0x0273 }, { 0x0274, 0x0274, 0x0274 }, { 0x0275, 0x019F, 0x0275 }, { 0x0276, 0x0276, 0x0276 }, { 0x0277, 0x0277, 0x0277 }, { 0x0278, 0x0278, 0x0278 }, { 0x0279, 0x0279, 0x0279 }, { 0x027A, 0x027A, 0x027A }, { 0x027B, 0x027B, 0x027B }, { 0x027C, 0x027C, 0x027C }, { 0x027D, 0x027D, 0x027D }, { 0x027E, 0x027E, 0x027E }, { 0x027F, 0x027F, 0x027F }, { 0x0280, 0x01A6, 0x0280 }, { 0x0281, 0x0281, 0x0281 }, { 0x0282, 0x0282, 0x0282 }, { 0x0283, 0x01A9, 0x0283 }, { 0x0284, 0x0284, 0x0284 }, { 0x0285, 0x0285, 0x0285 }, { 0x0286, 0x0286, 0x0286 }, { 0x0287, 0x0287, 0x0287 }, { 0x0288, 0x01AE, 0x0288 }, { 0x0289, 0x0289, 0x0289 }, { 0x028A, 0x01B1, 0x028A }, { 0x028B, 0x01B2, 0x028B }, { 0x028C, 0x028C, 0x028C }, { 0x028D, 0x028D, 0x028D }, { 0x028E, 0x028E, 0x028E }, { 0x028F, 0x028F, 0x028F }, { 0x0290, 0x0290, 0x0290 }, { 0x0291, 0x0291, 0x0291 }, { 0x0292, 0x01B7, 0x0292 }, { 0x0293, 0x0293, 0x0293 }, { 0x0294, 0x0241, 0x0294 }, { 0x0295, 0x0295, 0x0295 }, { 0x0296, 0x0296, 0x0296 }, { 0x0297, 0x0297, 0x0297 }, { 0x0298, 0x0298, 0x0298 }, { 0x0299, 0x0299, 0x0299 }, { 0x029A, 0x029A, 0x029A }, { 0x029B, 0x029B, 0x029B }, { 0x029C, 0x029C, 0x029C }, { 0x029D, 0x029D, 0x029D }, { 0x029E, 0x029E, 0x029E }, { 0x029F, 0x029F, 0x029F }, { 0x02A0, 0x02A0, 0x02A0 }, { 0x02A1, 0x02A1, 0x02A1 }, { 0x02A2, 0x02A2, 0x02A2 }, { 0x02A3, 0x02A3, 0x02A3 }, { 0x02A4, 0x02A4, 0x02A4 }, { 0x02A5, 0x02A5, 0x02A5 }, { 0x02A6, 0x02A6, 0x02A6 }, { 0x02A7, 0x02A7, 0x02A7 }, { 0x02A8, 0x02A8, 0x02A8 }, { 0x02A9, 0x02A9, 0x02A9 }, { 0x02AA, 0x02AA, 0x02AA }, { 0x02AB, 0x02AB, 0x02AB }, { 0x02AC, 0x02AC, 0x02AC }, { 0x02AD, 0x02AD, 0x02AD }, { 0x02AE, 0x02AE, 0x02AE }, { 0x02AF, 0x02AF, 0x02AF }, { 0x02B0, 0x02B0, 0x02B0 }, { 0x02B1, 0x02B1, 0x02B1 }, { 0x02B2, 0x02B2, 0x02B2 }, { 0x02B3, 0x02B3, 0x02B3 }, { 0x02B4, 0x02B4, 0x02B4 }, { 0x02B5, 0x02B5, 0x02B5 }, { 0x02B6, 0x02B6, 0x02B6 }, { 0x02B7, 0x02B7, 0x02B7 }, { 0x02B8, 0x02B8, 0x02B8 }, { 0x02B9, 0x02B9, 0x02B9 }, { 0x02BA, 0x02BA, 0x02BA }, { 0x02BB, 0x02BB, 0x02BB }, { 0x02BC, 0x02BC, 0x02BC }, { 0x02BD, 0x02BD, 0x02BD }, { 0x02BE, 0x02BE, 0x02BE }, { 0x02BF, 0x02BF, 0x02BF }, { 0x02C0, 0x02C0, 0x02C0 }, { 0x02C1, 0x02C1, 0x02C1 }, { 0x02C6, 0x02C6, 0x02C6 }, { 0x02C7, 0x02C7, 0x02C7 }, { 0x02C8, 0x02C8, 0x02C8 }, { 0x02C9, 0x02C9, 0x02C9 }, { 0x02CA, 0x02CA, 0x02CA }, { 0x02CB, 0x02CB, 0x02CB }, { 0x02CC, 0x02CC, 0x02CC }, { 0x02CD, 0x02CD, 0x02CD }, { 0x02CE, 0x02CE, 0x02CE }, { 0x02CF, 0x02CF, 0x02CF }, { 0x02D0, 0x02D0, 0x02D0 }, { 0x02D1, 0x02D1, 0x02D1 }, { 0x02E0, 0x02E0, 0x02E0 }, { 0x02E1, 0x02E1, 0x02E1 }, { 0x02E2, 0x02E2, 0x02E2 }, { 0x02E3, 0x02E3, 0x02E3 }, { 0x02E4, 0x02E4, 0x02E4 }, { 0x02EE, 0x02EE, 0x02EE }, { 0x0300, 0x0300, 0x0300 }, { 0x0301, 0x0301, 0x0301 }, { 0x0302, 0x0302, 0x0302 }, { 0x0303, 0x0303, 0x0303 }, { 0x0304, 0x0304, 0x0304 }, { 0x0305, 0x0305, 0x0305 }, { 0x0306, 0x0306, 0x0306 }, { 0x0307, 0x0307, 0x0307 }, { 0x0308, 0x0308, 0x0308 }, { 0x0309, 0x0309, 0x0309 }, { 0x030A, 0x030A, 0x030A }, { 0x030B, 0x030B, 0x030B }, { 0x030C, 0x030C, 0x030C }, { 0x030D, 0x030D, 0x030D }, { 0x030E, 0x030E, 0x030E }, { 0x030F, 0x030F, 0x030F }, { 0x0310, 0x0310, 0x0310 }, { 0x0311, 0x0311, 0x0311 }, { 0x0312, 0x0312, 0x0312 }, { 0x0313, 0x0313, 0x0313 }, { 0x0314, 0x0314, 0x0314 }, { 0x0315, 0x0315, 0x0315 }, { 0x0316, 0x0316, 0x0316 }, { 0x0317, 0x0317, 0x0317 }, { 0x0318, 0x0318, 0x0318 }, { 0x0319, 0x0319, 0x0319 }, { 0x031A, 0x031A, 0x031A }, { 0x031B, 0x031B, 0x031B }, { 0x031C, 0x031C, 0x031C }, { 0x031D, 0x031D, 0x031D }, { 0x031E, 0x031E, 0x031E }, { 0x031F, 0x031F, 0x031F }, { 0x0320, 0x0320, 0x0320 }, { 0x0321, 0x0321, 0x0321 }, { 0x0322, 0x0322, 0x0322 }, { 0x0323, 0x0323, 0x0323 }, { 0x0324, 0x0324, 0x0324 }, { 0x0325, 0x0325, 0x0325 }, { 0x0326, 0x0326, 0x0326 }, { 0x0327, 0x0327, 0x0327 }, { 0x0328, 0x0328, 0x0328 }, { 0x0329, 0x0329, 0x0329 }, { 0x032A, 0x032A, 0x032A }, { 0x032B, 0x032B, 0x032B }, { 0x032C, 0x032C, 0x032C }, { 0x032D, 0x032D, 0x032D }, { 0x032E, 0x032E, 0x032E }, { 0x032F, 0x032F, 0x032F }, { 0x0330, 0x0330, 0x0330 }, { 0x0331, 0x0331, 0x0331 }, { 0x0332, 0x0332, 0x0332 }, { 0x0333, 0x0333, 0x0333 }, { 0x0334, 0x0334, 0x0334 }, { 0x0335, 0x0335, 0x0335 }, { 0x0336, 0x0336, 0x0336 }, { 0x0337, 0x0337, 0x0337 }, { 0x0338, 0x0338, 0x0338 }, { 0x0339, 0x0339, 0x0339 }, { 0x033A, 0x033A, 0x033A }, { 0x033B, 0x033B, 0x033B }, { 0x033C, 0x033C, 0x033C }, { 0x033D, 0x033D, 0x033D }, { 0x033E, 0x033E, 0x033E }, { 0x033F, 0x033F, 0x033F }, { 0x0340, 0x0340, 0x0340 }, { 0x0341, 0x0341, 0x0341 }, { 0x0342, 0x0342, 0x0342 }, { 0x0343, 0x0343, 0x0343 }, { 0x0344, 0x0344, 0x0344 }, { 0x0345, 0x0399, 0x0345 }, { 0x0346, 0x0346, 0x0346 }, { 0x0347, 0x0347, 0x0347 }, { 0x0348, 0x0348, 0x0348 }, { 0x0349, 0x0349, 0x0349 }, { 0x034A, 0x034A, 0x034A }, { 0x034B, 0x034B, 0x034B }, { 0x034C, 0x034C, 0x034C }, { 0x034D, 0x034D, 0x034D }, { 0x034E, 0x034E, 0x034E }, { 0x034F, 0x034F, 0x034F }, { 0x0350, 0x0350, 0x0350 }, { 0x0351, 0x0351, 0x0351 }, { 0x0352, 0x0352, 0x0352 }, { 0x0353, 0x0353, 0x0353 }, { 0x0354, 0x0354, 0x0354 }, { 0x0355, 0x0355, 0x0355 }, { 0x0356, 0x0356, 0x0356 }, { 0x0357, 0x0357, 0x0357 }, { 0x0358, 0x0358, 0x0358 }, { 0x0359, 0x0359, 0x0359 }, { 0x035A, 0x035A, 0x035A }, { 0x035B, 0x035B, 0x035B }, { 0x035C, 0x035C, 0x035C }, { 0x035D, 0x035D, 0x035D }, { 0x035E, 0x035E, 0x035E }, { 0x035F, 0x035F, 0x035F }, { 0x0360, 0x0360, 0x0360 }, { 0x0361, 0x0361, 0x0361 }, { 0x0362, 0x0362, 0x0362 }, { 0x0363, 0x0363, 0x0363 }, { 0x0364, 0x0364, 0x0364 }, { 0x0365, 0x0365, 0x0365 }, { 0x0366, 0x0366, 0x0366 }, { 0x0367, 0x0367, 0x0367 }, { 0x0368, 0x0368, 0x0368 }, { 0x0369, 0x0369, 0x0369 }, { 0x036A, 0x036A, 0x036A }, { 0x036B, 0x036B, 0x036B }, { 0x036C, 0x036C, 0x036C }, { 0x036D, 0x036D, 0x036D }, { 0x036E, 0x036E, 0x036E }, { 0x036F, 0x036F, 0x036F }, { 0x037A, 0x037A, 0x037A }, { 0x0386, 0x0386, 0x03AC }, { 0x0388, 0x0388, 0x03AD }, { 0x0389, 0x0389, 0x03AE }, { 0x038A, 0x038A, 0x03AF }, { 0x038C, 0x038C, 0x03CC }, { 0x038E, 0x038E, 0x03CD }, { 0x038F, 0x038F, 0x03CE }, { 0x0390, 0x0390, 0x0390 }, { 0x0391, 0x0391, 0x03B1 }, { 0x0392, 0x0392, 0x03B2 }, { 0x0393, 0x0393, 0x03B3 }, { 0x0394, 0x0394, 0x03B4 }, { 0x0395, 0x0395, 0x03B5 }, { 0x0396, 0x0396, 0x03B6 }, { 0x0397, 0x0397, 0x03B7 }, { 0x0398, 0x0398, 0x03B8 }, { 0x0399, 0x0399, 0x03B9 }, { 0x039A, 0x039A, 0x03BA }, { 0x039B, 0x039B, 0x03BB }, { 0x039C, 0x039C, 0x03BC }, { 0x039D, 0x039D, 0x03BD }, { 0x039E, 0x039E, 0x03BE }, { 0x039F, 0x039F, 0x03BF }, { 0x03A0, 0x03A0, 0x03C0 }, { 0x03A1, 0x03A1, 0x03C1 }, { 0x03A3, 0x03A3, 0x03C3 }, { 0x03A4, 0x03A4, 0x03C4 }, { 0x03A5, 0x03A5, 0x03C5 }, { 0x03A6, 0x03A6, 0x03C6 }, { 0x03A7, 0x03A7, 0x03C7 }, { 0x03A8, 0x03A8, 0x03C8 }, { 0x03A9, 0x03A9, 0x03C9 }, { 0x03AA, 0x03AA, 0x03CA }, { 0x03AB, 0x03AB, 0x03CB }, { 0x03AC, 0x0386, 0x03AC }, { 0x03AD, 0x0388, 0x03AD }, { 0x03AE, 0x0389, 0x03AE }, { 0x03AF, 0x038A, 0x03AF }, { 0x03B0, 0x03B0, 0x03B0 }, { 0x03B1, 0x0391, 0x03B1 }, { 0x03B2, 0x0392, 0x03B2 }, { 0x03B3, 0x0393, 0x03B3 }, { 0x03B4, 0x0394, 0x03B4 }, { 0x03B5, 0x0395, 0x03B5 }, { 0x03B6, 0x0396, 0x03B6 }, { 0x03B7, 0x0397, 0x03B7 }, { 0x03B8, 0x0398, 0x03B8 }, { 0x03B9, 0x0399, 0x03B9 }, { 0x03BA, 0x039A, 0x03BA }, { 0x03BB, 0x039B, 0x03BB }, { 0x03BC, 0x039C, 0x03BC }, { 0x03BD, 0x039D, 0x03BD }, { 0x03BE, 0x039E, 0x03BE }, { 0x03BF, 0x039F, 0x03BF }, { 0x03C0, 0x03A0, 0x03C0 }, { 0x03C1, 0x03A1, 0x03C1 }, { 0x03C2, 0x03A3, 0x03C2 }, { 0x03C3, 0x03A3, 0x03C3 }, { 0x03C4, 0x03A4, 0x03C4 }, { 0x03C5, 0x03A5, 0x03C5 }, { 0x03C6, 0x03A6, 0x03C6 }, { 0x03C7, 0x03A7, 0x03C7 }, { 0x03C8, 0x03A8, 0x03C8 }, { 0x03C9, 0x03A9, 0x03C9 }, { 0x03CA, 0x03AA, 0x03CA }, { 0x03CB, 0x03AB, 0x03CB }, { 0x03CC, 0x038C, 0x03CC }, { 0x03CD, 0x038E, 0x03CD }, { 0x03CE, 0x038F, 0x03CE }, { 0x03D0, 0x0392, 0x03D0 }, { 0x03D1, 0x0398, 0x03D1 }, { 0x03D2, 0x03D2, 0x03D2 }, { 0x03D3, 0x03D3, 0x03D3 }, { 0x03D4, 0x03D4, 0x03D4 }, { 0x03D5, 0x03A6, 0x03D5 }, { 0x03D6, 0x03A0, 0x03D6 }, { 0x03D7, 0x03D7, 0x03D7 }, { 0x03D8, 0x03D8, 0x03D9 }, { 0x03D9, 0x03D8, 0x03D9 }, { 0x03DA, 0x03DA, 0x03DB }, { 0x03DB, 0x03DA, 0x03DB }, { 0x03DC, 0x03DC, 0x03DD }, { 0x03DD, 0x03DC, 0x03DD }, { 0x03DE, 0x03DE, 0x03DF }, { 0x03DF, 0x03DE, 0x03DF }, { 0x03E0, 0x03E0, 0x03E1 }, { 0x03E1, 0x03E0, 0x03E1 }, { 0x03E2, 0x03E2, 0x03E3 }, { 0x03E3, 0x03E2, 0x03E3 }, { 0x03E4, 0x03E4, 0x03E5 }, { 0x03E5, 0x03E4, 0x03E5 }, { 0x03E6, 0x03E6, 0x03E7 }, { 0x03E7, 0x03E6, 0x03E7 }, { 0x03E8, 0x03E8, 0x03E9 }, { 0x03E9, 0x03E8, 0x03E9 }, { 0x03EA, 0x03EA, 0x03EB }, { 0x03EB, 0x03EA, 0x03EB }, { 0x03EC, 0x03EC, 0x03ED }, { 0x03ED, 0x03EC, 0x03ED }, { 0x03EE, 0x03EE, 0x03EF }, { 0x03EF, 0x03EE, 0x03EF }, { 0x03F0, 0x039A, 0x03F0 }, { 0x03F1, 0x03A1, 0x03F1 }, { 0x03F2, 0x03F9, 0x03F2 }, { 0x03F3, 0x03F3, 0x03F3 }, { 0x03F4, 0x03F4, 0x03B8 }, { 0x03F5, 0x0395, 0x03F5 }, { 0x03F7, 0x03F7, 0x03F8 }, { 0x03F8, 0x03F7, 0x03F8 }, { 0x03F9, 0x03F9, 0x03F2 }, { 0x03FA, 0x03FA, 0x03FB }, { 0x03FB, 0x03FA, 0x03FB }, { 0x03FC, 0x03FC, 0x03FC }, { 0x03FD, 0x03FD, 0x03FD }, { 0x03FE, 0x03FE, 0x03FE }, { 0x03FF, 0x03FF, 0x03FF }, { 0x0400, 0x0400, 0x0450 }, { 0x0401, 0x0401, 0x0451 }, { 0x0402, 0x0402, 0x0452 }, { 0x0403, 0x0403, 0x0453 }, { 0x0404, 0x0404, 0x0454 }, { 0x0405, 0x0405, 0x0455 }, { 0x0406, 0x0406, 0x0456 }, { 0x0407, 0x0407, 0x0457 }, { 0x0408, 0x0408, 0x0458 }, { 0x0409, 0x0409, 0x0459 }, { 0x040A, 0x040A, 0x045A }, { 0x040B, 0x040B, 0x045B }, { 0x040C, 0x040C, 0x045C }, { 0x040D, 0x040D, 0x045D }, { 0x040E, 0x040E, 0x045E }, { 0x040F, 0x040F, 0x045F }, { 0x0410, 0x0410, 0x0430 }, { 0x0411, 0x0411, 0x0431 }, { 0x0412, 0x0412, 0x0432 }, { 0x0413, 0x0413, 0x0433 }, { 0x0414, 0x0414, 0x0434 }, { 0x0415, 0x0415, 0x0435 }, { 0x0416, 0x0416, 0x0436 }, { 0x0417, 0x0417, 0x0437 }, { 0x0418, 0x0418, 0x0438 }, { 0x0419, 0x0419, 0x0439 }, { 0x041A, 0x041A, 0x043A }, { 0x041B, 0x041B, 0x043B }, { 0x041C, 0x041C, 0x043C }, { 0x041D, 0x041D, 0x043D }, { 0x041E, 0x041E, 0x043E }, { 0x041F, 0x041F, 0x043F }, { 0x0420, 0x0420, 0x0440 }, { 0x0421, 0x0421, 0x0441 }, { 0x0422, 0x0422, 0x0442 }, { 0x0423, 0x0423, 0x0443 }, { 0x0424, 0x0424, 0x0444 }, { 0x0425, 0x0425, 0x0445 }, { 0x0426, 0x0426, 0x0446 }, { 0x0427, 0x0427, 0x0447 }, { 0x0428, 0x0428, 0x0448 }, { 0x0429, 0x0429, 0x0449 }, { 0x042A, 0x042A, 0x044A }, { 0x042B, 0x042B, 0x044B }, { 0x042C, 0x042C, 0x044C }, { 0x042D, 0x042D, 0x044D }, { 0x042E, 0x042E, 0x044E }, { 0x042F, 0x042F, 0x044F }, { 0x0430, 0x0410, 0x0430 }, { 0x0431, 0x0411, 0x0431 }, { 0x0432, 0x0412, 0x0432 }, { 0x0433, 0x0413, 0x0433 }, { 0x0434, 0x0414, 0x0434 }, { 0x0435, 0x0415, 0x0435 }, { 0x0436, 0x0416, 0x0436 }, { 0x0437, 0x0417, 0x0437 }, { 0x0438, 0x0418, 0x0438 }, { 0x0439, 0x0419, 0x0439 }, { 0x043A, 0x041A, 0x043A }, { 0x043B, 0x041B, 0x043B }, { 0x043C, 0x041C, 0x043C }, { 0x043D, 0x041D, 0x043D }, { 0x043E, 0x041E, 0x043E }, { 0x043F, 0x041F, 0x043F }, { 0x0440, 0x0420, 0x0440 }, { 0x0441, 0x0421, 0x0441 }, { 0x0442, 0x0422, 0x0442 }, { 0x0443, 0x0423, 0x0443 }, { 0x0444, 0x0424, 0x0444 }, { 0x0445, 0x0425, 0x0445 }, { 0x0446, 0x0426, 0x0446 }, { 0x0447, 0x0427, 0x0447 }, { 0x0448, 0x0428, 0x0448 }, { 0x0449, 0x0429, 0x0449 }, { 0x044A, 0x042A, 0x044A }, { 0x044B, 0x042B, 0x044B }, { 0x044C, 0x042C, 0x044C }, { 0x044D, 0x042D, 0x044D }, { 0x044E, 0x042E, 0x044E }, { 0x044F, 0x042F, 0x044F }, { 0x0450, 0x0400, 0x0450 }, { 0x0451, 0x0401, 0x0451 }, { 0x0452, 0x0402, 0x0452 }, { 0x0453, 0x0403, 0x0453 }, { 0x0454, 0x0404, 0x0454 }, { 0x0455, 0x0405, 0x0455 }, { 0x0456, 0x0406, 0x0456 }, { 0x0457, 0x0407, 0x0457 }, { 0x0458, 0x0408, 0x0458 }, { 0x0459, 0x0409, 0x0459 }, { 0x045A, 0x040A, 0x045A }, { 0x045B, 0x040B, 0x045B }, { 0x045C, 0x040C, 0x045C }, { 0x045D, 0x040D, 0x045D }, { 0x045E, 0x040E, 0x045E }, { 0x045F, 0x040F, 0x045F }, { 0x0460, 0x0460, 0x0461 }, { 0x0461, 0x0460, 0x0461 }, { 0x0462, 0x0462, 0x0463 }, { 0x0463, 0x0462, 0x0463 }, { 0x0464, 0x0464, 0x0465 }, { 0x0465, 0x0464, 0x0465 }, { 0x0466, 0x0466, 0x0467 }, { 0x0467, 0x0466, 0x0467 }, { 0x0468, 0x0468, 0x0469 }, { 0x0469, 0x0468, 0x0469 }, { 0x046A, 0x046A, 0x046B }, { 0x046B, 0x046A, 0x046B }, { 0x046C, 0x046C, 0x046D }, { 0x046D, 0x046C, 0x046D }, { 0x046E, 0x046E, 0x046F }, { 0x046F, 0x046E, 0x046F }, { 0x0470, 0x0470, 0x0471 }, { 0x0471, 0x0470, 0x0471 }, { 0x0472, 0x0472, 0x0473 }, { 0x0473, 0x0472, 0x0473 }, { 0x0474, 0x0474, 0x0475 }, { 0x0475, 0x0474, 0x0475 }, { 0x0476, 0x0476, 0x0477 }, { 0x0477, 0x0476, 0x0477 }, { 0x0478, 0x0478, 0x0479 }, { 0x0479, 0x0478, 0x0479 }, { 0x047A, 0x047A, 0x047B }, { 0x047B, 0x047A, 0x047B }, { 0x047C, 0x047C, 0x047D }, { 0x047D, 0x047C, 0x047D }, { 0x047E, 0x047E, 0x047F }, { 0x047F, 0x047E, 0x047F }, { 0x0480, 0x0480, 0x0481 }, { 0x0481, 0x0480, 0x0481 }, { 0x0483, 0x0483, 0x0483 }, { 0x0484, 0x0484, 0x0484 }, { 0x0485, 0x0485, 0x0485 }, { 0x0486, 0x0486, 0x0486 }, { 0x048A, 0x048A, 0x048B }, { 0x048B, 0x048A, 0x048B }, { 0x048C, 0x048C, 0x048D }, { 0x048D, 0x048C, 0x048D }, { 0x048E, 0x048E, 0x048F }, { 0x048F, 0x048E, 0x048F }, { 0x0490, 0x0490, 0x0491 }, { 0x0491, 0x0490, 0x0491 }, { 0x0492, 0x0492, 0x0493 }, { 0x0493, 0x0492, 0x0493 }, { 0x0494, 0x0494, 0x0495 }, { 0x0495, 0x0494, 0x0495 }, { 0x0496, 0x0496, 0x0497 }, { 0x0497, 0x0496, 0x0497 }, { 0x0498, 0x0498, 0x0499 }, { 0x0499, 0x0498, 0x0499 }, { 0x049A, 0x049A, 0x049B }, { 0x049B, 0x049A, 0x049B }, { 0x049C, 0x049C, 0x049D }, { 0x049D, 0x049C, 0x049D }, { 0x049E, 0x049E, 0x049F }, { 0x049F, 0x049E, 0x049F }, { 0x04A0, 0x04A0, 0x04A1 }, { 0x04A1, 0x04A0, 0x04A1 }, { 0x04A2, 0x04A2, 0x04A3 }, { 0x04A3, 0x04A2, 0x04A3 }, { 0x04A4, 0x04A4, 0x04A5 }, { 0x04A5, 0x04A4, 0x04A5 }, { 0x04A6, 0x04A6, 0x04A7 }, { 0x04A7, 0x04A6, 0x04A7 }, { 0x04A8, 0x04A8, 0x04A9 }, { 0x04A9, 0x04A8, 0x04A9 }, { 0x04AA, 0x04AA, 0x04AB }, { 0x04AB, 0x04AA, 0x04AB }, { 0x04AC, 0x04AC, 0x04AD }, { 0x04AD, 0x04AC, 0x04AD }, { 0x04AE, 0x04AE, 0x04AF }, { 0x04AF, 0x04AE, 0x04AF }, { 0x04B0, 0x04B0, 0x04B1 }, { 0x04B1, 0x04B0, 0x04B1 }, { 0x04B2, 0x04B2, 0x04B3 }, { 0x04B3, 0x04B2, 0x04B3 }, { 0x04B4, 0x04B4, 0x04B5 }, { 0x04B5, 0x04B4, 0x04B5 }, { 0x04B6, 0x04B6, 0x04B7 }, { 0x04B7, 0x04B6, 0x04B7 }, { 0x04B8, 0x04B8, 0x04B9 }, { 0x04B9, 0x04B8, 0x04B9 }, { 0x04BA, 0x04BA, 0x04BB }, { 0x04BB, 0x04BA, 0x04BB }, { 0x04BC, 0x04BC, 0x04BD }, { 0x04BD, 0x04BC, 0x04BD }, { 0x04BE, 0x04BE, 0x04BF }, { 0x04BF, 0x04BE, 0x04BF }, { 0x04C0, 0x04C0, 0x04C0 }, { 0x04C1, 0x04C1, 0x04C2 }, { 0x04C2, 0x04C1, 0x04C2 }, { 0x04C3, 0x04C3, 0x04C4 }, { 0x04C4, 0x04C3, 0x04C4 }, { 0x04C5, 0x04C5, 0x04C6 }, { 0x04C6, 0x04C5, 0x04C6 }, { 0x04C7, 0x04C7, 0x04C8 }, { 0x04C8, 0x04C7, 0x04C8 }, { 0x04C9, 0x04C9, 0x04CA }, { 0x04CA, 0x04C9, 0x04CA }, { 0x04CB, 0x04CB, 0x04CC }, { 0x04CC, 0x04CB, 0x04CC }, { 0x04CD, 0x04CD, 0x04CE }, { 0x04CE, 0x04CD, 0x04CE }, { 0x04D0, 0x04D0, 0x04D1 }, { 0x04D1, 0x04D0, 0x04D1 }, { 0x04D2, 0x04D2, 0x04D3 }, { 0x04D3, 0x04D2, 0x04D3 }, { 0x04D4, 0x04D4, 0x04D5 }, { 0x04D5, 0x04D4, 0x04D5 }, { 0x04D6, 0x04D6, 0x04D7 }, { 0x04D7, 0x04D6, 0x04D7 }, { 0x04D8, 0x04D8, 0x04D9 }, { 0x04D9, 0x04D8, 0x04D9 }, { 0x04DA, 0x04DA, 0x04DB }, { 0x04DB, 0x04DA, 0x04DB }, { 0x04DC, 0x04DC, 0x04DD }, { 0x04DD, 0x04DC, 0x04DD }, { 0x04DE, 0x04DE, 0x04DF }, { 0x04DF, 0x04DE, 0x04DF }, { 0x04E0, 0x04E0, 0x04E1 }, { 0x04E1, 0x04E0, 0x04E1 }, { 0x04E2, 0x04E2, 0x04E3 }, { 0x04E3, 0x04E2, 0x04E3 }, { 0x04E4, 0x04E4, 0x04E5 }, { 0x04E5, 0x04E4, 0x04E5 }, { 0x04E6, 0x04E6, 0x04E7 }, { 0x04E7, 0x04E6, 0x04E7 }, { 0x04E8, 0x04E8, 0x04E9 }, { 0x04E9, 0x04E8, 0x04E9 }, { 0x04EA, 0x04EA, 0x04EB }, { 0x04EB, 0x04EA, 0x04EB }, { 0x04EC, 0x04EC, 0x04ED }, { 0x04ED, 0x04EC, 0x04ED }, { 0x04EE, 0x04EE, 0x04EF }, { 0x04EF, 0x04EE, 0x04EF }, { 0x04F0, 0x04F0, 0x04F1 }, { 0x04F1, 0x04F0, 0x04F1 }, { 0x04F2, 0x04F2, 0x04F3 }, { 0x04F3, 0x04F2, 0x04F3 }, { 0x04F4, 0x04F4, 0x04F5 }, { 0x04F5, 0x04F4, 0x04F5 }, { 0x04F6, 0x04F6, 0x04F7 }, { 0x04F7, 0x04F6, 0x04F7 }, { 0x04F8, 0x04F8, 0x04F9 }, { 0x04F9, 0x04F8, 0x04F9 }, { 0x0500, 0x0500, 0x0501 }, { 0x0501, 0x0500, 0x0501 }, { 0x0502, 0x0502, 0x0503 }, { 0x0503, 0x0502, 0x0503 }, { 0x0504, 0x0504, 0x0505 }, { 0x0505, 0x0504, 0x0505 }, { 0x0506, 0x0506, 0x0507 }, { 0x0507, 0x0506, 0x0507 }, { 0x0508, 0x0508, 0x0509 }, { 0x0509, 0x0508, 0x0509 }, { 0x050A, 0x050A, 0x050B }, { 0x050B, 0x050A, 0x050B }, { 0x050C, 0x050C, 0x050D }, { 0x050D, 0x050C, 0x050D }, { 0x050E, 0x050E, 0x050F }, { 0x050F, 0x050E, 0x050F }, { 0x0531, 0x0531, 0x0561 }, { 0x0532, 0x0532, 0x0562 }, { 0x0533, 0x0533, 0x0563 }, { 0x0534, 0x0534, 0x0564 }, { 0x0535, 0x0535, 0x0565 }, { 0x0536, 0x0536, 0x0566 }, { 0x0537, 0x0537, 0x0567 }, { 0x0538, 0x0538, 0x0568 }, { 0x0539, 0x0539, 0x0569 }, { 0x053A, 0x053A, 0x056A }, { 0x053B, 0x053B, 0x056B }, { 0x053C, 0x053C, 0x056C }, { 0x053D, 0x053D, 0x056D }, { 0x053E, 0x053E, 0x056E }, { 0x053F, 0x053F, 0x056F }, { 0x0540, 0x0540, 0x0570 }, { 0x0541, 0x0541, 0x0571 }, { 0x0542, 0x0542, 0x0572 }, { 0x0543, 0x0543, 0x0573 }, { 0x0544, 0x0544, 0x0574 }, { 0x0545, 0x0545, 0x0575 }, { 0x0546, 0x0546, 0x0576 }, { 0x0547, 0x0547, 0x0577 }, { 0x0548, 0x0548, 0x0578 }, { 0x0549, 0x0549, 0x0579 }, { 0x054A, 0x054A, 0x057A }, { 0x054B, 0x054B, 0x057B }, { 0x054C, 0x054C, 0x057C }, { 0x054D, 0x054D, 0x057D }, { 0x054E, 0x054E, 0x057E }, { 0x054F, 0x054F, 0x057F }, { 0x0550, 0x0550, 0x0580 }, { 0x0551, 0x0551, 0x0581 }, { 0x0552, 0x0552, 0x0582 }, { 0x0553, 0x0553, 0x0583 }, { 0x0554, 0x0554, 0x0584 }, { 0x0555, 0x0555, 0x0585 }, { 0x0556, 0x0556, 0x0586 }, { 0x0559, 0x0559, 0x0559 }, { 0x0561, 0x0531, 0x0561 }, { 0x0562, 0x0532, 0x0562 }, { 0x0563, 0x0533, 0x0563 }, { 0x0564, 0x0534, 0x0564 }, { 0x0565, 0x0535, 0x0565 }, { 0x0566, 0x0536, 0x0566 }, { 0x0567, 0x0537, 0x0567 }, { 0x0568, 0x0538, 0x0568 }, { 0x0569, 0x0539, 0x0569 }, { 0x056A, 0x053A, 0x056A }, { 0x056B, 0x053B, 0x056B }, { 0x056C, 0x053C, 0x056C }, { 0x056D, 0x053D, 0x056D }, { 0x056E, 0x053E, 0x056E }, { 0x056F, 0x053F, 0x056F }, { 0x0570, 0x0540, 0x0570 }, { 0x0571, 0x0541, 0x0571 }, { 0x0572, 0x0542, 0x0572 }, { 0x0573, 0x0543, 0x0573 }, { 0x0574, 0x0544, 0x0574 }, { 0x0575, 0x0545, 0x0575 }, { 0x0576, 0x0546, 0x0576 }, { 0x0577, 0x0547, 0x0577 }, { 0x0578, 0x0548, 0x0578 }, { 0x0579, 0x0549, 0x0579 }, { 0x057A, 0x054A, 0x057A }, { 0x057B, 0x054B, 0x057B }, { 0x057C, 0x054C, 0x057C }, { 0x057D, 0x054D, 0x057D }, { 0x057E, 0x054E, 0x057E }, { 0x057F, 0x054F, 0x057F }, { 0x0580, 0x0550, 0x0580 }, { 0x0581, 0x0551, 0x0581 }, { 0x0582, 0x0552, 0x0582 }, { 0x0583, 0x0553, 0x0583 }, { 0x0584, 0x0554, 0x0584 }, { 0x0585, 0x0555, 0x0585 }, { 0x0586, 0x0556, 0x0586 }, { 0x0587, 0x0587, 0x0587 }, { 0x0591, 0x0591, 0x0591 }, { 0x0592, 0x0592, 0x0592 }, { 0x0593, 0x0593, 0x0593 }, { 0x0594, 0x0594, 0x0594 }, { 0x0595, 0x0595, 0x0595 }, { 0x0596, 0x0596, 0x0596 }, { 0x0597, 0x0597, 0x0597 }, { 0x0598, 0x0598, 0x0598 }, { 0x0599, 0x0599, 0x0599 }, { 0x059A, 0x059A, 0x059A }, { 0x059B, 0x059B, 0x059B }, { 0x059C, 0x059C, 0x059C }, { 0x059D, 0x059D, 0x059D }, { 0x059E, 0x059E, 0x059E }, { 0x059F, 0x059F, 0x059F }, { 0x05A0, 0x05A0, 0x05A0 }, { 0x05A1, 0x05A1, 0x05A1 }, { 0x05A2, 0x05A2, 0x05A2 }, { 0x05A3, 0x05A3, 0x05A3 }, { 0x05A4, 0x05A4, 0x05A4 }, { 0x05A5, 0x05A5, 0x05A5 }, { 0x05A6, 0x05A6, 0x05A6 }, { 0x05A7, 0x05A7, 0x05A7 }, { 0x05A8, 0x05A8, 0x05A8 }, { 0x05A9, 0x05A9, 0x05A9 }, { 0x05AA, 0x05AA, 0x05AA }, { 0x05AB, 0x05AB, 0x05AB }, { 0x05AC, 0x05AC, 0x05AC }, { 0x05AD, 0x05AD, 0x05AD }, { 0x05AE, 0x05AE, 0x05AE }, { 0x05AF, 0x05AF, 0x05AF }, { 0x05B0, 0x05B0, 0x05B0 }, { 0x05B1, 0x05B1, 0x05B1 }, { 0x05B2, 0x05B2, 0x05B2 }, { 0x05B3, 0x05B3, 0x05B3 }, { 0x05B4, 0x05B4, 0x05B4 }, { 0x05B5, 0x05B5, 0x05B5 }, { 0x05B6, 0x05B6, 0x05B6 }, { 0x05B7, 0x05B7, 0x05B7 }, { 0x05B8, 0x05B8, 0x05B8 }, { 0x05B9, 0x05B9, 0x05B9 }, { 0x05BB, 0x05BB, 0x05BB }, { 0x05BC, 0x05BC, 0x05BC }, { 0x05BD, 0x05BD, 0x05BD }, { 0x05BF, 0x05BF, 0x05BF }, { 0x05C1, 0x05C1, 0x05C1 }, { 0x05C2, 0x05C2, 0x05C2 }, { 0x05C4, 0x05C4, 0x05C4 }, { 0x05C5, 0x05C5, 0x05C5 }, { 0x05C7, 0x05C7, 0x05C7 }, { 0x05D0, 0x05D0, 0x05D0 }, { 0x05D1, 0x05D1, 0x05D1 }, { 0x05D2, 0x05D2, 0x05D2 }, { 0x05D3, 0x05D3, 0x05D3 }, { 0x05D4, 0x05D4, 0x05D4 }, { 0x05D5, 0x05D5, 0x05D5 }, { 0x05D6, 0x05D6, 0x05D6 }, { 0x05D7, 0x05D7, 0x05D7 }, { 0x05D8, 0x05D8, 0x05D8 }, { 0x05D9, 0x05D9, 0x05D9 }, { 0x05DA, 0x05DA, 0x05DA }, { 0x05DB, 0x05DB, 0x05DB }, { 0x05DC, 0x05DC, 0x05DC }, { 0x05DD, 0x05DD, 0x05DD }, { 0x05DE, 0x05DE, 0x05DE }, { 0x05DF, 0x05DF, 0x05DF }, { 0x05E0, 0x05E0, 0x05E0 }, { 0x05E1, 0x05E1, 0x05E1 }, { 0x05E2, 0x05E2, 0x05E2 }, { 0x05E3, 0x05E3, 0x05E3 }, { 0x05E4, 0x05E4, 0x05E4 }, { 0x05E5, 0x05E5, 0x05E5 }, { 0x05E6, 0x05E6, 0x05E6 }, { 0x05E7, 0x05E7, 0x05E7 }, { 0x05E8, 0x05E8, 0x05E8 }, { 0x05E9, 0x05E9, 0x05E9 }, { 0x05EA, 0x05EA, 0x05EA }, { 0x05F0, 0x05F0, 0x05F0 }, { 0x05F1, 0x05F1, 0x05F1 }, { 0x05F2, 0x05F2, 0x05F2 }, { 0x0610, 0x0610, 0x0610 }, { 0x0611, 0x0611, 0x0611 }, { 0x0612, 0x0612, 0x0612 }, { 0x0613, 0x0613, 0x0613 }, { 0x0614, 0x0614, 0x0614 }, { 0x0615, 0x0615, 0x0615 }, { 0x0621, 0x0621, 0x0621 }, { 0x0622, 0x0622, 0x0622 }, { 0x0623, 0x0623, 0x0623 }, { 0x0624, 0x0624, 0x0624 }, { 0x0625, 0x0625, 0x0625 }, { 0x0626, 0x0626, 0x0626 }, { 0x0627, 0x0627, 0x0627 }, { 0x0628, 0x0628, 0x0628 }, { 0x0629, 0x0629, 0x0629 }, { 0x062A, 0x062A, 0x062A }, { 0x062B, 0x062B, 0x062B }, { 0x062C, 0x062C, 0x062C }, { 0x062D, 0x062D, 0x062D }, { 0x062E, 0x062E, 0x062E }, { 0x062F, 0x062F, 0x062F }, { 0x0630, 0x0630, 0x0630 }, { 0x0631, 0x0631, 0x0631 }, { 0x0632, 0x0632, 0x0632 }, { 0x0633, 0x0633, 0x0633 }, { 0x0634, 0x0634, 0x0634 }, { 0x0635, 0x0635, 0x0635 }, { 0x0636, 0x0636, 0x0636 }, { 0x0637, 0x0637, 0x0637 }, { 0x0638, 0x0638, 0x0638 }, { 0x0639, 0x0639, 0x0639 }, { 0x063A, 0x063A, 0x063A }, { 0x0640, 0x0640, 0x0640 }, { 0x0641, 0x0641, 0x0641 }, { 0x0642, 0x0642, 0x0642 }, { 0x0643, 0x0643, 0x0643 }, { 0x0644, 0x0644, 0x0644 }, { 0x0645, 0x0645, 0x0645 }, { 0x0646, 0x0646, 0x0646 }, { 0x0647, 0x0647, 0x0647 }, { 0x0648, 0x0648, 0x0648 }, { 0x0649, 0x0649, 0x0649 }, { 0x064A, 0x064A, 0x064A }, { 0x064B, 0x064B, 0x064B }, { 0x064C, 0x064C, 0x064C }, { 0x064D, 0x064D, 0x064D }, { 0x064E, 0x064E, 0x064E }, { 0x064F, 0x064F, 0x064F }, { 0x0650, 0x0650, 0x0650 }, { 0x0651, 0x0651, 0x0651 }, { 0x0652, 0x0652, 0x0652 }, { 0x0653, 0x0653, 0x0653 }, { 0x0654, 0x0654, 0x0654 }, { 0x0655, 0x0655, 0x0655 }, { 0x0656, 0x0656, 0x0656 }, { 0x0657, 0x0657, 0x0657 }, { 0x0658, 0x0658, 0x0658 }, { 0x0659, 0x0659, 0x0659 }, { 0x065A, 0x065A, 0x065A }, { 0x065B, 0x065B, 0x065B }, { 0x065C, 0x065C, 0x065C }, { 0x065D, 0x065D, 0x065D }, { 0x065E, 0x065E, 0x065E }, { 0x066E, 0x066E, 0x066E }, { 0x066F, 0x066F, 0x066F }, { 0x0670, 0x0670, 0x0670 }, { 0x0671, 0x0671, 0x0671 }, { 0x0672, 0x0672, 0x0672 }, { 0x0673, 0x0673, 0x0673 }, { 0x0674, 0x0674, 0x0674 }, { 0x0675, 0x0675, 0x0675 }, { 0x0676, 0x0676, 0x0676 }, { 0x0677, 0x0677, 0x0677 }, { 0x0678, 0x0678, 0x0678 }, { 0x0679, 0x0679, 0x0679 }, { 0x067A, 0x067A, 0x067A }, { 0x067B, 0x067B, 0x067B }, { 0x067C, 0x067C, 0x067C }, { 0x067D, 0x067D, 0x067D }, { 0x067E, 0x067E, 0x067E }, { 0x067F, 0x067F, 0x067F }, { 0x0680, 0x0680, 0x0680 }, { 0x0681, 0x0681, 0x0681 }, { 0x0682, 0x0682, 0x0682 }, { 0x0683, 0x0683, 0x0683 }, { 0x0684, 0x0684, 0x0684 }, { 0x0685, 0x0685, 0x0685 }, { 0x0686, 0x0686, 0x0686 }, { 0x0687, 0x0687, 0x0687 }, { 0x0688, 0x0688, 0x0688 }, { 0x0689, 0x0689, 0x0689 }, { 0x068A, 0x068A, 0x068A }, { 0x068B, 0x068B, 0x068B }, { 0x068C, 0x068C, 0x068C }, { 0x068D, 0x068D, 0x068D }, { 0x068E, 0x068E, 0x068E }, { 0x068F, 0x068F, 0x068F }, { 0x0690, 0x0690, 0x0690 }, { 0x0691, 0x0691, 0x0691 }, { 0x0692, 0x0692, 0x0692 }, { 0x0693, 0x0693, 0x0693 }, { 0x0694, 0x0694, 0x0694 }, { 0x0695, 0x0695, 0x0695 }, { 0x0696, 0x0696, 0x0696 }, { 0x0697, 0x0697, 0x0697 }, { 0x0698, 0x0698, 0x0698 }, { 0x0699, 0x0699, 0x0699 }, { 0x069A, 0x069A, 0x069A }, { 0x069B, 0x069B, 0x069B }, { 0x069C, 0x069C, 0x069C }, { 0x069D, 0x069D, 0x069D }, { 0x069E, 0x069E, 0x069E }, { 0x069F, 0x069F, 0x069F }, { 0x06A0, 0x06A0, 0x06A0 }, { 0x06A1, 0x06A1, 0x06A1 }, { 0x06A2, 0x06A2, 0x06A2 }, { 0x06A3, 0x06A3, 0x06A3 }, { 0x06A4, 0x06A4, 0x06A4 }, { 0x06A5, 0x06A5, 0x06A5 }, { 0x06A6, 0x06A6, 0x06A6 }, { 0x06A7, 0x06A7, 0x06A7 }, { 0x06A8, 0x06A8, 0x06A8 }, { 0x06A9, 0x06A9, 0x06A9 }, { 0x06AA, 0x06AA, 0x06AA }, { 0x06AB, 0x06AB, 0x06AB }, { 0x06AC, 0x06AC, 0x06AC }, { 0x06AD, 0x06AD, 0x06AD }, { 0x06AE, 0x06AE, 0x06AE }, { 0x06AF, 0x06AF, 0x06AF }, { 0x06B0, 0x06B0, 0x06B0 }, { 0x06B1, 0x06B1, 0x06B1 }, { 0x06B2, 0x06B2, 0x06B2 }, { 0x06B3, 0x06B3, 0x06B3 }, { 0x06B4, 0x06B4, 0x06B4 }, { 0x06B5, 0x06B5, 0x06B5 }, { 0x06B6, 0x06B6, 0x06B6 }, { 0x06B7, 0x06B7, 0x06B7 }, { 0x06B8, 0x06B8, 0x06B8 }, { 0x06B9, 0x06B9, 0x06B9 }, { 0x06BA, 0x06BA, 0x06BA }, { 0x06BB, 0x06BB, 0x06BB }, { 0x06BC, 0x06BC, 0x06BC }, { 0x06BD, 0x06BD, 0x06BD }, { 0x06BE, 0x06BE, 0x06BE }, { 0x06BF, 0x06BF, 0x06BF }, { 0x06C0, 0x06C0, 0x06C0 }, { 0x06C1, 0x06C1, 0x06C1 }, { 0x06C2, 0x06C2, 0x06C2 }, { 0x06C3, 0x06C3, 0x06C3 }, { 0x06C4, 0x06C4, 0x06C4 }, { 0x06C5, 0x06C5, 0x06C5 }, { 0x06C6, 0x06C6, 0x06C6 }, { 0x06C7, 0x06C7, 0x06C7 }, { 0x06C8, 0x06C8, 0x06C8 }, { 0x06C9, 0x06C9, 0x06C9 }, { 0x06CA, 0x06CA, 0x06CA }, { 0x06CB, 0x06CB, 0x06CB }, { 0x06CC, 0x06CC, 0x06CC }, { 0x06CD, 0x06CD, 0x06CD }, { 0x06CE, 0x06CE, 0x06CE }, { 0x06CF, 0x06CF, 0x06CF }, { 0x06D0, 0x06D0, 0x06D0 }, { 0x06D1, 0x06D1, 0x06D1 }, { 0x06D2, 0x06D2, 0x06D2 }, { 0x06D3, 0x06D3, 0x06D3 }, { 0x06D5, 0x06D5, 0x06D5 }, { 0x06D6, 0x06D6, 0x06D6 }, { 0x06D7, 0x06D7, 0x06D7 }, { 0x06D8, 0x06D8, 0x06D8 }, { 0x06D9, 0x06D9, 0x06D9 }, { 0x06DA, 0x06DA, 0x06DA }, { 0x06DB, 0x06DB, 0x06DB }, { 0x06DC, 0x06DC, 0x06DC }, { 0x06DF, 0x06DF, 0x06DF }, { 0x06E0, 0x06E0, 0x06E0 }, { 0x06E1, 0x06E1, 0x06E1 }, { 0x06E2, 0x06E2, 0x06E2 }, { 0x06E3, 0x06E3, 0x06E3 }, { 0x06E4, 0x06E4, 0x06E4 }, { 0x06E5, 0x06E5, 0x06E5 }, { 0x06E6, 0x06E6, 0x06E6 }, { 0x06E7, 0x06E7, 0x06E7 }, { 0x06E8, 0x06E8, 0x06E8 }, { 0x06EA, 0x06EA, 0x06EA }, { 0x06EB, 0x06EB, 0x06EB }, { 0x06EC, 0x06EC, 0x06EC }, { 0x06ED, 0x06ED, 0x06ED }, { 0x06EE, 0x06EE, 0x06EE }, { 0x06EF, 0x06EF, 0x06EF }, { 0x06FA, 0x06FA, 0x06FA }, { 0x06FB, 0x06FB, 0x06FB }, { 0x06FC, 0x06FC, 0x06FC }, { 0x06FF, 0x06FF, 0x06FF }, { 0x0710, 0x0710, 0x0710 }, { 0x0711, 0x0711, 0x0711 }, { 0x0712, 0x0712, 0x0712 }, { 0x0713, 0x0713, 0x0713 }, { 0x0714, 0x0714, 0x0714 }, { 0x0715, 0x0715, 0x0715 }, { 0x0716, 0x0716, 0x0716 }, { 0x0717, 0x0717, 0x0717 }, { 0x0718, 0x0718, 0x0718 }, { 0x0719, 0x0719, 0x0719 }, { 0x071A, 0x071A, 0x071A }, { 0x071B, 0x071B, 0x071B }, { 0x071C, 0x071C, 0x071C }, { 0x071D, 0x071D, 0x071D }, { 0x071E, 0x071E, 0x071E }, { 0x071F, 0x071F, 0x071F }, { 0x0720, 0x0720, 0x0720 }, { 0x0721, 0x0721, 0x0721 }, { 0x0722, 0x0722, 0x0722 }, { 0x0723, 0x0723, 0x0723 }, { 0x0724, 0x0724, 0x0724 }, { 0x0725, 0x0725, 0x0725 }, { 0x0726, 0x0726, 0x0726 }, { 0x0727, 0x0727, 0x0727 }, { 0x0728, 0x0728, 0x0728 }, { 0x0729, 0x0729, 0x0729 }, { 0x072A, 0x072A, 0x072A }, { 0x072B, 0x072B, 0x072B }, { 0x072C, 0x072C, 0x072C }, { 0x072D, 0x072D, 0x072D }, { 0x072E, 0x072E, 0x072E }, { 0x072F, 0x072F, 0x072F }, { 0x0730, 0x0730, 0x0730 }, { 0x0731, 0x0731, 0x0731 }, { 0x0732, 0x0732, 0x0732 }, { 0x0733, 0x0733, 0x0733 }, { 0x0734, 0x0734, 0x0734 }, { 0x0735, 0x0735, 0x0735 }, { 0x0736, 0x0736, 0x0736 }, { 0x0737, 0x0737, 0x0737 }, { 0x0738, 0x0738, 0x0738 }, { 0x0739, 0x0739, 0x0739 }, { 0x073A, 0x073A, 0x073A }, { 0x073B, 0x073B, 0x073B }, { 0x073C, 0x073C, 0x073C }, { 0x073D, 0x073D, 0x073D }, { 0x073E, 0x073E, 0x073E }, { 0x073F, 0x073F, 0x073F }, { 0x0740, 0x0740, 0x0740 }, { 0x0741, 0x0741, 0x0741 }, { 0x0742, 0x0742, 0x0742 }, { 0x0743, 0x0743, 0x0743 }, { 0x0744, 0x0744, 0x0744 }, { 0x0745, 0x0745, 0x0745 }, { 0x0746, 0x0746, 0x0746 }, { 0x0747, 0x0747, 0x0747 }, { 0x0748, 0x0748, 0x0748 }, { 0x0749, 0x0749, 0x0749 }, { 0x074A, 0x074A, 0x074A }, { 0x074D, 0x074D, 0x074D }, { 0x074E, 0x074E, 0x074E }, { 0x074F, 0x074F, 0x074F }, { 0x0750, 0x0750, 0x0750 }, { 0x0751, 0x0751, 0x0751 }, { 0x0752, 0x0752, 0x0752 }, { 0x0753, 0x0753, 0x0753 }, { 0x0754, 0x0754, 0x0754 }, { 0x0755, 0x0755, 0x0755 }, { 0x0756, 0x0756, 0x0756 }, { 0x0757, 0x0757, 0x0757 }, { 0x0758, 0x0758, 0x0758 }, { 0x0759, 0x0759, 0x0759 }, { 0x075A, 0x075A, 0x075A }, { 0x075B, 0x075B, 0x075B }, { 0x075C, 0x075C, 0x075C }, { 0x075D, 0x075D, 0x075D }, { 0x075E, 0x075E, 0x075E }, { 0x075F, 0x075F, 0x075F }, { 0x0760, 0x0760, 0x0760 }, { 0x0761, 0x0761, 0x0761 }, { 0x0762, 0x0762, 0x0762 }, { 0x0763, 0x0763, 0x0763 }, { 0x0764, 0x0764, 0x0764 }, { 0x0765, 0x0765, 0x0765 }, { 0x0766, 0x0766, 0x0766 }, { 0x0767, 0x0767, 0x0767 }, { 0x0768, 0x0768, 0x0768 }, { 0x0769, 0x0769, 0x0769 }, { 0x076A, 0x076A, 0x076A }, { 0x076B, 0x076B, 0x076B }, { 0x076C, 0x076C, 0x076C }, { 0x076D, 0x076D, 0x076D }, { 0x0780, 0x0780, 0x0780 }, { 0x0781, 0x0781, 0x0781 }, { 0x0782, 0x0782, 0x0782 }, { 0x0783, 0x0783, 0x0783 }, { 0x0784, 0x0784, 0x0784 }, { 0x0785, 0x0785, 0x0785 }, { 0x0786, 0x0786, 0x0786 }, { 0x0787, 0x0787, 0x0787 }, { 0x0788, 0x0788, 0x0788 }, { 0x0789, 0x0789, 0x0789 }, { 0x078A, 0x078A, 0x078A }, { 0x078B, 0x078B, 0x078B }, { 0x078C, 0x078C, 0x078C }, { 0x078D, 0x078D, 0x078D }, { 0x078E, 0x078E, 0x078E }, { 0x078F, 0x078F, 0x078F }, { 0x0790, 0x0790, 0x0790 }, { 0x0791, 0x0791, 0x0791 }, { 0x0792, 0x0792, 0x0792 }, { 0x0793, 0x0793, 0x0793 }, { 0x0794, 0x0794, 0x0794 }, { 0x0795, 0x0795, 0x0795 }, { 0x0796, 0x0796, 0x0796 }, { 0x0797, 0x0797, 0x0797 }, { 0x0798, 0x0798, 0x0798 }, { 0x0799, 0x0799, 0x0799 }, { 0x079A, 0x079A, 0x079A }, { 0x079B, 0x079B, 0x079B }, { 0x079C, 0x079C, 0x079C }, { 0x079D, 0x079D, 0x079D }, { 0x079E, 0x079E, 0x079E }, { 0x079F, 0x079F, 0x079F }, { 0x07A0, 0x07A0, 0x07A0 }, { 0x07A1, 0x07A1, 0x07A1 }, { 0x07A2, 0x07A2, 0x07A2 }, { 0x07A3, 0x07A3, 0x07A3 }, { 0x07A4, 0x07A4, 0x07A4 }, { 0x07A5, 0x07A5, 0x07A5 }, { 0x07A6, 0x07A6, 0x07A6 }, { 0x07A7, 0x07A7, 0x07A7 }, { 0x07A8, 0x07A8, 0x07A8 }, { 0x07A9, 0x07A9, 0x07A9 }, { 0x07AA, 0x07AA, 0x07AA }, { 0x07AB, 0x07AB, 0x07AB }, { 0x07AC, 0x07AC, 0x07AC }, { 0x07AD, 0x07AD, 0x07AD }, { 0x07AE, 0x07AE, 0x07AE }, { 0x07AF, 0x07AF, 0x07AF }, { 0x07B0, 0x07B0, 0x07B0 }, { 0x07B1, 0x07B1, 0x07B1 }, { 0x0901, 0x0901, 0x0901 }, { 0x0902, 0x0902, 0x0902 }, { 0x0904, 0x0904, 0x0904 }, { 0x0905, 0x0905, 0x0905 }, { 0x0906, 0x0906, 0x0906 }, { 0x0907, 0x0907, 0x0907 }, { 0x0908, 0x0908, 0x0908 }, { 0x0909, 0x0909, 0x0909 }, { 0x090A, 0x090A, 0x090A }, { 0x090B, 0x090B, 0x090B }, { 0x090C, 0x090C, 0x090C }, { 0x090D, 0x090D, 0x090D }, { 0x090E, 0x090E, 0x090E }, { 0x090F, 0x090F, 0x090F }, { 0x0910, 0x0910, 0x0910 }, { 0x0911, 0x0911, 0x0911 }, { 0x0912, 0x0912, 0x0912 }, { 0x0913, 0x0913, 0x0913 }, { 0x0914, 0x0914, 0x0914 }, { 0x0915, 0x0915, 0x0915 }, { 0x0916, 0x0916, 0x0916 }, { 0x0917, 0x0917, 0x0917 }, { 0x0918, 0x0918, 0x0918 }, { 0x0919, 0x0919, 0x0919 }, { 0x091A, 0x091A, 0x091A }, { 0x091B, 0x091B, 0x091B }, { 0x091C, 0x091C, 0x091C }, { 0x091D, 0x091D, 0x091D }, { 0x091E, 0x091E, 0x091E }, { 0x091F, 0x091F, 0x091F }, { 0x0920, 0x0920, 0x0920 }, { 0x0921, 0x0921, 0x0921 }, { 0x0922, 0x0922, 0x0922 }, { 0x0923, 0x0923, 0x0923 }, { 0x0924, 0x0924, 0x0924 }, { 0x0925, 0x0925, 0x0925 }, { 0x0926, 0x0926, 0x0926 }, { 0x0927, 0x0927, 0x0927 }, { 0x0928, 0x0928, 0x0928 }, { 0x0929, 0x0929, 0x0929 }, { 0x092A, 0x092A, 0x092A }, { 0x092B, 0x092B, 0x092B }, { 0x092C, 0x092C, 0x092C }, { 0x092D, 0x092D, 0x092D }, { 0x092E, 0x092E, 0x092E }, { 0x092F, 0x092F, 0x092F }, { 0x0930, 0x0930, 0x0930 }, { 0x0931, 0x0931, 0x0931 }, { 0x0932, 0x0932, 0x0932 }, { 0x0933, 0x0933, 0x0933 }, { 0x0934, 0x0934, 0x0934 }, { 0x0935, 0x0935, 0x0935 }, { 0x0936, 0x0936, 0x0936 }, { 0x0937, 0x0937, 0x0937 }, { 0x0938, 0x0938, 0x0938 }, { 0x0939, 0x0939, 0x0939 }, { 0x093C, 0x093C, 0x093C }, { 0x093D, 0x093D, 0x093D }, { 0x0941, 0x0941, 0x0941 }, { 0x0942, 0x0942, 0x0942 }, { 0x0943, 0x0943, 0x0943 }, { 0x0944, 0x0944, 0x0944 }, { 0x0945, 0x0945, 0x0945 }, { 0x0946, 0x0946, 0x0946 }, { 0x0947, 0x0947, 0x0947 }, { 0x0948, 0x0948, 0x0948 }, { 0x094D, 0x094D, 0x094D }, { 0x0950, 0x0950, 0x0950 }, { 0x0951, 0x0951, 0x0951 }, { 0x0952, 0x0952, 0x0952 }, { 0x0953, 0x0953, 0x0953 }, { 0x0954, 0x0954, 0x0954 }, { 0x0958, 0x0958, 0x0958 }, { 0x0959, 0x0959, 0x0959 }, { 0x095A, 0x095A, 0x095A }, { 0x095B, 0x095B, 0x095B }, { 0x095C, 0x095C, 0x095C }, { 0x095D, 0x095D, 0x095D }, { 0x095E, 0x095E, 0x095E }, { 0x095F, 0x095F, 0x095F }, { 0x0960, 0x0960, 0x0960 }, { 0x0961, 0x0961, 0x0961 }, { 0x0962, 0x0962, 0x0962 }, { 0x0963, 0x0963, 0x0963 }, { 0x097D, 0x097D, 0x097D }, { 0x0981, 0x0981, 0x0981 }, { 0x0985, 0x0985, 0x0985 }, { 0x0986, 0x0986, 0x0986 }, { 0x0987, 0x0987, 0x0987 }, { 0x0988, 0x0988, 0x0988 }, { 0x0989, 0x0989, 0x0989 }, { 0x098A, 0x098A, 0x098A }, { 0x098B, 0x098B, 0x098B }, { 0x098C, 0x098C, 0x098C }, { 0x098F, 0x098F, 0x098F }, { 0x0990, 0x0990, 0x0990 }, { 0x0993, 0x0993, 0x0993 }, { 0x0994, 0x0994, 0x0994 }, { 0x0995, 0x0995, 0x0995 }, { 0x0996, 0x0996, 0x0996 }, { 0x0997, 0x0997, 0x0997 }, { 0x0998, 0x0998, 0x0998 }, { 0x0999, 0x0999, 0x0999 }, { 0x099A, 0x099A, 0x099A }, { 0x099B, 0x099B, 0x099B }, { 0x099C, 0x099C, 0x099C }, { 0x099D, 0x099D, 0x099D }, { 0x099E, 0x099E, 0x099E }, { 0x099F, 0x099F, 0x099F }, { 0x09A0, 0x09A0, 0x09A0 }, { 0x09A1, 0x09A1, 0x09A1 }, { 0x09A2, 0x09A2, 0x09A2 }, { 0x09A3, 0x09A3, 0x09A3 }, { 0x09A4, 0x09A4, 0x09A4 }, { 0x09A5, 0x09A5, 0x09A5 }, { 0x09A6, 0x09A6, 0x09A6 }, { 0x09A7, 0x09A7, 0x09A7 }, { 0x09A8, 0x09A8, 0x09A8 }, { 0x09AA, 0x09AA, 0x09AA }, { 0x09AB, 0x09AB, 0x09AB }, { 0x09AC, 0x09AC, 0x09AC }, { 0x09AD, 0x09AD, 0x09AD }, { 0x09AE, 0x09AE, 0x09AE }, { 0x09AF, 0x09AF, 0x09AF }, { 0x09B0, 0x09B0, 0x09B0 }, { 0x09B2, 0x09B2, 0x09B2 }, { 0x09B6, 0x09B6, 0x09B6 }, { 0x09B7, 0x09B7, 0x09B7 }, { 0x09B8, 0x09B8, 0x09B8 }, { 0x09B9, 0x09B9, 0x09B9 }, { 0x09BC, 0x09BC, 0x09BC }, { 0x09BD, 0x09BD, 0x09BD }, { 0x09C1, 0x09C1, 0x09C1 }, { 0x09C2, 0x09C2, 0x09C2 }, { 0x09C3, 0x09C3, 0x09C3 }, { 0x09C4, 0x09C4, 0x09C4 }, { 0x09CD, 0x09CD, 0x09CD }, { 0x09CE, 0x09CE, 0x09CE }, { 0x09DC, 0x09DC, 0x09DC }, { 0x09DD, 0x09DD, 0x09DD }, { 0x09DF, 0x09DF, 0x09DF }, { 0x09E0, 0x09E0, 0x09E0 }, { 0x09E1, 0x09E1, 0x09E1 }, { 0x09E2, 0x09E2, 0x09E2 }, { 0x09E3, 0x09E3, 0x09E3 }, { 0x09F0, 0x09F0, 0x09F0 }, { 0x09F1, 0x09F1, 0x09F1 }, { 0x0A01, 0x0A01, 0x0A01 }, { 0x0A02, 0x0A02, 0x0A02 }, { 0x0A05, 0x0A05, 0x0A05 }, { 0x0A06, 0x0A06, 0x0A06 }, { 0x0A07, 0x0A07, 0x0A07 }, { 0x0A08, 0x0A08, 0x0A08 }, { 0x0A09, 0x0A09, 0x0A09 }, { 0x0A0A, 0x0A0A, 0x0A0A }, { 0x0A0F, 0x0A0F, 0x0A0F }, { 0x0A10, 0x0A10, 0x0A10 }, { 0x0A13, 0x0A13, 0x0A13 }, { 0x0A14, 0x0A14, 0x0A14 }, { 0x0A15, 0x0A15, 0x0A15 }, { 0x0A16, 0x0A16, 0x0A16 }, { 0x0A17, 0x0A17, 0x0A17 }, { 0x0A18, 0x0A18, 0x0A18 }, { 0x0A19, 0x0A19, 0x0A19 }, { 0x0A1A, 0x0A1A, 0x0A1A }, { 0x0A1B, 0x0A1B, 0x0A1B }, { 0x0A1C, 0x0A1C, 0x0A1C }, { 0x0A1D, 0x0A1D, 0x0A1D }, { 0x0A1E, 0x0A1E, 0x0A1E }, { 0x0A1F, 0x0A1F, 0x0A1F }, { 0x0A20, 0x0A20, 0x0A20 }, { 0x0A21, 0x0A21, 0x0A21 }, { 0x0A22, 0x0A22, 0x0A22 }, { 0x0A23, 0x0A23, 0x0A23 }, { 0x0A24, 0x0A24, 0x0A24 }, { 0x0A25, 0x0A25, 0x0A25 }, { 0x0A26, 0x0A26, 0x0A26 }, { 0x0A27, 0x0A27, 0x0A27 }, { 0x0A28, 0x0A28, 0x0A28 }, { 0x0A2A, 0x0A2A, 0x0A2A }, { 0x0A2B, 0x0A2B, 0x0A2B }, { 0x0A2C, 0x0A2C, 0x0A2C }, { 0x0A2D, 0x0A2D, 0x0A2D }, { 0x0A2E, 0x0A2E, 0x0A2E }, { 0x0A2F, 0x0A2F, 0x0A2F }, { 0x0A30, 0x0A30, 0x0A30 }, { 0x0A32, 0x0A32, 0x0A32 }, { 0x0A33, 0x0A33, 0x0A33 }, { 0x0A35, 0x0A35, 0x0A35 }, { 0x0A36, 0x0A36, 0x0A36 }, { 0x0A38, 0x0A38, 0x0A38 }, { 0x0A39, 0x0A39, 0x0A39 }, { 0x0A3C, 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A41, 0x0A41 }, { 0x0A42, 0x0A42, 0x0A42 }, { 0x0A47, 0x0A47, 0x0A47 }, { 0x0A48, 0x0A48, 0x0A48 }, { 0x0A4B, 0x0A4B, 0x0A4B }, { 0x0A4C, 0x0A4C, 0x0A4C }, { 0x0A4D, 0x0A4D, 0x0A4D }, { 0x0A59, 0x0A59, 0x0A59 }, { 0x0A5A, 0x0A5A, 0x0A5A }, { 0x0A5B, 0x0A5B, 0x0A5B }, { 0x0A5C, 0x0A5C, 0x0A5C }, { 0x0A5E, 0x0A5E, 0x0A5E }, { 0x0A70, 0x0A70, 0x0A70 }, { 0x0A71, 0x0A71, 0x0A71 }, { 0x0A72, 0x0A72, 0x0A72 }, { 0x0A73, 0x0A73, 0x0A73 }, { 0x0A74, 0x0A74, 0x0A74 }, { 0x0A81, 0x0A81, 0x0A81 }, { 0x0A82, 0x0A82, 0x0A82 }, { 0x0A85, 0x0A85, 0x0A85 }, { 0x0A86, 0x0A86, 0x0A86 }, { 0x0A87, 0x0A87, 0x0A87 }, { 0x0A88, 0x0A88, 0x0A88 }, { 0x0A89, 0x0A89, 0x0A89 }, { 0x0A8A, 0x0A8A, 0x0A8A }, { 0x0A8B, 0x0A8B, 0x0A8B }, { 0x0A8C, 0x0A8C, 0x0A8C }, { 0x0A8D, 0x0A8D, 0x0A8D }, { 0x0A8F, 0x0A8F, 0x0A8F }, { 0x0A90, 0x0A90, 0x0A90 }, { 0x0A91, 0x0A91, 0x0A91 }, { 0x0A93, 0x0A93, 0x0A93 }, { 0x0A94, 0x0A94, 0x0A94 }, { 0x0A95, 0x0A95, 0x0A95 }, { 0x0A96, 0x0A96, 0x0A96 }, { 0x0A97, 0x0A97, 0x0A97 }, { 0x0A98, 0x0A98, 0x0A98 }, { 0x0A99, 0x0A99, 0x0A99 }, { 0x0A9A, 0x0A9A, 0x0A9A }, { 0x0A9B, 0x0A9B, 0x0A9B }, { 0x0A9C, 0x0A9C, 0x0A9C }, { 0x0A9D, 0x0A9D, 0x0A9D }, { 0x0A9E, 0x0A9E, 0x0A9E }, { 0x0A9F, 0x0A9F, 0x0A9F }, { 0x0AA0, 0x0AA0, 0x0AA0 }, { 0x0AA1, 0x0AA1, 0x0AA1 }, { 0x0AA2, 0x0AA2, 0x0AA2 }, { 0x0AA3, 0x0AA3, 0x0AA3 }, { 0x0AA4, 0x0AA4, 0x0AA4 }, { 0x0AA5, 0x0AA5, 0x0AA5 }, { 0x0AA6, 0x0AA6, 0x0AA6 }, { 0x0AA7, 0x0AA7, 0x0AA7 }, { 0x0AA8, 0x0AA8, 0x0AA8 }, { 0x0AAA, 0x0AAA, 0x0AAA }, { 0x0AAB, 0x0AAB, 0x0AAB }, { 0x0AAC, 0x0AAC, 0x0AAC }, { 0x0AAD, 0x0AAD, 0x0AAD }, { 0x0AAE, 0x0AAE, 0x0AAE }, { 0x0AAF, 0x0AAF, 0x0AAF }, { 0x0AB0, 0x0AB0, 0x0AB0 }, { 0x0AB2, 0x0AB2, 0x0AB2 }, { 0x0AB3, 0x0AB3, 0x0AB3 }, { 0x0AB5, 0x0AB5, 0x0AB5 }, { 0x0AB6, 0x0AB6, 0x0AB6 }, { 0x0AB7, 0x0AB7, 0x0AB7 }, { 0x0AB8, 0x0AB8, 0x0AB8 }, { 0x0AB9, 0x0AB9, 0x0AB9 }, { 0x0ABC, 0x0ABC, 0x0ABC }, { 0x0ABD, 0x0ABD, 0x0ABD }, { 0x0AC1, 0x0AC1, 0x0AC1 }, { 0x0AC2, 0x0AC2, 0x0AC2 }, { 0x0AC3, 0x0AC3, 0x0AC3 }, { 0x0AC4, 0x0AC4, 0x0AC4 }, { 0x0AC5, 0x0AC5, 0x0AC5 }, { 0x0AC7, 0x0AC7, 0x0AC7 }, { 0x0AC8, 0x0AC8, 0x0AC8 }, { 0x0ACD, 0x0ACD, 0x0ACD }, { 0x0AD0, 0x0AD0, 0x0AD0 }, { 0x0AE0, 0x0AE0, 0x0AE0 }, { 0x0AE1, 0x0AE1, 0x0AE1 }, { 0x0AE2, 0x0AE2, 0x0AE2 }, { 0x0AE3, 0x0AE3, 0x0AE3 }, { 0x0B01, 0x0B01, 0x0B01 }, { 0x0B05, 0x0B05, 0x0B05 }, { 0x0B06, 0x0B06, 0x0B06 }, { 0x0B07, 0x0B07, 0x0B07 }, { 0x0B08, 0x0B08, 0x0B08 }, { 0x0B09, 0x0B09, 0x0B09 }, { 0x0B0A, 0x0B0A, 0x0B0A }, { 0x0B0B, 0x0B0B, 0x0B0B }, { 0x0B0C, 0x0B0C, 0x0B0C }, { 0x0B0F, 0x0B0F, 0x0B0F }, { 0x0B10, 0x0B10, 0x0B10 }, { 0x0B13, 0x0B13, 0x0B13 }, { 0x0B14, 0x0B14, 0x0B14 }, { 0x0B15, 0x0B15, 0x0B15 }, { 0x0B16, 0x0B16, 0x0B16 }, { 0x0B17, 0x0B17, 0x0B17 }, { 0x0B18, 0x0B18, 0x0B18 }, { 0x0B19, 0x0B19, 0x0B19 }, { 0x0B1A, 0x0B1A, 0x0B1A }, { 0x0B1B, 0x0B1B, 0x0B1B }, { 0x0B1C, 0x0B1C, 0x0B1C }, { 0x0B1D, 0x0B1D, 0x0B1D }, { 0x0B1E, 0x0B1E, 0x0B1E }, { 0x0B1F, 0x0B1F, 0x0B1F }, { 0x0B20, 0x0B20, 0x0B20 }, { 0x0B21, 0x0B21, 0x0B21 }, { 0x0B22, 0x0B22, 0x0B22 }, { 0x0B23, 0x0B23, 0x0B23 }, { 0x0B24, 0x0B24, 0x0B24 }, { 0x0B25, 0x0B25, 0x0B25 }, { 0x0B26, 0x0B26, 0x0B26 }, { 0x0B27, 0x0B27, 0x0B27 }, { 0x0B28, 0x0B28, 0x0B28 }, { 0x0B2A, 0x0B2A, 0x0B2A }, { 0x0B2B, 0x0B2B, 0x0B2B }, { 0x0B2C, 0x0B2C, 0x0B2C }, { 0x0B2D, 0x0B2D, 0x0B2D }, { 0x0B2E, 0x0B2E, 0x0B2E }, { 0x0B2F, 0x0B2F, 0x0B2F }, { 0x0B30, 0x0B30, 0x0B30 }, { 0x0B32, 0x0B32, 0x0B32 }, { 0x0B33, 0x0B33, 0x0B33 }, { 0x0B35, 0x0B35, 0x0B35 }, { 0x0B36, 0x0B36, 0x0B36 }, { 0x0B37, 0x0B37, 0x0B37 }, { 0x0B38, 0x0B38, 0x0B38 }, { 0x0B39, 0x0B39, 0x0B39 }, { 0x0B3C, 0x0B3C, 0x0B3C }, { 0x0B3D, 0x0B3D, 0x0B3D }, { 0x0B3F, 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B41, 0x0B41 }, { 0x0B42, 0x0B42, 0x0B42 }, { 0x0B43, 0x0B43, 0x0B43 }, { 0x0B4D, 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56, 0x0B56 }, { 0x0B5C, 0x0B5C, 0x0B5C }, { 0x0B5D, 0x0B5D, 0x0B5D }, { 0x0B5F, 0x0B5F, 0x0B5F }, { 0x0B60, 0x0B60, 0x0B60 }, { 0x0B61, 0x0B61, 0x0B61 }, { 0x0B71, 0x0B71, 0x0B71 }, { 0x0B82, 0x0B82, 0x0B82 }, { 0x0B83, 0x0B83, 0x0B83 }, { 0x0B85, 0x0B85, 0x0B85 }, { 0x0B86, 0x0B86, 0x0B86 }, { 0x0B87, 0x0B87, 0x0B87 }, { 0x0B88, 0x0B88, 0x0B88 }, { 0x0B89, 0x0B89, 0x0B89 }, { 0x0B8A, 0x0B8A, 0x0B8A }, { 0x0B8E, 0x0B8E, 0x0B8E }, { 0x0B8F, 0x0B8F, 0x0B8F }, { 0x0B90, 0x0B90, 0x0B90 }, { 0x0B92, 0x0B92, 0x0B92 }, { 0x0B93, 0x0B93, 0x0B93 }, { 0x0B94, 0x0B94, 0x0B94 }, { 0x0B95, 0x0B95, 0x0B95 }, { 0x0B99, 0x0B99, 0x0B99 }, { 0x0B9A, 0x0B9A, 0x0B9A }, { 0x0B9C, 0x0B9C, 0x0B9C }, { 0x0B9E, 0x0B9E, 0x0B9E }, { 0x0B9F, 0x0B9F, 0x0B9F }, { 0x0BA3, 0x0BA3, 0x0BA3 }, { 0x0BA4, 0x0BA4, 0x0BA4 }, { 0x0BA8, 0x0BA8, 0x0BA8 }, { 0x0BA9, 0x0BA9, 0x0BA9 }, { 0x0BAA, 0x0BAA, 0x0BAA }, { 0x0BAE, 0x0BAE, 0x0BAE }, { 0x0BAF, 0x0BAF, 0x0BAF }, { 0x0BB0, 0x0BB0, 0x0BB0 }, { 0x0BB1, 0x0BB1, 0x0BB1 }, { 0x0BB2, 0x0BB2, 0x0BB2 }, { 0x0BB3, 0x0BB3, 0x0BB3 }, { 0x0BB4, 0x0BB4, 0x0BB4 }, { 0x0BB5, 0x0BB5, 0x0BB5 }, { 0x0BB6, 0x0BB6, 0x0BB6 }, { 0x0BB7, 0x0BB7, 0x0BB7 }, { 0x0BB8, 0x0BB8, 0x0BB8 }, { 0x0BB9, 0x0BB9, 0x0BB9 }, { 0x0BC0, 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD, 0x0BCD }, { 0x0C05, 0x0C05, 0x0C05 }, { 0x0C06, 0x0C06, 0x0C06 }, { 0x0C07, 0x0C07, 0x0C07 }, { 0x0C08, 0x0C08, 0x0C08 }, { 0x0C09, 0x0C09, 0x0C09 }, { 0x0C0A, 0x0C0A, 0x0C0A }, { 0x0C0B, 0x0C0B, 0x0C0B }, { 0x0C0C, 0x0C0C, 0x0C0C }, { 0x0C0E, 0x0C0E, 0x0C0E }, { 0x0C0F, 0x0C0F, 0x0C0F }, { 0x0C10, 0x0C10, 0x0C10 }, { 0x0C12, 0x0C12, 0x0C12 }, { 0x0C13, 0x0C13, 0x0C13 }, { 0x0C14, 0x0C14, 0x0C14 }, { 0x0C15, 0x0C15, 0x0C15 }, { 0x0C16, 0x0C16, 0x0C16 }, { 0x0C17, 0x0C17, 0x0C17 }, { 0x0C18, 0x0C18, 0x0C18 }, { 0x0C19, 0x0C19, 0x0C19 }, { 0x0C1A, 0x0C1A, 0x0C1A }, { 0x0C1B, 0x0C1B, 0x0C1B }, { 0x0C1C, 0x0C1C, 0x0C1C }, { 0x0C1D, 0x0C1D, 0x0C1D }, { 0x0C1E, 0x0C1E, 0x0C1E }, { 0x0C1F, 0x0C1F, 0x0C1F }, { 0x0C20, 0x0C20, 0x0C20 }, { 0x0C21, 0x0C21, 0x0C21 }, { 0x0C22, 0x0C22, 0x0C22 }, { 0x0C23, 0x0C23, 0x0C23 }, { 0x0C24, 0x0C24, 0x0C24 }, { 0x0C25, 0x0C25, 0x0C25 }, { 0x0C26, 0x0C26, 0x0C26 }, { 0x0C27, 0x0C27, 0x0C27 }, { 0x0C28, 0x0C28, 0x0C28 }, { 0x0C2A, 0x0C2A, 0x0C2A }, { 0x0C2B, 0x0C2B, 0x0C2B }, { 0x0C2C, 0x0C2C, 0x0C2C }, { 0x0C2D, 0x0C2D, 0x0C2D }, { 0x0C2E, 0x0C2E, 0x0C2E }, { 0x0C2F, 0x0C2F, 0x0C2F }, { 0x0C30, 0x0C30, 0x0C30 }, { 0x0C31, 0x0C31, 0x0C31 }, { 0x0C32, 0x0C32, 0x0C32 }, { 0x0C33, 0x0C33, 0x0C33 }, { 0x0C35, 0x0C35, 0x0C35 }, { 0x0C36, 0x0C36, 0x0C36 }, { 0x0C37, 0x0C37, 0x0C37 }, { 0x0C38, 0x0C38, 0x0C38 }, { 0x0C39, 0x0C39, 0x0C39 }, { 0x0C3E, 0x0C3E, 0x0C3E }, { 0x0C3F, 0x0C3F, 0x0C3F }, { 0x0C40, 0x0C40, 0x0C40 }, { 0x0C46, 0x0C46, 0x0C46 }, { 0x0C47, 0x0C47, 0x0C47 }, { 0x0C48, 0x0C48, 0x0C48 }, { 0x0C4A, 0x0C4A, 0x0C4A }, { 0x0C4B, 0x0C4B, 0x0C4B }, { 0x0C4C, 0x0C4C, 0x0C4C }, { 0x0C4D, 0x0C4D, 0x0C4D }, { 0x0C55, 0x0C55, 0x0C55 }, { 0x0C56, 0x0C56, 0x0C56 }, { 0x0C60, 0x0C60, 0x0C60 }, { 0x0C61, 0x0C61, 0x0C61 }, { 0x0C85, 0x0C85, 0x0C85 }, { 0x0C86, 0x0C86, 0x0C86 }, { 0x0C87, 0x0C87, 0x0C87 }, { 0x0C88, 0x0C88, 0x0C88 }, { 0x0C89, 0x0C89, 0x0C89 }, { 0x0C8A, 0x0C8A, 0x0C8A }, { 0x0C8B, 0x0C8B, 0x0C8B }, { 0x0C8C, 0x0C8C, 0x0C8C }, { 0x0C8E, 0x0C8E, 0x0C8E }, { 0x0C8F, 0x0C8F, 0x0C8F }, { 0x0C90, 0x0C90, 0x0C90 }, { 0x0C92, 0x0C92, 0x0C92 }, { 0x0C93, 0x0C93, 0x0C93 }, { 0x0C94, 0x0C94, 0x0C94 }, { 0x0C95, 0x0C95, 0x0C95 }, { 0x0C96, 0x0C96, 0x0C96 }, { 0x0C97, 0x0C97, 0x0C97 }, { 0x0C98, 0x0C98, 0x0C98 }, { 0x0C99, 0x0C99, 0x0C99 }, { 0x0C9A, 0x0C9A, 0x0C9A }, { 0x0C9B, 0x0C9B, 0x0C9B }, { 0x0C9C, 0x0C9C, 0x0C9C }, { 0x0C9D, 0x0C9D, 0x0C9D }, { 0x0C9E, 0x0C9E, 0x0C9E }, { 0x0C9F, 0x0C9F, 0x0C9F }, { 0x0CA0, 0x0CA0, 0x0CA0 }, { 0x0CA1, 0x0CA1, 0x0CA1 }, { 0x0CA2, 0x0CA2, 0x0CA2 }, { 0x0CA3, 0x0CA3, 0x0CA3 }, { 0x0CA4, 0x0CA4, 0x0CA4 }, { 0x0CA5, 0x0CA5, 0x0CA5 }, { 0x0CA6, 0x0CA6, 0x0CA6 }, { 0x0CA7, 0x0CA7, 0x0CA7 }, { 0x0CA8, 0x0CA8, 0x0CA8 }, { 0x0CAA, 0x0CAA, 0x0CAA }, { 0x0CAB, 0x0CAB, 0x0CAB }, { 0x0CAC, 0x0CAC, 0x0CAC }, { 0x0CAD, 0x0CAD, 0x0CAD }, { 0x0CAE, 0x0CAE, 0x0CAE }, { 0x0CAF, 0x0CAF, 0x0CAF }, { 0x0CB0, 0x0CB0, 0x0CB0 }, { 0x0CB1, 0x0CB1, 0x0CB1 }, { 0x0CB2, 0x0CB2, 0x0CB2 }, { 0x0CB3, 0x0CB3, 0x0CB3 }, { 0x0CB5, 0x0CB5, 0x0CB5 }, { 0x0CB6, 0x0CB6, 0x0CB6 }, { 0x0CB7, 0x0CB7, 0x0CB7 }, { 0x0CB8, 0x0CB8, 0x0CB8 }, { 0x0CB9, 0x0CB9, 0x0CB9 }, { 0x0CBC, 0x0CBC, 0x0CBC }, { 0x0CBD, 0x0CBD, 0x0CBD }, { 0x0CBF, 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCC, 0x0CCC }, { 0x0CCD, 0x0CCD, 0x0CCD }, { 0x0CDE, 0x0CDE, 0x0CDE }, { 0x0CE0, 0x0CE0, 0x0CE0 }, { 0x0CE1, 0x0CE1, 0x0CE1 }, { 0x0D05, 0x0D05, 0x0D05 }, { 0x0D06, 0x0D06, 0x0D06 }, { 0x0D07, 0x0D07, 0x0D07 }, { 0x0D08, 0x0D08, 0x0D08 }, { 0x0D09, 0x0D09, 0x0D09 }, { 0x0D0A, 0x0D0A, 0x0D0A }, { 0x0D0B, 0x0D0B, 0x0D0B }, { 0x0D0C, 0x0D0C, 0x0D0C }, { 0x0D0E, 0x0D0E, 0x0D0E }, { 0x0D0F, 0x0D0F, 0x0D0F }, { 0x0D10, 0x0D10, 0x0D10 }, { 0x0D12, 0x0D12, 0x0D12 }, { 0x0D13, 0x0D13, 0x0D13 }, { 0x0D14, 0x0D14, 0x0D14 }, { 0x0D15, 0x0D15, 0x0D15 }, { 0x0D16, 0x0D16, 0x0D16 }, { 0x0D17, 0x0D17, 0x0D17 }, { 0x0D18, 0x0D18, 0x0D18 }, { 0x0D19, 0x0D19, 0x0D19 }, { 0x0D1A, 0x0D1A, 0x0D1A }, { 0x0D1B, 0x0D1B, 0x0D1B }, { 0x0D1C, 0x0D1C, 0x0D1C }, { 0x0D1D, 0x0D1D, 0x0D1D }, { 0x0D1E, 0x0D1E, 0x0D1E }, { 0x0D1F, 0x0D1F, 0x0D1F }, { 0x0D20, 0x0D20, 0x0D20 }, { 0x0D21, 0x0D21, 0x0D21 }, { 0x0D22, 0x0D22, 0x0D22 }, { 0x0D23, 0x0D23, 0x0D23 }, { 0x0D24, 0x0D24, 0x0D24 }, { 0x0D25, 0x0D25, 0x0D25 }, { 0x0D26, 0x0D26, 0x0D26 }, { 0x0D27, 0x0D27, 0x0D27 }, { 0x0D28, 0x0D28, 0x0D28 }, { 0x0D2A, 0x0D2A, 0x0D2A }, { 0x0D2B, 0x0D2B, 0x0D2B }, { 0x0D2C, 0x0D2C, 0x0D2C }, { 0x0D2D, 0x0D2D, 0x0D2D }, { 0x0D2E, 0x0D2E, 0x0D2E }, { 0x0D2F, 0x0D2F, 0x0D2F }, { 0x0D30, 0x0D30, 0x0D30 }, { 0x0D31, 0x0D31, 0x0D31 }, { 0x0D32, 0x0D32, 0x0D32 }, { 0x0D33, 0x0D33, 0x0D33 }, { 0x0D34, 0x0D34, 0x0D34 }, { 0x0D35, 0x0D35, 0x0D35 }, { 0x0D36, 0x0D36, 0x0D36 }, { 0x0D37, 0x0D37, 0x0D37 }, { 0x0D38, 0x0D38, 0x0D38 }, { 0x0D39, 0x0D39, 0x0D39 }, { 0x0D41, 0x0D41, 0x0D41 }, { 0x0D42, 0x0D42, 0x0D42 }, { 0x0D43, 0x0D43, 0x0D43 }, { 0x0D4D, 0x0D4D, 0x0D4D }, { 0x0D60, 0x0D60, 0x0D60 }, { 0x0D61, 0x0D61, 0x0D61 }, { 0x0D85, 0x0D85, 0x0D85 }, { 0x0D86, 0x0D86, 0x0D86 }, { 0x0D87, 0x0D87, 0x0D87 }, { 0x0D88, 0x0D88, 0x0D88 }, { 0x0D89, 0x0D89, 0x0D89 }, { 0x0D8A, 0x0D8A, 0x0D8A }, { 0x0D8B, 0x0D8B, 0x0D8B }, { 0x0D8C, 0x0D8C, 0x0D8C }, { 0x0D8D, 0x0D8D, 0x0D8D }, { 0x0D8E, 0x0D8E, 0x0D8E }, { 0x0D8F, 0x0D8F, 0x0D8F }, { 0x0D90, 0x0D90, 0x0D90 }, { 0x0D91, 0x0D91, 0x0D91 }, { 0x0D92, 0x0D92, 0x0D92 }, { 0x0D93, 0x0D93, 0x0D93 }, { 0x0D94, 0x0D94, 0x0D94 }, { 0x0D95, 0x0D95, 0x0D95 }, { 0x0D96, 0x0D96, 0x0D96 }, { 0x0D9A, 0x0D9A, 0x0D9A }, { 0x0D9B, 0x0D9B, 0x0D9B }, { 0x0D9C, 0x0D9C, 0x0D9C }, { 0x0D9D, 0x0D9D, 0x0D9D }, { 0x0D9E, 0x0D9E, 0x0D9E }, { 0x0D9F, 0x0D9F, 0x0D9F }, { 0x0DA0, 0x0DA0, 0x0DA0 }, { 0x0DA1, 0x0DA1, 0x0DA1 }, { 0x0DA2, 0x0DA2, 0x0DA2 }, { 0x0DA3, 0x0DA3, 0x0DA3 }, { 0x0DA4, 0x0DA4, 0x0DA4 }, { 0x0DA5, 0x0DA5, 0x0DA5 }, { 0x0DA6, 0x0DA6, 0x0DA6 }, { 0x0DA7, 0x0DA7, 0x0DA7 }, { 0x0DA8, 0x0DA8, 0x0DA8 }, { 0x0DA9, 0x0DA9, 0x0DA9 }, { 0x0DAA, 0x0DAA, 0x0DAA }, { 0x0DAB, 0x0DAB, 0x0DAB }, { 0x0DAC, 0x0DAC, 0x0DAC }, { 0x0DAD, 0x0DAD, 0x0DAD }, { 0x0DAE, 0x0DAE, 0x0DAE }, { 0x0DAF, 0x0DAF, 0x0DAF }, { 0x0DB0, 0x0DB0, 0x0DB0 }, { 0x0DB1, 0x0DB1, 0x0DB1 }, { 0x0DB3, 0x0DB3, 0x0DB3 }, { 0x0DB4, 0x0DB4, 0x0DB4 }, { 0x0DB5, 0x0DB5, 0x0DB5 }, { 0x0DB6, 0x0DB6, 0x0DB6 }, { 0x0DB7, 0x0DB7, 0x0DB7 }, { 0x0DB8, 0x0DB8, 0x0DB8 }, { 0x0DB9, 0x0DB9, 0x0DB9 }, { 0x0DBA, 0x0DBA, 0x0DBA }, { 0x0DBB, 0x0DBB, 0x0DBB }, { 0x0DBD, 0x0DBD, 0x0DBD }, { 0x0DC0, 0x0DC0, 0x0DC0 }, { 0x0DC1, 0x0DC1, 0x0DC1 }, { 0x0DC2, 0x0DC2, 0x0DC2 }, { 0x0DC3, 0x0DC3, 0x0DC3 }, { 0x0DC4, 0x0DC4, 0x0DC4 }, { 0x0DC5, 0x0DC5, 0x0DC5 }, { 0x0DC6, 0x0DC6, 0x0DC6 }, { 0x0DCA, 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD2, 0x0DD2 }, { 0x0DD3, 0x0DD3, 0x0DD3 }, { 0x0DD4, 0x0DD4, 0x0DD4 }, { 0x0DD6, 0x0DD6, 0x0DD6 }, { 0x0E01, 0x0E01, 0x0E01 }, { 0x0E02, 0x0E02, 0x0E02 }, { 0x0E03, 0x0E03, 0x0E03 }, { 0x0E04, 0x0E04, 0x0E04 }, { 0x0E05, 0x0E05, 0x0E05 }, { 0x0E06, 0x0E06, 0x0E06 }, { 0x0E07, 0x0E07, 0x0E07 }, { 0x0E08, 0x0E08, 0x0E08 }, { 0x0E09, 0x0E09, 0x0E09 }, { 0x0E0A, 0x0E0A, 0x0E0A }, { 0x0E0B, 0x0E0B, 0x0E0B }, { 0x0E0C, 0x0E0C, 0x0E0C }, { 0x0E0D, 0x0E0D, 0x0E0D }, { 0x0E0E, 0x0E0E, 0x0E0E }, { 0x0E0F, 0x0E0F, 0x0E0F }, { 0x0E10, 0x0E10, 0x0E10 }, { 0x0E11, 0x0E11, 0x0E11 }, { 0x0E12, 0x0E12, 0x0E12 }, { 0x0E13, 0x0E13, 0x0E13 }, { 0x0E14, 0x0E14, 0x0E14 }, { 0x0E15, 0x0E15, 0x0E15 }, { 0x0E16, 0x0E16, 0x0E16 }, { 0x0E17, 0x0E17, 0x0E17 }, { 0x0E18, 0x0E18, 0x0E18 }, { 0x0E19, 0x0E19, 0x0E19 }, { 0x0E1A, 0x0E1A, 0x0E1A }, { 0x0E1B, 0x0E1B, 0x0E1B }, { 0x0E1C, 0x0E1C, 0x0E1C }, { 0x0E1D, 0x0E1D, 0x0E1D }, { 0x0E1E, 0x0E1E, 0x0E1E }, { 0x0E1F, 0x0E1F, 0x0E1F }, { 0x0E20, 0x0E20, 0x0E20 }, { 0x0E21, 0x0E21, 0x0E21 }, { 0x0E22, 0x0E22, 0x0E22 }, { 0x0E23, 0x0E23, 0x0E23 }, { 0x0E24, 0x0E24, 0x0E24 }, { 0x0E25, 0x0E25, 0x0E25 }, { 0x0E26, 0x0E26, 0x0E26 }, { 0x0E27, 0x0E27, 0x0E27 }, { 0x0E28, 0x0E28, 0x0E28 }, { 0x0E29, 0x0E29, 0x0E29 }, { 0x0E2A, 0x0E2A, 0x0E2A }, { 0x0E2B, 0x0E2B, 0x0E2B }, { 0x0E2C, 0x0E2C, 0x0E2C }, { 0x0E2D, 0x0E2D, 0x0E2D }, { 0x0E2E, 0x0E2E, 0x0E2E }, { 0x0E2F, 0x0E2F, 0x0E2F }, { 0x0E30, 0x0E30, 0x0E30 }, { 0x0E31, 0x0E31, 0x0E31 }, { 0x0E32, 0x0E32, 0x0E32 }, { 0x0E33, 0x0E33, 0x0E33 }, { 0x0E34, 0x0E34, 0x0E34 }, { 0x0E35, 0x0E35, 0x0E35 }, { 0x0E36, 0x0E36, 0x0E36 }, { 0x0E37, 0x0E37, 0x0E37 }, { 0x0E38, 0x0E38, 0x0E38 }, { 0x0E39, 0x0E39, 0x0E39 }, { 0x0E3A, 0x0E3A, 0x0E3A }, { 0x0E40, 0x0E40, 0x0E40 }, { 0x0E41, 0x0E41, 0x0E41 }, { 0x0E42, 0x0E42, 0x0E42 }, { 0x0E43, 0x0E43, 0x0E43 }, { 0x0E44, 0x0E44, 0x0E44 }, { 0x0E45, 0x0E45, 0x0E45 }, { 0x0E46, 0x0E46, 0x0E46 }, { 0x0E47, 0x0E47, 0x0E47 }, { 0x0E48, 0x0E48, 0x0E48 }, { 0x0E49, 0x0E49, 0x0E49 }, { 0x0E4A, 0x0E4A, 0x0E4A }, { 0x0E4B, 0x0E4B, 0x0E4B }, { 0x0E4C, 0x0E4C, 0x0E4C }, { 0x0E4D, 0x0E4D, 0x0E4D }, { 0x0E4E, 0x0E4E, 0x0E4E }, { 0x0E81, 0x0E81, 0x0E81 }, { 0x0E82, 0x0E82, 0x0E82 }, { 0x0E84, 0x0E84, 0x0E84 }, { 0x0E87, 0x0E87, 0x0E87 }, { 0x0E88, 0x0E88, 0x0E88 }, { 0x0E8A, 0x0E8A, 0x0E8A }, { 0x0E8D, 0x0E8D, 0x0E8D }, { 0x0E94, 0x0E94, 0x0E94 }, { 0x0E95, 0x0E95, 0x0E95 }, { 0x0E96, 0x0E96, 0x0E96 }, { 0x0E97, 0x0E97, 0x0E97 }, { 0x0E99, 0x0E99, 0x0E99 }, { 0x0E9A, 0x0E9A, 0x0E9A }, { 0x0E9B, 0x0E9B, 0x0E9B }, { 0x0E9C, 0x0E9C, 0x0E9C }, { 0x0E9D, 0x0E9D, 0x0E9D }, { 0x0E9E, 0x0E9E, 0x0E9E }, { 0x0E9F, 0x0E9F, 0x0E9F }, { 0x0EA1, 0x0EA1, 0x0EA1 }, { 0x0EA2, 0x0EA2, 0x0EA2 }, { 0x0EA3, 0x0EA3, 0x0EA3 }, { 0x0EA5, 0x0EA5, 0x0EA5 }, { 0x0EA7, 0x0EA7, 0x0EA7 }, { 0x0EAA, 0x0EAA, 0x0EAA }, { 0x0EAB, 0x0EAB, 0x0EAB }, { 0x0EAD, 0x0EAD, 0x0EAD }, { 0x0EAE, 0x0EAE, 0x0EAE }, { 0x0EAF, 0x0EAF, 0x0EAF }, { 0x0EB0, 0x0EB0, 0x0EB0 }, { 0x0EB1, 0x0EB1, 0x0EB1 }, { 0x0EB2, 0x0EB2, 0x0EB2 }, { 0x0EB3, 0x0EB3, 0x0EB3 }, { 0x0EB4, 0x0EB4, 0x0EB4 }, { 0x0EB5, 0x0EB5, 0x0EB5 }, { 0x0EB6, 0x0EB6, 0x0EB6 }, { 0x0EB7, 0x0EB7, 0x0EB7 }, { 0x0EB8, 0x0EB8, 0x0EB8 }, { 0x0EB9, 0x0EB9, 0x0EB9 }, { 0x0EBB, 0x0EBB, 0x0EBB }, { 0x0EBC, 0x0EBC, 0x0EBC }, { 0x0EBD, 0x0EBD, 0x0EBD }, { 0x0EC0, 0x0EC0, 0x0EC0 }, { 0x0EC1, 0x0EC1, 0x0EC1 }, { 0x0EC2, 0x0EC2, 0x0EC2 }, { 0x0EC3, 0x0EC3, 0x0EC3 }, { 0x0EC4, 0x0EC4, 0x0EC4 }, { 0x0EC6, 0x0EC6, 0x0EC6 }, { 0x0EC8, 0x0EC8, 0x0EC8 }, { 0x0EC9, 0x0EC9, 0x0EC9 }, { 0x0ECA, 0x0ECA, 0x0ECA }, { 0x0ECB, 0x0ECB, 0x0ECB }, { 0x0ECC, 0x0ECC, 0x0ECC }, { 0x0ECD, 0x0ECD, 0x0ECD }, { 0x0EDC, 0x0EDC, 0x0EDC }, { 0x0EDD, 0x0EDD, 0x0EDD }, { 0x0F00, 0x0F00, 0x0F00 }, { 0x0F18, 0x0F18, 0x0F18 }, { 0x0F19, 0x0F19, 0x0F19 }, { 0x0F35, 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39, 0x0F39 }, { 0x0F40, 0x0F40, 0x0F40 }, { 0x0F41, 0x0F41, 0x0F41 }, { 0x0F42, 0x0F42, 0x0F42 }, { 0x0F43, 0x0F43, 0x0F43 }, { 0x0F44, 0x0F44, 0x0F44 }, { 0x0F45, 0x0F45, 0x0F45 }, { 0x0F46, 0x0F46, 0x0F46 }, { 0x0F47, 0x0F47, 0x0F47 }, { 0x0F49, 0x0F49, 0x0F49 }, { 0x0F4A, 0x0F4A, 0x0F4A }, { 0x0F4B, 0x0F4B, 0x0F4B }, { 0x0F4C, 0x0F4C, 0x0F4C }, { 0x0F4D, 0x0F4D, 0x0F4D }, { 0x0F4E, 0x0F4E, 0x0F4E }, { 0x0F4F, 0x0F4F, 0x0F4F }, { 0x0F50, 0x0F50, 0x0F50 }, { 0x0F51, 0x0F51, 0x0F51 }, { 0x0F52, 0x0F52, 0x0F52 }, { 0x0F53, 0x0F53, 0x0F53 }, { 0x0F54, 0x0F54, 0x0F54 }, { 0x0F55, 0x0F55, 0x0F55 }, { 0x0F56, 0x0F56, 0x0F56 }, { 0x0F57, 0x0F57, 0x0F57 }, { 0x0F58, 0x0F58, 0x0F58 }, { 0x0F59, 0x0F59, 0x0F59 }, { 0x0F5A, 0x0F5A, 0x0F5A }, { 0x0F5B, 0x0F5B, 0x0F5B }, { 0x0F5C, 0x0F5C, 0x0F5C }, { 0x0F5D, 0x0F5D, 0x0F5D }, { 0x0F5E, 0x0F5E, 0x0F5E }, { 0x0F5F, 0x0F5F, 0x0F5F }, { 0x0F60, 0x0F60, 0x0F60 }, { 0x0F61, 0x0F61, 0x0F61 }, { 0x0F62, 0x0F62, 0x0F62 }, { 0x0F63, 0x0F63, 0x0F63 }, { 0x0F64, 0x0F64, 0x0F64 }, { 0x0F65, 0x0F65, 0x0F65 }, { 0x0F66, 0x0F66, 0x0F66 }, { 0x0F67, 0x0F67, 0x0F67 }, { 0x0F68, 0x0F68, 0x0F68 }, { 0x0F69, 0x0F69, 0x0F69 }, { 0x0F6A, 0x0F6A, 0x0F6A }, { 0x0F71, 0x0F71, 0x0F71 }, { 0x0F72, 0x0F72, 0x0F72 }, { 0x0F73, 0x0F73, 0x0F73 }, { 0x0F74, 0x0F74, 0x0F74 }, { 0x0F75, 0x0F75, 0x0F75 }, { 0x0F76, 0x0F76, 0x0F76 }, { 0x0F77, 0x0F77, 0x0F77 }, { 0x0F78, 0x0F78, 0x0F78 }, { 0x0F79, 0x0F79, 0x0F79 }, { 0x0F7A, 0x0F7A, 0x0F7A }, { 0x0F7B, 0x0F7B, 0x0F7B }, { 0x0F7C, 0x0F7C, 0x0F7C }, { 0x0F7D, 0x0F7D, 0x0F7D }, { 0x0F7E, 0x0F7E, 0x0F7E }, { 0x0F80, 0x0F80, 0x0F80 }, { 0x0F81, 0x0F81, 0x0F81 }, { 0x0F82, 0x0F82, 0x0F82 }, { 0x0F83, 0x0F83, 0x0F83 }, { 0x0F84, 0x0F84, 0x0F84 }, { 0x0F86, 0x0F86, 0x0F86 }, { 0x0F87, 0x0F87, 0x0F87 }, { 0x0F88, 0x0F88, 0x0F88 }, { 0x0F89, 0x0F89, 0x0F89 }, { 0x0F8A, 0x0F8A, 0x0F8A }, { 0x0F8B, 0x0F8B, 0x0F8B }, { 0x0F90, 0x0F90, 0x0F90 }, { 0x0F91, 0x0F91, 0x0F91 }, { 0x0F92, 0x0F92, 0x0F92 }, { 0x0F93, 0x0F93, 0x0F93 }, { 0x0F94, 0x0F94, 0x0F94 }, { 0x0F95, 0x0F95, 0x0F95 }, { 0x0F96, 0x0F96, 0x0F96 }, { 0x0F97, 0x0F97, 0x0F97 }, { 0x0F99, 0x0F99, 0x0F99 }, { 0x0F9A, 0x0F9A, 0x0F9A }, { 0x0F9B, 0x0F9B, 0x0F9B }, { 0x0F9C, 0x0F9C, 0x0F9C }, { 0x0F9D, 0x0F9D, 0x0F9D }, { 0x0F9E, 0x0F9E, 0x0F9E }, { 0x0F9F, 0x0F9F, 0x0F9F }, { 0x0FA0, 0x0FA0, 0x0FA0 }, { 0x0FA1, 0x0FA1, 0x0FA1 }, { 0x0FA2, 0x0FA2, 0x0FA2 }, { 0x0FA3, 0x0FA3, 0x0FA3 }, { 0x0FA4, 0x0FA4, 0x0FA4 }, { 0x0FA5, 0x0FA5, 0x0FA5 }, { 0x0FA6, 0x0FA6, 0x0FA6 }, { 0x0FA7, 0x0FA7, 0x0FA7 }, { 0x0FA8, 0x0FA8, 0x0FA8 }, { 0x0FA9, 0x0FA9, 0x0FA9 }, { 0x0FAA, 0x0FAA, 0x0FAA }, { 0x0FAB, 0x0FAB, 0x0FAB }, { 0x0FAC, 0x0FAC, 0x0FAC }, { 0x0FAD, 0x0FAD, 0x0FAD }, { 0x0FAE, 0x0FAE, 0x0FAE }, { 0x0FAF, 0x0FAF, 0x0FAF }, { 0x0FB0, 0x0FB0, 0x0FB0 }, { 0x0FB1, 0x0FB1, 0x0FB1 }, { 0x0FB2, 0x0FB2, 0x0FB2 }, { 0x0FB3, 0x0FB3, 0x0FB3 }, { 0x0FB4, 0x0FB4, 0x0FB4 }, { 0x0FB5, 0x0FB5, 0x0FB5 }, { 0x0FB6, 0x0FB6, 0x0FB6 }, { 0x0FB7, 0x0FB7, 0x0FB7 }, { 0x0FB8, 0x0FB8, 0x0FB8 }, { 0x0FB9, 0x0FB9, 0x0FB9 }, { 0x0FBA, 0x0FBA, 0x0FBA }, { 0x0FBB, 0x0FBB, 0x0FBB }, { 0x0FBC, 0x0FBC, 0x0FBC }, { 0x0FC6, 0x0FC6, 0x0FC6 }, { 0x1000, 0x1000, 0x1000 }, { 0x1001, 0x1001, 0x1001 }, { 0x1002, 0x1002, 0x1002 }, { 0x1003, 0x1003, 0x1003 }, { 0x1004, 0x1004, 0x1004 }, { 0x1005, 0x1005, 0x1005 }, { 0x1006, 0x1006, 0x1006 }, { 0x1007, 0x1007, 0x1007 }, { 0x1008, 0x1008, 0x1008 }, { 0x1009, 0x1009, 0x1009 }, { 0x100A, 0x100A, 0x100A }, { 0x100B, 0x100B, 0x100B }, { 0x100C, 0x100C, 0x100C }, { 0x100D, 0x100D, 0x100D }, { 0x100E, 0x100E, 0x100E }, { 0x100F, 0x100F, 0x100F }, { 0x1010, 0x1010, 0x1010 }, { 0x1011, 0x1011, 0x1011 }, { 0x1012, 0x1012, 0x1012 }, { 0x1013, 0x1013, 0x1013 }, { 0x1014, 0x1014, 0x1014 }, { 0x1015, 0x1015, 0x1015 }, { 0x1016, 0x1016, 0x1016 }, { 0x1017, 0x1017, 0x1017 }, { 0x1018, 0x1018, 0x1018 }, { 0x1019, 0x1019, 0x1019 }, { 0x101A, 0x101A, 0x101A }, { 0x101B, 0x101B, 0x101B }, { 0x101C, 0x101C, 0x101C }, { 0x101D, 0x101D, 0x101D }, { 0x101E, 0x101E, 0x101E }, { 0x101F, 0x101F, 0x101F }, { 0x1020, 0x1020, 0x1020 }, { 0x1021, 0x1021, 0x1021 }, { 0x1023, 0x1023, 0x1023 }, { 0x1024, 0x1024, 0x1024 }, { 0x1025, 0x1025, 0x1025 }, { 0x1026, 0x1026, 0x1026 }, { 0x1027, 0x1027, 0x1027 }, { 0x1029, 0x1029, 0x1029 }, { 0x102A, 0x102A, 0x102A }, { 0x102D, 0x102D, 0x102D }, { 0x102E, 0x102E, 0x102E }, { 0x102F, 0x102F, 0x102F }, { 0x1030, 0x1030, 0x1030 }, { 0x1032, 0x1032, 0x1032 }, { 0x1036, 0x1036, 0x1036 }, { 0x1037, 0x1037, 0x1037 }, { 0x1039, 0x1039, 0x1039 }, { 0x1050, 0x1050, 0x1050 }, { 0x1051, 0x1051, 0x1051 }, { 0x1052, 0x1052, 0x1052 }, { 0x1053, 0x1053, 0x1053 }, { 0x1054, 0x1054, 0x1054 }, { 0x1055, 0x1055, 0x1055 }, { 0x1058, 0x1058, 0x1058 }, { 0x1059, 0x1059, 0x1059 }, { 0x10A0, 0x10A0, 0x2D00 }, { 0x10A1, 0x10A1, 0x2D01 }, { 0x10A2, 0x10A2, 0x2D02 }, { 0x10A3, 0x10A3, 0x2D03 }, { 0x10A4, 0x10A4, 0x2D04 }, { 0x10A5, 0x10A5, 0x2D05 }, { 0x10A6, 0x10A6, 0x2D06 }, { 0x10A7, 0x10A7, 0x2D07 }, { 0x10A8, 0x10A8, 0x2D08 }, { 0x10A9, 0x10A9, 0x2D09 }, { 0x10AA, 0x10AA, 0x2D0A }, { 0x10AB, 0x10AB, 0x2D0B }, { 0x10AC, 0x10AC, 0x2D0C }, { 0x10AD, 0x10AD, 0x2D0D }, { 0x10AE, 0x10AE, 0x2D0E }, { 0x10AF, 0x10AF, 0x2D0F }, { 0x10B0, 0x10B0, 0x2D10 }, { 0x10B1, 0x10B1, 0x2D11 }, { 0x10B2, 0x10B2, 0x2D12 }, { 0x10B3, 0x10B3, 0x2D13 }, { 0x10B4, 0x10B4, 0x2D14 }, { 0x10B5, 0x10B5, 0x2D15 }, { 0x10B6, 0x10B6, 0x2D16 }, { 0x10B7, 0x10B7, 0x2D17 }, { 0x10B8, 0x10B8, 0x2D18 }, { 0x10B9, 0x10B9, 0x2D19 }, { 0x10BA, 0x10BA, 0x2D1A }, { 0x10BB, 0x10BB, 0x2D1B }, { 0x10BC, 0x10BC, 0x2D1C }, { 0x10BD, 0x10BD, 0x2D1D }, { 0x10BE, 0x10BE, 0x2D1E }, { 0x10BF, 0x10BF, 0x2D1F }, { 0x10C0, 0x10C0, 0x2D20 }, { 0x10C1, 0x10C1, 0x2D21 }, { 0x10C2, 0x10C2, 0x2D22 }, { 0x10C3, 0x10C3, 0x2D23 }, { 0x10C4, 0x10C4, 0x2D24 }, { 0x10C5, 0x10C5, 0x2D25 }, { 0x10D0, 0x10D0, 0x10D0 }, { 0x10D1, 0x10D1, 0x10D1 }, { 0x10D2, 0x10D2, 0x10D2 }, { 0x10D3, 0x10D3, 0x10D3 }, { 0x10D4, 0x10D4, 0x10D4 }, { 0x10D5, 0x10D5, 0x10D5 }, { 0x10D6, 0x10D6, 0x10D6 }, { 0x10D7, 0x10D7, 0x10D7 }, { 0x10D8, 0x10D8, 0x10D8 }, { 0x10D9, 0x10D9, 0x10D9 }, { 0x10DA, 0x10DA, 0x10DA }, { 0x10DB, 0x10DB, 0x10DB }, { 0x10DC, 0x10DC, 0x10DC }, { 0x10DD, 0x10DD, 0x10DD }, { 0x10DE, 0x10DE, 0x10DE }, { 0x10DF, 0x10DF, 0x10DF }, { 0x10E0, 0x10E0, 0x10E0 }, { 0x10E1, 0x10E1, 0x10E1 }, { 0x10E2, 0x10E2, 0x10E2 }, { 0x10E3, 0x10E3, 0x10E3 }, { 0x10E4, 0x10E4, 0x10E4 }, { 0x10E5, 0x10E5, 0x10E5 }, { 0x10E6, 0x10E6, 0x10E6 }, { 0x10E7, 0x10E7, 0x10E7 }, { 0x10E8, 0x10E8, 0x10E8 }, { 0x10E9, 0x10E9, 0x10E9 }, { 0x10EA, 0x10EA, 0x10EA }, { 0x10EB, 0x10EB, 0x10EB }, { 0x10EC, 0x10EC, 0x10EC }, { 0x10ED, 0x10ED, 0x10ED }, { 0x10EE, 0x10EE, 0x10EE }, { 0x10EF, 0x10EF, 0x10EF }, { 0x10F0, 0x10F0, 0x10F0 }, { 0x10F1, 0x10F1, 0x10F1 }, { 0x10F2, 0x10F2, 0x10F2 }, { 0x10F3, 0x10F3, 0x10F3 }, { 0x10F4, 0x10F4, 0x10F4 }, { 0x10F5, 0x10F5, 0x10F5 }, { 0x10F6, 0x10F6, 0x10F6 }, { 0x10F7, 0x10F7, 0x10F7 }, { 0x10F8, 0x10F8, 0x10F8 }, { 0x10F9, 0x10F9, 0x10F9 }, { 0x10FA, 0x10FA, 0x10FA }, { 0x10FC, 0x10FC, 0x10FC }, { 0x1100, 0x1100, 0x1100 }, { 0x1101, 0x1101, 0x1101 }, { 0x1102, 0x1102, 0x1102 }, { 0x1103, 0x1103, 0x1103 }, { 0x1104, 0x1104, 0x1104 }, { 0x1105, 0x1105, 0x1105 }, { 0x1106, 0x1106, 0x1106 }, { 0x1107, 0x1107, 0x1107 }, { 0x1108, 0x1108, 0x1108 }, { 0x1109, 0x1109, 0x1109 }, { 0x110A, 0x110A, 0x110A }, { 0x110B, 0x110B, 0x110B }, { 0x110C, 0x110C, 0x110C }, { 0x110D, 0x110D, 0x110D }, { 0x110E, 0x110E, 0x110E }, { 0x110F, 0x110F, 0x110F }, { 0x1110, 0x1110, 0x1110 }, { 0x1111, 0x1111, 0x1111 }, { 0x1112, 0x1112, 0x1112 }, { 0x1113, 0x1113, 0x1113 }, { 0x1114, 0x1114, 0x1114 }, { 0x1115, 0x1115, 0x1115 }, { 0x1116, 0x1116, 0x1116 }, { 0x1117, 0x1117, 0x1117 }, { 0x1118, 0x1118, 0x1118 }, { 0x1119, 0x1119, 0x1119 }, { 0x111A, 0x111A, 0x111A }, { 0x111B, 0x111B, 0x111B }, { 0x111C, 0x111C, 0x111C }, { 0x111D, 0x111D, 0x111D }, { 0x111E, 0x111E, 0x111E }, { 0x111F, 0x111F, 0x111F }, { 0x1120, 0x1120, 0x1120 }, { 0x1121, 0x1121, 0x1121 }, { 0x1122, 0x1122, 0x1122 }, { 0x1123, 0x1123, 0x1123 }, { 0x1124, 0x1124, 0x1124 }, { 0x1125, 0x1125, 0x1125 }, { 0x1126, 0x1126, 0x1126 }, { 0x1127, 0x1127, 0x1127 }, { 0x1128, 0x1128, 0x1128 }, { 0x1129, 0x1129, 0x1129 }, { 0x112A, 0x112A, 0x112A }, { 0x112B, 0x112B, 0x112B }, { 0x112C, 0x112C, 0x112C }, { 0x112D, 0x112D, 0x112D }, { 0x112E, 0x112E, 0x112E }, { 0x112F, 0x112F, 0x112F }, { 0x1130, 0x1130, 0x1130 }, { 0x1131, 0x1131, 0x1131 }, { 0x1132, 0x1132, 0x1132 }, { 0x1133, 0x1133, 0x1133 }, { 0x1134, 0x1134, 0x1134 }, { 0x1135, 0x1135, 0x1135 }, { 0x1136, 0x1136, 0x1136 }, { 0x1137, 0x1137, 0x1137 }, { 0x1138, 0x1138, 0x1138 }, { 0x1139, 0x1139, 0x1139 }, { 0x113A, 0x113A, 0x113A }, { 0x113B, 0x113B, 0x113B }, { 0x113C, 0x113C, 0x113C }, { 0x113D, 0x113D, 0x113D }, { 0x113E, 0x113E, 0x113E }, { 0x113F, 0x113F, 0x113F }, { 0x1140, 0x1140, 0x1140 }, { 0x1141, 0x1141, 0x1141 }, { 0x1142, 0x1142, 0x1142 }, { 0x1143, 0x1143, 0x1143 }, { 0x1144, 0x1144, 0x1144 }, { 0x1145, 0x1145, 0x1145 }, { 0x1146, 0x1146, 0x1146 }, { 0x1147, 0x1147, 0x1147 }, { 0x1148, 0x1148, 0x1148 }, { 0x1149, 0x1149, 0x1149 }, { 0x114A, 0x114A, 0x114A }, { 0x114B, 0x114B, 0x114B }, { 0x114C, 0x114C, 0x114C }, { 0x114D, 0x114D, 0x114D }, { 0x114E, 0x114E, 0x114E }, { 0x114F, 0x114F, 0x114F }, { 0x1150, 0x1150, 0x1150 }, { 0x1151, 0x1151, 0x1151 }, { 0x1152, 0x1152, 0x1152 }, { 0x1153, 0x1153, 0x1153 }, { 0x1154, 0x1154, 0x1154 }, { 0x1155, 0x1155, 0x1155 }, { 0x1156, 0x1156, 0x1156 }, { 0x1157, 0x1157, 0x1157 }, { 0x1158, 0x1158, 0x1158 }, { 0x1159, 0x1159, 0x1159 }, { 0x115F, 0x115F, 0x115F }, { 0x1160, 0x1160, 0x1160 }, { 0x1161, 0x1161, 0x1161 }, { 0x1162, 0x1162, 0x1162 }, { 0x1163, 0x1163, 0x1163 }, { 0x1164, 0x1164, 0x1164 }, { 0x1165, 0x1165, 0x1165 }, { 0x1166, 0x1166, 0x1166 }, { 0x1167, 0x1167, 0x1167 }, { 0x1168, 0x1168, 0x1168 }, { 0x1169, 0x1169, 0x1169 }, { 0x116A, 0x116A, 0x116A }, { 0x116B, 0x116B, 0x116B }, { 0x116C, 0x116C, 0x116C }, { 0x116D, 0x116D, 0x116D }, { 0x116E, 0x116E, 0x116E }, { 0x116F, 0x116F, 0x116F }, { 0x1170, 0x1170, 0x1170 }, { 0x1171, 0x1171, 0x1171 }, { 0x1172, 0x1172, 0x1172 }, { 0x1173, 0x1173, 0x1173 }, { 0x1174, 0x1174, 0x1174 }, { 0x1175, 0x1175, 0x1175 }, { 0x1176, 0x1176, 0x1176 }, { 0x1177, 0x1177, 0x1177 }, { 0x1178, 0x1178, 0x1178 }, { 0x1179, 0x1179, 0x1179 }, { 0x117A, 0x117A, 0x117A }, { 0x117B, 0x117B, 0x117B }, { 0x117C, 0x117C, 0x117C }, { 0x117D, 0x117D, 0x117D }, { 0x117E, 0x117E, 0x117E }, { 0x117F, 0x117F, 0x117F }, { 0x1180, 0x1180, 0x1180 }, { 0x1181, 0x1181, 0x1181 }, { 0x1182, 0x1182, 0x1182 }, { 0x1183, 0x1183, 0x1183 }, { 0x1184, 0x1184, 0x1184 }, { 0x1185, 0x1185, 0x1185 }, { 0x1186, 0x1186, 0x1186 }, { 0x1187, 0x1187, 0x1187 }, { 0x1188, 0x1188, 0x1188 }, { 0x1189, 0x1189, 0x1189 }, { 0x118A, 0x118A, 0x118A }, { 0x118B, 0x118B, 0x118B }, { 0x118C, 0x118C, 0x118C }, { 0x118D, 0x118D, 0x118D }, { 0x118E, 0x118E, 0x118E }, { 0x118F, 0x118F, 0x118F }, { 0x1190, 0x1190, 0x1190 }, { 0x1191, 0x1191, 0x1191 }, { 0x1192, 0x1192, 0x1192 }, { 0x1193, 0x1193, 0x1193 }, { 0x1194, 0x1194, 0x1194 }, { 0x1195, 0x1195, 0x1195 }, { 0x1196, 0x1196, 0x1196 }, { 0x1197, 0x1197, 0x1197 }, { 0x1198, 0x1198, 0x1198 }, { 0x1199, 0x1199, 0x1199 }, { 0x119A, 0x119A, 0x119A }, { 0x119B, 0x119B, 0x119B }, { 0x119C, 0x119C, 0x119C }, { 0x119D, 0x119D, 0x119D }, { 0x119E, 0x119E, 0x119E }, { 0x119F, 0x119F, 0x119F }, { 0x11A0, 0x11A0, 0x11A0 }, { 0x11A1, 0x11A1, 0x11A1 }, { 0x11A2, 0x11A2, 0x11A2 }, { 0x11A8, 0x11A8, 0x11A8 }, { 0x11A9, 0x11A9, 0x11A9 }, { 0x11AA, 0x11AA, 0x11AA }, { 0x11AB, 0x11AB, 0x11AB }, { 0x11AC, 0x11AC, 0x11AC }, { 0x11AD, 0x11AD, 0x11AD }, { 0x11AE, 0x11AE, 0x11AE }, { 0x11AF, 0x11AF, 0x11AF }, { 0x11B0, 0x11B0, 0x11B0 }, { 0x11B1, 0x11B1, 0x11B1 }, { 0x11B2, 0x11B2, 0x11B2 }, { 0x11B3, 0x11B3, 0x11B3 }, { 0x11B4, 0x11B4, 0x11B4 }, { 0x11B5, 0x11B5, 0x11B5 }, { 0x11B6, 0x11B6, 0x11B6 }, { 0x11B7, 0x11B7, 0x11B7 }, { 0x11B8, 0x11B8, 0x11B8 }, { 0x11B9, 0x11B9, 0x11B9 }, { 0x11BA, 0x11BA, 0x11BA }, { 0x11BB, 0x11BB, 0x11BB }, { 0x11BC, 0x11BC, 0x11BC }, { 0x11BD, 0x11BD, 0x11BD }, { 0x11BE, 0x11BE, 0x11BE }, { 0x11BF, 0x11BF, 0x11BF }, { 0x11C0, 0x11C0, 0x11C0 }, { 0x11C1, 0x11C1, 0x11C1 }, { 0x11C2, 0x11C2, 0x11C2 }, { 0x11C3, 0x11C3, 0x11C3 }, { 0x11C4, 0x11C4, 0x11C4 }, { 0x11C5, 0x11C5, 0x11C5 }, { 0x11C6, 0x11C6, 0x11C6 }, { 0x11C7, 0x11C7, 0x11C7 }, { 0x11C8, 0x11C8, 0x11C8 }, { 0x11C9, 0x11C9, 0x11C9 }, { 0x11CA, 0x11CA, 0x11CA }, { 0x11CB, 0x11CB, 0x11CB }, { 0x11CC, 0x11CC, 0x11CC }, { 0x11CD, 0x11CD, 0x11CD }, { 0x11CE, 0x11CE, 0x11CE }, { 0x11CF, 0x11CF, 0x11CF }, { 0x11D0, 0x11D0, 0x11D0 }, { 0x11D1, 0x11D1, 0x11D1 }, { 0x11D2, 0x11D2, 0x11D2 }, { 0x11D3, 0x11D3, 0x11D3 }, { 0x11D4, 0x11D4, 0x11D4 }, { 0x11D5, 0x11D5, 0x11D5 }, { 0x11D6, 0x11D6, 0x11D6 }, { 0x11D7, 0x11D7, 0x11D7 }, { 0x11D8, 0x11D8, 0x11D8 }, { 0x11D9, 0x11D9, 0x11D9 }, { 0x11DA, 0x11DA, 0x11DA }, { 0x11DB, 0x11DB, 0x11DB }, { 0x11DC, 0x11DC, 0x11DC }, { 0x11DD, 0x11DD, 0x11DD }, { 0x11DE, 0x11DE, 0x11DE }, { 0x11DF, 0x11DF, 0x11DF }, { 0x11E0, 0x11E0, 0x11E0 }, { 0x11E1, 0x11E1, 0x11E1 }, { 0x11E2, 0x11E2, 0x11E2 }, { 0x11E3, 0x11E3, 0x11E3 }, { 0x11E4, 0x11E4, 0x11E4 }, { 0x11E5, 0x11E5, 0x11E5 }, { 0x11E6, 0x11E6, 0x11E6 }, { 0x11E7, 0x11E7, 0x11E7 }, { 0x11E8, 0x11E8, 0x11E8 }, { 0x11E9, 0x11E9, 0x11E9 }, { 0x11EA, 0x11EA, 0x11EA }, { 0x11EB, 0x11EB, 0x11EB }, { 0x11EC, 0x11EC, 0x11EC }, { 0x11ED, 0x11ED, 0x11ED }, { 0x11EE, 0x11EE, 0x11EE }, { 0x11EF, 0x11EF, 0x11EF }, { 0x11F0, 0x11F0, 0x11F0 }, { 0x11F1, 0x11F1, 0x11F1 }, { 0x11F2, 0x11F2, 0x11F2 }, { 0x11F3, 0x11F3, 0x11F3 }, { 0x11F4, 0x11F4, 0x11F4 }, { 0x11F5, 0x11F5, 0x11F5 }, { 0x11F6, 0x11F6, 0x11F6 }, { 0x11F7, 0x11F7, 0x11F7 }, { 0x11F8, 0x11F8, 0x11F8 }, { 0x11F9, 0x11F9, 0x11F9 }, { 0x1200, 0x1200, 0x1200 }, { 0x1201, 0x1201, 0x1201 }, { 0x1202, 0x1202, 0x1202 }, { 0x1203, 0x1203, 0x1203 }, { 0x1204, 0x1204, 0x1204 }, { 0x1205, 0x1205, 0x1205 }, { 0x1206, 0x1206, 0x1206 }, { 0x1207, 0x1207, 0x1207 }, { 0x1208, 0x1208, 0x1208 }, { 0x1209, 0x1209, 0x1209 }, { 0x120A, 0x120A, 0x120A }, { 0x120B, 0x120B, 0x120B }, { 0x120C, 0x120C, 0x120C }, { 0x120D, 0x120D, 0x120D }, { 0x120E, 0x120E, 0x120E }, { 0x120F, 0x120F, 0x120F }, { 0x1210, 0x1210, 0x1210 }, { 0x1211, 0x1211, 0x1211 }, { 0x1212, 0x1212, 0x1212 }, { 0x1213, 0x1213, 0x1213 }, { 0x1214, 0x1214, 0x1214 }, { 0x1215, 0x1215, 0x1215 }, { 0x1216, 0x1216, 0x1216 }, { 0x1217, 0x1217, 0x1217 }, { 0x1218, 0x1218, 0x1218 }, { 0x1219, 0x1219, 0x1219 }, { 0x121A, 0x121A, 0x121A }, { 0x121B, 0x121B, 0x121B }, { 0x121C, 0x121C, 0x121C }, { 0x121D, 0x121D, 0x121D }, { 0x121E, 0x121E, 0x121E }, { 0x121F, 0x121F, 0x121F }, { 0x1220, 0x1220, 0x1220 }, { 0x1221, 0x1221, 0x1221 }, { 0x1222, 0x1222, 0x1222 }, { 0x1223, 0x1223, 0x1223 }, { 0x1224, 0x1224, 0x1224 }, { 0x1225, 0x1225, 0x1225 }, { 0x1226, 0x1226, 0x1226 }, { 0x1227, 0x1227, 0x1227 }, { 0x1228, 0x1228, 0x1228 }, { 0x1229, 0x1229, 0x1229 }, { 0x122A, 0x122A, 0x122A }, { 0x122B, 0x122B, 0x122B }, { 0x122C, 0x122C, 0x122C }, { 0x122D, 0x122D, 0x122D }, { 0x122E, 0x122E, 0x122E }, { 0x122F, 0x122F, 0x122F }, { 0x1230, 0x1230, 0x1230 }, { 0x1231, 0x1231, 0x1231 }, { 0x1232, 0x1232, 0x1232 }, { 0x1233, 0x1233, 0x1233 }, { 0x1234, 0x1234, 0x1234 }, { 0x1235, 0x1235, 0x1235 }, { 0x1236, 0x1236, 0x1236 }, { 0x1237, 0x1237, 0x1237 }, { 0x1238, 0x1238, 0x1238 }, { 0x1239, 0x1239, 0x1239 }, { 0x123A, 0x123A, 0x123A }, { 0x123B, 0x123B, 0x123B }, { 0x123C, 0x123C, 0x123C }, { 0x123D, 0x123D, 0x123D }, { 0x123E, 0x123E, 0x123E }, { 0x123F, 0x123F, 0x123F }, { 0x1240, 0x1240, 0x1240 }, { 0x1241, 0x1241, 0x1241 }, { 0x1242, 0x1242, 0x1242 }, { 0x1243, 0x1243, 0x1243 }, { 0x1244, 0x1244, 0x1244 }, { 0x1245, 0x1245, 0x1245 }, { 0x1246, 0x1246, 0x1246 }, { 0x1247, 0x1247, 0x1247 }, { 0x1248, 0x1248, 0x1248 }, { 0x124A, 0x124A, 0x124A }, { 0x124B, 0x124B, 0x124B }, { 0x124C, 0x124C, 0x124C }, { 0x124D, 0x124D, 0x124D }, { 0x1250, 0x1250, 0x1250 }, { 0x1251, 0x1251, 0x1251 }, { 0x1252, 0x1252, 0x1252 }, { 0x1253, 0x1253, 0x1253 }, { 0x1254, 0x1254, 0x1254 }, { 0x1255, 0x1255, 0x1255 }, { 0x1256, 0x1256, 0x1256 }, { 0x1258, 0x1258, 0x1258 }, { 0x125A, 0x125A, 0x125A }, { 0x125B, 0x125B, 0x125B }, { 0x125C, 0x125C, 0x125C }, { 0x125D, 0x125D, 0x125D }, { 0x1260, 0x1260, 0x1260 }, { 0x1261, 0x1261, 0x1261 }, { 0x1262, 0x1262, 0x1262 }, { 0x1263, 0x1263, 0x1263 }, { 0x1264, 0x1264, 0x1264 }, { 0x1265, 0x1265, 0x1265 }, { 0x1266, 0x1266, 0x1266 }, { 0x1267, 0x1267, 0x1267 }, { 0x1268, 0x1268, 0x1268 }, { 0x1269, 0x1269, 0x1269 }, { 0x126A, 0x126A, 0x126A }, { 0x126B, 0x126B, 0x126B }, { 0x126C, 0x126C, 0x126C }, { 0x126D, 0x126D, 0x126D }, { 0x126E, 0x126E, 0x126E }, { 0x126F, 0x126F, 0x126F }, { 0x1270, 0x1270, 0x1270 }, { 0x1271, 0x1271, 0x1271 }, { 0x1272, 0x1272, 0x1272 }, { 0x1273, 0x1273, 0x1273 }, { 0x1274, 0x1274, 0x1274 }, { 0x1275, 0x1275, 0x1275 }, { 0x1276, 0x1276, 0x1276 }, { 0x1277, 0x1277, 0x1277 }, { 0x1278, 0x1278, 0x1278 }, { 0x1279, 0x1279, 0x1279 }, { 0x127A, 0x127A, 0x127A }, { 0x127B, 0x127B, 0x127B }, { 0x127C, 0x127C, 0x127C }, { 0x127D, 0x127D, 0x127D }, { 0x127E, 0x127E, 0x127E }, { 0x127F, 0x127F, 0x127F }, { 0x1280, 0x1280, 0x1280 }, { 0x1281, 0x1281, 0x1281 }, { 0x1282, 0x1282, 0x1282 }, { 0x1283, 0x1283, 0x1283 }, { 0x1284, 0x1284, 0x1284 }, { 0x1285, 0x1285, 0x1285 }, { 0x1286, 0x1286, 0x1286 }, { 0x1287, 0x1287, 0x1287 }, { 0x1288, 0x1288, 0x1288 }, { 0x128A, 0x128A, 0x128A }, { 0x128B, 0x128B, 0x128B }, { 0x128C, 0x128C, 0x128C }, { 0x128D, 0x128D, 0x128D }, { 0x1290, 0x1290, 0x1290 }, { 0x1291, 0x1291, 0x1291 }, { 0x1292, 0x1292, 0x1292 }, { 0x1293, 0x1293, 0x1293 }, { 0x1294, 0x1294, 0x1294 }, { 0x1295, 0x1295, 0x1295 }, { 0x1296, 0x1296, 0x1296 }, { 0x1297, 0x1297, 0x1297 }, { 0x1298, 0x1298, 0x1298 }, { 0x1299, 0x1299, 0x1299 }, { 0x129A, 0x129A, 0x129A }, { 0x129B, 0x129B, 0x129B }, { 0x129C, 0x129C, 0x129C }, { 0x129D, 0x129D, 0x129D }, { 0x129E, 0x129E, 0x129E }, { 0x129F, 0x129F, 0x129F }, { 0x12A0, 0x12A0, 0x12A0 }, { 0x12A1, 0x12A1, 0x12A1 }, { 0x12A2, 0x12A2, 0x12A2 }, { 0x12A3, 0x12A3, 0x12A3 }, { 0x12A4, 0x12A4, 0x12A4 }, { 0x12A5, 0x12A5, 0x12A5 }, { 0x12A6, 0x12A6, 0x12A6 }, { 0x12A7, 0x12A7, 0x12A7 }, { 0x12A8, 0x12A8, 0x12A8 }, { 0x12A9, 0x12A9, 0x12A9 }, { 0x12AA, 0x12AA, 0x12AA }, { 0x12AB, 0x12AB, 0x12AB }, { 0x12AC, 0x12AC, 0x12AC }, { 0x12AD, 0x12AD, 0x12AD }, { 0x12AE, 0x12AE, 0x12AE }, { 0x12AF, 0x12AF, 0x12AF }, { 0x12B0, 0x12B0, 0x12B0 }, { 0x12B2, 0x12B2, 0x12B2 }, { 0x12B3, 0x12B3, 0x12B3 }, { 0x12B4, 0x12B4, 0x12B4 }, { 0x12B5, 0x12B5, 0x12B5 }, { 0x12B8, 0x12B8, 0x12B8 }, { 0x12B9, 0x12B9, 0x12B9 }, { 0x12BA, 0x12BA, 0x12BA }, { 0x12BB, 0x12BB, 0x12BB }, { 0x12BC, 0x12BC, 0x12BC }, { 0x12BD, 0x12BD, 0x12BD }, { 0x12BE, 0x12BE, 0x12BE }, { 0x12C0, 0x12C0, 0x12C0 }, { 0x12C2, 0x12C2, 0x12C2 }, { 0x12C3, 0x12C3, 0x12C3 }, { 0x12C4, 0x12C4, 0x12C4 }, { 0x12C5, 0x12C5, 0x12C5 }, { 0x12C8, 0x12C8, 0x12C8 }, { 0x12C9, 0x12C9, 0x12C9 }, { 0x12CA, 0x12CA, 0x12CA }, { 0x12CB, 0x12CB, 0x12CB }, { 0x12CC, 0x12CC, 0x12CC }, { 0x12CD, 0x12CD, 0x12CD }, { 0x12CE, 0x12CE, 0x12CE }, { 0x12CF, 0x12CF, 0x12CF }, { 0x12D0, 0x12D0, 0x12D0 }, { 0x12D1, 0x12D1, 0x12D1 }, { 0x12D2, 0x12D2, 0x12D2 }, { 0x12D3, 0x12D3, 0x12D3 }, { 0x12D4, 0x12D4, 0x12D4 }, { 0x12D5, 0x12D5, 0x12D5 }, { 0x12D6, 0x12D6, 0x12D6 }, { 0x12D8, 0x12D8, 0x12D8 }, { 0x12D9, 0x12D9, 0x12D9 }, { 0x12DA, 0x12DA, 0x12DA }, { 0x12DB, 0x12DB, 0x12DB }, { 0x12DC, 0x12DC, 0x12DC }, { 0x12DD, 0x12DD, 0x12DD }, { 0x12DE, 0x12DE, 0x12DE }, { 0x12DF, 0x12DF, 0x12DF }, { 0x12E0, 0x12E0, 0x12E0 }, { 0x12E1, 0x12E1, 0x12E1 }, { 0x12E2, 0x12E2, 0x12E2 }, { 0x12E3, 0x12E3, 0x12E3 }, { 0x12E4, 0x12E4, 0x12E4 }, { 0x12E5, 0x12E5, 0x12E5 }, { 0x12E6, 0x12E6, 0x12E6 }, { 0x12E7, 0x12E7, 0x12E7 }, { 0x12E8, 0x12E8, 0x12E8 }, { 0x12E9, 0x12E9, 0x12E9 }, { 0x12EA, 0x12EA, 0x12EA }, { 0x12EB, 0x12EB, 0x12EB }, { 0x12EC, 0x12EC, 0x12EC }, { 0x12ED, 0x12ED, 0x12ED }, { 0x12EE, 0x12EE, 0x12EE }, { 0x12EF, 0x12EF, 0x12EF }, { 0x12F0, 0x12F0, 0x12F0 }, { 0x12F1, 0x12F1, 0x12F1 }, { 0x12F2, 0x12F2, 0x12F2 }, { 0x12F3, 0x12F3, 0x12F3 }, { 0x12F4, 0x12F4, 0x12F4 }, { 0x12F5, 0x12F5, 0x12F5 }, { 0x12F6, 0x12F6, 0x12F6 }, { 0x12F7, 0x12F7, 0x12F7 }, { 0x12F8, 0x12F8, 0x12F8 }, { 0x12F9, 0x12F9, 0x12F9 }, { 0x12FA, 0x12FA, 0x12FA }, { 0x12FB, 0x12FB, 0x12FB }, { 0x12FC, 0x12FC, 0x12FC }, { 0x12FD, 0x12FD, 0x12FD }, { 0x12FE, 0x12FE, 0x12FE }, { 0x12FF, 0x12FF, 0x12FF }, { 0x1300, 0x1300, 0x1300 }, { 0x1301, 0x1301, 0x1301 }, { 0x1302, 0x1302, 0x1302 }, { 0x1303, 0x1303, 0x1303 }, { 0x1304, 0x1304, 0x1304 }, { 0x1305, 0x1305, 0x1305 }, { 0x1306, 0x1306, 0x1306 }, { 0x1307, 0x1307, 0x1307 }, { 0x1308, 0x1308, 0x1308 }, { 0x1309, 0x1309, 0x1309 }, { 0x130A, 0x130A, 0x130A }, { 0x130B, 0x130B, 0x130B }, { 0x130C, 0x130C, 0x130C }, { 0x130D, 0x130D, 0x130D }, { 0x130E, 0x130E, 0x130E }, { 0x130F, 0x130F, 0x130F }, { 0x1310, 0x1310, 0x1310 }, { 0x1312, 0x1312, 0x1312 }, { 0x1313, 0x1313, 0x1313 }, { 0x1314, 0x1314, 0x1314 }, { 0x1315, 0x1315, 0x1315 }, { 0x1318, 0x1318, 0x1318 }, { 0x1319, 0x1319, 0x1319 }, { 0x131A, 0x131A, 0x131A }, { 0x131B, 0x131B, 0x131B }, { 0x131C, 0x131C, 0x131C }, { 0x131D, 0x131D, 0x131D }, { 0x131E, 0x131E, 0x131E }, { 0x131F, 0x131F, 0x131F }, { 0x1320, 0x1320, 0x1320 }, { 0x1321, 0x1321, 0x1321 }, { 0x1322, 0x1322, 0x1322 }, { 0x1323, 0x1323, 0x1323 }, { 0x1324, 0x1324, 0x1324 }, { 0x1325, 0x1325, 0x1325 }, { 0x1326, 0x1326, 0x1326 }, { 0x1327, 0x1327, 0x1327 }, { 0x1328, 0x1328, 0x1328 }, { 0x1329, 0x1329, 0x1329 }, { 0x132A, 0x132A, 0x132A }, { 0x132B, 0x132B, 0x132B }, { 0x132C, 0x132C, 0x132C }, { 0x132D, 0x132D, 0x132D }, { 0x132E, 0x132E, 0x132E }, { 0x132F, 0x132F, 0x132F }, { 0x1330, 0x1330, 0x1330 }, { 0x1331, 0x1331, 0x1331 }, { 0x1332, 0x1332, 0x1332 }, { 0x1333, 0x1333, 0x1333 }, { 0x1334, 0x1334, 0x1334 }, { 0x1335, 0x1335, 0x1335 }, { 0x1336, 0x1336, 0x1336 }, { 0x1337, 0x1337, 0x1337 }, { 0x1338, 0x1338, 0x1338 }, { 0x1339, 0x1339, 0x1339 }, { 0x133A, 0x133A, 0x133A }, { 0x133B, 0x133B, 0x133B }, { 0x133C, 0x133C, 0x133C }, { 0x133D, 0x133D, 0x133D }, { 0x133E, 0x133E, 0x133E }, { 0x133F, 0x133F, 0x133F }, { 0x1340, 0x1340, 0x1340 }, { 0x1341, 0x1341, 0x1341 }, { 0x1342, 0x1342, 0x1342 }, { 0x1343, 0x1343, 0x1343 }, { 0x1344, 0x1344, 0x1344 }, { 0x1345, 0x1345, 0x1345 }, { 0x1346, 0x1346, 0x1346 }, { 0x1347, 0x1347, 0x1347 }, { 0x1348, 0x1348, 0x1348 }, { 0x1349, 0x1349, 0x1349 }, { 0x134A, 0x134A, 0x134A }, { 0x134B, 0x134B, 0x134B }, { 0x134C, 0x134C, 0x134C }, { 0x134D, 0x134D, 0x134D }, { 0x134E, 0x134E, 0x134E }, { 0x134F, 0x134F, 0x134F }, { 0x1350, 0x1350, 0x1350 }, { 0x1351, 0x1351, 0x1351 }, { 0x1352, 0x1352, 0x1352 }, { 0x1353, 0x1353, 0x1353 }, { 0x1354, 0x1354, 0x1354 }, { 0x1355, 0x1355, 0x1355 }, { 0x1356, 0x1356, 0x1356 }, { 0x1357, 0x1357, 0x1357 }, { 0x1358, 0x1358, 0x1358 }, { 0x1359, 0x1359, 0x1359 }, { 0x135A, 0x135A, 0x135A }, { 0x135F, 0x135F, 0x135F }, { 0x1380, 0x1380, 0x1380 }, { 0x1381, 0x1381, 0x1381 }, { 0x1382, 0x1382, 0x1382 }, { 0x1383, 0x1383, 0x1383 }, { 0x1384, 0x1384, 0x1384 }, { 0x1385, 0x1385, 0x1385 }, { 0x1386, 0x1386, 0x1386 }, { 0x1387, 0x1387, 0x1387 }, { 0x1388, 0x1388, 0x1388 }, { 0x1389, 0x1389, 0x1389 }, { 0x138A, 0x138A, 0x138A }, { 0x138B, 0x138B, 0x138B }, { 0x138C, 0x138C, 0x138C }, { 0x138D, 0x138D, 0x138D }, { 0x138E, 0x138E, 0x138E }, { 0x138F, 0x138F, 0x138F }, { 0x13A0, 0x13A0, 0x13A0 }, { 0x13A1, 0x13A1, 0x13A1 }, { 0x13A2, 0x13A2, 0x13A2 }, { 0x13A3, 0x13A3, 0x13A3 }, { 0x13A4, 0x13A4, 0x13A4 }, { 0x13A5, 0x13A5, 0x13A5 }, { 0x13A6, 0x13A6, 0x13A6 }, { 0x13A7, 0x13A7, 0x13A7 }, { 0x13A8, 0x13A8, 0x13A8 }, { 0x13A9, 0x13A9, 0x13A9 }, { 0x13AA, 0x13AA, 0x13AA }, { 0x13AB, 0x13AB, 0x13AB }, { 0x13AC, 0x13AC, 0x13AC }, { 0x13AD, 0x13AD, 0x13AD }, { 0x13AE, 0x13AE, 0x13AE }, { 0x13AF, 0x13AF, 0x13AF }, { 0x13B0, 0x13B0, 0x13B0 }, { 0x13B1, 0x13B1, 0x13B1 }, { 0x13B2, 0x13B2, 0x13B2 }, { 0x13B3, 0x13B3, 0x13B3 }, { 0x13B4, 0x13B4, 0x13B4 }, { 0x13B5, 0x13B5, 0x13B5 }, { 0x13B6, 0x13B6, 0x13B6 }, { 0x13B7, 0x13B7, 0x13B7 }, { 0x13B8, 0x13B8, 0x13B8 }, { 0x13B9, 0x13B9, 0x13B9 }, { 0x13BA, 0x13BA, 0x13BA }, { 0x13BB, 0x13BB, 0x13BB }, { 0x13BC, 0x13BC, 0x13BC }, { 0x13BD, 0x13BD, 0x13BD }, { 0x13BE, 0x13BE, 0x13BE }, { 0x13BF, 0x13BF, 0x13BF }, { 0x13C0, 0x13C0, 0x13C0 }, { 0x13C1, 0x13C1, 0x13C1 }, { 0x13C2, 0x13C2, 0x13C2 }, { 0x13C3, 0x13C3, 0x13C3 }, { 0x13C4, 0x13C4, 0x13C4 }, { 0x13C5, 0x13C5, 0x13C5 }, { 0x13C6, 0x13C6, 0x13C6 }, { 0x13C7, 0x13C7, 0x13C7 }, { 0x13C8, 0x13C8, 0x13C8 }, { 0x13C9, 0x13C9, 0x13C9 }, { 0x13CA, 0x13CA, 0x13CA }, { 0x13CB, 0x13CB, 0x13CB }, { 0x13CC, 0x13CC, 0x13CC }, { 0x13CD, 0x13CD, 0x13CD }, { 0x13CE, 0x13CE, 0x13CE }, { 0x13CF, 0x13CF, 0x13CF }, { 0x13D0, 0x13D0, 0x13D0 }, { 0x13D1, 0x13D1, 0x13D1 }, { 0x13D2, 0x13D2, 0x13D2 }, { 0x13D3, 0x13D3, 0x13D3 }, { 0x13D4, 0x13D4, 0x13D4 }, { 0x13D5, 0x13D5, 0x13D5 }, { 0x13D6, 0x13D6, 0x13D6 }, { 0x13D7, 0x13D7, 0x13D7 }, { 0x13D8, 0x13D8, 0x13D8 }, { 0x13D9, 0x13D9, 0x13D9 }, { 0x13DA, 0x13DA, 0x13DA }, { 0x13DB, 0x13DB, 0x13DB }, { 0x13DC, 0x13DC, 0x13DC }, { 0x13DD, 0x13DD, 0x13DD }, { 0x13DE, 0x13DE, 0x13DE }, { 0x13DF, 0x13DF, 0x13DF }, { 0x13E0, 0x13E0, 0x13E0 }, { 0x13E1, 0x13E1, 0x13E1 }, { 0x13E2, 0x13E2, 0x13E2 }, { 0x13E3, 0x13E3, 0x13E3 }, { 0x13E4, 0x13E4, 0x13E4 }, { 0x13E5, 0x13E5, 0x13E5 }, { 0x13E6, 0x13E6, 0x13E6 }, { 0x13E7, 0x13E7, 0x13E7 }, { 0x13E8, 0x13E8, 0x13E8 }, { 0x13E9, 0x13E9, 0x13E9 }, { 0x13EA, 0x13EA, 0x13EA }, { 0x13EB, 0x13EB, 0x13EB }, { 0x13EC, 0x13EC, 0x13EC }, { 0x13ED, 0x13ED, 0x13ED }, { 0x13EE, 0x13EE, 0x13EE }, { 0x13EF, 0x13EF, 0x13EF }, { 0x13F0, 0x13F0, 0x13F0 }, { 0x13F1, 0x13F1, 0x13F1 }, { 0x13F2, 0x13F2, 0x13F2 }, { 0x13F3, 0x13F3, 0x13F3 }, { 0x13F4, 0x13F4, 0x13F4 }, { 0x1401, 0x1401, 0x1401 }, { 0x1402, 0x1402, 0x1402 }, { 0x1403, 0x1403, 0x1403 }, { 0x1404, 0x1404, 0x1404 }, { 0x1405, 0x1405, 0x1405 }, { 0x1406, 0x1406, 0x1406 }, { 0x1407, 0x1407, 0x1407 }, { 0x1408, 0x1408, 0x1408 }, { 0x1409, 0x1409, 0x1409 }, { 0x140A, 0x140A, 0x140A }, { 0x140B, 0x140B, 0x140B }, { 0x140C, 0x140C, 0x140C }, { 0x140D, 0x140D, 0x140D }, { 0x140E, 0x140E, 0x140E }, { 0x140F, 0x140F, 0x140F }, { 0x1410, 0x1410, 0x1410 }, { 0x1411, 0x1411, 0x1411 }, { 0x1412, 0x1412, 0x1412 }, { 0x1413, 0x1413, 0x1413 }, { 0x1414, 0x1414, 0x1414 }, { 0x1415, 0x1415, 0x1415 }, { 0x1416, 0x1416, 0x1416 }, { 0x1417, 0x1417, 0x1417 }, { 0x1418, 0x1418, 0x1418 }, { 0x1419, 0x1419, 0x1419 }, { 0x141A, 0x141A, 0x141A }, { 0x141B, 0x141B, 0x141B }, { 0x141C, 0x141C, 0x141C }, { 0x141D, 0x141D, 0x141D }, { 0x141E, 0x141E, 0x141E }, { 0x141F, 0x141F, 0x141F }, { 0x1420, 0x1420, 0x1420 }, { 0x1421, 0x1421, 0x1421 }, { 0x1422, 0x1422, 0x1422 }, { 0x1423, 0x1423, 0x1423 }, { 0x1424, 0x1424, 0x1424 }, { 0x1425, 0x1425, 0x1425 }, { 0x1426, 0x1426, 0x1426 }, { 0x1427, 0x1427, 0x1427 }, { 0x1428, 0x1428, 0x1428 }, { 0x1429, 0x1429, 0x1429 }, { 0x142A, 0x142A, 0x142A }, { 0x142B, 0x142B, 0x142B }, { 0x142C, 0x142C, 0x142C }, { 0x142D, 0x142D, 0x142D }, { 0x142E, 0x142E, 0x142E }, { 0x142F, 0x142F, 0x142F }, { 0x1430, 0x1430, 0x1430 }, { 0x1431, 0x1431, 0x1431 }, { 0x1432, 0x1432, 0x1432 }, { 0x1433, 0x1433, 0x1433 }, { 0x1434, 0x1434, 0x1434 }, { 0x1435, 0x1435, 0x1435 }, { 0x1436, 0x1436, 0x1436 }, { 0x1437, 0x1437, 0x1437 }, { 0x1438, 0x1438, 0x1438 }, { 0x1439, 0x1439, 0x1439 }, { 0x143A, 0x143A, 0x143A }, { 0x143B, 0x143B, 0x143B }, { 0x143C, 0x143C, 0x143C }, { 0x143D, 0x143D, 0x143D }, { 0x143E, 0x143E, 0x143E }, { 0x143F, 0x143F, 0x143F }, { 0x1440, 0x1440, 0x1440 }, { 0x1441, 0x1441, 0x1441 }, { 0x1442, 0x1442, 0x1442 }, { 0x1443, 0x1443, 0x1443 }, { 0x1444, 0x1444, 0x1444 }, { 0x1445, 0x1445, 0x1445 }, { 0x1446, 0x1446, 0x1446 }, { 0x1447, 0x1447, 0x1447 }, { 0x1448, 0x1448, 0x1448 }, { 0x1449, 0x1449, 0x1449 }, { 0x144A, 0x144A, 0x144A }, { 0x144B, 0x144B, 0x144B }, { 0x144C, 0x144C, 0x144C }, { 0x144D, 0x144D, 0x144D }, { 0x144E, 0x144E, 0x144E }, { 0x144F, 0x144F, 0x144F }, { 0x1450, 0x1450, 0x1450 }, { 0x1451, 0x1451, 0x1451 }, { 0x1452, 0x1452, 0x1452 }, { 0x1453, 0x1453, 0x1453 }, { 0x1454, 0x1454, 0x1454 }, { 0x1455, 0x1455, 0x1455 }, { 0x1456, 0x1456, 0x1456 }, { 0x1457, 0x1457, 0x1457 }, { 0x1458, 0x1458, 0x1458 }, { 0x1459, 0x1459, 0x1459 }, { 0x145A, 0x145A, 0x145A }, { 0x145B, 0x145B, 0x145B }, { 0x145C, 0x145C, 0x145C }, { 0x145D, 0x145D, 0x145D }, { 0x145E, 0x145E, 0x145E }, { 0x145F, 0x145F, 0x145F }, { 0x1460, 0x1460, 0x1460 }, { 0x1461, 0x1461, 0x1461 }, { 0x1462, 0x1462, 0x1462 }, { 0x1463, 0x1463, 0x1463 }, { 0x1464, 0x1464, 0x1464 }, { 0x1465, 0x1465, 0x1465 }, { 0x1466, 0x1466, 0x1466 }, { 0x1467, 0x1467, 0x1467 }, { 0x1468, 0x1468, 0x1468 }, { 0x1469, 0x1469, 0x1469 }, { 0x146A, 0x146A, 0x146A }, { 0x146B, 0x146B, 0x146B }, { 0x146C, 0x146C, 0x146C }, { 0x146D, 0x146D, 0x146D }, { 0x146E, 0x146E, 0x146E }, { 0x146F, 0x146F, 0x146F }, { 0x1470, 0x1470, 0x1470 }, { 0x1471, 0x1471, 0x1471 }, { 0x1472, 0x1472, 0x1472 }, { 0x1473, 0x1473, 0x1473 }, { 0x1474, 0x1474, 0x1474 }, { 0x1475, 0x1475, 0x1475 }, { 0x1476, 0x1476, 0x1476 }, { 0x1477, 0x1477, 0x1477 }, { 0x1478, 0x1478, 0x1478 }, { 0x1479, 0x1479, 0x1479 }, { 0x147A, 0x147A, 0x147A }, { 0x147B, 0x147B, 0x147B }, { 0x147C, 0x147C, 0x147C }, { 0x147D, 0x147D, 0x147D }, { 0x147E, 0x147E, 0x147E }, { 0x147F, 0x147F, 0x147F }, { 0x1480, 0x1480, 0x1480 }, { 0x1481, 0x1481, 0x1481 }, { 0x1482, 0x1482, 0x1482 }, { 0x1483, 0x1483, 0x1483 }, { 0x1484, 0x1484, 0x1484 }, { 0x1485, 0x1485, 0x1485 }, { 0x1486, 0x1486, 0x1486 }, { 0x1487, 0x1487, 0x1487 }, { 0x1488, 0x1488, 0x1488 }, { 0x1489, 0x1489, 0x1489 }, { 0x148A, 0x148A, 0x148A }, { 0x148B, 0x148B, 0x148B }, { 0x148C, 0x148C, 0x148C }, { 0x148D, 0x148D, 0x148D }, { 0x148E, 0x148E, 0x148E }, { 0x148F, 0x148F, 0x148F }, { 0x1490, 0x1490, 0x1490 }, { 0x1491, 0x1491, 0x1491 }, { 0x1492, 0x1492, 0x1492 }, { 0x1493, 0x1493, 0x1493 }, { 0x1494, 0x1494, 0x1494 }, { 0x1495, 0x1495, 0x1495 }, { 0x1496, 0x1496, 0x1496 }, { 0x1497, 0x1497, 0x1497 }, { 0x1498, 0x1498, 0x1498 }, { 0x1499, 0x1499, 0x1499 }, { 0x149A, 0x149A, 0x149A }, { 0x149B, 0x149B, 0x149B }, { 0x149C, 0x149C, 0x149C }, { 0x149D, 0x149D, 0x149D }, { 0x149E, 0x149E, 0x149E }, { 0x149F, 0x149F, 0x149F }, { 0x14A0, 0x14A0, 0x14A0 }, { 0x14A1, 0x14A1, 0x14A1 }, { 0x14A2, 0x14A2, 0x14A2 }, { 0x14A3, 0x14A3, 0x14A3 }, { 0x14A4, 0x14A4, 0x14A4 }, { 0x14A5, 0x14A5, 0x14A5 }, { 0x14A6, 0x14A6, 0x14A6 }, { 0x14A7, 0x14A7, 0x14A7 }, { 0x14A8, 0x14A8, 0x14A8 }, { 0x14A9, 0x14A9, 0x14A9 }, { 0x14AA, 0x14AA, 0x14AA }, { 0x14AB, 0x14AB, 0x14AB }, { 0x14AC, 0x14AC, 0x14AC }, { 0x14AD, 0x14AD, 0x14AD }, { 0x14AE, 0x14AE, 0x14AE }, { 0x14AF, 0x14AF, 0x14AF }, { 0x14B0, 0x14B0, 0x14B0 }, { 0x14B1, 0x14B1, 0x14B1 }, { 0x14B2, 0x14B2, 0x14B2 }, { 0x14B3, 0x14B3, 0x14B3 }, { 0x14B4, 0x14B4, 0x14B4 }, { 0x14B5, 0x14B5, 0x14B5 }, { 0x14B6, 0x14B6, 0x14B6 }, { 0x14B7, 0x14B7, 0x14B7 }, { 0x14B8, 0x14B8, 0x14B8 }, { 0x14B9, 0x14B9, 0x14B9 }, { 0x14BA, 0x14BA, 0x14BA }, { 0x14BB, 0x14BB, 0x14BB }, { 0x14BC, 0x14BC, 0x14BC }, { 0x14BD, 0x14BD, 0x14BD }, { 0x14BE, 0x14BE, 0x14BE }, { 0x14BF, 0x14BF, 0x14BF }, { 0x14C0, 0x14C0, 0x14C0 }, { 0x14C1, 0x14C1, 0x14C1 }, { 0x14C2, 0x14C2, 0x14C2 }, { 0x14C3, 0x14C3, 0x14C3 }, { 0x14C4, 0x14C4, 0x14C4 }, { 0x14C5, 0x14C5, 0x14C5 }, { 0x14C6, 0x14C6, 0x14C6 }, { 0x14C7, 0x14C7, 0x14C7 }, { 0x14C8, 0x14C8, 0x14C8 }, { 0x14C9, 0x14C9, 0x14C9 }, { 0x14CA, 0x14CA, 0x14CA }, { 0x14CB, 0x14CB, 0x14CB }, { 0x14CC, 0x14CC, 0x14CC }, { 0x14CD, 0x14CD, 0x14CD }, { 0x14CE, 0x14CE, 0x14CE }, { 0x14CF, 0x14CF, 0x14CF }, { 0x14D0, 0x14D0, 0x14D0 }, { 0x14D1, 0x14D1, 0x14D1 }, { 0x14D2, 0x14D2, 0x14D2 }, { 0x14D3, 0x14D3, 0x14D3 }, { 0x14D4, 0x14D4, 0x14D4 }, { 0x14D5, 0x14D5, 0x14D5 }, { 0x14D6, 0x14D6, 0x14D6 }, { 0x14D7, 0x14D7, 0x14D7 }, { 0x14D8, 0x14D8, 0x14D8 }, { 0x14D9, 0x14D9, 0x14D9 }, { 0x14DA, 0x14DA, 0x14DA }, { 0x14DB, 0x14DB, 0x14DB }, { 0x14DC, 0x14DC, 0x14DC }, { 0x14DD, 0x14DD, 0x14DD }, { 0x14DE, 0x14DE, 0x14DE }, { 0x14DF, 0x14DF, 0x14DF }, { 0x14E0, 0x14E0, 0x14E0 }, { 0x14E1, 0x14E1, 0x14E1 }, { 0x14E2, 0x14E2, 0x14E2 }, { 0x14E3, 0x14E3, 0x14E3 }, { 0x14E4, 0x14E4, 0x14E4 }, { 0x14E5, 0x14E5, 0x14E5 }, { 0x14E6, 0x14E6, 0x14E6 }, { 0x14E7, 0x14E7, 0x14E7 }, { 0x14E8, 0x14E8, 0x14E8 }, { 0x14E9, 0x14E9, 0x14E9 }, { 0x14EA, 0x14EA, 0x14EA }, { 0x14EB, 0x14EB, 0x14EB }, { 0x14EC, 0x14EC, 0x14EC }, { 0x14ED, 0x14ED, 0x14ED }, { 0x14EE, 0x14EE, 0x14EE }, { 0x14EF, 0x14EF, 0x14EF }, { 0x14F0, 0x14F0, 0x14F0 }, { 0x14F1, 0x14F1, 0x14F1 }, { 0x14F2, 0x14F2, 0x14F2 }, { 0x14F3, 0x14F3, 0x14F3 }, { 0x14F4, 0x14F4, 0x14F4 }, { 0x14F5, 0x14F5, 0x14F5 }, { 0x14F6, 0x14F6, 0x14F6 }, { 0x14F7, 0x14F7, 0x14F7 }, { 0x14F8, 0x14F8, 0x14F8 }, { 0x14F9, 0x14F9, 0x14F9 }, { 0x14FA, 0x14FA, 0x14FA }, { 0x14FB, 0x14FB, 0x14FB }, { 0x14FC, 0x14FC, 0x14FC }, { 0x14FD, 0x14FD, 0x14FD }, { 0x14FE, 0x14FE, 0x14FE }, { 0x14FF, 0x14FF, 0x14FF }, { 0x1500, 0x1500, 0x1500 }, { 0x1501, 0x1501, 0x1501 }, { 0x1502, 0x1502, 0x1502 }, { 0x1503, 0x1503, 0x1503 }, { 0x1504, 0x1504, 0x1504 }, { 0x1505, 0x1505, 0x1505 }, { 0x1506, 0x1506, 0x1506 }, { 0x1507, 0x1507, 0x1507 }, { 0x1508, 0x1508, 0x1508 }, { 0x1509, 0x1509, 0x1509 }, { 0x150A, 0x150A, 0x150A }, { 0x150B, 0x150B, 0x150B }, { 0x150C, 0x150C, 0x150C }, { 0x150D, 0x150D, 0x150D }, { 0x150E, 0x150E, 0x150E }, { 0x150F, 0x150F, 0x150F }, { 0x1510, 0x1510, 0x1510 }, { 0x1511, 0x1511, 0x1511 }, { 0x1512, 0x1512, 0x1512 }, { 0x1513, 0x1513, 0x1513 }, { 0x1514, 0x1514, 0x1514 }, { 0x1515, 0x1515, 0x1515 }, { 0x1516, 0x1516, 0x1516 }, { 0x1517, 0x1517, 0x1517 }, { 0x1518, 0x1518, 0x1518 }, { 0x1519, 0x1519, 0x1519 }, { 0x151A, 0x151A, 0x151A }, { 0x151B, 0x151B, 0x151B }, { 0x151C, 0x151C, 0x151C }, { 0x151D, 0x151D, 0x151D }, { 0x151E, 0x151E, 0x151E }, { 0x151F, 0x151F, 0x151F }, { 0x1520, 0x1520, 0x1520 }, { 0x1521, 0x1521, 0x1521 }, { 0x1522, 0x1522, 0x1522 }, { 0x1523, 0x1523, 0x1523 }, { 0x1524, 0x1524, 0x1524 }, { 0x1525, 0x1525, 0x1525 }, { 0x1526, 0x1526, 0x1526 }, { 0x1527, 0x1527, 0x1527 }, { 0x1528, 0x1528, 0x1528 }, { 0x1529, 0x1529, 0x1529 }, { 0x152A, 0x152A, 0x152A }, { 0x152B, 0x152B, 0x152B }, { 0x152C, 0x152C, 0x152C }, { 0x152D, 0x152D, 0x152D }, { 0x152E, 0x152E, 0x152E }, { 0x152F, 0x152F, 0x152F }, { 0x1530, 0x1530, 0x1530 }, { 0x1531, 0x1531, 0x1531 }, { 0x1532, 0x1532, 0x1532 }, { 0x1533, 0x1533, 0x1533 }, { 0x1534, 0x1534, 0x1534 }, { 0x1535, 0x1535, 0x1535 }, { 0x1536, 0x1536, 0x1536 }, { 0x1537, 0x1537, 0x1537 }, { 0x1538, 0x1538, 0x1538 }, { 0x1539, 0x1539, 0x1539 }, { 0x153A, 0x153A, 0x153A }, { 0x153B, 0x153B, 0x153B }, { 0x153C, 0x153C, 0x153C }, { 0x153D, 0x153D, 0x153D }, { 0x153E, 0x153E, 0x153E }, { 0x153F, 0x153F, 0x153F }, { 0x1540, 0x1540, 0x1540 }, { 0x1541, 0x1541, 0x1541 }, { 0x1542, 0x1542, 0x1542 }, { 0x1543, 0x1543, 0x1543 }, { 0x1544, 0x1544, 0x1544 }, { 0x1545, 0x1545, 0x1545 }, { 0x1546, 0x1546, 0x1546 }, { 0x1547, 0x1547, 0x1547 }, { 0x1548, 0x1548, 0x1548 }, { 0x1549, 0x1549, 0x1549 }, { 0x154A, 0x154A, 0x154A }, { 0x154B, 0x154B, 0x154B }, { 0x154C, 0x154C, 0x154C }, { 0x154D, 0x154D, 0x154D }, { 0x154E, 0x154E, 0x154E }, { 0x154F, 0x154F, 0x154F }, { 0x1550, 0x1550, 0x1550 }, { 0x1551, 0x1551, 0x1551 }, { 0x1552, 0x1552, 0x1552 }, { 0x1553, 0x1553, 0x1553 }, { 0x1554, 0x1554, 0x1554 }, { 0x1555, 0x1555, 0x1555 }, { 0x1556, 0x1556, 0x1556 }, { 0x1557, 0x1557, 0x1557 }, { 0x1558, 0x1558, 0x1558 }, { 0x1559, 0x1559, 0x1559 }, { 0x155A, 0x155A, 0x155A }, { 0x155B, 0x155B, 0x155B }, { 0x155C, 0x155C, 0x155C }, { 0x155D, 0x155D, 0x155D }, { 0x155E, 0x155E, 0x155E }, { 0x155F, 0x155F, 0x155F }, { 0x1560, 0x1560, 0x1560 }, { 0x1561, 0x1561, 0x1561 }, { 0x1562, 0x1562, 0x1562 }, { 0x1563, 0x1563, 0x1563 }, { 0x1564, 0x1564, 0x1564 }, { 0x1565, 0x1565, 0x1565 }, { 0x1566, 0x1566, 0x1566 }, { 0x1567, 0x1567, 0x1567 }, { 0x1568, 0x1568, 0x1568 }, { 0x1569, 0x1569, 0x1569 }, { 0x156A, 0x156A, 0x156A }, { 0x156B, 0x156B, 0x156B }, { 0x156C, 0x156C, 0x156C }, { 0x156D, 0x156D, 0x156D }, { 0x156E, 0x156E, 0x156E }, { 0x156F, 0x156F, 0x156F }, { 0x1570, 0x1570, 0x1570 }, { 0x1571, 0x1571, 0x1571 }, { 0x1572, 0x1572, 0x1572 }, { 0x1573, 0x1573, 0x1573 }, { 0x1574, 0x1574, 0x1574 }, { 0x1575, 0x1575, 0x1575 }, { 0x1576, 0x1576, 0x1576 }, { 0x1577, 0x1577, 0x1577 }, { 0x1578, 0x1578, 0x1578 }, { 0x1579, 0x1579, 0x1579 }, { 0x157A, 0x157A, 0x157A }, { 0x157B, 0x157B, 0x157B }, { 0x157C, 0x157C, 0x157C }, { 0x157D, 0x157D, 0x157D }, { 0x157E, 0x157E, 0x157E }, { 0x157F, 0x157F, 0x157F }, { 0x1580, 0x1580, 0x1580 }, { 0x1581, 0x1581, 0x1581 }, { 0x1582, 0x1582, 0x1582 }, { 0x1583, 0x1583, 0x1583 }, { 0x1584, 0x1584, 0x1584 }, { 0x1585, 0x1585, 0x1585 }, { 0x1586, 0x1586, 0x1586 }, { 0x1587, 0x1587, 0x1587 }, { 0x1588, 0x1588, 0x1588 }, { 0x1589, 0x1589, 0x1589 }, { 0x158A, 0x158A, 0x158A }, { 0x158B, 0x158B, 0x158B }, { 0x158C, 0x158C, 0x158C }, { 0x158D, 0x158D, 0x158D }, { 0x158E, 0x158E, 0x158E }, { 0x158F, 0x158F, 0x158F }, { 0x1590, 0x1590, 0x1590 }, { 0x1591, 0x1591, 0x1591 }, { 0x1592, 0x1592, 0x1592 }, { 0x1593, 0x1593, 0x1593 }, { 0x1594, 0x1594, 0x1594 }, { 0x1595, 0x1595, 0x1595 }, { 0x1596, 0x1596, 0x1596 }, { 0x1597, 0x1597, 0x1597 }, { 0x1598, 0x1598, 0x1598 }, { 0x1599, 0x1599, 0x1599 }, { 0x159A, 0x159A, 0x159A }, { 0x159B, 0x159B, 0x159B }, { 0x159C, 0x159C, 0x159C }, { 0x159D, 0x159D, 0x159D }, { 0x159E, 0x159E, 0x159E }, { 0x159F, 0x159F, 0x159F }, { 0x15A0, 0x15A0, 0x15A0 }, { 0x15A1, 0x15A1, 0x15A1 }, { 0x15A2, 0x15A2, 0x15A2 }, { 0x15A3, 0x15A3, 0x15A3 }, { 0x15A4, 0x15A4, 0x15A4 }, { 0x15A5, 0x15A5, 0x15A5 }, { 0x15A6, 0x15A6, 0x15A6 }, { 0x15A7, 0x15A7, 0x15A7 }, { 0x15A8, 0x15A8, 0x15A8 }, { 0x15A9, 0x15A9, 0x15A9 }, { 0x15AA, 0x15AA, 0x15AA }, { 0x15AB, 0x15AB, 0x15AB }, { 0x15AC, 0x15AC, 0x15AC }, { 0x15AD, 0x15AD, 0x15AD }, { 0x15AE, 0x15AE, 0x15AE }, { 0x15AF, 0x15AF, 0x15AF }, { 0x15B0, 0x15B0, 0x15B0 }, { 0x15B1, 0x15B1, 0x15B1 }, { 0x15B2, 0x15B2, 0x15B2 }, { 0x15B3, 0x15B3, 0x15B3 }, { 0x15B4, 0x15B4, 0x15B4 }, { 0x15B5, 0x15B5, 0x15B5 }, { 0x15B6, 0x15B6, 0x15B6 }, { 0x15B7, 0x15B7, 0x15B7 }, { 0x15B8, 0x15B8, 0x15B8 }, { 0x15B9, 0x15B9, 0x15B9 }, { 0x15BA, 0x15BA, 0x15BA }, { 0x15BB, 0x15BB, 0x15BB }, { 0x15BC, 0x15BC, 0x15BC }, { 0x15BD, 0x15BD, 0x15BD }, { 0x15BE, 0x15BE, 0x15BE }, { 0x15BF, 0x15BF, 0x15BF }, { 0x15C0, 0x15C0, 0x15C0 }, { 0x15C1, 0x15C1, 0x15C1 }, { 0x15C2, 0x15C2, 0x15C2 }, { 0x15C3, 0x15C3, 0x15C3 }, { 0x15C4, 0x15C4, 0x15C4 }, { 0x15C5, 0x15C5, 0x15C5 }, { 0x15C6, 0x15C6, 0x15C6 }, { 0x15C7, 0x15C7, 0x15C7 }, { 0x15C8, 0x15C8, 0x15C8 }, { 0x15C9, 0x15C9, 0x15C9 }, { 0x15CA, 0x15CA, 0x15CA }, { 0x15CB, 0x15CB, 0x15CB }, { 0x15CC, 0x15CC, 0x15CC }, { 0x15CD, 0x15CD, 0x15CD }, { 0x15CE, 0x15CE, 0x15CE }, { 0x15CF, 0x15CF, 0x15CF }, { 0x15D0, 0x15D0, 0x15D0 }, { 0x15D1, 0x15D1, 0x15D1 }, { 0x15D2, 0x15D2, 0x15D2 }, { 0x15D3, 0x15D3, 0x15D3 }, { 0x15D4, 0x15D4, 0x15D4 }, { 0x15D5, 0x15D5, 0x15D5 }, { 0x15D6, 0x15D6, 0x15D6 }, { 0x15D7, 0x15D7, 0x15D7 }, { 0x15D8, 0x15D8, 0x15D8 }, { 0x15D9, 0x15D9, 0x15D9 }, { 0x15DA, 0x15DA, 0x15DA }, { 0x15DB, 0x15DB, 0x15DB }, { 0x15DC, 0x15DC, 0x15DC }, { 0x15DD, 0x15DD, 0x15DD }, { 0x15DE, 0x15DE, 0x15DE }, { 0x15DF, 0x15DF, 0x15DF }, { 0x15E0, 0x15E0, 0x15E0 }, { 0x15E1, 0x15E1, 0x15E1 }, { 0x15E2, 0x15E2, 0x15E2 }, { 0x15E3, 0x15E3, 0x15E3 }, { 0x15E4, 0x15E4, 0x15E4 }, { 0x15E5, 0x15E5, 0x15E5 }, { 0x15E6, 0x15E6, 0x15E6 }, { 0x15E7, 0x15E7, 0x15E7 }, { 0x15E8, 0x15E8, 0x15E8 }, { 0x15E9, 0x15E9, 0x15E9 }, { 0x15EA, 0x15EA, 0x15EA }, { 0x15EB, 0x15EB, 0x15EB }, { 0x15EC, 0x15EC, 0x15EC }, { 0x15ED, 0x15ED, 0x15ED }, { 0x15EE, 0x15EE, 0x15EE }, { 0x15EF, 0x15EF, 0x15EF }, { 0x15F0, 0x15F0, 0x15F0 }, { 0x15F1, 0x15F1, 0x15F1 }, { 0x15F2, 0x15F2, 0x15F2 }, { 0x15F3, 0x15F3, 0x15F3 }, { 0x15F4, 0x15F4, 0x15F4 }, { 0x15F5, 0x15F5, 0x15F5 }, { 0x15F6, 0x15F6, 0x15F6 }, { 0x15F7, 0x15F7, 0x15F7 }, { 0x15F8, 0x15F8, 0x15F8 }, { 0x15F9, 0x15F9, 0x15F9 }, { 0x15FA, 0x15FA, 0x15FA }, { 0x15FB, 0x15FB, 0x15FB }, { 0x15FC, 0x15FC, 0x15FC }, { 0x15FD, 0x15FD, 0x15FD }, { 0x15FE, 0x15FE, 0x15FE }, { 0x15FF, 0x15FF, 0x15FF }, { 0x1600, 0x1600, 0x1600 }, { 0x1601, 0x1601, 0x1601 }, { 0x1602, 0x1602, 0x1602 }, { 0x1603, 0x1603, 0x1603 }, { 0x1604, 0x1604, 0x1604 }, { 0x1605, 0x1605, 0x1605 }, { 0x1606, 0x1606, 0x1606 }, { 0x1607, 0x1607, 0x1607 }, { 0x1608, 0x1608, 0x1608 }, { 0x1609, 0x1609, 0x1609 }, { 0x160A, 0x160A, 0x160A }, { 0x160B, 0x160B, 0x160B }, { 0x160C, 0x160C, 0x160C }, { 0x160D, 0x160D, 0x160D }, { 0x160E, 0x160E, 0x160E }, { 0x160F, 0x160F, 0x160F }, { 0x1610, 0x1610, 0x1610 }, { 0x1611, 0x1611, 0x1611 }, { 0x1612, 0x1612, 0x1612 }, { 0x1613, 0x1613, 0x1613 }, { 0x1614, 0x1614, 0x1614 }, { 0x1615, 0x1615, 0x1615 }, { 0x1616, 0x1616, 0x1616 }, { 0x1617, 0x1617, 0x1617 }, { 0x1618, 0x1618, 0x1618 }, { 0x1619, 0x1619, 0x1619 }, { 0x161A, 0x161A, 0x161A }, { 0x161B, 0x161B, 0x161B }, { 0x161C, 0x161C, 0x161C }, { 0x161D, 0x161D, 0x161D }, { 0x161E, 0x161E, 0x161E }, { 0x161F, 0x161F, 0x161F }, { 0x1620, 0x1620, 0x1620 }, { 0x1621, 0x1621, 0x1621 }, { 0x1622, 0x1622, 0x1622 }, { 0x1623, 0x1623, 0x1623 }, { 0x1624, 0x1624, 0x1624 }, { 0x1625, 0x1625, 0x1625 }, { 0x1626, 0x1626, 0x1626 }, { 0x1627, 0x1627, 0x1627 }, { 0x1628, 0x1628, 0x1628 }, { 0x1629, 0x1629, 0x1629 }, { 0x162A, 0x162A, 0x162A }, { 0x162B, 0x162B, 0x162B }, { 0x162C, 0x162C, 0x162C }, { 0x162D, 0x162D, 0x162D }, { 0x162E, 0x162E, 0x162E }, { 0x162F, 0x162F, 0x162F }, { 0x1630, 0x1630, 0x1630 }, { 0x1631, 0x1631, 0x1631 }, { 0x1632, 0x1632, 0x1632 }, { 0x1633, 0x1633, 0x1633 }, { 0x1634, 0x1634, 0x1634 }, { 0x1635, 0x1635, 0x1635 }, { 0x1636, 0x1636, 0x1636 }, { 0x1637, 0x1637, 0x1637 }, { 0x1638, 0x1638, 0x1638 }, { 0x1639, 0x1639, 0x1639 }, { 0x163A, 0x163A, 0x163A }, { 0x163B, 0x163B, 0x163B }, { 0x163C, 0x163C, 0x163C }, { 0x163D, 0x163D, 0x163D }, { 0x163E, 0x163E, 0x163E }, { 0x163F, 0x163F, 0x163F }, { 0x1640, 0x1640, 0x1640 }, { 0x1641, 0x1641, 0x1641 }, { 0x1642, 0x1642, 0x1642 }, { 0x1643, 0x1643, 0x1643 }, { 0x1644, 0x1644, 0x1644 }, { 0x1645, 0x1645, 0x1645 }, { 0x1646, 0x1646, 0x1646 }, { 0x1647, 0x1647, 0x1647 }, { 0x1648, 0x1648, 0x1648 }, { 0x1649, 0x1649, 0x1649 }, { 0x164A, 0x164A, 0x164A }, { 0x164B, 0x164B, 0x164B }, { 0x164C, 0x164C, 0x164C }, { 0x164D, 0x164D, 0x164D }, { 0x164E, 0x164E, 0x164E }, { 0x164F, 0x164F, 0x164F }, { 0x1650, 0x1650, 0x1650 }, { 0x1651, 0x1651, 0x1651 }, { 0x1652, 0x1652, 0x1652 }, { 0x1653, 0x1653, 0x1653 }, { 0x1654, 0x1654, 0x1654 }, { 0x1655, 0x1655, 0x1655 }, { 0x1656, 0x1656, 0x1656 }, { 0x1657, 0x1657, 0x1657 }, { 0x1658, 0x1658, 0x1658 }, { 0x1659, 0x1659, 0x1659 }, { 0x165A, 0x165A, 0x165A }, { 0x165B, 0x165B, 0x165B }, { 0x165C, 0x165C, 0x165C }, { 0x165D, 0x165D, 0x165D }, { 0x165E, 0x165E, 0x165E }, { 0x165F, 0x165F, 0x165F }, { 0x1660, 0x1660, 0x1660 }, { 0x1661, 0x1661, 0x1661 }, { 0x1662, 0x1662, 0x1662 }, { 0x1663, 0x1663, 0x1663 }, { 0x1664, 0x1664, 0x1664 }, { 0x1665, 0x1665, 0x1665 }, { 0x1666, 0x1666, 0x1666 }, { 0x1667, 0x1667, 0x1667 }, { 0x1668, 0x1668, 0x1668 }, { 0x1669, 0x1669, 0x1669 }, { 0x166A, 0x166A, 0x166A }, { 0x166B, 0x166B, 0x166B }, { 0x166C, 0x166C, 0x166C }, { 0x166F, 0x166F, 0x166F }, { 0x1670, 0x1670, 0x1670 }, { 0x1671, 0x1671, 0x1671 }, { 0x1672, 0x1672, 0x1672 }, { 0x1673, 0x1673, 0x1673 }, { 0x1674, 0x1674, 0x1674 }, { 0x1675, 0x1675, 0x1675 }, { 0x1676, 0x1676, 0x1676 }, { 0x1681, 0x1681, 0x1681 }, { 0x1682, 0x1682, 0x1682 }, { 0x1683, 0x1683, 0x1683 }, { 0x1684, 0x1684, 0x1684 }, { 0x1685, 0x1685, 0x1685 }, { 0x1686, 0x1686, 0x1686 }, { 0x1687, 0x1687, 0x1687 }, { 0x1688, 0x1688, 0x1688 }, { 0x1689, 0x1689, 0x1689 }, { 0x168A, 0x168A, 0x168A }, { 0x168B, 0x168B, 0x168B }, { 0x168C, 0x168C, 0x168C }, { 0x168D, 0x168D, 0x168D }, { 0x168E, 0x168E, 0x168E }, { 0x168F, 0x168F, 0x168F }, { 0x1690, 0x1690, 0x1690 }, { 0x1691, 0x1691, 0x1691 }, { 0x1692, 0x1692, 0x1692 }, { 0x1693, 0x1693, 0x1693 }, { 0x1694, 0x1694, 0x1694 }, { 0x1695, 0x1695, 0x1695 }, { 0x1696, 0x1696, 0x1696 }, { 0x1697, 0x1697, 0x1697 }, { 0x1698, 0x1698, 0x1698 }, { 0x1699, 0x1699, 0x1699 }, { 0x169A, 0x169A, 0x169A }, { 0x16A0, 0x16A0, 0x16A0 }, { 0x16A1, 0x16A1, 0x16A1 }, { 0x16A2, 0x16A2, 0x16A2 }, { 0x16A3, 0x16A3, 0x16A3 }, { 0x16A4, 0x16A4, 0x16A4 }, { 0x16A5, 0x16A5, 0x16A5 }, { 0x16A6, 0x16A6, 0x16A6 }, { 0x16A7, 0x16A7, 0x16A7 }, { 0x16A8, 0x16A8, 0x16A8 }, { 0x16A9, 0x16A9, 0x16A9 }, { 0x16AA, 0x16AA, 0x16AA }, { 0x16AB, 0x16AB, 0x16AB }, { 0x16AC, 0x16AC, 0x16AC }, { 0x16AD, 0x16AD, 0x16AD }, { 0x16AE, 0x16AE, 0x16AE }, { 0x16AF, 0x16AF, 0x16AF }, { 0x16B0, 0x16B0, 0x16B0 }, { 0x16B1, 0x16B1, 0x16B1 }, { 0x16B2, 0x16B2, 0x16B2 }, { 0x16B3, 0x16B3, 0x16B3 }, { 0x16B4, 0x16B4, 0x16B4 }, { 0x16B5, 0x16B5, 0x16B5 }, { 0x16B6, 0x16B6, 0x16B6 }, { 0x16B7, 0x16B7, 0x16B7 }, { 0x16B8, 0x16B8, 0x16B8 }, { 0x16B9, 0x16B9, 0x16B9 }, { 0x16BA, 0x16BA, 0x16BA }, { 0x16BB, 0x16BB, 0x16BB }, { 0x16BC, 0x16BC, 0x16BC }, { 0x16BD, 0x16BD, 0x16BD }, { 0x16BE, 0x16BE, 0x16BE }, { 0x16BF, 0x16BF, 0x16BF }, { 0x16C0, 0x16C0, 0x16C0 }, { 0x16C1, 0x16C1, 0x16C1 }, { 0x16C2, 0x16C2, 0x16C2 }, { 0x16C3, 0x16C3, 0x16C3 }, { 0x16C4, 0x16C4, 0x16C4 }, { 0x16C5, 0x16C5, 0x16C5 }, { 0x16C6, 0x16C6, 0x16C6 }, { 0x16C7, 0x16C7, 0x16C7 }, { 0x16C8, 0x16C8, 0x16C8 }, { 0x16C9, 0x16C9, 0x16C9 }, { 0x16CA, 0x16CA, 0x16CA }, { 0x16CB, 0x16CB, 0x16CB }, { 0x16CC, 0x16CC, 0x16CC }, { 0x16CD, 0x16CD, 0x16CD }, { 0x16CE, 0x16CE, 0x16CE }, { 0x16CF, 0x16CF, 0x16CF }, { 0x16D0, 0x16D0, 0x16D0 }, { 0x16D1, 0x16D1, 0x16D1 }, { 0x16D2, 0x16D2, 0x16D2 }, { 0x16D3, 0x16D3, 0x16D3 }, { 0x16D4, 0x16D4, 0x16D4 }, { 0x16D5, 0x16D5, 0x16D5 }, { 0x16D6, 0x16D6, 0x16D6 }, { 0x16D7, 0x16D7, 0x16D7 }, { 0x16D8, 0x16D8, 0x16D8 }, { 0x16D9, 0x16D9, 0x16D9 }, { 0x16DA, 0x16DA, 0x16DA }, { 0x16DB, 0x16DB, 0x16DB }, { 0x16DC, 0x16DC, 0x16DC }, { 0x16DD, 0x16DD, 0x16DD }, { 0x16DE, 0x16DE, 0x16DE }, { 0x16DF, 0x16DF, 0x16DF }, { 0x16E0, 0x16E0, 0x16E0 }, { 0x16E1, 0x16E1, 0x16E1 }, { 0x16E2, 0x16E2, 0x16E2 }, { 0x16E3, 0x16E3, 0x16E3 }, { 0x16E4, 0x16E4, 0x16E4 }, { 0x16E5, 0x16E5, 0x16E5 }, { 0x16E6, 0x16E6, 0x16E6 }, { 0x16E7, 0x16E7, 0x16E7 }, { 0x16E8, 0x16E8, 0x16E8 }, { 0x16E9, 0x16E9, 0x16E9 }, { 0x16EA, 0x16EA, 0x16EA }, { 0x1700, 0x1700, 0x1700 }, { 0x1701, 0x1701, 0x1701 }, { 0x1702, 0x1702, 0x1702 }, { 0x1703, 0x1703, 0x1703 }, { 0x1704, 0x1704, 0x1704 }, { 0x1705, 0x1705, 0x1705 }, { 0x1706, 0x1706, 0x1706 }, { 0x1707, 0x1707, 0x1707 }, { 0x1708, 0x1708, 0x1708 }, { 0x1709, 0x1709, 0x1709 }, { 0x170A, 0x170A, 0x170A }, { 0x170B, 0x170B, 0x170B }, { 0x170C, 0x170C, 0x170C }, { 0x170E, 0x170E, 0x170E }, { 0x170F, 0x170F, 0x170F }, { 0x1710, 0x1710, 0x1710 }, { 0x1711, 0x1711, 0x1711 }, { 0x1712, 0x1712, 0x1712 }, { 0x1713, 0x1713, 0x1713 }, { 0x1714, 0x1714, 0x1714 }, { 0x1720, 0x1720, 0x1720 }, { 0x1721, 0x1721, 0x1721 }, { 0x1722, 0x1722, 0x1722 }, { 0x1723, 0x1723, 0x1723 }, { 0x1724, 0x1724, 0x1724 }, { 0x1725, 0x1725, 0x1725 }, { 0x1726, 0x1726, 0x1726 }, { 0x1727, 0x1727, 0x1727 }, { 0x1728, 0x1728, 0x1728 }, { 0x1729, 0x1729, 0x1729 }, { 0x172A, 0x172A, 0x172A }, { 0x172B, 0x172B, 0x172B }, { 0x172C, 0x172C, 0x172C }, { 0x172D, 0x172D, 0x172D }, { 0x172E, 0x172E, 0x172E }, { 0x172F, 0x172F, 0x172F }, { 0x1730, 0x1730, 0x1730 }, { 0x1731, 0x1731, 0x1731 }, { 0x1732, 0x1732, 0x1732 }, { 0x1733, 0x1733, 0x1733 }, { 0x1734, 0x1734, 0x1734 }, { 0x1740, 0x1740, 0x1740 }, { 0x1741, 0x1741, 0x1741 }, { 0x1742, 0x1742, 0x1742 }, { 0x1743, 0x1743, 0x1743 }, { 0x1744, 0x1744, 0x1744 }, { 0x1745, 0x1745, 0x1745 }, { 0x1746, 0x1746, 0x1746 }, { 0x1747, 0x1747, 0x1747 }, { 0x1748, 0x1748, 0x1748 }, { 0x1749, 0x1749, 0x1749 }, { 0x174A, 0x174A, 0x174A }, { 0x174B, 0x174B, 0x174B }, { 0x174C, 0x174C, 0x174C }, { 0x174D, 0x174D, 0x174D }, { 0x174E, 0x174E, 0x174E }, { 0x174F, 0x174F, 0x174F }, { 0x1750, 0x1750, 0x1750 }, { 0x1751, 0x1751, 0x1751 }, { 0x1752, 0x1752, 0x1752 }, { 0x1753, 0x1753, 0x1753 }, { 0x1760, 0x1760, 0x1760 }, { 0x1761, 0x1761, 0x1761 }, { 0x1762, 0x1762, 0x1762 }, { 0x1763, 0x1763, 0x1763 }, { 0x1764, 0x1764, 0x1764 }, { 0x1765, 0x1765, 0x1765 }, { 0x1766, 0x1766, 0x1766 }, { 0x1767, 0x1767, 0x1767 }, { 0x1768, 0x1768, 0x1768 }, { 0x1769, 0x1769, 0x1769 }, { 0x176A, 0x176A, 0x176A }, { 0x176B, 0x176B, 0x176B }, { 0x176C, 0x176C, 0x176C }, { 0x176E, 0x176E, 0x176E }, { 0x176F, 0x176F, 0x176F }, { 0x1770, 0x1770, 0x1770 }, { 0x1772, 0x1772, 0x1772 }, { 0x1773, 0x1773, 0x1773 }, { 0x1780, 0x1780, 0x1780 }, { 0x1781, 0x1781, 0x1781 }, { 0x1782, 0x1782, 0x1782 }, { 0x1783, 0x1783, 0x1783 }, { 0x1784, 0x1784, 0x1784 }, { 0x1785, 0x1785, 0x1785 }, { 0x1786, 0x1786, 0x1786 }, { 0x1787, 0x1787, 0x1787 }, { 0x1788, 0x1788, 0x1788 }, { 0x1789, 0x1789, 0x1789 }, { 0x178A, 0x178A, 0x178A }, { 0x178B, 0x178B, 0x178B }, { 0x178C, 0x178C, 0x178C }, { 0x178D, 0x178D, 0x178D }, { 0x178E, 0x178E, 0x178E }, { 0x178F, 0x178F, 0x178F }, { 0x1790, 0x1790, 0x1790 }, { 0x1791, 0x1791, 0x1791 }, { 0x1792, 0x1792, 0x1792 }, { 0x1793, 0x1793, 0x1793 }, { 0x1794, 0x1794, 0x1794 }, { 0x1795, 0x1795, 0x1795 }, { 0x1796, 0x1796, 0x1796 }, { 0x1797, 0x1797, 0x1797 }, { 0x1798, 0x1798, 0x1798 }, { 0x1799, 0x1799, 0x1799 }, { 0x179A, 0x179A, 0x179A }, { 0x179B, 0x179B, 0x179B }, { 0x179C, 0x179C, 0x179C }, { 0x179D, 0x179D, 0x179D }, { 0x179E, 0x179E, 0x179E }, { 0x179F, 0x179F, 0x179F }, { 0x17A0, 0x17A0, 0x17A0 }, { 0x17A1, 0x17A1, 0x17A1 }, { 0x17A2, 0x17A2, 0x17A2 }, { 0x17A3, 0x17A3, 0x17A3 }, { 0x17A4, 0x17A4, 0x17A4 }, { 0x17A5, 0x17A5, 0x17A5 }, { 0x17A6, 0x17A6, 0x17A6 }, { 0x17A7, 0x17A7, 0x17A7 }, { 0x17A8, 0x17A8, 0x17A8 }, { 0x17A9, 0x17A9, 0x17A9 }, { 0x17AA, 0x17AA, 0x17AA }, { 0x17AB, 0x17AB, 0x17AB }, { 0x17AC, 0x17AC, 0x17AC }, { 0x17AD, 0x17AD, 0x17AD }, { 0x17AE, 0x17AE, 0x17AE }, { 0x17AF, 0x17AF, 0x17AF }, { 0x17B0, 0x17B0, 0x17B0 }, { 0x17B1, 0x17B1, 0x17B1 }, { 0x17B2, 0x17B2, 0x17B2 }, { 0x17B3, 0x17B3, 0x17B3 }, { 0x17B7, 0x17B7, 0x17B7 }, { 0x17B8, 0x17B8, 0x17B8 }, { 0x17B9, 0x17B9, 0x17B9 }, { 0x17BA, 0x17BA, 0x17BA }, { 0x17BB, 0x17BB, 0x17BB }, { 0x17BC, 0x17BC, 0x17BC }, { 0x17BD, 0x17BD, 0x17BD }, { 0x17C6, 0x17C6, 0x17C6 }, { 0x17C9, 0x17C9, 0x17C9 }, { 0x17CA, 0x17CA, 0x17CA }, { 0x17CB, 0x17CB, 0x17CB }, { 0x17CC, 0x17CC, 0x17CC }, { 0x17CD, 0x17CD, 0x17CD }, { 0x17CE, 0x17CE, 0x17CE }, { 0x17CF, 0x17CF, 0x17CF }, { 0x17D0, 0x17D0, 0x17D0 }, { 0x17D1, 0x17D1, 0x17D1 }, { 0x17D2, 0x17D2, 0x17D2 }, { 0x17D3, 0x17D3, 0x17D3 }, { 0x17D7, 0x17D7, 0x17D7 }, { 0x17DC, 0x17DC, 0x17DC }, { 0x17DD, 0x17DD, 0x17DD }, { 0x180B, 0x180B, 0x180B }, { 0x180C, 0x180C, 0x180C }, { 0x180D, 0x180D, 0x180D }, { 0x1820, 0x1820, 0x1820 }, { 0x1821, 0x1821, 0x1821 }, { 0x1822, 0x1822, 0x1822 }, { 0x1823, 0x1823, 0x1823 }, { 0x1824, 0x1824, 0x1824 }, { 0x1825, 0x1825, 0x1825 }, { 0x1826, 0x1826, 0x1826 }, { 0x1827, 0x1827, 0x1827 }, { 0x1828, 0x1828, 0x1828 }, { 0x1829, 0x1829, 0x1829 }, { 0x182A, 0x182A, 0x182A }, { 0x182B, 0x182B, 0x182B }, { 0x182C, 0x182C, 0x182C }, { 0x182D, 0x182D, 0x182D }, { 0x182E, 0x182E, 0x182E }, { 0x182F, 0x182F, 0x182F }, { 0x1830, 0x1830, 0x1830 }, { 0x1831, 0x1831, 0x1831 }, { 0x1832, 0x1832, 0x1832 }, { 0x1833, 0x1833, 0x1833 }, { 0x1834, 0x1834, 0x1834 }, { 0x1835, 0x1835, 0x1835 }, { 0x1836, 0x1836, 0x1836 }, { 0x1837, 0x1837, 0x1837 }, { 0x1838, 0x1838, 0x1838 }, { 0x1839, 0x1839, 0x1839 }, { 0x183A, 0x183A, 0x183A }, { 0x183B, 0x183B, 0x183B }, { 0x183C, 0x183C, 0x183C }, { 0x183D, 0x183D, 0x183D }, { 0x183E, 0x183E, 0x183E }, { 0x183F, 0x183F, 0x183F }, { 0x1840, 0x1840, 0x1840 }, { 0x1841, 0x1841, 0x1841 }, { 0x1842, 0x1842, 0x1842 }, { 0x1843, 0x1843, 0x1843 }, { 0x1844, 0x1844, 0x1844 }, { 0x1845, 0x1845, 0x1845 }, { 0x1846, 0x1846, 0x1846 }, { 0x1847, 0x1847, 0x1847 }, { 0x1848, 0x1848, 0x1848 }, { 0x1849, 0x1849, 0x1849 }, { 0x184A, 0x184A, 0x184A }, { 0x184B, 0x184B, 0x184B }, { 0x184C, 0x184C, 0x184C }, { 0x184D, 0x184D, 0x184D }, { 0x184E, 0x184E, 0x184E }, { 0x184F, 0x184F, 0x184F }, { 0x1850, 0x1850, 0x1850 }, { 0x1851, 0x1851, 0x1851 }, { 0x1852, 0x1852, 0x1852 }, { 0x1853, 0x1853, 0x1853 }, { 0x1854, 0x1854, 0x1854 }, { 0x1855, 0x1855, 0x1855 }, { 0x1856, 0x1856, 0x1856 }, { 0x1857, 0x1857, 0x1857 }, { 0x1858, 0x1858, 0x1858 }, { 0x1859, 0x1859, 0x1859 }, { 0x185A, 0x185A, 0x185A }, { 0x185B, 0x185B, 0x185B }, { 0x185C, 0x185C, 0x185C }, { 0x185D, 0x185D, 0x185D }, { 0x185E, 0x185E, 0x185E }, { 0x185F, 0x185F, 0x185F }, { 0x1860, 0x1860, 0x1860 }, { 0x1861, 0x1861, 0x1861 }, { 0x1862, 0x1862, 0x1862 }, { 0x1863, 0x1863, 0x1863 }, { 0x1864, 0x1864, 0x1864 }, { 0x1865, 0x1865, 0x1865 }, { 0x1866, 0x1866, 0x1866 }, { 0x1867, 0x1867, 0x1867 }, { 0x1868, 0x1868, 0x1868 }, { 0x1869, 0x1869, 0x1869 }, { 0x186A, 0x186A, 0x186A }, { 0x186B, 0x186B, 0x186B }, { 0x186C, 0x186C, 0x186C }, { 0x186D, 0x186D, 0x186D }, { 0x186E, 0x186E, 0x186E }, { 0x186F, 0x186F, 0x186F }, { 0x1870, 0x1870, 0x1870 }, { 0x1871, 0x1871, 0x1871 }, { 0x1872, 0x1872, 0x1872 }, { 0x1873, 0x1873, 0x1873 }, { 0x1874, 0x1874, 0x1874 }, { 0x1875, 0x1875, 0x1875 }, { 0x1876, 0x1876, 0x1876 }, { 0x1877, 0x1877, 0x1877 }, { 0x1880, 0x1880, 0x1880 }, { 0x1881, 0x1881, 0x1881 }, { 0x1882, 0x1882, 0x1882 }, { 0x1883, 0x1883, 0x1883 }, { 0x1884, 0x1884, 0x1884 }, { 0x1885, 0x1885, 0x1885 }, { 0x1886, 0x1886, 0x1886 }, { 0x1887, 0x1887, 0x1887 }, { 0x1888, 0x1888, 0x1888 }, { 0x1889, 0x1889, 0x1889 }, { 0x188A, 0x188A, 0x188A }, { 0x188B, 0x188B, 0x188B }, { 0x188C, 0x188C, 0x188C }, { 0x188D, 0x188D, 0x188D }, { 0x188E, 0x188E, 0x188E }, { 0x188F, 0x188F, 0x188F }, { 0x1890, 0x1890, 0x1890 }, { 0x1891, 0x1891, 0x1891 }, { 0x1892, 0x1892, 0x1892 }, { 0x1893, 0x1893, 0x1893 }, { 0x1894, 0x1894, 0x1894 }, { 0x1895, 0x1895, 0x1895 }, { 0x1896, 0x1896, 0x1896 }, { 0x1897, 0x1897, 0x1897 }, { 0x1898, 0x1898, 0x1898 }, { 0x1899, 0x1899, 0x1899 }, { 0x189A, 0x189A, 0x189A }, { 0x189B, 0x189B, 0x189B }, { 0x189C, 0x189C, 0x189C }, { 0x189D, 0x189D, 0x189D }, { 0x189E, 0x189E, 0x189E }, { 0x189F, 0x189F, 0x189F }, { 0x18A0, 0x18A0, 0x18A0 }, { 0x18A1, 0x18A1, 0x18A1 }, { 0x18A2, 0x18A2, 0x18A2 }, { 0x18A3, 0x18A3, 0x18A3 }, { 0x18A4, 0x18A4, 0x18A4 }, { 0x18A5, 0x18A5, 0x18A5 }, { 0x18A6, 0x18A6, 0x18A6 }, { 0x18A7, 0x18A7, 0x18A7 }, { 0x18A8, 0x18A8, 0x18A8 }, { 0x18A9, 0x18A9, 0x18A9 }, { 0x1900, 0x1900, 0x1900 }, { 0x1901, 0x1901, 0x1901 }, { 0x1902, 0x1902, 0x1902 }, { 0x1903, 0x1903, 0x1903 }, { 0x1904, 0x1904, 0x1904 }, { 0x1905, 0x1905, 0x1905 }, { 0x1906, 0x1906, 0x1906 }, { 0x1907, 0x1907, 0x1907 }, { 0x1908, 0x1908, 0x1908 }, { 0x1909, 0x1909, 0x1909 }, { 0x190A, 0x190A, 0x190A }, { 0x190B, 0x190B, 0x190B }, { 0x190C, 0x190C, 0x190C }, { 0x190D, 0x190D, 0x190D }, { 0x190E, 0x190E, 0x190E }, { 0x190F, 0x190F, 0x190F }, { 0x1910, 0x1910, 0x1910 }, { 0x1911, 0x1911, 0x1911 }, { 0x1912, 0x1912, 0x1912 }, { 0x1913, 0x1913, 0x1913 }, { 0x1914, 0x1914, 0x1914 }, { 0x1915, 0x1915, 0x1915 }, { 0x1916, 0x1916, 0x1916 }, { 0x1917, 0x1917, 0x1917 }, { 0x1918, 0x1918, 0x1918 }, { 0x1919, 0x1919, 0x1919 }, { 0x191A, 0x191A, 0x191A }, { 0x191B, 0x191B, 0x191B }, { 0x191C, 0x191C, 0x191C }, { 0x1920, 0x1920, 0x1920 }, { 0x1921, 0x1921, 0x1921 }, { 0x1922, 0x1922, 0x1922 }, { 0x1927, 0x1927, 0x1927 }, { 0x1928, 0x1928, 0x1928 }, { 0x1932, 0x1932, 0x1932 }, { 0x1939, 0x1939, 0x1939 }, { 0x193A, 0x193A, 0x193A }, { 0x193B, 0x193B, 0x193B }, { 0x1950, 0x1950, 0x1950 }, { 0x1951, 0x1951, 0x1951 }, { 0x1952, 0x1952, 0x1952 }, { 0x1953, 0x1953, 0x1953 }, { 0x1954, 0x1954, 0x1954 }, { 0x1955, 0x1955, 0x1955 }, { 0x1956, 0x1956, 0x1956 }, { 0x1957, 0x1957, 0x1957 }, { 0x1958, 0x1958, 0x1958 }, { 0x1959, 0x1959, 0x1959 }, { 0x195A, 0x195A, 0x195A }, { 0x195B, 0x195B, 0x195B }, { 0x195C, 0x195C, 0x195C }, { 0x195D, 0x195D, 0x195D }, { 0x195E, 0x195E, 0x195E }, { 0x195F, 0x195F, 0x195F }, { 0x1960, 0x1960, 0x1960 }, { 0x1961, 0x1961, 0x1961 }, { 0x1962, 0x1962, 0x1962 }, { 0x1963, 0x1963, 0x1963 }, { 0x1964, 0x1964, 0x1964 }, { 0x1965, 0x1965, 0x1965 }, { 0x1966, 0x1966, 0x1966 }, { 0x1967, 0x1967, 0x1967 }, { 0x1968, 0x1968, 0x1968 }, { 0x1969, 0x1969, 0x1969 }, { 0x196A, 0x196A, 0x196A }, { 0x196B, 0x196B, 0x196B }, { 0x196C, 0x196C, 0x196C }, { 0x196D, 0x196D, 0x196D }, { 0x1970, 0x1970, 0x1970 }, { 0x1971, 0x1971, 0x1971 }, { 0x1972, 0x1972, 0x1972 }, { 0x1973, 0x1973, 0x1973 }, { 0x1974, 0x1974, 0x1974 }, { 0x1980, 0x1980, 0x1980 }, { 0x1981, 0x1981, 0x1981 }, { 0x1982, 0x1982, 0x1982 }, { 0x1983, 0x1983, 0x1983 }, { 0x1984, 0x1984, 0x1984 }, { 0x1985, 0x1985, 0x1985 }, { 0x1986, 0x1986, 0x1986 }, { 0x1987, 0x1987, 0x1987 }, { 0x1988, 0x1988, 0x1988 }, { 0x1989, 0x1989, 0x1989 }, { 0x198A, 0x198A, 0x198A }, { 0x198B, 0x198B, 0x198B }, { 0x198C, 0x198C, 0x198C }, { 0x198D, 0x198D, 0x198D }, { 0x198E, 0x198E, 0x198E }, { 0x198F, 0x198F, 0x198F }, { 0x1990, 0x1990, 0x1990 }, { 0x1991, 0x1991, 0x1991 }, { 0x1992, 0x1992, 0x1992 }, { 0x1993, 0x1993, 0x1993 }, { 0x1994, 0x1994, 0x1994 }, { 0x1995, 0x1995, 0x1995 }, { 0x1996, 0x1996, 0x1996 }, { 0x1997, 0x1997, 0x1997 }, { 0x1998, 0x1998, 0x1998 }, { 0x1999, 0x1999, 0x1999 }, { 0x199A, 0x199A, 0x199A }, { 0x199B, 0x199B, 0x199B }, { 0x199C, 0x199C, 0x199C }, { 0x199D, 0x199D, 0x199D }, { 0x199E, 0x199E, 0x199E }, { 0x199F, 0x199F, 0x199F }, { 0x19A0, 0x19A0, 0x19A0 }, { 0x19A1, 0x19A1, 0x19A1 }, { 0x19A2, 0x19A2, 0x19A2 }, { 0x19A3, 0x19A3, 0x19A3 }, { 0x19A4, 0x19A4, 0x19A4 }, { 0x19A5, 0x19A5, 0x19A5 }, { 0x19A6, 0x19A6, 0x19A6 }, { 0x19A7, 0x19A7, 0x19A7 }, { 0x19A8, 0x19A8, 0x19A8 }, { 0x19A9, 0x19A9, 0x19A9 }, { 0x19C1, 0x19C1, 0x19C1 }, { 0x19C2, 0x19C2, 0x19C2 }, { 0x19C3, 0x19C3, 0x19C3 }, { 0x19C4, 0x19C4, 0x19C4 }, { 0x19C5, 0x19C5, 0x19C5 }, { 0x19C6, 0x19C6, 0x19C6 }, { 0x19C7, 0x19C7, 0x19C7 }, { 0x1A00, 0x1A00, 0x1A00 }, { 0x1A01, 0x1A01, 0x1A01 }, { 0x1A02, 0x1A02, 0x1A02 }, { 0x1A03, 0x1A03, 0x1A03 }, { 0x1A04, 0x1A04, 0x1A04 }, { 0x1A05, 0x1A05, 0x1A05 }, { 0x1A06, 0x1A06, 0x1A06 }, { 0x1A07, 0x1A07, 0x1A07 }, { 0x1A08, 0x1A08, 0x1A08 }, { 0x1A09, 0x1A09, 0x1A09 }, { 0x1A0A, 0x1A0A, 0x1A0A }, { 0x1A0B, 0x1A0B, 0x1A0B }, { 0x1A0C, 0x1A0C, 0x1A0C }, { 0x1A0D, 0x1A0D, 0x1A0D }, { 0x1A0E, 0x1A0E, 0x1A0E }, { 0x1A0F, 0x1A0F, 0x1A0F }, { 0x1A10, 0x1A10, 0x1A10 }, { 0x1A11, 0x1A11, 0x1A11 }, { 0x1A12, 0x1A12, 0x1A12 }, { 0x1A13, 0x1A13, 0x1A13 }, { 0x1A14, 0x1A14, 0x1A14 }, { 0x1A15, 0x1A15, 0x1A15 }, { 0x1A16, 0x1A16, 0x1A16 }, { 0x1A17, 0x1A17, 0x1A17 }, { 0x1A18, 0x1A18, 0x1A18 }, { 0x1D00, 0x1D00, 0x1D00 }, { 0x1D01, 0x1D01, 0x1D01 }, { 0x1D02, 0x1D02, 0x1D02 }, { 0x1D03, 0x1D03, 0x1D03 }, { 0x1D04, 0x1D04, 0x1D04 }, { 0x1D05, 0x1D05, 0x1D05 }, { 0x1D06, 0x1D06, 0x1D06 }, { 0x1D07, 0x1D07, 0x1D07 }, { 0x1D08, 0x1D08, 0x1D08 }, { 0x1D09, 0x1D09, 0x1D09 }, { 0x1D0A, 0x1D0A, 0x1D0A }, { 0x1D0B, 0x1D0B, 0x1D0B }, { 0x1D0C, 0x1D0C, 0x1D0C }, { 0x1D0D, 0x1D0D, 0x1D0D }, { 0x1D0E, 0x1D0E, 0x1D0E }, { 0x1D0F, 0x1D0F, 0x1D0F }, { 0x1D10, 0x1D10, 0x1D10 }, { 0x1D11, 0x1D11, 0x1D11 }, { 0x1D12, 0x1D12, 0x1D12 }, { 0x1D13, 0x1D13, 0x1D13 }, { 0x1D14, 0x1D14, 0x1D14 }, { 0x1D15, 0x1D15, 0x1D15 }, { 0x1D16, 0x1D16, 0x1D16 }, { 0x1D17, 0x1D17, 0x1D17 }, { 0x1D18, 0x1D18, 0x1D18 }, { 0x1D19, 0x1D19, 0x1D19 }, { 0x1D1A, 0x1D1A, 0x1D1A }, { 0x1D1B, 0x1D1B, 0x1D1B }, { 0x1D1C, 0x1D1C, 0x1D1C }, { 0x1D1D, 0x1D1D, 0x1D1D }, { 0x1D1E, 0x1D1E, 0x1D1E }, { 0x1D1F, 0x1D1F, 0x1D1F }, { 0x1D20, 0x1D20, 0x1D20 }, { 0x1D21, 0x1D21, 0x1D21 }, { 0x1D22, 0x1D22, 0x1D22 }, { 0x1D23, 0x1D23, 0x1D23 }, { 0x1D24, 0x1D24, 0x1D24 }, { 0x1D25, 0x1D25, 0x1D25 }, { 0x1D26, 0x1D26, 0x1D26 }, { 0x1D27, 0x1D27, 0x1D27 }, { 0x1D28, 0x1D28, 0x1D28 }, { 0x1D29, 0x1D29, 0x1D29 }, { 0x1D2A, 0x1D2A, 0x1D2A }, { 0x1D2B, 0x1D2B, 0x1D2B }, { 0x1D2C, 0x1D2C, 0x1D2C }, { 0x1D2D, 0x1D2D, 0x1D2D }, { 0x1D2E, 0x1D2E, 0x1D2E }, { 0x1D2F, 0x1D2F, 0x1D2F }, { 0x1D30, 0x1D30, 0x1D30 }, { 0x1D31, 0x1D31, 0x1D31 }, { 0x1D32, 0x1D32, 0x1D32 }, { 0x1D33, 0x1D33, 0x1D33 }, { 0x1D34, 0x1D34, 0x1D34 }, { 0x1D35, 0x1D35, 0x1D35 }, { 0x1D36, 0x1D36, 0x1D36 }, { 0x1D37, 0x1D37, 0x1D37 }, { 0x1D38, 0x1D38, 0x1D38 }, { 0x1D39, 0x1D39, 0x1D39 }, { 0x1D3A, 0x1D3A, 0x1D3A }, { 0x1D3B, 0x1D3B, 0x1D3B }, { 0x1D3C, 0x1D3C, 0x1D3C }, { 0x1D3D, 0x1D3D, 0x1D3D }, { 0x1D3E, 0x1D3E, 0x1D3E }, { 0x1D3F, 0x1D3F, 0x1D3F }, { 0x1D40, 0x1D40, 0x1D40 }, { 0x1D41, 0x1D41, 0x1D41 }, { 0x1D42, 0x1D42, 0x1D42 }, { 0x1D43, 0x1D43, 0x1D43 }, { 0x1D44, 0x1D44, 0x1D44 }, { 0x1D45, 0x1D45, 0x1D45 }, { 0x1D46, 0x1D46, 0x1D46 }, { 0x1D47, 0x1D47, 0x1D47 }, { 0x1D48, 0x1D48, 0x1D48 }, { 0x1D49, 0x1D49, 0x1D49 }, { 0x1D4A, 0x1D4A, 0x1D4A }, { 0x1D4B, 0x1D4B, 0x1D4B }, { 0x1D4C, 0x1D4C, 0x1D4C }, { 0x1D4D, 0x1D4D, 0x1D4D }, { 0x1D4E, 0x1D4E, 0x1D4E }, { 0x1D4F, 0x1D4F, 0x1D4F }, { 0x1D50, 0x1D50, 0x1D50 }, { 0x1D51, 0x1D51, 0x1D51 }, { 0x1D52, 0x1D52, 0x1D52 }, { 0x1D53, 0x1D53, 0x1D53 }, { 0x1D54, 0x1D54, 0x1D54 }, { 0x1D55, 0x1D55, 0x1D55 }, { 0x1D56, 0x1D56, 0x1D56 }, { 0x1D57, 0x1D57, 0x1D57 }, { 0x1D58, 0x1D58, 0x1D58 }, { 0x1D59, 0x1D59, 0x1D59 }, { 0x1D5A, 0x1D5A, 0x1D5A }, { 0x1D5B, 0x1D5B, 0x1D5B }, { 0x1D5C, 0x1D5C, 0x1D5C }, { 0x1D5D, 0x1D5D, 0x1D5D }, { 0x1D5E, 0x1D5E, 0x1D5E }, { 0x1D5F, 0x1D5F, 0x1D5F }, { 0x1D60, 0x1D60, 0x1D60 }, { 0x1D61, 0x1D61, 0x1D61 }, { 0x1D62, 0x1D62, 0x1D62 }, { 0x1D63, 0x1D63, 0x1D63 }, { 0x1D64, 0x1D64, 0x1D64 }, { 0x1D65, 0x1D65, 0x1D65 }, { 0x1D66, 0x1D66, 0x1D66 }, { 0x1D67, 0x1D67, 0x1D67 }, { 0x1D68, 0x1D68, 0x1D68 }, { 0x1D69, 0x1D69, 0x1D69 }, { 0x1D6A, 0x1D6A, 0x1D6A }, { 0x1D6B, 0x1D6B, 0x1D6B }, { 0x1D6C, 0x1D6C, 0x1D6C }, { 0x1D6D, 0x1D6D, 0x1D6D }, { 0x1D6E, 0x1D6E, 0x1D6E }, { 0x1D6F, 0x1D6F, 0x1D6F }, { 0x1D70, 0x1D70, 0x1D70 }, { 0x1D71, 0x1D71, 0x1D71 }, { 0x1D72, 0x1D72, 0x1D72 }, { 0x1D73, 0x1D73, 0x1D73 }, { 0x1D74, 0x1D74, 0x1D74 }, { 0x1D75, 0x1D75, 0x1D75 }, { 0x1D76, 0x1D76, 0x1D76 }, { 0x1D77, 0x1D77, 0x1D77 }, { 0x1D78, 0x1D78, 0x1D78 }, { 0x1D79, 0x1D79, 0x1D79 }, { 0x1D7A, 0x1D7A, 0x1D7A }, { 0x1D7B, 0x1D7B, 0x1D7B }, { 0x1D7C, 0x1D7C, 0x1D7C }, { 0x1D7D, 0x1D7D, 0x1D7D }, { 0x1D7E, 0x1D7E, 0x1D7E }, { 0x1D7F, 0x1D7F, 0x1D7F }, { 0x1D80, 0x1D80, 0x1D80 }, { 0x1D81, 0x1D81, 0x1D81 }, { 0x1D82, 0x1D82, 0x1D82 }, { 0x1D83, 0x1D83, 0x1D83 }, { 0x1D84, 0x1D84, 0x1D84 }, { 0x1D85, 0x1D85, 0x1D85 }, { 0x1D86, 0x1D86, 0x1D86 }, { 0x1D87, 0x1D87, 0x1D87 }, { 0x1D88, 0x1D88, 0x1D88 }, { 0x1D89, 0x1D89, 0x1D89 }, { 0x1D8A, 0x1D8A, 0x1D8A }, { 0x1D8B, 0x1D8B, 0x1D8B }, { 0x1D8C, 0x1D8C, 0x1D8C }, { 0x1D8D, 0x1D8D, 0x1D8D }, { 0x1D8E, 0x1D8E, 0x1D8E }, { 0x1D8F, 0x1D8F, 0x1D8F }, { 0x1D90, 0x1D90, 0x1D90 }, { 0x1D91, 0x1D91, 0x1D91 }, { 0x1D92, 0x1D92, 0x1D92 }, { 0x1D93, 0x1D93, 0x1D93 }, { 0x1D94, 0x1D94, 0x1D94 }, { 0x1D95, 0x1D95, 0x1D95 }, { 0x1D96, 0x1D96, 0x1D96 }, { 0x1D97, 0x1D97, 0x1D97 }, { 0x1D98, 0x1D98, 0x1D98 }, { 0x1D99, 0x1D99, 0x1D99 }, { 0x1D9A, 0x1D9A, 0x1D9A }, { 0x1D9B, 0x1D9B, 0x1D9B }, { 0x1D9C, 0x1D9C, 0x1D9C }, { 0x1D9D, 0x1D9D, 0x1D9D }, { 0x1D9E, 0x1D9E, 0x1D9E }, { 0x1D9F, 0x1D9F, 0x1D9F }, { 0x1DA0, 0x1DA0, 0x1DA0 }, { 0x1DA1, 0x1DA1, 0x1DA1 }, { 0x1DA2, 0x1DA2, 0x1DA2 }, { 0x1DA3, 0x1DA3, 0x1DA3 }, { 0x1DA4, 0x1DA4, 0x1DA4 }, { 0x1DA5, 0x1DA5, 0x1DA5 }, { 0x1DA6, 0x1DA6, 0x1DA6 }, { 0x1DA7, 0x1DA7, 0x1DA7 }, { 0x1DA8, 0x1DA8, 0x1DA8 }, { 0x1DA9, 0x1DA9, 0x1DA9 }, { 0x1DAA, 0x1DAA, 0x1DAA }, { 0x1DAB, 0x1DAB, 0x1DAB }, { 0x1DAC, 0x1DAC, 0x1DAC }, { 0x1DAD, 0x1DAD, 0x1DAD }, { 0x1DAE, 0x1DAE, 0x1DAE }, { 0x1DAF, 0x1DAF, 0x1DAF }, { 0x1DB0, 0x1DB0, 0x1DB0 }, { 0x1DB1, 0x1DB1, 0x1DB1 }, { 0x1DB2, 0x1DB2, 0x1DB2 }, { 0x1DB3, 0x1DB3, 0x1DB3 }, { 0x1DB4, 0x1DB4, 0x1DB4 }, { 0x1DB5, 0x1DB5, 0x1DB5 }, { 0x1DB6, 0x1DB6, 0x1DB6 }, { 0x1DB7, 0x1DB7, 0x1DB7 }, { 0x1DB8, 0x1DB8, 0x1DB8 }, { 0x1DB9, 0x1DB9, 0x1DB9 }, { 0x1DBA, 0x1DBA, 0x1DBA }, { 0x1DBB, 0x1DBB, 0x1DBB }, { 0x1DBC, 0x1DBC, 0x1DBC }, { 0x1DBD, 0x1DBD, 0x1DBD }, { 0x1DBE, 0x1DBE, 0x1DBE }, { 0x1DBF, 0x1DBF, 0x1DBF }, { 0x1DC0, 0x1DC0, 0x1DC0 }, { 0x1DC1, 0x1DC1, 0x1DC1 }, { 0x1DC2, 0x1DC2, 0x1DC2 }, { 0x1DC3, 0x1DC3, 0x1DC3 }, { 0x1E00, 0x1E00, 0x1E01 }, { 0x1E01, 0x1E00, 0x1E01 }, { 0x1E02, 0x1E02, 0x1E03 }, { 0x1E03, 0x1E02, 0x1E03 }, { 0x1E04, 0x1E04, 0x1E05 }, { 0x1E05, 0x1E04, 0x1E05 }, { 0x1E06, 0x1E06, 0x1E07 }, { 0x1E07, 0x1E06, 0x1E07 }, { 0x1E08, 0x1E08, 0x1E09 }, { 0x1E09, 0x1E08, 0x1E09 }, { 0x1E0A, 0x1E0A, 0x1E0B }, { 0x1E0B, 0x1E0A, 0x1E0B }, { 0x1E0C, 0x1E0C, 0x1E0D }, { 0x1E0D, 0x1E0C, 0x1E0D }, { 0x1E0E, 0x1E0E, 0x1E0F }, { 0x1E0F, 0x1E0E, 0x1E0F }, { 0x1E10, 0x1E10, 0x1E11 }, { 0x1E11, 0x1E10, 0x1E11 }, { 0x1E12, 0x1E12, 0x1E13 }, { 0x1E13, 0x1E12, 0x1E13 }, { 0x1E14, 0x1E14, 0x1E15 }, { 0x1E15, 0x1E14, 0x1E15 }, { 0x1E16, 0x1E16, 0x1E17 }, { 0x1E17, 0x1E16, 0x1E17 }, { 0x1E18, 0x1E18, 0x1E19 }, { 0x1E19, 0x1E18, 0x1E19 }, { 0x1E1A, 0x1E1A, 0x1E1B }, { 0x1E1B, 0x1E1A, 0x1E1B }, { 0x1E1C, 0x1E1C, 0x1E1D }, { 0x1E1D, 0x1E1C, 0x1E1D }, { 0x1E1E, 0x1E1E, 0x1E1F }, { 0x1E1F, 0x1E1E, 0x1E1F }, { 0x1E20, 0x1E20, 0x1E21 }, { 0x1E21, 0x1E20, 0x1E21 }, { 0x1E22, 0x1E22, 0x1E23 }, { 0x1E23, 0x1E22, 0x1E23 }, { 0x1E24, 0x1E24, 0x1E25 }, { 0x1E25, 0x1E24, 0x1E25 }, { 0x1E26, 0x1E26, 0x1E27 }, { 0x1E27, 0x1E26, 0x1E27 }, { 0x1E28, 0x1E28, 0x1E29 }, { 0x1E29, 0x1E28, 0x1E29 }, { 0x1E2A, 0x1E2A, 0x1E2B }, { 0x1E2B, 0x1E2A, 0x1E2B }, { 0x1E2C, 0x1E2C, 0x1E2D }, { 0x1E2D, 0x1E2C, 0x1E2D }, { 0x1E2E, 0x1E2E, 0x1E2F }, { 0x1E2F, 0x1E2E, 0x1E2F }, { 0x1E30, 0x1E30, 0x1E31 }, { 0x1E31, 0x1E30, 0x1E31 }, { 0x1E32, 0x1E32, 0x1E33 }, { 0x1E33, 0x1E32, 0x1E33 }, { 0x1E34, 0x1E34, 0x1E35 }, { 0x1E35, 0x1E34, 0x1E35 }, { 0x1E36, 0x1E36, 0x1E37 }, { 0x1E37, 0x1E36, 0x1E37 }, { 0x1E38, 0x1E38, 0x1E39 }, { 0x1E39, 0x1E38, 0x1E39 }, { 0x1E3A, 0x1E3A, 0x1E3B }, { 0x1E3B, 0x1E3A, 0x1E3B }, { 0x1E3C, 0x1E3C, 0x1E3D }, { 0x1E3D, 0x1E3C, 0x1E3D }, { 0x1E3E, 0x1E3E, 0x1E3F }, { 0x1E3F, 0x1E3E, 0x1E3F }, { 0x1E40, 0x1E40, 0x1E41 }, { 0x1E41, 0x1E40, 0x1E41 }, { 0x1E42, 0x1E42, 0x1E43 }, { 0x1E43, 0x1E42, 0x1E43 }, { 0x1E44, 0x1E44, 0x1E45 }, { 0x1E45, 0x1E44, 0x1E45 }, { 0x1E46, 0x1E46, 0x1E47 }, { 0x1E47, 0x1E46, 0x1E47 }, { 0x1E48, 0x1E48, 0x1E49 }, { 0x1E49, 0x1E48, 0x1E49 }, { 0x1E4A, 0x1E4A, 0x1E4B }, { 0x1E4B, 0x1E4A, 0x1E4B }, { 0x1E4C, 0x1E4C, 0x1E4D }, { 0x1E4D, 0x1E4C, 0x1E4D }, { 0x1E4E, 0x1E4E, 0x1E4F }, { 0x1E4F, 0x1E4E, 0x1E4F }, { 0x1E50, 0x1E50, 0x1E51 }, { 0x1E51, 0x1E50, 0x1E51 }, { 0x1E52, 0x1E52, 0x1E53 }, { 0x1E53, 0x1E52, 0x1E53 }, { 0x1E54, 0x1E54, 0x1E55 }, { 0x1E55, 0x1E54, 0x1E55 }, { 0x1E56, 0x1E56, 0x1E57 }, { 0x1E57, 0x1E56, 0x1E57 }, { 0x1E58, 0x1E58, 0x1E59 }, { 0x1E59, 0x1E58, 0x1E59 }, { 0x1E5A, 0x1E5A, 0x1E5B }, { 0x1E5B, 0x1E5A, 0x1E5B }, { 0x1E5C, 0x1E5C, 0x1E5D }, { 0x1E5D, 0x1E5C, 0x1E5D }, { 0x1E5E, 0x1E5E, 0x1E5F }, { 0x1E5F, 0x1E5E, 0x1E5F }, { 0x1E60, 0x1E60, 0x1E61 }, { 0x1E61, 0x1E60, 0x1E61 }, { 0x1E62, 0x1E62, 0x1E63 }, { 0x1E63, 0x1E62, 0x1E63 }, { 0x1E64, 0x1E64, 0x1E65 }, { 0x1E65, 0x1E64, 0x1E65 }, { 0x1E66, 0x1E66, 0x1E67 }, { 0x1E67, 0x1E66, 0x1E67 }, { 0x1E68, 0x1E68, 0x1E69 }, { 0x1E69, 0x1E68, 0x1E69 }, { 0x1E6A, 0x1E6A, 0x1E6B }, { 0x1E6B, 0x1E6A, 0x1E6B }, { 0x1E6C, 0x1E6C, 0x1E6D }, { 0x1E6D, 0x1E6C, 0x1E6D }, { 0x1E6E, 0x1E6E, 0x1E6F }, { 0x1E6F, 0x1E6E, 0x1E6F }, { 0x1E70, 0x1E70, 0x1E71 }, { 0x1E71, 0x1E70, 0x1E71 }, { 0x1E72, 0x1E72, 0x1E73 }, { 0x1E73, 0x1E72, 0x1E73 }, { 0x1E74, 0x1E74, 0x1E75 }, { 0x1E75, 0x1E74, 0x1E75 }, { 0x1E76, 0x1E76, 0x1E77 }, { 0x1E77, 0x1E76, 0x1E77 }, { 0x1E78, 0x1E78, 0x1E79 }, { 0x1E79, 0x1E78, 0x1E79 }, { 0x1E7A, 0x1E7A, 0x1E7B }, { 0x1E7B, 0x1E7A, 0x1E7B }, { 0x1E7C, 0x1E7C, 0x1E7D }, { 0x1E7D, 0x1E7C, 0x1E7D }, { 0x1E7E, 0x1E7E, 0x1E7F }, { 0x1E7F, 0x1E7E, 0x1E7F }, { 0x1E80, 0x1E80, 0x1E81 }, { 0x1E81, 0x1E80, 0x1E81 }, { 0x1E82, 0x1E82, 0x1E83 }, { 0x1E83, 0x1E82, 0x1E83 }, { 0x1E84, 0x1E84, 0x1E85 }, { 0x1E85, 0x1E84, 0x1E85 }, { 0x1E86, 0x1E86, 0x1E87 }, { 0x1E87, 0x1E86, 0x1E87 }, { 0x1E88, 0x1E88, 0x1E89 }, { 0x1E89, 0x1E88, 0x1E89 }, { 0x1E8A, 0x1E8A, 0x1E8B }, { 0x1E8B, 0x1E8A, 0x1E8B }, { 0x1E8C, 0x1E8C, 0x1E8D }, { 0x1E8D, 0x1E8C, 0x1E8D }, { 0x1E8E, 0x1E8E, 0x1E8F }, { 0x1E8F, 0x1E8E, 0x1E8F }, { 0x1E90, 0x1E90, 0x1E91 }, { 0x1E91, 0x1E90, 0x1E91 }, { 0x1E92, 0x1E92, 0x1E93 }, { 0x1E93, 0x1E92, 0x1E93 }, { 0x1E94, 0x1E94, 0x1E95 }, { 0x1E95, 0x1E94, 0x1E95 }, { 0x1E96, 0x1E96, 0x1E96 }, { 0x1E97, 0x1E97, 0x1E97 }, { 0x1E98, 0x1E98, 0x1E98 }, { 0x1E99, 0x1E99, 0x1E99 }, { 0x1E9A, 0x1E9A, 0x1E9A }, { 0x1E9B, 0x1E60, 0x1E9B }, { 0x1EA0, 0x1EA0, 0x1EA1 }, { 0x1EA1, 0x1EA0, 0x1EA1 }, { 0x1EA2, 0x1EA2, 0x1EA3 }, { 0x1EA3, 0x1EA2, 0x1EA3 }, { 0x1EA4, 0x1EA4, 0x1EA5 }, { 0x1EA5, 0x1EA4, 0x1EA5 }, { 0x1EA6, 0x1EA6, 0x1EA7 }, { 0x1EA7, 0x1EA6, 0x1EA7 }, { 0x1EA8, 0x1EA8, 0x1EA9 }, { 0x1EA9, 0x1EA8, 0x1EA9 }, { 0x1EAA, 0x1EAA, 0x1EAB }, { 0x1EAB, 0x1EAA, 0x1EAB }, { 0x1EAC, 0x1EAC, 0x1EAD }, { 0x1EAD, 0x1EAC, 0x1EAD }, { 0x1EAE, 0x1EAE, 0x1EAF }, { 0x1EAF, 0x1EAE, 0x1EAF }, { 0x1EB0, 0x1EB0, 0x1EB1 }, { 0x1EB1, 0x1EB0, 0x1EB1 }, { 0x1EB2, 0x1EB2, 0x1EB3 }, { 0x1EB3, 0x1EB2, 0x1EB3 }, { 0x1EB4, 0x1EB4, 0x1EB5 }, { 0x1EB5, 0x1EB4, 0x1EB5 }, { 0x1EB6, 0x1EB6, 0x1EB7 }, { 0x1EB7, 0x1EB6, 0x1EB7 }, { 0x1EB8, 0x1EB8, 0x1EB9 }, { 0x1EB9, 0x1EB8, 0x1EB9 }, { 0x1EBA, 0x1EBA, 0x1EBB }, { 0x1EBB, 0x1EBA, 0x1EBB }, { 0x1EBC, 0x1EBC, 0x1EBD }, { 0x1EBD, 0x1EBC, 0x1EBD }, { 0x1EBE, 0x1EBE, 0x1EBF }, { 0x1EBF, 0x1EBE, 0x1EBF }, { 0x1EC0, 0x1EC0, 0x1EC1 }, { 0x1EC1, 0x1EC0, 0x1EC1 }, { 0x1EC2, 0x1EC2, 0x1EC3 }, { 0x1EC3, 0x1EC2, 0x1EC3 }, { 0x1EC4, 0x1EC4, 0x1EC5 }, { 0x1EC5, 0x1EC4, 0x1EC5 }, { 0x1EC6, 0x1EC6, 0x1EC7 }, { 0x1EC7, 0x1EC6, 0x1EC7 }, { 0x1EC8, 0x1EC8, 0x1EC9 }, { 0x1EC9, 0x1EC8, 0x1EC9 }, { 0x1ECA, 0x1ECA, 0x1ECB }, { 0x1ECB, 0x1ECA, 0x1ECB }, { 0x1ECC, 0x1ECC, 0x1ECD }, { 0x1ECD, 0x1ECC, 0x1ECD }, { 0x1ECE, 0x1ECE, 0x1ECF }, { 0x1ECF, 0x1ECE, 0x1ECF }, { 0x1ED0, 0x1ED0, 0x1ED1 }, { 0x1ED1, 0x1ED0, 0x1ED1 }, { 0x1ED2, 0x1ED2, 0x1ED3 }, { 0x1ED3, 0x1ED2, 0x1ED3 }, { 0x1ED4, 0x1ED4, 0x1ED5 }, { 0x1ED5, 0x1ED4, 0x1ED5 }, { 0x1ED6, 0x1ED6, 0x1ED7 }, { 0x1ED7, 0x1ED6, 0x1ED7 }, { 0x1ED8, 0x1ED8, 0x1ED9 }, { 0x1ED9, 0x1ED8, 0x1ED9 }, { 0x1EDA, 0x1EDA, 0x1EDB }, { 0x1EDB, 0x1EDA, 0x1EDB }, { 0x1EDC, 0x1EDC, 0x1EDD }, { 0x1EDD, 0x1EDC, 0x1EDD }, { 0x1EDE, 0x1EDE, 0x1EDF }, { 0x1EDF, 0x1EDE, 0x1EDF }, { 0x1EE0, 0x1EE0, 0x1EE1 }, { 0x1EE1, 0x1EE0, 0x1EE1 }, { 0x1EE2, 0x1EE2, 0x1EE3 }, { 0x1EE3, 0x1EE2, 0x1EE3 }, { 0x1EE4, 0x1EE4, 0x1EE5 }, { 0x1EE5, 0x1EE4, 0x1EE5 }, { 0x1EE6, 0x1EE6, 0x1EE7 }, { 0x1EE7, 0x1EE6, 0x1EE7 }, { 0x1EE8, 0x1EE8, 0x1EE9 }, { 0x1EE9, 0x1EE8, 0x1EE9 }, { 0x1EEA, 0x1EEA, 0x1EEB }, { 0x1EEB, 0x1EEA, 0x1EEB }, { 0x1EEC, 0x1EEC, 0x1EED }, { 0x1EED, 0x1EEC, 0x1EED }, { 0x1EEE, 0x1EEE, 0x1EEF }, { 0x1EEF, 0x1EEE, 0x1EEF }, { 0x1EF0, 0x1EF0, 0x1EF1 }, { 0x1EF1, 0x1EF0, 0x1EF1 }, { 0x1EF2, 0x1EF2, 0x1EF3 }, { 0x1EF3, 0x1EF2, 0x1EF3 }, { 0x1EF4, 0x1EF4, 0x1EF5 }, { 0x1EF5, 0x1EF4, 0x1EF5 }, { 0x1EF6, 0x1EF6, 0x1EF7 }, { 0x1EF7, 0x1EF6, 0x1EF7 }, { 0x1EF8, 0x1EF8, 0x1EF9 }, { 0x1EF9, 0x1EF8, 0x1EF9 }, { 0x1F00, 0x1F08, 0x1F00 }, { 0x1F01, 0x1F09, 0x1F01 }, { 0x1F02, 0x1F0A, 0x1F02 }, { 0x1F03, 0x1F0B, 0x1F03 }, { 0x1F04, 0x1F0C, 0x1F04 }, { 0x1F05, 0x1F0D, 0x1F05 }, { 0x1F06, 0x1F0E, 0x1F06 }, { 0x1F07, 0x1F0F, 0x1F07 }, { 0x1F08, 0x1F08, 0x1F00 }, { 0x1F09, 0x1F09, 0x1F01 }, { 0x1F0A, 0x1F0A, 0x1F02 }, { 0x1F0B, 0x1F0B, 0x1F03 }, { 0x1F0C, 0x1F0C, 0x1F04 }, { 0x1F0D, 0x1F0D, 0x1F05 }, { 0x1F0E, 0x1F0E, 0x1F06 }, { 0x1F0F, 0x1F0F, 0x1F07 }, { 0x1F10, 0x1F18, 0x1F10 }, { 0x1F11, 0x1F19, 0x1F11 }, { 0x1F12, 0x1F1A, 0x1F12 }, { 0x1F13, 0x1F1B, 0x1F13 }, { 0x1F14, 0x1F1C, 0x1F14 }, { 0x1F15, 0x1F1D, 0x1F15 }, { 0x1F18, 0x1F18, 0x1F10 }, { 0x1F19, 0x1F19, 0x1F11 }, { 0x1F1A, 0x1F1A, 0x1F12 }, { 0x1F1B, 0x1F1B, 0x1F13 }, { 0x1F1C, 0x1F1C, 0x1F14 }, { 0x1F1D, 0x1F1D, 0x1F15 }, { 0x1F20, 0x1F28, 0x1F20 }, { 0x1F21, 0x1F29, 0x1F21 }, { 0x1F22, 0x1F2A, 0x1F22 }, { 0x1F23, 0x1F2B, 0x1F23 }, { 0x1F24, 0x1F2C, 0x1F24 }, { 0x1F25, 0x1F2D, 0x1F25 }, { 0x1F26, 0x1F2E, 0x1F26 }, { 0x1F27, 0x1F2F, 0x1F27 }, { 0x1F28, 0x1F28, 0x1F20 }, { 0x1F29, 0x1F29, 0x1F21 }, { 0x1F2A, 0x1F2A, 0x1F22 }, { 0x1F2B, 0x1F2B, 0x1F23 }, { 0x1F2C, 0x1F2C, 0x1F24 }, { 0x1F2D, 0x1F2D, 0x1F25 }, { 0x1F2E, 0x1F2E, 0x1F26 }, { 0x1F2F, 0x1F2F, 0x1F27 }, { 0x1F30, 0x1F38, 0x1F30 }, { 0x1F31, 0x1F39, 0x1F31 }, { 0x1F32, 0x1F3A, 0x1F32 }, { 0x1F33, 0x1F3B, 0x1F33 }, { 0x1F34, 0x1F3C, 0x1F34 }, { 0x1F35, 0x1F3D, 0x1F35 }, { 0x1F36, 0x1F3E, 0x1F36 }, { 0x1F37, 0x1F3F, 0x1F37 }, { 0x1F38, 0x1F38, 0x1F30 }, { 0x1F39, 0x1F39, 0x1F31 }, { 0x1F3A, 0x1F3A, 0x1F32 }, { 0x1F3B, 0x1F3B, 0x1F33 }, { 0x1F3C, 0x1F3C, 0x1F34 }, { 0x1F3D, 0x1F3D, 0x1F35 }, { 0x1F3E, 0x1F3E, 0x1F36 }, { 0x1F3F, 0x1F3F, 0x1F37 }, { 0x1F40, 0x1F48, 0x1F40 }, { 0x1F41, 0x1F49, 0x1F41 }, { 0x1F42, 0x1F4A, 0x1F42 }, { 0x1F43, 0x1F4B, 0x1F43 }, { 0x1F44, 0x1F4C, 0x1F44 }, { 0x1F45, 0x1F4D, 0x1F45 }, { 0x1F48, 0x1F48, 0x1F40 }, { 0x1F49, 0x1F49, 0x1F41 }, { 0x1F4A, 0x1F4A, 0x1F42 }, { 0x1F4B, 0x1F4B, 0x1F43 }, { 0x1F4C, 0x1F4C, 0x1F44 }, { 0x1F4D, 0x1F4D, 0x1F45 }, { 0x1F50, 0x1F50, 0x1F50 }, { 0x1F51, 0x1F59, 0x1F51 }, { 0x1F52, 0x1F52, 0x1F52 }, { 0x1F53, 0x1F5B, 0x1F53 }, { 0x1F54, 0x1F54, 0x1F54 }, { 0x1F55, 0x1F5D, 0x1F55 }, { 0x1F56, 0x1F56, 0x1F56 }, { 0x1F57, 0x1F5F, 0x1F57 }, { 0x1F59, 0x1F59, 0x1F51 }, { 0x1F5B, 0x1F5B, 0x1F53 }, { 0x1F5D, 0x1F5D, 0x1F55 }, { 0x1F5F, 0x1F5F, 0x1F57 }, { 0x1F60, 0x1F68, 0x1F60 }, { 0x1F61, 0x1F69, 0x1F61 }, { 0x1F62, 0x1F6A, 0x1F62 }, { 0x1F63, 0x1F6B, 0x1F63 }, { 0x1F64, 0x1F6C, 0x1F64 }, { 0x1F65, 0x1F6D, 0x1F65 }, { 0x1F66, 0x1F6E, 0x1F66 }, { 0x1F67, 0x1F6F, 0x1F67 }, { 0x1F68, 0x1F68, 0x1F60 }, { 0x1F69, 0x1F69, 0x1F61 }, { 0x1F6A, 0x1F6A, 0x1F62 }, { 0x1F6B, 0x1F6B, 0x1F63 }, { 0x1F6C, 0x1F6C, 0x1F64 }, { 0x1F6D, 0x1F6D, 0x1F65 }, { 0x1F6E, 0x1F6E, 0x1F66 }, { 0x1F6F, 0x1F6F, 0x1F67 }, { 0x1F70, 0x1FBA, 0x1F70 }, { 0x1F71, 0x1FBB, 0x1F71 }, { 0x1F72, 0x1FC8, 0x1F72 }, { 0x1F73, 0x1FC9, 0x1F73 }, { 0x1F74, 0x1FCA, 0x1F74 }, { 0x1F75, 0x1FCB, 0x1F75 }, { 0x1F76, 0x1FDA, 0x1F76 }, { 0x1F77, 0x1FDB, 0x1F77 }, { 0x1F78, 0x1FF8, 0x1F78 }, { 0x1F79, 0x1FF9, 0x1F79 }, { 0x1F7A, 0x1FEA, 0x1F7A }, { 0x1F7B, 0x1FEB, 0x1F7B }, { 0x1F7C, 0x1FFA, 0x1F7C }, { 0x1F7D, 0x1FFB, 0x1F7D }, { 0x1F80, 0x1F88, 0x1F80 }, { 0x1F81, 0x1F89, 0x1F81 }, { 0x1F82, 0x1F8A, 0x1F82 }, { 0x1F83, 0x1F8B, 0x1F83 }, { 0x1F84, 0x1F8C, 0x1F84 }, { 0x1F85, 0x1F8D, 0x1F85 }, { 0x1F86, 0x1F8E, 0x1F86 }, { 0x1F87, 0x1F8F, 0x1F87 }, { 0x1F88, 0x1F88, 0x1F80 }, { 0x1F89, 0x1F89, 0x1F81 }, { 0x1F8A, 0x1F8A, 0x1F82 }, { 0x1F8B, 0x1F8B, 0x1F83 }, { 0x1F8C, 0x1F8C, 0x1F84 }, { 0x1F8D, 0x1F8D, 0x1F85 }, { 0x1F8E, 0x1F8E, 0x1F86 }, { 0x1F8F, 0x1F8F, 0x1F87 }, { 0x1F90, 0x1F98, 0x1F90 }, { 0x1F91, 0x1F99, 0x1F91 }, { 0x1F92, 0x1F9A, 0x1F92 }, { 0x1F93, 0x1F9B, 0x1F93 }, { 0x1F94, 0x1F9C, 0x1F94 }, { 0x1F95, 0x1F9D, 0x1F95 }, { 0x1F96, 0x1F9E, 0x1F96 }, { 0x1F97, 0x1F9F, 0x1F97 }, { 0x1F98, 0x1F98, 0x1F90 }, { 0x1F99, 0x1F99, 0x1F91 }, { 0x1F9A, 0x1F9A, 0x1F92 }, { 0x1F9B, 0x1F9B, 0x1F93 }, { 0x1F9C, 0x1F9C, 0x1F94 }, { 0x1F9D, 0x1F9D, 0x1F95 }, { 0x1F9E, 0x1F9E, 0x1F96 }, { 0x1F9F, 0x1F9F, 0x1F97 }, { 0x1FA0, 0x1FA8, 0x1FA0 }, { 0x1FA1, 0x1FA9, 0x1FA1 }, { 0x1FA2, 0x1FAA, 0x1FA2 }, { 0x1FA3, 0x1FAB, 0x1FA3 }, { 0x1FA4, 0x1FAC, 0x1FA4 }, { 0x1FA5, 0x1FAD, 0x1FA5 }, { 0x1FA6, 0x1FAE, 0x1FA6 }, { 0x1FA7, 0x1FAF, 0x1FA7 }, { 0x1FA8, 0x1FA8, 0x1FA0 }, { 0x1FA9, 0x1FA9, 0x1FA1 }, { 0x1FAA, 0x1FAA, 0x1FA2 }, { 0x1FAB, 0x1FAB, 0x1FA3 }, { 0x1FAC, 0x1FAC, 0x1FA4 }, { 0x1FAD, 0x1FAD, 0x1FA5 }, { 0x1FAE, 0x1FAE, 0x1FA6 }, { 0x1FAF, 0x1FAF, 0x1FA7 }, { 0x1FB0, 0x1FB8, 0x1FB0 }, { 0x1FB1, 0x1FB9, 0x1FB1 }, { 0x1FB2, 0x1FB2, 0x1FB2 }, { 0x1FB3, 0x1FBC, 0x1FB3 }, { 0x1FB4, 0x1FB4, 0x1FB4 }, { 0x1FB6, 0x1FB6, 0x1FB6 }, { 0x1FB7, 0x1FB7, 0x1FB7 }, { 0x1FB8, 0x1FB8, 0x1FB0 }, { 0x1FB9, 0x1FB9, 0x1FB1 }, { 0x1FBA, 0x1FBA, 0x1F70 }, { 0x1FBB, 0x1FBB, 0x1F71 }, { 0x1FBC, 0x1FBC, 0x1FB3 }, { 0x1FBE, 0x0399, 0x1FBE }, { 0x1FC2, 0x1FC2, 0x1FC2 }, { 0x1FC3, 0x1FCC, 0x1FC3 }, { 0x1FC4, 0x1FC4, 0x1FC4 }, { 0x1FC6, 0x1FC6, 0x1FC6 }, { 0x1FC7, 0x1FC7, 0x1FC7 }, { 0x1FC8, 0x1FC8, 0x1F72 }, { 0x1FC9, 0x1FC9, 0x1F73 }, { 0x1FCA, 0x1FCA, 0x1F74 }, { 0x1FCB, 0x1FCB, 0x1F75 }, { 0x1FCC, 0x1FCC, 0x1FC3 }, { 0x1FD0, 0x1FD8, 0x1FD0 }, { 0x1FD1, 0x1FD9, 0x1FD1 }, { 0x1FD2, 0x1FD2, 0x1FD2 }, { 0x1FD3, 0x1FD3, 0x1FD3 }, { 0x1FD6, 0x1FD6, 0x1FD6 }, { 0x1FD7, 0x1FD7, 0x1FD7 }, { 0x1FD8, 0x1FD8, 0x1FD0 }, { 0x1FD9, 0x1FD9, 0x1FD1 }, { 0x1FDA, 0x1FDA, 0x1F76 }, { 0x1FDB, 0x1FDB, 0x1F77 }, { 0x1FE0, 0x1FE8, 0x1FE0 }, { 0x1FE1, 0x1FE9, 0x1FE1 }, { 0x1FE2, 0x1FE2, 0x1FE2 }, { 0x1FE3, 0x1FE3, 0x1FE3 }, { 0x1FE4, 0x1FE4, 0x1FE4 }, { 0x1FE5, 0x1FEC, 0x1FE5 }, { 0x1FE6, 0x1FE6, 0x1FE6 }, { 0x1FE7, 0x1FE7, 0x1FE7 }, { 0x1FE8, 0x1FE8, 0x1FE0 }, { 0x1FE9, 0x1FE9, 0x1FE1 }, { 0x1FEA, 0x1FEA, 0x1F7A }, { 0x1FEB, 0x1FEB, 0x1F7B }, { 0x1FEC, 0x1FEC, 0x1FE5 }, { 0x1FF2, 0x1FF2, 0x1FF2 }, { 0x1FF3, 0x1FFC, 0x1FF3 }, { 0x1FF4, 0x1FF4, 0x1FF4 }, { 0x1FF6, 0x1FF6, 0x1FF6 }, { 0x1FF7, 0x1FF7, 0x1FF7 }, { 0x1FF8, 0x1FF8, 0x1F78 }, { 0x1FF9, 0x1FF9, 0x1F79 }, { 0x1FFA, 0x1FFA, 0x1F7C }, { 0x1FFB, 0x1FFB, 0x1F7D }, { 0x1FFC, 0x1FFC, 0x1FF3 }, { 0x2071, 0x2071, 0x2071 }, { 0x207F, 0x207F, 0x207F }, { 0x2090, 0x2090, 0x2090 }, { 0x2091, 0x2091, 0x2091 }, { 0x2092, 0x2092, 0x2092 }, { 0x2093, 0x2093, 0x2093 }, { 0x2094, 0x2094, 0x2094 }, { 0x20D0, 0x20D0, 0x20D0 }, { 0x20D1, 0x20D1, 0x20D1 }, { 0x20D2, 0x20D2, 0x20D2 }, { 0x20D3, 0x20D3, 0x20D3 }, { 0x20D4, 0x20D4, 0x20D4 }, { 0x20D5, 0x20D5, 0x20D5 }, { 0x20D6, 0x20D6, 0x20D6 }, { 0x20D7, 0x20D7, 0x20D7 }, { 0x20D8, 0x20D8, 0x20D8 }, { 0x20D9, 0x20D9, 0x20D9 }, { 0x20DA, 0x20DA, 0x20DA }, { 0x20DB, 0x20DB, 0x20DB }, { 0x20DC, 0x20DC, 0x20DC }, { 0x20E1, 0x20E1, 0x20E1 }, { 0x20E5, 0x20E5, 0x20E5 }, { 0x20E6, 0x20E6, 0x20E6 }, { 0x20E7, 0x20E7, 0x20E7 }, { 0x20E8, 0x20E8, 0x20E8 }, { 0x20E9, 0x20E9, 0x20E9 }, { 0x20EA, 0x20EA, 0x20EA }, { 0x20EB, 0x20EB, 0x20EB }, { 0x2102, 0x2102, 0x2102 }, { 0x2107, 0x2107, 0x2107 }, { 0x210A, 0x210A, 0x210A }, { 0x210B, 0x210B, 0x210B }, { 0x210C, 0x210C, 0x210C }, { 0x210D, 0x210D, 0x210D }, { 0x210E, 0x210E, 0x210E }, { 0x210F, 0x210F, 0x210F }, { 0x2110, 0x2110, 0x2110 }, { 0x2111, 0x2111, 0x2111 }, { 0x2112, 0x2112, 0x2112 }, { 0x2113, 0x2113, 0x2113 }, { 0x2115, 0x2115, 0x2115 }, { 0x2119, 0x2119, 0x2119 }, { 0x211A, 0x211A, 0x211A }, { 0x211B, 0x211B, 0x211B }, { 0x211C, 0x211C, 0x211C }, { 0x211D, 0x211D, 0x211D }, { 0x2124, 0x2124, 0x2124 }, { 0x2126, 0x2126, 0x03C9 }, { 0x2128, 0x2128, 0x2128 }, { 0x212A, 0x212A, 0x006B }, { 0x212B, 0x212B, 0x00E5 }, { 0x212C, 0x212C, 0x212C }, { 0x212D, 0x212D, 0x212D }, { 0x212F, 0x212F, 0x212F }, { 0x2130, 0x2130, 0x2130 }, { 0x2131, 0x2131, 0x2131 }, { 0x2133, 0x2133, 0x2133 }, { 0x2134, 0x2134, 0x2134 }, { 0x2135, 0x2135, 0x2135 }, { 0x2136, 0x2136, 0x2136 }, { 0x2137, 0x2137, 0x2137 }, { 0x2138, 0x2138, 0x2138 }, { 0x2139, 0x2139, 0x2139 }, { 0x213C, 0x213C, 0x213C }, { 0x213D, 0x213D, 0x213D }, { 0x213E, 0x213E, 0x213E }, { 0x213F, 0x213F, 0x213F }, { 0x2145, 0x2145, 0x2145 }, { 0x2146, 0x2146, 0x2146 }, { 0x2147, 0x2147, 0x2147 }, { 0x2148, 0x2148, 0x2148 }, { 0x2149, 0x2149, 0x2149 }, { 0x2C00, 0x2C00, 0x2C30 }, { 0x2C01, 0x2C01, 0x2C31 }, { 0x2C02, 0x2C02, 0x2C32 }, { 0x2C03, 0x2C03, 0x2C33 }, { 0x2C04, 0x2C04, 0x2C34 }, { 0x2C05, 0x2C05, 0x2C35 }, { 0x2C06, 0x2C06, 0x2C36 }, { 0x2C07, 0x2C07, 0x2C37 }, { 0x2C08, 0x2C08, 0x2C38 }, { 0x2C09, 0x2C09, 0x2C39 }, { 0x2C0A, 0x2C0A, 0x2C3A }, { 0x2C0B, 0x2C0B, 0x2C3B }, { 0x2C0C, 0x2C0C, 0x2C3C }, { 0x2C0D, 0x2C0D, 0x2C3D }, { 0x2C0E, 0x2C0E, 0x2C3E }, { 0x2C0F, 0x2C0F, 0x2C3F }, { 0x2C10, 0x2C10, 0x2C40 }, { 0x2C11, 0x2C11, 0x2C41 }, { 0x2C12, 0x2C12, 0x2C42 }, { 0x2C13, 0x2C13, 0x2C43 }, { 0x2C14, 0x2C14, 0x2C44 }, { 0x2C15, 0x2C15, 0x2C45 }, { 0x2C16, 0x2C16, 0x2C46 }, { 0x2C17, 0x2C17, 0x2C47 }, { 0x2C18, 0x2C18, 0x2C48 }, { 0x2C19, 0x2C19, 0x2C49 }, { 0x2C1A, 0x2C1A, 0x2C4A }, { 0x2C1B, 0x2C1B, 0x2C4B }, { 0x2C1C, 0x2C1C, 0x2C4C }, { 0x2C1D, 0x2C1D, 0x2C4D }, { 0x2C1E, 0x2C1E, 0x2C4E }, { 0x2C1F, 0x2C1F, 0x2C4F }, { 0x2C20, 0x2C20, 0x2C50 }, { 0x2C21, 0x2C21, 0x2C51 }, { 0x2C22, 0x2C22, 0x2C52 }, { 0x2C23, 0x2C23, 0x2C53 }, { 0x2C24, 0x2C24, 0x2C54 }, { 0x2C25, 0x2C25, 0x2C55 }, { 0x2C26, 0x2C26, 0x2C56 }, { 0x2C27, 0x2C27, 0x2C57 }, { 0x2C28, 0x2C28, 0x2C58 }, { 0x2C29, 0x2C29, 0x2C59 }, { 0x2C2A, 0x2C2A, 0x2C5A }, { 0x2C2B, 0x2C2B, 0x2C5B }, { 0x2C2C, 0x2C2C, 0x2C5C }, { 0x2C2D, 0x2C2D, 0x2C5D }, { 0x2C2E, 0x2C2E, 0x2C5E }, { 0x2C30, 0x2C00, 0x2C30 }, { 0x2C31, 0x2C01, 0x2C31 }, { 0x2C32, 0x2C02, 0x2C32 }, { 0x2C33, 0x2C03, 0x2C33 }, { 0x2C34, 0x2C04, 0x2C34 }, { 0x2C35, 0x2C05, 0x2C35 }, { 0x2C36, 0x2C06, 0x2C36 }, { 0x2C37, 0x2C07, 0x2C37 }, { 0x2C38, 0x2C08, 0x2C38 }, { 0x2C39, 0x2C09, 0x2C39 }, { 0x2C3A, 0x2C0A, 0x2C3A }, { 0x2C3B, 0x2C0B, 0x2C3B }, { 0x2C3C, 0x2C0C, 0x2C3C }, { 0x2C3D, 0x2C0D, 0x2C3D }, { 0x2C3E, 0x2C0E, 0x2C3E }, { 0x2C3F, 0x2C0F, 0x2C3F }, { 0x2C40, 0x2C10, 0x2C40 }, { 0x2C41, 0x2C11, 0x2C41 }, { 0x2C42, 0x2C12, 0x2C42 }, { 0x2C43, 0x2C13, 0x2C43 }, { 0x2C44, 0x2C14, 0x2C44 }, { 0x2C45, 0x2C15, 0x2C45 }, { 0x2C46, 0x2C16, 0x2C46 }, { 0x2C47, 0x2C17, 0x2C47 }, { 0x2C48, 0x2C18, 0x2C48 }, { 0x2C49, 0x2C19, 0x2C49 }, { 0x2C4A, 0x2C1A, 0x2C4A }, { 0x2C4B, 0x2C1B, 0x2C4B }, { 0x2C4C, 0x2C1C, 0x2C4C }, { 0x2C4D, 0x2C1D, 0x2C4D }, { 0x2C4E, 0x2C1E, 0x2C4E }, { 0x2C4F, 0x2C1F, 0x2C4F }, { 0x2C50, 0x2C20, 0x2C50 }, { 0x2C51, 0x2C21, 0x2C51 }, { 0x2C52, 0x2C22, 0x2C52 }, { 0x2C53, 0x2C23, 0x2C53 }, { 0x2C54, 0x2C24, 0x2C54 }, { 0x2C55, 0x2C25, 0x2C55 }, { 0x2C56, 0x2C26, 0x2C56 }, { 0x2C57, 0x2C27, 0x2C57 }, { 0x2C58, 0x2C28, 0x2C58 }, { 0x2C59, 0x2C29, 0x2C59 }, { 0x2C5A, 0x2C2A, 0x2C5A }, { 0x2C5B, 0x2C2B, 0x2C5B }, { 0x2C5C, 0x2C2C, 0x2C5C }, { 0x2C5D, 0x2C2D, 0x2C5D }, { 0x2C5E, 0x2C2E, 0x2C5E }, { 0x2C80, 0x2C80, 0x2C81 }, { 0x2C81, 0x2C80, 0x2C81 }, { 0x2C82, 0x2C82, 0x2C83 }, { 0x2C83, 0x2C82, 0x2C83 }, { 0x2C84, 0x2C84, 0x2C85 }, { 0x2C85, 0x2C84, 0x2C85 }, { 0x2C86, 0x2C86, 0x2C87 }, { 0x2C87, 0x2C86, 0x2C87 }, { 0x2C88, 0x2C88, 0x2C89 }, { 0x2C89, 0x2C88, 0x2C89 }, { 0x2C8A, 0x2C8A, 0x2C8B }, { 0x2C8B, 0x2C8A, 0x2C8B }, { 0x2C8C, 0x2C8C, 0x2C8D }, { 0x2C8D, 0x2C8C, 0x2C8D }, { 0x2C8E, 0x2C8E, 0x2C8F }, { 0x2C8F, 0x2C8E, 0x2C8F }, { 0x2C90, 0x2C90, 0x2C91 }, { 0x2C91, 0x2C90, 0x2C91 }, { 0x2C92, 0x2C92, 0x2C93 }, { 0x2C93, 0x2C92, 0x2C93 }, { 0x2C94, 0x2C94, 0x2C95 }, { 0x2C95, 0x2C94, 0x2C95 }, { 0x2C96, 0x2C96, 0x2C97 }, { 0x2C97, 0x2C96, 0x2C97 }, { 0x2C98, 0x2C98, 0x2C99 }, { 0x2C99, 0x2C98, 0x2C99 }, { 0x2C9A, 0x2C9A, 0x2C9B }, { 0x2C9B, 0x2C9A, 0x2C9B }, { 0x2C9C, 0x2C9C, 0x2C9D }, { 0x2C9D, 0x2C9C, 0x2C9D }, { 0x2C9E, 0x2C9E, 0x2C9F }, { 0x2C9F, 0x2C9E, 0x2C9F }, { 0x2CA0, 0x2CA0, 0x2CA1 }, { 0x2CA1, 0x2CA0, 0x2CA1 }, { 0x2CA2, 0x2CA2, 0x2CA3 }, { 0x2CA3, 0x2CA2, 0x2CA3 }, { 0x2CA4, 0x2CA4, 0x2CA5 }, { 0x2CA5, 0x2CA4, 0x2CA5 }, { 0x2CA6, 0x2CA6, 0x2CA7 }, { 0x2CA7, 0x2CA6, 0x2CA7 }, { 0x2CA8, 0x2CA8, 0x2CA9 }, { 0x2CA9, 0x2CA8, 0x2CA9 }, { 0x2CAA, 0x2CAA, 0x2CAB }, { 0x2CAB, 0x2CAA, 0x2CAB }, { 0x2CAC, 0x2CAC, 0x2CAD }, { 0x2CAD, 0x2CAC, 0x2CAD }, { 0x2CAE, 0x2CAE, 0x2CAF }, { 0x2CAF, 0x2CAE, 0x2CAF }, { 0x2CB0, 0x2CB0, 0x2CB1 }, { 0x2CB1, 0x2CB0, 0x2CB1 }, { 0x2CB2, 0x2CB2, 0x2CB3 }, { 0x2CB3, 0x2CB2, 0x2CB3 }, { 0x2CB4, 0x2CB4, 0x2CB5 }, { 0x2CB5, 0x2CB4, 0x2CB5 }, { 0x2CB6, 0x2CB6, 0x2CB7 }, { 0x2CB7, 0x2CB6, 0x2CB7 }, { 0x2CB8, 0x2CB8, 0x2CB9 }, { 0x2CB9, 0x2CB8, 0x2CB9 }, { 0x2CBA, 0x2CBA, 0x2CBB }, { 0x2CBB, 0x2CBA, 0x2CBB }, { 0x2CBC, 0x2CBC, 0x2CBD }, { 0x2CBD, 0x2CBC, 0x2CBD }, { 0x2CBE, 0x2CBE, 0x2CBF }, { 0x2CBF, 0x2CBE, 0x2CBF }, { 0x2CC0, 0x2CC0, 0x2CC1 }, { 0x2CC1, 0x2CC0, 0x2CC1 }, { 0x2CC2, 0x2CC2, 0x2CC3 }, { 0x2CC3, 0x2CC2, 0x2CC3 }, { 0x2CC4, 0x2CC4, 0x2CC5 }, { 0x2CC5, 0x2CC4, 0x2CC5 }, { 0x2CC6, 0x2CC6, 0x2CC7 }, { 0x2CC7, 0x2CC6, 0x2CC7 }, { 0x2CC8, 0x2CC8, 0x2CC9 }, { 0x2CC9, 0x2CC8, 0x2CC9 }, { 0x2CCA, 0x2CCA, 0x2CCB }, { 0x2CCB, 0x2CCA, 0x2CCB }, { 0x2CCC, 0x2CCC, 0x2CCD }, { 0x2CCD, 0x2CCC, 0x2CCD }, { 0x2CCE, 0x2CCE, 0x2CCF }, { 0x2CCF, 0x2CCE, 0x2CCF }, { 0x2CD0, 0x2CD0, 0x2CD1 }, { 0x2CD1, 0x2CD0, 0x2CD1 }, { 0x2CD2, 0x2CD2, 0x2CD3 }, { 0x2CD3, 0x2CD2, 0x2CD3 }, { 0x2CD4, 0x2CD4, 0x2CD5 }, { 0x2CD5, 0x2CD4, 0x2CD5 }, { 0x2CD6, 0x2CD6, 0x2CD7 }, { 0x2CD7, 0x2CD6, 0x2CD7 }, { 0x2CD8, 0x2CD8, 0x2CD9 }, { 0x2CD9, 0x2CD8, 0x2CD9 }, { 0x2CDA, 0x2CDA, 0x2CDB }, { 0x2CDB, 0x2CDA, 0x2CDB }, { 0x2CDC, 0x2CDC, 0x2CDD }, { 0x2CDD, 0x2CDC, 0x2CDD }, { 0x2CDE, 0x2CDE, 0x2CDF }, { 0x2CDF, 0x2CDE, 0x2CDF }, { 0x2CE0, 0x2CE0, 0x2CE1 }, { 0x2CE1, 0x2CE0, 0x2CE1 }, { 0x2CE2, 0x2CE2, 0x2CE3 }, { 0x2CE3, 0x2CE2, 0x2CE3 }, { 0x2CE4, 0x2CE4, 0x2CE4 }, { 0x2D00, 0x10A0, 0x2D00 }, { 0x2D01, 0x10A1, 0x2D01 }, { 0x2D02, 0x10A2, 0x2D02 }, { 0x2D03, 0x10A3, 0x2D03 }, { 0x2D04, 0x10A4, 0x2D04 }, { 0x2D05, 0x10A5, 0x2D05 }, { 0x2D06, 0x10A6, 0x2D06 }, { 0x2D07, 0x10A7, 0x2D07 }, { 0x2D08, 0x10A8, 0x2D08 }, { 0x2D09, 0x10A9, 0x2D09 }, { 0x2D0A, 0x10AA, 0x2D0A }, { 0x2D0B, 0x10AB, 0x2D0B }, { 0x2D0C, 0x10AC, 0x2D0C }, { 0x2D0D, 0x10AD, 0x2D0D }, { 0x2D0E, 0x10AE, 0x2D0E }, { 0x2D0F, 0x10AF, 0x2D0F }, { 0x2D10, 0x10B0, 0x2D10 }, { 0x2D11, 0x10B1, 0x2D11 }, { 0x2D12, 0x10B2, 0x2D12 }, { 0x2D13, 0x10B3, 0x2D13 }, { 0x2D14, 0x10B4, 0x2D14 }, { 0x2D15, 0x10B5, 0x2D15 }, { 0x2D16, 0x10B6, 0x2D16 }, { 0x2D17, 0x10B7, 0x2D17 }, { 0x2D18, 0x10B8, 0x2D18 }, { 0x2D19, 0x10B9, 0x2D19 }, { 0x2D1A, 0x10BA, 0x2D1A }, { 0x2D1B, 0x10BB, 0x2D1B }, { 0x2D1C, 0x10BC, 0x2D1C }, { 0x2D1D, 0x10BD, 0x2D1D }, { 0x2D1E, 0x10BE, 0x2D1E }, { 0x2D1F, 0x10BF, 0x2D1F }, { 0x2D20, 0x10C0, 0x2D20 }, { 0x2D21, 0x10C1, 0x2D21 }, { 0x2D22, 0x10C2, 0x2D22 }, { 0x2D23, 0x10C3, 0x2D23 }, { 0x2D24, 0x10C4, 0x2D24 }, { 0x2D25, 0x10C5, 0x2D25 }, { 0x2D30, 0x2D30, 0x2D30 }, { 0x2D31, 0x2D31, 0x2D31 }, { 0x2D32, 0x2D32, 0x2D32 }, { 0x2D33, 0x2D33, 0x2D33 }, { 0x2D34, 0x2D34, 0x2D34 }, { 0x2D35, 0x2D35, 0x2D35 }, { 0x2D36, 0x2D36, 0x2D36 }, { 0x2D37, 0x2D37, 0x2D37 }, { 0x2D38, 0x2D38, 0x2D38 }, { 0x2D39, 0x2D39, 0x2D39 }, { 0x2D3A, 0x2D3A, 0x2D3A }, { 0x2D3B, 0x2D3B, 0x2D3B }, { 0x2D3C, 0x2D3C, 0x2D3C }, { 0x2D3D, 0x2D3D, 0x2D3D }, { 0x2D3E, 0x2D3E, 0x2D3E }, { 0x2D3F, 0x2D3F, 0x2D3F }, { 0x2D40, 0x2D40, 0x2D40 }, { 0x2D41, 0x2D41, 0x2D41 }, { 0x2D42, 0x2D42, 0x2D42 }, { 0x2D43, 0x2D43, 0x2D43 }, { 0x2D44, 0x2D44, 0x2D44 }, { 0x2D45, 0x2D45, 0x2D45 }, { 0x2D46, 0x2D46, 0x2D46 }, { 0x2D47, 0x2D47, 0x2D47 }, { 0x2D48, 0x2D48, 0x2D48 }, { 0x2D49, 0x2D49, 0x2D49 }, { 0x2D4A, 0x2D4A, 0x2D4A }, { 0x2D4B, 0x2D4B, 0x2D4B }, { 0x2D4C, 0x2D4C, 0x2D4C }, { 0x2D4D, 0x2D4D, 0x2D4D }, { 0x2D4E, 0x2D4E, 0x2D4E }, { 0x2D4F, 0x2D4F, 0x2D4F }, { 0x2D50, 0x2D50, 0x2D50 }, { 0x2D51, 0x2D51, 0x2D51 }, { 0x2D52, 0x2D52, 0x2D52 }, { 0x2D53, 0x2D53, 0x2D53 }, { 0x2D54, 0x2D54, 0x2D54 }, { 0x2D55, 0x2D55, 0x2D55 }, { 0x2D56, 0x2D56, 0x2D56 }, { 0x2D57, 0x2D57, 0x2D57 }, { 0x2D58, 0x2D58, 0x2D58 }, { 0x2D59, 0x2D59, 0x2D59 }, { 0x2D5A, 0x2D5A, 0x2D5A }, { 0x2D5B, 0x2D5B, 0x2D5B }, { 0x2D5C, 0x2D5C, 0x2D5C }, { 0x2D5D, 0x2D5D, 0x2D5D }, { 0x2D5E, 0x2D5E, 0x2D5E }, { 0x2D5F, 0x2D5F, 0x2D5F }, { 0x2D60, 0x2D60, 0x2D60 }, { 0x2D61, 0x2D61, 0x2D61 }, { 0x2D62, 0x2D62, 0x2D62 }, { 0x2D63, 0x2D63, 0x2D63 }, { 0x2D64, 0x2D64, 0x2D64 }, { 0x2D65, 0x2D65, 0x2D65 }, { 0x2D6F, 0x2D6F, 0x2D6F }, { 0x2D80, 0x2D80, 0x2D80 }, { 0x2D81, 0x2D81, 0x2D81 }, { 0x2D82, 0x2D82, 0x2D82 }, { 0x2D83, 0x2D83, 0x2D83 }, { 0x2D84, 0x2D84, 0x2D84 }, { 0x2D85, 0x2D85, 0x2D85 }, { 0x2D86, 0x2D86, 0x2D86 }, { 0x2D87, 0x2D87, 0x2D87 }, { 0x2D88, 0x2D88, 0x2D88 }, { 0x2D89, 0x2D89, 0x2D89 }, { 0x2D8A, 0x2D8A, 0x2D8A }, { 0x2D8B, 0x2D8B, 0x2D8B }, { 0x2D8C, 0x2D8C, 0x2D8C }, { 0x2D8D, 0x2D8D, 0x2D8D }, { 0x2D8E, 0x2D8E, 0x2D8E }, { 0x2D8F, 0x2D8F, 0x2D8F }, { 0x2D90, 0x2D90, 0x2D90 }, { 0x2D91, 0x2D91, 0x2D91 }, { 0x2D92, 0x2D92, 0x2D92 }, { 0x2D93, 0x2D93, 0x2D93 }, { 0x2D94, 0x2D94, 0x2D94 }, { 0x2D95, 0x2D95, 0x2D95 }, { 0x2D96, 0x2D96, 0x2D96 }, { 0x2DA0, 0x2DA0, 0x2DA0 }, { 0x2DA1, 0x2DA1, 0x2DA1 }, { 0x2DA2, 0x2DA2, 0x2DA2 }, { 0x2DA3, 0x2DA3, 0x2DA3 }, { 0x2DA4, 0x2DA4, 0x2DA4 }, { 0x2DA5, 0x2DA5, 0x2DA5 }, { 0x2DA6, 0x2DA6, 0x2DA6 }, { 0x2DA8, 0x2DA8, 0x2DA8 }, { 0x2DA9, 0x2DA9, 0x2DA9 }, { 0x2DAA, 0x2DAA, 0x2DAA }, { 0x2DAB, 0x2DAB, 0x2DAB }, { 0x2DAC, 0x2DAC, 0x2DAC }, { 0x2DAD, 0x2DAD, 0x2DAD }, { 0x2DAE, 0x2DAE, 0x2DAE }, { 0x2DB0, 0x2DB0, 0x2DB0 }, { 0x2DB1, 0x2DB1, 0x2DB1 }, { 0x2DB2, 0x2DB2, 0x2DB2 }, { 0x2DB3, 0x2DB3, 0x2DB3 }, { 0x2DB4, 0x2DB4, 0x2DB4 }, { 0x2DB5, 0x2DB5, 0x2DB5 }, { 0x2DB6, 0x2DB6, 0x2DB6 }, { 0x2DB8, 0x2DB8, 0x2DB8 }, { 0x2DB9, 0x2DB9, 0x2DB9 }, { 0x2DBA, 0x2DBA, 0x2DBA }, { 0x2DBB, 0x2DBB, 0x2DBB }, { 0x2DBC, 0x2DBC, 0x2DBC }, { 0x2DBD, 0x2DBD, 0x2DBD }, { 0x2DBE, 0x2DBE, 0x2DBE }, { 0x2DC0, 0x2DC0, 0x2DC0 }, { 0x2DC1, 0x2DC1, 0x2DC1 }, { 0x2DC2, 0x2DC2, 0x2DC2 }, { 0x2DC3, 0x2DC3, 0x2DC3 }, { 0x2DC4, 0x2DC4, 0x2DC4 }, { 0x2DC5, 0x2DC5, 0x2DC5 }, { 0x2DC6, 0x2DC6, 0x2DC6 }, { 0x2DC8, 0x2DC8, 0x2DC8 }, { 0x2DC9, 0x2DC9, 0x2DC9 }, { 0x2DCA, 0x2DCA, 0x2DCA }, { 0x2DCB, 0x2DCB, 0x2DCB }, { 0x2DCC, 0x2DCC, 0x2DCC }, { 0x2DCD, 0x2DCD, 0x2DCD }, { 0x2DCE, 0x2DCE, 0x2DCE }, { 0x2DD0, 0x2DD0, 0x2DD0 }, { 0x2DD1, 0x2DD1, 0x2DD1 }, { 0x2DD2, 0x2DD2, 0x2DD2 }, { 0x2DD3, 0x2DD3, 0x2DD3 }, { 0x2DD4, 0x2DD4, 0x2DD4 }, { 0x2DD5, 0x2DD5, 0x2DD5 }, { 0x2DD6, 0x2DD6, 0x2DD6 }, { 0x2DD8, 0x2DD8, 0x2DD8 }, { 0x2DD9, 0x2DD9, 0x2DD9 }, { 0x2DDA, 0x2DDA, 0x2DDA }, { 0x2DDB, 0x2DDB, 0x2DDB }, { 0x2DDC, 0x2DDC, 0x2DDC }, { 0x2DDD, 0x2DDD, 0x2DDD }, { 0x2DDE, 0x2DDE, 0x2DDE }, { 0x3005, 0x3005, 0x3005 }, { 0x3006, 0x3006, 0x3006 }, { 0x302A, 0x302A, 0x302A }, { 0x302B, 0x302B, 0x302B }, { 0x302C, 0x302C, 0x302C }, { 0x302D, 0x302D, 0x302D }, { 0x302E, 0x302E, 0x302E }, { 0x302F, 0x302F, 0x302F }, { 0x3031, 0x3031, 0x3031 }, { 0x3032, 0x3032, 0x3032 }, { 0x3033, 0x3033, 0x3033 }, { 0x3034, 0x3034, 0x3034 }, { 0x3035, 0x3035, 0x3035 }, { 0x303B, 0x303B, 0x303B }, { 0x303C, 0x303C, 0x303C }, { 0x3041, 0x3041, 0x3041 }, { 0x3042, 0x3042, 0x3042 }, { 0x3043, 0x3043, 0x3043 }, { 0x3044, 0x3044, 0x3044 }, { 0x3045, 0x3045, 0x3045 }, { 0x3046, 0x3046, 0x3046 }, { 0x3047, 0x3047, 0x3047 }, { 0x3048, 0x3048, 0x3048 }, { 0x3049, 0x3049, 0x3049 }, { 0x304A, 0x304A, 0x304A }, { 0x304B, 0x304B, 0x304B }, { 0x304C, 0x304C, 0x304C }, { 0x304D, 0x304D, 0x304D }, { 0x304E, 0x304E, 0x304E }, { 0x304F, 0x304F, 0x304F }, { 0x3050, 0x3050, 0x3050 }, { 0x3051, 0x3051, 0x3051 }, { 0x3052, 0x3052, 0x3052 }, { 0x3053, 0x3053, 0x3053 }, { 0x3054, 0x3054, 0x3054 }, { 0x3055, 0x3055, 0x3055 }, { 0x3056, 0x3056, 0x3056 }, { 0x3057, 0x3057, 0x3057 }, { 0x3058, 0x3058, 0x3058 }, { 0x3059, 0x3059, 0x3059 }, { 0x305A, 0x305A, 0x305A }, { 0x305B, 0x305B, 0x305B }, { 0x305C, 0x305C, 0x305C }, { 0x305D, 0x305D, 0x305D }, { 0x305E, 0x305E, 0x305E }, { 0x305F, 0x305F, 0x305F }, { 0x3060, 0x3060, 0x3060 }, { 0x3061, 0x3061, 0x3061 }, { 0x3062, 0x3062, 0x3062 }, { 0x3063, 0x3063, 0x3063 }, { 0x3064, 0x3064, 0x3064 }, { 0x3065, 0x3065, 0x3065 }, { 0x3066, 0x3066, 0x3066 }, { 0x3067, 0x3067, 0x3067 }, { 0x3068, 0x3068, 0x3068 }, { 0x3069, 0x3069, 0x3069 }, { 0x306A, 0x306A, 0x306A }, { 0x306B, 0x306B, 0x306B }, { 0x306C, 0x306C, 0x306C }, { 0x306D, 0x306D, 0x306D }, { 0x306E, 0x306E, 0x306E }, { 0x306F, 0x306F, 0x306F }, { 0x3070, 0x3070, 0x3070 }, { 0x3071, 0x3071, 0x3071 }, { 0x3072, 0x3072, 0x3072 }, { 0x3073, 0x3073, 0x3073 }, { 0x3074, 0x3074, 0x3074 }, { 0x3075, 0x3075, 0x3075 }, { 0x3076, 0x3076, 0x3076 }, { 0x3077, 0x3077, 0x3077 }, { 0x3078, 0x3078, 0x3078 }, { 0x3079, 0x3079, 0x3079 }, { 0x307A, 0x307A, 0x307A }, { 0x307B, 0x307B, 0x307B }, { 0x307C, 0x307C, 0x307C }, { 0x307D, 0x307D, 0x307D }, { 0x307E, 0x307E, 0x307E }, { 0x307F, 0x307F, 0x307F }, { 0x3080, 0x3080, 0x3080 }, { 0x3081, 0x3081, 0x3081 }, { 0x3082, 0x3082, 0x3082 }, { 0x3083, 0x3083, 0x3083 }, { 0x3084, 0x3084, 0x3084 }, { 0x3085, 0x3085, 0x3085 }, { 0x3086, 0x3086, 0x3086 }, { 0x3087, 0x3087, 0x3087 }, { 0x3088, 0x3088, 0x3088 }, { 0x3089, 0x3089, 0x3089 }, { 0x308A, 0x308A, 0x308A }, { 0x308B, 0x308B, 0x308B }, { 0x308C, 0x308C, 0x308C }, { 0x308D, 0x308D, 0x308D }, { 0x308E, 0x308E, 0x308E }, { 0x308F, 0x308F, 0x308F }, { 0x3090, 0x3090, 0x3090 }, { 0x3091, 0x3091, 0x3091 }, { 0x3092, 0x3092, 0x3092 }, { 0x3093, 0x3093, 0x3093 }, { 0x3094, 0x3094, 0x3094 }, { 0x3095, 0x3095, 0x3095 }, { 0x3096, 0x3096, 0x3096 }, { 0x3099, 0x3099, 0x3099 }, { 0x309A, 0x309A, 0x309A }, { 0x309D, 0x309D, 0x309D }, { 0x309E, 0x309E, 0x309E }, { 0x309F, 0x309F, 0x309F }, { 0x30A1, 0x30A1, 0x30A1 }, { 0x30A2, 0x30A2, 0x30A2 }, { 0x30A3, 0x30A3, 0x30A3 }, { 0x30A4, 0x30A4, 0x30A4 }, { 0x30A5, 0x30A5, 0x30A5 }, { 0x30A6, 0x30A6, 0x30A6 }, { 0x30A7, 0x30A7, 0x30A7 }, { 0x30A8, 0x30A8, 0x30A8 }, { 0x30A9, 0x30A9, 0x30A9 }, { 0x30AA, 0x30AA, 0x30AA }, { 0x30AB, 0x30AB, 0x30AB }, { 0x30AC, 0x30AC, 0x30AC }, { 0x30AD, 0x30AD, 0x30AD }, { 0x30AE, 0x30AE, 0x30AE }, { 0x30AF, 0x30AF, 0x30AF }, { 0x30B0, 0x30B0, 0x30B0 }, { 0x30B1, 0x30B1, 0x30B1 }, { 0x30B2, 0x30B2, 0x30B2 }, { 0x30B3, 0x30B3, 0x30B3 }, { 0x30B4, 0x30B4, 0x30B4 }, { 0x30B5, 0x30B5, 0x30B5 }, { 0x30B6, 0x30B6, 0x30B6 }, { 0x30B7, 0x30B7, 0x30B7 }, { 0x30B8, 0x30B8, 0x30B8 }, { 0x30B9, 0x30B9, 0x30B9 }, { 0x30BA, 0x30BA, 0x30BA }, { 0x30BB, 0x30BB, 0x30BB }, { 0x30BC, 0x30BC, 0x30BC }, { 0x30BD, 0x30BD, 0x30BD }, { 0x30BE, 0x30BE, 0x30BE }, { 0x30BF, 0x30BF, 0x30BF }, { 0x30C0, 0x30C0, 0x30C0 }, { 0x30C1, 0x30C1, 0x30C1 }, { 0x30C2, 0x30C2, 0x30C2 }, { 0x30C3, 0x30C3, 0x30C3 }, { 0x30C4, 0x30C4, 0x30C4 }, { 0x30C5, 0x30C5, 0x30C5 }, { 0x30C6, 0x30C6, 0x30C6 }, { 0x30C7, 0x30C7, 0x30C7 }, { 0x30C8, 0x30C8, 0x30C8 }, { 0x30C9, 0x30C9, 0x30C9 }, { 0x30CA, 0x30CA, 0x30CA }, { 0x30CB, 0x30CB, 0x30CB }, { 0x30CC, 0x30CC, 0x30CC }, { 0x30CD, 0x30CD, 0x30CD }, { 0x30CE, 0x30CE, 0x30CE }, { 0x30CF, 0x30CF, 0x30CF }, { 0x30D0, 0x30D0, 0x30D0 }, { 0x30D1, 0x30D1, 0x30D1 }, { 0x30D2, 0x30D2, 0x30D2 }, { 0x30D3, 0x30D3, 0x30D3 }, { 0x30D4, 0x30D4, 0x30D4 }, { 0x30D5, 0x30D5, 0x30D5 }, { 0x30D6, 0x30D6, 0x30D6 }, { 0x30D7, 0x30D7, 0x30D7 }, { 0x30D8, 0x30D8, 0x30D8 }, { 0x30D9, 0x30D9, 0x30D9 }, { 0x30DA, 0x30DA, 0x30DA }, { 0x30DB, 0x30DB, 0x30DB }, { 0x30DC, 0x30DC, 0x30DC }, { 0x30DD, 0x30DD, 0x30DD }, { 0x30DE, 0x30DE, 0x30DE }, { 0x30DF, 0x30DF, 0x30DF }, { 0x30E0, 0x30E0, 0x30E0 }, { 0x30E1, 0x30E1, 0x30E1 }, { 0x30E2, 0x30E2, 0x30E2 }, { 0x30E3, 0x30E3, 0x30E3 }, { 0x30E4, 0x30E4, 0x30E4 }, { 0x30E5, 0x30E5, 0x30E5 }, { 0x30E6, 0x30E6, 0x30E6 }, { 0x30E7, 0x30E7, 0x30E7 }, { 0x30E8, 0x30E8, 0x30E8 }, { 0x30E9, 0x30E9, 0x30E9 }, { 0x30EA, 0x30EA, 0x30EA }, { 0x30EB, 0x30EB, 0x30EB }, { 0x30EC, 0x30EC, 0x30EC }, { 0x30ED, 0x30ED, 0x30ED }, { 0x30EE, 0x30EE, 0x30EE }, { 0x30EF, 0x30EF, 0x30EF }, { 0x30F0, 0x30F0, 0x30F0 }, { 0x30F1, 0x30F1, 0x30F1 }, { 0x30F2, 0x30F2, 0x30F2 }, { 0x30F3, 0x30F3, 0x30F3 }, { 0x30F4, 0x30F4, 0x30F4 }, { 0x30F5, 0x30F5, 0x30F5 }, { 0x30F6, 0x30F6, 0x30F6 }, { 0x30F7, 0x30F7, 0x30F7 }, { 0x30F8, 0x30F8, 0x30F8 }, { 0x30F9, 0x30F9, 0x30F9 }, { 0x30FA, 0x30FA, 0x30FA }, { 0x30FC, 0x30FC, 0x30FC }, { 0x30FD, 0x30FD, 0x30FD }, { 0x30FE, 0x30FE, 0x30FE }, { 0x30FF, 0x30FF, 0x30FF }, { 0x3105, 0x3105, 0x3105 }, { 0x3106, 0x3106, 0x3106 }, { 0x3107, 0x3107, 0x3107 }, { 0x3108, 0x3108, 0x3108 }, { 0x3109, 0x3109, 0x3109 }, { 0x310A, 0x310A, 0x310A }, { 0x310B, 0x310B, 0x310B }, { 0x310C, 0x310C, 0x310C }, { 0x310D, 0x310D, 0x310D }, { 0x310E, 0x310E, 0x310E }, { 0x310F, 0x310F, 0x310F }, { 0x3110, 0x3110, 0x3110 }, { 0x3111, 0x3111, 0x3111 }, { 0x3112, 0x3112, 0x3112 }, { 0x3113, 0x3113, 0x3113 }, { 0x3114, 0x3114, 0x3114 }, { 0x3115, 0x3115, 0x3115 }, { 0x3116, 0x3116, 0x3116 }, { 0x3117, 0x3117, 0x3117 }, { 0x3118, 0x3118, 0x3118 }, { 0x3119, 0x3119, 0x3119 }, { 0x311A, 0x311A, 0x311A }, { 0x311B, 0x311B, 0x311B }, { 0x311C, 0x311C, 0x311C }, { 0x311D, 0x311D, 0x311D }, { 0x311E, 0x311E, 0x311E }, { 0x311F, 0x311F, 0x311F }, { 0x3120, 0x3120, 0x3120 }, { 0x3121, 0x3121, 0x3121 }, { 0x3122, 0x3122, 0x3122 }, { 0x3123, 0x3123, 0x3123 }, { 0x3124, 0x3124, 0x3124 }, { 0x3125, 0x3125, 0x3125 }, { 0x3126, 0x3126, 0x3126 }, { 0x3127, 0x3127, 0x3127 }, { 0x3128, 0x3128, 0x3128 }, { 0x3129, 0x3129, 0x3129 }, { 0x312A, 0x312A, 0x312A }, { 0x312B, 0x312B, 0x312B }, { 0x312C, 0x312C, 0x312C }, { 0x3131, 0x3131, 0x3131 }, { 0x3132, 0x3132, 0x3132 }, { 0x3133, 0x3133, 0x3133 }, { 0x3134, 0x3134, 0x3134 }, { 0x3135, 0x3135, 0x3135 }, { 0x3136, 0x3136, 0x3136 }, { 0x3137, 0x3137, 0x3137 }, { 0x3138, 0x3138, 0x3138 }, { 0x3139, 0x3139, 0x3139 }, { 0x313A, 0x313A, 0x313A }, { 0x313B, 0x313B, 0x313B }, { 0x313C, 0x313C, 0x313C }, { 0x313D, 0x313D, 0x313D }, { 0x313E, 0x313E, 0x313E }, { 0x313F, 0x313F, 0x313F }, { 0x3140, 0x3140, 0x3140 }, { 0x3141, 0x3141, 0x3141 }, { 0x3142, 0x3142, 0x3142 }, { 0x3143, 0x3143, 0x3143 }, { 0x3144, 0x3144, 0x3144 }, { 0x3145, 0x3145, 0x3145 }, { 0x3146, 0x3146, 0x3146 }, { 0x3147, 0x3147, 0x3147 }, { 0x3148, 0x3148, 0x3148 }, { 0x3149, 0x3149, 0x3149 }, { 0x314A, 0x314A, 0x314A }, { 0x314B, 0x314B, 0x314B }, { 0x314C, 0x314C, 0x314C }, { 0x314D, 0x314D, 0x314D }, { 0x314E, 0x314E, 0x314E }, { 0x314F, 0x314F, 0x314F }, { 0x3150, 0x3150, 0x3150 }, { 0x3151, 0x3151, 0x3151 }, { 0x3152, 0x3152, 0x3152 }, { 0x3153, 0x3153, 0x3153 }, { 0x3154, 0x3154, 0x3154 }, { 0x3155, 0x3155, 0x3155 }, { 0x3156, 0x3156, 0x3156 }, { 0x3157, 0x3157, 0x3157 }, { 0x3158, 0x3158, 0x3158 }, { 0x3159, 0x3159, 0x3159 }, { 0x315A, 0x315A, 0x315A }, { 0x315B, 0x315B, 0x315B }, { 0x315C, 0x315C, 0x315C }, { 0x315D, 0x315D, 0x315D }, { 0x315E, 0x315E, 0x315E }, { 0x315F, 0x315F, 0x315F }, { 0x3160, 0x3160, 0x3160 }, { 0x3161, 0x3161, 0x3161 }, { 0x3162, 0x3162, 0x3162 }, { 0x3163, 0x3163, 0x3163 }, { 0x3164, 0x3164, 0x3164 }, { 0x3165, 0x3165, 0x3165 }, { 0x3166, 0x3166, 0x3166 }, { 0x3167, 0x3167, 0x3167 }, { 0x3168, 0x3168, 0x3168 }, { 0x3169, 0x3169, 0x3169 }, { 0x316A, 0x316A, 0x316A }, { 0x316B, 0x316B, 0x316B }, { 0x316C, 0x316C, 0x316C }, { 0x316D, 0x316D, 0x316D }, { 0x316E, 0x316E, 0x316E }, { 0x316F, 0x316F, 0x316F }, { 0x3170, 0x3170, 0x3170 }, { 0x3171, 0x3171, 0x3171 }, { 0x3172, 0x3172, 0x3172 }, { 0x3173, 0x3173, 0x3173 }, { 0x3174, 0x3174, 0x3174 }, { 0x3175, 0x3175, 0x3175 }, { 0x3176, 0x3176, 0x3176 }, { 0x3177, 0x3177, 0x3177 }, { 0x3178, 0x3178, 0x3178 }, { 0x3179, 0x3179, 0x3179 }, { 0x317A, 0x317A, 0x317A }, { 0x317B, 0x317B, 0x317B }, { 0x317C, 0x317C, 0x317C }, { 0x317D, 0x317D, 0x317D }, { 0x317E, 0x317E, 0x317E }, { 0x317F, 0x317F, 0x317F }, { 0x3180, 0x3180, 0x3180 }, { 0x3181, 0x3181, 0x3181 }, { 0x3182, 0x3182, 0x3182 }, { 0x3183, 0x3183, 0x3183 }, { 0x3184, 0x3184, 0x3184 }, { 0x3185, 0x3185, 0x3185 }, { 0x3186, 0x3186, 0x3186 }, { 0x3187, 0x3187, 0x3187 }, { 0x3188, 0x3188, 0x3188 }, { 0x3189, 0x3189, 0x3189 }, { 0x318A, 0x318A, 0x318A }, { 0x318B, 0x318B, 0x318B }, { 0x318C, 0x318C, 0x318C }, { 0x318D, 0x318D, 0x318D }, { 0x318E, 0x318E, 0x318E }, { 0x31A0, 0x31A0, 0x31A0 }, { 0x31A1, 0x31A1, 0x31A1 }, { 0x31A2, 0x31A2, 0x31A2 }, { 0x31A3, 0x31A3, 0x31A3 }, { 0x31A4, 0x31A4, 0x31A4 }, { 0x31A5, 0x31A5, 0x31A5 }, { 0x31A6, 0x31A6, 0x31A6 }, { 0x31A7, 0x31A7, 0x31A7 }, { 0x31A8, 0x31A8, 0x31A8 }, { 0x31A9, 0x31A9, 0x31A9 }, { 0x31AA, 0x31AA, 0x31AA }, { 0x31AB, 0x31AB, 0x31AB }, { 0x31AC, 0x31AC, 0x31AC }, { 0x31AD, 0x31AD, 0x31AD }, { 0x31AE, 0x31AE, 0x31AE }, { 0x31AF, 0x31AF, 0x31AF }, { 0x31B0, 0x31B0, 0x31B0 }, { 0x31B1, 0x31B1, 0x31B1 }, { 0x31B2, 0x31B2, 0x31B2 }, { 0x31B3, 0x31B3, 0x31B3 }, { 0x31B4, 0x31B4, 0x31B4 }, { 0x31B5, 0x31B5, 0x31B5 }, { 0x31B6, 0x31B6, 0x31B6 }, { 0x31B7, 0x31B7, 0x31B7 }, { 0x31F0, 0x31F0, 0x31F0 }, { 0x31F1, 0x31F1, 0x31F1 }, { 0x31F2, 0x31F2, 0x31F2 }, { 0x31F3, 0x31F3, 0x31F3 }, { 0x31F4, 0x31F4, 0x31F4 }, { 0x31F5, 0x31F5, 0x31F5 }, { 0x31F6, 0x31F6, 0x31F6 }, { 0x31F7, 0x31F7, 0x31F7 }, { 0x31F8, 0x31F8, 0x31F8 }, { 0x31F9, 0x31F9, 0x31F9 }, { 0x31FA, 0x31FA, 0x31FA }, { 0x31FB, 0x31FB, 0x31FB }, { 0x31FC, 0x31FC, 0x31FC }, { 0x31FD, 0x31FD, 0x31FD }, { 0x31FE, 0x31FE, 0x31FE }, { 0x31FF, 0x31FF, 0x31FF }, { 0x3400, 0x3400, 0x3400 }, { 0x4DB5, 0x4DB5, 0x4DB5 }, { 0x4E00, 0x4E00, 0x4E00 }, { 0x9FBB, 0x9FBB, 0x9FBB }, { 0xA000, 0xA000, 0xA000 }, { 0xA001, 0xA001, 0xA001 }, { 0xA002, 0xA002, 0xA002 }, { 0xA003, 0xA003, 0xA003 }, { 0xA004, 0xA004, 0xA004 }, { 0xA005, 0xA005, 0xA005 }, { 0xA006, 0xA006, 0xA006 }, { 0xA007, 0xA007, 0xA007 }, { 0xA008, 0xA008, 0xA008 }, { 0xA009, 0xA009, 0xA009 }, { 0xA00A, 0xA00A, 0xA00A }, { 0xA00B, 0xA00B, 0xA00B }, { 0xA00C, 0xA00C, 0xA00C }, { 0xA00D, 0xA00D, 0xA00D }, { 0xA00E, 0xA00E, 0xA00E }, { 0xA00F, 0xA00F, 0xA00F }, { 0xA010, 0xA010, 0xA010 }, { 0xA011, 0xA011, 0xA011 }, { 0xA012, 0xA012, 0xA012 }, { 0xA013, 0xA013, 0xA013 }, { 0xA014, 0xA014, 0xA014 }, { 0xA015, 0xA015, 0xA015 }, { 0xA016, 0xA016, 0xA016 }, { 0xA017, 0xA017, 0xA017 }, { 0xA018, 0xA018, 0xA018 }, { 0xA019, 0xA019, 0xA019 }, { 0xA01A, 0xA01A, 0xA01A }, { 0xA01B, 0xA01B, 0xA01B }, { 0xA01C, 0xA01C, 0xA01C }, { 0xA01D, 0xA01D, 0xA01D }, { 0xA01E, 0xA01E, 0xA01E }, { 0xA01F, 0xA01F, 0xA01F }, { 0xA020, 0xA020, 0xA020 }, { 0xA021, 0xA021, 0xA021 }, { 0xA022, 0xA022, 0xA022 }, { 0xA023, 0xA023, 0xA023 }, { 0xA024, 0xA024, 0xA024 }, { 0xA025, 0xA025, 0xA025 }, { 0xA026, 0xA026, 0xA026 }, { 0xA027, 0xA027, 0xA027 }, { 0xA028, 0xA028, 0xA028 }, { 0xA029, 0xA029, 0xA029 }, { 0xA02A, 0xA02A, 0xA02A }, { 0xA02B, 0xA02B, 0xA02B }, { 0xA02C, 0xA02C, 0xA02C }, { 0xA02D, 0xA02D, 0xA02D }, { 0xA02E, 0xA02E, 0xA02E }, { 0xA02F, 0xA02F, 0xA02F }, { 0xA030, 0xA030, 0xA030 }, { 0xA031, 0xA031, 0xA031 }, { 0xA032, 0xA032, 0xA032 }, { 0xA033, 0xA033, 0xA033 }, { 0xA034, 0xA034, 0xA034 }, { 0xA035, 0xA035, 0xA035 }, { 0xA036, 0xA036, 0xA036 }, { 0xA037, 0xA037, 0xA037 }, { 0xA038, 0xA038, 0xA038 }, { 0xA039, 0xA039, 0xA039 }, { 0xA03A, 0xA03A, 0xA03A }, { 0xA03B, 0xA03B, 0xA03B }, { 0xA03C, 0xA03C, 0xA03C }, { 0xA03D, 0xA03D, 0xA03D }, { 0xA03E, 0xA03E, 0xA03E }, { 0xA03F, 0xA03F, 0xA03F }, { 0xA040, 0xA040, 0xA040 }, { 0xA041, 0xA041, 0xA041 }, { 0xA042, 0xA042, 0xA042 }, { 0xA043, 0xA043, 0xA043 }, { 0xA044, 0xA044, 0xA044 }, { 0xA045, 0xA045, 0xA045 }, { 0xA046, 0xA046, 0xA046 }, { 0xA047, 0xA047, 0xA047 }, { 0xA048, 0xA048, 0xA048 }, { 0xA049, 0xA049, 0xA049 }, { 0xA04A, 0xA04A, 0xA04A }, { 0xA04B, 0xA04B, 0xA04B }, { 0xA04C, 0xA04C, 0xA04C }, { 0xA04D, 0xA04D, 0xA04D }, { 0xA04E, 0xA04E, 0xA04E }, { 0xA04F, 0xA04F, 0xA04F }, { 0xA050, 0xA050, 0xA050 }, { 0xA051, 0xA051, 0xA051 }, { 0xA052, 0xA052, 0xA052 }, { 0xA053, 0xA053, 0xA053 }, { 0xA054, 0xA054, 0xA054 }, { 0xA055, 0xA055, 0xA055 }, { 0xA056, 0xA056, 0xA056 }, { 0xA057, 0xA057, 0xA057 }, { 0xA058, 0xA058, 0xA058 }, { 0xA059, 0xA059, 0xA059 }, { 0xA05A, 0xA05A, 0xA05A }, { 0xA05B, 0xA05B, 0xA05B }, { 0xA05C, 0xA05C, 0xA05C }, { 0xA05D, 0xA05D, 0xA05D }, { 0xA05E, 0xA05E, 0xA05E }, { 0xA05F, 0xA05F, 0xA05F }, { 0xA060, 0xA060, 0xA060 }, { 0xA061, 0xA061, 0xA061 }, { 0xA062, 0xA062, 0xA062 }, { 0xA063, 0xA063, 0xA063 }, { 0xA064, 0xA064, 0xA064 }, { 0xA065, 0xA065, 0xA065 }, { 0xA066, 0xA066, 0xA066 }, { 0xA067, 0xA067, 0xA067 }, { 0xA068, 0xA068, 0xA068 }, { 0xA069, 0xA069, 0xA069 }, { 0xA06A, 0xA06A, 0xA06A }, { 0xA06B, 0xA06B, 0xA06B }, { 0xA06C, 0xA06C, 0xA06C }, { 0xA06D, 0xA06D, 0xA06D }, { 0xA06E, 0xA06E, 0xA06E }, { 0xA06F, 0xA06F, 0xA06F }, { 0xA070, 0xA070, 0xA070 }, { 0xA071, 0xA071, 0xA071 }, { 0xA072, 0xA072, 0xA072 }, { 0xA073, 0xA073, 0xA073 }, { 0xA074, 0xA074, 0xA074 }, { 0xA075, 0xA075, 0xA075 }, { 0xA076, 0xA076, 0xA076 }, { 0xA077, 0xA077, 0xA077 }, { 0xA078, 0xA078, 0xA078 }, { 0xA079, 0xA079, 0xA079 }, { 0xA07A, 0xA07A, 0xA07A }, { 0xA07B, 0xA07B, 0xA07B }, { 0xA07C, 0xA07C, 0xA07C }, { 0xA07D, 0xA07D, 0xA07D }, { 0xA07E, 0xA07E, 0xA07E }, { 0xA07F, 0xA07F, 0xA07F }, { 0xA080, 0xA080, 0xA080 }, { 0xA081, 0xA081, 0xA081 }, { 0xA082, 0xA082, 0xA082 }, { 0xA083, 0xA083, 0xA083 }, { 0xA084, 0xA084, 0xA084 }, { 0xA085, 0xA085, 0xA085 }, { 0xA086, 0xA086, 0xA086 }, { 0xA087, 0xA087, 0xA087 }, { 0xA088, 0xA088, 0xA088 }, { 0xA089, 0xA089, 0xA089 }, { 0xA08A, 0xA08A, 0xA08A }, { 0xA08B, 0xA08B, 0xA08B }, { 0xA08C, 0xA08C, 0xA08C }, { 0xA08D, 0xA08D, 0xA08D }, { 0xA08E, 0xA08E, 0xA08E }, { 0xA08F, 0xA08F, 0xA08F }, { 0xA090, 0xA090, 0xA090 }, { 0xA091, 0xA091, 0xA091 }, { 0xA092, 0xA092, 0xA092 }, { 0xA093, 0xA093, 0xA093 }, { 0xA094, 0xA094, 0xA094 }, { 0xA095, 0xA095, 0xA095 }, { 0xA096, 0xA096, 0xA096 }, { 0xA097, 0xA097, 0xA097 }, { 0xA098, 0xA098, 0xA098 }, { 0xA099, 0xA099, 0xA099 }, { 0xA09A, 0xA09A, 0xA09A }, { 0xA09B, 0xA09B, 0xA09B }, { 0xA09C, 0xA09C, 0xA09C }, { 0xA09D, 0xA09D, 0xA09D }, { 0xA09E, 0xA09E, 0xA09E }, { 0xA09F, 0xA09F, 0xA09F }, { 0xA0A0, 0xA0A0, 0xA0A0 }, { 0xA0A1, 0xA0A1, 0xA0A1 }, { 0xA0A2, 0xA0A2, 0xA0A2 }, { 0xA0A3, 0xA0A3, 0xA0A3 }, { 0xA0A4, 0xA0A4, 0xA0A4 }, { 0xA0A5, 0xA0A5, 0xA0A5 }, { 0xA0A6, 0xA0A6, 0xA0A6 }, { 0xA0A7, 0xA0A7, 0xA0A7 }, { 0xA0A8, 0xA0A8, 0xA0A8 }, { 0xA0A9, 0xA0A9, 0xA0A9 }, { 0xA0AA, 0xA0AA, 0xA0AA }, { 0xA0AB, 0xA0AB, 0xA0AB }, { 0xA0AC, 0xA0AC, 0xA0AC }, { 0xA0AD, 0xA0AD, 0xA0AD }, { 0xA0AE, 0xA0AE, 0xA0AE }, { 0xA0AF, 0xA0AF, 0xA0AF }, { 0xA0B0, 0xA0B0, 0xA0B0 }, { 0xA0B1, 0xA0B1, 0xA0B1 }, { 0xA0B2, 0xA0B2, 0xA0B2 }, { 0xA0B3, 0xA0B3, 0xA0B3 }, { 0xA0B4, 0xA0B4, 0xA0B4 }, { 0xA0B5, 0xA0B5, 0xA0B5 }, { 0xA0B6, 0xA0B6, 0xA0B6 }, { 0xA0B7, 0xA0B7, 0xA0B7 }, { 0xA0B8, 0xA0B8, 0xA0B8 }, { 0xA0B9, 0xA0B9, 0xA0B9 }, { 0xA0BA, 0xA0BA, 0xA0BA }, { 0xA0BB, 0xA0BB, 0xA0BB }, { 0xA0BC, 0xA0BC, 0xA0BC }, { 0xA0BD, 0xA0BD, 0xA0BD }, { 0xA0BE, 0xA0BE, 0xA0BE }, { 0xA0BF, 0xA0BF, 0xA0BF }, { 0xA0C0, 0xA0C0, 0xA0C0 }, { 0xA0C1, 0xA0C1, 0xA0C1 }, { 0xA0C2, 0xA0C2, 0xA0C2 }, { 0xA0C3, 0xA0C3, 0xA0C3 }, { 0xA0C4, 0xA0C4, 0xA0C4 }, { 0xA0C5, 0xA0C5, 0xA0C5 }, { 0xA0C6, 0xA0C6, 0xA0C6 }, { 0xA0C7, 0xA0C7, 0xA0C7 }, { 0xA0C8, 0xA0C8, 0xA0C8 }, { 0xA0C9, 0xA0C9, 0xA0C9 }, { 0xA0CA, 0xA0CA, 0xA0CA }, { 0xA0CB, 0xA0CB, 0xA0CB }, { 0xA0CC, 0xA0CC, 0xA0CC }, { 0xA0CD, 0xA0CD, 0xA0CD }, { 0xA0CE, 0xA0CE, 0xA0CE }, { 0xA0CF, 0xA0CF, 0xA0CF }, { 0xA0D0, 0xA0D0, 0xA0D0 }, { 0xA0D1, 0xA0D1, 0xA0D1 }, { 0xA0D2, 0xA0D2, 0xA0D2 }, { 0xA0D3, 0xA0D3, 0xA0D3 }, { 0xA0D4, 0xA0D4, 0xA0D4 }, { 0xA0D5, 0xA0D5, 0xA0D5 }, { 0xA0D6, 0xA0D6, 0xA0D6 }, { 0xA0D7, 0xA0D7, 0xA0D7 }, { 0xA0D8, 0xA0D8, 0xA0D8 }, { 0xA0D9, 0xA0D9, 0xA0D9 }, { 0xA0DA, 0xA0DA, 0xA0DA }, { 0xA0DB, 0xA0DB, 0xA0DB }, { 0xA0DC, 0xA0DC, 0xA0DC }, { 0xA0DD, 0xA0DD, 0xA0DD }, { 0xA0DE, 0xA0DE, 0xA0DE }, { 0xA0DF, 0xA0DF, 0xA0DF }, { 0xA0E0, 0xA0E0, 0xA0E0 }, { 0xA0E1, 0xA0E1, 0xA0E1 }, { 0xA0E2, 0xA0E2, 0xA0E2 }, { 0xA0E3, 0xA0E3, 0xA0E3 }, { 0xA0E4, 0xA0E4, 0xA0E4 }, { 0xA0E5, 0xA0E5, 0xA0E5 }, { 0xA0E6, 0xA0E6, 0xA0E6 }, { 0xA0E7, 0xA0E7, 0xA0E7 }, { 0xA0E8, 0xA0E8, 0xA0E8 }, { 0xA0E9, 0xA0E9, 0xA0E9 }, { 0xA0EA, 0xA0EA, 0xA0EA }, { 0xA0EB, 0xA0EB, 0xA0EB }, { 0xA0EC, 0xA0EC, 0xA0EC }, { 0xA0ED, 0xA0ED, 0xA0ED }, { 0xA0EE, 0xA0EE, 0xA0EE }, { 0xA0EF, 0xA0EF, 0xA0EF }, { 0xA0F0, 0xA0F0, 0xA0F0 }, { 0xA0F1, 0xA0F1, 0xA0F1 }, { 0xA0F2, 0xA0F2, 0xA0F2 }, { 0xA0F3, 0xA0F3, 0xA0F3 }, { 0xA0F4, 0xA0F4, 0xA0F4 }, { 0xA0F5, 0xA0F5, 0xA0F5 }, { 0xA0F6, 0xA0F6, 0xA0F6 }, { 0xA0F7, 0xA0F7, 0xA0F7 }, { 0xA0F8, 0xA0F8, 0xA0F8 }, { 0xA0F9, 0xA0F9, 0xA0F9 }, { 0xA0FA, 0xA0FA, 0xA0FA }, { 0xA0FB, 0xA0FB, 0xA0FB }, { 0xA0FC, 0xA0FC, 0xA0FC }, { 0xA0FD, 0xA0FD, 0xA0FD }, { 0xA0FE, 0xA0FE, 0xA0FE }, { 0xA0FF, 0xA0FF, 0xA0FF }, { 0xA100, 0xA100, 0xA100 }, { 0xA101, 0xA101, 0xA101 }, { 0xA102, 0xA102, 0xA102 }, { 0xA103, 0xA103, 0xA103 }, { 0xA104, 0xA104, 0xA104 }, { 0xA105, 0xA105, 0xA105 }, { 0xA106, 0xA106, 0xA106 }, { 0xA107, 0xA107, 0xA107 }, { 0xA108, 0xA108, 0xA108 }, { 0xA109, 0xA109, 0xA109 }, { 0xA10A, 0xA10A, 0xA10A }, { 0xA10B, 0xA10B, 0xA10B }, { 0xA10C, 0xA10C, 0xA10C }, { 0xA10D, 0xA10D, 0xA10D }, { 0xA10E, 0xA10E, 0xA10E }, { 0xA10F, 0xA10F, 0xA10F }, { 0xA110, 0xA110, 0xA110 }, { 0xA111, 0xA111, 0xA111 }, { 0xA112, 0xA112, 0xA112 }, { 0xA113, 0xA113, 0xA113 }, { 0xA114, 0xA114, 0xA114 }, { 0xA115, 0xA115, 0xA115 }, { 0xA116, 0xA116, 0xA116 }, { 0xA117, 0xA117, 0xA117 }, { 0xA118, 0xA118, 0xA118 }, { 0xA119, 0xA119, 0xA119 }, { 0xA11A, 0xA11A, 0xA11A }, { 0xA11B, 0xA11B, 0xA11B }, { 0xA11C, 0xA11C, 0xA11C }, { 0xA11D, 0xA11D, 0xA11D }, { 0xA11E, 0xA11E, 0xA11E }, { 0xA11F, 0xA11F, 0xA11F }, { 0xA120, 0xA120, 0xA120 }, { 0xA121, 0xA121, 0xA121 }, { 0xA122, 0xA122, 0xA122 }, { 0xA123, 0xA123, 0xA123 }, { 0xA124, 0xA124, 0xA124 }, { 0xA125, 0xA125, 0xA125 }, { 0xA126, 0xA126, 0xA126 }, { 0xA127, 0xA127, 0xA127 }, { 0xA128, 0xA128, 0xA128 }, { 0xA129, 0xA129, 0xA129 }, { 0xA12A, 0xA12A, 0xA12A }, { 0xA12B, 0xA12B, 0xA12B }, { 0xA12C, 0xA12C, 0xA12C }, { 0xA12D, 0xA12D, 0xA12D }, { 0xA12E, 0xA12E, 0xA12E }, { 0xA12F, 0xA12F, 0xA12F }, { 0xA130, 0xA130, 0xA130 }, { 0xA131, 0xA131, 0xA131 }, { 0xA132, 0xA132, 0xA132 }, { 0xA133, 0xA133, 0xA133 }, { 0xA134, 0xA134, 0xA134 }, { 0xA135, 0xA135, 0xA135 }, { 0xA136, 0xA136, 0xA136 }, { 0xA137, 0xA137, 0xA137 }, { 0xA138, 0xA138, 0xA138 }, { 0xA139, 0xA139, 0xA139 }, { 0xA13A, 0xA13A, 0xA13A }, { 0xA13B, 0xA13B, 0xA13B }, { 0xA13C, 0xA13C, 0xA13C }, { 0xA13D, 0xA13D, 0xA13D }, { 0xA13E, 0xA13E, 0xA13E }, { 0xA13F, 0xA13F, 0xA13F }, { 0xA140, 0xA140, 0xA140 }, { 0xA141, 0xA141, 0xA141 }, { 0xA142, 0xA142, 0xA142 }, { 0xA143, 0xA143, 0xA143 }, { 0xA144, 0xA144, 0xA144 }, { 0xA145, 0xA145, 0xA145 }, { 0xA146, 0xA146, 0xA146 }, { 0xA147, 0xA147, 0xA147 }, { 0xA148, 0xA148, 0xA148 }, { 0xA149, 0xA149, 0xA149 }, { 0xA14A, 0xA14A, 0xA14A }, { 0xA14B, 0xA14B, 0xA14B }, { 0xA14C, 0xA14C, 0xA14C }, { 0xA14D, 0xA14D, 0xA14D }, { 0xA14E, 0xA14E, 0xA14E }, { 0xA14F, 0xA14F, 0xA14F }, { 0xA150, 0xA150, 0xA150 }, { 0xA151, 0xA151, 0xA151 }, { 0xA152, 0xA152, 0xA152 }, { 0xA153, 0xA153, 0xA153 }, { 0xA154, 0xA154, 0xA154 }, { 0xA155, 0xA155, 0xA155 }, { 0xA156, 0xA156, 0xA156 }, { 0xA157, 0xA157, 0xA157 }, { 0xA158, 0xA158, 0xA158 }, { 0xA159, 0xA159, 0xA159 }, { 0xA15A, 0xA15A, 0xA15A }, { 0xA15B, 0xA15B, 0xA15B }, { 0xA15C, 0xA15C, 0xA15C }, { 0xA15D, 0xA15D, 0xA15D }, { 0xA15E, 0xA15E, 0xA15E }, { 0xA15F, 0xA15F, 0xA15F }, { 0xA160, 0xA160, 0xA160 }, { 0xA161, 0xA161, 0xA161 }, { 0xA162, 0xA162, 0xA162 }, { 0xA163, 0xA163, 0xA163 }, { 0xA164, 0xA164, 0xA164 }, { 0xA165, 0xA165, 0xA165 }, { 0xA166, 0xA166, 0xA166 }, { 0xA167, 0xA167, 0xA167 }, { 0xA168, 0xA168, 0xA168 }, { 0xA169, 0xA169, 0xA169 }, { 0xA16A, 0xA16A, 0xA16A }, { 0xA16B, 0xA16B, 0xA16B }, { 0xA16C, 0xA16C, 0xA16C }, { 0xA16D, 0xA16D, 0xA16D }, { 0xA16E, 0xA16E, 0xA16E }, { 0xA16F, 0xA16F, 0xA16F }, { 0xA170, 0xA170, 0xA170 }, { 0xA171, 0xA171, 0xA171 }, { 0xA172, 0xA172, 0xA172 }, { 0xA173, 0xA173, 0xA173 }, { 0xA174, 0xA174, 0xA174 }, { 0xA175, 0xA175, 0xA175 }, { 0xA176, 0xA176, 0xA176 }, { 0xA177, 0xA177, 0xA177 }, { 0xA178, 0xA178, 0xA178 }, { 0xA179, 0xA179, 0xA179 }, { 0xA17A, 0xA17A, 0xA17A }, { 0xA17B, 0xA17B, 0xA17B }, { 0xA17C, 0xA17C, 0xA17C }, { 0xA17D, 0xA17D, 0xA17D }, { 0xA17E, 0xA17E, 0xA17E }, { 0xA17F, 0xA17F, 0xA17F }, { 0xA180, 0xA180, 0xA180 }, { 0xA181, 0xA181, 0xA181 }, { 0xA182, 0xA182, 0xA182 }, { 0xA183, 0xA183, 0xA183 }, { 0xA184, 0xA184, 0xA184 }, { 0xA185, 0xA185, 0xA185 }, { 0xA186, 0xA186, 0xA186 }, { 0xA187, 0xA187, 0xA187 }, { 0xA188, 0xA188, 0xA188 }, { 0xA189, 0xA189, 0xA189 }, { 0xA18A, 0xA18A, 0xA18A }, { 0xA18B, 0xA18B, 0xA18B }, { 0xA18C, 0xA18C, 0xA18C }, { 0xA18D, 0xA18D, 0xA18D }, { 0xA18E, 0xA18E, 0xA18E }, { 0xA18F, 0xA18F, 0xA18F }, { 0xA190, 0xA190, 0xA190 }, { 0xA191, 0xA191, 0xA191 }, { 0xA192, 0xA192, 0xA192 }, { 0xA193, 0xA193, 0xA193 }, { 0xA194, 0xA194, 0xA194 }, { 0xA195, 0xA195, 0xA195 }, { 0xA196, 0xA196, 0xA196 }, { 0xA197, 0xA197, 0xA197 }, { 0xA198, 0xA198, 0xA198 }, { 0xA199, 0xA199, 0xA199 }, { 0xA19A, 0xA19A, 0xA19A }, { 0xA19B, 0xA19B, 0xA19B }, { 0xA19C, 0xA19C, 0xA19C }, { 0xA19D, 0xA19D, 0xA19D }, { 0xA19E, 0xA19E, 0xA19E }, { 0xA19F, 0xA19F, 0xA19F }, { 0xA1A0, 0xA1A0, 0xA1A0 }, { 0xA1A1, 0xA1A1, 0xA1A1 }, { 0xA1A2, 0xA1A2, 0xA1A2 }, { 0xA1A3, 0xA1A3, 0xA1A3 }, { 0xA1A4, 0xA1A4, 0xA1A4 }, { 0xA1A5, 0xA1A5, 0xA1A5 }, { 0xA1A6, 0xA1A6, 0xA1A6 }, { 0xA1A7, 0xA1A7, 0xA1A7 }, { 0xA1A8, 0xA1A8, 0xA1A8 }, { 0xA1A9, 0xA1A9, 0xA1A9 }, { 0xA1AA, 0xA1AA, 0xA1AA }, { 0xA1AB, 0xA1AB, 0xA1AB }, { 0xA1AC, 0xA1AC, 0xA1AC }, { 0xA1AD, 0xA1AD, 0xA1AD }, { 0xA1AE, 0xA1AE, 0xA1AE }, { 0xA1AF, 0xA1AF, 0xA1AF }, { 0xA1B0, 0xA1B0, 0xA1B0 }, { 0xA1B1, 0xA1B1, 0xA1B1 }, { 0xA1B2, 0xA1B2, 0xA1B2 }, { 0xA1B3, 0xA1B3, 0xA1B3 }, { 0xA1B4, 0xA1B4, 0xA1B4 }, { 0xA1B5, 0xA1B5, 0xA1B5 }, { 0xA1B6, 0xA1B6, 0xA1B6 }, { 0xA1B7, 0xA1B7, 0xA1B7 }, { 0xA1B8, 0xA1B8, 0xA1B8 }, { 0xA1B9, 0xA1B9, 0xA1B9 }, { 0xA1BA, 0xA1BA, 0xA1BA }, { 0xA1BB, 0xA1BB, 0xA1BB }, { 0xA1BC, 0xA1BC, 0xA1BC }, { 0xA1BD, 0xA1BD, 0xA1BD }, { 0xA1BE, 0xA1BE, 0xA1BE }, { 0xA1BF, 0xA1BF, 0xA1BF }, { 0xA1C0, 0xA1C0, 0xA1C0 }, { 0xA1C1, 0xA1C1, 0xA1C1 }, { 0xA1C2, 0xA1C2, 0xA1C2 }, { 0xA1C3, 0xA1C3, 0xA1C3 }, { 0xA1C4, 0xA1C4, 0xA1C4 }, { 0xA1C5, 0xA1C5, 0xA1C5 }, { 0xA1C6, 0xA1C6, 0xA1C6 }, { 0xA1C7, 0xA1C7, 0xA1C7 }, { 0xA1C8, 0xA1C8, 0xA1C8 }, { 0xA1C9, 0xA1C9, 0xA1C9 }, { 0xA1CA, 0xA1CA, 0xA1CA }, { 0xA1CB, 0xA1CB, 0xA1CB }, { 0xA1CC, 0xA1CC, 0xA1CC }, { 0xA1CD, 0xA1CD, 0xA1CD }, { 0xA1CE, 0xA1CE, 0xA1CE }, { 0xA1CF, 0xA1CF, 0xA1CF }, { 0xA1D0, 0xA1D0, 0xA1D0 }, { 0xA1D1, 0xA1D1, 0xA1D1 }, { 0xA1D2, 0xA1D2, 0xA1D2 }, { 0xA1D3, 0xA1D3, 0xA1D3 }, { 0xA1D4, 0xA1D4, 0xA1D4 }, { 0xA1D5, 0xA1D5, 0xA1D5 }, { 0xA1D6, 0xA1D6, 0xA1D6 }, { 0xA1D7, 0xA1D7, 0xA1D7 }, { 0xA1D8, 0xA1D8, 0xA1D8 }, { 0xA1D9, 0xA1D9, 0xA1D9 }, { 0xA1DA, 0xA1DA, 0xA1DA }, { 0xA1DB, 0xA1DB, 0xA1DB }, { 0xA1DC, 0xA1DC, 0xA1DC }, { 0xA1DD, 0xA1DD, 0xA1DD }, { 0xA1DE, 0xA1DE, 0xA1DE }, { 0xA1DF, 0xA1DF, 0xA1DF }, { 0xA1E0, 0xA1E0, 0xA1E0 }, { 0xA1E1, 0xA1E1, 0xA1E1 }, { 0xA1E2, 0xA1E2, 0xA1E2 }, { 0xA1E3, 0xA1E3, 0xA1E3 }, { 0xA1E4, 0xA1E4, 0xA1E4 }, { 0xA1E5, 0xA1E5, 0xA1E5 }, { 0xA1E6, 0xA1E6, 0xA1E6 }, { 0xA1E7, 0xA1E7, 0xA1E7 }, { 0xA1E8, 0xA1E8, 0xA1E8 }, { 0xA1E9, 0xA1E9, 0xA1E9 }, { 0xA1EA, 0xA1EA, 0xA1EA }, { 0xA1EB, 0xA1EB, 0xA1EB }, { 0xA1EC, 0xA1EC, 0xA1EC }, { 0xA1ED, 0xA1ED, 0xA1ED }, { 0xA1EE, 0xA1EE, 0xA1EE }, { 0xA1EF, 0xA1EF, 0xA1EF }, { 0xA1F0, 0xA1F0, 0xA1F0 }, { 0xA1F1, 0xA1F1, 0xA1F1 }, { 0xA1F2, 0xA1F2, 0xA1F2 }, { 0xA1F3, 0xA1F3, 0xA1F3 }, { 0xA1F4, 0xA1F4, 0xA1F4 }, { 0xA1F5, 0xA1F5, 0xA1F5 }, { 0xA1F6, 0xA1F6, 0xA1F6 }, { 0xA1F7, 0xA1F7, 0xA1F7 }, { 0xA1F8, 0xA1F8, 0xA1F8 }, { 0xA1F9, 0xA1F9, 0xA1F9 }, { 0xA1FA, 0xA1FA, 0xA1FA }, { 0xA1FB, 0xA1FB, 0xA1FB }, { 0xA1FC, 0xA1FC, 0xA1FC }, { 0xA1FD, 0xA1FD, 0xA1FD }, { 0xA1FE, 0xA1FE, 0xA1FE }, { 0xA1FF, 0xA1FF, 0xA1FF }, { 0xA200, 0xA200, 0xA200 }, { 0xA201, 0xA201, 0xA201 }, { 0xA202, 0xA202, 0xA202 }, { 0xA203, 0xA203, 0xA203 }, { 0xA204, 0xA204, 0xA204 }, { 0xA205, 0xA205, 0xA205 }, { 0xA206, 0xA206, 0xA206 }, { 0xA207, 0xA207, 0xA207 }, { 0xA208, 0xA208, 0xA208 }, { 0xA209, 0xA209, 0xA209 }, { 0xA20A, 0xA20A, 0xA20A }, { 0xA20B, 0xA20B, 0xA20B }, { 0xA20C, 0xA20C, 0xA20C }, { 0xA20D, 0xA20D, 0xA20D }, { 0xA20E, 0xA20E, 0xA20E }, { 0xA20F, 0xA20F, 0xA20F }, { 0xA210, 0xA210, 0xA210 }, { 0xA211, 0xA211, 0xA211 }, { 0xA212, 0xA212, 0xA212 }, { 0xA213, 0xA213, 0xA213 }, { 0xA214, 0xA214, 0xA214 }, { 0xA215, 0xA215, 0xA215 }, { 0xA216, 0xA216, 0xA216 }, { 0xA217, 0xA217, 0xA217 }, { 0xA218, 0xA218, 0xA218 }, { 0xA219, 0xA219, 0xA219 }, { 0xA21A, 0xA21A, 0xA21A }, { 0xA21B, 0xA21B, 0xA21B }, { 0xA21C, 0xA21C, 0xA21C }, { 0xA21D, 0xA21D, 0xA21D }, { 0xA21E, 0xA21E, 0xA21E }, { 0xA21F, 0xA21F, 0xA21F }, { 0xA220, 0xA220, 0xA220 }, { 0xA221, 0xA221, 0xA221 }, { 0xA222, 0xA222, 0xA222 }, { 0xA223, 0xA223, 0xA223 }, { 0xA224, 0xA224, 0xA224 }, { 0xA225, 0xA225, 0xA225 }, { 0xA226, 0xA226, 0xA226 }, { 0xA227, 0xA227, 0xA227 }, { 0xA228, 0xA228, 0xA228 }, { 0xA229, 0xA229, 0xA229 }, { 0xA22A, 0xA22A, 0xA22A }, { 0xA22B, 0xA22B, 0xA22B }, { 0xA22C, 0xA22C, 0xA22C }, { 0xA22D, 0xA22D, 0xA22D }, { 0xA22E, 0xA22E, 0xA22E }, { 0xA22F, 0xA22F, 0xA22F }, { 0xA230, 0xA230, 0xA230 }, { 0xA231, 0xA231, 0xA231 }, { 0xA232, 0xA232, 0xA232 }, { 0xA233, 0xA233, 0xA233 }, { 0xA234, 0xA234, 0xA234 }, { 0xA235, 0xA235, 0xA235 }, { 0xA236, 0xA236, 0xA236 }, { 0xA237, 0xA237, 0xA237 }, { 0xA238, 0xA238, 0xA238 }, { 0xA239, 0xA239, 0xA239 }, { 0xA23A, 0xA23A, 0xA23A }, { 0xA23B, 0xA23B, 0xA23B }, { 0xA23C, 0xA23C, 0xA23C }, { 0xA23D, 0xA23D, 0xA23D }, { 0xA23E, 0xA23E, 0xA23E }, { 0xA23F, 0xA23F, 0xA23F }, { 0xA240, 0xA240, 0xA240 }, { 0xA241, 0xA241, 0xA241 }, { 0xA242, 0xA242, 0xA242 }, { 0xA243, 0xA243, 0xA243 }, { 0xA244, 0xA244, 0xA244 }, { 0xA245, 0xA245, 0xA245 }, { 0xA246, 0xA246, 0xA246 }, { 0xA247, 0xA247, 0xA247 }, { 0xA248, 0xA248, 0xA248 }, { 0xA249, 0xA249, 0xA249 }, { 0xA24A, 0xA24A, 0xA24A }, { 0xA24B, 0xA24B, 0xA24B }, { 0xA24C, 0xA24C, 0xA24C }, { 0xA24D, 0xA24D, 0xA24D }, { 0xA24E, 0xA24E, 0xA24E }, { 0xA24F, 0xA24F, 0xA24F }, { 0xA250, 0xA250, 0xA250 }, { 0xA251, 0xA251, 0xA251 }, { 0xA252, 0xA252, 0xA252 }, { 0xA253, 0xA253, 0xA253 }, { 0xA254, 0xA254, 0xA254 }, { 0xA255, 0xA255, 0xA255 }, { 0xA256, 0xA256, 0xA256 }, { 0xA257, 0xA257, 0xA257 }, { 0xA258, 0xA258, 0xA258 }, { 0xA259, 0xA259, 0xA259 }, { 0xA25A, 0xA25A, 0xA25A }, { 0xA25B, 0xA25B, 0xA25B }, { 0xA25C, 0xA25C, 0xA25C }, { 0xA25D, 0xA25D, 0xA25D }, { 0xA25E, 0xA25E, 0xA25E }, { 0xA25F, 0xA25F, 0xA25F }, { 0xA260, 0xA260, 0xA260 }, { 0xA261, 0xA261, 0xA261 }, { 0xA262, 0xA262, 0xA262 }, { 0xA263, 0xA263, 0xA263 }, { 0xA264, 0xA264, 0xA264 }, { 0xA265, 0xA265, 0xA265 }, { 0xA266, 0xA266, 0xA266 }, { 0xA267, 0xA267, 0xA267 }, { 0xA268, 0xA268, 0xA268 }, { 0xA269, 0xA269, 0xA269 }, { 0xA26A, 0xA26A, 0xA26A }, { 0xA26B, 0xA26B, 0xA26B }, { 0xA26C, 0xA26C, 0xA26C }, { 0xA26D, 0xA26D, 0xA26D }, { 0xA26E, 0xA26E, 0xA26E }, { 0xA26F, 0xA26F, 0xA26F }, { 0xA270, 0xA270, 0xA270 }, { 0xA271, 0xA271, 0xA271 }, { 0xA272, 0xA272, 0xA272 }, { 0xA273, 0xA273, 0xA273 }, { 0xA274, 0xA274, 0xA274 }, { 0xA275, 0xA275, 0xA275 }, { 0xA276, 0xA276, 0xA276 }, { 0xA277, 0xA277, 0xA277 }, { 0xA278, 0xA278, 0xA278 }, { 0xA279, 0xA279, 0xA279 }, { 0xA27A, 0xA27A, 0xA27A }, { 0xA27B, 0xA27B, 0xA27B }, { 0xA27C, 0xA27C, 0xA27C }, { 0xA27D, 0xA27D, 0xA27D }, { 0xA27E, 0xA27E, 0xA27E }, { 0xA27F, 0xA27F, 0xA27F }, { 0xA280, 0xA280, 0xA280 }, { 0xA281, 0xA281, 0xA281 }, { 0xA282, 0xA282, 0xA282 }, { 0xA283, 0xA283, 0xA283 }, { 0xA284, 0xA284, 0xA284 }, { 0xA285, 0xA285, 0xA285 }, { 0xA286, 0xA286, 0xA286 }, { 0xA287, 0xA287, 0xA287 }, { 0xA288, 0xA288, 0xA288 }, { 0xA289, 0xA289, 0xA289 }, { 0xA28A, 0xA28A, 0xA28A }, { 0xA28B, 0xA28B, 0xA28B }, { 0xA28C, 0xA28C, 0xA28C }, { 0xA28D, 0xA28D, 0xA28D }, { 0xA28E, 0xA28E, 0xA28E }, { 0xA28F, 0xA28F, 0xA28F }, { 0xA290, 0xA290, 0xA290 }, { 0xA291, 0xA291, 0xA291 }, { 0xA292, 0xA292, 0xA292 }, { 0xA293, 0xA293, 0xA293 }, { 0xA294, 0xA294, 0xA294 }, { 0xA295, 0xA295, 0xA295 }, { 0xA296, 0xA296, 0xA296 }, { 0xA297, 0xA297, 0xA297 }, { 0xA298, 0xA298, 0xA298 }, { 0xA299, 0xA299, 0xA299 }, { 0xA29A, 0xA29A, 0xA29A }, { 0xA29B, 0xA29B, 0xA29B }, { 0xA29C, 0xA29C, 0xA29C }, { 0xA29D, 0xA29D, 0xA29D }, { 0xA29E, 0xA29E, 0xA29E }, { 0xA29F, 0xA29F, 0xA29F }, { 0xA2A0, 0xA2A0, 0xA2A0 }, { 0xA2A1, 0xA2A1, 0xA2A1 }, { 0xA2A2, 0xA2A2, 0xA2A2 }, { 0xA2A3, 0xA2A3, 0xA2A3 }, { 0xA2A4, 0xA2A4, 0xA2A4 }, { 0xA2A5, 0xA2A5, 0xA2A5 }, { 0xA2A6, 0xA2A6, 0xA2A6 }, { 0xA2A7, 0xA2A7, 0xA2A7 }, { 0xA2A8, 0xA2A8, 0xA2A8 }, { 0xA2A9, 0xA2A9, 0xA2A9 }, { 0xA2AA, 0xA2AA, 0xA2AA }, { 0xA2AB, 0xA2AB, 0xA2AB }, { 0xA2AC, 0xA2AC, 0xA2AC }, { 0xA2AD, 0xA2AD, 0xA2AD }, { 0xA2AE, 0xA2AE, 0xA2AE }, { 0xA2AF, 0xA2AF, 0xA2AF }, { 0xA2B0, 0xA2B0, 0xA2B0 }, { 0xA2B1, 0xA2B1, 0xA2B1 }, { 0xA2B2, 0xA2B2, 0xA2B2 }, { 0xA2B3, 0xA2B3, 0xA2B3 }, { 0xA2B4, 0xA2B4, 0xA2B4 }, { 0xA2B5, 0xA2B5, 0xA2B5 }, { 0xA2B6, 0xA2B6, 0xA2B6 }, { 0xA2B7, 0xA2B7, 0xA2B7 }, { 0xA2B8, 0xA2B8, 0xA2B8 }, { 0xA2B9, 0xA2B9, 0xA2B9 }, { 0xA2BA, 0xA2BA, 0xA2BA }, { 0xA2BB, 0xA2BB, 0xA2BB }, { 0xA2BC, 0xA2BC, 0xA2BC }, { 0xA2BD, 0xA2BD, 0xA2BD }, { 0xA2BE, 0xA2BE, 0xA2BE }, { 0xA2BF, 0xA2BF, 0xA2BF }, { 0xA2C0, 0xA2C0, 0xA2C0 }, { 0xA2C1, 0xA2C1, 0xA2C1 }, { 0xA2C2, 0xA2C2, 0xA2C2 }, { 0xA2C3, 0xA2C3, 0xA2C3 }, { 0xA2C4, 0xA2C4, 0xA2C4 }, { 0xA2C5, 0xA2C5, 0xA2C5 }, { 0xA2C6, 0xA2C6, 0xA2C6 }, { 0xA2C7, 0xA2C7, 0xA2C7 }, { 0xA2C8, 0xA2C8, 0xA2C8 }, { 0xA2C9, 0xA2C9, 0xA2C9 }, { 0xA2CA, 0xA2CA, 0xA2CA }, { 0xA2CB, 0xA2CB, 0xA2CB }, { 0xA2CC, 0xA2CC, 0xA2CC }, { 0xA2CD, 0xA2CD, 0xA2CD }, { 0xA2CE, 0xA2CE, 0xA2CE }, { 0xA2CF, 0xA2CF, 0xA2CF }, { 0xA2D0, 0xA2D0, 0xA2D0 }, { 0xA2D1, 0xA2D1, 0xA2D1 }, { 0xA2D2, 0xA2D2, 0xA2D2 }, { 0xA2D3, 0xA2D3, 0xA2D3 }, { 0xA2D4, 0xA2D4, 0xA2D4 }, { 0xA2D5, 0xA2D5, 0xA2D5 }, { 0xA2D6, 0xA2D6, 0xA2D6 }, { 0xA2D7, 0xA2D7, 0xA2D7 }, { 0xA2D8, 0xA2D8, 0xA2D8 }, { 0xA2D9, 0xA2D9, 0xA2D9 }, { 0xA2DA, 0xA2DA, 0xA2DA }, { 0xA2DB, 0xA2DB, 0xA2DB }, { 0xA2DC, 0xA2DC, 0xA2DC }, { 0xA2DD, 0xA2DD, 0xA2DD }, { 0xA2DE, 0xA2DE, 0xA2DE }, { 0xA2DF, 0xA2DF, 0xA2DF }, { 0xA2E0, 0xA2E0, 0xA2E0 }, { 0xA2E1, 0xA2E1, 0xA2E1 }, { 0xA2E2, 0xA2E2, 0xA2E2 }, { 0xA2E3, 0xA2E3, 0xA2E3 }, { 0xA2E4, 0xA2E4, 0xA2E4 }, { 0xA2E5, 0xA2E5, 0xA2E5 }, { 0xA2E6, 0xA2E6, 0xA2E6 }, { 0xA2E7, 0xA2E7, 0xA2E7 }, { 0xA2E8, 0xA2E8, 0xA2E8 }, { 0xA2E9, 0xA2E9, 0xA2E9 }, { 0xA2EA, 0xA2EA, 0xA2EA }, { 0xA2EB, 0xA2EB, 0xA2EB }, { 0xA2EC, 0xA2EC, 0xA2EC }, { 0xA2ED, 0xA2ED, 0xA2ED }, { 0xA2EE, 0xA2EE, 0xA2EE }, { 0xA2EF, 0xA2EF, 0xA2EF }, { 0xA2F0, 0xA2F0, 0xA2F0 }, { 0xA2F1, 0xA2F1, 0xA2F1 }, { 0xA2F2, 0xA2F2, 0xA2F2 }, { 0xA2F3, 0xA2F3, 0xA2F3 }, { 0xA2F4, 0xA2F4, 0xA2F4 }, { 0xA2F5, 0xA2F5, 0xA2F5 }, { 0xA2F6, 0xA2F6, 0xA2F6 }, { 0xA2F7, 0xA2F7, 0xA2F7 }, { 0xA2F8, 0xA2F8, 0xA2F8 }, { 0xA2F9, 0xA2F9, 0xA2F9 }, { 0xA2FA, 0xA2FA, 0xA2FA }, { 0xA2FB, 0xA2FB, 0xA2FB }, { 0xA2FC, 0xA2FC, 0xA2FC }, { 0xA2FD, 0xA2FD, 0xA2FD }, { 0xA2FE, 0xA2FE, 0xA2FE }, { 0xA2FF, 0xA2FF, 0xA2FF }, { 0xA300, 0xA300, 0xA300 }, { 0xA301, 0xA301, 0xA301 }, { 0xA302, 0xA302, 0xA302 }, { 0xA303, 0xA303, 0xA303 }, { 0xA304, 0xA304, 0xA304 }, { 0xA305, 0xA305, 0xA305 }, { 0xA306, 0xA306, 0xA306 }, { 0xA307, 0xA307, 0xA307 }, { 0xA308, 0xA308, 0xA308 }, { 0xA309, 0xA309, 0xA309 }, { 0xA30A, 0xA30A, 0xA30A }, { 0xA30B, 0xA30B, 0xA30B }, { 0xA30C, 0xA30C, 0xA30C }, { 0xA30D, 0xA30D, 0xA30D }, { 0xA30E, 0xA30E, 0xA30E }, { 0xA30F, 0xA30F, 0xA30F }, { 0xA310, 0xA310, 0xA310 }, { 0xA311, 0xA311, 0xA311 }, { 0xA312, 0xA312, 0xA312 }, { 0xA313, 0xA313, 0xA313 }, { 0xA314, 0xA314, 0xA314 }, { 0xA315, 0xA315, 0xA315 }, { 0xA316, 0xA316, 0xA316 }, { 0xA317, 0xA317, 0xA317 }, { 0xA318, 0xA318, 0xA318 }, { 0xA319, 0xA319, 0xA319 }, { 0xA31A, 0xA31A, 0xA31A }, { 0xA31B, 0xA31B, 0xA31B }, { 0xA31C, 0xA31C, 0xA31C }, { 0xA31D, 0xA31D, 0xA31D }, { 0xA31E, 0xA31E, 0xA31E }, { 0xA31F, 0xA31F, 0xA31F }, { 0xA320, 0xA320, 0xA320 }, { 0xA321, 0xA321, 0xA321 }, { 0xA322, 0xA322, 0xA322 }, { 0xA323, 0xA323, 0xA323 }, { 0xA324, 0xA324, 0xA324 }, { 0xA325, 0xA325, 0xA325 }, { 0xA326, 0xA326, 0xA326 }, { 0xA327, 0xA327, 0xA327 }, { 0xA328, 0xA328, 0xA328 }, { 0xA329, 0xA329, 0xA329 }, { 0xA32A, 0xA32A, 0xA32A }, { 0xA32B, 0xA32B, 0xA32B }, { 0xA32C, 0xA32C, 0xA32C }, { 0xA32D, 0xA32D, 0xA32D }, { 0xA32E, 0xA32E, 0xA32E }, { 0xA32F, 0xA32F, 0xA32F }, { 0xA330, 0xA330, 0xA330 }, { 0xA331, 0xA331, 0xA331 }, { 0xA332, 0xA332, 0xA332 }, { 0xA333, 0xA333, 0xA333 }, { 0xA334, 0xA334, 0xA334 }, { 0xA335, 0xA335, 0xA335 }, { 0xA336, 0xA336, 0xA336 }, { 0xA337, 0xA337, 0xA337 }, { 0xA338, 0xA338, 0xA338 }, { 0xA339, 0xA339, 0xA339 }, { 0xA33A, 0xA33A, 0xA33A }, { 0xA33B, 0xA33B, 0xA33B }, { 0xA33C, 0xA33C, 0xA33C }, { 0xA33D, 0xA33D, 0xA33D }, { 0xA33E, 0xA33E, 0xA33E }, { 0xA33F, 0xA33F, 0xA33F }, { 0xA340, 0xA340, 0xA340 }, { 0xA341, 0xA341, 0xA341 }, { 0xA342, 0xA342, 0xA342 }, { 0xA343, 0xA343, 0xA343 }, { 0xA344, 0xA344, 0xA344 }, { 0xA345, 0xA345, 0xA345 }, { 0xA346, 0xA346, 0xA346 }, { 0xA347, 0xA347, 0xA347 }, { 0xA348, 0xA348, 0xA348 }, { 0xA349, 0xA349, 0xA349 }, { 0xA34A, 0xA34A, 0xA34A }, { 0xA34B, 0xA34B, 0xA34B }, { 0xA34C, 0xA34C, 0xA34C }, { 0xA34D, 0xA34D, 0xA34D }, { 0xA34E, 0xA34E, 0xA34E }, { 0xA34F, 0xA34F, 0xA34F }, { 0xA350, 0xA350, 0xA350 }, { 0xA351, 0xA351, 0xA351 }, { 0xA352, 0xA352, 0xA352 }, { 0xA353, 0xA353, 0xA353 }, { 0xA354, 0xA354, 0xA354 }, { 0xA355, 0xA355, 0xA355 }, { 0xA356, 0xA356, 0xA356 }, { 0xA357, 0xA357, 0xA357 }, { 0xA358, 0xA358, 0xA358 }, { 0xA359, 0xA359, 0xA359 }, { 0xA35A, 0xA35A, 0xA35A }, { 0xA35B, 0xA35B, 0xA35B }, { 0xA35C, 0xA35C, 0xA35C }, { 0xA35D, 0xA35D, 0xA35D }, { 0xA35E, 0xA35E, 0xA35E }, { 0xA35F, 0xA35F, 0xA35F }, { 0xA360, 0xA360, 0xA360 }, { 0xA361, 0xA361, 0xA361 }, { 0xA362, 0xA362, 0xA362 }, { 0xA363, 0xA363, 0xA363 }, { 0xA364, 0xA364, 0xA364 }, { 0xA365, 0xA365, 0xA365 }, { 0xA366, 0xA366, 0xA366 }, { 0xA367, 0xA367, 0xA367 }, { 0xA368, 0xA368, 0xA368 }, { 0xA369, 0xA369, 0xA369 }, { 0xA36A, 0xA36A, 0xA36A }, { 0xA36B, 0xA36B, 0xA36B }, { 0xA36C, 0xA36C, 0xA36C }, { 0xA36D, 0xA36D, 0xA36D }, { 0xA36E, 0xA36E, 0xA36E }, { 0xA36F, 0xA36F, 0xA36F }, { 0xA370, 0xA370, 0xA370 }, { 0xA371, 0xA371, 0xA371 }, { 0xA372, 0xA372, 0xA372 }, { 0xA373, 0xA373, 0xA373 }, { 0xA374, 0xA374, 0xA374 }, { 0xA375, 0xA375, 0xA375 }, { 0xA376, 0xA376, 0xA376 }, { 0xA377, 0xA377, 0xA377 }, { 0xA378, 0xA378, 0xA378 }, { 0xA379, 0xA379, 0xA379 }, { 0xA37A, 0xA37A, 0xA37A }, { 0xA37B, 0xA37B, 0xA37B }, { 0xA37C, 0xA37C, 0xA37C }, { 0xA37D, 0xA37D, 0xA37D }, { 0xA37E, 0xA37E, 0xA37E }, { 0xA37F, 0xA37F, 0xA37F }, { 0xA380, 0xA380, 0xA380 }, { 0xA381, 0xA381, 0xA381 }, { 0xA382, 0xA382, 0xA382 }, { 0xA383, 0xA383, 0xA383 }, { 0xA384, 0xA384, 0xA384 }, { 0xA385, 0xA385, 0xA385 }, { 0xA386, 0xA386, 0xA386 }, { 0xA387, 0xA387, 0xA387 }, { 0xA388, 0xA388, 0xA388 }, { 0xA389, 0xA389, 0xA389 }, { 0xA38A, 0xA38A, 0xA38A }, { 0xA38B, 0xA38B, 0xA38B }, { 0xA38C, 0xA38C, 0xA38C }, { 0xA38D, 0xA38D, 0xA38D }, { 0xA38E, 0xA38E, 0xA38E }, { 0xA38F, 0xA38F, 0xA38F }, { 0xA390, 0xA390, 0xA390 }, { 0xA391, 0xA391, 0xA391 }, { 0xA392, 0xA392, 0xA392 }, { 0xA393, 0xA393, 0xA393 }, { 0xA394, 0xA394, 0xA394 }, { 0xA395, 0xA395, 0xA395 }, { 0xA396, 0xA396, 0xA396 }, { 0xA397, 0xA397, 0xA397 }, { 0xA398, 0xA398, 0xA398 }, { 0xA399, 0xA399, 0xA399 }, { 0xA39A, 0xA39A, 0xA39A }, { 0xA39B, 0xA39B, 0xA39B }, { 0xA39C, 0xA39C, 0xA39C }, { 0xA39D, 0xA39D, 0xA39D }, { 0xA39E, 0xA39E, 0xA39E }, { 0xA39F, 0xA39F, 0xA39F }, { 0xA3A0, 0xA3A0, 0xA3A0 }, { 0xA3A1, 0xA3A1, 0xA3A1 }, { 0xA3A2, 0xA3A2, 0xA3A2 }, { 0xA3A3, 0xA3A3, 0xA3A3 }, { 0xA3A4, 0xA3A4, 0xA3A4 }, { 0xA3A5, 0xA3A5, 0xA3A5 }, { 0xA3A6, 0xA3A6, 0xA3A6 }, { 0xA3A7, 0xA3A7, 0xA3A7 }, { 0xA3A8, 0xA3A8, 0xA3A8 }, { 0xA3A9, 0xA3A9, 0xA3A9 }, { 0xA3AA, 0xA3AA, 0xA3AA }, { 0xA3AB, 0xA3AB, 0xA3AB }, { 0xA3AC, 0xA3AC, 0xA3AC }, { 0xA3AD, 0xA3AD, 0xA3AD }, { 0xA3AE, 0xA3AE, 0xA3AE }, { 0xA3AF, 0xA3AF, 0xA3AF }, { 0xA3B0, 0xA3B0, 0xA3B0 }, { 0xA3B1, 0xA3B1, 0xA3B1 }, { 0xA3B2, 0xA3B2, 0xA3B2 }, { 0xA3B3, 0xA3B3, 0xA3B3 }, { 0xA3B4, 0xA3B4, 0xA3B4 }, { 0xA3B5, 0xA3B5, 0xA3B5 }, { 0xA3B6, 0xA3B6, 0xA3B6 }, { 0xA3B7, 0xA3B7, 0xA3B7 }, { 0xA3B8, 0xA3B8, 0xA3B8 }, { 0xA3B9, 0xA3B9, 0xA3B9 }, { 0xA3BA, 0xA3BA, 0xA3BA }, { 0xA3BB, 0xA3BB, 0xA3BB }, { 0xA3BC, 0xA3BC, 0xA3BC }, { 0xA3BD, 0xA3BD, 0xA3BD }, { 0xA3BE, 0xA3BE, 0xA3BE }, { 0xA3BF, 0xA3BF, 0xA3BF }, { 0xA3C0, 0xA3C0, 0xA3C0 }, { 0xA3C1, 0xA3C1, 0xA3C1 }, { 0xA3C2, 0xA3C2, 0xA3C2 }, { 0xA3C3, 0xA3C3, 0xA3C3 }, { 0xA3C4, 0xA3C4, 0xA3C4 }, { 0xA3C5, 0xA3C5, 0xA3C5 }, { 0xA3C6, 0xA3C6, 0xA3C6 }, { 0xA3C7, 0xA3C7, 0xA3C7 }, { 0xA3C8, 0xA3C8, 0xA3C8 }, { 0xA3C9, 0xA3C9, 0xA3C9 }, { 0xA3CA, 0xA3CA, 0xA3CA }, { 0xA3CB, 0xA3CB, 0xA3CB }, { 0xA3CC, 0xA3CC, 0xA3CC }, { 0xA3CD, 0xA3CD, 0xA3CD }, { 0xA3CE, 0xA3CE, 0xA3CE }, { 0xA3CF, 0xA3CF, 0xA3CF }, { 0xA3D0, 0xA3D0, 0xA3D0 }, { 0xA3D1, 0xA3D1, 0xA3D1 }, { 0xA3D2, 0xA3D2, 0xA3D2 }, { 0xA3D3, 0xA3D3, 0xA3D3 }, { 0xA3D4, 0xA3D4, 0xA3D4 }, { 0xA3D5, 0xA3D5, 0xA3D5 }, { 0xA3D6, 0xA3D6, 0xA3D6 }, { 0xA3D7, 0xA3D7, 0xA3D7 }, { 0xA3D8, 0xA3D8, 0xA3D8 }, { 0xA3D9, 0xA3D9, 0xA3D9 }, { 0xA3DA, 0xA3DA, 0xA3DA }, { 0xA3DB, 0xA3DB, 0xA3DB }, { 0xA3DC, 0xA3DC, 0xA3DC }, { 0xA3DD, 0xA3DD, 0xA3DD }, { 0xA3DE, 0xA3DE, 0xA3DE }, { 0xA3DF, 0xA3DF, 0xA3DF }, { 0xA3E0, 0xA3E0, 0xA3E0 }, { 0xA3E1, 0xA3E1, 0xA3E1 }, { 0xA3E2, 0xA3E2, 0xA3E2 }, { 0xA3E3, 0xA3E3, 0xA3E3 }, { 0xA3E4, 0xA3E4, 0xA3E4 }, { 0xA3E5, 0xA3E5, 0xA3E5 }, { 0xA3E6, 0xA3E6, 0xA3E6 }, { 0xA3E7, 0xA3E7, 0xA3E7 }, { 0xA3E8, 0xA3E8, 0xA3E8 }, { 0xA3E9, 0xA3E9, 0xA3E9 }, { 0xA3EA, 0xA3EA, 0xA3EA }, { 0xA3EB, 0xA3EB, 0xA3EB }, { 0xA3EC, 0xA3EC, 0xA3EC }, { 0xA3ED, 0xA3ED, 0xA3ED }, { 0xA3EE, 0xA3EE, 0xA3EE }, { 0xA3EF, 0xA3EF, 0xA3EF }, { 0xA3F0, 0xA3F0, 0xA3F0 }, { 0xA3F1, 0xA3F1, 0xA3F1 }, { 0xA3F2, 0xA3F2, 0xA3F2 }, { 0xA3F3, 0xA3F3, 0xA3F3 }, { 0xA3F4, 0xA3F4, 0xA3F4 }, { 0xA3F5, 0xA3F5, 0xA3F5 }, { 0xA3F6, 0xA3F6, 0xA3F6 }, { 0xA3F7, 0xA3F7, 0xA3F7 }, { 0xA3F8, 0xA3F8, 0xA3F8 }, { 0xA3F9, 0xA3F9, 0xA3F9 }, { 0xA3FA, 0xA3FA, 0xA3FA }, { 0xA3FB, 0xA3FB, 0xA3FB }, { 0xA3FC, 0xA3FC, 0xA3FC }, { 0xA3FD, 0xA3FD, 0xA3FD }, { 0xA3FE, 0xA3FE, 0xA3FE }, { 0xA3FF, 0xA3FF, 0xA3FF }, { 0xA400, 0xA400, 0xA400 }, { 0xA401, 0xA401, 0xA401 }, { 0xA402, 0xA402, 0xA402 }, { 0xA403, 0xA403, 0xA403 }, { 0xA404, 0xA404, 0xA404 }, { 0xA405, 0xA405, 0xA405 }, { 0xA406, 0xA406, 0xA406 }, { 0xA407, 0xA407, 0xA407 }, { 0xA408, 0xA408, 0xA408 }, { 0xA409, 0xA409, 0xA409 }, { 0xA40A, 0xA40A, 0xA40A }, { 0xA40B, 0xA40B, 0xA40B }, { 0xA40C, 0xA40C, 0xA40C }, { 0xA40D, 0xA40D, 0xA40D }, { 0xA40E, 0xA40E, 0xA40E }, { 0xA40F, 0xA40F, 0xA40F }, { 0xA410, 0xA410, 0xA410 }, { 0xA411, 0xA411, 0xA411 }, { 0xA412, 0xA412, 0xA412 }, { 0xA413, 0xA413, 0xA413 }, { 0xA414, 0xA414, 0xA414 }, { 0xA415, 0xA415, 0xA415 }, { 0xA416, 0xA416, 0xA416 }, { 0xA417, 0xA417, 0xA417 }, { 0xA418, 0xA418, 0xA418 }, { 0xA419, 0xA419, 0xA419 }, { 0xA41A, 0xA41A, 0xA41A }, { 0xA41B, 0xA41B, 0xA41B }, { 0xA41C, 0xA41C, 0xA41C }, { 0xA41D, 0xA41D, 0xA41D }, { 0xA41E, 0xA41E, 0xA41E }, { 0xA41F, 0xA41F, 0xA41F }, { 0xA420, 0xA420, 0xA420 }, { 0xA421, 0xA421, 0xA421 }, { 0xA422, 0xA422, 0xA422 }, { 0xA423, 0xA423, 0xA423 }, { 0xA424, 0xA424, 0xA424 }, { 0xA425, 0xA425, 0xA425 }, { 0xA426, 0xA426, 0xA426 }, { 0xA427, 0xA427, 0xA427 }, { 0xA428, 0xA428, 0xA428 }, { 0xA429, 0xA429, 0xA429 }, { 0xA42A, 0xA42A, 0xA42A }, { 0xA42B, 0xA42B, 0xA42B }, { 0xA42C, 0xA42C, 0xA42C }, { 0xA42D, 0xA42D, 0xA42D }, { 0xA42E, 0xA42E, 0xA42E }, { 0xA42F, 0xA42F, 0xA42F }, { 0xA430, 0xA430, 0xA430 }, { 0xA431, 0xA431, 0xA431 }, { 0xA432, 0xA432, 0xA432 }, { 0xA433, 0xA433, 0xA433 }, { 0xA434, 0xA434, 0xA434 }, { 0xA435, 0xA435, 0xA435 }, { 0xA436, 0xA436, 0xA436 }, { 0xA437, 0xA437, 0xA437 }, { 0xA438, 0xA438, 0xA438 }, { 0xA439, 0xA439, 0xA439 }, { 0xA43A, 0xA43A, 0xA43A }, { 0xA43B, 0xA43B, 0xA43B }, { 0xA43C, 0xA43C, 0xA43C }, { 0xA43D, 0xA43D, 0xA43D }, { 0xA43E, 0xA43E, 0xA43E }, { 0xA43F, 0xA43F, 0xA43F }, { 0xA440, 0xA440, 0xA440 }, { 0xA441, 0xA441, 0xA441 }, { 0xA442, 0xA442, 0xA442 }, { 0xA443, 0xA443, 0xA443 }, { 0xA444, 0xA444, 0xA444 }, { 0xA445, 0xA445, 0xA445 }, { 0xA446, 0xA446, 0xA446 }, { 0xA447, 0xA447, 0xA447 }, { 0xA448, 0xA448, 0xA448 }, { 0xA449, 0xA449, 0xA449 }, { 0xA44A, 0xA44A, 0xA44A }, { 0xA44B, 0xA44B, 0xA44B }, { 0xA44C, 0xA44C, 0xA44C }, { 0xA44D, 0xA44D, 0xA44D }, { 0xA44E, 0xA44E, 0xA44E }, { 0xA44F, 0xA44F, 0xA44F }, { 0xA450, 0xA450, 0xA450 }, { 0xA451, 0xA451, 0xA451 }, { 0xA452, 0xA452, 0xA452 }, { 0xA453, 0xA453, 0xA453 }, { 0xA454, 0xA454, 0xA454 }, { 0xA455, 0xA455, 0xA455 }, { 0xA456, 0xA456, 0xA456 }, { 0xA457, 0xA457, 0xA457 }, { 0xA458, 0xA458, 0xA458 }, { 0xA459, 0xA459, 0xA459 }, { 0xA45A, 0xA45A, 0xA45A }, { 0xA45B, 0xA45B, 0xA45B }, { 0xA45C, 0xA45C, 0xA45C }, { 0xA45D, 0xA45D, 0xA45D }, { 0xA45E, 0xA45E, 0xA45E }, { 0xA45F, 0xA45F, 0xA45F }, { 0xA460, 0xA460, 0xA460 }, { 0xA461, 0xA461, 0xA461 }, { 0xA462, 0xA462, 0xA462 }, { 0xA463, 0xA463, 0xA463 }, { 0xA464, 0xA464, 0xA464 }, { 0xA465, 0xA465, 0xA465 }, { 0xA466, 0xA466, 0xA466 }, { 0xA467, 0xA467, 0xA467 }, { 0xA468, 0xA468, 0xA468 }, { 0xA469, 0xA469, 0xA469 }, { 0xA46A, 0xA46A, 0xA46A }, { 0xA46B, 0xA46B, 0xA46B }, { 0xA46C, 0xA46C, 0xA46C }, { 0xA46D, 0xA46D, 0xA46D }, { 0xA46E, 0xA46E, 0xA46E }, { 0xA46F, 0xA46F, 0xA46F }, { 0xA470, 0xA470, 0xA470 }, { 0xA471, 0xA471, 0xA471 }, { 0xA472, 0xA472, 0xA472 }, { 0xA473, 0xA473, 0xA473 }, { 0xA474, 0xA474, 0xA474 }, { 0xA475, 0xA475, 0xA475 }, { 0xA476, 0xA476, 0xA476 }, { 0xA477, 0xA477, 0xA477 }, { 0xA478, 0xA478, 0xA478 }, { 0xA479, 0xA479, 0xA479 }, { 0xA47A, 0xA47A, 0xA47A }, { 0xA47B, 0xA47B, 0xA47B }, { 0xA47C, 0xA47C, 0xA47C }, { 0xA47D, 0xA47D, 0xA47D }, { 0xA47E, 0xA47E, 0xA47E }, { 0xA47F, 0xA47F, 0xA47F }, { 0xA480, 0xA480, 0xA480 }, { 0xA481, 0xA481, 0xA481 }, { 0xA482, 0xA482, 0xA482 }, { 0xA483, 0xA483, 0xA483 }, { 0xA484, 0xA484, 0xA484 }, { 0xA485, 0xA485, 0xA485 }, { 0xA486, 0xA486, 0xA486 }, { 0xA487, 0xA487, 0xA487 }, { 0xA488, 0xA488, 0xA488 }, { 0xA489, 0xA489, 0xA489 }, { 0xA48A, 0xA48A, 0xA48A }, { 0xA48B, 0xA48B, 0xA48B }, { 0xA48C, 0xA48C, 0xA48C }, { 0xA800, 0xA800, 0xA800 }, { 0xA801, 0xA801, 0xA801 }, { 0xA803, 0xA803, 0xA803 }, { 0xA804, 0xA804, 0xA804 }, { 0xA805, 0xA805, 0xA805 }, { 0xA806, 0xA806, 0xA806 }, { 0xA807, 0xA807, 0xA807 }, { 0xA808, 0xA808, 0xA808 }, { 0xA809, 0xA809, 0xA809 }, { 0xA80A, 0xA80A, 0xA80A }, { 0xA80B, 0xA80B, 0xA80B }, { 0xA80C, 0xA80C, 0xA80C }, { 0xA80D, 0xA80D, 0xA80D }, { 0xA80E, 0xA80E, 0xA80E }, { 0xA80F, 0xA80F, 0xA80F }, { 0xA810, 0xA810, 0xA810 }, { 0xA811, 0xA811, 0xA811 }, { 0xA812, 0xA812, 0xA812 }, { 0xA813, 0xA813, 0xA813 }, { 0xA814, 0xA814, 0xA814 }, { 0xA815, 0xA815, 0xA815 }, { 0xA816, 0xA816, 0xA816 }, { 0xA817, 0xA817, 0xA817 }, { 0xA818, 0xA818, 0xA818 }, { 0xA819, 0xA819, 0xA819 }, { 0xA81A, 0xA81A, 0xA81A }, { 0xA81B, 0xA81B, 0xA81B }, { 0xA81C, 0xA81C, 0xA81C }, { 0xA81D, 0xA81D, 0xA81D }, { 0xA81E, 0xA81E, 0xA81E }, { 0xA81F, 0xA81F, 0xA81F }, { 0xA820, 0xA820, 0xA820 }, { 0xA821, 0xA821, 0xA821 }, { 0xA822, 0xA822, 0xA822 }, { 0xA825, 0xA825, 0xA825 }, { 0xA826, 0xA826, 0xA826 }, { 0xAC00, 0xAC00, 0xAC00 }, { 0xD7A3, 0xD7A3, 0xD7A3 }, { 0xF900, 0xF900, 0xF900 }, { 0xF901, 0xF901, 0xF901 }, { 0xF902, 0xF902, 0xF902 }, { 0xF903, 0xF903, 0xF903 }, { 0xF904, 0xF904, 0xF904 }, { 0xF905, 0xF905, 0xF905 }, { 0xF906, 0xF906, 0xF906 }, { 0xF907, 0xF907, 0xF907 }, { 0xF908, 0xF908, 0xF908 }, { 0xF909, 0xF909, 0xF909 }, { 0xF90A, 0xF90A, 0xF90A }, { 0xF90B, 0xF90B, 0xF90B }, { 0xF90C, 0xF90C, 0xF90C }, { 0xF90D, 0xF90D, 0xF90D }, { 0xF90E, 0xF90E, 0xF90E }, { 0xF90F, 0xF90F, 0xF90F }, { 0xF910, 0xF910, 0xF910 }, { 0xF911, 0xF911, 0xF911 }, { 0xF912, 0xF912, 0xF912 }, { 0xF913, 0xF913, 0xF913 }, { 0xF914, 0xF914, 0xF914 }, { 0xF915, 0xF915, 0xF915 }, { 0xF916, 0xF916, 0xF916 }, { 0xF917, 0xF917, 0xF917 }, { 0xF918, 0xF918, 0xF918 }, { 0xF919, 0xF919, 0xF919 }, { 0xF91A, 0xF91A, 0xF91A }, { 0xF91B, 0xF91B, 0xF91B }, { 0xF91C, 0xF91C, 0xF91C }, { 0xF91D, 0xF91D, 0xF91D }, { 0xF91E, 0xF91E, 0xF91E }, { 0xF91F, 0xF91F, 0xF91F }, { 0xF920, 0xF920, 0xF920 }, { 0xF921, 0xF921, 0xF921 }, { 0xF922, 0xF922, 0xF922 }, { 0xF923, 0xF923, 0xF923 }, { 0xF924, 0xF924, 0xF924 }, { 0xF925, 0xF925, 0xF925 }, { 0xF926, 0xF926, 0xF926 }, { 0xF927, 0xF927, 0xF927 }, { 0xF928, 0xF928, 0xF928 }, { 0xF929, 0xF929, 0xF929 }, { 0xF92A, 0xF92A, 0xF92A }, { 0xF92B, 0xF92B, 0xF92B }, { 0xF92C, 0xF92C, 0xF92C }, { 0xF92D, 0xF92D, 0xF92D }, { 0xF92E, 0xF92E, 0xF92E }, { 0xF92F, 0xF92F, 0xF92F }, { 0xF930, 0xF930, 0xF930 }, { 0xF931, 0xF931, 0xF931 }, { 0xF932, 0xF932, 0xF932 }, { 0xF933, 0xF933, 0xF933 }, { 0xF934, 0xF934, 0xF934 }, { 0xF935, 0xF935, 0xF935 }, { 0xF936, 0xF936, 0xF936 }, { 0xF937, 0xF937, 0xF937 }, { 0xF938, 0xF938, 0xF938 }, { 0xF939, 0xF939, 0xF939 }, { 0xF93A, 0xF93A, 0xF93A }, { 0xF93B, 0xF93B, 0xF93B }, { 0xF93C, 0xF93C, 0xF93C }, { 0xF93D, 0xF93D, 0xF93D }, { 0xF93E, 0xF93E, 0xF93E }, { 0xF93F, 0xF93F, 0xF93F }, { 0xF940, 0xF940, 0xF940 }, { 0xF941, 0xF941, 0xF941 }, { 0xF942, 0xF942, 0xF942 }, { 0xF943, 0xF943, 0xF943 }, { 0xF944, 0xF944, 0xF944 }, { 0xF945, 0xF945, 0xF945 }, { 0xF946, 0xF946, 0xF946 }, { 0xF947, 0xF947, 0xF947 }, { 0xF948, 0xF948, 0xF948 }, { 0xF949, 0xF949, 0xF949 }, { 0xF94A, 0xF94A, 0xF94A }, { 0xF94B, 0xF94B, 0xF94B }, { 0xF94C, 0xF94C, 0xF94C }, { 0xF94D, 0xF94D, 0xF94D }, { 0xF94E, 0xF94E, 0xF94E }, { 0xF94F, 0xF94F, 0xF94F }, { 0xF950, 0xF950, 0xF950 }, { 0xF951, 0xF951, 0xF951 }, { 0xF952, 0xF952, 0xF952 }, { 0xF953, 0xF953, 0xF953 }, { 0xF954, 0xF954, 0xF954 }, { 0xF955, 0xF955, 0xF955 }, { 0xF956, 0xF956, 0xF956 }, { 0xF957, 0xF957, 0xF957 }, { 0xF958, 0xF958, 0xF958 }, { 0xF959, 0xF959, 0xF959 }, { 0xF95A, 0xF95A, 0xF95A }, { 0xF95B, 0xF95B, 0xF95B }, { 0xF95C, 0xF95C, 0xF95C }, { 0xF95D, 0xF95D, 0xF95D }, { 0xF95E, 0xF95E, 0xF95E }, { 0xF95F, 0xF95F, 0xF95F }, { 0xF960, 0xF960, 0xF960 }, { 0xF961, 0xF961, 0xF961 }, { 0xF962, 0xF962, 0xF962 }, { 0xF963, 0xF963, 0xF963 }, { 0xF964, 0xF964, 0xF964 }, { 0xF965, 0xF965, 0xF965 }, { 0xF966, 0xF966, 0xF966 }, { 0xF967, 0xF967, 0xF967 }, { 0xF968, 0xF968, 0xF968 }, { 0xF969, 0xF969, 0xF969 }, { 0xF96A, 0xF96A, 0xF96A }, { 0xF96B, 0xF96B, 0xF96B }, { 0xF96C, 0xF96C, 0xF96C }, { 0xF96D, 0xF96D, 0xF96D }, { 0xF96E, 0xF96E, 0xF96E }, { 0xF96F, 0xF96F, 0xF96F }, { 0xF970, 0xF970, 0xF970 }, { 0xF971, 0xF971, 0xF971 }, { 0xF972, 0xF972, 0xF972 }, { 0xF973, 0xF973, 0xF973 }, { 0xF974, 0xF974, 0xF974 }, { 0xF975, 0xF975, 0xF975 }, { 0xF976, 0xF976, 0xF976 }, { 0xF977, 0xF977, 0xF977 }, { 0xF978, 0xF978, 0xF978 }, { 0xF979, 0xF979, 0xF979 }, { 0xF97A, 0xF97A, 0xF97A }, { 0xF97B, 0xF97B, 0xF97B }, { 0xF97C, 0xF97C, 0xF97C }, { 0xF97D, 0xF97D, 0xF97D }, { 0xF97E, 0xF97E, 0xF97E }, { 0xF97F, 0xF97F, 0xF97F }, { 0xF980, 0xF980, 0xF980 }, { 0xF981, 0xF981, 0xF981 }, { 0xF982, 0xF982, 0xF982 }, { 0xF983, 0xF983, 0xF983 }, { 0xF984, 0xF984, 0xF984 }, { 0xF985, 0xF985, 0xF985 }, { 0xF986, 0xF986, 0xF986 }, { 0xF987, 0xF987, 0xF987 }, { 0xF988, 0xF988, 0xF988 }, { 0xF989, 0xF989, 0xF989 }, { 0xF98A, 0xF98A, 0xF98A }, { 0xF98B, 0xF98B, 0xF98B }, { 0xF98C, 0xF98C, 0xF98C }, { 0xF98D, 0xF98D, 0xF98D }, { 0xF98E, 0xF98E, 0xF98E }, { 0xF98F, 0xF98F, 0xF98F }, { 0xF990, 0xF990, 0xF990 }, { 0xF991, 0xF991, 0xF991 }, { 0xF992, 0xF992, 0xF992 }, { 0xF993, 0xF993, 0xF993 }, { 0xF994, 0xF994, 0xF994 }, { 0xF995, 0xF995, 0xF995 }, { 0xF996, 0xF996, 0xF996 }, { 0xF997, 0xF997, 0xF997 }, { 0xF998, 0xF998, 0xF998 }, { 0xF999, 0xF999, 0xF999 }, { 0xF99A, 0xF99A, 0xF99A }, { 0xF99B, 0xF99B, 0xF99B }, { 0xF99C, 0xF99C, 0xF99C }, { 0xF99D, 0xF99D, 0xF99D }, { 0xF99E, 0xF99E, 0xF99E }, { 0xF99F, 0xF99F, 0xF99F }, { 0xF9A0, 0xF9A0, 0xF9A0 }, { 0xF9A1, 0xF9A1, 0xF9A1 }, { 0xF9A2, 0xF9A2, 0xF9A2 }, { 0xF9A3, 0xF9A3, 0xF9A3 }, { 0xF9A4, 0xF9A4, 0xF9A4 }, { 0xF9A5, 0xF9A5, 0xF9A5 }, { 0xF9A6, 0xF9A6, 0xF9A6 }, { 0xF9A7, 0xF9A7, 0xF9A7 }, { 0xF9A8, 0xF9A8, 0xF9A8 }, { 0xF9A9, 0xF9A9, 0xF9A9 }, { 0xF9AA, 0xF9AA, 0xF9AA }, { 0xF9AB, 0xF9AB, 0xF9AB }, { 0xF9AC, 0xF9AC, 0xF9AC }, { 0xF9AD, 0xF9AD, 0xF9AD }, { 0xF9AE, 0xF9AE, 0xF9AE }, { 0xF9AF, 0xF9AF, 0xF9AF }, { 0xF9B0, 0xF9B0, 0xF9B0 }, { 0xF9B1, 0xF9B1, 0xF9B1 }, { 0xF9B2, 0xF9B2, 0xF9B2 }, { 0xF9B3, 0xF9B3, 0xF9B3 }, { 0xF9B4, 0xF9B4, 0xF9B4 }, { 0xF9B5, 0xF9B5, 0xF9B5 }, { 0xF9B6, 0xF9B6, 0xF9B6 }, { 0xF9B7, 0xF9B7, 0xF9B7 }, { 0xF9B8, 0xF9B8, 0xF9B8 }, { 0xF9B9, 0xF9B9, 0xF9B9 }, { 0xF9BA, 0xF9BA, 0xF9BA }, { 0xF9BB, 0xF9BB, 0xF9BB }, { 0xF9BC, 0xF9BC, 0xF9BC }, { 0xF9BD, 0xF9BD, 0xF9BD }, { 0xF9BE, 0xF9BE, 0xF9BE }, { 0xF9BF, 0xF9BF, 0xF9BF }, { 0xF9C0, 0xF9C0, 0xF9C0 }, { 0xF9C1, 0xF9C1, 0xF9C1 }, { 0xF9C2, 0xF9C2, 0xF9C2 }, { 0xF9C3, 0xF9C3, 0xF9C3 }, { 0xF9C4, 0xF9C4, 0xF9C4 }, { 0xF9C5, 0xF9C5, 0xF9C5 }, { 0xF9C6, 0xF9C6, 0xF9C6 }, { 0xF9C7, 0xF9C7, 0xF9C7 }, { 0xF9C8, 0xF9C8, 0xF9C8 }, { 0xF9C9, 0xF9C9, 0xF9C9 }, { 0xF9CA, 0xF9CA, 0xF9CA }, { 0xF9CB, 0xF9CB, 0xF9CB }, { 0xF9CC, 0xF9CC, 0xF9CC }, { 0xF9CD, 0xF9CD, 0xF9CD }, { 0xF9CE, 0xF9CE, 0xF9CE }, { 0xF9CF, 0xF9CF, 0xF9CF }, { 0xF9D0, 0xF9D0, 0xF9D0 }, { 0xF9D1, 0xF9D1, 0xF9D1 }, { 0xF9D2, 0xF9D2, 0xF9D2 }, { 0xF9D3, 0xF9D3, 0xF9D3 }, { 0xF9D4, 0xF9D4, 0xF9D4 }, { 0xF9D5, 0xF9D5, 0xF9D5 }, { 0xF9D6, 0xF9D6, 0xF9D6 }, { 0xF9D7, 0xF9D7, 0xF9D7 }, { 0xF9D8, 0xF9D8, 0xF9D8 }, { 0xF9D9, 0xF9D9, 0xF9D9 }, { 0xF9DA, 0xF9DA, 0xF9DA }, { 0xF9DB, 0xF9DB, 0xF9DB }, { 0xF9DC, 0xF9DC, 0xF9DC }, { 0xF9DD, 0xF9DD, 0xF9DD }, { 0xF9DE, 0xF9DE, 0xF9DE }, { 0xF9DF, 0xF9DF, 0xF9DF }, { 0xF9E0, 0xF9E0, 0xF9E0 }, { 0xF9E1, 0xF9E1, 0xF9E1 }, { 0xF9E2, 0xF9E2, 0xF9E2 }, { 0xF9E3, 0xF9E3, 0xF9E3 }, { 0xF9E4, 0xF9E4, 0xF9E4 }, { 0xF9E5, 0xF9E5, 0xF9E5 }, { 0xF9E6, 0xF9E6, 0xF9E6 }, { 0xF9E7, 0xF9E7, 0xF9E7 }, { 0xF9E8, 0xF9E8, 0xF9E8 }, { 0xF9E9, 0xF9E9, 0xF9E9 }, { 0xF9EA, 0xF9EA, 0xF9EA }, { 0xF9EB, 0xF9EB, 0xF9EB }, { 0xF9EC, 0xF9EC, 0xF9EC }, { 0xF9ED, 0xF9ED, 0xF9ED }, { 0xF9EE, 0xF9EE, 0xF9EE }, { 0xF9EF, 0xF9EF, 0xF9EF }, { 0xF9F0, 0xF9F0, 0xF9F0 }, { 0xF9F1, 0xF9F1, 0xF9F1 }, { 0xF9F2, 0xF9F2, 0xF9F2 }, { 0xF9F3, 0xF9F3, 0xF9F3 }, { 0xF9F4, 0xF9F4, 0xF9F4 }, { 0xF9F5, 0xF9F5, 0xF9F5 }, { 0xF9F6, 0xF9F6, 0xF9F6 }, { 0xF9F7, 0xF9F7, 0xF9F7 }, { 0xF9F8, 0xF9F8, 0xF9F8 }, { 0xF9F9, 0xF9F9, 0xF9F9 }, { 0xF9FA, 0xF9FA, 0xF9FA }, { 0xF9FB, 0xF9FB, 0xF9FB }, { 0xF9FC, 0xF9FC, 0xF9FC }, { 0xF9FD, 0xF9FD, 0xF9FD }, { 0xF9FE, 0xF9FE, 0xF9FE }, { 0xF9FF, 0xF9FF, 0xF9FF }, { 0xFA00, 0xFA00, 0xFA00 }, { 0xFA01, 0xFA01, 0xFA01 }, { 0xFA02, 0xFA02, 0xFA02 }, { 0xFA03, 0xFA03, 0xFA03 }, { 0xFA04, 0xFA04, 0xFA04 }, { 0xFA05, 0xFA05, 0xFA05 }, { 0xFA06, 0xFA06, 0xFA06 }, { 0xFA07, 0xFA07, 0xFA07 }, { 0xFA08, 0xFA08, 0xFA08 }, { 0xFA09, 0xFA09, 0xFA09 }, { 0xFA0A, 0xFA0A, 0xFA0A }, { 0xFA0B, 0xFA0B, 0xFA0B }, { 0xFA0C, 0xFA0C, 0xFA0C }, { 0xFA0D, 0xFA0D, 0xFA0D }, { 0xFA0E, 0xFA0E, 0xFA0E }, { 0xFA0F, 0xFA0F, 0xFA0F }, { 0xFA10, 0xFA10, 0xFA10 }, { 0xFA11, 0xFA11, 0xFA11 }, { 0xFA12, 0xFA12, 0xFA12 }, { 0xFA13, 0xFA13, 0xFA13 }, { 0xFA14, 0xFA14, 0xFA14 }, { 0xFA15, 0xFA15, 0xFA15 }, { 0xFA16, 0xFA16, 0xFA16 }, { 0xFA17, 0xFA17, 0xFA17 }, { 0xFA18, 0xFA18, 0xFA18 }, { 0xFA19, 0xFA19, 0xFA19 }, { 0xFA1A, 0xFA1A, 0xFA1A }, { 0xFA1B, 0xFA1B, 0xFA1B }, { 0xFA1C, 0xFA1C, 0xFA1C }, { 0xFA1D, 0xFA1D, 0xFA1D }, { 0xFA1E, 0xFA1E, 0xFA1E }, { 0xFA1F, 0xFA1F, 0xFA1F }, { 0xFA20, 0xFA20, 0xFA20 }, { 0xFA21, 0xFA21, 0xFA21 }, { 0xFA22, 0xFA22, 0xFA22 }, { 0xFA23, 0xFA23, 0xFA23 }, { 0xFA24, 0xFA24, 0xFA24 }, { 0xFA25, 0xFA25, 0xFA25 }, { 0xFA26, 0xFA26, 0xFA26 }, { 0xFA27, 0xFA27, 0xFA27 }, { 0xFA28, 0xFA28, 0xFA28 }, { 0xFA29, 0xFA29, 0xFA29 }, { 0xFA2A, 0xFA2A, 0xFA2A }, { 0xFA2B, 0xFA2B, 0xFA2B }, { 0xFA2C, 0xFA2C, 0xFA2C }, { 0xFA2D, 0xFA2D, 0xFA2D }, { 0xFA30, 0xFA30, 0xFA30 }, { 0xFA31, 0xFA31, 0xFA31 }, { 0xFA32, 0xFA32, 0xFA32 }, { 0xFA33, 0xFA33, 0xFA33 }, { 0xFA34, 0xFA34, 0xFA34 }, { 0xFA35, 0xFA35, 0xFA35 }, { 0xFA36, 0xFA36, 0xFA36 }, { 0xFA37, 0xFA37, 0xFA37 }, { 0xFA38, 0xFA38, 0xFA38 }, { 0xFA39, 0xFA39, 0xFA39 }, { 0xFA3A, 0xFA3A, 0xFA3A }, { 0xFA3B, 0xFA3B, 0xFA3B }, { 0xFA3C, 0xFA3C, 0xFA3C }, { 0xFA3D, 0xFA3D, 0xFA3D }, { 0xFA3E, 0xFA3E, 0xFA3E }, { 0xFA3F, 0xFA3F, 0xFA3F }, { 0xFA40, 0xFA40, 0xFA40 }, { 0xFA41, 0xFA41, 0xFA41 }, { 0xFA42, 0xFA42, 0xFA42 }, { 0xFA43, 0xFA43, 0xFA43 }, { 0xFA44, 0xFA44, 0xFA44 }, { 0xFA45, 0xFA45, 0xFA45 }, { 0xFA46, 0xFA46, 0xFA46 }, { 0xFA47, 0xFA47, 0xFA47 }, { 0xFA48, 0xFA48, 0xFA48 }, { 0xFA49, 0xFA49, 0xFA49 }, { 0xFA4A, 0xFA4A, 0xFA4A }, { 0xFA4B, 0xFA4B, 0xFA4B }, { 0xFA4C, 0xFA4C, 0xFA4C }, { 0xFA4D, 0xFA4D, 0xFA4D }, { 0xFA4E, 0xFA4E, 0xFA4E }, { 0xFA4F, 0xFA4F, 0xFA4F }, { 0xFA50, 0xFA50, 0xFA50 }, { 0xFA51, 0xFA51, 0xFA51 }, { 0xFA52, 0xFA52, 0xFA52 }, { 0xFA53, 0xFA53, 0xFA53 }, { 0xFA54, 0xFA54, 0xFA54 }, { 0xFA55, 0xFA55, 0xFA55 }, { 0xFA56, 0xFA56, 0xFA56 }, { 0xFA57, 0xFA57, 0xFA57 }, { 0xFA58, 0xFA58, 0xFA58 }, { 0xFA59, 0xFA59, 0xFA59 }, { 0xFA5A, 0xFA5A, 0xFA5A }, { 0xFA5B, 0xFA5B, 0xFA5B }, { 0xFA5C, 0xFA5C, 0xFA5C }, { 0xFA5D, 0xFA5D, 0xFA5D }, { 0xFA5E, 0xFA5E, 0xFA5E }, { 0xFA5F, 0xFA5F, 0xFA5F }, { 0xFA60, 0xFA60, 0xFA60 }, { 0xFA61, 0xFA61, 0xFA61 }, { 0xFA62, 0xFA62, 0xFA62 }, { 0xFA63, 0xFA63, 0xFA63 }, { 0xFA64, 0xFA64, 0xFA64 }, { 0xFA65, 0xFA65, 0xFA65 }, { 0xFA66, 0xFA66, 0xFA66 }, { 0xFA67, 0xFA67, 0xFA67 }, { 0xFA68, 0xFA68, 0xFA68 }, { 0xFA69, 0xFA69, 0xFA69 }, { 0xFA6A, 0xFA6A, 0xFA6A }, { 0xFA70, 0xFA70, 0xFA70 }, { 0xFA71, 0xFA71, 0xFA71 }, { 0xFA72, 0xFA72, 0xFA72 }, { 0xFA73, 0xFA73, 0xFA73 }, { 0xFA74, 0xFA74, 0xFA74 }, { 0xFA75, 0xFA75, 0xFA75 }, { 0xFA76, 0xFA76, 0xFA76 }, { 0xFA77, 0xFA77, 0xFA77 }, { 0xFA78, 0xFA78, 0xFA78 }, { 0xFA79, 0xFA79, 0xFA79 }, { 0xFA7A, 0xFA7A, 0xFA7A }, { 0xFA7B, 0xFA7B, 0xFA7B }, { 0xFA7C, 0xFA7C, 0xFA7C }, { 0xFA7D, 0xFA7D, 0xFA7D }, { 0xFA7E, 0xFA7E, 0xFA7E }, { 0xFA7F, 0xFA7F, 0xFA7F }, { 0xFA80, 0xFA80, 0xFA80 }, { 0xFA81, 0xFA81, 0xFA81 }, { 0xFA82, 0xFA82, 0xFA82 }, { 0xFA83, 0xFA83, 0xFA83 }, { 0xFA84, 0xFA84, 0xFA84 }, { 0xFA85, 0xFA85, 0xFA85 }, { 0xFA86, 0xFA86, 0xFA86 }, { 0xFA87, 0xFA87, 0xFA87 }, { 0xFA88, 0xFA88, 0xFA88 }, { 0xFA89, 0xFA89, 0xFA89 }, { 0xFA8A, 0xFA8A, 0xFA8A }, { 0xFA8B, 0xFA8B, 0xFA8B }, { 0xFA8C, 0xFA8C, 0xFA8C }, { 0xFA8D, 0xFA8D, 0xFA8D }, { 0xFA8E, 0xFA8E, 0xFA8E }, { 0xFA8F, 0xFA8F, 0xFA8F }, { 0xFA90, 0xFA90, 0xFA90 }, { 0xFA91, 0xFA91, 0xFA91 }, { 0xFA92, 0xFA92, 0xFA92 }, { 0xFA93, 0xFA93, 0xFA93 }, { 0xFA94, 0xFA94, 0xFA94 }, { 0xFA95, 0xFA95, 0xFA95 }, { 0xFA96, 0xFA96, 0xFA96 }, { 0xFA97, 0xFA97, 0xFA97 }, { 0xFA98, 0xFA98, 0xFA98 }, { 0xFA99, 0xFA99, 0xFA99 }, { 0xFA9A, 0xFA9A, 0xFA9A }, { 0xFA9B, 0xFA9B, 0xFA9B }, { 0xFA9C, 0xFA9C, 0xFA9C }, { 0xFA9D, 0xFA9D, 0xFA9D }, { 0xFA9E, 0xFA9E, 0xFA9E }, { 0xFA9F, 0xFA9F, 0xFA9F }, { 0xFAA0, 0xFAA0, 0xFAA0 }, { 0xFAA1, 0xFAA1, 0xFAA1 }, { 0xFAA2, 0xFAA2, 0xFAA2 }, { 0xFAA3, 0xFAA3, 0xFAA3 }, { 0xFAA4, 0xFAA4, 0xFAA4 }, { 0xFAA5, 0xFAA5, 0xFAA5 }, { 0xFAA6, 0xFAA6, 0xFAA6 }, { 0xFAA7, 0xFAA7, 0xFAA7 }, { 0xFAA8, 0xFAA8, 0xFAA8 }, { 0xFAA9, 0xFAA9, 0xFAA9 }, { 0xFAAA, 0xFAAA, 0xFAAA }, { 0xFAAB, 0xFAAB, 0xFAAB }, { 0xFAAC, 0xFAAC, 0xFAAC }, { 0xFAAD, 0xFAAD, 0xFAAD }, { 0xFAAE, 0xFAAE, 0xFAAE }, { 0xFAAF, 0xFAAF, 0xFAAF }, { 0xFAB0, 0xFAB0, 0xFAB0 }, { 0xFAB1, 0xFAB1, 0xFAB1 }, { 0xFAB2, 0xFAB2, 0xFAB2 }, { 0xFAB3, 0xFAB3, 0xFAB3 }, { 0xFAB4, 0xFAB4, 0xFAB4 }, { 0xFAB5, 0xFAB5, 0xFAB5 }, { 0xFAB6, 0xFAB6, 0xFAB6 }, { 0xFAB7, 0xFAB7, 0xFAB7 }, { 0xFAB8, 0xFAB8, 0xFAB8 }, { 0xFAB9, 0xFAB9, 0xFAB9 }, { 0xFABA, 0xFABA, 0xFABA }, { 0xFABB, 0xFABB, 0xFABB }, { 0xFABC, 0xFABC, 0xFABC }, { 0xFABD, 0xFABD, 0xFABD }, { 0xFABE, 0xFABE, 0xFABE }, { 0xFABF, 0xFABF, 0xFABF }, { 0xFAC0, 0xFAC0, 0xFAC0 }, { 0xFAC1, 0xFAC1, 0xFAC1 }, { 0xFAC2, 0xFAC2, 0xFAC2 }, { 0xFAC3, 0xFAC3, 0xFAC3 }, { 0xFAC4, 0xFAC4, 0xFAC4 }, { 0xFAC5, 0xFAC5, 0xFAC5 }, { 0xFAC6, 0xFAC6, 0xFAC6 }, { 0xFAC7, 0xFAC7, 0xFAC7 }, { 0xFAC8, 0xFAC8, 0xFAC8 }, { 0xFAC9, 0xFAC9, 0xFAC9 }, { 0xFACA, 0xFACA, 0xFACA }, { 0xFACB, 0xFACB, 0xFACB }, { 0xFACC, 0xFACC, 0xFACC }, { 0xFACD, 0xFACD, 0xFACD }, { 0xFACE, 0xFACE, 0xFACE }, { 0xFACF, 0xFACF, 0xFACF }, { 0xFAD0, 0xFAD0, 0xFAD0 }, { 0xFAD1, 0xFAD1, 0xFAD1 }, { 0xFAD2, 0xFAD2, 0xFAD2 }, { 0xFAD3, 0xFAD3, 0xFAD3 }, { 0xFAD4, 0xFAD4, 0xFAD4 }, { 0xFAD5, 0xFAD5, 0xFAD5 }, { 0xFAD6, 0xFAD6, 0xFAD6 }, { 0xFAD7, 0xFAD7, 0xFAD7 }, { 0xFAD8, 0xFAD8, 0xFAD8 }, { 0xFAD9, 0xFAD9, 0xFAD9 }, { 0xFB00, 0xFB00, 0xFB00 }, { 0xFB01, 0xFB01, 0xFB01 }, { 0xFB02, 0xFB02, 0xFB02 }, { 0xFB03, 0xFB03, 0xFB03 }, { 0xFB04, 0xFB04, 0xFB04 }, { 0xFB05, 0xFB05, 0xFB05 }, { 0xFB06, 0xFB06, 0xFB06 }, { 0xFB13, 0xFB13, 0xFB13 }, { 0xFB14, 0xFB14, 0xFB14 }, { 0xFB15, 0xFB15, 0xFB15 }, { 0xFB16, 0xFB16, 0xFB16 }, { 0xFB17, 0xFB17, 0xFB17 }, { 0xFB1D, 0xFB1D, 0xFB1D }, { 0xFB1E, 0xFB1E, 0xFB1E }, { 0xFB1F, 0xFB1F, 0xFB1F }, { 0xFB20, 0xFB20, 0xFB20 }, { 0xFB21, 0xFB21, 0xFB21 }, { 0xFB22, 0xFB22, 0xFB22 }, { 0xFB23, 0xFB23, 0xFB23 }, { 0xFB24, 0xFB24, 0xFB24 }, { 0xFB25, 0xFB25, 0xFB25 }, { 0xFB26, 0xFB26, 0xFB26 }, { 0xFB27, 0xFB27, 0xFB27 }, { 0xFB28, 0xFB28, 0xFB28 }, { 0xFB2A, 0xFB2A, 0xFB2A }, { 0xFB2B, 0xFB2B, 0xFB2B }, { 0xFB2C, 0xFB2C, 0xFB2C }, { 0xFB2D, 0xFB2D, 0xFB2D }, { 0xFB2E, 0xFB2E, 0xFB2E }, { 0xFB2F, 0xFB2F, 0xFB2F }, { 0xFB30, 0xFB30, 0xFB30 }, { 0xFB31, 0xFB31, 0xFB31 }, { 0xFB32, 0xFB32, 0xFB32 }, { 0xFB33, 0xFB33, 0xFB33 }, { 0xFB34, 0xFB34, 0xFB34 }, { 0xFB35, 0xFB35, 0xFB35 }, { 0xFB36, 0xFB36, 0xFB36 }, { 0xFB38, 0xFB38, 0xFB38 }, { 0xFB39, 0xFB39, 0xFB39 }, { 0xFB3A, 0xFB3A, 0xFB3A }, { 0xFB3B, 0xFB3B, 0xFB3B }, { 0xFB3C, 0xFB3C, 0xFB3C }, { 0xFB3E, 0xFB3E, 0xFB3E }, { 0xFB40, 0xFB40, 0xFB40 }, { 0xFB41, 0xFB41, 0xFB41 }, { 0xFB43, 0xFB43, 0xFB43 }, { 0xFB44, 0xFB44, 0xFB44 }, { 0xFB46, 0xFB46, 0xFB46 }, { 0xFB47, 0xFB47, 0xFB47 }, { 0xFB48, 0xFB48, 0xFB48 }, { 0xFB49, 0xFB49, 0xFB49 }, { 0xFB4A, 0xFB4A, 0xFB4A }, { 0xFB4B, 0xFB4B, 0xFB4B }, { 0xFB4C, 0xFB4C, 0xFB4C }, { 0xFB4D, 0xFB4D, 0xFB4D }, { 0xFB4E, 0xFB4E, 0xFB4E }, { 0xFB4F, 0xFB4F, 0xFB4F }, { 0xFB50, 0xFB50, 0xFB50 }, { 0xFB51, 0xFB51, 0xFB51 }, { 0xFB52, 0xFB52, 0xFB52 }, { 0xFB53, 0xFB53, 0xFB53 }, { 0xFB54, 0xFB54, 0xFB54 }, { 0xFB55, 0xFB55, 0xFB55 }, { 0xFB56, 0xFB56, 0xFB56 }, { 0xFB57, 0xFB57, 0xFB57 }, { 0xFB58, 0xFB58, 0xFB58 }, { 0xFB59, 0xFB59, 0xFB59 }, { 0xFB5A, 0xFB5A, 0xFB5A }, { 0xFB5B, 0xFB5B, 0xFB5B }, { 0xFB5C, 0xFB5C, 0xFB5C }, { 0xFB5D, 0xFB5D, 0xFB5D }, { 0xFB5E, 0xFB5E, 0xFB5E }, { 0xFB5F, 0xFB5F, 0xFB5F }, { 0xFB60, 0xFB60, 0xFB60 }, { 0xFB61, 0xFB61, 0xFB61 }, { 0xFB62, 0xFB62, 0xFB62 }, { 0xFB63, 0xFB63, 0xFB63 }, { 0xFB64, 0xFB64, 0xFB64 }, { 0xFB65, 0xFB65, 0xFB65 }, { 0xFB66, 0xFB66, 0xFB66 }, { 0xFB67, 0xFB67, 0xFB67 }, { 0xFB68, 0xFB68, 0xFB68 }, { 0xFB69, 0xFB69, 0xFB69 }, { 0xFB6A, 0xFB6A, 0xFB6A }, { 0xFB6B, 0xFB6B, 0xFB6B }, { 0xFB6C, 0xFB6C, 0xFB6C }, { 0xFB6D, 0xFB6D, 0xFB6D }, { 0xFB6E, 0xFB6E, 0xFB6E }, { 0xFB6F, 0xFB6F, 0xFB6F }, { 0xFB70, 0xFB70, 0xFB70 }, { 0xFB71, 0xFB71, 0xFB71 }, { 0xFB72, 0xFB72, 0xFB72 }, { 0xFB73, 0xFB73, 0xFB73 }, { 0xFB74, 0xFB74, 0xFB74 }, { 0xFB75, 0xFB75, 0xFB75 }, { 0xFB76, 0xFB76, 0xFB76 }, { 0xFB77, 0xFB77, 0xFB77 }, { 0xFB78, 0xFB78, 0xFB78 }, { 0xFB79, 0xFB79, 0xFB79 }, { 0xFB7A, 0xFB7A, 0xFB7A }, { 0xFB7B, 0xFB7B, 0xFB7B }, { 0xFB7C, 0xFB7C, 0xFB7C }, { 0xFB7D, 0xFB7D, 0xFB7D }, { 0xFB7E, 0xFB7E, 0xFB7E }, { 0xFB7F, 0xFB7F, 0xFB7F }, { 0xFB80, 0xFB80, 0xFB80 }, { 0xFB81, 0xFB81, 0xFB81 }, { 0xFB82, 0xFB82, 0xFB82 }, { 0xFB83, 0xFB83, 0xFB83 }, { 0xFB84, 0xFB84, 0xFB84 }, { 0xFB85, 0xFB85, 0xFB85 }, { 0xFB86, 0xFB86, 0xFB86 }, { 0xFB87, 0xFB87, 0xFB87 }, { 0xFB88, 0xFB88, 0xFB88 }, { 0xFB89, 0xFB89, 0xFB89 }, { 0xFB8A, 0xFB8A, 0xFB8A }, { 0xFB8B, 0xFB8B, 0xFB8B }, { 0xFB8C, 0xFB8C, 0xFB8C }, { 0xFB8D, 0xFB8D, 0xFB8D }, { 0xFB8E, 0xFB8E, 0xFB8E }, { 0xFB8F, 0xFB8F, 0xFB8F }, { 0xFB90, 0xFB90, 0xFB90 }, { 0xFB91, 0xFB91, 0xFB91 }, { 0xFB92, 0xFB92, 0xFB92 }, { 0xFB93, 0xFB93, 0xFB93 }, { 0xFB94, 0xFB94, 0xFB94 }, { 0xFB95, 0xFB95, 0xFB95 }, { 0xFB96, 0xFB96, 0xFB96 }, { 0xFB97, 0xFB97, 0xFB97 }, { 0xFB98, 0xFB98, 0xFB98 }, { 0xFB99, 0xFB99, 0xFB99 }, { 0xFB9A, 0xFB9A, 0xFB9A }, { 0xFB9B, 0xFB9B, 0xFB9B }, { 0xFB9C, 0xFB9C, 0xFB9C }, { 0xFB9D, 0xFB9D, 0xFB9D }, { 0xFB9E, 0xFB9E, 0xFB9E }, { 0xFB9F, 0xFB9F, 0xFB9F }, { 0xFBA0, 0xFBA0, 0xFBA0 }, { 0xFBA1, 0xFBA1, 0xFBA1 }, { 0xFBA2, 0xFBA2, 0xFBA2 }, { 0xFBA3, 0xFBA3, 0xFBA3 }, { 0xFBA4, 0xFBA4, 0xFBA4 }, { 0xFBA5, 0xFBA5, 0xFBA5 }, { 0xFBA6, 0xFBA6, 0xFBA6 }, { 0xFBA7, 0xFBA7, 0xFBA7 }, { 0xFBA8, 0xFBA8, 0xFBA8 }, { 0xFBA9, 0xFBA9, 0xFBA9 }, { 0xFBAA, 0xFBAA, 0xFBAA }, { 0xFBAB, 0xFBAB, 0xFBAB }, { 0xFBAC, 0xFBAC, 0xFBAC }, { 0xFBAD, 0xFBAD, 0xFBAD }, { 0xFBAE, 0xFBAE, 0xFBAE }, { 0xFBAF, 0xFBAF, 0xFBAF }, { 0xFBB0, 0xFBB0, 0xFBB0 }, { 0xFBB1, 0xFBB1, 0xFBB1 }, { 0xFBD3, 0xFBD3, 0xFBD3 }, { 0xFBD4, 0xFBD4, 0xFBD4 }, { 0xFBD5, 0xFBD5, 0xFBD5 }, { 0xFBD6, 0xFBD6, 0xFBD6 }, { 0xFBD7, 0xFBD7, 0xFBD7 }, { 0xFBD8, 0xFBD8, 0xFBD8 }, { 0xFBD9, 0xFBD9, 0xFBD9 }, { 0xFBDA, 0xFBDA, 0xFBDA }, { 0xFBDB, 0xFBDB, 0xFBDB }, { 0xFBDC, 0xFBDC, 0xFBDC }, { 0xFBDD, 0xFBDD, 0xFBDD }, { 0xFBDE, 0xFBDE, 0xFBDE }, { 0xFBDF, 0xFBDF, 0xFBDF }, { 0xFBE0, 0xFBE0, 0xFBE0 }, { 0xFBE1, 0xFBE1, 0xFBE1 }, { 0xFBE2, 0xFBE2, 0xFBE2 }, { 0xFBE3, 0xFBE3, 0xFBE3 }, { 0xFBE4, 0xFBE4, 0xFBE4 }, { 0xFBE5, 0xFBE5, 0xFBE5 }, { 0xFBE6, 0xFBE6, 0xFBE6 }, { 0xFBE7, 0xFBE7, 0xFBE7 }, { 0xFBE8, 0xFBE8, 0xFBE8 }, { 0xFBE9, 0xFBE9, 0xFBE9 }, { 0xFBEA, 0xFBEA, 0xFBEA }, { 0xFBEB, 0xFBEB, 0xFBEB }, { 0xFBEC, 0xFBEC, 0xFBEC }, { 0xFBED, 0xFBED, 0xFBED }, { 0xFBEE, 0xFBEE, 0xFBEE }, { 0xFBEF, 0xFBEF, 0xFBEF }, { 0xFBF0, 0xFBF0, 0xFBF0 }, { 0xFBF1, 0xFBF1, 0xFBF1 }, { 0xFBF2, 0xFBF2, 0xFBF2 }, { 0xFBF3, 0xFBF3, 0xFBF3 }, { 0xFBF4, 0xFBF4, 0xFBF4 }, { 0xFBF5, 0xFBF5, 0xFBF5 }, { 0xFBF6, 0xFBF6, 0xFBF6 }, { 0xFBF7, 0xFBF7, 0xFBF7 }, { 0xFBF8, 0xFBF8, 0xFBF8 }, { 0xFBF9, 0xFBF9, 0xFBF9 }, { 0xFBFA, 0xFBFA, 0xFBFA }, { 0xFBFB, 0xFBFB, 0xFBFB }, { 0xFBFC, 0xFBFC, 0xFBFC }, { 0xFBFD, 0xFBFD, 0xFBFD }, { 0xFBFE, 0xFBFE, 0xFBFE }, { 0xFBFF, 0xFBFF, 0xFBFF }, { 0xFC00, 0xFC00, 0xFC00 }, { 0xFC01, 0xFC01, 0xFC01 }, { 0xFC02, 0xFC02, 0xFC02 }, { 0xFC03, 0xFC03, 0xFC03 }, { 0xFC04, 0xFC04, 0xFC04 }, { 0xFC05, 0xFC05, 0xFC05 }, { 0xFC06, 0xFC06, 0xFC06 }, { 0xFC07, 0xFC07, 0xFC07 }, { 0xFC08, 0xFC08, 0xFC08 }, { 0xFC09, 0xFC09, 0xFC09 }, { 0xFC0A, 0xFC0A, 0xFC0A }, { 0xFC0B, 0xFC0B, 0xFC0B }, { 0xFC0C, 0xFC0C, 0xFC0C }, { 0xFC0D, 0xFC0D, 0xFC0D }, { 0xFC0E, 0xFC0E, 0xFC0E }, { 0xFC0F, 0xFC0F, 0xFC0F }, { 0xFC10, 0xFC10, 0xFC10 }, { 0xFC11, 0xFC11, 0xFC11 }, { 0xFC12, 0xFC12, 0xFC12 }, { 0xFC13, 0xFC13, 0xFC13 }, { 0xFC14, 0xFC14, 0xFC14 }, { 0xFC15, 0xFC15, 0xFC15 }, { 0xFC16, 0xFC16, 0xFC16 }, { 0xFC17, 0xFC17, 0xFC17 }, { 0xFC18, 0xFC18, 0xFC18 }, { 0xFC19, 0xFC19, 0xFC19 }, { 0xFC1A, 0xFC1A, 0xFC1A }, { 0xFC1B, 0xFC1B, 0xFC1B }, { 0xFC1C, 0xFC1C, 0xFC1C }, { 0xFC1D, 0xFC1D, 0xFC1D }, { 0xFC1E, 0xFC1E, 0xFC1E }, { 0xFC1F, 0xFC1F, 0xFC1F }, { 0xFC20, 0xFC20, 0xFC20 }, { 0xFC21, 0xFC21, 0xFC21 }, { 0xFC22, 0xFC22, 0xFC22 }, { 0xFC23, 0xFC23, 0xFC23 }, { 0xFC24, 0xFC24, 0xFC24 }, { 0xFC25, 0xFC25, 0xFC25 }, { 0xFC26, 0xFC26, 0xFC26 }, { 0xFC27, 0xFC27, 0xFC27 }, { 0xFC28, 0xFC28, 0xFC28 }, { 0xFC29, 0xFC29, 0xFC29 }, { 0xFC2A, 0xFC2A, 0xFC2A }, { 0xFC2B, 0xFC2B, 0xFC2B }, { 0xFC2C, 0xFC2C, 0xFC2C }, { 0xFC2D, 0xFC2D, 0xFC2D }, { 0xFC2E, 0xFC2E, 0xFC2E }, { 0xFC2F, 0xFC2F, 0xFC2F }, { 0xFC30, 0xFC30, 0xFC30 }, { 0xFC31, 0xFC31, 0xFC31 }, { 0xFC32, 0xFC32, 0xFC32 }, { 0xFC33, 0xFC33, 0xFC33 }, { 0xFC34, 0xFC34, 0xFC34 }, { 0xFC35, 0xFC35, 0xFC35 }, { 0xFC36, 0xFC36, 0xFC36 }, { 0xFC37, 0xFC37, 0xFC37 }, { 0xFC38, 0xFC38, 0xFC38 }, { 0xFC39, 0xFC39, 0xFC39 }, { 0xFC3A, 0xFC3A, 0xFC3A }, { 0xFC3B, 0xFC3B, 0xFC3B }, { 0xFC3C, 0xFC3C, 0xFC3C }, { 0xFC3D, 0xFC3D, 0xFC3D }, { 0xFC3E, 0xFC3E, 0xFC3E }, { 0xFC3F, 0xFC3F, 0xFC3F }, { 0xFC40, 0xFC40, 0xFC40 }, { 0xFC41, 0xFC41, 0xFC41 }, { 0xFC42, 0xFC42, 0xFC42 }, { 0xFC43, 0xFC43, 0xFC43 }, { 0xFC44, 0xFC44, 0xFC44 }, { 0xFC45, 0xFC45, 0xFC45 }, { 0xFC46, 0xFC46, 0xFC46 }, { 0xFC47, 0xFC47, 0xFC47 }, { 0xFC48, 0xFC48, 0xFC48 }, { 0xFC49, 0xFC49, 0xFC49 }, { 0xFC4A, 0xFC4A, 0xFC4A }, { 0xFC4B, 0xFC4B, 0xFC4B }, { 0xFC4C, 0xFC4C, 0xFC4C }, { 0xFC4D, 0xFC4D, 0xFC4D }, { 0xFC4E, 0xFC4E, 0xFC4E }, { 0xFC4F, 0xFC4F, 0xFC4F }, { 0xFC50, 0xFC50, 0xFC50 }, { 0xFC51, 0xFC51, 0xFC51 }, { 0xFC52, 0xFC52, 0xFC52 }, { 0xFC53, 0xFC53, 0xFC53 }, { 0xFC54, 0xFC54, 0xFC54 }, { 0xFC55, 0xFC55, 0xFC55 }, { 0xFC56, 0xFC56, 0xFC56 }, { 0xFC57, 0xFC57, 0xFC57 }, { 0xFC58, 0xFC58, 0xFC58 }, { 0xFC59, 0xFC59, 0xFC59 }, { 0xFC5A, 0xFC5A, 0xFC5A }, { 0xFC5B, 0xFC5B, 0xFC5B }, { 0xFC5C, 0xFC5C, 0xFC5C }, { 0xFC5D, 0xFC5D, 0xFC5D }, { 0xFC5E, 0xFC5E, 0xFC5E }, { 0xFC5F, 0xFC5F, 0xFC5F }, { 0xFC60, 0xFC60, 0xFC60 }, { 0xFC61, 0xFC61, 0xFC61 }, { 0xFC62, 0xFC62, 0xFC62 }, { 0xFC63, 0xFC63, 0xFC63 }, { 0xFC64, 0xFC64, 0xFC64 }, { 0xFC65, 0xFC65, 0xFC65 }, { 0xFC66, 0xFC66, 0xFC66 }, { 0xFC67, 0xFC67, 0xFC67 }, { 0xFC68, 0xFC68, 0xFC68 }, { 0xFC69, 0xFC69, 0xFC69 }, { 0xFC6A, 0xFC6A, 0xFC6A }, { 0xFC6B, 0xFC6B, 0xFC6B }, { 0xFC6C, 0xFC6C, 0xFC6C }, { 0xFC6D, 0xFC6D, 0xFC6D }, { 0xFC6E, 0xFC6E, 0xFC6E }, { 0xFC6F, 0xFC6F, 0xFC6F }, { 0xFC70, 0xFC70, 0xFC70 }, { 0xFC71, 0xFC71, 0xFC71 }, { 0xFC72, 0xFC72, 0xFC72 }, { 0xFC73, 0xFC73, 0xFC73 }, { 0xFC74, 0xFC74, 0xFC74 }, { 0xFC75, 0xFC75, 0xFC75 }, { 0xFC76, 0xFC76, 0xFC76 }, { 0xFC77, 0xFC77, 0xFC77 }, { 0xFC78, 0xFC78, 0xFC78 }, { 0xFC79, 0xFC79, 0xFC79 }, { 0xFC7A, 0xFC7A, 0xFC7A }, { 0xFC7B, 0xFC7B, 0xFC7B }, { 0xFC7C, 0xFC7C, 0xFC7C }, { 0xFC7D, 0xFC7D, 0xFC7D }, { 0xFC7E, 0xFC7E, 0xFC7E }, { 0xFC7F, 0xFC7F, 0xFC7F }, { 0xFC80, 0xFC80, 0xFC80 }, { 0xFC81, 0xFC81, 0xFC81 }, { 0xFC82, 0xFC82, 0xFC82 }, { 0xFC83, 0xFC83, 0xFC83 }, { 0xFC84, 0xFC84, 0xFC84 }, { 0xFC85, 0xFC85, 0xFC85 }, { 0xFC86, 0xFC86, 0xFC86 }, { 0xFC87, 0xFC87, 0xFC87 }, { 0xFC88, 0xFC88, 0xFC88 }, { 0xFC89, 0xFC89, 0xFC89 }, { 0xFC8A, 0xFC8A, 0xFC8A }, { 0xFC8B, 0xFC8B, 0xFC8B }, { 0xFC8C, 0xFC8C, 0xFC8C }, { 0xFC8D, 0xFC8D, 0xFC8D }, { 0xFC8E, 0xFC8E, 0xFC8E }, { 0xFC8F, 0xFC8F, 0xFC8F }, { 0xFC90, 0xFC90, 0xFC90 }, { 0xFC91, 0xFC91, 0xFC91 }, { 0xFC92, 0xFC92, 0xFC92 }, { 0xFC93, 0xFC93, 0xFC93 }, { 0xFC94, 0xFC94, 0xFC94 }, { 0xFC95, 0xFC95, 0xFC95 }, { 0xFC96, 0xFC96, 0xFC96 }, { 0xFC97, 0xFC97, 0xFC97 }, { 0xFC98, 0xFC98, 0xFC98 }, { 0xFC99, 0xFC99, 0xFC99 }, { 0xFC9A, 0xFC9A, 0xFC9A }, { 0xFC9B, 0xFC9B, 0xFC9B }, { 0xFC9C, 0xFC9C, 0xFC9C }, { 0xFC9D, 0xFC9D, 0xFC9D }, { 0xFC9E, 0xFC9E, 0xFC9E }, { 0xFC9F, 0xFC9F, 0xFC9F }, { 0xFCA0, 0xFCA0, 0xFCA0 }, { 0xFCA1, 0xFCA1, 0xFCA1 }, { 0xFCA2, 0xFCA2, 0xFCA2 }, { 0xFCA3, 0xFCA3, 0xFCA3 }, { 0xFCA4, 0xFCA4, 0xFCA4 }, { 0xFCA5, 0xFCA5, 0xFCA5 }, { 0xFCA6, 0xFCA6, 0xFCA6 }, { 0xFCA7, 0xFCA7, 0xFCA7 }, { 0xFCA8, 0xFCA8, 0xFCA8 }, { 0xFCA9, 0xFCA9, 0xFCA9 }, { 0xFCAA, 0xFCAA, 0xFCAA }, { 0xFCAB, 0xFCAB, 0xFCAB }, { 0xFCAC, 0xFCAC, 0xFCAC }, { 0xFCAD, 0xFCAD, 0xFCAD }, { 0xFCAE, 0xFCAE, 0xFCAE }, { 0xFCAF, 0xFCAF, 0xFCAF }, { 0xFCB0, 0xFCB0, 0xFCB0 }, { 0xFCB1, 0xFCB1, 0xFCB1 }, { 0xFCB2, 0xFCB2, 0xFCB2 }, { 0xFCB3, 0xFCB3, 0xFCB3 }, { 0xFCB4, 0xFCB4, 0xFCB4 }, { 0xFCB5, 0xFCB5, 0xFCB5 }, { 0xFCB6, 0xFCB6, 0xFCB6 }, { 0xFCB7, 0xFCB7, 0xFCB7 }, { 0xFCB8, 0xFCB8, 0xFCB8 }, { 0xFCB9, 0xFCB9, 0xFCB9 }, { 0xFCBA, 0xFCBA, 0xFCBA }, { 0xFCBB, 0xFCBB, 0xFCBB }, { 0xFCBC, 0xFCBC, 0xFCBC }, { 0xFCBD, 0xFCBD, 0xFCBD }, { 0xFCBE, 0xFCBE, 0xFCBE }, { 0xFCBF, 0xFCBF, 0xFCBF }, { 0xFCC0, 0xFCC0, 0xFCC0 }, { 0xFCC1, 0xFCC1, 0xFCC1 }, { 0xFCC2, 0xFCC2, 0xFCC2 }, { 0xFCC3, 0xFCC3, 0xFCC3 }, { 0xFCC4, 0xFCC4, 0xFCC4 }, { 0xFCC5, 0xFCC5, 0xFCC5 }, { 0xFCC6, 0xFCC6, 0xFCC6 }, { 0xFCC7, 0xFCC7, 0xFCC7 }, { 0xFCC8, 0xFCC8, 0xFCC8 }, { 0xFCC9, 0xFCC9, 0xFCC9 }, { 0xFCCA, 0xFCCA, 0xFCCA }, { 0xFCCB, 0xFCCB, 0xFCCB }, { 0xFCCC, 0xFCCC, 0xFCCC }, { 0xFCCD, 0xFCCD, 0xFCCD }, { 0xFCCE, 0xFCCE, 0xFCCE }, { 0xFCCF, 0xFCCF, 0xFCCF }, { 0xFCD0, 0xFCD0, 0xFCD0 }, { 0xFCD1, 0xFCD1, 0xFCD1 }, { 0xFCD2, 0xFCD2, 0xFCD2 }, { 0xFCD3, 0xFCD3, 0xFCD3 }, { 0xFCD4, 0xFCD4, 0xFCD4 }, { 0xFCD5, 0xFCD5, 0xFCD5 }, { 0xFCD6, 0xFCD6, 0xFCD6 }, { 0xFCD7, 0xFCD7, 0xFCD7 }, { 0xFCD8, 0xFCD8, 0xFCD8 }, { 0xFCD9, 0xFCD9, 0xFCD9 }, { 0xFCDA, 0xFCDA, 0xFCDA }, { 0xFCDB, 0xFCDB, 0xFCDB }, { 0xFCDC, 0xFCDC, 0xFCDC }, { 0xFCDD, 0xFCDD, 0xFCDD }, { 0xFCDE, 0xFCDE, 0xFCDE }, { 0xFCDF, 0xFCDF, 0xFCDF }, { 0xFCE0, 0xFCE0, 0xFCE0 }, { 0xFCE1, 0xFCE1, 0xFCE1 }, { 0xFCE2, 0xFCE2, 0xFCE2 }, { 0xFCE3, 0xFCE3, 0xFCE3 }, { 0xFCE4, 0xFCE4, 0xFCE4 }, { 0xFCE5, 0xFCE5, 0xFCE5 }, { 0xFCE6, 0xFCE6, 0xFCE6 }, { 0xFCE7, 0xFCE7, 0xFCE7 }, { 0xFCE8, 0xFCE8, 0xFCE8 }, { 0xFCE9, 0xFCE9, 0xFCE9 }, { 0xFCEA, 0xFCEA, 0xFCEA }, { 0xFCEB, 0xFCEB, 0xFCEB }, { 0xFCEC, 0xFCEC, 0xFCEC }, { 0xFCED, 0xFCED, 0xFCED }, { 0xFCEE, 0xFCEE, 0xFCEE }, { 0xFCEF, 0xFCEF, 0xFCEF }, { 0xFCF0, 0xFCF0, 0xFCF0 }, { 0xFCF1, 0xFCF1, 0xFCF1 }, { 0xFCF2, 0xFCF2, 0xFCF2 }, { 0xFCF3, 0xFCF3, 0xFCF3 }, { 0xFCF4, 0xFCF4, 0xFCF4 }, { 0xFCF5, 0xFCF5, 0xFCF5 }, { 0xFCF6, 0xFCF6, 0xFCF6 }, { 0xFCF7, 0xFCF7, 0xFCF7 }, { 0xFCF8, 0xFCF8, 0xFCF8 }, { 0xFCF9, 0xFCF9, 0xFCF9 }, { 0xFCFA, 0xFCFA, 0xFCFA }, { 0xFCFB, 0xFCFB, 0xFCFB }, { 0xFCFC, 0xFCFC, 0xFCFC }, { 0xFCFD, 0xFCFD, 0xFCFD }, { 0xFCFE, 0xFCFE, 0xFCFE }, { 0xFCFF, 0xFCFF, 0xFCFF }, { 0xFD00, 0xFD00, 0xFD00 }, { 0xFD01, 0xFD01, 0xFD01 }, { 0xFD02, 0xFD02, 0xFD02 }, { 0xFD03, 0xFD03, 0xFD03 }, { 0xFD04, 0xFD04, 0xFD04 }, { 0xFD05, 0xFD05, 0xFD05 }, { 0xFD06, 0xFD06, 0xFD06 }, { 0xFD07, 0xFD07, 0xFD07 }, { 0xFD08, 0xFD08, 0xFD08 }, { 0xFD09, 0xFD09, 0xFD09 }, { 0xFD0A, 0xFD0A, 0xFD0A }, { 0xFD0B, 0xFD0B, 0xFD0B }, { 0xFD0C, 0xFD0C, 0xFD0C }, { 0xFD0D, 0xFD0D, 0xFD0D }, { 0xFD0E, 0xFD0E, 0xFD0E }, { 0xFD0F, 0xFD0F, 0xFD0F }, { 0xFD10, 0xFD10, 0xFD10 }, { 0xFD11, 0xFD11, 0xFD11 }, { 0xFD12, 0xFD12, 0xFD12 }, { 0xFD13, 0xFD13, 0xFD13 }, { 0xFD14, 0xFD14, 0xFD14 }, { 0xFD15, 0xFD15, 0xFD15 }, { 0xFD16, 0xFD16, 0xFD16 }, { 0xFD17, 0xFD17, 0xFD17 }, { 0xFD18, 0xFD18, 0xFD18 }, { 0xFD19, 0xFD19, 0xFD19 }, { 0xFD1A, 0xFD1A, 0xFD1A }, { 0xFD1B, 0xFD1B, 0xFD1B }, { 0xFD1C, 0xFD1C, 0xFD1C }, { 0xFD1D, 0xFD1D, 0xFD1D }, { 0xFD1E, 0xFD1E, 0xFD1E }, { 0xFD1F, 0xFD1F, 0xFD1F }, { 0xFD20, 0xFD20, 0xFD20 }, { 0xFD21, 0xFD21, 0xFD21 }, { 0xFD22, 0xFD22, 0xFD22 }, { 0xFD23, 0xFD23, 0xFD23 }, { 0xFD24, 0xFD24, 0xFD24 }, { 0xFD25, 0xFD25, 0xFD25 }, { 0xFD26, 0xFD26, 0xFD26 }, { 0xFD27, 0xFD27, 0xFD27 }, { 0xFD28, 0xFD28, 0xFD28 }, { 0xFD29, 0xFD29, 0xFD29 }, { 0xFD2A, 0xFD2A, 0xFD2A }, { 0xFD2B, 0xFD2B, 0xFD2B }, { 0xFD2C, 0xFD2C, 0xFD2C }, { 0xFD2D, 0xFD2D, 0xFD2D }, { 0xFD2E, 0xFD2E, 0xFD2E }, { 0xFD2F, 0xFD2F, 0xFD2F }, { 0xFD30, 0xFD30, 0xFD30 }, { 0xFD31, 0xFD31, 0xFD31 }, { 0xFD32, 0xFD32, 0xFD32 }, { 0xFD33, 0xFD33, 0xFD33 }, { 0xFD34, 0xFD34, 0xFD34 }, { 0xFD35, 0xFD35, 0xFD35 }, { 0xFD36, 0xFD36, 0xFD36 }, { 0xFD37, 0xFD37, 0xFD37 }, { 0xFD38, 0xFD38, 0xFD38 }, { 0xFD39, 0xFD39, 0xFD39 }, { 0xFD3A, 0xFD3A, 0xFD3A }, { 0xFD3B, 0xFD3B, 0xFD3B }, { 0xFD3C, 0xFD3C, 0xFD3C }, { 0xFD3D, 0xFD3D, 0xFD3D }, { 0xFD50, 0xFD50, 0xFD50 }, { 0xFD51, 0xFD51, 0xFD51 }, { 0xFD52, 0xFD52, 0xFD52 }, { 0xFD53, 0xFD53, 0xFD53 }, { 0xFD54, 0xFD54, 0xFD54 }, { 0xFD55, 0xFD55, 0xFD55 }, { 0xFD56, 0xFD56, 0xFD56 }, { 0xFD57, 0xFD57, 0xFD57 }, { 0xFD58, 0xFD58, 0xFD58 }, { 0xFD59, 0xFD59, 0xFD59 }, { 0xFD5A, 0xFD5A, 0xFD5A }, { 0xFD5B, 0xFD5B, 0xFD5B }, { 0xFD5C, 0xFD5C, 0xFD5C }, { 0xFD5D, 0xFD5D, 0xFD5D }, { 0xFD5E, 0xFD5E, 0xFD5E }, { 0xFD5F, 0xFD5F, 0xFD5F }, { 0xFD60, 0xFD60, 0xFD60 }, { 0xFD61, 0xFD61, 0xFD61 }, { 0xFD62, 0xFD62, 0xFD62 }, { 0xFD63, 0xFD63, 0xFD63 }, { 0xFD64, 0xFD64, 0xFD64 }, { 0xFD65, 0xFD65, 0xFD65 }, { 0xFD66, 0xFD66, 0xFD66 }, { 0xFD67, 0xFD67, 0xFD67 }, { 0xFD68, 0xFD68, 0xFD68 }, { 0xFD69, 0xFD69, 0xFD69 }, { 0xFD6A, 0xFD6A, 0xFD6A }, { 0xFD6B, 0xFD6B, 0xFD6B }, { 0xFD6C, 0xFD6C, 0xFD6C }, { 0xFD6D, 0xFD6D, 0xFD6D }, { 0xFD6E, 0xFD6E, 0xFD6E }, { 0xFD6F, 0xFD6F, 0xFD6F }, { 0xFD70, 0xFD70, 0xFD70 }, { 0xFD71, 0xFD71, 0xFD71 }, { 0xFD72, 0xFD72, 0xFD72 }, { 0xFD73, 0xFD73, 0xFD73 }, { 0xFD74, 0xFD74, 0xFD74 }, { 0xFD75, 0xFD75, 0xFD75 }, { 0xFD76, 0xFD76, 0xFD76 }, { 0xFD77, 0xFD77, 0xFD77 }, { 0xFD78, 0xFD78, 0xFD78 }, { 0xFD79, 0xFD79, 0xFD79 }, { 0xFD7A, 0xFD7A, 0xFD7A }, { 0xFD7B, 0xFD7B, 0xFD7B }, { 0xFD7C, 0xFD7C, 0xFD7C }, { 0xFD7D, 0xFD7D, 0xFD7D }, { 0xFD7E, 0xFD7E, 0xFD7E }, { 0xFD7F, 0xFD7F, 0xFD7F }, { 0xFD80, 0xFD80, 0xFD80 }, { 0xFD81, 0xFD81, 0xFD81 }, { 0xFD82, 0xFD82, 0xFD82 }, { 0xFD83, 0xFD83, 0xFD83 }, { 0xFD84, 0xFD84, 0xFD84 }, { 0xFD85, 0xFD85, 0xFD85 }, { 0xFD86, 0xFD86, 0xFD86 }, { 0xFD87, 0xFD87, 0xFD87 }, { 0xFD88, 0xFD88, 0xFD88 }, { 0xFD89, 0xFD89, 0xFD89 }, { 0xFD8A, 0xFD8A, 0xFD8A }, { 0xFD8B, 0xFD8B, 0xFD8B }, { 0xFD8C, 0xFD8C, 0xFD8C }, { 0xFD8D, 0xFD8D, 0xFD8D }, { 0xFD8E, 0xFD8E, 0xFD8E }, { 0xFD8F, 0xFD8F, 0xFD8F }, { 0xFD92, 0xFD92, 0xFD92 }, { 0xFD93, 0xFD93, 0xFD93 }, { 0xFD94, 0xFD94, 0xFD94 }, { 0xFD95, 0xFD95, 0xFD95 }, { 0xFD96, 0xFD96, 0xFD96 }, { 0xFD97, 0xFD97, 0xFD97 }, { 0xFD98, 0xFD98, 0xFD98 }, { 0xFD99, 0xFD99, 0xFD99 }, { 0xFD9A, 0xFD9A, 0xFD9A }, { 0xFD9B, 0xFD9B, 0xFD9B }, { 0xFD9C, 0xFD9C, 0xFD9C }, { 0xFD9D, 0xFD9D, 0xFD9D }, { 0xFD9E, 0xFD9E, 0xFD9E }, { 0xFD9F, 0xFD9F, 0xFD9F }, { 0xFDA0, 0xFDA0, 0xFDA0 }, { 0xFDA1, 0xFDA1, 0xFDA1 }, { 0xFDA2, 0xFDA2, 0xFDA2 }, { 0xFDA3, 0xFDA3, 0xFDA3 }, { 0xFDA4, 0xFDA4, 0xFDA4 }, { 0xFDA5, 0xFDA5, 0xFDA5 }, { 0xFDA6, 0xFDA6, 0xFDA6 }, { 0xFDA7, 0xFDA7, 0xFDA7 }, { 0xFDA8, 0xFDA8, 0xFDA8 }, { 0xFDA9, 0xFDA9, 0xFDA9 }, { 0xFDAA, 0xFDAA, 0xFDAA }, { 0xFDAB, 0xFDAB, 0xFDAB }, { 0xFDAC, 0xFDAC, 0xFDAC }, { 0xFDAD, 0xFDAD, 0xFDAD }, { 0xFDAE, 0xFDAE, 0xFDAE }, { 0xFDAF, 0xFDAF, 0xFDAF }, { 0xFDB0, 0xFDB0, 0xFDB0 }, { 0xFDB1, 0xFDB1, 0xFDB1 }, { 0xFDB2, 0xFDB2, 0xFDB2 }, { 0xFDB3, 0xFDB3, 0xFDB3 }, { 0xFDB4, 0xFDB4, 0xFDB4 }, { 0xFDB5, 0xFDB5, 0xFDB5 }, { 0xFDB6, 0xFDB6, 0xFDB6 }, { 0xFDB7, 0xFDB7, 0xFDB7 }, { 0xFDB8, 0xFDB8, 0xFDB8 }, { 0xFDB9, 0xFDB9, 0xFDB9 }, { 0xFDBA, 0xFDBA, 0xFDBA }, { 0xFDBB, 0xFDBB, 0xFDBB }, { 0xFDBC, 0xFDBC, 0xFDBC }, { 0xFDBD, 0xFDBD, 0xFDBD }, { 0xFDBE, 0xFDBE, 0xFDBE }, { 0xFDBF, 0xFDBF, 0xFDBF }, { 0xFDC0, 0xFDC0, 0xFDC0 }, { 0xFDC1, 0xFDC1, 0xFDC1 }, { 0xFDC2, 0xFDC2, 0xFDC2 }, { 0xFDC3, 0xFDC3, 0xFDC3 }, { 0xFDC4, 0xFDC4, 0xFDC4 }, { 0xFDC5, 0xFDC5, 0xFDC5 }, { 0xFDC6, 0xFDC6, 0xFDC6 }, { 0xFDC7, 0xFDC7, 0xFDC7 }, { 0xFDF0, 0xFDF0, 0xFDF0 }, { 0xFDF1, 0xFDF1, 0xFDF1 }, { 0xFDF2, 0xFDF2, 0xFDF2 }, { 0xFDF3, 0xFDF3, 0xFDF3 }, { 0xFDF4, 0xFDF4, 0xFDF4 }, { 0xFDF5, 0xFDF5, 0xFDF5 }, { 0xFDF6, 0xFDF6, 0xFDF6 }, { 0xFDF7, 0xFDF7, 0xFDF7 }, { 0xFDF8, 0xFDF8, 0xFDF8 }, { 0xFDF9, 0xFDF9, 0xFDF9 }, { 0xFDFA, 0xFDFA, 0xFDFA }, { 0xFDFB, 0xFDFB, 0xFDFB }, { 0xFE00, 0xFE00, 0xFE00 }, { 0xFE01, 0xFE01, 0xFE01 }, { 0xFE02, 0xFE02, 0xFE02 }, { 0xFE03, 0xFE03, 0xFE03 }, { 0xFE04, 0xFE04, 0xFE04 }, { 0xFE05, 0xFE05, 0xFE05 }, { 0xFE06, 0xFE06, 0xFE06 }, { 0xFE07, 0xFE07, 0xFE07 }, { 0xFE08, 0xFE08, 0xFE08 }, { 0xFE09, 0xFE09, 0xFE09 }, { 0xFE0A, 0xFE0A, 0xFE0A }, { 0xFE0B, 0xFE0B, 0xFE0B }, { 0xFE0C, 0xFE0C, 0xFE0C }, { 0xFE0D, 0xFE0D, 0xFE0D }, { 0xFE0E, 0xFE0E, 0xFE0E }, { 0xFE0F, 0xFE0F, 0xFE0F }, { 0xFE20, 0xFE20, 0xFE20 }, { 0xFE21, 0xFE21, 0xFE21 }, { 0xFE22, 0xFE22, 0xFE22 }, { 0xFE23, 0xFE23, 0xFE23 }, { 0xFE70, 0xFE70, 0xFE70 }, { 0xFE71, 0xFE71, 0xFE71 }, { 0xFE72, 0xFE72, 0xFE72 }, { 0xFE73, 0xFE73, 0xFE73 }, { 0xFE74, 0xFE74, 0xFE74 }, { 0xFE76, 0xFE76, 0xFE76 }, { 0xFE77, 0xFE77, 0xFE77 }, { 0xFE78, 0xFE78, 0xFE78 }, { 0xFE79, 0xFE79, 0xFE79 }, { 0xFE7A, 0xFE7A, 0xFE7A }, { 0xFE7B, 0xFE7B, 0xFE7B }, { 0xFE7C, 0xFE7C, 0xFE7C }, { 0xFE7D, 0xFE7D, 0xFE7D }, { 0xFE7E, 0xFE7E, 0xFE7E }, { 0xFE7F, 0xFE7F, 0xFE7F }, { 0xFE80, 0xFE80, 0xFE80 }, { 0xFE81, 0xFE81, 0xFE81 }, { 0xFE82, 0xFE82, 0xFE82 }, { 0xFE83, 0xFE83, 0xFE83 }, { 0xFE84, 0xFE84, 0xFE84 }, { 0xFE85, 0xFE85, 0xFE85 }, { 0xFE86, 0xFE86, 0xFE86 }, { 0xFE87, 0xFE87, 0xFE87 }, { 0xFE88, 0xFE88, 0xFE88 }, { 0xFE89, 0xFE89, 0xFE89 }, { 0xFE8A, 0xFE8A, 0xFE8A }, { 0xFE8B, 0xFE8B, 0xFE8B }, { 0xFE8C, 0xFE8C, 0xFE8C }, { 0xFE8D, 0xFE8D, 0xFE8D }, { 0xFE8E, 0xFE8E, 0xFE8E }, { 0xFE8F, 0xFE8F, 0xFE8F }, { 0xFE90, 0xFE90, 0xFE90 }, { 0xFE91, 0xFE91, 0xFE91 }, { 0xFE92, 0xFE92, 0xFE92 }, { 0xFE93, 0xFE93, 0xFE93 }, { 0xFE94, 0xFE94, 0xFE94 }, { 0xFE95, 0xFE95, 0xFE95 }, { 0xFE96, 0xFE96, 0xFE96 }, { 0xFE97, 0xFE97, 0xFE97 }, { 0xFE98, 0xFE98, 0xFE98 }, { 0xFE99, 0xFE99, 0xFE99 }, { 0xFE9A, 0xFE9A, 0xFE9A }, { 0xFE9B, 0xFE9B, 0xFE9B }, { 0xFE9C, 0xFE9C, 0xFE9C }, { 0xFE9D, 0xFE9D, 0xFE9D }, { 0xFE9E, 0xFE9E, 0xFE9E }, { 0xFE9F, 0xFE9F, 0xFE9F }, { 0xFEA0, 0xFEA0, 0xFEA0 }, { 0xFEA1, 0xFEA1, 0xFEA1 }, { 0xFEA2, 0xFEA2, 0xFEA2 }, { 0xFEA3, 0xFEA3, 0xFEA3 }, { 0xFEA4, 0xFEA4, 0xFEA4 }, { 0xFEA5, 0xFEA5, 0xFEA5 }, { 0xFEA6, 0xFEA6, 0xFEA6 }, { 0xFEA7, 0xFEA7, 0xFEA7 }, { 0xFEA8, 0xFEA8, 0xFEA8 }, { 0xFEA9, 0xFEA9, 0xFEA9 }, { 0xFEAA, 0xFEAA, 0xFEAA }, { 0xFEAB, 0xFEAB, 0xFEAB }, { 0xFEAC, 0xFEAC, 0xFEAC }, { 0xFEAD, 0xFEAD, 0xFEAD }, { 0xFEAE, 0xFEAE, 0xFEAE }, { 0xFEAF, 0xFEAF, 0xFEAF }, { 0xFEB0, 0xFEB0, 0xFEB0 }, { 0xFEB1, 0xFEB1, 0xFEB1 }, { 0xFEB2, 0xFEB2, 0xFEB2 }, { 0xFEB3, 0xFEB3, 0xFEB3 }, { 0xFEB4, 0xFEB4, 0xFEB4 }, { 0xFEB5, 0xFEB5, 0xFEB5 }, { 0xFEB6, 0xFEB6, 0xFEB6 }, { 0xFEB7, 0xFEB7, 0xFEB7 }, { 0xFEB8, 0xFEB8, 0xFEB8 }, { 0xFEB9, 0xFEB9, 0xFEB9 }, { 0xFEBA, 0xFEBA, 0xFEBA }, { 0xFEBB, 0xFEBB, 0xFEBB }, { 0xFEBC, 0xFEBC, 0xFEBC }, { 0xFEBD, 0xFEBD, 0xFEBD }, { 0xFEBE, 0xFEBE, 0xFEBE }, { 0xFEBF, 0xFEBF, 0xFEBF }, { 0xFEC0, 0xFEC0, 0xFEC0 }, { 0xFEC1, 0xFEC1, 0xFEC1 }, { 0xFEC2, 0xFEC2, 0xFEC2 }, { 0xFEC3, 0xFEC3, 0xFEC3 }, { 0xFEC4, 0xFEC4, 0xFEC4 }, { 0xFEC5, 0xFEC5, 0xFEC5 }, { 0xFEC6, 0xFEC6, 0xFEC6 }, { 0xFEC7, 0xFEC7, 0xFEC7 }, { 0xFEC8, 0xFEC8, 0xFEC8 }, { 0xFEC9, 0xFEC9, 0xFEC9 }, { 0xFECA, 0xFECA, 0xFECA }, { 0xFECB, 0xFECB, 0xFECB }, { 0xFECC, 0xFECC, 0xFECC }, { 0xFECD, 0xFECD, 0xFECD }, { 0xFECE, 0xFECE, 0xFECE }, { 0xFECF, 0xFECF, 0xFECF }, { 0xFED0, 0xFED0, 0xFED0 }, { 0xFED1, 0xFED1, 0xFED1 }, { 0xFED2, 0xFED2, 0xFED2 }, { 0xFED3, 0xFED3, 0xFED3 }, { 0xFED4, 0xFED4, 0xFED4 }, { 0xFED5, 0xFED5, 0xFED5 }, { 0xFED6, 0xFED6, 0xFED6 }, { 0xFED7, 0xFED7, 0xFED7 }, { 0xFED8, 0xFED8, 0xFED8 }, { 0xFED9, 0xFED9, 0xFED9 }, { 0xFEDA, 0xFEDA, 0xFEDA }, { 0xFEDB, 0xFEDB, 0xFEDB }, { 0xFEDC, 0xFEDC, 0xFEDC }, { 0xFEDD, 0xFEDD, 0xFEDD }, { 0xFEDE, 0xFEDE, 0xFEDE }, { 0xFEDF, 0xFEDF, 0xFEDF }, { 0xFEE0, 0xFEE0, 0xFEE0 }, { 0xFEE1, 0xFEE1, 0xFEE1 }, { 0xFEE2, 0xFEE2, 0xFEE2 }, { 0xFEE3, 0xFEE3, 0xFEE3 }, { 0xFEE4, 0xFEE4, 0xFEE4 }, { 0xFEE5, 0xFEE5, 0xFEE5 }, { 0xFEE6, 0xFEE6, 0xFEE6 }, { 0xFEE7, 0xFEE7, 0xFEE7 }, { 0xFEE8, 0xFEE8, 0xFEE8 }, { 0xFEE9, 0xFEE9, 0xFEE9 }, { 0xFEEA, 0xFEEA, 0xFEEA }, { 0xFEEB, 0xFEEB, 0xFEEB }, { 0xFEEC, 0xFEEC, 0xFEEC }, { 0xFEED, 0xFEED, 0xFEED }, { 0xFEEE, 0xFEEE, 0xFEEE }, { 0xFEEF, 0xFEEF, 0xFEEF }, { 0xFEF0, 0xFEF0, 0xFEF0 }, { 0xFEF1, 0xFEF1, 0xFEF1 }, { 0xFEF2, 0xFEF2, 0xFEF2 }, { 0xFEF3, 0xFEF3, 0xFEF3 }, { 0xFEF4, 0xFEF4, 0xFEF4 }, { 0xFEF5, 0xFEF5, 0xFEF5 }, { 0xFEF6, 0xFEF6, 0xFEF6 }, { 0xFEF7, 0xFEF7, 0xFEF7 }, { 0xFEF8, 0xFEF8, 0xFEF8 }, { 0xFEF9, 0xFEF9, 0xFEF9 }, { 0xFEFA, 0xFEFA, 0xFEFA }, { 0xFEFB, 0xFEFB, 0xFEFB }, { 0xFEFC, 0xFEFC, 0xFEFC }, { 0xFF21, 0xFF21, 0xFF41 }, { 0xFF22, 0xFF22, 0xFF42 }, { 0xFF23, 0xFF23, 0xFF43 }, { 0xFF24, 0xFF24, 0xFF44 }, { 0xFF25, 0xFF25, 0xFF45 }, { 0xFF26, 0xFF26, 0xFF46 }, { 0xFF27, 0xFF27, 0xFF47 }, { 0xFF28, 0xFF28, 0xFF48 }, { 0xFF29, 0xFF29, 0xFF49 }, { 0xFF2A, 0xFF2A, 0xFF4A }, { 0xFF2B, 0xFF2B, 0xFF4B }, { 0xFF2C, 0xFF2C, 0xFF4C }, { 0xFF2D, 0xFF2D, 0xFF4D }, { 0xFF2E, 0xFF2E, 0xFF4E }, { 0xFF2F, 0xFF2F, 0xFF4F }, { 0xFF30, 0xFF30, 0xFF50 }, { 0xFF31, 0xFF31, 0xFF51 }, { 0xFF32, 0xFF32, 0xFF52 }, { 0xFF33, 0xFF33, 0xFF53 }, { 0xFF34, 0xFF34, 0xFF54 }, { 0xFF35, 0xFF35, 0xFF55 }, { 0xFF36, 0xFF36, 0xFF56 }, { 0xFF37, 0xFF37, 0xFF57 }, { 0xFF38, 0xFF38, 0xFF58 }, { 0xFF39, 0xFF39, 0xFF59 }, { 0xFF3A, 0xFF3A, 0xFF5A }, { 0xFF41, 0xFF21, 0xFF41 }, { 0xFF42, 0xFF22, 0xFF42 }, { 0xFF43, 0xFF23, 0xFF43 }, { 0xFF44, 0xFF24, 0xFF44 }, { 0xFF45, 0xFF25, 0xFF45 }, { 0xFF46, 0xFF26, 0xFF46 }, { 0xFF47, 0xFF27, 0xFF47 }, { 0xFF48, 0xFF28, 0xFF48 }, { 0xFF49, 0xFF29, 0xFF49 }, { 0xFF4A, 0xFF2A, 0xFF4A }, { 0xFF4B, 0xFF2B, 0xFF4B }, { 0xFF4C, 0xFF2C, 0xFF4C }, { 0xFF4D, 0xFF2D, 0xFF4D }, { 0xFF4E, 0xFF2E, 0xFF4E }, { 0xFF4F, 0xFF2F, 0xFF4F }, { 0xFF50, 0xFF30, 0xFF50 }, { 0xFF51, 0xFF31, 0xFF51 }, { 0xFF52, 0xFF32, 0xFF52 }, { 0xFF53, 0xFF33, 0xFF53 }, { 0xFF54, 0xFF34, 0xFF54 }, { 0xFF55, 0xFF35, 0xFF55 }, { 0xFF56, 0xFF36, 0xFF56 }, { 0xFF57, 0xFF37, 0xFF57 }, { 0xFF58, 0xFF38, 0xFF58 }, { 0xFF59, 0xFF39, 0xFF59 }, { 0xFF5A, 0xFF3A, 0xFF5A }, { 0xFF66, 0xFF66, 0xFF66 }, { 0xFF67, 0xFF67, 0xFF67 }, { 0xFF68, 0xFF68, 0xFF68 }, { 0xFF69, 0xFF69, 0xFF69 }, { 0xFF6A, 0xFF6A, 0xFF6A }, { 0xFF6B, 0xFF6B, 0xFF6B }, { 0xFF6C, 0xFF6C, 0xFF6C }, { 0xFF6D, 0xFF6D, 0xFF6D }, { 0xFF6E, 0xFF6E, 0xFF6E }, { 0xFF6F, 0xFF6F, 0xFF6F }, { 0xFF70, 0xFF70, 0xFF70 }, { 0xFF71, 0xFF71, 0xFF71 }, { 0xFF72, 0xFF72, 0xFF72 }, { 0xFF73, 0xFF73, 0xFF73 }, { 0xFF74, 0xFF74, 0xFF74 }, { 0xFF75, 0xFF75, 0xFF75 }, { 0xFF76, 0xFF76, 0xFF76 }, { 0xFF77, 0xFF77, 0xFF77 }, { 0xFF78, 0xFF78, 0xFF78 }, { 0xFF79, 0xFF79, 0xFF79 }, { 0xFF7A, 0xFF7A, 0xFF7A }, { 0xFF7B, 0xFF7B, 0xFF7B }, { 0xFF7C, 0xFF7C, 0xFF7C }, { 0xFF7D, 0xFF7D, 0xFF7D }, { 0xFF7E, 0xFF7E, 0xFF7E }, { 0xFF7F, 0xFF7F, 0xFF7F }, { 0xFF80, 0xFF80, 0xFF80 }, { 0xFF81, 0xFF81, 0xFF81 }, { 0xFF82, 0xFF82, 0xFF82 }, { 0xFF83, 0xFF83, 0xFF83 }, { 0xFF84, 0xFF84, 0xFF84 }, { 0xFF85, 0xFF85, 0xFF85 }, { 0xFF86, 0xFF86, 0xFF86 }, { 0xFF87, 0xFF87, 0xFF87 }, { 0xFF88, 0xFF88, 0xFF88 }, { 0xFF89, 0xFF89, 0xFF89 }, { 0xFF8A, 0xFF8A, 0xFF8A }, { 0xFF8B, 0xFF8B, 0xFF8B }, { 0xFF8C, 0xFF8C, 0xFF8C }, { 0xFF8D, 0xFF8D, 0xFF8D }, { 0xFF8E, 0xFF8E, 0xFF8E }, { 0xFF8F, 0xFF8F, 0xFF8F }, { 0xFF90, 0xFF90, 0xFF90 }, { 0xFF91, 0xFF91, 0xFF91 }, { 0xFF92, 0xFF92, 0xFF92 }, { 0xFF93, 0xFF93, 0xFF93 }, { 0xFF94, 0xFF94, 0xFF94 }, { 0xFF95, 0xFF95, 0xFF95 }, { 0xFF96, 0xFF96, 0xFF96 }, { 0xFF97, 0xFF97, 0xFF97 }, { 0xFF98, 0xFF98, 0xFF98 }, { 0xFF99, 0xFF99, 0xFF99 }, { 0xFF9A, 0xFF9A, 0xFF9A }, { 0xFF9B, 0xFF9B, 0xFF9B }, { 0xFF9C, 0xFF9C, 0xFF9C }, { 0xFF9D, 0xFF9D, 0xFF9D }, { 0xFF9E, 0xFF9E, 0xFF9E }, { 0xFF9F, 0xFF9F, 0xFF9F }, { 0xFFA0, 0xFFA0, 0xFFA0 }, { 0xFFA1, 0xFFA1, 0xFFA1 }, { 0xFFA2, 0xFFA2, 0xFFA2 }, { 0xFFA3, 0xFFA3, 0xFFA3 }, { 0xFFA4, 0xFFA4, 0xFFA4 }, { 0xFFA5, 0xFFA5, 0xFFA5 }, { 0xFFA6, 0xFFA6, 0xFFA6 }, { 0xFFA7, 0xFFA7, 0xFFA7 }, { 0xFFA8, 0xFFA8, 0xFFA8 }, { 0xFFA9, 0xFFA9, 0xFFA9 }, { 0xFFAA, 0xFFAA, 0xFFAA }, { 0xFFAB, 0xFFAB, 0xFFAB }, { 0xFFAC, 0xFFAC, 0xFFAC }, { 0xFFAD, 0xFFAD, 0xFFAD }, { 0xFFAE, 0xFFAE, 0xFFAE }, { 0xFFAF, 0xFFAF, 0xFFAF }, { 0xFFB0, 0xFFB0, 0xFFB0 }, { 0xFFB1, 0xFFB1, 0xFFB1 }, { 0xFFB2, 0xFFB2, 0xFFB2 }, { 0xFFB3, 0xFFB3, 0xFFB3 }, { 0xFFB4, 0xFFB4, 0xFFB4 }, { 0xFFB5, 0xFFB5, 0xFFB5 }, { 0xFFB6, 0xFFB6, 0xFFB6 }, { 0xFFB7, 0xFFB7, 0xFFB7 }, { 0xFFB8, 0xFFB8, 0xFFB8 }, { 0xFFB9, 0xFFB9, 0xFFB9 }, { 0xFFBA, 0xFFBA, 0xFFBA }, { 0xFFBB, 0xFFBB, 0xFFBB }, { 0xFFBC, 0xFFBC, 0xFFBC }, { 0xFFBD, 0xFFBD, 0xFFBD }, { 0xFFBE, 0xFFBE, 0xFFBE }, { 0xFFC2, 0xFFC2, 0xFFC2 }, { 0xFFC3, 0xFFC3, 0xFFC3 }, { 0xFFC4, 0xFFC4, 0xFFC4 }, { 0xFFC5, 0xFFC5, 0xFFC5 }, { 0xFFC6, 0xFFC6, 0xFFC6 }, { 0xFFC7, 0xFFC7, 0xFFC7 }, { 0xFFCA, 0xFFCA, 0xFFCA }, { 0xFFCB, 0xFFCB, 0xFFCB }, { 0xFFCC, 0xFFCC, 0xFFCC }, { 0xFFCD, 0xFFCD, 0xFFCD }, { 0xFFCE, 0xFFCE, 0xFFCE }, { 0xFFCF, 0xFFCF, 0xFFCF }, { 0xFFD2, 0xFFD2, 0xFFD2 }, { 0xFFD3, 0xFFD3, 0xFFD3 }, { 0xFFD4, 0xFFD4, 0xFFD4 }, { 0xFFD5, 0xFFD5, 0xFFD5 }, { 0xFFD6, 0xFFD6, 0xFFD6 }, { 0xFFD7, 0xFFD7, 0xFFD7 }, { 0xFFDA, 0xFFDA, 0xFFDA }, { 0xFFDB, 0xFFDB, 0xFFDB }, { 0xFFDC, 0xFFDC, 0xFFDC } }; robojournal-0.4.2/ui/hunspell/phonet.cxx0000644000175000017500000002722712211723646017057 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* phonetic.c - generic replacement aglogithms for phonetic transformation Copyright (C) 2000 Bjoern Jacke This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation; This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; If not, see . Changelog: 2000-01-05 Bjoern Jacke Initial Release insprired by the article about phonetic transformations out of c't 25/1999 2007-07-26 Bjoern Jacke Released under MPL/GPL/LGPL tri-license for Hunspell 2007-08-23 Laszlo Nemeth Porting from Aspell to Hunspell using C-like structs */ #ifndef MOZILLA_CLIENT #include #include #include #include #else #include #include #include #include #endif #include "ui/hunspell/csutil.hxx" #include "ui/hunspell/phonet.hxx" void init_phonet_hash(phonetable & parms) { int i, k; for (i = 0; i < HASHSIZE; i++) { parms.hash[i] = -1; } for (i = 0; parms.rules[i][0] != '\0'; i += 2) { /** set hash value **/ k = (unsigned char) parms.rules[i][0]; if (parms.hash[k] < 0) { parms.hash[k] = i; } } } // like strcpy but safe if the strings overlap // but only if dest < src static inline void strmove(char * dest, char * src) { while (*src) *dest++ = *src++; *dest = '\0'; } /* phonetic transcription algorithm */ /* see: http://aspell.net/man-html/Phonetic-Code.html */ /* convert string to uppercase before this call */ int phonet (const char * inword, char * target, int len, phonetable & parms) { /** Do phonetic transformation. **/ /** "len" = length of "inword" incl. '\0'. **/ /** result: >= 0: length of "target" **/ /** otherwise: error **/ int i,j,k=0,n,p,z; int k0,n0,p0=-333,z0; char c, c0; const char * s; typedef unsigned char uchar; char word[MAXPHONETUTF8LEN + 1]; if (len == -1) len = strlen(inword); if (len > MAXPHONETUTF8LEN) return 0; strcpy(word, inword); /** check word **/ i = j = z = 0; while ((c = word[i]) != '\0') { n = parms.hash[(uchar) c]; z0 = 0; if (n >= 0) { /** check all rules for the same letter **/ while (parms.rules[n][0] == c) { /** check whole string **/ k = 1; /** number of found letters **/ p = 5; /** default priority **/ s = parms.rules[n]; s++; /** important for (see below) "*(s-1)" **/ while (*s != '\0' && word[i+k] == *s && !isdigit (*s) && strchr ("(-<^$", *s) == NULL) { k++; s++; } if (*s == '(') { /** check letters in "(..)" **/ if (isalpha(word[i+k]) // ...could be implied? && strchr(s+1, word[i+k]) != NULL) { k++; while (*s != ')') s++; s++; } } p0 = (int) *s; k0 = k; while (*s == '-' && k > 1) { k--; s++; } if (*s == '<') s++; if (isdigit (*s)) { /** determine priority **/ p = *s - '0'; s++; } if (*s == '^' && *(s+1) == '^') s++; if (*s == '\0' || (*s == '^' && (i == 0 || ! isalpha(word[i-1])) && (*(s+1) != '$' || (! isalpha(word[i+k0]) ))) || (*s == '$' && i > 0 && isalpha(word[i-1]) && (! isalpha(word[i+k0]) ))) { /** search for followup rules, if: **/ /** parms.followup and k > 1 and NO '-' in searchstring **/ c0 = word[i+k-1]; n0 = parms.hash[(uchar) c0]; // if (parms.followup && k > 1 && n0 >= 0 if (k > 1 && n0 >= 0 && p0 != (int) '-' && word[i+k] != '\0') { /** test follow-up rule for "word[i+k]" **/ while (parms.rules[n0][0] == c0) { /** check whole string **/ k0 = k; p0 = 5; s = parms.rules[n0]; s++; while (*s != '\0' && word[i+k0] == *s && ! isdigit(*s) && strchr("(-<^$",*s) == NULL) { k0++; s++; } if (*s == '(') { /** check letters **/ if (isalpha(word[i+k0]) && strchr (s+1, word[i+k0]) != NULL) { k0++; while (*s != ')' && *s != '\0') s++; if (*s == ')') s++; } } while (*s == '-') { /** "k0" gets NOT reduced **/ /** because "if (k0 == k)" **/ s++; } if (*s == '<') s++; if (isdigit (*s)) { p0 = *s - '0'; s++; } if (*s == '\0' /** *s == '^' cuts **/ || (*s == '$' && ! isalpha(word[i+k0]))) { if (k0 == k) { /** this is just a piece of the string **/ n0 += 2; continue; } if (p0 < p) { /** priority too low **/ n0 += 2; continue; } /** rule fits; stop search **/ break; } n0 += 2; } /** End of "while (parms.rules[n0][0] == c0)" **/ if (p0 >= p && parms.rules[n0][0] == c0) { n += 2; continue; } } /** end of follow-up stuff **/ /** replace string **/ s = parms.rules[n+1]; p0 = (parms.rules[n][0] != '\0' && strchr (parms.rules[n]+1,'<') != NULL) ? 1:0; if (p0 == 1 && z == 0) { /** rule with '<' is used **/ if (j > 0 && *s != '\0' && (target[j-1] == c || target[j-1] == *s)) { j--; } z0 = 1; z = 1; k0 = 0; while (*s != '\0' && word[i+k0] != '\0') { word[i+k0] = *s; k0++; s++; } if (k > k0) strmove (&word[0]+i+k0, &word[0]+i+k); /** new "actual letter" **/ c = word[i]; } else { /** no '<' rule used **/ i += k - 1; z = 0; while (*s != '\0' && *(s+1) != '\0' && j < len) { if (j == 0 || target[j-1] != *s) { target[j] = *s; j++; } s++; } /** new "actual letter" **/ c = *s; if (parms.rules[n][0] != '\0' && strstr (parms.rules[n]+1, "^^") != NULL) { if (c != '\0') { target[j] = c; j++; } strmove (&word[0], &word[0]+i+1); i = 0; z0 = 1; } } break; } /** end of follow-up stuff **/ n += 2; } /** end of while (parms.rules[n][0] == c) **/ } /** end of if (n >= 0) **/ if (z0 == 0) { // if (k && (assert(p0!=-333),!p0) && j < len && c != '\0' // && (!parms.collapse_result || j == 0 || target[j-1] != c)){ if (k && !p0 && j < len && c != '\0' && (1 || j == 0 || target[j-1] != c)){ /** condense only double letters **/ target[j] = c; ///printf("\n setting \n"); j++; } i++; z = 0; k=0; } } /** end of while ((c = word[i]) != '\0') **/ target[j] = '\0'; return (j); } /** end of function "phonet" **/ robojournal-0.4.2/ui/hunspell/hunspell.hxx0000644000175000017500000002055012211723646017411 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "ui/hunspell/hashmgr.hxx" #include "ui/hunspell/affixmgr.hxx" #include "ui/hunspell/suggestmgr.hxx" #include "ui/hunspell/langnum.hxx" #include "ui/hunspell/csutil.hxx" #define SPELL_COMPOUND (1 << 0) #define SPELL_FORBIDDEN (1 << 1) #define SPELL_ALLCAP (1 << 2) #define SPELL_NOCAP (1 << 3) #define SPELL_INITCAP (1 << 4) #define SPELL_XML "" #define MAXDIC 20 #define MAXSUGGESTION 15 #define MAXSHARPS 5 #ifndef _MYSPELLMGR_HXX_ #define _MYSPELLMGR_HXX_ #ifdef HUNSPELL_STATIC #define DLLEXPORT #else #ifdef HUNSPELL_EXPORTS #define DLLEXPORT __declspec( dllexport ) #else #define DLLEXPORT __declspec( dllimport ) #endif #endif #ifdef W32 class DLLEXPORT Hunspell #else class Hunspell #endif { AffixMgr* pAMgr; HashMgr* pHMgr[MAXDIC]; int maxdic; SuggestMgr* pSMgr; char * affixpath; char * encoding; struct cs_info * csconv; int langnum; int utf8; int complexprefixes; char** wordbreak; public: /* Hunspell(aff, dic) - constructor of Hunspell class * input: path of affix file and dictionary file */ Hunspell(const char * affpath, const char * dpath, const char * key = NULL); ~Hunspell(); /* load extra dictionaries (only dic files) */ int add_dic(const char * dpath, const char * key = NULL); /* spell(word) - spellcheck word * output: 0 = bad word, not 0 = good word * * plus output: * info: information bit array, fields: * SPELL_COMPOUND = a compound word * SPELL_FORBIDDEN = an explicit forbidden word * root: root (stem), when input is a word with affix(es) */ int spell(const char * word, int * info = NULL, char ** root = NULL); /* suggest(suggestions, word) - search suggestions * input: pointer to an array of strings pointer and the (bad) word * array of strings pointer (here *slst) may not be initialized * output: number of suggestions in string array, and suggestions in * a newly allocated array of strings (*slts will be NULL when number * of suggestion equals 0.) */ int suggest(char*** slst, const char * word); /* deallocate suggestion lists */ void free_list(char *** slst, int n); char * get_dic_encoding(); /* morphological functions */ /* analyze(result, word) - morphological analysis of the word */ int analyze(char*** slst, const char * word); /* stem(result, word) - stemmer function */ int stem(char*** slst, const char * word); /* stem(result, analysis, n) - get stems from a morph. analysis * example: * char ** result, result2; * int n1 = analyze(&result, "words"); * int n2 = stem(&result2, result, n1); */ int stem(char*** slst, char ** morph, int n); /* generate(result, word, word2) - morphological generation by example(s) */ int generate(char*** slst, const char * word, const char * word2); /* generate(result, word, desc, n) - generation by morph. description(s) * example: * char ** result; * char * affix = "is:plural"; // description depends from dictionaries, too * int n = generate(&result, "word", &affix, 1); * for (int i = 0; i < n; i++) printf("%s\n", result[i]); */ int generate(char*** slst, const char * word, char ** desc, int n); /* functions for run-time modification of the dictionary */ /* add word to the run-time dictionary */ int add(const char * word); /* add word to the run-time dictionary with affix flags of * the example (a dictionary word): Hunspell will recognize * affixed forms of the new word, too. */ int add_with_affix(const char * word, const char * example); /* remove word from the run-time dictionary */ int remove(const char * word); /* other */ /* get extra word characters definied in affix file for tokenization */ const char * get_wordchars(); unsigned short * get_wordchars_utf16(int * len); struct cs_info * get_csconv(); const char * get_version(); /* experimental and deprecated functions */ #ifdef HUNSPELL_EXPERIMENTAL /* suffix is an affix flag string, similarly in dictionary files */ int put_word_suffix(const char * word, const char * suffix); char * morph_with_correction(const char * word); /* spec. suggestions */ int suggest_auto(char*** slst, const char * word); int suggest_pos_stems(char*** slst, const char * word); char * get_possible_root(); #endif private: int cleanword(char *, const char *, int * pcaptype, int * pabbrev); int cleanword2(char *, const char *, w_char *, int * w_len, int * pcaptype, int * pabbrev); void mkinitcap(char *); int mkinitcap2(char * p, w_char * u, int nc); int mkinitsmall2(char * p, w_char * u, int nc); void mkallcap(char *); int mkallcap2(char * p, w_char * u, int nc); void mkallsmall(char *); int mkallsmall2(char * p, w_char * u, int nc); struct hentry * checkword(const char *, int * info, char **root); char * sharps_u8_l1(char * dest, char * source); hentry * spellsharps(char * base, char *, int, int, char * tmp, int * info, char **root); int is_keepcase(const hentry * rv); int insert_sug(char ***slst, char * word, int ns); void cat_result(char * result, char * st); char * stem_description(const char * desc); int spellml(char*** slst, const char * word); int get_xml_par(char * dest, const char * par, int maxl); const char * get_xml_pos(const char * s, const char * attr); int get_xml_list(char ***slst, char * list, char * tag); int check_xml_par(char * q, char * attr, char * value); }; #endif robojournal-0.4.2/ui/hunspell/hunzip.cxx0000644000175000017500000002044312211723646017070 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef MOZILLA_CLIENT #include #include #include #else #include #include #include #endif #include "ui/hunspell/hunzip.hxx" #define CODELEN 65536 #define BASEBITREC 5000 #define UNCOMPRESSED '\002' #define MAGIC "hz0" #define MAGIC_ENCRYPT "hz1" #define MAGICLEN (sizeof(MAGIC) - 1) int Hunzip::fail(const char * err, const char * par) { fprintf(stderr, err, par); return -1; } Hunzip::Hunzip(const char * file, const char * key) { bufsiz = 0; lastbit = 0; inc = 0; outc = 0; dec = NULL; filename = (char *) malloc(strlen(file) + 1); if (filename) strcpy(filename, file); if (getcode(key) == -1) bufsiz = -1; else bufsiz = getbuf(); } int Hunzip::getcode(const char * key) { unsigned char c[2]; int i, j, n, p; int allocatedbit = BASEBITREC; const char * enc = key; fin = fopen(filename, "rb"); if (!fin) return -1; // read magic number if ((fread(in, 1, 3, fin) < MAGICLEN) || !(strncmp(MAGIC, in, MAGICLEN) == 0 || strncmp(MAGIC_ENCRYPT, in, MAGICLEN) == 0)) { return fail(MSG_FORMAT, filename); } // check encryption if (strncmp(MAGIC_ENCRYPT, in, MAGICLEN) == 0) { unsigned char cs; if (!key) return fail(MSG_KEY, filename); if (fread(&c, 1, 1, fin) < 1) return fail(MSG_FORMAT, filename); for (cs = 0; *enc; enc++) cs ^= *enc; if (cs != c[0]) return fail(MSG_KEY, filename); enc = key; } else key = NULL; // read record count if (fread(&c, 1, 2, fin) < 2) return fail(MSG_FORMAT, filename); if (key) { c[0] ^= *enc; if (*(++enc) == '\0') enc = key; c[1] ^= *enc; } n = ((int) c[0] << 8) + c[1]; dec = (struct bit *) malloc(BASEBITREC * sizeof(struct bit)); if (!dec) return fail(MSG_MEMORY, filename); dec[0].v[0] = 0; dec[0].v[1] = 0; // read codes for (i = 0; i < n; i++) { unsigned char l; if (fread(c, 1, 2, fin) < 2) return fail(MSG_FORMAT, filename); if (key) { if (*(++enc) == '\0') enc = key; c[0] ^= *enc; if (*(++enc) == '\0') enc = key; c[1] ^= *enc; } if (fread(&l, 1, 1, fin) < 1) return fail(MSG_FORMAT, filename); if (key) { if (*(++enc) == '\0') enc = key; l ^= *enc; } if (fread(in, 1, l/8+1, fin) < (size_t) l/8+1) return fail(MSG_FORMAT, filename); if (key) for (j = 0; j <= l/8; j++) { if (*(++enc) == '\0') enc = key; in[j] ^= *enc; } p = 0; for (j = 0; j < l; j++) { int b = (in[j/8] & (1 << (7 - (j % 8)))) ? 1 : 0; int oldp = p; p = dec[p].v[b]; if (p == 0) { lastbit++; if (lastbit == allocatedbit) { allocatedbit += BASEBITREC; dec = (struct bit *) realloc(dec, allocatedbit * sizeof(struct bit)); } dec[lastbit].v[0] = 0; dec[lastbit].v[1] = 0; dec[oldp].v[b] = lastbit; p = lastbit; } } dec[p].c[0] = c[0]; dec[p].c[1] = c[1]; } return 0; } Hunzip::~Hunzip() { if (dec) free(dec); if (fin) fclose(fin); if (filename) free(filename); } int Hunzip::getbuf() { int p = 0; int o = 0; do { if (inc == 0) inbits = fread(in, 1, BUFSIZE, fin) * 8; for (; inc < inbits; inc++) { int b = (in[inc / 8] & (1 << (7 - (inc % 8)))) ? 1 : 0; int oldp = p; p = dec[p].v[b]; if (p == 0) { if (oldp == lastbit) { fclose(fin); fin = NULL; // add last odd byte if (dec[lastbit].c[0]) out[o++] = dec[lastbit].c[1]; return o; } out[o++] = dec[oldp].c[0]; out[o++] = dec[oldp].c[1]; if (o == BUFSIZE) return o; p = dec[p].v[b]; } } inc = 0; } while (inbits == BUFSIZE * 8); return fail(MSG_FORMAT, filename); } const char * Hunzip::getline() { char linebuf[BUFSIZE]; int l = 0, eol = 0, left = 0, right = 0; if (bufsiz == -1) return NULL; while (l < bufsiz && !eol) { linebuf[l++] = out[outc]; switch (out[outc]) { case '\t': break; case 31: { // escape if (++outc == bufsiz) { bufsiz = getbuf(); outc = 0; } linebuf[l - 1] = out[outc]; break; } case ' ': break; default: if (((unsigned char) out[outc]) < 47) { if (out[outc] > 32) { right = out[outc] - 31; if (++outc == bufsiz) { bufsiz = getbuf(); outc = 0; } } if (out[outc] == 30) left = 9; else left = out[outc]; linebuf[l-1] = '\n'; eol = 1; } } if (++outc == bufsiz) { outc = 0; bufsiz = fin ? getbuf(): -1; } } if (right) strcpy(linebuf + l - 1, line + strlen(line) - right - 1); else linebuf[l] = '\0'; strcpy(line + left, linebuf); return line; } robojournal-0.4.2/ui/hunspell/atypes.hxx0000644000175000017500000001105012211723646017057 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef _ATYPES_HXX_ #define _ATYPES_HXX_ #ifndef HUNSPELL_WARNING #ifdef HUNSPELL_WARNING_ON #define HUNSPELL_WARNING fprintf #else // empty inline function to switch off warnings (instead of the C99 standard variadic macros) static inline void HUNSPELL_WARNING(FILE *, const char *, ...) {} #endif #endif // HUNSTEM def. #define HUNSTEM #include "ui/hunspell/hashmgr.hxx" #include "ui/hunspell/w_char.hxx" #define SETSIZE 256 #define CONTSIZE 65536 #define MAXWORDLEN 100 #define MAXWORDUTF8LEN 256 // affentry options #define aeXPRODUCT (1 << 0) #define aeUTF8 (1 << 1) #define aeALIASF (1 << 2) #define aeALIASM (1 << 3) #define aeLONGCOND (1 << 4) // compound options #define IN_CPD_NOT 0 #define IN_CPD_BEGIN 1 #define IN_CPD_END 2 #define IN_CPD_OTHER 3 #define MAXLNLEN 8192 #define MINCPDLEN 3 #define MAXCOMPOUND 10 #define MAXCONDLEN 20 #define MAXCONDLEN_1 (MAXCONDLEN - sizeof(char *)) #define MAXACC 1000 #define FLAG unsigned short #define FLAG_NULL 0x00 #define FREE_FLAG(a) a = 0 #define TESTAFF( a, b , c ) flag_bsearch((unsigned short *) a, (unsigned short) b, c) struct affentry { char * strip; char * appnd; unsigned char stripl; unsigned char appndl; char numconds; char opts; unsigned short aflag; unsigned short * contclass; short contclasslen; union { char conds[MAXCONDLEN]; struct { char conds1[MAXCONDLEN_1]; char * conds2; } l; } c; char * morphcode; }; struct guessword { char * word; bool allow; char * orig; }; struct mapentry { char * set; w_char * set_utf16; int len; }; struct flagentry { FLAG * def; int len; }; #endif robojournal-0.4.2/ui/hunspell/filemgr.cxx0000644000175000017500000000725512211723646017206 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include #include #include #include "ui/hunspell/filemgr.hxx" int FileMgr::fail(const char * err, const char * par) { fprintf(stderr, err, par); return -1; } FileMgr::FileMgr(const char * file, const char * key) { hin = NULL; fin = fopen(file, "r"); if (!fin) { // check hzipped file char * st = (char *) malloc(strlen(file) + strlen(HZIP_EXTENSION)); if (st) { strcpy(st, file); strcat(st, HZIP_EXTENSION); hin = new Hunzip(st, key); } } if (!fin && !hin) fail(MSG_OPEN, file); } FileMgr::~FileMgr() { if (fin) fclose(fin); if (hin) delete hin; } char * FileMgr::getline() { const char * l; if (fin) return fgets(in, BUFSIZE - 1, fin); if (hin && (l = hin->getline())) return strcpy(in, l); return NULL; } robojournal-0.4.2/ui/hunspell/license.myspell0000644000175000017500000000554012211723646020061 0ustar willwill/* * Copyright 2002 Kevin B. Hendricks, Stratford, Ontario, Canada * And Contributors. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 3. All modifications to the source code must be clearly marked as * such. Binary redistributions based on modified source code * must be clearly marked as modified versions in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY KEVIN B. HENDRICKS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * KEVIN B. HENDRICKS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * * NOTE: A special thanks and credit goes to Geoff Kuenning * the creator of ispell. MySpell's affix algorithms were * based on those of ispell which should be noted is * copyright Geoff Kuenning et.al. and now available * under a BSD style license. For more information on ispell * and affix compression in general, please see: * http://www.cs.ucla.edu/ficus-members/geoff/ispell.html * (the home page for ispell) * * An almost complete rewrite of MySpell for use by * the Mozilla project has been developed by David Einstein * (Deinst@world.std.com). David and I are now * working on parallel development tracks to help * our respective projects (Mozilla and OpenOffice.org * and we will maintain full affix file and dictionary * file compatibility and work on merging our versions * of MySpell back into a single tree. David has been * a significant help in improving MySpell. * * Special thanks also go to La'szlo' Ne'meth * who is the author of the * Hungarian dictionary and who developed and contributed * the code to support compound words in MySpell * and fixed numerous problems with the encoding * case conversion tables. * */ robojournal-0.4.2/ui/hunspell/phonet.hxx0000644000175000017500000001051712211723646017056 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* phonetic.c - generic replacement aglogithms for phonetic transformation Copyright (C) 2000 Bjoern Jacke This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation; This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; If not, see . Changelog: 2000-01-05 Bjoern Jacke Initial Release insprired by the article about phonetic transformations out of c't 25/1999 2007-07-26 Bjoern Jacke Released under MPL/GPL/LGPL tri-license for Hunspell 2007-08-23 Laszlo Nemeth Porting from Aspell to Hunspell using C-like structs */ #ifndef __PHONETHXX__ #define __PHONETHXX__ #define HASHSIZE 256 #define MAXPHONETLEN 256 #define MAXPHONETUTF8LEN (MAXPHONETLEN * 4) struct phonetable { char utf8; cs_info * lang; int num; char * * rules; int hash[HASHSIZE]; }; void init_phonet_hash(phonetable & parms); int phonet (const char * inword, char * target, int len, phonetable & phone); #endif robojournal-0.4.2/ui/hunspell/affentry.cxx0000644000175000017500000011437712211723646017403 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "license.hunspell" #include "license.myspell" #ifndef MOZILLA_CLIENT #include #include #include #include #else #include #include #include #include #endif #include "ui/hunspell/affentry.hxx" #include "ui/hunspell/csutil.hxx" #ifndef MOZILLA_CLIENT #ifndef WIN32 using namespace std; #endif #endif PfxEntry::PfxEntry(AffixMgr* pmgr, affentry* dp) { // register affix manager pmyMgr = pmgr; // set up its intial values aflag = dp->aflag; // flag strip = dp->strip; // string to strip appnd = dp->appnd; // string to append stripl = dp->stripl; // length of strip string appndl = dp->appndl; // length of append string numconds = dp->numconds; // length of the condition opts = dp->opts; // cross product flag // then copy over all of the conditions if (opts & aeLONGCOND) { memcpy(c.conds, dp->c.l.conds1, MAXCONDLEN_1); c.l.conds2 = dp->c.l.conds2; } else memcpy(c.conds, dp->c.conds, MAXCONDLEN); next = NULL; nextne = NULL; nexteq = NULL; morphcode = dp->morphcode; contclass = dp->contclass; contclasslen = dp->contclasslen; } PfxEntry::~PfxEntry() { aflag = 0; if (appnd) free(appnd); if (strip) free(strip); pmyMgr = NULL; appnd = NULL; strip = NULL; if (opts & aeLONGCOND) free(c.l.conds2); if (morphcode && !(opts & aeALIASM)) free(morphcode); if (contclass && !(opts & aeALIASF)) free(contclass); } // add prefix to this word assuming conditions hold char * PfxEntry::add(const char * word, int len) { char tword[MAXWORDUTF8LEN + 4]; if ((len > stripl) && (len >= numconds) && test_condition(word) && (!stripl || (strncmp(word, strip, stripl) == 0)) && ((MAXWORDUTF8LEN + 4) > (len + appndl - stripl))) { /* we have a match so add prefix */ char * pp = tword; if (appndl) { strcpy(tword,appnd); pp += appndl; } strcpy(pp, (word + stripl)); return mystrdup(tword); } return NULL; } inline char * PfxEntry::nextchar(char * p) { if (p) { p++; if (opts & aeLONGCOND) { // jump to the 2nd part of the condition if (p == c.conds + MAXCONDLEN_1) return c.l.conds2; // end of the MAXCONDLEN length condition } else if (p == c.conds + MAXCONDLEN) return NULL; } return p; } inline int PfxEntry::test_condition(const char * st) { const char * pos = NULL; // group with pos input position bool neg = false; // complementer bool ingroup = false; // character in the group if (numconds == 0) return 1; char * p = c.conds; while (1) { switch (*p) { case '\0': return 1; case '[': { neg = false; ingroup = false; p = nextchar(p); pos = st; break; } case '^': { p = nextchar(p); neg = true; break; } case ']': { if ((neg && ingroup) || (!neg && !ingroup)) return 0; pos = NULL; p = nextchar(p); // skip the next character if (!ingroup) for (st++; (opts & aeUTF8) && (*st & 0xc0) == 0x80; st++); if (*st == '\0' && p && *p != '\0') return 0; // word <= condition break; } case '.': if (!pos) { // dots are not metacharacters in groups: [.] p = nextchar(p); // skip the next character for (st++; (opts & aeUTF8) && (*st & 0xc0) == 0x80; st++); if (*st == '\0') return 0; // word <= condition break; } default: { if (*st == *p) { st++; p = nextchar(p); if ((opts & aeUTF8) && (*(st - 1) & 0x80)) { // multibyte while (p && (*p & 0xc0) == 0x80) { // character if (*p != *st) { if (!pos) return 0; st = pos; break; } p = nextchar(p); st++; } if (pos && st != pos) { ingroup = true; while (p && *p != ']' && (p = nextchar(p))); } } else if (pos) { ingroup = true; while (p && *p != ']' && (p = nextchar(p))); } } else if (pos) { // group p = nextchar(p); } else return 0; } } if (!p) return 1; } } // check if this prefix entry matches struct hentry * PfxEntry::checkword(const char * word, int len, char in_compound, const FLAG needflag) { int tmpl; // length of tmpword struct hentry * he; // hash entry of root word or NULL char tmpword[MAXWORDUTF8LEN + 4]; // on entry prefix is 0 length or already matches the beginning of the word. // So if the remaining root word has positive length // and if there are enough chars in root word and added back strip chars // to meet the number of characters conditions, then test it tmpl = len - appndl; if (tmpl > 0) { // generate new root word by removing prefix and adding // back any characters that would have been stripped if (stripl) strcpy (tmpword, strip); strcpy ((tmpword + stripl), (word + appndl)); // now make sure all of the conditions on characters // are met. Please see the appendix at the end of // this file for more info on exactly what is being // tested // if all conditions are met then check if resulting // root word in the dictionary if (test_condition(tmpword)) { tmpl += stripl; if ((he = pmyMgr->lookup(tmpword)) != NULL) { do { if (TESTAFF(he->astr, aflag, he->alen) && // forbid single prefixes with needaffix flag ! TESTAFF(contclass, pmyMgr->get_needaffix(), contclasslen) && // needflag ((!needflag) || TESTAFF(he->astr, needflag, he->alen) || (contclass && TESTAFF(contclass, needflag, contclasslen)))) return he; he = he->next_homonym; // check homonyms } while (he); } // prefix matched but no root word was found // if aeXPRODUCT is allowed, try again but now // ross checked combined with a suffix //if ((opts & aeXPRODUCT) && in_compound) { if ((opts & aeXPRODUCT)) { he = pmyMgr->suffix_check(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this, NULL, 0, NULL, FLAG_NULL, needflag, in_compound); if (he) return he; } } } return NULL; } // check if this prefix entry matches struct hentry * PfxEntry::check_twosfx(const char * word, int len, char in_compound, const FLAG needflag) { int tmpl; // length of tmpword struct hentry * he; // hash entry of root word or NULL char tmpword[MAXWORDUTF8LEN + 4]; // on entry prefix is 0 length or already matches the beginning of the word. // So if the remaining root word has positive length // and if there are enough chars in root word and added back strip chars // to meet the number of characters conditions, then test it tmpl = len - appndl; if ((tmpl > 0) && (tmpl + stripl >= numconds)) { // generate new root word by removing prefix and adding // back any characters that would have been stripped if (stripl) strcpy (tmpword, strip); strcpy ((tmpword + stripl), (word + appndl)); // now make sure all of the conditions on characters // are met. Please see the appendix at the end of // this file for more info on exactly what is being // tested // if all conditions are met then check if resulting // root word in the dictionary if (test_condition(tmpword)) { tmpl += stripl; // prefix matched but no root word was found // if aeXPRODUCT is allowed, try again but now // cross checked combined with a suffix if ((opts & aeXPRODUCT) && (in_compound != IN_CPD_BEGIN)) { he = pmyMgr->suffix_check_twosfx(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this, needflag); if (he) return he; } } } return NULL; } // check if this prefix entry matches char * PfxEntry::check_twosfx_morph(const char * word, int len, char in_compound, const FLAG needflag) { int tmpl; // length of tmpword char tmpword[MAXWORDUTF8LEN + 4]; // on entry prefix is 0 length or already matches the beginning of the word. // So if the remaining root word has positive length // and if there are enough chars in root word and added back strip chars // to meet the number of characters conditions, then test it tmpl = len - appndl; if ((tmpl > 0) && (tmpl + stripl >= numconds)) { // generate new root word by removing prefix and adding // back any characters that would have been stripped if (stripl) strcpy (tmpword, strip); strcpy ((tmpword + stripl), (word + appndl)); // now make sure all of the conditions on characters // are met. Please see the appendix at the end of // this file for more info on exactly what is being // tested // if all conditions are met then check if resulting // root word in the dictionary if (test_condition(tmpword)) { tmpl += stripl; // prefix matched but no root word was found // if aeXPRODUCT is allowed, try again but now // ross checked combined with a suffix if ((opts & aeXPRODUCT) && (in_compound != IN_CPD_BEGIN)) { return pmyMgr->suffix_check_twosfx_morph(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this, needflag); } } } return NULL; } // check if this prefix entry matches char * PfxEntry::check_morph(const char * word, int len, char in_compound, const FLAG needflag) { int tmpl; // length of tmpword struct hentry * he; // hash entry of root word or NULL char tmpword[MAXWORDUTF8LEN + 4]; char result[MAXLNLEN]; char * st; *result = '\0'; // on entry prefix is 0 length or already matches the beginning of the word. // So if the remaining root word has positive length // and if there are enough chars in root word and added back strip chars // to meet the number of characters conditions, then test it tmpl = len - appndl; if ((tmpl > 0) && (tmpl + stripl >= numconds)) { // generate new root word by removing prefix and adding // back any characters that would have been stripped if (stripl) strcpy (tmpword, strip); strcpy ((tmpword + stripl), (word + appndl)); // now make sure all of the conditions on characters // are met. Please see the appendix at the end of // this file for more info on exactly what is being // tested // if all conditions are met then check if resulting // root word in the dictionary if (test_condition(tmpword)) { tmpl += stripl; if ((he = pmyMgr->lookup(tmpword)) != NULL) { do { if (TESTAFF(he->astr, aflag, he->alen) && // forbid single prefixes with needaffix flag ! TESTAFF(contclass, pmyMgr->get_needaffix(), contclasslen) && // needflag ((!needflag) || TESTAFF(he->astr, needflag, he->alen) || (contclass && TESTAFF(contclass, needflag, contclasslen)))) { if (morphcode) { strcat(result, " "); strcat(result, morphcode); } else strcat(result,getKey()); if (!HENTRY_FIND(he, MORPH_STEM)) { strcat(result, " "); strcat(result, MORPH_STEM); strcat(result, HENTRY_WORD(he)); } // store the pointer of the hash entry if (HENTRY_DATA(he)) { strcat(result, " "); strcat(result, HENTRY_DATA2(he)); } else { // return with debug information char * flag = pmyMgr->encode_flag(getFlag()); strcat(result, " "); strcat(result, MORPH_FLAG); strcat(result, flag); free(flag); } strcat(result, "\n"); } he = he->next_homonym; } while (he); } // prefix matched but no root word was found // if aeXPRODUCT is allowed, try again but now // ross checked combined with a suffix if ((opts & aeXPRODUCT) && (in_compound != IN_CPD_BEGIN)) { st = pmyMgr->suffix_check_morph(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this, FLAG_NULL, needflag); if (st) { strcat(result, st); free(st); } } } } if (*result) return mystrdup(result); return NULL; } SfxEntry::SfxEntry(AffixMgr * pmgr, affentry* dp) { // register affix manager pmyMgr = pmgr; // set up its intial values aflag = dp->aflag; // char flag strip = dp->strip; // string to strip appnd = dp->appnd; // string to append stripl = dp->stripl; // length of strip string appndl = dp->appndl; // length of append string numconds = dp->numconds; // length of the condition opts = dp->opts; // cross product flag // then copy over all of the conditions if (opts & aeLONGCOND) { memcpy(c.l.conds1, dp->c.l.conds1, MAXCONDLEN_1); c.l.conds2 = dp->c.l.conds2; } else memcpy(c.conds, dp->c.conds, MAXCONDLEN); rappnd = myrevstrdup(appnd); morphcode = dp->morphcode; contclass = dp->contclass; contclasslen = dp->contclasslen; } SfxEntry::~SfxEntry() { aflag = 0; if (appnd) free(appnd); if (rappnd) free(rappnd); if (strip) free(strip); pmyMgr = NULL; appnd = NULL; strip = NULL; if (opts & aeLONGCOND) free(c.l.conds2); if (morphcode && !(opts & aeALIASM)) free(morphcode); if (contclass && !(opts & aeALIASF)) free(contclass); } // add suffix to this word assuming conditions hold char * SfxEntry::add(const char * word, int len) { char tword[MAXWORDUTF8LEN + 4]; /* make sure all conditions match */ if ((len > stripl) && (len >= numconds) && test_condition(word + len, word) && (!stripl || (strcmp(word + len - stripl, strip) == 0)) && ((MAXWORDUTF8LEN + 4) > (len + appndl - stripl))) { /* we have a match so add suffix */ strcpy(tword,word); if (appndl) { strcpy(tword + len - stripl, appnd); } else { *(tword + len - stripl) = '\0'; } return mystrdup(tword); } return NULL; } inline char * SfxEntry::nextchar(char * p) { p++; if (opts & aeLONGCOND) { // jump to the 2nd part of the condition if (p == c.l.conds1 + MAXCONDLEN_1) return c.l.conds2; // end of the MAXCONDLEN length condition } else if (p == c.conds + MAXCONDLEN) return NULL; return p; } inline int SfxEntry::test_condition(const char * st, const char * beg) { const char * pos = NULL; // group with pos input position bool neg = false; // complementer bool ingroup = false; // character in the group if (numconds == 0) return 1; char * p = c.conds; st--; int i = 1; while (1) { switch (*p) { case '\0': return 1; case '[': { p = nextchar(p); pos = st; break; } case '^': { p = nextchar(p); neg = true; break; } case ']': { if (!neg && !ingroup) return 0; i++; // skip the next character if (!ingroup) { for (; (opts & aeUTF8) && (st >= beg) && (*st & 0xc0) == 0x80; st--); st--; } pos = NULL; neg = false; ingroup = false; p = nextchar(p); if (st < beg && p && *p != '\0') return 0; // word <= condition break; } case '.': if (!pos) { // dots are not metacharacters in groups: [.] p = nextchar(p); // skip the next character for (st--; (opts & aeUTF8) && (st >= beg) && (*st & 0xc0) == 0x80; st--); if (st < beg) return 0; // word <= condition if (*st & 0x80) { // head of the UTF-8 character st--; if (st < beg) return 0; // word <= condition } break; } default: { if (*st == *p) { p = nextchar(p); if ((opts & aeUTF8) && (*st & 0x80)) { st--; while (p && (st >= beg)) { if (*p != *st) { if (!pos) return 0; st = pos; break; } // first byte of the UTF-8 multibyte character if ((*p & 0xc0) != 0x80) break; p = nextchar(p); st--; } if (pos && st != pos) { if (neg) return 0; else if (i == numconds) return 1; ingroup = true; while (p && *p != ']' && (p = nextchar(p))); } if (p && *p != '\0') p = nextchar(p); } else if (pos) { if (neg) return 0; else if (i == numconds) return 1; ingroup = true; st--; } if (!pos) { i++; st--; if (st < beg && p && *p != '\0') return 0; // word <= condition } } else if (pos) { // group p = nextchar(p); } else return 0; } } if (!p) return 1; } } // see if this suffix is present in the word struct hentry * SfxEntry::checkword(const char * word, int len, int optflags, AffEntry* ppfx, char ** wlst, int maxSug, int * ns, const FLAG cclass, const FLAG needflag, const FLAG badflag) { int tmpl; // length of tmpword struct hentry * he; // hash entry pointer unsigned char * cp; char tmpword[MAXWORDUTF8LEN + 4]; PfxEntry* ep = (PfxEntry *) ppfx; // if this suffix is being cross checked with a prefix // but it does not support cross products skip it if (((optflags & aeXPRODUCT) != 0) && ((opts & aeXPRODUCT) == 0)) return NULL; // upon entry suffix is 0 length or already matches the end of the word. // So if the remaining root word has positive length // and if there are enough chars in root word and added back strip chars // to meet the number of characters conditions, then test it tmpl = len - appndl; // the second condition is not enough for UTF-8 strings // it checked in test_condition() if ((tmpl > 0) && (tmpl + stripl >= numconds)) { // generate new root word by removing suffix and adding // back any characters that would have been stripped or // or null terminating the shorter string strcpy (tmpword, word); cp = (unsigned char *)(tmpword + tmpl); if (stripl) { strcpy ((char *)cp, strip); tmpl += stripl; cp = (unsigned char *)(tmpword + tmpl); } else *cp = '\0'; // now make sure all of the conditions on characters // are met. Please see the appendix at the end of // this file for more info on exactly what is being // tested // if all conditions are met then check if resulting // root word in the dictionary if (test_condition((char *) cp, (char *) tmpword)) { #ifdef SZOSZABLYA_POSSIBLE_ROOTS fprintf(stdout,"%s %s %c\n", word, tmpword, aflag); #endif if ((he = pmyMgr->lookup(tmpword)) != NULL) { do { // check conditional suffix (enabled by prefix) if ((TESTAFF(he->astr, aflag, he->alen) || (ep && ep->getCont() && TESTAFF(ep->getCont(), aflag, ep->getContLen()))) && (((optflags & aeXPRODUCT) == 0) || TESTAFF(he->astr, ep->getFlag(), he->alen) || // enabled by prefix ((contclass) && TESTAFF(contclass, ep->getFlag(), contclasslen)) ) && // handle cont. class ((!cclass) || ((contclass) && TESTAFF(contclass, cclass, contclasslen)) ) && // check only in compound homonyms (bad flags) (!badflag || !TESTAFF(he->astr, badflag, he->alen) ) && // handle required flag ((!needflag) || (TESTAFF(he->astr, needflag, he->alen) || ((contclass) && TESTAFF(contclass, needflag, contclasslen))) ) ) return he; he = he->next_homonym; // check homonyms } while (he); // obsolote stemming code (used only by the // experimental SuffixMgr:suggest_pos_stems) // store resulting root in wlst } else if (wlst && (*ns < maxSug)) { int cwrd = 1; for (int k=0; k < *ns; k++) if (strcmp(tmpword, wlst[k]) == 0) cwrd = 0; if (cwrd) { wlst[*ns] = mystrdup(tmpword); if (wlst[*ns] == NULL) { for (int j=0; j<*ns; j++) free(wlst[j]); *ns = -1; return NULL; } (*ns)++; } } } } return NULL; } // see if two-level suffix is present in the word struct hentry * SfxEntry::check_twosfx(const char * word, int len, int optflags, AffEntry* ppfx, const FLAG needflag) { int tmpl; // length of tmpword struct hentry * he; // hash entry pointer unsigned char * cp; char tmpword[MAXWORDUTF8LEN + 4]; PfxEntry* ep = (PfxEntry *) ppfx; // if this suffix is being cross checked with a prefix // but it does not support cross products skip it if ((optflags & aeXPRODUCT) != 0 && (opts & aeXPRODUCT) == 0) return NULL; // upon entry suffix is 0 length or already matches the end of the word. // So if the remaining root word has positive length // and if there are enough chars in root word and added back strip chars // to meet the number of characters conditions, then test it tmpl = len - appndl; if ((tmpl > 0) && (tmpl + stripl >= numconds)) { // generate new root word by removing suffix and adding // back any characters that would have been stripped or // or null terminating the shorter string strcpy (tmpword, word); cp = (unsigned char *)(tmpword + tmpl); if (stripl) { strcpy ((char *)cp, strip); tmpl += stripl; cp = (unsigned char *)(tmpword + tmpl); } else *cp = '\0'; // now make sure all of the conditions on characters // are met. Please see the appendix at the end of // this file for more info on exactly what is being // tested // if all conditions are met then recall suffix_check if (test_condition((char *) cp, (char *) tmpword)) { if (ppfx) { // handle conditional suffix if ((contclass) && TESTAFF(contclass, ep->getFlag(), contclasslen)) he = pmyMgr->suffix_check(tmpword, tmpl, 0, NULL, NULL, 0, NULL, (FLAG) aflag, needflag); else he = pmyMgr->suffix_check(tmpword, tmpl, optflags, ppfx, NULL, 0, NULL, (FLAG) aflag, needflag); } else { he = pmyMgr->suffix_check(tmpword, tmpl, 0, NULL, NULL, 0, NULL, (FLAG) aflag, needflag); } if (he) return he; } } return NULL; } // see if two-level suffix is present in the word char * SfxEntry::check_twosfx_morph(const char * word, int len, int optflags, AffEntry* ppfx, const FLAG needflag) { int tmpl; // length of tmpword unsigned char * cp; char tmpword[MAXWORDUTF8LEN + 4]; PfxEntry* ep = (PfxEntry *) ppfx; char * st; char result[MAXLNLEN]; *result = '\0'; // if this suffix is being cross checked with a prefix // but it does not support cross products skip it if ((optflags & aeXPRODUCT) != 0 && (opts & aeXPRODUCT) == 0) return NULL; // upon entry suffix is 0 length or already matches the end of the word. // So if the remaining root word has positive length // and if there are enough chars in root word and added back strip chars // to meet the number of characters conditions, then test it tmpl = len - appndl; if ((tmpl > 0) && (tmpl + stripl >= numconds)) { // generate new root word by removing suffix and adding // back any characters that would have been stripped or // or null terminating the shorter string strcpy (tmpword, word); cp = (unsigned char *)(tmpword + tmpl); if (stripl) { strcpy ((char *)cp, strip); tmpl += stripl; cp = (unsigned char *)(tmpword + tmpl); } else *cp = '\0'; // now make sure all of the conditions on characters // are met. Please see the appendix at the end of // this file for more info on exactly what is being // tested // if all conditions are met then recall suffix_check if (test_condition((char *) cp, (char *) tmpword)) { if (ppfx) { // handle conditional suffix if ((contclass) && TESTAFF(contclass, ep->getFlag(), contclasslen)) { st = pmyMgr->suffix_check_morph(tmpword, tmpl, 0, NULL, aflag, needflag); if (st) { if (((PfxEntry *) ppfx)->getMorph()) { strcat(result, ((PfxEntry *) ppfx)->getMorph()); strcat(result, " "); } strcat(result,st); free(st); mychomp(result); } } else { st = pmyMgr->suffix_check_morph(tmpword, tmpl, optflags, ppfx, aflag, needflag); if (st) { strcat(result, st); free(st); mychomp(result); } } } else { st = pmyMgr->suffix_check_morph(tmpword, tmpl, 0, NULL, aflag, needflag); if (st) { strcat(result, st); free(st); mychomp(result); } } if (*result) return mystrdup(result); } } return NULL; } // get next homonym with same affix struct hentry * SfxEntry::get_next_homonym(struct hentry * he, int optflags, AffEntry* ppfx, const FLAG cclass, const FLAG needflag) { PfxEntry* ep = (PfxEntry *) ppfx; FLAG eFlag = ep ? ep->getFlag() : FLAG_NULL; while (he->next_homonym) { he = he->next_homonym; if ((TESTAFF(he->astr, aflag, he->alen) || (ep && ep->getCont() && TESTAFF(ep->getCont(), aflag, ep->getContLen()))) && ((optflags & aeXPRODUCT) == 0 || TESTAFF(he->astr, eFlag, he->alen) || // handle conditional suffix ((contclass) && TESTAFF(contclass, eFlag, contclasslen)) ) && // handle cont. class ((!cclass) || ((contclass) && TESTAFF(contclass, cclass, contclasslen)) ) && // handle required flag ((!needflag) || (TESTAFF(he->astr, needflag, he->alen) || ((contclass) && TESTAFF(contclass, needflag, contclasslen))) ) ) return he; } return NULL; } #if 0 Appendix: Understanding Affix Code An affix is either a prefix or a suffix attached to root words to make other words. Basically a Prefix or a Suffix is set of AffEntry objects which store information about the prefix or suffix along with supporting routines to check if a word has a particular prefix or suffix or a combination. The structure affentry is defined as follows: struct affentry { unsigned short aflag; // ID used to represent the affix char * strip; // string to strip before adding affix char * appnd; // the affix string to add unsigned char stripl; // length of the strip string unsigned char appndl; // length of the affix string char numconds; // the number of conditions that must be met char opts; // flag: aeXPRODUCT- combine both prefix and suffix char conds[SETSIZE]; // array which encodes the conditions to be met }; Here is a suffix borrowed from the en_US.aff file. This file is whitespace delimited. SFX D Y 4 SFX D 0 e d SFX D y ied [^aeiou]y SFX D 0 ed [^ey] SFX D 0 ed [aeiou]y This information can be interpreted as follows: In the first line has 4 fields Field ----- 1 SFX - indicates this is a suffix 2 D - is the name of the character flag which represents this suffix 3 Y - indicates it can be combined with prefixes (cross product) 4 4 - indicates that sequence of 4 affentry structures are needed to properly store the affix information The remaining lines describe the unique information for the 4 SfxEntry objects that make up this affix. Each line can be interpreted as follows: (note fields 1 and 2 are as a check against line 1 info) Field ----- 1 SFX - indicates this is a suffix 2 D - is the name of the character flag for this affix 3 y - the string of chars to strip off before adding affix (a 0 here indicates the NULL string) 4 ied - the string of affix characters to add 5 [^aeiou]y - the conditions which must be met before the affix can be applied Field 5 is interesting. Since this is a suffix, field 5 tells us that there are 2 conditions that must be met. The first condition is that the next to the last character in the word must *NOT* be any of the following "a", "e", "i", "o" or "u". The second condition is that the last character of the word must end in "y". So how can we encode this information concisely and be able to test for both conditions in a fast manner? The answer is found but studying the wonderful ispell code of Geoff Kuenning, et.al. (now available under a normal BSD license). If we set up a conds array of 256 bytes indexed (0 to 255) and access it using a character (cast to an unsigned char) of a string, we have 8 bits of information we can store about that character. Specifically we could use each bit to say if that character is allowed in any of the last (or first for prefixes) 8 characters of the word. Basically, each character at one end of the word (up to the number of conditions) is used to index into the conds array and the resulting value found there says whether the that character is valid for a specific character position in the word. For prefixes, it does this by setting bit 0 if that char is valid in the first position, bit 1 if valid in the second position, and so on. If a bit is not set, then that char is not valid for that postion in the word. If working with suffixes bit 0 is used for the character closest to the front, bit 1 for the next character towards the end, ..., with bit numconds-1 representing the last char at the end of the string. Note: since entries in the conds[] are 8 bits, only 8 conditions (read that only 8 character positions) can be examined at one end of a word (the beginning for prefixes and the end for suffixes. So to make this clearer, lets encode the conds array values for the first two affentries for the suffix D described earlier. For the first affentry: numconds = 1 (only examine the last character) conds['e'] = (1 << 0) (the word must end in an E) all others are all 0 For the second affentry: numconds = 2 (only examine the last two characters) conds[X] = conds[X] | (1 << 0) (aeiou are not allowed) where X is all characters *but* a, e, i, o, or u conds['y'] = (1 << 1) (the last char must be a y) all other bits for all other entries in the conds array are zero #endif robojournal-0.4.2/ui/hunspell/csutil.cxx0000644000175000017500000037453112211723646017070 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "license.hunspell" #include "license.myspell" #ifndef MOZILLA_CLIENT #include #include #include #include #else #include #include #include #include #endif #include "ui/hunspell/csutil.hxx" #include "ui/hunspell/atypes.hxx" #include "ui/hunspell/langnum.hxx" #ifdef OPENOFFICEORG # include #else # ifndef MOZILLA_CLIENT # include "utf_info.cxx" # define UTF_LST_LEN (sizeof(utf_lst) / (sizeof(unicode_info))) # endif #endif #ifdef MOZILLA_CLIENT #include "nsCOMPtr.h" #include "nsServiceManagerUtils.h" #include "nsIUnicodeEncoder.h" #include "nsIUnicodeDecoder.h" #include "nsICaseConversion.h" #include "nsICharsetConverterManager.h" #include "nsUnicharUtilCIID.h" #include "nsUnicharUtils.h" static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID); static NS_DEFINE_CID(kUnicharUtilCID, NS_UNICHARUTIL_CID); #endif #ifdef MOZILLA_CLIENT #ifdef __SUNPRO_CC // for SunONE Studio compiler using namespace std; #endif #else #ifndef WIN32 using namespace std; #endif #endif static struct unicode_info2 * utf_tbl = NULL; static int utf_tbl_count = 0; // utf_tbl can be used by multiple Hunspell instances /* only UTF-16 (BMP) implementation */ char * u16_u8(char * dest, int size, const w_char * src, int srclen) { signed char * u8 = (signed char *)dest; signed char * u8_max = (signed char *)(u8 + size); const w_char * u2 = src; const w_char * u2_max = src + srclen; while ((u2 < u2_max) && (u8 < u8_max)) { if (u2->h) { // > 0xFF // XXX 4-byte haven't implemented yet. if (u2->h >= 0x08) { // >= 0x800 (3-byte UTF-8 character) *u8 = 0xe0 + (u2->h >> 4); u8++; if (u8 < u8_max) { *u8 = 0x80 + ((u2->h & 0xf) << 2) + (u2->l >> 6); u8++; if (u8 < u8_max) { *u8 = 0x80 + (u2->l & 0x3f); u8++; } } } else { // < 0x800 (2-byte UTF-8 character) *u8 = 0xc0 + (u2->h << 2) + (u2->l >> 6); u8++; if (u8 < u8_max) { *u8 = 0x80 + (u2->l & 0x3f); u8++; } } } else { // <= 0xFF if (u2->l & 0x80) { // >0x80 (2-byte UTF-8 character) *u8 = 0xc0 + (u2->l >> 6); u8++; if (u8 < u8_max) { *u8 = 0x80 + (u2->l & 0x3f); u8++; } } else { // < 0x80 (1-byte UTF-8 character) *u8 = u2->l; u8++; } } u2++; } *u8 = '\0'; return dest; } /* only UTF-16 (BMP) implementation */ int u8_u16(w_char * dest, int size, const char * src) { const signed char * u8 = (const signed char *)src; w_char * u2 = dest; w_char * u2_max = u2 + size; while ((u2 < u2_max) && *u8) { switch ((*u8) & 0xf0) { case 0x00: case 0x10: case 0x20: case 0x30: case 0x40: case 0x50: case 0x60: case 0x70: { u2->h = 0; u2->l = *u8; break; } case 0x80: case 0x90: case 0xa0: case 0xb0: { HUNSPELL_WARNING(stderr, "UTF-8 encoding error. Unexpected continuation bytes in %ld. character position\n%s\n", static_cast(u8 - (signed char *)src), src); u2->h = 0xff; u2->l = 0xfd; break; } case 0xc0: case 0xd0: { // 2-byte UTF-8 codes if ((*(u8+1) & 0xc0) == 0x80) { u2->h = (*u8 & 0x1f) >> 2; u2->l = (*u8 << 6) + (*(u8+1) & 0x3f); u8++; } else { HUNSPELL_WARNING(stderr, "UTF-8 encoding error. Missing continuation byte in %ld. character position:\n%s\n", static_cast(u8 - (signed char *)src), src); u2->h = 0xff; u2->l = 0xfd; } break; } case 0xe0: { // 3-byte UTF-8 codes if ((*(u8+1) & 0xc0) == 0x80) { u2->h = ((*u8 & 0x0f) << 4) + ((*(u8+1) & 0x3f) >> 2); u8++; if ((*(u8+1) & 0xc0) == 0x80) { u2->l = (*u8 << 6) + (*(u8+1) & 0x3f); u8++; } else { HUNSPELL_WARNING(stderr, "UTF-8 encoding error. Missing continuation byte in %ld. character position:\n%s\n", static_cast(u8 - (signed char *)src), src); u2->h = 0xff; u2->l = 0xfd; } } else { HUNSPELL_WARNING(stderr, "UTF-8 encoding error. Missing continuation byte in %ld. character position:\n%s\n", static_cast(u8 - (signed char *)src), src); u2->h = 0xff; u2->l = 0xfd; } break; } case 0xf0: { // 4 or more byte UTF-8 codes HUNSPELL_WARNING(stderr, "This UTF-8 encoding can't convert to UTF-16:\n%s\n", src); u2->h = 0xff; u2->l = 0xfd; return -1; } } u8++; u2++; } return u2 - dest; } void flag_qsort(unsigned short flags[], int begin, int end) { unsigned short reg; if (end > begin) { unsigned short pivot = flags[begin]; int l = begin + 1; int r = end; while(l < r) { if (flags[l] <= pivot) { l++; } else { r--; reg = flags[l]; flags[l] = flags[r]; flags[r] = reg; } } l--; reg = flags[begin]; flags[begin] = flags[l]; flags[l] = reg; flag_qsort(flags, begin, l); flag_qsort(flags, r, end); } } int flag_bsearch(unsigned short flags[], unsigned short flag, int length) { int mid; int left = 0; int right = length - 1; while (left <= right) { mid = (left + right) / 2; if (flags[mid] == flag) return 1; if (flag < flags[mid]) right = mid - 1; else left = mid + 1; } return 0; } // strip strings into token based on single char delimiter // acts like strsep() but only uses a delim char and not // a delim string // default delimiter: white space characters char * mystrsep(char ** stringp, const char delim) { char * mp = *stringp; if (*mp != '\0') { char * dp; if (delim) { dp = strchr(mp, delim); } else { // don't use isspace() here, the string can be in some random charset // that's way different than the locale's for (dp = mp; (*dp && *dp != ' ' && *dp != '\t'); dp++); if (!*dp) dp = NULL; } if (dp) { *stringp = dp+1; int nc = (int)((unsigned long)dp - (unsigned long)mp); *(mp+nc) = '\0'; return mp; } else { *stringp = mp + strlen(mp); return mp; } } return NULL; } // replaces strdup with ansi version char * mystrdup(const char * s) { char * d = NULL; if (s) { int sl = strlen(s); d = (char *) malloc(((sl+1) * sizeof(char))); if (d) { memcpy(d,s,((sl+1)*sizeof(char))); return d; } HUNSPELL_WARNING(stderr, "Can't allocate memory.\n"); } return d; } // remove cross-platform text line end characters void mychomp(char * s) { int k = strlen(s); if ((k > 0) && ((*(s+k-1)=='\r') || (*(s+k-1)=='\n'))) *(s+k-1) = '\0'; if ((k > 1) && (*(s+k-2) == '\r')) *(s+k-2) = '\0'; } // does an ansi strdup of the reverse of a string char * myrevstrdup(const char * s) { char * d = NULL; if (s) { int sl = strlen(s); d = (char *) malloc((sl+1) * sizeof(char)); if (d) { const char * p = s + sl - 1; char * q = d; while (p >= s) *q++ = *p--; *q = '\0'; } } return d; } // break text to lines // return number of lines int line_tok(const char * text, char *** lines, char breakchar) { int linenum = 0; char * dup = mystrdup(text); char * p = strchr(dup, breakchar); while (p) { linenum++; *p = '\0'; p++; p = strchr(p, breakchar); } linenum++; // fprintf(stderr, "LINEN:%d %p %p\n", linenum, lines, *lines); *lines = (char **) malloc(linenum * sizeof(char *)); // fprintf(stderr, "hello\n"); if (!(*lines)) { free(dup); return 0; } p = dup; int l = 0; for (int i = 0; i < linenum; i++) { if (*p != '\0') { (*lines)[l] = mystrdup(p); if (!(*lines)[l]) { for (i = 0; i < l; i++) free((*lines)[i]); free(dup); return 0; } l++; } p += strlen(p) + 1; } free(dup); if (!l) free(*lines); return l; } // uniq line in place char * line_uniq(char * text, char breakchar) { char ** lines; int linenum = line_tok(text, &lines, breakchar); int i; strcpy(text, lines[0]); for ( i = 1; i < linenum; i++ ) { int dup = 0; for (int j = 0; j < i; j++) { if (strcmp(lines[i], lines[j]) == 0) dup = 1; } if (!dup) { if ((i > 1) || (*(lines[0]) != '\0')) { sprintf(text + strlen(text), "%c", breakchar); } strcat(text, lines[i]); } } for ( i = 0; i < linenum; i++ ) { if (lines[i]) free(lines[i]); } if (lines) free(lines); return text; } // uniq and boundary for compound analysis: "1\n\2\n\1" -> " ( \1 | \2 ) " char * line_uniq_app(char ** text, char breakchar) { if (!strchr(*text, breakchar)) { return *text; } char ** lines; int i; int linenum = line_tok(*text, &lines, breakchar); int dup = 0; for (i = 0; i < linenum; i++) { for (int j = 0; j < (i - 1); j++) { if (strcmp(lines[i], lines[j]) == 0) { *(lines[i]) = '\0'; dup++; break; } } } if ((linenum - dup) == 1) { strcpy(*text, lines[0]); freelist(&lines, linenum); return *text; } char * newtext = (char *) malloc(strlen(*text) + 2 * linenum + 3 + 1); if (newtext) { free(*text); *text = newtext; } else { freelist(&lines, linenum); return *text; } strcpy(*text," ( "); for (i = 0; i < linenum; i++) if (*(lines[i])) { sprintf(*text + strlen(*text), "%s%s", lines[i], " | "); } (*text)[strlen(*text) - 2] = ')'; // " ) " freelist(&lines, linenum); return *text; } // append s to ends of every lines in text void strlinecat(char * dest, const char * s) { char * dup = mystrdup(dest); char * source = dup; int len = strlen(s); if (dup) { while (*source) { if (*source == '\n') { strncpy(dest, s, len); dest += len; } *dest = *source; source++; dest++; } strcpy(dest, s); free(dup); } } // change \n to char c char * tr(char * text, char oldc, char newc) { char * p; for (p = text; *p; p++) if (*p == oldc) *p = newc; return text; } // morphcmp(): compare MORPH_DERI_SFX, MORPH_INFL_SFX and MORPH_TERM_SFX fields // in the first line of the inputs // return 0, if inputs equal // return 1, if inputs may equal with a secondary suffix // otherwise return -1 int morphcmp(const char * s, const char * t) { int se = 0; int te = 0; const char * sl; const char * tl; const char * olds; const char * oldt; if (!s || !t) return 1; olds = s; sl = strchr(s, '\n'); s = strstr(s, MORPH_DERI_SFX); if (!s || (sl && sl < s)) s = strstr(olds, MORPH_INFL_SFX); if (!s || (sl && sl < s)) { s= strstr(olds, MORPH_TERM_SFX); olds = NULL; } oldt = t; tl = strchr(t, '\n'); t = strstr(t, MORPH_DERI_SFX); if (!t || (tl && tl < t)) t = strstr(oldt, MORPH_INFL_SFX); if (!t || (tl && tl < t)) { t = strstr(oldt, MORPH_TERM_SFX); oldt = NULL; } while (s && t && (!sl || sl > s) && (!tl || tl > t)) { s += MORPH_TAG_LEN; t += MORPH_TAG_LEN; se = 0; te = 0; while ((*s == *t) && !se && !te) { s++; t++; switch(*s) { case ' ': case '\n': case '\t': case '\0': se = 1; } switch(*t) { case ' ': case '\n': case '\t': case '\0': te = 1; } } if (!se || !te) { // not terminal suffix difference if (olds) return -1; return 1; } olds = s; s = strstr(s, MORPH_DERI_SFX); if (!s || (sl && sl < s)) s = strstr(olds, MORPH_INFL_SFX); if (!s || (sl && sl < s)) { s = strstr(olds, MORPH_TERM_SFX); olds = NULL; } oldt = t; t = strstr(t, MORPH_DERI_SFX); if (!t || (tl && tl < t)) t = strstr(oldt, MORPH_INFL_SFX); if (!t || (tl && tl < t)) { t = strstr(oldt, MORPH_TERM_SFX); oldt = NULL; } } if (!s && !t && se && te) return 0; return 1; } int get_sfxcount(const char * morph) { if (!morph || !*morph) return 0; int n = 0; const char * old = morph; morph = strstr(morph, MORPH_DERI_SFX); if (!morph) morph = strstr(old, MORPH_INFL_SFX); if (!morph) morph = strstr(old, MORPH_TERM_SFX); while (morph) { n++; old = morph; morph = strstr(morph + 1, MORPH_DERI_SFX); if (!morph) morph = strstr(old + 1, MORPH_INFL_SFX); if (!morph) morph = strstr(old + 1, MORPH_TERM_SFX); } return n; } int fieldlen(const char * r) { int n = 0; while (r && *r != '\t' && *r != '\0' && *r != '\n' && *r != ' ') { r++; n++; } return n; } char * copy_field(char * dest, const char * morph, const char * var) { if (!morph) return NULL; const char * beg = strstr(morph, var); if (beg) { char * d = dest; for (beg += MORPH_TAG_LEN; *beg != ' ' && *beg != '\t' && *beg != '\n' && *beg != '\0'; d++, beg++) { *d = *beg; } *d = '\0'; return dest; } return NULL; } char * mystrrep(char * word, const char * pat, const char * rep) { char * pos = strstr(word, pat); if (pos) { int replen = strlen(rep); int patlen = strlen(pat); if (replen < patlen) { char * end = word + strlen(word); char * next = pos + replen; char * prev = pos + strlen(pat); for (; prev < end; *next = *prev, prev++, next++); *next = '\0'; } else if (replen > patlen) { char * end = pos + patlen; char * next = word + strlen(word) + replen - patlen; char * prev = next - replen + patlen; for (; prev >= end; *next = *prev, prev--, next--); } strncpy(pos, rep, replen); } return word; } // reverse word int reverseword(char * word) { char r; for (char * dest = word + strlen(word) - 1; word < dest; word++, dest--) { r=*word; *word = *dest; *dest = r; } return 0; } // reverse word (error: 1) int reverseword_utf(char * word) { w_char w[MAXWORDLEN]; w_char * p; w_char r; int l = u8_u16(w, MAXWORDLEN, word); if (l == -1) return 1; p = w; for (w_char * dest = w + l - 1; p < dest; p++, dest--) { r=*p; *p = *dest; *dest = r; } u16_u8(word, MAXWORDUTF8LEN, w, l); return 0; } int uniqlist(char ** list, int n) { int i; if (n < 2) return n; for (i = 0; i < n; i++) { for (int j = 0; j < i; j++) { if (list[j] && list[i] && (strcmp(list[j], list[i]) == 0)) { free(list[i]); list[i] = NULL; break; } } } int m = 1; for (i = 1; i < n; i++) if (list[i]) { list[m] = list[i]; m++; } return m; } void freelist(char *** list, int n) { if (list && *list && n > 0) { for (int i = 0; i < n; i++) if ((*list)[i]) free((*list)[i]); free(*list); *list = NULL; } } // convert null terminated string to all caps void mkallcap(char * p, const struct cs_info * csconv) { while (*p != '\0') { *p = csconv[((unsigned char) *p)].cupper; p++; } } // convert null terminated string to all little void mkallsmall(char * p, const struct cs_info * csconv) { while (*p != '\0') { *p = csconv[((unsigned char) *p)].clower; p++; } } void mkallsmall_utf(w_char * u, int nc, int langnum) { for (int i = 0; i < nc; i++) { unsigned short idx = (u[i].h << 8) + u[i].l; if (idx != unicodetolower(idx, langnum)) { u[i].h = (unsigned char) (unicodetolower(idx, langnum) >> 8); u[i].l = (unsigned char) (unicodetolower(idx, langnum) & 0x00FF); } } } void mkallcap_utf(w_char * u, int nc, int langnum) { for (int i = 0; i < nc; i++) { unsigned short idx = (u[i].h << 8) + u[i].l; if (idx != unicodetoupper(idx, langnum)) { u[i].h = (unsigned char) (unicodetoupper(idx, langnum) >> 8); u[i].l = (unsigned char) (unicodetoupper(idx, langnum) & 0x00FF); } } } // convert null terminated string to have intial capital void mkinitcap(char * p, const struct cs_info * csconv) { if (*p != '\0') *p = csconv[((unsigned char)*p)].cupper; } #ifndef MOZILLA_CLIENT // convert null terminated string to all caps using encoding void enmkallcap(char * d, const char * p, const char * encoding) { struct cs_info * csconv = get_current_cs(encoding); while (*p != '\0') { *d++ = csconv[((unsigned char) *p)].cupper; p++; } *d = '\0'; } // convert null terminated string to all little using encoding void enmkallsmall(char * d, const char * p, const char * encoding) { struct cs_info * csconv = get_current_cs(encoding); while (*p != '\0') { *d++ = csconv[((unsigned char) *p)].clower; p++; } *d = '\0'; } // convert null terminated string to have intial capital using encoding void enmkinitcap(char * d, const char * p, const char * encoding) { struct cs_info * csconv = get_current_cs(encoding); memcpy(d,p,(strlen(p)+1)); if (*p != '\0') *d= csconv[((unsigned char)*p)].cupper; } // conversion function for protected memory void store_pointer(char * dest, char * source) { memcpy(dest, &source, sizeof(char *)); } // conversion function for protected memory char * get_stored_pointer(char * s) { char * p; memcpy(&p, s, sizeof(char *)); return p; } // these are simple character mappings for the // encodings supported // supplying isupper, tolower, and toupper struct cs_info iso1_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x00, 0xa3, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x00, 0xa5, 0xa5 }, { 0x00, 0xa6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa8 }, { 0x00, 0xa9, 0xa9 }, { 0x00, 0xaa, 0xaa }, { 0x00, 0xab, 0xab }, { 0x00, 0xac, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x00, 0xaf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xb1 }, { 0x00, 0xb2, 0xb2 }, { 0x00, 0xb3, 0xb3 }, { 0x00, 0xb4, 0xb4 }, { 0x00, 0xb5, 0xb5 }, { 0x00, 0xb6, 0xb6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xb8 }, { 0x00, 0xb9, 0xb9 }, { 0x00, 0xba, 0xba }, { 0x00, 0xbb, 0xbb }, { 0x00, 0xbc, 0xbc }, { 0x00, 0xbd, 0xbd }, { 0x00, 0xbe, 0xbe }, { 0x00, 0xbf, 0xbf }, { 0x01, 0xe0, 0xc0 }, { 0x01, 0xe1, 0xc1 }, { 0x01, 0xe2, 0xc2 }, { 0x01, 0xe3, 0xc3 }, { 0x01, 0xe4, 0xc4 }, { 0x01, 0xe5, 0xc5 }, { 0x01, 0xe6, 0xc6 }, { 0x01, 0xe7, 0xc7 }, { 0x01, 0xe8, 0xc8 }, { 0x01, 0xe9, 0xc9 }, { 0x01, 0xea, 0xca }, { 0x01, 0xeb, 0xcb }, { 0x01, 0xec, 0xcc }, { 0x01, 0xed, 0xcd }, { 0x01, 0xee, 0xce }, { 0x01, 0xef, 0xcf }, { 0x01, 0xf0, 0xd0 }, { 0x01, 0xf1, 0xd1 }, { 0x01, 0xf2, 0xd2 }, { 0x01, 0xf3, 0xd3 }, { 0x01, 0xf4, 0xd4 }, { 0x01, 0xf5, 0xd5 }, { 0x01, 0xf6, 0xd6 }, { 0x00, 0xd7, 0xd7 }, { 0x01, 0xf8, 0xd8 }, { 0x01, 0xf9, 0xd9 }, { 0x01, 0xfa, 0xda }, { 0x01, 0xfb, 0xdb }, { 0x01, 0xfc, 0xdc }, { 0x01, 0xfd, 0xdd }, { 0x01, 0xfe, 0xde }, { 0x00, 0xdf, 0xdf }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe1, 0xc1 }, { 0x00, 0xe2, 0xc2 }, { 0x00, 0xe3, 0xc3 }, { 0x00, 0xe4, 0xc4 }, { 0x00, 0xe5, 0xc5 }, { 0x00, 0xe6, 0xc6 }, { 0x00, 0xe7, 0xc7 }, { 0x00, 0xe8, 0xc8 }, { 0x00, 0xe9, 0xc9 }, { 0x00, 0xea, 0xca }, { 0x00, 0xeb, 0xcb }, { 0x00, 0xec, 0xcc }, { 0x00, 0xed, 0xcd }, { 0x00, 0xee, 0xce }, { 0x00, 0xef, 0xcf }, { 0x00, 0xf0, 0xd0 }, { 0x00, 0xf1, 0xd1 }, { 0x00, 0xf2, 0xd2 }, { 0x00, 0xf3, 0xd3 }, { 0x00, 0xf4, 0xd4 }, { 0x00, 0xf5, 0xd5 }, { 0x00, 0xf6, 0xd6 }, { 0x00, 0xf7, 0xf7 }, { 0x00, 0xf8, 0xd8 }, { 0x00, 0xf9, 0xd9 }, { 0x00, 0xfa, 0xda }, { 0x00, 0xfb, 0xdb }, { 0x00, 0xfc, 0xdc }, { 0x00, 0xfd, 0xdd }, { 0x00, 0xfe, 0xde }, { 0x00, 0xff, 0xff } }; struct cs_info iso2_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x01, 0xb1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x01, 0xb3, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x01, 0xb5, 0xa5 }, { 0x01, 0xb6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa8 }, { 0x01, 0xb9, 0xa9 }, { 0x01, 0xba, 0xaa }, { 0x01, 0xbb, 0xab }, { 0x01, 0xbc, 0xac }, { 0x00, 0xad, 0xad }, { 0x01, 0xbe, 0xae }, { 0x01, 0xbf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xa1 }, { 0x00, 0xb2, 0xb2 }, { 0x00, 0xb3, 0xa3 }, { 0x00, 0xb4, 0xb4 }, { 0x00, 0xb5, 0xa5 }, { 0x00, 0xb6, 0xa6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xb8 }, { 0x00, 0xb9, 0xa9 }, { 0x00, 0xba, 0xaa }, { 0x00, 0xbb, 0xab }, { 0x00, 0xbc, 0xac }, { 0x00, 0xbd, 0xbd }, { 0x00, 0xbe, 0xae }, { 0x00, 0xbf, 0xaf }, { 0x01, 0xe0, 0xc0 }, { 0x01, 0xe1, 0xc1 }, { 0x01, 0xe2, 0xc2 }, { 0x01, 0xe3, 0xc3 }, { 0x01, 0xe4, 0xc4 }, { 0x01, 0xe5, 0xc5 }, { 0x01, 0xe6, 0xc6 }, { 0x01, 0xe7, 0xc7 }, { 0x01, 0xe8, 0xc8 }, { 0x01, 0xe9, 0xc9 }, { 0x01, 0xea, 0xca }, { 0x01, 0xeb, 0xcb }, { 0x01, 0xec, 0xcc }, { 0x01, 0xed, 0xcd }, { 0x01, 0xee, 0xce }, { 0x01, 0xef, 0xcf }, { 0x01, 0xf0, 0xd0 }, { 0x01, 0xf1, 0xd1 }, { 0x01, 0xf2, 0xd2 }, { 0x01, 0xf3, 0xd3 }, { 0x01, 0xf4, 0xd4 }, { 0x01, 0xf5, 0xd5 }, { 0x01, 0xf6, 0xd6 }, { 0x00, 0xd7, 0xd7 }, { 0x01, 0xf8, 0xd8 }, { 0x01, 0xf9, 0xd9 }, { 0x01, 0xfa, 0xda }, { 0x01, 0xfb, 0xdb }, { 0x01, 0xfc, 0xdc }, { 0x01, 0xfd, 0xdd }, { 0x01, 0xfe, 0xde }, { 0x00, 0xdf, 0xdf }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe1, 0xc1 }, { 0x00, 0xe2, 0xc2 }, { 0x00, 0xe3, 0xc3 }, { 0x00, 0xe4, 0xc4 }, { 0x00, 0xe5, 0xc5 }, { 0x00, 0xe6, 0xc6 }, { 0x00, 0xe7, 0xc7 }, { 0x00, 0xe8, 0xc8 }, { 0x00, 0xe9, 0xc9 }, { 0x00, 0xea, 0xca }, { 0x00, 0xeb, 0xcb }, { 0x00, 0xec, 0xcc }, { 0x00, 0xed, 0xcd }, { 0x00, 0xee, 0xce }, { 0x00, 0xef, 0xcf }, { 0x00, 0xf0, 0xd0 }, { 0x00, 0xf1, 0xd1 }, { 0x00, 0xf2, 0xd2 }, { 0x00, 0xf3, 0xd3 }, { 0x00, 0xf4, 0xd4 }, { 0x00, 0xf5, 0xd5 }, { 0x00, 0xf6, 0xd6 }, { 0x00, 0xf7, 0xf7 }, { 0x00, 0xf8, 0xd8 }, { 0x00, 0xf9, 0xd9 }, { 0x00, 0xfa, 0xda }, { 0x00, 0xfb, 0xdb }, { 0x00, 0xfc, 0xdc }, { 0x00, 0xfd, 0xdd }, { 0x00, 0xfe, 0xde }, { 0x00, 0xff, 0xff } }; struct cs_info iso3_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x01, 0xb1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x00, 0xa3, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x00, 0xa5, 0xa5 }, { 0x01, 0xb6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa8 }, { 0x01, 0x69, 0xa9 }, { 0x01, 0xba, 0xaa }, { 0x01, 0xbb, 0xab }, { 0x01, 0xbc, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x01, 0xbf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xa1 }, { 0x00, 0xb2, 0xb2 }, { 0x00, 0xb3, 0xb3 }, { 0x00, 0xb4, 0xb4 }, { 0x00, 0xb5, 0xb5 }, { 0x00, 0xb6, 0xa6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xb8 }, { 0x00, 0xb9, 0x49 }, { 0x00, 0xba, 0xaa }, { 0x00, 0xbb, 0xab }, { 0x00, 0xbc, 0xac }, { 0x00, 0xbd, 0xbd }, { 0x00, 0xbe, 0xbe }, { 0x00, 0xbf, 0xaf }, { 0x01, 0xe0, 0xc0 }, { 0x01, 0xe1, 0xc1 }, { 0x01, 0xe2, 0xc2 }, { 0x00, 0xc3, 0xc3 }, { 0x01, 0xe4, 0xc4 }, { 0x01, 0xe5, 0xc5 }, { 0x01, 0xe6, 0xc6 }, { 0x01, 0xe7, 0xc7 }, { 0x01, 0xe8, 0xc8 }, { 0x01, 0xe9, 0xc9 }, { 0x01, 0xea, 0xca }, { 0x01, 0xeb, 0xcb }, { 0x01, 0xec, 0xcc }, { 0x01, 0xed, 0xcd }, { 0x01, 0xee, 0xce }, { 0x01, 0xef, 0xcf }, { 0x00, 0xd0, 0xd0 }, { 0x01, 0xf1, 0xd1 }, { 0x01, 0xf2, 0xd2 }, { 0x01, 0xf3, 0xd3 }, { 0x01, 0xf4, 0xd4 }, { 0x01, 0xf5, 0xd5 }, { 0x01, 0xf6, 0xd6 }, { 0x00, 0xd7, 0xd7 }, { 0x01, 0xf8, 0xd8 }, { 0x01, 0xf9, 0xd9 }, { 0x01, 0xfa, 0xda }, { 0x01, 0xfb, 0xdb }, { 0x01, 0xfc, 0xdc }, { 0x01, 0xfd, 0xdd }, { 0x01, 0xfe, 0xde }, { 0x00, 0xdf, 0xdf }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe1, 0xc1 }, { 0x00, 0xe2, 0xc2 }, { 0x00, 0xe3, 0xe3 }, { 0x00, 0xe4, 0xc4 }, { 0x00, 0xe5, 0xc5 }, { 0x00, 0xe6, 0xc6 }, { 0x00, 0xe7, 0xc7 }, { 0x00, 0xe8, 0xc8 }, { 0x00, 0xe9, 0xc9 }, { 0x00, 0xea, 0xca }, { 0x00, 0xeb, 0xcb }, { 0x00, 0xec, 0xcc }, { 0x00, 0xed, 0xcd }, { 0x00, 0xee, 0xce }, { 0x00, 0xef, 0xcf }, { 0x00, 0xf0, 0xf0 }, { 0x00, 0xf1, 0xd1 }, { 0x00, 0xf2, 0xd2 }, { 0x00, 0xf3, 0xd3 }, { 0x00, 0xf4, 0xd4 }, { 0x00, 0xf5, 0xd5 }, { 0x00, 0xf6, 0xd6 }, { 0x00, 0xf7, 0xf7 }, { 0x00, 0xf8, 0xd8 }, { 0x00, 0xf9, 0xd9 }, { 0x00, 0xfa, 0xda }, { 0x00, 0xfb, 0xdb }, { 0x00, 0xfc, 0xdc }, { 0x00, 0xfd, 0xdd }, { 0x00, 0xfe, 0xde }, { 0x00, 0xff, 0xff } }; struct cs_info iso4_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x01, 0xb1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x01, 0xb3, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x01, 0xb5, 0xa5 }, { 0x01, 0xb6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa8 }, { 0x01, 0xb9, 0xa9 }, { 0x01, 0xba, 0xaa }, { 0x01, 0xbb, 0xab }, { 0x01, 0xbc, 0xac }, { 0x00, 0xad, 0xad }, { 0x01, 0xbe, 0xae }, { 0x00, 0xaf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xa1 }, { 0x00, 0xb2, 0xb2 }, { 0x00, 0xb3, 0xa3 }, { 0x00, 0xb4, 0xb4 }, { 0x00, 0xb5, 0xa5 }, { 0x00, 0xb6, 0xa6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xb8 }, { 0x00, 0xb9, 0xa9 }, { 0x00, 0xba, 0xaa }, { 0x00, 0xbb, 0xab }, { 0x00, 0xbc, 0xac }, { 0x00, 0xbd, 0xbd }, { 0x00, 0xbe, 0xae }, { 0x00, 0xbf, 0xbf }, { 0x01, 0xe0, 0xc0 }, { 0x01, 0xe1, 0xc1 }, { 0x01, 0xe2, 0xc2 }, { 0x01, 0xe3, 0xc3 }, { 0x01, 0xe4, 0xc4 }, { 0x01, 0xe5, 0xc5 }, { 0x01, 0xe6, 0xc6 }, { 0x01, 0xe7, 0xc7 }, { 0x01, 0xe8, 0xc8 }, { 0x01, 0xe9, 0xc9 }, { 0x01, 0xea, 0xca }, { 0x01, 0xeb, 0xcb }, { 0x01, 0xec, 0xcc }, { 0x01, 0xed, 0xcd }, { 0x01, 0xee, 0xce }, { 0x01, 0xef, 0xcf }, { 0x01, 0xf0, 0xd0 }, { 0x01, 0xf1, 0xd1 }, { 0x01, 0xf2, 0xd2 }, { 0x01, 0xf3, 0xd3 }, { 0x01, 0xf4, 0xd4 }, { 0x01, 0xf5, 0xd5 }, { 0x01, 0xf6, 0xd6 }, { 0x00, 0xd7, 0xd7 }, { 0x01, 0xf8, 0xd8 }, { 0x01, 0xf9, 0xd9 }, { 0x01, 0xfa, 0xda }, { 0x01, 0xfb, 0xdb }, { 0x01, 0xfc, 0xdc }, { 0x01, 0xfd, 0xdd }, { 0x01, 0xfe, 0xde }, { 0x00, 0xdf, 0xdf }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe1, 0xc1 }, { 0x00, 0xe2, 0xc2 }, { 0x00, 0xe3, 0xc3 }, { 0x00, 0xe4, 0xc4 }, { 0x00, 0xe5, 0xc5 }, { 0x00, 0xe6, 0xc6 }, { 0x00, 0xe7, 0xc7 }, { 0x00, 0xe8, 0xc8 }, { 0x00, 0xe9, 0xc9 }, { 0x00, 0xea, 0xca }, { 0x00, 0xeb, 0xcb }, { 0x00, 0xec, 0xcc }, { 0x00, 0xed, 0xcd }, { 0x00, 0xee, 0xce }, { 0x00, 0xef, 0xcf }, { 0x00, 0xf0, 0xd0 }, { 0x00, 0xf1, 0xd1 }, { 0x00, 0xf2, 0xd2 }, { 0x00, 0xf3, 0xd3 }, { 0x00, 0xf4, 0xd4 }, { 0x00, 0xf5, 0xd5 }, { 0x00, 0xf6, 0xd6 }, { 0x00, 0xf7, 0xf7 }, { 0x00, 0xf8, 0xd8 }, { 0x00, 0xf9, 0xd9 }, { 0x00, 0xfa, 0xda }, { 0x00, 0xfb, 0xdb }, { 0x00, 0xfc, 0xdc }, { 0x00, 0xfd, 0xdd }, { 0x00, 0xfe, 0xde }, { 0x00, 0xff, 0xff } }; struct cs_info iso5_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x01, 0xf1, 0xa1 }, { 0x01, 0xf2, 0xa2 }, { 0x01, 0xf3, 0xa3 }, { 0x01, 0xf4, 0xa4 }, { 0x01, 0xf5, 0xa5 }, { 0x01, 0xf6, 0xa6 }, { 0x01, 0xf7, 0xa7 }, { 0x01, 0xf8, 0xa8 }, { 0x01, 0xf9, 0xa9 }, { 0x01, 0xfa, 0xaa }, { 0x01, 0xfb, 0xab }, { 0x01, 0xfc, 0xac }, { 0x00, 0xad, 0xad }, { 0x01, 0xfe, 0xae }, { 0x01, 0xff, 0xaf }, { 0x01, 0xd0, 0xb0 }, { 0x01, 0xd1, 0xb1 }, { 0x01, 0xd2, 0xb2 }, { 0x01, 0xd3, 0xb3 }, { 0x01, 0xd4, 0xb4 }, { 0x01, 0xd5, 0xb5 }, { 0x01, 0xd6, 0xb6 }, { 0x01, 0xd7, 0xb7 }, { 0x01, 0xd8, 0xb8 }, { 0x01, 0xd9, 0xb9 }, { 0x01, 0xda, 0xba }, { 0x01, 0xdb, 0xbb }, { 0x01, 0xdc, 0xbc }, { 0x01, 0xdd, 0xbd }, { 0x01, 0xde, 0xbe }, { 0x01, 0xdf, 0xbf }, { 0x01, 0xe0, 0xc0 }, { 0x01, 0xe1, 0xc1 }, { 0x01, 0xe2, 0xc2 }, { 0x01, 0xe3, 0xc3 }, { 0x01, 0xe4, 0xc4 }, { 0x01, 0xe5, 0xc5 }, { 0x01, 0xe6, 0xc6 }, { 0x01, 0xe7, 0xc7 }, { 0x01, 0xe8, 0xc8 }, { 0x01, 0xe9, 0xc9 }, { 0x01, 0xea, 0xca }, { 0x01, 0xeb, 0xcb }, { 0x01, 0xec, 0xcc }, { 0x01, 0xed, 0xcd }, { 0x01, 0xee, 0xce }, { 0x01, 0xef, 0xcf }, { 0x00, 0xd0, 0xb0 }, { 0x00, 0xd1, 0xb1 }, { 0x00, 0xd2, 0xb2 }, { 0x00, 0xd3, 0xb3 }, { 0x00, 0xd4, 0xb4 }, { 0x00, 0xd5, 0xb5 }, { 0x00, 0xd6, 0xb6 }, { 0x00, 0xd7, 0xb7 }, { 0x00, 0xd8, 0xb8 }, { 0x00, 0xd9, 0xb9 }, { 0x00, 0xda, 0xba }, { 0x00, 0xdb, 0xbb }, { 0x00, 0xdc, 0xbc }, { 0x00, 0xdd, 0xbd }, { 0x00, 0xde, 0xbe }, { 0x00, 0xdf, 0xbf }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe1, 0xc1 }, { 0x00, 0xe2, 0xc2 }, { 0x00, 0xe3, 0xc3 }, { 0x00, 0xe4, 0xc4 }, { 0x00, 0xe5, 0xc5 }, { 0x00, 0xe6, 0xc6 }, { 0x00, 0xe7, 0xc7 }, { 0x00, 0xe8, 0xc8 }, { 0x00, 0xe9, 0xc9 }, { 0x00, 0xea, 0xca }, { 0x00, 0xeb, 0xcb }, { 0x00, 0xec, 0xcc }, { 0x00, 0xed, 0xcd }, { 0x00, 0xee, 0xce }, { 0x00, 0xef, 0xcf }, { 0x00, 0xf0, 0xf0 }, { 0x00, 0xf1, 0xa1 }, { 0x00, 0xf2, 0xa2 }, { 0x00, 0xf3, 0xa3 }, { 0x00, 0xf4, 0xa4 }, { 0x00, 0xf5, 0xa5 }, { 0x00, 0xf6, 0xa6 }, { 0x00, 0xf7, 0xa7 }, { 0x00, 0xf8, 0xa8 }, { 0x00, 0xf9, 0xa9 }, { 0x00, 0xfa, 0xaa }, { 0x00, 0xfb, 0xab }, { 0x00, 0xfc, 0xac }, { 0x00, 0xfd, 0xfd }, { 0x00, 0xfe, 0xae }, { 0x00, 0xff, 0xaf } }; struct cs_info iso6_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x00, 0xa3, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x00, 0xa5, 0xa5 }, { 0x00, 0xa6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa8 }, { 0x00, 0xa9, 0xa9 }, { 0x00, 0xaa, 0xaa }, { 0x00, 0xab, 0xab }, { 0x00, 0xac, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x00, 0xaf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xb1 }, { 0x00, 0xb2, 0xb2 }, { 0x00, 0xb3, 0xb3 }, { 0x00, 0xb4, 0xb4 }, { 0x00, 0xb5, 0xb5 }, { 0x00, 0xb6, 0xb6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xb8 }, { 0x00, 0xb9, 0xb9 }, { 0x00, 0xba, 0xba }, { 0x00, 0xbb, 0xbb }, { 0x00, 0xbc, 0xbc }, { 0x00, 0xbd, 0xbd }, { 0x00, 0xbe, 0xbe }, { 0x00, 0xbf, 0xbf }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc1, 0xc1 }, { 0x00, 0xc2, 0xc2 }, { 0x00, 0xc3, 0xc3 }, { 0x00, 0xc4, 0xc4 }, { 0x00, 0xc5, 0xc5 }, { 0x00, 0xc6, 0xc6 }, { 0x00, 0xc7, 0xc7 }, { 0x00, 0xc8, 0xc8 }, { 0x00, 0xc9, 0xc9 }, { 0x00, 0xca, 0xca }, { 0x00, 0xcb, 0xcb }, { 0x00, 0xcc, 0xcc }, { 0x00, 0xcd, 0xcd }, { 0x00, 0xce, 0xce }, { 0x00, 0xcf, 0xcf }, { 0x00, 0xd0, 0xd0 }, { 0x00, 0xd1, 0xd1 }, { 0x00, 0xd2, 0xd2 }, { 0x00, 0xd3, 0xd3 }, { 0x00, 0xd4, 0xd4 }, { 0x00, 0xd5, 0xd5 }, { 0x00, 0xd6, 0xd6 }, { 0x00, 0xd7, 0xd7 }, { 0x00, 0xd8, 0xd8 }, { 0x00, 0xd9, 0xd9 }, { 0x00, 0xda, 0xda }, { 0x00, 0xdb, 0xdb }, { 0x00, 0xdc, 0xdc }, { 0x00, 0xdd, 0xdd }, { 0x00, 0xde, 0xde }, { 0x00, 0xdf, 0xdf }, { 0x00, 0xe0, 0xe0 }, { 0x00, 0xe1, 0xe1 }, { 0x00, 0xe2, 0xe2 }, { 0x00, 0xe3, 0xe3 }, { 0x00, 0xe4, 0xe4 }, { 0x00, 0xe5, 0xe5 }, { 0x00, 0xe6, 0xe6 }, { 0x00, 0xe7, 0xe7 }, { 0x00, 0xe8, 0xe8 }, { 0x00, 0xe9, 0xe9 }, { 0x00, 0xea, 0xea }, { 0x00, 0xeb, 0xeb }, { 0x00, 0xec, 0xec }, { 0x00, 0xed, 0xed }, { 0x00, 0xee, 0xee }, { 0x00, 0xef, 0xef }, { 0x00, 0xf0, 0xf0 }, { 0x00, 0xf1, 0xf1 }, { 0x00, 0xf2, 0xf2 }, { 0x00, 0xf3, 0xf3 }, { 0x00, 0xf4, 0xf4 }, { 0x00, 0xf5, 0xf5 }, { 0x00, 0xf6, 0xf6 }, { 0x00, 0xf7, 0xf7 }, { 0x00, 0xf8, 0xf8 }, { 0x00, 0xf9, 0xf9 }, { 0x00, 0xfa, 0xfa }, { 0x00, 0xfb, 0xfb }, { 0x00, 0xfc, 0xfc }, { 0x00, 0xfd, 0xfd }, { 0x00, 0xfe, 0xfe }, { 0x00, 0xff, 0xff } }; struct cs_info iso7_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x00, 0xa3, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x00, 0xa5, 0xa5 }, { 0x00, 0xa6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa8 }, { 0x00, 0xa9, 0xa9 }, { 0x00, 0xaa, 0xaa }, { 0x00, 0xab, 0xab }, { 0x00, 0xac, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x00, 0xaf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xb1 }, { 0x00, 0xb2, 0xb2 }, { 0x00, 0xb3, 0xb3 }, { 0x00, 0xb4, 0xb4 }, { 0x00, 0xb5, 0xb5 }, { 0x01, 0xdc, 0xb6 }, { 0x00, 0xb7, 0xb7 }, { 0x01, 0xdd, 0xb8 }, { 0x01, 0xde, 0xb9 }, { 0x01, 0xdf, 0xba }, { 0x00, 0xbb, 0xbb }, { 0x01, 0xfc, 0xbc }, { 0x00, 0xbd, 0xbd }, { 0x01, 0xfd, 0xbe }, { 0x01, 0xfe, 0xbf }, { 0x00, 0xc0, 0xc0 }, { 0x01, 0xe1, 0xc1 }, { 0x01, 0xe2, 0xc2 }, { 0x01, 0xe3, 0xc3 }, { 0x01, 0xe4, 0xc4 }, { 0x01, 0xe5, 0xc5 }, { 0x01, 0xe6, 0xc6 }, { 0x01, 0xe7, 0xc7 }, { 0x01, 0xe8, 0xc8 }, { 0x01, 0xe9, 0xc9 }, { 0x01, 0xea, 0xca }, { 0x01, 0xeb, 0xcb }, { 0x01, 0xec, 0xcc }, { 0x01, 0xed, 0xcd }, { 0x01, 0xee, 0xce }, { 0x01, 0xef, 0xcf }, { 0x01, 0xf0, 0xd0 }, { 0x01, 0xf1, 0xd1 }, { 0x00, 0xd2, 0xd2 }, { 0x01, 0xf3, 0xd3 }, { 0x01, 0xf4, 0xd4 }, { 0x01, 0xf5, 0xd5 }, { 0x01, 0xf6, 0xd6 }, { 0x01, 0xf7, 0xd7 }, { 0x01, 0xf8, 0xd8 }, { 0x01, 0xf9, 0xd9 }, { 0x01, 0xfa, 0xda }, { 0x01, 0xfb, 0xdb }, { 0x00, 0xdc, 0xb6 }, { 0x00, 0xdd, 0xb8 }, { 0x00, 0xde, 0xb9 }, { 0x00, 0xdf, 0xba }, { 0x00, 0xe0, 0xe0 }, { 0x00, 0xe1, 0xc1 }, { 0x00, 0xe2, 0xc2 }, { 0x00, 0xe3, 0xc3 }, { 0x00, 0xe4, 0xc4 }, { 0x00, 0xe5, 0xc5 }, { 0x00, 0xe6, 0xc6 }, { 0x00, 0xe7, 0xc7 }, { 0x00, 0xe8, 0xc8 }, { 0x00, 0xe9, 0xc9 }, { 0x00, 0xea, 0xca }, { 0x00, 0xeb, 0xcb }, { 0x00, 0xec, 0xcc }, { 0x00, 0xed, 0xcd }, { 0x00, 0xee, 0xce }, { 0x00, 0xef, 0xcf }, { 0x00, 0xf0, 0xd0 }, { 0x00, 0xf1, 0xd1 }, { 0x00, 0xf2, 0xd3 }, { 0x00, 0xf3, 0xd3 }, { 0x00, 0xf4, 0xd4 }, { 0x00, 0xf5, 0xd5 }, { 0x00, 0xf6, 0xd6 }, { 0x00, 0xf7, 0xd7 }, { 0x00, 0xf8, 0xd8 }, { 0x00, 0xf9, 0xd9 }, { 0x00, 0xfa, 0xda }, { 0x00, 0xfb, 0xdb }, { 0x00, 0xfc, 0xbc }, { 0x00, 0xfd, 0xbe }, { 0x00, 0xfe, 0xbf }, { 0x00, 0xff, 0xff } }; struct cs_info iso8_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x00, 0xa3, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x00, 0xa5, 0xa5 }, { 0x00, 0xa6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa8 }, { 0x00, 0xa9, 0xa9 }, { 0x00, 0xaa, 0xaa }, { 0x00, 0xab, 0xab }, { 0x00, 0xac, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x00, 0xaf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xb1 }, { 0x00, 0xb2, 0xb2 }, { 0x00, 0xb3, 0xb3 }, { 0x00, 0xb4, 0xb4 }, { 0x00, 0xb5, 0xb5 }, { 0x00, 0xb6, 0xb6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xb8 }, { 0x00, 0xb9, 0xb9 }, { 0x00, 0xba, 0xba }, { 0x00, 0xbb, 0xbb }, { 0x00, 0xbc, 0xbc }, { 0x00, 0xbd, 0xbd }, { 0x00, 0xbe, 0xbe }, { 0x00, 0xbf, 0xbf }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc1, 0xc1 }, { 0x00, 0xc2, 0xc2 }, { 0x00, 0xc3, 0xc3 }, { 0x00, 0xc4, 0xc4 }, { 0x00, 0xc5, 0xc5 }, { 0x00, 0xc6, 0xc6 }, { 0x00, 0xc7, 0xc7 }, { 0x00, 0xc8, 0xc8 }, { 0x00, 0xc9, 0xc9 }, { 0x00, 0xca, 0xca }, { 0x00, 0xcb, 0xcb }, { 0x00, 0xcc, 0xcc }, { 0x00, 0xcd, 0xcd }, { 0x00, 0xce, 0xce }, { 0x00, 0xcf, 0xcf }, { 0x00, 0xd0, 0xd0 }, { 0x00, 0xd1, 0xd1 }, { 0x00, 0xd2, 0xd2 }, { 0x00, 0xd3, 0xd3 }, { 0x00, 0xd4, 0xd4 }, { 0x00, 0xd5, 0xd5 }, { 0x00, 0xd6, 0xd6 }, { 0x00, 0xd7, 0xd7 }, { 0x00, 0xd8, 0xd8 }, { 0x00, 0xd9, 0xd9 }, { 0x00, 0xda, 0xda }, { 0x00, 0xdb, 0xdb }, { 0x00, 0xdc, 0xdc }, { 0x00, 0xdd, 0xdd }, { 0x00, 0xde, 0xde }, { 0x00, 0xdf, 0xdf }, { 0x00, 0xe0, 0xe0 }, { 0x00, 0xe1, 0xe1 }, { 0x00, 0xe2, 0xe2 }, { 0x00, 0xe3, 0xe3 }, { 0x00, 0xe4, 0xe4 }, { 0x00, 0xe5, 0xe5 }, { 0x00, 0xe6, 0xe6 }, { 0x00, 0xe7, 0xe7 }, { 0x00, 0xe8, 0xe8 }, { 0x00, 0xe9, 0xe9 }, { 0x00, 0xea, 0xea }, { 0x00, 0xeb, 0xeb }, { 0x00, 0xec, 0xec }, { 0x00, 0xed, 0xed }, { 0x00, 0xee, 0xee }, { 0x00, 0xef, 0xef }, { 0x00, 0xf0, 0xf0 }, { 0x00, 0xf1, 0xf1 }, { 0x00, 0xf2, 0xf2 }, { 0x00, 0xf3, 0xf3 }, { 0x00, 0xf4, 0xf4 }, { 0x00, 0xf5, 0xf5 }, { 0x00, 0xf6, 0xf6 }, { 0x00, 0xf7, 0xf7 }, { 0x00, 0xf8, 0xf8 }, { 0x00, 0xf9, 0xf9 }, { 0x00, 0xfa, 0xfa }, { 0x00, 0xfb, 0xfb }, { 0x00, 0xfc, 0xfc }, { 0x00, 0xfd, 0xfd }, { 0x00, 0xfe, 0xfe }, { 0x00, 0xff, 0xff } }; struct cs_info iso9_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0xfd, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0xdd }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x00, 0xa3, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x00, 0xa5, 0xa5 }, { 0x00, 0xa6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa8 }, { 0x00, 0xa9, 0xa9 }, { 0x00, 0xaa, 0xaa }, { 0x00, 0xab, 0xab }, { 0x00, 0xac, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x00, 0xaf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xb1 }, { 0x00, 0xb2, 0xb2 }, { 0x00, 0xb3, 0xb3 }, { 0x00, 0xb4, 0xb4 }, { 0x00, 0xb5, 0xb5 }, { 0x00, 0xb6, 0xb6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xb8 }, { 0x00, 0xb9, 0xb9 }, { 0x00, 0xba, 0xba }, { 0x00, 0xbb, 0xbb }, { 0x00, 0xbc, 0xbc }, { 0x00, 0xbd, 0xbd }, { 0x00, 0xbe, 0xbe }, { 0x00, 0xbf, 0xbf }, { 0x01, 0xe0, 0xc0 }, { 0x01, 0xe1, 0xc1 }, { 0x01, 0xe2, 0xc2 }, { 0x01, 0xe3, 0xc3 }, { 0x01, 0xe4, 0xc4 }, { 0x01, 0xe5, 0xc5 }, { 0x01, 0xe6, 0xc6 }, { 0x01, 0xe7, 0xc7 }, { 0x01, 0xe8, 0xc8 }, { 0x01, 0xe9, 0xc9 }, { 0x01, 0xea, 0xca }, { 0x01, 0xeb, 0xcb }, { 0x01, 0xec, 0xcc }, { 0x01, 0xed, 0xcd }, { 0x01, 0xee, 0xce }, { 0x01, 0xef, 0xcf }, { 0x01, 0xf0, 0xd0 }, { 0x01, 0xf1, 0xd1 }, { 0x01, 0xf2, 0xd2 }, { 0x01, 0xf3, 0xd3 }, { 0x01, 0xf4, 0xd4 }, { 0x01, 0xf5, 0xd5 }, { 0x01, 0xf6, 0xd6 }, { 0x00, 0xd7, 0xd7 }, { 0x01, 0xf8, 0xd8 }, { 0x01, 0xf9, 0xd9 }, { 0x01, 0xfa, 0xda }, { 0x01, 0xfb, 0xdb }, { 0x01, 0xfc, 0xdc }, { 0x01, 0x69, 0xdd }, { 0x01, 0xfe, 0xde }, { 0x00, 0xdf, 0xdf }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe1, 0xc1 }, { 0x00, 0xe2, 0xc2 }, { 0x00, 0xe3, 0xc3 }, { 0x00, 0xe4, 0xc4 }, { 0x00, 0xe5, 0xc5 }, { 0x00, 0xe6, 0xc6 }, { 0x00, 0xe7, 0xc7 }, { 0x00, 0xe8, 0xc8 }, { 0x00, 0xe9, 0xc9 }, { 0x00, 0xea, 0xca }, { 0x00, 0xeb, 0xcb }, { 0x00, 0xec, 0xcc }, { 0x00, 0xed, 0xcd }, { 0x00, 0xee, 0xce }, { 0x00, 0xef, 0xcf }, { 0x00, 0xf0, 0xd0 }, { 0x00, 0xf1, 0xd1 }, { 0x00, 0xf2, 0xd2 }, { 0x00, 0xf3, 0xd3 }, { 0x00, 0xf4, 0xd4 }, { 0x00, 0xf5, 0xd5 }, { 0x00, 0xf6, 0xd6 }, { 0x00, 0xf7, 0xf7 }, { 0x00, 0xf8, 0xd8 }, { 0x00, 0xf9, 0xd9 }, { 0x00, 0xfa, 0xda }, { 0x00, 0xfb, 0xdb }, { 0x00, 0xfc, 0xdc }, { 0x00, 0xfd, 0x49 }, { 0x00, 0xfe, 0xde }, { 0x00, 0xff, 0xff } }; struct cs_info iso10_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x00, 0xa3, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x00, 0xa5, 0xa5 }, { 0x00, 0xa6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa8 }, { 0x00, 0xa9, 0xa9 }, { 0x00, 0xaa, 0xaa }, { 0x00, 0xab, 0xab }, { 0x00, 0xac, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x00, 0xaf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xb1 }, { 0x00, 0xb2, 0xb2 }, { 0x00, 0xb3, 0xb3 }, { 0x00, 0xb4, 0xb4 }, { 0x00, 0xb5, 0xb5 }, { 0x00, 0xb6, 0xb6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xb8 }, { 0x00, 0xb9, 0xb9 }, { 0x00, 0xba, 0xba }, { 0x00, 0xbb, 0xbb }, { 0x00, 0xbc, 0xbc }, { 0x00, 0xbd, 0xbd }, { 0x00, 0xbe, 0xbe }, { 0x00, 0xbf, 0xbf }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc1, 0xc1 }, { 0x00, 0xc2, 0xc2 }, { 0x00, 0xc3, 0xc3 }, { 0x00, 0xc4, 0xc4 }, { 0x00, 0xc5, 0xc5 }, { 0x00, 0xc6, 0xc6 }, { 0x00, 0xc7, 0xc7 }, { 0x00, 0xc8, 0xc8 }, { 0x00, 0xc9, 0xc9 }, { 0x00, 0xca, 0xca }, { 0x00, 0xcb, 0xcb }, { 0x00, 0xcc, 0xcc }, { 0x00, 0xcd, 0xcd }, { 0x00, 0xce, 0xce }, { 0x00, 0xcf, 0xcf }, { 0x00, 0xd0, 0xd0 }, { 0x00, 0xd1, 0xd1 }, { 0x00, 0xd2, 0xd2 }, { 0x00, 0xd3, 0xd3 }, { 0x00, 0xd4, 0xd4 }, { 0x00, 0xd5, 0xd5 }, { 0x00, 0xd6, 0xd6 }, { 0x00, 0xd7, 0xd7 }, { 0x00, 0xd8, 0xd8 }, { 0x00, 0xd9, 0xd9 }, { 0x00, 0xda, 0xda }, { 0x00, 0xdb, 0xdb }, { 0x00, 0xdc, 0xdc }, { 0x00, 0xdd, 0xdd }, { 0x00, 0xde, 0xde }, { 0x00, 0xdf, 0xdf }, { 0x00, 0xe0, 0xe0 }, { 0x00, 0xe1, 0xe1 }, { 0x00, 0xe2, 0xe2 }, { 0x00, 0xe3, 0xe3 }, { 0x00, 0xe4, 0xe4 }, { 0x00, 0xe5, 0xe5 }, { 0x00, 0xe6, 0xe6 }, { 0x00, 0xe7, 0xe7 }, { 0x00, 0xe8, 0xe8 }, { 0x00, 0xe9, 0xe9 }, { 0x00, 0xea, 0xea }, { 0x00, 0xeb, 0xeb }, { 0x00, 0xec, 0xec }, { 0x00, 0xed, 0xed }, { 0x00, 0xee, 0xee }, { 0x00, 0xef, 0xef }, { 0x00, 0xf0, 0xf0 }, { 0x00, 0xf1, 0xf1 }, { 0x00, 0xf2, 0xf2 }, { 0x00, 0xf3, 0xf3 }, { 0x00, 0xf4, 0xf4 }, { 0x00, 0xf5, 0xf5 }, { 0x00, 0xf6, 0xf6 }, { 0x00, 0xf7, 0xf7 }, { 0x00, 0xf8, 0xf8 }, { 0x00, 0xf9, 0xf9 }, { 0x00, 0xfa, 0xfa }, { 0x00, 0xfb, 0xfb }, { 0x00, 0xfc, 0xfc }, { 0x00, 0xfd, 0xfd }, { 0x00, 0xfe, 0xfe }, { 0x00, 0xff, 0xff } }; struct cs_info koi8r_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x00, 0xa3, 0xb3 }, { 0x00, 0xa4, 0xa4 }, { 0x00, 0xa5, 0xa5 }, { 0x00, 0xa6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa8 }, { 0x00, 0xa9, 0xa9 }, { 0x00, 0xaa, 0xaa }, { 0x00, 0xab, 0xab }, { 0x00, 0xac, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x00, 0xaf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xb1 }, { 0x00, 0xb2, 0xb2 }, { 0x01, 0xa3, 0xb3 }, { 0x00, 0xb4, 0xb4 }, { 0x00, 0xb5, 0xb5 }, { 0x00, 0xb6, 0xb6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xb8 }, { 0x00, 0xb9, 0xb9 }, { 0x00, 0xba, 0xba }, { 0x00, 0xbb, 0xbb }, { 0x00, 0xbc, 0xbc }, { 0x00, 0xbd, 0xbd }, { 0x00, 0xbe, 0xbe }, { 0x00, 0xbf, 0xbf }, { 0x00, 0xc0, 0xe0 }, { 0x00, 0xc1, 0xe1 }, { 0x00, 0xc2, 0xe2 }, { 0x00, 0xc3, 0xe3 }, { 0x00, 0xc4, 0xe4 }, { 0x00, 0xc5, 0xe5 }, { 0x00, 0xc6, 0xe6 }, { 0x00, 0xc7, 0xe7 }, { 0x00, 0xc8, 0xe8 }, { 0x00, 0xc9, 0xe9 }, { 0x00, 0xca, 0xea }, { 0x00, 0xcb, 0xeb }, { 0x00, 0xcc, 0xec }, { 0x00, 0xcd, 0xed }, { 0x00, 0xce, 0xee }, { 0x00, 0xcf, 0xef }, { 0x00, 0xd0, 0xf0 }, { 0x00, 0xd1, 0xf1 }, { 0x00, 0xd2, 0xf2 }, { 0x00, 0xd3, 0xf3 }, { 0x00, 0xd4, 0xf4 }, { 0x00, 0xd5, 0xf5 }, { 0x00, 0xd6, 0xf6 }, { 0x00, 0xd7, 0xf7 }, { 0x00, 0xd8, 0xf8 }, { 0x00, 0xd9, 0xf9 }, { 0x00, 0xda, 0xfa }, { 0x00, 0xdb, 0xfb }, { 0x00, 0xdc, 0xfc }, { 0x00, 0xdd, 0xfd }, { 0x00, 0xde, 0xfe }, { 0x00, 0xdf, 0xff }, { 0x01, 0xc0, 0xe0 }, { 0x01, 0xc1, 0xe1 }, { 0x01, 0xc2, 0xe2 }, { 0x01, 0xc3, 0xe3 }, { 0x01, 0xc4, 0xe4 }, { 0x01, 0xc5, 0xe5 }, { 0x01, 0xc6, 0xe6 }, { 0x01, 0xc7, 0xe7 }, { 0x01, 0xc8, 0xe8 }, { 0x01, 0xc9, 0xe9 }, { 0x01, 0xca, 0xea }, { 0x01, 0xcb, 0xeb }, { 0x01, 0xcc, 0xec }, { 0x01, 0xcd, 0xed }, { 0x01, 0xce, 0xee }, { 0x01, 0xcf, 0xef }, { 0x01, 0xd0, 0xf0 }, { 0x01, 0xd1, 0xf1 }, { 0x01, 0xd2, 0xf2 }, { 0x01, 0xd3, 0xf3 }, { 0x01, 0xd4, 0xf4 }, { 0x01, 0xd5, 0xf5 }, { 0x01, 0xd6, 0xf6 }, { 0x01, 0xd7, 0xf7 }, { 0x01, 0xd8, 0xf8 }, { 0x01, 0xd9, 0xf9 }, { 0x01, 0xda, 0xfa }, { 0x01, 0xdb, 0xfb }, { 0x01, 0xdc, 0xfc }, { 0x01, 0xdd, 0xfd }, { 0x01, 0xde, 0xfe }, { 0x01, 0xdf, 0xff } }; struct cs_info koi8u_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x00, 0xa3, 0xb3 }, { 0x00, 0xa4, 0xb4 }, /* ie */ { 0x00, 0xa5, 0xa5 }, { 0x00, 0xa6, 0xb6 }, /* i */ { 0x00, 0xa7, 0xb7 }, /* ii */ { 0x00, 0xa8, 0xa8 }, { 0x00, 0xa9, 0xa9 }, { 0x00, 0xaa, 0xaa }, { 0x00, 0xab, 0xab }, { 0x00, 0xac, 0xac }, { 0x00, 0xad, 0xbd }, /* g'' */ { 0x00, 0xae, 0xae }, { 0x00, 0xaf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xb1 }, { 0x00, 0xb2, 0xb2 }, { 0x01, 0xa3, 0xb3 }, { 0x00, 0xb4, 0xb4 }, /* IE */ { 0x00, 0xb5, 0xb5 }, { 0x00, 0xb6, 0xb6 }, /* I */ { 0x00, 0xb7, 0xb7 }, /* II */ { 0x00, 0xb8, 0xb8 }, { 0x00, 0xb9, 0xb9 }, { 0x00, 0xba, 0xba }, { 0x00, 0xbb, 0xbb }, { 0x00, 0xbc, 0xbc }, { 0x00, 0xbd, 0xbd }, { 0x00, 0xbe, 0xbe }, { 0x00, 0xbf, 0xbf }, { 0x00, 0xc0, 0xe0 }, { 0x00, 0xc1, 0xe1 }, { 0x00, 0xc2, 0xe2 }, { 0x00, 0xc3, 0xe3 }, { 0x00, 0xc4, 0xe4 }, { 0x00, 0xc5, 0xe5 }, { 0x00, 0xc6, 0xe6 }, { 0x00, 0xc7, 0xe7 }, { 0x00, 0xc8, 0xe8 }, { 0x00, 0xc9, 0xe9 }, { 0x00, 0xca, 0xea }, { 0x00, 0xcb, 0xeb }, { 0x00, 0xcc, 0xec }, { 0x00, 0xcd, 0xed }, { 0x00, 0xce, 0xee }, { 0x00, 0xcf, 0xef }, { 0x00, 0xd0, 0xf0 }, { 0x00, 0xd1, 0xf1 }, { 0x00, 0xd2, 0xf2 }, { 0x00, 0xd3, 0xf3 }, { 0x00, 0xd4, 0xf4 }, { 0x00, 0xd5, 0xf5 }, { 0x00, 0xd6, 0xf6 }, { 0x00, 0xd7, 0xf7 }, { 0x00, 0xd8, 0xf8 }, { 0x00, 0xd9, 0xf9 }, { 0x00, 0xda, 0xfa }, { 0x00, 0xdb, 0xfb }, { 0x00, 0xdc, 0xfc }, { 0x00, 0xdd, 0xfd }, { 0x00, 0xde, 0xfe }, { 0x00, 0xdf, 0xff }, { 0x01, 0xc0, 0xe0 }, { 0x01, 0xc1, 0xe1 }, { 0x01, 0xc2, 0xe2 }, { 0x01, 0xc3, 0xe3 }, { 0x01, 0xc4, 0xe4 }, { 0x01, 0xc5, 0xe5 }, { 0x01, 0xc6, 0xe6 }, { 0x01, 0xc7, 0xe7 }, { 0x01, 0xc8, 0xe8 }, { 0x01, 0xc9, 0xe9 }, { 0x01, 0xca, 0xea }, { 0x01, 0xcb, 0xeb }, { 0x01, 0xcc, 0xec }, { 0x01, 0xcd, 0xed }, { 0x01, 0xce, 0xee }, { 0x01, 0xcf, 0xef }, { 0x01, 0xd0, 0xf0 }, { 0x01, 0xd1, 0xf1 }, { 0x01, 0xd2, 0xf2 }, { 0x01, 0xd3, 0xf3 }, { 0x01, 0xd4, 0xf4 }, { 0x01, 0xd5, 0xf5 }, { 0x01, 0xd6, 0xf6 }, { 0x01, 0xd7, 0xf7 }, { 0x01, 0xd8, 0xf8 }, { 0x01, 0xd9, 0xf9 }, { 0x01, 0xda, 0xfa }, { 0x01, 0xdb, 0xfb }, { 0x01, 0xdc, 0xfc }, { 0x01, 0xdd, 0xfd }, { 0x01, 0xde, 0xfe }, { 0x01, 0xdf, 0xff } }; struct cs_info cp1251_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x01, 0x90, 0x80 }, { 0x01, 0x83, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x81 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x01, 0x9a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x01, 0x9c, 0x8c }, { 0x01, 0x9d, 0x8d }, { 0x01, 0x9e, 0x8e }, { 0x01, 0x9f, 0x8f }, { 0x00, 0x90, 0x80 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x8a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x8c }, { 0x00, 0x9d, 0x8d }, { 0x00, 0x9e, 0x8e }, { 0x00, 0x9f, 0x8f }, { 0x00, 0xa0, 0xa0 }, { 0x01, 0xa2, 0xa1 }, { 0x00, 0xa2, 0xa1 }, { 0x01, 0xbc, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x01, 0xb4, 0xa5 }, { 0x00, 0xa6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x01, 0xb8, 0xa8 }, { 0x00, 0xa9, 0xa9 }, { 0x01, 0xba, 0xaa }, { 0x00, 0xab, 0xab }, { 0x00, 0xac, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x01, 0xbf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xb1 }, { 0x01, 0xb3, 0xb2 }, { 0x00, 0xb3, 0xb2 }, { 0x00, 0xb4, 0xa5 }, { 0x00, 0xb5, 0xb5 }, { 0x00, 0xb6, 0xb6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xa8 }, { 0x00, 0xb9, 0xb9 }, { 0x00, 0xba, 0xaa }, { 0x00, 0xbb, 0xbb }, { 0x00, 0xbc, 0xa3 }, { 0x01, 0xbe, 0xbd }, { 0x00, 0xbe, 0xbd }, { 0x00, 0xbf, 0xaf }, { 0x01, 0xe0, 0xc0 }, { 0x01, 0xe1, 0xc1 }, { 0x01, 0xe2, 0xc2 }, { 0x01, 0xe3, 0xc3 }, { 0x01, 0xe4, 0xc4 }, { 0x01, 0xe5, 0xc5 }, { 0x01, 0xe6, 0xc6 }, { 0x01, 0xe7, 0xc7 }, { 0x01, 0xe8, 0xc8 }, { 0x01, 0xe9, 0xc9 }, { 0x01, 0xea, 0xca }, { 0x01, 0xeb, 0xcb }, { 0x01, 0xec, 0xcc }, { 0x01, 0xed, 0xcd }, { 0x01, 0xee, 0xce }, { 0x01, 0xef, 0xcf }, { 0x01, 0xf0, 0xd0 }, { 0x01, 0xf1, 0xd1 }, { 0x01, 0xf2, 0xd2 }, { 0x01, 0xf3, 0xd3 }, { 0x01, 0xf4, 0xd4 }, { 0x01, 0xf5, 0xd5 }, { 0x01, 0xf6, 0xd6 }, { 0x01, 0xf7, 0xd7 }, { 0x01, 0xf8, 0xd8 }, { 0x01, 0xf9, 0xd9 }, { 0x01, 0xfa, 0xda }, { 0x01, 0xfb, 0xdb }, { 0x01, 0xfc, 0xdc }, { 0x01, 0xfd, 0xdd }, { 0x01, 0xfe, 0xde }, { 0x01, 0xff, 0xdf }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe1, 0xc1 }, { 0x00, 0xe2, 0xc2 }, { 0x00, 0xe3, 0xc3 }, { 0x00, 0xe4, 0xc4 }, { 0x00, 0xe5, 0xc5 }, { 0x00, 0xe6, 0xc6 }, { 0x00, 0xe7, 0xc7 }, { 0x00, 0xe8, 0xc8 }, { 0x00, 0xe9, 0xc9 }, { 0x00, 0xea, 0xca }, { 0x00, 0xeb, 0xcb }, { 0x00, 0xec, 0xcc }, { 0x00, 0xed, 0xcd }, { 0x00, 0xee, 0xce }, { 0x00, 0xef, 0xcf }, { 0x00, 0xf0, 0xd0 }, { 0x00, 0xf1, 0xd1 }, { 0x00, 0xf2, 0xd2 }, { 0x00, 0xf3, 0xd3 }, { 0x00, 0xf4, 0xd4 }, { 0x00, 0xf5, 0xd5 }, { 0x00, 0xf6, 0xd6 }, { 0x00, 0xf7, 0xd7 }, { 0x00, 0xf8, 0xd8 }, { 0x00, 0xf9, 0xd9 }, { 0x00, 0xfa, 0xda }, { 0x00, 0xfb, 0xdb }, { 0x00, 0xfc, 0xdc }, { 0x00, 0xfd, 0xdd }, { 0x00, 0xfe, 0xde }, { 0x00, 0xff, 0xdf } }; struct cs_info iso13_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0A, 0x0A }, { 0x00, 0x0B, 0x0B }, { 0x00, 0x0C, 0x0C }, { 0x00, 0x0D, 0x0D }, { 0x00, 0x0E, 0x0E }, { 0x00, 0x0F, 0x0F }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1A, 0x1A }, { 0x00, 0x1B, 0x1B }, { 0x00, 0x1C, 0x1C }, { 0x00, 0x1D, 0x1D }, { 0x00, 0x1E, 0x1E }, { 0x00, 0x1F, 0x1F }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2A, 0x2A }, { 0x00, 0x2B, 0x2B }, { 0x00, 0x2C, 0x2C }, { 0x00, 0x2D, 0x2D }, { 0x00, 0x2E, 0x2E }, { 0x00, 0x2F, 0x2F }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3A, 0x3A }, { 0x00, 0x3B, 0x3B }, { 0x00, 0x3C, 0x3C }, { 0x00, 0x3D, 0x3D }, { 0x00, 0x3E, 0x3E }, { 0x00, 0x3F, 0x3F }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6A, 0x4A }, { 0x01, 0x6B, 0x4B }, { 0x01, 0x6C, 0x4C }, { 0x01, 0x6D, 0x4D }, { 0x01, 0x6E, 0x4E }, { 0x01, 0x6F, 0x4F }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7A, 0x5A }, { 0x00, 0x5B, 0x5B }, { 0x00, 0x5C, 0x5C }, { 0x00, 0x5D, 0x5D }, { 0x00, 0x5E, 0x5E }, { 0x00, 0x5F, 0x5F }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6A, 0x4A }, { 0x00, 0x6B, 0x4B }, { 0x00, 0x6C, 0x4C }, { 0x00, 0x6D, 0x4D }, { 0x00, 0x6E, 0x4E }, { 0x00, 0x6F, 0x4F }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7A, 0x5A }, { 0x00, 0x7B, 0x7B }, { 0x00, 0x7C, 0x7C }, { 0x00, 0x7D, 0x7D }, { 0x00, 0x7E, 0x7E }, { 0x00, 0x7F, 0x7F }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8A, 0x8A }, { 0x00, 0x8B, 0x8B }, { 0x00, 0x8C, 0x8C }, { 0x00, 0x8D, 0x8D }, { 0x00, 0x8E, 0x8E }, { 0x00, 0x8F, 0x8F }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9A, 0x9A }, { 0x00, 0x9B, 0x9B }, { 0x00, 0x9C, 0x9C }, { 0x00, 0x9D, 0x9D }, { 0x00, 0x9E, 0x9E }, { 0x00, 0x9F, 0x9F }, { 0x00, 0xA0, 0xA0 }, { 0x00, 0xA1, 0xA1 }, { 0x00, 0xA2, 0xA2 }, { 0x00, 0xA3, 0xA3 }, { 0x00, 0xA4, 0xA4 }, { 0x00, 0xA5, 0xA5 }, { 0x00, 0xA6, 0xA6 }, { 0x00, 0xA7, 0xA7 }, { 0x01, 0xB8, 0xA8 }, { 0x00, 0xA9, 0xA9 }, { 0x01, 0xBA, 0xAA }, { 0x00, 0xAB, 0xAB }, { 0x00, 0xAC, 0xAC }, { 0x00, 0xAD, 0xAD }, { 0x00, 0xAE, 0xAE }, { 0x01, 0xBF, 0xAF }, { 0x00, 0xB0, 0xB0 }, { 0x00, 0xB1, 0xB1 }, { 0x00, 0xB2, 0xB2 }, { 0x00, 0xB3, 0xB3 }, { 0x00, 0xB4, 0xB4 }, { 0x00, 0xB5, 0xB5 }, { 0x00, 0xB6, 0xB6 }, { 0x00, 0xB7, 0xB7 }, { 0x00, 0xB8, 0xA8 }, { 0x00, 0xB9, 0xB9 }, { 0x00, 0xBA, 0xAA }, { 0x00, 0xBB, 0xBB }, { 0x00, 0xBC, 0xBC }, { 0x00, 0xBD, 0xBD }, { 0x00, 0xBE, 0xBE }, { 0x00, 0xBF, 0xAF }, { 0x01, 0xE0, 0xC0 }, { 0x01, 0xE1, 0xC1 }, { 0x01, 0xE2, 0xC2 }, { 0x01, 0xE3, 0xC3 }, { 0x01, 0xE4, 0xC4 }, { 0x01, 0xE5, 0xC5 }, { 0x01, 0xE6, 0xC6 }, { 0x01, 0xE7, 0xC7 }, { 0x01, 0xE8, 0xC8 }, { 0x01, 0xE9, 0xC9 }, { 0x01, 0xEA, 0xCA }, { 0x01, 0xEB, 0xCB }, { 0x01, 0xEC, 0xCC }, { 0x01, 0xED, 0xCD }, { 0x01, 0xEE, 0xCE }, { 0x01, 0xEF, 0xCF }, { 0x01, 0xF0, 0xD0 }, { 0x01, 0xF1, 0xD1 }, { 0x01, 0xF2, 0xD2 }, { 0x01, 0xF3, 0xD3 }, { 0x01, 0xF4, 0xD4 }, { 0x01, 0xF5, 0xD5 }, { 0x01, 0xF6, 0xD6 }, { 0x00, 0xD7, 0xD7 }, { 0x01, 0xF8, 0xD8 }, { 0x01, 0xF9, 0xD9 }, { 0x01, 0xFA, 0xDA }, { 0x01, 0xFB, 0xDB }, { 0x01, 0xFC, 0xDC }, { 0x01, 0xFD, 0xDD }, { 0x01, 0xFE, 0xDE }, { 0x00, 0xDF, 0xDF }, { 0x00, 0xE0, 0xC0 }, { 0x00, 0xE1, 0xC1 }, { 0x00, 0xE2, 0xC2 }, { 0x00, 0xE3, 0xC3 }, { 0x00, 0xE4, 0xC4 }, { 0x00, 0xE5, 0xC5 }, { 0x00, 0xE6, 0xC6 }, { 0x00, 0xE7, 0xC7 }, { 0x00, 0xE8, 0xC8 }, { 0x00, 0xE9, 0xC9 }, { 0x00, 0xEA, 0xCA }, { 0x00, 0xEB, 0xCB }, { 0x00, 0xEC, 0xCC }, { 0x00, 0xED, 0xCD }, { 0x00, 0xEE, 0xCE }, { 0x00, 0xEF, 0xCF }, { 0x00, 0xF0, 0xD0 }, { 0x00, 0xF1, 0xD1 }, { 0x00, 0xF2, 0xD2 }, { 0x00, 0xF3, 0xD3 }, { 0x00, 0xF4, 0xD4 }, { 0x00, 0xF5, 0xD5 }, { 0x00, 0xF6, 0xD6 }, { 0x00, 0xF7, 0xF7 }, { 0x00, 0xF8, 0xD8 }, { 0x00, 0xF9, 0xD9 }, { 0x00, 0xFA, 0xDA }, { 0x00, 0xFB, 0xDB }, { 0x00, 0xFC, 0xDC }, { 0x00, 0xFD, 0xDD }, { 0x00, 0xFE, 0xDE }, { 0x00, 0xFF, 0xFF } }; struct cs_info iso14_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x01, 0xa2, 0xa1 }, { 0x00, 0xa2, 0xa1 }, { 0x00, 0xa3, 0xa3 }, { 0x01, 0xa5, 0xa4 }, { 0x00, 0xa5, 0xa4 }, { 0x01, 0xa6, 0xab }, { 0x00, 0xa7, 0xa7 }, { 0x01, 0xb8, 0xa8 }, { 0x00, 0xa9, 0xa9 }, { 0x01, 0xba, 0xaa }, { 0x00, 0xab, 0xa6 }, { 0x01, 0xbc, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x01, 0xff, 0xaf }, { 0x01, 0xb1, 0xb0 }, { 0x00, 0xb1, 0xb0 }, { 0x01, 0xb3, 0xb2 }, { 0x00, 0xb3, 0xb2 }, { 0x01, 0xb5, 0xb4 }, { 0x00, 0xb5, 0xb4 }, { 0x00, 0xb6, 0xb6 }, { 0x01, 0xb9, 0xb7 }, { 0x00, 0xb8, 0xa8 }, { 0x00, 0xb9, 0xb6 }, { 0x00, 0xba, 0xaa }, { 0x01, 0xbf, 0xbb }, { 0x00, 0xbc, 0xac }, { 0x01, 0xbe, 0xbd }, { 0x00, 0xbe, 0xbd }, { 0x00, 0xbf, 0xbb }, { 0x01, 0xe0, 0xc0 }, { 0x01, 0xe1, 0xc1 }, { 0x01, 0xe2, 0xc2 }, { 0x01, 0xe3, 0xc3 }, { 0x01, 0xe4, 0xc4 }, { 0x01, 0xe5, 0xc5 }, { 0x01, 0xe6, 0xc6 }, { 0x01, 0xe7, 0xc7 }, { 0x01, 0xe8, 0xc8 }, { 0x01, 0xe9, 0xc9 }, { 0x01, 0xea, 0xca }, { 0x01, 0xeb, 0xcb }, { 0x01, 0xec, 0xcc }, { 0x01, 0xed, 0xcd }, { 0x01, 0xee, 0xce }, { 0x01, 0xef, 0xcf }, { 0x01, 0xf0, 0xd0 }, { 0x01, 0xf1, 0xd1 }, { 0x01, 0xf2, 0xd2 }, { 0x01, 0xf3, 0xd3 }, { 0x01, 0xf4, 0xd4 }, { 0x01, 0xf5, 0xd5 }, { 0x01, 0xf6, 0xd6 }, { 0x01, 0xf7, 0xd7 }, { 0x01, 0xf8, 0xd8 }, { 0x01, 0xf9, 0xd9 }, { 0x01, 0xfa, 0xda }, { 0x01, 0xfb, 0xdb }, { 0x01, 0xfc, 0xdc }, { 0x01, 0xfd, 0xdd }, { 0x01, 0xfe, 0xde }, { 0x00, 0xdf, 0xdf }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe1, 0xc1 }, { 0x00, 0xe2, 0xc2 }, { 0x00, 0xe3, 0xc3 }, { 0x00, 0xe4, 0xc4 }, { 0x00, 0xe5, 0xc5 }, { 0x00, 0xe6, 0xc6 }, { 0x00, 0xe7, 0xc7 }, { 0x00, 0xe8, 0xc8 }, { 0x00, 0xe9, 0xc9 }, { 0x00, 0xea, 0xca }, { 0x00, 0xeb, 0xcb }, { 0x00, 0xec, 0xcc }, { 0x00, 0xed, 0xcd }, { 0x00, 0xee, 0xce }, { 0x00, 0xef, 0xcf }, { 0x00, 0xf0, 0xd0 }, { 0x00, 0xf1, 0xd1 }, { 0x00, 0xf2, 0xd2 }, { 0x00, 0xf3, 0xd3 }, { 0x00, 0xf4, 0xd4 }, { 0x00, 0xf5, 0xd5 }, { 0x00, 0xf6, 0xd6 }, { 0x00, 0xf7, 0xd7 }, { 0x00, 0xf8, 0xd8 }, { 0x00, 0xf9, 0xd9 }, { 0x00, 0xfa, 0xda }, { 0x00, 0xfb, 0xdb }, { 0x00, 0xfc, 0xdc }, { 0x00, 0xfd, 0xdd }, { 0x00, 0xfe, 0xde }, { 0x00, 0xff, 0xff } }; struct cs_info iso15_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x00, 0xa3, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x00, 0xa5, 0xa5 }, { 0x01, 0xa8, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa6 }, { 0x00, 0xa9, 0xa9 }, { 0x00, 0xaa, 0xaa }, { 0x00, 0xab, 0xab }, { 0x00, 0xac, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x00, 0xaf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xb1 }, { 0x00, 0xb2, 0xb2 }, { 0x00, 0xb3, 0xb3 }, { 0x01, 0xb8, 0xb4 }, { 0x00, 0xb5, 0xb5 }, { 0x00, 0xb6, 0xb6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xb4 }, { 0x00, 0xb9, 0xb9 }, { 0x00, 0xba, 0xba }, { 0x00, 0xbb, 0xbb }, { 0x01, 0xbd, 0xbc }, { 0x00, 0xbd, 0xbc }, { 0x01, 0xff, 0xbe }, { 0x00, 0xbf, 0xbf }, { 0x01, 0xe0, 0xc0 }, { 0x01, 0xe1, 0xc1 }, { 0x01, 0xe2, 0xc2 }, { 0x01, 0xe3, 0xc3 }, { 0x01, 0xe4, 0xc4 }, { 0x01, 0xe5, 0xc5 }, { 0x01, 0xe6, 0xc6 }, { 0x01, 0xe7, 0xc7 }, { 0x01, 0xe8, 0xc8 }, { 0x01, 0xe9, 0xc9 }, { 0x01, 0xea, 0xca }, { 0x01, 0xeb, 0xcb }, { 0x01, 0xec, 0xcc }, { 0x01, 0xed, 0xcd }, { 0x01, 0xee, 0xce }, { 0x01, 0xef, 0xcf }, { 0x01, 0xf0, 0xd0 }, { 0x01, 0xf1, 0xd1 }, { 0x01, 0xf2, 0xd2 }, { 0x01, 0xf3, 0xd3 }, { 0x01, 0xf4, 0xd4 }, { 0x01, 0xf5, 0xd5 }, { 0x01, 0xf6, 0xd6 }, { 0x00, 0xd7, 0xd7 }, { 0x01, 0xf8, 0xd8 }, { 0x01, 0xf9, 0xd9 }, { 0x01, 0xfa, 0xda }, { 0x01, 0xfb, 0xdb }, { 0x01, 0xfc, 0xdc }, { 0x01, 0xfd, 0xdd }, { 0x01, 0xfe, 0xde }, { 0x00, 0xdf, 0xdf }, { 0x00, 0xe0, 0xc0 }, { 0x00, 0xe1, 0xc1 }, { 0x00, 0xe2, 0xc2 }, { 0x00, 0xe3, 0xc3 }, { 0x00, 0xe4, 0xc4 }, { 0x00, 0xe5, 0xc5 }, { 0x00, 0xe6, 0xc6 }, { 0x00, 0xe7, 0xc7 }, { 0x00, 0xe8, 0xc8 }, { 0x00, 0xe9, 0xc9 }, { 0x00, 0xea, 0xca }, { 0x00, 0xeb, 0xcb }, { 0x00, 0xec, 0xcc }, { 0x00, 0xed, 0xcd }, { 0x00, 0xee, 0xce }, { 0x00, 0xef, 0xcf }, { 0x00, 0xf0, 0xd0 }, { 0x00, 0xf1, 0xd1 }, { 0x00, 0xf2, 0xd2 }, { 0x00, 0xf3, 0xd3 }, { 0x00, 0xf4, 0xd4 }, { 0x00, 0xf5, 0xd5 }, { 0x00, 0xf6, 0xd6 }, { 0x00, 0xf7, 0xf7 }, { 0x00, 0xf8, 0xd8 }, { 0x00, 0xf9, 0xd9 }, { 0x00, 0xfa, 0xda }, { 0x00, 0xfb, 0xdb }, { 0x00, 0xfc, 0xdc }, { 0x00, 0xfd, 0xdd }, { 0x00, 0xfe, 0xde }, { 0x00, 0xff, 0xbe } }; struct cs_info iscii_devanagari_tbl[] = { { 0x00, 0x00, 0x00 }, { 0x00, 0x01, 0x01 }, { 0x00, 0x02, 0x02 }, { 0x00, 0x03, 0x03 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x05, 0x05 }, { 0x00, 0x06, 0x06 }, { 0x00, 0x07, 0x07 }, { 0x00, 0x08, 0x08 }, { 0x00, 0x09, 0x09 }, { 0x00, 0x0a, 0x0a }, { 0x00, 0x0b, 0x0b }, { 0x00, 0x0c, 0x0c }, { 0x00, 0x0d, 0x0d }, { 0x00, 0x0e, 0x0e }, { 0x00, 0x0f, 0x0f }, { 0x00, 0x10, 0x10 }, { 0x00, 0x11, 0x11 }, { 0x00, 0x12, 0x12 }, { 0x00, 0x13, 0x13 }, { 0x00, 0x14, 0x14 }, { 0x00, 0x15, 0x15 }, { 0x00, 0x16, 0x16 }, { 0x00, 0x17, 0x17 }, { 0x00, 0x18, 0x18 }, { 0x00, 0x19, 0x19 }, { 0x00, 0x1a, 0x1a }, { 0x00, 0x1b, 0x1b }, { 0x00, 0x1c, 0x1c }, { 0x00, 0x1d, 0x1d }, { 0x00, 0x1e, 0x1e }, { 0x00, 0x1f, 0x1f }, { 0x00, 0x20, 0x20 }, { 0x00, 0x21, 0x21 }, { 0x00, 0x22, 0x22 }, { 0x00, 0x23, 0x23 }, { 0x00, 0x24, 0x24 }, { 0x00, 0x25, 0x25 }, { 0x00, 0x26, 0x26 }, { 0x00, 0x27, 0x27 }, { 0x00, 0x28, 0x28 }, { 0x00, 0x29, 0x29 }, { 0x00, 0x2a, 0x2a }, { 0x00, 0x2b, 0x2b }, { 0x00, 0x2c, 0x2c }, { 0x00, 0x2d, 0x2d }, { 0x00, 0x2e, 0x2e }, { 0x00, 0x2f, 0x2f }, { 0x00, 0x30, 0x30 }, { 0x00, 0x31, 0x31 }, { 0x00, 0x32, 0x32 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x34, 0x34 }, { 0x00, 0x35, 0x35 }, { 0x00, 0x36, 0x36 }, { 0x00, 0x37, 0x37 }, { 0x00, 0x38, 0x38 }, { 0x00, 0x39, 0x39 }, { 0x00, 0x3a, 0x3a }, { 0x00, 0x3b, 0x3b }, { 0x00, 0x3c, 0x3c }, { 0x00, 0x3d, 0x3d }, { 0x00, 0x3e, 0x3e }, { 0x00, 0x3f, 0x3f }, { 0x00, 0x40, 0x40 }, { 0x01, 0x61, 0x41 }, { 0x01, 0x62, 0x42 }, { 0x01, 0x63, 0x43 }, { 0x01, 0x64, 0x44 }, { 0x01, 0x65, 0x45 }, { 0x01, 0x66, 0x46 }, { 0x01, 0x67, 0x47 }, { 0x01, 0x68, 0x48 }, { 0x01, 0x69, 0x49 }, { 0x01, 0x6a, 0x4a }, { 0x01, 0x6b, 0x4b }, { 0x01, 0x6c, 0x4c }, { 0x01, 0x6d, 0x4d }, { 0x01, 0x6e, 0x4e }, { 0x01, 0x6f, 0x4f }, { 0x01, 0x70, 0x50 }, { 0x01, 0x71, 0x51 }, { 0x01, 0x72, 0x52 }, { 0x01, 0x73, 0x53 }, { 0x01, 0x74, 0x54 }, { 0x01, 0x75, 0x55 }, { 0x01, 0x76, 0x56 }, { 0x01, 0x77, 0x57 }, { 0x01, 0x78, 0x58 }, { 0x01, 0x79, 0x59 }, { 0x01, 0x7a, 0x5a }, { 0x00, 0x5b, 0x5b }, { 0x00, 0x5c, 0x5c }, { 0x00, 0x5d, 0x5d }, { 0x00, 0x5e, 0x5e }, { 0x00, 0x5f, 0x5f }, { 0x00, 0x60, 0x60 }, { 0x00, 0x61, 0x41 }, { 0x00, 0x62, 0x42 }, { 0x00, 0x63, 0x43 }, { 0x00, 0x64, 0x44 }, { 0x00, 0x65, 0x45 }, { 0x00, 0x66, 0x46 }, { 0x00, 0x67, 0x47 }, { 0x00, 0x68, 0x48 }, { 0x00, 0x69, 0x49 }, { 0x00, 0x6a, 0x4a }, { 0x00, 0x6b, 0x4b }, { 0x00, 0x6c, 0x4c }, { 0x00, 0x6d, 0x4d }, { 0x00, 0x6e, 0x4e }, { 0x00, 0x6f, 0x4f }, { 0x00, 0x70, 0x50 }, { 0x00, 0x71, 0x51 }, { 0x00, 0x72, 0x52 }, { 0x00, 0x73, 0x53 }, { 0x00, 0x74, 0x54 }, { 0x00, 0x75, 0x55 }, { 0x00, 0x76, 0x56 }, { 0x00, 0x77, 0x57 }, { 0x00, 0x78, 0x58 }, { 0x00, 0x79, 0x59 }, { 0x00, 0x7a, 0x5a }, { 0x00, 0x7b, 0x7b }, { 0x00, 0x7c, 0x7c }, { 0x00, 0x7d, 0x7d }, { 0x00, 0x7e, 0x7e }, { 0x00, 0x7f, 0x7f }, { 0x00, 0x80, 0x80 }, { 0x00, 0x81, 0x81 }, { 0x00, 0x82, 0x82 }, { 0x00, 0x83, 0x83 }, { 0x00, 0x84, 0x84 }, { 0x00, 0x85, 0x85 }, { 0x00, 0x86, 0x86 }, { 0x00, 0x87, 0x87 }, { 0x00, 0x88, 0x88 }, { 0x00, 0x89, 0x89 }, { 0x00, 0x8a, 0x8a }, { 0x00, 0x8b, 0x8b }, { 0x00, 0x8c, 0x8c }, { 0x00, 0x8d, 0x8d }, { 0x00, 0x8e, 0x8e }, { 0x00, 0x8f, 0x8f }, { 0x00, 0x90, 0x90 }, { 0x00, 0x91, 0x91 }, { 0x00, 0x92, 0x92 }, { 0x00, 0x93, 0x93 }, { 0x00, 0x94, 0x94 }, { 0x00, 0x95, 0x95 }, { 0x00, 0x96, 0x96 }, { 0x00, 0x97, 0x97 }, { 0x00, 0x98, 0x98 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x9a, 0x9a }, { 0x00, 0x9b, 0x9b }, { 0x00, 0x9c, 0x9c }, { 0x00, 0x9d, 0x9d }, { 0x00, 0x9e, 0x9e }, { 0x00, 0x9f, 0x9f }, { 0x00, 0xa0, 0xa0 }, { 0x00, 0xa1, 0xa1 }, { 0x00, 0xa2, 0xa2 }, { 0x00, 0xa3, 0xa3 }, { 0x00, 0xa4, 0xa4 }, { 0x00, 0xa5, 0xa5 }, { 0x00, 0xa6, 0xa6 }, { 0x00, 0xa7, 0xa7 }, { 0x00, 0xa8, 0xa8 }, { 0x00, 0xa9, 0xa9 }, { 0x00, 0xaa, 0xaa }, { 0x00, 0xab, 0xab }, { 0x00, 0xac, 0xac }, { 0x00, 0xad, 0xad }, { 0x00, 0xae, 0xae }, { 0x00, 0xaf, 0xaf }, { 0x00, 0xb0, 0xb0 }, { 0x00, 0xb1, 0xb1 }, { 0x00, 0xb2, 0xb2 }, { 0x00, 0xb3, 0xb3 }, { 0x00, 0xb4, 0xb4 }, { 0x00, 0xb5, 0xb5 }, { 0x00, 0xb6, 0xb6 }, { 0x00, 0xb7, 0xb7 }, { 0x00, 0xb8, 0xb8 }, { 0x00, 0xb9, 0xb9 }, { 0x00, 0xba, 0xba }, { 0x00, 0xbb, 0xbb }, { 0x00, 0xbc, 0xbc }, { 0x00, 0xbd, 0xbd }, { 0x00, 0xbe, 0xbe }, { 0x00, 0xbf, 0xbf }, { 0x00, 0xc0, 0xc0 }, { 0x00, 0xc1, 0xc1 }, { 0x00, 0xc2, 0xc2 }, { 0x00, 0xc3, 0xc3 }, { 0x00, 0xc4, 0xc4 }, { 0x00, 0xc5, 0xc5 }, { 0x00, 0xc6, 0xc6 }, { 0x00, 0xc7, 0xc7 }, { 0x00, 0xc8, 0xc8 }, { 0x00, 0xc9, 0xc9 }, { 0x00, 0xca, 0xca }, { 0x00, 0xcb, 0xcb }, { 0x00, 0xcc, 0xcc }, { 0x00, 0xcd, 0xcd }, { 0x00, 0xce, 0xce }, { 0x00, 0xcf, 0xcf }, { 0x00, 0xd0, 0xd0 }, { 0x00, 0xd1, 0xd1 }, { 0x00, 0xd2, 0xd2 }, { 0x00, 0xd3, 0xd3 }, { 0x00, 0xd4, 0xd4 }, { 0x00, 0xd5, 0xd5 }, { 0x00, 0xd6, 0xd6 }, { 0x00, 0xd7, 0xd7 }, { 0x00, 0xd8, 0xd8 }, { 0x00, 0xd9, 0xd9 }, { 0x00, 0xda, 0xda }, { 0x00, 0xdb, 0xdb }, { 0x00, 0xdc, 0xdc }, { 0x00, 0xdd, 0xdd }, { 0x00, 0xde, 0xde }, { 0x00, 0xdf, 0xdf }, { 0x00, 0xe0, 0xe0 }, { 0x00, 0xe1, 0xe1 }, { 0x00, 0xe2, 0xe2 }, { 0x00, 0xe3, 0xe3 }, { 0x00, 0xe4, 0xe4 }, { 0x00, 0xe5, 0xe5 }, { 0x00, 0xe6, 0xe6 }, { 0x00, 0xe7, 0xe7 }, { 0x00, 0xe8, 0xe8 }, { 0x00, 0xe9, 0xe9 }, { 0x00, 0xea, 0xea }, { 0x00, 0xeb, 0xeb }, { 0x00, 0xec, 0xec }, { 0x00, 0xed, 0xed }, { 0x00, 0xee, 0xee }, { 0x00, 0xef, 0xef }, { 0x00, 0xf0, 0xf0 }, { 0x00, 0xf1, 0xf1 }, { 0x00, 0xf2, 0xf2 }, { 0x00, 0xf3, 0xf3 }, { 0x00, 0xf4, 0xf4 }, { 0x00, 0xf5, 0xf5 }, { 0x00, 0xf6, 0xf6 }, { 0x00, 0xf7, 0xf7 }, { 0x00, 0xf8, 0xf8 }, { 0x00, 0xf9, 0xf9 }, { 0x00, 0xfa, 0xfa }, { 0x00, 0xfb, 0xfb }, { 0x00, 0xfc, 0xfc }, { 0x00, 0xfd, 0xfd }, { 0x00, 0xfe, 0xfe }, { 0x00, 0xff, 0xff } }; static struct enc_entry encds[] = { {"ISO8859-1",iso1_tbl}, {"ISO8859-2",iso2_tbl}, {"ISO8859-3",iso3_tbl}, {"ISO8859-4",iso4_tbl}, {"ISO8859-5",iso5_tbl}, {"ISO8859-6",iso6_tbl}, {"ISO8859-7",iso7_tbl}, {"ISO8859-8",iso8_tbl}, {"ISO8859-9",iso9_tbl}, {"ISO8859-10",iso10_tbl}, {"KOI8-R",koi8r_tbl}, {"KOI8-U",koi8u_tbl}, {"microsoft-cp1251",cp1251_tbl}, {"ISO8859-13", iso13_tbl}, {"ISO8859-14", iso14_tbl}, {"ISO8859-15", iso15_tbl}, {"ISCII-DEVANAGARI", iscii_devanagari_tbl} }; struct cs_info * get_current_cs(const char * es) { struct cs_info * ccs = encds[0].cs_table; int n = sizeof(encds) / sizeof(encds[0]); for (int i = 0; i < n; i++) { if (strcmp(es,encds[i].enc_name) == 0) { ccs = encds[i].cs_table; break; } } return ccs; } #else // XXX This function was rewritten for mozilla. Instead of storing the // conversion tables static in this file, create them when needed // with help the mozilla backend. struct cs_info * get_current_cs(const char * es) { struct cs_info *ccs; nsCOMPtr encoder; nsCOMPtr decoder; nsCOMPtr caseConv; nsresult rv; nsCOMPtr ccm = do_GetService(kCharsetConverterManagerCID, &rv); if (NS_FAILED(rv)) return nsnull; rv = ccm->GetUnicodeEncoder(es, getter_AddRefs(encoder)); if (encoder && NS_SUCCEEDED(rv)) encoder->SetOutputErrorBehavior(encoder->kOnError_Replace, nsnull, '?'); if (NS_FAILED(rv)) return nsnull; rv = ccm->GetUnicodeDecoder(es, getter_AddRefs(decoder)); caseConv = do_GetService(kUnicharUtilCID, &rv); if (NS_FAILED(rv)) return nsnull; ccs = (struct cs_info *) malloc(256 * sizeof(cs_info)); PRInt32 charLength = 256; PRInt32 uniLength = 512; char *source = (char *)malloc(charLength * sizeof(char)); PRUnichar *uni = (PRUnichar *)malloc(uniLength * sizeof(PRUnichar)); char *lower = (char *)malloc(charLength * sizeof(char)); char *upper = (char *)malloc(charLength * sizeof(char)); // Create a long string of all chars. unsigned int i; for (i = 0x00; i <= 0xff ; ++i) { source[i] = i; } // Convert this long string to unicode rv = decoder->Convert(source, &charLength, uni, &uniLength); // Do case conversion stuff, and convert back. caseConv->ToUpper(uni, uni, uniLength); encoder->Convert(uni, &uniLength, upper, &charLength); uniLength = 512; charLength = 256; rv = decoder->Convert(source, &charLength, uni, &uniLength); caseConv->ToLower(uni, uni, uniLength); encoder->Convert(uni, &uniLength, lower, &charLength); // Store for (i = 0x00; i <= 0xff ; ++i) { ccs[i].cupper = upper[i]; ccs[i].clower = lower[i]; if (ccs[i].clower != (unsigned char)i) ccs[i].ccase = true; else ccs[i].ccase = false; } free(source); free(uni); free(lower); free(upper); return ccs; } #endif // primitive isalpha() replacement for tokenization char * get_casechars(const char * enc) { struct cs_info * csconv = get_current_cs(enc); char expw[MAXLNLEN]; char * p = expw; for (int i = 0; i <= 255; i++) { if ((csconv[i].cupper != csconv[i].clower)) { *p = (char) i; p++; } } *p = '\0'; #ifdef MOZILLA_CLIENT delete csconv; #endif return mystrdup(expw); } struct lang_map lang2enc[] = { {"ar", "UTF-8", LANG_ar}, {"az", "UTF-8", LANG_az}, {"bg", "microsoft-cp1251", LANG_bg}, {"ca", "ISO8859-1", LANG_ca}, {"cs", "ISO8859-2", LANG_cs}, {"da", "ISO8859-1", LANG_da}, {"de", "ISO8859-1", LANG_de}, {"el", "ISO8859-7", LANG_el}, {"en", "ISO8859-1", LANG_en}, {"es", "ISO8859-1", LANG_es}, {"eu", "ISO8859-1", LANG_eu}, {"gl", "ISO8859-1", LANG_gl}, {"fr", "ISO8859-15", LANG_fr}, {"hr", "ISO8859-2", LANG_hr}, {"hu", "ISO8859-2", LANG_hu}, {"it", "ISO8859-1", LANG_it}, {"la", "ISO8859-1", LANG_la}, {"lv", "ISO8859-13", LANG_lv}, {"nl", "ISO8859-1", LANG_nl}, {"pl", "ISO8859-2", LANG_pl}, {"pt", "ISO8859-1", LANG_pt}, {"sv", "ISO8859-1", LANG_sv}, {"tr", "UTF-8", LANG_tr}, {"ru", "KOI8-R", LANG_ru}, {"uk", "KOI8-U", LANG_uk} }; const char * get_default_enc(const char * lang) { int n = sizeof(lang2enc) / sizeof(lang2enc[0]); for (int i = 0; i < n; i++) { if (strcmp(lang,lang2enc[i].lang) == 0) { return lang2enc[i].def_enc; } } return NULL; } int get_lang_num(const char * lang) { int n = sizeof(lang2enc) / sizeof(lang2enc[0]); for (int i = 0; i < n; i++) { if (strncmp(lang,lang2enc[i].lang,2) == 0) { return lang2enc[i].num; } } return LANG_xx; } #ifndef OPENOFFICEORG #ifndef MOZILLA_CLIENT int initialize_utf_tbl() { utf_tbl_count++; if (utf_tbl) return 0; utf_tbl = (unicode_info2 *) malloc(CONTSIZE * sizeof(unicode_info2)); if (utf_tbl) { int j; for (j = 0; j < CONTSIZE; j++) { utf_tbl[j].cletter = 0; utf_tbl[j].clower = (unsigned short) j; utf_tbl[j].cupper = (unsigned short) j; } for (j = 0; j < UTF_LST_LEN; j++) { utf_tbl[utf_lst[j].c].cletter = 1; utf_tbl[utf_lst[j].c].clower = utf_lst[j].clower; utf_tbl[utf_lst[j].c].cupper = utf_lst[j].cupper; } } else return 1; return 0; } #endif #endif void free_utf_tbl() { if (utf_tbl_count > 0) utf_tbl_count--; if (utf_tbl && (utf_tbl_count == 0)) { free(utf_tbl); utf_tbl = NULL; } } #ifdef MOZILLA_CLIENT static nsCOMPtr& getcaseConv() { nsresult rv; static nsCOMPtr caseConv = do_GetService(kUnicharUtilCID, &rv); return caseConv; } #endif unsigned short unicodetoupper(unsigned short c, int langnum) { // In Azeri and Turkish, I and i dictinct letters: // There are a dotless lower case i pair of upper `I', // and an upper I with dot pair of lower `i'. if (c == 0x0069 && ((langnum == LANG_az) || (langnum == LANG_tr))) return 0x0130; #ifdef OPENOFFICEORG return u_toupper(c); #else #ifdef MOZILLA_CLIENT PRUnichar ch2; getcaseConv()->ToUpper((PRUnichar) c, &ch2); return ch2; #else return (utf_tbl) ? utf_tbl[c].cupper : c; #endif #endif } unsigned short unicodetolower(unsigned short c, int langnum) { // In Azeri and Turkish, I and i dictinct letters: // There are a dotless lower case i pair of upper `I', // and an upper I with dot pair of lower `i'. if (c == 0x0049 && ((langnum == LANG_az) || (langnum == LANG_tr))) return 0x0131; #ifdef OPENOFFICEORG return u_tolower(c); #else #ifdef MOZILLA_CLIENT PRUnichar ch2; getcaseConv()->ToLower((PRUnichar) c, &ch2); return ch2; #else return (utf_tbl) ? utf_tbl[c].clower : c; #endif #endif } int unicodeisalpha(unsigned short c) { #ifdef OPENOFFICEORG return u_isalpha(c); #else return (utf_tbl) ? utf_tbl[c].cletter : 0; #endif } /* get type of capitalization */ int get_captype(char * word, int nl, cs_info * csconv) { // now determine the capitalization type of the first nl letters int ncap = 0; int nneutral = 0; int firstcap = 0; if (csconv == NULL) return NOCAP; for (char * q = word; *q != '\0'; q++) { if (csconv[*((unsigned char *)q)].ccase) ncap++; if (csconv[*((unsigned char *)q)].cupper == csconv[*((unsigned char *)q)].clower) nneutral++; } if (ncap) { firstcap = csconv[*((unsigned char *) word)].ccase; } // now finally set the captype if (ncap == 0) { return NOCAP; } else if ((ncap == 1) && firstcap) { return INITCAP; } else if ((ncap == nl) || ((ncap + nneutral) == nl)) { return ALLCAP; } else if ((ncap > 1) && firstcap) { return HUHINITCAP; } return HUHCAP; } int get_captype_utf8(w_char * word, int nl, int langnum) { // now determine the capitalization type of the first nl letters int ncap = 0; int nneutral = 0; int firstcap = 0; unsigned short idx; // don't check too long words if (nl >= MAXWORDLEN) return 0; // big Unicode character (non BMP area) if (nl == -1) return NOCAP; for (int i = 0; i < nl; i++) { idx = (word[i].h << 8) + word[i].l; if (idx != unicodetolower(idx, langnum)) ncap++; if (unicodetoupper(idx, langnum) == unicodetolower(idx, langnum)) nneutral++; } if (ncap) { idx = (word[0].h << 8) + word[0].l; firstcap = (idx != unicodetolower(idx, langnum)); } // now finally set the captype if (ncap == 0) { return NOCAP; } else if ((ncap == 1) && firstcap) { return INITCAP; } else if ((ncap == nl) || ((ncap + nneutral) == nl)) { return ALLCAP; } else if ((ncap > 1) && firstcap) { return HUHINITCAP; } return HUHCAP; } // strip all ignored characters in the string void remove_ignored_chars_utf(char * word, unsigned short ignored_chars[], int ignored_len) { w_char w[MAXWORDLEN]; w_char w2[MAXWORDLEN]; int i; int j; int len = u8_u16(w, MAXWORDLEN, word); for (i = 0, j = 0; i < len; i++) { if (!flag_bsearch(ignored_chars, ((unsigned short *) w)[i], ignored_len)) { w2[j] = w[i]; j++; } } if (j < i) u16_u8(word, MAXWORDUTF8LEN, w2, j); } // strip all ignored characters in the string void remove_ignored_chars(char * word, char * ignored_chars) { for (char * p = word; *p != '\0'; p++) { if (!strchr(ignored_chars, *p)) { *word = *p; word++; } } *word = '\0'; } int parse_string(char * line, char ** out, const char * warnvar) { char * tp = line; char * piece; int i = 0; int np = 0; if (*out) { HUNSPELL_WARNING(stderr, "error: duplicate %s line\n", warnvar); return 1; } piece = mystrsep(&tp, 0); while (piece) { if (*piece != '\0') { switch(i) { case 0: { np++; break; } case 1: { *out = mystrdup(piece); if (!*out) return 1; np++; break; } default: break; } i++; } // free(piece); piece = mystrsep(&tp, 0); } if (np != 2) { HUNSPELL_WARNING(stderr, "error: missing %s information\n", warnvar); return 1; } return 0; } int parse_array(char * line, char ** out, unsigned short ** out_utf16, int * out_utf16_len, const char * name, int utf8) { if (parse_string(line, out, name)) return 1; if (utf8) { w_char w[MAXWORDLEN]; int n = u8_u16(w, MAXWORDLEN, *out); if (n > 0) { flag_qsort((unsigned short *) w, 0, n); *out_utf16 = (unsigned short *) malloc(n * sizeof(unsigned short)); if (!*out_utf16) return 1; memcpy(*out_utf16, w, n * sizeof(unsigned short)); } *out_utf16_len = n; } return 0; } robojournal-0.4.2/ui/hunspell/filemgr.hxx0000644000175000017500000000636712211723646017216 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* file manager class - read lines of files [filename] OR [filename.hz] */ #ifndef _FILEMGR_HXX_ #define _FILEMGR_HXX_ #include "ui/hunspell/hunzip.hxx" class FileMgr { protected: FILE * fin; Hunzip * hin; char in[BUFSIZE + 50]; // input buffer int fail(const char * err, const char * par); public: FileMgr(const char * filename, const char * key = NULL); ~FileMgr(); char * getline(); }; #endif robojournal-0.4.2/ui/hunspell/csutil.hxx0000644000175000017500000002147612211723646017072 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef __CSUTILHXX__ #define __CSUTILHXX__ // First some base level utility routines #include "ui/hunspell/w_char.hxx" // casing #define NOCAP 0 #define INITCAP 1 #define ALLCAP 2 #define HUHCAP 3 #define HUHINITCAP 4 // default encoding and keystring #define SPELL_ENCODING "ISO8859-1" #define SPELL_KEYSTRING "qwertyuiop|asdfghjkl|zxcvbnm" // default morphological fields #define MORPH_STEM "st:" #define MORPH_ALLOMORPH "al:" #define MORPH_POS "po:" #define MORPH_DERI_PFX "dp:" #define MORPH_INFL_PFX "ip:" #define MORPH_TERM_PFX "tp:" #define MORPH_DERI_SFX "ds:" #define MORPH_INFL_SFX "is:" #define MORPH_TERM_SFX "ts:" #define MORPH_SURF_PFX "sp:" #define MORPH_FREQ "fr:" #define MORPH_PHON "ph:" #define MORPH_HYPH "hy:" #define MORPH_PART "pa:" #define MORPH_FLAG "fl:" #define MORPH_HENTRY "_H:" #define MORPH_TAG_LEN strlen(MORPH_STEM) #define MSEP_FLD ' ' #define MSEP_REC '\n' #define MSEP_ALT '\v' // default flags #define DEFAULTFLAGS 65510 #define FORBIDDENWORD 65510 #define ONLYUPCASEFLAG 65511 // hash entry macros #define HENTRY_DATA(h) (h->var ? ((h->var & H_OPT_ALIASM) ? \ get_stored_pointer(&(h->word) + h->blen + 1) : &(h->word) + h->blen + 1) : NULL) // NULL-free version for warning-free OOo build #define HENTRY_DATA2(h) (h->var ? ((h->var & H_OPT_ALIASM) ? \ get_stored_pointer(&(h->word) + h->blen + 1) : &(h->word) + h->blen + 1) : "") #define HENTRY_FIND(h,p) (HENTRY_DATA(h) ? strstr(HENTRY_DATA(h), p) : NULL) #define w_char_eq(a,b) (((a).l == (b).l) && ((a).h == (b).h)) // convert UTF-16 characters to UTF-8 char * u16_u8(char * dest, int size, const w_char * src, int srclen); // convert UTF-8 characters to UTF-16 int u8_u16(w_char * dest, int size, const char * src); // sort 2-byte vector void flag_qsort(unsigned short flags[], int begin, int end); // binary search in 2-byte vector int flag_bsearch(unsigned short flags[], unsigned short flag, int right); // remove end of line char(s) void mychomp(char * s); // duplicate string char * mystrdup(const char * s); // duplicate reverse of string char * myrevstrdup(const char * s); // parse into tokens with char delimiter char * mystrsep(char ** sptr, const char delim); // parse into tokens with char delimiter char * mystrsep2(char ** sptr, const char delim); // parse into tokens with char delimiter char * mystrrep(char *, const char *, const char *); // append s to ends of every lines in text void strlinecat(char * lines, const char * s); // tokenize into lines with new line int line_tok(const char * text, char *** lines, char breakchar); // tokenize into lines with new line and uniq in place char * line_uniq(char * text, char breakchar); char * line_uniq_app(char ** text, char breakchar); // change oldchar to newchar in place char * tr(char * text, char oldc, char newc); // reverse word int reverseword(char *); // reverse word int reverseword_utf(char *); // remove duplicates int uniqlist(char ** list, int n); // free character array list void freelist(char *** list, int n); // character encoding information struct cs_info { unsigned char ccase; unsigned char clower; unsigned char cupper; }; // Unicode character encoding information struct unicode_info { unsigned short c; unsigned short cupper; unsigned short clower; }; struct unicode_info2 { char cletter; unsigned short cupper; unsigned short clower; }; int initialize_utf_tbl(); void free_utf_tbl(); unsigned short unicodetoupper(unsigned short c, int langnum); unsigned short unicodetolower(unsigned short c, int langnum); int unicodeisalpha(unsigned short c); struct enc_entry { const char * enc_name; struct cs_info * cs_table; }; // language to encoding default map struct lang_map { const char * lang; const char * def_enc; int num; }; struct cs_info * get_current_cs(const char * es); const char * get_default_enc(const char * lang); // get language identifiers of language codes int get_lang_num(const char * lang); // get characters of the given 8bit encoding with lower- and uppercase forms char * get_casechars(const char * enc); // convert null terminated string to all caps using encoding void enmkallcap(char * d, const char * p, const char * encoding); // convert null terminated string to all little using encoding void enmkallsmall(char * d, const char * p, const char * encoding); // convert null terminated string to have intial capital using encoding void enmkinitcap(char * d, const char * p, const char * encoding); // convert null terminated string to all caps void mkallcap(char * p, const struct cs_info * csconv); // convert null terminated string to all little void mkallsmall(char * p, const struct cs_info * csconv); // convert null terminated string to have intial capital void mkinitcap(char * p, const struct cs_info * csconv); // convert first nc characters of UTF-8 string to little void mkallsmall_utf(w_char * u, int nc, int langnum); // convert first nc characters of UTF-8 string to capital void mkallcap_utf(w_char * u, int nc, int langnum); // get type of capitalization int get_captype(char * q, int nl, cs_info *); // get type of capitalization (UTF-8) int get_captype_utf8(w_char * q, int nl, int langnum); // strip all ignored characters in the string void remove_ignored_chars_utf(char * word, unsigned short ignored_chars[], int ignored_len); // strip all ignored characters in the string void remove_ignored_chars(char * word, char * ignored_chars); int parse_string(char * line, char ** out, const char * name); int parse_array(char * line, char ** out, unsigned short ** out_utf16, int * out_utf16_len, const char * name, int utf8); int fieldlen(const char * r); char * copy_field(char * dest, const char * morph, const char * var); int morphcmp(const char * s, const char * t); int get_sfxcount(const char * morph); // conversion function for protected memory void store_pointer(char * dest, char * source); // conversion function for protected memory char * get_stored_pointer(char * s); #endif robojournal-0.4.2/ui/hunspell/hashmgr.hxx0000644000175000017500000001176012211723646017213 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef _HASHMGR_HXX_ #define _HASHMGR_HXX_ #ifndef MOZILLA_CLIENT #include #else #include #endif #include "ui/hunspell/htypes.hxx" #include "ui/hunspell/filemgr.hxx" enum flag { FLAG_CHAR, FLAG_LONG, FLAG_NUM, FLAG_UNI }; class HashMgr { int tablesize; struct hentry ** tableptr; int userword; flag flag_mode; int complexprefixes; int utf8; unsigned short forbiddenword; int langnum; char * enc; char * lang; struct cs_info * csconv; char * ignorechars; unsigned short * ignorechars_utf16; int ignorechars_utf16_len; int numaliasf; // flag vector `compression' with aliases unsigned short ** aliasf; unsigned short * aliasflen; int numaliasm; // morphological desciption `compression' with aliases char ** aliasm; public: HashMgr(const char * tpath, const char * apath, const char * key = NULL); ~HashMgr(); struct hentry * lookup(const char *) const; int hash(const char *) const; struct hentry * walk_hashtable(int & col, struct hentry * hp) const; int add(const char * word, char * aff); int add_with_affix(const char * word, const char * pattern); int remove(const char * word); int decode_flags(unsigned short ** result, char * flags); unsigned short decode_flag(const char * flag); char * encode_flag(unsigned short flag); int is_aliasf(); int get_aliasf(int index, unsigned short ** fvec); int is_aliasm(); char * get_aliasm(int index); private: int get_clen_and_captype(const char * word, int wbl, int * captype); int load_tables(const char * tpath, const char * key); int add_word(const char * word, int wbl, int wcl, unsigned short * ap, int al, const char * desc, bool onlyupcase); int load_config(const char * affpath, const char * key); int parse_aliasf(char * line, FileMgr * af); int add_hidden_capitalized_word(char * word, int wbl, int wcl, unsigned short * flags, int al, char * dp, int captype); int parse_aliasm(char * line, FileMgr * af); int remove_forbidden_flag(const char * word); }; #endif robojournal-0.4.2/ui/hunspell/hunspell.h0000644000175000017500000001335612211723646017037 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Hunspell, based on MySpell. * * The Initial Developers of the Original Code are * Kevin Hendricks (MySpell) and Laszlo Nemeth (Hunspell). * Portions created by the Initial Developers are Copyright (C) 2002-2005 * the Initial Developers. All Rights Reserved. * * Contributor(s): * David Einstein * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas * Bencsath Boldizsar * Halacsy Peter * Dvornik Laszlo * Gefferth Andras * Nagy Viktor * Varga Daniel * Chris Halls * Rene Engelhard * Bram Moolenaar * Dafydd Jones * Harri Pitkanen * Andras Timar * Tor Lillqvist * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef _MYSPELLMGR_H_ #define _MYSPELLMGR_H_ #ifdef __cplusplus extern "C" { #endif typedef struct Hunhandle Hunhandle; #ifdef _MSC_VER #define DLL __declspec ( dllexport ) #else #define DLL #endif DLL Hunhandle *Hunspell_create(const char * affpath, const char * dpath); DLL Hunhandle *Hunspell_create_key(const char * affpath, const char * dpath, const char * key); DLL void Hunspell_destroy(Hunhandle *pHunspell); /* spell(word) - spellcheck word * output: 0 = bad word, not 0 = good word */ DLL int Hunspell_spell(Hunhandle *pHunspell, const char *); DLL char *Hunspell_get_dic_encoding(Hunhandle *pHunspell); /* suggest(suggestions, word) - search suggestions * input: pointer to an array of strings pointer and the (bad) word * array of strings pointer (here *slst) may not be initialized * output: number of suggestions in string array, and suggestions in * a newly allocated array of strings (*slts will be NULL when number * of suggestion equals 0.) */ DLL int Hunspell_suggest(Hunhandle *pHunspell, char*** slst, const char * word); /* morphological functions */ /* analyze(result, word) - morphological analysis of the word */ DLL int Hunspell_analyze(Hunhandle *pHunspell, char*** slst, const char * word); /* stem(result, word) - stemmer function */ DLL int Hunspell_stem(Hunhandle *pHunspell, char*** slst, const char * word); /* stem(result, analysis, n) - get stems from a morph. analysis * example: * char ** result, result2; * int n1 = Hunspell_analyze(result, "words"); * int n2 = Hunspell_stem2(result2, result, n1); */ DLL int Hunspell_stem2(Hunhandle *pHunspell, char*** slst, char** desc, int n); /* generate(result, word, word2) - morphological generation by example(s) */ DLL int Hunspell_generate(Hunhandle *pHunspell, char*** slst, const char * word, const char * word2); /* generate(result, word, desc, n) - generation by morph. description(s) * example: * char ** result; * char * affix = "is:plural"; // description depends from dictionaries, too * int n = Hunspell_generate2(result, "word", &affix, 1); * for (int i = 0; i < n; i++) printf("%s\n", result[i]); */ DLL int Hunspell_generate2(Hunhandle *pHunspell, char*** slst, const char * word, char** desc, int n); /* functions for run-time modification of the dictionary */ /* add word to the run-time dictionary */ DLL int Hunspell_add(Hunhandle *pHunspell, const char * word); /* add word to the run-time dictionary with affix flags of * the example (a dictionary word): Hunspell will recognize * affixed forms of the new word, too. */ DLL int Hunspell_add_with_affix(Hunhandle *pHunspell, const char * word, const char * example); /* remove word from the run-time dictionary */ DLL int Hunspell_remove(Hunhandle *pHunspell, const char * word); /* free suggestion lists */ DLL void Hunspell_free_list(Hunhandle *pHunspell, char *** slst, int n); #ifdef __cplusplus } #endif #endif robojournal-0.4.2/ui/configurationgeneral.ui0000775000175000017500000002674612142060704017752 0ustar willwill ConfigurationGeneral 0 0 357 525 Form Global Preferences <p><span style=" font-weight:600;">(Recommended)</span> This option requires RoboJournal to suggest (but not force) default settings wherever applicable.</p> Always suggest &default settings <p><b>(Recommended)</b> This safety protocol requires RoboJournal to require user confirmation before executing commands that delete data. </p> Always show &confirmation dialogs <p>Requires RoboJournal to display text labels on the toolbar buttons (as opposed to icon-only). Text labels may be cumbersome if the toolbar is docked left or right so some users may wish to turn them off.</p> Show &labels on toolbar buttons <p>If checked, RoboJournal displays the name of the current journal in the titlebar <nobr>(i.e. <i>journal_name</i> - RoboJournal).</nobr></p> Display current journal &name in title bar <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If checked, RoboJournal alternates the row background colors in the Chronological Entry List and Search list. This helps to provide visual contrast in long lists but may look bad with some color schemes (so you may wish to disable it in such instances).</p></body></html> Display &alternating row colors in lists <p>This housekeeping function causes RoboJournal to display a list of all untagged entries it finds during every login (essentially a &quot;nag window&quot;). This feature can be helpful but some users may wish to disable it. </p> Display Tag &Reminder window during login Qt::Vertical QSizePolicy::Fixed 20 6 Toolbar docking position Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Left Top (default) Right Date and Time <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If checked, this setting displays the day of week when an entry was written in addition to the regular date and time. (i.e. Saturday, 1/1/2000).</span></p></body></html> Display day of &week when entries were made <p><span style=" font-weight:600;">(Recommended) </span>This causes new entries to be marked with the timestamp of when they were created. Entries without a timestamp are marked with <span style=" font-style:italic;">[unknown time]</span>.</p> Record the &time when entries are made <p>Use this option if you wish to display timestamps in 24 hour format (i.e. 16:00 instead of 4:00 pm). </p> Use 24-&hour clock in timestamps Qt::Vertical QSizePolicy::Fixed 20 6 Preferred date format Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter European USA ISO-8601 Qt::Vertical QSizePolicy::Fixed 20 6 Example: January 1, 2012 (MM/DD/YYYY) Backend (Database) RoboJournal should use Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter This menu selects the type of database RoboJournal should currently work with. Only one backend may be used at a time. Qt::Vertical 20 40 robojournal-0.4.2/ui/configurationmysql.h0000775000175000017500000000245512142060704017303 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef CONFIGURATIONMYSQL_H #define CONFIGURATIONMYSQL_H #include namespace Ui { class ConfigurationMySQL; } class ConfigurationMySQL : public QWidget { Q_OBJECT public: explicit ConfigurationMySQL(QWidget *parent = 0); ~ConfigurationMySQL(); void GetChanges(); private slots: void on_DefaultPort_clicked(); void on_Port_textChanged(const QString &arg1); private: Ui::ConfigurationMySQL *ui; void PopulateForm(); }; #endif // CONFIGURATIONMYSQL_H robojournal-0.4.2/ui/firstrun.h0000644000175000017500000000220412211723646015215 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef FIRSTRUN_H #define FIRSTRUN_H #include namespace Ui { class FirstRun; } class FirstRun : public QDialog { Q_OBJECT public: explicit FirstRun(QWidget *parent = 0); ~FirstRun(); private slots: void on_buttonBox_accepted(); void on_buttonBox_rejected(); private: Ui::FirstRun *ui; void Launcher(); }; #endif // FIRSTRUN_H robojournal-0.4.2/ui/entrysearch.cpp0000644000175000017500000000172612211723646016233 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/entrysearch.h" #include "ui_entrysearch.h" EntrySearch::EntrySearch(QWidget *parent) : QDialog(parent), ui(new Ui::EntrySearch) { ui->setupUi(this); } EntrySearch::~EntrySearch() { delete ui; } robojournal-0.4.2/ui/configurationexport.ui0000775000175000017500000003052512142060704017644 0ustar willwill ConfigurationExport 0 0 346 465 Form HTML Behavior Use &rounded corners on date/timestamp header Use system &colors in exported HTML files Include &tags in exported entries Preferred HTML Fonts Select header font: <p>Recommendation: For best results, use sans serif fonts (e.g. Arial, Verdana, Calibri) for headers. The preferred font is used by default; other fonts are substituted if the preferred font is not available on the current system.</p> false Qt::Vertical QSizePolicy::Fixed 20 6 Select body text font: <p>Recommendation: Serif fonts (e.g. Times New Roman, Cambria, etc.) work best with body text. The preferred font is used by default; other fonts are substituted if the preferred font is not available on the current system.</p> false Font Sizes and Units Header font size/unit Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 52 0 16 18 20 22 24 26 28 30 34 38 40 Em units scale relative to font size; Pt units are fixed point size. pt em Body font size/unit Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 52 0 8 10 12 Em units scale relative to font size; Pt units are fixed point size. pt em Qt::Horizontal QSizePolicy::Fixed 20 20 Qt::Horizontal QSizePolicy::Expanding 100 20 Qt::Vertical QSizePolicy::Fixed 20 6 Qt::Horizontal 40 20 130 0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click to see a sample document rendered with the current settings. All font/size changes are temporary until you click the <span style=" font-weight:600;">OK</span> button below.</p></body></html> Preview Export Settings :/icons/document-globe.png:/icons/document-globe.png Qt::Vertical QSizePolicy::Expanding 20 6 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">FYI: Changes will <span style=" font-weight:600;">not</span> affect existing documents.</p></body></html> robojournal-0.4.2/ui/tagger.cpp0000644000175000017500000002716612214705537015165 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/tagger.h" #include "ui_tagger.h" #include #include #include #include "sql/mysqlcore.h" #include "core/buffer.h" #include #include #include #include #include QString Tagger::id_num; QString Tagger::title; //######################################################################################################### Tagger::Tagger(QWidget *parent) : QDialog(parent), ui(new Ui::Tagger) { ui->setupUi(this); // hide question mark button in title bar when running on Windows this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); int width=this->width(); int height=this->height(); this->setMaximumSize(width,height); this->setMinimumSize(width,height); // Do initial setup //ui->TagList->clear(); ui->RemoveTag->setDisabled(true); //ui->TagChooser->setFocus(); //ui->EntryName->setText(Tagger::title); // New behavior in >= 0.4: Hide EntryName field because we don't really need it. ui->EntryName->setVisible(false); QAbstractButton *ok=ui->buttonBox->button(QDialogButtonBox::Ok); ok->setDisabled(true); // lock the Apply button because we haven't done anything yet QAbstractButton *apply=ui->buttonBox->button(QDialogButtonBox::Apply); apply->setDisabled(true); // set background and stylesheet for TagList element QPalette pal; QBrush bg=pal.light(); QColor bgcolor=bg.color(); ui->TagList->setStyleSheet("padding: 8px; background-color: "+ bgcolor.name() + ";"); // Load Tags LoadTags(); // Create Tag List TagAggregator(); ui->TagChooser->clearEditText(); } //######################################################################################################### Tagger::~Tagger() { delete ui; } //######################################################################################################### // Add a tag to the list void Tagger::AddTag(QString newtag){ using namespace std; // get rid of semicolons since that is how tags are delimited in the database newtag=newtag.replace(";",""); bool add_entry=true; int count=ui->TagList->count(); for(int i=0; i < count; i++){ QListWidgetItem *c=ui->TagList->item(i); //cout << "Loop: " << i << endl; if(c->text()== newtag){ add_entry=false; break; } } if(!add_entry){ QMessageBox m; m.critical(this,"RoboJournal", "This entry has already been tagged with " + newtag + "."); ui->TagChooser->clearEditText(); ui->TagChooser->setFocus(); } else{ // Create new ListwidgetItem QIcon tagicon(":/icons/tag_orange.png"); QListWidgetItem *entry=new QListWidgetItem(tagicon,newtag); ui->TagList->addItem(entry); ui->TagList->setCurrentItem(entry); ui->RemoveTag->setEnabled(true); ui->TagChooser->setFocus(); ui->TagChooser->clearEditText(); bool add_to_list=true; for(int a=0; a < ui->TagChooser->count(); a++){ if(ui->TagChooser->itemText(a)==newtag){ add_to_list=false; break; } } if(add_to_list){ ui->TagChooser->addItem(newtag); } // Unlock the Apply button once we have changed tag data QAbstractButton *apply=ui->buttonBox->button(QDialogButtonBox::Apply); apply->setEnabled(true); // re-unlock Cancel button QAbstractButton *cancel=ui->buttonBox->button(QDialogButtonBox::Cancel); if(!cancel->isEnabled()){ cancel->setEnabled(true); } } } //######################################################################################################### // Add Tag to the list void Tagger::AddTagToList(){ QString tag=QInputDialog::getText(this, "RoboJournal", "Enter the new tag:", QLineEdit::Normal); tag=tag.trimmed(); tag=tag.simplified(); bool goodtag=true; // only proceed if the user clicked ok; cancel returns a null string if(!tag.isEmpty()){ // do some tag validation for (int i=0; i < ui->TagChooser->count(); i++){ QMessageBox m; if(ui->TagChooser->itemText(i)==tag){ goodtag=false; m.critical(this,"RoboJournal","" + tag + " is already on the Available Tags List."); break; } // Bugfix for 0.4.1 (3/5/13): Replace simple operator check with a "smarter" regexp. // The user should NEVER be allowed to declare "null" (case insensitive) as a tag // because that is a reserved word in the tagging system; entries marked with Null have // "No tags for this post" as their tag data. QRegExp banned("null", Qt::CaseInsensitive); if(banned.exactMatch(tag)){ goodtag=false; m.critical(this,"RoboJournal","You are not allowed to declare \"" + tag + "\" (or any other uppercase/lowercase variant of it) because it is a reserved keyword."); break; } } // if the tag is still good add it to the list. if(goodtag){ QIcon newicon(":/icons/tag_red_add.png"); ui->TagChooser->insertItem(0,newicon,tag); // if tag append button is disabled enable it now. if(!ui->AddTag->isEnabled()){ ui->AddTag->setEnabled(true); } } ui->TagChooser->setEnabled(true); ui->TagChooser->setCurrentIndex(0); } } //######################################################################################################### // Create Tag Aggregator list. This populates the drop-down list with tags. void Tagger::TagAggregator(){ using namespace std; MySQLCore b; QStringList tag_list; // list that holds all existing tags. Each tag should only be listed ONCE. QList tags=b.TagSearch(); QListIterator i(tags); while(i.hasNext()){ QString line=i.next(); QStringList tag_array=line.split(";"); for(int x=0; xTagChooser->addItem(tagicon,text); count++; } // bugfix 9/14/12: Prevent user from adding a blank tag to the entry. This can happen in brand-new journals with no tag data. // If there are no tags, disable the Add Tag button & Tag list. if(ui->TagChooser->count()==0){ ui->AddTag->setDisabled(true); ui->TagChooser->setDisabled(true); } } //######################################################################################################### // Delete a tag entry from the list void Tagger::DeleteTag(){ using namespace std; QListWidgetItem *item=ui->TagList->currentItem(); delete item; // if there are no items left disable the Remove button. if(ui->TagList->count() == 0){ ui->RemoveTag->setDisabled(1); } // Unlock the Apply button once we have changed tag data QAbstractButton *apply=ui->buttonBox->button(QDialogButtonBox::Apply); apply->setEnabled(true); // re-unlock Cancel button QAbstractButton *cancel=ui->buttonBox->button(QDialogButtonBox::Cancel); if(!cancel->isEnabled()){ cancel->setEnabled(true); } } //######################################################################################################### // return a semicolon-delimited QString containing all tags QString Tagger::ExportTagList(){ using namespace std; QStringList taglist; for(int i=0; i < ui->TagList->count(); i++){ QListWidgetItem *current=ui->TagList->item(i); taglist.append(current->text()); } QString tags=taglist.join(";"); //cout << "Tags: " << tags.toStdString() << endl; return tags; } //######################################################################################################### // Load tagdata from database and convert to tag objects in GUI void Tagger::LoadTags(){ using namespace std; MySQLCore a; QString tags=a.GetTags(Tagger::id_num); QStringList t_array=tags.split(";",QString::SkipEmptyParts); for(int i=0; i < t_array.size(); i++){ // Exclude null entries from tag list if((t_array.at(i) != "null") && (t_array.at(i) != "Null")){ QIcon tagicon(":/icons/tag_orange.png"); QListWidgetItem *entry=new QListWidgetItem(tagicon,t_array.at(i)); ui->TagList->addItem(entry); } } } //######################################################################################################### // delete tag from a list void Tagger::on_RemoveTag_clicked() { DeleteTag(); } //######################################################################################################### void Tagger::on_TagList_itemSelectionChanged() { ui->RemoveTag->setEnabled(true); } //######################################################################################################### void Tagger::on_AddTag_clicked() { QString newtag=ui->TagChooser->currentText(); AddTag(newtag); } void Tagger::on_TagChooser_editTextChanged(const QString &arg1) { if(arg1==""){ ui->AddTag->setDisabled(true); } else{ ui->AddTag->setEnabled(true); } } void Tagger::on_buttonBox_clicked(QAbstractButton *button) { using namespace std; if(button==ui->buttonBox->button(QDialogButtonBox::Apply)){ QString tag_data=ExportTagList(); // unlock OK button QAbstractButton *ok=ui->buttonBox->button(QDialogButtonBox::Ok); ok->setEnabled(true); // lock the Apply button once we are finished with it QAbstractButton *apply=ui->buttonBox->button(QDialogButtonBox::Apply); apply->setDisabled(true); // Lock the Cancel button once we Apply b/c it would make no sense to cancel anymore QAbstractButton *cancel=ui->buttonBox->button(QDialogButtonBox::Cancel); cancel->setDisabled(true); if(Buffer::backend=="MySQL"){ MySQLCore m; bool success=m.UpdateTags(tag_data,Tagger::id_num); if(success){ cout << "OUTPUT: Tag data updated successfully" << endl; } else{ cout << "ERROR: Tag data failed to update!" << endl; } } } } void Tagger::on_NewTag_clicked() { AddTagToList(); } void Tagger::on_TagChooser_currentIndexChanged() { ui->AddTag->setEnabled(true); } robojournal-0.4.2/ui/configurationgeneral.cpp0000775000175000017500000000773612142060704020115 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "configurationgeneral.h" #include "ui_configurationgeneral.h" #include #include "core/buffer.h" #include "ui/newconfig.h" #include "ui/mainwindow.h" ConfigurationGeneral::ConfigurationGeneral(QWidget *parent) : QWidget(parent), ui(new Ui::ConfigurationGeneral) { ui->setupUi(this); // Set up Database List QIcon mysql(":/icons/mysql_icon2.png"); //QIcon sqlite(":/icons/sqlite_icon.png"); ui->Backend->addItem(mysql,"MySQL"); //ui->Backend->addItem(sqlite,"SQLite"); PopulateForm(); } ConfigurationGeneral::~ConfigurationGeneral() { delete ui; } void ConfigurationGeneral::DateExample(int index){ // get today's date for example QDate today; today=today.currentDate(); int d=today.day(); int y=today.year(); int m=today.month(); QString month=today.longMonthName(m); QString year=QString::number(y); QString day=QString::number(d); if(index==0){ ui->DateExample->setText("Example: " + day + " " + month + ", " + year + " (DD-MM-YYYY)"); } if(index==1){ ui->DateExample->setText("Example: " + month + " " + day + ", " + year + " (MM-DD-YYYY)"); } if(index==2){ ui->DateExample->setText("Example: " + year + ", " + month + " " + day + " (YYYY-MM-DD)"); } } void ConfigurationGeneral::on_DateFormat_currentIndexChanged(int index) { DateExample(index); } // Set form fields to match config data in buffer void ConfigurationGeneral::PopulateForm(){ ui->AlwaysUseDefaults->setChecked(Buffer::alwaysusedefaults); ui->UseConfirmation->setChecked(Buffer::showwarnings); ui->UseToolbarLabels->setChecked(Buffer::show_icon_labels); ui->Usealternating->setChecked(Buffer::alternate_rows); ui->NameTitlebar->setChecked(Buffer::name_in_titlebar); ui->ToolbarPosition->setCurrentIndex(Buffer::toolbar_pos); ui->TagReminder->setChecked(Buffer::show_untagged_reminder); if(Buffer::backend=="MySQL"){ ui->Backend->setCurrentIndex(0); } if(Buffer::backend=="SQLite"){ ui->Backend->setCurrentIndex(1); } ui->RecordTime->setChecked(Buffer::keep_time); ui->UseMilitary->setChecked(Buffer::use_24_hour); ui->DateFormat->setCurrentIndex(Buffer::date_format); DateExample(Buffer::date_format); ui->DOW->setChecked(Buffer::use_dow); } void ConfigurationGeneral::GetChanges(){ Newconfig::new_always_use_defaults=ui->AlwaysUseDefaults->isChecked(); Newconfig::new_show_confirm=ui->UseConfirmation->isChecked(); Newconfig::new_icon_labels=ui->UseToolbarLabels->isChecked(); Newconfig::new_alternate_rows=ui->Usealternating->isChecked(); Newconfig::new_name_in_titlebar=ui->NameTitlebar->isChecked(); Newconfig::new_toolbar_pos=ui->ToolbarPosition->currentIndex(); Newconfig::new_dbtype=ui->Backend->currentText(); Newconfig::new_use_dow=ui->DOW->isChecked(); Newconfig::new_record_time=ui->RecordTime->isChecked(); Newconfig::new_24_hr=ui->UseMilitary->isChecked(); Newconfig::new_date_mode=ui->DateFormat->currentIndex(); Newconfig::new_show_untagged_reminder=ui->TagReminder->isChecked(); } robojournal-0.4.2/ui/tagger.h0000644000175000017500000000311512211723646014614 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef TAGGER_H #define TAGGER_H #include #include namespace Ui { class Tagger; } class Tagger : public QDialog { Q_OBJECT public: explicit Tagger(QWidget *parent = 0); ~Tagger(); static QString id_num; static QString title; private slots: void on_RemoveTag_clicked(); void on_TagList_itemSelectionChanged(); void on_AddTag_clicked(); void on_TagChooser_editTextChanged(const QString &arg1); void on_buttonBox_clicked(QAbstractButton *button); void on_NewTag_clicked(); void on_TagChooser_currentIndexChanged(); private: Ui::Tagger *ui; void AddTag(QString newtag); void DeleteTag(); void TagAggregator(); void SaveTags(); void LoadTags(); void AddTagToList(); QString ExportTagList(); }; #endif // TAGGER_H robojournal-0.4.2/ui/configurationjournal.cpp0000775000175000017500000001122212142060704020133 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "configurationjournal.h" #include "ui_configurationjournal.h" #include #include "core/buffer.h" #include "ui/newconfig.h" ConfigurationJournal::ConfigurationJournal(QWidget *parent) : QWidget(parent), ui(new Ui::ConfigurationJournal) { ui->setupUi(this); PrimaryConfig(); PopulateForm(); } ConfigurationJournal::~ConfigurationJournal() { delete ui; } void ConfigurationJournal::on_ShowAllEntries_clicked(bool checked) { if(checked){ ui->YearRange->setDisabled(true); ui->YearRange->setCurrentIndex(-1); ui->ShowRangeIndicator->setDisabled(true); ui->ShowRangeIndicator->setChecked(false); ui->label->setDisabled(true); } else{ ui->YearRange->setDisabled(false); ui->YearRange->setCurrentIndex(0); ui->ShowRangeIndicator->setDisabled(false); ui->ShowRangeIndicator->setChecked(true); ui->label->setDisabled(false); } } void ConfigurationJournal::PrimaryConfig(){ } // Load form data into temporary Newconfig buffer. this function gets called whenever the config data gets updated. void ConfigurationJournal::GetChanges(){ Newconfig::new_show_all_entries=ui->ShowAllEntries->isChecked(); // Year range requires a 1-year offset since ComboBox index starts at 0 instead of 1. int year_range=ui->YearRange->currentIndex(); year_range++; Newconfig::new_entry_range=year_range; Newconfig::new_indicator=ui->ShowRangeIndicator->isChecked(); Newconfig::new_full_name=ui->FullName->text(); Newconfig::new_gender_is_male=ui->Male->isChecked(); Newconfig::new_sort_by_day=ui->SortByDay->isChecked(); Newconfig::new_show_title=ui->ShowTitle->isChecked(); Newconfig::new_autoload=ui->Autoload->isChecked(); Newconfig::new_use_highlights=ui->Highlight->isChecked(); Newconfig::new_use_full_name=ui->UseFullName->isChecked(); Newconfig::new_highlight_color=ui->HighlightColor->currentIndex(); Newconfig::new_entry_node_icon=ui->NodeIcon->currentIndex(); } // Set form fields to match config data in buffer void ConfigurationJournal::PopulateForm(){ if(Buffer::allentries){ ui->ShowAllEntries->click(); } else{ ui->ShowRangeIndicator->setChecked(Buffer::use_indicator); // QCombobox index values start at 0, so we need to subtract one year to compensate. int range=Buffer::entryrange-1; ui->YearRange->setCurrentIndex(range); } ui->FullName->setText(Buffer::full_name); if(Buffer::is_male){ ui->Male->click(); } else{ ui->Female->click(); } ui->SortByDay->setChecked(Buffer::sortbyday); ui->ShowTitle->setChecked(Buffer::show_title); ui->Autoload->setChecked(Buffer::autoload); ui->Highlight->setChecked(Buffer::use_highlight); ui->UseFullName->setChecked(Buffer::use_full_name); ui->NodeIcon->setCurrentIndex(Buffer::entry_node_icon); if(Buffer::use_highlight){ ui->HighlightColor->setCurrentIndex(Buffer::highlight_color); } else{ ui->HighlightColor->setDisabled(true); ui->HighlightColor->setCurrentIndex(Buffer::highlight_color); } if(ui->FullName->text().isEmpty()){ ui->UseFullName->setChecked(false); ui->UseFullName->setEnabled(false); } } void ConfigurationJournal::on_Highlight_clicked(bool checked) { if(checked){ ui->HighlightColor->setDisabled(false); } else{ ui->HighlightColor->setDisabled(true); } } void ConfigurationJournal::on_FullName_textChanged(const QString &arg1) { if(arg1.isEmpty()){ ui->UseFullName->setChecked(false); ui->UseFullName->setDisabled(true); } else{ ui->UseFullName->setDisabled(false); ui->UseFullName->setChecked(true); } } robojournal-0.4.2/ui/entryexporter.h0000644000175000017500000000422512211723646016300 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef ENTRYEXPORTER_H #define ENTRYEXPORTER_H #include #include namespace Ui { class EntryExporter; } class EntryExporter : public QDialog { Q_OBJECT public: explicit EntryExporter(QWidget *parent = 0); ~EntryExporter(); static QString title; // title of this entry static QString body; // body text of this entry static QString date; //date of this entry used in filename static QString timestamp; void UpdateValues(QString new_title, QString new_date, QString new_body, QString new_timestamp); private slots: void on_BrowseButton_clicked(); void on_PlainText_clicked(); void on_HTML_clicked(); void on_IncludeDate_clicked(); void on_IncludeJournalName_clicked(); void on_buttonBox_accepted(); void on_HTML_2_clicked(); void on_PlainText_2_clicked(); void on_IncludeExportDate_clicked(); private: Ui::EntryExporter *ui; void PrimaryConfig(); void SetName(); void Set_Mass_Name(); void Browse(); void Do_Export(); void Mass_Export(); void Validate(); QStringList Do_Word_Wrap(QString body); void SetupCSS(); QString body_font; QString header_font; QString body_font_size; QString header_font_size; QString datebox_bgcolor; QString datebox_color; QString ProcessEntryName(bool use_journal, bool use_date); }; #endif // ENTRYEXPORTER_H robojournal-0.4.2/ui/firstrun.cpp0000644000175000017500000000471412211723646015560 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/firstrun.h" #include "ui_firstrun.h" #include "core/buffer.h" #include "ui/journalcreator.h" #include "ui_journalcreator.h" #include "ui/journalselector.h" #include "ui_journalselector.h" #include #include FirstRun::FirstRun(QWidget *parent) : QDialog(parent), ui(new Ui::FirstRun) { using namespace std; ui->setupUi(this); #ifdef unix QIcon unixicon(":/icons/robojournal-icon.png"); this->setWindowIcon(unixicon); #endif int width=this->width(); int height=this->height(); this->setMaximumSize(width,height); this->setMinimumSize(width,height); // make the new journal option default ui->NewJournal->click(); // hide question mark button in title bar when running on Windows this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); } FirstRun::~FirstRun() { delete ui; } void FirstRun::Launcher(){ this->close(); if(ui->NewJournal->isChecked()){ this->close(); JournalCreator j; j.exec(); } else{ this->close(); JournalSelector s; s.exec(); } } void FirstRun::on_buttonBox_accepted() { Launcher(); } void FirstRun::on_buttonBox_rejected() { if(Buffer::firstrun){ // get confirmation about quitting QMessageBox g; int choice=g.question(this,"RoboJournal","You have not finished the RoboJournal configuration process. " "Do you really want to quit?", QMessageBox::Yes|QMessageBox::No,QMessageBox::No); if(choice==QMessageBox::Yes){ exit(0); } else{ // do nothing } } else{ this->close(); } } robojournal-0.4.2/ui/configurationappearance.h0000775000175000017500000000272612142060704020236 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef CONFIGURATIONAPPEARANCE_H #define CONFIGURATIONAPPEARANCE_H #include namespace Ui { class ConfigurationAppearance; } class ConfigurationAppearance : public QWidget { Q_OBJECT public: explicit ConfigurationAppearance(QWidget *parent = 0); ~ConfigurationAppearance(); void GetChanges(); private slots: void on_UseTheme_clicked(bool checked); void on_ColorButton_clicked(); void on_ClearButton_clicked(); void on_BrowseButton_clicked(); private: Ui::ConfigurationAppearance *ui; void PopulateForm(); QString ColorSelect(); QString BackgroundSelect(); }; #endif // CONFIGURATIONAPPEARANCE_H robojournal-0.4.2/ui/SpellTextEdit.cpp0000775000175000017500000002311312142060704016425 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA Will Kraft (11/27/12): This code was originally Jan Sundermeyer's work (sunderme@web.de) I made some minor changes and adapted it for RoboJournal >= 0.4. RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/SpellTextEdit.h" #include "core/buffer.h" #include #include #include #include #include #include #include #include #include #include SpellTextEdit::SpellTextEdit(QWidget *parent,QString SpellDic) : QTextEdit(parent) { createActions(); // create misspell actions in context menu spell_dic=SpellDic.left(SpellDic.length()-4); QByteArray aff=Buffer::current_dictionary_aff.toLatin1(); QByteArray dic=Buffer::current_dictionary.toLatin1(); pChecker = new Hunspell(aff,dic); QFileInfo fi(SpellDic); if (!(fi.exists() && fi.isReadable())){ delete pChecker; pChecker=0; } // get user config dictionary QString filePath=Buffer::current_dictionary; fi=QFileInfo(filePath); if (fi.exists() && fi.isReadable()){ pChecker->add_dic(filePath.toLatin1()); } else filePath=""; addedWords.clear(); } SpellTextEdit::~SpellTextEdit() { using namespace std; QString fileName=Buffer::current_dictionary.toLatin1(); // only scan the dictionary if the user added words. if(!addedWords.isEmpty()){ Buffer::updating_dictionary=true; cout << "OUTPUT: Updating dictionary with new words......"; QFile file(fileName); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); /* Will Kraft 11/16/12 * Use QTextStream::ReadAll because reading a dictionary line by line is excruciatingly **SLOW** and often makes * the app hang/stop responding long enough to make people think it crashed. It's worth it to just use the extra * RAM to cache the whole file. Modern computers have plenty of it anyway and the .dic is usually < 600 Kb. */ QString line=in.readAll(); if(!addedWords.contains(line)){ addedWords << line; } file.close(); } if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { //std::cout << "write" << std::endl; QTextStream out(&file); QByteArray encodedString; QString spell_encoding=QString(pChecker->get_dic_encoding()); QTextCodec *codec = QTextCodec::codecForName(spell_encoding.toLatin1()); out << addedWords.count() << "\n"; foreach(QString elem, addedWords){ encodedString = codec->fromUnicode(elem); out << encodedString.data() << "\n"; } } cout << "DONE!" << endl; Buffer::updating_dictionary=false; } } bool SpellTextEdit::setDict(const QString SpellDic) { if(SpellDic!=""){ //mWords.clear(); spell_dic=SpellDic.left(SpellDic.length()-4); delete pChecker; QByteArray aff=Buffer::current_dictionary_aff.toLatin1(); QByteArray dic=Buffer::current_dictionary.toLatin1(); pChecker = new Hunspell(aff,dic); } else spell_dic=""; QFileInfo fi(SpellDic); if (!(fi.exists() && fi.isReadable())){ delete pChecker; pChecker=0; } // get user config dictionary QString filePath=Buffer::current_dictionary; fi=QFileInfo(filePath); if (fi.exists() && fi.isReadable()){ pChecker->add_dic(filePath.toLatin1()); } else filePath=""; return (spell_dic!=""); } void SpellTextEdit::createActions() { for (int i = 0; i < MaxWords; ++i) { misspelledWordsActs[i] = new QAction(this); misspelledWordsActs[i]->setVisible(false); connect(misspelledWordsActs[i], SIGNAL(triggered()), this, SLOT(correctWord())); } } void SpellTextEdit::correctWord() { QAction *action = qobject_cast(sender()); if (action) { QString replacement = action->text(); QTextCursor cursor = cursorForPosition(lastPos); //QTextCursor cursor = textCursor(); QString zeile = cursor.block().text(); cursor.select(QTextCursor::WordUnderCursor); cursor.deleteChar(); cursor.insertText(replacement); } } void SpellTextEdit::contextMenuEvent(QContextMenuEvent *event) { QIcon add(":/icons/add.png"); QIcon ignore(":/icons/delete.png"); QIcon swap(":/icons/spell_swap.png"); QMenu *menu = createStandardContextMenu(); lastPos=event->pos(); QTextCursor cursor = cursorForPosition(lastPos); QString zeile = cursor.block().text(); int pos = cursor.columnNumber(); int end = zeile.indexOf(QRegExp("\\W+"),pos); int begin = zeile.lastIndexOf(QRegExp("\\W+"),pos); zeile=zeile.mid(begin+1,end-begin-1); QStringList liste = getWordPropositions(zeile); if (!liste.isEmpty()) { menu->addSeparator(); QAction *a; a = menu->addAction(add, tr("Add word"), this, SLOT(slot_addWord())); a = menu->addAction(ignore, tr("Ignore all"), this, SLOT(slot_ignoreWord())); menu->addSeparator(); //menu->addAction(tr("Suggestions:")); for (int i = 0; i < qMin(int(MaxWords),liste.size()); ++i) { misspelledWordsActs[i]->setText(liste.at(i).trimmed()); misspelledWordsActs[i]->setVisible(true); misspelledWordsActs[i]->setIcon(swap); menu->addAction(misspelledWordsActs[i]); } } // else // { // // let the user add the word if it's mispelled but not already in dict. ***BROKEN, DO NOT USE*** // QByteArray encodedString; // QString spell_encoding=QString(pChecker->get_dic_encoding()); // QTextCodec *codec = QTextCodec::codecForName(spell_encoding.toLatin1()); // encodedString = codec->fromUnicode(cursor.block().text()); // int check = pChecker->spell(zeile.toLatin1()); // bool pass(check); // if(pass){ // QAction *a; // menu->addSeparator(); // a = menu->addAction(add, tr("Add word"), this, SLOT(slot_addWord())); // a = menu->addAction(ignore, tr("Ignore all"), this, SLOT(slot_ignoreWord())); // menu->addSeparator(); // menu->addAction("No spelling suggestions"); // } // } // if misspelled menu->exec(event->globalPos()); delete menu; } QStringList SpellTextEdit::getWordPropositions(const QString word) { QStringList wordList; if(pChecker){ QByteArray encodedString; QString spell_encoding=QString(pChecker->get_dic_encoding()); QTextCodec *codec = QTextCodec::codecForName(spell_encoding.toLatin1()); encodedString = codec->fromUnicode(word); bool check = pChecker->spell(encodedString.data()); if(!check){ char ** wlst; int ns = pChecker->suggest(&wlst,encodedString.data()); if (ns > 0) { for (int i=0; i < ns; i++) { wordList.append(codec->toUnicode(wlst[i])); //free(wlst[i]); } //free(wlst); pChecker->free_list(&wlst, ns); }// if ns >0 }// if check } return wordList; } void SpellTextEdit::slot_addWord() { QTextCursor cursor = cursorForPosition(lastPos); QString zeile = cursor.block().text(); int pos = cursor.columnNumber(); int end = zeile.indexOf(QRegExp("\\W+"),pos); int begin = zeile.left(pos).lastIndexOf(QRegExp("\\W+"),pos); zeile=zeile.mid(begin+1,end-begin-1); QByteArray encodedString; QString spell_encoding=QString(pChecker->get_dic_encoding()); QTextCodec *codec = QTextCodec::codecForName(spell_encoding.toLatin1()); encodedString = codec->fromUnicode(zeile); pChecker->add(encodedString.data()); addedWords.append(zeile); emit addWord(zeile); } void SpellTextEdit::slot_ignoreWord() { QTextCursor cursor = cursorForPosition(lastPos); QString zeile = cursor.block().text(); int pos = cursor.columnNumber(); int end = zeile.indexOf(QRegExp("\\W+"),pos); int begin = zeile.left(pos).lastIndexOf(QRegExp("\\W+"),pos); zeile=zeile.mid(begin+1,end-begin-1); QByteArray encodedString; QString spell_encoding=QString(pChecker->get_dic_encoding()); QTextCodec *codec = QTextCodec::codecForName(spell_encoding.toLatin1()); encodedString = codec->fromUnicode(zeile); pChecker->add(encodedString.data()); emit addWord(zeile); } robojournal-0.4.2/ui/configurationmysql.cpp0000775000175000017500000000414312142060704017632 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "configurationmysql.h" #include "ui_configurationmysql.h" #include "core/buffer.h" #include "ui/newconfig.h" ConfigurationMySQL::ConfigurationMySQL(QWidget *parent) : QWidget(parent), ui(new Ui::ConfigurationMySQL) { ui->setupUi(this); PopulateForm(); } ConfigurationMySQL::~ConfigurationMySQL() { delete ui; } void ConfigurationMySQL::on_DefaultPort_clicked() { ui->Port->setText("3306"); ui->DefaultPort->setDisabled(true); } void ConfigurationMySQL::on_Port_textChanged(const QString &arg1) { if(arg1 != "3306"){ ui->DefaultPort->setDisabled(false); } else{ ui->DefaultPort->setDisabled(true); } } void ConfigurationMySQL::PopulateForm(){ ui->Username->setText(Buffer::defaultuser); ui->DefaultHost->setText(Buffer::defaulthost); ui->Port->setText(QString::number(Buffer::databaseport)); ui->Database->setText(Buffer::defaultdatabase); ui->AllowRoot->setChecked(Buffer::allowroot); } void ConfigurationMySQL::GetChanges(){ Newconfig::new_default_user=ui->Username->text(); Newconfig::new_default_db=ui->Database->text(); Newconfig::new_default_host=ui->DefaultHost->text(); Newconfig::new_default_port=ui->Port->text(); Newconfig::new_allow_root=ui->AllowRoot->isChecked(); } robojournal-0.4.2/ui/journalcreator.ui0000775000175000017500000002550212142060704016564 0ustar willwill JournalCreator 0 0 398 355 Journal Creator :/icons/database_add.png:/icons/database_add.png 0 1. Journal Type 6 Choose new journal database type SQLite (recommended) MySQL (advanced users) 2. Basic Settings 6 Define the essential parameters of your new journal: true Journal name Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter This is the name that will identify this journal on the host. Journal host Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter This is the machine on which the journal will be created. If the field is left blank the journal is created on this computer. localhost Username Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter This is the user that will be associated with this journal. If User already exists, this journal will be added to the group that this user controls. Password Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter QLineEdit::Password Repeat Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter QLineEdit::Password Passwords do not match Qt::Vertical QSizePolicy::Expanding 20 20 Qt::Vertical QSizePolicy::Preferred 20 4 3. Authentication 6 <p>RoboJournal requires root access to your MySQL installation to create the database and set up your new user account. Without the correct root password, the journal creation process will fail.</p> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter true Root password QLineEdit::Password Port Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Vertical 20 27 Qt::Vertical QSizePolicy::Fixed 20 10 <P>If checked, this setting will instruct RoboJournal's configuration process to use this journal as the default. If this is the first time you have used RoboJournal, this option will be required since there are no other journals to use in that situation. </p> Set this new journal as my default Qt::Vertical QSizePolicy::Fixed 20 4 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok false robojournal-0.4.2/ui/tagreminder.ui0000775000175000017500000001431112142060704016027 0ustar willwill TagReminder 0 0 460 388 Dialog true <p>RoboJournal has found that some of your entries have never been tagged before. You should resolve this issue now because untagged entries are invisible to tag searches. </p> <p>Click the <span style=" font-weight:600;">Close</span> button to ignore this message <span style=" font-style:italic;">or</span> select an entry from the following list and click the <span style=" font-weight:600;">Manage Tags </span>button to continue:</p> true Qt::Vertical QSizePolicy::Fixed 20 5 false true true true true 1 Qt::Vertical QSizePolicy::Fixed 20 5 X entries need to be tagged Qt::Horizontal 228 20 &Manage Tags :/icons/tag_orange.png:/icons/tag_orange.png Qt::Vertical QSizePolicy::Fixed 20 5 <p>Uncheck this box to <em>permanently</em> suppress the Tag Reminder window. Once disabled, the feature may be re-enabled through RoboJournal Preferences if necessary. </p> &Display this notification during the next login (if necessary) true Qt::Vertical QSizePolicy::Fixed 20 10 Qt::Horizontal Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() TagReminder accept() 248 254 157 274 buttonBox rejected() TagReminder reject() 316 260 286 274 robojournal-0.4.2/ui/dblogin.ui0000775000175000017500000001527212142060704015153 0ustar willwill DBLogin 0 0 264 314 Dialog :/icons/robojournal-icon.png:/icons/robojournal-icon.png Database Settings Use default &host/database Host Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:9pt;">Enter the domain or IP address of the server on which your journal database is stored. (e.g. example.com or 173.203.204.123) If the database is stored on this machine, type </span><span style=" font-family:'Sans'; font-size:9pt; font-style:italic;">localhost</span><span style=" font-family:'Sans'; font-size:9pt;"> in this field.</span></p></body></html> Database <p>Enter the name of the Database you want to connect to on <b>Host</b>.</p> User Settings false false Use default &user account Username Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter <p>Enter the username that you want to use to connect to <b>Database</b>@<b>Host</b>.</p> Password Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter <p>Enter the password that goes with <b>Username</b>.</p> QLineEdit::Password Qt::Vertical QSizePolicy::Expanding 20 14 Qt::Horizontal Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() DBLogin accept() 248 254 157 274 buttonBox rejected() DBLogin reject() 316 260 286 274 robojournal-0.4.2/ui/highlighter.cpp0000775000175000017500000002002312142060704016166 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2013 by Will Kraft . MADE IN USA Will Kraft (11/27/12): This code was originally Jan Sundermeyer's work (sunderme@web.de) I made some minor changes and adapted it for RoboJournal >= 0.4. RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ /**************************************************************************** ** ORIGINAL HEADER: ** ** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. ** ** This file is part of the example classes of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License versions 2.0 or 3.0 as published by the Free Software ** Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Alternatively you may (at ** your option) use any later version of the GNU General Public ** License if such license has been publicly approved by Trolltech ASA ** (or its successors, if any) and the KDE Free Qt Foundation. In ** addition, as a special exception, Trolltech gives you certain ** additional rights. These rights are described in the Trolltech GPL ** Exception version 1.1, which can be found at ** http://www.trolltech.com/products/qt/gplexception/ and in the file ** GPL_EXCEPTION.txt in this package. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. If ** you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** In addition, as a special exception, Trolltech, as the sole ** copyright holder for Qt Designer, grants users of the Qt/Eclipse ** Integration plug-in the right for the Qt/Eclipse Integration to ** link to functionality provided by Qt Designer and its related ** libraries. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not expressly ** granted herein. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ // Will Kraft (11/27/12): This code was originally Jan Sundermeyer's work. I made some minor changes // and adapted it for RoboJournal > =0.4. #include #include #include "ui/highlighter.h" #include "core/buffer.h" Highlighter::Highlighter(QTextDocument *parent,QString SpellDic,bool spellCheckState) : QSyntaxHighlighter(parent) { HighlightingRule rule; spellCheckFormat.setUnderlineColor(QColor(Qt::red)); spellCheckFormat.setUnderlineStyle(QTextCharFormat::SpellCheckUnderline); //Settings for online spellchecking if(!SpellDic.isEmpty()){ //mWords.clear(); spell_dic=SpellDic.left(SpellDic.length()-4); pChecker = new Hunspell(Buffer::current_dictionary_aff.toLatin1(),Buffer::current_dictionary.toLatin1()); spell_encoding=QString(pChecker->get_dic_encoding()); codec = QTextCodec::codecForName(spell_encoding.toLatin1()); QFileInfo fi(SpellDic); if (fi.exists() && fi.isReadable()) spellCheckActive=true; else spellCheckActive=false; // get user config dictionary QString filePath=Buffer::current_dictionary; //std::cout << qPrintable(filePath) << std::endl; fi=QFileInfo(filePath); if (fi.exists() && fi.isReadable()){ pChecker->add_dic(filePath.toLatin1()); } else filePath=""; } else spellCheckActive=false; spellerError=!spellCheckActive; spellCheckActive=spellCheckActive && spellCheckState; } Highlighter::~Highlighter() { delete pChecker; } void Highlighter::highlightBlock(const QString &text) { spellCheck(text); } void Highlighter::enableSpellChecking(const bool state) { bool old=spellCheckActive; if(!spellerError) spellCheckActive=state; if(old!=spellCheckActive) rehighlight(); } void Highlighter::spellCheck(const QString &text) { if (spellCheckActive) { // split text into words QString str = text.simplified(); if (!str.isEmpty()) { // Will Kraft 11/27/12: this is Jan's old regex for Checkliste: ([^\\w,^\\\\]|(?=\\\\))+ // I had to change the regexp because it was flagging contractions (didn't, couldn't, etc.) QStringList Checkliste = str.split(QRegExp("([^\\w,^\\\\,']|(?=\\\\))+"), QString::SkipEmptyParts); int l,number; // check all words for (int i=0; i1 &&!str.startsWith('\\')) { if (!checkWord(str)) { number = text.count(QRegExp("\\b" + str + "\\b")); l=-1; // underline all incorrect occurences of misspelled word for (int j=0;j < number; ++j) { l = text.indexOf(QRegExp("\\b" + str + "\\b"),l+1); if (l>=0) setFormat(l, str.length(), spellCheckFormat); } // for j } // if spell chek error } // if str.length > 1 } // for } // if str.isEmpty } // initial check } bool Highlighter::checkWord(QString word) { int check; /*switch(check=mWords.value(word,-1)){ case -1: { QByteArray encodedString; encodedString = codec->fromUnicode(word); check = pChecker->spell(encodedString.data()); mWords[word]=check; break; } default: break; } */ QByteArray encodedString; encodedString = codec->fromUnicode(word); check = pChecker->spell(encodedString.data()); return bool(check); } bool Highlighter::setDict(const QString SpellDic) { bool spell; if(SpellDic!=""){ //mWords.clear(); spell_dic=SpellDic.left(SpellDic.length()-4); delete pChecker; pChecker = new Hunspell(Buffer::current_dictionary_aff.toLatin1(),Buffer::current_dictionary.toLatin1()); spell_encoding=QString(pChecker->get_dic_encoding()); codec = QTextCodec::codecForName(spell_encoding.toLatin1()); QFileInfo fi(SpellDic); if (fi.exists() && fi.isReadable()) spell=true; else spell=false; // get user config dictionary QString filePath=Buffer::current_dictionary; //std::cout << qPrintable(filePath) << std::endl; fi=QFileInfo(filePath); if (fi.exists() && fi.isReadable()){ pChecker->add_dic(filePath.toLatin1()); } else filePath=""; spellCheckFormat.setForeground(Qt::red);//faster Cursoroperation ... //spellCheckFormat.setUnderlineColor(QColor(Qt::red)); //spellCheckFormat.setUnderlineStyle(QTextCharFormat::SpellCheckUnderline); } else spell=false; spellerError=!spell; spellCheckActive=spellCheckActive && spell; rehighlight(); return spell; } void Highlighter::slot_addWord(QString word) { //std::cout << qPrintable(word) << std::endl; QByteArray encodedString; QString spell_encoding=QString(pChecker->get_dic_encoding()); QTextCodec *codec = QTextCodec::codecForName(spell_encoding.toLatin1()); encodedString = codec->fromUnicode(word); pChecker->add(encodedString.data()); rehighlight(); } robojournal-0.4.2/ui/configurationjournal.ui0000775000175000017500000004306212142060704017775 0ustar willwill ConfigurationJournal 0 0 361 585 Form Entry Settings and Range Show &all entries in the journal Qt::Vertical QSizePolicy::Fixed 20 6 Qt::Horizontal QSizePolicy::Fixed 20 20 <b>OR</b> show entries from the last Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Year 2 years 3 years 4 years 5 years 6 years 7 years 8 years 9 years 10 years Show year range &indicator on status bar Qt::Vertical QSizePolicy::Fixed 20 6 Select entry node icon Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Pencil #1 (original) :/icons/pencil.png:/icons/pencil.png Pencil #2 :/icons/pencil2.png:/icons/pencil2.png Small pencil :/icons/pencil-small.png:/icons/pencil-small.png Speech balloon :/icons/balloon-quotation.png:/icons/balloon-quotation.png Node :/icons/node.png:/icons/node.png Black bullets :/icons/bullet_black.png:/icons/bullet_black.png Blue bullets :/icons/bullet_blue.png:/icons/bullet_blue.png User Information Your full name (as you would like it to appear): Qt::Vertical QSizePolicy::Fixed 20 6 Select your gender: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Horizontal QSizePolicy::Fixed 10 20 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use male avatar icon: <img src=":/icons/user.png" /></p></body></html> &Male Qt::Horizontal QSizePolicy::Fixed 20 20 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use female avatar icon: <img src=":/icons/user-female2.png" /></p></body></html> &Female Qt::Horizontal 40 20 Highlighting <p>If selected, this option causes RoboJournal to <span style="background: yellow; color: black">highlight</span> the current search term (with a color from the list below) wherever it appears in the text. Highlighting makes it <i>much</i> easier to find instances of the current search term in the entry you are currently viewing.</p> &Highlight current search term Select highlight color Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Yellow (default) :/icons/highlight_yellow'.png:/icons/highlight_yellow'.png Orange :/icons/highlight-orange.png:/icons/highlight-orange.png Pink :/icons/highlight-pink.png:/icons/highlight-pink.png Green :/icons/highlight-green.png:/icons/highlight-green.png Cyan :/icons/highlight-cyan.png:/icons/highlight-cyan.png Purple :/icons/highlight-purple.png:/icons/highlight-purple.png Behavior <p>This setting is recommended if you frequently write more than once per day because it conveniently groups all entries made on the same day. Default behavior is to sort entries by month instead.</p> &Group journal entries by day Show &title for current journal entry Display most &recent entry automatically If checked, RoboJournal displays your full name in the entry pane header. Display full &name (instead of username) Qt::Vertical 20 40 robojournal-0.4.2/ui/configurationgeneral.h0000775000175000017500000000247512142060704017555 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef CONFIGURATIONGENERAL_H #define CONFIGURATIONGENERAL_H #include namespace Ui { class ConfigurationGeneral; } class ConfigurationGeneral : public QWidget { Q_OBJECT public: explicit ConfigurationGeneral(QWidget *parent = 0); ~ConfigurationGeneral(); void GetChanges(); private slots: void on_DateFormat_currentIndexChanged(int index); private: Ui::ConfigurationGeneral *ui; void DateExample(int index); void PopulateForm(); }; #endif // CONFIGURATIONGENERAL_H robojournal-0.4.2/ui/aboutrj.h0000644000175000017500000000207512211723646015015 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef ABOUTRJ_H #define ABOUTRJ_H #include namespace Ui { class AboutRJ; } class AboutRJ : public QDialog { Q_OBJECT public: explicit AboutRJ(QWidget *parent = 0); ~AboutRJ(); private slots: void on_buttonBox_accepted(); private: Ui::AboutRJ *ui; }; #endif // ABOUTRJ_H robojournal-0.4.2/ui/newconfig.h0000644000175000017500000001102212211723646015316 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #ifndef NEWCONFIG_H #define NEWCONFIG_H #include #include #include "core/settingsmanager.h" #include "ui/configurationgeneral.h" #include "ui_configurationgeneral.h" #include "ui/configurationjournal.h" #include "ui_configurationjournal.h" #include "ui/configurationmysql.h" #include "ui_configurationmysql.h" #include "ui/configurationappearance.h" #include "ui_configurationappearance.h" #include "ui/configurationeditor.h" #include "ui_configurationeditor.h" #include "ui/configurationexport.h" #include "ui_configurationexport.h" #include #include namespace Ui { class Newconfig; } class Newconfig : public QDialog { Q_OBJECT public: explicit Newconfig(QWidget *parent = 0); ~Newconfig(); bool MadeChanges; // new default settings that can be called from any class through Config::$var. // These should be null unless initiated elsewhere. // even bools and ints should be treated as QStrings b/c they are written to a config file for later use. static QString new_default_host; static QString new_default_user; static QString new_default_db; static QString new_default_port; static bool new_always_use_defaults; static bool new_show_confirm; static QString new_dbtype; static bool new_allow_root; static int new_entry_range; static bool new_show_all_entries; static int new_toolbar_pos; static bool new_sort_by_day; static bool new_use_spellcheck; static QString new_current_dictionary; static QString new_current_dictionary_aff; // new for version 0.2 static bool new_alternate_rows; static bool new_rich_text; static bool new_use_background; static bool new_use_custom_theme; static QString new_text_hexcolor; static QString new_background_image; static bool new_show_title; static QString new_font_face; static int new_font_size; static int new_date_mode; static bool new_tile_bg; static bool new_use_background_in_tree; static bool new_record_time; static bool new_use_local_time; static bool new_24_hr; static bool new_icon_labels; static bool new_autoload; static bool new_SSL; static bool new_indicator; static bool new_datebox_override; static bool new_use_full_name; static bool new_use_highlights; static bool new_trim_whitespace; static bool new_use_smart_quotes; static bool new_use_html_hyphens; static bool new_bg_is_fixed; static bool new_gender_is_male; static bool new_use_rounded_corners; static bool new_use_system_colors; static bool new_include_tags_in_export; static bool new_header_use_em; static bool new_body_use_em; static bool new_show_spell_errors_by_default; static QString new_header_font; static QString new_body_font; static QString new_body_font_size; static QString new_header_font_size; static QString new_full_name; static int new_highlight_color; static bool new_use_custom_theme_editor; static int new_entry_node_icon; static bool new_use_dow; static bool new_use_misc_processing; //new for 0.4.1 static bool new_name_in_titlebar; static bool new_show_untagged_reminder; private slots: void on_Categories_currentItemChanged(QTreeWidgetItem *current); void on_buttonBox_accepted(); void resizeEvent(QResizeEvent *); private: Ui::Newconfig *ui; enum Role { Role_IsSeparator = Qt::UserRole }; void PrimaryConfig(); void LoadData(); void UpdateData(); ConfigurationGeneral *g; ConfigurationJournal *j; ConfigurationMySQL *m; ConfigurationAppearance *a; ConfigurationEditor *e; ConfigurationExport *x; QStackedWidget *stack; QSize newsize; bool startup; }; #endif // NEWCONFIG_H robojournal-0.4.2/ui/newconfig.cpp0000644000175000017500000002365112211723646015664 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/newconfig.h" #include "ui_newconfig.h" #include #include #include #include "ui/configurationgeneral.h" #include "ui_configurationgeneral.h" #include "ui/configurationjournal.h" #include "ui_configurationjournal.h" #include "ui/configurationmysql.h" #include "ui_configurationmysql.h" #include "ui/configurationappearance.h" #include "ui_configurationappearance.h" #include "ui/configurationeditor.h" #include "ui_configurationeditor.h" #include "ui/configurationexport.h" #include "ui_configurationexport.h" #include #include "core/buffer.h" #include #include #include Newconfig::Newconfig(QWidget *parent) : QDialog(parent), ui(new Ui::Newconfig) { ui->setupUi(this); startup=true; // setup form PrimaryConfig(); } Newconfig::~Newconfig() { delete ui; } // new default settings that can be called from any class through Config::$var. // These should be null unless initiated elsewhere. // even bool Newconfig::s and ints should be treated as QStrings b/c they are written to a config file for later use. QString Newconfig::new_default_host; QString Newconfig::new_default_user; QString Newconfig::new_default_db; QString Newconfig::new_default_port; bool Newconfig::new_always_use_defaults; bool Newconfig::new_show_confirm; QString Newconfig::new_dbtype; bool Newconfig::new_allow_root; int Newconfig::new_entry_range; bool Newconfig::new_show_all_entries; int Newconfig::new_toolbar_pos; bool Newconfig::new_sort_by_day; // new for version 0.2 bool Newconfig::new_alternate_rows; bool Newconfig::new_rich_text; bool Newconfig::new_use_background; bool Newconfig::new_use_custom_theme; QString Newconfig::new_text_hexcolor; QString Newconfig::new_background_image; bool Newconfig::new_show_title; QString Newconfig::new_font_face; int Newconfig::new_font_size; int Newconfig::new_date_mode; bool Newconfig::new_tile_bg; bool Newconfig::new_use_background_in_tree; bool Newconfig::new_record_time; bool Newconfig::new_use_local_time; bool Newconfig::new_24_hr; bool Newconfig::new_icon_labels; bool Newconfig::new_autoload; bool Newconfig::new_SSL; bool Newconfig::new_indicator; bool Newconfig::new_datebox_override; bool Newconfig::new_use_full_name; bool Newconfig::new_use_highlights; bool Newconfig::new_trim_whitespace; bool Newconfig::new_use_smart_quotes; bool Newconfig::new_use_html_hyphens; bool Newconfig::new_bg_is_fixed; bool Newconfig::new_gender_is_male; bool Newconfig::new_use_rounded_corners; bool Newconfig::new_use_system_colors; bool Newconfig::new_include_tags_in_export; bool Newconfig::new_header_use_em; bool Newconfig::new_body_use_em; QString Newconfig::new_header_font; QString Newconfig::new_body_font; QString Newconfig::new_body_font_size; QString Newconfig::new_header_font_size; QString Newconfig::new_full_name; int Newconfig::new_highlight_color; bool Newconfig::new_use_custom_theme_editor; bool Newconfig::new_show_spell_errors_by_default; bool Newconfig::new_use_spellcheck; QString Newconfig::new_current_dictionary; QString Newconfig::new_current_dictionary_aff; int Newconfig::new_entry_node_icon; bool Newconfig::new_use_dow; bool Newconfig::new_use_misc_processing; // new for 0.4.1 bool Newconfig::new_name_in_titlebar; bool Newconfig::new_show_untagged_reminder; //################################################################################## // This function sets up the form (creates categories for list, etc.) void Newconfig::PrimaryConfig(){ using namespace std; // hide question mark button in title bar when running on Windows this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); // int width=this->width(); // int height=this->height(); // this->setMaximumSize(width,height); // this->setMinimumSize(width,height); // set up category list (icons and entries) QIcon general(":/icons/application.png"); QIcon behavior(":/icons/book.png"); QIcon editor(":/icons/ui-text-area.png"); QIcon appearance(":/icons/picture.png"); QIcon disk(":/icons/external.png"); QIcon mysql(":/icons/mysql_icon2.png"); ui->Categories->clear(); // Set vertical spacing for Category Items QSize space(0,25); QTreeWidgetItem *settings_general = new QTreeWidgetItem(ui->Categories); settings_general->setIcon(0, general); settings_general->setText(0,"General"); settings_general->setSizeHint(0,space); QTreeWidgetItem *settings_behavior = new QTreeWidgetItem(ui->Categories); settings_behavior->setIcon(0, behavior); settings_behavior->setText(0,"Journal"); settings_behavior->setSizeHint(0,space); QTreeWidgetItem *settings_editor = new QTreeWidgetItem(ui->Categories); settings_editor->setIcon(0, editor); settings_editor->setText(0,"Editor"); settings_editor->setSizeHint(0,space); QTreeWidgetItem *settings_appearance = new QTreeWidgetItem(ui->Categories); settings_appearance->setIcon(0, appearance); settings_appearance->setText(0,"Appearance"); settings_appearance->setSizeHint(0,space); QTreeWidgetItem *settings_export = new QTreeWidgetItem(ui->Categories); settings_export->setIcon(0, disk); settings_export->setText(0,"Export Settings"); settings_export->setSizeHint(0,space); QTreeWidgetItem *settings_mysql = new QTreeWidgetItem(ui->Categories); settings_mysql->setIcon(0, mysql); settings_mysql->setText(0,"MySQL Settings"); settings_mysql->setSizeHint(0,space); // Create a StackedWidget. The stack holds all the "pages" and (most importantly) remembers the current state of each. // The stack shows only one page at a time. When an item in the category list (General, Journal, etc.) is clicked // on, the stack loads the page associated with that category. // Special thanks to the Clementine source code for helping me figure out how to do this. stack=new QStackedWidget(this); // Instantiate the pages when they get added to the stack. This allows each one to be independently sized. // Otherwise, all the pages inherit the same size as the longest one. (producing uneeded scrollbars) stack->addWidget(g=new ConfigurationGeneral(this)); stack->addWidget(j=new ConfigurationJournal(this)); stack->addWidget(e=new ConfigurationEditor(this)); stack->addWidget(a=new ConfigurationAppearance(this)); stack->addWidget(x=new ConfigurationExport(this)); stack->addWidget(m=new ConfigurationMySQL(this)); // put the stack in the ScrollArea. ui->PageArea->setWidget(stack); ui->PageArea->setWidgetResizable(true); ui->PageArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->PageArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); ui->Categories->setCurrentItem(settings_general); // Fix bug where a scrollbar appears on pages that don't need it. This code tells the stack that it's ok // to have different-sized widgets. The loop should start on Widget 1 because Widget 0 can have a squished // appearance if we set its size policy to ignore. for(int i=1; icount(); i++){ stack->setCurrentIndex(i); stack->currentWidget()->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); adjustSize(); } // Ensure the General Widget is visible when window opens. stack->setCurrentIndex(0); // restore window size from previous session bool usetemp=!Buffer::config_temporarysize.isEmpty(); cout << " Temporary size is valid : " << usetemp << endl; if(usetemp && startup){ resize(Buffer::config_temporarysize); } else{ resize(Buffer::config_geometry); } startup=false; } void Newconfig::resizeEvent(QResizeEvent *){ if(!startup){ Buffer::config_temporarysize=this->size(); Buffer::config_sizechanged=true; } } void Newconfig::on_Categories_currentItemChanged(QTreeWidgetItem *current) { int idx=ui->Categories->currentIndex().row(); QString category=current->text(0); this->setWindowTitle("Preferences -- " + category); if (stack->currentWidget() != 0) { stack->currentWidget()->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); } stack->setCurrentIndex(idx); stack->currentWidget()->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // Have the window keep its current size when we change pages resize(this->size()); // Although the window gets resized, a page change should NOT count as a resize event. // This fixes a bug which causes the Editor to revert to its default 640x480 size if the // user changes too many pages. For some reason, the size is not being saved here // so it's better to ignore these resize events. //Buffer::config_sizechanged=false; } void Newconfig::UpdateData(){ // fetch new form data from each page g->GetChanges(); j->GetChanges(); e->GetChanges(); a->GetChanges(); x->GetChanges(); m->GetChanges(); MadeChanges=true; // update the settings SettingsManager sm; sm.UpdateConfig(); } void Newconfig::on_buttonBox_accepted() { UpdateData(); } robojournal-0.4.2/ui/journalcreator.cpp0000644000175000017500000002561312211723646016737 0ustar willwill/* This file is part of RoboJournal. Copyright (c) 2012 by Will Kraft . MADE IN USA RoboJournal 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. RoboJournal 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 RoboJournal. If not, see . */ #include "ui/journalcreator.h" #include "ui_journalcreator.h" #include #include #include "sql/mysqlcore.h" #include "core/buffer.h" #include "core/settingsmanager.h" #include #include "ui/firstrun.h" #include "ui_firstrun.h" JournalCreator::JournalCreator(QWidget *parent) : QDialog(parent), ui(new Ui::JournalCreator) { ui->setupUi(this); #ifdef unix QIcon unixicon(":/icons/robojournal-icon.png"); this->setWindowIcon(unixicon); #endif int width=this->width(); int height=this->height(); this->setMaximumSize(width,height); this->setMinimumSize(width,height); // hide question mark button in title bar when running on Windows this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); PrimaryConfig(); } JournalCreator::~JournalCreator() { delete ui; } // Validate Form when OK is clicked bool JournalCreator::Validate(){ bool hasJournalname=true; bool hasHostname=true; bool hasUsername=true; bool hasRoot=true; bool hasPort=true; // this involves checking to make sure that all fields are filled in properly. // if all the bools return true, then the form is valid if(ui->JournalName->text().isEmpty()){ QMessageBox b; b.critical(this,"RoboJournal","You must provide a name for this journal!"); ui->TabBox->setCurrentIndex(1); ui->JournalName->setFocus(); hasJournalname=false; } if(ui->Hostname->text().isEmpty() && ui->Hostname->placeholderText().isEmpty()){ QMessageBox b; b.critical(this,"RoboJournal","You must specify a hostname! (e.g. localhost)"); ui->TabBox->setCurrentIndex(1); ui->Hostname->setFocus(); hasHostname=false; } if(ui->Username->text().isEmpty()){ QMessageBox b; b.critical(this,"RoboJournal","You must specify a username!"); ui->TabBox->setCurrentIndex(1); ui->Username->setFocus(); hasUsername=false; } if(ui->rootPassword->text().isEmpty()){ QMessageBox b; QString host=ui->Hostname->text(); if(ui->Hostname->text().isEmpty()){ host="localhost"; } b.critical(this,"RoboJournal","You must provide the MySQL root password for " + host + "!"); ui->TabBox->setCurrentIndex(2); ui->rootPassword->setFocus(); hasRoot=false; } if(ui->Port->text().isEmpty()){ QMessageBox b; QString host=ui->Hostname->text(); if(ui->Hostname->text().isEmpty()){ host="localhost"; } b.critical(this,"RoboJournal","You must specify the correct port for MySQL on " + host + "!"); ui->TabBox->setCurrentIndex(2); ui->Port->setFocus(); hasPort=false; } bool valid=false; if(hasJournalname && hasHostname && hasUsername && hasRoot && hasPort){ valid=true; } else{ valid=false; } return valid; } void JournalCreator::PrimaryConfig(){ ShowDescription(1); ui->DBType->setCurrentIndex(1); // check for firstrun and force certain options if true if(Buffer::firstrun){ ui->UseAsDefault->setDisabled(true); ui->UseAsDefault->setChecked(true); } //ui->Authentication->setHidden(true); //ui->Authentication->setDisabled(true); //ui->BasicSettings->setDisabled(true); // disable the ok button when the form loads QPushButton *okButton=ui->buttonBox->button(QDialogButtonBox::Ok); okButton->setEnabled(false); ui->MatchNotify->clear(); // for now, disable other options until SQLite module is finished ui->DBType->setDisabled(true); } // Journal creation function is called if Validate() returns TRUE void JournalCreator::CreateJournal(){ using namespace std; bool valid=Validate(); // only create database if validation returns true if(valid){ QString host; if(ui->Hostname->text()==NULL){ host=ui->Hostname->placeholderText(); } else{ host=ui->Hostname->text(); } //cout << host.toStdString(); QString newuser=ui->Username->text(); QString db_name=ui->JournalName->text(); QString root_pass=ui->rootPassword->text(); QString newuser_pass=ui->Password->text(); QString port=ui->Port->text(); // mysql mode if(ui->DBType->currentIndex()==1){ MySQLCore m; bool success=m.CreateDatabase(host,root_pass,db_name,port,newuser,newuser_pass); QMessageBox m2; if(success){ m2.information(this,"RoboJournal", "The journal " + db_name + " has been successfully created on " + host + ". You may now access this journal with the password you set up for user " + newuser + ".

    Click Connect on the main window to start working with " "your new journal."); // Post-setup: Create configuration file with new values if option is checked if(ui->UseAsDefault->isChecked()){ SettingsManager sm; sm.NewConfig(host,db_name,port,newuser); } // clear firstrun flag and close the firstrun form Buffer::firstrun=false; this->close(); } else{ m2.critical(this,"RoboJournal", "Journal creation attempt failed on " + host + ". Please make sure the root password is" " correct and the host is configured properly and then try again."); } } // SQLite block goes here when finished } } // check to see if the passwords match void JournalCreator::PasswordMatch(){ if((ui->Password->text() == ui->Password2->text()) && (ui->Password->text().length() > 0)){ ui->MatchNotify->setText("Passwords match"); ui->MatchNotify->setStyleSheet("color: green"); QPushButton *okButton=ui->buttonBox->button(QDialogButtonBox::Ok); okButton->setEnabled(true); } else{ ui->MatchNotify->setStyleSheet("color: red"); if(ui->Password->text().length()==0 && ui->Password2->text().length()==0){ ui->MatchNotify->setText("Passwords are too short"); } else{ ui->MatchNotify->setText("Passwords do not match"); } QPushButton *okButton=ui->buttonBox->button(QDialogButtonBox::Ok); okButton->setEnabled(false); } } // Fill in some slots based on system values. User can change these later if they want void JournalCreator::FillIn(){ ui->Port->setText("3306"); // get username from OS and truncate whitespace QString sysuser=getenv("USERNAME"); if(sysuser.isEmpty()){ sysuser=getenv("USER"); } // bugfix to prevent username from coming up blank on linux systems #ifdef unix sysuser=getenv("USER"); #endif sysuser=sysuser.trimmed(); sysuser=sysuser.replace(" ","_"); sysuser=sysuser.toLower(); ui->Username->setText(sysuser); ui->JournalName->setText(sysuser + "_journal"); ui->MatchNotify->setText("Passwords do not match"); ui->MatchNotify->setStyleSheet("color: red"); } // Clear values when necessary void JournalCreator::Clear(){ ui->Hostname->clear(); ui->Password->clear(); ui->Password2->clear(); ui->JournalName->clear(); ui->rootPassword->clear(); ui->Port->clear(); ui->Username->clear(); ui->MatchNotify->clear(); } void JournalCreator::ShowDescription(int index){ switch(index){ case 0: ui->Description->setHtml("SQLite is a lightweight database that is ideal " "for new users or those not very familiar with database management. SQLite databases are stored on this " "computer as files and can be easily backed up or replicated. Unlike MySQL, no background process is " "required to use SQLite on this machine.

    The SQLite journal creation process is automated and requires" " no additional input. Click OK to continue."); break; case 1: ui->Description->setHtml("MySQL is a database solution that is renowned for scalability and power, " "yet is still fairly easy to configure and use. Journals made from MySQL databases can be stored on remote " "servers or on the local computer. Keep in mind that running a MySQL database " "on your computer requires that you run a MYSQL sever instance as well. (unlike SQLite which is entirely self-contained) " "

    If you want to store your journal on a remote system, you must know how to configure the MySQL process on that machine " "to accept remote connections or you will not be able to connect. Because of these required skills, new users or those not " "familiar with database administration should not use MySQL."); break; } } void JournalCreator::on_DBType_currentIndexChanged(int index) { ShowDescription(index); if(index==0){ ui->Authentication->setDisabled(true); ui->BasicSettings->setDisabled(true); Clear(); } else{ ui->Authentication->setEnabled(true); ui->BasicSettings->setEnabled(true); FillIn(); } } void JournalCreator::on_Password2_textChanged() { PasswordMatch(); } void JournalCreator::on_Password_textChanged() { PasswordMatch(); } void JournalCreator::on_tabWidget_currentChanged() { // using namespace std; // if((index==1 || index==2) && ui->DBType->currentIndex()==0){ // QMessageBox q; // q.information(this,"RoboJournal", "These settings are not applicable to SQLite databases. You should click OK instead"); // } } void JournalCreator::on_buttonBox_accepted() { CreateJournal(); } void JournalCreator::on_buttonBox_rejected() { // If this is the firstrun, return to the FirstRun class. It doesn't exist anymore at this //point, so create a new one. No one will ever know. if(Buffer::firstrun){ this->reject(); FirstRun f; f.exec(); } else{ this->reject(); } } robojournal-0.4.2/robojournal.pro0000644000175000017500000001060212214426370015627 0ustar willwill#------------------------------------------------- # # Project created by QtCreator 2011-08-31T19:59:51 # #------------------------------------------------- # Do *NOT* edit below this line! ###################################################### # Declaration of all Qt modules that should be built into the binary. QT += core gui sql webkit TARGET = robojournal TEMPLATE = app # Relative paths to all source files, headers, and UI files that need to be built. SOURCES += main.cpp\ ui/mainwindow.cpp \ core/buffer.cpp \ ui/editor.cpp \ ui/dblogin.cpp \ sql/mysqlcore.cpp \ sql/psqlcore.cpp \ sql/sqlitecore.cpp \ ui/aboutrj.cpp \ ui/firstrun.cpp \ ui/journalcreator.cpp \ ui/tagger.cpp \ ui/journalselector.cpp \ ui/entryexporter.cpp \ ui/newconfig.cpp \ core/settingsmanager.cpp \ ui/configurationgeneral.cpp \ ui/configurationjournal.cpp \ ui/configurationmysql.cpp \ ui/configurationappearance.cpp \ ui/configurationeditor.cpp \ ui/configurationexport.cpp \ ui/exportpreview.cpp \ ui/hunspell/affentry.cxx \ ui/hunspell/affixmgr.cxx \ ui/hunspell/csutil.cxx \ ui/hunspell/dictmgr.cxx \ ui/hunspell/filemgr.cxx \ ui/hunspell/hashmgr.cxx \ ui/hunspell/hunspell.cxx \ ui/hunspell/hunzip.cxx \ ui/hunspell/phonet.cxx \ ui/hunspell/suggestmgr.cxx \ ui/hunspell/utf_info.cxx \ ui/SpellTextEdit.cpp \ ui/highlighter.cpp \ sql/sqlshield.cpp \ ui/tagreminder.cpp HEADERS += ui/mainwindow.h \ core/buffer.h \ ui/editor.h \ ui/dblogin.h \ sql/mysqlcore.h \ sql/psqlcore.h \ sql/sqlitecore.h \ ui/aboutrj.h \ ui/firstrun.h \ ui/journalcreator.h \ ui/tagger.h \ ui/journalselector.h \ ui/entryexporter.h \ ui/newconfig.h \ core/settingsmanager.h \ ui/configurationgeneral.h \ ui/configurationjournal.h \ ui/configurationmysql.h \ ui/configurationappearance.h \ ui/configurationeditor.h \ ui/configurationexport.h \ ui/exportpreview.h \ ui/hunspell/affixmgr.hxx \ ui/hunspell/atypes.hxx \ ui/hunspell/baseaffix.hxx \ ui/hunspell/csutil.hxx \ ui/hunspell/dictmgr.hxx \ ui/hunspell/filemgr.hxx \ ui/hunspell/hashmgr.hxx \ ui/hunspell/htypes.hxx \ ui/hunspell/hunspell.h \ ui/hunspell/hunspell.hxx \ ui/hunspell/hunzip.hxx \ ui/hunspell/langnum.hxx \ ui/hunspell/phonet.hxx \ ui/hunspell/suggestmgr.hxx \ ui/hunspell/w_char.hxx \ ui/SpellTextEdit.h \ ui/highlighter.h \ sql/sqlshield.h \ ui/tagreminder.h FORMS += ui/mainwindow.ui \ ui/editor.ui \ ui/dblogin.ui \ ui/aboutrj.ui \ ui/firstrun.ui \ ui/journalcreator.ui \ ui/tagger.ui \ ui/journalselector.ui \ ui/entryexporter.ui \ ui/newconfig.ui \ ui/configurationgeneral.ui \ ui/configurationjournal.ui \ ui/configurationmysql.ui \ ui/configurationappearance.ui \ ui/configurationeditor.ui \ ui/configurationexport.ui \ ui/exportpreview.ui \ ui/tagreminder.ui # Declaration of images and other to-be-embedded resources. RESOURCES = images.qrc # The RC_File (resource file) sets the program icon for the Win32 executable robojournal.exe. RC_FILE = icon.rc # This block contains all Linux/Unix-specific build instructions. unix { CONFIG += qt release # The package block sets a different install path for package builds. package { message(Creating a package-friendly build for Debian and other Linux distros...) target.path = /usr/bin } else{ message(Creating a regular build...) target.path = /usr/local/bin } # Tweak for development/debugging: (3/31/13) # It is sometimes necessary to temporarily comment out the QMAKE_POST_LINK (ln 146) while compiling # in Qt Creator b/c it may complain about doc/compile_doc.pl being missing during each build. QMAKE_POST_LINK += perl doc/compile_doc.pl # set the final destinations of all install files man.files = robojournal.7.gz man.path = /usr/share/man/man7 doc.path = /usr/share/doc/robojournal doc.files = doc/robojournal.qhc doc/robojournal.qch shortcut.path = /usr/share/applications shortcut.files = menus/robojournal.desktop icon.path = /usr/share/icons icon.files = robojournal64.png shortcut-deb.path = /usr/share/menu shortcut-deb.files = menus/robojournal icon-deb.path = /usr/share/pixmaps icon-deb.files = menus/robojournal.xpm INSTALLS += target shortcut icon shortcut-deb icon-deb doc man } # This one controls Windows instructions for building with MinGW. win32{ CONFIG += qt release message(Creating 32-bit Windows release build...) } robojournal-0.4.2/doc/0000775000175000017500000000000012215171231013313 5ustar willwillrobojournal-0.4.2/doc/template.html0000644000175000017500000000221712211723657016027 0ustar willwill RoboJournal Documentation
    RoboJournal Documentation

    for version 0.4.2

    Template

    Intro paragraph

    Sub-header 1

    robojournal-0.4.2/doc/css/0000775000175000017500000000000012211723657014116 5ustar willwillrobojournal-0.4.2/doc/css/master.css0000644000175000017500000002276312211723657016133 0ustar willwillbody{ background-color: #A0A69E; margin-left: 0px; margin-top: 2px; margin-right: 0px; } .content{ width: 100%; margin-left: auto; margin-right: auto; margin-top: 10px; } .main_text{ border: solid 1px #565A56; padding: 20px; background-color: #ffffff; margin-bottom: 20px; } .menu{ background-color: #4C4F4B; padding-left: 0px; margin-left: 0px; height: 25px; } .menu ul{ list-style-type: none; margin-bottom: 0px; padding-left: 0px; } .menuitem{ display: inline; color: #ffffff; font-family: tahoma,arial,verdana,sans-serif; font-weight: bold; font-size: 12pt; margin-left: 10px; vertical-align: -5px; } .menuitem a{ color: #ffffff; text-decoration: none; } .menuitem a:hover{ color: #B2FF72; text-decoration: none; } .backbutton{ color: #ffffff; text-decoration: none; cursor: pointer; display: inline; font-family: tahoma,arial,verdana,sans-serif; font-weight: bold; font-size: 12pt; margin-left: 20px; vertical-align: -5px; } .backbutton:hover{ color: #B2FF72; text-decoration: none; cursor: pointer; } /*h1, h2, h3, p, .caption, .caption_wide, .list li, .FYI, .right, .left { text-rendering: optimizeLegibility; } */ h1{ font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 34px; font-weight: 500; color: #000000; } h2{ font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 24px; font-weight: 500; margin-top: 50px; margin-bottom: 30px; background-color: #DEE5D9; padding-top: 2px; padding-bottom: 2px; padding-left: 10px; margin-left: 0px; width: 100%; color: #000000; } h3{ font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 20px; font-weight: 600; margin-bottom: 40px; border-top: solid 2px #888888; padding-top: 5px; margin-top: 40px; width: 100%; } h4{ font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 16px; font-weight: bold; margin-bottom: 40px; padding-top: 5px; margin-top: 40px; width: 100%; } h4 strong{ font-family: inherit; font-size: inherit; font-weight: 900; } p{ font-family: Constantia, Georgia, Freeserif, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Bitstream Vera Serif", "Liberation Serif", serif; font-size: 17px; font-weight: normal; text-align: left; width: 100%; color: #000000; margin-bottom: 20px; } .list{ width: 95%; border-left: solid 10px #e2e2e2; margin-top: 40px; margin-bottom: 40px; padding-top: 15px; padding-bottom: 15px; font-family: Constantia, Georgia, Freeserif, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Bitstream Vera Serif", "Liberation Serif", serif; font-size: 17px; } .list li{ font-family: inherit; font-size: inherit; font-weight: normal; text-align: left; margin-bottom: 10px; } .toc{ font-family: Constantia, Georgia, Freeserif, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Bitstream Vera Serif", "Liberation Serif", serif; font-size: 17px; font-weight: normal; text-align: left; margin-left: 0px; } .toc li{ margin-bottom: 5px; margin-top: 5px; margin-left: 20px; font-size: inherit; font-family: inherit; } .toc li a{ font-family: inherit; font-size: inherit; font-weight: inherit; color: #4C593C; text-decoration: none; } .toc li a:hover{ font-family: inherit; font-size: inherit; font-weight: inherit; text-decoration: underline; color: #FF9706; } .screenshot{ margin-left: auto; margin-right: auto; box-shadow: 5px 10px 10px #888888; margin-top: 40px; margin-bottom: 25px; display: block; -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=135, Color='#888888')"; filter: progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=135, Color='#888888'); -webkit-box-shadow: 5px 10px 10px #888888; -moz-box-shadow: 5px 10px 10px #888888; } .screenshot-noshadow{ margin-left: auto; margin-right: auto; margin-top: 40px; margin-bottom: 25px; display: block; } .FYI{ border-top: solid 2px #A0A69E; border-bottom: solid 2px #A0A69E; padding: 10px; margin-left: auto; margin-right: auto; width: 80%; font-size: 17px; font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; margin-top: 40px; margin-bottom: 40px; } table{ width: 80%; display: block; margin-left: auto; margin-right: auto; font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 17px; border-top: solid 2px #A0A69E; border-collapse: collapse; border-spacing: 0px; margin-top: 60px; margin-bottom: 60px; } table .left{ border-right: solid 2px #A0A69E; border-bottom: solid 2px #A0A69E; width: 30%; padding-right: 15px; padding-top: 5px; padding-bottom: 5px; text-align: right; font-weight: bold; font-size: inherit; font-family: inherit; vertical-align: top; } table .left_slim{ border-right: solid 2px #A0A69E; border-bottom: solid 2px #A0A69E; width: 10%; padding-right: 15px; padding-top: 5px; padding-bottom: 5px; text-align: right; font-weight: bold; font-size: inherit; font-family: inherit; vertical-align: top; } table .right{ border-bottom: solid 2px #A0A69E; width: 70%; padding-left: 15px; padding-top: 5px; padding-bottom: 5px; text-align: left; font-size: inherit; font-family: inherit; margin: 0px; vertical-align: top; } table .right_fat{ border-bottom: solid 2px #A0A69E; width: 90%; padding-left: 15px; padding-top: 5px; padding-bottom: 5px; text-align: left; font-size: inherit; font-family: inherit; margin: 0px; vertical-align: top; } table .right p{ font-size: inherit; font-family: inherit; margin-left: 0px; text-align: justify; margin-bottom: 5px; margin-top: 20px; } table .right_fat p{ font-size: inherit; font-family: inherit; margin-left: 0px; text-align: justify; margin-bottom: 5px; margin-top: 20px; } dl{ width: 90%; margin-left: 20px; margin-right: auto; } dt{ background-color: #e2e2e2; padding-left:10px; padding-top: 3px; padding-bottom: 3px; } dd{ font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 17px; text-align: left; margin-left: 100px; padding-top: 3px; padding-bottom: 3px; padding-right: 10px; margin-bottom: 10px; } .caption{ font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 13px; font-weight: normal; margin-top: 0px; margin-bottom: 25px; display: block; text-align: center; } .caption_wide{ font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 13px; font-weight: normal; margin-top: 0px; margin-bottom: 40px; display: block; text-align: center; } .console{ font-size: 17px; font-weight: 600; font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; background: #e3e3e3; padding-left: 5px; padding-right: 5px; } .list ul li{ font-family: inherit; font-size: inherit; font-weight: normal; text-align: left; margin-bottom: 10px; margin-top: 10px; list-style-type: square; } p.footnote{ font-family: inherit; font-size: 90%; font-weight: normal; width: 85%; display: block; } #footer_container { width:100%; text-align:center; border: solid 1px #A0A69E; padding-top: 3px; padding-bottom: 3px; font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 17px; margin-top: 60px; } #footer_left { float:left; height: 20px; font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 17px; padding-left: 6px; font-weight: bold; } #footer_center { display: inline-block; margin:0 auto; height: 20px; font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 17px; } #footer_right { float:right; height: 20px; font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 17px; font-weight: bold; padding-right: 6px; } p.copyright{ font-family: inherit; font-size: 15px; text-align: center; margin-top: 30px; } .masthead{ margin-left: 20px; } .doc_version{ font-family: "Segoe UI", Candara, Freesans, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; font-size: 16px; font-weight: bold; text-align: left; margin-top: -30px; margin-bottom: 0px; margin-left: 100px; position: absolute; z-index: 1 }robojournal-0.4.2/doc/getting_started.html0000644000175000017500000004764412211723657017420 0ustar willwill Getting Started with RoboJournal - RoboJournal Documentation
    RoboJournal Documentation

    for version 0.4.2

    Getting Started with RoboJournal

    Sections

    1. First-Run Overview
    2. Creating a New Journal Database
    3. Assigning Permissions to a Database
      1. MySQL Procedure
    4. Connecting to an Existing Journal Database

    First-Run Overview

    RoboJournal stores its settings in configuration files. Instead of sharing the same settings for all users on the system, each user has a .robojournal folder containing a robojournal.ini configuration file in his or her home directory. This design allows each user to customize the same installation of RoboJournal to his or her own specifications.

    RoboJournal automatically initiates first-run mode if it can't find a valid configuration file when it starts. This is guaranteed to happen the first time you use RoboJournal after installing it. The purpose of first-run mode is to establish the parameters used to govern RoboJournal's behavior. These parameters are written to a configuration file immediately after you have finished using the first-run tool.

    You can force RoboJournal to reconfigure itself by deleting your current configuration file. This action triggers first-run mode the next time you start the program. You can also open your configuration file in a text editor (like Vim or Notepad) and edit it manually. Direct editing is only recommended if you need to make minor changes since it is easy to accidentally break your configuration file. If you already have a pre-existing configuration file, you can skip the first-run process altogether by placing that configuration file in your home directory's .robojournal folder; RoboJournal will detect and use that configuration file instead of initiating first-run mode.

    FYI: Older versions of RoboJournal (0.1–0.3) used a different configuration file called robojournal.cfg. This old configuration format has been officially deprecated. Newer versions of RoboJournal (0.4 and later) initiate first-run mode the first time you use them even if a robojournal.cfg file from an older version is already present.

    The Welcome to RoboJournal dialog is displayed whenever RoboJournal initiates first-run mode:

    Welcome to RoboJournal dialogFigure 1: The Welcome to RoboJournal dialog.

    During first-run, you must decide whether you want to create a new (blank) journal or configure RoboJournal to use an existing journal database. Select the desired option on the Welcome to RoboJournal window and then click the OK button to continue.

    Alternatively, you can abort the configuration process by clicking the Cancel button. However, RoboJournal will continue to initiate first-run mode each time you use it until a configuration file has been created.

    Creating a New Journal Database

    The Journal Creator consists of a tabbed interface. Each tab must be completed in full before a journal can be created. Completing this dialog requires root-level access to the MySQL installation on the host you specify. Without root access, you will not be able to create any journals.

    The Set this new journal as my default checkbox is always checked (and locked) during first-run. If you run the Journal Creator again at a later time, this checkbox (then unchecked and unlocked) gives you the option to replace the current default with the brand-new journal.

    Complete the following procedure to create a brand-new, empty journal:

    1. Select the Create a new journal database option on the Welcome to RoboJournal dialog and click the OK button. The Journal Creator dialog is displayed: Figure 2Figure 2: Launching the Journal Creator during first-run.
    2. Click the 2. Basic Settings tab. The fields that govern essential parameters for the new journal are displayed:Journal Creator: Basic Settings TabFigure 3: Journal Creator — Basic Settings tab.
    3. Enter a name for this journal database into the Journal name field. This name must be unique (no other database with the same name should exist on the indicated host). Short names are best; use underscores instead of spaces to separate words.
    4. Enter the host for this journal into the Journal host field (if necessary). The default value of "localhost" is used if this field is left blank. Localhost (also known as "127.0.0.1") refers to the current machine that RoboJournal is running on. If you intend to store RoboJournal and the database on the same machine, leave the Journal host field blank. Otherwise, enter the domain name or IP address of the machine on which the journal should be stored (that machine must have a working MySQL server process).
    5. Specify a username to associate with this journal and enter it into the Username field. You may not use "root" for the username!
    6. Choose a password to associate with the username you specified in the previous step. Enter this password in the Password and Repeat fields. The contents of the Password and Repeat fields are always obscured for security purposes but the password indicator text notifies you when both passwords match. When both passwords are identical, the OK button for the Journal Creator is unlocked.
    7. Switch to the 3. Authentication tab by clicking on it. The authentication-related options are displayed:Journal Creator: AuthenticationFigure 4: Journal Creator — Authentication tab.
    8. Enter the Root password for the host you specified in the Journal Host field on the 2. Basic Settings tab. The contents of the Root password field are always obscured for security reasons.
    9. RoboJournal automatically sets a value of "3306" for the Port field; this is the standard port for MySQL servers. Make sure this value is correct for your particular situation and change it if necessary.
    10. Click the OK button on the Journal Creator dialog window. A confirmation dialog is displayed if the journal creation process was successful.
      FYI: The next two steps are displayed only if RoboJournal is in first-run mode. Otherwise, RoboJournal preserves the user's full name and gender settings from the current configuration.
    11. A text input dialog is displayed. Enter your name (as you prefer it) and click the OK button. You may click the Cancel button if you wish to skip this step.Figure 5Figure 5: This value sets the user's full name in the configuration file.
    12. A gender selection dialog is displayed. Select your gender by clicking the appropriate button.Figure 6Figure 6: The gender selection dialog determines which avatar icon is used while a connection is active.

    RoboJournal is now successfully configured. For more information on how to use core RoboJournal functionality, refer to the RoboJournal Fundamentals documentation.

    Assigning Permissions to a Database

    You can use the Journal Selector to locate databases that have been restored from SQL dump files or migrated from other systems. Journals that you have created with your own user account (and have never been migrated or restored) can be located with relative ease. On the other hand, journals that have been imported from other sources or restored from a backup usually require some modifications before RoboJournal can even locate them.

    In the same manner, remote journal databases usually require permission changes before you can access them from your computer (even if the remote database has never been restored from a backup or migrated from a different server). This is a deliberate security measure intended to reduce the likelihood of unauthorized remote tampering by restricting access to a few "whitelisted" users while blocking all others. All permission changes to a remote database require root-level access privileges and must be performed on the same machine where the database you wish to use is stored. To make the changes, you must either access the machine directly (if possible) or connect to it via a remote access method like SSH or VNC.

    MySQL Procedure

    Restored databases are associated with the "root" user account by default and are therefore inaccessible to regular users. You must make some changes to the MySQL configuration in order to make a restored or migrated database easy to use with RoboJournal. This process requires root-level access to the MySQL console.

    In the following procedure, assume that "sample_journal" represents an imported database while "john_doe" represents the user account you intend to associate the database with (and "123" is the password associated with the john_doe account). You must obviously change these values to those appropriate to your particular situation in order for this procedure to work properly in a real-world context:

    1. Gain access (physically or otherwise) to the machine that contains the journal you wish to use.
    2. Log in to the MySQL command line as root. The exact procedure varies by operating system:
      • On Linux, open a terminal and type mysql -u root -p and press Enter.
      • On Windows, click the Start Menu and select All Programs » MySQL » MySQL Server 5.5 » MySQL 5.5 Command Line Client (the "5.5" may vary depending on which version you have installed but the location is likely the same).
    3. Type the root password when prompted to do so (the password is hidden for security purposes as you type it). Press Enter.
    4. A mysql> command prompt is displayed if the login was successful.
    5. Create a user account for yourself (if necessary) with the with the CREATE USER command. You may skip this step if your user account already exists.
      • Otherwise, type CREATE USER 'john_doe'@'localhost' IDENTIFIED BY '123'; and press Enter (don't forget to substitute the real username, host, and password in the query). MySQL displays Query OK, 0 Rows Affected if the command was successful.
    6. Use the GRANT command to give your user account (in this case, john_doe) permission to use the database you imported; type GRANT INSERT,DELETE,UPDATE,SELECT ON sample_journal.entries TO 'john_doe'@'localhost'; and press Enter (don't forget to substitute the real journal name, username, and host in the query). MySQL displays Query OK, 0 Rows Affected if the command was successful.
      FYI: You should only grant permissions that are absolutely necessary (i.e. INSERT, DELETE, UPDATE, and SELECT) because additional permissions will not make your account work any better and can actually be dangerous to other databases.
    7. Type exit and press Enter to disconnect from the MySQL command line.

    MySQL requires you to use a GRANT query to give yourself permission to view and/or modify a remote journal database on your workstation. For instance, assume that a journal database called "test" is stored on 192.168.2.1 and you wish to access it through the "john_doe" user account on your workstation at 192.168.2.3. You would log in (as root) to the MySQL command interface on 192.168.2.1 and run, GRANT INSERT,DELETE,UPDATE,SELECT ON test.entries TO 'john_doe'@'192.168.2.3'; to give yourself permission to access the journal.

    You are ready to begin the journal selection procedure once you have assigned the correct permissions to the database you wish to set as your default.

    Connecting to an Existing Journal Database

    RoboJournal's journal selection tool provides an easy way to select the default journal during the first-run session. This tool allows you to specify the username and password for a pre-existing account on a host machine (local or remote). Once you have provided this information, RoboJournal displays all databases associated with that specific user account.

    In order to use this tool successfully, you must know the correct username and password for the account you wish to access since RoboJournal currently has no way of retrieving a full list of accounts from the host. Furthermore, this tool only lists databases that are associated with the user account you provide (all others are ignored). Before you use the Journal Selector, you must assign the correct user permissions to the database you wish to use or RoboJournal will be unable to find it.

    1. Click to select the Connect to an existing journal database option on the Welcome to RoboJournal dialog and click the OK button. Figure 7Figure 7: The Journal Selector is launched via the Welcome to RoboJournal dialog.
    2. The Journal Selector window is displayed. Change the Host and Port values if necessary (you must uncheck the Use default host and port box to make the Host and Port fields writable).Figure 8Figure 8: The Host and Port fields are automatically populated with the most common default values.
    3. Enter the appropriate username and password into their respective fields (indicated within the red circle in Figure 9). These values should belong to the account you wish to use as your own (do not use root). The contents of the Password field are always obscured for security reasons. Figure 9Figure 9: Fill in the indicated fields to display a list of journals associated with a specific account.
    4. Click the Search for Journals button.
    5. A list of journals associated with the user account you provided is displayed in the large open area on the left:Figure 10Figure 10: The Journal Selector displays all databases associated with a specific user account.
    6. Select the journal you wish to use by clicking on its node in the hierarchy. Once a journal has been selected, the OK button on the Journal Selector window is unlocked (as shown in Figure 11).
    7. Click the OK button to continue.Figure 11Figure 11: The OK button unlocks once you have selected an entry.
      FYI: The next two steps are displayed only if RoboJournal is in first-run mode. Otherwise, RoboJournal preserves the user's full name and gender settings from the current configuration.

      If RoboJournal is not in first-run mode, you are asked to confirm your decision to replace your current default journal. Your previous settings are not changed at all if you decide to abort.
    8. A text input dialog is displayed. Enter your name (as you prefer it) and click the OK button. You may click the Cancel button if you wish to skip this step.Figure 12Figure 12: This value sets the user's full name in the configuration file.
    9. A gender selection dialog is displayed. Select your gender by clicking the appropriate button.Figure 13Figure 13: The gender selection dialog determines which avatar icon is used while a connection is active.

    RoboJournal is now successfully configured. For more information on how to use core RoboJournal functionality, refer to the RoboJournal Fundamentals documentation.

    robojournal-0.4.2/doc/setup.html0000644000175000017500000004762512214757204015366 0ustar willwill Installing RoboJournal and Other Related Programs - RoboJournal Documentation
    RoboJournal Documentation

    for version 0.4.2

    Installing RoboJournal and Other Related Programs

    Sections

    1. Overview and System Requirements
    2. Installing MySQL
      1. Windows Procedure
      2. Linux Procedure
    3. Installing RoboJournal
      1. Windows Procedure
      2. Linux Procedure

    Overview and System Requirements

    RoboJournal was originally designed to run on x86 or AMD64 CPU architectures. Since RoboJournal's source code is publicly available under the GPL3, RoboJournal can be ported to less common system architectures (assuming that a full Qt environment and all necessary database applications are available for that platform). For instance, RoboJournal is compatible with Debian Linux systems running on MIPS, ARM, and POWERPC CPU architectures.

    RoboJournal's system requirements are quite modest by modern standards since the program runs with ease even on very low-end computers. The following list addresses the bare minimum system requirements for the program to work effectively at all:

    1. A client computer with the following hardware and software specifications*:
      • Windows 2000 (or later) or Linux (kernel 2.6 or later).
      • Pentium II or better (for 32-bit/x86). Any 64-bit CPU is likely adequate for custom AMD64 builds.
      • Video display capable of achieving at least 1024x768 screen resolution. RoboJournal can run on 800x600 screen resolution (or below) but some parts of the interface may not completely fit on the screen even while maximized.
      • 64 MB of RAM (on Windows).
      • 58 MiB of hard disk space (on Windows). The Windows version of RoboJournal has a much larger installation footprint because it includes its own set of Qt libraries. Linux disk space requirements only include the RoboJournal executable itself (2-3 MiB) since Qt libraries on the system tend to be shared amongst all Qt apps and not just RoboJournal.
      • Wired ethernet or 802.11a/b/g/n wireless network connectivity to interact with host/server. Linux-based client machines require Internet connectivity in order to retrieve the necessary Qt packages.
    2. A server (host) machine with the following specifications:
      • MySQL server instance (and root-level access permissions).
      • Adequate bandwidth, memory, and processor speed to accommodate all database transactions. The specific requirements vary depending on your situation and the average system load on the machine in question.
    FYI: Compiling RoboJournal from source code may require up to 400 MiB of free hard drive space. The compiler uses this allocation as temporary scratch space; all affected resources are freed for other use immediately after the build process has finished. Be advised that RoboJournal may not compile correctly if your hard drive does not have enough free space available during build time.

    * Requirements do not take operating system/other software requirements into consideration. The actual requirements are the cumulative requirements of the entire software stack on the machine in question.

    † A remote server/host machine and the hardware necessary to connect to it are only necessary if your journal database is not stored locally. In this case, "locally" is defined as being the same machine on which RoboJournal is installed. The server requirements should be added to the base client system requirements if you are storing your database locally.

    Installing MySQL

    RoboJournal requires a working MySQL server in order to use MySQL-based journals. This server process can run on the same computer as RoboJournal (i.e. localhost) or be deployed on a machine located on your LAN/WAN or on the Internet. The installation process creates a working MySQL server instance on the computer you have selected. Once installation is complete, the affected computer is able to receive and negotiate MySQL connections from itself and from other machines that have the correct access permissions.

    You should consider installing MySQL Workbench after you have installed MySQL Server. MySQL Workbench is a replacement for the older MySQL Administrator tool (which provided a similar function). Although it is not required for MySQL Server to function, MySQL Workbench provides a visual environment to simplify interaction with your journals and other databases. As such, MySQL Workbench is ideal for users who are at the beginner-to-intermediate level of MySQL proficiency.

    FYI: RoboJournal will probably work with MariaDB (a compatible drop-in replacement for MySQL's database engine) without any major problems but this has not been thoroughly tested as of March 2013. Running RoboJournal on MariaDB should be considered experimental for the time being, even on Linux distros that now ship MariaDB as the official replacement for MySQL.

    Windows Procedure

    The Windows installation procedure for MySQL is very straightforward. You should begin by downloading the latest MSI installer package for Windows from the MySQL website. The free MySQL Community Edition is adequate for RoboJournal's requirements but you can also use the non-free Enterprise Version if you have a license for it. This guide uses version 5.6.10.1 but the procedure is probably applicable (unless otherwise noted) to newer versions as well. Once you have the installation file (in this case, mysql-installer-community-5.6.10.1.msi), double-click its icon to begin the installation process:

    FYI: The MySQL installer depends on the .NET Framework ≥ 4.0. You must satisfy this dependency by installing .NET (if you have not already done so) before you can install MySQL. You also need the Microsoft Visual C++ 2010 32-bit Runtime if you intend to install MySQL WorkBench.
    1. Windows Vista and later may request confirmation when you double-click the installer executable. It is safe to proceed if the publisher is listed as "Oracle America, Inc." If that is the case, click the Run button to continue. You may need to provide confirmation twice. Once Windows has finished configuring the installer, the MySQL Installer Welcome window is displayed:Figure 1Figure 1: MySQL installer main menu.
    2. Click the Install MySQL Products option. The License Agreement window is displayed:Figure 2Figure 2: MySQL Community Edition is available under the GPLv2.
    3. Once you have read the license terms, check the I accept these license terms box. Click the Next button to continue.
    4. The installer will check to see if any upgrades are possible at the current time. Click the Execute button. Once the check is finished, click the Next button to continue.
    5. The Choosing a Setup Type window is displayed:Figure 3Figure 3: The option you choose determines which features are installed. Select the option that is the best fit for your situation and click Next to continue:
      • Most users should select the Server Only option.
      • Select the Full option if you want to install everything. This option requires Microsoft Excel 2007 (or newer) in addition to the Visual C++ Runtime needed to run MySQL Workbench.
      • Select the Custom option to manually pick and choose which components should be installed (recommended if you only want MySQL Server and MySQL Workbench).
    6. The Check Requirements window informs you of any additional components that need to be installed. Click Next if you already have everything you need. You must install all required missing components before the installer will allow you to continue. When you get to the Installation Progress window, click the Execute button to begin the installation:Figure 4Figure 4: MySQL installation in progress.
    7. Click the Next button twice after the installation is finished to begin configuration. The MySQL Server Configuration (1 of 3) window is displayed:Figure 5Figure 5: Do not change any values (except the Config Type field) unless absolutely necessary.
    8. Change the Config Type: drop-down list item to "Server Machine". Click Next to continue (do not change any other values or enable Show Advanced Options unless you have good reason to make changes and you know what you are doing).
    9. The MySQL Server Configuration (2 of 3) window is displayed: Figure 6Figure 6: The Next button is unlocked once the two fields that set the root password match.
    10. Enter a password for the root account in the MySQL Root Password: and Repeat Password: fields. The root password should be strong (i.e. not easily guessed). A strong password generally consists of a randomized ≥ 9-character series of numbers, upper/lowercase characters, and typographical symbols typically found on a keyboard. This password is extremely important so either memorize it or store it in a very safe place for future reference. RoboJournal asks for the root password whenever you create a new journal.
      FYI: Do not create any other user accounts at this time unless you already have a journal you wish to import. In that case, go ahead and create the account that the imported journal is to be associated with.
    11. Click the Next button to continue. The MySQL Server Configuration (3 of 3) window is displayed. Do not change any of the values on this window unless you know exactly what you are doing and have a legitimate reason to make changes. Click Next to continue.Figure 7Figure 7: MySQL should always run as a regular Windows service.
    12. MySQL will be automatically configured according to the parameters you provided. When the process is complete, click the Finish button to exit the MySQL installer.

    MySQL is now installed and properly configured for your Windows system. You can now proceed with the RoboJournal installation process.

    Linux Procedure

    Unlike Windows, most software on Linux-based systems comes from centralized repositories managed by the various distributions. It is not unusual for several distributions to share the same repositories. If you are using a common distribution like Ubuntu or Fedora, MySQL can be automatically installed and configured by your package management system. Since this process is often handled entirely behind the scenes, there is no step-by-step graphical installer application.

    The following table gives the commands required to install a MySQL server on the most common types of Linux. The various distributions are grouped into families; Ubuntu (and all its variants) is in the Debian family while Fedora is in the Red Hat family. In all instances, open a terminal window (bash shell or similar) and type the appropriate command for your operating system as root or a superuser:

    Debian Family — Debian, Ubuntu (all variants), Linux Mint, etc. Install the "mysql-server" package with apt-get: sudo apt-get install mysql-server. You are prompted to set the MySQL root password during the setup process so you should have the password you intend to use ready in advance. MySQL is ready for use immediately after the installation process is finished.
    Red Hat Family— Fedora, CentOS/Red Hat Enterprise Install the "mysql-server" package with YUM: sudo yum install mysql-server. Once the package is installed, you must manually configure it by running sudo mysql_secure_installation because MySQL has little to no security immediately after installation. Finally, you must instruct MySQL to start automatically at every boot by running sudo systemctl enable mysqld.service && systemctl start mysqld.service. MySQL is available for use once you have finished the last step.
    OpenSUSE (and all related distros) Please consult http://en.opensuse.org/SDB:MySQL_installation.

    Installing RoboJournal

    As a cross-platform application, RoboJournal is designed to be easy to install on a variety of operating systems. As such, RoboJournal can be installed on Windows 2000 and later through a traditional installer. RoboJournal binaries are also available in package format that can be installed on Linux-based systems through native package management tools.

    Windows Procedure

    An installer package for the latest version of RoboJournal is always available for the Windows platform. The RoboJournal installation package takes the form of a traditional Windows installer application that can be acquired directly from SourceForge or from one of the other software download sites on which it is mirrored. Each version of the RoboJournal installer package uses a distinctive naming convention (i.e. robojournal-[$version]-setup.exe) in order to help you differentiate it from any other installer packages that are likely to be found in your user account's Downloads folder.

    FYI: You should uninstall any old version of RoboJournal on your computer before installing the latest version.

    Once you have downloaded the installer executable, double-click its icon to start the installation process. Windows Vista and later may require you to provide UAC authorization before setup is allowed to continue. The Setup Wizard is displayed after you have given the necessary permissions: Figure 8Figure 8: The Windows installer walks you through the entire setup process. The tool looks and acts the same for all versions of RoboJournal.

    You must complete all the steps in the installer to successfully install RoboJournal. The installer is very easy to use and provides its own instructions during each step of the procedure.

    All official RoboJournal releases on the Windows platform are 32-bit. The 32-bit version is fully functional on both the x86 and x86-64 CPU architectures that nearly every version of Windows run on. However, you must build RoboJournal from source in order to get a true 64-bit version. Instructions for producing a 32-bit custom build are found in the "RoboJournal Compile and Installation Guide" (stored as "compile-instructions.xhtml" in the RoboJournal source package). Although the basic compile procedure is the same, you need 64-bit Qt libraries, 64-bit MySQL libraries, and a 64-bit compiler toolchain to produce a 64-bit version of RoboJournal.

    Linux Procedure

    Currently, an old pre-packaged version of RoboJournal (0.2.1 as of March 2013) is available in the Debian repositories (which are shared with Ubuntu and Linux Mint). These repositories contain multiple variants of the package that are suited for different system architectures (x86, x86-64, ARM, etc.). This package can be installed by running, apt-get install robojournal as root or superuser. The version in the Debian repositories is out of date because the Debian package upgrade cycle is much slower than RoboJournal's development process has been so far.

    The only way to get the absolute latest version of RoboJournal on Linux is to build it from source. This is not as difficult as it sounds because all you need are the Qt libraries that the old version of RoboJournal installs anyway in addition to the base Linux compiler toolkit. For more information on the compile process (including step-by-step instructions), please refer to the "RoboJournal Compile and Installation Guide" (stored as "compile-instructions.xhtml" in the RoboJournal source package).

    robojournal-0.4.2/doc/robojournal.qhp0000644000175000017500000001706512214714654016403 0ustar willwill robojournal doc RoboJournal RoboJournal
    *.html css/*.css img/*.png img/screens/*.png robojournal-0.4.2/doc/preview_doc.sh0000755000175000017500000000127312211723646016172 0ustar willwill#! /bin/bash # Will Kraft (3/30/13) # Help file launcher script that launches the help collection file # in Qt assistant. If the help file appears when this script is executed # then it means that everything installed correctly. clear echo Testing help file. Please wait... echo echo echo \(If everything is installed correctly, Qt Assistant will appear and display echo the RoboJournal documentation.\) echo # PATCH 4/18/13: all doc should be installed to the same place regardless of version assistant -collectionFile /usr/share/doc/robojournal/robojournal.qhc # try the fedora path if the first one doesn't work. assistant-qt4 -collectionFile /usr/share/doc/robojournal/robojournal.qhc robojournal-0.4.2/doc/legacy_compile_doc.sh0000755000175000017500000000110712214415676017465 0ustar willwill#! /bin/bash # Will Kraft, 3/30/13. # # [re]create documentation files from their base components. # This script is supposed to be execd during Qmake configuration; # the paths may not work correctly if this script is used independently. # # During a manual rebuild, all compiled documentation files (robojournal.qch # and robojournal.qhc) should be installed to /usr/share/doc/robojournal-[version] # (i.e. /usr/share/doc/robojournal-0.4.1). /usr/bin/qcollectiongenerator doc/robojournal.qhcp -o doc/robojournal.qhc chmod 644 doc/robojournal.qch chmod 644 doc/robojournal.qhc robojournal-0.4.2/doc/robojournal.qhcp0000644000175000017500000000200212211723657016527 0ustar willwill RoboJournal Documentation qthelp://robojournal/doc/index.html qthelp://robojournal/doc/toc.html rj_help.png false false true mycompany/myapplication About Qt Assistant robojournal.qhp robojournal.qch robojournal.qch robojournal-0.4.2/doc/help_debugger.bat0000775000175000017500000000242412142060704016605 0ustar willwill :: Enter the full path to the Qt libraries you wish to compile against. :: You must specifically point to the "bin" folder in which qmake.exe resides, e.g. C:\qt-4.7.4\bin :: The Qt directory by itself (C:\qt-4.7.4\) will not work. @set qt=C:\qt-4.8.4\bin :: DO *NOT* EDIT BELOW THIS LINE!!!!!!! :: ################################################################################### @TITLE ROBOJOURNAL HELP DEBUGGER SCRIPT @ECHO. @ECHO Version 1.0 -- 3/23/2013 @ECHO. @ECHO ############################################################# @ECHO. @ECHO This script is normally used for debugging purposes since it @ECHO allows you to rebuild the help files without having to recompile @ECHO the rest of the program too. You should run ../win32_compile.bat @ECHO instead if you want to compile the documentation (and the rest @ECHO of RoboJournal) for normal use. @ECHO. @ECHO This script assumes the following values are true: @ECHO. @ECHO. @ECHO ^* QT ^>^= 4.7.4 is installed at: @ECHO [%qt%] @ECHO. @ECHO. @ECHO. @echo BUILD PATH: %cd% @echo. @ECHO ############################################################# @ECHO. @pause @path %qt% @qcollectiongenerator.exe robojournal.qhcp -o robojournal.qhc @assistant.exe -collectionFile robojournal.qhc robojournal-0.4.2/doc/preferences.html0000644000175000017500000012063112215157163016513 0ustar willwill RoboJournal Preferences - RoboJournal Documentation
    RoboJournal Documentation

    for version 0.4.2

    RoboJournal Preferences

    Sections

    1. RoboJournal Preferences
      1. Preferences Overview
      2. General Page
        1. Global Preferences
        2. Backend (Database)
        3. Date and Time
      3. Journal Page
        1. Entry Settings and Range
        2. User Information
        3. Highlighting
        4. Behavior
      4. Editor Page
        1. Post-Processing
        2. Appearance
        3. Spell Check
          1. Selecting a Dictionary for the First Time
      5. Appearance Page
        1. Enabling Custom Styles
          1. Selecting a Font Color
          2. Setting a Background Image
          3. Clearing a Background Image
        2. Style Options
      6. Export Settings Page
        1. HTML Behavior
        2. Fonts and Units
        3. Export Preview
      7. MySQL Settings Page

    Preferences Overview

    RoboJournal's preferences system has been completely redesigned into a modular interface (starting in version 0.4). This new design offers vastly improved efficiency and increased potential for expansion in the future. The new design groups all available options into several categories depending on their specific purposes. Each category is officially known as a "page". To switch to a different page, click on its name in the list on the left side of the Preferences window. The title of the Preferences window indicates which page you are currently viewing (i.e. Preferences -- General; Preferences -- Appearance, etc.).

    Since each page is inherently a different size (due to each page having a different number of options on it), RoboJournal's Preferences window automatically pads out the extra space on a page if necessary to ensure that everything fits properly without distortion. If a page is larger than the available display area, the Preferences window utilizes vertical scrollbars to allow you to access controls that would otherwise be inaccessable due to being placed outside the bounds of the window. These scrollbars are only used if a page does not fit the current window size; to eliminate the scrollbars, you must resize the Preferences window to the point where it is large enough to accommodate the entire page. RoboJournal automatically stretches each page on the horizontal axis to fit the available space (thereby eliminating the need for cumbersome horizontal scrollbars).

    The Preferences window is fully resizable; you can resize the window by dragging any side or corner of the window border into a more appropriate position. Whenever you resize the window, RoboJournal automatically records the size changes in your configuration file and automatically loads the new size each time the window is subsequently displayed. If the new size data becomes unavailable for some reason, the Preferences window automatically reverts to its original size (575x525 pixels).

    General Page

    The General page contains options that control the behavior of the entire program. The General page is always shown by default whenever the Preferences window is displayed. Otherwise, the General page is displayed when you click the General list item on the left side of the Preferences window:

    RoboJournal Preferences -- General PageFigure 1: RoboJournal Preferences Window — General Page

    Global Preferences

    All options in the Global Preferences group affect underlying program behavior and appearance.


    Always suggest default settings If checked, this option requires RoboJournal to automatically populate affected form fields with default settings whenever a form capable of using these settings (e.g. New Connection dialog) is displayed. This action is not the same as mandating default settings because it is often possible to override the defaults on a form-by-form basis.
    Always show confirmation dialogs This security measure forces RoboJournal to display all confirmation dialogs in situations where they are supposed to be triggered. This practice helps prevent accidental deletions and other data loss in situations where carelessness can cause problems. You are strongly encouraged to leave this option enabled at all times!

    However, be advised that some confirmation dialogs are mandatory and are always shown (if triggered) whether this setting is enabled or not.

    Show labels on toolbar buttons If checked, this setting causes every toolbar to display their buttons with both icons and text labels (default setting). Unchecking this option causes all toolbar buttons to display their icon only. Some users may prefer icon-only mode because it saves space and usually eliminates the need for the toolbar overflow menu.
    Display current journal name in title bar This feature simply shows the name of the current journal in the main window title bar (i.e. sample_journal - RoboJournal). If unchecked, the title bar simply says, "RoboJournal" whether a connection is active or not.
    Display alternating row colors in lists This option causes all lists (specifically the Chronological Entry List and the search output list) to use alternating background colors. This looks good on some color schemes but is completely unreadable on others (so you may wish to disable it in some situations).
    Display Tag Reminder window during login If checked, this option causes RoboJournal to display the Tag Reminder window immediately after login under the appropriate conditions (i.e. if the journal contains one or more untagged entries). The Tag Reminder window is completely suppressed while the Display Tag Reminder window during login box is unchecked.
    Toolbar docking position This drop-down list controls the default location of the main window's toolbar. This setting is persistent between sessions.

    It is possible to change the location of the toolbar during runtime by dragging it to a new position or using the setting in the Window » Toolbar position list, but these changes revert to the default setting the next time RoboJournal is used.

    Backend (Database)

    The backend option controls which database engine RoboJournal should use. For instance, choosing "MySQL" from the list causes RoboJournal to switch to MySQL mode. You must switch the backend before you can work with a different type of database (like SQLite). RoboJournal can use only one backend at a time.

    Date and Time

    The Date and Time group controls all settings that determine how RoboJournal processes date and time data.


    Display day of week when entries were made If checked, this setting causes RoboJournal to display the day of week along with the regular date and timestamp (i.e. Wednesday, 12/26/2012 at 12:00 am).
    Record the time when entries are made This setting requires RoboJournal to record the time when entries were made. Timestamps are displayed along with other relevant data in the entry header.

    RoboJournal does not display timestamps if this setting is disabled. RoboJournal will not store timestamps for entries made while this option is disabled. Entries with no timestamp data are indicated as being made at an "[unknown time]". There is currently no way to update timestamps on existing entries (other than manually editing the database).

    Use 24-hour clock in timestamps If enabled, this setting causes datestamps to be shown in 24-hour format (i.e. 16:00 instead of 4:00 pm).
    Preferred date format This drop-down list determines which date format RoboJournal should use in the entry header and Chronological Entry List. Supported formats include:
    USA
    MM-DD-YYYY; January 1, 2013 (used throughout the United States).
    European
    DD-MM-YYYY; 1 January, 2013 (used primarily in Europe).
    International Standards Organization 8601
    YYYY-MM-DD; 2013, January 1 (used world-wide, especially in scientific context).

    Certain date-related functions in RoboJournal (most notably the date column in the search results) override the preferred date format setting. These exceptions use the date format setting of your operating system instead.

    Journal Page

    The Journal page contains options that govern journal behavior and general user preferences. The Journal page is displayed when you click the Journal list item on the left side of the Preferences window:

    RoboJournal Preferences: Journal PageFigure 2: RoboJournal Preferences Window — Journal Page

    Entry Settings and Range

    This group contains settings that define the current entry range (the timespan of entries shown in the Chronological Entry List). The purpose of the entry range feature is to limit how many entries are shown at once in order to prevent the Chronological Entry List from being too long to easily navigate. For instance, setting an entry range of two years causes RoboJournal to show all entries made within the last two years (including the current year). As time passes, older entries are excluded from the allotted range while the newest ones are included. Disabling the entry range causes RoboJournal to display all entries from the current journal (regardless of age) in the Chronological Entry List. This group also has settings for miscellaneous behavior associated with entries.


    Show all entries in journal This setting determines whether the entry range function is enabled. Checking this box disables the entry range and year range indicator features (as shown in the screenshot above).
    Show entries from the last: This list sets the current entry range from 1-10 years. If the entry range function is disabled, this list locks and becomes unavailable.
    Show year range indicator on statusbar This feature (if enabled) causes the current entry range to be displayed on the main window statusbar along with the current entry count (i.e. "x Entries : y Years"). If the entry range function is disabled, this checkbox locks and is unavailable.
    Select entry node icon This allows you to select the icon used to represent individual entries in the Chronological Entry List and search output list. By default, RoboJournal represents individual entries with a pencil icon.

    User Information

    The User Information group contains settings that pertain to the user.


    Your full name (as you would like it to appear)

    This text box is meant to display your full name as you would like it to appear in the entry header. For example, you would probably set your full name to "John Doe" (or something similar) if your username were "john_doe". Unlike the username assigned to your journal, this value may contain spaces and uppercase characters. Your username is displayed in the header instead if this field is left blank.

    This field is normally populated during first-run but its value can be changed at any time.

    Select your gender This setting determines which avatar icon (male or female) is displayed next to your username in the main window status bar.

    This setting is initially determined during first-run but its value can be changed at any time.

    Highlighting

    The options in the Highlighting group control how RoboJournal highlights occurrences of a search term. This feature is designed to mimic traditional highlighter pens; all instances of a search term in an entry are displayed with a bright colored background to make them easier to locate in the text.


    Highlight current search term If checked, this option instructs RoboJournal to apply highlighting to searches.
    Select highlight color This list allows you to select the highlight color. The square box for each item on the list displays an approximate sample of that particular color.

    Behavior

    The Behavior group contains general options that control journal behavior and affect how journal content is rendered. These options work on a global scope; the same settings govern every single journal RoboJournal comes into contact with instead of being limited to the journal that is currently open.


    Group journal entries by day This option gives you the ability to sort entries by day instead of by month (which is the default behavior). Under normal conditions, entries are displayed with the date and title merged together (i.e. "January 1: Sample Entry"). Grouping entries by day adds another sub-category; in the aforementioned example, the entry "Sample Entry" would be a separate node listed under "January 1" instead of the two being merged together into a single node.

    This option is useful if you frequently post more than one entry per day and would like greater control of how such entries are displayed.

    Show title for current journal entry If checked, this option causes the title of the current entry to be included when the entry is displayed in the output pane.
    Display most recent entry automatically If checked, RoboJournal displays the most recent entry in the output pane immediately after you log in. If unchecked, Robojournal simply waits for you to select the entry you wish to view from the Chronological Entry List.
    Display full name (instead of username) This option determines whether RoboJournal displays the user's full name as it is written in the Your full name (as you would like it to appear) text box. This checkbox automatically disables itself and locks if the full name value is cleared. Inversely, this setting re-enables itself if a new full name value is entered. You can also disable this setting manually and leave the full name value intact.

    Editor Page

    The Editor page contains settings that affect the behavior and performance of the Editor window, including post-processing features, appearance settings, and spell check integration. The Editor page is displayed when you click the Editor list item on the left side of the Preferences window:

    RoboJournal Preferences: Editor PageFigure 3: RoboJournal Preferences Window — Editor Page

    Post Processing

    The options in the Post-Processing group manipulate the text of new or revised entries after they have been saved. These functions perform necessary corrections and cleanup operations to body text as a means to improve appearance and fix common errors. In all instances, the post-processing functionality looks for specific patterns and then applies changes to all matching instances of those patterns it detects.

    Since these changes are only applied after an entry is saved, post-processing does not affect old entries that were made before the post-processing features were introduced or were made while post-processing features were disabled. Post-processing is applied once after an entry has been saved in order to improve efficiency. Therefore, the only way to apply post-processing to old entries is to open them in the editor and then save them again.

    Remove unnecessary whitespace from entries This function removes extra line breaks between paragraphs and trims extra space from the bottom of the entry. Whitespace removal also eliminates extra spaces between words (since all words should only be separated by one space).

    This feature is still semi-experimental and may occasionally produce unexpected results (a reliable fix is to edit the entry and save it again).

    Use HTML-compliant dashes and hyphens This feature ensures the correct use of dashes and hyphenation in entries. These are impossible to add with a regular keyboard (without resorting to key combinations) so this function does it for you. It replaces the common workaround for long dashes (i.e. --) with HTML-compliant long dash characters (i.e. — ) and removes any unnecessary spacing. Dashes between numbers are replaced with a proper medium-length dash (i.e. 1–2 instead of 1-2).
    Use smart (curly) quotation marks This feature replaces instances of "straight" quotation marks with “curly” quotation marks. Post-processing also affects grammatical contractions and possessive nouns (i.e. won't becomes won’t; John's becomes John’s).
    Apply miscellaneous formatting options Miscellaneous formatting applies post-processing features that are not easily categorized. These convert three or more consecutive periods into a true ellipsis character (…) and formalizes number notation (i.e. 12th, 101st).

    Appearance

    The Use custom theme font in the editor option causes the editor to use the same font/font size as the entry output pane in the main window. This improves consistency and helps you to preview how your entry will look once it has been saved. This option is locked (as shown in the screenshot above) if RoboJournal is not presently configured to use a custom style.

    Spell Check

    RoboJournal's spell check feature scans the contents of the editor each time a new word is entered and applies a wavy red underline to all misspelled words  it detects. Spell check is not automatically enabled during first-run. To enable spell check, you must first select a dictionary for it to use (refer to the "Selecting a Dictionary for the First Time" section).

    FYI: Spell checking is completely disabled on all Linux-based builds of RoboJournal 0.4.2 due to stability/crashing issues. Consult the "Frequently Asked Questions" documentation for details.

    Enable spell check functionality This option controls whether spell check should be used in RoboJournal (if checked, this option automatically triggers the dictionary selection function). All spell check functionality remains disabled while this option is unchecked.
    Highlight spelling errors in text by default If checked, this option determines whether the Show Spelling Errors button in the Editor window should be toggled on by default. This option is locked while spell check is disabled.
    Select spell check dictionary This text field contains the path to the current dictionary file. This field can not be edited directly even when unlocked; it is locked while spellcheck is disabled.

    Selecting a Dictionary for the First Time

    RoboJournal automatically copies the built-in US English dictionary to the ".robojournal" folder in your home directory during first-run. The Select Dictionary file browser always starts in that location because it is guaranteed to contain at least one valid dictionary. Although US English is the default language, RoboJournal supports other languages as well. You can acquire other dictionaries from the Internet but every dictionary must consist of a DIC/AFF file pair in order to be compatible with RoboJournal. Any dictionary designed for use with the Hunspell spell check engine is fully compatible with RoboJournal. For best results, both the DIC and AFF files for each dictionary should be stored in the same directory.

    Once you select a DIC file with the Select Dictionary file browser, RoboJournal attempts to find the appropriate AFF file automatically. If RoboJournal cannot locate an AFF file to go with the DIC file you selected, you are instructed to find this AFF file manually (a Locate AFF File file browser is displayed after Step 3 in the following procedure).

    Once you are on the Editor page in the RoboJournal Preferences window, perform the following procedure to enable spell check:

    1. Click the Enable spell check functionality checkbox. The other spellcheck-related options are unlocked and the Select Dictionary file browser is displayed:"Select Dictionary" file browser dialogFigure 4: The Select Dictionary file dialog
      FYI: If you are using an operating system other than Windows 7, the Select Dictionary dialog will look different than it does in Figure 4.
    2. Navigate to a directory that contains dictionary files (if necessary).
    3. Select the dictionary file you want to use and click the Open button to continue.
    4. The path to the chosen dictionary is now properly set in the Select spell check dictionary field on the Editor page.

    Once a dictionary has been selected, you can switch to a different dictionary at any time by clicking the Browse (folder icon) button immediately to the right of the Select spell check dictionary field. The Select Dictionary dialog is displayed and you can select the dictionary you wish to use. Click the Open button to update the current value with the new choice. The new dictionary becomes active when you click the OK button on the RoboJournal Preferences window.

    Appearance Page

    The Appearance page controls the appearance and font settings of rendered entries in the output pane on the main window. The Appearance page is displayed when you click the Appearance list item on the left side of the Preferences window:

    RoboJournal Preferences: Appearance PageFigure 5: RoboJournal Preferences Window — Appearance Page

    Enabling Custom Styles

    All custom styles are disabled by default. Instead, RoboJournal uses a generic sans-serif font for text and system colors to indicate the header/highlighted text. The default settings are generally consistent with the overall system theme currently in use on your computer.

    The entire Style Options group is locked while the Use custom font and/or background image box is unchecked. Checking this box unlocks the group and allows you to define custom settings. Certain background-related options (Tile background image and Apply background image to entry list) will remain locked indefinitely unless a background image has been set.

    Selecting a Font Color

    Use the following procedure to select a font color:

    1. Click the Choose button on the Appearance page in the RoboJournal Preferences window. The Select Color dialog is displayed:Color chooser dialogFigure 6: Select Color dialog box. This design is universal across all operating systems.
    2. Select a preset color from the Basic colors list or use the targeting crosshair to select a custom color from the full spectrum (use the vertical slider on the far right side of the dialog to set color brightness).
    3. Click the OK button to apply the selected color.
    FYI: The color selected through the above procedure is also used for the date box header and tag header backgrounds. Because of this, both headers display their text in the inverse color of their backgrounds in order to ensure maximum contrast and readability.

    Setting a Background Image

    1. Click the Browse (folder) button in the Style Options group:Click the Browse IconFigure 7: Browse button marked for identification.
    2. The Choose Background Image file dialog is displayed:Choose Background Image file dialogFigure 8: Choose Background Image dialog.
      FYI: The Choose Background Image dialog does not resemble Figure 8 on operating systems other than Windows 7.
    3. Navigate to a folder that contains image files (*.png, *.jpg, *.bmp, or *.gif) and select the desired image by clicking on its filename.
    4. Click the Open button.
    5. Your choice is now displayed in the Select background image from disk field. The background is applied after you click the OK button in the RoboJournal Preferences window.
    6. (Optional) Click the Tile background image checkbox if you want the background image to be repeated in the entry output pane.
    7. (Optional) Click the Apply background image to entry list checkbox if you want to apply the background to the Chronological Entry List.

    Clearing a Background Image

    1. Click the Clear Background button in the Style Options group: Clear background imageFigure 9: Clear Background button marked for identification.
    2. The current background image is removed. This change is applied after you click the OK button in the RoboJournal Preferences window.
    FYI: This action causes all background-related options in the Style Options group to uncheck themselves and lock. Any background image in the Chronological Entry List will persist until the current session has ended.

    Style Options

    The following table lists and provides a description of each object in the Style Options group.

    Select font and base font size The font and font size lists control which typeface is to be used in Journal entries and its point size. This font/font size is also used in the Editor if the Use custom theme font in the editor box on the Editor page is checked.
    Font color This value sets the current font color. Colors are specified in the 6-character hexadecimal format (i.e. #000000) commonly used on the web.
    Select background image from disk This text field contains the path to the current background image.
    Tile background image If checked, this option causes the background image to be tiled on the X and Y axis in the entry output pane. If unchecked, the current background image is only displayed once without repeating. This option is locked if no background image has been set.
    Apply background image to entry list If checked, this feature applies the background image to the Chronological Entry List.

    Once enabled, this feature takes effect immediately after clicking the OK button on the RoboJournal Preferences window. However, disabling this feature requires you to restart RoboJournal before the change will take effect.

    Use system colors in date/timestamp box This feature overrides the rule that applies the current font color to the background in the date/time header and tag header. If checked, this option forces the use of system colors even when a custom theme is in use; this is ideal for those who wish to use a custom font but retain default colors/background settings.

    Export Settings Page

    The options on the Export Settings page allow you to control how exported entries are processed. Since this function takes database content and uses it to create documents in both HTML and plain-text format, any changes made to the options on this page do not affect entries that have already been exported.

    The Export Settings page is displayed when you click the Export Settings list item on the left side of the Preferences window:

    RoboJournal Preferences: Export PageFigure 10: RoboJournal Preferences Window — Export Settings Page

    HTML Behavior

    The HTML Behavior group contains options that affect the visual appearance of exported HTML documents. As such, these settings are entirely optional. These options are not applied to plain text files.


    Use rounded corners on date/timestamp header If checked, this option causes the entry exporter to apply rounded corners (using Cascading Style Sheets) to the date/timestamp header in both the single entry export and full journal export functions. This function is purely decorative and may not be visible on older browsers.
    Use system colors in exported HTML files If checked, this function applies the system colors for highlighted text (foreground) and selected color (background) to exported documents. The purpose of this setting is to allow the exported text to more closely resemble the entry as it is shown in the entry output pane.

    If unchecked, black text is used for the foreground and a neutral gray is used for the background.

    Fonts and Units

    RoboJournal supports separate fonts for headers and entries in exported HTML documents. In normal situations, sans-serif font should be used for headers and serif font for text. Fonts are chosen through the Preferred HTML Fonts group while sizes/units are determined by the Font Sizes and Units group.

    To select a font, click on the Select header font or Select body text font lists (depending on which one you want to change). The font lists contain all fonts installed on your system; scroll through the current list until you locate the desired font. On Windows, RoboJournal uses Verdana (header) and Times New Roman (body) as the default fonts.

    Fonts can be displayed in point size (pt) or em units. Point size is a fixed size traditionally used in word processing and print media; 1pt is generally equivalent to 1/72 inch. Em units are more scalable than pt and refer to current font size; 1em = 12 pt, 2em = 24pt, etc. Even though 1em is always equivalent to 12pt, the apparent size of em increases in proportion to general font size; 1em appears larger under a base font size of 120% than under a size of 100%. In contrast, point size always remains consistent regardless of base font size. Generally, you should use pt if you intend to print your exported journal entries while em units are more appropriate if readability across different devices is your highest priority.

    The available font sizes depend on the unit currently in use. Changing the unit assigned to header or body fonts causes the affected available size list to refresh and display new values appropriate for that unit. Select the desired value from the list to set a font size.

    Export Preview

    After changing fonts, font sizes, font units, or HTML Behavior settings, you can preview your changes by clicking the Preview Export Settings button. The Export Preview window is displayed:

    Export Preview WindowFigure 11: The Export Preview window provides a faithful representation of the current export settings.

    The Export Preview window allows you to "test" new settings before saving them. The current settings of the Export Settings page are used to render a sample entry that contains a title, date/timestamp header, and several paragraphs of body text. This feature is designed to be as accurate as possible. The body text is an excerpt from the classic Latin Lorem Ipsum text used throughout the print industry since the 1500s. Click the Close button to exit the Export Preview.

    MySQL Settings Page

    The MySQL page contains options that define and control all settings related to MySQL. The MySQL Settings page is displayed when you click the MySQL Settings list item on the left side of the Preferences window:

    RoboJournal Preferences: MySQL PageFigure 12: RoboJournal Preferences Window — MySQL Settings Page

    The Default Account group contains options that determine the default account for MySQL connections, including the default Host, Database, Port, and Username to use if RoboJournal is configured to always suggest default settings. The Default button (to the right of the Port field) is an easy way to reset the Port field to its default value of "3306" in case you previously changed it and need to change it back.

    Enabling the Allow root logins on host option overrides the security protocol that prevents users from logging in as the MySQL root user. This option should not be used unless absolutely necessary since the root account has full control over all database functions (including those which have the potential to be harmful). By design, RoboJournal places restrictions on regular user accounts for security purposes.

    robojournal-0.4.2/doc/index.html0000644000175000017500000000706612214756572015337 0ustar willwill RoboJournal Documentation
    RoboJournal Documentation

    for version 0.4.2

    Welcome to RoboJournal

    What is RoboJournal?

    RoboJournal is a cross-platform, database-driven application that allows you to keep a journal/diary on your computer by means of an intuitive graphical user interface. RoboJournal is designed to run on a variety of operating systems, including Windows and practically any type of Linux.

    Unlike similar computerized journal tools that store data as a file on your hard drive, RoboJournal stores all entry data "in the cloud" as a MySQL database. These journal databases can be accessed directly through the server machine, through another computer on the same LAN/WAN as the server, or even remotely via the Internet. For instance, you can run RoboJournal on your primary workstation while your journal database is stored on a server machine in the same building or even in another country. You can even store RoboJournal itself and your journal on the same computer and run RoboJournal in an entirely closed ecosystem.

    Current Limitations

    At the moment, RoboJournal is not intended to be a high-security program; all entry data in each journal database is stored in an unencrypted state. However, RoboJournal already offers some nominal security—by means of account restrictions and a password, journals are protected from all other unauthorized users except the root-level database administrator (who has unconditional access to all MySQL databases on the server whether they were created by RoboJournal or not). This danger is minimal if you control the root account. If not, keep in mind that it is possible for other people to read your journal. You can minimize this danger by storing your journal(s) on a private MySQL server that you control.

    Future versions of RoboJournal will fortify security by offering support for on-the-fly encryption and decryption of journal content. Under this planned security model, RoboJournal will store all data in an encrypted format and decrypt it into a readable state only when necessary. Once implemented, this encryption will protect journal content from even the root administrator (unless he or she has the additional password required to unlock it).

    Help Topics

    Most RoboJournal software features have been documented. Consult the Table of Contents for a complete list of topics.

    robojournal-0.4.2/doc/export.html0000644000175000017500000002773612211723657015552 0ustar willwill Exporting Journal Entries - RoboJournal Documentation
    RoboJournal Documentation

    for version 0.4.2

    Exporting Journal Entries

    Sections

    1. Overview
      1. Export Formats
      2. Export Options and Settings
    2. Exporting a Single Entry
    3. Exporting the Entire Journal

    Overview

    RoboJournal stores all journals as databases. Databases like MySQL are not discrete files on your hard drive; instead, they are abstract entities you work with through an intermediary program like RoboJournal. The intermediary program relays data between the client (your computer) and the actual journal database residing on the host. While the journal appears to be on your computer, this is not truly the case unless you are running the database server on localhost.

    Since the journal databases are abstract entities, it is normally difficult to extract data from them unless you dump the entire database to disk as a file (the most common backup method). Fortunately, RoboJournal provides a way to directly extract journal content (in part or in whole) from its database in a form that can be easily backed up or copied.

    Export Formats

    RoboJournal currently supports two export formats for your entry data. Both formats are universally-compatible with every operating system and many handheld devices as well.

    HTML Export

    HTML formatting causes the exported section(s) to be saved as HTML files that can be displayed in any web browser. Since RoboJournal already stores entries in HTML format, this option preserves all existing formatting. Therefore, it is the recommended format for both individual entries and full journal exports. The appearance and function of HTML output documents are controlled through current settings found in the RoboJournal Preferences.

    Plain Text Export

    Plain text export causes the exported section(s) to be formatted as plain text files meant to be read with a text editor like Vim or Notepad. RoboJournal automatically formats the text file for the operating system it is currently running on (such as using the proper linebreak character).

    Export Options and Settings

    The Export Content window interface consists of two tabs that are very similar to each other yet work very differently. The Export Single Entry tab contains options applicable to individual entries while the options on the Export Entire Journal tab affect the entire journal. The following tables list and describe the options found on the Export Content window based on the tab on which they are found.

    The Export Location field displays the folder where all exported entries are to be placed. This field is always visible no matter which tab is selected.

    Export Single Entry Tab

    Filename The Filename field contains the name to be applied to the entry you have selected for export. The length and complexity of the filename are determined by the options you currently have selected. The base filename is determined by the title of the entry to be exported. RoboJournal automatically strips out all characters (like colons or forward/backward slashes) that would produce an illegal filename on Windows or Unix if such characters are found in the entry title.
    Export Format The options in this group determine what type of file is produced by the export process. Clicking the HTML (recommended) button causes RoboJournal to export the entry as a web document while the Plain Text option produces a plain text file.
    Include Date If checked, this option appends the entry date (plus the day of the week on which it was written) to the filename (i.e. sample_journal_new_entry_friday_1-4-2013.html).
    Include Journal Name If checked, this option includes the journal name in the filename (i.e. sample_journal_new_entry_friday_1-4-2013.html). This option is recommended because it makes it easier to remember which journal an entry came from.

    Export Entire Journal Tab

    Filename The Filename field contains the name to be applied to the entry you have selected for export. The length and complexity of the filename are determined by the options you currently have selected. RoboJournal uses the name of the journal as the base filename. RoboJournal automatically strips out all characters (like colons or forward/backward slashes) that would produce an illegal filename on Windows or Unix if such characters are found in the entry title.
    Export Format The options in this group determine what type of file is produced by the export process. Clicking the HTML (recommended) button causes RoboJournal to export the journal as a web document while the Plain Text option produces a plain text file.
    Include Export Date If checked, this option causes RoboJournal to append the current date to the filename (i.e. sample_journal_01-20-2013.html). This option is ideal for archival purposes because it allows you to see the journal as it was at a specific point in time. This option also allows you to export the journal multiple times without having to replace older versions.
    Sort Ascending/Sort Descending This option controls the order in which entries are placed in the exported document. Selecting the Sort Ascending option causes the newest entry to be placed first while Sort Descending does the opposite.

    Exporting a Single Entry

    Like the Manage Tags window, RoboJournal's export system is designed to target a specific entry (even when you use it to export an entire journal at once). The following procedure instructs you how to target a specific entry and bring up the Export Content window:

    1. Click to select the desired entry in the Chronological Entry List (the selected entry is shown within the large oval in Figure 1).Figure 1Figure 1: Select an entry and click the Export Content toolbar button to display the Export Content dialog.
    2. Click the Export Content toolbar button (indicated by the small circle in Figure 1).
    3. The Export Content window is displayed:Figure 2Figure 2: The Export Content window is always superimposed over the main window.
    4. Ensure that all Export Format and Filename Options settings (indicated by the red oval in Figure 3) are configured appropriately and change them if necessary.Figure 3Figure 3: The options indicated by the red circle have a direct impact on the predetermined Filename.
    5. Click the OK button to continue (a confirmation message is displayed if the export operation is successful).

    Exporting the Entire Journal

    As previously stated, RoboJournal allows you to export an entire journal at once. This is much faster and produces better results than the only other alternative method (manually exporting the journal one entry at a time) because it loops through the entire journal and appends each entry to a single file.

    The procedure for exporting the entire journal is very much the same as exporting a single entry:

    1. Click to select an entry (indicated by the oval in Figure 4) from the Chronological Entry List. Unlike in the previous procedure, it does not matter which entry you choose since you intend to export the entire journal.Figure 4Figure 4: You can select any entry if you intend to export the entire journal.
    2. Click the Export Content toolbar button (indicated by the small circle in Figure 4). The Export Content window is displayed.
    3. Click the Export Entire Journal tab (indicated by the oval in Figure 5) to switch to it.Figure 5Figure 5: The procedure for exporting the entire journal is very similar to that of exporting a single entry until you get to this point.
    4. Check the circled options in Figure 6 to ensure they are set properly. Change them if necessary.Figure 7Figure 7: At first glance, these options look similar to those in Figure 3 but these affect the entire journal rather than a single entry.
    5. Click the OK button to continue. A confirmation message is displayed if the export operation is successful.
    robojournal-0.4.2/doc/fundamentals.html0000644000175000017500000007055712214742150016701 0ustar willwill RoboJournal Fundamentals - RoboJournal Documentation
    RoboJournal Documentation

    for version 0.4.2

    RoboJournal Fundamentals

    Sections

    FYI: Toolbar button labels have been disabled in every screenshot of the main window used in this documentation to ensure that all buttons are fully visible for demonstration purposes.
    1. Default State
    2. Main Window Anatomy
    3. Making a Connection
    4. Disconnecting
    5. Writing a New Entry
    6. Modifying an Existing Entry
    7. Deleting an Entry
    8. Navigating the Chronological Entry List
    9. Tagging an Entry
    10. Exporting an Entry
    11. Searching for an Entry

    Default State

    RoboJournal is ready for regular day-to-day use once it has been properly configured through first-run mode. When RoboJournal is started under normal conditions, the main window is displayed:

    RoboJournal Main Window in Default StateFigure 1: RoboJournal's main window in "Default State".

    The initial configuration of the main window (immediately after starting the program) is known as the "Default State" in this documentation. Most of the main window's functionality (except Connect and RoboJournal Preferences) is locked while the program is in the Default State because the locked functions specifically affect the current journal; in other words, there is nothing for these functions to do without an active connection. Therefore, you must make a connection to unlock this functionality.

    Main Window Anatomy

    On a superficial level, RoboJournal's main window consists of two large areas bifurcated by a movable splitter object. The Chronological Entry List (Item 12 in Figure 2) is always located on the left side of the splitter while the Entry Output Pane (Item 18) is always on the right. The rest of the window contains a movable toolbar, a status bar, and the standard drop-down File, Edit, etc. menus common to most Windows programs.

    RoboJournal's toolbar can be docked on the left, right, or top margin of the main window. The toolbar cannot be free-floated or discarded (although it can be temporarily hidden by selecting the appropriate option in the Show sub-menu on the Window drop-down menu). You can change the location of the toolbar by dragging the toolbar docking widget to the position where you want the toolbar to be or by selecting the desired position from the Toolbar position sub-menu on the Window drop-down menu. For ease of identification, the toolbar docking widget is always on the far left side of the toolbar or on the very top if the toolbar is currently docked vertically (the docking widget's appearance may vary by operating system). Your mouse pointer changes to a four-directional arrow while it is hovering over the toolbar docking widget. The layout automatically adjusts once the toolbar has been moved to a new location. Be advised that moving the toolbar this way is temporary; the only way to permanently change the toolbar orientation is by selecting a different default position in RoboJournal Preferences.

    The splitter object separates the Chronological Entry List from the Entry Output Pane and determines how much window space is allocated to each. By default, the splitter divides the RoboJournal main window roughly in half on the vertical axis, regardless of window size. If desired, you can drag the splitter bar left or right to shrink or grow the sizes of the Chronological Entry List and the Entry Output Pane. Moving the splitter all the way left or all the way right collapses the object on that side, rendering it invisible. The remaining object expands to fill the entire horizontal axis of the window. If you move the splitter bar to a new location, RoboJournal saves the coordinates and automatically applies them to future sessions. RoboJournal reverts the splitter to the default position if the saved coordinate data becomes unavailable for some reason.

    The following diagram and table provide a complete explanation of each element in the main window layout. Each numbered item in Figure 2 corresponds to the table row bearing the same number:

    Figure 2Figure 2: RoboJournal main window elements identified by number (the toolbar has been docked to the left for more convenient numbering).


    1. Connect toolbar button — Establishes a connection to a journal database.
    2. Disconnect toolbar button — Terminates the current connection.
    3. Latest toolbar button — Causes RoboJournal to jump to the most recent entry in the Chronological Entry List.
    4. Previous Entry toolbar button — Displays the entry immediately before the currently-selected item in the Chronological Entry List (if possible).
    5. Next Entry toolbar button — Displays the entry immediately after the currently-selected item in the Chronological Entry List (if possible).
    6. Manage Tags toolbar button — Launches the Manage Tags dialog (affecting the currently-selected entry in the Chronological Entry List).
    7. Export Content toolbar button — Displays the Entry Exporter dialog (affecting the currently-selected entry in the Chronological Entry List).
    8. Write in Journal toolbar button — Launches the Editor dialog in "Write" (new entry) mode.
    9. Modify Entry toolbar button — Launches the Editor dialog in "Edit" mode (affecting the currently-selected entry in the Chronological Entry List).
    10. Delete Entry toolbar button— Deletes the currently-selected entry in the Chronological Entry List.
    11. RoboJournal Preferences toolbar button — Displays the RoboJournal Preferences dialog.
    12. Chronological Entry List — Displays entries (in the current range) from the current journal in chronological order from newest to oldest using a hierarchical tree format. Entries are usually grouped by the year and month in which they were created.
    13. Entries tab — Clicking this tab causes RoboJournal to display the Chronological Entry List on the left side of the main window splitter.
    14. Connection Indicator — This text provides information about the current connection (i.e. the database type, the database name, and the host on which the database is located).
    15. Search tab — Displays the search interface in the place of the Chronological Entry List on the left side of the main window splitter.
    16. Username Indicator — This field displays the username of the active user. The avatar icon located to the left of the name switches depending on the user's gender.
    17. Entry Count/Entry Range Indicator — The Entry Count displays the number of entries in the current journal OR the number of entries in the allotted range (if a year range has been set in RoboJournal Preferences). The Entry Count displays the total number of entries in the journal if there is no entry range set.

    The Entry Range Indicator is displayed if an entry limit has been set and you have decided to display the entry range indicator. For instance, Entry Count WITH Range Indicator means that RoboJournal is displaying six entries made over the course of two years.

    18. Entry Output Pane — This large area is used to display the currently-selected entry in the Chronological Entry List or in the search results. RoboJournal is able to store separate entries for the Entries and Search tabs simultaneously but each tab can only display one entry at a time in the Output Pane.
    19. Tag List — This is where RoboJournal displays the tags assigned to the current entry. This list reads, "This entry has not been tagged yet" if there is no tag data available for the entry. If the entry was tagged previously and the tag data later removed, this list reads, "No tag data for this entry".
    20. Tab Header — This is used to visually separate the Tag List from the Entry Body.
    21. Entry Body — This term refers to the entirety of the text in each entry. The Entry Body is usually of a different length for each entry. RoboJournal forbids a zero-length Entry Body.
    22. Entry Header — This term refers to the area that stores the date and timestamp of when the entry was made. It also displays the user's full name and the day of week the entry was made (if those features are enabled).
    23. Entry Title — This is the title of the current entry. The size of this element is relative to the text size you have selected for the Entry Body text.

    Making a Connection

    You must initiate a new connection before you can work with a journal. A connection creates a persistent link between the RoboJournal interface and the database you are currently working with. As such, all actions initiated during the session only affect the journal you are currently connected to. RoboJournal only supports one connection at a time; you must run multiple instances of RoboJournal if you need to work with more than one journal simultaneously.

    The following procedure establishes a new connection:

    1. Click the Connect toolbar button (indicated by the small red circle in Figure 3).
    2. The New Connection dialog is displayed:Figure 3Figure 3: New Connection Dialog (in MySQL mode).
      FYI: The Host, Database, and Username fields on the New Connection dialog are automatically populated with default values if the Always suggest default values option is enabled in the RoboJournal Preferences window. You can temporarily override this functionality by unchecking the Use default host/database and Use default user account checkboxes on the New Connection dialog.

      After doing so, the Host, Database, and Username fields are cleared and made writable so you can enter your own values. This override is only effective for the current session; the next connection automatically reverts back to the default values. You must edit the default settings if you wish to make your override values permanent.

      Every text field in the New Connection dialog is automatically blank and writable if RoboJournal is not configured to suggest default values.
    3. Enter the appropriate password into the Password field (indicated by the large oval in Figure 3). The contents of the Password field are always obscured for security reasons.
    4. Click the OK button to continue.

    Figure 4Figure 4: RoboJournal main window in Connected Mode.

    RoboJournal attempts to make the connection using the values you provided once you have clicked the OK button in the New Connection dialog. Successfully establishing a connection takes RoboJournal out of Default State and causes it to enter Connected Mode (as shown in Figure 4). All previously-locked program functionality becomes available while RoboJournal is in Connected Mode. However, the Connect button is locked during this time because it is currently impossible to have multiple connections in a single instance of RoboJournal.

    In RoboJournal version 0.4.1 (or newer), RoboJournal displays the Tag Reminder window immediately after login if your journal contains any untagged entries. You are required to tag the entries in the list or close the Tag Reminder window before you can access the rest of your journal.

    FYI: RoboJournal utilizes a "sanity check" mechanism for determining the compatibility of the database you are currently attempting to connect to. A database is considered to be "sane" if it matches a predefined table structure; this causes RoboJournal to recognize it as a valid journal. RoboJournal refuses to load any database that fails the sanity check.

    Disconnecting

    You can disconnect at any time while RoboJournal is in Connected Mode. Disconnecting returns RoboJournal to a condition very similar to Default State. Once you have disconnected, you can make another connection or quit the program.

    FYI: You can safely quit without disconnecting but RoboJournal usually requires you to confirm your decision.

    Click the Disconnect toolbar button (indicated by the red circle in Figure 5) to proceed:

    Figure 5Figure 5: The Disconnect toolbar button immediately terminates the current connection.

    Writing a New Entry

    You can write a new entry at any time once RoboJournal is in Connected Mode. Each entry is represented by a node in the Chronological Entry List. Unlike day, month, or year-level nodes, entry-level nodes are marked with an icon and have no subordinate nodes.

    Whenever you create a new entry, RoboJournal automatically keeps track of the date and time for the new record. This allows you to focus entirely on the new entry's content. RoboJournal automatically assigns a unique identification number (not shown in the user interface) to each entry to prevent conflicts between two or more entries with the same title and/or body text. This identification number is never used more than once in the same journal. There is a theoretical limit to how many entries a MySQL-based journal may contain but the number is so large (within the billions) that nobody ever comes close to reaching it. Therefore, feel free to write as often as you want.

    The following procedure adds a new entry to the current journal:

    1. Click the Write in Journal toolbar button on the RoboJournal main window.Figure 6Figure 6: Click the Write in Journal button (indicated in red).
    2. The Editor dialog is displayed:Figure 6Figure 7: RoboJournal Editor dialog in Write (new entry) Mode.
    3. Enter a title for this entry in the Entry Title field.
    4. Write the body text for this entry in the large text area.
      FYI: The Character count and Remaining characters values indicate how much longer the body text may be (MySQL allows up to 65,535 characters). If the Remaining characters value is negative, RoboJournal prevents you from saving the entry until this value is greater than or equal to zero.
    5. When finished, click the Save this Entry button (indicated by the circled toolbar icon in the following screenshot):Figure 8Figure 8: The Save this Entry toolbar button (button labels have been disabled in RoboJournal Preferences).
    6. RoboJournal displays a confirmation message ("entry_title" was successfully added to your journal) if the save was successful.
    7. The new entry is added to the Chronological Entry List. If desired, you may click on the new entry to display its contents in the Entry Output Pane:Figure 9Figure 9: The new entry is displayed in the Chronological Entry List.

    Modifying an Existing Entry

    The Editor dialog allows you to modify existing entries after they have been saved to the journal database. You may change the title and body text in any way you see fit. However, RoboJournal prevents you from changing the date because that often creates problems with the rest of the database. Any special characters/conditions in the entry text that are affected by post-processing (e.g. ellipsis characters, dashes, smart quotes, etc.) revert to their original state during the editing session in order to make them easier to work with. All applicable post-processing features are automatically re-applied after the changes have been saved.

    The following procedure allows you to change an existing entry:

    1. Select the entry that is to be modified by clicking on its node in the Chronological Entry List (as shown in the large red oval in Figure 10). Figure 10Figure 10: Selecting the entry to be modified.
    2. Click the Modify Entry toolbar button (indicated by the small red circle in Figure 10). You can visually distinguish the Modify Entry button from the Write in Journal button by the Modify Entry button's orange pencil color, its central position in the button group, and its horizontal red lines.
    3. The Editor window is displayed with the entry data pre-loaded into the appropriate fields:Figure 11Figure 11: Existing entry text loaded into Editor (in Edit Mode).
    4. Make all necessary changes.
    5. Click the Save Changes toolbar button (indicated by the red circle in Figure 12) to commit your changes to the database. The Save Changes button replaces the Save this Entry toolbar button while the Editor dialog is in Edit Mode. If you wish to cancel your edits, you can click the Discard Changes button (located to the immediate right of the Save Changes button) to return to the main window.Figure 12Figure 12: Saving changes once the edits are complete.
    6. A confirmation message ("entry_title" was successfully updated.) is displayed if RoboJournal was able to save the entry successfully. Otherwise, RoboJournal displays a message explaining what went wrong. In either case, click the OK button in the dialog to continue.
    7. If the save was successful, the updated entry is displayed in the Entry Output Pane on the RoboJournal main window. Figure 13Figure 13: The updated entry is shown immediately after the edit process is completed.

    Deleting an Entry

    RoboJournal's delete function provides a way to easily remove the currently selected entry from the database. You should always exercise caution when using this feature because delete operations are permanent. The only way to undo an accidental deletion is to restore an earlier version of the journal that contains the lost data from a backup.

    1. Select the entry to be deleted by clicking on its node in the Chronological Entry List (shown in the large oval area in Figure 14).
    2. Click the Delete Entry toolbar button (indicated by the small circle in Figure 14). Figure 14Figure 14: Select the entry you wish to delete and click the Delete Entry button.
    3. A confirmation dialog is displayed as a safety measure. This dialog is your last opportunity to cancel the delete operation. Click the OK button to approve the delete operation or click the Cancel button to abort. Figure 15Figure 15: A confirmation dialog is displayed if safety protocols are enabled. This is your last chance to abort.
      FYI: RoboJournal skips Step 3 if the Always Show Confirmation Dialogs option is disabled in RoboJournal Preferences. In such cases, the delete operation is instantaneous and provides no chance to abort even if you click the Delete Entry toolbar button accidentally! You should treat the Delete Entry function with extreme caution if confirmation dialogs have been disabled.
    4. You are returned to the main window regardless of your decision in the previous step. If you chose to continue with the delete operation, the previously-selected entry is now gone: Figure 16Figure 16: The entry you deleted is no longer displayed in the Chronological Entry List.

    All entries in the current journal are displayed in ascending chronological order; the newest entry is always the first on the list while the oldest entry (in the current range) is on the very bottom. RoboJournal has convenient ways to browse adjacent entries in the current journal if you wish to read it in a chronological fashion. This is accomplished by clicking the Previous Entry and Next Entry toolbar buttons on the RoboJournal main window:Figure 17Figure 17: The Previous Entry and Next Entry buttons allow easy sequential browsing.

    Clicking the Next Entry or the Previous Entry toolbar button increments or decrements the current entry by one record. The focused (selected) entry in the Chronological Entry List automatically jumps to the appropriate adjacent record whenever the entry is changed this way. If there is no record available before or after the current entry because you are viewing the oldest or newest entry, the affected button locks to indicate that further browsing in that direction is impossible (as shown in Figure 18 where the Next Entry button is locked because the latest entry is already being displayed).

    You can use the Latest Entry toolbar button (indicated by the red circle in Figure 18) to immediately jump to the most recent entry in the database:Figure 18Figure 18: You can use the Latest Entry button to display the newest entry at any time. RoboJournal can also be configured to display the latest entry by default.

    Tagging an Entry

    Refer to the "Working With Tags" documentation.

    Exporting an Entry

    Refer to the "Exporting Journal Entries" documentation.

    Searching for an Entry

    Refer to the "Using the Search Function" documentation.

    robojournal-0.4.2/doc/rj_help.png0000664000175000017500000000621012142060704015444 0ustar willwillPNG  IHDR00WgAMA7tEXtSoftwareAdobe ImageReadyqe< IDATxYil\6j{4! $@R$@ UiKJ((BDUU(+ ڪTM,$^d3͛yf3 qs ig=^q? ugA-U90.|>m E===P #MV}0"bre_CT@kk;l6A92y!d]1M]ȡNP33Sv`WI2J(BڞgwH<cll C( '5 \FQ*rU +n ,N!a ot$XC-R}<7>fLLGp[%&a) ĥ>Pڝ,-HO# V@Ɯט7F~2CqQ_ &Ö7M _ BKEC׭\B\YdgN}vd vDƝ3UeʲTa3ƺYȩ8I8yw<-ywY^+k@OCf$ m`=$zwrse{˄Wy5wljaOוQܲEEvdI{~ǍO o9.DVH'xN$j 1jV`=>vtg7 ݌>&/%P[\Z\Ӑ^FGެQe9f_P ss) BLIY^!=T:_F" g- B كPc=ai[~g _Vbu,/kY_+a91}\M$Pgz9Ks 3 A]>>^o;ˍrS/r *5vx͑*CA~>|Cp_؁{ W2rx҇JB3i hY ^4wlZή&MT06>sGjK&Xs4NEUϜ=bl4θDQ]b]m!O"ɔ3FbSo 16lUhpa8k<|6,O;)/h_TY(<џ F( Ϙrr#H݂Yh#DO=|+Ϭ% + ZJFޝ ԛ1Z1/Z2۴\ ґ 1T䨯f =:zN,opx\v~J3R+v@yu˘.gWr ͗[|0_ $I Jq|,4Ih 95LVZfjʨV5'J^~{y]~ %*D5GN,jǧ)_ycNXZBr.T$E57ݷ&*|~L?²!{C 8)v:sb(cIv:I @Y'CQ;y3 8{')˝SGDzs-zFƶ.ﯾ)EC " ~ȷ6+\%WsC91݊ww?wo )q[,ѳ9JY,9j(C g}#F iɿ_S G?xGS`H_G: ǘ=i(Ѣ[BDxfoJ$C몰Ru jagi^9_z4 bLS8eW865 d-|f ftf}ԉم+*\(Yx0{̑$xE tIENDB`robojournal-0.4.2/doc/toc.html0000644000175000017500000002153412211723657015004 0ustar willwill Table of Contents - RoboJournal Documentation
    RoboJournal Documentation

    for version 0.4.2

    Table of Contents

    Section I: Installation and First-Run

    Section II: Using RoboJournal

    1. Cover Page
      1. What is RoboJournal?
      2. Current Limitations
    2. RoboJournal Fundamentals
      1. Default State
      2. Main Window Anatomy
      3. Making a Connection
      4. Disconnecting
      5. Writing a New Entry
      6. Modifying an Existing Entry
      7. Deleting an Entry
      8. Navigating the Chronological Entry List
      9. Tagging an Entry
      10. Exporting an Entry
      11. Searching for an Entry
    3. Working with Tags
      1. Tagging Overview
        1. Best Practices
        2. Accessing the Tagging Interface
      2. Declaring a New Tag
      3. Assigning a Tag to an Entry
      4. Removing a Tag from an Entry
      5. Tag Reminder Window
    4. Exporting Journal Entries
      1. Overview
        1. Export Formats
        2. Export Options and Settings
      2. Exporting a Single Entry
      3. Exporting the Entire Journal
    5. Using the Search Function
      1. Search Overview
        1. Pattern Match
          1. Pattern Match Filters
          2. Highlighting
        2. Tag Search
        3. Search Interface Overview
      2. Conducting Searches
        1. Accessing the Search Interface
        2. Search by Tag
        3. Search by Pattern
    6. RoboJournal Preferences
      1. Preferences Overview
      2. General Page
        1. Global Preferences
        2. Backend (Database)
        3. Date and Time
      3. Journal Page
        1. Entry Settings and Range
        2. User Information
        3. Highlighting
        4. Behavior
      4. Editor Page
        1. Post-Processing
        2. Appearance
        3. Spell Check
          1. Selecting a Dictionary for the First Time
      5. Appearance Page
        1. Enabling Custom Styles
          1. Selecting a Font Color
          2. Setting a Background Image
          3. Clearing a Background Image
        2. Style Options
      6. Export Settings Page
        1. HTML Behavior
        2. Fonts and Units
        3. Export Preview
      7. MySQL Settings Page
    7. Appendix: Table of Shortcut Key Combinations
    robojournal-0.4.2/doc/faq.html0000644000175000017500000001605112211723657014764 0ustar willwill Frequently Asked Questions - RoboJournal Documentation
    RoboJournal Documentation

    for version 0.4.2

    Frequently Asked Questions

    This page is meant to address certain questions or problems that various users have had so far. You should expect this list to grow as more questions are asked with each new version of RoboJournal.

    Question: Why doesn't RoboJournal offer higher security?

    Will Kraft's answer:


    As the "Current Limitations" section explains, RoboJournal was not originally designed to be a high-security program. RoboJournal's purpose is to allow users to create and maintain an electronic diary or journal on a remote server. By its very design, RoboJournal is already more secure than a traditional handwritten diary (which offers no security at all since anyone can pick it up and read it) since the MySQL server requires a username and password for each login. Even so, you need to ask yourself how much protection your journal really requires. A basic login requirement is probably enough to thwart casual unauthorized access attempts unless the attacker has root-level access to your MySQL installation (in which case you have far greater problems than having your secrets exposed).

    That said, there are plans in the works to harden RoboJournal against unauthorized access attempts even from the MySQL root account. Starting in a future version (most likely 0.6), RoboJournal will support RSA and/or AES on-the-fly encryption for all journal content.

    Question: Why is spell check disabled on the Linux version of RoboJournal 0.4.2?

    Will Kraft's answer (updated on 8/30/13):

    I had no choice but to issue a service patch that disables spell check (for the time being) on all instances of RoboJournal that have been compiled for any Linux-based operating system. The only other [unacceptable] option was to leave this serious problem completely unaddressed.

    This decision is due to the well-known crashing bug that has plagued RoboJournal ever since the spell check feature was introduced in version 0.4. I have recently made progress on figuring out what is causing the bug but there is no way for me to fix it in a timely manner. I intend to replace the spell check system entirely before RoboJournal 0.5 is released (since that is what the fix requires) in order to resolve this bug once and for all. In the meantime, this patch prevents a Linux-user's copy of RoboJournal from crashing merely because he or she enabled spell check at some point. This patch is temporary; I intend to restore full spell check functionality as soon as possible.

    The patch does not affect the Windows version of RoboJournal because that version has always been immune to this crashing bug. Therefore, all custom Windows binaries will continue to have fully-functional spell check.

    Question: Why does the whitespace removal feature sometimes add lots of empty lines to a new entry?

    Will Kraft's answer:

    This is on my list of things to fix in RoboJournal 0.5.

    The bug is most often triggered whenever you paste content from an external source (like a website) into a new entry and then save it. Once saved, the new entry shows lots of unnecessary whitespace in the Entry Output Pane. Whenever this problem occurs, it can be easily remedied by editing the affected entry (consult "Modifying an Existing Entry" if necessary) and then saving it again without making any changes. The whitespace removal function should work correctly the second time.

    Question: Why isn't there a version of RoboJournal for Mac OS X?

    Will Kraft's answer:

    I have actually been planning to release RoboJournal on Mac OS X as soon as I can. The reason why I haven't done it for earlier versions is because I don't have a Mac of my own; under the circumstances there has been no way for me to build or actively maintain a Mac version.

    Update (4/23/13): Unfortunately, my last plan for porting RoboJournal to OS X has recently failed. I'm now forced to wait for another volunteer to come along.

    Question: RoboJournal has been useful to me. Is there anything I can do to help out?

    Will Kraft's answer:

    What I need the most right now are more beta testers and translators who are able to volunteer some of their time. As of 4/23/13, I'm also looking for someone who can help me port RoboJournal to Mac OS X.

    Supporting RoboJournal on Mac OS X requires a volunteer who can be relied on to download the current stable source code (from Github or SourceForge), compile it to run natively on Mac OS X 10.8 "Mountain Lion" (or later), and package it as a .dmg archive. This must be done for each release cycle.

    Beta testers help me test new experimental versions of RoboJournal prior to release (usually the current "experimental" branch on GitHub) on a wide variety of operating systems and notify me of any new bugs they find. Beta testers also suggest new features and other ways to improve RoboJournal. As a beta tester, you must have enough development experience and skill to compile the experimental code yourself because I simply don't have the time to package and distribute custom builds on a regular basis.

    Translators would help me make RoboJournal available in other languages besides English. I'm only fluent in English so my ability to do this myself is extremely limited. I would definitely appreciate having several people who are willing to gradually translate all text in the program (and perhaps in this documentation as well) into Spanish, French, German, Chinese, or any other world language in which they have proficiency.

    If you are interested in any of these roles, please contact me at pwizard[at]gmail[dot]com.

    robojournal-0.4.2/doc/search.html0000644000175000017500000004445712211723657015475 0ustar willwill Using the Search Function - RoboJournal Documentation
    RoboJournal Documentation

    for version 0.4.2

    Using the Search Function

    Contents

    1. Search Overview
      1. Pattern Match
        1. Pattern Match Filters
        2. Highlighting
      2. Tag Search
      3. Search Interface Overview
    2. Conducting Searches
      1. Accessing the Search Interface
      2. Search by Tag
      3. Search by Pattern

    Search Overview

    RoboJournal provides the ability to search the current journal for individual keywords or tags (starting in version 0.4 and later). This feature is extremely beneficial for locating specific data in larger journals because the search function deliberately ignores the entry range value if one has been set. This allows you to locate and read old entries that may be outside the current visible range on the Chronological Entry List.

    RoboJournal's search mode is designed to be read-only; all changes to the journal must be done from the Entries tab in order to eliminate the possibility of write conflicts since the Entries and Search tabs keep track of their current entries separately. Because of this, all toolbar buttons (except RoboJournal Preferences) are locked while Search Mode is active. Without this protection, it would be theoretically possible for two different versions of the same entry to exist simultaneously in memory and cause data corruption.

    RoboJoural supports two distinct search methods. Each method has its own set of advantages/disadvantages and is therefore suited for different situations.

    Pattern Match

    Pattern matching searches the current journal for all instances of a literal search term. Entries containing one or more matches (hits) are displayed in the search results list. Pattern matching allows the greatest level of precision but is generally unsuitable for broad/category-based queries because the pattern is applied without any regard for context. All occurrences of the pattern are highlighted for improved visibility if the highlight option is enabled in RoboJournal Preferences.

    Pattern matching searches for whole words by default. This means that a hit is only counted if it is an individual word preceded by whitespace (or is the first word in a sentence) and followed by whitespace or some form of punctuation. Partial-word matches are defined as being a search term contained within a larger word; for instance, using "term" as a search pattern would match determination in a partial word search. Partial-word matches are only permitted if you uncheck the Search for whole words checkbox before running the search.

    FYI: RoboJournal's pattern search function is case sensitive ("Cat" is not equivalent to "cat").

    Pattern Match Filters

    RoboJournal offers three different types of pattern matching. RoboJournal allows you to select the type of pattern match to use before each search. The type you should use depends widely on your needs and how much you want to limit the search.

    Pattern Match: Title Only This filters the pattern search to entry titles and nothing else. Title-based searching is ideal for situations where you know of the existence of several similarly-titled entries in a series (i.e. "Log Entry #1; Log Entry #2, etc.) and are only interested in finding entries from that series; searching for "Log Entry" would allow you to find the entire series very quickly, especially if it is spread out over a period of months or years.
    Pattern Match: Body Only This option filters the pattern search to the body text. This mode should be used in situations where you want to locate a specific word or phrase but are unsure of where it can be located. This is very similar to the Body + Title search method but is slightly more conservative.
    Pattern Match: Title + Body This is the default pattern match "filter". In actuality, the word "filter" is misleading in this context because this option does not filter the results at all; it searches each entry's title and body for any and all occurrences of the search term. It is by far the most comprehensive search method and is ideal for situations where you want the largest possible number of results. The only drawback to this method is that it may be too comprehensive by returning a large number of false positives along with the useful results.

    Highlighting

    RoboJournal (as of version 0.4) includes the ability to highlight all occurrences of a search term wherever they appear. This feature is meant to make all instances of the search term easier to find in long documents (much like traditional highlighter pens are used to bring the reader's focus to a specific area of text). The background colors used for the highlighter function are user-configurable.

    RoboJournal's tagging system allows you to group entries into categories. This allows for context-based searches (since several items with the same tag are more likely to be of a similar topic) but lacks the precision control found in pattern matching. Searching by tag also disables highlighting and the number of hits per result because there is no specific search term to highlight or term occurrences to count.

    When you search by tag, all entries marked with the selected tag are displayed in the results list.

    Search Interface Overview

    The rows in the following table correspond to the numbered items in Figure 1. The following table provides information about each element in the RoboJournal search interface: Figure 1Figure 1: RoboJournal's Search Interface is clearly indicated (and numbered by item) while the rest of the window has been artificially darkened to better differentiate the search area.

    1. Term The Term field accepts the literal pattern (or term) you wish to search for. This field is locked while in tag search mode.
    2. Search Button The Search button initiates the next search using the current tag or pattern.
    3. Clear All Button The Clear All button completely resets the search interface by clearing the Search Results and Term field contents.
    4. Search Mode (unlabeled) This option allows you to choose which type of search RoboJournal should use from a drop-down list. RoboJournal will run a pattern match search (with a scope of title and body) by default but you can limit the search to only the body or title of entries if desired.

    This field is officially called "Search Mode" even though it is not marked as such in the actual interface.

    5. Search for whole words If checked, this field causes the search function to only count whole-word occurrences of the current search term. The Search for whole words field is locked while RoboJournal is in tag search mode.
    6. Selected Tag While in search mode, this drop-down list contains all tags in the current journal. Selecting a tag from the list causes the next search operation to find all entries marked with that specific tag. The Selected Tag field is locked (and blank) while RoboJournal is in pattern search mode.
    7. Search Results (unlabeled) All search results are displayed in the unlabeled Search Results area (which consists of three columns). The Entry Title column lists the title of each entry in the results, Date displays the date on which each entry in the results was made, and the Hits column shows how many occurrences of the current search term are in each entry.

    This area is officially referred to as "Search Results" even though it is not labeled as such in the actual interface.

    8. Search Result Count (unlabeled) This field merely displays the number of results for the current search (yet accepts no direct user interaction). The Search Result Count field displays no data and is invisible (aside from the space that it occupies) if no search has been performed yet or the previous results have been cleared.
    FYI: The date format used in the Search Results' Date column is determined by your operating system settings instead of adhering to the format specified in RoboJournal Preferences.

    You can sort the search results by any of the columns in ascending or descending order; click a column header to toggle the sort algorithm between ascending/descending. Sorting by Entry Title arranges the entries in alphabetical order/reverse alphabetical order. Sorting by Hits arranges entries in numerical order/reverse numerical order depending on the number of times the search term is detected in each entry. On the other hand, sorting by Date places the entries in chronological/reverse chronological order.

    Conducting Searches

    All search-related activity is conducted through the Search tab in the RoboJournal main window (the Search tab is unlocked during an active connection but is inaccessible while RoboJournal is in Default State). The following procedure prepares RoboJournal for the next search operation:

    Accessing the Search Interface

    1. Establish a new connection if you have not already done so.
    2. Click the Search tab (indicated by the red oval in Figure 2).Figure 2Figure 2: The Search tab is unlocked once a connection has been established.
    3. The search interface is displayed:Figure 3Figure 3: RoboJournal is now in Search Mode.
    4. Consult the "Search by Tag" or the "Search by Pattern" section (depending on your search requirements) for further instructions.

    Search by Tag

    RoboJournal's tag-based search function allows you to search by subject. Each entry in your journal should be marked with at least one tag that sorts the entry into a category that describes what the entry is about. Searching against a specific tag causes RoboJournal to display all entries that have been placed in that particular category. Since any given entry often contains more than one tag (and is therefore in more than one category) is is typical for the same entry to be included in search results for multiple tags/topics. RoboJournal's tagging system deliberately ignores the current entry range; as such, any entry from the most recent to the oldest in the journal can be included in the search results even if it is no longer visible on the Chronological Entry List.

    Use the following procedure to search for all entries marked with a specific tag (the procedure assumes that RoboJournal is already in Search Mode):

    1. Click the Search Mode list to display the available search methods. Select the "Search by Tag" option. Figure 4Figure 4: The "Search by Tag" option in the Search Mode list instructs RoboJournal to enable the tag search fields.
    2. The Selected Tag list is automatically unlocked and populated:Figure 5Figure 5: The Selected Tag list is only unlocked while RoboJournal is in Tag Search mode.
    3. Click the Selected Tag list to select the tag you wish to search for from the drop-down list. Once you have made your choice, click the Search button to continue.Figure 6Figure 6: The Selected Tag is the category/topic that RoboJournal searches against.
    4. A list of search results is displayed:Figure 7Figure 7: By default, the search results are sorted by date from newest to oldest.
    5. Click an item in the search results to display its contents in the Entry Output Pane.

    Search by Pattern

    RoboJournal's pattern search function is more versatile then tag-based searches. Pattern matching is far more precise than tag searches because pattern matching allows you to target a specific word or phrase and display all entries that contain that phrase in whole or in part. However, this precision can also be a disadvantage because the pattern match relies on literal matches; RoboJournal is unlikely to display appropriate (or any) search results if you get the pattern wrong or are not specific enough. The pattern match function also requires you to know exactly what you are looking for ahead of time.

    The following procedure allows you to search for a specific pattern or phrase:

    1. Enter the desired search term into the Term field contained in the Search tab on the RoboJournal main window:Figure 8Figure 8: The word(s) in the Term field are the literal pattern RoboJournal will search for.
    2. Select the appropriate filter (for your situation/search requirements) from the Search Mode list:Figure 9Figure 9: Each type of pattern match is suited for a different purpose.
    3. Uncheck the Search for whole words checkbox (if necessary).
    4. Click the Search button to continue.
    5. The search results are displayed. Click any entry in the Search Results area to view its contents in the Entry Output Pane:Figure 10Figure 10: All instances of the search term in the entry title or body text are clearly highlighted to make them easy to find.
    robojournal-0.4.2/doc/compile_doc.pl0000755000175000017500000000525012215137625016141 0ustar willwill#! /usr/bin/perl # # This file is part of RoboJournal. # Copyright (c) 2012, 2013 by Will Kraft . # # # RoboJournal 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. # # RoboJournal 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. # # You should have received a copy of the GNU General Public License # along with RoboJournal. If not, see . # Will Kraft (9/12/13): This script is meant to replace the old documentation # build script (renamed "legacy_compile_doc.sh" in this release). This new script # is a lot more robust because it uses several attempts to compile the # documentation and returns false only if all attempts fail. ########################################################################## # declare preliminary variables. $cmd=" doc/robojournal.qhcp -o doc/robojournal.qhc"; $exec1="qcollectiongenerator"; #use relative path first. $exec2="/usr/bin/qcollectiongenerator"; # this absolute command should work on most systems. $exec3="/usr/lib/x86_64-linux-gnu/qt4/bin/qcollectiongenerator"; #backup command in case Qt5 is installed too. # define output files $output1="doc/robojournal.qhc"; $output2="doc/robojournal.qch"; print "##########################################################################\n"; print "\t\t\tCompiling Documentation...\n"; print "##########################################################################\n"; # build run command that gets fed into system(); $run = $exec1 . $cmd; # try to build documentation with relative path first. (qcollectiongenerator) system(`$run`); if((!-e $output1) && (!-e $output2)){ print "First documentation build attempt failed. Using alternate path 2...\n\n"; $run = $exec2 . $cmd; } else{ print "\nDocumentation successfully generated.\n\n"; exit(0); } # try to build documentation with absolute path (/usr/bin/qcollectiongenerator) system(`$run`); if((!-e $output1) && (!-e $output2)){ print "Second documentation build attempt failed. Using alternate path 3...\n\n"; $run = $exec3 . $cmd; } else{ print "\nDocumentation successfully generated.\n\n"; exit(0); } # try to build documentation with failsafe path (/usr/lib/x86_64-linux-gnu/qt4/bin/qcollectiongenerator) system(`$run`); if((!-e $output1) && (!-e $output2)){ die "Fatal error! Documentation could not be generated.\n"; } else{ print "\nDocumentation successfully generated.\n\n"; exit(0); }robojournal-0.4.2/doc/img/0000775000175000017500000000000012211723657014102 5ustar willwillrobojournal-0.4.2/doc/img/rj_icon.png0000775000175000017500000000147212142060704016230 0ustar willwillPNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxڌRNQ]23tB\E@@A15!_ૉ?7^4^DAn" v.P'{Z T;2 n7 f uւ^xPmw<7"/{r rJE*o{.꠶GOK)xoKt}8,Ki{]iEuVET!i8vZZ":B0Я}⚃Do;|/u 81*߶C>g)blŠ!ETJGsN#i1EAY^G[PAםwܒ403nj{,NHu⊳yn3S;NC2nR9G @XC;Ҩ Lj9lmk&,T0< 滇lj`FhvIì>m݆la|PT'/ggƏ80su]B`t;](GuUP7xAi|cyiWޓB.׏ΔMw DkӟhF ¶:Rq2qmUH1<ޒrnɍ!%0(}La61Ϥ(9zn+ %U(0(8E/z:`S+yIENDB`robojournal-0.4.2/doc/img/rj_doc_header.psd0000644000175000017500000063500412211723657017370 0ustar willwill8BPSH^^8BIM%8BIM$: uuid:1225FD8FCE11E311AF97B63E0ACEEB2B uuid:1325FD8FCE11E311AF97B63E0ACEEB2B uuid:766563E4CD11E311AF97B63E0ACEEB2B uuid:766563E4CD11E311AF97B63E0ACEEB2B 2013-08-30T18:51:48-05:00 2013-08-30T18:51:48-05:00 2013-08-30T18:51:48-05:00 Adobe Photoshop CS2 Windows application/vnd.adobe.photoshop 3 sRGB IEC61966-2.1 1 720000/10000 720000/10000 2 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;539BF49A0755A6E827637F38945522C7 606 72 1 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;3251C5543A29DEAE770D1BE562318184 8BIMHH8BIM&?8BIM Transparency8BIM Transparency8BIMd8BIM8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM08BIM-8BIM@@8BIM8BIMnullbaseNameTEXTUserboundsObjcRct1Top longLeftlongBtomlongHRghtlong^slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongHRghtlong^urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM H HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km8BIM8BIM #JFIFHH Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?NΧZYmv lcCss2Ec~󺓋]k[Cj`$޵Ֆ"h/p/q5SN"I)qza/>Q=t8gu쎛Tu&+d ۾X6Tv걹X˻ ·YN[dGeU폶Ez=79hdol#5>ط_{rŘydz*clɡ^V|"l&,9F~ɏe̫A57ٍn36~֖?֌:p!/-nEOks]V˽QM7}Bm,eu U]eUv[*ɮOdYzws/Dz׺ݕv,cGϳ>"n8#qq stYzUdEkKu hp~ÇR eGg(̾1P+L׷9~n5[wqj;7"mfck ׻㹛[o?HM2dۑN+ZfӈrV+S]A{nkk`ld6qͿjz[mXk똭Uc'ӟf4agR 龯]8 hƽ6~߲OzIM{u1_u:i^Z6{ic}cwNeefOkŤPΠ,vYSh_Hd}Vw|N}Z[_]eu?ۛ7}OXoum_ {coolJV'M4ecm=⌦̢ʱM*U5\rnë46ޕf{r]{[n0e,iэ mkd=WzʵP~V=6}ycU9)Y[}982ͦ2 Fv7-ԺY]}[בR-#&캖Aǵ詙֫-؏ZQM *{Wf>ƛh9k{?)_;'.s"kwn;v ͿYmJhXeonnH54-xe15S>zLmWzwE鶾V1ݹߣk_oIOpwؾyП[E$e|bK\dUm]}O;o>_*_*_*_*_*_*_*_*_*8BIM!UAdobe PhotoshopAdobe Photoshop CS28BIM".MM*bj(1r2i ' 'Adobe Photoshop CS2 Windows2013:08:30 18:51:48^H&(.HH8BIMmoptHTargetSettingsMttCObjc NativeQuadBl longGrn longRd longTrnsbool addMetadatabool fileFormatenum FileFormatPNG24 interlacedbool noMatteColorbooltransparencyDitherAlgorithmenumDitherAlgorithmNonetransparencyDitherAmountlong8BIM-msetnullVersionlong8BIMms4w8BIM maniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlongFrGAdoub@>FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslongLCntlong8BIMRoll8BIMmfri9tGF { J s8BIMnorm(Layer 08BIMluniLayer 08BIMlnsrlayr8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp R(O'8BIMnorm((RoboJournal Documentation8BIMlfx2 nullScl UntF#Prc@YmasterFXSwitchboolSoFiObjcSoFienabboolMd enumBlnMNrmlOpctUntF#Prc@YClr ObjcRGBCRd doub@oGrn doub@oBl doub@oFrFXObjcFrFXenabboolStylenumFStlOutFPntTenumFrFlSClrMd enumBlnMNrmlOpctUntF#Prc@YSz UntF#Pxl@Clr ObjcRGBCRd doubGrn doubBl doub8BIMlrFX8BIMcmnS8BIMdsdw3x8BIMmul 8BIMisdw3x8BIMmul 8BIMoglw*8BIMscrn8BIMiglw+8BIMscrn8BIMbevlNx8BIMscrn8BIMmul 8BIMsofi"8BIMnorm8BIMTySh#??@T@(2TxLrTxt TEXTRoboJournal Documentation textGriddingenum textGriddingNoneOrntenumOrntHrznAntAenumAnntAnSm TextIndexlong EngineDatatdta! << /EngineDict << /Editor << /Text (RoboJournal Documentation ) >> /ParagraphRun << /DefaultRunData << /ParagraphSheet << /DefaultStyleSheet 0 /Properties << >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> /RunArray [ << /ParagraphSheet << /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> /Adjustments << /Axis [ 1.0 0.0 1.0 ] /XY [ 0.0 0.0 ] >> >> ] /RunLengthArray [ 26 ] /IsJoinable 1 >> /StyleRun << /DefaultRunData << /StyleSheet << /StyleSheetData << >> >> >> /RunArray [ << /StyleSheet << /StyleSheetData << /Font 0 /FontSize 38.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading .01 /HorizontalScale 1.2 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 1.0 1.0 1.0 ] >> /FillFlag true /StrokeFlag false /FillFirst false /YUnderline 1 /OutlineWidth .08101 >> >> >> ] /RunLengthArray [ 26 ] /IsJoinable 2 >> /GridInfo << /GridIsOn false /ShowGrid false /GridSize 18.0 /GridLeading 22.0 /GridColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /GridLeadingFillColor << /Type 1 /Values [ 0.0 0.0 0.0 1.0 ] >> /AlignLineHeightToGridFlags false >> /AntiAlias 3 /UseFractionalGlyphWidths true /Rendered << /Version 1 /Shapes << /WritingDirection 0 /Children [ << /ShapeType 1 /Procession 0 /Lines << /WritingDirection 0 /Children [ ] >> /Cookie << /Photoshop << /ShapeType 1 /BoxBounds [ 0.0 0.0 520.0 57.0 ] /Base << /ShapeType 1 /TransformPoint0 [ 1.0 0.0 ] /TransformPoint1 [ 0.0 1.0 ] /TransformPoint2 [ 0.0 0.0 ] >> >> >> >> ] >> >> >> /ResourceDict << /KinsokuSet [ << /Name (PhotoshopKinsokuHard) /NoStart (00 00    0=]0 0 0 00000000A0C0E0G0I0c000000000000000000?!\)]},.:;!!  0) /NoEnd (  0;[00 0 00\([{ 0) /Keep (  %) /Hanging (00.,) >> << /Name (PhotoshopKinsokuSoft) /NoStart (00 0   0=]0 0 0 0000000) /NoEnd (  0;[00 0 00) /Keep (  %) /Hanging (00.,) >> ] /MojiKumiSet [ << /InternalName (Photoshop6MojiKumiSet1) >> << /InternalName (Photoshop6MojiKumiSet2) >> << /InternalName (Photoshop6MojiKumiSet3) >> << /InternalName (Photoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (Normal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (Normal RGB) /StyleSheetData << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 >> >> ] /FontSet [ << /Name (LiberationSansNarrow-Bold) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (AdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> /DocumentResources << /KinsokuSet [ << /Name (PhotoshopKinsokuHard) /NoStart (00 00    0=]0 0 0 00000000A0C0E0G0I0c000000000000000000?!\)]},.:;!!  0) /NoEnd (  0;[00 0 00\([{ 0) /Keep (  %) /Hanging (00.,) >> << /Name (PhotoshopKinsokuSoft) /NoStart (00 0   0=]0 0 0 0000000) /NoEnd (  0;[00 0 00) /Keep (  %) /Hanging (00.,) >> ] /MojiKumiSet [ << /InternalName (Photoshop6MojiKumiSet1) >> << /InternalName (Photoshop6MojiKumiSet2) >> << /InternalName (Photoshop6MojiKumiSet3) >> << /InternalName (Photoshop6MojiKumiSet4) >> ] /TheNormalStyleSheet 0 /TheNormalParagraphSheet 0 /ParagraphSheetSet [ << /Name (Normal RGB) /DefaultStyleSheet 0 /Properties << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 8 /Zone 36.0 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /AutoLeading 1.2 /LeadingType 0 /Hanging false /Burasagari false /KinsokuOrder 0 /EveryLineComposer false >> >> ] /StyleSheetSet [ << /Name (Normal RGB) /StyleSheetData << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /AutoKerning true /Kerning 0 /BaselineShift 0.0 /FontCaps 0 /FontBaseline 0 /Underline false /Strikethrough false /Ligatures true /DLigatures false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /NoBreak false /FillColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /StrokeColor << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> /FillFlag true /StrokeFlag false /FillFirst true /YUnderline 1 /OutlineWidth 1.0 >> >> ] /FontSet [ << /Name (LiberationSansNarrow-Bold) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (TimesNewRomanPSMT) /Script 0 /FontType 1 /Synthetic 0 >> << /Name (AdobeInvisFont) /Script 0 /FontType 0 /Synthetic 0 >> ] /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 >> >>warp warpStyleenum warpStylewarpNone warpValuedoubwarpPerspectivedoubwarpPerspectiveOtherdoub warpRotateenumOrntHrzn8BIMluni8RoboJournal Documentation8BIMlnsrrend8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@  VhgeeghI @%;$   2  ?. F5 "I9! #J9" #I:" "J:" "L;" #L;# %M>$ %M=$ $O># %O@# &Q?#  &QE 'Qy &Rq& &SԔ+ 'S) (V) )V) *W) )W) )W) )W) +Z) +Z* +[*-\* ,]* ,]+ ,_* -^/_).a_# .aS- .bQ, 0bQ- /bS, 0cS- 2eU/ 2fV/ 2fV/ 1fV. 2gW/ 2gW/ 2hX/ 3iY0 3jY0 3iY0 4k[1 4k[1 5l\2 4m]1 4m]0 7o_4 7p_4 2iZ.  'YQ#Bvn9 'MwʝpG" *Eeu͂s`A& />D=,  %()()*--0/25452220111::<==A@AA@@ABB?<<:9997610.++)'&#%/D85>;%(%'&#% '&) kod6߸%*ҭܾ 篡~  ⫥Þ fɡ  ЙT]  ^^ ܿ{K {ֿTu Ȼ{Q f͢N _Z wksF Hk ~ ل  뗊 } ߌ  |; ԁ_  ~@e  Ͽ\ }攂Ÿ] | zѥ˚Ǘŵ] {'މϾ] {(zС] z)ς޽}tʿZ x'|ߦjxǽY w {۸ɃWddǽY y~!}DjoPfŻX ty ̻ßFDHBĺX u+؇ĜWSvúX t+xßų¸W s,ɝșǾWr-ysúLq-zqpp!ߏ{j]bbfjnmlu^"ovywjnԆ}zmu{xyz}l#ehxz{}l#vmT`yxyz{}~-itVN\wvuxyy|~}i!ԔRMXqstvwyz}yz*juGSjqprtvwwuiCMepnqrttqzij~ mO7j`iw-QC mwM?]ArY}?[AwWv  =[L`}: ?_>^G˒FZV |dOUTN_Q1*#& "$&'&''++..2655500-//19:::AA@A???@@@=;:8769862.,()'%$"&,C6:=A&  (&',&* Qpmjyr2&rf%qsrc%nhib^|mKolJKTUNs Vo{vqqIz[ET[Tw ͗^eoiNǠ nQJTZSw bWMs kPJTZSw ΠdA jPJTZSw ]e iPJTZSwܿzG gOKTZSwֿRx hPKTZSwȻ{S fPKTZSwa̢N dPJTZ[Sw`] cPO]egdcb`_^UxtڒgrwG aTNSX[YXZ[ZZRvr벳̐;p bOENRTTVVWWZQw ƪщY _NKUZ[[ZZ[Z[Twm̪᭯T ^OKTZSw𹫾oa \OKTZSwoӪϘT [OKTZSw y¼ci+a ZOKTZSwyȫ̉U{F YOKTZSw p⬮ȯ\u7K WNKTZSwxZE VNLTZSwmتȞVG UNKTZSwlaz{q~nwFSMLTZSw'pʫȐTFRNLTZSw u孮±bjpkDQMKTYYZYZ[Sw)|鿪ÁWRlwKC ONP\bcba`^Vw o۫Ť\s{qEllQVCNRQVZ][ZSv!u[X-FM5>CNNGNRUVXXQv mͩĖX|V =?'BBLLKTY[Z[Tw!}宮ibu(""!i@JMLTZSw,uÇW~p~a95V|>IMLTZSw,sޫciyvrru}|>HMLTZSw 췬{Xypjqlqq{{|@GLLTZSw-mЩ\qqt|9ELLTZSw-歬q]{`ovxxz~}zzg DMLTZSw!oƩYzs_]_bgihqWCMLTZSw y⫰ib~oBLLTZSww嶫Y}@KMTZ$Swrӧaj}|}>KMTZ#Sw貯v\hk|}>KLSXZ!Tw~apuVc{{|}@A>?@AAAC=<<9997540-++)'&$":>5=9#  &$)#$'  @\]Uci."j^v hnlZҬ!|yJ>?@5W v[xiHcβWt"%&'B QjvrmmE{ug9*,-."G zΔZ`keI Y+"*+,-!G w_RKe U*"*+,-!G Πc> U+"*+,-!G x_Y S*"*+,-!Gܿ{E Q*"*+,-!G sֿUi P*#*+,-!GȻ}M O)#)+,+,-!GPˡOu M)")+,-,.!GS YëbT L)(389865212#HMU 1}F K.'+./../-./!G@-h!*K)d J* $()*)+,!G{XIh  G'$),--,-!G -7b DIW F)#*+,-!G c]0d  D(#*+,-!G CRP2i C(#*+,-!G O&Z#$T.= A(#*+,-!G LBSxO,@'#*+,-!G 81T0JC+X1?'#*+,-!GqO/Sb+>(#*+,-!G&+:G ;3Vjhffgeegfeegffa\WT,;($*+,-!G'^"PJ{gcNPgbJRh_IVj\NY^VU,9'$*+,-!G($D8?#goacjrekztbhvobkseYUS,9'$*+,-!G'G-G!?1l_ekg_@>Zfbedacd_YTR+8'#(+,-!GF)@vl_WZ`.Ye/Ue`a\VRQ)4'(167542100#G65= *0C~j]P^@.IG:/c]^YVPN(3,+.12011../!F!m!G: ~jX]d0 $!^]\YUOM(3)!$'())(**+!G",?-,!W||jTdb0 !][ZWRMK'0&$),-,-!GU+= 3$~~| iPOSE @??CDDCED@B7'%%)+,-!G/'< Uwu|svxy{|~wdPJLOSUUTTUUTTS[E &&%)+,-!G!S,-"wvppuwxyz|~wnnvz{zxc%&%)+,-!G &? h}wxrkqssvwwz{|~v#%%)+,-!G=7 7xmkjlopqstvwxzy|x"%%)+,-!Gv"1vvX[iklnpqrtuvv!%$(*++,"-!GO&  EmIVjijkmooqstryv-%(0443311./#G\}5VFQghgilknponsu+)-/35331001#HwbI 6MMcffgijkmkl|t)(##&')())*, GcxkY6%HI^ccefihggtt##),--,-"GMue:&GHYbabdefbkt%%)+,-!GN~p@$BKZ__`bd`d{t%%)+, -!Gu[yF AP\_]rt%%)+,-!GalLBUZZ\[XXit%%)+,-!G0^V"FWUSSRZe}u%%)+,-!G3<JQMS\mu%%)+,-!GcKWezu%%)+,-!GB$xx%%),- !Gړi%&)'$&(+HA&$-@?@:P{|{yzxfU@$Q~}|zc:^J B“KiIާJgI HfP.K Kk@&K]Pg[ *PVaa`a`a`a`a_[hV "!'&65D=NH;.oTA 5.>HFRn9 6@@`0@`@`p0`@@ @@0@`@@@P@@`@@@@ 0@ pp @ p@0``0@``@@ 0`P`0@`  pp Pp @` p`0```P PP @`PP  `000@PP@0 @00@`P@P@@@0```@00@0@``0@ `@`@@@P߿@߿Ͽ ￿``߿@ P߿@߿@`0P`@P￿ @@ @ `0@ @p0`@@`0`p`P@@@@ `p@@`  P00`@0pp@`P @@ `p@`@ @Pp`@ ``@@``@`p@ 0@0@P0`P@ @0@0@0@P@P@@@p @@0P@p@`@0P@p@P@`@@@P`  `PP ``P@ `@`  @@@@P@@P@ @@@@@@@@@0`@@@@@@@@@@@@@@@@@@ @`@@@@@@@@@@@0@@@@@@@@p@@@@@@@ @@@@p@ ` ```@`0 ``@@0@@ `  @@@@@@@@@0PPp0@@p@P0PP`@ @0@@@@@@0`p@P` `p @` @@@@P`@`@@@@@ @@@@` 0@ 0Pp@Ppp@`@0@@@`0 0P`@@@߿@@`@0`@@@P@@ p` P@@@P0@`@@p@`@`@@@@@ P @@p@PϿ0߿`  ߿`@@@@`PϿ0`P@@@￿@@߿@`P￿@`0P00`  @@pp@@`00P@@@@0@@@@0 0@00@P0000@@@`0P@@@@@@@P PP@@P p``0 0PP0`p ``@@@@ ` 0p @@ p``` @p ` `` `p  `@PpP`@ ` @`P0 @@8BIMPatt8BIMTxt2 /DocumentResources << /FontSet << /Resources [ << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (LiberationSansNarrow-Bold) /Type 1 >> >> >> << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (TimesNewRomanPSMT) /Type 1 >> >> >> << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (AdobeInvisFont) /Type 0 >> >> >> ] >> /MojiKumiCodeToClassSet << /Resources [ << /Resource << /Name () /Members << /ClassMappings [ << /R (55) /C 1 >> << /R (77) /C 1 >> << /R (99) /C 1 >> << /R (;;) /C 1 >> << /R (==) /C 1 >> << /R (??) /C 1 >> << /R (AA) /C 1 >> << /R (CC) /C 1 >> << /R () /C 1 >> << /R (;;) /C 1 >> << /R ([[) /C 1 >> << /R (  ) /C 1 >> << /R (00) /C 1 >> << /R (0 0 ) /C 1 >> << /R (0 0 ) /C 1 >> << /R (00) /C 1 >> << /R (00) /C 1 >> << /R (00) /C 1 >> << /R (66) /C 2 >> << /R (88) /C 2 >> << /R (::) /C 2 >> << /R (<<) /C 2 >> << /R (>>) /C 2 >> << /R (@@) /C 2 >> << /R (BB) /C 2 >> << /R (DD) /C 2 >> << /R ( ) /C 2 >> << /R (==) /C 2 >> << /R (]]) /C 2 >> << /R (  ) /C 2 >> << /R (0 0 ) /C 2 >> << /R (0 0 ) /C 2 >> << /R (0 0 ) /C 2 >> << /R (00) /C 2 >> << /R (00) /C 2 >> << /R (00) /C 2 >> << /R () /C 3 >> << /R (^^) /C 3 >> << /R (0A0A) /C 3 >> << /R (0C0C) /C 3 >> << /R (0E0E) /C 3 >> << /R (0G0G) /C 3 >> << /R (0I0I) /C 3 >> << /R (0c0c) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R (00) /C 3 >> << /R () /C 4 >> << /R () /C 4 >> << /R () /C 5 >> << /R (00) /C 5 >> << /R (  ) /C 5 >> << /R () /C 6 >> << /R (00) /C 6 >> << /R ( ) /C 7 >> << /R (00) /C 7 >> << /R (  ) /C 8 >> << /R ( % &) /C 8 >> << /R () /C 9 >> << /R () /C 9 >> << /R () /C 9 >> << /R () /C 10 >> << /R () /C 10 >> << /R () /C 10 >> << /R ( 0 0) /C 10 >> << /R ( 2 4) /C 10 >> << /R (00) /C 11 >> << /R (0B0B) /C 12 >> << /R (0D0D) /C 12 >> << /R (0F0F) /C 12 >> << /R (0H0H) /C 12 >> << /R (0J0b) /C 12 >> << /R (0d0) /C 12 >> << /R (00) /C 12 >> << /R (00) /C 12 >> << /R (00) /C 12 >> << /R () /C 13 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (00) /C 14 >> << /R (2 2C) /C 14 >> << /R (22) /C 14 >> << /R (22) /C 14 >> << /R (33W) /C 14 >> << /R (3q3v) /C 14 >> << /R (33) /C 14 >> << /R (N) /C 14 >> << /R (09) /C 15 >> << /R (!~) /C 16 >> << /R () /C 16 >> << /R (  ) /C 16 >> << /R (  ) /C 16 >> ] >> >> >> ] /DisplayList [ << /Resource 0 >> ] >> /MojiKumiTableSet << /Resources [ << /Resource << /Name (Photoshop6MojiKumiSet4) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 17 ] /Data << /B << /R [ .25 .25 .25 ] >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 17 /Elements [ << /P [ 17 1 ] /Data << /A << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 18 /Elements [ << /P [ 18 1 ] /Data << /A << /R [ .5 .5 .5 ] >> >> >> ] >> ] >> >> /PredefinedTag 2 >> >> >> << /Resource << /Name (Photoshop6MojiKumiSet3) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 4 >> >> >> << /Resource << /Name (Photoshop6MojiKumiSet2) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 3 >> >> >> << /Resource << /Name (Photoshop6MojiKumiSet1) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 1 >> >> >> << /Resource << /Name (YakumonoHankaku) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 2 >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 1 >> >> >> << /Resource << /Name (GyomatsuYakumonoHankaku) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 3 >> >> >> << /Resource << /Name (GyomatsuYakumonoZenkaku) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 17 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> ] >> >> /PredefinedTag 4 >> >> >> << /Resource << /Name (YakumonoZenkaku) /Members << /CodeToClass 0 /AutoTsume << /TsumeMappings [ << /Before -.5 /Code () >> << /Before -.5 /Code (;) >> << /Before -.5 /Code ([) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code ( ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0 ) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /Before -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (=) >> << /After -.5 /Code (]) >> << /After -.5 /Code ( ) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0 ) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code (0) >> << /After -.5 /Code () >> << /After -.5 /Code (0) >> << /After -.5 /Code ( ) >> << /After -.5 /Code (0) >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code () >> << /Before -.25 /After -.25 /Code (0) >> << /Before -.25 /After -.25 /Code ( ) >> ] >> /Table << /DataArray << /SparseArray [ << /Index 1 /Elements [ << /P [ 1 5 ] /Data << /A << /R [ .25 .25 .25 ] /P 1 >> >> >> ] >> << /Index 2 /Elements [ << /P [ 2 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 2 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 2 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 2 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 11 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 3 >> >> >> << /P [ 2 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 2 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 3 /Elements [ << /P [ 3 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 3 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 3 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 3 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 3 15 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 3 16 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 4 /Elements [ << /P [ 4 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 4 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 4 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 4 15 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 4 16 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> ] >> << /Index 5 /Elements [ << /P [ 5 1 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 2 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 3 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 4 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 5 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 1 >> >> >> << /P [ 5 6 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 7 ] /Data << /B << /R [ .25 .25 .25 ] /P 1 >> >> >> << /P [ 5 8 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 9 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 10 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 11 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 12 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 13 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 14 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 15 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 16 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 5 17 ] /Data << /B << /R [ .25 .25 .25 ] >> >> >> ] >> << /Index 6 /Elements [ << /P [ 6 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 6 3 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 4 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 5 ] /Data << /B << /R [ 0.0 .75 .75 ] /P 1 >> >> >> << /P [ 6 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 6 8 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 9 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 10 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 11 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 12 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 13 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 14 ] /Data << /B << /R [ 0.0 .5 .5 ] >> >> >> << /P [ 6 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 4 >> >> >> << /P [ 6 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 7 /Elements [ << /P [ 7 1 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 3 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 4 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 5 ] /Data << /B << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 7 7 ] /Data << /B << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 7 8 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 9 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 10 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 12 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 13 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 14 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 15 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 16 ] /Data << /B << /R [ 0.0 .5 .5 ] /P 2 >> >> >> << /P [ 7 17 ] /Data << /B << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 8 /Elements [ << /P [ 8 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 8 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 8 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 8 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 8 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 8 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 9 /Elements [ << /P [ 9 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 9 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 9 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 9 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 9 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 9 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 10 /Elements [ << /P [ 10 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 10 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 10 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 10 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 10 15 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 10 16 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 11 /Elements [ << /P [ 11 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 11 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 11 15 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> << /P [ 11 16 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 4 >> >> >> ] >> << /Index 12 /Elements [ << /P [ 12 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 12 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 12 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 12 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 12 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 12 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 13 /Elements [ << /P [ 13 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 13 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 13 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 13 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 13 15 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 13 16 ] /Data << /B << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> ] >> << /Index 14 /Elements [ << /P [ 14 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 14 3 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 14 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 14 8 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 9 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 10 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 12 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 13 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 14 ] /Data << /A << /R [ 0.0 0.0 1.0 ] >> >> >> << /P [ 14 15 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 14 16 ] /Data << /B << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 15 /Elements [ << /P [ 15 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 15 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 15 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 15 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 15 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 15 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 15 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 15 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 16 /Elements [ << /P [ 16 1 ] /Data << /A << /R [ 0.0 .5 .5 ] /P 3 >> >> >> << /P [ 16 3 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 4 ] /Data << /A << /R [ .125 .25 .25 ] /P 4 >> >> >> << /P [ 16 5 ] /Data << /A << /R [ 0.0 .25 .25 ] /P 1 >> >> >> << /P [ 16 7 ] /Data << /A << /R [ 0.0 0.0 0.0 ] /P 2 >> >> >> << /P [ 16 8 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 9 ] /Data << /A << /R [ 0.0 0.0 .5 ] /P 4 >> >> >> << /P [ 16 10 ] /Data << /A << /R [ 0.0 0.0 .5 ] >> >> >> << /P [ 16 12 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> << /P [ 16 14 ] /Data << /A << /R [ .125 .25 .5 ] /P 4 >> >> >> ] >> << /Index 17 /Elements [ << /P [ 17 1 ] /Data << /A << /R [ .5 .5 .5 ] >> >> >> ] >> << /Index 18 /Elements [ << /P [ 18 1 ] /Data << /A << /R [ .5 .5 .5 ] >> >> >> ] >> ] >> >> /PredefinedTag 2 >> >> >> ] /DisplayList [ << /Resource 0 >> << /Resource 1 >> << /Resource 2 >> << /Resource 3 >> << /Resource 4 >> << /Resource 5 >> << /Resource 6 >> << /Resource 7 >> ] >> /KinsokuSet << /Resources [ << /Resource << /Name (None) /Data << /NoStart () /NoEnd () /Keep () /Hanging () /PredefinedTag 0 >> >> >> << /Resource << /Name (PhotoshopKinsokuHard) /Data << /NoStart (!\),.:;?]}    0!! 0000 0 0 0000A0C0E0G0I0c000000000000000000000000 =]) /NoEnd (\([{  00 0 0000 ;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 1 >> >> >> << /Resource << /Name (PhotoshopKinsokuSoft) /Data << /NoStart (  0000 0 0 00000000 =]) /NoEnd (  00 0 000;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 2 >> >> >> << /Resource << /Name (Hard) /Data << /NoStart (!\),.:;?]}    0!! 0000 0 0 0000A0C0E0G0I0c000000000000000000000000 =]) /NoEnd (\([{  00 0 0000 ;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 1 >> >> >> << /Resource << /Name (Soft) /Data << /NoStart (  0000 0 0 00000000 =]) /NoEnd (  00 0 000;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 2 >> >> >> ] /DisplayList [ << /Resource 0 >> << /Resource 1 >> << /Resource 2 >> << /Resource 3 >> << /Resource 4 >> ] >> /StyleSheetSet << /Resources [ << /Resource << /Name (Normal RGB) /Features << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] >> >> >> ] /DisplayList [ << /Resource 0 >> ] >> /ParagraphSheetSet << /Resources [ << /Resource << /Name (Normal RGB) /Features << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 0 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /KurikaeshiMojiShori false /Kinsoku /nil /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << >> >> >> >> ] /DisplayList [ << /Resource 0 >> ] >> /TextFrameSet << /Resources [ << /Resource << /Bezier << /Points [ 0.0 0.0 0.0 0.0 520.0 0.0 520.0 0.0 520.0 0.0 520.0 0.0 520.0 57.0 520.0 57.0 520.0 57.0 520.0 57.0 0.0 57.0 0.0 57.0 0.0 57.0 0.0 57.0 0.0 0.0 0.0 0.0 ] >> /Data << /Type 1 /LineOrientation 0 /TextOnPathTRange [ -2.0 -2.0 ] /RowGutter 0.0 /ColumnGutter 0.0 /FirstBaselineAlignment << /Flag 1 /Min 0.0 >> /PathData << /Spacing -2 >> >> >> >> ] >> >> /DocumentObjects << /DocumentSettings << /HiddenGlyphFont << /AlternateGlyphFont 2 /WhitespaceCharacterMapping [ << /WhitespaceCharacter ( ) /AlternateCharacter (1) >> << /WhitespaceCharacter ( ) /AlternateCharacter (6) >> << /WhitespaceCharacter ( ) /AlternateCharacter (0) >> << /WhitespaceCharacter ( \)) /AlternateCharacter (5) >> << /WhitespaceCharacter () /AlternateCharacter (5) >> << /WhitespaceCharacter (0) /AlternateCharacter (1) >> << /WhitespaceCharacter () /AlternateCharacter (3) >> ] >> /NormalStyleSheet 0 /NormalParagraphSheet 0 /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 /UseSmartQuotes true /SmartQuoteSets [ << /Language 0 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 1 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 2 /OpenDoubleQuote (0 ) /CloseDoubleQuote (0 ) >> << /Language 3 /OpenDoubleQuote (0 ) /CloseDoubleQuote (0 ) >> << /Language 4 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) >> << /Language 5 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) >> << /Language 6 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) >> << /Language 7 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 8 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 9 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 12 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 13 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 14 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 15 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 16 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 18 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) >> << /Language 22 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) >> << /Language 23 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) >> << /Language 25 /OpenDoubleQuote (0 ) /CloseDoubleQuote (0 ) >> << /Language 28 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 29 /OpenDoubleQuote (0) /CloseDoubleQuote (0) >> << /Language 30 /OpenDoubleQuote (0 ) /CloseDoubleQuote (0 ) >> ] >> /TextObjects [ << /Model << /Text (RoboJournal Documentation ) /ParagraphRun << /RunArray [ << /RunData << /ParagraphSheet << /Name () /Features << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 8 /PreHyphen 3 /PostHyphen 3 /ConsecutiveHyphens 2 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 1 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /KurikaeshiMojiShori false /Kinsoku /nil /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] >> >> /Parent 0 >> >> /Length 26 >> ] >> /StyleRun << /RunArray [ << /RunData << /StyleSheet << /Name () /Parent 0 /Features << /Font 0 /FontSize 38.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading .01 /HorizontalScale 1.2 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 1.0 1.0 1.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst false /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth .08101 /MiterLimit .32404 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] >> >> >> /Length 26 >> ] >> /KernRun << /RunArray [ << /RunData << >> /Length 26 >> ] >> /AlternateGlyphRun << /RunArray [ << /RunData << >> /Length 26 >> ] >> >> /View << /Frames [ << /Resource 0 >> ] /RenderedData << /RunArray [ << /RunData << /LineCount 1 >> /Length 26 >> ] >> /Strikes [ << /StreamTag /PathSelectGroupCharacter /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 0 /Children [ << /StreamTag /FrameStrike /Frame 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 520.0 57.0 ] /ChildProcession 2 /Children [ << /StreamTag /RowColStrike /RowColIndex 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 520.0 57.0 ] /ChildProcession 1 /Children [ << /StreamTag /RowColStrike /RowColIndex 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 520.0 57.0 ] /ChildProcession 2 /Children [ << /StreamTag /LineStrike /Baseline 27.54965 /Leading 0.0 /EMHeight 0.0 /DHeight 0.0 /SelectionAscent -32.07178 /SelectionDescent 11.52246 /Transform << /Origin [ 0.0 27.54965 ] >> /Bounds [ 0.0 -32.07178 520.0 11.52246 ] /ChildProcession 1 /Children [ << /StreamTag /Segment /Mapping << /CharacterCount 26 >> /FirstCharacterIndexInSegment 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 1 /Children [ << /StreamTag /GlyphStrike /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 -32.07178 513.11121 11.52246 ] /Glyphs [ 53 82 69 82 45 82 88 85 81 68 79 3 39 82 70 88 80 72 81 87 68 87 76 82 81 3 ] /GlyphAdjustments << /Data [ << >> ] /RunLengths [ 26 ] >> /VisualBounds [ 0.0 -4.52213 513.11121 39.07211 ] /RenderedBounds [ 0.0 -4.52213 513.11121 39.07211 ] /Invalidation [ 0.0 -4.52213 534.99902 39.07211 ] /ShadowStylesRun << /Data [ << /Index 0 /Font 0 /Scale [ 1.2 1.0 ] /Orientation 0 /BaselineDirection 2 /BaselineShift 0.0 /KernType 1 >> ] /RunLengths [ 26 ] >> /EndsInCR true /SelectionAscent -32.07178 /SelectionDescent 11.52246 >> ] >> ] >> ] >> ] >> ] >> ] >> ] >> /OpticalAlignment false >> ] /OriginalNormalStyleFeatures << /Font 1 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] >> /OriginalNormalParagraphFeatures << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 0 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /KurikaeshiMojiShori false /Kinsoku /nil /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << >> >> >> (+0242347MljzvoF4`w`qW\oSeIGGEDDDBA<;966420.09OC@HE1  -./020115KjizwrD2]w_qUYs~Rc}GFECBADCA=973420.-16NAEGL2$ )33231216Kkl{vpE3_`rWZnSd~MHGFDDDB@?;866420)/,EI@GD/. ",HGTM^ZI<}cR0A%)<LWVb~I,H οҭ꫸ 篡޸ϣ ⫥ðØ fɡ߽ ЙT]ݺ ^^ܹܿ{Kܺ{ֿTu@@ݹȻ{Q@`@p@@p@ݷf͢N @@`@ܷ_Z@@@@pڶwksFP@@0pڶHkP@ `0@ `۴~ ل``@@`ڴ 뗊 ߏ`@`@ ߏP@@pπP@p@p@PPp@Pp@Pߏ`@`﯀@` 00@Pp@p@P߀@`@`@@ 0`ٲ}p@@@p@ `@` @@@@`@@@`@00`p@`  @@ ٱߌ@@0`@`@@@@@0 0@0`0@p@00@ر|`  @0@` @0p0@ @@@@@@p @00p @0@ @0 @p0``@@@0@@@`@ٱԁ` 0 @@P@@`@@  0 0 p@ ` P 0  0@0Pp@p ٰ ~0@@0@@`@@0p@p `@ 0p@0@p ذ п@P`p@@ 0`0@P @@ p@@`p@0@0p0P p@@@`0׬攂Ÿ0@p@@@p@@ p@@@0@` p@@@P0@`֬ zѥ˚Ǘŵp@` @0@@`@ߟP@ @`0@0@P@ @@﯀`@0@ `p`ի'މϾ`@@@@@@@@`@@@@@@@@@@@֫(zС00@@@@@@@@@@@@@@@@@0@@֫)ς޽}tʿ@@@@@@@@@``@P@@@@@@ @@@@@֫'|ߦjxǽp@` @ @ @@P` `@@@`@@@@ ```ԩ {۸ɃWddǽ @@p@pP@p0p@0`@@0@@@@@@P00ԩ~!}DjoPfŻ ``P@ 0p @ ` @@@`0 ``P@@@@@@@ԧ}y ̻ßFDHBĺP@@ `P pP@`@ @ 0@@@ ` @P@@`@`P0ҧ+؇ĜWSvúP0 @@ P0 `@@P@@`P@0 @p`00 @@@@`@@@0߀@pӥ~+xßų¸0@ @@ @ p@0 @0`@@p@@0@ 0@0@@@0@@ @p @ @0 @0@0@@`ӥ},ɝșǾ@ @0``0`߀@0 0 0@@@0 @@@0`ӣ{-ysú@`@Pp @`@ 0@p00@``@@@@`@p@`@@ Ҥz-zqpߏ`@pπ@πP@﯀@Pp@``@@`߀@@ߏ`@pp@` p@@Pp@``@P@@pP@@pp@p@PУz!ߏ{j]bbfjnmluexѡyvywxѡxԆ}zѠwu{xyz}Ϡu#ehxz{}Рu#vmT`yxyz{}~/ϟstVN\wvuxyy|~}͝r!ԔRMXqstvwyz}yz,͜suGSjqprtvwwu͜rCMepnqrttqzΜr @@p@pP@p0p@0`@@0@@@@@@P00ԧZNGNRUVXXQv mͩĖX|V =?'B ``P@ 0p @ ` @@@`0 ``P@@@@@@@ԦXLKTY[Z[Tw!}宮ibu(""!iP@@ `P pP@`@ @ 0@@@ ` @P@@`@`P0ҦWMLTZSw,uÇW~p~a95V}P0 @@ P0 `@@P@@`P@0 @p`00 @@@@`@@@0߀@pӤVMLTZSw,sޫciyvrru}}0@ @@ @ p@0 @0`@@p@@0@ 0@0@@@0@@ @p @ @0 @0@0@@`ӤUMLTZSw 췬{Xypjqlqq{{}@ @0``0`߀@0 0 0@@@0 @@@0`ӢSLLTZSw-mЩ\qqt|@`@Pp @`@ 0@p00@``@@@@`@p@`@@ ңQLLTZSw-歬q]{`ovxxz~}z|ߏ`@pπ@πP@﯀@Pp@``@@`߀@@ߏ`@pp@` p@@Pp@``@P@@pP@@pp@p@PТQMLTZSw!oƩYzs_]_bgihq^qѠPMLTZSw y⫰ib~}ѠOLLTZSww嶫Y}џMKMTZ$Swrӧaj}|}ϟJKMTZ#Sw貯v\hk|}ПJKLSXZ!Tw~apuVc{{|}ϞIJOZa`^!]Tx˫qY\Q^yyx{}~.͜GPRW_`__^]\]TxӼ`QRZswwx{|}}~͛INGLPSTUWXRvʲUOVntuvwzx͛GIKTZ[Z[TwúXKQhtqsuwvt}ΛFKMTZSwıUEVjpoqsuov͚GKMTZSwPD[llkoomn͚GKMTZ SwPF`jgz͙GKMTZSw@QKcdab`hu̘FKMTZSw8?%S[[`l̗FKMTZSwu%Sev̘FKMTZSwN*˖FKMTZ[ TvÈ˖FKNVTS TUWXPwa ʕGMMBRdcbc`t wc^ ˔GM4f  yBmi ˔I?@5W v[xiHct"%&'B QjvrmmE{ϳs9*,-."G zΔZ`keIg+"*+,-!G w_RKe߼d*"*+,-!G Πc>ݹd+"*+,-!G x_Yܸb*"*+,-!Gܿ{Eܹ`*"*+,-!G sֿUi@@ݸ_*#*+,-!GȻ}M@`@p@@p@ ݶ])#)+,+,-!GPˡOu @@`@ ܶ[)")+,-,.!GS YëbT@@@@pڵ[)(389865212#HMU 1}FP@@0pڵZ.'+./../-./!G@-h!*K)dP@ `0@ `۳X* $()*)+,!G{XIh ``@@` ڳU'$),--,-!G -7b DIW ߏ`@`@ ߏP@@pπP@p@p@PPp@Pp@Pߏ`@`﯀@` 00@Pp@p@P߀@`@`@@ 0`ٱT)#*+,-!G c]0d p@@@p@ `@` @@@@`@@@`@00`p@`  @@ ٱR(#*+,-!G CRP2i@@0`@`@@@@@0 0@0`0@p@00@رQ(#*+,-!G O&Z#$T.`  @0@` @0p0@ @@@@@@p @00p @0@ @0 @p0``@@@0@@@`@ٰP(#*+,-!G LBSxO` 0 @@P@@`@@  0 0 p@ ` P 0  0@0Pp@p ٯN'#*+,-!G 81T0JCX0@@0@@`@@0p@p `@ 0p@0@p دM'#*+,-!GqO/Sb@P`p@@ 0`0@P @@ p@@`p@0@0p0P p@@@`0׬L(#*+,-!G&+:G ;3Vjhffgeegfeegffa\WU0@p@@@p@@ p@@@0@` p@@@P0@`֫I($*+,-!G'^"PJ{gcNPgbJRh_IVj\NY^VVp@` @0@@`@ߟP@ @`0@0@P@ @@﯀`@0@ `p`ժH'$*+,-!G($D8?#goacjrekztbhvobkseYUT`@@@@@@@@`@@@@@@@@@@@֪H'$*+,-!G'G-G!?1l_ekg_@>Zfbedacd_YTS00@@@@@@@@@@@@@@@@@0@@֪G'#(+,-!GF)@vl_WZ`.Ye/Ue`a\VRR@@@@@@@@@``@P@@@@@@ @@@@@֪B'(167542100#G65= *0C~j]P^@.IG:/c]^YVPOp@` @ @ @@P` `@@@`@@@@ ```ԧA,+.12011../!F!m!G: ~jX]d0 $!^]\YUON @@p@pP@p0p@0`@@0@@@@@@P00ԧA)!$'())(**+!G",?-,!W||jTdb0 !][ZWRML ``P@ 0p @ ` @@@`0 ``P@@@@@@@Ԧ>&$),-,-!GU+= 3$~~| iPOSE @??CDDCED@Ecߏ`@pπ@πP@﯀@Pp@``@@`߀@@ߏ`@pp@` p@@Pp@``@P@@pP@@pp@p@PС6%%)+,-!G/'< Uwu|svxy{|~wdPJLOSUUTTUUTTS[Mjџ4&%)+,-!G!S,-"wvppuwxyz|~wnnvz{zxrџ4&%)+,-!G &? h}wxrkqssvwwz{|~ў2%%)+,-!G=7 7xmkjlopqstvwxzy|Ϟ0%%)+,-!Gv"1vvX[iklnpqrtuv О/%$(*++,"-!GO&  EmIVjijkmooqstry/ϝ-%(0443311./#G\}5VFQghgilknpons-͛*)-/35331001#HwbI 6MMcffgijkmkl|+͚,(##&')())*, GcxkY6%HI^ccefihggt ͚*##),--,-"GMue:&GHYbabdefbkΚ*%%)+,-!GN~p@$BKZ__`bd`d{͙+%%)+, -!Gu[yF AP\_]r͙+%%)+,-!GalLBUZZ\[XXi͘*%%)+,-!G0^V"FWUSSRZe}̗)%%)+,-!G3<JQMS\m̖)%%)+,-!GcKWez̗)%%)+,-!GB$x˕)%%),- !Gړy˕)%&)'$&(+HVʔ*&$-@?@:P{|{yzxfUU ˓)$Q~} |zc:^] ˓+B“Ki]ȑ*ާJg\Ȑ) Hf`͖2.KKkaئ\)K]Pgan 佉H2PVaa`a`a`a`a_[h_Zز\>FJIMScպ|}|ɻVhgeeghI @%;$   2  ?. F5 "I9! #J9" #I:"@@ "J:"`0@`@`p0 "L;"`@@  #L;#@@0@` %M>$@@@P %M=$@@`@@ $O>#@@ 0@ %O@# pp @ p@0``0@``@@ 0`P`0@`  pp Pp @` p`0```P PP @`PP  `0 &Q?# 00@PP@0 @00@`P@P@@@0` &QE``@00@0@``0@ `@`@@@ 'QyP߿@߿Ͽ ￿``߿@ P߿@߿@`0P`@P￿ @@ &Rq& @ `0@ @p0`@@`0`p`P@@@@ `p@@`  P00`@0pp@`P  &SԔ+@@ `p@`@ @Pp`@ ``@@``@`p@ 0@0@P 'S)0`P@ @0@0@0@P@P@@@p @@ (V)0P@p@`@0P@p@P@`@@@P )V)`  `PP ``P@ `@`  @@@@P@@P@ *W) @@@@@@@@@0`@@@@@@@@@@ )W)@@@@@@@@ @`@@@@@@@@@@@ )W)0@@@@@@@@p@@@@@@@ @@@@p@ )W) ` ```@`0 ``@@0@@ `  @@@@@@@@@ +Z)0PPp0@@p@P0PP``@ @0@@@@@@0`p@ +Z*P` `p @` @@@@P`@`@@@@@ @@@@` 0@ +[* 0Pp@Ppp@`@0@@@`0 0P`@@@߿@@`@0`@-\*@@P@@ p` P@@@P0@`@@p@`@`@@@@@  P @@ ,]*p@PϿ0߿`  ߿`@@@@`PϿ0`P@@@￿@@߿@`P￿@ ,]+`0P00`  @@pp@@`00P@@@@0@@@@0 0@ ,_*00@P0000@@@`0P@@@@@@@P PP@ -^@P p``0 0PP0`p ``@@@@ ` 0p @@ p``` @p ` `` `p  `@PpP`@ ` @`P0 @@/_).a_# .aS- .bQ, 0bQ- /bS, 0cS- 2eU/ 2fV/ 2fV/ 1fV. 2gW/ 2gW/ 2hX/ 3iY0 3jY0 3iY0 4k[1 4k[1 5l\2 4m]1 4m]0 7o_4 7p_4 2iZ.  'YQ#Bvn9 'MwʝpG" *Eeu͂s`A& />D=, robojournal-0.4.2/doc/img/screens/0000775000175000017500000000000012211723646015542 5ustar willwillrobojournal-0.4.2/doc/img/screens/mw_delete3.png0000775000175000017500000006445412142060704020310 0ustar willwillPNG  IHDRH:ngAMA7tEXtSoftwareAdobe ImageReadyqe<hIDATx xաxNU$ޒY*r(u[hK[(4rm[-uK.[I! XVg#vVۉw[ۼgf$Y%KNyfΜ9R^ӫ٬=yzЍ>ʸ(˱cۥ4)oew紞1gޖ7E:zi <)-BF]C{re)8D[S%k$e>)̕IK ,uҹp qKnYG*%TNrLQv]>Pnn˓:d_PZ$7ժ{6,^N]<ʞ2{.p2~p>Ϻ4=wFr֯7..u"ϾfKŵq(sO~u9!U[K/l5Bp9eS:15c{kD%()2iLtcOsl{S.HrĔ>5m4n3o_i`](]/? |S-]tqmg(Nf'ked=!DSY~,C(=(.MQ{X|DjywMClF5ObƣH)%^´sqd|,=9at8ÔS}yɂ5t8>&xz;G:㹌%x9u+t2$]=e+{Z C[+Ž! +IQ)Qf^([%Wg_7Qe.h#\A]\uڒGWc־5+Nw/eenx䶙R-{ k^fҟ74YY,m{]Xݙ浯I~_ZЗ咀yF女*^;oj"MzP\Nߑ',2B"x-oGEV[^i~޾Iʻ^XvKXIT-+M{H-mc{OJ%t.ժwc/>WxSG޻[?Tü/{Wn8wG,44pQ[?}+w W!OY3$)w.O=掻Y?-;?8eEI)tZǰw%C jPpC[v0oJSVKu«qՏmٯӝn'V"m yg^r,ʙ[,_{֝7=I`4jE) u+꼻ۗ`BWFJ>(Kv|N ykքO3=+2tQR#Lʲ[Hn)<4H_ؤ .GGKT`u 7|ң¥|${7J %:iזv}mٷfe[Jқ2mG`iӥn)I7+詉z:8m],x/223sr"mp8iGQzCdE:Skg->:+e m =M[<}\/Wy[푶;cܐO>SsՋ>|I xj{u߹g+ֿv{oi949o˔"ݲo˘\{̒ :Q&33#Ŋ2?W!d*sedG}wHշ[@ zQDH MҒz>'\&6&CuOb։)81cג{Ow# g,oNO0̿HT?\`+Jn,DC,]ԘC 9g?/+9ise6|r'@6~2@jҾ 㣏> {5sF EY'dIĘIG@*2z1nt]Q"0#F&t)(mwErW7fWW-W]nὪ{爻g+ 9(77ݫH*:%q6O§U#Xƽlj-+ +L=Au艹ƻ=Jo7^;ׇ"WֿsR $h K/4K͙%]{vϞ>3UC[2C'!Y!$5r}p ?w"H z{^Z7YkKO?#Ji1=e>.C {p˵pޓO^wP%wszJ;tKs콿v;=qљ?>gƚgXg.Y&~Ң'HZH92ݚJEgyyb{[7ddtî,SkvD)ןࣈ2w?zeyϚ61\YqF(ize93gnakwΚ3S)ōߎ/sC3%׫R=pY?ݑG3mֲźY-͜}4_{ݢa##h,]6KYޱqg`ԧ_CZX?O?Q^WF'Zy_k _[Υ.z?zrYw<~݈3?ښ'_u͟/^ :⥷}WLzIV{ʭuŠeڡlPxO{HWY5D,¿V@?cmދlV.׾3NmizKREKK^U>a)i֒Iu=b}]<}z?wDS!ۃmr537n@R6x+W ˈ2 j | ]&L"q#Id|H+@_)fl F|WFH )"}HKinn@Dy12 RLii@ J9?>uV NJ26 k|8Pl`Z eNa 8ƕ {;sewt:gΜ9r e)utrcm[!//$_KK,+ -Ǵx6Dtz`;|2曳.,OO>dBgggSSg;ta]ݻUd23}\.!~777744 4(==+_JYnױfr8.}̐ZZ~Sy &9y')|2R\͛ /xG0?it$Z7dXxMGNv4jXVSkv./1rv}kV䧿pZr_yD^+^j7x`ݝ?G]QCӺn;;;Sz((39RCҥ5~z@{îm;\l>j{ӎ}ol"?VI}G]i+s䦦&0C9z#F Qf=WW\_LJg.^nv5Ks\رcՋy'?6~G?$/$p{, gjD, 8MI&ܧ;|fCߌx.承t"ʈeq <.JK-c̰-] -].М]7-tbTCtJ.#]TEI"'qܦVgSkoU[_H:tI[8],mMw09{xNykS_\Q.ڃq9Ǐ3fLr̸q3_꫇ JNBQ_to8F^2Z,|yvWj?}q5555#-wu'D{L𠠒;]#I,#Gg·kjOp LͷixCN9 T\DZ bH3ÇEo%o۶+4ivСCyןwy"hY24) ##ˍM1]6/͗cj>}z+oῦ~s̄ d=l/\S^=;EOT_wvˈF<"VZ{賳_U'DyOseċ?\/_:qy $n]]]bujpzR̈#_fb^Tr`aBṇ-v!NGR ?LIrju~k_v\hG6/C],E$ϖs牸Xnڴk}qxo\ɣ'>hOEU19CD[_C1xѝc&~)]#'9'G?}RKGuW0k:t}ǛEgu2r )ç;WFd*Z\Mqۻweˢtoeo:p ?}V7mIlk~G۴߶N{O|ໟœv[r%Lݛ-~tw˞`"d3^iF/SL0a„̸uFuqsrr^x|9ns&ەKysA[{Ɨc:O`wi;'w(}+#{;&b?rVkAޱv:!?>XݙP<4;?N{KH:qx*=ⷈ/Ⲥ1%c#'.~ɞ3`G{)Vǀ\ߛtQ!DLZo[OзڑN=ۙ+_o";v9F~$6SNThii~D9x*v]v;äEikkd'.㼩_Ι?")'f?଎. AuMǛ'DЍw,͟U4/+&2"hoi!sۻEIN–CS64JL.u;u oҠd?~[:]Nw%=WU?zcd3i=9{>O[#p(cxBvv+q;9aÆ9rDDI&-HiǏeo Rsp(/]UU6jW^}_L~1Z᳗ٿyj7'%YUA">qǛ'ڜٙi#dmX)-̹2;vbE/̙#M*ρ癚:}D{g[WW[~ݜn~t}^vqFϷ̟?k5OtFz=|,̖"&H3"vhit&cD'_.4ydڻ ]N9;|V1td=a|.ޗ2dZΣ[uFccxD 2D@,G*}KǏ/^X<-ſ;}x[w#B2 :TS 7g0b ̀|`iχ.l\}FK2 }S 6xi@`rpff&Sd uLϕ!T3L=| RŸ/7th E|pv)WL pڅ+wV!~777z5b3+flOh#O]?dȯ\=oF{36K 2``Q^AVӔB=p @F)JW?Xx4D20Ԏ27Wv?~ȑ#bsss'M4zh>$!D}S߉g7n"Ȳ,b͎;Dʹ袋Ľ< +c;I&0aBuu:" ѾNRs=7ҽ"ן5ˬ1lh-ˏqSS)ʄ+I:I-ѣG233͎&bO.6HV1T%<9Qo_'c8qDWWXv:---b@Q&ʴ;:¤!C9rĈ JKKArE[B]mmhJ (N l`ȷ,[+ z Y&$x~8NʥnqW&sYi:- 3)+L[2o0IںBruQ,ޘݠT*]f̅fSVTm[ҚS[5JoVSPH,ɨ)%M*+ia2Z|(qS+y905x:4{3 %% LtA,X70֚Q#K'pR*-'KLU s NOJ+`LZ/hiFѢ9TrsٷJ봎CQ#!]$YQ&t2R_ʸU(iIJn^3⚯thXC71.c5?nY'6ƣni6{HY+'`vx]ĝe2"4553&++X: :W;?64 JJ%u8h5/ CuuA/u՞"{QѪLQe_YH87o{֮]m#cq^[0%`ؔEIzH:*%뽻<M@Q1+W7o^;_܌Sy4$l\d÷]"K=QRq^D۾@:cgOL[͚2eκso.m)荽EX\l+'W2gC aǭN7bM(I{z{';*z[TT޶t|"+D/*/ G)bo ud<xFe￐`Q=*:TFVn3jDĹM_Q2b \z1VKQX\6Dz(VRFWVJ=L\}|~A  嚭6l6[|}FSK&'UEJjTJ,E^Wk*d%+YFI2F!нb:XLEsw+1T.6$0ShBaF))hKC11EI2FO( N2a[3(U /'NkGV˦1EkW|:cd"vzhIoC 6&^+Œr\Kl`PEZ67(m+nL<[}`y[ݶg*w}>o;1Zl"^I]i"hz(zW+bS2&=U*}\J5˄+;?I҉dY~cquC Җ_[yZ} soY:`qnlKb`gS7+|7W=wVch.1x\mv'x;߾`u[o:nh~NKU{F]ϼ3VgcYqW*SaΔ3DD|4K1g@ңLNN R0ptqßsF,,ze6lo:6(30Կ1B3--]'^[vx/Qf`[꫞s4?beFfvͅ2鮴EjWQ.4@+zDd嘬cn{hϥpeCM%RiٷqYMi/gOV Q&r-ٮڬ)Sƞz/l0EPRb2i[sYi^IG@9snи% [>nݽw֏ߋgF}^Y} g9쾅mkY߈PpL*)ɋGt̘*M&_~!1'ki.h)/M0\5mm~'Q*=[y+!Gx)N?LcDټzN9F d:_ZM:kO*5ZٳX0(,&Se䕖=o%saTS*+[Z=`'%J+Ӷ.)WlSHb[2x/:X}\%o"0,WܻAuT<0PFN?̙2O'c _X98(3<{V/J5aĚD$JKoy Cmu۞0sx6w<+#˭ygD\|/{Wb6'Gu՞czj>do'V2dw&ibT𘑹:Or(wf}$en6\YuЬ~{קn] N1<φq1/*Sa`)2SB3ilL4H|` lt gtҲG,,zeԽz}Z{76(304wɄS/fZZNͽ1ʷdW=h)~ʌ[r mƢ !)PS@E@9rLIWkzvo]Z$#(Cr-ٮڬ)Sƞ:R⪎ g} 1A4luIF%(<h:SYYoQQz[z uh(αն(=XVaӋ;br#%@9}/$ccEh)^m6V^ns_Br-5b1>Ş?b%euUT^ae =wKQXM3%X,6KMJ {rzk@Q^?q ʜ}|~A nJQ\Ymk4z|ObQUhQz JvZR}_CVRsW~yUE%z(6VdzN<칇Kd(sjk9fիjޭL4("jEb[yͦve$ˡ/>{)6$''G ,0Q Sj%7yiUHjtc[9bh/UX{oI"vDhAo}e\+㨕sg紊"mqoHYG -@9seX!mT|wbL1ʐFX\,Em0&XEl xbZĭ"m7neZE7ozQLࣄkd:,ol?.zȲtA}+C]}߻~b-K,ҭm=^wuS"Y8+O]Nչ# ~ܿws#Oi77kiO8njՖ?8`yG3 _')uʪfxLQeHq]OMR)l2k_;8i+/(P\U?j OVZseQ&''`D @2ֲ|ƻB0te({Lm޼yRV3 Xb-[^N.,2I[oG?ZvmL%%mdjjVeQ 7 fY2T+%^<ecsƺ` Œ1S<{pVKGrN1(J%A2KR^^ķ ʜ# 1A$'^( ~ضmv[o,PZ gkMg2IJ $Tnm.7}pI/33KL1jseeefZCb %5bY +J2 8oVh]0^|q eҗ24H Ql2?\QwYzuo[鋫:T" %DosڵkcXQUX2eNYryMo43 YB?xVUFk{V+ >"(1:eX ,FmB*W2Uưۨ\PyH]bmO6*ʋԝ—cWx_F# alrm(Xlb}φۨW}FY.[Kz rM-(\9Fgg]ONgUUv[ocgb+ACI N[yRP2I*L+V=󮖢r})KuMmbK+5}-Q&~9*_߈n&)`2J}vmbۊIr@2e j+::"D⪎^6٦q_\2DeLNN R2`ˠ ptqßsF,,ze6lo:6(30Կ1B3--]'^[vx/Qf`Od W=h)~ʌpۚ u=ˬ\5qįf1h-OIĭi @@9&뤫si^=Zmkk.s0V˪uy){ݳȞj̅,bIfSwjѺ7ۨV)]!ހ1ʥ_)B9!= 0`2G :+F9&&VJKLu~ >'˘5.O-\IqC;:`(zZDsw+c{oZ'˲_'L6VSӧrL|'b*))+ZjzX"MU(59bM^LJ//?8jۛi[-|lSkx%9i4kBl~MjWDH?¼+H 4?G=oVgM1e]QI9_TݓHh2(d/Q&UeX!mT|~W վʻRj=SSCĺ\i$mwl5+J$x)R3k~aBOD3{&D95A|~WEHPRm6)H}:,ol?.zȲtA}+Cŀ>[*e鴂ŝRuӳ>OHQ-/êGn477oj4q  F-p$rg ;NRvVmÕU[ ͚xWw=ϕI&SZIeg|Rw>2p99%4GN ` 0G6XvOi٣hR2^>l C@޻dB3--]'^[yQf`[꫞s4?beFfvm-E= m\5q>V^g%򽗩l4߿P8k@'L?䘬cn{hߺ6U^Y,RVMHmS^U,EmF$V9*44M' $covfM2 gֹ?ƊbŒYX\FfzV鋋f S(Eۨ*zo(6le{ݠqK|ܺ{x#F/˄焮 ^xVU^{ WNQQA%z[k#)Iƨ;eu܈5ю-6GH3W-y2kl\C0-tga 谣2I￐h XxD̈o6Bz--WQa\ψJ2 z—cW Q^uȓdԠ/c+'jRmXAԥ*?e+s }h(ZؘZ zBGut2I NRQGA>s@%B@+tu u#ey6P x]EPJ9E_WK/hY'y|S~)7$ꅴ [5%(!ɯ&% W se[N+X)[7=znßTH6sOW7=rȂ2z)Fssf-I\bT𘑹:Or(wf}$en6\YuЬ~{\9(dJ+1p8sl?SL~~PZ]e>3OK6|q e2(@ eQ(@D Q(2D Qe2D@ e2(@ eQ(@D Q(2D e2D@ e2(@ Q(@D Q(2D e2D@ e2(@ Q(@D Qe2D e2D@ eQ(@ Q(@D Qe2D e2D@ eQ(@ Q(2D Qe2D e2(@ eQ(@ Q(2D Qe2D@ Q(@>82xO !@R& & /WE֓((̢A]0lm(ZuZ)rb,42˩ Jr $lBbH&3 bye~3D Q(2D e2D@ e2(@ Q(@D Q(2D e2D@ eQ(@ Q(@D Qe2D e2D@ eQ(@ Q(@D Qe2D ez/\ dwZ  0 Q(@4Dw1vj[s>e$S#no3gf͚c/?9Axmm۶m7Y-Zt)}x( ,KÉW{(ԩ+--[n)3';2mmmGz>+ 7o,B۽usn0̮]x }ɥ]cUU f͚<~@2O^bEcc/}֭Ӓ/4ފ&zeX_^qWZQ:O{իW-^|Mz(v0O!&DKkk/y%Zj_ח2;w,((~?^ϚX8ٙH*E]Oofʔ)\,`{)U|~v*jQkSN}g7MxIIiVk>zرc#ש8/y+6-cXxmڴСCNx[jeSUoR*/)Mr Kui%,`Ryu> WW}b}+V."w|(TuvK5+ >,aEQ)[Cs+7nٹf\PF6@qNygE)|3`к{)o\vp5 :5RA<}ĉC\aƍ?~V&MK־67{\׫\,߻]5]U^R/ms2]6/Wqɩ,ި,wȈ@SQ{DwnIeUTT={>TVVr>SbղW:vݫ|ž絲wn:ss_Sy\M<]?A/W^+w/^2Rn(XX,?.IWϛbU9Ҽ&GpTNZZZ֑#3RRDvQW suFٙrM8^qDl+,o9x0u3NtQ&^zI~߇].{eR}Gg΢UZ`^x#˚3… YYYvJu?.\XWW7ydd̘1[kjjE 3+:{Dz/~ؾ} ym:99j{Zss3g,[[7m߮1f̙$ c('OoKet@Oh2=L#0آ̫Rz5o@_0tèa_4הFD Qe2D `r7vG:$學ᄡox.\P__ N0aԩIIC{(@|'M_< 1/NIIX,~W_}%&la .߷^p?*immmii|(mhh^TSxpޜIbtvW\ٿ6lXff)SDggI3zŋ>|XL|C퐙q +qpZb1c F;{J ݚ]5M֭ǻЛ}ӭ[F-gQg#㒖Wo]0S!&CQxg.]tɒ%w}mݖ&RKrrrRReRSSEXa5QF~ys9$uze@1* _Yge Rl.g ]CR3$ERK3v=#&:j xM6l0H-ass1"͈X__?dZ(*),5ٵal`| Nn.&зBN{!VZD =c֚0dn@gNqŏE /?>/$+RRRDZZ։nVΎf;QqK|n)^P?() o.B;I}TKˇJZ1κo[E u%&5VQGD{lvMD3'A.^EVvj>\U{?$//TWX%uD+>ɣi'=l5 ߦz+_:;E-mé,gZ}v#&TFؘ!bҌ w z61Mlƿ41@DU[PC+Pv>D՝C+e4GV$+=Ar#)=BwU j+z]êb֊\"z]rg=!`J .Bm sEK\-{Ij?X6Ȱ:}3 rJn\}^3ߎ꤉WՇh v1'u˦{ I\jm60CRev.E@oȺsG#&[? н^)B-Ҍ:̤/"(=f1"˅~r-g.{:Grdž#VK,/&Y.ztQC화|:9j*f ۅxsmSTw8u!.=*chx/nȝ)iP6jc{MJ˪OTaA#+Cjwb'KWjTPaU:&ьt_qrN>Fa"Ws~ȥ)3f<:*3S\)<}(^k=&_:ELIMMmkkZÕxFCG?j;G}2RTzNYV.X/R@ ,|Ue 3%RD^ `st#;Hrh])v݈,śzݲc#4G(DnШxj\k<[~m~VL]Q}M QK/NlQJ:ĺդ1!|0G@ws֬"4[4Ӝ>[$[n~ub1SĽඨKML#G<}q222ĶMvt9L"+^R^j?OsXDޔz 2aj_zqb6%Gwha p/3رc23F7>oBC;v̱b1szM?jB駟۷իw.us;mÇ_ti,j D[<=[wMbK*7_*x0wݷQ&M]vmS23GP~zIT\密(.ݮI%cJr/zpeIRKd7zb;}Kb/3AW FWw)&QZ2S [;ɠV)S}5a}}}-R &P^ `HGOv0z\S'7+;wJ2 &ze@ Bw >?"ϖ_$S__eQ(@C cib%b.,IENDB`robojournal-0.4.2/doc/img/screens/assign_tag1.png0000775000175000017500000004270112142060704020447 0ustar willwillPNG  IHDR<gAMA7tEXtSoftwareAdobe ImageReadyqe<ESIDATx`JHR E^" >" OTYb* I T&~mj.%dKEtھW>e˒P(IќQ~㗒!E0^zzGKABP+0Vˀx>zCDDX;(ʑS SeǾ}>saX/(Y7/%^ sIII(AP"5IA0,cP(ᗖ c.a rv* / cP(ᗨ_VGVḫbFP,VĔ\ W Oط؈{.)"K4˒u=T1q- >y٣bdԸ.r)\%s}=oo~rқg%?_7E%VI/MmV/^rpȚ Xtw_/NʥTuƝS ڷX(ś7,ɠK,6!ZH$HkBVo; 3!$ZKPBjZF{cE0oCv+F]VFW436/Hh5*Q)^mS>P"q9y^t -Gcm!?̝ԥ*n7HxءPvVfjF`קC&&sNlVФ l =/`XSݵϋv#Vȵ&%JqT`kجk7v^;Uy;&Hv^էz]M e_ѪU:y)^홛i!7nS3`wl_Fm*2)9 E+LˉB;=%nCw}1kPzڥA06$:m}`:5c.LiK:ZFbFP5e/ ݿZ 3e]>v(pgz}G#SF-3-'z#4]*޾8}#/"!g{S~]>e7sϫ3Fȹs%6ϢroϔDB,O_ ?ֶbsT9vY|7(i 8ÂΌ0Z@0p* 7?pmưa: Caz{tZG<3pfWC!n7fuy3cE,ع[ZOM6=KS-\R{9'XfLnM*G5`:JJbkoݪ*_55t^khGVn4K5|'8SVrk.:uXvf;W~Hc|G4;?xDR?btk$~ؘn, ZoLC L͗obCcna_YT* _dH*PwnQ)0FkԖNQ,W{T8:Ͱ6V?c$}/:xn /ZIxa 9,iUbٸȬ&][4}5fжbcoq2.,* erjI$RO/sXqTO׳7= La^,u-T4fy>4hH5ꫥ7;OȤڣB,P̧ד{v;u1r>9jnέ-$D;bKŨp[>zC.V8~jܼ^>qy_EAk,Vq`V”.B:u7>VG_ďbEΞ=o;Ȱgx_0Mpz;nP,)ZO<{S~xtcĭ 3}=z~ `.Ps&>''KL#Ђ_\j=MH RUu7 2IMo߾?\1L' "HFē^4Ǚ1nk;ڂi'3~<)E:6іڷ^(eYБX(oL9;cX#^޷#q"H ԲOh4go@[u?x'{q+BuHI=gy}=zJ/]53Pfʱ_xauM;7;0hܓ#Rz]Yw7>~! BYQT>s2?o/c; r"ilBP(X_~1g rPo꿀]! B~P( B!P( B_( BP( B~P( BRfo-X}(#sg`%81@+/D]Ҫ-[\zQʒryxx- HQ({wXxqpp0ֆufffB͝3Bn޸1kR(+ x[RߣPvJӲQA-A]AaB9D5ZW-,B9iB~Pȯ.lB /mk`ݝw+hXlXhb)jN1vƏ(k/(3ab]^n5K.^y+ɩ #/jYK/48jK"/>s.1*M  VIP(ZJTߵ~Svԕ[!932o5s=EyG+*5ӊ=fO4.1b3܅q/|:{Y8Mgv\n>2z#6?P͖VmBZl\$dq1͍]4vOjSoڴ[w8>>hśƌXLӻƟaN%BBM")o.ݻvd+'yŹŧďub?j.o;vϨݧvweA6QH9 [袻f p~P(TsZE͟lT qqqś6d9];rd7, :ǖ9r⼼S_1  L#W֏&ek͟0!F$?l~|ls yavϞbM/-vq o[O2钸2$~$?Pm_nܜ}"kN~Z* Ր|{|j_(k/Bzi\sɗtv+ ?P}رְ0c^n/hV?"Pͭ,22ŋX u5֔D?Px uXK e/͙3筷ڰaC s0o޼fڿ](TՄՒБ|( h'P(J B9i(ŠB9)0~DP?P(Tď B9KBNtgDb]._o[%b%0DZ}?ؿ'ֆuUv8Am 4Zm<<6}=b ʎbeJ%Uб# B9=BPN'# B9ŏ(Uys~nA:{v}] 3IbĶ{wI-B9qx#`RXXB'V'sk%%:f-H% JSb9.홍㯢PWaABJ2hE'NRKf0_Ȣ,xىԽ$&r&&M6-2C_~ad/4G_|B9 k ɒRk9K(IS(t34"u JfPIiDao()!|?ZC!l} d1Jm/0155?D.9c0q *cF5~P(T;S م .V 9K KzXiA6Kgl-M(LJ͵L# J<;u浛,ѹ<&5Z:"Pi~IdI^Lz%N\K2{Ȧ1 sLZQYfooY|f(Գ6<2wi7?L3%lIrޓ:ќ/ztV]^%ߣP - ZbP+PViKH/8Y}~[dAP55rQA-A]eߣPvD"}zpڰ:+1e1~j> Ww6B#|4mBB`xB9mc;P(嗞Q"3#. B901_P(Ӌ1?t_(f)lGPN/#_(YP(g_8* HB~P('I#IP(G -KsBNFKAlP(ǕYFU^P(]e(ij- 2a.BU/ BP( B!P( B_( BP.)VAЍ[N-,g9s22JQ/Tҧ} B~SmO@ k;v8vݦ=J' IKkK!Pȯ©Їn($X,e;ni4~ f r2Tra[T*`/ZVT0Sj(W2Uf9EgZB9ȍyS0SeZ,Z5d e7`bĜL9E[BQi2% e5-5#8C~!4U[**SNm<m"j=ۉƛA@:c5^2kh͐_ȬƙKͰT4%N>-W+Дk5ϬEdʵ<`阥7S \.orN=M~4Aid0N.-4\( -鰔@1(FJ>yQ88>\ʑ L0hP 2z%۴_UUQQqjH/+< ~s% a)Ƌ}׋-N@P=mRe\Q*v"$혰u Xee%\b/Q䂘" tcliWrB9l! }9ߛ6(B95G9t2"L&rX#8l./+#LE;7](QGibej]h; (fa?A uECvJp E$X"P@1"&^p.GDDùp5;[ƌؾ뭍YkKz.z1ż*8ڨSш5LMߝ? @إ ɅBɕߺu a& La/#x.|`\/`.,a8ebFF"w*bF]/hlBZ0:87 ,,,, d.>saMME DB8b j9@t8)οzSS}/zы/As/~hЅ5/0_t| /SzPVEt*O?A6)rO `-6xP0uTiZ~U4tGl{xO¥ ((jgDa+9{e[0#a&I{* նˣQZvYImHA|׳6౅B h[<-K$E[ގ+OF\m|d K<7"[{:~5~;\Vj-Qi{7~pe-.dҟ~RqJRͩc?m%R }]+uf-'4n)g(bDN>q׎{?2>P`d.aZUrj(dkf na(UW"Mdf>w6~#- iEi3q,a4j夥a q@[|Y$X[Tp<݌ui[4P1/5J'ǰ&3'ͮJ鞨ѭ鄌t7yDndHOL:OH 5X_8kĶvݝ;5#7E=fGf?ҵZ)*sLWBrz=]5EE1 *#LMmEY9V5f6fý4Kl.|ٛ!/n:{ Q a^^^vW/̗ _:|ٟ+m0.L3nJH(~EBiNQ _Y5YDoI.!{|K妸R@JC,o>]"LVQ'Q*j1^5J5).UV*TϼI9w-#RMq9moNgtվ0U?cY_~8BezXٜ/5~|y}#͒m*%7iqF/ܔ{rBGq3jh\<'JU{^{h;z}ba-M-4fb5IR ul?kj40!d,`4S w5cx਑2Y)m :-G0*VĨ|~ϪĘݯf~OwC<~.3,Dٹy)3B~S\=ܛsoe4#(mO*K-̺} ~Z 4~8-aA4zpFX2[2'.˔/9~Q(.ŏI"ZZU_lyŋ/?Ҵx(B9qő#/3fW#,D*Hei !$ 0?*ZӭߩLߩLrhJ 3eBK26||I%~if:;K<[]oT\uyN)|۰c|x  ^{Y,Mͅ3^ab,xI0 #Vm?C6B_䈑#}3Hrq opI#̋=&LHfS-~bv>2K2"̎aqILX<Xxm}^kH| O6/FFdi@0T3ްa`|eXƆ9@/3Yڑ*ѪEnWr`Aw\ ۡѲ{Q"Bڗ_ݾ,vnNz^rrr ۹cNRߟ&\9:?dD9| ˇja>i=7|Mw͙zt۷=jUrq1ΦH2 K&8sVWԢYWW={i7) )7W_j3咞K#^^dz_BoAj5j=RMvX0n'B;4gXIַB9VG?}رK;Xnjb{^y9;uǎl?J+(#׫ꕌ"Fbr4"l?s#hI1ŝopTav[YYYddŋ|XJ##|bVPWPc-嗁PTC .{FHO~7D"K$_EqJY|Z}JX:d`P(XVn݂4pu45%"lP8W3i2R8Usy뭷6la'Fs~W><{0o<;>`*W|v.jy!fap1[l@|.w}^^^u0u_^{{M:=|VƷ_pG4GpЖm*V(ͨK+Vt"=|^ÕNϩ5%}-X ꐂ˒wr9Ej-Qܮ6h}:_DX;QDB/Sdž>0=62+α-m/KUUUuuup8B;p>B7Hid': C/I JV v43?qj#]|[t 0Ey8+׵kn޼ k(Nد/ǎߕPAa\?/*Ե2}:EUFfXƼ~̙v"<ýďD6_jjj(*ȒsCJj?fوE[Ր~ƌ2um}14h\T.]\Ku)@-^[ׯӤ}R֟UkDU f?GX7×q3eknY~F.ׄ6lXkk778H`~:s}):+z䪵β2!ŏڢ~9SK<|?kS2.&>4LfeNg CtֈQL%՛wYZL|7t;}}9QG36IW;///})auRmfQt\B{]ъ41`ڽK+uw>*9%a g4rx#ǫ Eiށ/uGH\7n~H'.Z8EP $\*jnJE}Rt>h2ss_"lXf[ξ6G5'D5^ N /[6/ԩA+ѽk" uU=so>>y7744Rr.4VH*גל7rrz. ?"/\MlVUefJ##l4(KC- xW$5}J4kjIۘ: SXPLb%1lct=>0`Aqf[Pn00f͉t*[)0M!ͳjUiz *~dږްJgnV)mڄ h/--|wΙCLy-jSnҹ3gS?]]S۱~84tЀLG˝;9ÿ&! 1ӭ@ nA27ܼ^WOo^,w WgOI\Ur1c&K2#ED+<$ZEJJNn &Lުt=T["j9F>.##_6i)=;u>!ph'G۾޷ۿn9(##ڵqq9gЗP{2"՗Ē 1woF^v,W#Duuu&6#!T 7===ZȊ&?g#aK_TF):'o|IJ:3<'gХ^OIOOCt)zМ( MnEr 8Òfwcڤތ4}Faח~;ujA- Eǀ$m6[f>\"[Lq{%%>V/FmĆҷmfёLSуVM6jU&&KM,P2bnժt~URn_%k#$Xja-)QX޻wDNJ x\d`{[YD,?hk8*߶ɱc /_}b6ʊ]A6x~;$,4j킘tϞ7lQtjUy4;Ua{OFs6a&0:XPFĉ@1ʕ| ¹RCl7MZDZD\SJg„_|=%%((("0vA*m'[G? u>Ē[fR Ց%.muU0 {>M{s1N4-~\N"PFl:7kvMy{64R]QQa\7w7JTWJJ(]@.j^kR$*T1{d 3)k {+(LLMja@(+5۷KO0X+W ͌C9JI BFv#ڿ(/t~ۀVapEgv,JRb"%QbR"/)SI!l`4ďBa2bӧWWs'ٹSUbNzR yre8 {[LGd\'w׏SDDD9jWII:TX!q|ٕ_捘V9~|]YQbsݠVWuqmʠX-H.Fn3 W`II,|| 8BBB\mϢb`YBEbj)9N$_FL&|]FF u}&ɑ)vKT7(_ڲ[oGHWӫ!C> 5ʉ5q_4Cn!~gU={ _ruvK-x.-ӤwcD/,Kdu (7:!Q\J[hވ-ܻ#S}ݺ?ܠdzf \ǯ"b>ڤذ099h SӫQ]LL\)#r muJ `;p`s D{Hvh{܍G3O O3$ǧK.B QZfteNF8>/DϴL݀YSfKFR_im00`OZZy~,i0 CwY[ߞ/C54ul *iHw5AIYb^ןE$u@vt5$=*ʎlmYɍatrτT(w)j(*** H+OMM;\;FB=/j-mk(?[A =\7|=kO:эvgWcmƕHSq|f&_oBQ|mSRY)`-*Zu֭ 1Wc5Y[[>JemAIE]~qf_"<$>l ecVVVr*f)V1٬ϜEeᴧ~7BVW'?z,:c2k O@@{5WXXrplz{Sڻwxxx?Hi_r_)Wk&L(ycdǜd(ֵӷݖSqBBBGGCtH.%j8Vʊg62Pk|{ˀ_4hYky] )JJD`uܡآ#Cm[(| _ʹc022ԩu&B)߷/-m4T2]>Zܣdâ̢S26< S X FL֗˔J[Xf%}bu=,m]уƀX.EcCKB!d0c0S`LXN?ociQVxdQnGTA& LG3LO#6l!ħǗts -2퉡ab(ljU7YJe/;ڧxI_w? 5Pk"v'I\ =ֽnI@)HɁPR7`n_! EFr *)7peD$q.p-%?O;I܀enZY`JgT!r&.~YtG'+P .5SN5U.)(X2+c6\ܹ2U2 We- pF5S*k)˔uaG~K[۬RV =&F2K.M ,VR1}G,AfꀾKSCa&(u_v8C̚Ϳʎ3lݶP%qILgB9`*FݒО1,_d,,0e-Ts-=]*N zTI~"sG10D 0p Z6$@ 8p+`rJnYGx5R/~afܔ 0{?FCXiV?î05VC"rS V1*j"n®*VYǨSOIW.v ;ݽǾ "77&>tM&C:H!',tĄ[+̦ӵR&D:07ND ,r%rj&D)v-!;f/>irl[-IENDB`robojournal-0.4.2/doc/img/screens/mw_search2.png0000775000175000017500000005735212142060704020311 0ustar willwillPNG  IHDRH:ngAMA7tEXtSoftwareAdobe ImageReadyqe<^|IDATx |dC.>(V* zTSZB#_k_­&JkU* p@3;^9vKx=ߙ~g3wfvW_ZZXq :uT}}̂*cN&)BLDDIJebccGO?d0+u5(ϗ]ii|099g#Ǝs⻹$iF=+!9t~n'1c#C~0Iu7xeˎ_ǍC猈T~s<= N/d{:])=(c4K2!!!:W:cdepEE]Cph4 L&:c@``@@ @?WUvǟKظ]]&LgkNd>&tG_QhmTU %@ F~lJ}?N/\0TN @e~ŬiEG m7q.M[R~>{b6gW|ka&ge.|{1Fhl2:S{vn[Y.OC+-ޫ/;%W[[#!lo:kkwjKŒs7Q}MH+JιK) p=I1L@xD5A_~u|xh2.qZ=|\)5kKЄ`4 a E&Sj&Ťeҙˤ&KRJm~]O$ޡecmlks'c ?>8mzCLu-.M+>4}_v\ħϧ*a-LdI Cbp-;"{N\"*RvQ&'{M@1v QNa7Tk͉) -EK=5=u뮐)택g-.M+N=fgM-wMHYssnxgMgP :I-^uOd/:]䲋AK)=+pdǺ:LvU9v!E=:sIcRFi[mZ4߸hCM[1_Ƽl8i;+S_o>me+Lʄ]$lK}Ov XS}Გb*%uz:+([zQe[iF3L5|"l\̪3cWc֑OhMy_=uuo>Z>Z5~XPnW3꩏'ǢصCW\Ԩ8(JuA&}`S۩w3j7( z[K7Ld2JjǛP̧[hIY"ΛFv^ݱdaYFb[4 C#-BMqA C蔂 MSkiA~GVIG쇉+yy?~ɑjMK)jwU) Ca^ԒO:d'){fE[ІgeΔ>rlώft7Q׏v9*,zGΖiB;wNi¼. kB>xd[T]^O}Y+3U#ړ!CJk&vZ""̐+Oԣ6ž7ԆzTO7ߟ~})7'Z )' 醘|:B)K|,Q7OFux”_Z],sIB=wKicfRU+9vOYd1?Mw^SScK0΅fz lN8OL 귿U+O=TS}B|ZPQR+e P/hRv>6Apyhçף^Q৞y|o\pˏSa|ӆSGDVi*۰BoV/|Iyf7cUg szn#񦨨fnb~[}V[~gů9%&ԧp']7_Vjm_5qD`RLno5PJ`}eɳ%g&c=:3Zj&~pߐʪu&*ʑUwOj(){vxr$}ϑ)IQ\N(g!&08]r KbT Ç (j-vQF u7A]](ub:[m"mz[)hlceuKZU7/Hy*j˗6hԌ($.>\t:bP=\NgPC5G,{bW-GxQ qOG82gƘ|yr˯ͅӜ|w:':JĩX~I\ oL?f2d-Cg͢!.q+c(uKЄ;BB:vѺ[Ckn 7V4* LuzH)Z7x'\=TM+_hҦ1L's,-;ho Z{eں  S1Yk׍L&ǭmJ8Lj^=SiʸI },&קw[db -v|[cRv\Mt3 wRtQߜc㮿IjQcƼվ6$$dԘ%hbʢRroصԟ?+c>+wL ZvO\`O ']ۃ>~Cl0)c^#QHԵ82/-LQ` @Qf'?ɰE?k6Od312j0uenʴ7*0a!eiՒE+N}hw~.l }gs/*87ӱph&YI_luJݧ_rVakS8imh?avK|mъ}oȚ+o8c?\t4m68/'_ߖTrsEnG?R.XʘZ~V|7SLUϗhTKyyMpۢ?%'*2'HE)L4hsE_/(&~gТ}2u,\=geܞ p?any񨂕3ūvz49#5:VkZJ+'u_]񲹆%t چՁb^Asac NsR{#jQve87о].gZ}x5emNە M\O~QQܓ6-%+bd+f$!3{wϷ>5tݻ;0;:?ޚQ㱭:Xu/ VthuKժVީr-.\>mpiZ#W xƂm; bFtW^^..綿kjju6zh籥_쫽{y^V~رgVUU_g+Cͮ暁i>|… '$''32:+!CeeeۡCqޯӧ\^TI+9r$[dkx|6J30PةS#F y$݇իb}jW.;(Hv^r1(#sD;SZ(;e䅲um̫ 9څ민~$H=R.H^ǥj^ze>sOdffj@L˻s[ӕUۼ<;;k׮rdeeI򐎒m1a„V\RR" C6e;w,tܹnݺ<|{ߓǏ/ܺuO*߽{v:Ar}wnm*..4iҧ~*A>2>\;=^'F俞OW)ɸ_׿'O܌_"<)".<)馛?CwɻOyc%;tp̙aÆy]\g l{y%`fѣZr[lQDĦVשmJp =zm&˿}v ^;v |Ryyy3Rl1$"&+%ÇpS^#G&Vd[d'"O:%{?Ob &Wk2fW^#""EVҌD yϞ=7{~J^e/^k f`#i\}]i$wR k{ejb' @rjk$+Gh($$DBv_ɖaFʲ\sMhhhovC}Z())Ύ2D /+n-l69ӓ'OK6wj/n 'NcԩS#)''&M7$˹eمd["ΡCzcCew]w]sl֯J&h idK>6~9@}Z^{󣣣G}$PKꓳ2 jޯ!!d9ɡZyVNvZ~kurĺxt;&} 'ɣuiٳc`'?ӯ_?ihӦM">.0I=AAAg]#]WrDpJѣGqh1Ҵl먨(iߗ=P뢌lPݻGiK0me9[2" f{4)tlѽ2&aB k$Ȼ[2jȋ5ncP#OqڵKJ!$̟?_HMMmM"B_N739V^^_N8Q$nj1|F*ӦME -hwt>?dY_.1RZ]-H٦z`<<<̧'L]Hu;keCkkD\Y L-WF'Fr<¾}ʻ[ RV,90;ݫ]lخ+iQRv?!9F'ct$ҏ?811QڭQ>2V:o+h2}]].e9w ri{e̴wrL(#ǼsɁ-++Ksceghh e׮]:.C}կ_-^~%y?-}[Vb*rM%kXWnK3g%ǜ5k]Nh6YH|پڝ>T+ǎ#tˡC.-<׊ʵ}\Yei{'5uTK2ʪ4Wșu{!q䮼AƜRtևYm#-J|!GHf5Z+K=_l3OV׃KpۯtJ+^{I*z$N'hhx$h_ҵkW 4N:}t[cmŽ{:e[.DJ2ܣdi=*yui/1Zqqqyyy%%%cʽ?]7qg?Z1!A]:^1ΟҝWUpZƗjWa$a[sy}Hxy+/JS*׾sFpmqmtۯ~<}p„ |mސ;v8n8kQQ?MҌ-H2H8| P0`)Z~e/ҾYvZuǏoVUޫW|1>AJI*Jlޓzts2ղq:S.{./S?1Js>{eWU|رc"G/JN!4y3}Hjam^e f^.sӧOyȁO>|$orb4p@,.jN%&;ҡC.\+[tƾA;wnݭ\"5_̶Fiߦ-!FS_8eyQDN_7=OO',t4^';^[om7x'|r䶸>Hhdv7ޘ5klV;}16h*‡K`-.v?N'A_&ֽՅS.Y181묌Z(9K댣6eoO}D;&3}S:/;|4*Bo{af\v.Jwh7}YWAW+MtEvMLGhYƉ R%[?!3n>Ȗ]`=z4gԺ@+WsW0}==G8ߕ?Թ5D0ʹ]w f*y([e7oSel>y`lQGU_4C*^t-lz-<3)&(㯧eLsyp#q}eG7#Nuce~6z䖽2.gIqWFإA=]9yCǰFzKscbc{ / ᫪0Y/;e\pWf_&Ocsbckɔe{Z/)jdIVv\iCl{e$RCYe W_MNHx y>"mTl̰^zUUUOLE|INuL3\홛(>w 毼oٽhOgc-sW|乯)J_MazyQ2o^7i/-AlW~dۤlI3 8JV┸ւYjl&zCmm%]=Wk|3  TRrĉ&SL0㝒B15,HLnӋe +u Z]sjWmTt JJd0R2MoHq>d4~~QkHzoLzwNI^۳,7]qm>0?`PE^QWz(c?c{~:w8zؠaCWϻ>D51J.xo{v 5~zlb٠S\`R7d[S\JzWYu7a={ ڔСCpnwN5!rĂ߯_;?dT~{zʢ]#{&\)φ$5D] duas=0xa9X'seF%G2yqy)nqfݰiF2 'H602uue#a̰aê*;uh2??jČF .+ݖ(SgU mQbrml+s6a&[ytߝ<ѣWepW,QV䷿k)&cAB_|%P_g0Fbm800 Ph3JU\^NqEe.Vm{̓{QVThbtpD ߆\PQ%vp9(㷮pM٪%l?[#,AGʾẼv ա_b7eu  Wo4L[weUcwMb WEɃ~@ Q(2D6c[nEܯ_yNW^ ~ꩧwN;{e_WC'hQ3>lΝ+++V{]v_y啫$72uuuNUZvxd9@{2df{W_;v`0ח^x1(((44SN{ >{nNËd 1"XUUUQQsLe``Pǎjԩd={p<mꢌ gdd 4… .\,)wӥKkԩ#aaa1w͏*\_U-^5iNnR2x}v޽w>]޽C0 Zz-F7dg;֨]k[]ny-5r3X*l9UآS5TL^Y>fOiuf^.(=r-[t!(H~qĈ.^.c}r [V}Uu=:Jy+-XxxAoYajɢj~b'<;q -Xꥆndm<L0E 'lVgkj&L>}ƎH T3Mxxl馛z`뮻rs`r\wq+crW檥V MjR[1yض.evm+WFbxlZoKݡ~u~mFi^t2auO=F֨6JƭUW[ɪyhݕht{LyYk߶'3g6ete۶F5r ?^r®]92==}Ҥ;uelSBBBΝ'V*j <`QIs佢Ǧ WRw, f-*JRԙ[:!U1QV K=˗<Ѿ?;Dj6gaꜚ[ňtұ?O3SRbpZQմiYXfzWguUe_f|'Q w*/{CRKR+K|TVͯQanMoߖoڞ4wUQTT4tP o24ەE.<@&Z :m8*U IOTR:7],LM;\K\n}{oɩJAei&'EHx-}.I2U>Ȱ޸%whɩBC^PӐ!R?k79^Kܔ&(#]_96L1>?V]AjRRt)&~uQEvW}O]<ðy QsIޚDME.W7PWQ (ڂ)kY&Ȃ|cTM& 8y~{Jk6JО!3%.|})3vI|Jy̔ٳ괊RemLMVԩTqnEIY*wUUò5q skޣLuk77퉋23zrd f9^eO2N;jKY% uOc^JVJK3X^vVl4igZqYV:+lvc"ڄy ʴO>v_xS=u}lD V͆daz|BbF;q Ilɒ+B´:! D/t 8.Zw^SLAzWQ|cc,@8){A$(N7/ZQLv ,VW%j//5Br˦MۘeYKf$HYpҒ3&_' F06ŋ&)0P`ov\Jf$ )/Ȓ&L '3 HPoqz,%y}6X_ayeKް!MKoȜZX{z4L}FI=6?9MVjj۷t:^/ k~|uu̾Bm~=Txd.ag,bY}G"|yV.o(g2Yi[,e2D@ ev F#]Fo":u[ w*<,ހʯf2yz2~fܘBCC ؓ;jĵ|1]xb2Bkjj 8B ~2WDZ$˟+Wo`6`&5WOi2}W$nzfJ\\epqL3ZC 'JqQ6z*evZ֒{SRJSYm~bCS%e}J]Mfb/r9w]#+**+h6$'gXζ47.hbc}G;u$"͐cઈ2KKYqqqY:ĩlhɍ7?]]stʪ`d}CMCOxC7\]hh{UUղoBWQMw0t:]pppҤ te* Q(2D Qe2Dpo07?L'hQW7pq e2D@ e\ʼ| \ ^z~!F^… o ~hP ]Ѥ7~݁~]wk(+T%D\) @kv )G@IҲЮâ"kDQnL&[,bm].! aJu(W x9@z YzGٺڬj%YJ֒xN:#K/=n| j-q2ilHnilZ\-4[؟U_^#c^.⁍Cu!ݮY~ȗ+S_o7 T_[W]yfN֢y˽Mkj%|Zf52|}/eI{).涟j~՜p˳2&6Si!/]zhHyZe.tT6jsyٯ7+3gz]ʦ_ӻsᡥ-cFDɏ>T^e) T6^m_O{fGz/^uy@qxfGBǍ˲#vcw4OЦżMQ8Ι/e1L7657 "e{N7Oa4Q ͎)培v/si%^7[ٹ ùu'.vL}3Ak(1)vІǷ==Ɋ^^fv0lxhHp='дO<6H u^z~a|uu̾Bm~=LTxd.ag,bY}G"~9~_nd~}x/mon79/bۧ&Mt|v]hQW?ճdp+be(sm~>H7_(DGGӡa2bfg]WQާ(s m_ Q(@D Q(2D e2D@ e2(@ Q(@D Q(2D e2D@ eQ(@ Q(@D Qe2D e2D@ eQ(@ Q(@D Qe2D e2(@ eQ(@ Q(2D Qe2D e2(@ eQ(@ Q(2D Qe2D@ e2(@ eQ(@D Q(2D Qe2D@ e2(@ Q(@D Q(2D e2D@ e2(@ Q(@D Q(2D e2D@ eQ(@ Q(@D Qe2D e2D@ eQ(@ Q(@D Qe2D e2(@ eQ(@ Q(Jz5t("K/7%&@ eQ(@ Q(2D Qe2D e2(@ eQ(@ eoD+_}}¢\ oGQa^s~>sl$2 l.Hmܸq֬Y?ߚ\QFgana'/TUiÃ{ڱc赔8\%(Mٽ{o_R^Y9kʔ 55_|モ233###KBy+ثdZ &NĉJCMuŋ1#./YZZʧ~Z+y*2J&`;w&$$N6>HСd[o;wNһ&L5Wr߮O4V&`h9 ϧ7裏j{v^_Wu…d@ Ϟ=W\|B&h햵$>~I/(úy}@@XBCP.t5uO*ߛ%LI-P'~y :l۶`Μ9ߣ+sqI"w6^9o2}INnOojw:f (gG0 gb8>k{}Kb'6nd'qe \Ң>LIUU⡋Vi[ϕMcccwww?mܹ|hzhjʪJaL&{j|67}|jO5ҳU'ZB7ݺ5UػL$ ˙ 3}ڶ*,{2U+WY\2_"ss:;A&̙z{{{TKeeeEE2ՔH70?cfԲmVCʰG D*K(ϕe5b8'e5f|aH SXe"V:PA`r?VG:$ ڥ54)M]R-{-1fhzu͹왑_<P"d)eH("Gg9F,>X,(TUU3 )S'fj4,Qzš0hzR2147.usj*Ӈ6hФL.COMMMLL l6[QUUEj& ZOMhIH:ZG)lwM1l<)1[& hH~BZX#Sqw~# +Z$HB4^cg.#&B^E&;`rE8.Ǖ>l'3v#'ħKTM.SeGv 22yi]3۰ vvnE*PAp9Vݢ"2֚ݏXk8L/Dx Ŵ={A~+RLyy꼠9[X9dM(†:3.Um ?obGeΑlYD۟6OZTKMgeeM 6pgQ"QU_<^TiԠN#u-aVf.v1P&a`>J4{>A#Van"ZW d .lUp5x9ExE㸎~xEFKg93޽4tqGefSG~J4#!5`^2n+4 of|>GDZ&"s H`q{`ŤgSz1 5Xw6֑+Cdd;F27 LZ),9c}pgvᄈ-MM{nJC߽'#><ɔ`0Xp2Ey83.U#a|U՝0߾u}TСlu5e!cJ٘R`WnKHS k,*]>L̄"C"Gk{t HEG `)Vm BGsɎG!t n:E#oxT7Vq'v'`yO]аq- VK=`LZp`^}o޽H=6N[سgץҫ}Q<,jO6o<<<@e׳屦(z'j32Wy.8`w<>zO{[s}'Ovwv~5&zcNទT4QWRz .e4i3)FHR 3ɴR%;]ŞhFJH8w~%Ա"ETFE\vMJ,S6^[b[2ĖYB~QEU d^Ԑa_P3CnZ#'*O~=Hı~ ' Jߋޢ\;4%Y."]ո9|LDY K08 d[+Dkk;=?ʧ:WVV65m>wn'_oCz}{oܘK&\מj.ƫa c (D!e=N,|y0ёQr=䱁?.ƻͳ-H-YRgv{;jzݐL;:: T@W.:/djj\+Qþ {f* @?jIc222}Tͨ=zݸؿ&T*Jّ̝ Oaeku ]u,H iŖl!S)xMI5®nYYuEpyT=6Y2$SV~WӧO|lnnRAm_C8 kMi8:W"cn *4J M:1QT&N7   ˊINNN 0 ---da]sY@Rf$!+*)`eG Y򎙡@y%LXՇ]@}˗/H`BTe2؀k?w~pȕkےX@RRR_L_#V 0MYIENDB`robojournal-0.4.2/doc/img/screens/mysql_install2.png0000775000175000017500000021237212142060704021227 0ustar willwillPNG  IHDRQ= gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx `ս]r/l {@ԐAZĖ[.ї[JXkUZb}]}Iڂ HD!*n,@ @eΝ̙7eܳ$kCQ.@ 1;/-ƘX*''pΜ9%%%0R @VD"Xzw߹뮺k> c@ ģE÷.9@@UNN H@ +/4KN{:@ Ty񭏝AƎ+'9$yl "w]@Qy\rgΙKp@jƋ^9?5zV1̹ZS/\svCaT^7)'B9zcpہ@ 4ʴ׮̒Y3]??6-br|3)(Hm:;~o߮]tV|K1D>*ԃ]}!$nw4+[3mL8 X+FAS-G{S[,)3RD;fLW_0U2J=ί8VA|X H+PZ2gN Ev+k(Sd@ 4J$H).IJVA)p?'c|#mIr)z8a !RbL-; iJؚhZARd^a^afڟ56;= zOO?Mv/|b7}Y>΍?8Gͼ_9%Z#VPxkm߿aB$Vm .GKVATA<ٶV+VUqO|ʂrHX1^{(/.E3&P(e!*Qc5j,, cqnƜ M|쩉 j/g?- O?rBqZ;]Ǎ+Nwv_~j3+GմG=o*B~C?deEQ@QTET0RLH2<"NݷVX^,J DpH-<ԑwL{3jRCc~Tiѧtdxgj;JhJmT֭VV%G3_ Q5oD囒Jdݟ.*5rԪ{Kyʢ`vIÙ82A @%!Pae:UlTʴzr(jl)!PhJ>' Wqy$jq"[Z-2N Y_ÞrWYdg`yIAO1nE)aUr))'c A_ʙ~{Li)dGmM?ѯ{WM֖þ՟<8ְm_||Mk{;ZʁrjJ <^F&@ 4pnm޽VRAyKAӭ2RLxT㚅1g0H殻Ly'Ǣ׷H0"P(YjBRn1,M{w1L-S5(1Dfv7WAs_]jm+k13tm~EaҚ몿y­ lի7_<7=MMڿ>"=5Vlٸ-tAB уS꧞ʹL5T?} MD%x}@zUP(n)/ JsUFRf @RM R!tdŪ& y'g.PQuό?7 qw_4s2t"^,ZvY] nd5'h\~~.͗|h?zGvj0-7l}7BUQ>xa&&!(V-IZv +%{۶mkw}ϝipd{r~ӋGů\z"~dÜA FO޴'Ŗf=cW|*rw7'Żdtʏ?ϔq@/Zrx3qmׇA".vgG-^7?ip@ 4 R|nDʌǣi*+ћA H'D0#ĶA1k)YƣΥ54WgoZ7u': @ 0*==PKI%-` )YU*O$%+Uds>*w&%)̈04^۶jIA :Up?yq`` +QTRpjzd+c"`̧}Jv{Wi> w@ S=$dQ@ 6E}@ hIR^S>@ ĩn7;"Jx* F@ Vw}>qyڎ$n*H* eV/6 [H4eYs @M---,X1_NC*`:#N%%wLS\,h-v ? '*=aSNQs$mIu.>!qKS%Ħ$9Nw¼y@|.nA uRƗAp~:,GJK!NsS  D^זp2Z̄n.U$I+Fl Rft԰@ 4ʱ]HaO$-sگTST+ɈfCdꮔT D5ú6asq"ICᶅSMQ0'Z2 uL*zablA DxA_2:svL]&@ 4ZoNKQC{.;7&RM]{ (Að㮏P`s$h l}"%ű\R(lMHNT(kb DVt@ #*wAԃxȒ; é($R&V#_@ 4"ʁ]w)E jstuH4"UaB2j&-&Xa7@#P%-a(kDJYGt7IT$vH23Ŝ êFQqL !%MQ0($E@L) j*v3=U(F>QQ N H%gJIP$Aƅ)M7ZJR̄O^_( D@JT-vpg\xG^43S|EpF5 U)ϨC @HT| Vp,.%&,figYg x ~DA 4"vnu58IRYH6Y͕5¡JA)GXB0@#Nڞ ҕsSNuǎU8X HXp#.2/K9ޒH@RS D]v#*ĝO V9(^?T㼮^(Kh=2]+F(Q%LwYʹߒMd +.%Ea&=ixY8\IS D厥\LK:jc\ "ݑͫQO#O$c<#@ :DRnӹ-5n+~%@ '*_Ml"6CcleJTxhϼ@֛<y]|^j37\Ჩ)˪dOZL'%@ 4c%$6Ck)J(ٶdGX1xroLMTO1BGYU;NY/L]VrZ­vM|NE"9s:!rR&`=0q~Ğ_[=RiOKDWY+e\fzC~:o8+c'#jʗ8<@KTXA)NH{/J/fjgGu/ -|۾w9J)> ݉Aϊ @ h"dpYrrR`Vw3|{ /5?%<1)f ,")gQ*0BxA UD2?/{]]3;b o9)l] osg!ڜ@Hp߰ZRDmYg>ڳT@m9&<SK|]y 30_QjmCV/#vO:fȃ.X8c]o: :d2QCy@*v\,k0<'[ m3~Y1==/:j]p0𸢛DwըaUU|3ƛ@衇j@ 4QY:Y U=fsRxߊ6xoFwrNK3-/ozvp <| [5:x 4&S#êUl=J{>^]|]ҕƼ4G+W"ȧɡnQWJ9+T`pș*j~k2- FQ9tNgivdqmF4iI{|kQwiW ev*(rf;Q)ܛ_Dr3s?tڏBUChX-YtL-4T7gw4CCL -(Mߦ܂мY҈T!WlؒʺjJfvɫwg;+RQ%"&NQD9$9 xDmݞ{>&_}lJy&!Ofol_rǡoJqPu݉?h]kw?PT` H0Iq: x۶,zhw|V/]|P?],]C` mj7D KzRI}klJ3*؏*V\RBf*0uA 1@Q@`XO~:|& R<< d3O/,;B)~S*ɉbNvQMBѨTˢ0T~Gtm35ibIɾ RUТ:ibbμ^.mȣ*4be!?ax , 'LH2+suOJ,2hљ9NLAC cGy&67;3/ߖ=X >Q D6~w'O빠x G!sm$0aĜ#9G,L/)1~q{H@`4'J*ss|G^quP%=;~^de?_Y3EQ[Yj28Sj WJ-vyE頓6j@ -A1 qiQ2=\֚JS76oDChZ[u' 9΁LgJ#za.X] lM߽Xn Ba)j0[X@ 0#Bo>3]Ii~OygѰ/ zG_q'zTpowǂ" ?+7㡧#ȳGS Yy4y=4֞5$370r) L*L??)m8?9Ɖ>' eyŞ'ܡ~I*̤ 8 {'hGv7 Y̟M3w\X{XϦ:Eἱ>u/3}(KWTɤЮ~qr^rk`F^童'n ţYx7uksΓ8y2_FW$ؐ򽄮 ʬ>;eY4}aR׻2E|tեz@O>3#KOЊ~8,G?zp缬K'326=7#.-G M 0@%=1}́ᬲzΠ ~a\wb0^,RpkM ߣ9.M/g6պG" 25t`t(DI`5XT2Z ?~hP$+\ZGGșoX1NB7R'ݻ+|A1*LIZn]?6Ю{yO]#?zͣ82EJE,e#?gVV˔=؎DNʕϥzubpBigrJ ݓg˜I!$! h !m*!?e.KR1 s1'Mǿ~rz'dT~z:oelWgg~AaoK-]=Asg槛4ެʵo66p?iOf)Ė(8@AT妟|fEk ӯƄW%?N2D[ZG_6F[x>%-2'9~PE;'!y]DzuÿbbWgf4=T`J67BOy'ezryl F(}Fh<ޜOZOU9+?`{ɛkffȯܼN 3jg9C3Y/"4RyC!BpQ1\0b{f͊.Fkѿ>'7MI/s.{Cm%|32 L ? ׋قytɹc3Op<> l9t}ߝ'Ms)+G}=WHybhV&mƌL{vy_m'YD//Hw{cAr3ihpOW7Νx(HҟS໼8ާ G&~=&03´ /zzQ$dX]5#J~9TM"EciRI(8z("Ng߀Մ`ު jU_5$Y#qQ1)ա>3< 6*_t BEYBoXsvFZ%?%`$VOtG{(@IJY‡_?{\R>/|hXL`O8"0i𦃃ݭ}K4ڔO}sΘ;Ip}ȟMl?>lLy}k;9Dy'؃Є,xu;R 8-; "4Ǫ=EF6X ~G~כ;1@#~$Qd1 V@iEE}mdž/i]5`i5+ҟ| Q "ș_}v/7ܛ#cQљ9Y8នᾢ ]mAћ/xPqal\f%r'uu?Z_Ҥp[y|8CJ73 \8Oezz{瀐CP-t،L?f 3N{+/5ѪYr=/ꙕ}q\x)eڧyh-)UGǢM* '@Fd"HTgBXW"+#aO' wS@Lr0I 9^;ypÜ?-<&AOp t\L|:KΠ=B>QofnguYLe7;cs|U .&&HOȎdd{emz;H)xi)5&vdЃDuB?op=ju>آxҳ;#DW{׃J4v$SD,ʶ#p#E}@vOFvg8q[/RsƋQ< w5+G2X:#+L xq<ӛJ>%lۖ?5ˌ|𚷏\]Ԝ ^?.rw?;)do2\폤>?y! o:/0?Ro?S~Ю`gNY\t,b ctvRփ(8牢#J8L4 @)*>0òڂezh e8X1HY#+?$lLu~ DŜh> +~M$/mi&dK):xʱIYWCpRw|% 6c\؆A iDŁGS6gWe\ܴsO9.sY1XK` @G,۝qySY3M,,H=R RHY$vGŨY`gOf4n2@Qq6G&6R\c2s bmv̼U DŜŰ%yS?}7}I3*xxe/=7x\JJArRRR3w.8M9{]=>)?2w4]ǧ?w;+1i>mIqq|>zSib=0^>>"||G$d+3@#D]h^{%Nq:[[zS4<a<Sr`rp[vѦ4X%L7 pG"8ЄtA*O*N7Bc}2tϪ0~)@KT)!$|#Ԓ]stbˆ;X 3@`6i1x6J@ h^1ᩬ'Y#rM`no g\ v(!QM@ Ј%*G!;;zr-E+)9:N0Gqb/yd~DA 4"*퐱 M<F9@M-KaaIH9Rps3 F*HJr9ⅺ1(>Wů\ߜ3+11' F$Qv6 ,5pJR 'IvM(NA*9**FD)Uv̰ca;+lT<:la`oc(4i,Omޤ 0}*cփn5(Xo02El>&XG5pBc@T?}Դ/~xs7aIWA$*lfSm`փ9/`89[ٜ k$6oYd3)lR9'iȶ`9eTqpeRKsSICE C4m֔brʺ^&hN4e!-Fu7U5E&G6//=U>w}j#N_2f.H g a;`1\jA;D3 d_b~Ce\\IvCz w?~ݠPb}}yS=zm[KpúFu Ӛ #ݺu.=f];Y n@)QYMĦj084TseO@0,"{&/lmc015 vRi!lv<,H?:SIX%v5V4$[qyWFg͡m 9ʯ;o-=fj,ַ᭫eRu!nmUpm^Tu(/'dw4Tfj&&[{ߦj{̢ƺJ.S]aH,7Ͷ\w_]{Lszj#s*ifO[zS%4!39mY>hh6#+LSV0J\C)vuQ;_c嶙ve:)3D y_HZA*2ƭUaYꟸߤ˗WLP:kڮZ%|X?>j73*u%=\ j#GrIYYNæB !enR)O:ƶ:]1:Gq\"A'^_]ĉlL4ڞj p(vò YF,nt\\~ht]hRGT#s#S۝-1< 0&+Nxˬ.lacUR HF\D.rTH]e3!d(ޭډ_%%5,]B6Wc=ש?<ꔷsLO{tuBm1Tat7(aO%.QڼtX̨8j{l1Qk ϛUIvFeJ%`ߍhOpJQ1Ҝ3ۑ{;bS^d=%fk.-l 3Jd@ 9)R( mhT:P챴LꟆ̗*W/Ө+jӉ|sE5[t5Tj9 f F1Bq D(*4#ѧkËhꗂdB̓U j=U[c?MA۳aP%߲eK" |8m~ ,w՞${a!Fe֡ G]q[`tʊ0mq1% A /HqnZwvcJ 3]:%?9<<O¨y])@6%.\VVA/Jj̿ɔ_̣}J}]mf{uA!hcէKh^0V-ܷӥU!h^ G4;#?˶(6<ʃkV)u4m6`Yi;]=d2{Ji%~3[,^8J}mdž}Wg%l3&ngw*s,L&qU{#d"}28-x0h8FRW8#+Ƌ ٟLm*yYGY$qS(@%?xsU?W CF1Qa{|X YLyCۙ0?` nh =HaIDl8$q@ hDÐ&ń;)H3Cr R3v f~  QaI,L< R cF))g&.GMኤ@ITcr8\qф'ɡj(A Y)̕2)8KLFQq% SN–@̞m]ƹa /PAvYQI8CI@ t׶z3'6;- K9 9)Ǐ7Tgy)7\ƭOEtRATyǡ 3da7Ǜۇ#)sEZ!Jr>>6NY-m\KLqx'R~YnM\O 3 @MT\X<Ó{0ǃjA 9yҏ4G@HŢ+o @ MTL7 ly)nJߺ%HJ H!n%/ $M$P,bwcĎ83ɖ]9VmV +⇓a)@T@ #Q8@ E1 v=C400b y9As$"c4T-gEG$@ s$uC@ ov4 ymfN';8:ve6-u\#W ),:PF$QQ(`jZafC78[rR+RSy_dW9+xtQ{㽫ֵ*իWA>#rPY~݀jkQyWOEO>ZzقmkJ6K֊%i+a }SPŲ2]JiBC25\ymݚ&mt@l3Vq 6 5Q#;`R$ $lkSHres(=9;)%iS_Nkw'tEɶjr8ʹddfZ(F.; mG{Mb%qu]2J0d+W*lS^iLڵ̴ͨXE|Ӽ6>$_;NM@kM8&M7$M}Mm#)6."6DeyBmmQʹ,fR%;s Pumlz.QМt9F9,DmT->u{[kIShիcV)TVSSGM', A АۨW'͉cxdR+Ĺ0XQK"ڮ9YvĒ h` Lu:XZTrDYͲukk (uݪuqkPEɦTTT\T²5TQ&6UkjcqQkR!\Cxp͚F]FW@y<Q%ID"CNTs.Q<*ȵa<pkȍRR8sRKlzhzq!Q9-bРJ* Ub4DWBjW;[\]L3 NYM}}vYFvlpj…[n%SUq3]2]1]2Yd?)e!bUyR^ Yn ļOfsBºVqsitGcMVA<00(VX~uuq· mؑt9&J&P/YIDkŸR'|.0}t=Ȝղpӂ@8EtgZVPH8dovv-Flqյdg^/87,kb!K J–ărR&0LFa) Aìjrr_O%bؔ*h2nmsΊeU8ˋcjmidsAv1>8ҥ"0M@ 7oܹs/?)*ݬyD}k,gdvSyj4AINakvi~ WCJ%?)^]v$FU4V%[Yf_G`V2b%#VbPumܻ[Y[ɫu52%fgV0Wյ>Fw7"958ضgp /h壍.D%@H&oꫯ5kV~~~zzz x.BI/_PlϾѶcCSSӞϮ6RC1`ng{c[*9DG}XM[Jw/lcr[PHC8BރRx(]~qCVWWЀ@ ШnFeL&ɊB?)?x<iv2 ?h8 )inAI PA k >XYb_:0F9pbk. skX+s ga'3@ hh `6.4m$+CUBE ¹ T}뜃Yr㚺!@ Ј$*gk8ksbuΤ[{;Ga1).~sRh؆8 @ i(~Z)* U~F`*O6JN;Tf'̷- rnc]; bG4*xア` gwN3w4*,ռ6^ )+xƘ 2z#,m( ` M,f1Z%3K c r R_đpY&/HnmH*op$: ʕ.bc!urk  L3\ 贖,]6c;uo[!K `̝Jl<)kofШFe6lݢFm@ J֭k _֢T+=+jeYVSkѠZj}m>ͫb]kE*4k{;*2A\ 38vYҒVt(Y%<@` vd.rn);24bUM%tږח!&z̺e4lhڵB2H,EtWXuLYI_E]mg-mP;r\n8@Dpj…љN+r$D|D"`ĉ{N9Qaw!ǹ.?Xp[c)lv-Ha>lSEcb ¶ Tm-.UA,_hݚ:DMB55\#e5Nz7W%dC۶w+]&-Gօ'gG *gRdx$L$)wuuN_ыveltPj$KaGocJp1Hd9tiDBm;JŠM1V!FmԬTYB* J E( D? ѣHS [_7mm[qZ6q gb\mw"Fa8s&0$7;-S:4Amg4fӠьT%֬+Q|* V[7ۄVWb,>e)}[b;7[hMúD|)Y !VNɟ^NmH'0;1la w51uptݾ@Mxy4:TE9H8om;T,6f ElW"TQռV}Ž|_SXj5WTX,#Zh';Rk'l61*:})yק08nC8%~LPsvHS RN9 Noq8#!I`Q(N?C;%(l/ZF{믿^n$G/QQ{UOOϱc[^y+mnύӵː\A-J`)dhH5asJUx4%%jƍSM2esRUQYj.u]yn2n!X )JJ%uo~DBh-hTXx (hܹ/W>feeegg|qB ;o=sF~ii>~ 2J)nӭ=L]I@IJC~CFT6qoc>_7klqp@J}QF+I+`p@ NɪمTtiiIROL!zP"k~=Lr@ P:~Οh#2A AT>h5 Q@ (YU?3^v'l I T8^Tk:pF@IaYLdTVX6UI U @)e]vg*322RXM&(~0@T IRwQJvGDzJ/@ ߺýg QA2FThFU@?Q@ (YEd){%풃p 6^NpAlIw$im klT {B JEÑp00D@ H$*̵ 扠NődsM}BV*uSnq$-0H Jn?"RTʆgVv^w_ղhlyZНyWCvْq:;_X E:M; e@YX񤒏C +'qЯOY㼷lZXߛBg}xʼnG{eKVvGo.cβvpţPWj&L8xo]YYțzպe5ukZWҌ[lPGmTL:6*U 9k Sa*vfZrW-eӖg(./=Q-9b w{[% .}ze7dȵ(׬vCQچt\rL_DX-%f&K /W3~TmUɨ sN(U)"q{cC-_qykmRvLVz8d4bnY6W[ wMiŖټbh=wh%yxGm@ 3在T\sv-%g7Zި,5!y]J͸z]uFIztYO@j$h_6՗fTRXrea^]f²64Wf?uf,R?AJN:6^9GöWg(ߡOc9+nVTb.Seek^*):<TXH,a А)S`2_ 4br߾j穫~Ź6e7'Fԃ@|pѼƭR]r\jdža%^| $dA&ٱ j-CWJe"VO<="#$iO+vl#ǒ?٩55%ZնTse G J֭kXh}rXVqmݺ&M9 Z[Ѫu qv BX?+Th(WrWގkA."Ӣs٘[T8іfb]0qxFB]㚺&T\Q1'-E+\OrheMoړZԠ1%@c]x'zp PD[lș\3)J!\1[ y }Q F#RȬJ%輍-LRd]g>H;xy߾P93JTO||*>:!R[`@ ݻP8y8,UZKm(R]WmBhu}bYriE暲2J?K ۶#sr} 'RT4*+klm- T2iBD%,Q(t"oʅِFi;+uACGUmП7JpkjVW9(zL.DB%%۩ W@R-nCseb6Ost/nF# <&Քo5魫/>x b]чsM<5?'%$4)n3Xojb&E^@X9YIPlh %܎An9tB!UKبTK3=}ͿĂR/.O0gkˢuۛP aR!Tdi [ehQMDZ32@ {{2J(2Y٘Oƌew555ŸhX&:׭ Se5V+*ҫJʫohFm-+DTԮvi֬_l4n ӛGߤ2[-k N@lTvO Ѐب!Q-o*iݶҕTHvm(QKzmbf نAZkkPqRA ][6kY m-EUAZ64J]YfK,e$t$rw8e PXeN#7hh~ ѺUk7uSt-MA={UYUu˚5-⢸шֶv#GYLZGqVk'Ҩwݽ gqvZѢFlxAa_1'֯o۷#uLW`<ݤpOc$qW4#d¶' L2 Qw+!bYx!"ǚ/uZiQ\\GevįBK| Ƽ"Ei[@@WTs4/Jcj' zdϾѶcCSSӻ~Kau%cP8@^bОn0q ] "tEO ]90qPrGHi&4/jrZHRj/-R^?+x'ZZZJJJA Pc=mH*ۨGaQ%5(1h`N3KL6 eL"@{[JB~9O dKSXXKtiEIJJRAs_YC]!GR{}nYJ*ḡIG < by{DDDMS$RT @ h|Dp8z'Q ļ U$py%"wԙ9uX#q\féFQq&SuOG?x #*$Ap@+IQiw!>5ě: Nɠ ;Mun6lVT*TS8Hz5^mj?Ʈպ fwIX'Z `rFA Aq6 J{<}0 G-0*1 HExj~f}5o'2.66v[ D^\QѲ^8@&acTn[ӝ1)5c%4on S,yҺ G0e(gX;Kj$.I4Kfzo(j-7+7.N-rl0l7]4g0*JّhmQd,|ߡn7.*_Т kްdAu6 P--o[es߬nV:v㽗xƬE&xyw#HT>rXH e 01X[geԋ-GVl م}oxr8p|405OzP8&/ уpP %dܲ*$a14: #em Y\?uL팟΋+M l !{knuSPuz9ϟhU@6@}B;|5K 82@1gtdmvpQaBdfK [<2&p4.b#>ef!\MGZI!_a %h,(*zJT8~Z H0b0},!{c6ZCbI[kz~ނn+͙LI3Vveܠe,;)j@r9Iu'*e.Qir-~YbUNwyP0)D5#Θ7{Pĵ $;Eu^GEJu+33LY0E&݅eDTŨ/iu"gt4c$L!roבԱs眼}4"s[+;AOĬ<78)lM s ?PFqKx1 I [H3)ũev0LL ?j\"m ⸕+䩚3ŋR]fT&Jĭ* v]6tVq<-jU#61rږ7k0dQ25yFVQ{_SqhZ(o˜E/\xHa֦ҥXoj)L4wÝ.l~S"068%~b|\߰羁1yő!;}L~Slv*.68UiA^C$?T=$划VT۶.D:+mV"uEl0i<j QWJfVȺ03NGUk .FMJyT1GnG^}}w=zcPO]ty8v8%R4/?Xgs޿rWD5sHg|U.@}7CV ~2L2?sIz ѶgI˗03/vv5^"Xrݽr"BglvU<~-]c7&ۙ? hLJZx敇g7?^r H1L hjMncsĆ"Ȟ R ^Z3)oY놔 )yt:Uz#wԱӎ؂Ze BOHqPjE-ҥv!)63/*N:o6HAbăOU3E- 4xŝ?qc|gy~垻cۻn}iE~[^eԿ=G.]ʻpIVr#zo>l_E'r|yg|S##wݿaLW֬+ f\MZʵ;P;;nxfi[=Ķr+!iXT7? kűmCDm,Ͱtpial،I_qd)DGWb^D3<}um]tJAZ蔕%=/hUFڒ@'zl&}7Z3ޞq1_$1h1~v?Jj=卤?7Ӣ\fVo~.N\7+wAnl⬶E˭׽}C_ˬ~嬶-J4>}\!tx\~ܙm-O\sGPz%sZY=:<]zȲTj9VvC "76`Nm֯qذ{6l4OįDvㆬ< ǔ-[Z*?l6*r)n%jն,WZ`3@YY웫Tؕ-U:oRG kU0>>)TX'%;yzѺ{x5κ+/ulۺ_Jvp ;H ޙeOc3:p93oZ Tg)W]:|c /֝][W:7k^lڷϠ/\_>mw#Å-͗k]V@b9?} e_qKvfY&t))55g\y|nI%|no [-)wQsVPD(ubȥԉƁ`D>G4ShzזI6_9n.zݼ2/@Jރh8M`U-h8ĬJ牃CjŠM1n"fb@2u/˵E/&;0qliRLEg8q@TfVXrOQϛPS"Zإ3X=Ca+]!%Sm-,f]pp%cR^*"YeY AS~VfaJӡ Ԉ 3R ^БLZSpTOHD~woޔ2͒+jV> hW@GOFY |E]k&.UL{ԣ#He#\nz ~4VAG.QH44"8KC|e=]7y 'm":1J1i,YtkZoǾQG ,JtUy qS+U(!n{{n[W [Lfהf2Y?=ve)]J#ׂRʕ`՝pŶn8MI/B%iQaNP8@ r8X8o]k VajО:1:rjb"T܊oGO{t`+N8TƮϣDWõ37<|eZw2-KI;Ӧf[]LI s4-:pIJH0R{lUT&?F ǷgZ2c(-Pj-f-&bMzK/-k/'kPY[fvV*J* Q-{)4,D+Põ3dK8j/Kev,1]SU%-k7fNVO)H[dUtqGGs FLs[H\&eV~_Ф;`)f!jhǺMvW;mp& XK2?:j% _"r5\w=)rdHv2st*SN0X5/CcʼnB.Ftm'(j2D P# }I&+R(#9?(u\aЉS k9BceZy=U"Xq77~I{; + @j\XtVED-?BJGٗs{>REZnB"rHZJxPW ʄАLގ~M:m``>** .|EV(Bs﹆CFuS<2-i-Wy*QgK^*z.謡" +Pi0{5WmVҵP^T]B>¥ʹۭQpmҔ #ՇݤGg+3#ͷS=bsԯ*4c_%I0.gB"9Yv'jX6q*죁VUJUhD3xjrfR9~̪3B-&ƚzض$QkPPTKfzk^+ZXHp`.% ԠEsRrh 掤R?R'%X'HfV Js4F - ! v WԤG j&ȉs3Z6FkwGL7kk,Ҋz8qj.?aiNX)FxVXByX`5zջkVWPf;88PJ2b5bEnfWY Tu Ġ-wK Ya-]ۻ_P#FL$ԕbNRVԣY;Z-rg!:zfTر* U8ԗ"`)ASj`UMgy2S/xj@=2*4MX TY浒2-FT:b]}" fIU5Yp Je֦zqꁤ-EҨ;? 2ʨS$i|!H)#HHkd/}H{%*[HbNMR{%^$\_tKvJ VK#PʑpTBUx;F4iFϱ]L aV.juYFV!)ajQ~Vu.,ؘHڥJXe,V8&}:"+` RhHF噙}fnMޟyYWlIp]wu{(o~aץ?ޜ*utˌxE`YRDJm]QN0~SF_)kͱ͖nBwqrƋ$@zv/3Sgםh̗qdiPJI F-'V 2n̥-I唕A{!t)=Wܳkhv/<|Cǻ歯sG My#˺RbX>y7忱fcGʵ3sL(ܽVXwa f<كH-`h7P),kT~a˕~KP-jϊ;v}+~߸2\r.?û}{L mIYv<=_{,1w1OfW3J 0`YX""J=aY<SAqBrP6}T,ϒ" s&y:'N{G~wvӚ#syG^g.Zj];+׽够ߏvꮟWuD^+6wL"޻ex2uTgQJfHo/Uqw(Yc({gGϋ8O%*)L  .kn{⇷}~GCi7٪]R@I>Gm3.&n0$4Պ]]e߲#  ƪbw1Q}{S.]᫟a_dݯ큇ux* _e˼l{k^YGg:pρ-"{sƲds 6t +rrU"Eڱz3>0Iǵn鷰 L$sK(_Mc_ͫ2` \uiŕ߸塎oSwu܎؊3=|א7gpgϕ;oLt\Ǭ_ޭuknaUNXNP .%,xڏ4 4$aEycXQ#7V,lۆ6fG-Uqw`ļ[ T`_A# 4:G-[zRC&y0{FePy= wླྀ.q: _>^6*EF`;S]rg!|ê)K |8r{%rOOąJ59:SB 9oOhE/: @2* ؄GVcrN?oIKO̿6~X9cX{N*=W(:.Z$շc2Y#glu]iߑ1>'AV(|qQ`3 y뻈dKʂBckEuxO#|LəIl&_M/JjCk@OhT$"§: K&I3UU_ۭpSXƝxcyz& QJ6syz[cٌB t*I&l D SS5e9>SQ@Q7] He /,WWJqbj2 \̧Lj|շ<)n8t"mbճ~&U5\a]3p ¨p@8!6gQ麙o)Kn&UxP25E<=O`fxB@;8!1U ݉*hQϱWQSn;aOaT*r4(НA;IcQs ŨS&UEM9а=ˌVk61aQ@Po#x>#2a roɆd K1a A&Bd RXd3gVк~UjqoZoߔO?9p}Mo;a{;/N9Sz k>CB+JgJ)}@~LW8dTHyM5|F{},NgPXh^)#?X* k?~- sXm\,t˩9yXo8}~K.^qkt{9pOXWs}>u/NVI.>ULڷ,߱=UO{|K9++O3-?t[~4i>|u-v|/1{go]w >>[vOWC>}}l?y,{iu{QJn;Q58 9QM*ˁ$5Vsu\+!5ϼ%KE9>'{=gYrˎqy)-w}/6w}kc9sz)ê}D?׊b%`Y%RPXwqd9y|xcWഥN~s:VÔfu>u-]߾\<{*?]Y{0HD5süe1KG2 ֝O>VpJ|{ױ'f松At'ˏś.! kJi wFV0Kگt;n끋-Wv8gz~ bW5|-?lί=g&9MTJgjk]03kG*EnX[rq[C?sK6hvx-rt1V^PPd |~hLBd?C;ițo^=w۪ußэ+N]?~а% Sﴋ(gxɗ*ExUd{XDk3]C?zav.E]2Ƴk4'\{ۙ"9IIza80STƍ^OL:AmV4>ucտ\zm9>.br_^_Cww׵\O'\w V;E'[LeXh]ul7;9_szs_:q;.B;sgX_9cg)GqԝD-zN& Z@ɚ`>0><::tm i(8t3w!J-*ŸPX&7R1ﰴɈji433SwjMI/ r 3?xxW7wϙS]kjj2_k'\.dLuNFI@V NH?hO2u2D,k`+s~cOkhSB,'Vznπ:d{ w"Aҋ!y˶+rAq'őޑbC@I5(PLi6$wם7Зj.ic%j ?ΏRV# /G>+谐m7QB!k3jħb@$X8Șmi!<X1X$ه蜨z0Z 9iN|| Q=tD cT@iY@"!3>^XB k7r#t 7-[;:'=J& S$ۘt͘*SĀuk\DJ\J旍,dhLԓ"PcVw|mtiaK -`ͥ:K Jm0vʕtA'͛Z/lwAg=GW=LVRΝ.ݱAŔ:ő*i([=*.զsV1xE wQ:S&5¡x$ _+9q鿚 ?hN 0ҖM ?[F6]{}hΞTOuR9h`fKw\( oA\n=qv"2q L9 r+/ɷoJt?^pپݳD&wL:Sk֖홖f`9[-7<ꪅ9rd.ա䘤{?yPeTۙ6$+ 1؝:RZtd[7tMtdF[6ZxoQui~ݪp  {S0 G0'pdƷZb"t+gP* t@YH1:j\~:PoG흕Tʛʠ.D~wt<ͮLK6&q;NJow(J[$mn*-X4'QeRc*:;BtTe'zPe)$]֭eW^*wJ0;XL[cd n#U @qyl|"fݐ(ZM2O9ā֧=ۛj育1KbJY #Ɗ\͜rEinf{ V6^~Pt5y-UZ:-)6ojF*FM| (cNJ~!lԌިڑ'Q# $f `]> ?"UGͩ91@Ŵ:%֞˱\K[̺g7ѪvQP[T8ē'+ 'bhlz{,p}dK%xdkv s5 -ȓ@jYl ~kg=n[(!5Zr&qByӰݞ걋t9[Z]`}мe~ Sc*>t$۔ʬm\/rbNųh]QEl+,?Dv>Q7 /ϭ>Úg<CvUuf,]?"Gt<}$}Nz93]?@P}ͳ琟- ^XׯRV9=_f'eϗ1h(JA2琟-6J2_U6+Rg͝آ @goQ%EHp8} o0n&W0Y?+ ee )'< esDQ$Gz'>j*.aǓY;{`TYKDFt3CBBds$r?aQdrReYȵ`&\f&b`"I=(}0p֛a}ffɟU7xwi1zą:r#>!4$:YpJKA-.8E$‡Zp辥RZИVTr?a*]61`8{Z#iԊQ%}á' WM~m }SbbFHW1Qj~vpEvYK{aUs[>YF LjԦ="ЎKK,JS*J Ю>wRÃrh 6:d僨r%(5V1BޮѼ;jxC#Z@*y< g68X@Lk=]I+ q[#SB+nyfӠaEyȗdٌ4_mV@+Xĥk㩸4ΜDHnc3S+&Y*S:;\-HRYfsQvZb6O K'.lqOz */Fؔ$i^ U3á ˩tJ Rv)h~ 1e[~_ЊpَKM D SvSqO'B_?l#b~}hHSoh:+pUCG Vj)ZU.qO_z!s+n,G^YSu[enkxT|ʄ JgJF8BƬN]U}1EF5Ƌ4ڹwx|ZsQQ] Cb\~ā9RxqHdCC?.l盀e },J2\fG. ƇpTP59{+U쐊Ԫ(G![}#g?-(]Q%MK l]ڴD6O% Фcayvo Ȭ=bfnBywϖ̤ q>*]#M#atʰTt]H?@ >J&^2߬Ҫ̗>h_hJJ^ɇ~\rg~xu[󒅨dB5Kʁ(bV*"S1םI$Bǹ"nyvg7<%qhgmOƕ}TfV*TM5n+Xǹ7RBb!%9K׃z-cqwٙ\̄!Wmn>Zt ՏY`(zo5DaR/N!H'1.-% *~Ĺ?aj|SEg@4"bɓD/yy35^4uY}@)FK7iSh\Z)9–N^vZwz//tŗ[̏o8l>KL_w?rTٕɴn!2~v!!^O3MPBH绿I*re):N,4Ib!ٖ.Idܵ5K~³k>n‹?ô57xgNs+CϔSq 8 4'kވ1W[\aaX)A¡{رdD׈^/4I]Q1_c̹  <.}}lwa몏xv7wYx/gLj{虩\|4w32f6ꮿW#G$%1:сgwIC?.6|u䤵74_X+ڴra "'8"V_Sl4g9)R1cnge@c0J`7x[Eg">Eh/gb!ɐsw!~j/^J[%%3#oAa -T/Mb6BJ(z` 4g2N1}~/ bWFЪ+~2Yzny%.{ezmk.l?!_k˳.rYҾȝƙ)o,dGg/go>G>(uސ">qT~!Do,Dĥѡ[(k+Q@Ȩ"^n|2k-օ_yrzzq?q\=+>fg[~m8ekh)ްK޳fV-c閙gP6}YZU8UoHg'&u)(\㢢`Wز%aURju7 , dĐ:hnsJJWS}H]9EڌB歰HC䞻 'FcTDL|hnj40=u꫍q@WEUIlX xl( 6['g^fJVݻ v@L2KXU91U\m7%[4YǶv-,# ]58H4FCpq$jw4%@WEUElǞxd-UZrq!u,h|iC3[qVbIө=< m. 4 =h@88lqb|{mFTizJH :!LBP@.@B;!%(m ~^X)B:_B? AN%;~F JA Z̘~J x)ΫAKK#XWQ%WwYk$ukʡb/$˺=ڡtЀ>*8#J[#?Be 1^>Yy&2_+fP  6ӒƴXWQ%WPwUZr+u ]-=¾+.Ж UzW)?^HxN35?,Iڜ}^YX„I { A-'yhc1*ԨATwUh*=كB>,0U$ء-;j# H%'`(9M%:@MIVtig_YPhIe9 fQK jڪEQzB:%3fb7o ~"! 'XSĜ)$|^-lBX\VU%?ӝZR-0lB,"aF(u $gP--F>UajM7GT+ :pW8\+1C_b;z3"|C;&r@Qf±=#/}GEn^LMҫu꿒_ӣ%\m.U0ՁwénDkR/_:DGĩae1{ɕ*X~R/*PNŧ]CvjmJXw.ӳa1;*{o .Q57$zudp$#*s+N ojV_|Us홖f *)z+i'i3PE?;ː@ί^_J5rT)[UU4֝ a3-#؝+H$SfE||p"ì-NqujȂc}, G[AC< (ݲ5q6 ՑB-54RQU7 NqGwCpm`3KF +"plM-PSUS ~r_5U7fሺw%JI' T9'(Go priF}}w%%&Wd2 Nأ8![ s.@+&CUKY5ٲB30*Qe"M-R- -ڡcc(e8Fʸ 0Z>rV]` +6(ϖ0杢",P;ZQ>xJcA-toU1ⰞVR-E3 4Ofpn U).Qznk NvnO~qv2Ym/bH W\m565T>!/ N%S(8W|j):+]3ڧ=ìCo[X8>fj R3j\SkYFĻsu“(K,<34QJeL/wS\ZGkƜpE)CãF!'r‰mUB\"Pq 3i:^(zϾ|5PW#jHG0eO_k}8ֳ/ X}Lvu9PUIY?G%‡,H#i6@]ɯ]IBd1e~3_cx7q_O]qoӿYл0A~OѲr3s?;IȈ7EqP0! ܅K1V3֎XGs7ᢳ>̋F{ɫPcHSM* ԃ?ߚkQ{ ǞRPnUs'z('_f\[TCe f8$88ER&zG4xlEgW7\yЈ@u4[@Q1x/heВw/=fK?y_>L}p-y/B楟~. Wzu[^3<Ľ|Txބ[ǢJn\{s]圻L>V^<0iջΎ34qH%8 X jqHu{ta>EXlsKX8B #Tͻ3:B ܨحKl+Xk|7W^qGe)-4.{ r ;K5WWfF?&2ݒo|TEe~W]%"+v/'p d2:,9C[;{At'2AU4k@.͠uayBnQ[e-Шi󞭂l ׬KDև<)dh:Nqr 4W Q ( .:w'jmRF=|.P*Ô70U$'-u>/|$7&ƝfidE_\NgV*oֻخ~oZƲ ͷkL01iiF'$3y (re簗a )ޯC:'ԅEmZyg@h23*X3xq|;**TΝXl]AV.2e  c4Ur}H3 \ЈOwëᵩ40;*K̼]w'A1p2gx~;Њ7qPG3貯/,eL~xհ~;DY0dZ]!WPUY]{cRɍQ7,IieR恮L 'h^Ԏtha:8Vh֯^PS{~u\n+Ti!l||)?,+֬kv Uӻu\!0 wK7D<1%=6Aw][i]-[$$f!`eeOb ji *;16ZNUr} Hӏ0 ;kCi4to%q #a,QTjb_ N/s~e}4VVfʛ\ۼÿ͖2UE6->٭Gk>x*mZl~zsC&W#J3z=ͲU_jFC9b8QFP,Fkwb1oI@ijj"Z- ztsx6fW7X%fbiZUacVe6[kAcvUrHRQ9u SN aLw\7^ԇk7sy'w[s$c RTY)wz|# ,^uD6L VJvc_p(l)B[S@q;#hn6U-.b@`nl_vMZ-xw 4Ai|Rvo$Ǫb`N ZUC5 szc5dV'ZKV+$\\63*; W%-meq%HBIQ'p|賷hpd\N~UhS(srThzrT& $k$v lkOt#|6R\ pY1 u7/&JUHBdq_>7iUʦ)qM/ <$T YxH84Dn%ݪ*,wَ,k-rRi dRUER*Ak{Z'ChSQLmsN_#fNiI{z1\;Y\уV>&PJ+YiMl73>z=x) f ?W{2yvo )M$%<6MgjNuQ%u3pr! PPRxz%Re*:iJث/mbqed z5<(h%P(+-Ů\y C5gЎFzbm7 .`kEJb˾\=ioF&[q}T "v8DɥM!B$<~cRzY7lUR5#7 pPB9Tځ$AȜ'n`t#ChB$'vmP`*5Om/0eJ<`q dqVm7u=חx9(o,ԁ.jr;lIR^oJw@IlWC==|oUl*#N^ۢcthkT8H?;d5&Y_-ehOmdKi^%]b`*UZgdf;`:WS޸71+@ te.{2Ilj{R7E:ohUR܀ RK%VRG_pOae<=f-d[&y OI/Ypณ9/Rr#:!@ͰZ+%j8u冣1BG+I5%r84,.osD9䉣zaFεv5Q/ճEE$k#e\_Bf T}N~#i ƣ_O-v,cTڜ@cӱSDRs[>-^9T=!Ts7+ǧim %JW':54RY̾ `H€!GubxX )d"4ҧVTubi4{kp,ڎoJeNs^kUՒUFNE+N=$rlƲGQM6˗SF(s"YeҊǨ̮ZYvV*R;[WBJhtQQPa˒6WNQ>7=h9U<5h#˹F.(-fgrmV2"B&TSf)u {*TMpM5NH;`.#ҹY.@8B`4WVBǩ\(aR(qG,o˵!st e8Ro' èX3hZZ( eT+am8V4tqfnBB0H,UU-6l=Z;m١-a!6/zB(a'.}M_;z0"jGM^9<"5ciz]B-۶We3"Ab86JfAJ:t,Ć|a0K['{ø'7J/YJ њ6R4PTיaL{t1%j{TeTָCXհ-pJ4sv[1lҮuwZhe+Cܘ3 گA\aWPHeylzɴ=\84jڠXeٕR(zHCC'2KFm+$WF7emKg+YZ˪e 4eKhf"M])-*fjBüHbNhAfcYuX2T +ӹ3 bG-T,в-.Ezɴ=pD&UU{:BEJ+Ȑǖ8=Qi1oRY.Y6'CUUUtym+]fvR?q @w6;UA~q;$O Tr,1uc_CzcHLr$`y6( ҨƯIh|ů6XLG/Xg#oC-ۂ ?V1q0GiHgi*_8֡:M)b'~m{Z@owgR"[Ve[6%˲YE0XFfGU0ް:a(udi1ʯ[]֏Vk]gmzSxbl\k3T%}T8)N#\ۜp|c>!b-nJ1и--Cv&Wn_ʊ\;r mydIl6D*Pv0dUuvr*(Vs1TnTeE**Ik:{K7]~k"靈 fÆW)yhfǓČ",5*'Dn lO&oBD,yOM\๣WnzKtRrС5}q* ԕRr\|R4Q:`8ca~#R%x S}*TD*t>QV,|.eM zH6Zw֋/) иjp:;iFw[ХLgp9]="pCI"}x 8Kr~,+G'Mu&orpT Зt/樐I4yB&)fQ* ʨm Vs j7%dtvyZLe*Tdj:ykWǝנ%M/2}Y6fTÍpD?(5xNɵRLYNp"[IF2q%rVE3mF/GJW/(ۀS}Tz;@yF}CK FISs2E"6Mءqj[E~պ@%RH*lW }vfT}\IC -U>$yZ oP#-\ՒsZcۼ],佢7λB^D9ɞqI`':bK:ua`ǺjL\,F,I ( 24zwq/ˬ[$-fzl.FeFH\ʬa٢8ş&)34z|zc͐/^4@B5~b( $Ϊg4'-dud [2GgDU)9V"cׅ͡!|R jɜp6\O͊]o{5VrD6LPv &ģޞY'|zMRo#*T1 >5eTYn'T ޺лh2*i k0d dTaÜIpŖJgh`&* zdT$z9nq tJH|87`@c0*SNoXUQ&КQY6;ƧTQߨq=:TjSJB:^J8Y Tqa#.ba;J~5F>Z*_mdF;KH'4*dRC(2) 04ׅȯ27n0ʙDC*Z֭ ,ewfKNMtdԎ6t*X4ѐbUS`[Œ=\dȦι2,+tt6FHNөQGUPfRLy[;U9@UtD-b *dkr˛sD34GɯƋ%oke68Ɗ\͜rEy!A~N3W}ֆnHoٸt݃TDјVT$ΠbR<uM`&h+n0Jcm$q?fsCC9 Bfۆr V>[N`Cvn"2) &iO ^ULg˿͟Jѭ[P$\YmfW)/Uhj -1P,v)Wsh*o-PtrTz bt W1b0O,=j曁Ä ٭Ө|ld%MzvuU~vJFvIwu5XlG3DKnti--i[ƺJrtW +b qF릖Q+fqɳ/ȧG|tA̟tui3V{(uzrQ#XzبnQ5fʏ{/;Y,+ YWC ã?>݉!Tl1q_`|kUr\&1 k^DGOv`C",| C1po@t`R<?G& (20늿%&I @L`7{&j l&è6%u9 Lcu|ТMMMTC~d\Өmժt]XxfktCED@&F xxPbgw=w{otkvb  H`l 1)Vnhmu}820^DL*f;a^ޘn@P%O`xTfxq-KY?NЄq̳dj4nV1lsKX8BPaRudR%bbǃP\UAR2%9*"zYv{fH+vŃH]i[8BK B)^B[zԶ>_eyEAmK%"G 0 EP>vȥ79tYUʼS>ne) M0ŏٜghԴyKԋzt D)%{q'@^q)΃ \/,Jۢa,hLG ٺVN[obleSAFpVKhP"gT}T 1 H[㍡V$Ђkr Ք⸴:/58B3cCWS,qقk~JT\ yhv%@ [?Ɗ+$Ƨ-IVǚ9&!qdzCX.%+H#UE^АWRJ :T\7a)sgifEU7TƧR5#Pb-mk"|c9[\>@m qK7+D=nkG*eV>cp?^Y2[i:/|jX qT&?R2;AQzB2HMԩZJۂa,G1XoH/g;EkXI<4p `Nf;uĶisA{ q? d( q%l;V=j^lewj͖2qN+%ۗ< . zow?h`Rgy`w'607W`L[- Oz;*~-C(pe+D97 .~h;,dlFSD2yzL\zb_[tՁR2 fNq娛:3jCFzS%Ȅn3 9i=>ٓiVgӃ[e޶->~ H %tu9)8",W׊j^.Y" ˖u#r*G0l\$k]n9#D&Kj`=H6[vJZT7-,=16cx\EvrKX6Δ2%O.Tq6b7Q5 `-3SK:IB*"Uު,OFc\I%hIVv;TVDL{xF.s*n@sOEXQkjGgU ҃TWْ2]zHA' (:"[}ˌ[J*CYkwc PtHK YJ.wJ**ڂiiVljǪ@G5"Ix.F"U\dRu,fق-T,hJt)p˶nrŝRd a9Z 9^MB]Ь]r)G; ;| E[Tohڪ+=Q ^iUW)G|1*FX &zSO)4=Y0ss]tRrQt"7^`BӀڡJ~nVpA\ϖ3p JΥoi,D?g }"4kZ`Teܬ M3-q50 n弢,Rψ1rh V[̆QՂ axIhviVMʲَ-m#H* DuEp>JlWK৫SIzٶ ;B BF{n94bie-%K+gӭsᶐpY뎽S @$(^w"Q tř绤dd @bYX2cCD00' 6&fOdL`&0,;;LqLr3dx8~ 0Dɒ`;Ʋ%㗰Umu׽wuW^}t.}n~vƱfQ9Ns]Q8>zBYi)mm69W;^i?cl-)d+vchm+ͩ6aIt +;p6}oU,$k~Geq ٜnv&+ Vmt̟\\soqu '^#k!-]/N.®oi;[!-6\&2^68dEmԼ=g +U(^Dw__#%ޕ1 kAÖ_ql-XJpBpSYv_n|%l:LNVKWWoOg29v֡PFƱ^;:vxf/k8v򯭿uK!Rm3 -!cmG+)|cH;"+k5%y@qvDHG5 J6guv5c{:.mb]PtИCp.%*AC#ᖯjW'v__9;duwxx<Jܜnݸʞ {:\K;׭qGXGbV G]M8V;ONHew.~ejN@!VZJW{ZG\+p6#['\nqwmo ?iMt׶&h9l=2"vnoè;%?]Aqa G`<;%a<ᶉu]o%)Ss66"!Ý %s* T F-C})AQϩ4֪WAoxYH$rA YJ?̚Y^~m)e(Jp+Gkey@% f(01b_o b bnBk^@H%QɅ$Ep\j$a+`apּ166oc!Gd|dOݘ'`)f!=PxK;ך7ށ" U:c>C\TZ'_#A$@`0suu hk $n1:WaAX!#Tڏlv}{L,a yc%so`nυd/kp(12$΃Jr$`X[,+jNa\t&C/"n"=&vqMC\jwO9s夎  x80;^(YDs)đ΂#-Gxl6xdIuG9ۢk^|N`ߵkײeO~ey)))90&:~d"e}HX(&{vxyvkilV`Ԛ/- tMs,8qG{޽mt3v{{*{_Y.Y2>">wYf͘1K/%8E>G*0Hl+?hK"\$WY#͖3998Xp;[I1b/[}`-Ma>$ouϟ9&bɴ}z*0ߺP<$q"1^dnf\*cT!12P*Z䋈Cάڋ*xM Xlէ<+hi$l]6E7dL=:W/ܺ7! tUEEL>Y?SzM=A{%אBOwJh$u2t~5Z(sJUf::t֠:%7556ɚS2@NQ P',u\Q'Ѓ۰6}0!xߞ%)]BG6.[HVH!vg~~G҃f󣒁3,۲hz |JC!x5R\& v[JcbT ei*a}e8K֞;/QGq?]ξf7-\ش`O< @(#6a"/p`fj.YȡjeqnDӎ]2u O=cǦM{w\UJj.^i0KCR|\ 5#P+~[W@eJTN]|EU0]aCLv~IXDnEW@*XQkqp nQ ٿFjjӹðڵ˗μ2P2BYbNN Mp6 14liD>FEqihhm["t\TNM4%%a] +[ ȭR+0 _t>zc;hOJN|w) &[nG(T_8^F+*$GTnC7l /Q @jGLcpqO=yK\+TP㫫 U7e:{"TL$ [e4'l\.6,tubfڽ_v檷ޚkp@ P 9V@a?|XxIQ}h]i dDw#ѩ<pom/gQ? LgVs}&t}?i-=$Fh*ghppncW6nt7x@ PD@2 LQDQ't"#8?e_'4@C,"Ş׳#exjm?|x=_2uBw?bf;8l9{NE Eu**Ҟ)=,#h/RS=e`# WF85_5֒WbS{mkc}=}iMG/?3ɰQ<\y;E(ZQf䕡٧!-C5U H8<$jC#{|mpN9㑼.>tθZb -C'L0W8s']qI3ubyǴRʯ+,HM؈mBل *BT}}}[:!HvzTɥ@cĆtĄb:-!S0 '[/')mS/_|ۯnަ&Suuu2Ycmtil:rD{t&V~ֲwMA#hs6%[ v=ڳ<c-M69+b+:j d;T}MS@ U2 v0/j0$PAAEWP3}sx({Y^&L DEF>RJׅjɽڞwxuzϡ'Ν>a ?4~EXe۾:V_? u3}S+4Hgc7S0g+w[aͣܡ8d%Z=j.GD*c.Y{fS۪kflw7&w>N7ΥMW PJWV+>-!LĈ*~I+(!)y= R}FD/m$Cx8 g/;{t# 8UWWG 7쨖ir_A["hMmm ݵ[k_Yu5::VvZֹ);̚3_խ/jm_Bwjniu. G*c.M۴n/aHD%Mnimm)lSK'i|uv SD* BVK a=Lu"G;=?CANyȰ^Iah)gҙ>Mijӧ{V/oOo@hꤦ|EC 8{c4fe+۬=+3kWڷau4|ъct,3 ?9@ ]AQU?QL*%U[cOSG0Kլ*:*g:ԀL|U;dBNy'@AV!t!*2(a *~rŽ}߭\Y?08eSg z MgS M޳~Pg0YbS{8H5AoP>L P* 2UTʑzmZMsWB~)${3% ųf{{{u=v)@AJ!D才|BEJilG@`DeNZ8zgfW,;7=׀u [DA(PЪSN7~0UO>zԭ,=0`Q*?x#hD| ?kZh~mfܼ}3(ůfI.#8VUTbR:TѰ:)SN566f'.f߾C&uvzfo],r\hfrr(Df6tEt5s_}uWUUY$A (F4 3$4:asKĴ)2p%FxU' "٢zn`.;oVVm>g,F[)&FN9ŧ$:8W+k͛fMuu5e) $FT8(K, y%(P%Bƍ!P5ȉa)q;Or0>/ ҕfawƙl%M,pdY2s4=@*C"r=@cRrI(a{8z,nE`tMWWVSڜ!|ӠDgD.CCm[;xpC!:ƍa+؟Ġ.25R jC 4RETGZo8E>Sv^3͜2555d}P2`Ve &Bؒ!xyJL BQ5f'zGQbR (qJ\'M@3ljG(Xt7׳TY!*E+AG.]wxx; j{Vq: DХŌMF.\⊊[rۆ"S%'JQR ( 'D`/7LIk\-[0Cs AF>0%#y.JWjVJ-tß\Q$"VO6RQ@ rPAOX}IRRka$ n%H+a+;(H#+d18=f1lC\oY*҅&J.tUE!q\l#~gh\уpJQ%RX$J¤%9s$-0X܏#fL RbtE 2o;vlhh3"R>٦FOG@ t]25cǎc[Eً/>GXШIƅc:,^z[Ea\ØOe_%e{f?tl';\l~vkZV٫!Sxw;4[e)r-:9Vϻ-5,}ޕpiioXyw-J>6mZDW*u,Zv`>cȓ\PluC*+F?ޔɢ)=c)$X c.í%%YB GTUpyp*lr@%LT8c#0l RM>wc9? #q4z jaK ɞ@BP8Ҹy7&4։JeL(QP(@Hy%`K,'>hWӓIӱ顿$2-󒒈dpg5&ݵozִpaӂ>XU  }_%P+r*e,8m-a+eWh!Hd&RPBѧ* :.UzWEQÿL俣3O 8@T!=̤įF4)O; t>޷>w OMLUUUJE1-odOMc?gLjhh[/ZW>Q 7ZZbx-Xcb {!9"@,EȷMϝξ (U x+L{,}_GsfK5gNEq(˱ ]"06 I?0([ؚB7X }Vcsd[O@JX/~эzwՔT44eӒKUlr e1d&zlUo5&\x@M$*X[̍dW (:EȿZN T԰T#{f 0S]̓HfMѝ-\H]bS4XЊF]=mUoB* >|CP,^X3>|m,,c b hg @",EE~۾~Eibͨ(HI=7qwE dEF^I=Yih,JWtG`UTDi|']6XX,$\ :ᯝd{T ;fQT~gg'eTUWWs=nqʿFmm_|ɓ6)eX鎂%Bq4DK0وmnF_>CT *&O\CS#>䓟go\~ď?Y{9?-[/3/!((k>W "oO8ꫯnڴjM7}br__)QCM8)cž!D»b:r X!jt P,KǏǏ'XẺ/>|ތS fժ'r9r2R&$Sp ?O'6n$}r?)@ o~64i҄ TJ4.0$?~g`on Q*ZI Ł\nEX>{| !*( ԝ-X0==<+NU> ́VME'xvΊ>H?d2Zcɉ?5jugYR~"G4+"fp`_O7+Jhz_{v)myMQ#=\$ QK43šN00󊱭{ñ'SV&{I!{$XK\+ u*HL#(BR\8 d%js6KCEa* |Jutbʞ0 aœjO@i,J/WZ{'xzO®P~"-TVKBҕCt*(N[G%4/s4P1>7ޢYX9mi2loP.#\e'_{w s=ɓA"1u L ;o˖1'DOmP ETXEgÑvo.VXB幓]yR"Bṅ ;)@ E2e /t /&M X@ Cdt7҅=եXB?fP?wwkﶎpyJ[WYMR(Q#ARx;}g BHz)CRxk?z``&;B.rexixSSӲeFV_wO…3_} UUUդI|vvvz"_qJ:G~.+WIyr!YYB*ƄB (>}ԩS kOO3gnظw+ V=|Wm9,Wˉ)AT1bv8p=pfВ]!^511'*@*Og(y䋢hEcmuѡ¦͛o:p fBMOtREHedRUt WQRsrd ʼ a%RUaxG6F銉` UXtgFFpy4/-'u.$w饽lA=&|b'JNERUP#( f$WI 4* , x*+orIty'yGn񓅢 QEEfXTe;X8hy1U*%dEWQZi|m3fb>Z1%;;6R^؝fNFTf1$7X@PUy "P&#D ~ !:+Ҋk؆%.e*?'*FKx67,ǮJ&.LɋA (sXpʾu9ҒQ=:PT)׾5".'@  cL.w@ @ X}BIENDB`robojournal-0.4.2/doc/img/screens/mw_anatomy.png0000775000175000017500000036431112142060704020426 0ustar willwillPNG  IHDR0>xgAMA7tEXtSoftwareAdobe ImageReadyqe<[IDATx]|{:A *6PT"bADPE:{ wwI`s;7o`+Fi>qwv ;B@@@@@ZA-8YˬY ïYWZ]aW!bc!#~coоSTd"Bm%^}M:gQ4 Ug#gZ=W eWyV,]d?3a?BK\v׮. ``=R$yc~wǧ7|ń E].]lFMyߺ4Ѥrq<'@[;QDO&B!F iɮfsev2@986/4LLK1V/ndYB米BH&!;B'dY|$ O>9Xf/^`cNkشY"?YŪg^gpjV;o_zvX3g%{:BuBVqy*=ƌ,'6CVa!d١1gEA`YQH!Sd3j7OKP0JLS!Up``L3 =8pp*Y=txRxz֑ F1ց"Hz} P s?j"((MF4aa)V!)jjn85 ~ +ۤN4MQAU|kW&qHjq-+fX )_~C&dbNK`cF xƈfsZmƘ K* =Fw]iS;aU6hk3$iڝ$yKTOrR-s7P'֏~zx^"2a)EK^Qj="B"d8k"1S0R?*.448Ι~()#i2Ԥ%p|sҭF(x(2!UמK$NR$@ J+vy$l9m-NJV8^O(AXxQCN 1aHTer]* 0q7r Sq5FO9d_kZƲ"S&3_g p ֨2h?@:0sL҄:yKQdȆqxsqV% !QOo"Z䢽;N$1"%MPΝ4 .UFb ASnBmhY2};?(ɒN @H|4͎MHPD)TNpR[,h3? Y5[}3-3#[?"L֘I-JʓrRV4Srv5,m!#IR ]IjPcG.͞YIa?i65KsKOK22#h ב%~fFw;m];'[XKX,lR$lSy,p5"MZH̘pې`ZU%Qq--oBfɞANfLU m1ZEd]A74c01& @@@@\1XP34iаFP1s(\)d2ACQ"Sb݊0С$CR80d6ٴo|:~q&F'_.nPJTTC 3U $dU1BVc޵l<sOiF^Z 0*݀X:x`tL,vln`̔ D8/W5$OرȖB&:q%"$K_[T E|?çɹ3}j~L(:z|#w٨__Z$I7GyPY`ը[3/fV&_sS-La~ѽe#(pX[&Oz'QiDi" .B3DQIO'U,/9F&UQ"fZݭ^TQ>Vh:UDI  KD(A7p3 a6tÃ$P H(UQ$IQYXK*:JpƬi82i?ĨO?h$s,?q'V=KS) XX;9855Lb1NW]11W؇O}% UQddzT2.I7#b!Zt14 `ᑤ6B*_+ն/}p#kt7r|8v]?mx}Øo8ע/i?w̾adz Ic*ak{S^Z6vgFtx)N&86mCbl~x[?Wi9zc-\Ӧ޲$0MY" *@D/ -)j"mݽ͟˜{ɒ\xbQSv2AR"L\EQ9VT)C~(@5qlb}[Pf%x*6ܤٰ&6;xށ%K(K"Mdc)v|<0ۺ-V)pn) d`U r65a|*f*єԯk } 7ۺ)E,%+$F[-pō06~fʬY˕&t.;':j/p''lwE #|2L"͒z:*v;)QP:m=N{M./qaڊBsu#f1V8>QTAU^ oЫKb L\/>8ca֔& .f&C@@@@EL -"h)Jo٬#:~ Ͽqlxd,NhwxE$X3q5:hM6n±E&RC,XB5Φ0SX962۫jh }ƽ/Kn,b HZ 0 @MW !ƷPXfcj˜>BiNJDz*me) #-4leD~9H! A}^)ŖiP@YI}'q 4~č[6 0M~eBR6j߀(Q[nʸw2߰~5poy{9&'Om(3wS/s8{?t"# s/?RQa fs9g܌n8Rj2KLWIW2 /.IY-Z'r, ^%RTLfx yJ;Bd4]S Ŷlq5*XZSPk$Ihd,Uizν(B~a!c,uhd#! . NE+mL8׺{}- n=l-;RM)56yI]3*& TWRDmu2mӰSw %'X;{.LjqYд¥T,))px ׯ4ݮcGQXc|\ 7%E?-جaw7aH PV!.v52cF͈z{9bc,7l$%X3g6lzJ]9ͤf\N@$" nihݺMg*(L82t*)T; T02i-DGv6Q l+F-lZqJ ST|Rd' %IP Myvu|PԜNu|+6f>`ל0LA].PЁyNOPR}Z$SHm{ziUkOuA`]%ҽg k&"_ʚUGubY^x- ~A_2ۛ1 5-T8mR *8^0 @IjR/L/͏UpFE^RA0HOIuHJ*9^(2ÇV-2t*0Xf\, DZ#%kJF"G&3"O7ZG޾BuK[Z"t$DȮ6(*5a3 qV#TL^)TT/-%̿z#}v(!Us^ꜝH0{d;>qН;oNL8al>ak5;B m{AymVyĊF{*o)BxhzAОS9Hk@Uu@ޤ퀡vuj(*uwx 2VA⁕3soYx-#|`OyX TQs02)(x"A0WA 8{܂H\+>!qN-;y8YPJWڪM+]?-PeTimƷ!o?c+"OǦ 3y%L]'r8v\3h J+ƮBBc & UYeה Ǵ@.,D3X.p-P(ms0UVʋ=A\@'ߟ:z*{nń #,a4 bPퟚU+gₚ*2ne$T-\_2,ĩH"pzE&*BJˍE&:cIE`0J_{,|3@0w&N7DZ=Jrrh҈2gEJG㪪`Zr^,5I=oTXĊL~GoiJ p*p[12":Ljqը(bo 3k4o+PdYd $,[h^:7t0{3^:^J.xAݓ=*(+6J&l^+(C1&`EXl8z$X Ci)#msXs\NX\%pڌ 0^y*(lp\P= N1f#/m0-Ziq@R((be .A_m\' UAUVER.~RWu*,8`6 fOg.Uz*Fs2' (egpqw ѧsYuoz6?i o$?|dJ相TJRUe1v> K>^q'f{zO^{rk7zp-? ]ooٷ|s?+xe 7zbkw@RU*B*/my*/9tR9)\D.q8o^}UK>}W=Lݟ*13md#f{4W%_ >0F'|gK^UO7/ݡɮZcQ P9+-I E - Bݜ%+|#g.nW9{vM{7n|OCFVn9WFJđ}ぴ[ǬGOBN^ylL?#/ܶݏ7|~pÝjmFT##BGp GDc1k7TO|Q *0gGFIy[E~G 'h -wf͛e 򰂗^H2֘oXn{o>14Ws?'"ּqKvfH\/?E=cv)fMe;>=6͝CH%E vFEɅ[ƌxdoӅKW,n҅kcyV|zi67ۋlJǟLz:ji%x@%ʌ<]@ FTL1G ;Oz7= C×}4i `sLuNUĎ ֘˧@] } Mx 2mk}Əl\v^ϛ<1n<\b.|uBfۑuom&UvFޯ4ťFW{C 7eT.)QVTu':~*BGXW^2LVc#%q =A3֡DRj&2[='9x=/pANl}cS/{RQ"AxϞN 1fxf=۽HY3}`PMv->&q9铝s ۵I5 R㏺a= ^wuۭafmaZípRx`bG~Ɇ 88Y8v&MͲ+ 4EZт<+(*Po FLfq Ak5w0dLMS"zVF1ʋv3$M$;𩯎 skCU$=V*)/ *K2_.s7pמ_²b,{P<};~`7=ĻnU @53ScnX]?w&mih=2a4ѷqPRT0ɊZJi;8qZ͉KT>K Je-0O 8A}= {6:bX|7ny՝]>v leTG_@ѝÒdg" Lb@r<2W{yd˶:oW%` ʈ$&o2&1d i0P]/T'I$DDyoF51o[ Ո]je+J]Ց@ ~}&ys9y y`s28Yʹ#N;澷?Oع /3'둈ooo3䝘HФqGgnmYwyt`^lP5fy>Ƕٳ&0YTHBޣE&ɲl[PJt{ z)$XW*,ނA(>v$'6Nܾl\Ɲ;V߱ch?zƜvqlҠuFR2ImO%^5L5j8x|<6 d;6p4Gh5rªRy-8yAKx:ķ,qzPa)G>iknx[w;};}8 "_ T)ݼ$dR<.mSNy5dAjhX@+a-ݳshYy:G@@*SYڤ2/ҺwhET˼{&wqLY׷_&0uIokecl &{w]W:3'OXF5ՠcNVS;} nMjB 4ҥn4-깤&,;}xOS-O|=9+obhm]2c'Vimzw0ɼOf\_&4o.ÎyOn}w3O۟7̌UJYE89EQNG,s ɢ$(JC{oY7v7U|vv㜞]kjgΓ/tK>oBv:H$!aV>E-)f乇z٧ 2ϖ֛ȫum5֬fXJ lǏ'ԣiPT@(t~Kc:rxe Oޓr\vi@`wk߷ub¿matvcϛ#3U^3A"2>en7ԉٱ&0{UIyWZ۳Zw̲+*5eѣK˷ ȉ,<ά3V?B<7=(8PKXW #`\8LHD%J`LvE**&˲Cqp/g셛&<=,Uf3YS `9*`K}rF>7bq׉Aő=(f[+F2'EK%$(aq$H[L$A Sg,A'*iD0ow!a$aH3YqXL8}ēB7HآpR;Hˑ1zsm&tpsggpFQlaQ&#r:Y=:B*0-&Fʜ!la&\DpNGCZE=X*9:J\`œqf5T//*gqsdl(*p76ƺxɲm;gԯ-F8%dU\Fہ\ i1U&%6tU&\kROdOfe($y<%.2^[¨DE3*;~El+cXB5%2<^aHؘvt՛-"p܅慀p6 K\\#d#' 4&aFed <-/e!d9T5Bȴml@@@@@η{r& gq 䧦Զw>ޝE1 vU?nE @bU #G@@86xTP=\L%YR.};|MyIV[{lظ&30,&6.++[ \w+(dLE]B(JGrR$Q[L`21zM~5 K@Bmݪz1jQ% @Pu\L0}E*)*<E,Y Fe4 J8^6U!*rЧceTy?Z #Ʌ&@ȲrfEa.뻎Ȳ\U4M8N:EQ6 )"dXYJQMӰqpHJd y# %I:I( ^٘Ҍ f悓E8Zp^{.iռAz]cc-<8_RPdi>f2iuFY@e ,DS#\쌏'HEٵkWFFdT'Nx(s0Pj&dg!ڹsg^^^ffްa[p 9Vnn.di^wӦM޽{9R~}SÓ?x $d,ˆNPB^f23ͲP$ezDZT*nApWP}G*pYWÆ ~ֳgO JOOoР IJELJ/ CwvM^Ä _ IO^HM[v>wAzhX~P;^@@Rr꿶},oڡbWߋ<"dWqpʽqϗ\@ bl(z QW TcoiǮ%Bvm5r$l ØLp#ZqqѣG6lZµ0DƮ)BV0vEؤIo>B!0_~lZZZh T̊"(Fu^cPUn_:3ʺW/z.W۔EL1/`㐖l6c@ PPPï"WWHvzqAŪv%/,,u\.eSSSskةoS'-m ՕܒlX?&QuWͮT?KNr"s{[}q$Tx|xX>ӫA̗IpV9){gE2_rd7yF.8['AߖTJdR0} G6sF$˶^l voO`8SCy/~cIOwִv;_~_@%3}?]7(Ti\ADʮBV5Lb(:cǎITNuƒqe-d|x3{fB90a{ A߰oVLҟo뉏~/k=Obk۽4Mm]VthW^rgӓ~7G־BkddphÄ#sQd&$Տt|/YV}S?z"ӨO)ivYrLn_o{Uok?fS6kGguX]"v=_nш!P̠_VƉMcosgo#: zyyCp]KW)"*>h7)ڍ+އLݘ_07b'N-)) (jΝ$SUȷ 8Ndfg%d{MG/ްfӍiYY-prjc9jنoa]7l6.rd2> -{F`50k 6yis,ͱ){lߋn\}M ~4jC&"â:eG0£b0wK9c=S7~:' qI?t*" (A*<ג9GN}ׯz֫,oA oCf9P;@lRԯfBf,ŰYKwa*$d>$a,;ά48X (23HȌ3G)kjf$je`! 8r9222r̘1WTS؛ҘB|fر [Һ`oFFE(@Ų,<( DLW5pӞ=4~ƞ/_R?iBVNF5#0bwnٺ2?4Ѷfª:wO"AXAƣSM΢`_9*4%x\+ߜQm8= f;~$c&GQŠ6y.H޳~柅~5,qyT(P s{sсMዓmo\L-X@1NH Ld?6ǀ`Ԇ_G0@*_cxޗh|'n%mᥜ '{^T!vp;glVءHtm A_h M?gZ&LV$vвc|6aټW-4(%}[Ϭ)<Yl6nefv~߇f~OYp,&|c|2:[Iׁb_#j'A,XtizzVWB @^qFeyd [r͟/-={#`9av޽~_e&kB`]53Y`Ѳ6) k&?EAUʮ_NȒH$i >ĉ| 'J܂~ISϰF`v(9Jp)1'< v%xܥ%rok$WA>qǔ}?kV!'o 陕B{)g>X%z,艜_`K%ZBŷ jܼgdVᵔ5 '%1x Õ>4Ŧ]^oA?K4k~@Hx`z DD?^gi>bg>m̃XM5\38W(Ôdt+ʃ7uAjpǽ+^UU]HAذaC߾}:[neݺuaT \S8zt}"my 6_1cƜ9s6\r%lBpk^^TPiz<pas5۬_>dJ= !_ǐ]wa̙r x ?/PY-dSLiժ!,/+88V3f!'<6ܹ`mx[,ںHPOl[ kҤI!!ToŊ˗/emK.g܌'jc4Eh8Ek.H'0lD^DFǭ Ȏ_Ki<|{NOag0ѹ p" ԎYx3ïK4,R%|r^~Vo֜~!{f֙Kd|[꒎{w%+v}mᶯ=3~*S0&FڡRYoj|)?xa4swClӪ~v1Os+nC* '> {o1Vm[EM3SqFVXjJDOkFԅaǾm9~H-R_y8F{ϯl=JjH]]Q/rss!G2 f=}Fqw:.|? {C0 +ڵkWll$I^vO錏?~x0̄,N[%mtRHyS %|GDIXqlJ L.QuPA9Oݕ-I.tTfnV/TT*>0on>}G2ad}*`5D.Y>ag ;XB ]u3gV}< "a Ij!p~B y1 $gM4iݺY<Ý1taf߹,ٟQw=η5_ RXs1o |K^MLaGM3t3J0WT8.;jAF׮Xfwo]F|ҔI\b\?2[րnM ̱cӥQ {ǀbͮ]s*yAF57WcG3Uix];~bQCI.<nNf7O aW\eYZ0n:uP~yجYy. :7W hL/B=k}qa$m[U4Ml6oL\/Ic.]ԫWҵPAk`tYFߌ@zQ4jE2_L-0f&e1C69iMwPPh_LaqqR? 761G|kǛ͂!Njȇ74ʿ4rOs½`%:>&)~ߝcT!msE[~ͱOJp;WxvxFLe {Qc7UKOõpq傿 4W2,xf@TOPJ@ãG?/߼sf}@© u]ҩ%qzNyFJ.7FeՊ tiԖuN?~~ ?8`yl{Ń]VVTE . sί Q 5 &u:NEXi}29܂C =~qa`*a6+|um60lX*11_UiӦ9rʔ)5{1'lر0ccB ZUXȪYL#dZUIqdO<6Tunz@"BZ펋a96f:9KqkTR|qi&|䊬WEVqRVsN(9SڰCHrLLeoHAƑvotv"Ǥ4 !Q󨜗o'ڠa$XWO &ijzƦ&-pܺ/MH\#3߯[X{<`HHH*˖-3:v 4nNe~Ь ^#Ds *(YqňV.R4 AF <{BגcJ͚5 %K\t)dUӔ'TI %0{ e`"0$H2+1޴XϾwKk@L<6YD1Gi#~5ǔLOlܭuǿ>g_bO2wvO1Lyk u.ף%*l-ڎM;tl}IqαxιcOw9@b׌zg瀉*=84 TVS,yJwUzuGQgz˥ %4TH! tޓw۾p Jw٩<;¹c@ 56DI0htCݪk˘7JOe+w~]+h%a`:a2HgBYOށq=&It+2O"_Rz*FjZO BW̬g?U(#4wޤ!_ʼ]k=g &=z&FCZ*ojJ^$`5o޼SNdMUnݬZjUZUo6Frb| ~-;˔o~wc w/nxkM\<ğO_?55̢Ƕ>ZVt p>d0QZ7.m Ѽfuu[G}{$VuFd^<Zv@+#Z ъj ըJ,5ZFQbM@)-kQX`i5))F ;g~82;(-Fetӆ_B8^hY d>o0u}_Bf͚E Ǥ.1<fCμVbe׋tv+zӋ"RBI.d=pjMw +Pp+ڡpjF]#,o:%BFWgX.]Tgm:?#NB|mxW{>LA.ۏ|s|ж,L6uz+DY:J`߶ԁuwek<ªCEg JHNZμ4gMxv:f1Zv-CϪl]BK^ڦLRD Y` !wKѨEhU~~FfdF pv3ZO//-JU"d %K2?4^U 8aʅMۿp.O͛׼yqYeK`: (gl5~TEkMj৻5hCW **TB !q4T7C "{w<[DZDk`o2^%pWuhzvpkly ^I,kޠQ]'4u'[so^s?gaړ̯/8P@Mg\HibL-8cB5"%$J]N$j\u^57z6p~#J1l)-Ko~EvL_RS1 ܴ٭*Rr GV/~FOF۠UpתtqݰTȮ,nk6)߿"RS#$dp Lhݦ6Ta` W-J)dJn ,P]y8V$ nISNPN!d -@pМ{Q@-|(S&RyR,rB&w΁%i nK ~y2 ͠atG+FS(P@3FCQBWxQ7/05;ѪyzN(P@sfH% ? ߿?p!C o[fjlfnAÎ-NjLZ=W^s;<{a-f+X &!ӧO||$I֭1cm] Q+I4Bf=IH.gErG=v؍/QiQ (PvUh%;2!KIIiذĉ!Z>x`#n]zV˨gҝ.7WdwͰ8_p2(\x^XdI~(`-s?zkI{~uv?~כzĖmo] qd-=$h~罉3֦.e߁=pö̭ fqȱ9k>R (4(d6 IR9䗤s6lXp!Gժi_L-N8PJ4I^X?5OMM}Ǽ^_Ӻ5/x۾^ݞq4=eދ}vX>?\Řc%F]<ŇȆǺ}z޽b?ݚ5k V铳}n"-dgԞ-*O`r>[ԟ~e^zaÆXzbU"kshVviYֺH' J# **a]As|zDpx$u@3+ԛ0. .zy.Z@\ xDC`s!I}$_)<\ IJ}IJJ"AWg̘AyO§O I /0^ 2kؤIz6DQ!]?h'Ryd$'W}.6t<ݮU[7 J+Vk4.'Ǻ}Bb1"+-ݱjR!zwZ񍍇߸!m#K};`g{WD=K}ΥWfd\-”A]8E hUBoą}yd\֞@"kcv,\‡llH̕Kk,ڈwQFOi}h|S. FWZ*u_N0"Qe0 o)_BΉ&XP]WQ~nILjKb]@u̩W\&G  g4CG0dx#1CIIu@<:xvN`fH^xE^:<<8wŇ Ljiyp'2A{|J@Vx:j]5X+n* ?4ou`*|y1سaB/4a|\5IDn$]I^w,x4OuEXI@FZd5ց hг ֌[s t#0ăR~W5g`p8eӏ\9SSk%ӳ1{u=Q `$J*,Vku<;׬\%Ra$.*E[ۥ.:+|LmfE s^C%"uy% EEXAU_tF9-l6pDCGqEN*G} I^"y0TK 3"K lWᲞD::D(^/RX y,^u Іc`y $a /DHތ{P ?ޕ1wkaF4US3h[|d](܋툨`pm >B$wD9 0PkGe'*P(U߃wO00_A/Q@C|4;bh/8<ĦM2토U!YnY V(#.y+BsH_eP)+1BĄ"HL'oU1lԉ$\؋b{ѸA*1d`/:$ +/@DZ4>:?SO~ n:Lrhhte! ,ژDmtȐY ¿ Haѥ1'`)l*4B JV@hcDUW* h'55#Z6Bo@Z,vjTlCh48 k4&.!ؠ_Oa CEdoTCr.lg¦ƮV3Ǒ]Mq&e4՚>U@b,~]Oɱ:o¡L=ц =h`yJ4 a`TsJZ U x|)TXBBD5TR+U, MH ]cG{<@hyQ>O4tM4@ho{'Kt9N؊w 鄳?";cGz2gi(c'V_GW''6د_;s.'}y\vMP1= LZY&.Yl 'hȽXVh5~sP^ qe⬡4,2⬏?x{'2ZZӒ?T|h$Bl6bt7HDrQV5PIm2@májx MkE`6A*ABH1i2DrMH$PoXqߞ,:yEh-R:=ux]kNaA3Q‡lwQ cvڈ!}U!*>#PAw-d GO63q.zM xwr(@dU"*S]VyG{^! zWD1dBƞ[5M4/}{$g4ZF% *ڧӱf%/鴚M-d֋"M3~ j(""R]!9@r왝vlx]Xк`x픏ؿ8sJ}uGwFz}7z{*MK|NN.] !^2 "dm]j\.l-$]$RXF~4etJ]ܡUAš`F[-Cȃ1^-HWs))r[-87R3 bn X{YQhLTW#ᵖ}fGp⢟x>Bei8ⅵ{PkAj"jĶINR#]{eԴsGv 8B024+#G^1uCeЬކ1ihMmX Ѵcevzry;Τ![D5 A.`9OUCd&Mfe9гHCH)z YDZ{saŎW]jcdh RiM[> G("(g,EjE4Eh\D1+ "RPlbD0b#.$ߌBhq V(VO7F&Ψ *=4aOީIz2'5 Ĭk,nc*8:'5~γg<0Z NFDtm"m _iZhack֬ILL,}رcl/icC&S5FicJe!GPVAhuZ4q$o{L*ƙx(\HƜmExr}aJzxk̓5i{9*jIpGEkU&lWaoA/ Z?-2w;dE2O.0Մ/;dy!j /'+)Fj64,%߲*jQ$[L2ItXjRql+MYCMBj覘o4EȍTq':MF~{mw(Z#w`1A<@R o$7w;( Bn:S,j[yraO8)C0 )6:Ez;./g(7HԵӉ7 , ?Wû1[u])[3OrKq% ԁρ5YT|T!؁zMŃ;"Q3&€N(Y|0]@蘦!DJt/>#$:QCwBGsp%14XIK\PIɮxɷ^9ZwcGKIN(J% L+è9XeN2#XA<K0-_Fp0q@LCFRU\}zp7z۩r}Rc"-go(2џ$ʞmn3ld ekUo_|tXq2ެa 9Ox ˋc${2!obsR_F &?1$mEEEC7oUغuf̘|# ͒e`ᲔqY`V(dj5yu iU-Ma)\I朁E{j:(B8ZT+bjEE8[0r>3G"h:}X' ڊX biM*g9B9"~; 4AA>e8'Q$2@XT4DsC1,Dȩ#1BxDa5J5 ".<p FI8MʞC(c OS$|JBMmE T5?'4 Fd0Xae<pC΢Z(t;aHY!aF82CfKJԑy_1rZl yQX~O:t򇇆֮]K 'oYiNvbٕd*F%EŪ`&Ҍ 8B+L.`\gU^o8}jى̋1?shLq6#>oeQA~׿CS=msK풬XF \U] JA&_ /zn |Wb/}i4m~I0Z}ќg7>;gXqmkѕu]1`4:25jT S$+ӭRv.͓)j=GD|SS%"Q9r0ҋXt c)Aaq*AUp 9>5:1*CU+r$hþ?-x5ݫ0ʂ 65t(tQsɢ&ϧGFx()0&НSm+"CK4Yn=ڕAn,d7ǡ`/#N8$مtH?x+a~ : >[+&vƄEņ8=X vb]w| a14X::(BCF="j ]:7 A5p_-4U[V8zšd31b3ʡ tQ5C )G ѩ  ,qyu众' jz\ľ}U ݗpG<\n8lqXK,:B,+CS {.ѧ#C#ˍQ3tA>ʠk"t"Ƕ5#5O"5%rF X,>N>~^։>’MBcVF_mDtfm+&,pzIc\^qřt"X70Pb`56mxҪ7rtٯ[:kIQ?*gbczwJ)G0O.=;/Z/wkY8]uЪ U7ktch- D: l WC6Njшخ ^$φPqNNm҈u0s] O]=m"5< 5o/pjV$N{̞Og2Y zFD)wy|*=yE.jb^LCpki7~uoa71znq.Y-!S`'Iqlt ^p'4ٷtи'RU:xk<[Zݐ롲c_CS8Y:. y@k;M\g|Ƚu90wum <5#;%/#vŕ_ɛ 7=*pˁ$tsJk2v^SוF/x)Βd.f%%N'tvK alխVQg/6롖p}AR9 :rj+jS,ȻP4c1o%JԳ~ɑ  -!24>ϫH 1Qfa2jFo^(!Fd~@H> YݢR& dcם c2m]?W)JYK+լa- s+Ip۱ͅGs|\B+Ua/<#Ưzߕѷ9$Ȩ5CZ^@C;sȪv5gcK,7?:U5g|HoHE!DGLh=i`g^ZzzDwjgFύPw1pMksq֯G3UH#_du޳9tyBa#^dt ݱG^PMPtTY6 QF?ږkoQ#}b2yJW0yHږ;kn]ִܽR[XU-jd@dAZ8Nw,EFtϱXZT$FE gd4Fދ'[Kꪏ'!+FYA 4*{Hoʕ $f/s:KYGR4ܾ3Lzvu٧T\>F<7wUiŴ:߶ 8fNV$A}^ ҥW[txdϘjqg\ ZsҵQ]BvMk}g%W*:ƹC7QϝW]?MX6F'ԫ$y'royw}"kCDm[KaՃG`NjW[m}Ǫpq6 9rhk2e'(LVxUcg fFrS89Ѫ,˹m.Seԓ3ή$y"#)-"d Uv %O®6wER1,+d2!#K_ p[[;S\!n;n!M3:iϙn<3'4.8Rź s9l7<ͪ4sqA^[W0$s9Ofg /?SKH^AVkߵ{sbz+1UGn>)$룖7}+;u}Gvi9$p.G+o>p]rLTQN}wK .6ӵzbjzץëy{2' s]q}̙V؜J]^/j:!}*Vv:1R3>/3!=R[Yt>v &ۜUX8qooS_"Ic#]2Cf؊)SpGoO] ^zw4j׾Y 2@"r>R2Z∱ӽ{Luvм˛6~_ *ISPsB=;_<ܕYB>7}cf5Ov/1袓H:5 rE_r>3ُ>W$SxF 9}t%gzϼJ&K>_;1G9EE-W6@J;*P<)L"%msae& /{_;),'Y1wkљzEV$ QHMMM Xoqay^0'F⽎\O/R<۲MKpԖfhrZ7lXs3L='N# soM-#~GA'I9Zd}B}{zˎP=B^w͓E_]"2ǓpT(I9q{5g]ھ+׆V 4%[(P@=Ċ7kD~Pplg6zc*٢@ (@W`1('gW=>Vx| ZTK^b82SsY?o}*N(ܻb޲6g_dx\ܴ ⦹%{ò1j?Ļ=9bA?ɟjS(P!do߾!C t>F}qOu$OwB>kyO;L{P~u~Q=ypCԦAνaMP[C6c>Nk/fTa!a3}{6ʷ\t5/Eqa2Dϡ0&usl"?-L/YT94$8J)2$(ʪ2)eK ) Jnݺ3faKAev<XzdL]AmvznKFCA>'.֚,۹OmTqJ;VW|=n"$ӺOHHZcbٹ&=6.U5 -Z ?/;hۍU%uŀQ/4y˳wѵӜL9v:jEZuDžhs+-㸜vjż}?hDOҾz%Kw,קOhIEOj=,R4pg7??YH8J UTKLZ^̕/OV6=ǩ ӲOWj;W ˜}Me ͬEL85EM'<hxi T\zNǼ_7x|Z A0 1I"Je#d`%oK5L|/IZ$` Aݖ)1 ]Vfx7 ,j(;MF^&/7T>bR*XL_,&x@hqR_OJU"]0TaN 1Jߓ7is+Z^ПNb1!Wh1U.4~@LqutH>~_-v* Ptg٩!dZ0 8#+WiK;fD"1leY <\͌<&[jFM6OܵzoYǒ{TЁI\^)Er j7gƯ_zAzf=ٶvĖtY0+E2.m,[;; [lu^:!f ջ$WV&G;>~P@˫#ʕ(Y9oM>VԡLm o5e@xL蓎Jd嘜aۻ0v}}gED4eY63|jF*W) C*K"T~D+٨f{1M*MT{d^xoZ/UsLa-+-=er Q˥z嘊,kӼeW7z 8Pה}/L^ [Ŵl]~Yk16:KTСOPjKUV^{Wð;̇!"y0[Ц[QG# 4%= ()t36|=!3ɺt钙Eќ77s8/t!@rOhH\_9zl]TYSֈ=9`:s['/i39!ȇ*HI1c&<}RO[pgTI5 ю.^XlTq~zYS>nBYܠaq#kR?95o?/;}##fC{91cǭGE@|{+~k] Lv`89i1fIN=p*߾x4n^|lMɣ<P&p!Isθz3d{uj1aD0j3ݹ^D-Zߐ^GOހ ;֠7GGV]Ə!!:9ڤ^IROo΀܆čp߉LZ\@h|()$w\OƃsrV#SVV]1efײ]h _Aƿd[C)B2Hj`Ϣ+a'GVV֡C l ))),,ozT|fWH@1- "޻1oAU`K,iժ 4r> Z &!JW^^^V- ٸsȠ^|5^v At!}\?7"== >׽ZC^9-WYy޺3rN%ӘכϮt}er];Qr􇏳޼!BR]L !ZbICƷgca囼.vړ:p"oimj0W b_f_M4) 44\rV^?u WM `/M5"| ;6ntzAAAgΜٱc]~}ݺu)5CC/^  O\ul:ydžMY=I2ut賬KN؇^R H_%4ѠA{QE?`\&_^K1!|kÆ aaaeee%&&V'jMȪ 8UJ!Et:0~Zndl2d oݺ|#߿C׫W`?g?MN`*IL=ƛ;8Y\YŞ}WQ_#I"I $$`2`}7bԯ?>!C~}J)$}mI`e @_IG!(jI7 `ѩ 'Fy, ϟ?K$ۛRJH\=@s֭EEE՛Ț`c VٟQkL_#7g0 0}$8 b-xN&nXmF*MT `Ԯ@ўL,LPBc!FY{[ sXq =l8nGF2۞?FxүXU7?sql¥泫[}-K>vYz0b&oЖRuV]Ӟs>UwL?ل TՊAhԛ@_pҰlͦ&z3Qqb|>`aajM^^^666:!3#峿i[o/̓0\+v&os8%@𥉉 _X`@tHw#`|5a,N o1 ޜkj5ao^ԟ}p]pg-M SW5IݩV/WS7x@u4߼;e\ |6!n%/_]Ijbl&R4"@8JAI &M|JUPy@l!/McpdB:_skiD`O;k)#+(_C5LYjMh}Z=Ù߰8|8h>Q_5'1᪙\)!zA>Z_6H)H%d~_F5  2&FV< EQöJ T?H%$1Hnn Wlueee1Y|"*5m6z T* HT#O(dBNz5Pȡ,RK?b(p\wv}iMש͙ 'y6E8@P͝kOBbG0 ܩf趵M ()9µNpޡ%nؐ4;5cs^-+=E30׃R9IySN5 ?ƾŐimϔ4mM䰑[B,)U9hiao!/,h}@7>Td%D K]һ>reOбyn~6KUwLZs5â1g55. >6te#;}Fv=4q/}u$־޽xk}B0ic&ϸEI{#~Ʈ7 įۨ_Z}DO.\v7n?fV=蟲n]~6ʧ~~inT֪׫O7Sgg7醓N0m '?{K{Um\gH2X:6?J?_}ɒbX&!c`i<=P(D°7/̓o, ϝuԳڢԸVm%[YYe7)>c7{kjaV70rTH(7Z3+U;F.H./Ɠ̚7bpkh.+SWD󆰰קkԱ,Xsv)}bkzzbYW&={EоˮK$cw oYB>B Y&wY &.Nz6[H0m츭\0[s1nU54!ƉS6GD_RB4r ~77gv]*.o7ii ;Q7!^/ޫd%,W^2uj ;jlmzrbzr4jYzo|nmenNx?4/%Ydz~2__X?xwuzuu[ 727f3lHX!#uwNj÷e4v|0:&8H1/$'R !3>T  1{lvx %NqiJ\cK鎼W$G*+xu !0)ylބ<'xl՛3C@'̔>רJ.:kٰ>"u{tlSƒ h:yڡ=w;\cJj:}PmEUmiH`KY+:z΅A"ٞp}6A.;?:D]8Su˓K^"$gY]][V͗N?㧷+& =Oہ 6F۞ ~cya}mp+I㘸qw Ȩk159NesuZ^fw)'sAP6_e9 <#?x)z*oPv >N4[eO%QZBcd0/*sGZ{-2)Q>9&ꬹWZm "q Db#1BeS/eR+1T@,d2a2h؉QBϯree8Jp̂fl]W_U !Ve1 M j(Ad.O&C\,!'Efi$U˨ TԆUsǔ=*`}8W+KLٴe`j-ۻmڔYBhg!^Dh ʲ":Q{K6oI' LXan#[ʩ*ߜī>e86ҳ10YF> ȿ}kWy[ANސ6SʛH-oz۵Qp cװwoQ5C=!ΐH]*G!`Q9T HRtׂN}+2bjkg16_je2:1 &raȖ*G6QnhHW˖*! "yϵt>[¨ߴL[vX1Ӯ[7Yoߗbc p̸I%dd1sv ̠aw:bcT |@Kzb"S] 2i@G(+-Z5K3ɶ=9JBU[JZ iQ[~8nlLJaPFX^:'m9qtb cɅ$wxbO&L۴!4 Ofj0G{1LҔރ"6{ E]()I`cع.Uʸu0,_)on[!b" YӀn.׾WsH>(x>^6px5;o[+#-x+> 晻r5(u:6ɖv ]sӒLheҒR'Ujt$ Q }XSj=lZ.N6S{'ucWr n6[9u\/Y,f9SrˋڻOxVz!.A:Eȴ'@98Isچv:Y+[+n Ͻq.H}xvm{:@z,HDaDNn2NV/2`M,⻸8|XxַH!Nd?_f|rrwB6PЩ/W6tqsnZ:hV^j[cpd=H>T\,Iޭg,YMЊ*53cI Pihw/DP}AuGiMPVf%H2ha;?{;{{;+ y’o@@&M#¬ѻe: WLW|I]?4Efn a:+OL-h:"s]3wg{;ѻL*RPJ&@F,jIU";%X6Za/S3y̢uATN|7uEjT&m`lOYB嫗LT1?^ay&-u=_* nʜЖMU`Ui6F,.dt;V%HmV6 bȟآ*j $j>dgNVᆥϵVٍ2~grovy\f 5_dP1\~#+<^ M5O-ߺ/:c7@vg)VK`5[GdTv\"fU*kXA  h9B&%gA\k_^؋Q'.vF'p19|Yu9684fqtm|; 082` edL~?8ծg'#<}:ou&DU/ʞde'l`6KG0]ĸx&pnL=_oZO I} *( 5^ Sqog&xQ{m !+&;QL9RRZ\&Y({ц֡>T-)ɭ^P!(l~">-iW^ML'1rsߧ2i S܈˭ܩ?X7zej)&ۋBm\&5y;77mjoG> z6k:FQ Ky= KꋨMy! D.f{W$-{,Οzdܡd:j1Is.[t7":V! 5'e7 yˣӢ|S=|sD/o; QԺ!UdOWU_6Qv5$494d>ȣolclTSշŏwIFBznVs1̌^4ۻ0ykΈ:)kplQlGZ|csοt) ey96T [gJPH 1x\t4}zЮ}92!B5o$ȻYgE/Oݼ~وPnҎ1RktIDըsOR~{#rfڥĥ)#qiGlKйgO9\Ԧ[\)lnx۹AX>Y59 Xי y4f#Xaib= IWR­ѕgmZxLё5:[I+:Fd2URC[ow_dt]x{=/ c10.{-N%ɁB<[5c.2uw0prpRP \ubqi+%Ѧs&'yl^ y[`LaZBxPe3oiuE{H e^}8lǓDU}3trhu)Sg?5c'*sɖMmJ#/Lj81`=w6^?HYsc~9;Fu ??r>lDvEIsC5ְQUm;ji{=:q- !~ۄIチ!qVu1Xy\+c4i]-3 ]ե948\ : _z!o]ƜbǪ;yn}K;ۥ/xwtֶ^~C5[-ڕur-3qX;x~>vs4gK4zd|uIZnk)]c!eo_؍B}=V*[m1Nh*3̱gv?[t(:;+T(1}ie-Dp=@6e)&lC24!vkO۔ v_~DWlD,yLK[. |`:ʚ(s& Zo{ot(x)5F-;᚜U(Ʒin]f7W hnኜY۶?œm{+&WNyQ&IvSviYgb-*]를hE!&q~rݺ;{ǞЬ[Cd\G4!b<#Y g{@o #~Q?ɇ=s{Qo }$Ua&"rL!/nt~rOAX{wn{ &2ya:B٠΢ekYXW!jcn.7m{ٚVkGڝ;Si)AXV5uizkl8%2j:DsmҳsIWy$T;7F4h&t˶FZTVZk Zk- .oA.VCoz{^<]l@0ȶC9,nݼ{6 oÐYu1emө]ڵ2_Q%"Nw`IaF,:Y;/UB L_&r)-#R읰TT46_V LOQ[&m]#2 irO get@fg1dӁb&+oe=G[}YZcũ!uۅRkӦSVkb%TDf?bqgJ%qGHTinҢ̲c4> sjU.'.]}T a{FKcmyN*@+ tTQ2bO]Y9)[.!Q'7BLXGShͭͪu똭b>qn-sݾ2 IWc)_P5fKˮOi@R>;R*Svj=tq',)$ K**u>v2iAd֊޴c\ ;*:άݬ)[N4pɦ'27 }w#s{l/r\gl(ýMZ>F)6Abw( 5Q,=|WZa3':?hȢƪ c2Zu.ocZm0hYûi?I/]wNfѴgy߱CJA% LbDJ<ȇ;|+{sy#}WN8QcW.L$o<6bs(#F)/l[d_o[e :Qb06-!/ojLR[-gNl{uxpJX`_A4``dZc47A$Ӫt6GWlD6kAZdؤiDG720w8(ґЪz.ӉkGAVK1Rc9 vpnmxW"j9>o=>GYIm¬m},4j/ N^xPk`s{@+ҩ Z #PIMCVjGx'U E!g9 o`ZPY^u q٤ۈ&1*iSP2 Wwm*5FA_C] o2BwJGNk<ff߄,)))>>>1135^)sk6ԂV[;;@~y|6Өu r*@H#a&LuKR7N~+&.Ƙ@5YK⺏2ZB "I̽`kdjdaYԦ29l]ީ΍1cb"G wQ ʱZ\$@οK9_Nu4+?,Ò H145Дabo ĀFS$omf/,I[8M؂"(M>ج& R }Z$ ܘ/>U7r2YlQjKAaj2ʬ*}O`jFD8eD Nu aHE@:gl* L926 XN[!+h|dk/Vz[Lbah4!4CCC7n#v߆LyYABBu Ăq{Sr@0Fi=s}-(bR|>뮾԰<~XH33`V`t*i+> E˗/9rʕ+999:@d 0) tc-QbD 4h?{PVV6iҤp?->2ø\nHHرckժp%CT_Y$GoV~?kYC*O$LivE 4hvS Y|||tt돕J .J8<`cAp(V4ؖw-!KJJ:tІ  пUl?]z5##Cbfj N0Ps31Ce-st:SF᯦8ӶmO<ϸDVkΒ mp5a[{4wZ2tNaK''gpߞ ]OnvG3=L 4h|,++5>>ү]B?n>u:]~~>uj pj5`ADJ( *:pѣ gX66 YBZ:r]}x7 [k7K88&hc u< 5g7ZLOS%ӠA ?!:))),,\$I**} 33fL<eB.e%gn΋bX c)4`ᤝ@| : AhuWݽ{766>\}!,3K]g{ L9CC:*6puy^Q&t3A 4~lcI&59bk:4ð aڬidooP@UjJP.^͖dX% ½{  8XI=SǐA&֚2L Q81#/wݒni4hРAZ]w]= ~TR/3`{,!Hd$;dfĈD"- k01 ēysl˫KtjAb,߾}ۣGZ J@.7jO |eG6xBW3 oHzOv&7n4hРAO~80Y,__)S<0{{{SSSS*Rra#p9sS㗿Y_rC7n\yy9_3رS7XHoGq=@Q9't~9"{cΠ+=m'[0 4hРAOփ`0\gV~7DflGI0 a NxP5&#GbpB U \mKÿزCllVh{Q[s\Hm۪E&l8bܸS:; ?v@d]dYpM]snݒiРA Ugre T dl6P-@ r# f%R  du@ȀO g4aK}q J d2‚?8ZP8\ RNf ReMÚX Il|`k}JroӠA 4!Ulg1Jip%2P+vu  2&f8I/CQ!iHYHH-r3ġNsx-6:oSq] wҠA ? YK,@5 ?!BH$|>p_c1>4hРA԰0ቍ5mzԥK7֒|) yڇdTLJER.dx3e0?SU 5}t1РA\3YYY͵|뙐uU-0tE/#e4 Lh P(ĩ9ѠApBp:xत$!0Y?eIV`. meABAw@^Uk?WNO(fW$<V!04iРAO 55uƍM~a[ac#+A ij[LBubȽ]vv; v 4h'i111?\^Nh͠ڿp$IP(r FݔS;mL=V VXL&\bo aĠשo01VŊ > pG 4hYQyvQU(0F6aÆ~,C6[`;),;ۋ=osֵ~DԈ%"`B0O$130D!\4J-"-ղEbZ^*@|#JjXdj̆ IʒR5qFI b>ѠA `֊:}2l3ψaVT/~СI&%&&ݔ4!aZ\.>}zJJa柑7D(dFv'ݸ 7ՐZ0~_un?A|a̶3taJ@͍:pb.M5wV;ֺ s}d,ElyҔ^_uWc;1k-Ŋ#ZvȮǁScZ?4hРQ)_tNIJ?paN sU]T=Ő=`2d&KJJkAڟ2RSSnD7oݻS dA&;5{V%uy4jxL~Iˮ ouoOzj6J!O|vznCvx)RNX_{ UMNohQE d 9WF*eJ;^$;Ui^93JT`hk]_v޳v+GmW[z'ܢ~9J3궬e*ƹ{%BOF΢t|z#;KQgB$!(~8b``XTͨgx;U?(TM 0@BCCp/ ١CUԯj?'M6o޼fG7335o|;{U!Ch gvCW F9:UdH5s1JbKFLuĺV˹-AW: Vx|(m\WDjfc4?hNôf&n]x$6!~rl6w⥷o6瞼Wg;|~G mV% _ҳ=p1Cs|F_<_.xu-qK$s ՠe˖5~r'ϊӞ&++ к/2aVYo}'A7n|r0jj ˴1ِ4}ܳe636@_iSl2{!n&pbaTe2"u:\4YXl e<*G!GvDӺ38= ZtlaꃞFpLⴭN'pl#o>< 贼˛stUj" y".n&cZ*p SԚ<)gOx H]px&uXl NJ͛ܿ5z˃"wYۋ$7=_2Lk6p|wn*M,A d  Sc l8VdŪ Aկa9`cIII7s~K`[񴴴 4$7GDWY aPd!JL*AdeӚ7"I]{~m,![W5rɈv)nG 3&0;"D֨,Re9CC%2Z(. {.x_jjj1a ۬5*/.BDyn Ypԥj;BgAq?k\8o┐o7ϡUVsѥٳgԊ9#F gU8s檜]s_й{_&P[eݠdQ ԅoUVq{S7Ư>jannn񱱱ࢺ>w^>}4j̸=z 2N0!== Bt2 9ylyD6r߆|͇C뭻rj%KVnںsx3U#ȫk/]ly>L}S6[t8פo'/ؾli’%cM:N>P>QGv-4aY[5W/\47aձSkt8ST{ vXtٴb~-)'YN4Gmj:TjLض[zAC$Ĵr'.lPսfԺWs=<7HeY'x瞧jG3{M,=uk憷N{^f Zx{zh?~qH@g5[\Zs3rwUZF2iZ+|)zZ4XW<>R)ܤm" ]ҿR]}w^L]@2cڢ~n@r˫fݴ(~e H{`[ӧ!R ' ~5I.>5ޥv ~Q祹Ix  ..Q*ByyVo}5V48fcqjj-CYNrWG/O;6[-@!Kd^(WuwA1wpxqPFapPz>-G7Tɑa^T }18 iκ(w*)<>kE#wECtw;/7w/=)*h_s ݽFQ4n_,I?ү* @JT}y!)HDk6J+kjJ8//5~(IQх;?hWxx t%2%?)톤泞g喪埄Jzŝ;wIBڥ+75C._up@0p:(TR\UiT}Lht՞k4: uuKQ ai?x|GqIEqYp2dE%Ot"ԑ~]5Gţ٭% =f@57&H=^#|fHR{Ĵɴ+%EgAkK5B)wb![;Ojuٓeo`Aau-PEΐΌgr-WKAEݤ;LpeM{;2:=ȵ}iIQHSM?ea9"d57k)u]>U|*#IBdYX4~>:{2e%r _cl}C|@Lw/Lk2x0±woֶw3%SI/yZڷfnK[}j%oXB/H]8RZRdu1d6yi_T(0͍k9-L'p ϷFyfncU`Y@ Loτ<ѧ(:4KgƦ*Ί`w+_-b;W[pNi{z $-/i^ T,2% bb _%r!nP ̟dk8}iɻnjs\^:_\w3RBVr7ܨCijZ:Z%ͩǠHmE#u{Z$Cμ^iN~#oeޟd7J|8lW o e"(2a.` ]sjx`HJ\ljn*x&0>xjG.=:tٱ[N?,}|޽G9s˗Ҟ>}=r9x% נ:~ S30o_?|#Wfdd B%++m1|0Ea HÄP #  6M;q z JTn%*g#avX!_W:T Ay~ O uu4.P{D-ɦ@ DłWw)]bCATTTPQDz!!=&{w{w<K63<3;wyyJ9?:>A;iUYIg-1>-(&Lʐ6 Wf~B*3 D"ZH$[޾Τ  H|V2tXgS{Όe*@<ҶO<@XY,dHO.r623 )a$#\ߙkOeزc]kxsHY٠FR2ɻR'1m9YPDֶ%ιh :׾{ָFUDR,FFuoHܚloLx6Yj9,hDξ| x#vJ [rt:Z0bS)H$wܲUr?oW AwtH4ۙLK1[@ RGd9vzH7ЀZE|&3,i><6X =OF=]AKSn@ԱYλt## 90q6|4˅,-4ݸ&ԯtV~`f#įg;$-&jViHߑ+=!E[Klތ۟u4ZP߻ѷCG@aGM G5oZ-drӜɼNWU)MQ (Lv0cRK:2 FR5ʵy372J P  +/3 *x3$5''lxnfNFK)7Dy9Lkq1@}墊@oӕ@A#JW鵖,)<88n+Ӹ=NNA`Zkju:/]wNn{o3Ř(`x~ i!a"CBM't4P Z"S[%€>M* "'n2.iʥ&eeERBÅRg6} ڶ[ 7[\xF Jf wI|3A-ĆbJT,&蔰utݼ'o?:ŠV:4p VRsz2W7o'k@M^)_"LFs)oe@h CJ/J7Z}0!F8]{&5s(ǵ; "sMJ e_:?yu鈆[/=7z$9F^2c/4ӦM(GvِZofB@_ۆ}$cK蓋XU (Z3j:2?j*CL2΃?;pߙ. dc 9NlQ:r(^,D]ןwcmzxuN=!@#t`CwfhLKb*0P䲀Ȑ)<Kmx+j3C/J- `Uc9ι~3ݙ~ߕ]m`5(V\jɐO 2!+b6&&EæwzЬӖ35mܻw07 J<->I(BK- עE5kֱcT++Zx1 3+̟+?q́})JIq_םG)`ꞂܣV|Zrpp0 [j42u=30Hˁ&Ef4aWujHTJ9&E 0UmL/YzH)s/Mӻٻ/ڱWKj;k,D=_۸rx@hùuj}"#[n~mM j3m5/6ۍW"9o|3*CBHi[}|.ʹFVkWVZ[q\ ,R]!^LA90695Τ\_xur+6<u<b1fts(R@/A,oI~||S 3F% = \z_C}E pv3 3i, (4YϓUz)w~w1hd5RG{T@2J73 `rZjmnWga8 9f"*Z9fd{ɏ,0C(?W&50y+57޺g;FOm+CPPPJJ BBB^zUOF ̮prgP%HICP ; Հ;thd2Me˖C x3̈UZFa%( _n$i?^pv4VX~5wQDBF5*;ma@ d YY•j!CA,fy3ojZ1 +)G8l>0lhl0eZ߫ת|[zbԚ3i^[qj$˯pqŸi[Ri7 #L[)M2|W>&?" mj0A+2H%S/e];l/b^ YĊ}Bۺ<4.*P.0Fe:>mTUi.'Ɩ {ϻ\ aZ*5A%SO$c"UM"ecJM;Muٮ&#Y:PP%/ze:seқ2b/m1bSe晾\Ѿ~ij ހ@bs/BUjroSTG3!=u]`"U,ju%m]bQHa &V?Qz!!H%oXiO)cU:Gɒwj^ߴDzY_si͖ݴ=~ZM ߚKAA `K)X%- PS˃3 e%}%宓{w:YR5O6}r ///O>^4{vԿޝу;vX|9+O>}DEEļL-fm7/:ދ =f"Z,#ܾےA9NEC'\){}d sGOY_jjmG|;J4&f>a o\}Bz79#dlB5=$@TP{r+y?IgEiPgKRUd0j }M||3SL=h_hb2'7.ӎ\syX!<>^mӵvfPu8H ~6M@<~{g}o14j89h"5dP گVL m=X6b'fVDJVY)) "Im@ \ۑ㩪 EBSQ(6oNu-kM" 3}h.ui%8w-2T?2iPܝSEEεIn3PJ?"d&I|+*E򙑮~tBsu铁B#͠Đw%FshPu]Ԟ,e4H.4Any\XNbO KȖ{kꈲK0hD15YGa.$Gy/ ׎zYjtkHc ؒczM 2#$ֱjt\WV|n7pWՠ."Hee#LHjE*cm/bSCL+4F"u N5`A&ʒ"4bF%6fyH dm%9B]R]QipH`Odɣ&B3AT,(V`85c%IBR C,+ R5FsR=_ YRǭ&kQ#+7$?߇+rA(StT`i@(f@EAԫ(A8"4_M2V"ePQSS% @l7EhJK [1UBYY ZYZcG@ KĂYѣb_j-Jh{V' H@Xjj #ZT*jd%ԥrj8ur JrB+L^cC) d*J[CWd+6 Bel?J'13)= fhP:, 1Mceٕ+_w_bn4 ӌ@V)ѝǠ3$,!R͜7<)Cod V wd"FˊU$]SFuzI6-ʻOY-N4p.eZUq/Jov h⻰?R,)Jp" 6w[z>'IR68p TOxjeFAjS)2,dccwvT/5;b&_t4'͌Ά:F;TQR3_Mm1aѦfj3JʱTLihWcQ XRաB,V*p[UU կMLPHP !Z CS("I"Ynڰ9rʰFpU[KFeG @iX-{h$ݘcF8",Q7X~ƌͽ28:j J ]:KҬr NJ99Q%f?`b-Dq[ C[3g֋%])ڶchjiPrM 8taW)g$Aykviu<lơޕ`i*A#f@ Qm5s[ P ߊ٪[9\BʩaGdaTZOiʓSQo \N+JL}κF@^fu.~Q!wb2F]- ڨMRĥ _?WϣoڵD,qS״m$gY=Y{O E^^ Y}K (]?˹awE^QKVU"ndf+.\5a%!&ĢCenFI6*N-;<4:oҡ}k}ٻm /\*q'{:Z@TjO^'rrtcH^_I݁'o,>֤I'KW<`-ꌿwkSi#܈y_V 8^?PU||'+\7d^~&P P -dUdVҪs2PMc}yݴEw?$i8£Ծ[qguF˘37:ؗ` W t>Geڻh7[ϧ5DڋДFbջPGa;IwU>@brnk9Qݛzm *pk t fepP{7YZ{~'TVi^eT|8E UMAmAVA.lB[35Ay$>qKe9Z;&4:py1a" XDEo>m7GˮiQ4zc{_c,D`R-TCX:w#R>?,3x%z!yY' 0"V&6գZ,0-,_pvR^퍫k՚V,1 D2y=zLБ|HL5m>w0P<e ל+͍͜8`f(V&y.yB.C|h|d|ZAv+gs@kD |kK]n ^m~1Ă_z!j }Jw'k@гD5#EJ^b񜩃|-*ΛF=ZV,3cYFڶKew.֊z@C/{iCײ8L6|D Y8#gEijjB?Tۣϫyj>ǗED_:i¶ ˆ^qj}y0!DЉz@IjA[Ia6čFTZyy rn&ASBlct "<72ݲ2 I;B߭0(h!5;DFj̩kҡP5=!KpuxIIv zyVL>,q0N OYԝ ϲyNeaU έ8(R9: ",E\b8B,60::; QLII@0hd `C1Ha^@qLOc$Ӛ}0ftc!hUM/NEgia]\RY7:HRղQ\~EKD(B!1 q9_-qd GFO& USI3 F*͠UpJibz0ɛRӫuPrG5JB70.@QܷcqȾ@&} Tz#VS?^ncXCMU[tDp uh9ӭPd,8y;{P<tϗF 0A/z-xo)U>p|yTJP+QB9/}[_Jкzu2􄶋j1y;*אsnfig?-V\YRjϮCVc!&Ds:u+:Үi߬+;s B9P(W5` V($HrC-@Պbr_"ĪOF5YFhT( 0MPoy_t;CYWܩ?ns{ l.[.Ů~vIR2c}$-Scdhؒ6G0]_m_KH;Lbܹ#93Vza˒1ŏ, [&!5%(rsw+p6sÛܟ*__ERln-TgҎMj~;.?)%( ) ;eB%TY33fyHUfB>՚231B]YC5_MFi2W/^wM5!0T+ UN ?^"{g}?sP6/zU!/5-̀V͟*awN>6^ObGu=F-iTWnԝwFcߔ6grNxc[d S83VW FGs֞?Z|dgΕ݆$#1KDYC5 YNX#- Fi5௙],lX*Sz X@Hkz߭2T:`L 1΀ZzY3dO](|DzGWUԼ̭3/t0#AwzyP@%)>NM;˳5֟/}5)X^'Fjo~䌖3vǗ1gO|mزƖE SG}uIZ)fMf(NˍZgA|uns^uMF#N\F]4u) SwM\9ɺ"fW)!s@/޽ K"T׸=f:x60͎S=ɏG̚މ'f} uΝթ UJ aûx lZ;Ԅ̚ؿ~v7gOmЯOkWͶE' Ŏ'ԑh0;`ܐt֥ UA\uڼ+uږgei4$^f9rbߺ\@e_ _^mJd _ݎ+{G+13Z|F,E}8Oo8 `k{k­ykY *X] 8" z!ɊP#?1ftKaZJll0!N Hf<;6KG= [+cݱCC;[?ѻ}_F>ZpqY Z˺u1ӥfqMGߨ{+cn^ބ^Z8l(B9q#[(zstٶZS FB>H=yK[,J,|K%:M%6kc6Q99.(2,,dg9wܷ};Zؑn~v:d[HDL8 IlB>s8xs\z?fSpwv>9na.dDzbrpɍkw2AVtb))@pl7/yb;s+ڵLh!Ǟ3}جyrDc<^;&`aHjmDݬڝ"އSWX]"Rtϊ."B\}񠫸^ջC;T(Jە^]3򭃸pF Rul¢F@VCUFZhr"SԫZ]5Bߒ.YnMy4= {^Sg{KF^xQZy͙{qexG21q+>38 o+>$3Ԑ=ovb{`f_Y}53wx12uv̗3K1Jcv8b~-1hpq i̥qPvQ<)4չb;{|5 jAX>ct"b]~gE`^751oy mnXbӬ_{,Yq9VލپN6O81%Ck|4dz^os={50;Ƕ+oXW==q6|Q1Ƭ?b5Zi}j'o6_ssʮ'7˜n6Uo+;0ޚn{z:NQ״'_hz`SڂJ9*uS|z{(݊M=,siA !dfE#Nvn#tޔ.zl# Qmb 1]<4556$xkjl* YC(32n,5aT`룗 \NjWh\ XԠs1E~\]%uJ$EX7I1rIJfʯ֔e-:XCVyު~&5:Fɭk/r%&:w.0嗇ѧ(CAQ"A /5\=óF 9/7#%e=Qы*/~O9"kzoلV GBaB>V)}iAօBcIplLI* *ۡɇ%st~ƶl s~'HRwoM($٩5WK~ݽ;vQgj=l=ѰGk 臀RjttI93#BKz8v}{}:uV"RO3m0#N(1Ҋ Qr(˻;7X&pʢ6}ZX^xw'8&ܯrT*[k2G22ޢiG~n̜W[^ zUt~Q~$dvBV^< QT*UiiiFFNQochsrb(>"t.12KR#f~UQ_}FҲ^on{9vL ZyA\ #u?ΦM&p|RaM Bh_HFizcZFݱopbWi |n_g3Ɋ|$̄4Y1/`R*;^R EL`|(!ع!JO 4$Tb6Ow?eӷئ|4A ~_2pU#=#LRAʺ̺s8q8>RGAɘʊ_:4Պ pP-;ysK(~FĹCO3SգҨ͡T@JkQ @&9Ii8~!Uαb|QߩGپGWC_fR3A[.] K[zۡmg m}u4)\uzWGl!nwg;&j8OɐcAG(?WK -VWo"惐BѱEQ.Kad@aN!L`Ȼ(nd?Hc`I"B uˈcn s[:uq'f`BA"wvPm3 ۴5=k>޷Z[e<.V&M}xt kF_nyMɭoX_8%mAiؘc/4h9Go|Vf׊:OIPV_<ޣSw+`vZ;̲s81Qʅ׾}16^ؗg,xh<,p]3zX } ^テ)i>`9v7cƜW_H)K shMػNAy`FyMyoߒYO<.5)e=f47HgbYOUS5ݨ@7TKUM@}(,,dԯjOlii/d,ݷ]/q~>\52>/ ͊ =%mыC׿jۄ"\!%|g8鈮/|v{ YoWl-Cc]úH U@7~olۣkF {v~}/̙a9gp44:Jt~WGteܴ{ƲqYE0#MM~S佪u2hWBGoKBhδvOP]ԑ8>Ϯ:13<6M,bBVH~P{lD]xﶍ J5sAةK \O-N1Mt1 ?؅^B [4H2g+w]Z0@uL^m|e7{r[eO]OSul$ClS]/|7u l"lOn闍f w3[^-(N;{LT~F߽|G>c<]1n27 ?? Y4c_Q5b Q9'"mNv H 3o9Csm<?mil<,$Jzd߭zߺiszڔ[L ~>$Af` heƩ =f `~liƮa'/NfV6u6^! ܹ+Ζ)nڇߠ<`D$[ˠxҶ: {;ҍz"?*-ʹb+CzLH:6i]{38n=+u% =PkW#wrr[u뇏]R6[-t\ޒ29 ?-D:uo2J1f:~/@ _0`ˮ`rsn[H oZۿyf0uA /z,푏Zo;D<2iW46->NAl=ֽ̐q1C6_}R_RFm2i16ќu @uÑ/L57:QgҤIfY,)T*\./**͍|3՗yRF~,Rʋ/^~KJJ222Ҩ={DT5e,PV_'/^hZNmAVkfakw}RqC1U>wcCɖRNLZ#Ѩy (CzJI%oim>YBköώVz5xsE埛9t޽%]-~IԑdOǬIj?tyB絮=zpus;r6ͺw)nHK;^+.ZR)#fVbehfkhD} ZfQY]tgݙ5pBcM"AջYƼF'tE'L*6y4\]Fx6s?wp|;-н3;YOԩ3&zƫFRQ % ^=S&9׃Ft-e.pYЯ4%fQ nu|.{mzI yaAIqI/ ,6xʏT>dTxefԎ3Hڨ-0jR1if|λ/=N,blW^ x۷o)NuJ+ JRRW-d6m:xW(L֩S'Ehbc?nشÇdvajբϯS# &к$aobգ~q 3#qpI# ^  ٪Ubcc__^Ngnٲ$fNbJ<=cƌ,X F {#9)Ezs/:2RڳsN#\~' ]|{#]tJpFv([ߦ{e_jթ w|W; ?B*>xT MJ0M%b ZVDӲؑ*Жg .&Joڭ%X=&R;$XYڝ+mC[|c» H qE";071͚~[VSbG\β'}y{>s>͂__Ŷf2KĒ N5bWj +*(`MZrNDzBDSf5 Zj֩$ɨ՗Rc+nw:#?+JJJ̇v О]RhhLٲbʘvYf]X6C98Iv6LzE ]l,6+ܳ-XfFr#eo*4c SP9KMP\Tcy̚J 5tl[<>r즰nuUrF^/mYř\{PًhEy8_;bY14\P#FbuF۵kW޽kԨq5ClTJ\QI6wgo8~V͚$xCdr2r]"/1_X  E7kvW 鍨ղ#[zTB6fNG76?q?UPRpQŋ=!yy}*4mukr kj'{;{k hNVrq6qLmpy+wE; [q 5Fh4:ӷN]C)-=Pxydx~zx?ڭ4j,;- -YLta,,=:u.Kvf]o E9zzkĔĔqVIv VG %ԭ.W.\#Rn^phC< ]]1@I-F]^J%;p~ ݂XO#' ¿Zta7*H/CW *^\*6ko}E?!#in|-#!;u]`149׀?A.+b?Wߨ_Ym {' focz۶|~m_L~*8VAvߝsqw|F2Sp4zt>T{/Z/׾t! gul ԅg+uN5 ba}dPOԍxݍt? $dNc0dES+&xǬ}Iߔ:L:Sp~*gTsWr6M}=yC@1 *9?j?LTp{8=B95{еFN^Z;7g:Q^/?:5krXBO$d2W;;."5*z=k(Y4czڞp2c͠-*&e܈$H,Z)vl^xa"gq>p= r8f>|qBS}1浇xt{4xsO'NO("[~Ij?oweyF|r(8Mӈ:D8Vu<7 S`Yo4pO̞ψlCOQ Ġ]+A>Fuht-s&O\P7.!JA>N4{ۤ 2lݮAgFm/r)a-ǖh<`jJFNȴi ~6ݾ۶`^l}fل͆̽i}ẢU=vPQߍi+߾;wg= / N W+#b$ES4KR2to3O0 :mk˹͟h K3ܚE ˗6o [?f*0/xM3gZ ~,MoxJ]9̱=3[7/ZGo[i.g!K~no6qhsVpC;tnpV-ޯl٢ߏfU3>;x=GܥՄڋܵ~y8;֢C-o>B [-kwbe- +.;:;yhjq̺cǽB -5\ h=bX=|/}5syaG9 W#c @b "Vǚl\0y國3 7V-vsؿǓcu1vQNQOfĀ$w[nC6NBf+VBdtaie!!n$% 9ٷęÖ{05tI)'5Z1}Ho|Up۫rXG{<8zft`sB`ge'慪(D8{ T,~9b&3-WȌ%` T0t( d}<.q"p RC#iY+K1u2Kץ]>%<1~r]j{^ 7돊a:<' O:ޡVFU`j)&^]oz?v~ d@yb;$M׎Y/ۏI*u6B@4yb-a#y5zL˸HO`EaG)Fiז$m9PlG8{l?ĨR?OvQ_Wkסmݔs?n;'~|O.3CN^~e Rv{ǦRn-\8g۰qqt@^jڴv͌dn6Hl1 ~Me%HbmzG_w+qRݮӾZcv)]{M!ז-ViмᡍFEHp!m:iߺ۩87/{efm[kn> 0!tkCJN&ᶔR"RL.IJtz_ǰe#/_I}G~x22' CcSa BBBHːA}w9`4Zl=FnICJ^UDq|N v`7H|7wa\]qN:vfNZ-H ug;H+xQrd OR!#їo\9?rBT*-uФFxց=!{ 3cSC]*Շ4yh YEF%2)16B?:Xԛwu7DEZe[*HKO 8z !Th@M+Bb=vgO6e$8 }."}^)p*1#!C YJJJ\\}3o^Ρs[V@NˆÉ{E[ H!o%sS3T $ij2cYbbby8mQ$%ꗀP囨Ss;ux[,i. W2TY\Q(] ډ3e qKd<;}t''$kѤ`+%HPÍѕVHWt4Asa<t€)Qڄ6fw>3oaiMwM@#>pFLL #ؽǎ&aÊ鰰0lfOGlǫ5ߺu\U3 RP/'쨢)R.'^ڸj,gQA~ ]HA%?dr{_}6ЩhG}*CP3 ٫=HehF)E#w5+K<1 8zژM_*&Won1Z[dXDwZ/CX Wrr2$-Ͱ9ŌOG;vk|x֎F\.oѢȑ#k 8t͑rX|<7zCn.q  ,49(y8B};v(7-:NP>DM\ɀQ+2heA3\mR?cM7Y~RuhkժU$RRRlVxyaы~ۋ1wAZ2wo`'۲e ӦMsr4_Xv_u9n_m>pQ#y-ڽP!(dA{Re8_Dq,jbȣ&FCȦZ' {uD˳ Ez| ⿇]O=^Y k'ng̤dxy&B&E\Kks۶mݻw@eoYM[ެ[]մW6_mе|yy(d4rDw "8=rw@uu>Rct/Ե P%,ˑ܀ؒl5+>`vtksM=^c V/V9Ddvnwܝ2:sQz ÐrZ @i/ݭFJZUM+2s 2JiF>F%WQQxiHZSe9Aɢ>;f a[ gnݡ&޼nvqFJm0x'hY.I|'M! z`189N0 *yЭh 뾳B&A\ȔC(PƕѩT9n(Q?rա r3Ъ눔!hx+TUF.gdmjsw"ИL&)Lh&lY1EϐE$'2MRhJZ\RkxyFȤنǰ .h~;!S3hI "a4u R/ MT=#qbbdޔҁ7&')m"!!hk2FF0 "li:!^ Ƭ}غRO"FY)XCO>˒?ip^NRnzKjWFc+Z 58{K!bT`["V1iJ<r0#e2 zk#CEN$cFr!iF'K f`8RoJ8童ueF] +Pb[2!jFo$߲ZV^H~ £nVgmt+J+=,dMI_I^.'hWF T=MPZ@Jg&Bk*]@aSGe6#(s@?C4t bPSYQL+ЮR0"xʢWϬœEFFJ~&MSgb!3LrEFZ77'a~W]vq1omm 82 $,T#( 5[l6F<=cƌ aֵFzoOí+j7lUsA5;+Vj89x><8B ,>>>::{XZZZ\\\RR;\cKkdݻw_xˣmDNM:Q$q3wm /;|ѻopçhTb vUVIodiuHu%+P^3'N^!O$IrWTTDB@!6o}ỽ7W9 B,k[v-z(:ǒ7n|\d%n{43n tp۬>;v|1+piUI͂4>-)ݩ[)_K\MCi<-a/>}ufrr2 Ϗ~5?8׎W-MLLVꏏOKKJZfM44q؟x<]%<}*7k[Ϭ;رg >5}_WYdɖ-[iKG~8'=}ܰ/R)>1!wwFu 0dw†3͘˩ۦG|wyܕ7x8u<[}ȰY 3m{igi^f&T m=}- 9VqujY՚UNU9ХJ@@+ZХmy4iz4 9WgmI*AMݟ508JP_cS˗ZLٕZdxk@qVӋ?$0(J 6X9S7Ɖ[ E: 6j pN:߿K.~!c2h^:dm 6~2 l|^$)JZ |:>IFH &ގL&'nM J%ミQz_θl6M^^7L/$g|xxx/ '?dΕKTeO3uSNEo߳baTS61(vAe![._qfQ 4 tg_@mzhڲݤcq^6ʹ{7 ܢ)}']SN/J > OMr0N.jާEȥܖB ;K g5k3|q(YN?F=G,rd/ݿ@N =hĜ4ږ*gUb,?Y[Nf^2ʐ`\HOoRmqבkedaɽ+%-~8?V|ռwS4u_Gly6&r.truϯ,OOȍiYV`cVLă܏];9Wr̀O7^asBpӨa/:Qay̨NA?]SkK#&609tѦ?˻fg2yƃկ_=Qp~緽lс̼7{/}kektzfuQ::glgO_}9FqÆ xY|}}D%X+|&g&{%+ Q1 C!L&#<)I!0J:^d1#Wc r%*4aXՃ}c%wW7Gໄ+kSiگ|hɶl>&]۸Ef1UmjV*~;SLXW{J&w`yW`vjݢ[WJImwGWvx!|bl7fkӳkK-WRv;MgՐO6JJ! x1lZUfLThWQEY3{BGϥ|'4f\soUrG;gUa,ERz&9y͇37sX'au馐jT;iwetgpt٭[7N=^Y!::::...&&&66YRRh/@Ȭ{/9~}P}҈2,2c!Q@I%Xe۴ұ=V7\fjBs ktϽI 85fDXH0"TkĚNZM.~cơŃ|9<ґ;W~z|Ow$f^@\AfKĆ" VV6Wfur?s̱Ϸ53⎉_Mf:.Ғ}F.rSne:x@yV&-HEqxEk'8aON0J)sw qU ѡPtؔk.JoQyUROytaz϶@ˉ&|l ėW!Fa!Cu~bW%G Uzk?qUjڿfh7Lȝ#B"锃)N-ZyY5/! gVO +N:vd_NfpY>R&=e3rDLF\4 ը=)Zd{c-!?^^ؽotH'Ǵ)MㄳۧOgm'zwKZ5=ʪt^{fqU3FyQJ(ʎrm:Yc_Y.~"W{y<7V$cQOndL(LM| Cv͂TgL2>'yӼy5kP(XCQ9cyڭlGLZm!BzsKQR[`,ՐhZHFHBfpJ Mļ,G=Y=̦>3)NAؑaJc־ФoJ?tU@cpo>Ujua;P!as:,^3qťu[ݓنa3~_8IQ.hס}[i2BoײշNgӉ.p&75l:KB_45w Pnb =?qD݊'>nFdeG>?Pzԩ;3vNΟܤoòBUY3weO?jt &/}}ZTʬľ9aP.Cڵ8zt쇗.Wf͚-[ܰa  ; ɬqr kfEARR!c͂%\X- eVs)Xk?ϝh"If拉;v kTd)uQ?zNw*g"ɺm !_+`eNq/6Td(NPxwk Pёv*Rؐ5-c$?oT~1W:w}7Q+, HYc=%/􂂂|=IeȠJxMsh4nr9x|7wa\]|䩳iWovZՖU@FGҌ+uX5N|6!u_ 4":RRB+|ړ2>vB&OtR @)dRQit^S:68eߘO ^a($gONT"dV!+ Bf2X%Bx;uꔝh|||Ug*czRn0xsr9t{ 2bNJJJIIf"...,,߅0h ZkK. sFC>hWA$a$^!m]Yy@4=I%FS,$-H`-R& ELF)T**Vt!iR&gh^= !0 T#{ԪcV YV'l 2a(c2K%64V$!HB2H iltXf$$jK'1JiD!M#列T Wև[lpPd%dJi&vEXh{ߐlLjR,H31ʳ:SY$dVO$ͲBROIYċkdY 6VN@yZk" dPY[ŘK tBBy.9u;`d2}sXyh4i31rHޠjI?BW z!GSXfʑG`DE,/<2 |!{f`(߀jJ! Lld7MC.YALV???qqq3x<*,UǙfiX{X@&:`2`җuzфFxB+łufZZVcbxyeͷn޹sիwڕn2)E,GuS$"4e۷GGG7?66OW<ɰ]:z؈Q}:th޽G}IX:8860"3%nkqxѐx1;X,!!Yd3SRR"##ome /;sܽUzk2lق lڴi>>>2L)^q((1J6 Y C*d B@󝜜o4=ъks۶mݻw  q #۬Hǧ\|F 4W N1&8W1q Nx{(kWg8^`9cB&p*lq?:mWȲBjjoٵtLŸ7lL&SjXKZUBm P Σei[ OV)E'6'd~XUL8j{wݎsoі䜽ph,oZLFẖGO+WZ1 Y!(Uv g"rp;cˑ!!8U!XQ#մNӘ }y5]vuW5QZt:xb*dCl k @6FFɐjː!SZCk<4al!lݺ[X6xO q2e*a i U*Ef{F͈{121%$Zj6G;-@ ڰS'iZ GBSq;=F&B)} [/xBE)ZKI;1@t/0@~c=Θ dR Aɐ RTpBvK8MpBv?H+EN@@(M@@221!N' @YփW^yELydppZF6fqSńBCk -+_|HH9dok׆~<~!{pS]|6 ٘Ѡ=`?pIC~j{%'%1 h5ngJC8SeO_\i`Z%JرҥKOJ'{(2"dyI2\.w ;C&RaaagϞMOO7 *T(쟑#u^1oإLpeHGt9Vqpi/ڷoO4[d.-A3U5kկ8.$$Yf:thҤIٲeu:]Cv𴏎*δ а16P8qޣow=vl?`(B+ "Y0F5.i ð,R8 ^!ǡbOh4$az^AQk5fd"fY^ hPMmY΄GGAY!(@3z͞=3siР]2π'C۩((B}*w%iD&"1BAhJemu5ZFV^UM{?{ey9dȐ^yD*ܧpkA EDD (<|!!C\17Fɐў'e#zhz`wjU ߧ\> LhXfsnnnTTTkOWI7D4@T1T ́y1`Ԕ}4hfd|D잝̫ᢺ"CѵƆ+q%FOta|jW)uPJ 7WSLA:Í7P.К2(A*F ,999))iܸq<ƌs˗\һw0o޼Fo9z(hBvNaq_޻۰i4wW3'ʬ 2H)[ĀblX¼ t:%'ND+ϐ#H @qmQQQiii)))Js8vVВѣG_x1>>@??>#G@ !+I.EGyشiӈoaB7- d~֯_?oO2x*?1T U&L"I) DS>bi$)1ܚCBU-.wqG &\~O>l0 Rem 'Ptx@e|TMBuW';Re@F˟"aQ"N|?C$#fx?~<<qCQ1.슐He߫ԓ2fUB (M@ 7+01F꣈Iyz8?u%7)p:?2T)vPHb 'qY1|r)M'I*WW2nܸSe J(!-.' 1cF1ekXk+֛qE|W,&&}Tʡ N^=ưyW죯7\AKwcǎJ߿~hp쀒{'(fJM"` ;r1<6e=!0T?lt(ncH1RqN p9%'~Ο?ѣʁP2t˃ "9#$1f}UΫW/裏y >P6VFEE9NL6J`>ܲWK2qgrٲe ,PNN3.Sy]c^*F1W!czjgAPpK%LeH$)^Deɕ8~x;vL& X7Zq@6F([Ɯ?U3~i;A1ɓX*ʾM0|lɒ%p49B*qyd}lcxPU& .OAK.O ecH֙|bE+'#Z֫W/~i^"BL5VT^n +QQWX]0m4dBp WcĉT6C111J';~84\ d@4VΘ1{B$UQ\18Ԓl4V* "6V|>ڞS,[ $49Bx#ldvG d#~dpLx5V*G𐤔PXLik$#J%>.S6VU9cNiӦۗKw7Vm@' P)ebcQ6V*lUI2K$.4߰Hy`"d~L4\Z22=deʍ/d 'O$Ne (IG9+ɦMGGG+NdPx5 3i$JeS}r% U2I%>.8$H_XyLc  ǔ#+Csۉ{"VXAc0!J$`cſ+.$~H%Ԓ8qrg{6V/ɦON={; ((]a5V( GLAO2(i,1e,駟F[@Ȁq s;ـ(O%N)[`Ǐ{UHM8wT(/\r%*DȠ d@'Yqn˸oU%l3gB:*6XYǠ d@QQQ$(p8|Jt٧CF 9߾}{")=܉ZjȋBCCšE.dFGG!)bgo>:ԫ bbРAXJA5veC<PqXhN%*J2f-HLhS??"ɿZ~zN!C C_H.i'dyVޒsOs[DdO?ZB/t/y{]~m*?$n.,S.!S>yħ َ;͛ecs (G7n\@.cǎ-M3լY0Bڤ'o#B;eI3aTކG,dYdoF=Ⲳڵk5#CIR9;qw?iB jN~GTyjZ[*tK4xT\t+Ə%:.vW V\9f)Rd @{ݮZ=ה>x~eqB=;bgU㤇]9UFvDV%dviӐQk\S+"C\Q&c%㰦TOp2 *J'ӬGe˫#)Q ̐jN% 2˒ 2TdȨ['KIMKb-/ ~DJtGeD2J3.,P!dʂ1"C'd*"̐oeYg(J&ChN%({[s@:Wj}D>} t2aVP&oOvs øyޥ3aJ)+'6^}ze[s@Qj ׯl,eG1e'v?.8==ɼ9sG[EܚԓOy{5YIJ߿? d@ 3g?}{Kį ]zcbbtd/4Y@)?f̘d}wQe!JLE_lY {ܮGDDDEE%+Wef~e1`5jʘ2Ąfrȑʸ\"B3"O>]zP'#'d}*/=FdQ(P2ו-[]2ȸfdP\.IpDzhI d@ɫ(cwANDGG\̝̫o-&1`pԨQ<_LXٯ_ի%6 l !JXE a$I駟rlj$uz:VW`wSիLBZVl.QQQpcá d@ $IɊyi6mNlcb(ԓ|Қ޽{?1dŶSy8?!J (q,N1+IV|ⲲRiWp  )իlxŰ>U@?sc ('G^bIp'Æ˻icp7N d}WXcɊUåWce5Rqy@2 ( ueD1oXҢl wYx5\<KJy1(PC3qpSO_1ՏI-R9 1ՅG*S~}eeʕ?b'S}JPL5d%K|GCc_Z1h EX y>jb$Il<9Ç?v'S}*od%NQy{ !Jgh III8:#'6lˏ241C ZSL <$4V lD,]4 e<5 d@)t2L4ԘGdrܥr~-4V}^ ³e˖7|>r2gї}7~P\Jh@ȀR[]VV:'Nx5e(. C>WbfĸRZ&,Muݻ{^ȟý9RFVBv!Jgh&qCS*[paÊ\`b R޴rp XeJVk4qoJ-[h=Oycׄ yvGh@ȀdITE*+<1l$ۆ7l "pI\N:oW Hs:4V d@.{9 hWLףЬCW8Ο#*G+[&FtGբcnܸ+UʾJ>/1FT<6BЬ.+{΢(IRe EQUYccY֩SzHyp + ڵk{ptcpbjժ$1F?.IJ(Seׯ_GqIwޑI H,KLL H^[" )BRe?QlA6?B#H:!@Ȁd -C믑%&&d1SVhSxРAf)SATĘ27kb.IRvcƌeT bvTƨĘf([*! dI+F~%BAqsܸqHRRRҔ7`Drrrp$0ee:1xKIMt:ChIZ;wnӦMz/TJ*^mĘAJ.*DgnLGn5sĉؙ#^^!n@r|Iu1b,Hvտ/u…+V,_ֿ0\Q^spxM6! @G<S,[9$b#F(},a^*e'(R0x 2!zV2ѣG(ߟHGFPՌV9נW@Ȁ'7:{ʐ{@)Փ?Gˉ|R=e<"I"N;2b Y3ܣ"BUqUqB+be8Y- BjfT^J gPB+cPwʎ{q!"^ɬݮ&V`|(@QN!!@@22 !!@@22 !+Ȱ !{Hda?@Qé9Y`?PP.xp4͆M] ,˜>}^ݣ+ @Ȁx&~Edc4 (2dmF @Ȁj4*}@^ (5@%@9S.Ȳ }4M%gƏ<dIZl~<Ҫ$Ü9{A!J I)?\נn=~X])I5"rٹc!zW4i(I0D@`@!J EUҾ] vϰ*fmW._ns7oc5Z=:a/uxaw>3SLkͿw|5' Qm6z( dmٿڵv2%;^dY6 =&Mgd8zBbm,e  fOjժjtg٬{[(FΩ=;N H0D]_o]a3.Siry(Y߫rhci3dHŮ]DӬ՚N9kժUN'wCe- FB9XĹs驩"*';iyu^v o޹𮸣{N0[|\?>j[Nؙ۫|0_C G`a)UB++7lĞLo9l)8C-a֭NxզMիWGFFL̬\fC^#^07WsmTA`,n45> ߍsU~=/4ˮS_ݔ3E+ޭ))sٽ{7BdIio8P ,+++::ҤId5kK.#<<iAJJɓ'Ӄ˕+wubŊ3&S_6[H\\.WX~jQ?yF̨5=_ 8m]7b֜ᵆ|O8rqպieSšCdFeoPMmҝ!+`9N>:fa [79r}ܤI߲\2mfnk쁳O贫_G7g$W._#a`HNee]ǷNa:1uݸUU/fs .ݻk;Ϟ9ug}VV#$C/R"d;vٳghh(/0..-\zu=ڷoٮ]'><~m۶!BN / eR#G QLt\EUPVM9ȏf|Ru/!Ҧx ͨe_5MUuksm?6.l\MVBεZG'vM5C6 6&j5h22OEp Y(өjprP ĭA,جggN}i 9IuOnM >?)'S5$FU[?N]J+k$@A/l6ý~0-oL5 l ()y5kbccx)fee1/l)ړ$''#۸q#1=nڴi„ h]p= Ӕiszj9n(NUن[^ e)gD^Ӳhε9U OѴ`Ksi?hiGO^ޣWut*}wp2 m{j~L y@"3n``^sԔޘr#i@;~'lAF·Q.XhoHOuWqǮ'g̴9]|exXSqAAA7A $%2Jwΐ͝;ɔ ?i1%B0woޱcGd7n!kai:5%鰰gΔ k3;kx 6'f~Dn7KʟeZwl3.It3~;c~R׬3iQov9z R2 )΀lˍiCxѣg7H:lm4ھG o~}ssmU`V%j6ͮ'TmF}iw**Xfڵkn^FV VbE$d U*.R"dEEGV\CS2ūjܹW^V#""jժըQ#V[~,3lHoܢ L-k/Ԏ͜ШisL+%۳<΢|ơh*p`JBG_~v+5jTE/_~뭷ۇCٰm۶Hp-Z>xH}iBv({nMa}Ch'G';9?"i6{x4wqN8Cw{= <)BW3::7nU7XpM!YzKBݫc`wⅇ<oڰ5jjʫYf+VDz@Rzر7D0 aa!ȤbTFK.a!CO~d# p{0`9Rl6ߟEq&R>LKش4M 2eˠmDَ;:qddW';>CF,/I22].g:-d~6l-{ţ,7nܷo____y|!DhʾF#à5[`4*{l'|S 8ET*f4чofböݍ|͙tWseKZ24 (Bl,::GE֬Y{ړUu~WNJKKCRR&dXd*ie C,zBZS*Joߞd RjժEFFa)dÅnTCp^,Iqh 8h%ShZ\< VE_mRŊ a y{Ԕ4ݶ7y%Aykua!Sy((BP*,66sEm i^x7Sک_yE$uN,ŬVq2UMUk4T` tB $AN[F>F\rF}zpS3H|G~Z20MVsO% Ă )q+CY[$BVwNxR̀8gt {wKVs*d˰շl쥎6Nݛ'-DO}nq-i$DH[+KYuڐ;a# Tp'e\S!{ҽ&`l5:/` :(A YgD)ݔOK1{ '"XNk,kT^k,~m"VJ+xRe-PKڀ"U@l ,^{Kٜ굜)xr ɐ ɒ,xSb]^P2eNɌrUT鎣xLEV״e+Q.{D(n5ć*>T:v,B&.$ICNw3Ŵn/j-ZZKnn75D[Ţ!;d+33`0VdY]pX\ò6-_B:ZsFFF K7&''/ʕ3LЎT$@ΐɢ D]<{v?Xnp ~Wt8ZRy<W‰auZj7'C}7s dP9[֯? UB6;ת5`0GQ&ɼ)6r{0|Hq=*i1ϋPJ'`9zꍗjw\6=v~T<]˗݋.⥦b ghMϴtK垎Nu""A8ӬrHɇ)Fwnt݈}>Zm W^c/{^|Kƨ8;2sW6 ~F[n(-}tycuƻ{Y> :@2aq_4zQUrA-g]ɯlV?:ߧn|XDb4&*wкa]^|X߭x_p*6g|թ< ~8YXp /\+~~zr}UdJM7;Q [җ S۔p@L2f?{ z#Z}1>>7;m6-[lݺu.^Y$ rժU+11\8随^|^~:N E2dEYdVo }g>f.mغ_݂Q9ϵgG.~ ESN-RiZ0Q Z,:V S*s.eYL'A1i躮5߿3g9>).z?߇y+$} [^y2gRF\hdSxAS=$i'FWu:*8TMY6rON=ӖL/]Ȩ{sO~|{FUPН+%ҚL:NM||_~ O }iu-,3kT#4EWK*ފv'ljDÒku&ѷ, $䫞#48vE+țxw_h8P20H:iGŲͱQ,VntȧXQb}|<}5*jݿ^v_I.MSYV֏>Z϶hwXĻveS9yQg25:-/z UI[s9.Ǻ֨ぶ/϶ЮI%2sYNU$nQMQ$hv2A:rT*L&Svv6r/bhݓo4 R9Rmho3;q+:~)3Ú=d QIJA:Z)'4IwI{! E7VLl9>aKā<)$ 9{V1XaS 3/'b_ztWxƯF>=Q)'zC6,DѾ_puj ]Ҡl֮n5pH.)R{#'o駚cيͺw3_ʕu9STڕn?gkWuݧoVJա_`OdYM1co?$#R2,+tD9+s`M__سjkN.~>*KqUl6U9ih5ZEKZp5=!8^ l6]V-+>TߩwK,_ԼoM}5 \l__Xn/}YY*3~ѼBA!Os;b٢QsdyKglt:g;homg^IOD83+ Hm}7~7Vl2kìߘkT0Z&]hR-qΎu޷sm WЁa} 3_}A#K X.#/غsґ)YcY3{ҭO2ɑ]׬ YVm:?sDzD*q^Gؒ#fݲS_76:qBKsSk=Xu,VW`"qj^SӫWR<FUEP93-2Mw樫.Ƀ':w0fffmm{'79ˀ{uJ\#Y;G 6sh7Rf|u/^mjwQ.7̹agG[Rqs lm`2'[G;F%y͗OgUg܏!zZ:@z}&:t~_~E~{f>za5l?a`UNѝzo jb_/:oURQ.MrWK>q2lEaY̗3.9A.wEw{{/];uC [Wg],?z5[JY􂨈~MU}f|jrٚ_Ջ^ V<0D$[ZA.H٧w]خuug}Ĭ'\p1ܟsgJJBζͧlчmQ-o4;q2>{?^1[zuqU2:)3n&~#VEs,sVjbb9yhR-GB}3xݴrӶсw6jdBDdQ!~ RfvRMBֻWU}N80˶˨h[3c~8tʃ^o_.V6$ Ko]طʕU+/* {O}倫G,|g_{xwbIX/=]&yPF WyOS1Z!;s楝_+7jE7|u9|s$w5k;]zT૳~J>fHAd$dYr]yŴ}>6֨&%+M4yCvU&k]fM4mzךQxUO83p8l6(ڲt.+;'&>}D.mV6KE' 5H9w4iC4mVw]8%'OSIWLګMAˮl1)@?k!۳y>~-k˿sLF=Id!)Q Uz`y. VQb]P&SҮ&;ڰm,LU - ]Vyի_.& k99Պ(ʞi[\d[ڱU|׭\f]2N<ߩh:Z%>=GN)r\bvs-?G-!m ; ӝj),$U8~X|TUU_ue x3ȁD3QQ,:;lH/8"{ݯer蚾\[V3鿼3CסQvZSlbn|G'zk׳d4hֺ3U?Z/bSGfm{g O2F^zp=t;^Y]:ϳz 9kp톯- ޢvpc)3Pe2PL+d(6tw6Nvtz9{mn`ҳɹ!)=u ӣa`N_&j#hN05~fJF.ЗefJt;׸Bk(4pDVi?rJBy*wXeY͔1$S?1ġ UZAZʙeqHz=RkiiScxU΁\Y*SZ) YypX;+|ǾLsOY8171rQPaiJ2Ǯ[flv4wF tO7&(J8~ܫQQ^j9mæ멉/g؏z6yJFuKJ֕ ӧl5\F8bȲa^ ^YJ<쫮YoKNCˬhgјkogzW+/-q\vu~=㸽:W0{SSZ~Qryuu^{7+N$m0:ŌjZ^٘oZZ'm d~v贈}Ɯ)›%\&-Gv\v?M^k(YjsAD*tI6.R.(I Qv:~=:7S鵎OqwD-YeQIĄUϝG\ Sgjd->˖xD^XA53o:)I' މ]dQԆ;YE/kʶH2.o=?ٕ`jjYEsOαg:̙->0JO۴:kW;28 F BKsnBV6|}j2Y 'W|\u9ΑQ9ZXn|[/7g*1$JyF7hU]lєmإWSWYM>tXGh-S{v Z/l}˪gzlrA,IN9oFl wG \.ꄚ~9S &:kMvяtYU\#mV$6F/FPyCS)[~>x.Ƨ#^{fhs"w:=?}9]L-A٦jh:W?01$ e0RRyC\wIvRYLvW6{C6~}ݞ111[nz$Jrv9'| gxluDn˩}{ s2!-{!pP4 W^j 49qrX]_h}+JS'G8NȽrC{D}HpalkPϷ hڹu@mXiVhJSޯOowYs S6i_ӵey~3,kَ?")yE-9|a ~.pRJDZ,󐖵doB-lU >OwLVg2Mz5"2y^LESAiz"QS.bҖ-o n佡M;ήNGSVbPn-kԗobtR2dN=4U#~]?kxt/~yKov]5׼+ž{yCSR<7mW_8/U?g2sí+/_=ݓyy_6-H: )@H=o&[2qɓ'6aQ&P I2nGg'4Mz7W~-W .?7ָ.{8][_=^9l. ځk7W̾l2,*HWX Q,!Z?n 7iOՋKKw>pK7Ej*J'/!p],3rGCVT9c#ַny/Mk)j^HsPK -)."[RVڰN,6AښU 5OMQOkg   jn=ZXE5j:sɪ1]kǭX@}eC2 8eW8-O81rH璋dw`Q ˩;xɀ=7f->ӝsVm>_u׾pc-_:hsCO+}@͎bѣ#F{nݻg͚r*ȱc>kV|{ߍ[ugPJy[VX9j篴jCUNaK6 IO@Ԃ!CB(XОGleB ·49jV] 8wDt$ڶW>د0Y7v+grջ~`mٶ +n@sNIҊ& כOGxZdzO}ՎjPǾmt@' IEwh76MMMߺ?@ݓD[-sk)khMP۹\E~LSJdyoyk?%co";k^`dc 3\ ;On@Ԣ7pmU;6Vlm(g;\k!];-7:dKev<#H!њ8oÏvJuwgs$dʙ}M;Gԩ*q˿mި~%kzM s .1y9r^E}qL#:=w7.ݰeSͦ(65JO|%Sp_v<~s43_*;8ֳ䑃C̹tDP`ݦ'UNs5}`)θKSZDK1ۭ^733 $!4Y bw'$L[Œ-Zr4i҂ v?s̼<YIbR@W[Ꚕ1m-76.B].DjIŃ!{GÎ컁5} )iӧM?F]|z>uI"kV85Q)>;‚d3f 20eaK*ZESG,ذw 44l% ZүsӾ7k̵7|aY='o96Kv?虶⇵+EdB-ٓvi 'rw*55cNNΔ)S|> ˍ;YRZݼa-֝w-ht:t͚5djjjhnt6$M{aG;i2~y]R Tܥ`kSgYx-Ьːc Ȇt6|5FuMǁapK?8d`WEkILG.!Y_ZJS&(*I2v) iYm__:ij%>v6=# v<>4f6YT} km/eiYQH}RY6xDC0c@R>%E͟Tͻ`d#e2t4t)ۖSK+YƯS`BvE0h kt,$mB566fee%e49@8C?I :$z O/Ⱥьł%BE5HF ;c l =I\644@ L`}\-jXoǍ2A.3EC@W՘p6AUUU{M#霨s41 f[ϩ)8]؅YH`׎5۲eK R<v5P 80lsg4K[,ӫ***豳d^FmmmaaaW vəgX\0aQ@ &AHYlәI tOIII 2 dcW?z,}+1(*%MXuI{\ #fѢE<\sAM>|nvuuuoEՌ7FjL4!|p@Q6,;NԊ3qĉ`0(؉@~@[8vj הҙq?ؙЌ n}aSʓy-3=aR,sFu#1d : bezm[6[gDf8Zδo~ .C>\QHܙ $ sJrdݫv@&C82dd @$' pڪiZ0H8 `A&c:j@}'H%d2ggg_\h3Vaa!*@16R)ؾ1JP?YMMI|} ` i2,ȪHx8鳢" d{Fz!۸qcԱHzI֢ $Mh)aP͌3iٖ-[cQ{aP/dЗ0Sqq1)jz=p@ee%j 6 @zw8ɩ@-ޣ|]RRRSSSVVi^yۘm@-*duAj^8hѢBOd4JCIOM3+A$>oN vFH ;AVYYIt޽LIvII dP fd𐁳5*ސX-zƍ#̹ ~PQ?٢Exe:zQK7n5P(..f㕴MdNg0EQpa f̘Alk sfvI:l>8a=7.UUzݻy"eVYY5Zd/Cr Cx 1%??=麟@? NMFPc1EP?\AR`` 2!ڢd7D?oiSTT]QQQVVz+++>ˠ$9kNO\elMh?j5d" H22AA `r$efIENDB`robojournal-0.4.2/doc/img/screens/mw_export4.png0000775000175000017500000013570612142060704020367 0ustar willwillPNG  IHDRICgAMA7tEXtSoftwareAdobe ImageReadyqe<XIDATx `SE%}@OzR)rS`IYWtŊ]] uiYEDEPMRZzѦMgK^^IK>27y^|o>s ! O>],`|W1BOxeO2ܳq@0aixKմw_9ÌuBbe f|#3fX|U0xp)gbdQ]6b= :DsӇ̨# a!#gj飂DN~p۞=W`Ѱg7a Loƭy!$cpݔv mkqYn;k?{1l;oI@(ۏ~{AGY'N:c!ǣZlga/_E:H⭊0}%|iνC6͞C1 WֳW~f"V3sf3^dyE8D R8_Hqr߿o`su$]V*p\4;OSn@ yct}2E%2)\DTI9JijKN3&8ox;v_DQX'|%MXpsMlY~GQ'ZHʕKf*r"ǽXz?sfq? gn\NKiboqqal hI9>³s#"h  %,sn3?Y9>yB%6nJY _/>m,cj4{UUU.;xSݤѐ{6}m3E0J2w7Kotgm>f,5*0K;Mȼ`ꔺeN 9%F‚ ؿKLJ@_:IP×ߜ?.TdDpTypݔ8v2!DG .1|qBYn@t4: B2oj:(,x&Ng8/QF! g? 2?GR\3acW̺aMXuGMw ZNܦˑâ& Bv o]嘧-qScM@CZH=LdMʒ~$ L/{=&rlNS#PBޘY'<434}[v S}l8eDtߢff*y[(n0M 1aː.ѩp:").})@sMu2s8184#ǃB_͠"x/֣ocƒȴ_J`\݀!wq^Np=fӖ9z^ƉAG7^nNL2/"4DŽB N8 ꦠA (r^CN&򔓓j5?=/&\?d$'knQJB^DLAHf*|U(ŦG ݴ!;u?.evcmAN: 0pCC7D9SnzbWhe)6sE_<[Ϋ=Q 5ob R%tV%a*ށ:چgD2sa))'GnAN* 0<4Mɤֶ.[4D]z6ysS[,ڇ5RcSeP="6;Եņ 5`hfWkSk[ BZ:23vwsj5,xh(YfuU?UۤPPR QלS͐ƭlљ%X.v„$Mq暣̛c;EMӒZpЈ_,q*{hY2֊rڰnFhRTw-Mb@U?Y (ϘQ=uǿSZˣ+*3CBM($3Zך:TʈPʪUm[ޡs2&BYa{&\- $N8y":&Efoc UN(z|Y畒>}B4*WdݔT~W{IsI#O:P2j s͍Nwa&Y]kŵUfN>֡¤qYw~hnUe^u5(wM!dǒɔu&O2 Vof2*D)PRRX* Uֵ&iU{ؤ:*. 5ufErXNVsnGBޖiakxrr&hxh"f'ZBQ,U )Ze&ST,E١ GMˊܢDsv2<))e%V(*o_bDt\)2"9-㒣˻p.9\v^U*#).$;[#Oļw6"Cq?={4+\MTX?k MI@uHʢU[;Tdȯ]xc":-B}Wڄ#Vyޖma[=bRsAc!!lcL&g\71K ]qfXbknaU2*[p]{0ʺed 4JE8ߊ]Jm=C.Ku?*oRアU#b%4.]kD19[;vTXr :ܪP*SpAkya.$29% $#=lJB’c #Q0{ͧ{"bQeY9FEP/ *>+޼۴0\zP=4s s鶸sb@JĎG=t7i8+j~V| 6g찔LqAg|OlYblܑ j+nF'1[sR "snal(.9zgJq_fۭkuk*;a~;ح@dHC߷1[i:|P$gΌPGT;&.%DŽ{OٌʡBHBaq)|-a얏yn{zoQy߯y_tY?`+1x}e0j`޻npk7pxL聟ΞrN􌷓O _w *!ZNߏ'29Al%Bݭ~hL.6O5n<|-sk66h;^_ҡݘ ʽ^L1T*ٞ!` rC&O "pg}C߂Ōͤ0iQϡ쬨tQQQ ԥCJKC7wh/k~39V$G}Omm->o  & O;~\U#E6ׄmдi>/K'N8|{{;> *BCC#"""zgϞV(~ \( sx3wxz^mmmMMM+));w]~_nhzNi.+^6rrr1[MKKD>/#'UD?{P3G:bYcS/0H|>57YjPH`LdPB:Vo?ȐʪV3N7oVQU4"$pk b4ݾyqGoAXXFT>^ҷ)1֠P*S@y/hmBj-m#  BO?9I{c}]cSDGu?wjH[iuaH){L0NMMMLL?w}i&e'кw\D({M5.M߆n;xح/_.--]x;A&TUU{|sr|T4yɽǜ]xYYY74X`wXBO4koK2.RޥRk:t!3,HPJ=h}1lj( NxC[~XR7U:^?';Q Bҟ[/\+++322|i&dZʿUm6'lguL"tMQSbqS즶gO~`r<^='}Sظ./[|o(i> ;xw+[shZ-T1`55M`` 2$.. Tԅ *HJE-M}bWt9b+Wl7ΛTZNOtƘh_2 ~cFT6;Tʛ7[V'Rաx#hYbh;uބϓlo4͡SjbbkhR74s DH67J_Z8g]3Fo۶FJt)^h7i 5C R~($͛/w)jڵkСbxΝpa*xh(soo×<7((H(bA%{c7rHjTv6k~!7u Am>cgx/e[VO1 5Pʹf:;9XjƱѡ15a hQԔv緐ˀ贬yc+--ŽZ@@@쿾ܓf-y ׌($Ņ$ƅ(>i c7["/ͩ믟kK_d_FINNiCAYJ%|."z3cwkIM]]?7*}pppss3k+WCO>_CBB:;;_W@Յݽպڋ5Ijk~s>%&/GEtvuu6+bBo)SXu`Aӥmrҡ  UoWG&9y&Z/ nLJ%::w`VЛTp$ ~=-g4ͩSi =%Wo_?.{Mw=SЯ߾SW(Xj;F-> zZp\uiq{'jF)mm17=UmxE$B O|eo4Z=?9tF}S}n߄ og8x %h]94"""p_Z[[ vi:F{S _#eG "bbDwy͝1aB+w6T䱔 xM894'%RS.ҩ>1~EP(;)l['nONNmL4 kiҳرcǏQXXhں˪>9GgDÝOHvﭩ?=NOHH ^? Vtv^im.d歍r]K˻>.ugK"lAmL@QcDJaHE SyW}憅ijjjJKKY/cǎ +WAиst ;WIpppٳgqGxy,h5=Aҍmڤ 8xcv܉\r~5aL ߶'nlF(֠zF 4q ^{hX]ݥ3h񐐐CVVV2.i^ N|,B@i.l0G,Ç'N+iإ-7H_r-u '4nʕKGVNZxQX46#k͋Qbio{\5F!] a !._4Qmeo S|-L/X[fd2|[| 7Y Ѫ.YLJ|a ѣG?O>G//f:w{bRBM6m\SW9iTDhZڬqD j-.>XpUq,F^QQ5M|B~2i"$ z28{CBaV7*42<%j7}Ƌ8 CjZ`F .B׷-x .e?g^=ϧvQtDz+C۰3B)WDK@ y2^$iz}gg'ԫo'tv].CuU;(T8tO/j)ꫯI{lRpJjRCz_cxʸ@w}b<(=%S|Zׄ4:==].cɒhb(@!q*|ǎY78H(>]84t{]ojioN(;`Ws%bCԅtk m UC~ꭿRtijUAkG$_nӶuZ|j'ƭ{8)N"Yo KU+PR\j!)y;KwuzaRBW3BzzԵo?|Y;!'+#$/5:F`<+<<|ԨQ2 ӉXH gNe >a688BBDz٥./>C3gΜ/_U3CssƆOT4܂&p9~x}o0Zx%+jSxqA`q`^}Df`Q?n &&'D^Gm5ݘ! ~ |nJ$kHPt8Z¤i\\n^/ͧӰ{ Mϭ p)'vJ/~E!dzb->Ajj*8P Dn> shSh$=j2_Btk;l[g0rc7Z OYff|z]ںKWA 12.r"{CN M6?𨹳GA&g׻:0>C@߆&=wѬ<\D4ݝA'l: @ @4"_Y2 DŽR7='B+ӧO$$$cCt[[7XL4 o&N\-v~UM?{tzh~%h ཕT'&!99i{ZDFFnذ!'''%%.z\󕔹ԧ6^ O ;::Fh+4]SE\ĝSo]":td31_}IYݥ!C@(dv`iҥKAAARliiMOO tA_?X|y7 g h|3)4" u:]{{ZƑ4v1q 6|y :ko&&&|g'R,B0888<<<**j^8(bɗ|;-S8.Cn6)I V0eV)0 2Ȣ|*EϒCCA>x tZ=&gCNҢœbVKH&-2YaS˙ XX0%(-D-%4LaM"[cTBy~H&o7UYV(XU^ g@'$$>O u"# q78nr[(MŚąۙ˘h.c %H r6( 7r"~iZ o@ߙ"3jeAVQƲ}aW/|9³4~{Й^qz Z7F moe)=̏YI 1< #h(x{Ij"0fxt}63~z MG4VTPJ@(ءz46[q)EUp fˆ{ogt:$5hȘUKGo7?@[i64!nʠsAo}]8 O XѭJO I!=Ԩ|_2eȡ@[;8);3w#3^N덇ERa6aνNתGgw8e4 ]?hz(moMRɐ˭|qf͹n|W&^c wbӴk#_UgxpA7 [CYjRk'>Pd2NJߡ ZdR tfԑʰ fQA"E{^niG@Jsa7>vvq˿ܳ_cvQ/8zXɬ%wpKϽK >7$.Z+/LߒJ"-$GڙК#<ښYk#x콪UI~܎mPKhV0Y1ڑVwhsx`+$`89dHYmq ' pFCғ,AML?;LcڦTf3eŊmVlަ,YuM!{R^Tn3*&R8/Eh ͌8 hliӹaÆTvp%tX-Op9D͡X 醈2&槴g6}7֮'"IE:T/]dߘ 0{~f kٵtxz3QTC#NZxʩt4 G}]g[d)QQ/Xdz'{]Jdgg/)cSv?d62 NojI[h' 7/f?A[uȘ}d-͈QCї1oپ4ec2ooui3ŜR3kH&w*틝,|u"' <O{[ѣ*XL)_+[,̇Ʌ?B㐓BA''̚5kƌSRRSYYueLr Wmرt68D'Qlr䰨8yx濷 /e9?atj?w[~4 QCϭe`/N'E-YQۆ޲GѾ˰Ukɴ9܌_l.mxri Ͳ6cĸ̲"#x__K\"{m0ZiCNƇ!M'WH4z4>Cé-#MX/1Sjn& M:qxȌpYi=mM,NMiigGX[6ߴ\EhY5Yceajvk'Kk氅Y\pu憡smǙfm:Bj)~䡹jXG,|5μ2f]rbgQ؍ o OKF~Uu28dའ %shh&x nf5@VIql{h@xɓ'u:7t]wt@&g^\ِ94@G؏OJMkϽewrݑ&ADŗVՍo͞(Ė]@AC0w۱Ǚ6Xm)3=x ˎ;1 WP$; z؛:v4>޳h3ٷfãc?UCwc|EWiU2 w2%fݶuyy̰:2Ő@pI@_&elm !hz=40Mqi'\x.h 8%M?GmZ 4/4V1z%[h>/L7BBBK,@F`` > M#4yJ"G/]4ߴiR4ٷo߃>=A#!'fzѣG{KOɗ"rq)9l7o~~.]VkF0~+hRxvI1P,P&adERI HRcn?Ï>趚aFɑ"6 qa, *c" d)cEHr~ÛonFaVhJ >rV=vr7(7Ӵ{V뼒¢E${fUC6?:4'oh~ RT,!#@RL,!c 92q0HD]/EEXl&Yi/oV%A|(T!K$$C3 C1ˡQq@3/^t^5>>~Сci|Rt2/_L[qqq)))p zPh~jГ[^6~%p mDh^cTm6%h"|]ͳU]-2W gw \=z=V3j4X FqY4 V3SN+|P~'/h"pV`2aD"$^J$VFL5%.AOFqc6u^tt.ZBtI~'ub^F!yhl>R@\%-[(3KGD^1-4hиqN<Æ Ʒ-| QjΝ| 8GW=@@b2*JdQmt݋&tW%lTͰEZ1j͝+ՇM Kl.lj,n8A;Qk-))IKKcgpR|3f˔)SXW >L"_F~+(%7BdeYpv[͘M]8"$a> ?QFCFF0n!֟4a^,A+bXW̯MnT*U_& $=G=(S]M VxpWfJ S1fMCaQz/sr+]дIFL]~Ϝr5BK ).-Ddi-҂մq/-a*-r0Bo5;M$4߬Y,*eZl[[xdl7U*.{akWU|%07یӚ 3g666Z峴=7`8{3=i&^:}{دe\^N-Ȝg˸v-Zfa_(ϰM38^\ vj3`,QЯ`KIT3} ٰ3ZI tT#Z&Cf8x>JTڱ\x&>kM6E Ԕ` N>_DLڌ 6nyCC,19,>i_'5 SRvc-E^#./Y9 vqQ5\f.ٸ˹es e Y6Ag<|QS:;;7((Gļj}q&}{oKvϧ|y/+xhw_zru _b4 3,X*+x$"}Œݻd1FMA,#3鹌;sJ{u:Â*+Ϝ$WccnM*^Zz7 ;{d(Q09BdB y ^b}FZ$$/v2}--)eEse~,dBU2Tv4lx2,…Ȭ]IqqNa.;֔o!:d<)̼|]24G7e߇C5 -Mڙlg:xLzͦe173MTTζgʺjMoIXW#ϟ^+Ię\0t^? s?6MP8}Cb,ۆ1x7w$?<4i  ?ՌY5JU0S32m>;ϙkyfD"6e=izA& & vgDԩO0|Fm -HX}+!jɊl(~fI.ےY9#\f,?9XiC^|vfg0穨I|䤤$+c{,?QYrw=xv#hKlٓF,RHzp,c v z}p;--lz#Y1nS=c`H 12[3ϛ`Y٪y?쏾fFqiSMkh667KwoFny+~j~7 i1}FD?fr|Ӧ̛i.ܛ$s.nR @xSwVjwsFtt'|jĉhh0fj|XHk|`Fψcם$Y_^Af9Y+#X+l_ySxe5kkw}{5ŗ&r_?L֬Ujfo'sd7vN&2s2bmгerL^zWy,0VgOoB;?+zU%Wغ^2.EOϮ\X5\/f?w곎;~-=Je/5=6⏟}ΉRK-94j4Xmנ?<'DAWUuĪږwu"/2E_TTdffl_|QX F223+**hz!2xty^¨K=В7Gxk}=[*TA+kjkf =xh d {:ns-sP}ofhâ[$ڕƵrz5 4ADzB]Q7tخȤ̏k-+rT3 AiiCD?AHZ$Kr?SrphR94jFs10Ʀգ9மȧKMEEXӸ7??.+5E#1.YQ*(q;@ hj /eyf0bX"-2)YL 敋$.(H8 )(eTQaDb+)iyכ3R0"ca0bC5\.,dIFE#ʍ&YSTd1Ks|hn{JW (.b55{ުܻ#RZ(F+)(Ɉ~1\&JE?_ RG` :mo?HL\Zrۓ -ٲ{//@HR֓XLf>:sbLnWy$HZT$EzbFLGŅ4GD\PZZ _}94` -y^{>⦖!DL.)(Dd,YWLaǗ:17|9RiNk ?S+ ̛l5M60x5P4ۈnuVxqѦn& QJX' [s+8&*4U*v."ˋmg&CbF$=$1҂fs)],ϧ-gSYYW=g)h{hh?{+9!"(eM++3wč_iOLŅcLQq.,3*Nȑ MFLYrs c5 P4UPR~]S_&pkCD@*)'zF@K42@++d{{\X;d.Li k9Sh%=RW?MIqianXqav; bg%G[@T%hXUX R6rN1Rl3ڜ6`5C4u; :M꼷1})?]*\u3r'E_) ӥA:-$.6v@H!jun^*ԳF[ƤVL%1d3 v捡,CMY_0𬄻^fۑTmGڦ `wPvUk vQrv~22XbT;RiU>iy3Ji1YUR JـL-$1\j&^?~];m ݁ZNa s$!-*!q[BdyS.w5$3+ws6`R5X1 p/S3dm٠!"şG#rrR;JZ/g$ j&$~,3IL%Mǜ,Ԍb`M+*SM deSDކ XӘwŊ<;q1.4.d^ 3E&7Y2 zQiQ!(j@ _rިmJQqlPt]6"CBem$nņ,})e($- ݱ-%wرt眿Ps+mS0xÆCc{^B8?bpxMC3'~|e;饚1#%{1*{:F,bdCY ҥ8 VQf4R( f51Urs[BC^*b 3GRP(JDSGs-V3Y7)ېmSbJe#_]n]fiێCj/A/sE֓c-˹ 983FB&v vSL)ÛKK}{%[ce;vlfhgOqDeeeFA:o6l@4pHwY] o2L_Z`gLGR\,1F*)S4fw24`g ?nK?sLvم2(Qm٬eC^^H]en2_\C"Ag!v.=4vCshhױvףLdߐ F  :fy UHH+ m趚A扼(QNN*뼼إKd edׂj$+]eE 3; j|և㉚uӁMl CWKvo_S |x$lp*M֩wwsׅ=KeBCv,l y|kT5:SV xҘ6r`|VρSŭ^*eRI1, f^/x_* _r#vcdNrYN1 ]<,%*fWۗJ1NUR迊Y莠SN!?alCnrN7މo}mei918)f7._F^^;;ogAgo/}2p.c}^3maCLKeʰlvcb+9"<5;&yL%͹2bCcgmhTޥR 7}4B\,/4fW(p䮛}[7ǐIfiv׳XV`HF%Ŧt966,ILw9ưv*pgTUüGB4ԓt8Ǯ(MkbfEU /0G4G9%ťƼg3-`nViwJq-v9},EkؘZҩJl\]SLJ~'7*y ;gNDZ7zk& 0r[.e;$$ﭝ.e$Vew\5l+pg-ک*bB.ˑ:8'ݴ0;ki8L|͎LjkOK4[R-GxN*l#$R[6tp*,{LQL%}>Z sTh౗*/2,dHKI&54.E6d!)"z'@рGGj?d5-|_g96?RYQ>9 e1]2n=&5nǹ[nT9*1HNLTjɃteK { ٷ^;xU[?t1y:lqg!˟Ix7m{YNiI0څ,=,S~?16 },DžÃ{gx>=H&ݚOL0KrOŽK7W78r2yVO(/lZ&%˺w۸׎Rlo=1xZ47q獳C ޥ&#;/} |չg&᥼l[ޫ)e^-כM-xVKb5Yh|Z@x!ﯻ;sξ$lHfu 3gΜ9sos};妹^|呇W(Ut~<Η;3GWq>ߨa\^ h'Oޡ3:o|G+ 'үEVXWP`ssDX3ң%xR<:Eó礋^`xWљU;kS,k&wN?69TµV}vێH3}?蕌X^"< QQao<5Tb M墑p\a؍^NnŒ:$sE?ia:",hfeGТVcx{Ԓ5 #(@dMd׷w^i,x|:*Wʪ,n2DFexE*rGg@hA~76gj UXʫMkn{g |w&G% 84 /'K%IԆRa 1.T C7h>4C{BE" S$E  4`@o{<0N%4˂C"'wxn7FUT^„PMtN?,';'Յ0e'燣oC*XS\vnʝ[qEKEK?r* /"oӊۊy^Jg**,6*V))& %j^7:l+',*Uc'bj'G,% "Y arϰ$3lʰr)]QuJ襕5IbY[\_Z+4kBaOjJFW3,vjO!/e2p2YȕQH@$Zw a7ffϞ][[ۏ .-p+s֡;73Δn5u5k 䣸jÑ jFbEsqEtQcZ&0L\ 0WF#2lH>"%x"Ayo?FuGU3N*{vfSU/ x}kFj\#o]R&+V3TNQ\ֶn[FpZqk6HK.eN^voW"YHG7pԕAbo; \!9lǮf)B&#KTnT"qnӌWM6UpMd \v;h~ BѡE"i>SQ[[ ;S !;4'"osWm\U]S5"E-AzYڙ$76TŁ>s'+//3Sj+4p`\׷K&K[UVKc!''Sd1Ugτrk k49b h׭w][slYvmR$kC-G2HH:Qs7cQyeEg#}mA"HDY[0Vk41TNVEoW ڵ7hӬ%.ơN$ 3G v7-U#re8PPPw4MfhKid-#Lb[MPZTėrUrO9/q/HX83hq]-&wG;K.g# pr: ݍusw#YI$tc'gN+wnRɫdU|J.MX,/'yYrY"c q'lL5]Txp軿ZHF e_uSya#lvcMJ$[p }3QXn˥{]%5OZ2I,O9}z^A9]b!bonP )_B V5pk u^jDCʯz;a`db)–vڝZ]A=vգaK{5$vL$g8(r;jC ,4JrbꟖeW@ekh(/"br[dM̆CM8 {mK/DWϱ7uϯ~Ջ]Q&706R#\hpr#S)%D4SMŭ^R]uM,mqm֣{?(n0L3(sٱVĖ1Bx<١$K >DU^qԉTsx=Sfl+ER4f69%pkN]A9[״9b,ɔBgR' %u$/`|LaQvf}MI2)rU^RDԞih[׎O}3U˃Y)5 j5=iԩO^3F6)m.^CWa^0HCS1#gX0o4v 9o :IQB1^#1$6;3%޷{`dž9`@FtrhR3=g_'Mcp4҃5aD 7 nh&'z PJ|XRRBIP]՘ezKy‰BY 17Hxa)ӸVnn*礙YP8l ad:rY)X& Et:Y gΜ!yyy?W>H5s\ϿJ IL79nܒg#fѴǝ۵Fby|aX$5v`3Ia{{v뮽{eeG* $"GlaDUiNReع+wVm7OkҪ~.MLh.65:ZqT418/ANg|4o=T`d#Jsg`5>!~q{ʓ~1?t"gV1cf*_ص7vˎD/R1=f]M&hP-fnHLMSNΩ"|񷏏65wL5+7O*יaVMNB\뮧O6}ԡ~) EFj$+y?| !Zh+e xR3TexiS|Vayڹ?~3<?A6WI#`V C3nX:q\Q._W.w*t"UHM3 hQ\3+\W$ege$%&LAJq]{GL2W_w 'r8FzR9%InƝbt=Wba_AhΆ伯nO>7%'g/>Wj/Iro:"c.TW[} U1=w.''}ִDA6陓rxeo{ˇM$B5֠\a&;[f{m&,%ErZ,륄VdcsrKoBX%mc3‘T%8Q!JG6n>؜Qpc_Ww{_p&tmp pvq]b ǑkITK4v4JhjUǸnzNG)$h'3W:H^;H6#pCpFO qȘoΝ3HѹczG[u\IIropKc(^khzšrP 7 Ƥͫ?CK~;֢* .|$e\yζwML˸9MMMxiÜ6{c$g"̽6z2' j<ۜ5򈠉yi2|LkWPhE 9cƑGfN_ebo򛏥(QnN6D"DR'5˾>Ne&*r"hQ3GҌJӓ3x:ǭ(BB{T܀.6JةpM pED9ݺPv`֬Yպ:{mΛSdk<78cLvϞ={7ʁ Y2xuѦS[l3V[EEn?k*$<ȚU3C~ҊSmY&1@ȯ˜'47]Xh1C-7嵵.1.NKиzx[ը OBqiՏ^؆B)ՅCF%;iGM\F"řihf&9|iLk$G>dqpp;,K dطz7.//ohyGZ# -b'cAoٌ*~TmԼ Qm" Ngܰ6Q ' s}ЂPaC0o}OtxA8OKp1^Tb_ cܔLxOse5R'ݙR'X'z*hP!6OC[l2wQ'rjTބG(Jx-5Z7pwMQѐt29C`yT3˅ɞm-uǎH̽aWb^999]{ Hȹs;kqGm*J*M( ww1ֆC.`9Wt8l8TE ._qob`Q9 jj&Ot/4]K~ۮzH6k^!PQt̆ x%$'!C &N>uʻZ9~T9Wy 6sgV1cfpϾެlgud'ȄMW•y:˭S)OVY5=*omj21kVX˥UC5c xh*B @pbϡMzԴ i)crGg:wD"Hd2W\̑>Fߊ=IHBIĒ+5`$ege$%&LAJq]{G{hKF=qJBp(JFwըHT9vL=+heҷkJBsEwFU p 0gϝɹ22}DRbԤi#RGgr8dTa1 }M.Xm&)DKI\Jjbߴjic1QJ3 !csF{¥2qjoOo} yp: H1V})V$ܖ3H~9`՜W{*lI)Wo }8ŠZz']gFn~b Bb||JrbrbBrR|"t:@SR=' Gh_z&¨0]+bLSpZW6"wä\Y ' }[MرcLKB9zpQf ^|)e`:见Nt:ӳ< ɟuO<#=ZZZ'щ^T=*:ޟόΔ?9*l3zIsN55Ci(*X8S 6N8o? ?n\^^-7ߌ@cbfz.ᾶ3R3 {S4/7`hgKHv#E0tr`z\ >]j KpwMt6*g>w:Jvͻf-y6Bj G|ɮz%ׁ|(W;a3C6r{.. rvRz bSFfoYgU5CUK: x07c.hbB۟}o.w”KڽlSmOmF :Խ'/Nx:F5Pb4QD׺멹Ľ{_:uy_ Cn6;4sz:c=ƅ4}}#qp >4@Lj/.XhoGٶ1R0tN̉cO@ uT'0  ^J"../!0Lj郠!4Mq(N' t.h8|hgxNXFp:1 t.hx@  M<`:GHIĐйF }}&Y3(8bG^B\)iiiA!=EQH '|P3@3wss>ee55*75.fԯnnٴ𓟟__S+yp[S6.K+,MEҒL' 55\q1WSSS9 <,4SMDḍ[ȆzR\,(&꠲~871A̫! ^]<<3{{Cq}=$XlܖQECMq&\jnXhdk"AdT¦+: Q45 *D5<4P4@MMmٔOU|/ϯd)55jZ?2VT'ew y(F1m8+}3І'}hydu=Y! xSMƼ8śa~6RP1[_K(j$B0,?JYn2܇TJ9DR@4n.C3$̘1ѝ wf0y^@ab(* ĥɐgXҙ0Ԍ+N ໋Le\W,@P} cafxG8YKc7;.]]+3|" - bUB4.iή"69"GExU PC W~@Ts׷dX띮$Qm3rh,4[ƐgdJ)9\a1pfh~$#Vd4 WK8s:,9|1$BǹB^l9E+Wm6sML2+|NMQ8V/LrXIIgRR*Ty+7h LwW,.[ψ.5}ڧY+ԭZRGy[_+n$G^Uw]8޺v˶FouN_G6N%Ȏ֕l y&g ^tۀ›BQZJ\(x mv*lmd)tfM'ٰlv;g,4 YJ5#}D&H֧Bsj6(`U,}*!)j#%uz5XE3b))Xmr 8isx70\-]]$nyޖlh`!.f7-۱sxb54-z08ȏvpYXN4@~[ 5 25v/,\$mq-6h.7iEN.fD$L!kt"əL8\2](GTBa0Δ6~ɒhF"ypP[ʏrg'm8wiӦ7:[&+Ӧsm0}ڴvl?th….$[$rރ;/ g\P@ ?,&Tx$Xd/ESXHTVH% ۈ[jMQ7ЙJ~<. F!0 8Y{ȂûO"?t8XK;v̛>M2H wC;w6,Z-XmxxlqNshÃ?wA`.4)͜Y%,%FktR?rkyTSmmaG٦J(ME]䯥a)*D('A3+u#fT^n4zN&E2KՏɪm!tdRϛvo5Bڛ؏(jrt6ݰq *?X[7lԓ $C .X0MZ0.%9%;QjKT{N, Rִ)%=Qh(7f3MwwwOOO{{褣PtD...<ׁ,LJJM Ițè#ȁ~Y$K_32.Oz8~զnWn\s{GT*?zn]E'(|0)!m',%$Ǡ&??3:3?l6??~Ǜ L>kd!.S#h]|,###==]ٷ'5+DZLD}g(!t:Bm7Y"oϓ珹ެqZZZP\(2jK:mXV #زq2z{{¥?A8AD@ y')$ANN \x C+cĊfH"[hLq8DӐ4jCCUIߐc-S7 vP MoEtIbb"1d!)VUA+)iK$rBOO$n <_S#)p 9AÉX,/DH"&))qII!"F+>DH)(&Ql& o8FR6DAրX4 mN(*GC7:Q4ʕ|KHFR6妇/n$| .:@lI;|1JRD̕iAoڤō"qNol k@,AB)ChXwϦ%99y|J$h SH6[q# .Y>YUEMUР mR嗻?X񷿥eA#JIP @}FΎ(f:::D|k>34 2May 5t:rIOO'{Iʨu [qǧO7wԥ?[92s4/8'^}Ț)i>'fΌ래[VV[ 1"^G˖-mW[;:==%%Eq6ulKu|C҈(Kmh?}cԖ"kں&~ݧ.^XUU}߽^iACnm@jF\]}y*%?222~tWJiVwt_Jo}iԁN!i2G|B L лJx}D$''+2kNJM!j&-Z[֓rG8G˗/wttmu]>4 niH1cO0@jҚ{JVȑ#ɻ {^dnt钤n<չ{wŢwa<A@ς%<33f4^(h8 i@R2D 9@'o|wAfW:::{%|ɓU3чߣND^rr"}tf%^UΛWY1ЩmFv3)|ѣQɧ]dy23Mu4+R2`6IӐ!fȑ$~'mڽ&2ʶ"ɳxEC8ݶ^:6o(U3 h~q7ulQAЀ# kohmm:xP |`3q8m7|VGڛ[!&M߾c˹wzkD%4/4 PD~쳳ٌW}D 3ymV?qhL~`~u#Oʟ ql&ڲ܁mlRˆa]-hpå[?`T2b>tօ[Ш#{eY3#5l\xC7 ٜ YiHIܱ{pB ܎v< +O:: sXmЙQO1c~ȣ0L>aۇT!˛FCޢ  uhEb(,7nTv6mZjU^N0HУ^c|tF%|Nnr⸩+o 䡭 9aKVo[aȅ$dARzssy͙g7o=?_^_}qZ7&kDLFrn\FvzM*7}囿T@ D|hCi#i%+_CqTYVυt[n1|%HC_RNfWcK} 855#e&TԻ e@fɉύ39a/Hq rwrDʹ(넅 a"4)/$V"hqoSRRϚ5g^-JY*m {D4[[~L.Xh' Hr5d1bȑ#?;O_۵KJ^qqqh1#Nwv?so(_;NJ4LWW4'OLKKS6ů]/Xwĉ/_,Mb49tDMjjjzzzFFF[[۩;]_?pNδs$M\,5Žcs W'OԮaZHjۻ[֔ytJKK믿[#N&'ΐ|h҈$o룳gRϓ\!j^?);v%3zDyqe{Yu?yGu}񙙙+V}ЩIHHHII!F|>ngj߼  "l/*?Xf񔛛48== u D;NN7$W0iޱӓDa@EژiaX@'2{$ g傍pIHH ׾ue3Osϟ6)-P&Ze2JL7PI^fi4Q(N5M\\4/NKKkJK}Y_J iCHNR3mmmD'zxꩌiZJej4ʂ$nSD\NIٝ0y>ɧO>}bq:---Dͤ/\:wn]w4чi$Y3bĈڹsi c-Pɽ':EvTkFmeǻnDHW?I()Q NA"]HH&>>^rIII!&--ȚiiϙU[eU(‰e"nf#n|Dd!"=gN}KIjf4YCԌdq!FRC4 3r {d:埂ZܨۤԲus-5*QC,b;ژ@ r@4(T#)9zg[WW=>xTcf:Jē'e#u |f?Tխ-R Q0>:җpI1bKeƧJq!wܸ[o=̖YZD)&|>PVC¹)$g*>goӗuz<_wt4ɺwƾƜ*guzO&$$_fqqx8^Yk"׺_s|+$J ơJT^(]KAV^](ja43 n]t1gyꌓvfF&PC5$i#5+Lj!O4( Q&+jֵp#)z;2-(! ѣ[KxOx;9K' C'c֬alCSY[uHb}D_u +dhD_qLI@(Aá TfoA\*EWP+Ҫ@!V('hD(o88!E W톅MP {=ް.HEI0RpP4((}p^{G^AZZZZz'NDE2(  zG@yJ]A -N3H}hP1< ` 4C-h0P0t/h $B#`as9DA#bh=\<{EA@)"uoA_B)@zQ(; AS+h]  t.h zFEwo @ź'A!:3<A˭_)Nj$' $gQc &Fm۶\Rrs|oYӦֻ9tŋ_s-]]V0ڕFuɁh>޾j룠\.Wooϒ $KIA_~ g#nXL&wwo0$$455=+n@!+Nƙ3']?p$DHӒ~[o?2KP<~.[l„ ?񏥿csrz{z!)>tm˗.VQZTaJDߢ8<---w>xPOO9dƓI{ ߪg<50l+@dE٦W^ye $$ U݌f8˭HKP&%Ktt:u0Mcǎ8F\^ )h ,a%R۷? BKN߸q/vj'ۼ? )ouis C Ԕ˗/ I|饧7mKd5t*RQ"[lJ,,lxhJbyd_@t:{{{/_njnn5j|__daɝN566%Ѽ[h#3fz%h`XCO6L4I4Et}1% _Q6E;6s|۽fYRxq (ZSEClXqf*/2[J*kHg[mtKI 0IBbYWj.&NRFqp8g&dA E 7%OYBawZ73/"鼼m۶)!~uV%|gΜ7nZss3j!p-qh5(CU"Mzz /t:}6=r\\\|<9c:T8`"hzر)S 2A&'Q4 2nܸ|;(h *%Ԥ O< Й\͏]3AxrzI84M  R΄H 롁oxt A Nйa 4" 4нqř3gO0ʶkgMd!gVQ7|W}k]w]RR.qqq H&!!.\c93fLoѩ$ZVj!;~u&*=oPo~~}w ;)6I;}ջy{Da #\}cJ_WY%C>gĉU]jKK Q3DӐUnjj:~r{/)c3G&S$ѢVЄT_YVyS_8 "?4d).xduiATSij%tj60\TJgjPe?4e zȏ,U8YrSN]p̙3s:q @4M||x|3D ⏝u?>&j=V&x\'+y. b[Z+UOζV>mC6s )y'k?Y8Nrwy:!kxdMGyȮ4}==]M{?k hk'Ѽ6哢a|c:GIЗ"U:~;Q#@E#>ycʩh UZHCH]B_x?Um%1Sj[M}v>H^jTRο<2mTU[=| ^e#lA agJOJ*DJD}3)!m*vֳL|Ȇ@ɑ4ոL |G]{uG* n,(Ә QI8N"kԂF4R=WU4keۦckW_U0kuD J):SJ fB4^#sJuB+G~SYaz:6"4M)&oCy-1!AKǿ{, h62kߪhI&N7]4bUo8w#eQ1R $#z.\l\&08v]^8~5 ML&!{5d.XIHH쌏Ofn 9*[ WiF;{6]_[V-V8h0tg} _ e˿:>uQ{gscM$?΋]guΚ5zK'ϑhZ{WsNhV|jΞ={0-4aDC=FhۊrKJ l_twE޶!e]1/D*Gk߰JkVW>|%"i3ݵo]HyLU}/Pqw؁jQxV{537=4Ϗuuuo߾Cԧ?<<ٍZ&ޭ߿*kkU~#0hneSL:;!$ =yqqqbb"7gBvTT9);!-ߙ'oC]l=7IU=)5sw$ϩSVVVΝ;7l(Z_}r7g kՖ;(ZH`hrudᲾ?K7nS;Vz<z rd8Uf>0ClLK~SؼA֕ZJק2N+TO,; ]\EۮFvQoBiUى@A=%TQ\ h zl3$1~+)E<`q:hhܻwϬ*T*U*/<29<,7a)aU͞ìG{B===mf;Hg,-5XBͱNf ogϞ=BV4* L> X@1UHS"@"˓qyΒN ی3F,Όȷb(n2\"lupDb[ll:nR%Xʮy"(JADFF榦:-ތhg4饏/|}Og??]ƞ4eiQtMclo2F7$_oקCښap@ًCpS>uQsտɒ4u],Z뮿֒IsM}3b3F.2&* d{B/OFLN&%אJY?'K$)&h(X/ ˶Xb2ɘ4]a@h2T5N 藠 EP#}:;ݺ{uYGYk뇾=c'MU`q̥2Y'w{6n/TX{L;hY|EuH)S6 a4kW1^l)-^$>sFNJH+9+iF !e#ΗۇĆlHG:kRS'dx %VL9v묡^6F]Ԭ{P\FV~\9u1 u)i ^-5sۈh"\>zxue z:V$MWvM#wVzDG, -hLKʲA͗E_;f(!1忔cVnm v_j ybqCd%lus(s0253ѯO:&^O6?L3~#ڤ*>~Qsw^ _B+7Y,Cx,"#FxbQ,k"MO`Y[52h~v~,=zX+z[\iİJK-ر? c͝nH P67eLw5Px]/*Þ= IɿvG!ߕͱa#J<%Cd~YReHps׌ڭyȗI^uKϬׯgLwëcM*qX\ΈT4#gkd~;;ƣg$Vq!gqGJPy20DʝdA:>`Y^]#+DBɡc8b ԇ "RySc~WB={QCH=jAc I?F$fn.yʜ ;ے,͹o}3֐XD*YгÄ6I搌ݩϒJ8]aމ# aIw\|wvv RYDEZ42 %Lq1eIe3riOh/V΍u]W#SnDDuiMdۨ?xVL}C%-u-!9ߣ5T[g!E2nܒ"W=<݉ͿYG!$ %c&ihA+Vطhdݢ;d~p4CtCUU"҉.wCi:Ϛ=),CBq?bH4ͧ<͋%n2`t }a5cb6C m%OGF"ᓖM-;!i8w{d7L%{f7NȘT`slc& 0_gߨ c2ya `-TVwѓF;3> a,wߓ;^ʰ ?c>/F  q@׻,"IdBAf4 5'+4zeHC_ssXyqa1_a{@8:R]]u.rd8pFnҲ6*<-ܻzUN'?xWqƏ{>s?(9sCϞ.8yhμ xN3\qIVmLzI3%1 ~=͟0 h̾7) ɳ)'.Y\rYDA@MvN)dq]HaƇ!מ/*qi+ĉmNKʎ4}J7 ˉ[@Ø8#U9:ynJf+ϴ71k_w]bo͹/wMf[Բ_KQ67sCǍ%ibO&ndXޛLo$M4ݝAͧaK ),cTXOؐ4Oקq"Eє6KgА)$0$ !!kN% dO!)P\uz_7+Hdw j[ V4iί:::lppՓ}d1g?R_,y:۹B4;> }WeuO1z2ˡ[(8 yqqh#6>?bְeQ:<,Z KN5NoBWTȼ4#4 zrp:4F#ƞл`ךSgtr&E,c,oȟMTX22ٝ3br-Yw=;;rqh'Szq5Эw Wж [o8DױǪ/M/cOF3; 2)+>XKH/{y,c.4-ÀUEe:vdOz̚ЖOseJn)YɲұIƤ_[c/R4,\v{;MCzmohhꔷNlcɻ#qY?U67Κv')-q|2ѧ74b ةkG9.a.Qh;ȝǒ9؝ݺ"q*}*)s9},͚%1+&ѭL˨`3Zա%%/ĕ1kޮ[; ;V$hw9m>>niCQI]3nO1_&aNm.U+_eh s/saV.fgL䐸ٝ<}V3y{鏬"HɷߟH=;녴Fq &򇮳8tJ2"]Ĕ1;&[WsƬAIWd\o,ΔIJ6PBd."%'2YՎߵnk2)>}^|'m[1v"ɦc|,s+芾E&r9ʧ*dRsa^8){}bKXeWE$e2eUlT9Wn^YvR]|%Wtc֕J,1={-+oUFK^3Ż+++/}mlJf)|\.*Ux=$9%}ҁ1o+sۏ}.$͊կUVQT^|v$a\>lNNL*Q]YVȥSE,X>}ߛ%sٲ];y F>Iٟ*r5IgV/_$&ZկUur lo'KJ͘zduIl2ߡe>wovcUf1Pǯ.}ǤgJ.[?=j=׽^4j,wL.Ǚ/#Ϋ`v0)~?-y*4?S;ͧY3ϴ]XܳW>vҜQҝ'9F5HYA)c*;Ğz#W;DߗE_{2#_9o/T{x{OMۿ3C}0x\RIӕ{֛DL^?ي;"q2qˆ~?hf쩗lj-HmlBl_{rpO\#[&.$:UlF[Rr gWg"n4w*|#McccϗO/Y"޴2:/TAAAx BAS4 hX}~Q![bӴ D-F:&***&&ΡD)a`:M:EeiӀp]b !)###32kr)¼<;rH:> 7ޯ>Y_W}wД)~ϾǏojj"W|OaРAڂͤ j,ƆnO#G666^p!00tEEEӦM4?00 <<\P^X FNo F..\~\;Z3R!'~_LJkxҕoswNf:L*邼 N ?9вP?~?+?>>^j/^kvm)TzM6%6lРAǎ5je͵ɜ)h6tܛU0]OU t˞;G{\zܹs3^zF t/-Ԫ*HM+RKuxii֚`L(q777@ZqH:%<<(%&}E[\BSG{8KC6&ɅȚϖƐq~ώ6{?  X]1|LZlon6м6QgϞ%-?d'&&ѣG}N=ѣO8AS#DʚJmU._4Meku-Z`}},q0=xC3f#0'=ȍ+WR$];]LNeLp`dNFU:s :{7nǃ>-RH'p>ϧ=7C 5 8p?_2@|F>$ R2um2VYePwq$/At~YwR#ئiJ^Qqx̩S ?1!=oӦM󳳣%hZw1|coύ+6F~9{LFw8!7>>|Jںu+KEwͧS "])43f c7 @7HӮgJ$MD(#:Ɩ`W-}.#SIjߩ3,7po~qX2$hd;j'!KJJRSS&O} 6tPT01;HV\\L:c?=#r킠橤F]効s߈? !C)_[V̜%^o~z!"\NԝӧOV!\"ɥ'? ijh"4_ߐVȫiCҡvtt7'M,#J*}=Ǚ jN$_~9曇w hhkq[NWءCW]ŵVK~qg4swwYD4M6mxH}>H)oj7u]ׯٳg'*hH%YԿ҇);! dBe@;5կ~囬:0WTroZoR~a= U23G۲F( ;ydqq1O1~xzXݳc:yjץ/o$;8`r. טi_BBBnƝ;wna_4УG.))!%5Ɵ]@+ȥ?~<ަLtk⢂ G*1?^9@4&/}p} F4m}u>bߜy|`rUo5Ci uҶn`k7zrوvc?{.887v_Da;F;?vӸ󍺆Cp<:\]YKd4e|2:FH͐!CHG$N(bJΪYvIXh0w<9zP]ӓ}4'B6F̽?;vcyωOt? ĝ}k_SdddZZڡCHDBUWWwEϜx杂NEf_{ԩ6#녿pgQ/ѱSDAj!qٵToW?L/sl}_aI~xՑ/] i]Ϩd00z6P!P~W`xt& .Ț(<&F4cccOq \NHKӣZ˯!@d0e7YCr"Fԩ-'44@_Q54}#Gʗ/޾=z֎E+( 1 H:f:2f̩Ccijj:}t`` ۉ s"s8AnnD`Dwtt4lS6寮oB"ip bbb 80:::<<$A ? ٻze˫#DX(ʠLrÇ3 vΜ!RQUל>X DЄei hRG( *kfnc&;[2du|j HK;{UEL"##4!wo3M&?Ɲ*c2,(0(鐐!COqMJea,@yroc^kϞ:}FCLm25NpkZ[[y.acc޽{FTW\2 &AAAICC#xzB'`w'_zC?<gV.C#zB0.47}/yl FXR\ƥFÕiW4&gΜinnnmm%>aaaÆ 4.{"b9?zh"eXmll$ȝk@;Mii &2dHqq1Qǩ%5T4i!kb,4I&GM%ㄉ` U]@b m4R|Ɨ4&A&rC:u DؐΟ3q_$*g~ⷉV1eNMe<Cj4fQ餪TG|W<)8"b eFmlv6ؚuA#)~iU[ /¸ OdgQV%$UHVד.L'\rO"l QBw}a4wzJ0sS6Yĉ ? E,a.$uҏ:t`0ŋ_-"# mR2\l\N'\]e˖|rWgYǏR8Y^]Ef  Zl9 a7K/7Ǘ)eCs17=fզU顡RQu =.*Hpu/*Uvq4pbV# XM/QYiz=Ы444Rw5kk={Oڸq# !G7nWL(t6:,c PǪnɸi1ٛ`M㥠Yv[u˓XD6[~qKT9Fẖ޲ߓςsʢ9TYVmj)!bEE\D$$єi,雚/46'-cY5Z]㪳shS0RoM4J iZ*(ksKJJՖ~<(%99D@> ?7${3?EdTWCgk,œ$^F4@Fl}."_5,Q3K9Ga!s$3y L!`f >ĵa&0n+LI &SCNZ٠a64x\>!Z$%{#C\ B,hxm>\+;=!/v[!R˨ 9qׂPc5090$Gr23i2YFN\ -ԉOYPaPm4oj,2Z4W:;W(qaW4DlfV[v"n EcRcL0m*ht2xy,㏉? a5_$ީ`7CZ %+ErB8M-}-<pnI7P-b 9C:r?/1hZs+b2N[.сtsj 3"霮GB(;̴j5/Ѻb.a 9ɗfƬV9CRͅK jiMVN7hll$j&66600W?unJi}⠚DsraeR&7L+[mL6p6t Q$pʣ:! je{JrȸjV`L%V~@\472L&WO^I_s&K#p! 7ԩnJ, ~RC4_"fCzKÆ&9ĉ͍sj&9y4MyY@\FBn4\`=c?ڹ2Spˬ{qVN CTcx"%((w{i l--?T8;ph<1 )m;\{KMOnjXɸFLXx6֝ |7o,IՁ'qDͬG{j YZiFr1 LƚfK֒eDKכ To o<9PϘ!VTmSZZ %/<-ctuM(\Vj=`T;%j.{/'hZMGVTZ}NpFe)A R7?']p_)L ru#dnX$v{Z8>JQ`AHNNUZzg'%)h+Kzs'/1 oYSr~u*'5?/KW՟&Kf +伧V<\ɼ=W^8ǿ\pɹƞ8FJOiZ,/*:)Iz^\ճd疌IQJVOZ%O\%WO=9V(CK!|jŰ-yz5WK^0悙$cIU,.`HJy^#|S4=+kl./ɷ>(hJwXsr,sƺ:`1k֔d29Uɺk 8Omo6&Pw>9/s`˼'7e͚X@HVm!ܸoi-L2ۺo̧)v޼i^[ ʓ-OM.۲IS};ƺ<-Ɏd+Kh/1Le>L; w?a&nln=&q>'Ý3N㜱Νh.@9w2[ ʞx-\/){mr՚Ԝa yk>]6c))-cʶLYC98'ilW򂲹߹wn-`羝hM!񠲞/MӣFmjlW_J9Z/4fl1x[ge_y cRnr`/,y4y|Dk˷8zt_>>y!M4-p&oyk'1s%[J>>g‹eV&WN2mnj \YrS7-|бa|[ԏu붱s$lyyرħl۶rs,ıcIPK\..!i\fۋ/ncllˌ}|ևo~̶ԒV=d:))K>%/r"[_,U*de=]y0@wLޮ2&&Uݩ~gS!>4hР%GWX"9 [rXwn[2c+3z}{,q۶ǖ'JeAۤ؛+2f9cΜ㡭$@9L93gVuvEXR3gN9!'5§/~i??|w ?s݈@M;qD|||KK+q? o8pD#?qBOڒǡ]瞻jΜ9)e/AMͺaCh<^JߟL!˫#4Jd2) '{UGHuw={8+G{GW+˗K\;2)"22(("XSpd0F ҏOEH,NcCn]Kĸ+LӅϞC4}Sp 2F6U-h הSE/T; ɔh/uI)þ8Sۋ&袱}QʃQh m>_3{͑^[Zҹk> \鐖Q_*Uq^8/A`MͺaCpxm\t(uB'3K3/dM?ySl4}\8qDM/^1--[ME3pMDpod|GǪqh8p*QY%ዺ')X"SxQ';TW7`'Ǽ>Ո 5|.[2[2NЍ|cO63մ ~aw%Aͽjlgq" vgҨa3$|v?k_(' v<Qhzn%-1)28GhQ>aun&e]C䨊Yˮc>L$GhY \b0yBI0,S.{qOJYB$'[ppY#;B\kZ/6{a:8m~'WձsӒiD*sT0sѭ k 3C.h.<ʃKYW47=44Wjn5a{TǼ7'G2-Z&E!K ]>"KTڸ4p$M2vvք-]VZA֒th.*YC\5.9>geݹ.65ɍ`s_$Wӻ`[ҩu#rV4gۣX4bĀJCq}[m$ 5f}wz jɩ\omE]^[4s 64yDz_,#ϙg,Uw}iɦ/:w8^1^, H7ņq4]4Y\Q={7D1t;f_HxꖌhQ:cc'nGV.v>g/RIlW2 0tbW9<(l HLqIȕ8%qå@t?QM<:)D["R'O7[iVQcx>sg))Xe(MHMoEACƳ)#?҉fP|/㖦l0)Ve[:URU{~e8UL"'nKXEE47daI!?4E#>))VCD.k@LJ W&El oe+{ xM< W9sK4rWJ󇍑3 9vhg|~|z]4"[0uɼp ]lwq32,MoNҕ>*r=(xd7)pTuXբ|H As4֊K17 EsEO(:m0'QlTp!<u=6{y:dᡊ@'h6X ?DX8FR=0w-xw\\E 0srY4-uI7wUp#&CJPt9nƪUqß%uC,* 'i2^8671Ї ߣy}}(3RQl5mBw>*iG.qx ڑ5ih%.EEMv6JI57lNQ>wb:r[Mr|,B۵t tC8aS+.:š3)?z!h9tPJPa1MиHp!4Y[jé2K#Cj-bKYsqLM]>F2HvUee̼ |Hº!RE9[e lyWQ12QrpHu*qמfǕ2hv̎Gi m ٬ )|Y#ms;dbӤ߶)\P'@."ߌ w%:z >R)PMyJysHE*6>^9i}-Kō1bii5ɞpME#]7xN׭D3u^m LUss/q'hظd_(&`RRκz*0Of᧪-۹a&(hC2GrѳgJu}Aѡi AWMMphǝXNctٻw5k\|lމ5Oɤ+/N>-.1{a.ctٳgϟ7 $lhmRRO;r^pۭۭ1` WݣiyGǍimI Q5*ݕ̝^1L&Pp#NYј.5+>55/i~G^Azxb9i+GJP3>dj'i4&3M..jIdYjbp\i99nRuULT gKdqH`.ݾܒېyJQaRHMM/|Oގ@v@@ e,vEUEER9ܔ+i,.|o|Wk׮u(6M)"+^iݻ|7z#cSѪ| +V\uUEKDMinz(E08x{/ M7{/|zn5S*ECa5dM#Lk3&&Dw^m2$$ćN&VaDbr)Md '/mpEo#eA)R4?=4edҌUɽa628))ٝKB3))Ve It&STG3yjPlh`ih@42 EEEp^D./M'526$Rl0^qRXTl(bEa}A,)jܔMm5a8X7qU43_Y)d^b62+I`pVn`ӭcU֐˚0A77Hp@163wSV/{[:񄔔Etp&o|j (҉=qxfVhfu:lhHB]s/cS[ma-0YiY(jMan0R3- FN!h]𳆩yi0% &!sпՌy1 y,BM~La!Yͻ-eVrxer1?E5@MhIJ W'KDkլNKI`&r l@tfZf~"0Pͧ!8ml ]M:xdJ:K&V+zĿ½}MsÚ:Ѕ-&1j~*Bb,Z)wa*4wI&Tgϥ_BkHD4 8!i+er9wǪףYV,kr Nw A2Rv#r_@T޽@GUߓy  T$D .Y]>k=tiob69Lꢇz}-&cc>*$ ~~̞dB^8ISP㪉靘jZ2za =iԿX7Jb-h V2` 4#u3yVfW?oغb-pTQ,H~YTf T,j\CRK$(q@SQ%|V+EA8X8±L3(M?DF̘1V{:PCyz5_/e֕ɷXeZD^ E6/(˭)[2 49S~o[]$ ؅^=B/1S S\\:l)/iCG,9c9y%ˠZ! Xnqkpm?/RߟyEۊ <@cKxMT]cC8Js,W=! u2 J`J+e RMEKwC8 +$s'@eeKP:J\M-A~:Η|żL3m\;wai 4Jo^ U;<,G: e%sD +@(~} Q!~{4wXjV2S}"6BM(Tl~hn])udLz{Kn `Ei4rp1h-'D$]'h?)M2:[ƁʂHyym,b=TRy1H}6֭d?7ikyymQ]B!eı t襈ΉT Mq,Rѯܩ1sHP9H$~~ͧ%Ǣ|'jLrl x#22o~d1ѭ[ؿaJ!Cƻz3PR<_V>\[Id2ZIZϴhyȩRҿܦVglBenB2(#GPlKCaĘ#zqbHY_Vl OFѬDҢ9}{0=KV cJo^6k6)3͍~ HPA'ԗj[;ODsHI'M&VoçEꮑ!zƷwo|f˔#]q~:$O Vh33͋9̉(q a>8 ` 4mmm4P{O`(`"zwi~!2 s˧ddd$߼oG@dF|k^0c#Uv(ʫ3zOf &?7Tk>_4}kGrSJf䨷zXGci7/pIyoCaINDϚJ=5 =2~]KGKKyӧMq % 4M0Za4FnZ0n8 ߽-SƎ`Ѳ~'_>#O)`{q>?-oIUYm`ܩ'">7mQqȹUؽdJn"Cewii!O+$h4neٽdzykJr>FӨQh8}-PV]ڄTFFmdviĩ??zеi DoaSǧy\-25Rwa[; |:* /W#A0FǼ̥>ak=LK\ U\ϋmm$n~hؿ7:C]gOۺomy%]8/Ǭ>Pj=ŨqG)UFR\-kP_cl46VW ;,bko?e~6Kjme K84} .wmU0~DnmcˈH)駱yו\z|i`M}6T[6r )KOPX}5o4&ϴHyym,୶Z-V;~14PGB/%Huc;rm޷U#J~>-[1]G✗Gƞo]:`̯~'##'}D4 0XǮZS'"AӰI+rp%bze|$D7 5 xl(=;6KHbJ2q+OL3@7׼yx' GkDF]ư58uyFb2  ,|:.䮊Pyy$T Ry6c9BѺ:mgfIK[i2}\k֏R҈yIfǺޙ<+a뫟7lc n1sEݯO^*בP>V|=~8MàҳOTF=ζb:WPs|B'%Hyy(y]c*C+[],=h+Gۑ%=WA6¼פ%mG oa>GqG6w +Os8Wof7w׻xWZx}XK 9±RnLuSn^1,i6Trؗ? hLP54of\s˞{-t6Km~nGjâ0NL{4&nGKÔK=c&@㼚BMb<Eeoбi?@gXو4kW8/R\*^XTz10^cfL i)59 9/sO^h:~юƜ)KusyE B-kߊ`a:ri\#RWEQj|c<ľB}? H1C.$,Q.d>(AA|H00_}3ؕe? n-GߑGjo6Ii [l>a$k!̧Inڹ LSQwQ9{SzIuv=Sb '|V6(%>+c]վ_#OYZLZcۨRvvp\VYo$vb-ԄBq>W (@W͋2Xr^pܭo\1oa{o\]DG􂘟e)C@J?UC"תV-YvH#WG@oзp?۳߱HO3lg_\0m֑p?o?x4/Rmu=1uX+O+퓄:2>_~\14$AvLKZomD zQ޶׳y!ɵ @:Fdd©c[>[קÔB=*Ҙt|U?Yo\5:?B H|1֑+%o~8$H7PيH~ !YmӻD7>=J>KYY~(o? r>I[;hTZ4#GԳ/wƢx@h/tӄB@ `wٙ5:'ѣ^xa@^G<5[ԴOyfޛ:u(+aݵ׮SSw]>|ڵ1Z|i~?Lޞ12;;pu.*0a}Hye2kAymb5>lٲe]H) ?klD Vn=׾qͫG.n4Kg? /PRRb.9ޞ1:'';+˗!~u =?Y8㣮nٲe'OؿG.˛2eJ[[hZ۔O={Zǔݏ/[ng eH\/ytףKWYxɿ-rU~W|p~o۶>/{n?5^ޗbߦ8F";!&٣8 J/8zرvvvL!n̜9ԩ766Y[dH$szC/ycղw+^[=|9?|M-ŏ1aR_úeW/K^_'oӤ? %+.bDX l*HY4Z)Ib_yy$PVV *e~VЗFmBrA@2+ʗWH+p@^V\+~c2k\0 Q)5Y&=? ٳKdd5u(UzeNJy_/76Iy4[m%~H=G)/gшdkkSP4ӈ# ß~޽{̙&reNenyr$W_bw侹kvιGbֿ/EQ9*QYYYTT?YQ2s;k֬`zi9f @ /7LiѣGiyFL3 L'h)ix/2 i4il/-g0iL@ 2 L@455Q!y'\nk{غe`78rԨ~Ձ:tҤIӦMd\y\otuv{^+h-Zl}]qcƞpO>|xku Ԫ[v'O9rD3g SF? .`vxW=?}֧mǟ|6m1bĉN*nDQf-/}Ky짩_\5(WZbs]Yvl0m+4on=>=E;)|jw;1>Fg_jM^2+7įpx+ꫯF)KfffFFirrrDXy5F~]\_rL^>K/L*޷ͭ_c]zME֫%ZÕ%[$ԂC@DϜYmm]⟸!~NgwG*EkįsC ۳4ԯY&wF())j+)5TWW=\5D&.\(]_""^zPNFkSӼ?1kmm⟸!~X3]vݝ&;;= E2MǹƣwJšr-4on4jܹ^hۺ$7AN=[6Q{LD{I>Q+A`?븖X\Gqh>ojܳ ,^/^Һ'u$(u>ȝt{iK#z>Շ浓>>X?ML er:Osm Mf^^Tc{⟸!~Ȓq9=ztȑƍF$C =|g Wߊz{2$lGXQۥ~q⚯ Q֛SPl^]ERzDKEbBoHn$ȹ~0綮UlRXEj17"G,qfC(\<f;R#Ijφg-jgQF1jxۖ$'߃J!\m[S^X,?=wR&ƳXWШ{,=~`{^Skz I^ kvk;MzOB.E@Z3~Y&OWWxwtt۝ KFRMTq(Y?;̧q4˅zτ|7V҇ ѕorWGIvY_\4& [Ue޸K;=)gt{8-s=D=楹C|tD]MiٞJ[]'Ni?\%?-m6֏R]W=yꮒa^II'N^zePV$05'ݺ&igk/2OBJUW-9ӨF]'7/ҚnճvQۆ7}?qz_Dh^J8eH|MNִ#g2)YBng+ɗd&nǠ>^`Ƶֹ#BI`j@ShtUٌz,)TQPUeR5-hiG9Ӡ\V2IΥv=creֲh1'NPٞ>ﭗ=.=IJFyTY#Paʉ,%o.Yzw}^Rn7:cFfSUs6{cDJ\9*$O2uĺݬ'ǹ^He_WGtX:7$FѴ=n8dioc]SНe'NX]3~Q_L/= mG%&&zm>偖 'g9F>#;f0>+'DX+U1M]Fʉ6M)PҪ2ɼ.2ybb*ؔvv.) q?qGf-꺫>_Za5/!bF!C./>o+ՐWes˼Fv6Dǥ6M' _O(xl֙Վ}EBScĮN' pԗMO?^7Ma$﬛oyah[d9Gh;KR*^<@<{^_k^'a[!32t #)ܣHϖNq}= "9W-[w[!C.ħkR2`އ(ƿnr#(&-i)+D1e>aE2̝:RB5ᇙz[!*~m~/[Ob!s y|_^y^_YT:Ց0LwZuCSi`o?B-3S?b23'rQe9\T"k&%\| .*&S<5UbO@:5CVA (0<|DiHzy^=삂D|\jWhӪO_ XI#e2E8|Q]N:Գ5n'>o"wl?hd~vcV_|a 3LqLvkKQJҿ zAO""=oϿsh/~޾o/U9ou;<3!P >J{FvT FcYftK.f[{oE#e 6]Yd1idڊ*K.ЩSԽƱdt4awNTB-ե=5Do/Hģo{ ]{ :u=.e-3t-3xޢ#&@OY#o4s֬ _pз+0#__+F{a57L`&\3&//Gu`hOLRogdK'9oSSVCSTTY*^b 2,59!991Yo)]S·?6x6I}Bih|$Y#q<:]2ϩw5gd^{M.zvM0߷fѯ?80y%& AY2rsIw]%kwdGu"x.Jؤ MW>vjbljʴNI [bbRzjonn9<˕d쐿d?!DQ#&zy  q9c[[;>f2lvGďj5/>jؾߢG?}ydes{n|f墻 !X.A7go0Z!fof b&7LN70jH"RL*bMad&w3G/uٓ[/c[t>pr?IO~S-QϴEHDO~o{saqͣMώu5 V3' 39Kaw?nS,!O>Z`ɚI.:s|khQ20%ָKH[d0ϞWC>L!>p&70dBEkO2l_SB)Ĕ.={l |7BnMW*B*6MU`ܸq~ᶏҍTԻ+LHL6/ P/9-8f{osk]g߾zBw8Y껺6tqM画yIgB`o޽ߑ>޳O}0< 5Iݺ9eN|$X>Nt2  5ʼng&6)ࠡO]O"RӚo{Ż)_˦$f?]K,d_%&&dkgʑ1 q j.f{7ˌ=ekƐˮm휩W>@lZ>N裏tmmZO2~E qD QQ22@@ hq9=1Hq۬}ڧjxqru՞'1B:*JGS.h[C$poE_A*6q=>"Y*/fbc`aYgrMe,]vu:yr;L+G4/M'{tu҉7qatƗDw$ ~S %ZTY5MC1 W bi pJͧW0m{MHRJIHdGݒ?jHxcR M-+Eלy[7h2fAnN>uLiG6DJ ZgYYL:U.'5t]6آvE]MɺxGG ahQA" Kw6>D.>'7NBP ȯ bW+PAK/m4 [RܸSYq )8ԗ"y;fd8{30m.>0d5f5n+#[42*uRƘvh `4ȭ?Yh^P[Ŭ$g]B* 2F$E6T-;ҿav6&tO q{uƮp:FtخkzL%bpw B*,Ubo\d%'a#0R TkkG34{3p* &Fh] BSK5#Rꡱ=NtMd YRyNjC2OX7ljm/oI}Ub2he -uNȱ_tTWiIu+ܤ_Sq__4DT-(PQSB+6r͍gJ[q٭{GY$ dsʤE\8#FqÏ4T1#tniKG$</pƗJS\tQ߉+JΘuQu,d~qλ2aIa,6ւ>5kjq;$ ^B48Bn=m3*neT6DܼǞnZ|}0}eK+REޑ)g9hqrD`\R4`B&sf5-dޗ1v\I ^/|꒳SQ=àSSS9#wlMW AsTJ !*t \V6AC9%jJ3 e!ӌՠk?tM\(E1X'e o4_Q lE2R%% bKjO+iuagMv[(hcQx>,۠B2#'Ţ%1@[Wzhqkk__lW~1_|]rT6:R &wmjtfVf4^7q=*q㛴g^mMv^dy0VҎg5}^Y8mf5AW,r%Z"n ]_l1[FrMMֵQ-8ndF{]Uf(ݬH)vB]L3[HY mZ v[W; Wش;触G}~džAEzʐ'Z0R_c^oPO aKr4/wڛ{%ZyDTWWM#UU0}Ցut%}w[;$؋eE4}rWEkdžnE~P:Tn.󯾖 јo0y>kE6}퀹&SOZ1D60YcLf.>gUG6NtMOx0!ﮠR&tNڅ!ܵbi<>oU,&duE0k7ܭn>q+].e|M,+Z/;zPnQiP~GBMF] U1]lQSjA[mH;`S.0tV],q=Iu5.ɫ2k/救 s{1L FoHg1{ ,ig!]`3A ~!Ͳ3ωhL̅_alNeAn{ѭIԹ1}02F[iЖanm 0zkRC煅jEE?\Lr䖶8tf`8j# `ZA,NZTvL~GH/UqI?" Aڅ01bڪǷv~©Ne\qoEA w]dʳKU6#b*>!:;X~cThimHj[9/Fo} BN)+<XKST\S;w.ä/k#,,]N$0 )W_ P SelPj_'+(?M(/m0 zڄRb}w,wV5ɁJpGBBq#n'5ʦUw>ppZʠ˰R1B(2!~y;.6>C>IҰ*zac\ Yb9e28hb?2~xW9nG-r;hm @sߞ]!L|glS1rT+*g>vEf)wRfxЦr^ }!!)Oɑ}'"|Yܢ'GGID"Y[DF10H^v[)S(yOô c2R No:[:(7^K.0#jKG:$,IE[d[1nl;VDRz%dt=}mxڠP@Gv)"*0u: SXqH~*-1SmN9֌,h˸ZIB^C&zN),Dqq;+M67ٲ:[d+[1p[ZIճag4nSe/i :(z!/Hdbt"RGRT R(6Q!(tF$t5SD:˲6^(̺YL,[qiZXIճֳlR9e=eEPe|pՇ.WvH_U"`$Qx EQS7*{@k%n\+?_ߴ&fp}߀t?i)gvKYڪT{Ϭ<9Z6C*l?#[؄Q9qnбerJ xCw;q@e1@T@yreIxmZQ/@;2唞2dhIVjo8Te>&H@@x@y6x!<0XtYx#BQ/DFZ=G$;1{ӧOykqmq'w=)6(2 $W&D㠬Ͽdh @h 2  hC MO_(rGrRoicS4+eaKCE,[1+"ijOZO57hwȢ f)2/r!e9f7DS?q+\9V}Ck>y r*Ǿ&{N:yL$%kj6G4W;o~A2ٮwV!`V%ca|<}{UYU6eqW\gWfeS#SM6MuoqܞrkSb*+Mu@:>_LEYQ5y#. m;!ՅsT\ /0UB!B-a r=rӎͯvlTȒ,3ZBWm* 4wf.0=VX d]f+6#Ĕ` SOARH1?l/,`k=:I ..+{vx]d,:zH2ұSnrsX߲ۺwK2mjdMU ib=UnZT\Yɔ7gݐl |Q*9Wb_2UbF__*DySO6d3  [捅dvcOiJ7Lfgl7S6+r6R[]]Cwʴ~0=鷘DY>1Uk'd[adGi7x,TdA 'fec@8sʚ6*"Gw}?/H*6Gl1g/G2%cTB"&뛟X?<*J+ }ѽJn:;q&akiiES`n)ɇm 6F\Ik;c{G:EwOOzϒ5q 8X\X]Op^NX?}s{ Cƛ&Cx8E"巾ËS;9{t Q{Z[G?}fɩlٲ4^5$5 O'O I\bO{틿]VGik&z%Iꑸw}IxD)]:݃{}nwkɻv S e+ gOr>o-6)U>-9cԟ^םػwwsi\o6rGC5))L؈2;3ز5}q//YXXsz:rx-HD6_c(M_Gz{e;cǙSE?-xyҹƬKM]f]&ls4Fi ,F\CȬ-dLņ-6)G@DL6.Tsr|ށq&bVOy{?{?!YG-Rcm%ū^z$G?mc'UZXl"9h[}-bJq/[0+x)G)3Gܹ'O~d3^dV1qR-g:gzu|v f`*WO sz#K5kdn,jվ9]\i(I Z)+J"œ״wF7aWV\Ƣ|GwiEB fù"_UgWCs3=b3:U [n=H甩/SlUDE>{}ᗪlU`G1Q7OcJ˫p\)??_T4tes4e?hEhb'uTS=ϬqV j_?1_Vcj5P/nYJQu\ih(PU0hM"œt􂇊ݥ҂fUh6ճT)ff.W6"Μe| 1ʬٍņ-72_%<EE>usg<##snq+gk)3t?zLfRiAϚY4,hLZzʚ={igSUlHeYZ*ҎS eLYrڬr!:Lh4@UtLOQSgKv.#fda=](W3TsXڇN52(Aܶv53RE5jv|a9eޯDE>~+cݞCҜf̘Q+!;|Eҋ3t_-}WT*Z|쏯TM>$pw2g~t(d Y(yES4WV3kg,t/k)ٕϬ0[U|Jz!Εc힯@{r"fcE^M7 N[ZmH\_ὯE>vKokˮ厽qo-l\gQxY֢)3 bjR=2؃ D)*kH"Nk{,{/dͪ1F5gZfaK^l]N:}t_1*~_QK%=%ƩG$5ckі-L~*`ҺES8o|N;tǾo=z7}y?W#|׶fN9=2_Z*p~ɷe=6)oo2l2K<9͟.L" xy̲IWgKIW41 TL7 RikEQKβG)1G橷"JJ]wZMK'K=|+-L/ϫEoVOER.^g勉KlErD %d͸S}<ǏTƞ:y?8+7s,ndY^xu_m4yloNV@CWWҌ#|Wl+&6 Oirke݇9c+y9cf7ZV,SE7=Yrz-m⣗z|K6"h:|ijk~f;6_衃'GOs⟟6j8;Ǘgox*N#3Ǘ5 IF݂Dmmߵ%%%; 9_*Ѷ1['2ޓ&>?_[{/ms9^ B!KOĦlB*Ӿ H7%ːg]LD9hNE?ǵT<ÞSnҤ{,?0h 9sgeexᅬvɓ'w5Ǜڿg:;FvC8u*gR;@"{vG>}99zqfwcL2=$fih4MKPYL, D9TE4*%##  ~eT% f屺zɒBqZsՕ"1KfР]KgU)/С_xݙhKP!ee9KJr բP(E eeՂœ29KvQ/PنG9}Œ}'u7) .6n^tO̧V@x4:?M2>R-F]&1a(_1|( 44|ƌwĈDP{%SRp涄Wč $eL :dWuţ D-K $dP+`q%2g4$]yiBI 999 D9E>vٳ'>IJhR|xϫL+\]"b _@;Mߩ[)kUܸk3 %,ځzg彣p pl]mjj|=?ZTdDOU+>E=)ּٍP㫓/YBŋ_XAGM##XD05]bɺJ^(kh9e'E>xܫ4eY{a99Z㭶8{蟖_,[cȔuu).axZe4Gd:"x+aF*"H?m _Y9]9yv۲}[ ve.%47PdJN_4z fWՁ>;aA` OX7nMeӝQJU 'i ~5Re2'7Cذ6$r_[T'_:1Y%Ow ǾrO7-xQCh^V "~/xdtN"Y%.)*%ؽkGޤᄑSct(0 NT/#DGyѾC~8f%9c=&~ 74 V86x}jx(DIu(bDD QQ22@@ ee((DD QQ222@@ ee((DD QQ22@@ ee(((DD QQ22@@ ee((DD QQ222@@ ee((D@Iǜkт / ee((DD p&D LJ?꫆JVp !e@)蠫DI{~~Ӎ/ (b̎Ͽzeި)+SOc)5yx =ߜ<ףGwG8G.gdd'??q)9g|ަ3?}/ZD{!gN?;>}1=+w_/luإsw\2}=ڢ,jWTJ[3npkV̡4d}OIӧI n" n{E+S+*~H0ѥbW-V]wj ,|;\Dz].emZjCNڃ䢓_{!ӣ 9t~eu #װA,VXХK RSkkkބDۧ$t$u|fN#~t]mmFff`|f,fVnZZa?+d-ZX ~ҍSe-ZW 3\[Wǔ/(gTG"U#Lf f}iדo4Z/BO(иjoP8`B[&!X'2)2<\ǣg^^|\bbR>}&.xBt6xZ[$#6ߩ.bK!{N//)'1qjjje&kZ>Me-fڴȴ̌{wğN霦"/n?ildF ꇸqcT0YBnLCAk/bYBhC,V ae.]WUU_ =x9{  FjdkB[:mj&\ꫵT8k_}F'33v ϳ;Aլ[|_SS &:G?}k/̒''ɳUQ'l.}؞Jnٹs&MyLceOh넸ܩ=V>*HHv5I2HisalyBB)k0BL@>__K_YYIj\eE:_E4xHRR122yq,TFf~~i7u 2А fL^$l~o›͘ZF& ym>/ O_؄bQ&/3~xWHuI_>jsȘ1cL>4kv~mj6eMC/*m37~fR,M:62w!tz}gйs爏<`@,qѺ]Fyx` S=%w hN_hA @GA+ʂ._4`rEϿ02Fa[g"35_4 lmWrr2D&z?ЋU)⇋.HS,NJ7Bb׮DZ|}s s%+rwq6Mդ S8n+>9zl .ɻ hRadC;DB QQ22@@ ee‹/Z6g?C+@2wݥc1)fy^>&D:}o6W_}sHs4Kq9=JnG*F؞ضU6bC2a!6lo[ktD?MsQo$`px+*=NkuęGɺ=^khpd\,)8d=֯OxّC]7[\QQ̊'O 3; E٨xNk}훂QkWN=ve4؋yNwq^9@A4.t:  _"}B iY`\RzWf^5],i7#I)jTAz Ui1!HO|SWH26l1 H«:WA54M3=?' /J[=ߎ5hӫM42ϗ]'2E3\.24n3N^VgҐ Py;൓kL|b?/|MSYmEˣ9hʛMmI4Q%vb'E)jd%2<#{' mxXbX(3!A \m:#"]$rit, .'N47*U}pa^WO"ܥm8ğRyFdyڬ-D}= ߓE[6vvTA58kDYCSSSNec2nr$e?U& Ogf0?E)yP[Ud?Mw!+edX*PdMEknۨZFv;-A,dw6jtk`wf`C1},}bB7OhqRR5N9$CW1w*${HGmlI1b6UWL a@S%;w.äi|YSfE[ψ7穁hʯ6HQ\nhPr4dG(fVtM6[ܙJ%N8X`Sb\N7Po45UuvUq&ȲꢮTbrg>JqܛedOs3~xW/}GNJJ"v^/>ϬoPN5t:SWx;@U@M`֔wSWԩA444D:t Ҝty-N_uVS\8 /R+[Eܿ*\cE ƺ OL7y7E.VD e@[}nysd_2[rr-2`jq!ʘČSN͞􅃔66ySʕw0Gº9bS`P;笸浅YרGe@&_defL9=Y cSe-߱vZ&vAծv-g:<|lZϗ Qx"ęOZsof¢'?kkj2.ZL[#Zcǂ%j`NKEEroXX.}._\Ȩ]?PꫵS֬[xSW{ߛY["DxpO_0L[3Y䩫|uOSS~utNK٧y{֭L 4?xIǽ3׻ݼlju(< Op^{ʝ2 2$(.]8qb5:t(DׯߦM233;GNeӦM @9xe.9Ey0h͛S<%ҽG=APe <x!yghg+*o{܂@ <xxp}͠ ۟XJA<xXYA9"w<2 x<} ge4x<@x9}P</ x׌BA<xl>{+Ҭee '>$žUfzsxt'͒/ç#o}GfEm6fxlW$=y< 뮐E6{_)ny|<ikqr՟ٹi_Z!Q{g3N3L3d~+1y G{?Em>G>x<2(#"S66{zU)?/o<Apu嗏{ԇoUY?x/ ɶINQ>;ycOގnO>V~yJ*Y0wgL( gT|v,ԇo23ھ^RWT>sWwɵ6&sh6njV4H3u]ߒKOI}&8#<d{?+[yc-|s_]|C{N;[UflY-Qg̐}/*2ΆZ2( 34G69A6OMc9߳|~ji˭oﴫS6ˏ sHTkٺ>0g^(cLz<1ؕ_Ew|EO-7]va@k=XԉnQ;߰/WS^#xx@gg[ 9kǵnd }oW~Wmtq{O[msHT=姧[ ?,ԟȞ*lG~EwC?>Erpmנn%"VceݭyZTqګS۵&\}?qgȱMt>f9/_iUmʮs ҬGxx<ປu7Zzz{ Ǐo(yW:^okzfZ]s>N~ii}FFiy!M.i)y s^|}.VxЏ#~uJcLR靏mB'bo ^(:Y?|f۷Ǡ؜1Wfꛓnsb}Mճ z|~z s Bjf>3A<@y<̓O$3<2dX/;T7nPuXՖSvV[NqAU|aDL, #g̅2'3Tu۾Y>Py1)_I߶! cq/h퇍!tly]?]vGL!1zOV{cF4B9:x[=@pcH?cCի:.Z?o3FbC%L`Oj5i?q$* Tu۾EO|MnmSeqgp 6֋;\iV.xur=<ܗ^:?INfcG5*Ϟ}=vySW^3`áz-=]M՟귙6@6KT`m _wy ӫEnM!)[ 8=[m~^#}{#Zmv8}{}p4+>])Df^2էjjWiØ8Ʈxs txr{@23yΐssjmX_TͼEE}\e+e2Aed?ʽ_S'۬}^}<@wy@ǦKp׾O+[ JTgewΓZS>eeofʴw.+ny=ZA<dg?.K/PBye+^P{>wUj;8 O+-*Q-߽5w>bQȶ}<@9)2yvH\ ,x2x _n Q?xC CGk@ yQٹ½GdgۓMe2nTE󣾀[:Yʰ0|@ldEUnDju O(1 X@xHe- <2NȞeg6cXm'r#ڙүmG{4 vri 84 }e &BtN߀ M$ 54bw+qc <]P,x|iB{A7mtB ] :>S*6lJԀO=o› w״fu\Cf: VtQP ] "FK<T0<2'NkXm n A ̛H<3a-I;%XA% >;(4AYA_&)!g>~H{qZ}PqsC}mؘ$̢յ٦6ql `ƌ`@[@*o8Ab_7#V糗j}3.hƨۖV*d!zi-Tldž(xPd?_tU ࢶp@>Ь.>6=I-:a|]@wxSP+^p2o8A7C?umfnV`"@6nn2Ҿ;l oOhy0fk х >tt v6uv_jLA xz66{^b:E@+֌N` vwWϷEk=l_˱XI/d㝫.;]t!0: >FVUzFK UydNlvd"D:e0gZ[fik~^庹)dUOyϔs.n}Ck9{<`mO2߾_T=~P Orw 6й66[ֶt5`mߤ zQYhq8x ]tKwZ /` 9}@; V ƐA4YD|gc+foF[~jc sK?Z'2n faCO<@Ax`;@+qdk3֦Bu z%@gA1/[`y (p3`.OGNy x 8:H/ A8W @'Ad<{STA$PX< {@Y\ <;ζ2f!#X 2a(*YYz x [óY h@0S)d~x x`O@ŒS-`e @_ N`5dZAz) A<: OUJ ʕ/rQ{Wןz%`,XxtzF@ A\S~P [#Gd]2WeΒ%vVyW^Wm7:|X8!G^]Niy)YYz ] >cѡYѷ(oX`wn۷OVagV-7/?vL[0x7lTuAY\ u,y੧dҥ2kB@^ ef<@(0^ αK xϟo'<\v,Z^n$֖TuHe[*eyPƏVKXx hj4~n>쳾Ssz~Ⱥpeְ  i6YArԺ☺lB]GkMPFgtx Kye]O7O?|պpuAU&t*X.f`Lb^Y:Zd3kh@d sJRKu 9&t!# U@332nK lr >S¶nQV)?{y\Fi{Sk.^l k/,X\vO8|dӋ``FPJOX|340ԟ Xj<[Whs=' \+#hv3>yXAP6f`EWkǃ)  ?0eı'.\\o*M[$ cm۶o ULz!vq$1y"tN`5d箰@(?c xCźkXՍ 6MejIf puj)f~B)Fm"+Vo-?F5wZ:>U }C'[h/UwC2=vzN{ WP?j+y~Zϸۉaϫ6CR h{-g-٦Ϲ.ؔ65۠Y13#UjCNDP 0ηe;֗ɋeu*Kڹ=#f~4dPԽ7zἸcJaPt]Rot2K xڏn[Tu >\&FeӃZOAy eޢ5rσC֖k2cΰ|2z}n^Y޵fP—s9W`cBu֢:~> _K=__2aLmTz̙8!Y|A}K_&[mPڋ( 2QW[.~qÈ|K7lCy+Gpƍ2bfl peA o"Շ Zd lNa0&@gy6U jhd>LzVx$7$$-l~!snȔdq80W#LYYld|ނ@ _-r7n1s1w<3&ky)5>?صWmr-n/>Cp롟#h.lm?P.[ê wkӾN^0C15HOо¶B U=+;fAQsGYOuvcj>4`AElP|~nޛ_pͶ}⫦~4ϩw6k1yǵ'w첌`5 +_ {.'g͕'E]$oy[Ȣ%/@-_]V^coy)58\ʺYdDmL8ۺa>Ws]22#>:]gny{۽df1h. kߘgp뼼a/c^a͖ղ50 zn(8P ږ_Sw<7Xuߵ 8Z5Ю~q<tsniȼz8be}; bL@\XnٲE@oQID 87d-u 4ָۺr$ґqqACYygl(@ w \|nAMo'A02,4 ,Y <ȹ\<Ў: A/#f{7 H@o'S<Ъ: AQ*[ gh  ثļAz;V=Yld\v%)Ed+WAx@yVyWV8<@'A0@pfI=۴i'NNA0 H@o'S<Ъ: A/+fIk;vYhCAx]a@ jx<@;$1^.ZO̒v'H>]]a@N@.xUt'fiXߌKɏw_Fh[ gH (*G~Ps1 =Cy A=NV<;.ٰO̒4#xq9lGf5wo}.UWAA,=%r|0 K+ <=$1^CFpfI FCˍ|X.ߺv}.UWAA,=5I_Itr.AIkiӶ2^|$1^.@, {ypN7N\j#/U7츸hݻW0 YҧޜU}`zNW~w %nݸ鰑N'ar[vRG(cx x A$g@&?6G^.g6\j#}o^aŭ߬}^?Gݩn^A.Y.7n-Yձɶm÷;Xi<*վ>rղpEXC6 1 l[{ٶnЯ x 8y%)]/?wϽsQrTm x}-Z=v[Ge4NևVOխ]W==Vݡc +χiFm"+Vo-?F5wZ:1 /pExEekOfu^w 8۱hYoUTc\'Sձ^>}*XT6ɮޏzޝdBa>rcsx~5hm~f?9h5LNsis!\Ğk91u=\]Nw7XՋfiU :9y}v9sQ_,*gqZj݀%;S?v׫-f=>Q7 /OݿfT͙@B~\(: ߴzFs*oj>ƚszt?0΍o9 <11jskfC?Zu5׀sҪn$1^b]8[GdϞd⬕oT.3?iyrEUm^0^ӏ {lY]ZwL]B6f?Fy7KE6&'ϽE|zؾ6p@ysT!O0؉T7b||* 5S:s})c:(5 pL?.0S辡r}> rsІȵ2f<5nFw^saf߄hߐAA"e r$z粞#*4JRT{k!DEUm4ןk-$c9~\c Urܩwi9N~H_c 3χh.\DnO|&9m<{(%u4ӠK \q2syN`5[*+UcΝ^֜HTT]Fp($}c֎xwqwߘ1q}2fjGq:.:Vo:6V&͔w/]e,2"6C&Lm0rXvYohv%##;?PN`z~ouq3A`inGYo;fg|a IwǺ2gf: 7׿9Zmi[>m]4DsEoy~!s0o>MCRԹhVBiA^ ;wx 38Z /O/gֽȭ2 "A|t̅%(If(-BƚM9ٜ t*; +Y 8`e0FgȜo&*jYz@y7`7;̞=mn &]Nv:H+IApY{۷Ȝ3 UWAA,=%cf(sN9x$@GA;z z,m۬oCAwy$' 7xN`u]46v9I<;~P̒$#vZ;vpWy@yVyWy'WNhZu[t[m$ $axt: AאL m>Vq߾}4(**HY9oxtJj"j!]f}= ʳʻd1ńq]<Н(UQ[ĵIUr ,7<Awf._> Z<: ^ Tԫ $ЭYƍw@wz x W&zyU bހ`wR@N`5%;dR^U +lan]7$1 ثüc)%I֯_/V& "Nju"E̻Dξ[d"S_@:n)V֠JC9b+'.\\o*M[$ cm۶o F.2fc#&cOD(%ܓdӦM!rD~l ψ|˞=*EVYj}E6Y6NFQdܲGs V ~u۸EW߾[>~֍2krYzubk *nK-s!PTՖU:lڏk @Uիz=N1k)0tƯuA0{qkkgBOS5OF\52=Ԯo0`6QNUԶXR_:dl}V_Ef"2}Uof=~G_JdxȆĮ6Y6nqP-Z#<8dm &3 g,'ꆑ@ІJ`U=VS.p 5sM~}]z^]瀌/eY@. ~Lq7tgw 1]wQFEeM=]sA M:Uon@)A3O;w<9o3f+㧀o[C7YKd^]GՍY&L'XY)N&Ac'5eՖ}跎vj-hyo+V(ڱVuq{ǣWsK\ d ko .bg-(_,<yak&A/eaU{ݗ @hq7hM`DE Ob;Vf9r+}d(TaЁ)qҗ1-5}t30|[J'ɞ={}=|gO[2mjyinyNMxX 먺?>ӠЃ=+pph}-5myJq8 i?]k 8kv]pt!00CI; W k\h0"Mr97xcmܰqcBtpGe2/! C@`~;*Gh>;=t`(58\ʺYdDmL8ۺaڽۺTb@-< = |!ێ 7L}!H5 5ƪuBia=G5Q`ȹos ɈzżY$x<&Z}:_>k`7pm_H4fzIr WΐV仓WʏY[2s^sװJߎ3:@5 uZAfD "#"|tCEli;ŸcƎ@)AG=I|DE Q7d]Wo⨽C`k'E(n}\MpΈDgg8o; zY`7WʶYDZf@e~0rW ~u۸EW߾[>~֍2krYzuS蓾!V- k[vejk]omd6NFՀ@Tm{f7lڀ>y"*xn?{iLG<9G\&21dC7N3mLO{<}m5kA@l0$󦐠 7>}=6 P"]e=Tlzf˾ŗr2YѮ0M1GfpM ]a~@0~NL_k## z CA@$wF >rqrYЂ?ҝWj7"TQ$~l~="k\h0"Mr97xcmܰqc$kco7,^{:hdԂ`.d|p/a̠4_7׬ hn7ƅ8@4vAP~& Ck@`"GmwTG g~Q7 e2nTEF9NQY:ylA}VU~}+aUkם}54<WzqLiMzܷΛB5>?صWmr-n/>Cp֭ ͪoYVw2o5akUE{KXe+ö#2!gCcRGDmW!Ooq 2q1e4aVH]%,m-[߆ou ^g=w|6n)wj,XVl*ϾNG'? Q91FݖUϻ?g]Wkǃ, Y/&k,8,#h5~QZDܗSl㠿^ >$k|qYruȈ\{ 0quaٵ{ܹKFFv``K}0]{u=\$oy2MֵzMg c]oڙas2Z5AsK(۪Vuv_su~7n EC[C1choEg?%@iA2~ZA/]+kny/lnUEOmZ#NwϼO!ZSX 6ځ!ډÈT-iX,ekbY"MʠDcGZfۢa>,qn|!(| jx J >=Gv#klG.[I֭=ie÷m̩@6V31셁#h-KX[;%}-G x>qoeiӬo@4('{y<YZei~yqnYz[1`ְYְ``_v`J \o5Q rc\{ ls[92',(^h}<ƾ}_O$rwy6砺o@ Aum۬Dz utzbKgej $(0<@)A`PfV`ce|7dr/ K HPfaxd@t(Y@ `7Sc/ A<ҡfA,oxL t cm}C<f#7ӗ,*2 xeP]T7. ?n <@:j-@%!sA Q[+q0H [cXx=8(@@`v0=<@zyzy],k^#nEe@m$X(HA Χϖ_>xlW >C]}SA@0 icSxBO-^MFldۄm/;~K_ײm@PekA~P /Av>i{ bA5VM@dk'[۲[vyl;}ld-= }zɶA@lԨ s 4`8m^&F0f>)ƴ}{w7;; nKvi~mw.-߂[02r~E_@߂A3 yN7j4& kאl] H m?]Q]Av>i{ W|G䞙?}12_ɏ=!Ǧ@6_W-;3?-׾O}M3)xҷtĩL UPZ-sf&۶z"}X[vQws߮m}ŦROֶoZƍӠnzl*_@pHs7 C|fK_iv=`<\AS?O}+;k_~b3EFv?\jmo2lwee -<ײw ,Mv~xHC6u65oB55 ]#ioe@\Jw>% -ʇo(3Td` \ ̜5yz W|/_1^uַ}M~*?h]# be[[%冿vvC M$m;4Rjoh_y7 5Z5^ RPh)+蓾!V`a':^}/\qJ*Vb\JUZ{ CYu Vmoܿș~f]#e:wo_*㌯;MYuÈU컉"ۿx hg,(RB3b*԰9`:x퇂f 茩% $u[$vlZVB:N-yj@WɀfNu>31ֶPa´` @5W|#o;+ի&oz]~|mxX@c2AZV~Uv̺D}&]Vm?@й0pkؗ &*E+i a?`Ο_36 |^~@}^VPw2k֋S_0@@)֌N` XAw /?A?}A~1w;%x|l@pDmX@f74^ç;hޠa|&ao6tp־f1j=fgc}7D}nbݭͶ .FQckn tA VInxH@ly@|A~u9Rer_#R[_wնA7S%M"86t++ :۫֫ ͞woպ36x_¶Z? E@)AwZ0=kKN|^-\)WO~@غ~pcZ@ vg88.ԳmsU |-vWmo7d׼.PdM(p_ZZ;qz=c+f> @1=PJ]#jm:W,?X;1ye[`ni܏oupwVyeчq@Hl̋9/<x XŞ@ d^o`q^{HmT[kr5=jcti5 Wtq##8/ojS ?fQ+բ .آ0ꐹ {@yr r:Ya vݻwed hdj!V0-ȁ"18\j};z{68V8tY.`fkT}Nl-K+fс/O{nZZ*lsecC3Q Rd @@PP k6i{x-cٳg߿+׬MUL2} f"HgTmFm%׬/3KiàC@PNhae_a/d@@)5z7i3 ]‡߰qcBtka`m2.~7UH:>8A3a&.Af:Xuɬ{,0w >앭ֵxZUA[mQc/0l kC 4lzGlƁ 6Cn!k4C~c+n6 fĤZ4l m}oc{ ^L-"LMa(YȲeòjj u6ٱs촮ܹs;?G@6\зFF5>Za3}Yq2z"5A^m0]̭`84է kU-L ykEY0t,ACAAoaa+Ɯ5@@)%]% ZxEԳ d׍/V Dz<`"/Y%=zT;&QHPy<<Њ"cY.f`Lb^Y:Yk/nq_6RTR,"wNi7Mh`"/yEOyLz ߁R*>jTF-lRMk\M܂:>XZ[ql S*'.\\o*M[$ cm۶o  hwU\`:wAc j m=@gQ<@p5n^Z8(gnY7ʬeխTk[v@=J=*>g}mvmՠn ̜6k[A:6mq{לCF78FC2i]ѣ[q;|-Iv-d<{p1'sW]1 XD`L=@ ܼ2o!kK51gXN>f=>Q7 /Ask0Z68:z:(5h t)Pe2N1UxhvBڋs{ΛgxC4 @l|mqΧЫ6pd@{9x׮ \:.ZQ>0Y>y-׬MnY5\HQYõ&4Y(`t2Om435 >#~ݤ"j q[Ϩqk0>he  p9t*ES@4zVAp%vÈ|K7lCy+Gpƍ遠 A0k@PO eTFUjAA7;sQA~g$S {Y`ET k|~Eٱk\sL9[S*O_}֭[A kT}[-wtTCfӁ̷uA:,\x#y+0栽koճaַ~#ݭtƆD>6HȔ5`i1YʕEFfȄFˮݻe]22kյ~&i@`2Ao+ՅmC Tfuv= @UEbokDk64ƣ0Je޸㞋73|d#L`oㆀD @gQAfD "#]"a@""8v 3," 0U K,w ^ȸIw"yN;7 ,r0"*Yx@y," 0U$08< سċ @_ @4zV@Œ`"/ @ }7<"cYA2 3x K=L ,Y.Hg ,x,=,r0"*d~x," 0U$(0< سċ@V uw uT:,(@=S*%a`D_}ײa:Xˈ6ԫŞwX}p2vT_ -بv.(OyQs3{Iyl9vk @$+2s(YKE6&'ϽE|zؾ6pe,\YaF.n(|@aA$# iCn=+f4oe @e>Fj6j,ӏef@mju2 7vD,H۠e7l>,dʝA&R #/$'s ]|=v 7n/. Pjf{6,ζAJ 3! vCA& a9D9w{F$GO͆% HF,=0(5>?صWmr-n/>Cp֭큠 ] Xp 2IZj]3lW灛՘[\;ƶokȬ5[S6 zŐ{n0(;i@7#sj^Y˚}VV f^}Th›Nz2jO( X`"eP k|qYruȈ\{ 0quaٵ{ܹKFFv ]!7{x#%}֛yIC}gaU#u7د5lma P-Ff6ѫYH6@ju|mFz^؎j:YAzݰvc}o h Xz`Q ktYD}h&uzl~Hj,_$nfۯIJJ~al;`iA,ANTϴްۭ9f׸;:Ɨf]/&z_d#2s(Y Aw^gx  )ف`U/S2Lj gldEm;}Tթ:5PVj}LaoV՗77wkhi6or4|ǫ6jś=G<)V'[x{<Ci ] ehذz\hPtm 8~c9 lR4S cǁ*TZJ5ƥn ۲!Oy_.ĺ= HF 9A&RAݺ \VJ@e^7ٺA2Ʉ͠~|PWFEdS GW?Nf]4d#KUo`m\<Ci-P €.uCAP6@0,:`Tts7K43fXkhdC\&JYK@4Dʠ@V اo {dlm6dB^Bzw)R'o6 k :![A::ƬXt ֮sn : pT9g} I0=@ J@V tKͬ[e7b"ÄٮybؖgT2fmɹFm 0n׬k_PO7û3oߢw{e 0@O@7g{{M@4Dʠ@V Xt@W W^]uePA,%ngY>g`iA3d'=@ J tp( ) KY恗@wx,=0(vGd<:߶n<~A*4BF v,{|99i]nkr|ōvy} j,E +I֔~戧[p@V0^怞302FgqD- @ӭv=MjcfITǫ̿Ӏrq>v\w:(qApΝb|MmS.3{2]~]MԱg5 ZW \&, @02mTŴNVFej~:ձ5 kS@,lp2y^}JFМkqy@5z2|9TP6lXh-0k@zcpwmj[^9ѿ;W& Pͽl+"3!:IÊ׶Q6Çe͚5 e/ɑ wU7E=5O]/`cZ7uَjᲹ ʼ\Y©1j16ڭeZܾX fbAhA+hӁ_KAǛ컮n6hzkcr"ԯ<'ڵj.A׈yÛ{L ʢG_(_Y DMusw)"WLz.gˡ7k:rB'P /rohI1K̙Xk'ǁ¬`Y T5΀0elyl@]O 1ztr9ow8m6d2pzMj50<d|]v4+0o)WZ%fsdk?z(Y9RX3~ZVǛm:0`) ٤V[ӶdejҠ.lq]M 4쒕=gkۡ:4}SCB`|̀/OoLM<uXs#Kwf1 b(W\)fyWE=~'}bƏo5v94||hޛ7c$A"*,{H}߻c+NNƺ`0ӺB$u ~7@si@o͆Ac#.APV1:5)dڊ'j|Bsy8v'aLq@𐵭bŊ2Oޗ*;.KVL]S≃7Qms`781@^ Xc}+ eX"}\27l!#g1>ǻL}$uݣ+*Xܰͣvv\жt&dC~9AƵc\M<Ӭhy7*Kncn8 ˗[^z%yWW}H,bK w*k[XwkuÈ:oUWo s8 @ W6qyưkX^#nCovE%8>'+UP ;ԭ7Ny'}NdʹoȮ?^\.+:VQuTd8+P|lc9R.Ͼ۝LcwlvTݹeDW'Ͳ(.]*A噇'C>+N8Y^ec$={pAf`Yx  ) ;n8@@̡4 4;m#<z, B02(o+x@ J H`O#>x  )믿ޑ P8<]P_/֎_1W*a+.?d7 x @#A4@P((qH;QcPP -6vז@^AH H+h/x M *( Ĵ L  ym{x@0PAqyyiP  A;Mx4=& H N3~x /0 $P$h<@ ibOx@A 6=<  8@L[ <4(@@WЦ_@@UP$i ?<A( H` 41m'< Ӡ@Av^A~izLTA@@f -@^aH H+h/x M *( Ĵ L  ym{x@0PAqyyiP  A;Mx4=& H N3~x /0 $P$h<@ ibOx@A 6=<  8@L[ <4(@@WЦ_@@UP$i ?<A( H` 41m'< Ӡ@Av^A~izLTA@@f -@^aH H+h/x M *( Ĵ L  ym{x@0PAqyyiP  A;Mx4=& H N3~x /0 $P$h<@ ibOx@A 6=<  8@L[ <4(@@WЦ_@@UP$i ?<A( H` 41m'< Ӡ@Av^A~izLTA@@f -@^aH H+h/x M *( Ĵ L  ym{x@0PAqyyiP  A;Mx4=& H N3~x /0 $P$h<@ ibOx@A 6=<  8@L[ <4(@@WЦ_@@UP$i ?<A( H` 41m'< Ӡ@Av^A~izLTA@@f -@^aH H+h/x M *( Ĵ L  ym{x@0PAqyyiP  A;Mx4=& H N3~x /0 $P$h<@ ibOx@A 6=<  8@L[ <4(@@WЦ_@@UP$i ?<A( H` 41m'< Ӡ@Av^A~izLTA@@f -@^aH H+h/x M *( Ĵ L  ym{x@0PAqyyiP  A;Mx4=& H N3~x /0 $P$h<@ ibOx@A 6=<  8@L[ <4(@@WЦ_@@UP$i ?<A( H` 41m'< Ӡ@Av^A~izLTA@@f -@^aH H+h/x M *( Ĵ L  ym{x@0PAqyyiP  A;Mx4=& H N3~x /0 $P$h<@ ibOx@A 6=<  8@L[ <4(@@WЦ_@@UP$i ?<A( H` 41m'< Ӡ@Av^A~izLTA@@f -@^aH H+h/x M *( Ĵ L  ym{x@0PAqyyiP  A;Mx4=& H N3~x /0 $P$h<@ ibOx@A 6=<  8@L[ <4(@@WЦ_@@UP$i ?<A( H` 41m'< Ӡ@Av^A~izLTA@@f -@^aH H+h/x M *( Ĵ L  ym{x@0PAqyyiP  A;Mx4=& H N3~x /0 $P$h<@ ibOx@A 6=<  8@L[ <4(@@WЦ_@@UP$i ?<A( H` 41m'< Ӡ@Av^A~izLTA@@f -@^aH H+h/x M *( Ĵ L  ym{x@0PAqyyiP  A;Mx4=& H N3~x /0 $P$h<@ ibOx@A 6=<  8@L[ <4(@@WЦ_@@UP$i ?<A( H` 41m'< Ӡ@Av^A~izLTA@@f -@^aH H+h/x M *( Ĵ L  ym{x@0Po@D mK|3XJbcw-#ciP `ZRA頦J LR?8Q[ zA[ݜCcq5iAVM8+1]8SsPxg= od[x֜$*N~SqsL|&@ :+}C`Bk-yVձǛwieLGܱe !VkoIQ/1V 4(@N|A^Pˎِ!ӳ&ZY,mYNq9wlj1k' ڰ)p 8~#q.}BقF c6,\wnfʃ+YgosTMzSZc67Ћk1k9qͿ37[̹F]eUcj1(D@0Pa'ٙ@kq Z o96*Kzݰ zJvR}zk ,1&;;iv۷X5H䐺acʖy}:Σ}r@{=ۦ19UQ*.xu.sΛ5b\z1(+]AT=xs͖2;s)nvBZ 4(@AP˜4I݊2X L&(4 4Ǣf_Ac1}*{44ް& h|04sdZz邿~-iX_n;.:cs ]nxf/و4]Xo=/[H H@UP h/[]¤i` @$A"3zCehi\ؙA'hgj7+<0:6hm0 ;WI77qmnaw`=ƛ9+/(4(@A\0 fɷj"blknսEV33Z[58[ǐ-ʸn[vq g-~Yԇ#S9eh@kؾ#7>֥խaCvEm v\rhyS5X.oP&φM둸` @mX1>>&~|XY@ oLvM˦ ;d7S6|N|fĠs]Wfܜ;.h|5sۀy=˛xP?~A<ЋMt@ Lu؉ OX9\1eFc:5@`!P L h8> bV>8w{Z98LTA^AG c,s׽H1ձ0 $PA@,pxbzLTA@h L [ 4fx` h,4<@kaH Z!0x@UP,f@c<Z Ӡ@  `1 <КA(h(@Xh8/x<4(@@@C`F/<@1=& X̀Byx@A 3z<@0Pb4 x50 $Pl- L>7~8(=.q8a;v\tEG%q L _@8p;g,so䤡7(Jҧ믗۷믿Nq4Pz(]>44_@UP0Z g>styr2{QCiwr%Ȏ;~Ci! à@ ,[3j;XegYCiwU&l`ҧ` @(l9x :@q5e 8qBG14P d ȢV=LS ``F@7(^XXc>W eˌòs?@t5gϞ=[^y!9 d  pg/xȾoT*^y=?߸ccN;q(=ZAucݻ+wӧrڝ4Z 8VKsV[J3mA9s2_Ӷ{fR X}w|ڂw̗CߗwǕw>%nFPϮ]R)ώ 474i ȳ)mm.a+@ pAme۞,> ^0zңUܹs_ʘ>376$T縹5sj=zDD9U˼ϫCژc3mA9s]rLcnYiW1'#55Qʂ]k'RxBP>|X֬Y~vrDXTFnA|T)=.U] O^2|uY=-rC~  A9s[K^Z3O>kF [cz ɉqJVApʕ~^NSx@[˂@5;%=^752A2TLw8г<@,>*CɤửK~;VfFODi?~JCɊ+R)}O,'dބOX?M?<bCƦtPz(]Z˗KZo(Qx?ߐGFwXk1UHi.`os X@0@^ ]˷R J xAYl@BF0cU\z\c>WL&ϾhPK._@w  pg/x/m߬Lq4Pz(]dɒ%C .{S@ppa3M?//hP(}yK.7*h"Ci%;d*K/w+}Ar+œ(` d+qcѾ[=p笗ϑ?{vS JOs{UWe͢2`Jҧ`(9 l9(1s~4{R@t7rWؙ/ JiPP?.Z@)hP$0E@ X3x^ h{<M x=w~w;xv|x<(d;<Q=zy7Vwc x@] x<У{΃~y׋x8A<=@GO<Ɗnsx<Ձ4x<@=зhT*U*~8?c1x<<x أ'wx<A@wx<@zϻ@<>TP<a{1nx7ѷ&yY /b٬ ,gĉ!ɹ^^/я`@0g{ӼT\}?ww8wCyiwt}o=o,LɵkQcIKSxgڀ*z-K,Q_,}.STTQy-&pdWOEq.e$0 F_޹ /,9}}bx^[ogwH|x.'S&=lڲNԬ;˦P2yk?)@&fw#>bڨ .d5d{ϻ~qezU|ϴu!LgZN8ep*Ooiuʍmq!+2]r]_c1 ={)1_?qϫrz;i"'Mzr`'skp比 C!9Vj]8-+NxNNwtrkKF2yd|'aW_|7.Y8φRᒏPI 7nolZs)p6-) ]w煮oowt;st} LxdXLWL&5,F 5dGvpL[ #`~\sbcq/C_C)΍MU|bNyat:!vгQ\Wi {yi yқ;^U6ઈU'x(}ލ:к6WrYw\?{(z3 C'd7]D~4ٜ?Ǒ ׭"uyG5Ow 4ɐ] LġO`LRo%Ӈ">ԁ`кfl8iwjp^K1.XˡkCz}9O {l U,FCs:㗞g\i4+nwtc+zGz~<:y,tڬs|PtzΣ;uttui.Joq r_0`擴1XV~෫)¹rG7_7NߎLd3kx: -WgCzC:+ Rcr^BOo F<5"nE8rX\FdJo-f ?De.TCw9}]+X]r>u][.}V{E?eC?L62+(9qG~s8\ipz/ >b"y 36%=Ft=[#!?rg{2ծ K uܫЀ("tVCwO\~z)ue& /s?EJm+q<`_CK O.KǞ9Х1=O]VzK_IfUY5%WUr*2_dRQ89=Nח~2Mw$dQfƝiD=Ɇ{T$Ri]q(MOQdp;.n{yzgm++8>[HG>rEҧ[n-2.;ë UnпU]v >ᮧ'('t8/}'ÍA}Z}5o^h sAҮ ~NfY" [6۾)=jbdaڌDڦ( ȥyA;.xWr{݈~D?_X4{vXx8]_ثwh w]7׻7-'d7݅Gveގm0]{Wr{~D?7W/'=2 ӑIB\73aqWloIGtG6,VҽFpnltz~gU -JL8=Nj7=BDt  "K<NLK^@0  B,e_@0  B7f@(1PA ?o߾ с`@0  xÀ36OF^"y@0 d#X`q #lll9+2u!(lll92G( 1 d# sdeW&eB0P< 1 dSL]~Nžݻk.%֯ˋ_a8nx8>t GHH0?l͹s}6,7iiTƌAQF!!!))) "9s`Xt)V\UV)˖-SfϞN:'" s>Zt% lLdsY_NY-lȑ#G2,\,Z6l={p>}/^ĕ+WpU54v-EwQo޼qO?.\PV qqK,ӑ4"T"T"!'/RHR'R'!| O8"#FXN[;wq%EW_}o}:!?~/q]EFLBǎSiX3gĔ)SIVPK#' Dj9y$pG1&D6`Ʌ+ɀ$4}ؘ|8/7oVp35\y\v-ќNY<驩<\.yޗY^>1P͡C0o\5$Ó <dÓ,,Ç2IybxBi[;{U;i03=]W\Zqp@&&^226VY2so>_1vXc͚5thx˯=/i eel %yݖ910T8C&aL7!/tel7kdػ,61<' qY$#!igv59>xbd%\(FR0P17٬wf zn&ѽʟ>;;4{t9\N~}֌`W|((F;b/_5ק!3S.؉`j}Ki €dX$baXrev 6Eyޝ-=v )jlZR/#Yŀ" )jل)٬2;̧^;;pY D Cy/7#bfUpK "l؝wy[%;s {^ɰo a5^Wn (RJ)uQ1d 1y'f6cf6M6BB;Tksi+ZA.e[0PlV0YJcΆ{0| {Y\DCqxq G^ƣr)u uP0|a#ElVF Ki&^?{k؇6G c[.e[0( <d a"hyf܀5txIR+n8.|"B:@'<^Ni$\dSh)J6(IJҲQ^gj ͖-[EF 醓g“ӑ4dQr. ufZɛwCV4te>XHYEq| ;fv;|&)gb=!Hf5Y2fqڲYIQ̼3h'Ny C> Zi.c(Ƶ|#*O"3T<|HF0˘"3"wFRHdLm`n٧'>7w.qѦNUC3w|L@N,\6ò peC֥DW*wܹM`a=krHPF[}$N w'kfbނ{<Ê11/0WYd6|ٍ~S=]^U6kIry1dh7LFZ~.n6M"{?čz&8Y-̜:&<"fܳ s҇5RDF O,Py*R%& 4|67mڤ<ό{BG~l۶ i; +#YNMV "2d6!5۶cW/[5gᅨoW-1eqj]>/Xkc рtx/Z׺l#)ˆO5,YVw`Kdj&_ʏ<Q ӐX~a) ؊p"RF "Je&#w~Vrg&aX$_uȺμh 5Cp{>;! +)b٬9x'f#6S61Jcp.h>E,̜? 7:&ᏫƟKbcc򔩈0/W|]:4%dA;ܗfiPc@,pVѤU4#N'z4WsU mܸhB.NҌCۡZmyfkE4"U9(OSb DtD"ROёp%3"dc(Td3VN55k֬QvgFo4ҥKحFGe[$k#Gmv $VM^o .6692w`(.+_pKl.t: fΆIƪȵ-ZP\8E W64d %d^L4yyyזlԡa4ΦEƿFAvcI@ }7*@aJtܟp2G”gW"O63!6m'f ~nzhٺ!-N%rKD3- YlV7/5,(}1Ni[;B6B6ejp%+)b8E6:w5X5 &k׮)o^й1 Hx97=Z}ZDN#LiFt6-&d6,jKiQ\"pn|)~M׀X'>HAs;ȑ`r& ?V!X@쯵 /*k s6~FlR\ˆ6y>jhȦcc5gvymқ_B~ۗG-VT"-^Ĕ䦿'M9Lf{a}kbGmKp6GԮUY]OkjR0h) p ?L6LJѥ ٔBpZ6Voڶ&3H y) gZ { CVY ty8atdf/\|/5>ry-j}ii&dMQF[8 yU.]5see- JOFȦ4pDaK6Id0 ; #]fF=owuQHE;g$daRhd3Ȇu:d]z̀0?,[0vk<SelѬt/:g W"d0Kq"t=dL67Z FldL#)`A%w.?Vδs5ũ@n({Wʪ45AKtP?g0)~]zd_/>Ѫ/g@E+M@ W IdSXC6!!ewgޛ!4-M6˂ 0z[ %yxǑſ7ėd|V6# EѩbҴ ȘL)qHh &UlLRcec|٪SZ}bc</[Ol9lJؘcqܷCK67,RsV:N9ݞkr}q95㟶YWR 19?1>?^K6Eyl!1Kdrrr:?<ĵdCV͢lVisCY5Y5t8 ;y>yHx!Dlda4}@ %WVqьݹsgˆWc `!17VF6J+ʼnK6N*/ciLիU ||b柀/zX1 }ifI@HvdZN~B@qm Y6y330Λ\/BE6v/7F_wjc8n5J"?Tm4lwi [ViK6?saliodc#:> #==5H6ml~^hnWὫcQң`oMܟ|9fO83$7;iqH4'(АY'uedd^KH^ feNE6] _  &%o=Y'H%j8"j;Ǝ1]"oXhve'qNΝ;B/Si]ql˜ :!=sF)}( H%[94-D˛5yDfKg"Sg92=shjKSzNlҬls'q#bgu +1^7 8";,cjx[?fU煉 7&*p%+)bl'1K0dso@-+ټ[lˆl)`::WlZjͯ)xl#)WC mXd@jpsI%Kglp|F*)$4e4}Ddd'##m":4| ^ {A\Km]SZ!^dc;fgI;be2[~+r"lx8q f l9[L]t) /4e[se {:FuX6$,ru>Z7PNBV8fޭńIc0db0""0'Ǵ)ñ{Q,NāE.Կ=oQ>^`ˌxZ 맔C8D49pqi,ӳn8= Nss̬n7 \^p8<vfÖvX>d(|;/]#mRڥkCko7{SDD-wi cן~urj]Յ+X&),2֞e{fǎʣjh˪3 ,a1uψh·Yr XccEj(i{LNf& Ṝg Ln p ]{3Za1e!++%Ogͱm|SlpczX[7dkR}`%0m4_| kBx/t ͐U[RFc2p /}BjfW =I!K&Sb|ᤑupt&fp}iD;S[`|JHT;RZXX6!UBvq P[WcޯكX^;"w1WM Sɚ2)M,^Ȧ_P\$ۮ. /IW>3/|p8vW"d,^\!.$ԕa&+ٔeCN|VИX> j*-/h3>[?x 1)`@J@'vѤQdI (65zbfKjZcWڻؐ GfɊi3ĂA8<3FY6l g i]p0{bgzOjfwly&_ X3 z֪ag6J"TdS.-G_vdkf0e{=*F㌤a4+)B6{N߆Y%>R s.:phF?3gকJlhl~2!ßׁoނsv XLN^)6Qic$N䌑HNB2H4wjiX.sjBhs*cWp^9>eӎ?TN%|T4D7XbNsbgF+^~]JmΎ ZF经!)5I0ٸ -AC@< ՙ3fn؛֔Ȧ9rzVƤD8йR9Ľ_11F4|Ȇ,du\#SKFkbe[5M=ql7K"+fwo5dX#d&sLݹsǿ"lO~ _Cl0g0oI@y 3f g%ytZgԙ;zΛmj«|ت.;6vԥ? E$DiL:cE${f؟kbӸf4tVM8 pIu/?5uh%Y9p$&6 zt],Q s`yvQH"xZ oJ!1wHk[dFsn~,zD$l=<]LBܐ&6Jxܟ}Sw_'q?EJZH$&HElpWM'FoYl&4&X̭0Q+ 3Zi|/P5p84)")Il`hT+cJl8`@VO $U|q(m(לDVncS;@6VV7pޮ l٢ܨٌUzzqt,tR1zqtr'KHO;ձ9}n AmnyE9?'|6>S_D4 #!a$$@K8$$#w.MŸڲ9F5L{h%W?D?_ ?Vǘ7f4."be\m,ZsT-XƟIx;@k;ON_k{4mc谤_$HW=bM$ YH9p3%PYr%%kl=ؐɦO`hPWQ#!94h%5>&(F:x+Rպ'ՙ`Ooߐ1)q3? K~6HόdChbǸؖXeR1o7OP7?A m+>Eh`_j#$20VƂ!oc6 -O03 ƺ iwQSCTu:;X;\;Xwg疿sG :M6DXH9Hdc@f)6\>NV&tTA-SV꜅gxoqo˹?'1}r h߈K$bIȅ gLR?$35?0̜7a550[Xe#iET&K+^}PŸa"ȶX?6S\Uì~oaYJ%ۺ^ݮ@v۷]!)fs)Ӊsud(Sɦ,③ds$lZQ|7pa4M6y#LdIVLzPϳ'`ڼL"Φ///9|\ilŢcg>-[cOO( ͤіD֧XDs+L6 UĜձ!6fAN5GڿØUDJqu}K;ˎdQ|4V3VƲ%K6\6U䍠ƷVzvb9Ɨucn(4nEގ;̲@6V;x[jICw9t3%Kg;v,dd޵_*AqY5ctDJ :_"Wpo?y? Wgloq:g* =Z?QC0jN">tF mop4yd@lb_MU^)]j`R0:ck`6Y&SzTTfS|-lEcja;wԵtmkbmwvdM,Rk`zJB6vOÎ vUgg!ؑY7<7vO;7H< ޟχ*<ؐr9eaNOf ZYzyBzMJ6g9Vnx]D6C`Ȇ? TfvaՈؑX a쮕#6ѤvؖڊaՑM$ ,5`+8s6%&(FبG3hm!䶓/@o룜7cq<|d@puVn.cbI[ߗ?dc#EO(ٰ7͑#GB6g3\{sɐ瑴8ڞJ|S?Kv WoW<##)ṡD\0biV2bt @":|"&)N-vN!Q[5,&Ր2Y&ˆTQuv{X?[W4Ne{z['4Ɩ1ocM7ڂU0fB  ƺ ]Xho~ZYv*ۂ@g5fS6oconpIh,R;G_Ĭ-p%h>Ϣd$c@Ɇ  o4a^6[6O9hٸzΚ:CnpƂGQ d@ɆwЮϡXgi&E6~êF}n4dFG=_\#׮ ?qO: ;H }("< U |}hl7}jF'ѼZ{^9dD7߹oBq;ڽBG vP2k2i-kE^ٕt)A>@Ю ^ wR#@O dB~Q!o;Cl!D26blK4N=2XVȆ(i/ƯT!O.QJ67Zͱ ]x7nDNNV= ~G){d|ʪzy>'!zҞgcd)Kgа.D411!5E8Hnxȍ ahТmMf$MњC/B9Zeh۶-n݊> @8şFj*.o'drn[-k;xccg·%Xuџ^CsBwctl S+X5cעQ'ƳU::wZvN3g:aͷrb##), <%;vR \FɦVd3&p`>|O;\Wpw/1\c("ό)qȝHd0#e EF4Ƅv^k< ?Q-w@G C∠(l;A2#/ACFPsMuspNL~u:Nߩxޜ S%"d|9`)#Eاp( 7jiij#(H6Ud9aT;_"7(_+~#ShW>5GdkeC:πD6Ȫ!#zñ;L6CimmI,$ VغJIE:![N6#FOUdKl3phgPM5B<ь֍Nsy@ 6.bc e,Z3Zc𼗐/ < ٘8f ln߾|^f5vꭈeSV́9jg.Flh|G}VL]{~"F$ Qͽ};5E{w`G7t"Hnx(5w"XKkn&}78 eqlIJ h@(ƊG#eKb)Ʌ iCظZIharN,F~$mp7ڜOx?hK"5nsnM_dd)Ud"֡X6P <\(19qek̞'Ood~zdee L69Ӹ_uo.Zĵ?ɿ4|?Ōao#p:vkNjhߩb|@ߧ!4"E6dpxx5s7]GYݸ6tJḘlҲF*ݱYS DvXH&TdiSC}l233ѱ"#'rHM4y9}6{N$QGE1|tِu߻hdƬ=>fhJs^Ɨ7/dݱ5q#/ M0?nX7cEaut#p?gtèoS7э@ݻx+#-H=dƍn}c޹f6[L\'`@J"?L'.&& _c{9-%Xߺ4NYfqܚP|MB+=h#&*@;&~r"J8MͯAo?~}ZiR DфH-Y0̛gfLIc\;2^@CfeЛAu: f(23bso_T0[YJ:{]:n,sl#^1<7jڂO#YI܀jkqX\f &V~W: ̄LެZ1nzփ&+i뛟5֡1.M&a}3+< hafEغeK@^iNt" ~GT63B'rk̒|1gQ"5OLqXEN 7V- 8O ;#(}*EF_RPS:=\9@ ,JO=#c$3~F]5ٰ~u#:M`Iuel}I7G{#s=sֱsci=}PY:.m՚X^c]qxcg'P=Kx6|իWt$]?5ΞI?,a(s<0d,l'rl|A݋ԪE{Yc/?7OCl憆bzȎ?7r!ɌĦuwM(-~F}@ʨ/aE]&_eb֥ތ7o[שyHj0X̸Pߏxװ <5٬^Ǐ0['lfeY\2ߵҿEϛ=WL¸JwC'376lyI{^&PUcō~${n'06:O:a25vښ*ߪa6:6qz=C0veI ui*\YGպ7Z"Ь[AaU8tU' 1kLuz?{iYEtƍgI6hQ:N4$|܀>nv}Υ]篞|"wYz2Sߵ2*fidiA߹fݫפm5bCM,FפL+3tTKLLv7>3rY qmYV\fT`Ll&A@{%v5i_z`RrӘD׳=ɴ/dڈsrr:毚ECc)5/%( LřHLJt掓dkn(B{C / K{0&{s:Fa=dU.%dv0g-.B9se5WۨWh3Wi ueoe2;pBm7׷N_וy.I{ֱYt O5QI˄es`~5w5vdS+ ~ 7+7}Oeg?adJHLQc{ctRobw2}:*})~q?Œ-xn)F'%B\R/U#mV4D;J6޲n}"6A[:^qa|֜=$o;+[Yy.O!2{ܗ_0MߎX4Z8z $oa -lvH;R14~󪘔=␗,2M91uP:mK&F$ ”쁘9֒Z2HgYRЙ>]2GR{8LHc{,z#16$醄x:mGGvƫ^şW@uZZM%Ph4B-|8N"g A<&99N,՞Dʵyx|߷.uMP sw9w"]Yf*ٹm$;-] dK>lۜFNec6kِkN7ɦSl$ٰ.%k d=}_za-3WmfE6jJFa6ն!XwN8 z[4.C<WZXIL [7֯DzK_={V +;hʏ Y)zi/\ڃO/Vrn\< KΟفsg)9{r+Ξr8wz;' rvOϒHAXs={vtNSz,gBW9OX˥s;q4i oўn FtJwC֥7}%рh |5PFB3oa=r>/;KA"n9gY93&g A"Kr ._8\ nu8~"LM"ZD6;!R&|_rəh5_t@:,XSJegofWhڮdb `v%Oxwؼ}#߽B1\XT>u_||zRK'\) ]5|Ja>x~?ia ?OP|W>=+WH2S*Kx.rYHsG=r+9rGΜ:S't,8^4]4l\ud`i^ JG,%7''h>,Ɇ33oe䃿x(ʿW'te@#_o7pu|~k0gw(wn_[qfam)n޸D[YrEڕsDprY"Dc &n*]ɢyYt:d]ʟh@4 gw2.d۱}Zi}xg#=Ν;Vŗѥjh޹1jə M(lYwm6}?DvQ裏GBXI'h@4iC4ao f:`nXG+NDрQ 9c l88qjTa 놁t޽"CDTNR[lNiHFl z%E8 +ӏ|޽{W)Dn)]NX7y/C'oG!": <|>m-\v63DqVEZ„cR{x%+9zudg[|Dwegh!5v .OXL4/+/Cw3XрI,6d;0rd};9O^.g^.ѫU0P'5W+ Y b `@0P(dÊxk~D5a=J`4d@:؁{5.ƅ za@0 (I ƨ4ކùbXKIKҒL0 (dÅu#3gPJ.5kX% 4$(dazdŹ8efed/$4S(dÊmZV6ٳ?.3UyNGFI0 hV s0&S4I^<\..3HXi41PV&+4.4`$~i`0PV zŘ9o?#ʗg J 5h%J|PP[+p8O/绤"H$ B6@`T3gz,հgW_}Uq>Yi0lÍy󐑖9g+v+CB~8^8]N_Fh$M](1 dl̊bdm^^`]Lfp?p|//s0%O!ƪ8SNa׮].&uc8~.g|$Ұ V)&ȋ%/`@0 !!q8 c@F@8Ȥ':u 1 d# sde&D0B6B6B6`q |DG!!!`@08ldؤ|b|c@FFF0  8! ^^HtT1 d#d#d# ǀqOo 1 d# sd:lll9cU"!!!`@08ldLz}{}#QYǀ`@0 pB62AV{lR>J1Pf[ ʗ6'Hɸoi)b/m J&B$ YTyl hd" T򈊊RR>f[SS@D"wC΍Tnh(g 'd",D$9 b &;Ɏ&Ɏ. .&[fфdEGym)_HZYP]$X@dx=dxSw57V Ci[V'nqgl5JX2M6ʚQC-F 5P?E5 y >zx]llaJ4z(@7=Oן(փ` "1duɤz="C7E+E[,F`u_A_@ИP"֝ƲdOҗdFzS&ݳ{X49 z/TkCtI?ۊ2Tk Bp܍!hd8r y#q|q_ph\eF0Tc2H6џ'&=2Zn"S-l&­[069;X52(X5y)}C7>ollz{r/;հFפa57eT<Sܺ5꒟"tެ2]Wh!@DT;y$mޮ~jShVpV+Mث ɉS* ganDjl,cTfO e)%\{0]?TdcW@έYv$DU@z}V&-[`ʕ~Rsf*U(}lB06("iHǪnkFϋ.`Lms _4,eg)ҍWiY M:c9 ( a@D W/u4lB{)a4dQg/7"?b Ɇ GmWCdE͘%ZvODG oٮ : elQC0  7lԏԏ` |0 d#d#C`q .çw)u!uQZ c@F@8J'%J/^0> c@F@8Ȥw>K €`@0 pB62AVZ=)IWz`@0 pelh[DNdoH/SB0b ɆwtΞ<WP>5,=?Ɵ^u'- x/Q\iE4ϳq&lߍ+*ٶsnܼy6|&V%TEzk\¹@O-G߾'`nI K a Ɇzr.[bؾ6oۅ57* ֛pVp0ͦвK"-RƗi|}.)KI H>,0dg!iX6nνg:z'NGp!ړ>fJw#c83:"Y1ϐq19gq$Mcy BNۮ fXەg}Ĵlo}`.f{֮Lm,cwgBRX/m^UpeiE~cƑ~̢q8dÎ c@F@8Ȥw>K €`@0 pB62AVZ=)IWz`@0 pB62A&]J]H]lll9IIҋ lll92]ORBꢴ0 d#d#d# ǀqVOJҕ^` |0 d#d#d# ǀqI2|zRR!!!`@08ldzR!!!`@08ldLzӻ(- 1 d# sdՓt/ 1 d# sdһ ޥԅEia@FFF0  8! ++x@`@FFF0  8! e...J B6B6B6`q Yi$] B6B6B6`q (dggCDt  Kl рh@4Pf4dH$lJ]H]@Z6ͬ`[֋JLLDϞ=ѹsgXuh 'd#dp<QWOYIԖD:P ~|xDl,pel]F(_=6ZǵQ6GKF~>5 m2]F!l}N~Wv^6ô"iMCŨw0\OѴP)30'O_uBH'䪈(TMvu²ЩẊ3UVnaX/2&`@5|-z[?yY""i0ODӺ; Wy>X/QlYґXb7X*QmyWneFFF0lQ9 6]$ZkJkm?%GR^ry%f}J6ǎC% Uʡbw 1:`]gBR HC#d#D6ݏ}u,B$t_d{k~[{AK(oZ֋qѐȢO %ESO"u^OEDc5o#Dea046B8՘F'_a/JL2p ANtE6UEDK,o%9|0B% >d)N\pʕ|>Ă>uOʣZU!*42B4eSnr+<[֋ds=X/@wĖ:q 4L—6+ejHĥ_<>\yHĥ_ `&ϔ/(= 1 d# sdқ,ޤ^t. c@F@8¥g%^`0 d#d#d# ǀdED`@0J {A eU0  B6bIC0  8! l!!!`@08ldLzҫ  b4ODt  a:\Qc1IENDB`robojournal-0.4.2/doc/img/screens/mw_export3.png0000775000175000017500000016032012142060704020354 0ustar willwillPNG  IHDRICgAMA7tEXtSoftwareAdobe ImageReadyqe<bIDATx `SE%}@OzR)rS`IYWtŊ]] uiYEDEPMRZzѦMgK^^IK>27y^|o潡b9hB'A.0XM'(j֜3fΏ-ꐝ>FMӻ 㒡r3_xxBK$F}_Z[[vk"CCQQ3T4OB3]f5B|/PQA4}wݚE"J@d̼oAЗ5w~\~ /h(4JFR zNowM\FH(M#:g*ε*|k6**bT𰈰~SsAC;Oե:c|a !+58RbS sDkK'NTL1LPFC͕ AB54zU`4ܚ5>MV㯁A8qbr >]]ظ+5mvuxh( P MFh 0<wyd^"hfY@X9 'a2h&ڦ'tȅ zV'X$H kѯAS*zFV<8af1 ͈(ήsMxVXtfԑʰ fQA"E{A?oJwqLmrkhߛ&7<18nJngqQLq;ąK 6߉ӸK7n~^t|uz zkv7{F o=r𠣬N1gM|G P̐Qf63ϰ֯"e$VEY4!nfϡ+V?39 e2uü""q)/Ec$R8B7FE:.+l8.yyk|㧩X7KhLE>yw."*4% n 'dL7< /_(Nnj[G &f&,[~#A(逓Ztm$J%3zO9^ܟ98_7w.'%vt41yg806iӹact4Zyhӄݹ`_7K N|;)B>m2NL1+g͛q1x+;Ppֆ;}/O.uh(+=Usc֌ &բ0 @OWNKv5pj|:MA|oMzvWeb`}q ra7&DeHx}wnvTXX8>h:zzfAǯ afPJ71cId/%0n@d  O8 'C3tiˏ=rƋg h#BC/7'&l}elG cBh'N* ߚ !w+BnʍE_+ŽĤ'Tjn5RpUz0bA^JRCU謉յ*3'NHyEP\a8Ѭ;PQ?4NgղYV`;wGcIJdʊ 'G3H]()),I[х*ZcFڴMK=TlRUSBQW"9,B\B't9#Oo۴0hq 994N<4yC- (cC-vֲc)*[Pf#eeEZnQ9E;k̔²c+ZT7/1":.Lq]8.c;Ĉd*i|u^Y'b;da!帟=.J&KjIյ&$Eh djeѪ-zG*2׎.Ir+jmBّjsNo۶0୞q1)X๠13e؈z8K3X5nD밪Tq-ۮ=zy]IsFe]22 "oE.%ͶY\ٷdhbqAѪTD.ԵvH׭zG*,9nUE() Xյʇu9k°N@Ozhhm 9?c E_b"E)ئHmS֨8Pނ#%Rvju-aɩaXߑ4MC19%GF)J_LJjk +02B!mQ*X{hyh-D8-VEK"v6g mJ!Daɱڅ }\b㑋(yTQS=Ї=R1񨲬O "F DNo^mZ.C=g乇t[ܹr1\ %sblj#:l4Uy5G?a3vXJCkv ',16HNqY7ԉn9)9D7dhcVmb g^/ 5ŰSV 2ȡqdl4>(cS3gFR(IYcٽ'lFXPN!~CoHtu EvG<=ia{A|(ي׼Zw 04hq; ."~xЦoCZ}7DB@B܀TS'ى - ]BEm?y\z*ZƨA!B-࿍.\ NNN񕕕4DZrߪjh|tAs:f&JM)8pb)vS[び'?[e\W䓾)l\ƭ 7 Aֆ |wq}^-A94ZGFF&00_ e*}uB{x$BjJMѢɾ`1+:wZʕ+IƍM *A'c]:c̿/nGn?eI#B**㉛Kj)Pi4X`B,|h4ԝJͺoIvv7Щw5^n1v D549AކPwlNjD~ s/-3g#mvKaQ|f:Дso/Z㴅BEoXB z͊Z_w5tPXsNp<4{9u7޷K$ 9rw]5*;} [zJUg\E ꛺`̱3 Yd-jNto|{\3 {И[0sJK 4tm(FjjjJJ n@M;[He@tZ<ܱ^- {_~SD_OV\̄kFE[BBv4`uÎ[-q]%߯Y/i#FP$'Ҵ!rР,\tZwho|yVN;t5ߟӎLJ>88qshp믿!!!zW__/v@ ^j]Ś@55_wJ"::Q!޷Δ)Sztji:iJ i*O#o„ O |3F!Q 4~6#s'NG|\Qt/9͏zúij|@ 7tʥ֣Gr'I{ _ͨJ,h5Î(uiu A4ֽDr{}B?#ӁVðlTn/ )WY} ,h[ss3e2-, JhU]۬ %mѣ}'|򣗗 y3;w=1)XZR6.RةR4*]Ikt4xYm8QP_J,ܪ8Ç&>!G?v4Bj~==_Ѝ!0X]Rp]Oݛ>rhh}E`!5tAVtjW#xLJ[<2{zS3xS~(F͌}:cYWÈ!mX{әIǔ+%f Af1@}[ڞnx)wx^kB^ .˱dI`4xP ͸l>cǎZSˁ$R@TusZ|tEQxSONW {ˮ[OJ W fWBVY 56PѪOT_G)J* Sյ#/i:uA->CtDp\FA=sh EHHEN]SNN7jڥѪ]]Vui.hE}:0)X֫Q!= po7>,k{ٕQwN#R|0>j(LDi$3{j0I!!"^*6^PTLM W{L--G|b\;Xtt 땈 ;'Fp`DJG)tZ6엩.#۴X͈a劰 êpOIϡj`طuvvvuuiAY2StuB:ÃQڋo¤vKgPkm㰵[*KJh{ɮdqgKjko7:u`HNDٳgƍ=5IK|a|VFiӛKTxoߠԝnćJJbbbYyݍOF7ϼ]9-|Ym>:#z4Ҏx/g׍ئiE;" opnΡ)//gfڰINN7 ݛ7`Ju5mNUGWW:=17zzhRN}wW-6LiHSϟ9'M*8*p&cAsp_=3ܓ'O+joLKK |jS`âIjkD|.d-̦[1(W' gt[_aU]:YPQ-S2tKK QC#Y CofԩC auSbD5&EC;H6(4 6:46*4YdRhK?^V}py5;v,((5G3cBݭBa .c7钊S__?{?:y~ VTN{Ͼ~u؏&Iz6X;*ƅ t:CccZM# >38MDDD7&3;۞34Lo@a57hΡ3g_|zߪ⡹9c'K*?}nAH ?~<7vBzKVRmݥ+Wڠ}pz!'&n|xx٣}pHE ` }C@BoCIho| [yah "Π\[ QJ OK, ƆBىcBCCSSSccc)XCӧCBBӱi ru&MBs'NF;?*{&u:]}}=4E4dJYYYRRRjj*͐\ZZ4=-e"##7lؐ `^JEG/]'sGvkI"qiiUBYQnTNީOw.Hvh:w>Rܐ!iE|2`04}ҥࠠUT֦ RHfM3HJP5x@@^w[VKKwi>eDIp!Hf+2\RVssTLdQelgɡ! x P t:-x!'iQaN1+%$B}䁬mgLqI,喒FOȰ&QܱHiKi'shnSNٳGӅ---B0331~fQg#X\w$*PvXU'(:5k}l_.]iMHOGKktO,AC |3"<<|*Vmkk1QQQX.-dу|qaiKϕFyK|x :v6mj.A=!#;= '/.3j+7Ö)F4ESLFN4Fb@@@lllknE?h8Vok:sbX䀏~ *qW/zӗk <4쎻o<z{aM8:Z/FFsVm;:bRgV؂ O9i4-j]xay2Ƞa`M Ap (cٿ0VfbkˏrJُf~`L8 =tZgp`7ߞk,N$bptM4Cc53<>\?=#+ *Url(%javP=sX唢G83eý73Y :AczS4d Nª7p_vR 㭴NK7Ne9Ѐ7|聾.h̆'vt֌Dž夐j/2iz]Y x/Cy"B)00^^s'Lkգ_2~hze_o4~=o̶¦kdHݍV8c|\7>+Fױ fEiiڀG^ő/V<8k …̭,z5 K(}cEP-2):3HCeXYwZ3{S#Pt湰;Z_8_Yt/ EIK=cwdג_^%GS-]oI%nRLSwhMzwHUzm,ε{ϑw<^{\f*$?ynLJD%4 +_YƬZU+;9<0r'rfqR!/eSfNJм e6x5Ec$R8BI6Wgr^'®9>V;bU^2'y}*Yf=z+`#Cqp#+kSʋhٌ.I9e(߱':WYk[}]D"g/yK$We%ӇK]su*5J$ 2`a`0q2$68Ǔ8#!I ЃkǏرmS*b +6doS,ź&ېt)_eS* k)F֗"p4fF 6j\0a K;dXM'8sPtCDS3h}lkדx$ע?z}З.pōBQh=?3uPwZ:O<qa(`ёM'WH-WúgEa'=FQvd`&/\pq~ hFjf͚5cƌ)))qo詬,{ e&BQVNƫ6XnC(6T]]u9rXT|tzeig<ۆ2ko:5j^\-C?ШV2 N0rmCoYãnhteXdڜ?nf/66G`ʈЈ^Uƅf\soy1Eb\fY g\]ӂ.x6D}}-초!'Ħ+ϡԌ–uJ`g)5Kplq`Z8*ԋP^;nۺPfXt NDbHug8$/26˅aM4=W8^.X<4X WCGڍ6- = -4 ЗZCN!!!|% o#0P0@ } g}Tn # p.oڴ n)N۷|wאV3=ѣ=%ͧKMEEXӸ7??.+5E#4~f<};f(HLCV(q"y$ $R17H pGKt[0Z#H@ɱR{WFRdͷ?߀r}C#@0a+qt9rD;vz]wSViZBB=+u^IAa"YVE=v*!A7K4?AT* L&uTPrbLθja$NI",mp{O4A7͎ K >\%gLGơɋPxꙋ/^tI?tP1ky~˛D^ QJX' [s+ س\Pht4>GT:W/_-O踸8Chh(4Bad5 Cyɭh/e86"4a1 B4Z*E[[ݮg3AӻȊAzZ c F8{,h^Sr >(?`M4f0s0"h/%b+#&W' :f/::dg o-!$ē:1jf/#VJА(hs>ѣG o1m%fkQU6FE6zfآq]Uvя&%Rwd5 7({ז3ym{?^y 3fpeʔ)&pgf/[FS^PВ`!լf8;LfL &.BwH0Ubf憟VJ(!#Y#OK0/G r1R+ׂ[p*/ j~4Xv K+WvBn!`W",g2ͽa䎠T&囦܍;D4.o Ep/g%Wl\iˁ%D3& #2i >[Asr2v_pD{lJ$ڥM%F Q9Ze)8(rR rjkkR&66600~݀sO\7<\0J%43.(ϗRߙ諒saU3uT,4Uc4囧MTnO?fE-Yւ"|6f[c317ʨ ٘(,#ՌKfnjfB1 yVβrQh%3wa"-1S6%}7$cT$IC!jݷu(q"Qw꺾ʇ>6*F bpWypKker>/e⯦E6"]Y]kyLVKY-cTb Efh׸ s,jk^ hW&UR EKK >4ӧOB"cMϤ}m,Ș1gV{D@4# =7%{?)ʍ;GB"<\F";7g'ݿጌTU}yÂYqѼz,.&y՞ރ6[=K÷l&*_EU24߂=t:ȀK%g/$07QMF5ήR#[WP]#YQ֣N#Ȝ&irY(`bKa޸*qq\;{@=#7>PZYD@w>qܙZOf珧✜5mU qN醞afo8kvmȎ3e<q\/=T:}/1qә ,D_WVf<>a_2vYD[Ѧ ^\F9MEe%ڽ:aKgk ^l&/-`Zq=A(VTmZbG!2!dz-+)6Ds9!& {Y287bԉW[v_V[לBJͅn2>d[ʓR28TO9 sݲo Զ<$pHhL{K䎇dռmQ;Q=ܖl'hd5b)hY#\7n/0Ke Y;TKr唲"`9NE~Dzk Y2cǪV\du|TX*n ;j{Oj6k1DlLFDMj抣MX5< [E_~:IevҘg^qў_VʢGh@?s w̴^Je'Us_Y'%M%U[][h 9i?YʹDE MYډw^U̧?ͺ9gp=%}xDn˲!嚆BL ڋv^L!1Vm;u4? jF,^Vk)ڙW6A}Lﵼw3"ܴf=q yyay3ky|'hdiPi#6^t`,udEEE[e[?m$mI,挜.34ޡh/f;uPTT$>trrrRR=?W9̃<|B Z]#yil)p$B[v=xqV1fN`yYdeasHr{NeBі ejj6瑬Gcة1E\`֭MzSMt֬l̼۟tueGns38ٴ즵Y4Qk%qll7# Y?5Sݴ>o"}~w3j}iS4YkMzNLcj7)Xy;+9K#::O>[UU5qDdo4u43XSڊ\n,p $xWG>s#Ug1NZ/jnU3yv|¬sqLLUo̯)<²55q>ݽ@Kwm{&k*[53総92FƛX{;o'9Mi1ٶxM2~q&/Kg+٧7?[\*TN4sSh r)vf,%b߼}C?JӺɥF7X.pEܺ& I}j{[W_nI_?K̬5ݒ e]VCT+ivlt/HyYgWn.@V,ٚaYyyE3u;Yǝ֚ўY>wDP5  Ƕkls :QibU mK;ֺ{bK֌/**233p/@K,^xK4=ɋ<:4@7K%Ы{hMɚYvo g)-#_ʋdDeF. sY%ԃ"⇟/)PEJ06$ o.-9ɆlَyfR)IB,&3YdKu9bL&7de$-*" = U1#SRX".(--/>@0Pg@㖼pcoo=?qSːQ|yvk"W\㬫g&İKXeyq4腟ZM}f&CGIiIFo(mDs:fy UHH+ mhis( H섭ˋHWFk*[\YTkE˶3qT1diA3鹔.Sq)s+3@4=4=ו2֕]Ư'~B1&8g'wHM&#l,FXLIb1`A (*hV?/TDS׵t"w{ dk=#i %2\Cv=.,qc2lfsݴ൜)4QrRTv~+ퟦ07TtIVCp#k?\*4u*Ji)oj9K) mk! n h ha拝~P&u[>r.yp `qJk.[9zɓcYS̯Rb S ƂSs~@ 5z: }pZ|7/KY#cR+wsvygL PS塦,/?jF|xV]p/W3dH#mSHQ@;Vm(5U @ YO ꁨ|9 ?W,1Ĵ*4߼YϴLiBl,*~l@Rne.pK|5tE?\xخKgr]e}6䅆@K-0RعTix ʐĸd-F!<)gۙȻ9HVd{Q)lPZZϣV9{]RmK%zs[-ˆ3yraRI?{cNjFs10Ʀթ2òb)"ociL?DeͻbEag\ {J2"ÛB,Wdz{SD5/[Mmo f6Ҩ86l([.!uJ6bÎuWy˲KJB떆؁;vXuxs_9[uʕ6pUZGGD:d w[H!+ԥc/oz>Ty6d8 nu@}Sk?L2yy;nskq|鄼MiK{݌)+uiLzXi0}{V/|3/u?81B>y/x֙[m 2feXEViwJ1]te؁b``Of|"5lL-TEK%w.K%?ACN͍J3w؛lv5|yM}-ϲ\MNFM2{z{+2x;ravyT 1!H r\Ǝn^r54\&>yfcĵX-c\M[ew-܈TRjqH*4 z~ T2rqVX$v)nCwJ<=7sNuLn2ΐ\v=[Vkh@zrauh` (v.d{7ir\XLIqlkܭ@7*VTT$'&IP*?n:%dM޽wI[y{m*ŭ:_͘2394&V{ Zڟײ?w]\&(ˮx6UY< dPN}%Ms}L&4MOXw9;y}ަ.ph'Yx71rڇ-_dͶw@YstU'q bwSx|~YoNy@~F8s:#OaϑQMQ S@"z'?l< ^ b[u"+|6Xm@jJ"2/|X_f!xOf&xz|-^?'=(?8Eu }_^0!\+=xg@>4CBƛ*O ξ2{6GC Q'=8Dl!BӓXU[W)'-# s&"QB}dQ d;۷+*,Mz5J 37EE p/YS &Df3Y>q⌫=W: DD KXmTIln.ﶂ ^m'ޝA=-RB4@GWEdBgd^VH DJ2u*'؍GWGJ^-7EdfrTPM2zpyp8F !#PvԉtŧOn؞:: l*h @T ~U'meFjBڇzZ%<M/*XWyLJ+̼\>BIO_FwDBTQ1s3|Pc.C@ -438|Bͮ/wZ?Ļ[?; .IiG|Ӿf vT`C%Hi)]俾ğ%kFy]z.TA Y:i8 ʠf#1Г'q b9z!#: [0]W8'xfwX k=0uZ—HrV 9F ߔ#B_]\HƘY6*଀Z@o h=p())@&^_BԍF]_E[-mf3g9s.?K.J∐Zinu:t'ZX5J>)z晋. ]G2?{ĉs^iJMMMJJVT """B8ڈ:=gSz+wTwqW-ww^P\:JW*me2l25M+nԣ2ee ;푌 }=6cQjW~QF3f۳srrѣQmdgggffnMq-҅ n\'۞xd Es:){ٻQ{S) A_yN_~ߏZ.]s7Z^Xy35w.C Q?tx.rS)m&M5SaNIYҫqcQ:c9TT)xW;n9=fg5Ej=pe=r:w}uƷ '[}z?x?Gwwfu_ɡj)=Ur|Fg04˗_Ͽ-W?'*J; LNilc  /E9rJ&ͻu.,JMLPhi)rM^L8`L4 CUgTzwo;Xahtjm_4x~4SQM6z|mr.P)}DǀEHà7y\1=8免 n˸꫌+`jŚi,4O?FONC8ȞOu먳jr*"Yj.4˩g 'fؔ1ћv~WzAZ!He2DUSQ'􈈈)URz\.ILCfTJGF PeTf6q1t +Ϛ'V3ۇ<1MrF(S4A0Jb9UB}/{{%N Ӧ(Np;r…8kT'!9-L~~>5l,~ۼ) 7wvLse >Zg_|.C9ܶሡ}uz1 z Ǿ=?%WlO\eVaTdGN3'kfSߴhmg͝\2~^G{hME.6wpa?]/Ms [ir%rf9g !tz@,g6%j扥symE m(W]E9~qVQi]Jizvv-W"eG9'6pJz$W$r5MXjD-^mOvr 4o) e}bBv+YC4jl[6#,Gh!zbZ0+ڵ>#Eu8@>x-(Ǎ%1^(KLZj Ռ$ CC9GJR~m{7rfUpLºxx X4aK1ʽ1?2Q7gpV_%|~F_喈T(2ݳ՝32Ez8x<|.h*}tj+!TȨNվS?g}ŽߞjjWі“r-Ju#qEZM׿"]oLA#e/Nޘn:vvl&#oDĭ 6Ԩ6;O ϯYRq&q<]N'|wLJj2s <(.$6lQH/M7RX}l֮ܵ͜i5yG|qW_ewިYrfHNN"I`P0 ۯLJ\p]5tǡ.;;IOOO<96?_5aZ;vCw7ѝ^=}zdw%1Hqxxxv$Ѯ[4;, EU_p_Bs֯$) |ia;ھUduZ3G=D[⋩דHb MKKKLLP00tߡ݃N$ݛYY>)) cu\i./[o.]>ځWHХT`mw?K Se\zǂ-mn(lDJWږ ݙ $PQz^C5\F*u&Vʠstϧ`"|RģLTp`.'?moh8tit;R阧劈ӉsEڥ/ WU?ngoȜ V٘fٽp!:d˹H[pѿIɒhH0˹0KȎD#`uFv=z"hs HFHaۂȖrg[%u%Xjh}j E?e<.-}P5ڊak(nr p>[>ģvC848LsZ$b~EM$1B  } }n R+1Q68)M*$nbz叨%5VT /\+- С EE7G96uVq_gw{u!2x& ՌLbm2ub-1 '-xFmBvM6fW9/S-uS'%& |RP*111ZRiZ_=z*(lL67G^BfN8)FI=^{5eǰE#\4y۶mW܃޷#66oINNM2.ЃH}m6w ꫸ JJW)*@  {csv^wpb@j7;TQ$N`{p-NDI&nGgʝOR}v9~뵺e TW^1#::FcaI }r߽µA"㡰MIQI|!bA=L*)n<%.# ]N_͛Wf<0iY+\[N.Y>Zc;&n/ *2`S$D"eNg{oڙ30mZ҆ IIDʈfI<eFFƄ & 0Oy>޺dB ۗ^~R(qL4Mkk+5 ~85m۶p~Zh?Y3i^$5ƈ#3b:{a7UI4i/]\؉9 ,'05@V+Je#_إ^ j{/55uԩWO>}Сo]|f+viBXJUw&yʍxywfeU׵;TǂY tz!3b6ɚNc 4ih;yr5׌߰!iz@?Paiio8LekL*A7|\䤂iU$O;K \l Q<|FyGMHH@͍bQVU=pcg~węӧD eArb"wU@XhCKGOR-(dgQ99ǎdہ]'nQ'IYzMxŨ۫ߊVwF- jg2XtjYYC _qFx6}+.ucwϧ?;cMl38dI (Z(+O`(Ċ'6XcCLm-Osu,y {ܔ(\H_&N{r=_>Oik^~>Z2VRbv{>^R9 x>jy|o+QtF VHm۞*̊fvJ}|>) T $U@>'FTm,e .$('S 48Hb-8U7vO{_~wYzU}K:(So~p em"0:u }9֗e/ zǛ:.t]Wޕ$4,PIJEDbBAONv}ͅ?^~9GrHnUb6{ xՠddd$&&"M#MHh\dTW.4@3[P8Zhv;>^97Ȍ/T^_3bxE]C~3m?܊ߎˋyrԩS>9⌍QnFEQ5[=<~Ֆ\ŸzNGijMH8P`rѡqH\6#޻ι@ʣׁP:\Аk=p`b;Ab{NSTG&ڟ c(h4?V?J YP(V| &%҆ /9'*hɤO95$LXl}s_IL=^śIAQ3ϘX| s:)9y&*dz:m9Il-2B{o̿c˱S-I1^0 |xd`1Q "ڰ4!MH:#58}_MB<ր$$0-MPxBf,Kkcccrf&MxI>?|e+'CFj2Z2 ƣ<@Ol|ENZ r#څ߃{}`^y0V5:JqyD}]dg岾 V!\ WE&suv 8nGHqqqdmD~B c(G?6fQQAc6oN9szSLykƚSW.*|4qkZM敇{D&0L*ii?{ 12 &wt0NF*%h\=x6j-,׉?D?GÆvEyB82.i@ӰKH8B1//u9yԒC| ^Caa!#&wGFa`w`8WD VI/K֮%{ʈIʛL+W;T*0hv6j]]q]7,aNKgȮ"!y5#e1>ݪ1(阃?n ! TCϚ:=S|`c;lHSGfÆSVٕ_K~劧P1hhJW Ԥ|6$D`˜O$kfl1p'+g4tq9W,Q&)8bneH06#L rӂ{>زdefN0K/=+Sp%M2L^afpӠ։X,.ִreܹM9 l0S %b0}MFF[AG^g=>hG)=Άa& gCn5CGqs}Pd8X0 ؖa^{9ǂMpv#AclN9 T4qv9>\1iA$%ϰ)8TP\>FoWp$^ j4?o>LG)^pM$o 'ÛC<1\0lFj֓kZƭfێѣSdc;'s]7oğlHиKW XK.aU4:W/Dtz`ӆ%ۄ#DSMZ{bS$&15 P3B5},"}NÎ@ȟ;W45 (h$N`{6s(_Ju'R,؁[wI!C2ϊi5yYECi˽B\^#L%a!tHԸ bJ B v1'31}CF/MWf<ؼp]⪚˩U|Ry6YE2YYX,\y 1 WF!n#5=aW~qL_mOO-,y~L~>(555dfHՌ<7Ν|(nٵϐ|\6QPp:UlS}&K.@AB'.]JcZǑɻli[ ZXAʐ fĶ@q9BɓBwM u2-Ȏp3-+6a;ʩbn|##{LcTSqgG~mo` V5W _X<&׿t۔HRqt5 zOCFX/i8?hJ9Dڶ¬}[JML]ƪB*V,w{O l@0w 5*.MkT5dr )V2ryBPJmSgΠUǮ~@F,O>T pCftX,6-nr.>.+<ƎK?^7p2Qྞ7dIJ W<>hhFzF.#5RPu'?he˞=S Kuu]]ɓ'׌ &L.(@_'hd2TiQ5C:)ՌjmkkdpME'p}m3׼Żv(2οf]C'H2y3JUT4i;6y/z륗^xiЋT{復N:ꫮB)O>xƷ.@g6 J`P >׬꺖}X0+#5a@ERFBU ہalHʹtuuŹ܁|]1@UHBW}aˑ2wC$RJg9|N_4/nUU 7m۹ 5O>%U0y1LfQ!Oz)8dgQ99ǎdہ]'n!U`8c:<ݛ{WX{j]b&;0 Q4~OƱee**DرUOJ"yN믃i~NKK8)o?ZIII_jѪ_\c1D&t%TYS^=ǶrVБ:916tIt:}g1mZ4T5P׷*oQcY;n|DCKT"HHyRDFJJ 4 zMkۼyf޽ƎHTTtlLl\LKMNIJ<}4ZV\XC^FO}I`o"P"8Ulq:#4#JTD$&ľDRi޼++J/ՆDwQr>wXAO U wYJJ hn!s9j̙3Cč7JڬGM@-M!ehT3>b>;xөӧqɭq1J<&Jh;*gޠѨ&l:k3PR`,'%TkwZmee!cb9gqĝ7vd&m 򵸞'y USW6:u"mTғ5#yU<Ѥ`-)*?f[[[+Pcc|J~7@ pd7vecN-w4p׾!L&JHHeRy"*J`!AhNwlߞֆr.*ނ#UHED$7CEE~{[HtlN~b ^]g|SkztL90b)( @x2Ғz۽L|= =oTTJeqU3ϊ۶xS% ,Q{"IS#9RAxpiBe 9L}}}#%K*Z=g.aA&IsC;\!u;b&_l꼇{<|?+_O&EFF&%%fdd=Slݵk';*DI N2G.jb{zpoB# n jrKf\/( {oc˱S-I1^0UQ|xcLHCBIsA7˰K_n7͍NBX f~ qRPitjVAinW.8y0(*;~i iSRRӑi9/nΜ_~hʚI'8x0'+eSCRU(C"պ?q\6{C vTv0ZQˋ&Ҭ24H$F3_Kq\5ư(Jd۲4j)/tU&9a2d&+n:]O(x1wo菠@3I.|FKߵְDܧi8,vhwى oh9ٳ;]ħW6]r sZ}4SLAoW55qcǢi6;NR?U(C_?x/`SAVDuB@; L*ii?{eheLhg+T*A\}zF>pN4W5#u3E\\#ȉ}iPEQ V{m%a+?r 36đ# Z-k7~ᅬ 9R>+]ay_76ud _y+W}xT3;͊f6ޒ^ )ƏLr(MǠ=BsR&珎 C1$CV7-o'~YLa!ߠPf9w"R9x8z@NO>)H^~>:xLww7j1[YP7/wZEzO)kCC|{@UvWTw#O$pOv]3me 'j;bMu;ϻw{VjGީ(n5=yNDDਫ਼"#7Ott~訝93sI%$!rӂ{>زdefN0K/3!Vg%qٲ/Nrba2*:jXD?a7=7x%X lQR[O^R܉a~5 4HDFFFEE'$XfL2kV~ \vΗ_7c? *| N@K(7HVҥ_}1Jdb0p$Lx / Tx`(TRzW+W8y6q6g>WU *W# O/oTv6U5YWg>p^=ts[,$bNuNw+3G^toIF^̀y&'k& fp8XapQ-?n:s) ".MF5•; xg9ivэčRΎF*96֔w>go?u o~>kR$iZ|dvj5͕]]]˹Vȕ9bGi=G0t8.[cV1:P5MO`>d"> ĂHTNQ3<=BDJwݜ;񫯢uϖ?GێyE~BV1Gyz=QfQ>|M*oGXhW\x˟*䙙}¸Xn:ި_X<&cFC]FSo4BT*U*Utt44mğ/HZSm{SldaD믣ώ3#A@8K$~xM79>tȣR̘pmEEHd2c@ & mSYvwBzDg\xrJ#ͥ yٝFm,iW_+YARF.+ ibccqDHN;jq91޷lnE?gfB%_y%i@JлՅZ?}V@6{n]I" 1Z]N;~nLl %e_S룚AX @UޟPCFt[VUeOBʦ-)uįT{G}}*hْ֭(l dt {::ێlnQ"ǫ cW^*035l e gd ٘ T^Z:ӓ, jkkN6 ?Lm[#J |RVDMfFC1HĠﻻ]]ͻѻtOt$bx 0=(ZFI$p!}kH'**:115dĽ&...!!XkG:qhڿ?65dckGEZoנ%b(oc G5l8".5+KIbIfKPF?jL9e !oWLR!535cƌG/eC9׿ϖ/ c7m κE 蘆nC_Qw$ I^^]w+J˛d aXUِN( E^;A7gSI 7#B>yiidn"+ Ct 0r-4 TJ`ʆq+rhdd$钷t໥,اxƌlTҶm1eWW% 5cٕ\K*_u-@tH>:OxjwRUW ى r%W@4WQ HW! {7[,+C9&|i⽋c%%rwK]}RYV7o'_".kXJYW{)7.NrnU*/>~ 'leZ){ nxW"n22MC_^s u䈤>u#GH8<^k^͌WIAfXa&D}i)0{T3&tSSJJF|n1Щ* !-S_TIBɻ#)*˛YliIpt<(Q])'GXG7 D5c6k`d`Do}G|MӦq~TyIIDr20|Ô@!q/ 0↼Gy IT{ҤiQV~g‡g~+$ Җ.gz2f"By&- l2c$+,-,j 6x6 y𞌼7Hm9l[N7jjP9bNi͛ r 9R0@"r| 0I{v D?qͲtI Ҟl +."UTW.ASF^~9ZD󓀂BF4$9H ^F N |d"9i9O"9%KD)~b9/@'qIaP'>Wy^zYH.a׿#tddt-\(%2%bD2=ot!E؅k^@WЀS00ōO}#z#wIH 2o^KS0>믣$O6(_}fAҾcwW[D C@2WdoI [ s7'3\]A-7{*4jW\CF2E'㿹Rx;{AML4@癷rD9mW9K.iLPbRźA&~}wbĉO*cZn-=3~o P/$bU^b]?,®JkotH8<:TCBuWh.ЛE+AG4Ҋ1z4~GGe9t8nh#v1[;;q'.!a?"cʁ(Ayd +R l1CgF?7t9߹( N=z4"\D3lp'\4B!oC!chy#7"na(e$))=jL mhHپ=3fs??C_ $<؃ȶl'hWksGBtH)g\}-:ZTr;?:g*@jC.!";6"q*d P00oIѓJoӎsr2gNł"TGG—_F3M1σxj32_^eh+(x{Jk4H0QQh,(%ҫ7xZ2mr|~E<޽|{OlOʘO>Ma\X tJpN,q]m|(2!W$\D€u@@H2HT9= HDxuDe~ahXY<+/ ~Lv'inN۾=Ɨksg|>DIW^iOH#!jPaRju@zEip&#.#Ѽ.],7XQO9DG7VAh!BI$9OpfApC'o9z)'5bo@xc븬4"2h:_%6a<\#p僵xɥS}`P rDOS?Bu]~O˚i1 vjtf"bEfff$H_P/`(hE1!ra@~-?FTQ_4Bg5hv3iii"Is3))i)P=~A¦840OgxϤ8jbBաR(b(h E B(H| AG `h a(4= hn \478&rB ! V0A.h@zA4@  bp`0HTQprA#a 4fr   ԂFꄋ@ E@ ]NR0 փjG xiFbB` ͩz\.hr@ ' j)84%)H(L41 H2FRWФ+p!jI#c+\CmQN7)N1؇F. A C f@Bٶ!R0Abpf:|'PA50 DN @OHRx@u:z4LT'F2 A.h(;Дq@`=qhrAC A/h(P4@ @дA@#Q) 4A.hB@p02 Є5k.%`.0EBr cZ[["!`%+0 #͈ @0+J2 :r%  a('gz$hzA&/d(vLQI(Ep )ZE-۹sYp+-Q hTlVz+ee3+j|]]ے*lܧk[a\;,at-.:!L8RceHT-[V[VUSjkv j-;Y rjgYZ𓗗W[UKڶl&^,&Vx'*$q*XV_UESUUUZYh` gG&~&^VԢbյ[YUx̪*T@޲e?nZZQ\[$ //)a-Ê S6b7 EzQ-<hXB P42ɳ>TU˫]uOg[C*]+ۄ4"';3$*lI{Xp¯&0 |^eR +D^c;@"e(!T0 #HF 4CZba92F9ׯ?yj Q(eeeˆ7B4?p.q&zzTw_rrrhlCCCEE:?.Z?}؂rxTrΔԤ8Jilmk7\x۟o6Cd,X~piDjBIl6 _.plWW:#t^9CnﲌۼPؤc4èDgKine?8LIA5?M*2A4LɽM;'gE##Q4`ADMXtK!iwj4Hi TK @qDNrJh0)5vn9yq271]0 @U |,h4xwh濠+1ٗp{"^gKLjFWݛ{ 璄U4NiŊUﭨ7l`0 BB @TR[ CL w ʸ@i(IQkʫ5 +S*D՚< S3=M%hXvlv=e<N4fMQњ5&''JD_ Ekjt6/wFww4oh0XjV6^ۜA}g zD]8Z0$Q]^P^m8AKTOO{vi()1஻JuF[LҙSۺU򄧑+)) ps[xuzl: 1T?lL6}+!rjÉ%u* M>CI)E6sNqٌxn(ʕaܸu Sїq}nqWͮ}_}Id[(%[x^1 `A9:-k9l$2{(Q% N5𥷼ECyePuEq0_gJxJ\d~|hlC v1MH~0awxy~)YVf_}5Jj_}xv);uKc=1 )B.4,Q:0plKzv6rxf6 6 Fכv@Rk+t&|J؉j\q. ,V?'+k6#{J@Ռ Mww7dcq.F3#6]5Y2O}p8WfrwR=UĐ1W]5,~X7/%k>ɻƹ7Ym=#QNKTWS|$zh>Z-R:Le6j-zS$P:wq(AYX3i+H:bPkr*FbJ4٥)_k ̿uؖBTO ]&lUA"?Y/Uqlu>4]]]Vqh4X8NJ}4ȞkmcfRm9vf|t%ŽLOһdM]WF4Ws^|wW>l)\+4zAtO03zc9t ڻsS7C m2C1@dJ;]o;|wO?%.)M"j&j GTH=H$ )^ '@xӴeL&S(H{^5rld bۑAD4Z(癪*ߏvKZ8)Z 2.T*#""2JfЂO (H?{EunwnrKX.k_BP`ϣi>-rҴ>Jjk-EnȒk$g3lB2ǰΜ9sߜ9绿s m' U*Iy_TM>4 언bBր(hxL/$H4(E PEPhe.,U߄Ƥ9u2ыO '` RuW,bTN._4G'}h|6}2sY'/M "e￟riDJ`qt:银:E@2?LKKMKKNN&ӧD̅R6fe k@4rijؑJ,bz nRRRt$kHд@րVǓ2Dˆ . 'eW+DL[:4؇( 782klƵF57o>kΟ?Ot~?Cf|asY%%f/rnn=ܳj*]eҧB OAYY]JWrZ*x{bԓMJJ"#KKK#4773o͓slK/ŁBʀ?CbƊ9ɚׯ3*++:h.y R}fe`kid ܰac:vlٰ!&xO"͡v9_}UP:nw&hdQ>n3^z);Qz.@̦f^oGG7ްTUǎX$h8YYYl0WQVϜY^q `:At:[[[7P{fM bfוWK][~E,T{h5Mbbfm~e!z6樔nbYiY8 m̤fkHتY'NϘvGSkgmlSqj 8$fM/λHcMC&JII!A__p|Y~xT3RLv=a'Xx nvĻn-k.ݪo]t$tfϖ6BͶmPWygkתjvhX. +4&&&~swmhC5?{'iD.CN7vіk-ּU )Jޏ7>>ujW_ ml46@CӋ>]f}>p兔i,84xR0DIJJJKKnkk;ݭSٴRy=UCJƞCj̙3oGhB̂:䔜t:OΘ]nxR J>z.u.`ԛo.=$?{vt#GJ7 )}U0MG:->EK>=3+11Q2P3 ^4 a'a#HgKF))vT_KA+nF?*^tބaːaUEOիbcL2`q&kt&++5'z֬?'Ns|dm&цG 6\ëNպaHgԩQӧw_2 g$fcKHttt=q-].әkWq;oF; щ{T<.abHDQ"ᮻ23Y*) hܲ \5.II%\aLP8a;w?.GP蔊϶)S.Io&'`/ׂF;_M&栐Qgg {F8=gquON6Ka!).i|]*c3 LĥaPg棐aSkD`a&8o=tG{I̡Rd"TWE[}&ıt,$!&hԙ+Z$}Fj).nwHƏoW>P 1풪x_شV @7LKu:M'h%H CݣS* ږ,|.GSh02r6@XA b_',t)udB*^l~!O%t9fI<<'z/$Щ:ϔ } VK LIq, n@[tIUr\?.Xly$N C&`IFM-c$ߌQ(cƺGT$g1tP BōW~]t T{ ']ЈP403C``¾0~ '8_AX{,_eS<أhE|gA0 X`@@@?#O ٱ` LMMi4Gzc W4 LrJ?!`^D` ̎ʵ 0I 05V7ki,_ ]Ae0Q 02'Q-;X<( z909=|+T~~sGKM?uuuyyy .whiiHc?ovAe.! mݦ Сslc/Cnݺݻw{s?0pi$hbٸqŋ!g>b}S hvASSSSTTq}>[NOU՗Q]]+ XX>f+npƌGXMpĉo3ehϜ9{)p3q00qV1?7lPRR~sf&&655{>#!L}Qݱc ON nu QւZ 1bO~yf$l%vw9rr+%MB^dVZҲsCjn7t mh;qP|;No Yc;4ꫯiC\nbIMLYBMZQU|RoXK\smoo;yɰC&L˜N'YMy` *ZF];wZi`ɖ-K 4,[;0msV׬m[6n6.Vyobj{Gjzg_~y]Eڗ_ݮS.+<6 6Aw8p`dxrtC xlB~;ܜ; m='N|Kт+3ȸqQBY6Zsydat+ ]v49~xe !ڙmt:lHO XvWX ( CJeEu)rQ\q+W(Y^Z>s+WJlX0Y (aBwݽbzD: ;:NJᴡ4.+X[Zw۶@9^Tg]SXhqu+XlP۸ek*jW41V.._shtCNVRy{IFGJN*ȭX/X//Y[E҅ !ACь_AS{;ˮrw4JA#.-KHXBiIۺ]ݡl;.3IggN:nw:jkO9sQAHTY_•6J6cVQ吓!%%uILL0`jU7~񎧞<4d7oo3K" h< sh8hf&NQ=F;H,_^/Iqc%VLDM$)ugUQZ[[L5 ;?HE޽X2]Z!a+OXi* u@"/b9g?}+.C}f{oPR%.ׅ-9Zʖ7GCYӷGO:UPPqF5d„ go>uaÆ!ٺԚQ  ]gFP !boY$|^ӟn'$$lTb6T8" ȸ$h|^xA IK;rȘ1c|遠1uƐ8m"2lذ}04.*VQa-0`2Axw<0`2Az9 p} x` HϡݔpZbŠLSt !h`~H`6.hx]Јu .h`^ЈpFDE}}= UNb{v3gygrJJԩS ~AFa`&YrHdk}cǰC=>߿y.z=Wff̘aZy^|>6iL,hDLS>xohlt\[[i/Ojvt g&M:xy5ǽ{Ŀ13iC,$$[TAb#G~M7jz7?NoΝ;}v1IIIÇ UMVV֌3vEۗ_~leuD^V50{U>.'G3} =]ZiTi'h Ԟez\ )DםnEdx),6`"*omkrQ6h{1K_UU {M7p wML%!!b0AHьfu=dH4oߑoJhZILGYs (S?nwG,p2`iwT*_X(-$-zQ:tn ڥ^̒9rdRR%B---fH.MMM 56`U/Fn|`/R4Q89Kj_VVoIi$CeeeqqR:; ⊝ejhEGAhzF$UkL%\qƌ:v:6h{1K>GRҠR0RƸ /]YtGU1-}4AWDe[A2N.tTreMHaDЉ??:,5Z:8l"UۆNbڅ-K+vuîi Fp]bŇ*Ū(U n6tبH(Btj4e.I$&&vttln[T MS*0C3 }FIGo^AZ3͚YC!jqc:OLhOi/y ֝#++ȑ#Q ('T#{ymam>x% ®-2//MQ"DrNZRG)YI5 ẜpzCNr2I0LYyk`+XD8̈h}IqyΪ>(87 )rJ-`JxOËh~IHQZM"+IdeF1|dK*Bl'(/˶zLY,5 j*쭽\jio@bS Xi41% "B^EJm89*j&"6 ]lvK\isRZ8ET nvNTnP ft2"-] Q9.fUCUB]â _R1&Mο#x2.ϲ+_/ͣ<dG:(n#V4L:OΜ(ldv-A.YB=heT̓"4h"fW$j#((E"Y5A.vb\PGٵ1&1t>p ER/`ٟEIENDB`robojournal-0.4.2/doc/img/screens/jc1.png0000775000175000017500000006040012142060704016720 0ustar willwillPNG  IHDRU,sRGBgAMA a pHYsod`IDATx^^u#]+RCWۺjPR['&rUĠ^MlR",(1` H\-D%\$$ ̜3̜sAyٟ9sYQ俟P88@W]R?c?FeFot{ԝwީ}ZA|@ :+z&_vѢsUW'O/`88Y)33-:0`8; fֳg;zy8 ā?~cG#88`b1)6Gqp8p̞#wxR'}L}m߷խw~S}ښڳgMݲg?{U_O OѨM#p ɁshnO5]O={Uw /Ξ=\zg7M/}4ΜvQ&? 8=9{Oԋ_ݞn7Žm'3]s|c} 1eoyu-{ie8p~Opcu迫~5W^nI=ߦ>nOާ!{R9wS?яK/hWk_٠>żskW&eǚ__Q:9곙xgx} Wh8}zKׅǗ_߹CֿIAnOS#s}OcwNyu)o*=y뭷ӧ=~sϩG:UY9O܎skW&bǎԻ y⻟?gbWmV?m~;7VSW'Z^zϟ?!?zu{ݔ?1"<t1s|cFl^~e#2?zÇu]S?ԗzc*k;Ǿve$;P?Wt߇oV?TPo;>7֞Z^=p:{w}J#2=Ϻ܉oYVnO|S9mo^{539qWm6C$,ꗪt]%k)\:8oUۇ7z;SޒO][}OuJжrA&2$03_9>E` ,G3?S;I#>zŊ{;(+“ѯ=>sӁ*ܹsJbs1#2zC[{FDשPY^QS_o-W?jg姮+?J &Zh~ ?q"6e[a^=Eۓ,vSm+ǧ(,o;ڈϋ/Y[nOeO?zF_f ǣEB}Quu K}J߾Xtg"VA+E_B<;~}Z]^99s~zI@ nVcSi۔f1]W?F+ǧ(,}=wS޷'Ծ SEFtD{)s:xK9nm̙3'|y߿sgߨשПwR9xG'uԯTxn;s|nT?I7]n~_1;xrF<'}z~ݞn7˟_?jƟ>r[(Z*esNuM7oQ}7V3|?]w (/`ޣ\=ZhqY)sYQ~G]{yut)Gsq۟|_?ngǿp.fyM?pnrsg{]EWoCMq#Dx< poW>ݞn7ŝMyA8Cq!3; p?}ϝ_R88PxpOjH0p値'}}“ &p fl80* < ܨh0=Fh9@xpnT-HlHs80* < ܨh0=Fh9@xpnT-HlHs80*FnN 02K̀0cῩ#)0L]cf3/0L'OUy3 evyE 3u :s @/=|~1j-'F}`G~,&`Źvquտ[V(|.g,mV%L` ٺTaժTZ&#W&G^ɚW_}5buՕߊ+ ѸR}O?綛US|xF/z-[ |RQʧ}#kG$h93£: ɩ@7ϻV%<=W/ M{.oE~S%mسE +8("+[M[8[n| ^D/Xmpٶοjvzk 7,-8gYQ sKޒ7u܉H̯ Ax0I M1B2{B řTuO){cTʼnɮbef6Gdfdi$Zx^~RTe[ikEjeS"sE߮F..ۺJt]ή"NӆkWjzs>4 O3ߔW>q*EfGWX/[X{j _x5u4'䫦rĸ?W7 wƓ'CPWWo*㙒ttBeOf/P!odzr%jjZfiR &oa%jW n[a#}wK6mmP~v:-/Ri>+ol CC&7x-s}$a/cƿ?%3ퟏ y K^|nj`pY77M#x NSjxy( Gז<#8f*Gc@xlx@;(~@nLgTKlŨ7CxL`N+\ܶH }%Jf1Y,@G)“ 4Yj[uʦ@c9ENpjqjQƪ-Knqa["48IiI^%l>vY l-Ȟ[}@qC8c%C )3#!vq!8AY,[I\yQ46}se1n7nS#Yf1EsKL˕CQ9Gѡg<Ԅgz̄Y|H>;BSb ܽ$-|ZL%>=zb儓nhl.rI? Pr'AmYgOagax@LnSה<9T!<ᙆ&@`6"FwR6aC6NSfCx4 wߥ=H6n-ţ/ [8V4t͹M)c_O:sԕcﬔKlTޥ4)SwE^Х]^ٸV7zd7ۘ \@tJ|I*3AUN&X_YUcOt\Sh{Ꜿ/lQ =YbՖ @7&51pV%ɬ "nW̡`X۲%ؾϫ| $}G'-z+.ur(mzW6CP,cEowuȀŭ(4j7k+[enэO'n-B< A6uɿf$p|LR z12B0l⼿r]G~~ZM}]V%sc%[ ,_7n𔚜7铹@(R bc֙sN޹PȻ֝As 8 Z5t#fH &Cz_XU:^\S$ jr-*ĩ/13yS_V +7J;7M9;s=/f$&n+/sضFO]'ZO Kz;͟x+ OQߪڣ/z"fľzV"UވWk}!K/1Y "/n hԓ[KZm1`؁JmV.j`c˻*8M7Btُef}.>yz3}Cp,I׏/+!p1gWn8W#`Ùr\vgg|kLzIVV-v2oۏS: 'mFb7<;8U Aee؉"@@x)Oy(m-'J @@xzU @OKlC&U{|ˆZ|Y8v۴7|ꕜ 8Ik±YG.^b$^?x33 [Tx ؤ}$ FO,' \QQmć& M&.M *aM zp 2Իȓ1ɰ #=f%͌\}%Rd-3Ӏ k3[KJSFA6VjM$1GFij/1?2IH'ir'k-Flen .qcgf\~;*j(~" \{fR=lLLnВm և/L?ĸLbXqI=Sr}:PPA[ " L\jr~X'uD0ewc$ 9H{ꂠsD.RL$>$&B _nbd;Qw*h+: )}=q=' -J|H^O #7 Ib b-<9SiSt9ǎX)Ac^H i7ZH<3g,Eڍ&jh*HXL*% m5Tk\e>vjUs3ϗ|J)x0He$͔f .3-w~IǑxg ׊+OUN뢬_. `3:h @x92ir|#1ϋտGGqQg, ^:O}0pcTx͞"S%^`rKxNʌ2g`*%DƒMW$ksu$I'DF$i`$bnTwm}$?t!{IX$bHf EJJU$t3l}>h;sRA~ 8JzFWo6\"X!IkKHKkܳ)Qkf,y'5Fz좹>Q^6?@ O\j3)Qc,'N6aL? K8<;Ie@JU\|l{fߟڒ^oN g28%~!pgeAARIЎ& LДsARISc;!AVBU4Õ՘͉kӏ'c$׋P '9㑒 :T}f.&LM]^^0)f{q@?#K҅+,5&m.Ϥ_s6Fd*'7떒Km9\ 웳u"Km1Yx:!ujޫ6)uKNI0`eՍ6jۙ(ӄnlaX/~}΄`B<9fcۡ9^+<27}&ʜDn cSVLI[Z*Yfx#5W _ tDaЙxQ v*7w,P;olUqB 2g Kb)O1d%'{x}KO,Xb_i :y8$n N BK-+ ga\ | V ¸@@, q%: <'X X < Jt 0@xO 0@xƕ@`>̇`%@`aހiЉ@po^|g){>VƊWH,U}٭E}ٗӳcTylܢj5YzfF̉>"zJ[߲qbUuoYZUh߸eb=; ! 73mD_X yPUqDeT&~A;_Snٗ˪Zkg.˗W՜U9}#FO\"q$fda`뱯Ewnj8 Wԇb9"h w)VkC!Gx̲D`VW R)"eگH~ εr v ś*+$q@#夯.7ֆ_Co;Zo~j}tӗ*``ڍOQytUy洙S"t}bF^_ c׆ Axr]H8#Y£/b7>NJDɼP,,V7ws}dgdۤl-iNp6] Fʧ:{0 gKt.ӛ[?H>g'TbV X? ⮯jQJ >%e\9nؔϸkFr}DMk26%Kd -8i"3$S[*q1rotH 49ķCEVx3d:}?DΕrC“g;[E{ǍL Rؙ9_um`ˮH<S*ҚU“))i$9-K>*':%xm][n["ٶslkOn:I&$6O+<~dBIP30SI=`yBؑSCz/c(@(}NrI:#gߌD.OίM=/ӉR4GxEZeW '.#[2cuy<}7l ?ӗXQN/Sy6*p+d k5)6^;S{d3)q,%Y W1ЋJ"ɵKCeK'=:Hҳ>_O:p- .[x~ߪTn޽Ù lT˵'%Vmɓp~lNeEFבpBpMW cqϖݴCGHDz6 >LahXȖOM}m*WN9mԊSKm'IޯbÉH^RSҀ('.m^S”MG#:#@[ $D,NgE֒A>iF$So&);_Fv #Yx)0s}Ela&dXRR69m/:OVe݉v MlrbgZ*^g9'H%GM*)ͨ~7-?/C`=n?:{W%K w#D\b@Q 7@80{H7t]y}MCmn:5t=(0 N_bW[}}ȵ+c4lSxVLE“$r/ҁ͘%9 <"vZ.?Y H%nL$,1!mOhWF}$3nBUeQ6?:}΃dv4D>NuO)l6> NbCKsկ[^ -.kx kg5_ 8xf&Ͳ|r Od$cI9eTY|B/)pZJT&'TRԻV2/D~BO :k?Kvq\2\nR"N20ݙUNI257 ykRd OٔL:wpu+ONdDc+H!R-gG&[͝CAFf6R^r ExCnPjlVWT*d,HK]+@5Ak%9c>'7ilaSSx2$+'%Œ,Kd嬢^ItlَI:JԶo=׷Cs+d'9 "$l%LjXjoo@FVܛ㓝7۹7KM'Ȥ~fk%)~I':ֱ};K*g1ŎGI^k򘼒0os*%9 /Q=)<32I ͞yy2:̪?Z@}RE'lʰ%ؔ[Z4@ğ~;nFK7᧊>a|_`7pOjяl agao'I^yQg$5]5=2% oArM\kgqQ4_HhhWWx*&#OJӋ^PYgVdh.PxzQB*Hg'23p,ETLk6 }>AZ&HIOSIY2QF?ɰ9bt Lj0 o/_*3I,Ջк [%TWiPMRZ?/ӀK ~#\CFf2^h D)ߣacT$g֌'GM/癫wTxrSmП|X> ,RŒir} O0fɳ)+I,'/uAx2{]H@g!$'Y wD$Xג9>I) O=@\F:]1P!%5q#c RLLIJQ6m\ĉ'Դx)IjͬWh\H8?kIHE2Z4M@H-2C,ĚLb*7WFJ *lmdaFuNX :%HmΎ%:s>熛!̌ZLjoGf$:/  Z!`T%}56˗}?|njYNiE27Y-4m\koy@Q @d" ŀ@ <1hi5]@[w' 06>'<..R64eg?vwAfvD]mV0]}~߁@@xi\ڞ޾X$1Ótz[y&>CY 0, oqZH YID:V.)&ITJHRzθgU6K璲qUag,[$- ~ՙx/@ t}@2HO%Zv2AY,%9tu}F*b>i(2)<5;$b-uMLO;o{@w(,K##l4y[tb21!}fsf Ax<.uSxL HpػXGg<ٌc_JH|gΌd )%iy',-u^/p Iα։#AMhiPHsOu:ad-1h+t+kIJQ˼WdIKým֘_d%gF*MXb6gR^"Zn))D2tG7Ea$B“ f 2YQ(f̻  b@<w @,'zy <3"X, )Rb b#٭׹>}Zw~IǑxgʊ>VL\!}rnCob@,>1z) <3X| я~d^xh)>88 \Y}α Vvm| X y3e5}:u^V;pɓ'՟ٟC!3!;}ZZ.gG]RfI e~I{8g]x^=zԈ{v[搖Zaf::x:wZ ^^z?ymAġ z.hOKMzGQ_yn=5+^2vLXĄǿ!I#_6Q5(0bmlvOݒR?kBf:gA . ft;z!u]w_~Y +6=pCG -Uİ@~6KUMZ]lڰe/ހĦ6[aݿȽgr&mGpffTFg{1BK} QfȁхƉ8YFL ei5 XD4 W[i|r`L}msm/9 $wp9(87*0 <8rJ8v1p]vp80* < ܨh]p@x <87*0h <8r`T1v pX84Ɏ*<  B"00:08ɁQg< b~_p  <8M&DY3p`19@xpnTa#X~mpɨe1Q9F%F`owͷQaиꫯVW^y?@q/"NE=w?^?sF;8* 4Og5\^xqHq0Cx ) !<$iJ*̃5=Czq 4. D8Tx0 <8pOs)5ǃoV9Mm޼֎mqNSf7>4鯾jq+ R}>ui\ԆfDsB\£޼M_t6W^yEqBp.V۽_~Ws:Sl803-2X_~Yu?+?_]k%;/E㊋&3󷫋^K&Cxt <.g Tۦ:ӱ;x|MuرV6ksvZt:fYQߟwMתM~\]n2,!@|.vۚ ѣGUcB.SkR]wޏ.Kϱ RLcd,3!s/h硩=Txz)F]rtSמK ~ӟϻT,=>Ll @xJPr6;ֶUΧ'}Ɇbrګ ϻ/Q6\vWߛr3IydÊj߮,'S_4.XjC]jnvۥkKqގŧ<㪯㶏iS*SU|(c>Vk?뿽z>pUa#n@xp :Lx!]N]m:3803y&3ݟ#G @xp :f< ٳgÇq 4. @|xMxN8a<#8* 4AuNͳg18J 4 >ӟ)ްyUW'OQaиh|R}<LIҔT(?;ѾxL8J 4\oe%%K.~9BԊ8mȆsfKcZ@x <87*5B݃puŴ8@xpnTMkv1fQ9F%F3/iq80* < ܨ bt <8r [xtAp`(IJ! 8h@x0`Q9F%Fp`T@x@Q .F88 ́0p?ܣF3IENDB`robojournal-0.4.2/doc/img/screens/js0.png0000775000175000017500000005460112142060704016745 0ustar willwillPNG  IHDR{gAMA7tEXtSoftwareAdobe ImageReadyqe<YIDATx `U'Wm^ЃrZDE( *).w7x!ZAԍ(뉫Z U"(,PJJsͼd:MBO~̛7o&9$6 0ydMiiZB\Fyg-g,^w_-k۷ٽH{u~G9¸3=(H9莳3۫Ea$rJLLHl"Uc9UT*D- 7˽O)PRl!4(zNbYVQ*I2lV ׽ʑ[lIK«69\Nz)zOMu8vhT6UF(U:#|#w>p۸Oo6n{}#3_YNMbQ 7%,rs~gee`ۊz}^TJJTuӃq2yG)g53w οnZ~{ֿ2s@7+yW/GSF'gK M pe`OU4sqM t~pݻ_ 9O+}.HZiM s`#d)_}p3{rU?JbmE1^teTyhV.Ϻvsݾ q4 RshmTԕM4ڭu~khHKTKCQˑH: R)韙N̟5usiQsWEZV|&I #ﴃ 66;1B)*G+٪um?7*9<./?>vtF27J T5/Mx5o\|Fx֐}nf鍃@/ז?5R(/y?ӸSZNu&eyھ|2tàt|j vP72O˲>bO?I$^>\w]7vj-Qׇ!aXq,x X P|;Y-y ham.-̸:]T*5^otH9RC*y񯯤/o+]٪ L$E%[Lj5LQ޾{~yYgn 3nq\k^*k}/hi_<&Mb,o> f,+[gZT"6t'M`Ju?7^[LSgl۰k[eP`w$4hᣚ1I1tv:NlfΞV3g<8m/HeÝXM ex}///.E_OkkȤEMq$lԾ>xCE(@HoHA+H~ǝN'@4 WΚ —th3 ,gQЧ 4pd4YB/«]_4PDEˣbKMW y*Ixz7qHy-y$LUD/~./kpc޽eqpq9Kɜ}|Ӣ?5 Dݜ[h_I+sU.`W4|N;%f3yȡ1}tx[_ܪ#W`@\WLbο:4Ɵ2ْ&]9~Ҽ%s{Jر=F|ɗhHQI B,qe`]ȑ#7oՖ#a3[nLrw,wqۋ|,|rϕj͢u _sLG5LVh ]g qtH5W/a]nͰw` )iuj׬/<HIO2A$Q|)3ڷ?v=9YV&g3%@2'^ºʊ-6:>G6UF}9o:y^cN T%:[l ;yLl#8tUM6NTU*@ PTE~s3πVq> 8YlzQ Քcv@tAm`P 1Ɠop @KժDBS D4>C 4R 7rlڑUA)iJ/0b4L9lG;Ff F:K4d%zRI3J $-. x"jPb1 FPѓaqϳNG c4ɠ742/VFG4J8)TlUОn)֭dȱI\ D9Io1,T ;*3s-W@'bXhjX(c2Ydof \ &xjX e@T@W7Q)e ˜oc?C1HnE䓐BJ(Bc^ZvgPBE37W( ITH$WuQ ͅ*TP @s@8Y@˦WML.8Q>BfѣGN'6EXJeJJ`q@@wͷRGF.X 11[#,˗/'jܹ DnKeE>jv;FX̙ϟzQ-6@&U',2 2 R_,-ɺY2E"Щ_ƀ}v'k8&VZ'9%{%)S4z #jym#K9sLN[X}CED77-KHUG2R%?[il\\s qqcMp_T)'k;w;:^j+[4kT,(Mz5w_{$m!odKxw&_茨zӹ^e>߁ D Sͣ#Eh7j;it֪vCޣ嗏ðlem[oj,)Kj6Ru9S"SHeYz54=eM4(h͚]Ig j,(**"NНK8 ӰrL:#_ܭU,n*HUzP+m" pB2YZ j0X`}L=QQ"%#kdF;\AE}J!6CWy%D$_EnQk>'ջ_L²u{s]\W޳?awn:Wegwݕڻwn:&pp΋BK2ѨZɨ *sUzp :#BFѲd Xhx-aRRf੡̢n1}N4c Z,*;WPR:7* X1[e/0J_.ՖgMJiLr ! Y?uWq)>c tzw/G K4J*9vDHU&UH^O[:5YΛ7hUY厌-hS ^@|QB5r fer&Nߝ+bdnK:U\:( |4#ZU'НJx[pMK Pw9,UF5"H@eۦoBW) *--СCd[\r٧i&R_DnqݝUVfdd`kl":DhtΝo+4;Ax . 8ia:@_*Z*}WU`p]Q6Gx6Ðޅ`; 9.ʘ"T*hOqסc{ʐ] dYvEVTl neN *>?H'-Ú H-F.Dptnm"SH/$,Æaض~G|יL@.$E/S24,zs>n29Z[_E]pǐp֊Ǐu3jIԭ*Bx%*p0rU1>ZȲ,ˤ_ksOg!.?R>r> >m omI&4I"KJ"QuN`nm4>pJI;fXu!@h`9 X6IoI!4>_oᚙ oK~YR''/8;E?0EqJxo*^8˜^\KM{럐OyHq_wFtǿ~dD{_X.I/Hk^>-MOwXW`~Eu4( 74izo$"#GISzZUt '"=zgcj%NX,D&:B2' X%lLJf?<{ޗ\}H"杲a2SRXYBc}47_KJE+O)^iR)ԐpwZZ(]pMZD"=l I{޸>-M&cr&ql[Ca 4Q C,.xVG'}4LˋgRCv$#gjl4]wȡCcƏ=h,ն4@L){"̝eI-o5Y6/7W$n嗆7^]a~H̵xp1RI$]CS<=$jRL&S#tԺHw '%))ɤ⨎ɘd:ޤV"b-]$թ$JAT~P0_z;3Dj6(NVYز*bP<kl:3/,n_ܾIUq фZޔȜw윭_l(1hژtӞ,c H``{B'H]3eIڕVb]]Q{n\8Lo͔7|dPV\v sqC~*ˮ@\B%n~lRn S*)uG(S2W~ -}UHP #j%7YflCM9]R]KUvs)aBDh=Gf!1,+/2MKa͌X̞ݳwXI#[?)'Gh8қm^o $V6NΓHj:fEJ%L.{O/]WVn`/D|1>} 'I$>qպ_f>0a{Z?ap%q㒓o 5qx>yĨr÷0d"bf0Ў3cњ[`K|?ߪ.H*¨XB<0hiϝ' [(8|8(%ͅkfs+Ddd0 ,.'"L"{J-rqi~88Ylzy6@ 6}]ŋ/v,R)#򄄈(+x1>z X Z)iEs0;mt:<|;lFvkKGO9fLit5W>[~=xlא>xYXUwʗq҈3"+w! AGXZt!?u!s8r}ڼ2yT*C58Z׍7,[RAV,]J^ʬ,E~jHt4*;r-=Эko29z4hc(ĉ2&%=nA@+8@`M.!:C.=(ppgӀP9p SYIrQlǬY1c޽i;mPz̸C6dS9I?lYYm+d*?'ɓ0.PT wsU.@ ޽7[syxBڧ4G!Y n脘CZE hWJ#;yE$ر^@8&=:yREݠyGzpyDÖ-Φju[oіtZMhBpИVynxcL*644~m߄ d@uY.9>`ؓp{a:u=J<~H:9>聞D 7t|eC 8yJyvzوn&PA;o?p饊~H5qb:fw{`g׮YSz*O";ĉyHVZHB8y)4ڽAASz 5\gs}d8RwFrqh֬wߍriddg~UQ"PI8k׮xI!ϨՎo^pqV =,m _(3bbbhq}碌nF Ֆ-qA^UEf?]z.8B`T8Ok~܋G1i CGg ܓ&ɧL:TIoPIrB}g2lU$ 爛a*ϗDm/to7aBip7 鎛n=ZIM%_AvBRz(w9cSzupco晭'zD 崼h=\ӥE*oCk/TYP|9߼"njI|Iw}pRb9sĞPjGmzA\qg7fs:)8CELWBg4jG`5Ytv(F_-W>|9hd[h/Xd!XYg PTqqqDd@Jڃ˖=eOpsb̘5kJOxDJO,ٖGV%!|JkzYoZCyrTlEuF>A\nm18n%NY,?a$F%[ =MדkBVC\`On ;!FBBBLL I9 Çl 7Ά-[ :qʕ|s[\\"ΘOZ$vM>uIWBcEhNi<oEt f>C!dzW4AEv޽{[DGGcFcĉ!ۏ~{u3*hOxtٲ$.H~EzJIPNgtrrgI <|aX2ȥF&Rzk!)ۊDxqB"DP`q?h͔'ha~jjcR! ;d/2Rn}|޷o״i埞Rp%Aޅє?{IL<Ё:ZWϵ&*Ϻ|/luu99ZZ˜I\NImcH\o6[|@L4o\3?Ш#jkڠ2B_XCʓ!儮Fؒ?ZP)pĴtw[Pn)<-ZoLo\\2xO<̽$Ay\, 3/9_}q>pB5t%?Z {~qc'WgO[{O֦?lsY 78UN+ڴߒ൪@'b۶>SC2$=D‚-K4y3Տ#4*{x<%wٰbMW:c [f9p  )./Q9ܰArҤo&?6uN \$V3dU*Zd"eE?oT{nE6M'{] B Pj4>f( 6RR[?q"Aف#"H`tggy)OB`k]3Tƫjjj<[ub: ]4O򤦖b\W o6 )l+VH[Gz<'q뎞KfO~DE?N k 3QrCs3ӟ11P'qnB<3}2pL~^ +z(e5b BVI핶I PLG8ABQXH|IDgZ!&/b|/ wpy4ر@.R5ic#ImmR㩩4/X\q N:ȱ\+Be1[[H8QK"I;;+;ME,Ia⑂B쎝I9xH{M-υ3* L&ˏdd$9Bss5GD]c3QD6[OBZ8߱p0ڞMtB ddd! 2 wf~\lEwENDB$-KHP UpbO(#F ٴItX.O` $N n3go(*'=կy NUፎފ U3D$n3: 8 ~O͖41D * OOȲd:xױcDS*uhb܉:* pFC[-q"ysTjL exю A _Uѿf֬(pF#V ,scz %h3Vq1U2KJRl,KB oCC gֶd}*:::**,%dj1_~u3CNH#:zBHx.vg);MWA8!D111G\yjkYz>:SYSSp8|v4k?NӪ3TX:Nzs9TP~0sw"I{*[͞6.hi5'wի5yr嗷p&9#ss׮kS_m[瞮T+!Cj ;wrͽn=h&!!ORRuf͚_oYx'O;~QKF&>I o z*ZOmcƜiZrK"6ĪU1~( {>'Q,T@#QQQFNSlWEFKKΟ?pvA"͠IcxF\)q8};.NUXp?@}* JǎU~}l]>cݷG,Hy%t7Oչ'*++/w "yxH氓c B8RtR9bݺĪ* CϡC}Cw065s>Tp:IgU۪jY["v+3BDvv^^rGOz) ۱ ịl]Vɢ -tf[wb3rӬF.0-l]?TXPK젔\>){+$6)+\cG.vpD㶟~R̟W/=[. !m!>}^lAbT[h4599?M(jq"CXD$|NY,\`Hi;Nм\vEn)#SF [2t聑#o?w6T>DhغU&,X@foƁt8QJ$3I+! zp8*^zUY)Y\){M*ha@ 'S+"""lMYZچE3Wkx3\G"Ic " N$Qy[vx_%''.YB" Ӹ;z_*8a'ނ\U*UM&)$h4͏Çk33??1pUT=ߺ>zTT3 I8#G,9͛|{>ux}t*hg[HOj&%iOBⶎܵ+ ?ڽS&ͪ ݠ˝QVQGVt!h$AK7{啱&^[;ڂ PEFC_;048QU6xkLIxPW呑Q"" Rp}Z0 .\#yjRP̙:Q)3 A$<%Ko,c%(&zʔHVh<UnOv`jz~m"115 mtM 7sDYHYCqJtt7iCkIPYs2{K²XSQ'R T@ 6I q0y0jkk㷌QTzulӛXҹuA$}~HM3z!]Ě̵J;m:T]Q !=tBtGg N-bwFs:I6d&U㮯FnJIzMi{tAϒ 4nqU/;'[ KqΙjǎJ 6DG<`!hka/|p DŽ . o땻v)%oFލђi䪂H ؙ3,D"XU8۩Ԓq@kf T%۪^Uiv;s` RR<3fpFrԨXF;uCWݠc2r Lh,1<">*>Iq:wMΔF<[P1[|l_CO Ӏ5k"[Brrե&:͞- 3. W9w,1sȑʾ}]]sJ OS z@4=uJ|,C9T!^yj%InaW_EwN'T+F*mSHOFnS)~Ώl Vym,ԷFCۏGk JB L.D9&+7=ۨ gC3,zs&6iK3~Av7[3/L{㻌.yeܞݯ_}[{wqOB*⽗^*-)9pf@$+WF7 =qMtԩp{22[ MĠAq!4n/t*莢0tf[a,rFMo2aAKơ|/<#K%vgm4[oL.+ޜf ^z~uϦ?>x2hjj!{JQwNӧ)p YX$mfw߾$%? ޽###4V]B AhS:BNcLfN\/\j2:]B07cPT%"5N?#K*PʳuRVupf]W ,>~o_2|YߧOm =sT8nҤz\~Yۓ~9fޘ{[UgfS*U&/1ڗryF-jaX(Л8= % ;L'hI\V X*e$:ƍӒaAs^m?s:qlj`y9}6=sGaZ+zh*P\>ǢϧpOw+/RlOoagލF=^ 0@t{ B' ?["+Qb 2@ \$ I&CuXkZdfI7ckojn*-=@WF6GkjTM4@Z ׊FZ,:>Qo7hDO#ZlT@wC~~p4i.d:oAiB@[@Ttex[SU()Cw&%)qBT11J CO;d4@*@ PTUPT<,[K[6hGRSNՏUlˡW ƌDakv䏚]|̑P=q?99rʇڑQuG+T@XCVfi>?ugnhփDaY5:nP {?&^?vY,' g@p&ⅵն`_ȃ4 QH& JQ]Rt^:yReem՗OOE2tz\|;[\$_#!; q* :>vrʎ6׍q.yX^^QRrd3W g O}5O]yovs=>?_wvvkqEv* , p>J? 6BZyۨWlv#O,xgG?<40zqXXBںgt+z&Z`bsJ^ @{x\.WUUfOs/y@ÇKJJJI'ZԱF%Fݺٵs/W ˍ)$n>eL`"L:% rH!4W(rBW&pنR{}mO& :86v놏 dï괏7h"kw>}şMZR>3g.\2)+ $N Ʋ8Wu挋&YaC6?E+(\BnaUX6n3,-3!bkp쁨N<#G,|Hu^d2gi:CD2!!TG+˚>o\z}u0)rM|uK{ bastH9|chkw)3DK =qu"w iMtxp3ePvyr/[;:` 8#3̘~-'g M3x>juuuss]ҏe3F'Gvqrc$dR[%G6!2J2Zp/[_wi^竿^pasybcc I;]7pIfG :58:rh\{ ]%3dȐ{LL4 Z/*LS0>vi[^z+V}.̲,_1cG'&`: Se]{T<]t ˄aA,z*:>*$zǪJJP2wu d*Lg[;O [##vd*e5Ł:hObSNBt*qjmPTU*@ U*@ PT@ PTU*TU*@ P*@ PTUPTU*@ U*@ PT PTU*a޻pl=!;'EOzv9 B]]):t tCv*^YS@7Tf?yU3π@ 螠TU*@ P*@ PT4WaX;[7p; N[_$*@ PTp"&[N;MRR9vԈG:#+ʔU:͏hƍVns]8>'l7zK`#/_|ysB8H8=>Dss*+*n~AVkO?gΜ1Zy4g!|2nR6j$B>\R d .顟K* *ύy:pFq8N/H>cfrC sӫvv'N/nJ *ޛ+;虞9oio*ѓ _2_|jz{ ].tpO3 ;7] &гFym"8J 8D$1gS] ZH!h tr]Ê? 9H )*ig2iR֩vj|0<$)r?va?Q'&]ww;j{6jj%d~Stv(/${ϖUDRY]]2ͥsDmKUH_>0R*M=JT7)Ș NucrtvvZ&E陿5y)ªiǧ {;7ScyfT^iuEuas;(!MnF#iVd >F/GyTE5bt<-saC㡡{axԮ}2a@v:â Msۈ`Rֽ>ʗzhOJVDVQ-mϰhL2EQ;W@ H"!2y':Ǭ˟ʅeQ>v'́?D'rHF*LIULM6B]m( Q|&@cpl߮[m…9seaJӜzvS^K=U06 ޾];p`+$\\V:::{{{[c}}}rEr]D'i+Z[{'W$׵Մl6;44jk,yeeEHkGo4v+}j˽'Rm333m hDWWW2/?dp\7 _WՖW_ @T Q *D(lׁU @T +Gx"xQX/h|IENDB`robojournal-0.4.2/doc/img/screens/pattern_search3.png0000775000175000017500000006423612142060704021343 0ustar willwillPNG  IHDRMggAMA7tEXtSoftwareAdobe ImageReadyqe<h0IDATx |p%7Iȁ  Z  zW{؊lUZ?˥ C'`U<I8 $f^9v!#~g;{Yf.R :tP]]˝c,p”SS}5U}clcn:Fvn̸Ϻ2I3zLLLw:nLh|3iL|2l=z… ^9$n/[eRRRn?AsHf5NR#\2V[޽(a6KKjؿMt1S#2(Zo:f/4!T+-r¼AMnRRvqfa;{@~np79ڟ1e(KMuU 9ڬScw|Y~rߥ2\^^_1*,<o&1ahpY7qҙY~=?s.b/_/< L[eO~{*ZL}eeLIm^F2y~dIl~4_MMNX)f:E*9~*2-9+4+c6{ɦYM6[HHHxBmЪm_~7h5ª.W9+9OgP[2du^>П[as EꧫU1^ոlMd jYm2~$c5un."_߆ ĹE&U-r֌M͸gɾ9ssw>xMet3D~KVe位_lW!;ډM.BoԨ6'k [tD.紤>ceI)uV(c &c"9et©?U88f%pkBŽi.k}2iGϙp_o4[_h- l&e29;?h3J.Br̊諜[nkozz Jޚb8Ijy}Kj[9}ua.%_=߳2~3{7d~>+5v/;gUq#we 9I{\<ބk:۽XZ/'m?\qS_!2e~*y  3gZ7 :g;L@Zeu¯>ݓN(a^'E{WdXIǏWosܱkWE,BzW}-"^JIvyqԘgܼK3$,OJm&j 9:b?;uV:#j6ntr$΄iͿyJ`oJ)WpD}x=&>4s’2rc 9d*|)19ec\%^VXϙ?J^q9<|ǒ}ДG>cl Y[MSI}dž|oYL@Ҍ{Jq)t- u2]"|v&ϑ^zJ 9dL'mkxC{/'ÿX`\Qu@Q湠&ϵ4 e3.Vч:%s9&ZjPehr=t<;,!KFŖc+nG,}qNEF/î#w߭uҔ_lyqc9̍&5lnrކߊ >Cŏ'˅c\ 6L@r޶}Pubq|[FϳO=9R(? DE{̥港L=|U_%el c=}!!~RJmo0kYYJLwk-]hv8H^;knm~Z4/q9sXvnTx5US~p~¶O8P[υ~hs&Ӹk5m))'qvC5w6kJoE}A?~xV^z]7uNcLY> g~3-2&KhhDdjkk Lu&u."sI&41mU=X-ɹG[%y*eU8{ _`jFs Wv*>3[8MygI&[5#\9p2"m2I'S=>yԱZV:[2 ?O,n^7s+^t>ч_}DdX"ýNM}}Vzir"کK冎?Q`{Gb_I]AcٶwaIu \[o쥱CWʜ3랢C[l|NK_xyMgfK'_>{A xFy9yλ~8nѝJ;6V/js^]p1&~]ew 59.5[ώㆧ7퓡o*SeBC--VtL[/BX"26-\\nnd_v*6z)Sk}e|T6bzֿܞ>mLZ/nz},̗dXddԁ ?~oNg`z9.⫝̸B)W PQ~)CLy%ǎmۺ*FDD\|ŕcc"|*9EtcbS_tG߳Gu_`%?n @TߜO,/@;qmc@{(SSk@{` 18e@`[>L}=@` Zek}LY;r<|VHI s6Xб5oxx3ݽ7܃aߜqޏgl<ggbњ LV_26Gpǜ㛎<.덮6-צܖVcAÝ^}_ϧU5oֆl% ݟfx=3o񓵫o0VxGN-ڼ4 xbR}⍎NY٩X8Zel-o9QƵDi&< y[,d J'Έ 9kZQ8C45k}Mh1v*ΟVVW|?ܦH O*\4=qzE5) eN_1U-ZR ^L17װ=@>ȃc 4F.wD3^ZiZ൑0=^Wȵpo kk7蕶cC6,-iXZŅÇ%תgMz^l]&Кq8+va4d}DxdގIj`#k'e.wyҚ{6|vr49.q^%͒%.֊e5^sRrU-j78/E/-nlﴢe+rdݲ,Uxh oz/.מ3N[v>ۺg_SͤbQM8mY?yzGzԤ]eOO[VnMqaj ;z߇wa}-YϮ+2= 'MJOvL5g>>}gUY^ /4&O/ԤYA\m{-IxoO/ D-6 }qݎIڎĤp[Mjv=%k.M~ٛsLI˓[Un=n5 Iky_[#5:;8kZ m)&sMkժylG^mfkwL ^C-lµ f%L~VP\ҽgcozh) Ҟ?8!)e;'U>][vC|rӵy^T4 z~i3EzYVs/oa~ eZ|lPzce~ i)eϬs[j#{:9 &|s3/fM!SsSiS)2=Q.X{xG xG? [*c?6r×ӧm [`ˍ' m}&qV_Oָ-qΑ[5sߝ%D}Ԛw5,#N6sEkSOvX:q Oyl+yFxKZ]V5 /p+_x!/[YH݉K$Kޛj'/צ W[:lsW^w=%ߨ-Y{dXj%?ǹ5 Q[>fm&uzcσ^;^>l6˃L*\Νe?{UWW/zoF>}}o߾cǎUVV_e?+9# ]t4hP^QQѮ]H3gi2>+!CERy /7ȑ#n.of*d)_QA'{_~n'NQ(I;w袋9x${۷oݻq/\xy#E{!Ĭ*QFb}[b_,^_c\{䩎2FٺeV 9EGG||$H9V.Hǥ*e>3uVy=(rrrT>9^>&\s5׽{w9Y:J򐊒}1a„V\RR" Cvelll׮]?ޣG^z߫u5kRMTsl[oIu;VMI8q'|"A b Jy,$O>?="Rv_緢mF>Kps:}ʰ O_ve>|X>}kT ;z.W?SH9K/ l-K6={T p~Z(2FĦ;wLu&rΕ( @K7H7%xuI Jeeef@eH1nq*{nM& #gD6DvCH;򗿨?1o`vmVfSi7YI35Or [ ?vpiYf4+W,+x)ϩ~RWW85fǎ'O8p RlϞ=ՉsȐ!jgh nS*ɦR%L&U2,HKr=HٿNNAs*9"Q5Bؾ}ddesd:&+!c˖-?jrߵk,:˾ /xn&js}MMM[-3ʨjf' 9*!IZ-..Uȇlj,ڥKH)?(ݨ.> rW z\QRR2D 5J<=x`޽ewm۶ɩ8 ȩSWRN!(&e]&o!$k~M79sLRR8۷o9rd-HrP' /9yHv_~) Xүzn35%VJ]/K?~ U(c=GK~+Z>^;TԐ;K Qȑ#ܹ311Q> ^FiI^*3xථ:IrJ󜜪M&SQ%K;|Tzkur:uT [:X,*DS$y.;vLr v{=1ZJ6{ &)'44TL9>52 9t%ȦIWW*٣9cdѲdq7nwqG뢌PՆ$۲iӦQF9LE-;=]{d&Ys7l޼ihS~/0E}eM„ 89%H&O2`Ԑ7Mh:9ONrʑqmذAB(3{l5|6%-d% 0HAR&g;յEA||NYڵ"9ˇo՘Φ4:HDҊ4&ZYYٶmۮZGr̔sEkW)RQCգKC:v%Ǩcpïe:T}zWK£(|RPuVo.:Fv꺮 y9r$opiSKʨ>1rAxxO>JȐwG[*$NRG_UW]%~[>O81_qOUW*SY8Sn4/R$٭* [Y䏁V9Hh d/w߽l٢KŗeוTᄄݻcTcThq2R]OV@B8[LA}sD9?~\Nlrkup#>###&/6lqyWuv 'Nmn*^~%<-B$O߿_jL*G݆$¥x!={VJWäYOؾ}q$֑xC Ri]tjb{19$KvVdze%hJW7Q'C{E- r (ӌ|dW_ ; $OT'oӧOڵk7@$)V/9FΩrbpCGin!6?oUF2)S6᪫Zn p縸NSPI3* 4СCǎׯ,bunѣGG%+Z}_3ȀlN~~,3yƙcTaÆI6gʨkfӦM7pn3'lCD)-=]jڪjm#BycpÌ7L׏057$XG[(%Lŋ'Nc4[֪GǏWVVJԐŘ1c^[OWrLgQǏ߹sgI)(Ki ԝKװ/ܙfN<-9昡u9F5RT_ճ8(Js#ye߾}cXjپ}{rr,k \+ W9F}]YeȐ!Ri7oʻ&5uTgFs+- qĩSGYܝUg4)xli~_1+-ƻ_$|Q%2Gge)Gr|n8~rz_`¥1oF |%IQf޽C9rd1[q>}L ^(Y={H-\xQرCjDr*<1|x]e>Y1GKk$Dul)8a=%wUY&}e URI\>R!䣧W]]-g#FuŵQ_9|&Α&LxwM!wiܸq ?MҌf$Vc$˿+&@YխST |(RlVݫ*wVt޻w;wJ RJRV7 *'KX,RE$e*djUsΖ-;NE=8 h2vʨwU3f4X\VVv)I]bbb&I9-`/c_Я3ڞO6-#'ξ}ݻWL 9F3+ 4H"ש0LAYsI`r m߾<%%E]Ƶ?~|ӦM8"%9R(u7m 1BN;l+*K]o6EYFЎQy_kޒςW_}ups=z|ر t~S* G_Nvӽ5^/0pj~:q/cW;#Rב'Kten ?9/cw"hEϽu|NݮHhAק%q_pnQVރL u_:?q_yܸ^?Y[ot(2d($eʣ;H<:N*C`!hQ29]^m2h~okio5$1_(jjb6M^sR]__|ڊC s2I0"$lQbʀ<e$Ȁ3Iy:%"d6AǬ_S ?E6jr:[}N=jdkS6x h(+WƤivwTK]111`_ 12HymdLo⪢C~J~󓓓<#֘%lXh\y{~=Ԓ$8f+2tc}b$tfS34| {%''}׮ /@&{16DճgO^2*Д_/ 734dss7,KDDDLLL\\q.OeLrNokee_|EeeœOqĒ:m۶|4152CgܣecIMͨdw_hhhdddNN6n8Q|Mϝ'8ɳUFѪ1?Giq~Z.ݻwӧO޽t"!%_j9r***.1Ȁ#yСCSFuŗl_xk1+*]{vc}ښ{|V~TcW,ʹ^,_wc~T5\$3Oy^WXE;AjFUsӧkjjH3d|v ܼH LPHHz xZN{hIKI ~qNMX,E~ u^kȝ?MRjF6oiJʌ+ٯƩkLݧN5m⷇'F(Hmmm2^#_zy}ſ5;09I;OJ¥S٬swEnv{61M߶4}7hzzgJk2^V? vIIɝ7MHTjx2CXddg?sKxZrO(SW[׹Dg;Nc(!aX|||wjIHfg9~d>1~r:z6Mnk :>J%3.0h me$X˛r"&g^j^^@`zzkq`ƍuf_rӃQd~;9ɹ?,,GIf'' Y?0Ԛ=81ra?l Ӈwa?_0CNj6_wTutzzb|| yL\jJ2l:ѤM?7$Ix3oG;c2boxzf.;w樨_24x믿k4Q@ff5Ԥ䔃ջD9puKv&Sێ>x+(s9MWq?2Xb1MK>qBӒftQGDEE/xY[moz9bX,k;hgT3ylg};ztCDLBW, QTe]0[vrH7.wr{=Α#b>JnQUT-9|ȳLsdYBg ޶ݢ|͸T;~|8=D[e$q @={u-<.ȑQQQ:ub! .tt;OϘ!Ӧ֯.*U[/*+eYOK3G=jԡ /P5شh$5@@:f}.]*++nrƌJ>[ ׆^_t&=aE6&#@D~ܞ9p 426**F 2_o>R]]UU%ƍ~lڱ}w2iWQu 444̠nCA̢^~XcǎXBGKͥb>>YV&iZ_CCZcZVnJص+ϑ_}ݻ9tAC& fa\2٫TXUDShkd˜/]cb&\=Nn9L3Џ/ٵk׊ ݻz뭿G. `æ"#ȈI'u.TZeeuו1ʜsT@c 2.96y#$8^TE\YU>8k:T_yO'|SUU%G^V\u呑Q6FKFvu< PVkx<33xޭNͦb5 +eοB-sN>bhQFsܚ/ܷo_ii zSN[ݧOK.݀so;IQQwM5ꢌ*lBg_38[V<{19ՀAvH2lMs8ʸKv4ixeeGVgN:oDy;'L6kTӋI*J<^3~-IM~ί(#كV(/?URrb ns~e -JjWE%Giο/|cn?~2dH~bcc۽{} 0 qDzWĚ̕ݜ~g<[G-eio[7_e\Tl[R#WJnNQ-Xzlwu?K/}xzE(h*#Fo\s5Z_oχ~{; OG恵?}c1jY6֮4mڎE__XE;4 ׬ˏ_-X4ڟ\7f5xV -W!+ՂU䛞@q0ZeDW}3f̻aLYFGG.O>6w.|/(a/k7nQMEq\]f5攧-W޻a8xzk-J'j]<_(/k[ }ob%}xQP8|x[3nQ>1M6B/޸WwP`nz&-/?8kZ~>0h񥮮mdG5q!!&2oI&usftu}vژP7/+{;Sf{߷dLYw˙U\/NwZ}R}b8簔̂/1^Xhf '$,˟o諑oх nZx/%kէ=6e3}J>vU7gc}:`Uq' s-.+{mU./~']/,׊k1:J굲kҵUoZ.:6mkDGG1HMɚQ&I74Q$N\ 2hZK䛞l(đdf}h@iAY_ϼٯM:u>.\6lNwi  _XTee ˚m^(3&y01s8![ gNҗ'he^tav6gyK'u|ʃwaΝm^+cn6kiW1=y_jsK שٟ22JXa2l֬aISiij22-iNb~:51q^5ZR< {E/nX\cx)Z2ΒoMuY'-vۜoNϫ5U[R0kUs)ML,^6a 4)>[46&fK?^ʪ8GOU4^%'9Š'41.E%(Lx7G5SO S/Gɂ~ ݻ /5L۸{|sV8̵ʨ;tf>$n?7#?6tuę>!'lZn5)Hoc~8m_yZQQQYYB׹sÇ&Ԏ3l￙de]'Ox 4Bjj#GdRLLLXXiFiQ&44ĉ۷os$^NJr|>\7`9:d2UTTFFFTWWw -)t(jժx:ҥKkkkV?BCC{_}/k㦍a.BL:Źg}hSD Qe2D XvK4gzJ.ʈ'^`LzqDAߟ>r ^}c?%gts1? 3Mmf Q :dG_,s{ɮ˙3g˱z2~5bw?JN2DžIVl1"3.Rrv[s򴔔Tv:Dߢ"b{t-ߘ[:uٝ"cj*ih7Ӹ7Vt^&r\4;7$i^Yi(Ԙ˽LM\32d})nO9UK(bzƞ>|_ݷn{}thMu3222 sU3MNF-9uƶ2e|uҟ.mc$$}b|S{ʜy#ʙ7s[))zKQ)Z>W^<$}lNS{+aT#Zt(ӧWkxe8*tV5<"$ioЯ9ZYF5N 2C^RUCGӔTd)RoH4DjrIK_^^nJԼLcT+R{nԆH/B*ଠ?6-**/rxAo\Q=G#Fm7H00ZQ\O9"3#fXw7$uZzμy`2͔bO+Wfoh(i>e|LGS͝7BM9f<.^ډ\n8} 7uohQ&#È#33#2gȝir22oq&fj+m&Թ+-+9sM@{o0feFf8bomiH>{բsj:I3QfRn^^jjJjJJqU=xO9C39efIr_l"fܜ2gFF㵍}eВ4Cv%xRHX3oq+3ϙ;wEØsf8}+WfFA%_ԹsSԌ93URQKn(99{12k/Q3M7+|k+[O/co~NTQQNU9< 152pFY?"""}FFFP𪲲J9T ʴ;^Mƅ)`2'N*(q= e2(@ eQ(@籠7j8}TexSgQ(@D QWw,6oC%8Q+//`Cι5eO؃cx t(+'&ӥl֥KN&f}e:[t,$Cz_4  l6[o'ι;cΎ`WxV_jj赮)MZBk4-DUcUWUןlMT8˫]<;sv!26㳚#,52"L/5ܺZ[pqXmnmddĭl2U55^Q~[.bcFgGV{u9&HO^}u1wir;Z+S͖`嶷FfeC߭,e<-$<*Rvɻ՛,XJ?gh)O|Q3䧼ZF>qUd`O&7ke*d /][_q?9Z<^M_`Ie@Kyhkΐpҷ3U[t9nX`a?]PY {1N`y3c0Ōfh^DʌS2Uyq<//?yҽ}U~^٪q9 R}H׈!]o H[rE>W,8[[nڛշ]0xp7}p9Fi8gǟXp$mA$yytoMxuʞcm)XU]n옻VOwnAKeO>Oh_p\1+q Q7>=Mcdi2pehGQfWqt<\\q2FD*9l6[Jh9uue L-X,\:2=1S(@ Q(@D Qe2D e2D@ eQ(@ Q(@D Qe2D e2(@ eQ(@ Q(2D Qe2D e2(@ eQ(@ Q(2D Qe2D@ e2(@ eQ(@D Q(2D Qe2D@ e2(@ eQ(@D Q(2D e2D@ e2(@ Q(@D Q(2D e2D@ eQ(@ Q(@D Qe2D e2D@ eQ(@ Q(@D Qe2D e2(@ eQ(@ Q(2D Qe2D e2(@ eQ(@ Qw/Q {@pyHdzl")FtVuJVNgJwWY*Ul*%.zK +&8y'NOO BB:ӿ=(2D Qe2D@ e2(@ eQ(@D Q(2}_%ѡ2{ӛ`12D e2D@ eQ(@ Q(@D Qe2D e2D@1x*mz危 ybSIwO=))#%eRz.V-q?x`"ՇJ_P])G!}ui! >} cժU iɿՙӧ|(*dU ^yg׎jVWK:Ks~X6[ٺ J^dxH*z;ĺV0d6lظo߾f:k֬P[[[SS30"FT۴iqk +*\ڣ%6*cj۶m{nի/(9w\TPZTRQrS=ԧUU><5{~\_PRӕ; ^Ww-zСC+Vp͛z̙ 0E/^| 7jaK֭40yFEzqX][浟ebՎjզ_mjA6)wA;/TJ(6Wi}ZxDH:{D>07W.Y3)`H ~|KKKvvNooX;wngg2:sNT }\aaaڐQ6r〢WrtqmP Ԭ,, \V~IX"SVq* &ݞl۶7t._]322!++1R K})ٹaϞw`ÃӮyRצּ %-"ł^80`qLH!Zyeѣʊ]saPr TATBMy.&%L#=;{>$D|III:U<<;Z|ҥ^>駟,N6m֬YII Fe={fΘsgwu#*c,Ybm6iS iFG/Ư۵\]݅6:Z'rLAGGG[[[SS(w\ 5552S^}kguO#۞'O777޽;fgg䈅ufK,ٿXy,YZuG-fNR:T0/QNBUo'ԟeR (ĂX#ؤWTL*{ٲev/^&RKrrrRReRRRD_^<-2;LﴗP+ -`!ER>o |}ZۻtWHX( !rޮ@O bu`DgmzgNMMUWEj"Lj4#V5|G_IQ̭_=XS3CXznwģ|Nco(ueIq~]D\I$51gޜ憆.%Ī(&BmmmCCC]]ݑ#Gz{{v]ágȿۄNXL% ecَe|nt v2~PR:bYh|ޱ"yëKz1c_EHC 5QGDnSDxN!N^rj+|?aºϢNyCi{WK. /-* ݓ:]`жON>Fkǜ'Ď84T7"Eٗ^4XM1h~8r[|:II%))i„ ϟOKKQfiFuy% NEa~7 ~cI0RyFN#K_>c80{+e6G^$*   eSCvDF]wzSH!)bFCpg8PӱKR1`2WߝzemfʂϬ-8<ڢa^sjLO9j>YF[4?U-cn iX.Ďy] >ܘmnM/;8n**ssq7!3g[%ȶ'?~_,*€.Ҍ:ͤho(Wx"˅./z1r-gWY6';|Wy{en>cyWK@ݠNljQ/[$ڥV }<OYYS3'uv7(;T:;Y&fggjqxƼtu9/;vصkW{{ի%evb: դG~,z&a˖-Yͦ?i "ߒ9) K,aIeKe}ƽ3fwuu=.9ٞ=N柦Myc^5MM===}yL%)o K-͊%g~{w}7GxzRbo˖ zM<￟7oGMK.vߔ\Cw4S>x%4 񫪪!훽{Sdi))/8$655]W纻Y_?8qO)gěLL43z`b 2 2 2 2[mU`Wub>Ҕo]w]֧_UG6x{"xKL d@d@d@d@f`(d@q5Ȁ Ȁ Ȁ Ȁ ^-?;SY.51hi- vD@N01hS |w)-NsǹGØ3봸ӕŝW7}+/iW,8nu}‡ Ȁ Ȁ L ̘uC?:vwo)-/-[~r ~}/ⴝ&f|b ?4ͽxZwI1?YsLe~b=0lOSd@d@g`\ƙ6ٔm4snx8:MGq) Juo"M^zb9*'3|- >2 2 202|d@d@d`be ]O:==8gม>=댍)~/WwiyiݲtJyӊ4=y6=!>4UVMn8lwtT7}=_nû~:XHhy/ܸɀ lHEnݷǓ8[O=']54u.o|(~vaV WEȃjgݦ8}Qq# *sO;HnOO=ɀ L "7~kNNM|AeY|VqkS90 ]-C?ZU)Ht_/oE(^1ϖig3fdwWmvEyw>~ ێCb>۝8xYWsݵ?˷--ݾ:]=zOlIC -﻾tݶWӺVPЍN*^鶌m߼|iv,tN3ɀ Ȁ ~j򱓏N*T}uqIP7|iJn_ko+yEm8=>.S<<9-;q;9>b'?js[Y(۝:juȼ͛ Ȁ @2 3kwC?SY"ׯ_?4#-/-6gE@^i:tr)+/<(qAr:g\9{Y4{؝W˪RQj̤OEa:nȠպ^׵6ϝbrcЦaǶa֭C9bտ}*uoWm2rrXa;}vy9'2 2)2P+>~ǼbL1T~>Sǵk6Mt}96kp*o_ΣT++;DML"ם.␢C9q>{wbʩտNsԳ⒢;Gv˿w8up쩱mQ 4^7T'oRl{N, ݤeZz`@^p]t,ӊyͼǗ]wJƉCqZY <^f:iż{;Oc/q䧆Ns}+ˮ_Sc~g.]Em5p}o]GQk J}Ⱥl]ZV[?6m=iOyw.?.{ofGd@d`Sd Έb1}nJ.bj]2Ʒ|QL{oZ^Znj'Ӕ@9~6;uJ8W1{?aX?3=LԳ?9um[}(jGu[(2 2 [zR[wqrOa_4.++^-{p+|ha,}pA&2 2 2 2y3p`yDpSMiyiݶ+澧@d@d@d@d]>qv}yg@d@d@d@d]=v7l&2 2 2 2d]//׾'Zrm-2 2 3@: Ȁ Ȁ Ȁ de@xUU#F2 2 = @ʀ Ȁ Ȁ @VH DE9j 2 2 3зY~T @R:woɀ Ȁ Ȁ (N[;m-2 2 2 YP &+0Uu^d@d@RT e@d@d@d + (kcލƅs01 Q-Sgbs&')l}cO*U$~T G)@&ٹ82|2Zdg{H>%l 0Frw9G >T]`}_Yu8h`rTe+O*zt4ClHA몿͠Z6=T6ZeK[ZV$7٪~ޗk/&7 xyebj@ȑF  0rw_ :.c۲{VrTy`Ǣة@22NIkW޿YִSG;[ kk+y^\RLd_R7Jj~vAviv8Yra6en_ H}M˺}ZG ζa?X+e{/_Ŭ{`c=^>Y-|=,)wd<7ݰd dUu%cW4̯eWJ9 5ƺ@{ 5 qYۯɓdh!b_\+ۜ.TuY87m7|j0Ӹ1 HLDxڇc]~LG G~Z [uæ@[lQ '|gS 0Qrw(ei+yn] 9S8cm  +Oj?;>7bs|TtrF  irw(ei>Bk hѢric97ml;NF7٪6T {(JKoNAn[t/\pAvmxQXd9FoǠeC¶GU o+@V'G G Gk d9wX`A,[lM@ڑc|eKF7٪6@V9qyKGS|dCߝbO߽!-.͏~uG\~#WJ˽/f>¨KolQ^?<|OͿj>k[L'G*r^zis=rM6)?Q~ȉ 4ݰ@^ Nū_+?g^L o/7ߎg_cθ>C)~>_^wߎnh_"g屭 W\3eZyt2ȜsXyžcg}&~ذrJ?zN}bU?{Ͱa$bț{'WmǶ*W]uU׮]u'?uL/Q `Yr;P T dnآ@P)@nMqQ veILS*_z3^xth#O+|=>wMks07$NЇv_zY ,~>뮑n@Ii_ιExl[&ް4쮬V T_~xgF,D\)ǡttqM?G/;Vc:iXui+ny$rqs'i)pߪ@IogXn]Ӕ8>~?OSVhuexY[h.ݰ@Q[ {=@>U4}똅oQ_}8u>˟x=:.^WkYˋ_ b:xYQo-0K[]v>xߌu_Zxo/n^d,Yx,{쉘y˲88"rSYӭ@JDO㦀yq'%>~. ?G.#V][8|e->wM^ =L|u8(l5YWZTN|Lwo{ӃqCOMZN];NYJd:y7{#S||r_e3>0VM] {eڊ>W;^C}#~qqȢ7wo+ϵė?'{,~:~q/r~v;_ruM=\t$!G}4Ӷn#LץߵV^V#'k挳e`be`Xr:L__xb*~sӴ&~tΚcqGciľSWg3z$>e=( L+a:evYN{0;eI|jӖıWy]zY4]g-|-c9놖Gv8uiFZ^ƌSؽ|º1 ڡ?lwVݰ¢@V[|y<@q,D8)(ɗ~I;v!YΜ2W+? tݙEDMNsJK|W<6~x~Czq qQ.V2}~@V|qj)~ tci{Nl9aHE1}ꫯ'Ӕ>s=rŕw9Cr/(g/.m]\l{ɳ?\Lls󞎿Tp]>rŔ_nx5>u碼)-?y*r}zy߱^~mYY|d2@H3ζjl ]^49Ɇ< },cq鏔qߢ8?^`s{Q E\OELkJ-%2>y^?G<rJKm+{}]tj;}&BW|~:Sܿ3@W^yeԦT O޳pťwxmQ9>gcuqٝ * gt&i>;uS94Iy3gm\UL|C<..c٪}.i~D:91v$3vjl [ Elr 䇋\{׋9:N;!}}qcN32x;_eLG"k_S`͂_6~8ߎ9>CΝߺ8b˞bN=⋾s֥tԩI_SiґT"ӗ@xX|eyw8v1uR<묳z6ζH˿x]RN 9cz^iYi~)_v2@>R55.-Jc*Ea\P֏|m 9wɝ20q2\ aS\膨NP( ^(kYܩŧ_Ē_cq_e6qVa4ojX\4-o-mr?Ҳ1b gߺǿty|;ex)GVgK}Axgza*Y;]U;P9jGU޿ӧS<3{6 }z*t9_q… RH_sT?r=X}XVun<*|w3'Wɤv]|x';M/3q3ɴ1~)쉳5s202P-aS()@^W|Q W|rc({Q U{ٟ v)vHy䔖|/wgũuUxtM49KgӮ*֮%VL6?f/#ڽ*bc(ś'|2sgi/UVŊ+n9™trxGbccGZ ;7f%E%#~Q8JS}Qի)쉵CIVd`|eZ [uæyc:O{dz1wɟ ~tڝo_4t*Gt,?885iJctt^CSZ>Hʍ/o^Tzۅg\:qY=YztdlH{+~Wfj8z/;}Ny#oc#-U3xsQkS;]9vc9Md`dZ [uæyc/Eu-G8{nbf>{\Z|Uo^T|`fNqo_yv9zVJGґvG]nnkXUZ?lQwӁs5kqY^T)ϑ,mSy3gNL6-NZiZǕ Ȁ '٪6NjYl(2 2 203T [tæທ:)>ndTd@d@j‡ֽ2 d:4S[uæ(s(2 2 203:P7ugsLű2ȹ/xCȀ Ȁ Ȁ @x-*E7l*S}꾧 @SZ [uæW"MM {E T d}7ޢ@ZI. @!\ aS\ԫ(eƽ$@T d +uLnrҤI  @&@S @N4  @U7T {4  @zըN@n)q?  @-]Z [uæ# ؒ-y @a @8t*{w& @q(\ kpO* @FK`Xyh+QMd @%P-a;Vӝ ڰֆ 0Z٪6?/iDK[٪*ckY @fP 7+ @Ɵ95&@lVr[8 @` (oYc @fP 7+ @Ɵ95&@lVr[8 @` (oYc @fP 7+ @Ɵ95&@lVr[8 @` l9h1 @@+R. @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @,.  @H @P &@P e @ K@2 @@ @,2` @R @F@^yaÆ01?קiI{_I&iRyxՠtc!!mc (z 2 2 2 YP h`-[!2 mͿ <68>N )ݒvko;nNrnήv 'OO&z{"u߱+mpR HG xYi̖x>NZ gLg߹1y1eAe3&Ǥ3FXbZ̷O1e49fY7vyn=%O&=-z]nY&m?d[0%>Zq#~lMl6=K׺yg|*ۣx[{>26gJ'qi8Z`0&s'FYm Sl(!eS ϻݓXH{[mʢEDH}{72l[l6/X|ݶ|wͯΞ]}!y[* dpz:"!Ҏxⲡ6 l~?{Y#YCbCe^MZzYaed~sUGrm7e#-_ gƝoZ@*=Yʾ< fb;lO8]:m8G ˒S+ˣdu+h6Y۸_ں(MƇ0O6x~C >eiFRAN+; D׍ug2OnTPovn=.ݗk tim[؞ ᝠ۬`5n;Nu 2\gq57"u k^07l/R0>=t}ƎbSQ)Zյ{szHuTg_Bv u*Ҧܖuw( `Qrgphy`5>`XǶQn˪2b]+\ +N>D_EtؕWUOضK_ԏn`{˙۬ ys~^4lǺL]K3 >1lnӮ{I췹rݟD=B~YOfȞ{H^o do:V{^7Nsn}Gz꩸K6S3kNM-@JQv;Zh:uj_ݸt7 d?Y={j]x٬e[V/(3 d[#8{1>c]GT {!ۇ gvNAz[[F{G3_c3pʬLZF~ *Ŭ<!GBӿOn<:ۧ֯\nsڎ9M-®/u۬[yŪ|fnʦQ{VuZ׉͚5<6z^k? d[:o!oe4 ^C/3=7 =>{|7{ۡB695}|ӇD^@{o{sm;Pܖ®?myOa;]27ly;O[6k־[lk#yyv46)xq46v o"ٵ=jYv;s&K"彛S֛vinЉpCtjO+껑B4]T _sM㠍A}ݦ7ޠ(ꣾ|B~kNOHGF8tt#5#H$IchBFɧ~f/Ѷ BF0 ̶^Џ%C`8q}o3R&#=| dR1H2Naw(Oi5-4(DXspMH>crL\̈)‹QrO% ^'M2_T;)7 m.f)‹Q\lom>")t9.)CRYv.3<,ENMKgMLz'٢<}d᧔('_:HxmTX߁2N")'@C$>2y2IG~H"D5gbko:܊S NGͮш"t.{lB6e4Ck%#4SqAՇ,}7S [Cj4AS4.+{׮{Wf+^w"6[HM/E{DE2pu߻Zk ZParᇔq:$EiQ~k=Ӻ_yko_ղ8Y$4ŏ=#o>_+7d$eP}JRʐh[hAw(t?t 7,&9 Pt̻[¤k!t0\Ă"HB$c3yLc-'pkuZ,iH>jwχ8Ĭ93/I_: 0d)I_K<Đo BK2Hl{U.\b4EU^uNpEPӺ6NQ͗WΟ:!u%·$i#N;|踹7Ҷ4³51.b^qK|lI*!SLoq??N7Yđ)<7( \٧ AYG˷{JU2ܤLa>ȏJI!OU_K PWn@Hev8{^~-믧+O| UWI35z=la:sW1Jn_~̡nyqɎSݘBl_,ecDE)eW7xR-o77=p2g1|\q>0.V7ןon/\xŲ4^!i96f㱧b6^xi>P)!x)ޥ]5nXL?>$O]th )pð? WNׂxmKf5.)I՝wNJ-%k~{#s%"@455ș޶dG/d*۰~I\5+F֚N5k<䦹x{хfD u+2]HkJܹk)IV+`IoJL(n%Ɵ>4H}~gy:!"T{e4OhMWc֭.ʰ RniӬR v @٘l Y۲=q_E4~u$0`:[ɓ'W&Gߏk=I-U h^f>n?oȔF(kY%C~_'['a+.Rn^??KRǧ:r= ١KV2>#nJM%id IN{k4Z- lj7k~:{mvTt{qf]Rr_松xdִ0;2Q"O~+KōOr.IOC ?v8NhA~W^bP"r+9 {I mJ h >JEIE(EL4ZPd2ё-RSmc33."Ii0V7w5X0gw-C6**rs}dMʀ7oVdx`i)?S-a8hB{ 1:N0xXӫ(emNh8BY e 4ߨR2L0PZg)cw(9whwM܏7]z/ϧ\{8*on٩tA+:e@Gp54Ulk؆>iHyz~*iXK&NE EOYtSf,ȹp̷&27%.E'[P,_#bV^\,RjOW8'].vjJHJI?p16n<-I)ق<=$ p ye(߽2} { bpWw00*GBNzƣnG=& Ǹ?FɃ cގc&|A2~ƠA`mT**qԫ6j.6A`9[ *1WP[hQ:3.zレڎ `8cMm|2OS\v3pȽ(\84ZomCwI@{3 AƘc[kކSZխ%e^ǟlm  }D_9-&@D]9_h[l[ {e?0nHgOlBg'd&KDgMMeDOsFTk#b-FBd%ֶ[H2Fĸ1I\`\46ܾP"dƥega?vnbj}LFޛؤ'[ iSqDC[O[%jUiKr]/SQgVig&Ęx\r7F@J &-6 i]>&@y%CV8Fg.[tRsN4`Kl+aoC{o|:20ҿκlQ{6ɾsZL0z3^$,S҈3 =؜xJulOŤ%vXz{QAgjhGy\2w\ +4#!FL\4QS6+qb\ 6JAyo͚DiGI|=&-#%-=Ę{{QnEKe{͖<o%f a59w&bVsLhZdxqY$bQng2['Ҧ6;-)1=768^]C$Ϗ!g29+ Hx:0\P9DgI~#}݇}iz4m6ۿ#zٓgvfEբ>U_koq|zc,ǥ8p1V hcRS4% q_֠Q|l{[Y fBa;ճ/PڹgҺw;kuSmݶ/c.Hi (I0&Mjð6A~9]OpOڻꪠ`:}tWWގN踸xԼ}'f3`0 @J"2hs86 F@BgaX͙ W>yx$NgNN0 'NtA/SɩCwE9a{yn }w[[fG^xa>kX3oՍ^QQc#Vi;m':*hsȑ%K BW0 ez{{Gin5MLLLOOj Ŵkڜ~btX#ݦ̨YF9>@g>7gA$O@2麫ϻzjq[6?a)cƌ@SNM<9jf~vI0ޢx~ȱ:T@9٣g8{…ʛcSSs'e9D'Ot[o>tSB+ttt !)f34(|{&:Z,>{\ Ӄ66; 5zS@aaxCZ|P 7%lo7[{;bIXXNQQZv2)S9sfرiii(ӦM zW}hB0&;(RDOHj&\6:l7_^vm*2x#%BECZ)D:\njjB޻yfx @hIl6toA:pt7n\RRRk4q3]dhlZ$koN!6NԩSĊ/G3gN %XlNِYQGό:d1lvבݖ@ R0H$KwHF֍h:NQ3zkg˅vv8NI"ԚKNH {g(2ۙ}5;iNUt;۶e˖;GO,W&gz}Ymɜ2*\W(tH" j2>ם;wN0AرW s.vV 7ԩSPn ҷqHMckV,EJJJAY쎵nsPxNJW?xNt8(x( c+Y^FYl9ΜHOOGEy9 jb4UVV,,,̿_zj+ga~~WS.WQ>>)*5)l J~ hw'Zcva2eJŗ-A1ii5շDEk_}t=.|ct:-ЀL- :QGFF[rR׵2h;{,;**]e.<<h4}}}h7^p+/kM?oT$ i3'&D4W^y@~BzI>OwPڻm:M̻,)aN?VաjH3G>f4t:BF ٽ(ɴ9re]柚9yce hD۵ֽxΝ=z֕O~6.o Jf$SM;ݱ ĩyW=wGvڅ? q8콽]=co,#ONuxu]{ 7D;󇋫~os#YϷXO}1ǫu/Y#'Qs}.[W}ln%v Id:`GYm3OKK;y$jDGOBCjFC)YKvsfV6N#3gLs|3~\?ȸ/Q4~JJ e^j0:bGG}̌5 o?nY{17?4*ȧo;OC!Yњ~ś-ĸD10~kdd_R~LLs*++.gφ*!'e|]+ìAsy 4>}I OXlTKm0kS0m?i֎;PV˅k׮}bFN:x@,5[)j%k{,/̟K)LEDDLIњ cɓ'"5}Q3Z ?{82& Zmhh3=:>6|O<0eƖ(-פ?cZ[Xow\xq>bv8썍17")svp͋N^>4&okgA`3s\dK'RԌzu@0 keu:]?A?y]]ݝwᕞ>Go_Ow6*Z:!ۣgu! f|̲o9z~?ƹ]owR}dF~^ٕ|~juGi5)SXIՌ6.?,Nw̓'N={6RZ-:q;&& #I.uLcq^^^?u}$^\D[~1ᛆg_ke(n(yh“/|w}^]!p2Y: {DƆPPWFZFnAy)'''hY{^?RJ﷽7 ,5[VzA?/<{sG>dv~_ga*66v& ЩHï'Net :622¢t'g[w_J?mz sPEr<}_P2 c :sb-t}A1?B鑯?=n;#.|;555ցt[cp>tK"\CRFZcΝ; .{zzzl6ۨQ$/zowäΞMF%63w\².;~vIk^<^QJggτRl63Geee9rtT'N<9gt bbCǜst115Ra?UQmANGÉ̾ኊc?q|ѭOfL&w>ֲȨӧ;co9yg'EPVܯR@X[:;aXw5_:QVD:&-- uHD>׫b"Ic4wXSRc~xS@7-[lwSVS]s15珝2_M}#)F ֳ-񹹹F&Ҭuuu[5=rEdWhm{QX +[96ϗ'[F3'IL4_$F[[nEw;s/i}6*\I}Wfxi20\2 … ǍDC]j575^wIfZҤQac~2zA^=z:t52/DDDcEf^^v,*)c 7k|z *cG>HKyFyfԂzFr-wvj"#P )O?'Ǣ%!cNtLq8U]1w`yeTYx~앹cZ[+j0ff 9w\@4xZGMӛ{uܶ75<#8 ybر(N _Y:d|o59?p2ʠ+` CuĜAkAX;̰Yf p-gBgP[%dggZ[-p2_`0vRٳ 'e|Ӱ ##~d] %`& 8C"L_雔+a a H1oC3+kV?}꼡Nh2zIS2% @%E6<66!>Fq` a H@ :_<%h5yj# ),&&肒liiijj2===($&&&:::###11$IhhBT rѨ)S CQTgg'5555H̟?텶 Luu322ޗ14iiiH 5m @ Zq)Ej~e,$sKL*"JrU{d)t:)jnnxb6ԩS{A?Qm}Q%UY#F6vB]ü RFutt>}رcGs8 44$ cFU˟*RFFh؄ѣGGGGk4$tQs\\'{fl,'IQUZY%pQC6(,̥cс%˄[-[b0Sࣰ>'ga2̼Ad2&%91^_e*.!2arzmPN&p*띱0hd$J<] QLΖBMS~+gd$W  -/fNXu9r5-7̃Vg@[)a 2A?].-Fj`Kx+`0z]L"T%URO*NL |ܮLEI2/KتLa9wkoӆmaW.a2A+K"tXHLj?g#c5q`'3Hp C2!2^03Jm{4cRz= 6kAұq*γfCc)12{۩~ŸZp(gbQdy%re̕xnr|gsL\I/mlZ1/aPF#֥g-P@BDe)}>yЧaJM>􋨊MJ>[HJR˕/]v+T*jk54Ü*F(C0O:scGqfҥͭ]?96<'{>+Wr8' `egt ;.[<`ܬ:qxETN+M']G͢yCYxn ]qkJCu/c.aBZmu3;pa`V%H ܬ!̟~ XXh];d(*'?5neD0{ h]XXX" ͛=E*X.(( eex ː^W%0Qvv6zF\y&&NȮ$O\m#*G4_򑼐ǎ>eE럅UOCܺnB@g8E L{ύF L.QcV^=k,  /1Qii?#vyũ Qn{TBV*FCqe ̏+$bftSK\k}VV./AgbLuT4eA.,ɥ.:Tx׀&YQ7(\<ϣl8lx}lrQWxPd+W, +"Ojh] X% !Vfo4O N2X x^7 WvrJKVsE&.b (L\2#`zey}QOVT&6)~`O A@"^\JKfģr]ȋ.e~/붬ˋ'* \b(XƇ@/.2/yY%P&\*Pc e` ,`x` PSTT4xe)R2#%&A)bڵkÆ 7 ?)_͛ofR阇~x̙>``=,pBʵ-0?I0 eJ (mc 5L&f*.1J"ȦFiU5BL~Zer='5E QR4އMiXf @ )W O)o>vʕ+զ4(ʀV% [%FHh4 xh29Xk4~d3%U2KJ%p| Tx+rPTL碐Ob^,5rEMZ.h́e2膡xHkTREmI:iX&CUD>HlP,f 2auDaL|b=A+fPi&mD懋KYu& Ī6| >[/Bjr+vPS8%Xk\(*$PjQhD;]pnJJ`/ ҼȬBШPLrfQ=&I+$DV j:b0zqx&i3Wke}h5xY:F>]j&/h!"w2qA8&:ȦA$sPJ)%\a+L.Gdvk+\F3re]n =,ݽ>1X:O} W<Qf,L.\!si>*GAZ5xonr4Ȭc T#Yg)`۪9a0Z#3!T:P} A2xܭ$h0Fuu->e7 Q(6bv>ᔖx>)wYa1< pM;r>e~_Ǎ=u܍>`?5({IR0 ]^KXyf*':֯I`=KXE峍AZ =;OpBd55ؖ #ۏstxTD=َRb b7jEDDD,_!/X^AM_U3  XjsLV:r]g$u隕L'|Xr('Rmn7l\ w.Y-L>HZ(P}Ԙ1Bܕ56gyЁ%O s KٜNp?ypIp/""`+.,9)|g2]>ұWF~u_ |k߁}~51֒8i7lwlu[#",~VAb-]TZ2Xj/䪣)GfPFn ,/jd9H<%[20 ݝy#td%(w"H;tzs 瘉$yz_w[ Z} 2C8bg7|~oe.Ӵ] iy?53+| 9~vcmΓ //an z" ,(+7iWHsPc*<َ:`W34A~\t}Oz1JebkV?ć?_?j]mϜ93qD&]E:FckGYO^`a?j}=kf^`33s{-g{W|;}ʺKھ0t~ntvv #w3ғ#h]}z 9&?ǩ €,/c8ݘl7vKDѥ!Yˮ/buLǷMiihiPʛNM}:~&g\UNɶlڕ/H}vgWϕ VA>kߑ};SD3W21E+56fiBhtnlL65eU_Um+)ȧ?As^@ׯb_WGs赺Xh&#)\l !v`0K,ǓY?cܳ2OQ~:vÆd]5jִma?ݰ};񽦭msu;nN~;l!2K\~i.o۾¶\MQ5ӱv 0L&PĶ,6پaÌmEVIֽ  =W *ζ`Up( l7 eB)|;[ʺ!wUˉg4v<:ptvxKn'r,!-XPn߱vbMb0O]XJD$ztTZUu QUc70/CؘvLjN+nV㊹ɴ3hY׏ql^V}A;)3H.^L'g4&1Vw]f_] ZS2kWnjΆߖ ū쪍ӈgkm&LY6Dl&B;j[2!P夕tS,m2cMQ$'׊XUՀ@,hKi ۘфq3'O>ѝqC-u3WaϮ}nMKq1ӧbjdbzإWmaջvzƱZAVVǧ\I)3h^^ab`HdVr=[g~im&W)I綧?زWbvK@oii=6=4 5tUxeBG$SLӿhmL?ڂ%.]JgBo'ɶ id.A*a>)7 2 -{eRRR{COs0h'rz΋OHK 3C{c,=m}NaZ( ]eD{%jC&(@BFyiԁ^ZSb藵Togs EYn44D$4 iQ1'JѻP%[8?E^h-7I%`d ȥKw(ɎX'^!>/=a]/ǷMλBhMo[߶hZdD$WϿ\7:;;ѺI\Ƥhf[I>G$)',ؓE8tmnIȫ0\R1?7؄ŒW# *@Хb 3aUT]y̶*:A>`{r do00İop`\yD|t/ˁL"(m{vǨ%i"B{ﳡXoT #}Zh +ّU#8Hʈ8'S?m|G,{Qwwa$ eoL]>{4-I3\8s+}=#qyzW,ort}O~]p_"}I&*E&mnu$_[ֺ݅2YH6>QˍYn?KxJaL1d<v ecWwl ԅE*D/[WZ=F#+͐~(tBB$@hXNleXf!] L?OWzJn X(;~1 ƒ@IJûEz"=牒0.2* >="5O/|ۄ ~ɶ.E=[> 7UQw <̺ZT<23, }^ʆr;x׶l+եy! i9v̔UeL]=!վ-gPrvH,+-t[ !O.a[y?'T z蝲eB-JnllʜA\w<4TM 3Mtv7M`4H+ ZzJLfq%UG<Ǵk1JD. )@Zvg'R#mHdݰ뭁4ހ oEXEC=J8An^'&8ɓA`K&Ɋfc:C\)E` x9?C??t 7SHV~`I%).u T,C4ȚJKf>ZNGc_Be2I>D )IaҘ FPUl"?&<~qrI8 %m-s#ȨRkP׌[\;iTdfk-ro$%b0nktr {Uz'dd3ߥyyѥ3$Ay]AhMݺ{MgU  Tˣdd ^ZʬPo+7R&` Uڠl dJTI5jj&oMᛅk(^Cyuw˗' 8vIti KSqr <jPc~Z# 2rҥo>i:O׏u~`i69 5in9Z hL/+kR\ivEP:6=_ah]\|_@8ݘl7vKDѥ蕡|bOJ\D]е^ :fwJЯ̥(e6tnx x=/9abzE!g! e.]3<my t0Hy) @(``L"(ΟvSmSM! xeD77s?|Zh)3o)1+d};Z"m/l!`6_Y_aT|9Hfl|€ נl#9.x蘈ˮv68p?;{'f$[d2gd7 AdxUYN(H*j[cWsk۸FӺn RƥcW'"&NL3|'vna])42^UV?bw(V^3z:|xʭM7jpd)L gv\۲i sXnCN 8w$oh- ll݅8`G@.@q>fn FOoM#ӕXq;-Y : #KN<>̕'4p} Y|8L8#@1b)Ԕ"w+QUe-.NhwUlʷ-s2g'9`wT*x^hYހ";-ӻFUqٺs )1U"f?3 ߅”S$:q%WTVNWFN^J٪U:7TjCŕ/l=Wv2E[t(Tg>hʺxͧr}4((8$iB<6(.>)jF[)g؉L0G:&농U_o Tib0iղ{ K|\4V ʁ~X%+(g7%P8/m/ %=`.f䯙`}tѨ7h5rOӨXEpj}/UiZlC!L) iOj ZP&񫝃v ywW]yR'UVpS{jt ),tyY:F^HKջfi| C.+UZ" 3mW^sXR{>^ЮOzjEыاixZA/ 1 @]ÄsOc˽0Q\bd.!ŷ Z"4ڮ_K?cgvca7C _r<!m͞#CjҢt9FcD3B*_>Ǵ9sxϠlUy%[2S/HKqGmۃ_o_AgrbJ |y%x.`ԅ*Tnibg n`F"7v&b!m8(I#d%鼧ʞ&uCrCmSH^0DRbm| o׌h(-5 }j#6NgEfCJ~[XT7fuPa`Wpx"-T\EvݒN }aتmUw]Tk< r5c5#Hl `V{kDJ('h;O63h8Yu䦓Kg,^-P\l? ?V92/~v%geF§E)N`(vNyk0[|a*Y>!c;W(vFUboS*{5CU]sZVk̠58-S}y?`Ix>j# Z`7DzN\t#4H̢E1#='_ӦsAkDt"v٘EohuZo:? ,q|~%c~ڝTJJ vK "##5@Q&k{ ^'(svWvYxD$4 _/~jEvwT`ٳQ e.!;ZvkH8,]NKʐTdG֬~? hlKmW^1PpEynho/ e@\1Z(V E ;p~\&i4|B(p}I?I-^HRSQ$IQ)6O *d!r}qee~+~ t*ԘaX' )HH{EN@o~T0Iu>E)@av߄4(䃚wdh#:Of)Co~1/`%Mq]bw )3OF8qFj֤OeCL]Q#{YQԔOh(@<zSh R-n }B1??& Yٻ(}3{dsSB[E.F^VEV?j)jEU %CUEspJH0$@3μ#MK}wfwfw}gfwX~\b hح8(sxf5eTiY9cdgsi]%h{eN%CbKm ӂ$)1la^~rWʮ3%sgx~gSE]QڑhVH!,#af *FG%Mj8ĩGh7v;Lwt3vM -%;p3("_'3QHEc259J '=}ك7J9 Lҥb4[-鳥N ٍ/v2gPe h-m11ocWh֦3nYhWKoq}2%cnˍhSlA"(6{ P -Lfw{cJ2=WF1>&;-GIQ3sVpcԢFǡTIeR|!*'df`#P|0sAΊKɑ8FT9첔F?_2Zvb1mh l;ɱڗߙnxs4SY$m2[߾<5@.\Z*:&-ilV:,Ͽx'O$Qsm/q] _wf՛zyh'yߜڼGsAn5O>>|n=7:!A&;`Q9&%e$1|+KKl9l92yFě4 s g҃RVHΓ{i'mA7`YCкT͉F7 z]8I>MV?t}\J ܩbnn eMzioB1U<Cᤩ3F8 +Ϙ;4%K y葻[E5B(x cʥŧ8:GǘrMJZ>ǹG+%$ a;]#|_zj/x쏫h/ ƫ SnLI{c4;}L,%RegjOpQNq-ǿ^365-N\ $nuk&T'畁Aw?4%YyTF8zι\,ܳH)ܾRȘ2wF1p! 5>|ep v.cX!,npVṅl .W/KQ$\)SM8xD+|;)9_LΣ>JɊ\Qxӥ]n4ǂpeczyDϢ]S&'_=tk6 EK G,ڰs1}ҝk*V oU-64WnTxݼkO^K< wPIډ>8&?xN(L׺PjqySnG+gۼyvz{}7?}j+|كhꪫ%ov=<}NW%I#ޤ(}{\ÒǢ Ze_|(5 ?ŏ=c+]qr zGӥbBpiQ`ŋ}!aች]# DwjddZ*+#))_IRïpn߫<9|LǮV4AGD@AUcoo^w $brNLg표"((Cc )~@7 @[kQs" M >tv(c6p]_ ~% Ny$D%-(BT뀙!DDDU/$!q KyN~8p  |r 5C7~cvN9~3hDc'h`+?F7*4G tc,?O?~:QldQ)֍zrRmц2c,7IqӠA }cS\>jfdD1>s.:97;Qjr㸓Qe'6Ǹ|ۤͩ:I1jQݺTlos/޵f_ P5j|.'YYj*lO]|36{ej*QI*o͛(uuN@i W]7Rs9qToQ&=9j[JII?aˆ#L]w>u䄉1ҥKJ-,P}li&FGrq)S̙xl-~cYYY&wm~$A~{q|j[ިzkS1(FIhB<N FUeT eڨ=f9=i;l9 *=Yk[}Զ :FKzeBBBpѣݹBLޱ3'/ p漵^$Q FWr9,sܿp~GuܸqKJFNΊ[ %ea)h߅Yy*u\#jRre4iYe>ym'ȶ<'Wڠ?rRSm6ۙ2~gm{f3/b3[,fE[9nكzA|{~ٚzfmNFJvv6@ _C+n{t 2#SRWt,k`.G鏩({V_3ZmW f|!&K*)+Ьh\ʂ45ʕJb/k{={1&wL'5\5R =/u)R9+dccxp-l\pLfg)\\ 3O}ܦYG6m5!i5&uF>&;m}+ʭޖǺm=w5E+Ro(W}&b &xU޽{СaaaWhQ$`z;#>>?7N؇oי%.m&Tr[ʱͰ Io$YNFˡ+ԾP>߇ܼ|@KyQ&2LosZ g4CyT={\F望r32QV)9p[Enxt#vtyYLC=넞sfg:Mr=ZD5Ua Ҭ 9?6ɍA}^o!5L3x֎m|&KirvΜ/6N26? x>on<Ǐd֧ɓWG=0.ds]˭ \xms]J*6 SeY ic˓rs]BƊo]C|$sLG4jF*r91ʔ~0_L:g)?0b6P6i PǴJ4U=j\mz䚨in64܄/ry=7¼ѣ>䱾[;^e.m|y9/Rh2=/ȿɟ;V~nTh0s7<92aļ⺑NlVvI:sA-1%)שlV((p-,}Gi4O~m8mEF}rLZa}qYcJ󫑲@/rY@;dsq]Lj=|B[/z\@+zzli:qirul;NL1˂!>_ ~PpvkrssnjSxX¥Zv XE& v^smEϼgv}ƢyNoI?ol(R4!ljA?F3[]A54023~J+g+*G[{HIWOV G eHُ=&G]-Q?cZcNI(ݬ)U5^V{CgEa]ϟi}q{]6l)-ya6`1_#W#+em%[8n4(^ld\sĉÆ]p6ZID. 6+ vo߁s=s_sҖ]UOyw$J9\D1:\qfJ3&sF:]i-~[qʗMFc]U1lOI)+VjS/+gBzo͹ iY_뫗Ƚ;gzQ9}g,j }7QeB 9u᱘>Z[=}G_$%XU=*a\ kۊ ɵc9񍰕,\׎.|mQu||[܅er׊7o?nX/=7\dчS˟X9ZgNE'GKoSrW(uy0#vє$}rq|W,k}/`+e^%I$eQ[pNk-WCc zhX:_3u:l!bKK.lvNNR ɫaFoO _\95 bڟ<~W Kk_b/ѽ2?= 71ĒmIJ&6 BDb\UW~61RVZrs$B' D7@Mds۷/ͼ]Z>5 cEwwj@k@v6;la#h䟬9Wc yr,M>T>?%]qqq/fM1r(S rZl11cubb(sa 7qM;Q[#CT3ղRj Buy7K*oƱ,1ʅ<&h:_r3[^ȊJkݪtQb$)_[oG)Nyz [mv{ݯ><2"\Njfx$WDWcw/u=`5b#@ 5w>Bߔi{>/-͟㋤dhKE9ߵDfIE^V{e}Hgӣq}TM]3L9cH<(H#ހiCϕ1UVO.*>s534z!OSn+""*4.,`d՚/\H]9dЧ^` YnG_DD Cp18((8DMAT&li{艟\ C&6sz smsfZO^]F~vFKXrl'뭖KfAW$Jl6ap}DQ1ׅ^q1:^z OUy9K$(,vlo- $0>VR|d`bL7Zn]DQI1J*#BuzN0x/K#"z^oy9&RMl7~dTii)> tU[+9p¢+'M|oe]:&0cD7HϾ^ eBxpѠy|/$}DK)gN& M|o'5tذ'N{Tꋗ6$ ݦ|篝=ϙZ\7Z[dѨ 3qQ{8c|XU{[T􆟜Rt_hh0y&zP<ʘf4\[KHHHIIWV?J Zho$?tu "oAZѠW-)3'՛w=z4<]!- ŒYi rzqߘv*c2'x\fA7MÉ6t^'L8rUW]9sjDȾZBdK0z`GYoe N4JA ( ]opÇl]חʿ]n^LEG?J':5bx-#.$rŵ]c0ฎ̈#o=E1&-wzoIz.8HߧW3IAj4DQ0z(Qt?^ :fV 42.?6r &xutl}'OZ?-nJ.SrzȨ>q)8W&f3Af,'8A3lEuF8H|xѹj:\O+cf(ϧ9MQƛ_N7fitz\n.;ӱUnƌ|!CW$IN >u'7}VҿNG ^tvAolV^<_O٧Ҭh|X(2IrSylrT._605I/r{T*ч16;Z~QmWu'o>}矟מcvd^3y'tx @9Ʈms2ΘAjmm|;`a+VYWzcLh2r+' 1?ADdbyjX3)4]ݺԶ޸qLAAٹsСݰw#D.c0LDKپ:Rb[oJ;s>qYce:u9IM$X]oo>cuOy3ږ { '꾳%@^Qjl 8IGκnlq9994C[w\ QKkqP9{WWQJM2ONd>8TM7TXX͑#/Y3tذ)W K7=...22F()))*8RRR̝EWWaZm1izsOܢEhg@ ^87Zc\lmԃu'|2?u9G9Y$ muG(~TVvĉC_9Ǵ)$&&HJ5kVPZ*@݆2k̈́3je|.'YYj*l<''(L-:O^iЃ25;7yƪ]N6oޜ?J+QT]+߼}  $)W3&̟F)zbٸ;  veoʴ=՗͟|$iԺ:9]3O>)Wrv(ѸtDv'/zt:o*HN;v `q7H62=IڵzRCn MHusf@Ҩ g°G:JZy/ PX!c0F# GJ0vfYVPMB)dzQړ[s/ 4B/73P&i$(ȡ -4W(l4bTWFM3DPx2RFnke IWa;yUK6c;N_B(hSN5P3g+#" >ze)GTh ; ton?<4]Xd\k^in@>jiVrN,_q=746jAA c2/WG^i?+XL9WF[cXN,ְn^c jzb A>E.Jj]{3tx^ir /6o(nc 2 ze`-,u:Y|g zHzM9jj1>mcQ׳j4ZnBAf;}4߶nzہ^= ]BJ.{vôVU{t.-vLJa:cRk*~[`j̯5ӜY:[o*a- 111h.y>\uDv;Qa.Y/.7Ӈ(CØfUS{f%J=PȔ)1el V9 @w1j1:O|!,%((])~ Ki[jpv4Bxx=2zt&UihuӍֻ@2]7ĜZ^>`SwCCC>Ż/k4@+%,,L=Fir  @w1F>yLzv txa)ͨ_0vP4S[[kV|e >AheOa00a'ǠKZQQQ{VAƳFhnD{"tSqm 1>Sp}g/C|rsvհvȩb ߼f X-s3D\!Ƴ3F 1&\%o b\4S-[V6Є{JG<9ƭ3F=ΫPj$nh?0Βkdd$Ej͛)Шٗstϴk93g[9~=hgF{ľ}ՋҌ0^wAa߶ qZi-M㟸b4];@ 3ƨe`Ihhgjߔ\6wI3>q}vR= Eŋs:iEjUșwtTM7I=(9vIKtt4w`68Z%iꔠ8^(JW:+CwE.//߸q#-׽ܣ6hi۸|rX뗶g'n" tLvDDDP(C{}h w+{i>8 XXQqO UWW=966vѢEO?Cj7*؋n(ر#f\5ͰyDh#ӱ/}sLL v߉WCieG<~J6&ǐzZ"ZF`Q 򘑑qL|fzz+ @;B (P5okX'B78lG!MHDZ/^Xg?cN4(N9RKhh(%8J3EWYK(H_͢mC-YzmK;wϘ4Ӧp16 x1aaa f/(*kc$6ۖ#m_y|6jrXWNv2_ -[:ϛӧEaPꫂ ̨(V.CY?gޯb@ooug|nor崧nWY`Zy+L-b@)S6;y/Qݻ7mK;wڽ{֭C ,`%(;?&444&&}Y Oq #Ϭr[dM~?nԶ޾A9J VWKGM-Xu_G7:'ߏ l%gwQ{lWl1SRvQϔx W `]2I:88>ISh}qf.Ig7ܤ)y {whߜ/  2\m nF/x_,jt*Qi#4d;fK3T W_*]t̠W 0.d4űvAnUgF Oh(։'or5W]FJoAnj|k-BҐ~&s'N:a2h[gۗΒ KmFZ7Cl6k7b.\ V{i:K&9cGd-Wi .O2r0\n/ɽ_|I7%Py>つv(CI8NyIzYS̚5[Sto/a [TTm5yvw69ϕim}d9x2i=d^Lsi.Q| |=wӴ -iOGlCMɱmDzÛ^̻?6 p4YI;vl(/|aåI ix:Kf+*u6=M3ȆmoFՊL2=Ģ an #Cޒ~OcP*¬ײ,̧ >|2-iؒ%v<8΂^ᢢΖ;،٩GEIc ƹLW0yrR-~mBQ/&ǥ엮{@?y~u\5,ɚsͩO!)}'CKaYgӴ&2oyۆxcr2;|ɶm4xV!IsHz߶F#{۶%JQ`nc!!!Q))tW8tf3(Dh^o2rtIW&19.޽Xk &ђwkνȳ܆sF)ID3rshzeX Jgl*Q 0i7úd;gIM·;[ú>:1v eNe2hDfT|Gu`9ΏsezI6+ͨwm6EJ~=C Q2'5Uص+Qk"IG} F fZF0.]ׯٳg"0+ s;꒒ʹ2 Qb~K"&کTK|PαIcBGfKСZF۴iSZZû"WVVr~Vڭ|x?ub! ĶX,<3{/T[G0Hs/S4l4cbbi1xeZO=5{v_?tQM~D7@8`_vA@+G/alXmcU)!!!&h4JlDV\@SڢhRVNFbDV2 D͞]SScX]j-J=TѿXXE`xh"DVc⮾u @@r 9h2%N  W"@}_{M[3n\UUfCzΜi"""& (4륗Ի71_'SFGGGFFB֬QKG@/jʔ0]B$کD.XzZr!) GQFc>)VP(._B[!2DEojIfV+iS 1} 111j Z+ m2Wc.R#b pz8G #_u׫b8Ǖ&O۷obb"Ex2ؖe$-ZD4CuhpI y62Z CE)S{(C9W^QQQ12WghN[E~ͺ? [ F}tbbɮB)X't8WO[x>!ĉS%$hOAAF9F'$͝/]);^{Ʌy# qC>o&t[{`mYNL\률ax12Ah.y>Sy{(;E>=>NZ!IW\UDGGCA W@@_zwճ/?}4PYY:.jZ,ڋyzQ=jcG.f'$0a~0;6( 1aaa& 9Q`0qG7_ʪ߰AhFDF@!FAAn&$7WFGGa9PQh 9Q (r ㎚T 4,}N[!$6 k7 7+( f=14Nc2%oQ# >XF 4!wYZ{lCnv#w\M ICn9}B 1ZEE~\)""BLpp0m* t@!To$[9֪3tCԄ b(Pa}0p%DNhǛL&S曫￯߶TP䛰05Өi:a|aX9߻c&L"(Q'Q%DΞfM{hko65 ukP~ۄj!f5 t`|i2pn0JaiNEA&vofBZ˿mNpHA %ǗM6h B @ 4Wlr!Jvcijk9%Z#g}B12$vVnKM}Y?9vkW?iwe\BMRַ`hݱ .J",蝰FeOR c1k,jNMh6~cGpa׹ic 3&yϯQm OpƗǏg圧P4l%9QGdNfYn_"zz[zRM;]|ė!-5ezJ᜝44@QF4v eFUC ;wXl<ÍgeDq +5+0剉''L8?nJٻ4^-H02%ӈNjq骱Zb1;E:pgi#$h]ĉ\ y/,oe`eєvl-h]5,ְQ, .Xp^ =1~DwiAinie@E%,'0 [/:'$Dh:x!,Ө}6nAگ%2;n ..}*GkQK_e FUkܸd'n 7ơi>wo]M UNP4k:#GT/2NԿړlTi<#fr#Gkq<mz|-ϰ;د_YFY_e]cZ 7B_5ܰGo[aAG\ۂ{Yų} (1.wcX74>naE2ݳ-|hgq2~DۘnaEڹ! @77n6uk2xF@N BOꀀ2YB@'C ( -払ϣKFǗ=VNQQQz @ٗ2]~ 5|_{чDnN+rĉaÆ{セ ;J_^"W\q1m!ݥBz|@w^ncءCvdG̋/XWWwAs=T]*4/ߏm E-[,YD[R~5W\Qm8|HQѸaz),,3gŋvv}j499G

    +X 7t[fR__SS3kݠDQZee*,/(..ڼ_Ɨc/2iiiEjٌChPŋ_\SUxOv~Ԑ(-=Cwwӯ_?*?᭫(j. b$$X-Nl4pâԘir3Ǹ:&3۬i4G~r߾}ǎZ,Z V\|4@No}4џY~e˴%A 2 NGwL"ϗ"''ɮns֜;WB ШQc6UNy.)i+ JYњsCIK?pipk5|͚/|~6P4ǏJg7@7^EOϽk׮yM\tG/MzR0#77c ϏYhz+е(WW5 `Z/]x~640x຺s犋h͙=Ȉ~,Ǘ)/lgE/ _<&s/}{t!3{Nj+*oVFFd9~d( =4q|ffnڊ3rsVPHyhnf=KJj"DFF6m#bhK(hgu?/ܲ^d}v>Y}>ٮ r z.(0v!ulw:@ն[~Sf󑢢6Y C*+K˒Ҳ#T~knE1$$4!!!66bLqqj󛀟~6[ G9`3\%x(eo+PίiҨokkDͱ_.@~Lnn3ztnF6fgPHk2MFZԩSǏkLnn.+\&uMgm翹1,~F=UӔ{w̱00]>8ry!+++55HW<_+=WKؚ-XƧ|}q\ciY9c8,{͹8NH! D#Gud8|xF/{iۼח]pvZ @9ƢQ[[[]]]QQA))).\(..E248sw˘}i8l>qK n2bccG$Nɓ'߿V2+D;LYYbW^7>Oe"fʆB~֭ŋКeoUӬۭVm7uu5@ټf¸!.v`{N>뮛8qbpp0^X B… =pe).;嶶;m+&'tyJS,ֲؗ\ s:%p{.VE VDyClfb ]CL&KVVVR4CwisŲ֚2+L^{y|ul ɔ4aa֭745( mv2t22堨&dbs 8hȠK.Xfݥ]s]pѣ6M`0P1jA':M(a(S@FꚃNςJŮP;IR[$rle%q%cZ[)$7$ƙ)&a#r+J'Sg#p_׃WЖ|/;eg%S8˧,^:'vD-=uxц2yG[IMݰxk":թ}YEZhSS~c ݎO/'NvH2<ϫi8>:WvO-@}"(S,Vv &:㈕r4޿"q$7#9~C<yyN뵪.̟XKS״~ޕ;k(!/d΍n|0۲=f/cpΈ>MVZ'ZdǑ23;] [[+(Hv.`u[}vQg'qW>jͮeiGmze4] j{j7Z;"Kwߝ=t۱z[V)B;43@Om LϹ2rBݫ#9?6^(q~\U'wl,k,y6qȫѪ=-+Pwz4L^Dթs]*uo_|<+mFlՄ8tksQ5 /,{.mkD$<6&F5rԡja7]ȥ{jhl&#g}>*iĉtK~UMc*=~uRLaE 4( Ǐoi$xk?m5->F;=KFG]?~3ђʫYsp56%BȭJ(}WS.s4֭i ޞksK s1VkeiƥR Մ8zXՌ^8h0C45􂳞k?$)AAAuuuF1Da"9Q~Tk^=~h1vhSNWF9²X}ʙ[g6zneG[jr╜NJVB2##;ZIm$khS\r"2QFfB|„g{Fᕟ*>ǵ3wӨZ16!{jY9 Q,K+6lutkV6Za?/=S) 6Ra)@$]4_;{q'<<0...22=`Ǚ`t$FT?ǜ<-rӧO>(ʑg?7AKs{dgbGڝ9kLWU\r!6#ROLv^$gVHeٚnN6וmr..p4QuSYvBh[ծB3p%/[3zKlyuiq{[;qr‰<+P̯eiņ-knzjZ|i-Ȉ:fKU3T1ᱱ14~iرF3Ň~'|͜rtIIkt>^ڡBBB&G͛.ֻM qkw[>,nm>RKv s>},7wv`¸z!88866z"o+C~]R>` P?;-2w8zJtСI&yt):[}VOZ6|!:rȐ!CDŽ5/] `XYh"S$M>Y޳wodPE<___oZVwe#gVvhv\:^֥ǥ$ӧx@@lsα+|3k\ڰTò2߿I9W^T."2-"[fhhiL M+OѽWq%La#^t٢".W0t}-;z+EFFΜ9 &D=WyeeeQs\̣-KF/BC@WOmyI$IS8ݡaDh}8<)K4(OѬؘ\ꌕpR'jK#D )uym5xwGO-WJirb31Nt,ΒYŞKS1jIcNY k`Vs%u<.xK;fSG);DY|PSt̚XnOcJtMCm(:»UΥ9fʳH 6,&=F[<\ɱ 9V)X[_tSudM$9[A^N.Wh(Q R9kYm-"+]7 uFSDQ^Cr\ y,訪% T*l[G_CƬA*P WǹoʚVxu+uNieuJJlh1yp aN ZyBVVv#O9W7 &hqr8)[|;^'ε,PGD'ϛw oxRe;RCP= Kӳ5,(cϮ,w[P"ull[cU:Vl[9^ǜZr)+qnAy6I~Ի,46>#Xst2n館RÄ2:ox:m[2蔆Q}oA}]ȴs)ƥB6 yIa ^֙=W7*g3*3$A$r2e&”wU}4\_[oTÞhFsc[fx9JTIENDB`robojournal-0.4.2/doc/img/screens/mw_tag2.png0000775000175000017500000011675612142060704017623 0ustar willwillPNG  IHDRG/gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx`U7H% RJzS zʩ,!(%9"YV5*XP)BM#dl-m q o߼6of}~xBؓQ5e괉gFE @Uzߧizj6IEĘ {UrԸ/h(HzϧZzZ!Q3cNc؉ ʗP#SП~c.̘1@ObJO?3M qWSxef(3@5j4j & ^B@ &k;[vIbCCSR*:W3hoWT+ hi-wkDiE8Pj#y sdوk 'O8Tѹf(+Tb5QhF5C~Mi~eʼncioWFD_osobv|UXTд/ 5tweZh-CS@Qn@2boH4b=gS$_&D[Taf4ZMJ-$ leqBaGsd鵻Y7`vҡN=@2MeUܿ߭3j̭&O IJ M#\}mIp:59CӔ-ɬ >DhZHN4mC[|pHj@)v0 l;F b"7Q'âfMK5:`+tpb ,e~rSY6#[asݹ/X`)Í?y~c0SEt;dʐ _[+*qXDl ,1=!4|O]lNʑcOujk˔kZHJ2ՄP/ca 5v ,>9w?θ8fetehZH._ih맒3#3iVw(=P81rp6fM@| 5=iNW^SˤMOym߫/3}bF OiZ,O>wSfI GOE饑gp;8uOO1 =#Mj.37¾0.^-,ܯՌ Bb5!F&N#p7p$ѐ_^qc'Lh fhFAʵmZimg~3X[iՈ2hУ5S2e )^6i98\˿' F2'>yqπ{XG͞_wALG|$87aOqU֊2!Lʯ^^,\Nu>{f7py+eZtaF lf_P{g=w5g 3cI2zkkHޔbQE¼p7/~yYd.2zwYk?V)TeS4utz{e-EI/e~#e>.qu2cAU33&՜8]3jHɛOEg=c-AlttuM-c)U&IhY &cJJFel3g}b k*(%6s%W6G~_+ZccWL>u6 LæBFE&hBrt k>f3{z $bf>;B?3ݕơe=Eb@YO|DεpYx_n5n06:ܙB>9L`։̘bV`Շj[;x7.ݵ.mDPH6dM%gWu{zMp^|?1YroS l_v_VIiC-L K)CGkEt3{OKH9fP3x5L-L%-WN>T2sB_\439o*"כmRKtVΈLEHŢSynSS&pMP}h_UceE61 wprIjQHm3)Q98ZE+)2IeZy U_=Giչ]Q 7~O6vxC'h0 nmiEͭUC0ߚ24SCoE6! Їl3MU5neKG&CvQ[]ڍ-Z#FT~#R\=0!YU%cd9v:f6l3g/LYl:[)M22 &p)6V8Q؄؉"FNETgl9 M]AnPjNۈ#W]BySD dʡlz ](kwoĆX?:4¬ t7~oSVu*9\7 ?Moˊ&3MC㲦@Q,EdGQT6EުHK$u J \jR1B'ZԂ"-[cpXd>28nP Gƅ\d;z \jYFR v<[ӈ5ĸwCK =uZM{:j K&U0$ aZeҫ== ڎ75^nD5գ<:K۴= *f=RCH7\l: %/f(ת3-U*hV.v;+A.7ҘQ^(jFn []|lg@M).pYXCq4θ$k"R CPxFH罊= GGry\<CUN9]~};6CxB[`k| 1@`p*1(ؕfԂ˔OKDK8[#*j KDDZXsD$Bmuq82$0P&bRZTmZ]X.S A[eHNʳJ2n zf[e|\Hd\|$#=xprL冣"piF3^Eq)N!nO@#KJQ-T0r)wiE5 Ōmrj1Son=yC푷9lٕc;0_O18>UTuPMk @T3r+WnCGw'ј1cLo EQ7@g7VVVV}@j$Wj;VՁ c"fSYYOVK3 žxcA/_y7unO!2JU*"C w9}3n|bfrw8/@  hkkS*nj`RUvP MMVfKCJ(V" 4Xw<JaaaцTzu,+:usڔ=Xbbbp/\0d [҈g͟#^E(fM3Ri'`DaZnvZQQѬ_V>Đc( W 39z(>j &|]RR℅ k`e248[nqN@^. jjioiW(;³wCԤ(r|.y 7 qQϜte'F'4ԍ2!jٮrhkkkqbΞ=to]]]RRҥKp8|С4ӼT*¼VsmᓉNWׇO~=wj笹cES/zv YbfZE@!?ZC$p;\SSsϖ-[k+LͨT*|`R |0`@ddMK-AnPJjoyE.\@K _ndȑԠPi25ЮZtQCu.6똨(<䰆;i|61XyJ]ZUҦM.Rk=(mՊ\omAaSe·}SJpaqclLL_;9,XبilٿxAL4 wURRRၕcPbL\\MkCjrV'i.Vw[͜<ڮ4TUUߥ6544Gfwe߿ _쪫Ci{{;;{GG*ԕW(yI}~aTX`Hw[{{[,";vlW~PkiW_xت( =q+ei5QXXڛCP~!( |7w#hN>}M79'h_jsS(+.y[523K-n@wMoke2٢dJ[\)Tkj]=N߿"e4\{J,V̜菺`&h\v;BK~`qzb``|ЀGAToO.86d te<Џ'Dˆ /^ r{]pĉ],SJ]۬ )?^i%%ENwiZbYBիW jkkjҕ9D RVVMTtfĝZVЧ)'j T*MU|dJ@HZ姻+y )y`@uU`h")S_ITvowLBѨg=?5?޸/&%57\ɨU[g~)iMW׌7p\5 =C87S]]FO~ #GkmtZ_W\ZR ]w^ y*:*\wo<W~9y}dZpZKjP* /_8q}pӶIIIXD3Fsb˻;kC]1b,d-+.|D )|ϔ+.MQ e˵ZuAAms_af)0:W6~dU g7)v\6K:?KUMtbߵfUs[gk(=6cLUUL&c' 58>ٔኔ4wv"W*;j;Y}v{tL!.X1#+$zc Z7y_z588x!;bAAA)))R11XЈg |ˬдFKnˊ 6_M6_~̕+xG{?aGRimmD4}?[oHxOUje/U\mcUMXxQGJeڇgG5fRʕ+X]"}lE|f-` _G*K9 'xYnnQhZe BzZvpX׿a߯zHJKK;}4.-.NbDΝ;ȑ#2AqOՎJѠ?@j:4 #U~ۜg"wʰD/^l[xN'ATi䋻ia;Z~ނ C!~sAУl3v͔32X|e x8ЏҨm fYSUi]M]V쮤ڛ26^zcKPPЄ D%$$$33ԩSL,***\2G׼ou٦ڹVVq\rK.+Oj5*C#;Ipwpꖻ+oЬLs9=7['-GCCZ< %?f^]Vv#{*k V?6/ xvu~ BUfܸq pc[ý\j3#1.rpP?d /`Ί_a/Ld syM7?~)n9|fޭBa8crN7i_5?唍lOZKi1! 2nĿ;Z[WתT~~`5N`s-5Zt%Gr!H< ;fM_4=i$JbY8tG |i{x5j4+3t[/yݗdddrm)(sp_SOp,_뛛x,C3w'_6Nqy|^XkP e87/b%`$B#k 7 f3c~]f\%4*!==*w1(zAN tr@>|0'gxj4nCGwz24@'У5@L0Pde8ʺ[[lz:ft;} Z0lRʪכ NL p1\dofOMN]#3Ml@Г@ГqXǡ!x9Y}^t=bZm]]]MML&kkk1 EAOEA`r褤$,bhnnnʦ [noCLIIIlllBBWTT4tnimm0`XTVVv~Ir| vVKtmm7*IJJ <DEt. SaaՌWSSŋϞ=[RRr̙ FC3@W$2ŠiwVB??uHL/\wvFK 4<:,LƔ"Crr2TLd~eb/G.qy)DyEE"5Pͨjfl4I2zhXw}l\ 0皧OPIND\mؾ,͓͚ķ#0,jDw #ٷ LR`ˮ6 `0a n9C$ YkmebjFR\TZl:vLbP[sQ͛ij;ߕY`n +hX f_ ź߈myę[0"I,J nri/tSb=jc1ԒZKĬoDD"bt~!qD*IMr+32}=LJD'G%l9"Hh3{}Q^+ɱߴqy㛖p46J,%4 F@HI.[yl&yżUZGZ###}}}2bbblf ב\!7XUC!]+eEHWdg?Xmqa!sN6J':wrv݇0r&uFX ;br]q" )" 1-= uf}&W$U6Wfdi"3{4'G̛7^Vrs]ޤ9hS*++nz񆆆ֶ6}ݛo ݅!83S] ׍\rWk|oSmS$6y#MFuRpMMniYbm+Pj/T. Z ,c ?wm&66vΜ9 b߾}۷o߳g_g့ҥKcbbcݓרN# c >3v6FbkY& @Wڎ,>cLb3&$ l73dI-ezy!f~+KIu3byqdb&e2juxwL u2ő30:[APV_%K֦\ˋY͢O6DVu&EE\׋q,J Ku'< @0Biq\ʠK֦%c'̢ b{qmԩSjtRKf-A 0CTM"v2ʹt8[d 3@ĝ+VJcI֎E٢t"OkV; Ak%4`z+4n!^ee75 `f ]d08Cr1`;DyE0F5n!/k:I× 6 {.8@( : @ =vjO(г5@ə&ɶxٿ`㏏>-[ 2=ذaEB¾]ꧣ3S0oޜL;ye.[PWىxͰM, iTI%-m%1H+Htq> <䴔aFބ"ҫ Q^.~5XL9W|>`9 HuE.Fo>cz9zJ:~8uҥgm4-&Ŏy^qn^|iD`S dH$"1H"Q&_HȺ$C$J# 3{DIqyEw|k@Gכa4?Pb!q,D_'@7~W;8*b})Y+E %u']A벍Q'eX-ӝʶtaJ.Q`z~I4h,F) nzDKͅ$%#LDkv/R !d2)*S" LpBMhuqeYNV`][]yGhkVX'"x ed,@Dz(%+$ht3Nd1Þ%.#>%:~ 7|ŒН'6pn-o:wLA ^Ƙu(@ܖ[kq;({|803Yq -$"db 8:x`- f M0|]G:9]35)] 0YԨΓHyBN6$ԵLآ똈_]tt(5O=XĩЩbIDcAi;oNdGK̹2 #,cFHL4Ng fif~UN K+Et,fFxwXV'v>2I2 %K1Z3M䠓q=T A(.¸X#bv!3=[K9e,y+&Fӓ qߑoA7| fZexDQZˮF*n5V PM_0X`~;*2fg, mn ?rj2 n"|' 2Hb!Ҳ9m=hrsMUlrvfF%YhvߺI͸31$ &- U]A92xgDPm3[+`"$sCY%2v&$-p͓l3݊Zv;7!mؠ[Suȇ9y=0buhP یVuN *d\K;0 h9`F>-+*Xþa,7}f,OI4 ݱ\fl}[;ok>]H2qhjsͅh3ſ. f[܂lkb$9<>L?Zw?>hbTd%5h⚚:Y]weGe֟qHX7*X~FLr ?\[/ax̓q1 ˲ulkز%6󧷲 |{:!<lK@_f Ikݎ0( 1%UTi g";[PU߷Ȯf&]k6*3aP' ,jadI*1PՇiiZK[!IEʆH1P//+Y/#GI!>c~y-Yz 6~9mY[1z{ !s\}c?Bp,]|AYFhhAV'BvzPݎl3_bv+ C뵺L7.%5sD'4kXԼwCȤ醊Ψ_|bKJQW׳ KI-%--Y~x|xCPbzFU#tF]̙o>dLc~0bHbz*'۩Q>Lcoink7r/T\)3%g.nF[Ҥwkj棲&-#1C/Dά|eJojlYiiY^dMH8dFjْ&=ջ!fּ; |hي9?ĭ]tFFF||<<4مsgB}QͰ}aO{{^:r|&tHQzRbq]o0j(e"@m>0d,E{y[1Hr|QQQ6"8J3̛K6KM B e 1~DqlGAkz1V';ؼsc7N~=ý >6ѪU: cg1[aw. NÅn̼1QB.M`# H= YyERFCȑ#2uRcyd2ߥhta: |!%%bFiT2)m"hoUEMZ'j+(UF3{x1:l*NjCQC4*wP,Y >KVga>\j-i5 zjf4 Q hmbI^MHb6N/q0oh+aL+Ĺbk;m.##/? 3'S".bDۘt|ɋM󥛆~*9Oʟ^R YvLﺘ\HyIwMb>y{{^4kG'?*g˱HK?K:r$IC[}.kv|g?, V!j,Ah "L;r~H'o O3,eԴJmAtz4}!u=qQ":H6Dv@_eȁ;A=\DR+Roa`$&ʈOݐ2rFTI9L_٢3tjњ@)wc_o/YKFdZ7nCs\w](ʬׇ7{8r+^~qx+\7O{,yލ _xu e $={A<O|p~CR_/]]2M5Q_|ŽOmMF1`K}kl˟L>q2ڸ43MՌ-Ҧn(e,KRFXHbw%XrQTj%Ld*E\}rd b3:Bu2'82uM.gêBMNvdR 0QȹOzkS8B+vȊV\yώ[{ɩpPhM.'^Ax 8/ i묕iҤg7wW l嵬 m<{n)xme#~6uqa}~%zbO^"dia"]zcXlzG`-AwZ{eQ̶J[׼čpʐsq lJCS^xuۏ$MDH˭Y|=X+lk  f>q*_+T XWz1&u3M EAio_5[샀sןq@@EEty1O,_y9V}MwN]7|3ILEk!C"yi2i9Y.{S FqIc^E')9Yl%,|vok{b<ڭ|ٷT>?_{26Ɏbgw3= K~~A笍 J)*{rR -l3Ÿd/ǔiҤNԆVx8:7~܂۞m]L+cO( w0Q4ig-3+c3Ի+Lpqd&rHwvMgE+2!%|J{-b1XNy7eld0xe]͖iҤgf>'4S'u5F&'-mp_ؤ%kk4 81Euw_r+b7C3Vq ,a=i}Z,硺A& jɼ}Oŝ7'gɟU Wb7Utj;[ɢr\K %5P(z%nB/ш[ڛ/cUmz!{&Ϻm;'֍,֨z+Q)Gdu\nb,5ӫʚ W۴jM莄 =4D:`.?ӚaS]OW|R@x ZV3¨浺g5cױqRkNGرcOKf1ZŐ@B#~e1*ϦC _2OdHnL+c-642XEr^J]suy~)CާBU~/g%%YkKnhq:ie#=nG[Te Y|1,EtA^UWȲE$)+Uc-aY]"mߌج4VU,LَtM7*΀5㤔Q"3|hZ(Y[+YvyK?a /k,ڱCY.2sRFʅj^n1hSTL溜aMAfjM#rvQp\"dX.Z-8NQ+Җ2*;̜O>!' 2rif['bI~~3K_T3 XʤMPVWLڬ%1s:l9<5kJ֮-!5;p VRC0OҲ*y sFRW7$%-.:SKLgY.Xø(DE5uôw}?jӥ; .(q@ر=PcHo1ّWvɪŌC~36"Y߅%GyIdte!5yomKԯTW"ƹɓ4R erϮ+ZV\ㇶDEM;bYBfg~ZOfeNʒ5k, 'OzKyqbFI73 Ώ⨅fx:&^,b,6}/μy\ۉܖdgA_T3S}}HlҲ-e>k"7 k, qîQ%jѣ*N_!Ajd :<,C,''%s(Ldz&fݴw.noY><-S~.䙳ν%zԼI7͝o7gJdܿs8nȐ *o駟.3J-ɔDt哧}ଔE'=iS9TiI3g3g&1{q*yDbKʜ9sV޽g+45 ی#HpJ2fHiqp߾]-2#I gLFLE1ezLXԍR3o 5I#wCl3/7;9BiEә8!S%e؆Ak$E/j1CԷ+3KL25SX;"x@EM7dyiWݓ7=`< 9.8yU^NMԩWʙ5ww $$$=e `mFP@}vX afW@! `BpoƍU*mCCC~a3/dinpjj=fv, 0Jp?qR)3|6+`8n9!`p,hD{ٿ+lbwEI߱ \*k7,5ʕ+XE rdmnٻ(C㳹ĊH+h6/sh5rPTڃB}ڜBO6`r-؜zZ#[/XPlv7ZA=& N}ggf7}Y&(@=T"cR4RhΒ%3)`R+FQw^2H;YZ8Eu`Fڬd:)Ei$iv,Qo'ެ?_{cDGۭdaZ}T]*Z[G]|fRQQ#FUEjave9VP.U~y]Ի@y#fd޽{;;;wޭ=,))Jdq+YCIE]#5v XH}:/d fz=mmRcߧSRfd\W'~iy|{4!:9x$e$ɕ~-Zdf%U(4k֬ 1J_lkILǣuhO֟v@ʮ&Lٙ7։=Ou_~o]]gq>Yv𽀕&}S&(:s8f3|xXM __9Fz;qjny[+gCw*e=V@Uy@̧tqW̬ya":P-\hqqڔ[%k䕌(U^#՟L<2|VU_L] >c4V2 ,X?dtmK^>oxzdKQL( %eC>,?Ǎ;6mѨ?*X kx{X`0)"C|H]5P$^t/SN#9=CQ%ܡLk; O`8SÅ|>'(y o7cBs/E9ԶiH(RBDZUa)hH&Ւ6C;,R+4m- 7s۶Cwfє;BCy%2uk^ά?Ri܋5 DGS36ZQz΅icmJxrOĴ!k&I@ 1HΈ:ӸcG ~`[=U"eBeei&gq81*|=uh|ѥ=#ELc*گݼ5u}{zN v[w>KK͘LS$ʤejy<{ު]=DnE"(o~vwaǽ 6g4m "Sza?}Vz ! ) w}tĉd^`Ӧ6,[M=d^yH^62IӎƂEY1uz*(v+j܋"~=LQИ 4Ʃ^P"rP3['vb IJ߉R(ʂ|9TЮI?/@y[fKKfj=0D4z5ybuM%v{^V%H@*+ ot~q]_LT.P~]p.Iڏ`Q~0ܫK@ jPez$+( fq"طԩL1F<~܈1b_f^X{ٵ_ EudWE0'.ۢ(烂m2]i@rݜϯ\gN̕qQY/'tqH\l Ý8F(SMD-eO?9jTkOf/B_QsR?!п斌 vE^*QcT^ԝߨ;f\ݶ{wM\߷pޘrk9}bȣs̫7>~-R|ꗙeߙA`H')Xͅ omnnd7Á }xFҏ>|;ӳh4۵+ؽs3.ւol}.g1ok?_u<  s%Oiiiaߞ oXn77x QLhEl*˚")۞B̯NOȡJ5.WyLU~+Xc 7 I=eƳY'|ϯH=9(3061)qF&XwHwۑ//;Sp1*lQ€)P/$ovrGuSF1Qn2j!Ԓ}GquͪpЦJ!.o+y|\ԧwi3_83[JZS?p1*^ԀiBk{otKQL 5'FZOXZ =eZ֞W2/_;-%1%%UoZợ,Z0BQJJЩ#SÜ'x#q&W/D%.W.VN[)gZAbI3(3eƴ ûѴO' moL^$3bY^5t~Кz.Zy6_y2]ng#(].J }eWELRn.H!XL/z`3?',^Y-B8)$jiEKU߽JZ$&g8R8SGD)/ŞW>k)S]0ڰzf\i聆(Gd||,Ю˿.ڼ{:ILѪUnmH BbE"UE50 @RДe2Q@0hsI-6(!y5|A#hq糄XpP<5~.0bӐ`$4ģL1.hzS w6.*2L쉝آDR^(SAH];Kδ)IFYOzݢTK@u&1ʗEv ˮ(9%+j1.2]ҲǗIn2':6An E^MCkCDuj{ssNlu1eJL%W H83M?:,Lgwn(>Qӌ+A8 $R'B}k'fis1|ydZȁA9pBQz zvտPze5,(@=cPXKb$t$ڎv>&(瞤U$m` əf(T@T3RRO|ls=|;/Cp׸wMel{n`:pCK1zrJК5AJfDٽm͇QSK?: q̫7>~-R|ꗙ>4≓:Vn^K:ڐpisa])v͋"f\Y`pFc]kݻ.<7c5 qy5oa Q<ړdpˆykp/`dr47]72-_|pKcm<զNwwvM1_n y mO{-W-ɦ}|Խ#" Х 9QoH3wմŗ\ŔTUuTYO(cH3q̔&MG>(LKkW7*&t~@ߥ7V?Վ. Ica܌)dokz!V<>Wge-I+GtL%ʴsႦW8K2*^߯DZ9S]H녢Șo9K#v)EAve=="XG}~Gzq]@8SUIJ(NFQ\9#$jhXTN ʍHWIB=[d^ž2G/yerN3z^X{ٵ_ E'O|O+zE?-3׉.ۢF |PsG"$Ŕ};=!˗W%3vu[hgȔYpK8h9tHDϮ 2Q&? NN' ֎2W7HY af?kn?;PwWFPÂ'/OCj%1u 1't$ڎv>*eIJWr7 8QFJɝ͞vОo9osVާxӇ{ꌎ&g) Tb$“X' bZKY,oFN;9/+oF㸙Wo|~[T/3-OQV'R9NdH䵛6&Nܵ)d љfn~` ͸[ Nr4?60BŒFF?KR7: 4H3Çq3\.}3H34@ G&GsfÑfqp@ : p? gI3ѸB8<0n897Mf p:4sy44Ld mp2gÑfq<xr1 8ifI7i8ifH3@p {# i~p ~i@y>y鸦 u  j+)a'FJ{&PSWWW&IaUrר\rاę&OO%S)+%#[UO5/|T)UNq" ׏qx)S7`hjjڲex{s݄aυ޲:,<>לqlj[ {h~o~sĉ &Mtw<Äೝ %P_WW%Ke2C|I3h!>2*A>p.rgNzk:j09?8bP`RTkWinKHg1eu%[n>ӱUZ5alǕ9Ϲ![y}U<hk?+&VҳwUpuǏwMK\iiP̲)k %SzZ]SE?^{kCƲbZ֗4._{گWi-M17}e[isbO= g駥n~:ԧfڤxo^F "`pLiang+L,g֔JNDvDϵY;]"U{9dӦX^m]J5iuZ[l[zW6Qnb}ꮇv+5}^-\챕99+;xe]Yi6\}ԦvٮM#Шw(1Wo!N3mۤ[q۶1WzČ-5Qi8l$eK Sj"EI3H<Ù& F-/,/UzGJ 'j5RMMMaaUxi8TԔtDͭux{J*&sK/Ԣ(fT2"B<$\PSR"LB9]cNGI6}ژ_ rVnX`jT3Aκ+J:rQG'J )g NkulV6G"_>-A]'ꚻL_t?[rlJ3"._'?@ݺmG/3jvv~5>@}vf7lF1tf0aPp1F J)ԈR#ŘQ_$ܛNm Nnn먰0~Kӟ+h=N䉩uCXcSmGm̍Ztt=:E&d)gEmaX + !JaRpCc^^"h<W[&"M)oT0W^|vQku1V4ɶg&Wheٔ03zc84"̚;=].^ӕ -k1ƛJ,~Jp\KO ib fHH 5(c\Ed✉anT1 C7eW9'4rl,ы "I'锁Mqo?g7Rm+`g޻-x %Rtj۶֪zfxڴ ukzvmlNZÛM4w~ҁݜQ-hޙ~dSb\=󦹳nibƅ3] R,|ݞnTCHN G b 'gA:П,b >8g8;$PŜ94;qǦM;y!)uˌXVeYJQTLIRhC[CE'Z|mO|mrLUChWU^N\.C/^z'˦MҲenMVGb>^~ԤE.om0F[d? In 5dg0"fڡ|7{ѲMաF9 ~%mۤw·碡7ܰ^-}poJUK׮ݦE/nmimRRcmiF 3EyvhqFlke^hJlI$6h]q"Ȣ{Iq?ܖϪ)&I7Ie:;;O<|~抋hٳSgVuկ[~jIC?3\-;ʣz.LI7~ 3Y,R/[(K;u5,˦D} j=;`QIq3( o-K9clذ`m:g>1;g}zٳr${_mbݼ RmmvwH73$fD2㌒Rnt繥DzlJíJD[ği@JO &k'K6m7~ՙ=aʱD gs 맍"N$͹g15!40ظ&LH" p6[ҎjM;7v%4mvkn WԆ׮XQ+ښ5wcӽi6=waXvvvQ~RŒ{j"w>6&, z~O%mѴukSA?$ w`2i=^| *45L5j: ՙym>9Wλ9ww3w,IO^ϼˍBn߲3響ǒ>H]#:55$jkӖ,k+EECOM˧DPV̽gJ *׺fD ɒ|LH6N'W'Et]ڟ$i!_M\-ƍmkk[!HlW ǎ6m{726ybv*}EF={2+GآVEbU5'^_n]GG?{UH3(5 ?zUF%s2Ǚ&`.}3H34@ i4(Y?nǨNOofH3@piav4iN%2;u)]i<\~^1q sڧ_07H3 fH3 rfp@ fiQ 8i8[8ŽÑfi4.QR5MѺ/ 7%ɤ`2ӑfi`2fÑfi`)l`GΖ.rH3 4H3 fH3@ fH3`Jcr\g# i4H3!#2i8wfi`2f\# i4H34~3&x@0C3\$p6Y&# ϽWfSgi`ȲLFJc>8;eDs׍5k~H~T?瞞 lj'x}# ޴i+1"\}3Pr%l0fn喨?w)m3/4)wG"}37nlnn޽{w{{>]>#(liiy>[ MO`zj撦?uէo64\}є)NO3_`ѣG;;?镯|+F;yDKK{][ :`n-fw}e~C>8G%&DaSG/*8[o޿ &z;:2nj9z_:z,]k(JȑwÝ;wj対iD`΁7߼Q{f lE]r ox /-=%elz[(*: [be?'vڵo6רĄHlw;f]ܼgU:@ Co׿uii--%%s̘4WJxhWWWy; .\xÇTin^"Ii`KɹT+Z~Zְa T>{@+6,4oֆ ۿn}+ȽY}͎q3m0f㎨Gxbce'{oEq)/jjb_ w/-}3& Q^~ǏO4*1q%479|СCj̟/ȥ|.\ʅoPk\ ڰQ)΁և`oߨ,Qh_K/X@|1٢dJŮ򀷬lϿXRW9@y8_)j)fq[ž*Ϋ+Vo4+E0 ef?;g`HW/8rYyi3RΥS\Rʕ Ն.ܰ0ܨy֥00 f;JLԙ@()y]}}^?TR zyU\%Wy &LJ[\"Ҍf ۖf=>s7sY0٨JKx騇Qb_4 s啞ܖ7oj:+!lJ*e7NU%3Me^p&+"nj1y)S&?|W ޟ{`P*w[uY%JeyH3ZtiT`o&GܜYhi|`/gzM3bi&ruX>QͲ-~mU+2ʦ\>l꣯,W҂Ho"Rͳ\=8r6 {K~3q3W㵋,ee^W^I:[Uh+|IQ_.uɩS3gΜs΄"htuu]ve--{,֦J_;VVLY^Vy3KD UVz~3i/RlLˢn3ͭ32XۘexLsz(q{&+ȑ#]tQ2qĨ֎?[;CO:fb,2p= &g?ꊚӟԘNMMMO[fnĉ8 䳛f:Ϝyg?3J?ߞ1cFd~'Ȝi`Q.袯^gw"d'@qGN4`˾Ev#0ͬ}qk"u &9us*n+jJZbىKj68~B*ӒB [7a >/Q>U:{-hg1FA+N>}3dE0_겦Lo}s'ǎ+KjjjJJfƌ# EF'}c۶osH}%f#Jf(/[_a\SbHؕ[_~’]zia͜0vH^AE}3:ZZ:bB<øJ]ӧO"8qBDhCq>z~~t-ˢbVg,4S_QR[y/--i{!7WD4S^),b irWQZY*"lSdEco"0S Iۿ8"(U>xȑz+U&Mzzwz0'(.ң,S3cB1K$LQ-cN480Croi^|`7} CsQhcKb=,kL JGM8)KFzIP2^}O{)0WDћ`=-bۉ⾇M'lJ ))71JcNc۴;jsbߙF̘>4x: 6/jb_^J %*VRRRƏѱcN0AeAXmV^\ |whoomn\|wu5>fķ DCeaMLLQlxŧk P,^SK?uoHT,TYYs_ڮe[MCSߋWGi_9d 6{4c }ږF )s"oئ\6%)Ϡ H]}}^!*[]#jzs]5=5 #=:(o7vk+sMWúvFLSVe 9?#OggCiW?;Tja)o2MC8ȖV&sqG[[˙3z9b gR?HO;#UhY1Mпu<7W+3o]T5.5?-+mj8u2zcs@k7Nz^j/T/Sr::̶oo׶^=^igmeÛ5?Jcy9W}?1!z,^joB "h񥫫KdsV'\TnQ7vt]y b.i~=͜jN3#qŜ0oڐ-(wȇ'mHl5e>ؽ|fgJz3{k|V:w$@QT,?*QhpihtOW3^mÛVՈzH4Ho7|߷nv%g|Iy%}Q(f &җ&W$2f̘qꍉ0hĿT猌Y{s{?cXjvfۺ;[p_t^g{{=bVט1Oky -=]oZ_?;uJLJW%= wt^7WW/DQϕgJ*Ȣ1f̢%c') Rm7b\o,47񗤜y"vFFv 뚪Ϭkzo=^=-=uTSzalضkTXKY~eg`мvO_< 9;"Ç'2g01s'vRKGD> zK΍9Tu9߿&LmO>_TF!&E_zj&껫֛DWo:×L7>*J/{-W^|Y|.}SίG[jw@ߴx|;3(iFq)pT0 ,.Y:GmenD\7bV*ٴFѯeلVUyڝU߾FpC(LJ;I-fzEz۬&׶>d[$:j5F܅V[x'?-R^e>X|4Dj,Yж mz4iK}ݥvZ_Q.Oϟ8i¹y"6Zsϙ4|Q-DŽt嗧^Ͼ O^hf2{g:cuxQZx9O̟?;eʫW_M颚}j۞aϧ 7oLoEoFwM=Og|MaR'1zvVIM% y ΂#GL:5+|;vҤsBzd1ߟommm]o}a\G(qQJm+Z,ٳӟ}`ÎTʕ_cX\'j37{7g̘aL 4ֵike*KN'Wi%H$v>u#^ W^7vܘ1bG}k/E+"pbrHTy*ClPv $uh6d8氮qff'6O[Bt;5:U"5Ĵ̎;?Ri޽"AN30q}flٲJlAAn#?#]8[-  m02B S-  $eԬ?'e% ΒAAvBOF06*AAnk)#AA䶒2L13V*M,2%RD"fEAfQVZ^^jo<"=|& }_|z%3ݺYt܋_q)f)j$"8Q5o;TQv_<+*TՎDAvIFEYlNnm oLd)9g'ɺY:|jMk|o&0d+SQVܼX))V7Hu,qh[hp?OJAi:u 2 kl{dQYR|OU\^RlJ̕H'baYTbԺv'O]60FRMAA(Os=(ke`,~ VUjJQ $G觫{6KXn/D4RuO*^ԳR>>BvUWwnǴ_må|vR Zn۠ HsLCo}˴_6}{N:hH,8J*^xq%޼4zTD11)M3*EI',+#.QUEV{[n{tI]WLR I?P 4M K9?;5ܙ/5|Km67qTAi[볭Df:f}nΌgƳ<(*RP-~Eg<)+L I. <2Rћ)﫮 ǪNYf&r…i0m ) RۦAlA:aZ'hfRG 7DFt/ ~g>t.a+T JD2:RFbsi;K9%+˲O^NM9Dž?o89v_-W}g}ѹ{~c1srwgE^Ӡ%VB9;c7 #NXRG s/X#*Z&0#<B˘*aōj" ,))ftkϘ7$GdF79KJne(..M{]Pht/'Q@Qƙsg*BJv|ܷz\8u( w0RM`b[FfXnws{UQ]M :vB8g0ϙ/|(2H㑊L\R0FLܠQ&Iy %{)q' 2L[$&9¥8#vq9C3 E2R ];>'ЄWr@Dd{ $qm:glgLע] XM͘|W-aN!g<k)h]]` #M(HXKN {!ʏBxL: <䤵Ʋ5"eL7pZnG7B7wXhZywO^|?|a YNbqǍsT2 #s f(k >ܹ!$ndhXhע:oS}]'Ѳ5TX& b%6&/fv7#Ģ}[sO,wa$'P$gJ2gT8$;}jsм@MYHfTB &~YV QZytSlbdr%$RhT7܎C [dC\v6 C ܙOEn :lШ`r72}z4<93:['-)wQSg2-N4WSހ?|z׃BȉHӊ4|-9]E)'=ʹo|2觗h k_O.DA#e#n;zzSVS;MF/Aptsu_n۟T7̅VĀyIgӌJQ {رmǯwjeʘ!C$R)}_{] Qsg/w sUVufXw6WAU~ِ'UZlkmtܐgw[MӰ1=ŝM[#Z/|gR 1TŐBP\ض3V'-| ~'" 6 (cg'Y)~LkgȜ2.jǍXZ*K*WOπMʘu0eǯ' p$n$M`E=U72 |rXPW뚽|, p딖瘩tZ.X6% 08u O&Ai{JN9\[[k]6Y\9sr{ɕ%gk]z6uƓ5Rfx2! r \TcseAAlUS  bȎ?nt}wa! b#9F`K@L+[ AA[I)SPc! b ȤLRRAA@b[&JL 4[իLl#۴+ N~a7N:pb~ lZ,/N.d|Fd6k˳V[#6_kgۓ[nY?\4vhj3~ҴlPM C2sd̋XvVftT*j8ȑ2ۧaA |Li+--o֦bޔV b[#߱0kǏB ]"#2ӎ $/eC .-%$kfv䧡OvBαvjXA;+#1镑ދ1mJsu7~0%'[f6g4؜:[f K}^J,̮>40 zVBCĻ_[#r-; o7rfs-`ф-\e$ccwnFG귪aK;FT!d-<+HNAD'N\p4[0ɅpwB$Kv lye1;KJW/Vgք\H\@G(qyߍ!1s Փ[n5\/t*[٬oKK;UmrC;-*v!f jY5F'۵[hDDdC ;L5y̸.ͻMkЪ-i9RcO޽s uH+j-$2ڲ3Ps6}zߠq\pp!-xOuxN6=Vqk4s%0L 撛\&/.jNz)9|.$jќw1LqM8fXmd̜pS]{Aw<7w3ay!vd8,lzN/Ydl'&>M[|4ǎ2 "W2\C#bC(^Kc葂C<”ݫȤ$cVǶ—8uo e0~M6鏅m?c-z0> GưT-Πƍh,deAXfĢBewn̜(5$+?0㍕3rѶEy YHˏ&1wGf=r\2[;FTԔԼ)s>¬z??G0}97+f 2`0&jh&,3F]sɅWK/GcjƲs.4%"}SMpLdTV^6b"9;wZZHюy?b3ea|kq"KKKGe)2yާ$2R{4wY.4S= #5v= SpO.l3-*A 3 .X+lW!wJ͞0z@' Y3YxW"_:KSW53[}m٬ 雝CIb7-',3DЬɄ)+&Es?01}x.-n (U\:fa$ q;-@lDѡ5\ x,joX{dhZ{WkU"Q㧒O6Sg!RF̜熧- X1})6,&ýl^޿^1 V7^r ;o7 b嫫`BĔd9 lP i  ֿSdZ06  !eLoh/AAIAAF7Oʌ[ AA1Hrl5AAlћb  bc+it7gl>AAlI/\zȑ#X 'J^.]c A;YS 0[ AA  rKSep  Q"m8uTUUegg+H/// ,V J|cDDD"Cnunݺ hs߿ֲՀgmK. N~'nݺjTTT A3:\΂ȠR.RĉFB7n܀9\b ΐ˙3gzG KKK[IqnR/ͭGNFeٳg\X5ˍ ;.p-y`+Hc@=rAv1")cyt \(['\Oa_3sqq/ [^!P-`.堍:kkke2ŋ-2ǎuFLݹwP{Y 1}ڊR*Ʃ{̒FOR+ dwf~ y0\ġÃrn-)طyfttEopi|Q!R#lׯ5/fTEYX~hh1 8@6&= A@<4u 0(֭[AxHh.um0H $,ܹSONYϝ;M50  8"mv=v >~KOz /16sef.5K5v%1pÇ&>x H ZAtuñ;p]w &`p"Qᤍ݉ZAژ֚+CbtũÃYnʎ8@jXhܗ1^zw,"X5vuvkq*++غtL&"viɁh)**C}ڵ+daO,, +vYEc 8ӧ[lS2DtذaK+IYWYX7ť4NO D/i|seG?pppl^^^`` ݂k$:,@ǜp 2۷}gGiYc%Bd caq:GP t yӡP6pXGpp0D@Ig]wG:˽{=t\5ƕpdd.@P-pIh.Peeeرc! sS.ed^+U;YZڣ^>  ELse<$2Cǖ\7-;tNNNнA%55pU&Zwy5RyJp? DߖF-,`Daa!4} %+W vNh])}4 @;@9!pޑV1 2{AVPt ZnYh^a~7(Ν;Ah׺R+eΎ7*6jUlA)ӄ6w ܲӇB*tupA2eg+@E^vcOu^zAק5*Nff&䘗g\[t SRRB^ϕ{w&M]/^s pQ(R:IjV9Av3o01b#LM Dqqq?eM=TԀԀbVo;_1t@Coʃ:b2o.ư,7.2www 6"` Ǘ,Siz^t8YΞ= 981qehPhCYbY'Nf/YW^s wY(TIO_YyeA62JaWƤߦse@GZwAQ HKJhW; _ F_3_hCo -``tNf   }57k׮ݸq#((e:hM8@$i u3 Juyhݻ [>?Ά())C[2?Ɣ8zZRhNлOX8~SC'ܫ.!!Bs !rĈ{/m0:x`qoA J u _ӆ.@(88: Y g}e3p2ĊoV䀎)A@ ABA2 ~NZR.URpv򅉝 Ҕ>W^U?fZ@|֭JI]ݡKiERS%S~-el}64>yd7t]tp(Kt ǕuV:]`*%'ٳg+**@pY񐐐L0B{ eoK? ȒxIO݊ vQɡ[.W&AĆ̼ҡ42#Gܶm 6̺:۷ryk '~;>k L;6+7|3}t8Vy@ZZ<8*h kHMM50 !na8{zePSQ b[^.ZYߑID16 taޮL33AAvǨ\i| ͇  }G+  J+?o0bl(A:1`BAi+%#HAAۖ2f+ZAA[3&ᖣGb! b+jSA^7:$AAIoEAiwʕöC,xy-//G^zee>#$,ϫ-^A+>75jD ;Ujal_BA  r{R2 غi7AA_3R  6.ezeP  bR  rKp    r{O0! r;KbFʠ[AA2-$  MHc2ZAZ7;_XR1eJEFO=R^r<|-pO>:qn.g+r:V3EG C @ت[F*uޣ{'<~rVEMpϰΎT]{ӑ(ei)+K0Drl1))syj?-L_[#QWgwAC` NAi1QO'wŧm' 6e$& 5{͏e['NN~}B$lfvo d δ_H!H+1q{%%%J%9qi1o*t?ȿTY RF+WnX0ڥEuHX- D`,17n\/,VSUٷw/X EEŅW 2uu/C0gi Дd!!2&x?}qB%R#H+4*-W@СC&Ͼ{ģWn biZ22ؔ2u'ˀ;hxa8VSpb"_<@Hv_ziI#Gsvڟ%%% CH/\ cpw.{E)]1Շq;n8{WЮn2Y`T2!r$&'ћ4y ;.ur. $ 4QJ TI%}AJ]VVe|9yԸ1BCCr AX ׫W>B2'GR1) Hu,N;s:Ac^,ZZ8oߪpW4{Mxwݍ5Ê HyeLM2f^!, $>9IOMqIkS@pcW`Jr*af,H[Q$IAlJY___ZZRVVX\֊!~+χ_re!ގ@|EȶGtyL˙Ȧ]\ۧ#$<ӈX.Ij&, bFڇ 2"}VJ8$c׭ V& "{oΗP&p-LX׺nLFvka¦w#6_s!9xV;Bf98Hu"N^3KO^ܪ_yɉ|a.RƋ EgwgxNQSW֜pPlϟNMΩ+{F堬zqG1+")cx{V(2~^F ;qLWV׹<ƒ `R PʀQ|2t bWSSSUUwfTj:iϡ=J5Qtv R(Du5v+$R&{B!2kYCoEؔ)ͱclƾA{ex) K!#U,ۻoP@@XPPTpph>X2>FEI/%-4' 14h9Yx6I ,A{eV0?AH..) 4tFfg{/|_<4zΎ?* +2NաKx VWe;|ٳ5Vw}4d4Z YC vϕWj[f^uL8TX#-/ȏ ֱ.!k3ti>>B@dzg-s@gʰVd.3|Se3Hof2y2ٲ%Sp4WA2atC{ 󞃼amzh9-f?p[GǾx#4.W?o(ތ'hS>4e/͛1?miVp[ř{GR3+ka6kս 5nVSY/:L5Df/ٙMUp֖vK+?As` /O۷uga}_,u @#eX+J̭[ɂ?}vCXk$dFX`uCϿ?*kLAlJAl Y5$U۲q>rk  \_X>fIJstkt,Byl|+Y><#&j#pd1 FL|dWաdYCaLeW;E s+UB[,?+[6 r>ZS BWl5;Vi`@mO"i3_ó|Y}1E͒Ȉp輖\cGq9juxW҈Ȉl-50w2S>v;9| H2 P$Xz4&R qL!j\ݽ mBڏ&ᐨzu}Ƭ WC^}$b.I=ɠ]^)DžWsHe'{>9X^Ul4LFֶ>)hÇ+{wrW |\|' hƠLDxDg;s'r/mؒj]crWOxm0S2;w掏\EW Z#ܱRF]gT c& 'XRT7v?*!?~BHo{?E|܅a K-¯>zq~yAC:/' y͏Fv&\~yllp=}4YB5ճգi3v+2ΛӘ9\=q Ywg7%*<"<;h6Pc><+X.,q~`1Il$=2Cݤ^2YI*3&~b}k.[H&/p{6ntof5 O#,I5kw_ڒQO,֭h ugoӰ!b֭sM[3&$ԺJfhm1c^ZLѿ+ueZJH̤i.{7o챎,7!E}%g,o4Ͽ%~3iJwq?FRFiE fۜo͛yšA"-mξzt"[ >w,AJnF#SXZQ[Z777BY| D_n'}ʇ_sڂiumDJ$I{vNCƅVVN~̃؅ҹF';7x[+ Q 0ʪ[%;Tz޸ ]=ڵ7xkT콷&hi42 T"J$RXi/ 7PU(T ` VʍZpԐV:5Q-Z<P{/#Mx[v曯/~NA62 R(EG:0GX bAԎsZ6cj;8U(*A#cKd2F*B*4:ݼ2Df e,fԭ\T,R(F ,;re!h/g[(԰ `s3o;Qu=Fٕ^tc\2FP/z"ѤLWݻ83zO3NZkLT8~F $ S JdN0$ \ݤvbZi((7 se {8öIf*7w4&Ԭ ҃Rp;0oRr ]1_):ὍW/_駟 ;;; A[PRAKsq#NT҄ XǎG$`Ӆ<9L95QE,3A*c<*A9 !TӔG4( `kݏGxm>3s8 6$e`n 'TPɢZ(Je ۧet3*BGEo)߹S74`{AiO)ӨY3O/jU\\YYѹsgWWWgg7n@Z1/VP2C1F7"}cyC5 ɠA ):n4 "Ų~#"NNNnnnEEE Yҭ[72᐀dڅb1:z*:oo&*h jA=LSWOPaO8:9RKUUUpp0蕒ooo+nIeYXX NsiZ/NA֦%7kr=}\M]]Xy3$XmD>6> H;H[_=#Hdqpppԩ?:"$Z  92p@{{{s#!9'نI͔ i''vx5/Qfˈ bu$u̕ oVi\At5((~A8;xxx&ggg(UUUun__.9MEz',,,00&rNILHuqVIHi ahuL7it:} TN{___W778!7l*߹/gA62~c@|9ҩS'OOOg?::ܹsjM޺+g/ſY`~3f4"An\, u#h 4Y8VSnNͭ׮ͺenUh3atK%2+rA܀vSZZZWWspz_ȚݻUَjAML͑#4@Ǖz 7t PB]˻y]>8AC̅#ꌝ{Ar<%QGt$&'Q7Mn0_ZϞTWANx͚%'NT4d b)4,{9K4V9 q>_ !CM«TXիWFFիWA͐rg_Buq -q~t 7%}}.'.ČF=,zeS֣S PգG8<$*m ialP3~=4wwQU% 6yzzѣp 'yyyC5cHZw.-9A'.))I`y9!7'mH/_lV$S;YyCStx2׭KD  zw|_{ ~h FiS)]{7f/f j4M{!HP[[[PP`NP&5N6-tEidő8MNkAnPD&%gv<բ`ctS^)G>}||@л9887AiS)C׮;ORYYyQ4f!ֹ+US#|́Aǘc.kQ;jfS׽{i~==A@~O~} H;HvvidsضMmcvN99]\ f?bbOn¥E7aa}v5 WG_}AM BX*BᇫNTcyM#&G/FI"mZH-f(%3;{idh@@pp0 ]]]O |p H[K' bJ_.GjxN7㯿˦ 3Z|z9Z /,1!Jn4b"&i #qJKxAE)cT3O[o߾^zV݄[faÆuIT* : ݭ)ɤk}MߩS[(t+j%K6@C<=Gi A ^{ yw16.f}Ekh Dz=#jA}upptp`g شk:F1{5ByϯɓFݵkWf4+ӓAoR/D_]Xɧ/y*7йG揾59DW_ TSKz[bJŔX>&<רEXO"ܮRƔ@jjj^*\\\x" N]d2/ 蛇]:8Xf/yϤ<Wsv{Av|4?55穟K:]_4Fyɿ=:}ǣ;tzя8g;/ aS(敊)"[-‡ U rH ')))z{|0::ZjruHXw//:/vFNQɇ%ot|_?Uo}>G7>NR(ɓA|'p퇪Ƿo[ʒ?~۶m)!Oę`4:f/.Pŝ~zqwߩP3?;'~#ydh.4_KL$y>"΅ɶF--QQbJ"Q*Ċ,*Mt  w!H7orI2.qo:F,ȝ{/͠ b_tJY/?N J\e2֧s/= {Wn+]s/C+|=^gFU=2s∕o%o ?͙x'q:ioOM'W?01!l;&:_DJI|땅ߣII4k ; $"SR?AR72 j^6Qmt1ZIb漺%kᇣ [䡗[?ӹa5 Ig{>֓SDU>s2"Z./Z|V4E)'*A=|CKuLRR$F/DʙD=8pZrBD2CY =1y1&wv\xOO7Np${8#~/}LJX9oUuA Ԕ~]}N ̝,e :V i vvv<ӧ5  9v؅ G JKK+**@8;;_twuu ߿?AAlNʀv6lښ7R;WWNǸ:99:  (eSNUUU%%2=///kxAI+={[hhh``o@@o.AaAAQܧ Ǝњ3}qBt[6J%DA&e;55U"ᅲI$L&sppJׯHLiJlyM3喒0lZN԰VQ  (e,%88{=r䈣#4..·m2dHPPב6Ś/05V0-YB"d%AA)c1#F믿x)ﯿn=zthhhSM HNOONַ颤|Jރ8w4C@ːqr0tͥ_gߴHOF[.!&!9]mByIZui\ML׌)AA)#"""bԨQ]TTTs S.<So#-i(qxSfP표.7wH\Rgs$'M sY dvF*) q4nDNe4@T<-H<% ?yRç32:.&c C]8hA$t%BF&IHNy<4%ІE.Bܹ:}} 7jBiZa[?]B[:NpC޴o L! ȝ)eZBCO1L ZOLs'}Qެ[RSiБ1Y6  (e _OYni@I_eE:? Icٙ+Z4\..DD/(D͠#3L8q2*ڌBAۉ6=:8IIqL 0p$g&>9--INKNH`4Ѭ6d'_TM,_ru |qݺqCD3D T 4əHs"lՌBAdYv7 ˲7{[Zo-z֕+WFGߝvp,OK<]+A ...R`R^^.UQA䝿6 FhXt{+zeT*Ueeeuu5H:777r lrrrUL{h]BAńZ"2 hRSSwUjL >٘)ARzv !]k\kW'gd ֜+Ża}yn]jJŪժJʤ2;{'{'g#qQxF<*;B?2F2XB{Ε(*HPT VQ^^'H8o; u r;yeJ>v@iZqJڴzoEET*R{û[T3m`;  Z^/KnN/NNl͔Q@  Ok?H$2)0RN"~;ݭOMkQMz-iF"Mٴ,e`A!QHi54- dÙEjEr_NnKIb )@'4֦"ץ@+eu JQdUfʔЌ|6i;+ 1 g#%m>`R8/eVl:6ulVW_@}Ⱥ>")PJfCAF!$Of6}haw(]e/cZd`9CI\jRZ[5٫Cxaej-N\A)e;'~oc| ׈{[J99 E!_Q+! B'=\GZ4aގr)]R%[tB3(c>k!Zq9;l`*r4ˋë"AQk{9Q\9jKyMu zeAd){6hW[`y@Z^4!>Bj!\jwT@E1:CP[vƪ#}\"bQ$F< +Ք4j3ۋ#RAA)Ӭ[>X$&4c4ZI ݜ2=A h[RsS}-i7x)FtޢWAM6 #[3=^~#,L%{>{%ONM̺KHviW աqt"k\] zA(/ځ ōi  H;F^Fb 'FnMɋK( 7_R!p G9. {FېkivԲv"t̢֨Gg^ GzeAڑegfOgl~r=`2~ AKho0zH*j:%JDX+̞wb-6[`T?giP̱csrr$Ic=GAv5XZU{s(>XS2GWԞI nW%C#~WA&r'LF&A,MZ3Qի[UUVx 777''';;;Amh&LZI0Ht pڣ?AHww]z{{+J2Ht 1 r{K1T4c;/2?{]WY $MҴ@_@gb)GE(:kRdqyT$#;Y\:H[E]R];(Ԡ,P%ܦ 9k`+##;w3ϛwIr }kyBeQN s@9}=w12 WO~J 6Q&]'_ 7Z/X_5_~kW{xk玻CϹQg8:{e溻c=]m}?jznf(/֝*;ڻZu[˜]53kbJR002=bٳ==^Wy׌Y[%׬Yonڄi{$J5wͩ*44z(}su!U5+`xZq02S=Xtdu]R[ wsļ>ccNgL|kҺBi]|IC;.{nOswȣ\pT/|fµKf?!2K2V__s몮5}}(9Htx?i^곢&+yNX]Kdp?.|5;hFB%T76zIKc$cibx뛲+U-ie/Ws#XgJlɬ[&{Rfd mN861ǿt$KҒg+{v7Z߫Fvw]o򟞩iHԔ zȌ2=W=7͑uHҁ.c|#500̫נ7﷍(0bgASS^>L7Q&1(SVf8ceRM2 (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(0 ⺾n (s[MZ8 0 ( ( 2( 2( 2 2 (2 (2 ( ( 2(pԔSood-_X8#8 zW?_֯_?=yc$ stii_R>W_Ṃ DI+G?ќ /oڴ{ɓ'hEֆ ebk2Kvwܹ۟yWPrҸq#V^=}{.0ԄE*8b >]tE9%]]]sC]7=m~;vxg/|!Q&l( B'e_ח\rI+*/+;,m۶jk{ uuŞ{ /0Q~ڵsPG$޸KO=n!sI'uuvVϿk'NWLޫV/)Xx{e8ѱy_7lx{ŅPu  qkc;Z2_9%mec+*N3& 6ٚ˿^'`Nٴ0D\x'Ӌ $!>wW\SrԨ/?gO<9w Eew=so]:{~]vw_lǫ͸؟&ŗ^vӗO{Ϻ=cy[nٺuUofLri7nذ;ބjwygV,bյkbZ'ʔiʕ9%ß7/ϊr)sl];jY(9w~ƌ?n#םZˣ~͛7/uƧׯO<[I%7=Jʣ7/in|gψ$'K>t"sf̈Jnztes^ٱcǤIuvv&8}{gղ7 BNJ3[n[=K=,#^eQh~~kH-$(ZCV0TVV6oYrmݖY.J|_n;v819Ǎ5*v\z3KFU*cX>>-?Ww`>0.)pB+ ׬ϤGcNQ7̢d(&j<"_g1`zeH_S2W_tѿjKӱXK/\Z}9w~+x雟K%%Wpnzs)?$3Lw&WX"NxJci48Q桇Znݍ7ޘ 9+qIo^:/rCy[Һۗ^T]KC?_(ƌ;yINH$_**Fxbx LPjhe͚ښښ RFGk]0FWϏc`~_by)+/GsPƜ4XTrۯʩ^cգFر3`Q,DMnY33j>E3ndfɢx+S{?ۋcϞ=)/+ 9(a„ 9%;vk׮ٳgݻǕU(s9߿){gsc&ɐ:r2]{.^`j;7ޘ:ujf;wڰaC+钙3g>쳉gYfSLzrs p8@,9SI5nܸ/qo΢QF .0 }Qfر Qwݫae>Fj0£v緿HjڰyvDA0;`:y0R _ 2 2 (aӦMe mG[*LϚ3y*nj9[[om޼ғO>yʔ):#Dy?OrJGW׿>hWgn8[rٳJJJruuuLV{m-ooڴk0;; {ݽ{mBymm-[6lpG0Wc_^{~r٧/on_y۷?]]]G4ii&zzz4Ǐ={O?8Eʴ.3!i! ~s'Lhh.ý3g,|fwPϝU>b[uV^C,l+޳są0 &'4 /?|E!54e***Bae(imܑ<|i1ܪ֥ٕ XUڜzUҺ9w%&a! :jo0f{Mgw駟>zlH-avΝ!DŽ4f5wټyW|i]ڰju~ccHk2Bsss]]{Z! 5-_՘.] Eίw. ֤$t{շN6u-G(nRׁ`ƍ[lٴiӋ/=*,toC !q/ʴK|/WAT6d,|za3^DIby~TI^+G1#I ־Z*DbN]ݗC[ɫ|ڿ)tɵ'JIih^Sb$]篳PCrI]҃2L>YqbO^Fz?3FXWBÙk5!%Yg֯}anOEITJKK;wyrܸq!ʔL˼"VV57^W ?<`J@՜&>ڐpOWkf8- Oo[Ou񞠨=Bn@ސWs njSRֆ\f3z]F5!D돆R@V7ޅ3.hξ,MgX#XϪtQOoSاHYꕓY.zkLNf˵V%+ľ^&/,F KS4}MV8؇Xކu_]FKGfdovTiTkyy7ӟ#L٣=]]׺#Lw ϐfL@` TY1"G&.Jhaяߞ chW~V&ϐW}hllM_3` [~]ҝk-6.$nh̥xVUT Ҝ3k{ ދsܝϬI4fפ^DKat6{_N5>r]lFFW* ?m??D?u=!TTT۷|L{RB ?~iƼ(й(o=-n?^;^KCFJm#֞)xsC?v|p~"65~LXN^IL,ID+){{t]HSܚu#r-;$E'ZcEWNld?MzX≉YUp[jk1r'vM,PكI*81;_7egYgM `س~9vzHg9]z|SV>謁 K?_~O7n\X駟O;68S7?"u͹]$lpy{yW~_УL3>'%HFAl+zz,)4TICO=ݝ_nytRg=M rE!9=.B2R[2k,HDz3MveB^? kSƾXMjmHmN↚jngFAq>ohgx"OeN}NU%Q| :}9&cX@jScUmPyk Ɲo_4|YCe߾'?iPȐPLw6~3o޼X|t)ӻd=Sel̘1^xaJA7/ne4KH~V83/uE+2މWcަMN9g;FUVVNtڵ|oN 55gm۶_x}dtr&]bߥ[( UV~s}#߀_pz}npz`aNLU&mMH/%䒴YEu0,mm,:DDG)4A1%4?x֭{O>TEd1aѶmnkkhPs=X7!z{?8} ,G=}a[RWWWS {Cj lEtְA968pt+䮧9e 1LzB̡Gie#ӧ|WaܸqcA}+//?zøa 7or'p~+#p E9dw9\R;pԥ?o[.V'À^`Jݓ/+h`ȉ+-++*QeDQ8VD`F pDmꏝGIENDB`robojournal-0.4.2/doc/img/screens/toolbar_with_labels.png0000775000175000017500000001362712142060704022273 0ustar willwillPNG  IHDR%g1psgAMA7tEXtSoftwareAdobe ImageReadyqe<)IDATx] tUzY%Y~[v$I:8%8p3 + iťhwavה]Z[wqd9$@hvۆ qvĖ%zF3W޲#%Ǚ\ݹsG7fbR@ s¹ l@ sE{ SZ(@ !@](恍@ b.2xWW @ <#;w2UU'1MfIߘ$(|&4E`;"btt@ P[΂)"JXyE8wD=)|Q@P(Q^yŝ @eP?x)9S!A*. @ etgXB#}I Ʃ G!~eHES=gOүGt>T\.W___Nt:V]ByBS>[maZ&xE ".^2 IN-[&Jq)37DNW04zZe< 4~8|oℐgRP>fOiܽ[\r \?ZPPRN^9gX]lui z}M"] ʩ]1ǡS{v^vhoooUUU]]cX;yz &?LwCCC˗/G=6wkĉ2FQ844&)O?-ˋ$] lAfBkH;J/̎>4== Dn@͛C%:2)M<&9=Rc[_à$N4*,N0$O^ݾln!齣. `0h/ZHHV(gϞՆhlll![􁁁UV!Yi˺O^R[UH2DrcđJ nC"$%+b"jgT {= 센HN,XPSS 3yl6Sg{{)?eHH'mNO.,rfB.Y"}$QchKx=?9|;Дlj56lNyzrϚ2ۗ ?:+ 6:Ty=M1颒7#1̝x T%c]CC%PtPm]+ ʂU/=~ȐuC|l1MtEI)1W VX]gLNSyw=|1g}w.;;>GLB%KsI~? ~5[lh&d=@TLju艛Dh.ͥiiWZ)pOhk~3q5I\fmZE7PxvQYmDf~Z7tqtjgZ%MT8H0[EP o: 5lIY:Mk7--h#_*/6bH]P.X7KA W%Dkf|c6T%ݣOڴXiSvn6ivք΂l0$@l 0AyxfkrrR.Ŕ^8Gg0tk+'E CI$T*$dq'NHJV+a)dLXL <˒p1 Vw5EO<԰o?<?k;(PK TWB(:d̹7W6 3ɐi~A*ħ>T@3S| $NMMڵkASXZ@tBq9T(HLI$*K@AgLdtl6mކ ªB/(\wᮟ|ɟtpu~b5`rPG'T[LBC?r'^BG q) `x*9F2L3zxH[qs%jۤ1>ty0E+n p[u3h%yislP|>]~8DcB"h#b'(3io׵9i:g` YxS@*9qde ʦp/GݴiS LҥID2. t&w:K)H,- qzfXPS8~z8VKۛC! dM[J|S:擴.kf^HY! X5|uD,Y0`j4C9TˉSay JYY0#===uuusy):SsnV9&*ٙϞ0O=S.BRT^Ú:M7k~kAMIٗ-A98eD'+dY0,$P@ӒY'jōi 7{C^6d5eRͫKm y}YuGommvId_ᔻ Ԅ蚱1KJJN'"$=jNN.Q#OQrA5=$dE*E 7GNݠB147#33+-.*X6pZph\x8vll=qUcάJk`ȴ6Ghΐ4uf%ѫq%"k:N̖1&=>P6>L\|;[`U59he>~Ҋ%|OZ('+:zUhh+\[Xl2+ U o1<6mڽ.x'~cSkngs΢ UV9@EK}șO066VZZzmQ|*IL"iuIVݩx ˌ]r(%%%WW_X'/sM= dLfΣWDF6dH,-PBJ, 9=ԖKaR6rjP1n<2H\ e0*C~ UIKShA?ںuh}6nGH7,:Tw' ДQ3&t:=y:`Ν`3YVWЮ^,;|n yp3"3-̑(־0{z඘=~nIa:іyneeJڶmI9pB;u3o 4Mq!G)ϵt{G/ZNqxU߇D;3kIĵcnW] yVF ~PϼݣHIIIss 98!He h P+6Uϟb4\sD4c:; /1AQG$l#PW'f* }!PjA*].8M[b|*Y? 'oݺu~AM[v߻bQP]UTfSNHH 7 'N+MvfKt T΃Oͅ>J@ F`bVb Y*"& G;TT|:8P;z)O囫?O^(CL=j+k6l *`k$b>`@dT\\Z/ ]c߾?:bh;sL]:򗮦Ro{3澣|Q]I^>?ߺ?'=7Ow_Uwm|u{j2mW2pzᡓ4˃'0Lrz{s u:j =aV&isA _ &9cUMj78QNohh%-{8s9.oӔ-9w߼oU5;g6Y6y=ؐBK\~=ެsj>|&ay~ߗ/*6Q'xH98`Г*GX}jÃz'Ld|`̱ G! i B S;uS'SY2oG.͚cߝHk?p8`Yɢ%WsYѳms558?Xf$CU*lcUW6ڑ&~﫛y{ d/2{U#]gSgNx/dC]8Nk ?ͱBNs!{NF6?:쐡 ?diC@>S%ǟqBkU]][@_\+_gM#3Kϗ^2/w<)ZA7srBn4ދE6+ ~^:qg+g@ yE_ =~# ]wR9-W% kџ1 zQn7f1oΕ_ 'BAffMx0Yobdrp񛸨YXM*?A_ o'q Y2Ѥ'd۾?̲8{IN4ł9XXaK_%6G__^ FVJ=`2+!U~40tF_?٬T^r)S2' &X=TCf(c;'z.,ݎ37U(sYM{yYavK_@۽(&)~Rs@;w*wUGQ/ rStK㚻7\5cs`?;Iu1B蜹 'N\>>iim: xpm|0c***vM=p W~8O>sݸqc[=.vZtEP/Q_Q!] h` K2a}QlL [15͸ڌ3l7~yaa+TK6L~{_hKp>/a> aY|>c 6aњu65Z0/-!hllt}Uu:WЦ,峻3]N9Q^H4[歝z@U]eeՇE%Fg|(Ӻ!S-^kM(<]([Lnɔ Q6U p,~Ï^X nY%YS-1VQ_0cPJXܯWiT*k2j2hXyYNtsLZ!chԘ033?Xd%ђjӔpŖ/IlM9s恄y|Jh cvQC$7jsuL *JMffYEe|<4>^)LS-B| R' ? MOkSwI,͘=;FT(EuiUn+[Zv|ܔo,tC@_o7jaND<=M ).㤓Z*4X #>j7/zFq#G.]D8O~_8cv.,,lƚi 7ma0ڊ͛7#"".]pLdd$XKV! JMMUT ܾ}z-g_EEEi\q|OOt=,Xu͛7|=$V YhQ[H_:bcc%W\-!A[RG 6wB6dP(hG0c:ԬV=zݻw$""vI( м:C_'N燽j%EFF﫯rBa{5{D#^;m IUH8p ʻpO\C3 Nv;z 63|ӫ#[ Gƍ,iŗw՗|:dȐ9rB3||ϝ;WQQa{kdrN0)J <μ6” Ә^ REc㤘U4+k p?.mwjuYYVp~[Ř.TA}uuufhO]^r!L./ۓ5άy=!L~E pk07GM=͚^Ðd0_l|i6bĈBAQPyxr?:N_{%RM1IÇHMM劆?&ӯK* _:u"VVTĝ;Blesoj;>>㬽d,b+O u AAA#GoS/(LOz@)ϕSynʔ)ir= 2z듮 7I69AAкm'QU]mi'w>loڻwѣG8qpRXsI .Ւ[ beΜ>̇{pNKϬp_+utᱱJSqwomm-z1~~W:jyqnucǞ:u.#y;!/qK6}n!᤮^S^3k8agb[ gZ\"Js$F:MP/Q_:w 7nѣG)#E^qqqɋ7+XmX 4n_Jjs‰=vt>? vB^xэ~tO>3c`Qnz-RX>Y" @-ؾ@kQĥ):;!¦; :IbUxU{l.%2EqmW\)~:EP]SM%X(X(iMLHf):8vOtzYwb??_BY|||]?%ծnL6nZ7)=8MᩱFs3lZd"Vɨ+rSŸfI!@<8q/v*n9}hrb=⼉DyQ}OOOooo///Y"m566644ӄh1򲰞^:^d-hK^1Ib"9i"//qf/QaNYIGL| hc:@ǹW夶WLXb񱐗3k=rN=:IVWWWo֜ 2Kdc.{²aZd"b6=3'ǿD1g5ffOgLdԟ90iXIe311 ]/m֣ z#,:4Ŝ9/wіV>Ra Z j9D DM!=v5I[*___???Җ:2`Y:@c"sV (E%,zWxpi@Ӳܐ JFX-EY vu3agbab5.~H^[nH1-۷oСC*wo=QGQ8VUUu]z:c ( td}/kyISEpԨQȼ׼z,::) XX8F" d%M ̚%KF/ B^H[,dćDTB{O0={vذaPX.cmPPcd;w|BQ?4S[={ yG(ڢiZӉ#\HRv1EDDΜ93|p(ɈLu ur޽IacA g!)~+( tMILf./9~޶L^HsHHHH4陿4E^d+wx[K>@_~-yǮ+jLm~Lat۷/ XW}Xڶm~ j:|kV-m$`ۈEd+˻pO\C3 NQ7|3zhJ`LשO|ER+'_ip $裴1J*!Q)jM6%4Z, Hd\̍78Mڛ/|zz_}ɧC 0`'HmZ*2QSӧ@ESs') Qb"W~4yd#PEzS  tܹ 59'T*)4;~#Yf*$ʶQ*JMqZ6Vj:M[4VYV5=d ae[72Qӧ@X~S/_BNF㵜\؀y丨2V1^'շx1]w&;Z*XTjNn(dI3!{䝦ͦ5,r^u\+FE@a!+?q]t(Y(xFrv:RH]ZZz5Qo1 9]%`{g+..V B!fR~+.N~g~4EN߆:b:?ڡb1<$O.VﲈmLN(}A,B \&3$WɓD:U'G)R6lW^e U]o{{>RsӘ_ܩ6 liWs#%'F)me+>l֠A7!CӇ߰o^0 a|u>?4&|l)d}UVVR֢|޽njwA^EyW&Lam r]H)$0O?fFEy]* \Ӏ} PĬYܤI}/ХqIak6{)2 }[3; ) ME|m#ӦՏٻw^|}}mW9;鐞ž|Rsb+޹ncO;V=w'LP(BCC)Ig/W A K2>傳QW0]ӟOOoXDžY|߾G8q@~W(/ٱ]n_ :Dg OJs睿3}sE1Z D򀋙l!|Eb]2Vu()pBS~sصn.ӧվ-{ $#sUś_#+ƌPkPpp-۠`(&ݭit= oDw*?q^3g5 ᘫ.ϏE"O ;DPPP~R] +GI 0l3MNsN;}>%%ؽwHֵ~]s~ \Ҁ{իW/\- -vnW5!/=h߻3ܐ.}駫bo)c"kj:gL\XE W{?%,tq{.A{]5GD?صZu v)<7j=a4bzr\4Yc: f"c^G87;|m Z[pc{G&&]ǎ]5{GZʼcx% { bpɾHs!5άô_T XP[[Km8j+0pk#վ[*8uue1_ MU~|ʘf쐭P^T]%pmn4鍒%=JIzr c[Ev[yy0pǯ/1+iiņHjxMY]W^z, 1/9"UKm-+fv8GB%fmv8vDڶKrr$.'U\hcsxMɤk2n|M//X)BZdUݺ}&o('7L&Kh~yBټ}ƅK0 ZM-,?n6mx>nn߾|_ȰG*xJX6bXwu'_v$_SC%+oH$ ˥,XXbQZc^E566VVVJKd_ >uu7YP',͛m^z֯zdll\ UuSX?J_Z6TrӅ yKZxȁryƉkOfrhgw鸪]N9Q^H-h$[;hB\TZHKrs]2ecnam򛒡\n @PJ7LRBl˝s .9);KH,6#WLRIRXʕI,$,')EELB$9+WZOKKJb(b2L[d4]No[I t}}YK>fǭIL9ii8}/ȁu/>wqS8=##~0j"!UYf6^IS&KNfqi4?8#Z6NrKdKEaFSyKOH-_RMh]^|.>sC|x2}itU#cۀDe֮ʇČM_5WXG3%S6DeO6%uU~c _F}ޟd+)MX?d9BS`-/)an) Qi$Gұh+YbBbbii;(Tt8g6z }$_x{dŲ5ַ{w+yC&ĵA(*"8D?#OG[M/32qu'iMHyyKmn*gh4tV_ج 3d]Jyfp*%lk%y7'1nƌ͖MqTu,^9AXgmW i9œ +yќ!^%9Iƥ/3%`fgA~qR;;^]y[XwvQ91t)tj˲-Bx?Qֲhj-/?$*͖<\֍ڸeVْK9M~~veX핐h`t Gc@MWԎ&FaSINQ_$*9oi$1b*Y>1}6,Zbd8zH7.]#7ᮬ > M̡"[J]fx{S>~̙KJceLtB BkID;ͦJx FOC^RӑAI|m43mqx̫u`OoI?VŒ@* ^bR>[oYOYct|6)G1 8>}8O~nz=_N[vFa7_l f牧m,֪XV,` Wu͈K.7Hdd$my`iמDhhhVVVjjJBo۷oӆA6vI'(¤q{ݺu+x5󐐐EaizQWF5.N,l: # /_ /_n99>@Ϣm۝Y`  /@O87uuzTr_ qPgǎW\o'<<<-- 2ճ8AA=QUu}=8i m|򰰰+**vMkNs߽~~}~谽 7_bEpppuuux};wƍ),1 ~&";eBCCfO&;On+z =䏠k`BhmZ_k!nqq (K88kmV:eUs+ 8=</H H߆:Ja§ʱ#*VJrr\zZ8".}U'K6LaLZ1̞Wc s-.jXM ch'uJzbZN>%KߟmZySCLP"ļt npnؐ+@l?wb~.g**VẄ}%j06WY4Ѵq,ܦY B8 ̵ ֩Pi*8**u+++[ÏJ\u@ta*oҗJ6(/$_{ 3U9͖ykfr:W՚d$ P+Y>U) 6 ULu BS-b[Q:. 7 tqa>fIoUJ55[4l:ZuG/] S9l^tsiMF)ןQ6q}lXx/TǪM4 #}Ŧ  m "mt oRt}[GRy't*L^3gH_?Z~ذ1lzDKtj-`d+E_~R8 Lg͋pK$UduYuvg,6d\g[4RQ4?_#^jie|!3S\MTj$b5}iR2ǸLPVHG%YTdeUũc3ED`qdմ'Œ)ZvRjQrs g7Ebxez)4^ q5ZiSn,}sOX7~!)6J6 :Q.g./HalXMX޹W֍Zszyfu_gfO@ٴjȼ*$ SV*VX] fQ"]?/Nw //U6wB͉G te lXlnd5~~f}٫u͈K.uI>egMᩱF=QMM-#z_*feeTo߾M>YZN& eq/w (rCo+uV XkAWHHȢE)䫋2k=4&Ww6AxWǧC /_/ }1~`W;7Q?*??2: ư&IENDB`robojournal-0.4.2/doc/img/screens/set_name.png0000775000175000017500000001462612142060704020047 0ustar willwillPNG  IHDRPægAMA7tEXtSoftwareAdobe ImageReadyqe<(IDATx] |E֯IHBH$qpdLD\ QIXH g]"Auwu!"#HU1EDI rBIկ^uO`ِTcǎa7669"hѢ!Cn7<3<릶;9s(`~::t̑{\pݵcێپiI Q@gضď;{lA/=6~Ψbq~picSQQQu443p@B`;gt0/X @ׄӴe/1 C  F`z;Μ>Y_[s##S""?++ѶWLzp#Oxq^ m66# NWi:s)8}nOP0@Fo.)1Nj񿙓pz}Sݟ@&*}[V˃[3?7a[Ѵ|41ӠcgNE hoolo<Ѭm9?u2mܨ]6\rbxA^A40FN:+yV-xӏw|U<1iךE0v+yn2"9ÞR8(A )rD( sqaseP5?c5rg 'ͽNIXrՐ7*n$itO+GxBJ )3_gGa"AhiyzᲯOwA9r:=pFK-.=ٖ]r`oN<F1]uDaH4.8t3-Q< ~%˟g$itO+hO7^Hs'ޠHxb)hN:xZkR6Lł\WZ Q{Ѱ30LtKKLT_=8<zWp7A>i|u0GqmhoPC ,ʃӉ]!xѲm۴k ;C3?\4]V>z '?Am [K__ё?J1nDc%..3۰ Wа;{XV ꥭ CIf 8SVζRUHp41g1+p[ o]>+}zJ!^u9/ ٽylǫ%.2j@lJ!ĥ?Q}ûVN@T/z˙S UN?}1=yl` 00;5?0c֕ϝsw&v_~Z6H6mI^A^~3\^1uK~C(6'mRVlڅ AJ/A9\, {\c`_{]>TVK,9|@H_3#o+w)*tqhqHsx:\Z48 !!}>8TF\3G˫:fmU]kVMc9ҥ\}->`SS7~EkkNM㈖ӫ?uR&.0be _!*:oM z첍<.M;}îƥl;d/tRl?n1Q4&$5ZGȷ[5sGZ\rݩîm?ɼx؝'|jK=.ZcϷU(5_r嗘J/}?.e .dƷ҄o'I9[NՊL&S4JJPQYWӬt{:狊PI''Lz' 82sY)Ʈ%RׂX5++F$nα$H:OWea;֧fh5.TDdS9"ߪ]Y,lRB֜:"R_€dE/WI8@rSEu듲ݯXo*\&71(O/"UӪxrX8Lkg]Ŋ; UR flѰu-*-2mTYn A$x5r}"((2UKϬZeCpS8`|T*Jzq5{yU6qJV;H}%3^-3VFIE=r \S9KsWuSd&D +DO(q8Q% 24=YBObR`qx.L4!]+˻x%XDf3OZ,sϤ>$L|BI^C_ww]%5ؕONnD""87!s! ' iL9rse*WmRUbxa\ؕ'J*if;E\\xM}jaa6_WFE]k 2O"Gv8A̗JM[ yPFJrAω]}<=1C")VS1 ΌUa[¤|Iƶ"X:J Nr3_pn#𩈬|RXܳέT|Hba]H:Uit- MGeKsQ~OLlH^i^E JHbTa"S^*FԭIR%9{\y%grkS~і?48~4 tFDMjՃB:οihsW {t65n78.Iu H'Gjx@1AT5 raͥ{뗶?@wҦ3($TJWދ!R0^+>eA5Thesq},&{$fJ1/D`)0-kgV?RDzzMnBWˑ.ϟg6uɸL7Gd#6g]<ÌmW0WY1`&z{FtGL'3YRë~k/Yğ^Xd,MʪGG2 j#: _vp~k$(/a3_xa&5=N=!qa0_ -'5|n{cZN\amH;qV:{W5YQO2ls|"S;qs}y`nݺ`߾elNs^7uYUes%swp#(5ϩwǕ^~Uvz._NV.>!hoEbPUTWщnvæ]L5@SںԉIquT'ɩۇ31M\":3U''o\Y2;{Mu k@L ,VL^矋x;hw?y塥uG9#X3sF2մQ`陋KU*gnp^1wnYݧ6ow,<9F|VjX,>>^r*u._6Y-K~]?=%?z%WʏO&i^Xg9607dg-bⓧ05&nKb1\h)J(Ng6jv6p}~?ۥi]zΚv-:-VW/uXKsibs-"݈uӎB7;kuij͛.C$`.=N:vUu3H٥w\KGpCsKyX)}hI7q) >}:&&СCСC𸴈FU_YS7%!ĥoi Yǥ$0`u&$$cgϞ#s=z-cM:[txPJ={/b _ѣm{dd9s^ 5 6KE0nx K`h|t?ن^xW^æg~Z@1IϥGt+^R><_]A<\7R8bs~T^gCK]+vE+ &TOIENDB`robojournal-0.4.2/doc/img/screens/assign_tag2.png0000775000175000017500000003004012142060704020441 0ustar willwillPNG  IHDR<gAMA7tEXtSoftwareAdobe ImageReadyqe</IDATx \g`9( FMTckB4)Q&&5֣"1mz&6H"hը5kga؋3<γ3>(.X(ځGM~l^[[[ϝ;' ~d1?Qx&+i/3?p@_FghW5/%Z;REl6M&xWXTTJ _}WVg| mc69Բ9%c3oύ:z&ڕӷLkL [4:<ɓ~j?ͿvQF?:]OH25֚mRˉc?޳#&5~_50_'7u.N}l}מ\{35R*9U*Ian?%̯˯ <ͤ$gvV/w!MfdQ /C81ȋ  Bs(oӅy7/5M-6 &TUPSޙ_ΐ/ݟҟ-2,;:5i_Y%kfG0ZV^.Q`ܿ]`8>Q$BMfy0BOK6_iO{]ðБƆsI5Ქi'_qjffJwj~ulywn\P9 LK$Rm['.sf$sxЙ܍lhLƘ RqZ}=qxez_;ӓ앾fo/}8jm57Kd:C+A,XLl$4omz:]_/b[G 謵/& ~ȠpS}= s6}0?I2l+0u}  ?W!yS„w(ܷp +q'6=PwB(er\;meݫְwN3wa[&d3T__Lz5Ղ^zאa)a\L\;?PXjkxǏyCp`e?fl{?z_zجw-dɴĉO)ٓsbPũ OΚ7 x7s{ķ~vJ^|(/7'6ŝ~cO9nPeLˉy$r~ گ >ϓN6.{S?LR/&bfk1!sӟyR5SOߍ ]KR;)>VjVD3‰gҔWJ+~tqX^iY) 67sfNzXRaWBф3sQ-}*X{aOuFܑpֳK8,o`>0~ZJ3E?4 0HU=5oC'Q _R+م|^5 ΦtѫQ9Mc֎(3 _ݽ,}/З 8rl_1PΔe?|u_ ={U%?7_D䬟*zxs7]XtW/ 7^75ɯ80s=x!gA?ۇ/r;U/_ /_p=QwyM K,4xnr ͚[>uͧ:5,!&g=Ў}֙O/P/FyGqj-4`^p7W%&lYg83fG m<rؐ /iu> /k_RI8Iyty콏s N7cj3͞QZz8D7; 5H+ye.zupK-]m7t:ͻڕKAsř㧥qK8]x.a4*%ԙJ۵*ua  LS58cKduΝne4M۠3u҄:6l]Bv:^scؙ9K=:Bx_, yXMNtqsV0skS-Ebkţ_+fZ|޳ݺ=1'ڪ= O|F'g~qoÒikȞh%~X?vot+>}Oy# @w)LsiK1{khohB )fNXFWcrjD`j_xcM<_rkFk!c;qU̻m*0?@q fϾl2{ } R txwp @wɷO  BkCG _x <~-&k@{~|PP FڪqG ͸#90/UTmRVmЦdgh{{t#¦7 9CIvU۹-Db#Qo):2a>ST][I1CNHpu(K6;!Zm UzKpTKm̚Յ)eezAeQ,zX_]^bQ9w5$WVZga_+ /.kߑZB_i9^4֒`%)sXK_&kPdFi9^? ~_YlzjeeWOI)+t'| }l5ڪ!ⰘG]%ŨB |EuT[ꊊj ,XMy![%&pޒ{; G}fvʖ-PR%`,J/Y:%SkWe,MIZ:V33-Yb^? y<4\6>uu^)xnrlf7krg_ќ֓ݩC,sOʔK~z94Ū+LJ{m#mZ{UXaV]ב|W^xޣ*'^|.hZj%j+{~{ڏ!pC:J(f" xs&s>Br{/ VSl ~? _%/D' Sw^Qvj1A[š,*J^Q65[Qp_ /_/  /_/  /_/  /_/ зP Knv7tp`RR C:Ig ]J :ۿU!ذЃR.떿~&GXn*S(T*RTX᭜ݶd2IݔMvt`+o9|ۇc;We*A.$/ci{DZZZYڙ$f{ٹuejVXteV,$%J)ҡ$jJ++0"URC,"I{eޥ-yTż`b*II+th%z$IYe#V&5jIUء3ag.yg $I(h4,T/w$ôXm\((#555$26"4ceb]Z_%XE[,MJ+TRT`)Ed,-̅˺c1 1id# A4ńe36)U$QօEg,.ˤЌ^%+kRPPp9j}4 4(++Cs1mيPKdDX,F &43$1 y.[ yWϟHlݺGQQ?!s}W\C Awʇ<$/ mꇇ{2[6 F0~9.]h j߆/ ?{}={~N/WK/(jV& SFF'>reytۖL1=ɕ7ߔP񒈈HR l‘ᯃc]ٿ߫3QQ_2X4e(*6ٽwTq\QQۋx.@%=ؾ6]m}?I䨩@4ˮ}%;FEM]W!$+M94=uB1oN̅;[r۪ LM~ʶRhZ6RԞL;wrٙ/:!%WM"Ssjajg r;ykKlbouUQr%YC*W^)fee\)Hl DuqJ۹,/\cS֙>J~+kmmmײ}w*"hl|qcmS. xU~a~W;uzԶMhK֮L&,߽;wii{;;wgGrٻe:a-U1|eE -5, bE;dk~8HTaSwM@U?T<;_"/x@\Y\+FҎ>\q ~9TKN\Ql*^]x .9uVL%]RLVivѱIޜirؑkM |Ks%('VQTYe'*;[):0C*׬)rsL}6 Jbd8zB=^oT[Y\ES5.qIi;hIђt,^א?sDRͩ6grrt2 x\mڨwstX.{3vѵ<6VZؘf6T:I͡caiN}mYߒ&SS7k_̣0q8_毦FsksESօ&UN 'Y]H`ӭgФ%b:2)ځt1N#Y}I{G @$Φ b9?EE=x-Ŗ/]RY_lWX,B6s99҇=sŃ3zxt7tkSS\z26Y/ ʗѶa#⦧9`R0nIn</nLqC(k╆b&M|KK%?7(2^ms؍wvYwlNqv u5/껶WN{s?Ѩ=Ej@u뭦-٧n0j_qF‘iܱ/)*Zv$m&G͛E%>B{ KY{ϸ8Oo{:Q;.=K ki6[/eyct}`ؽ90yT?cL۷#z/vnpW4fLnq;MI={?Mϧ1\z)'244vBB n#I)'N0pMу#ncDK!dy"K'F#gl<+/2Zv6-#B ) _J ~Օ'23xpɓ=.#'DFj#G h*5@FQg^<#I6^9#%a1O;v[:ԀpMPB!\#v!_¨[W=SWW"Z6:k& 4(R;0"ꦰAB4@B9/:0JO9U魷Xbٳԝ9{FE EDDĈV'y8W .*,((HWm׿9,fmL-v*Z};6,,lpx8.((&0SU{̄kꖭ[G[̡n4Ii؛n:>fL 1kT+6˜`AÜ9Mʝ;5G:19y}en:8Ro-Gp b3PPωkvΑ=x ͜YwߵĠArΦw: ppF0ny*68=(뭁ϩcc+bcV(U_',Ȣ׌ y~u=Rpm /Jf%.,4;֝\լvܸcư*60p8Ξ5Ǣ*1QKW]]uUlt*ī[]hfϮOM$QlR^_ :x0ԩ^_ %37gh+%ۊEa,beg} ۨu` ,Đ\F{cXeB6t9sjcR*|37?鲒|rZ=_f( 1S4τ])Y ^v C1>0L&Zr͵Xat_Uc 9SӍCn [y2<, /r'>Yh%!pv M\I/VXLT', _ ث5)_r03%9;%gI WC3lpYMPI6?p^@3c:TL|/g_6}h&6Esƾ ·9Ssxa7֨CG1%aW^}5(0pQvQjjjnظ-fEWo1ijjkDn5 \xqъ }c#"",X~z|˝ :>ABkbԹv>'.F^;/c(#/pc) p#[XxoCWmRV VssU.g~%΅ wZs޸| &9N*ǾNAW>{UlᲳم5)٫zq'_nu#_aڹhQ?{'>%$ﵢ빊 (ђ)[WTn#x\QY\=sօgUT>9y]́+ɏqG[W,y"bΚ3BZ-D}U LyUf}N:t<+zAyuVnjk8ʪؾuyvz1öqѶFg:-J~vvTw$ bΚ_94mQkl )æL&+BppҗVY#0Wejـ@a9l!EEoL//]ӧDm/ѷ+cMfK/iOOdyLcBQ4M,Oxђ.7/ͺ`JJt%,Ϩ2'p~}mQ ^ʪ/kpBA`kT&[vC$BDb;-[ 3tߝc.Riv9swڮ] b KżAYOXkײY%^$}UWWoY]&k VypppdYϚWn)Ge/17ϪKw[$9K%+>5UU [gRS|i1NgMJ]'KB2eztp*6šwl,%;,뱚{cul~f5;)KȮg'&ZS7ǥQ_x-Ј%/HB&9o? ǔzy,UVqY/[eSer6 :Q[\_V8бw㯮-v‘#/+#<fvѬn!v*A^Zklr ^s|>s',kN<_{&(scyϣP(5}fF.w嘘ӧOU5· XT/0n m}ch\ܾ=22p޼y}c^JkDoso}}t𺜀~Rm_~e X\ϷȫK,gގ3U/_ :r OO5u^W"_ 3h`b=*#8IENDB`robojournal-0.4.2/doc/img/screens/modify2.png0000775000175000017500000004520312142060704017620 0ustar willwillPNG  IHDRl(YgAMA7tEXtSoftwareAdobe ImageReadyqe<JIDATx ||q'!'!c RH[bgimJߏҲ4vuo ׃l!Nw) j!GI5 O;q۲3HitK>e4yf|yf$u9Yv1˵!nW/..~'L@M0nwY!c.,|3տy:`Xx̿9[g=^Ѷi6F0Hl{mOi7~TkyR/ BLꇦeGvS# B.Ŗ)GF:c`{cǎU;77n5Qq.%S>!mFm v.y=u٧̴^x'no/Qx2:eS#sq*u[xx?{v.7+#k3m/xk;sЖ3f: rd[.b}g}_Y6nu0%nv6[n|d*`F8Yq%pQ;yjٙbE?s:\a#y=۽"ڻmy<EPzEVї^@mԦ'CUT^P!Zq$-;nzl}m!Oxr.I[#y{vS1c_^0(x. JJ-zo6e8ʌ..qрyo%u5:^\\zt]8kS2 SIO_]!by~4a>5Z!K~;Ƣ35j韹Ev{\}Z։l޴+V/1mCOej avGZ^x:-gÙ=g^<+ I_'?kEh>`]eH 8' ]9^:=ߜ>.-P?󧻜9rlSV=ey0]_:u}sR,Ϗ+?uӢ7"FP)_V&L; r=+_}--oWhGRb?pm+Ǵ}Co{|۶JP>VZKMs$vɄ֣W>X6l@[k:ٻMm5ƊaNc]Ľvy\m^gܲ/\^x.挟vw[l0C>͢-S|C?OUzy7|>틗 <eY"BR_^Ee 6}r ymmQذmG}'=5_Q(T|]!}tX+1zNX-aF0veK S /^edxk1Uk5ۼsȿ^x|}j̘sDYM]ElY~+tS>;4 O/]d*o_~7D]em{*qm~)j8߰N\`٬K{')Zd*Om}FSKE]R)6yM>6-ÞCmmm2X%jQQ_r߶ =?Z  [FFf~Ah\WKwF~Nvox Y ='Õ!(YyoPq=[Sg̼b)⯠0m2տwrV9^/;jKҲ1l}I[iÌi鹭SpEfL""?fu=nspʌɾ[L_yUPYP$ cH]{oF$5_T fjT/%n=>K<\+g [{~&| {檟k/-oZ>irw21x|ݰ=:q_䮇_#pV~+kfK{-դ3 1U'?tH1NA<(?O^,޷+nx|{?\+B'$UXdmgl9t^^G ]!"M7{}?)ʌ.9k7|##kQ0Y99نvok?b_ };_[r7mu?Rտ.{G>U鼢}G/p-NU?l߳w]8|>}v=L@2kڧZ6-h_7JШmmQ$ >⶗_رfϰI.f/\8cpϯon|e2q HHQߥ؝{EbǺƎ4v/JMG?þH²՝?s:;u[6):b{r#LXIɰƌl H7/A=$G/lAWX[)4CTk?5ukp<< ;%Fa"4pc}ic% 4<maޡ۾,u%SR"Z#[(w/ M We dF}@  AiFijŖCcZ:"8|PjYrTbf'+ ZuUMRfKT55i;_՚N0Eɝu~dUӪ#[e#۱vwյ_]]md=}ߌ ׇW(qoX喯y; ^Z=%kBYVVjl̯+o2KE;|#Ŀ*SD[nzm{z-W$<6#RĶ4y%KqN^-r%;{ſ*PbǦb{ ;k"nnԨQ#Gug 8 6LL+Z' }nݺo'd6ҵgfL,R@ ;B`뗮֯+"yg3[Oku|p ɑalz=yV-scHYXX(3=7|21766F,y׾gˁR7:tĉA &3,c?nڂ?;NZ"GUmnO\2i-bݟZ4cb9>GMj:<"rbݞ=c_u5cl"م<]]|ԋ/[N8Xd &Q]^\$C qJb|B 7`fkj&qO#|jN!5ٓ,pWΟ=2u ;(2 ,KGKʫt@… k}&MJf!_[Y0gTkKWN_6U{i l?f;s$x~#6O|A?m w)**tLgWM5o#yYj`NO+ݝ)4/M&Jv^px#_;uG}CNk,,5~azzz&؊R{(7ٝ:G&QiJ#;𫯾*ٲV~4yqm|D.K-Q]tTG]4BI's/Kdr hjjڳgό3<ϗ8 6Ew }UAUjWFhկU_zQw7>UW'O<^[wvڲg?Fe۶m;sw͵WΞUgΫ:gOYyuInfwxsܤJ'ddx<^[;wy{֕{#\͆Nӥ]vM2EԿ.]rS.[L>#lM)So:S3<++3"DG/ZjWڙ~/.Mb;{Cq?dۻnѶi}MQы3{vul:[,]dZ~NԱ#SStdӯ^վ_}q)nn˞7jJ&11I._>rk՜]:uH-"O /sf7NjWΜݣ={Q[%eM2/_ ԿO?-]|,pt0p-خa{ -RDdvNZrYu`ѾUg n["[{*CEBEZWx<2',X ^puvScsK;sDR2,=}Kyj7ƫgř-ىx܊x]U ߢ޶nݪ$ ,nnuwޖnrs]9Nt{{]boWk'_90w>s3?4DuRs٢=yTv٤o3C;.?J]`l\Lkքi}=]/sfxAc«f&_mUm!jD i-&?>G`lɓqabOo|}ԟ_ W͖;5|toɘg>vi/5v3;m2<^yNvݢ %kwvXJ/Z}7tI-c?ux8H[ ;]3z1u܊[oEH ?1!\g6j篸B"%~С1^O,_mѝtN{ep>X&kḭ̏+<{ߞy2kJw;9]99bxAo̳gz23)DO_W4鷶RF\oy}BD{ҤIZ0/i'BtGmoFL.\|`[䄹SG}߿u`߾}4=| tgΜw( }ꉳ//9Vj̲Kt?uOڵf|}ǎ93~o{EK_[=X+!G(K\S_3F_k΄˖,}U}}NXw\33[LfӔXqUoн{^Nvl^[^NvUo|tU;΂qM}JF{(vܹA"Z*kgtn1/k!^߾tnQ%)˂iv__zt'μ1!iM`uw]=/S:Ezn٥r.ܩb7y)ޢдk]M Hḣ=o\8{ֲa\w}x*v֜iNkR[^Iz?dVmWqa~ΡL.g-swyV2;K ͞XT ۣt3~gUZM/:? .tww~CZ879t?էz+zs_67/'cx{z:qɑ]PP0v/~QɯKKQ{x ?]dv>m[Um㺈*mܬ?i /aᶀ1c6$S'}x/MXvgwvv=ӠT4*Xc-Io||Zs / }cʧ'/sllI9YfI:JII[na_YfOY']:sԎq*AoKC NjZZD;ChS{ MsVu&'t{Hb ƮO(^bOQ^%?!,ZOdy󊊊D#^f/lar ;(w _OO:%.ˋy5eZ7EGG>=waÊE`]l-ШQf;^l~C=q7լ]y}':pmW_=|#F.,,57~ HE妛nz饗JKKRU~{{SO=%Jfvl?a@gU'OU#Gdu,˨^ Ǎ%[g:>bKܭ*ן>}:Ue9R(Я-pߜ"sXu8؝}ɾև76 ߡ.}g>`QFlirz0tc]A쒚O~ ֯Wv)18vLOЄ5݊SsVؑ#G-[4B? 66{B8EeXߴiߟK1UG4{Sɏc: p7m^%-;H Gͅs^~sƌ}b}ggΙsmqqIIpMF~kLlr <֋Gycg}ף=nynkWwO׵v.j5q֢3IL[F=3ݙuf>clv!p)(BbG܂.cnrvww_p]]Ń==bDF}qfh@/(((,,ִo-2w$3G@4SqH\a.s-4@[LDE,2ۥ<*s]&2j,^s ;G4wSFlU2;Ik"ŵ93ͯǗ2R23参}YB'3s93 ɼb0DjR-l[kl6[Z\o4_*r88n$%%C܁>)mla[~(˟T7xmMcE]ssmE"KTZbRR*|]}n/u35[] QSQHq^4N4aZ^DńatfS[&Y4`ݐ!1Fdוq9}X qLB*ڶC+2d;XDtCHPIuo۞3uC;Ga5TE ;+L#7UXNeY~j ʰl{X|0DQqbu5aIld*U/ IT'F#(}7lNi3G>㽳5B 7=%p˙q:Hc-*in/nCFƂb:خFdTm*$ESEkb߭)8( 4M 2`s&3Gs?w簣-j/vfs6g\RTW6_]u[ ˈjn\$ԯz/ƽ^elRMhJ_JHoZ>H2D_1R=6Q""Bu$}Yx+)q8oAj8xT: [].oVQ ުQ+%aݵ](jQ݊;g%ߛZ1T0WRSrgeQn!Dlub_uC;GaY#HFn0ʲfd9>BCOc^}E,^/P%DzQfa-*GB*8im/s,[*|.6~Aa(-SS7moȵܑ$~ +3uB1NRۑް[)!Ν9E|qP&P_Υ?u(:[U(0#9 E$Ol;q-C,+bFHEq QgS`'}#qJvRzR71ԧ˄yo(ub^!4b{-}$IeHRUa%8m_GK1r"-Q SGK9hK=b}A.#nᇌUvܴP#f A˜L޿S7H(oB{Y,U\ƠZChQ/D=MEStO<{zb|[[=2oQ>2oRaE*oKݡ*eN{Dܐ]oXEyZuֽ_I=7c,EMIv7i{y/!jkyp4nj'1-C.ޤ"W,;T­f:W6eN{DdlX(oA[4*e'o3$dU{Y֢^ ~.C--)ۊ5Akw!XW0@]iXb 2$rHKMɾޤJ*W)5HlZr V1b'\GJt>Te 'a#zfXc^oIUQok)랺*e'Od]`imaѡfa;8kmo1 DZR#-|LxKJn 1~J,۾Vlra|# *,{oIX2WSZ-*JG-˾*e'[Pl$[T;13H. \^>PabG&RQE! \j>*ǶCC>-s\uh]]eiߒ$ߪR{(<.ZFÕfE?6E ==zyŃۺ.EZb8gQf,vp|+9Z 3RCZD0!8dBJ`RJ~\H55  z~2E ll04=6(D%R{tkSI.o?}'/CMw~lZ !eWZmk33Lj2~`vHaV 8"Y01--_sRּf5K"icqIТEd1Noۦh?5(m֮늺Djrxu?G4?+us9-z|qW. EzՔȦ "$bu ӵ^QaR^^aloހ~'#+<{Ye|.ƫUeZc:Z@Y;-0t ӺRR+@`'|k-/dž^QNHv[ZǦF[h5ĵqC pAf1*hG@^3Uڰ 0%t;"Ol62mnӸ=g'jVwkw5? lysucg CL-໨O` 7v[|)Eub64?<(i_WT74fvK 7q$l"}H Z O,hݐSI"E?ay69 tלVtu-8چ |)h86fh3+EZk?(3[ÂonH |֞p&z/UM^o^:{,44&6%C7-Y$8AWs lql@`66  l@`@`6   ll@`@`66   ll@`66  l@`@`6   ll@`@`66   ll@`66  l@`@`6   ll@`@`66   ll@`66  l@`@`6   ll@`@`66   ll@`66  l@`@`6   ll@`@`66   ll@`66  l@`@`*66  l@`@`6   ll@`@`66   ll@`66  l@`@`6   ll@`@`66   ll@`)v{PM ^>: D \lѣGleW Z6U%׷ZsyX25 ,Xkԃ`Kꕣ%U>P0D~5;F1!y`$mӘ6V%^@H=孪2Ƹ7jjjkkԪ?+++8\jۨI2ua]Yx6Y45 J ҊmYNT5|DZ)ujZVKݾ,Wֻj]GА@~q׆(eUU1PVZoT?D%Nmj*[F MMiaJo /kf}jVRc_ ނZ*!}r "-7|FYܛCzX4M ,cزz[4? (RJ{8Cю|fVuhvF60j#\a^kUUZ7&qqm&uE2v, jPqKņVPUK}֕׼:We+[ߨƻW!J([kQlu2\δfx:IN^#}E>F[-gd۰aU߁X-PZWz*WUa=lUa;KrR=CS⻉.rzk+7ς^ I B\DU7~?EJ0ԼBl7x1۵pf};v^e<j+% I^#Uk网wњfBzi|Y-gd۱cߟmlt%I1.`;7zy/zkY\W{[{,мV+U$Tզ3:g%$Ro<ێ!ʪ,̞_po1M#1Iݦpw[hQ[gz%pIR]gJ>R~v^u3-Xh-栌ZC?Ig]ϵYutV}a_ ci 8pj;V#U}X oDb٫ǎ!R{ka* LUxKIENDB`robojournal-0.4.2/doc/img/screens/color_chooser.png0000775000175000017500000026111312142060704021107 0ustar willwillPNG  IHDRh "sRGBgAMA a pHYsodIDATx^ XWy[h-DId   0}V˒/}$k%kw[mېIIgL2$,7ӓy2_RHƲ,LZ~s/ yyS+q7+BO effAp @p @p >lE꯾{8tП? W _+|)Խwe(K~kۺuk//B@5?c ?-%<G~? _#?~?g?͇| 8c 8c 8~"{B_ }4{=ys|~]G1pPȸ?󅟷uuBߡgzřeB?9f˺_O^< n u "8c 8~@߄B / cCl<~3uhF舔Q)sw\g/ }GfNK?c_k1?c < `~ކП|vhЉѩcz}?>`ShŸ~]E1п?? ߯wۺw~|8=^Ϲw?|mx|g nǺyE(7*B3U]'V|_xo݆/ mV"tBЩs CEܩ NsԺЮm?<:#ϼkܿ3SAG1?g|n ѿwm;q|MIp  :oy|޳pQ]|}~?nX/_=[?x{fN_xC?841{s1WV5 9>طG|Ï{ 2y~*Z@p }Bf}5ힿ.vqq߻󅟷q_<s_=O m/#{}g1 BǕJF_82v_׻w_]=s^̘_^wg&>0'wjBtsSՃC7T>/K&y[!QY}vr}ȉWW Cw6|'fcg|ܧB~᏿{{끿g1\@8Ѝ)?ʪ_}~6' Gvtn_Փϭ ms4?!>w۷_~m|}Op 1p/+2B*3Bw23tWS??^ǪWu }öLgoBl=q#iAޘ߬ ZSp}s>o {BOϮ}*!4?1?sCC;<6|kgwBS<i8? _mU9 쌿_ۿy_Dݾwj {JO5 &1Gu /O }52嘪:_{p?^?bx]|W #Xuq3|m3u?y ݳ5 C7B{hO.7?η.{c |~Џ w7oo>~Aj< >|vYCsy96=1z / 7274qc0?_y~F>߆ OZ܉5 ׇ_ʶйBg/l 9%tN:~jch6|_k|-c 8c /d߳I?|mx| gB+BWs~nq;t9Ÿ~]E1Q.f6|3~u3{;|\hx?|mx| Gw{?zмd~1~}E1/&&|mx\?@58x䣺C}߮OX@51?x`De(| c 8c 8cq BOc(| c 8c 8cq  }xo{ؿ _#?MO~ ~ )AS)K58c 81>}0-11>qߌo4@p A@p @p ??:o0R  B&11>qߌo4@p A@p @p ??:o0R  B&11>qߌo4@p ?׾JL|;TP~ :zh m? }Ñ'r$Z> Dҍz +Jc(#x)Lc6f˞zUl=vC >kjC_p|ypCa+ﱖ|f0fGżˤCW:ў< Dҍz +Jc(#x)Lc6o{d?8.s|Ԇ}mn!9QZ4&2 */ $K ]D{ZT퉤1$xWx2PF:SlV~q3\:7 Csb[y,3iLd4#H?*(U^&H$҉e 5Փ~G~׾?Ow%;Q>Q~ ԧ@ ^M?oi5qoؿ緡oP8;ǓB*YC_H85av8s~ @}OΡVu_ЏWM!9O}\}gtս7p;}w¡'Tpkx0ox_8s~ C9C>K1TJ)$>/ }s¡@8 >R"B¡п}!%<I~o/yHԇ~P}+Чև>>p3:Gr w wBtޣܿ~cosbEc>|^?/uo oos9fi}|k}}7fBL-B蛭ƈf }3#fB̈}3#fF͌7367(66,a>3$0AKi$s:КfaB߬-BF H^ 1E,a5Np2׹|Mmr3{fֱ%g&ӘF2TқBr $x_AZ{CM36r{#oc?ʍM?|߽`{c~?{?4-hGG O@??]?݇ C?=ZiZiZiZi67 66,a3$0%4 :ҚZЎtA? :B0ә?-O B?-O B?-O B?-O B?-O BtpCeY Lgc`SE EAKzEiӡ#]x$Ћ4ɧC1t氈%fq3\:7 C.pcb/:Vd:Hӟ*J(" x_҃("Hk|5o&z2C_QS FߋtP!{ \`dׅi&DE^b3 LE蟙b"lDم?sFg>Bg/ >g8aͬgKY,3b0bxI't#x&?3bXq~y)/(&0f.Yj6"B9?#3!3B?#3B?#3BLaͬgKY,3b0bxI't#x&ԊK"/"/S@1e2,f)fvqÜ |Ԇ}mn!81lf=+Xf1Ɍe@5KH2=FCk(Їw޽w9w2pV?3{կ)ߴǺ77m\蛛o.7C;?<,k.+B|osB| B\ }}so~o.ͅ7z_p|re;Y Yd1! 2yH'xmi&M7@!͝oN5}}so.-7kB|'97B\ }so.ͅ7B߼,8^`) [Lf@)Wxt'іBܴ}so1đH**TЗ gxblf9Ir|Mmr0{fֳ,do1qbb^%I&8s~F[|57TONso%:}]L.{Nԝ}!?iۿiQ {X][o-"B" oзp~Eox--F#-ззk[؅з'BB[}z_p\g9a-g%KY,b RCy,2H!8DЎa1m"(o!-} [F[XB[Xqb4BB[}y} o!-зBB[}5BB[} oQ{ v,e!x)c4CH e xA;ZZӑx8H% MF37yy,f)kvqÜ,|Ԇ}mnp v,e!x)c4CH e xA;|5^n'&`O1P-iC':#-oK-e.BR[V"-!-D з\з܄зBR[B[ }ˏBk*81la=+YBf3)h2^7dA/%҅δeX:o|_"-o)-sB߲o9o)-'"-g -2&зBBR[ }Ko)-зBR[ }Ko)-зv,c!^g4CD ћ|Ƞ gBg2ԆNt&$ BzSI?1LMf0,c .rS2qڰ/ r0ֳe,d63f(5zO"_,]L;|5/(}0#/Qʴ}++[ouo{[9?*<,kUBx0 +[ }CJ[E[ }}+o%зVBo ns\,9>vwY2f63x0ӇrJ(e2yDzCW"@0+[ouo{[9?*<,kUBx0 +[ }CJ[E[ }}+o%зVBJ[ }+o%зV9>vwY2f63x0ӇrJ(e2yDzCW"@++[oek]+[Z9?Vзr~U(<( f$c4f0wXZ608>5a_p\g9a-*61>SB/ $ғI|5?BM>!>8֦[ }kз6m:o|Ϸ.E[[Z[ }}ko=o-#Vз>зBZ[ }ko-ɿ67r#c[yU,m07X1SʫKH< ~NGZ }kз6m:o|Ϸ.E[[Z[ }}ko=o-#Vз>з>з7Bߺ6 ns\,9>vwYrf3yeK9˼D*tз6mֺBڴ}k{[ }k[XNko|P)U `0#$1rֲ G8Y7 *8ql]VL`*v/r?>/M&>7mCoھm"=mz ^<z+mC) BA| CݿAϫnI}w ~. xy{/p{P~_@=>*v/r?>/M&>BM>!>8vZδ}(lk'턾u휟o2BvA }; ڽзvF"ѷз3ogDjvBΈ};#vBΈi/Mrs(66,fxHҟ*)"I'Dx("hfk];зvֵs~};ەo',k턾};#v vFCNѷ{};#vF };#vFѷ3oW{\'8~vf,d"3reI&8%Zδ};+ZN };[9?rڹXN;۹XN;Wkg};og!^;mmѷ3oZRVlcsӜ qڰ/Mrs(66,fxHҟ*)"I'Dx("؈>_ BB}{Wkok]{o/mk|$зUзϷзBފB^ۯG }{o텾зBcзzW;*9 lc#kXb1iLuF2TQN1C:)$K3lk/텾u흟oз9зBB^[q~6B~)B~=BB^ }{o1B^ }{o/텾зB^ }{o/텾зkXb1iLuF2TQN1C:)$K3mk/텾u흟ook]{o/ozR`1י f`=qӜ sڰ/Mrs(66,fD^g$@ 9B$(:{=DOT;vXu~m&OֿI>w⾃iݱֺw=,PA_0 : ֺ+^~^ >@;} ·nrG9.53iLb<@7I/'1tt⾃iݱֺw=,PA_0 :}7wxeD;}E;} >@;} wBߡ9 r]lg#kX;gӘxF1TSAo%^kjþ7Eq`V4&1Q g TЛ|rɤӓs|5 5{q~?Y?u xmGh4Yhھc2BQ; }G{;Zr:XNG(uw\w|-}G(+wBQ; i/Mqs(v6|0L`H P@.@2<dzaBhXqѴ}dwwttBQ;U:Ne&BQ; }G.[BQ; }G(w!wBQ;^'8vMa%09Lg2pRC%%K&/L<,?w4h}G+;hk]G(=b9],wBU:}G+; }G(c](9|M>kjþ7%q`Vt&3Q g 5TRBds|5^j'&ȠT͎Xcw2mֺNBI; }'RNBI;XN';*^'+; }'4$ $wN=ywN!ɿ7%s`ZVa:hF0*)<^"xgB0[: }'$LwJֺNwC; }'b9x!wNBi9NBI; }'t3wNBI; }'$wRwNBI; }ڵb t&3ь`5TRByD*)$҅NuNBI;dk]'[:9?NBI; }'|'Wd}'$wN](g8|M>kjþ7%s`ZVa:hF0*)<^"xgFC?KMĄa|W} ?f|1za u0>´}D EKF8? G8?Q=GpۈYxAE}G}G}>s 7z;8IqlgkY0D0R^H"~AD#b.´}D/\6W(*|HpXGB#>B#qc}G}G}G}G}G}G}GԞv6U,asy)Ld #L_(U^!4z+bDPNi+#l0mak]KF8?a}=GXN=GXN.ExA/Q!B!B!}g8|M>kjþ7%scd7ZV-01d0}Wy,ů%_{gO!TOLp Gͷ/l۾axч{ S7=F=y85|O5|={o{Q?燑#^C|D5h,+|j6X&ǖQH>ټ $s sk}i>´}D>G8?Q͏ %j#6X&ǖQH>ټ $s sO2/I.j~LWl`+;~_!ﱎM}-|yH$CMĄoFo/}=gÏ=ȇ{ogÏդw6mيΦ; }g,wBY;\tv~(xa}g/h tBY; }glDو}g#F;w6lDو4&׸yNrfﱎ,e!Lb,B?j(|yH$爢sMwBY; }g,soLwa wx\4m:{ABy5BY; }g#F;w6lDو}g#F;w6lDو}g#F;w6xw^l}g׻2-x9]4BY; }g,wBVwY#d^ \M%5 d8$1y,fVv g|Mm&׸yNrfﱎ,e!Lb,B?j(|yH$Z#i#mXh>X=_*5xֺH#S.\,'R#>r B)B)B)B)BHHHHHHw/MqcYB17XF1~E2餒/A7"\/2Z|d*E:?Y@ B)B)B)B)B9HHHHHHHHHHHHHHHHHHHHHWNj>yH{#mt>H["k{ЍHWċ EӃRH%(JjpF1ILc6X V`9sڰ/MqcYB17XF1~E2餒/A7|5oCMĄ>/0o~F]X.u]p.wy{8?ߥh&]3]lc'9q\羋w.BE}7z;8)>{fֳe|f2Ɍc4CO)Ur I,%B.wu]Fwy{8?ߥh&0a>`}5x-.~p}1BE}"]w.BEԞ8ﳇlf=kXg&S8F3b^% x,],|[Z.^kwq~=]|{軸XN *^ m׹b!^׹mXqKvZ]~p>&5a_p\9qg;zְL2qf(C9żJ<=Y|5硦zbBn5$޴}8lbھu]lbھK!e8?ߥ/.B.c]Bh e.~RAo %I&CoھKu1mֺ.u1mߥ2b!^1.?1.1>K)$L^$x5D^Eɧ2`F2%|?&2]B?c}7ɋ$O\Bh'&>}'4]Mwiֺck]W]wBU }W:WsYw5jDՈ}W#F] }W 0jDo p\8a'YM:cRAo %I!_MװnKljھk:u5mU }W*]w[eK0jDՈ}W#F]w5*]'ˆ}W#F]:)>{fֳe,bx)1TЛBxtRHD5ԍ$RIe (j2a"Sx,` +YF8g|->kjþe.pvaX,d 3a /<^"%^ktDM(# AG/ʴ}TOl2muQ.~ 8?xQ3(UeEB裄>J裄>J裄>>s4׹Nq..kY"0ix2Ry,2ůsDYe>'E QEZ|T?|D9?xQ%QB%QEeEb?B%QB%QB%QB9B%QBU{[\28qg/»e9X,pҏJJ)Ƞ'e!^i([l2mek]uQl.(ˉr(\,'(WŋrU((.KFy-([Bs |'s6 r\8e[x,g 4`ʊ(+LGebwB|D a Y?B_2!}Ov&/H7me}Q2;w~>r[׹h<zD~HGx S@賽 $ljk<ɼH&4 }og( <_Cb D}3yDқ }0B }7ݬfھ[VwnBM軙֛ wnudbDM }7f}uw3fDM軹HOw3fD͈}7#nFɿ.e.pb/»cYl1 cO5e&l2I%z-̊n%`}7&r1mֺn}7&,x,6#nBM }7+È}7#npUn'0fD͈}[w3fD͈}7#nF݌w3xj]l]ֱ,d6Ә1A2zO6D=f}7ݬf}7&݄inux݄wuu3f}7&ݬw3fD-t,O|Mm׹NqCe[xu`1 42q`M&$@|5:2DOL} Oh軻"^w++mnk]w.݅],tB] }wn}w.݅w. ݅9wB t_r[\28 ]leXb2Le`PM)e^"$~E,ìnھw{.}] }w绻XNwW.݅w.݊B] }wB] }w.q.݅wB߽Kr\9!l`+XB0L`#)7KįMw⾻ww~umҷ݅ww~twUB] }wݭ.݅w.p :iNpb+X 9Lg*H3jM/$+bhο7`D>hh+MG[qm}|tE;?mk]t%GC= ]6z oB:^&Bhh{wshG }G }=]nq+\4'8>v c%6sx7bR^%,^$D>ڴ}VGGZmk]ѶEW|=ñ/o-ċ~h׹6E }GC}G }E>Z装>Z装>Z装>Z装>ZkpӜV6-d"3! rJyxd#څrMG[qm}|uѶE;?mk]=GCm}x.m!^FmG}/Z装>nr" :WiNp}f+XJmo2RC9JYH2{пy# A[qm>: +BM>B_ih{Bo!^|'E/^_Bo_~/t?ЧMBo}i$ }6 } x.[{_~cۆ B B? B?> B_~.Oq/B߃H%l*3p2_E z 6FooEmIoAiBsɮ}$~cCτi# Aǘ>ƴ}}i[b>ƴ}u1}nj@c>Ɗi}xA#ٌ}}}}}}}i/-snd 1f(Ceˤ$&̊1#1cl1Z#1B3+caD#1Bmbc>f3F1F1F1cDcDcD#1F1F1F1F1F1F1F1F1F1F1F1F1F1nd 1f(Ceˤ$Ɗ1V}i[b>ƴ}u1}ǸXN}1cDc}DŽlf91Np\n9_S%wupӜ066,as4&1 e}BxtRx^ktD_?[4OL} Oh{iXô}lQk|{{.o{8?c1Bֺ^8BC{}!F_r[|.rf?{&eKXkjþ.+\ '9~M*y`:1~TEB@2^k,iOzbBBCk4+c-ċX} } }.+BB++X݂ }}ǞGc>B9Bo%wG\"g8aml]Vc&әD0!r'LRI!05mk!^싘>Vc>Vc>Vc_rb>Vc]6Vc>vB+[X}c}y>Vco B+B+B+B+B+B+B+B+B+w+B2B+ }:O+B<}Vǚ>ւXX+c-%I"*S@0יT3,fky-ds"W->kjþ.+\ '9~M*yd:1~TRN1I*)${OBiMĄ>B$ފXu>ִ}] 1m_> =Co![w?VGHoo B?Aԇ~ﶪ>ս[qkھ.Vǚ }!B߇{~-Ļz B*i BA7Џu;>VՇwп }O't^&BB?{{{_oo~l4_ ~J}Ǻ^nC߻A_j_CiMĄ}ޏ۽x?jEXkocy<'xǹPNqB Wċ<8[>8{>8Wŋ0w0 ZgDgDxqFqFq0333z#p3v6,3$2 zS@YыD¬^"^ZWZ'qC'qqU8{9}; }l33;}}%bDgDgD'qFqFqFqFqFqFq^&Έ>Έ>v6,3$2 zS@YыD⬸8/fxqBgk]uqBgk]9?g}9?xqVǹm}q^&Έ>Ί8\gDgk]}}Dž.qs6Kr%p#gVw,b ҟj*MydF/Jk'&~/_1pQ{Zqhx=i4ֺ8?ֺp~==G|O{{Zs.BBs%BS{zڞBs/B8B*B6BS荞.Nqe;ﱁ5,0d1a JJyWERIg={Z3,=9{CB3p۞+BK^<2#HBS{ }OY{KG8^X2aLf#jWyl^$$zZqhx=i4ֺVt~u=m|O{{Ct۞sS{ }O/QS{>9y.qs6KrKG8^X2aLf#jWyl^$$|5_i>~HcTQCoUxx+>ފx>ފx }B?xy} }]}!>^>^>^>^KrKG8^vYr`*y c 5TQJ!L:~ B/B/x׹x+7"B/S}| } } } } }מG8^vYr`*y c 5TQJ!L:pF[q_47m_@8Bߟp D¡/UBo!^]W0Co~Hև~Sԇ>muO$4ȣp+?'C?CpW0Cۆ/B?Cߧ>e/}4d?&zbBO>AO{>U>A>A" B`D O؇}}).`D F F F Fɿ.YNqcZa&o2b8K5QD9d"$YqV'da>AJ{>O>A\/A>A>a)B F }'''mB}}}7'''''''''f6,e!sɛLa< RkQ@H2 V'"^ B`>AlK{>O>A\,'A>A>o>ADm= }8%q|7Ԇ}]np(6,g) Ld pїj^rE? 6Q?@_i@]-K4OLBDV'|u0mhk]8&b9%b>' }'Z ODODIDO' }' }7=r˜G9>vMeKybo0ьd0b %EbxF鼌iD+Kq~>ֺ ֺD{'%b>' }'&>Q!.(BxsB(BX%r˜G9>vMeKybo0ьd0b %ExFV'Zh>ъD[O.D%Ch!^$Zb9.|'}^&Q>Q>r>QC n9P%r˜G9>vMeKybo0ьd0b %Ebb 5U i {/l߆ޅrBo}]B_iD+mN'{ ¡_ƃS?;>-_We}},2x^](.Vׅh.eO>ֺ~áw~. ~~O}ׇ ЯG~L}ԇO}{ׇ>mPd¡ ¡/> a'{;Cp`x_8 4SO?$[C>1R>]Ia>ֺ$I}' }'YqdDOڏ'' }}}} 蓌蓌Mɧc>2g91laX21Lg*(П>TPBE&$Yqd>Ɋ>ֺ$O2m$IuI.$IS}' }'m>i;BO2O$##$#$#$#$#$#$#$#$#$#$#$#$M=A-lb+Y"2Le"cӇ J($$+L'YqxIBdk]'O$[L'Zd}I.$I$IB$IBd}}WK.)Ü45npڰ/|\,9A-lb+Y"2Le"cӇ J($kMݿp 5ZnX({ǩ{jǨ;ƞƞz{Bƞz| }|xF/a!^|u嘶O>y0qlk]xO>9*^x. xdO}I>Y蓅>Yo"B,F_)9Ns.Yr39LM&1 ebyH#9Bdd+0O.V'5mK>d{蓝O>U-Kv5}IdOdO>'_Ao{[蓅>Y蓅>Y蓅>Yk?281g?{g%Y<07XF3Re^"d 擭O/h>ֺd+M'[qlk]k'Zl}';?l}%[ɮs,^&Y蓅>Y蓅>dOdOMn9P%r˜4xb+ﱞ,g1tdcPЏJJ)&y4|5^7.j ?gÏc5|3jgÏ=ȇ{?Vc8#~&>h>BO"O>ESS>ESF")Bb>ES>ES>O R>ESOOOqOOЧ|m>C.s}zVgo&h1~TQFo !I /ES,KO>ESS>ESF")Bb>ES>ES>O RCSOOOHЧ}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}}ЧhNЧhNЧ})Bb]-v)Bb]Iq R,K1O /ťp_ ,(7ho29,d)YFc;{aNr\7|Cmؗ|m>C.s}zVgo&h1~TQFo !ho^M>o5o,LA6ozSLۧ}+O>p譸OB8֥C_i8?b9)o⥬%z/hpppp.g@on B?>NCmu}KܾZlBo|i׸Oy)VܧT)Cֺ{B? S\,'m¡wUVׇv^T2(p3p0p1M8+XK8A88B8gBA4_ sC?Џq;>Vׇv#C7^M>}L7޿Q#^{Y˴}/ zYq˴}/e}}/[zB{ }}/%^BK{ }/%^BK{ }2kMɧc>28qfe+xeӘa8O5Q«2 i^Ǵ}/e}}/[zB{ }/{ }/%R=}/#^׫8sle3ﲊ2iLu0A(UrytzY˴}/ zYq˴}/e}P_3QaS,6KYZ6G8.r6jþSn1rs8sle3ﲊ2iLu0A(Uryt|56OPSB>[uj4j!^i,K5mj!^jSOhO>մ}t,K>u⥺*^:6\OTOTOЧ }Ч }=ɧc> 9qqlc3ﲚ,at0`02x2I /մ}x⥚O/ VܧZ:Cj>u:C R]/u،WK.G0uzSWO5SMݧO5uj>}T׻O=sfyլd L3eH Q+IxS-K/մ}xVܧO>ՊTЧCj>T ROuUT R]/oS-KT\j}Ч }Ч }Чp|Cmؗ|m>Cp366.Y0Lg 3)W!k1M>} }|i\6Uӄ>4O4O>4O{ ӄ>Mӄ>Mӄ>MӶ iB&i~H>Mӄ> B&iw47zO|s6,a![x1! Q+iaϧOs۴W1Ojӄ>Mӄ>mЧ }[8?&iB&iB&iBO4O;=iB&i BvB&iB&iBV{+ 9v-l` +YB1xc$CH*(W%O3mҷiW)j3afx<c[>pS"WMk6K>!W8sf[Vc&oH0>TPFK^k4׾4Q A[fھ.PNz[҆cھ.֥zIsUP֡Dh(?"٬@y/F1B4u/ąrҼZfk]iZf~],'UҖ?""?llVOx ݗJ^>CX_&BJy{pdq/_r~("?llVOx ݗJ^&C)M>} }|x-K/h>݊\/݊t[b}uOw~>wXߦm{l ڤ[q.G1O?%ӍӍӍӍӍ荞S WyrdFֲf3Ld<`QE9)I/ݴ}xͧ[q^O.ݴ}xlK7mn}Ч VVܧo ڤ[q.FFgD}}}}}}}}z'\ 9 s=lg+Y*6 2f(GW&Bt[n4n}u鮈n}uӭO.ݴ}=ϧCn}.Vܧ{At/hn}z G9Y.qjþS WyrdFֲf3Ld<`QE9)؈>BM>} }|xFc4a}3ϰ>h>cÊ +3b}FB!B1B!B!B!B!B!B!B! B!B!B!B!B!B!B!B!B!B!B!B!B!3l˰.C3> eXa> 23,p%b^> d#x0cﰂU=(8%p|Cmؗ|>*W8YNpa;[ZVYlf&h1TSA ^kx'VgŴwB?۶e8?Яw;ǰwBЯ2@'x?JoR`-˰;>/ ޶.~x >=[/<~B?0Wz>KXhJoe C?o j}o }oe_e,O1  .r7DABgϴ/Ӵ}1m)B)eZҷB)BiDiDb9Kp~>S3>S3aDiD)B)FFFFFFɿS W y`Xja&Ә0 J(2,4mi}foLg }gֺL[2]6S3>S33b9K/S3>S3 #LL44UFFFFFFFFF.Y{0ﳗlcX29d3PIECx3ϴ>Ӵ}uB)eZҷe }g }}d*^.)Bm233CsӜ7ïڰ/;|U>g9ag/;&ֱe,b!s4&31 g(2( k蟿|'TABggYe>BLgYqe}i,+2m5{賜ϚxYg-EYVg }W˲>K賄>K!YB%Y,z/;|U>8g/;&ֱ,m2La"c0҇j^B /˴}xY%ϲ>ˊ!Xqe}iC|,,˲>,ZfYq%Y^.ˊ,ӜC>K賄>>Kj?p9NrNua9yb:SXF0(<,2ϲ/ˊ,YeYqe4e}Yl˲>,{購j]=Yg }emYB벬,9.q;o ϸ'\.p}mlbkXbf.&2 c }5)$kM>} }|xFBm}|g }l϶.ֺl϶>{B-g }g }g }gBO#.-B-B- |>*psNYrm2LapїjM!ydYm4-Vgg }g }B-ٶeZ-g/@賅>lllC}g }f7}g }g }g }g }g }g }g }-v^6[賅>ep]7[賅>Es>[賝lv>l[첍]8'l϶ /ۂll r(R*?Ch37l6KY6m8iq[|Cmؗ|>*psNYrm2LapїjM!y^k4no A/l+pl+0pm6m?wUlWū giuoo"C7~TsA^-˶>ۊ2\('ۊl+u٦޴C?xuw= Bnhoo"C7~TsA.JeTQ&p/3ݿE Z7vp/CG~{ЯuE}Wܾ 5 B_+?2oo Atss,1q~>5si[rl1m3{sLa!Bb99}Xq#9Bc}}>Lj>Lj>Lj>Lj>Lj>Lj>Lj+>7\'9!l]ֲ%,b>sT&3ь`C%0 rsy +s1mck]u9s&c}i9,d.|}9B#9V}aDcD#9B#9F9F9F9_w5>"8Q]lg3ﲖ,a 2fCO*)7Xc4|9F9VXqc>ֺ[rLCc}iq~>rr\,'+s>Gs1  |-k6+>7\'9!l]ֲ%,b>sT&3ь`C%kz& B>}G>h>B\\ϵ/h>BA ֺ\[rMNֺ\ϝi\u\] }>Wsr] }9>C>Ws>Ws+>7Ƈ\8al]ֱ%,f>sT0ьdK%eUr,5\ rs-˵/w8Zk>w }\L.rr>w+;\uB+B+"\\\\\\ϭ=Q]`3ﲎ,a1 2f$C@_*)7k!^|Zk4k!^xFZk4kk]uBk}i\u\uU\W\׹\uB+B+[|CmW|np9Nqg;̻c%KX|2La<ЗJͫ^k4g> %5ϊ<<<>O#y }9?'y{<<; }B>O荞3pk|Esf?f6,e1 Ld (2~TQF f!^yU yp<ϳ>O>O><<<>o }^"yB'y<<<<<<<<{>O>O>O>ep>O<{><{><+jG12Jx< ϳ/BO>OL } }9?'yB|yA<<y.!q;o ϸ !9)rb:V,`.3y)L` QE%FCz(#k|m~@݋ԅB[WzC?pm3mgk]uuG8p/D[q_P>4wEDŽ~w}ԇ~U>Џ0C_5J)z Bo!^]Má.ϴ}uyՅֺпýЯw[q_ ]1]-_vU}ߩ>cC?W}R B_@8C߇{~837xp; z ?uЯw>ԇ~^пQv`}ݾF)?.􉧮*1O }|xFWa>B|+Gb}FS>|[a};?/|NM }CoDxFcD/FFF_w5>"91sd YjgӘD1 b5TPF1a[_i| h7ϟZ|=|*^;6B/Bo}}}]krk|Esc6,c ,1c4jb-7Ϸ/B|[qo>ߊ|+m˷>|[Ϸ>UwU|Ww~> {A|[C'8y!so ϸ !9)qf'[zV%,d>T&2 g2؈>ć B>E'8}hB ,+0m_ VXq_`}/B_`}XN}}A @ @ @ "Boq\C.qNwY2f:o2qa8@*xb ,+0/BB_`}|/7i/0m_ }}}}-////////K48vl]V%,d>ΛLbc`Ї ^ ,+h@ /0//@ L}i/@ \,@ @ @ Dm}}}}:+>.7Ƈ\<9le#ﲚe,a!tdp3>T^k<}~z Bo!^]/[q_zu.'ׅ~3 CПah诋BB>o]@'{u2>rz xu.Xq_`}]譸 iZWz{zB?pO1. пvˈtۗJ]"¡/' dЏ%7~&/ay;4 !oC FBB>o]@'{u2>rzPS~GhBB `4_h}xcֺBӰB[ /\ }B]G P FW1/B#B#B#z:WNs#d&6,e [Lc H2~TQA)a:?_B+ -+4/u 1 m+t~p).S(B ]p?B_(B_(0/}^*isaְ,b!sxiLa<Pя**(BB /4/BBB m+4m_hk]ZW|=.Sh!^ }x.[򷅶 } }aW.jþ3r\8qp=bVE,do1)g# QE^klDBM>!>8""ꊌ*""+,+qXq_$EV´}/Z9?_$E["/"/:ZW$EB_$EB_$EB_Boq\*iseֲe,b!st0qb(O5Rf[]|Q%B_d4_d}xEB_$EV }EB_dھHL-C苜/-} }El+"/"/"//"/"/"/"/"/"+epH苄H/"EB_$EVbWdH苬/"+}EWdT_$E{ߛr*@31cS,泐%,cv('9p]jþ3r\8qrbZVE,d.3&0Q e0R|5#Cj=SO=դ7?^ OEm#~mTCԯ[W,[Wl4_l!^/~+M }lX苅X/b/b/vb/> } }} } }=g&׹%.p {6ckY2d:o00П(8Bb/Bbb 񊅾ش}Xq_lھXg#B_,B_l} }o0B_,B_,p/b//b/b/ur 8G9^vZV,d.3LuF3!*(X-+hBb/6m_l}Ŧ틅؊b/b/b{苅X苅X]X-+b/b/vb/b/b/zuW|]nr\g8Ql=6,c1 Lx c2|5Bj>Mj%G>ƞƞz{{{qj¿>N={x蝟/6m_~Co!^uO8"zm uuw~x#[{-1Eп C>+.nՇOt;>e}Cڽ;?_lھ.Bb+B?pME8ZWz[B|F¡{Z{/?$7oJCy>ݎpC@пVR*e$Џ'iE8 xpl$<S;CB~oЯt>oWC?w;k?. ·aE?ȇA@c_c5|3jgÏ=ȇI/1/DKj|x%͗XWb}| `4_bk]%+p/ل}B_bD_r#|}}=g&׹e.r}lfX a 2 aH_j($̶/?F%XWb4_b!^%F%VܗhֺKV/UJUJ`D_r /1/}}'їїїїїїїїїїї^"g81g{f6U1Y`*F0rJl+)hB JK,+hĊ[JKl+q~ֺ){K\DK\uKKMI\ns/ڰ:WEpc>lbX;,b>T&11`K ^klDpl=f o͇{c5|A6oRR J}xR/TKԊR/RB_B_*R/TKֺR/R/R/R/z#rx}a;zV%,b>Lfcpя>TPf!^З:?_:/R/R+KTK/R/5m_*B_jھTKtB_* })l+R/R/R/R/R/#rx}a;zV%,b>Lfcpя>TPj!^З:?_j!^ЗZWj|З }B_*Vܗ }З/R/5m_*B_|З }xB_*֕ }З }З }З };þsre.r}lfY fo2 e$D?PFCL(`ottXB_f4_|mueB_f!^i2/̴}D̴}ueB_fھ2/}ЗmC˄ B_&e2/2/2/2/z#r8>lb=Yd8F29?_f[]ЗYWfھL,+3m_6/3m_fk]З/L˄l-B_&e=D˄L˄L˄L˄L˄L˾A˄L˄L˄L˄Ljrcb{f6լ` Ylf2Ld#`чJʜ/L,+3m_&e╙/LLۗZW&el+2/L˄o˄L\L˄L˄L˄L˄L˄L˄qs|U.svMg5+Xb0Lc2H3~k>~PS#/joʨ?}BTc_Ͽ}]蝟/3m_f!^]MۗYWzIXq_z+q/ϗ^],C_kR ~oq_@x{V}觸TQnG0^蝟/3m_f!^]MۗYWzIXq_z+q/ϗ^],C_kj="~5B?۳C?Џr;!/UuC?C?IL%Y^藻{ Bo- +oϪC?ПT;o}FG0#"5FՕ͗[W>r -+7/-+ir{ˍW ʅ|;6FVܗGˍˍ?Dˍˍ?ňOG\ 9Ise'[ywY* lhF20ʍ-+|x͗OƊrǴ}=FXxB_xAr#r+ˏ#FF"FFbD_nD_^)7k\"g9qd+.kXRa!st`2H2~TSn[]|xՕ͗[Wn!^|xVܗ/܊rЗ͗ZWn}x宊Wb9{Ar#r+˽Mע/7/7/wU5>6P)7k\"g9qd+.kXRa!st`2H2~TS^~ωP|Ȋh *hB +B+0m_!B_aھŠ  0m_b9B_!B_B_!B_ak]%B+B_!Bo)7k\g9qsd+V%,d.yLfSn׸%qV6fKxy-2 e4{>Dz{`C5;Xuߴ}}=uMgߤuUFUWW9?_5 *,ī2z+,īʴ}uUW }ջjB_%UB_e!^UB_%UB_%U7**7z[|5psG8>v-ldYR1M`"0T9?_e4_|0櫜h 2ʊw*zUW@諄J,ī6U^B_%UB_u***[|5psG8>v-ldYR1M`"0T9?_e4_|UFUWYWe4_e!^UFUUYq_eھֺ*竄ֺ*UWXNW }WYWm}W }W }Uw/ڰO\ 8)NpcFֱ,eL &21`FCHg`ї6v~hzB_-W[Wm4_= 񪅾Z諅hڊjնU }W }WޏV }W }Z諯#B_-B_-F_9r.qS.c +X"3Lc*x`GuFՃQ8?_m!^|T,īj%Xq_mھֺj~jqjjj}Z諅Z諅Z諅Z諅^jjjjWǫvZ諅Z諅ZMW[y_mT_-B_-B_m}Q}yծWmT_-B_mT_<}} 1L` Sye!KX*.ﱅe?8 pK|unpOo [|upsG8~v-ldkX21dSeCD?|5C=(} Akkiy jLXq_6K1m_c}}}}}ZW#5B_s7z[|u>8 pf;[:ְe,ftd3 e0 s~hFkFkB5V׼}}l˩9ЪM>N;Cl3x@9hs9' Ig6[K]A>}UW-\*~u"O{"O?'BD"O?'B6S ^&ꨦR 'tRI$x|i'.="O?qxOퟸqč'BD"Oxy"O?'BDѺ'BD"OuGCfc1dt+^DTRJ!dN*CkL|QЇC}81'$`mE'.=o=ZGtB_+»cI;-4'oDymMO?q>xO\{bm'C{= _YgM] I;-4'oDyGsH!B7F;]!=luC)!o{:i>-49Ocǿ}8ЇCG#G#|PND""\ċ(k7#~4"^i>n#|XNˉp>1p/b0G#L&}>Doz5r>l"L3(C^A+/*(2I'xbyFD|ʉH$"\ċ(k7#~4"^i>n#|XNˉp>1p/b0G#L&}>Da0G#L&}>DCs">Op!/x#|hN͉]ėtKꩡ2( LI&X|>4r"£u"LnGx.>3>,'|Oŋ.E6~DmG}>Da0G#L&z!SgMVYdiewk:h%PEEC&$O,^{toP8ЇCC}H|$L.EimYnG!B)B)B)B)B)B)B)B)B)B)B)nKN9dm6Yeyg!O頕4PK5SH./ &2|i>|4\ċt/>R#ݸt>R#_"B)BُG }G }G }G }G }G }G }G }G }G }G }G }G }G }G }G }G }G }G }Gy}}> 7>҅H"M.E:4G:tNđDdO!TRMMtG?0$̳:1\r'|KN9dm6Yeyg!O頕4PK5SH./ {_T8ЇCCer>er>i>|(|T.E\ċ(zG }G }T?B%QB%QB%QB%QB%QB%QB%QB%\s)&,242;5j#LRI$BG棜G9J|(|Te\ċ(((((((((((((((((((((((((S} yQ.E\ȋrNerN>T>93b't2ɡ"ʨ:x+:規~aIfgu6ecιO| 5r>l"L3(C^A+/i*(<$D{|7?(páj|i矚:|ixO]{j"S6ӂ rt)\{s{z BT S7=K8Xcf`a KB#uRI) H"< q>4SO3p>SSc"S6ӂ rt)\{s"-Ϲ"SsO{"ӯ[q \r'|K8Xcf`a KB#uRI) H"x=ņ>Gc}ޏ̾}[>(czz١igg知b|?gB&τiY+gn?4BL 3&τ?gBL 3v#\qK,0c }tWDTRJ1E:$˳LϜ?s>,τ?gBL 3f֊iy+ZiZ*)|r"d{E?;l6?{>ѦhѦhBGmm]B.Eq-B-B-B->,'>zC装>Z装>zhhzGn#a5X`Iawk^JBeP@YLqD86G;hh]ċ>Eh7>Z装>Z装>Z装>ڇD[G#B-B-B-B-B-B-B-_n#a5X`Iawk^JBeP@YLqD;6G;hh]ċv/>Eh-B-B-B->,'>ڇD }G }G }G }G }G }G 됏pGk, 3 裛׼&*(H'$^{,k g}}܇>4#1B#1iEbL1}}XǴamѺט}}}}}Л?rgq["L27tN UQJ!dA I"1B#1.żEbL1.}}XǴamѺi1B#1B#1}}}}}}}}811B#1B#1B#1~\m}GbcE;m4S/TQF)M)$ڣP8ЇN{gE" p﹋xM˨x]{n sa9ϭO υ?_E?zQ Wq;l22 -o袃W:"!4RHy"sϳp﹋xM]{^s񞻈4B܇<ynm܇<B|U\{?B\ |B s.υ?B܅~s??ByCs[?9υ?w!﹩ y]{n}.=.=w!﹩ yϝ?;#2"J(ZhW^0L3"lpėpG6,,L .:xK ("2I# }¡%}{u>|B+8u>+B+z\ċXX7cݸXX>vXXXXėwpG6,,SL 顛^Fꩡ2'B"!cݶX|XX5Xb>Vc>֍X7c>VcXAc>Vc>Vc>Vc>Vc>Vc>Vcqgq.۬"L1{觇n:xK (&\^F :u>Vc>4|>| }ǚc}}xB+B}B+B+BSb>Vc>Vc>Vc>Vc>Vc>V}_qgq.۬"L1{觇n:xK (&\^F x=GCK>Cg8qrp>'qq.U#qB'qq} }} } }K} }>} } 8Cvfec 3 M'H=TRN1E:$bm'q|>N\ċF>Ny }} B'qB'q ,!qB'q"qB'qB'q_B38dmYf9=C OtN SK%OYJ"qqB|>|i>|Yǹ"^ }Yǹq'qB'qq88s>o>N>Σuq_9+>/!wpG6,SL!駇n:iFꩥr',I%C¡%}{7ǻm/8|x|D>ލxMX{.ޣux|g>^> } } } } 8CvfcIFbzyk:h~ J($l2I'E>sq>|>4|>w>Ex||]x.ޣux|g>^> } }ǟ B/B/B/B/_9dm6Xa9d!7VhB&tw>^=?|>4|>|i>|xw>Ex|xh]i>^=C|>3B/Bs>^>^>^>^u7\q1+,142 tJ BPH>dN2kN_ ģg~Y?x%Op>O0'T" B"^x B >AG>aOOp/A>ANO7=qgs.lL3(^A+4 TRJ!I:)$8Op /A'|>AL }'"^'}B7.%}'y'},B B"^'}'" B B B B B B B BCs>A>#v B OOp!/T L .%} >A'F:YQ@1TRC=-gIfY`5fCN|K7\q1+,142Lz5L#PM%R@c-=__lc3=׋'z3=bVz_}鱯豯{GhOOD>Q'>|' }}b'}B(Bhm(B|>Q>QwDOQ| Ws! K3$c }Nh:" bm(' }bMBXi>Q>>OD7>Q>>Q>|'!;}' }' }' }' }' }s9d6Xayda^I4RG5QD >|DODDOt/4(Bhm}' }B(Bhm(B|>Q>QDODODOD}r Ws! K3$c }Nh:" h_/P83#gF>{=~fCc_gF>{=~fCc_gF>{=~fC>4$I$IB$IB"^/}I.% }'$OOB蓄>3IB$Iˬ!IB$IB$IB$IB$;ncc VXfic!G/]tK*(\$O2'9O| q>$I.%Bn'$IB7>>iO$' }'-#IB$IB$IB$IB$IB$IB$IB$IB$I_ag)fwK&ꨡ2)$,2I%ILI瓄>>|$Or/|'q"^' }}IBdmѺ$O$' }'$O$O$O$O$Oz!wp9Y䓝';O.$;O6'\i>Ed_Ӄ'qlOQ>Y}XN' }:B,n' }'dOd;nccMVYfg!n^ij*(|yA:!E>|d|rM.%шx.%['C/n'擅>y >ه$ }'#B}' }MdOdOdOdOdOdOy>>Y}hNId'{>YݼO]'lOv>مdS}sdM铝'ꓝ';O6'[';O%R@eTRM4F顗 1S̱2lrė;nccMVYfg!n^ij*(|yA:k¡>?,IM)KO))8O|O1ͧ").>ōO7S>>OOOO#>ES>ES>#p93L3觏nh4 5TPJ1E)!)B|>>4RЧSϧ}J.}i>EOCS>ōO3)Bbm")B")B")G}%B")OOOq>ES>ES>ES>ESL)B")Oq>T")7S>T")SL)B>T")SL))idESF5K褋 0L2K,;p)\| +9=vdeaqF&@?}tE;-_R',2^{, >páT|}i>>USp>"^i>USiBS]KTO>OTR>US>US=Z*B:Ч }Ч } B"^Ч }Ч }Ч^!B*B*B*B*B*B*BYTOTإ }B*nާ }Ч*S>USӧ }>9}}>USyA6yQB9PO/yE']; 3$̱ lGr̗;nccMVYaY= Oo袝V^/PI)%K6x=C}8?i4D>ii8Os>&i4ҜϧYۧ[\KOh]ЧM!i>,'Mӄ>mOEӄ>Mӄ>Oz7\s G&k,L0 頍(Bi!.᥉|ӬLi8O4i^"^4k4Ҭ"^}G҄>mi|XNЧ }"iB&iBvЧ }Ч }Ч6iB#e5VXdi&eAxKtF M USJ!y4D>ii4iD>|4Os/|}xiinܧfmѺ4OO4&iBoӄ>͏M4O4Oz>%9#e5VXdi&eAxKtF M USJ!yGC_AЇC}8}i>>]ӝϧ }z Ӆ>]yxBnOt|z?B.B>Ч{>]ӭӅ>]ӷtO3>Oz7\s G&k,3L0A觇n:yE+M ՔSFEz}Ч;Ot|zӅ>]ӝϧ }xBnOt|z?B.B>Ч B.B.B.g}Ч }Ч }Ч }Ч }Ч }I.B.B.Bn}.B.nާ }>]Ӆ>݅ttO9B>]]KwNn}nOOwNI6PB v規~ 18S02+l.q%|3_BsN8b]6YcEfaQF2@?=t+Zi_2', ? >pá~3L k |>cu3>p/C3ܸ  k 73>C3f XE3>C3\   7=q5p>l*1$'; f (&<0gXg80g} e8Zq/C3ܸ  k 73>C3>C3>c]\        ?&C33>Çd}G2>>C3ܼ 23>C3>Å  pN!3>T!/!BJ)ZhV: }`3 ,rg\r>%9#e5VYd&=AO/o4@TPF1䑅ڣmP8ЇCCiL|g:r>4)3>EL4g }}gz.S3>S3L)B);"B)B)B);ng-Ye9fdyG?5LuPI9%G6!BiLBYg3>|g!LϴLe }g }}gLLA3>S3>S3>B)Bk9}vbUcIxOw^N4PG SByd)Lt>)3>4)3>EL4g }}gz.S3>S33>Ӈd }g }LLLLz!wr9'.["s0 ~zykiꨡrJ( l }M¡>p"ȿ|ȿȿp>V\{" " 1x/_qb1п!/6{cпzQk.8}bUg)eCF J)\^Xۿ/ϿXۿ_4c ^ ^\{am{!/f/&BbqпBB_ !/пr 묲ȿp>k37AFeifY`U6aC9k>/!wr'[2 `>z袃WHTQA)EڣjP8ЇCC呺,k,em|>K*,>|Vp/K\w}g }g泄>3YBr>K賄>K賄>K賄>K賄>K=v-\p1:k,1,S30G/]th" %+>ˇdYg9J>m,r>e,>E,zG,2g }g賄>ˇd }g }g }g }g }g }g }g }g }g }g }}g }g }YB}g계>T%YB%YB>K賜gYg곬ﳄ>˥,ϲ!BJ(i%m5o襟wa fed=9Kgq5p>{lK32LwK&j*)Br^{, >pá~M٦l϶6gW|>[賝g }g#٦l6g }vklh]g!B-B-B-B-B-B-;nS9`mYcybQo饛NiFꨦ2)$kl|g[g泫p>-糅>[l|g泅>[賭>ۣuB="B-B-B}g }g }g }g }g }g9f5g)eA^餝Vhj(Bȶ6g }}i>>|g;lv/[MBml϶le }G벅>[賅>[賅>[賅>[賅>[賅>[賅u\s)6묱#9q>c9\r>'BѺYDs>Gs}!B#9W}[cc Xf9ga >餃Vi(" q>#9q>c9\r>'BѺq>#9B#9B}}}}}99B#9S}s>GsL9B>Gs>9}8qNcq)/cvRD)T 4+:袇>0{Ƙd9YaMvcθ|K\s)6|\|n'.s]5 }0\u>>Wsp>+[}!B+B+znS9`m6Xcf1F5fꩥ J)k\ϵϵ|\N\5纈kaLB}}.|>Ws\=\\r-\p1k,L0A76^L=PA)%km+"km|>Ws:5:u/4"^i>Ws]5 }B\BSr>Ws]\\\}r-\p1k,L0A76^L=PA)%hiY}8ЇC繄gm^YU#yB} }i>O>4'yB7 }yB'y}T<}>s>O>".q5rl:+,0  -4/PI%bm^YU#yB} }i>O>4'yB7 }yB'y}T<}>O< } } } }9<ϳ,}ܼ>O ( &iN-dQƙbyXe-vcι⚏|K\s)608 2o顋N^B3 B QB!kM?*pá7 }[ }|>_;׸/.>_MB/B/B/B/B/B } }Л N9}vdgIy O]^HTQN)E}[ }|>_;׸/.>_MB/B/B } } B/B/B/B/B/. }|/B|| }y/Bo|vZxI#uRE9/"om/B|>|;w>/]|MB/||||||z9W\| k.8auVXd&=C 2@?=tvZxI#uRE9hKj)?0?o=W "_`m_`m_ |@ 8/0t|4_|@ \+A ܸ/ ,cm_ >,ھ@ @ @ n;nSN8d6YgEe F&;襛.:h&j*(k///_p>_   p>_`/p>_ .0+/X`5X}}} B_ B_ B_Cs @ O+///0y_   \+ }s/p)T_R^}W`}_D)TQ/4^I=eA0̱2kq9W| .8CauVXdY&`ac^颃6Zh_r^{, =P \C_^}O+B/: }}B| } }W|~_/B/\Ç } } } } }лv-7\r &L1( `>EmLuPI9%X$B/B/|Z:/4 }aB_(B_"^{B/B/B/a9B_(B_(B_x } } } }KN9}vdUX`)&e! 蠍Vi*)BkBW(B_( ھ|iP P P ]+t4_(B_(B_(B_r P P P P P}_q r!,,SL00C7tA4@5TRN kp̔7g GO/2 }Yۛ(걶/2 } }Q7.Y }iH苄h7ܸ//"/"/"/"EB_t } [ngM6Xefb1F"}N^J3 SKR"E"_dm_dm_d/ھ4_$EB_$Ebm_$E"/"/rȍ"k"/"/@苄H苜 } } } } } }ї3N8d6`%eIan:yE+4PO-UTPJ|}}iھھ4_$EB_$E\+/"| }q_}} } } }9/"/"/"}r-7\r &L1# `>M'hꩥ J^{4_ >?{> o@݇X䋝 }]+6 } }bŦb/E]+b/ X苅أu+ }B_,B_,B_,B/wr%gpl*K,241mzj2C }]+6 }qB_||iX苅X]+b/ &b/h] } }B_,B_,B_,B_,B_,B_,B_,B_윾Мb/b//vb/b/b//v!9} }ꋝ;/b/bS}Ky%SI uD mtE7 CgIfg`=8s#r-7\r "sL3# o顛N^K**){л#O~P8ЇCe//k{|I#%"_||ȗ|x%"_"^(B_"^x%//ć唘KDKDKDKDE[n9`-6YcEfq3  ]th($ھDKKKDk/q>_|DKЇiE/qd/E|З}ЗlrJL%B_"%B_"%W}З}З}З}З}З}З}ЗK00L0, ,:ǜp7|3_BK8vb5Ydi= ^EhFꨡr [GCK>C_^iTK=/R///b/R/utIR/R/R/R/R/=+TKޥ;n3N9]deg)yAK]tN+4RG TPb/RkRk%B_jm_jm_*Kb/R/uER|З }З }З }З }З }ЗrЗ }З }З }З }З }sR?ئTKTKTKTKݼ/uTKTKM. }З }TKRRR/R/u)*yI =aIeEVXg9S.↏|Kpq.[l23g 饇.:hfj*^{4>AЇ>=З˄Lˬ}`Ǘ2/kھ4_&eB_&eeB_&e.╙˄L˄L˄L%[nS8`m6Yc%a F! K7J3MSK x=쒯 }qcTjn???z\˭Eھھ\˛q \˝ϗ;/7͗[ۗc/w>_.]+iܸ/7͗ }З };}-/r/\Epql K,04!-}5f*CEھھ\˛iE˝ϗ;/7͗[ۗc/w>_.]+iܸ/7͗ }З }B_.>ھ\˅\˅\˅\˅nS8dmXg%e xA>^B3 QK"_nm_nm_._i衏~=L1,[!'r57|3_B q묰L3";^+Zh:j{/?S/z11D}׋Y'z}~Ǿ^W~ǾW_gWi_a k k x}W8p>_aLB_!+B+f p ]B+B+B+B+;>p%r!{l:+,,3L2(yG?}N^K1W}}}WXW!+W+b|W}  7+ܸ E+B+B+B+B+B+B+Ϥ    0W}W+\ȫ S}s   S}W}KyB_ *jyItM/} 0HFgXd56b}9 #rnS8dmXgeeIe 觏7t+ZxI#uB5kPL8dp<^}^?J|W++R+[hC+++ھB_|4_).U+ҍJ|W }}W }}W }W }W }W p9ql ,0 10C-=tvZizꨡ2D+MB_)B_)B_im_AW+EJ|WcJJJJJW }W }W }W }W }W }W }W }W }W }W }W+W }9}W+++žR++﫨i^^Ax(L3_eW櫄JLUB_%U***yJ諄J諄J諄J諄J諄J諄#B/ Ws1묲"s080DC7頍iZB\«2W }*|W4_%UB_e* "UB_%UB_%UB_%UB_%UB_%UB_%U}W }W }W }W }՗O|+9CauVYf9fbQF"o顛tF 4PG-U.U櫄|iJ諜W櫄JLUB_%U***********z! Ws1묲"s080DC7頍iZ }FC}8bXxE4_-զj|Wjkj"_|:WW-.UW-ճ, nWq_-}>ZjjzQn39b`c)&= ~xC74/TE4_mj|u;"_mm_|Z䫝WEjvEjevڍjF諅ڧU }B_-B_-B_-B_-B_-B_휾ZM>4ZM՞jS}W }Z諝WꫝW]ȫ6W[W[W}}}W[W[W}}}-u4L mnzxK?f1&aYaM#N8kng|7\ql 1ayG?}N^Ki GC}8}|Kx5iEk:p FkkD| C85B_#5B_#5B_#5B_c=FkFkFknwr9gs>;l+,2,L0{FxC7F M4RGMi%|׸W#5W#55"_|ھFk}1}B_s}}-B_qFkFkFkFkFkܼqFk\ȫS}טk}FkFkFkL55b_czi6:袛^`!FeIfeeVXgm8θ[>/!-Ws1G6"2g 7tI;mD#ux=Ԝ >pá~kMB_kZkZDkkVkVkZ|׺W+s} } } }!GX }%B_+B_\q.l K34-=5f6DkMB_km_+}} } }0#kEZuVkZZCھVk/ZZr9gs>l+,1L0{F`״iZ5 }}ZZ }} } }iVkMB_"^׺W+B_+B_+B_+B_km_+_/斏|K'>pq&k_gs>_y΍:h] } } } } '>pq&k0gAO/=tI;mBLu"_g:k׈|}}9s>_'uD|:|EDn7넾ΣuuB_'uB_w } } } } } }t:,}י넾N넾΅:sN_B^9:uu::׉}Kyu:3Y׉}}Fi =ew=L0,,*lq\sG>%s8va5VYbyfdQ3 觗褝6^LkM8}8ЇCBo|i>uЛC:kЏmM_Л~!Џ=~!=ľ!oy}㯡7yv4_gmyk:}ME|}G6/mM_</AB?Bww?!-oOP8ЇCC_oz|[ }}כ녾ھ^녾4_/z&zzz7MB_oD_)&z}x&z}rgp:k,_ozz_D_/&}Lǘ0׻Wo7כM&z}D_gכM&z}z7Mn;7;w!T_B^ޅzzS}}szS}}}ޣvzg 46餋z Q&d9Yb56f}93.ᖏ|K'>pq1묱"2$c2LA裗7W&2}8ЇC7|}7X7X7oX]7|7}7}op> }7}7}7}h B B rp{:k,L38dw7tI;DC}7X7X7 B B|A7}}7q B B Bp7}7}7}7}7}7X7}7}GAAA9}78o B ľAA7}}#/itM}`a30K&!ǜr%7| nsN8=vb5YdYdQF2;褝VZh{ǧ?(páoF|7Z7E4oot>(Eq ot|iQuQ=Z(sQO|k.8cc-6Xg%c)&=C [z見^KCL"hmhoF|Dھ|7:oo1DEFFotQFoh]7:oF|7 }7 }B(B(B 9Ce Yaf xA颃WF|7Z7E4hm(E|}7(.5:o47 }xB"^7|G|7QQ/!-\p .[l K,04SL0{Mx=GC}8?MLM"dmdor Iz&|}7Y7 }7#MMB$M.5 }iI蛄I蛄ɣuMB$MB$MB$MB$MB, 9Ce YaEa y0C^E'h|7Y7\k&|S&k&oo&ogk&o&񚄾4$M}7yI蛄I蛄o&o&o&o&o&o&o&o&7I蛄ILMBB^7 }I蛬ľI蛬ľT$M&or)TdI+mt.z裟w 2c34,2kp1gs /!-\p .l K,2 L0{".:yE-x=ؔC}8?ͦfofkfofkfo67 }}iY蛭훅YMB,B,盅Yݸofofofo+Y蛅YMϟ-\p).l*K,2 L2( 1n^+Zhfoofoo}}iY蛭훅Y蛧fofov>,B߼7 }7 }7 }7_!B,B,B,B,B,>Y蛅#vB,B,n7 }7;ofooffoffoffo67;oofov%m.-2{gifY`Xgv9c8n3_B>[S9d]`o|YbyffqFfA觏7tv^тڣpá>ʾ4"--ooC[[L-"|ھE[&-[D|з|[|GZE[|XNз}B"-B"V-\r)'l*,1,3L2&H褝6ZBL-"bmbok|ȷ `o--"2ȷ|E[Ϸ}ȷl -"Ѻo"-B"-7}з}з}˗r%r!&2$a-Ni4"--oo1ͷ|}iE[ϷX۷|oq>|E[Ϸ}ȷ"-"Ѻo"-B"-B"-B"C>[SN8d=dUYbYfd13L7tI;mx=GC}8Л#oo1G4C}C;} |oBMbkG ;}wx}kM7ͷ#o}(E>[>z?&;߄~/|oBίB!^_݇P;"BEЇ"?B(OkЯx菾 7_& ߄~!~пx~}W1}8ЇCз[U[]kVo-Bjmjm*Bjm*B:}з[Ϸ }D}D}DjoDzDj7=#\sp>{ks2$2觏^yM'}ȷ*"ڋ}зZ۷Z۷ }зZ۷ }з[gV}Vo5ѷ[ݸoD}DjoDjoDjo5ѷ[M&V}Djo9&V}.䵚[ݼouNjou!9}ՅVS}}}Voo5շ }}TR^tEeAa &ayYfu6f=93.[̗O|k.g`Y`YdQFbK7G'_ }臊ly?k=CQ_ f>sDھM۬۬ۄM۬!mB&mۄMۦYھMۄM6]MۄM۬ۄMۄB&|K.8#c-6Ycecig 3HxM;m!mBfmfm&mBfmB&mۄMۜϷ }з }}з }ȷ&mB߶з }зY۷ }з }MۄMۄ9}з }з }з }GڄMۄMۄMۜӷ }з9o6o666o666ooo6oE馇^yG #gIayXf 6f=9s./!SN8=vb5VXf9ffqFy0-״hP ikv+vov|}}i4ھ4.E=^p]۝Ϸ.B߾kvo }з }зoz+O|\rq>l:%5\p)G.[l*+,23L3dwB"Q[ÿO??țMi>A~ iBom>y(?C b C^BC_PM߇4 4nmGBxz ~!߆~?[O~!!PпP1CE~OgBoC-A'؇B?ׁz}׿1ߘC}脿Fap6!+|}w}}}iھC;L&B!&}ãuBa0w;L&}&z'>.S9d]b5VXbyfaqx0C>zxk:Bw}iʾ4am!B1}iC;DamaﰶXDap>!Ba0w;=wDʾKL]"e2w|0.2wD|w-w9r>%].u%]Buw }w]"]B%]B#K9Ccm6YgeY`Yd1F&HwG/o .+.2w|i4%]ØD4e.]"|KVp>|K\rK軄KN.x]B%]B%]B%]B%]B%]>Kq)\r-3_B>p%r!62,0,L2# $;飗7x=5AЇ>=7G4eiφ>EL>y5B&'!+=K3!{7G4eiφ>yk.k.EޣuПoCL?~CP E~?PYf7>n7~ſg!&b?u!^`ȯEoѳn?Ѭx]iʾ4}w }w }wھ4mmmmmﶶnn6wM&nݦCܸn6wM&n}DozG>ps Gl+,#={G{G{N"G>ps G.;l:,21C 0@?}|}|}{DgqDھھG{{DھھG{q>#={G{G{G{G{G{G{G{G{G{G{G{G{G{}s=b㜾G{{ľG{{{ľ Y}~}~}/o=331"K:lr)g\p5|| G>ps G.;l:,21C 0@?}x=~GCO Gca^} >pápá+M'NYwM^+^|KxV^z{M^k^k^|}iھwu{{M.ku=}Dk5{MO|7\q9gr6l ,3L38cg!yo 5keku ھ4km;iھھ4kmkﵶﵶ5n`mkuE^|x.]`5{M&^}Dk5{M&^}ׅ^zM.kﵾﵾ5ZZ{{M^^^S}}} ץ^S}~Ky}3@ C0L1,,2;!Gp%;>% W\rs{&2,0 L2fA1[_C}8b'!n~v(}"gm'}}>ﳶﳶpSnb/IDATqOOOOo>>>sD3}>OO^T?ps1G.l+,s03 ~BDھھODھo>>>>>>>>s. }>>>>>'}>>>>>>>>>ﳾﳾ>>>ﳾﳾ>> A=c32K,:l.r gs7;>% \q9s{&2,0 L180L{¡>p$/"o7|i4/|~w>/E|~|;~~~D_?"Bor+.8c8`-6YgXd^'`0 ~7E4o~|;~"|_;M~B/B/B/B/B/~~rGn 9#{uMYe%gI&=# 1HE_M~7E4/E|;~E|~w>/B/B/B/_3_B>qGn 9#{uMYe%gI&=# 1H ~P8ЇCo }(~}M?z}M7лwyB! }(_:'B?>~k! }(~}M?z}M7лwyfB! }(_:'B?>~k!~P"B?ȯ~'? }('/?~ܟ6aؿC}8?L"OLLc0i~~`~@~@ܸ0L&~D? w|k3N8}a5VYfc)&g0D!0D1~@~@~~4?`m?`0~@~~D?`D?`~D?`0L&~D?~S~l*, k "}@XB"X> |}}@Bor+.9}vfMYceY`Ybqx0C |@i>`eD>`maXD>`m}> 찇}> }@.> |@B> }@Bp!/ }@B}9}9}@b}@VgX>`> bQƘ`)fcXf56d#9 .|;>r5W\r's ,&묱 K,0,3L38c20A%AA4~p~P~PMB?(AA'B?A;>r5W\r's6*+,<0$170{0uifcEYa56b^Ϲ|;>r5W\r's6*+,<0$1>{A}]4GЇ"o4>[{лGЇbmObm 6&S~=P?~>ABaPǙ$_CKP6"'?ЇbmObm 6&S~=P?~7}8ЇCE>h|4MA|>h }PB4MA }>h'}MA|P&>h }D4?bE3w|3N9Ccm`^Y`Yfb x`k04i>(AB}4B4MA }>h'A|}4>hB4MA}D4MA}D4MAMA&AS}D&>h}tN4M" 3 SL2 { "4>(AkE>hm4MA }44MAZM>r gs|3_B>sGnK.88=vf Y}ue)&`z=6GC}8?&aaaaakagm?,"?,"?lm?lm?,8{B?,燅~X=C?,B?,Bork.{=c9`]vb x]be)&gQFaaaaa+{"?,"?lm?lm?,B?,G=aB?,Þa   9p![lڃK,0$1"?,"?,"?,"?,"?le;ˬ:l{s'μ^p|3_B>sGn^O9Cgd+^Xd9faIc w~P8ЇCo }(VE}C7>K~m}C5țCiw>W 5WP }(>oBMb CC~7mC}(Ci_kCE4PMz?|?}(>_C7_&~!O?~ؿ}C#P>9~ _kC5>>oB&WP }(>oBMb CC~7C_w_ >pá~GL#g{=1яЏЏ1яGL#&~D?b1я|D \q9gr.l:k3,L18c2b{g{V#"OGLD~~D?"#B?"#B?"#&ЏGL#&~D?b1яGL#_B>sG>p5W\rs!6[l,"14SL2GDw&z0uץ+^lxdvC83.knG>/!#+.9S9}e-6YgUYbye)&gQFF~QЇC}8I~TGM"?j5ɏi~~TGGQkQ+{"?*"?*"|~TG~TGϏ zSsgn\y3N9C{u-6XgK^ye)&`5ɏi~$?*Q+Q]FGW'"?jm?*"?jm?*9}|~TG~TGϏ Q8z\s-|W|K.88䀽;^buXyuYfb ^{lu/ׯ?*pá{"?&c&1g{&11ȏDŽ~LLcB?&cB?&c1;4?&c"ODŽ~LD jgn\y䂳'^9}a-6`UVXfei&{ȏI~LDI~LDŽ~l 3͏ ЏDŽ~LDŽ~LLcB?&cg11'c";#yp x=cmd5VYaEg|0uL1`ƒ%ˬ:l!Gs\>z-|W|K.8{p#gb XeeY`YffWGCoپz쇢ޏ̾}ȇX>zk? ݟ }(ՃP ~݇ЇbkB}(K~O=~ț#bi~4y}C7߇>PME>[Q\CPC P 7}}(~!؇BP羉C'#?N(!ӄB?oB}("߄~!Їb CC&S?_ o (wv لl~i~\M"?.q{qqȏDž~\M"?nq=7яam?nq~D?nq|p9gr?6[l" 3 L1xi~\M"?.q{quD~4?.B?nqЏ ~D?nm?nq~D?nqiw>s[nzp3N9Cza-6YgUVXbcid4?.qqgB?. &[lp)g\ppGė_}rՃ q1G`l:k,03L3$kMGCouR >?ؾC?)BIIIOIOOi~R'EOZO O#B?)B?).M O |p?8z1G`:k`1`L"?)"?)?iI4MD~R'MB?)4H:+"RY<bx$@l%$1C@a#D1 %tuV:2*+3+} 9D51c @,ܺ7\S_;}\eH6o#Hv: ۈ6n#ۈ6@!Mh@2E(@r%EL&$%F\ *D` `B6-)b`29.E(AP:4 -@zЇ=ǀq!Mh@2E(@r%EL&$%F\ *l? *zh L~.ހ H~ɯr~ѯ"y*_M_E$o_Et~W*_EHހ ~ѯ"UDO, =@ZЄԡj)KPB؆-HCҒ .l@ ! k;@_E\_EH@'WWɯ tH~n~ѯ"y*_E~aA_E~ѯ"}Їt -hBP%(Bv!Y؁ l!iIp6 5X5D,Q 1kI7! )زdBr](Z T K(t =Þc=@ZЄԡj)KPB؆-HCҒ .l@ ! k;~6S? *z=ȫ=ݼ<ݼH^77 iy#y/A]D;N5+}Ί^d/D)+M/{'B_ыy#yy#z@7oDO7o$O7?"zy#y刾;A5+}Ί^d/D)+M/{'B_E  ioH~|Kĥ;A5+}Ί^d/D)+M/{'BC׃^k`#>#>B'A:  |Nހ#H>#H>B7G#> tyCe|#t:} Cж4BjP E(.!k-HC Æ%F|F>#t  G H>#@|n>B7A$olp>ޟG#t:>Cж4BjP E(.!k-HC Æ%F|F G|N>#H>#H>B7g !;a PTUK؀& B0Cж4BjP E(.!k-HC Æ%F|Fd_?`QTzWk L7 y_C$א__Ck~-~ ѯ!5$o_CD׸l_k_Ck~ ѯ!z* =B"65KXda2 [lZĻ1X k$& 5$o@kH~ ɯɯ!55D 5D tkHހא_Ck~ ~ ѯ!5D@zЅElBj %(Bv!9d` )شĉwab/@ /Xb KMHB ҰېBv-EbR!Vuh@ZІt}s ]h[Z&4fP"`,@a ҐMKx6 DlO/^*z9DO7o$O7oDO'oы'y}X"zy#yy~.ы䧋3Fu+^^d}Ҋ>A${#zy#yy#z:y^$/8ɋÒEs^$?S1[WEBX"V $ٯ~Dw-"z$/K^D/ˌH~;cD_Z;ً腰Ea'IC_ EEytG|G|GH>tQ$"(G}n>H>J7EQDEQ:(|Gt:(ݼ>:(7#Ta}A:І4uA*Pda2 [$a▻Ęe|G|N>H>J7EQ("(|Gt,G}G}>J7EQ:(ݼ>J7oG; tQ}ЇtmhAPTe(A yAv ۰iHA6!nKY։Q$EQ$"(tQ$"(|n>tQ(|n>tQ.G}>QDߧMK؆,}c=BЂ&45BP"`,@a Ґ$lBrfuEQA^E50]ހ H~:7 u$ב:__GH~ɯ#u$ב:ב:_:_GHeu$ow0> hC -UbR&-bޒ#fa2 [$a1Xw uɯ#x_G$ב:_GH~ɯɯ#u$ב:_:_G\_GH~l޳;H~]@Zn+2h)1 ;m؂4 8܅ arlS4q !;a PUAЄ-]b2 9Ѓ.t -KXTKXyK6lARMH@ĀlO-^*z颏| cH>ct1$C1$C1$C1$o[} } } } } } :c= cЇtci&-5b*Pda2-bڒ"nZ8܅ 9| cH>ct1$C1$C1$C1$o@]@DC1DC1DC1DC1DC1!z!}Їtci&-5b*Pda2-bڒ"nZ8܅ 6.!a !;.-%b*PԡMhA:Ѕe@s ]XZD uKX E(.!Y؁e1waCl_S ׃^k`ϒH=ݼHn~(z'y'zrDDߘSd<' NNF$D/EO7?i؂md!g% (B P*Ԡni[6]A0[ĎMlAPT-bR$`,X2-K$lBpWO,^*z颏#wH>>> H>H>t$Gq$Gq$Gq$o@q$Gq.Ǒ}}#Ra}K؅MhXTeKX󐃬em؂%Iܴ$qH>>> H>H>\7 8#8#8#y#8s> Hހ>>@#vmhA:U@R",< k!f` mI7- bܐMHB Ұۖ qeX" Zj:4 -K(t}coЁ6 KX*Tl) ]br3 [$~6=zZ(*z=ȫ> H>H> >H>HހH>Hހ>>H>HހH>A7@D@ D@T@#vmK؄ԡf˖ص9d,-HC MbH>HހH>H> >H> >>H>H> >t $o@ D@ D@ oЁElBPTeKXZda2m!I&1a؄$ m"nCv k KX2T 5C$ K؃> `1`ܷ]@"6uY*IJD,Bv-yb6q Ґes?%O>`QTzWk !z'y_}w%"e'{'z_Na;od?/z_};?sW/{'ò/z_};?sW/{'òW?s'DEyt'N>IDIxO' H>I'DIxO'|N@77'tI$ݼn>I77'0GZ:6iiPB,CR$`1k!f` mI:$]|' >I'7 $|' H>I'DI:y|n@GO't$|n@GO3GZ:6iiPB,CR$`1k!f` mIa -d-9bv`)KPJY4mK؅Oco -hZ:ԠjP؅%GZv؆-H[R̎?|rATzWk L} | | ɧ| | } ɧ| } } ɧ| ɧѧѧ} ɧ#Sa}KصtmhA -5b*2EK yKX[41@)$o@)$B)o@)$o@)$B)$o@)$o@)$B)$BDBDB)$BDB o -hZĺFBR&h)w!o6q˒& iزl3YK PLXԡMKضt]A2 9kЂA[j*T,eb q1 ;l,l?l(*z=ȫ> ހH> H>> H> H> H>H> > > >ӈ>  [zĮCl[Z&4n l)P]Kd; q O#47 4O#47 47 47 4O#47 47 47 4O#47 4g}KصtmK؄-5bR!-%b ks,qǒ!nl1!;,1yصEKXTUA 6--b!v}ˀ0[zĮCl[Z&4n l)P]Kd; q>-3'DEyw$y_"y'qGNEd/{}XENN#w$y_"y'qGN3Ed/{}XENNw$y_"y'qGN3Ed/{}XENNgvXUZE ttmnߦ7 mxߦ7o#x66N~N@' H@GM7oG',]b&,MbR',UbR& %(Z ]Kd; qAMoF:mxߦ7 mx67oo tHހ tt:m}>g;6ei:f+2Q(AR ZĜ%Kܱdۆ XĜ%OܵEKXTUKXIlYĎKzз {c=Kر-Kذԉ5KXB qג',Y%O,^*z x7 7 7 7 7 y y y y y7 7 zd* ,}ЃCl[ZĦA[jĪBP.1obg$A$A$A$A$o@$o@$o@$o@$o@DADA ,}ЃCl[ZĦA[jĪBP.1obfc! 9Kk)l*,ub$,mb% =[=ǀз]KضMKXԈUK(d) ]bޒ#f-;n EEywWNEN"~E"{'y%DKމ^$D/?'^DwWNEN"#^?MN"SEEytg@7g @o@Yn7 x|t:yn@77[D=K(tmiQ[jDj˖h)]Kd:x]|@7 w]g.ހ tYo ty|n@7ЇK:жMK(-5PTeKX®%OY,]>yصEK(-bR# uKشmK(t-=Їe8dXC% h[ZĦAQZ*IJD,Z Daג',g3ENQA^E50]9n@Co@o@9o@o@$o@9$o@9o@$o@Do>,]ЁEQCR% K(,EbKA9|}|0`,g--д4Bj*QXDd) ]ܐ>,]ЁEQCR% K(,EbKnEEyt瑻$}[D=K(t,mв4 K(,UPBR$ صC|^@o@GC|^@$Go@$o@y$o@$o@DЇK:6QhYĆNj*QXDd)Z}v-PB*UBR'6,MвBQ[DagЇK:6QhYĆNj*QXDd)Z~6ؿEQA^E50瑼/};яE/'{_˒%K(T,UƸ`,4--жtB#:{  }K2x -hz4 uK(T-P(1.z_DEytAE_$_ATXDGеtB":uBR%:*D>Ƚ@E_$_A!BߣXZ:DmiM :cfBR" !%Ǝ2cbNt4 MK(=:GѱxȀ1Qh[ZDGqãXYDGPf''XUZE_BC{I@C|I@$o@C|I@C}I@o@C|I@C<2>c,t=:E BݣƸQa,=JG@%A%A%A%A%A!BߣXzt mK(4=GqգX({Pf,T/ ݀܇ ї1`3z]Ǝcb,4=uBR%:*en@C{ف7 |Y@>$?, QL;GXh{ McGPT cGqS1v KbZh[:DG3v  {as =.cGh1 Ǝ:cf+-QA^E50]n@C{Ł+_^q W?WH@{ ;=Bףfh1 Ǝ:cGP0+^q W$?W@A8|E@ v;zGb,4=uƎcQaOգQgh0-Ǝ6cG1v;09=Bףfh1 Ǝ:cGP,/`QTzWk L}AUr:{ՁrW@UAU:="u ;}zL;Gdh0v;jU# WȽ@U_u W:€iGOiGh3v; Ǝ:cGcGd,Bvt;Gcرxӎ>cӎ.cfh1v4;uƎcf+GDEy_Da4ɋOT>,Y&yܢ~%?K$/["Y?A_GDEyt t# |݁>tub>tt>}L;z}Ltv;Z}L4vc |݁>tub>tC gceڧôbdڧxF&>-m>]>=}>}>Āy>}=>]}:L;ڌ->M}L;~6K,^*zo {Á>Ƚ>@0H@0H 3cڧ˴Oi6>-M> ǂA A roA oAC gڧǴOi>m}ZL;}L]=as c!3cڧ˴Oi6>-M>5S# ׃^k`HȽܛ>Ƚܛ>ܛa|#q gڧǴO0i1dz*Ƚܛ>Ƚܛ>ܛa|7'2`Oi>]tfڧŴOɴXfڧôOi>} D,3cڧt|L [3EOYUZEBD> [a{+ roA0iNbqǼ0]0/LyaZ[@0H V [S|}1/Lya: f^iO0]1/Lya Ǽ X>>˼0i3/f?|dATzWk L}@0=o#i Xϼq?.t76ǂ@0=oɷg2`0}捣ItYüqe~g8g2`0}捣ItYüqx,'>,^*z C ${gȽ3ޙG$,Delw&;@q $|g.7>&c$,G|=Mϲq ?=ŀ&g$z,Deo?Ă ..B RNw@s7>˧c4,?H; ޝNwf|=OqiY>˧4,FӘ?>Ă .?-" RGe},BSAܽE@yA꽥0~cY֟=] g}kW> .>B D?*)8R@'ʀ?}n|Q'ʀ?sG3E+ ׃^k`{i sDw^\|p|{\,^+3͙րր\5ݺow߹1:=YY,[ub4KXo]s9!,OozJdܺvAn?"dO}nuo9ݍ;.i nxDd֙xns._TT^3Z>I7"=v6Rm퉅yz}$``O{\&=nBk@k@k@krD?Cl;ze.돻LZgܥy9auy\'sqO Q[;QK U%7~dyD6 _wv5p5k`)amt̿!u{}dY{j-ҽbkЎ^/i h h h XE#LٯI摒~@|&J0xއ榊>;1>w=ɯAϚYnwZZ&9N5555pk@E.\b:;wW^oZ;Le%9j~Of,3*zQ/欟Hߍ] .뿗͟]Uʯ^EawԳE}|\99n}z@@TC~U*zד? y睹u6*ْ5C~UW .Co1$1m;/6<͎?qoυONg_^;+V*z}[#گ:4O9;*ӷiHe~UW 8ȟvR/X GNSD|Ao /eݥv#k"2៤M9旼O`=Ƀiݾبs'DpS}ז*>׃ X!qs_B,8E~ꫯ[Iu.ЯNGi祈ztf$SӪ[ns_pWieKP*i5yNTG/s5Nؓп8L|ޓPKN\rt̿ա^n.]=hW:yy2_w?JG/\,-byʧ~d͓3?yE/ٗuS:Q=o~,<ԍ.ۇOƉaG_y'y[j~Ou`\ty:̢[/0Wxu[\ǛGj/O+n:oXG}yܥCݽ{o9|y{"{>~_ KZ.sD?e~C({dݝy~UqE'2vzQџrGAt>/aq퇗彮s2>=zu9"tiߜk>GnzXuG]GUѫbPѫ/?YʥDku~ ~"soE^}QN F?'yȯG?~:4ioy$t^D0-3?nk~ap"Svu,y:1Tџ+ џ!oLN*z^E?ܩD/D/6TѫU*z^=稢WѫU*z׀^EWѫ/AI}{BEWѫU*z/q U*z_oZ;8ʏmsU^Wle?֬E-}u-iuv2_Jg]t'^*w_%Ng;/ƶ:- a嶳8~\%(z}̋q_vR_m}"wyg.d]99PW_ؖ!x*z}?Zџe~U*z~z~ȴ[_Ng_;_V_TޭJbvkoɲV4/o1782utw0WZ0OGݿ/K~y*S*y6sn˹ΨSgw+ׂ[{>qEn^*?l,x v֜tKR꫆/ֽCeeyEo$?rܺII'~Z~zI񹕵N2e?ݖ,<;sR9ڹv-+3NDCyE?xJ0wf2rp ͕FDDnp޽u}{*ǭϑ+%^~~~oܱ:@_<;]O]w'DD;מ%xkښYZl|c#?#''s uwn,_?L*>t>>hG/^D?- + ' o/vW)m'vv)bG*cЍ5yȩw?"eGH~'9KeGD]ِ\=9Ω?>1H~U+*+NN4 Uc$^U~*Gsl;pǘ[D"&Áclw<=oћ.=8я;yo?EsP>t/ϛW|UEߺ?y:PџE0% 9 ]>{/݇P7G&7n_u>7I{}( ~O~/^<泎抉;ioǽ<~ɻ7 |sdzQ7'uzkd ȸn?:U*z:yߙ7^{'%ei`;g_^ẸG?{~e.C gq)waЙ~j{qK'1[瀩_;lI뜦;\7ߣVE]Y3P;#wp9XT*e*eer,+z^/c*s>Eto[y\uR~U*z^?w?wb\ o'^EWѫ/lg'O>T*z^EW_PѫU*z%>k;9RѫU*z^;K\'"ztƵqm<|әÛNtS'K)ݖs[/v}OTj#P˼&'R~UrEyT'ei2q޹Z,+gUʯ^Ea٩uUOwtWѫX Ua;3,NO\u~UW ;>|mOm̿sq|=bk:*zvWTg [kj4;N[o5¯CdShCq_`[t38y⦢_R]^pڵޘ?NSD|Ao /eݥ]+7#kȯ=U 3Ű/I$'T*emا,DpS} rPןLVKunDYwt<!_wD~U~twZpf,:T2];'O]߿o_F7DIC뉴}޽{s!래ʍ;}Xxj޴?IerT/1NLGX eg,;?\Dy=xIN"yYG.݇N&NpcFpzI'R.'?3O>|K_R4Z'Tɾv E'o~Y.MRK#2~=4'{ޓD>??W|].[կ>yG3hNd}M^ELK'OzY9/"ﲽ"qNj~}uȷ<_[ }Jw٢k7Th4O~ >&s*'Z;J\iq~}_SRE{܇/u^r0JʘJE/Kk5 s /{xn=oO;ǽG.Kc?8PW\ ߓ"30zZjI5nߍd9y2T^Imߥ}^:R'Q~݅]Rϖeb?:ߙ7^ϙbk.]N3o6h}>pG?)P>kn?AWVos\S_~ѿֹFYHzyTG? ^y+@1_,Z{$XyAѼG#mBF=\}M/ϖEt }臎._~9~!5w_Ex_e<2ߛ4?+qYwۄיl<_鈧פǞ=E<wy1 Ԡ~/{JzY5t .;]~go? 烼ˁ4?+qAώYs|L$}ؓ ?y >7y/?TcrjPE_~. RE0x饗.9V^3+<^z&xx̘UgLʭ?=01r_saÏkwǖuq&?MzmǴak5R ^-{t%'*E/!;#!^ z`ICz=Eyᕃ'vs"{ zlszy{3ơ8鹍}m CZ.u clPI^-U^p}Es5p5 Q;|"Vev5dyv^@kdk8OkjRE/?w=Es5p5 Q;z=_noKoo}[׾5Es5pB5 kGzժ_jOwE_WsFu0_d}M9=`_noG^+_2䒢98}Lzի^ nsZZZTgou8;n>ZZT*z5555pk@E7e8נրրj@E3yK\*Kq,xg?͟րe^.q /ƽ g8^ Uz&55S_3́C2y'^~|N!y7z*%Gz㝩j4nW8>NO9|H^$?o>lꫯ~bs H~f0\E_h-2]_e|Uj?jbs H~fՂk|;CH>$/GgV*zo֎UZ5 륓?Wl$ϬZ!JI(ZE1u^k`TXYY??>x;~ɇeގ^o,אc=kx?'AwIݯ^%ݜր׀}}4#Aoqz $_O'xڵꘓw%Įٗ\!yywG+'f?>:Ky ]E;vrW߽G{W|o<''C|bY~-ٕkT;35K>$/v?яW^yu豞G]#y4X)`{dyO/opU*zθc? ׂ?;_D~9ggϥg3{ɇeގ?aK/-e?<33{$/_ D[yisO?t0B vv>2硧yy+cIEEnNk@kkkyA?Sl$yE{WB9hG;vsW_DK?Ul$ED=PFsWk755p5`D? /}G9|H^ܻwO @iG5pk@/v n;*6˼[U}ḱC^Eր}BɇE3d_jOw`H>$/Y9 /GE7Ec^/2ɇeWb:WL@!y7z*z (ŦIkrՀ^E5W/YnOݞZZG^.q /=ʙF;U*zk h h h \P_⍫g\nOԀ^EgZZZZTxOoրր^.q /ճuVSրQj@E3yK\E/ ́րրրրůk_N"2h.W Eoπ́րրր9f%qIENDB`robojournal-0.4.2/doc/img/screens/.directory0000644000175000017500000000006112211723646017542 0ustar willwill[Dolphin] Sorting=6 Timestamp=2013,3,31,22,53,16 robojournal-0.4.2/doc/img/screens/mw_navigation1.png0000775000175000017500000011154312142060704021173 0ustar willwillPNG  IHDRIzf%gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx `g}B@B "ȍ A[TJ[RBBT(P+KM!IH9I0k?{{m]>Ity)cgRfѲO}mr&UF\> :niG |СoIOK m+k>ھ;vN?蓋'M mgO~&yLϭJ26C24јq= hoF_#/7$ |l6!qR[hEq{H I6Oڶ#MŹޝJQ(=1fRixC&e; @N q(N3i;! fl`!1W6+l(i0C14{Hq^.N*,+ 6K T%K\w[n{; 0 pKGI9o>7"ət5 l԰Yq*+N-@'3'TbRvQ2y-CF(Lv3aZB`in?voo]7A*O_sR@и6 3׾{LM~]< ~dS'-(6YSX R-m97g'.'$Hܩ_2NC}zD!ab/V IQ([eY[gLMt-X/A^MMGd 2 s;)XeV̏iD6${eѭD R(NOVQ=c'\|LcZcc2 c5x%جa]x9Y'^_~3 ^v+O>>(>xꍯ:yڲJmI:_u4C tyuZ1V(xIb/ wɠqCiYă^fI`;R-n|96r:8~$Yؑ7$uܵfF4[^ ED1*UFGdE| jUKs#GAS>xS/vrAϟxEpbM_{Xѯ|}bv|[O-v;ca{u#ղ Jt_I}׿{͉5Hnx㓳@Ze.649'{w'? ;TsmdOE)Rh\jhp 5gdCE@\*DAQ QCvykec]kおVΰp*SM2qʋ<#69js[ǹē\e wgNĆ3XȽ'i:"GڝO>'{w qioKr=6ssABKCjZHcJ\7#Lp}I;7LqutP{EP3I N s0|OW_!ZtU :0 y2nsF$ZcrHL ظh! ji<a˞|ޫ++x};?٧(ZkT±kK$_>J91ضtTWW{. O_4Y]@QxOU*UQ.8H>BF8$-+TII(TE:_evK C۰v&sP􇕏;xJ~nf>d>:v~ >`y Gfo2 Ή{c^Rg]:LPJ=9nj݅EgDq| I`_v 6 I\i9QI\L`8=+I`ܸq?CuFc_q +ǎaU6}x()wnVk m#Rb־̻752ʚ>7O}`3Kw}%icdl͢ۼ i|]Wƍ?hHsܝz-O#Ϡd/"#ԦhkOA1vMSR]7z]MHI%ٝ2[TiFG#;a_F1vDҾwB3~n M"WY滷ʰ6'2Vfp3ЃxX͗& ُ@u!wJ:1m dʽRԩmmm!Jtt!CSSS zJ^SS}㯋anZlkWTJo)ckN룢Lks"3v̗_}3x06xE~/LRfcZۣ" FKhscQ(rkW%巔1m I|odŒ"Otf7.3N Juaʶy*:vZ\tT,C L6;c3$8v*c}7SOvilE xɐP˿:ħ<;ŻZFq߅?g #V{\Ք" TҜվ3OXSLgf̞֏m Wʎo-]XEy []u&WJ6!IwM\EVLcl4Y[L3+ŘL-<"GIbPYdNEpϔ?M3:i#J~h1t}꒣M(-ky~c]TWUF*p 4#*mqӺr7Úcho?/M띝{ i׿U>*kFǷTg.Z1>X8iqCَa{ 6{6gJֽ\p TQ68q 8Q{qUE 1|V6Օ#9תkM]z+ "sɐ ʇD ˹>A( M/HaPS7+%{$< #>Ĭw;Z^w5ueN1m=($NCbgA_2B;番RjЯ5f7ɑG*]T?>*Y1au}{Hn+PT05ăkk<eK Q/^8:{۽. uu.:u?cĈjtPQM͙>gЖ=NsU2Wjڌ9{vmgwoNY޽JP w wvI]j>| `]i= בKv]؅TU֠Y&FPho%dD"is^qoJUHpTC.B9G4]bsz)w5u]f@u.-ˆ I;U45 M?0 盚,P&5hjj؂M{nyCF g]U1 -eS;Z=1՚Ө7.ʤ4`=t$<ʫ+)z\>VlYQvBio\~s_Ǵ`WI+6(s[VR^ܥRsQVeTU}뫫=(KSl?_ð@(L ֞T( Z)]#Q{%Q?$V~s>~}n,rgזݨLgSaSQT~k3qFZzyUS.E4ϖ=fRp˲G$ϖUyC?rR'o^`rotzTZ5w~UsejRһRfR{[]=sn:>.߳AֹK~\*D>~<sRߜ۲ts{+fNI`2#ǃi`\45stߍ\ P+_ P(WM> $ VBO 5?J=u2ak$Qk9mF:j8_Ve/앢gE{q5:C`KK ߥ20{:69<1r_Ѯ)wj yb{?W<61!%1.)/lblSEao/zzo`7po &62i7P(rP2$eܟRy5dph an"""" -wz6~bDͅ#;vgN&lߞJt\Ywo ,Ƀ\ &Rf5PkC_[3ᆾm{zZd즦&7l0Mz,HŊcW:!jj"5 jF,t1Lُ?&~\5 B{2iooG: ӧO4DЅ bwqPxqܵD7NPDv$A"b0ЕE_M7TsOׇ< #?rɓ'eBW`0~VQQQq,iiiAyЂLFMMM.]")œ'O1`o*mfbڬũ -oj{|ί 1jJ1Dx0OdNttt3Kmھ='vYԠ2+y{kYga%s1݄CzhJ՚p!,Z_R%>kˆȰq -&n-6;%EWVw9z)S]t]d ֢ 25fd2azn0Y&3m0)Lj.x):2Y(Z>d1DDŽ#M pԯ}jء}_MPޟ>}U7;_ךq]YNӐHDDDxe#T7=0KX6wB;hmZ:+C%k ) y1bDp4Uv0mu׵8{ɨT6F`,Jy?IM2_I1ĘV=>&ܔLi1kGH+9mGn7XT}\JʂO|Wߡ(̐)I+))AZ,om:ak{?U\퟊~n5ť #%G4_59(`kH6_S17|f>|xg!!1 b{\|ŭ˧O@Eʷ?n;Ykb}~4ա7n>}KQ__^] @HO+0? =Ξ=saaa+jF#:M}_c=s _|o;-+:.Ff4շ$%F_5'NѧI&5 )JA , H-v7idG6ZUf=ț )NKMTմ_3,Doܘp!n>i{D:(a9z5\>8DF㊓+_;ñK̀Q{߹-4K iW騘thkXǘLU9;z($:f757>oxϜjy-9a*ۢϼ~yfM!|{tbľqơ2%P}tII Mqqq1zhxZ&{0115"o]0`ɓ'Aufi-&K^jٮLL;pީn۶ ſx5MZkܵ)?1STY :ZBR&bo7l-JnF=h h)i1FP-F"j3zCꚽX)fNm#/~ail_No+>v,Џah9e~˗Ϸ5:T=n#1&S;2/6GO<cBbMI ?Qg~~}g42GJ So:rFДHQuwĦ{ wxЅx`+Cv!pAR|}^䘐щ'~G~5HyZJdbL|%9Nf0;6>=1[d2$r(fXBW:ȅn^z ͱLT;b{*5 3SDT2L8b;>&=*.F}zQg/Aߘ>c.]:e29P=i !c4lֳg=9|P=3{:[H;*3]؄T73vel1tQƇ~+sYnflmmmd%ٚsz0oxhk7یLkB%>Jop7\Zt@(k׮]do~FEA֗E Z fn7Ļ:ryLFjgHj1Wx'M&9RXD͠ RԩSQs*ڬUpU55GF$b]]cEsf5bLG*sln-**i˟?аgAǴ]f.r 2 @,ǵSzn:y/F&_ą&KS5\;F @JS:9(uuu---A|!['R3YYYĹFbj7ZM-mg.")?ĉ.׫V,oGfbllʯe&P7YCD"w15B:Sj9*WF)#JKKkkkt5wbnuD @q `RfTߔgP谰(t*䗸}cN[,-͹iE>ċywimmm'O5DMY譑K$B:Hbzz ДMVZI'D+/o / taU 2n6A:Hl6^[[hX,H{@ДKMm1 BL˙SrM|!a ٖj7mk^Ч_,.8&>s Lmfł 8rqod@ᙊnjA p}lF@Щ^_\W_<^\\лwm7QC"9;^V`-L4o߾!ުK/;{)GzE%%F| GlAue4jמWE 'lFk>-ر*+ 5F:rO1_q\Ywxx8Lڃޛos'/6N}g_/S8̛<~eAwWKKŋO' VVDWItg'666AKbz*W5g ٩as@Ѝʳ!߾}v|͡1*3'm?W4J װ_ly]w:#G|#@SRƍRl;v,L,V _KhZ!#0sK+"ҟz*#rҥ7x\bfl荢w4U¿h6[]cVceSvPT_1V_YhzHbCM;YZ P3N&GŢGeD&z=Nf r9|6PWY233;|"`i TgϏ:rfRF2h 1L߾ǏEjlWd2hϗM _;d` j' ޽8^OBa]Ih@H?NUN}~[L[[b!{AyF:Fw]}޽&S$:$\>=z *x) Ŝ6 ȮCnc$ɪ!uII5GN M2t<aZƅtW2M͟>{vӂiR[R[b4r1n8fLRRRJrr>}¦h=SRڣI)Z-|@=*=5` h[t  29l]rrըQ-99{JARTF2@67 ේ OUϜGVN; к:K4 Q0vU"Fsq̘ H+!!!..F];Vb:#TX0BBvooo_~ ۷;. Pę3y9!Hjj͈dXrƢ`)t)cb#$[.>ۦbl'eVJLzݐ0 ubdiii1lݪز%C@Tf_eexӄ)՝ p>%jԨ^ GwM^5񮘥wq)KTMA{ZD &aaaxmwމ4uΈ;#++]CΡhe/bŕs}Vfgj4H$e{ 9E@ЭPyxB"hRÑ,@mٳ/߷/ƗkRRB1`ΎE@r qd]W bVUu/e;@0aY9,,;fY,a5/^l?`I*5|+bGj@b 0qawyzݏLXw|m˗~JBBɉ-MI@H 4 L,h46 v  q._3zk!]Z¬o- t1,?4,`ŗߒuI|[:>RuTu%h h_i!Aܦ#Grs[Yr?+(aaaHQ"DL;.d Dt5 +ɂW=(׉x4 1Ո:q>f"VlU%Z%"F) НPR.4DC9bs(񚼂{K`e' i&^BUv(j$v`9C#WaX"YF0( T) k;nnxsZZZڐ ٯgРAIII` [) H;v,222%%eH0 ԄdMyy9R9ǏGgrB`)++߿A֗^, ())ABkAV(sҏ_Yfjkk;\:@G}A>;'?2rr%Iy4ϟ' ȪjÇ kvG4y%L\ UHJxǏ;vf@Kaz9 lpP)#'WTZRP(zCBNzkFBnB>x9Sp@WqǐprsY_cAOåȣ̔k]4?sej*CK>XeRjd%7" ?k3Cc+>Dr!:FL=S bFӖ(O*R_YK5,Z,ɕy4YYbu5YkzaU[IHLV"_"kWrʓHIUg[34ؗ0 hkYi^AK%I ޤ#=,NJk<.^.$b}PR3>u:NHtv:l ӭ[sEs#ոIȧ}"#9lv$+uQFD=wq,sR=*jd+To:P -ˈ` bI, $&&*WX;l @#(5+ nZ& (nzX!>!IN\(qDK(ٯʺ"DCez\B*PjuK'@b'O1t?y⡃ b#uO捀I,`VH28Vȷ`||,YZYħ|`0@eЭo/>)Zs)ev,Y4Hu\i>*@SVCteubx%-a5cd;#{w $z҄5l;g%@}j^Y_]ٛ+lAvNUGt.x$EP2:WȋAWz"r2PgF^ ҆3AK V3,DZć"P^Yj L٪(B'Q0**gUk'>d)qc!agnjtP, -EΥ.3DFP2/"P^YD|@)r|k׮䣰؎8p!%eN+8l yb] O(~EOmdh}*7T"ݛq]E;`q{O-#_@@d ?;2/[lÆ <[2̛G! !EeΛYNb,Yā233+мۙuI%ѡVR: Zgh7y=asIm8nO-W4@BϮi:D;`ϋwE5~_Yvw0iDXlY|^kbxpBz jU! uHxyvt@'nݽ; 09as]S/;[R'MW"3Sys,?Ǘ"U\@ѕ\֕nn1nT;tfF' =e]}>Ͷy>/wb_A4yus}})1- Ⱦrx@EVV}Z1TœUyMC,6 1}eՆ\Q0~j-lUBJ0L2XdlKɄ+ @w[Y%**,2]dK$bٲe|.)W$d8{ ^XGW){< ˍ Wav2*'jܸ2''*D*@XBX J̍6 uBcI٫HҋP4Y-x~£|- @'Lg"UXd{{0R+)22*Xe)R*2s)]ؿ5k̾}~oذ =L ㏏5ʯPx8TP)DZll;+ͱn9hH_t M#xuqf| t~-l.&/O+&`Wnt=16}6iZiaC<iNWE @g-R~X,&_-ZkH}Av.ahz/XPBzH L2.R?t:z& 뒏tzʽ$KKY iuIZjAA5dוaobGhl@Il_ _Z| etY0L#g@%^^ʚFOHM?iv?ЉR&5F5蝰76rxP|ףʾbߩC:Yt .pv,6j7x<j67.9nw\̭.NEƋE]N&dDj\d GGO gW'rNA"AFV':[mDeY%eՂΑt5rU-slݾZL-Kѵ?Qdz1 i/,BJ%?W6yM(5lż A"3%\xOM C55:j\#HM5j?RFQR ~}pNB%_MLepdZA~Xu VR(A{+5ɂ㻂bo" tsaGI tm E%D\ޮ$$RT[q4Yhq2?Nt0-aZ'k6Q6}SqIj)w߆7kC,V/9:z1Ẁ!܁?FUE ^? [&|Xo9rbN_,^LǂQMBnE|4r-쒊UB0M 9dp[9A*xlJaj(79e]\L\0vӹϴ٭)WDj.fOb+ z|w :D\c h7xo6HgT.8$T/60K1Rl3r,x;DQgjɳPc[ɢCFG{6YJ a@MT<1[I5Ckw kZӮF;ٟ "Xx51Z8홚=/T t E.T/xdTJLegBdu#7G8VVq/"k91M2- R9Gl&YN y1~/c`\70y!iv4f'%`B5 s ctx޼$²L )2䒹Q"ۤ歔)B_K\Z|U <LusrRLjL+bEʕz2zPp'6Hs$f2W%3XolNQJV*cUGP>֗HiE:&K]0v\5Ƈ~Big<6i+y(qV22]lza%Ň?\Cԏe~Bbk@-~f&/$ HeH}AO` txzrHt ٤ Y'!oܔ@CBk9bg.G.RA&2P>Riƽ0\oj װx.M+C092'ą.,2xjWL(9ߎ,\z9,gRkxmn*PgD[W3+s5`b}S~ţ7+տJt)Wٰthx^<J銹J܂P";{0Ѓ& tr#Nڭ~Ljn Xe$T1Ǝb5_2Ux@ j?= {~P(i5ee)3tLR8C˥ A*u\:@ՙFp ,ﹺN_7%LtLeaaʪ;W>Z_+ո?˧ t}U3?{:6˃M^VW@[]A~V^6R 13a)3.&_nu߰/+.~wˆf E=B&}AF 3سNՒpَ$I>?v{P؈GK9?r'qEt$%狫/:׹6cNw*):R`a,X@PK7װM؅Ut\ht[UE9GV~AG:t.ru&UPM(MBϒ\bk]"D~MΡyKK-. Y#Ga{(sCI>@*(dSeJӅ@ʄ/};H#25ܨl )-V;oPpI$]DqKRbH`K*ͷl|MlҒPyr-f9yPnrr2c2n{M}Av.%}V_ZPEԗ%};0f^bpa-1)_,y0&j'^'dÇz,  a%Ň?\Cԏe~M^‘ :AӀ,|t?C -`1deQ#7|,Wh*$y R.k=;+bAT>}jk Dk|[Bt7nuзcxe&Mh &Q]A]P~uKy wK>^F*Oq$Ey)VЌlvoIRLaJnmǖuאi>?rˌ.0JUmӆ Ȯ.WPw|x|u-)DEщ7Uc퀀c4lO=>Y(hMC,8w |:Mqe/(zm.ġAYv3tYm;;vsǏph#/& H(,QvSTd0K.w|bŎ-5 R >ٸUFU_Zk۬TanU"ʂ}\%t6?ǻpr!N;[i8O\Mx) vbq\(ZtZdyO<{ ny}uʶα xk:s*n]XbQw,,CyC׳&}` He_+?Gcmvӱ_>[}жMe2s5]N2L:Cu~jįYNs<ӄ&k =l |pg ɂ(.wErnvYYA b"s eB$NociU]*{cD=8o/7cy%۟05GϹ-)b`˅cU 6i<*2h>Zf3!c3}< ~k}`gY#f(i*1'H؎2]$1S~ݝY6ٺfM9U|q+_fԿװ";O?=gٲe뜧&2>'zxplP^a_<9uNIEZd_^,+{/}v;e[[r%_vͦŲ~=mljֲ[QY踼l6).T\R뗧ف'T2o0P>a3HOPo @_};F&[fI7W-^n|0=O (Q"xKmB$X")>n;4ȑa H]z/fܴ,1o˩N4#kܢ}Wm:TTT\ʷoҐKJ9yGoa騡K)61\lR(|۷`ٳgu+cZqRk\ΩQ< zHj<<]_Z,(Y+Y)[ᄖ} M!tڒR)Bg¾D\dH>N&Qp);u;+v(D!wEv(3H=Jͥ$ڄ qw"7ò2U%eռԴ :wDm_'$JA\oiv>/zKp6 0a ӗ=1{~۬ٳ,iO<7&[Ym\Gyٷ|$;;S\bG_?﬿Q:˕S[~m85of̢^1t.:>;׿s*V+_V]{Ӿޗw޹\NҌxΕ"ˉyHViUP9P*CהAoYWUgsynRŗ"ύ&Pi]y%, NMN"ߝ2ӜrXeblbQTv]RZV>8"!R=$~]t[rW?۝=F׳cgRAUP@Wփyqiin ݛ=!k&MZŚc;!%PGFGG{v\urف $0à_}AUt{#} ezMP_MOwBrV}⒖c䪓Q*cbc JLdddO,*vJ \rP@R @2x)oZ"ZQSm(@ʄYƓG&nX`^\o#_9 բCR&۷ j(_KK5$fed  \ՄxL.Zȳ}Av.%lD ,K% eB3,f%%"RZvp֧P\tպ2׈h6c,Vх,!ËȄjvƖݤQƏv@l\H2~X@w2g^࣪}$VUI[4&!}Z1{}Kd{^{gQ #óu rY**Bp5~exޕY8*?yɒ%jӦ9 8 ({O>dKhՑe ʜs}͜93B%%vi)55E5uf(/i=U+[ςEpF;nAQ]1BC mEoJj GEi,*j!4V sir"rosL(AYk+ʭ1JJDI]sIz]ox UD.* iQ[ 9***JjՊSRµ@J#qZmX[і k-xٰaCwwwCCkYYY 75dА dsPow- b=jжK5h׏c (PӢu jB+dC3555%0%)rxoI`}Yd7h>ZUr#\)_m/MHj8E ߯ȳ 5c#LbPEv\otB ~C+Gz1#hD4HdUx +AL-V@cp_W-AhhHQSӱ*{o; \Vn}*PAq2Ь: on?`j/DYEDԅ`v) vͼjX|WMW6qQN:uM̪UZvuۺ|,W^V3MFYti&('8kH2je %w9cfQL-BVV(c=z4`PsL\]aMS_-A[Uժ?2A^+#*ȼ2,4,4cP82pB3Dn厒e0koWM}{*6@9?}9Ko]s`hNO-mg  ʜDn{.q=`ps?/-uRkJQt+&gl %~Պ/ga+VFdžd,zkXOx»(3rȃ=;5k?ٺn _ݧ,QPը+UCͯf#T$HZ:?4$6(0ҹbW׊ƪ&Dc:>~F: Lvw46VD"CWPP`53<:~ctmepxMM#Q n K1#ΛGlos9?A)/P# 94B΍D#fIc#vYQw*iaa{@ǵ!kh<[vOদ"+??eL12CKcB=)SU<֑gΪj5!5Iڰ(YJo^wⷞl_3XQWj4iԜCVqRPY 5,ijlHnړ~KPK~~Ĺ(3TxzQo(Ǩ3x+oQhpuU+U%9b8 ԯJHF‘#"!4zN0AWK *V="5L$Ҥ4z;Vӝ0r/ =GMkV@y~u1 ;.Hg WV5UWGM ֟.GjUCиe>Ο<Ɔumx(Zj>8vsh%:靗#ZI EdH$OxUzFqԃWW$*dY Q$7%Ks|׹["X"b4(Ʌ@Djd0𚇊&k]]?d-@uA^~Ir^ZP٨>4['q|uɊ=zjIFul5yZR&kV^b\(3< _oY-0{v-eG%{l`W]60;g_ݺ1E5̓4p}~" zIj)ʵDA1#~Ԭd뺍/<*{26eEH!{V,[ [)~67Th5 ʛkjKJ_Ilm ]8 3ȿݳuֵ3tKh ,SRQ2nh͢fQD,h* 6P(dVQ&Ilq}o?e{5%%vx {:P[B,XP?"3hݡ(M4LIH,2j͂܄-1[T D yfRv߶zZWms+]vQf昸\Q]1BS3df3:\ZQ4P9BĂQ!6-俞 Br4Fė:r]ҙ#3ɨii.q7O&dL5T4_KV6- t,NŪJꊜ)d՝MC&k1\=ೱVq${.6  5\QT1jDq4ۃ7/ox UINY'攐檠da j5yVG3 UTeZ?I2H`O͓?/yql`W)A$(LJbubJfGd@ G?%rLW7Y99Fk eI`sgZ1/uSshv|ivM @" 4>GRlcEELy 5C2@+_~w䩟66{mCѺU;7i<9!{F]F.I;.YUC iǘ<9=)'&^!"C;FhHeTKKjX?6dFB.Gt`H"Qf f^PѤ3uXk3sF 5姙4%"OkfDu:!#$flJk=Z5/ 'ѰL2f! 5cu5oPjdžBbrXlAs(l4[&Xy\&$ &]f]8¸Owlђ_xװ;6ySkYU=+UP8u'g Jzje/]ơC2y"%4m}qwvb㟓{/5=ogw542\ t`z;opWSAJ1EjmKVVGͻJ#ޥ"'CLdn<!AO'"2}SPըzcU,l 3e?N')[5q(wډ` L0=0•qp)">h-/?Y= 2FG&ْ1^^J[W 65?f$iv&Z(呄qӞ3zh50/q + a+c^ްk᧿xH?uү}視s`nt=76cUKhUnܖf(1@6;8xgh4;FH-W>[jGG-Lذ@}e\%{l`W]60;g_]tQ<\$63EdI}[\5f|VU: s HTWG#Ցpe8BUs&y3.FzZ[4\[6?.u9jS B~̐1#~Ԭd뺍/<|wN,&k"V R&IJf> NŮH1$< }l8:gC3\\Ťm'H<#C/2Q˜VWGR7; ;=*{$Gb}}鴻_RqOuAc|+m6¹֔%}7Qi~o+3ZvW_HD* 5 UJ ~c߁vumEu_]i6E~Y$NBbΥ-wzĸ;ݒi_?ߖƿI1V[abzt3eҗQ&=:LIb?^R lB8zҪj5sBaQjلYAΠW `ߜLz~}[D |@:/U}36:ۇf'+WVEÎ/{Tco"5c Fp 9$%ص.cEpL2,^T1'94"ēOF[h0.p Ok֙)?a^?q!gG:LHwHwOk~{ggL.Q{:^+K_jX{ޘK"ʩFѕ8 Q?cǟ)**^K@,\Q> e2(@ eQ(@D Q(2D Qe2D@ e2(@ eQ(@D Q(2D e2D@ e2(@ Q(@D Q(2D e2D@ e2(@ Q(@D Qe2D e2D@ eQ(@ Q(@D Qe2D e2D@ eQ(@ Q(2D Qe2D e2(@ eQ(@ Q(2D Qe2D@ Q(@D Q(2D e2D@ e2(@ Q(@D Q(2D e2D@ eQ(@ Q(@D Qe2D e2D@ eQ(@ Q(@D Qe2D e/l: (sBz L0 Q(Ntm e^wQ^z飏G} ʜf~l۶K.wp8tp p]=p@zDdꪫ6m,BqW`@rTo+ywӦGg\|ydƨҥK:;;_w}G}{`Eg}v;x W]u۲K.s{ټyܹsݭ_N;>|qcU'2S@qo渒ޞǏ=zìY --@vvvIkbg+(ܷ֏DAo_tӯrN{9*DfgWWNvv_SCj?٥BTzݻw_׬Yc曓&M墂z.ז{KЀZpS᭷:y{y޹vvtrr7q/.t]ZX[Ƿp=ZvM;::ĖR Z[?lm}_T˽ït-Cne<12O=TyyxGGv0;bDNvv ,VPXYЇ+lldjy޼yǎݵ#ob ;vѫMMqڴiEs~Xmyd޼G[Ӿ?~(CKy9K6//_7kwDVp Qo|q%99<|r<5ZXKu9JSQEѪ@{K#Llh+姚{zz:;;'uuuT7.袶cv~,;g"]%䥅~œ~tk p^0 <|#KeMnΑ l]:ou5]9/.Il2Y24(U$Z뵚) TWGÕ+"󵕍"۶j/`4ۂ[%ư6m6myjE[^~Q[@eR?NK299^(ze\Y͎{eW⭛L{?iӦ=vI(ڰaq.9sݻ/ώ[9BQ;xӃ ɣرc񮮮-[f[\ۡC8fQر.w;v:u .}2q3 \o2Qnn.Qfz2M:S-,~Qz @utwk(@2q_4k`# Q(2D QWw劣;H_xuk׊W͞=[F}[Gٳމ'N<9D ?^~J*cf͚~7 QOٻ㇏(#rLGGeD0aBAAASSM3ǻwH[ä ԬQi(H;wxn+|qq?On{۷mWeȑǏ4i뺑l:Yf;g?a/nx4{%geegVYHﶮO94gˢgf/jr[Q_fe>oS-8:Lm}ބlE;U>ak0gF9z˧ꊸ!~'I8^{5\su]y啣F%+++ QfĈPTػwpwvu|3gnsߎ; Q<҈2uvKAr3l^^"wEIR-7zcm^Ke-kw&&aC ,p齽ԮO“ؤ)S9UCDiF*^߿gϞv>njScz?Q(E3ʴ,*[b_^^|B^gP___\p+[ZZQxrty&xUbDZI CŒ[r .WQx-ڵk޽w޸qcWWWOOO-LNNu[ 5X5vwvz{EKKQ)S/ʴS|c5~̽} };Y$G9~o}s$Yo@Krkr"ZR^qq<ߩ-z<<ݗv̓Yz%g[k2KRԻN ﴝ؄slvt/vc)ɺ >:;b22ϗ4oq'n_On{FdR gqG5vXefQ'k=ǷY Z[Wgv=GhYOOc]qQF2ח ׎4&2[C-ToK3ך3Vj6G)vXFNV#Bx6յHqVc~+kDSHK)&/@NsmKܽvҌq ͊X<ȷ6m3#]N>zkMǼ\KKY!.n1'/ɞ^k&y]U`l n<nK4Z+E-yp7oq7kIuƴ/ 'n_On{{SŻU-~4cL3&Kx-_>G::ڏy'yUSǎ/6F7iQwd5!Ov%k/BzYV~剎\i5ŔW¦lG,ڏ"Tgrx] vY}{̧s⪉;B?]vx^8u3~cT4~Ls$ŨQyƪRL4fR^Wف-j2])PHMއmOe]q⟸!~iUطS"˚j7S#3iƨ39W-J8<8n_OsrGiu.|c%~qAcTHgw|qS~3~-87^2ri88LgHl<^K#wBRB,UI8-O4^f h+CSV\^Y_gfD{`bf8ے8q8`ǾO䙆}.Xnj//‹DKTH﹚(1H1eĈmmm999WwttfҊL7=?~z!HXV}lzfl%޴_^~ŗ;;K^'1BT?HlDi?:kǎQSTXR.IrlvTH!cG%4.)[3䨃ѸDZìbIrDKyy&.D֒kb_`%i$g(Dg|h4};Z/qT=8I?+f,hg`вw<_rɅ"̽=SĿC$q~pX[z "(r:3㥥jqAZ=il?#FQ^_R􇗌-v?C<|b:cu\ DY :CB߼zdw]ǟWb_s.~Ɯ3V˛7 SrD5~fH[| '2zk6eK_ݸWsDSg]8'__!*ǰӧ\a ؽ{-ooow|FVVQƏ?y?|u/ϿOvtt߰_ƷЈ{h(EEy_!u}˩/@^zuQQQ—uͳoU[O\?e ںm)nO_Ib#=v63AH:ޛ:u}({ggL.Q.HkaQKyD)@:с5-8l2sܑ7zk4r#FZ^駟}}|ΎOE/<ν2?$S9(N/Rwww)iZ`a˺lj|]/3ea%zw?$#Z""c"nL֕9mذA &ScTf=V&\䖗hK}_cy%`/Ř%1اǁa4*յk.AL4)7 Z;E ӛ{i~ĉn׈xc1>%JD92?ɌH)%! D;{AAy4',N1'{+}[l2``TkuC#.|8yCQe2Dp` 83^#^q_DUm] Q'x֫U䟹{bUFMM=^VWIj. ma@ٌ]^\3+P77CHzmշehכz@7{θFl~6\M+t ڞޠov|k;{U+ЌV5w#>kVd̕{c)GD h~tўfۍ]kXX5_#/}@][ wmހ{5JkC5srݫfZ^v^ ڻP=j:ucɟ)cC]ڠ7I= G:3jwȽc=& k/OؚZ=՚X/7z]{ccYd4|0 #Hvoc# u]btR 5zԱg>,cM 4+Ɠ<$b!殖A[y4ǚ,ٰxiS;|q;4M/ݚf=uKAlI5(}0{E54 b0_ؿrc5~ X/Aub?'T^GH쐐[<ל}PYݨVAu׊V. VοS_U4Ms?uKDr TL[4N8:{g nwTIENDB`robojournal-0.4.2/doc/img/screens/select_background.png0000775000175000017500000002577012142060704021734 0ustar willwillPNG  IHDRz-gAMA7tEXtSoftwareAdobe ImageReadyqe<+IDATx xս'!/$$dlE1/0jmZcȿhqGWJM}mҧ +ާ^AtV/5M_jQł@0$̙l-ae9gΜwv'] 7cQ|>= &NqihJtE8T q 7^*~QIgaTIuƢ$+XwDQ/1><.LpnXDdUXe:M'}sR3HNk벤L/$CÙd!F4^#!J.Y$$CjEl"H|{|a("Ja "+HDyDU<9*iDYRuxYL~ϧGB 1¥gzxY,3n<&arFh4MQ aՊ$QS9mL,o,n^d2;;P(j4@T$ɉ5$.keC -Wefd:DDL޼ G:F4@nDR0WHv%d|H^Bnndⓝؤ>C5z,DjYV$i V&a>2sQuY,B"A`4#r!k tgX#lEs>=vի^-aS8vIЫћ ""|hg* lVLjfFQBIII$g*'_IA&nnl'4@n 7 @nr 7)"H Ǽpʱ48|E~I0ejpuK9ɾ"Dn6d. :$g%rttݩ`n9h2؎^;5c%6 )&L(`=/,!rp$_3TR`Q+7$ׅL ["}z;Ed>ْ<1,.lR$:+xZ}@"WUUy?yaAvq/Bŋ߻hQZˉ_'{FݍD(++[r?>*ZIs7}}}t֞+$#M4F@!fP e(e@=9#rV8h z/!Vޡ8 F6_@܊3 iCry[WVz98j JV ΔqkcMt|p( 5VĭC"ljzf|˞Q=vm9gw}U$Sk;D{~LQXǜox+AqX7s666mM[45mcFC{*̱4U [f?sxcozP٢,c)Y[ڲZraɧ779s6qvlwycl薴Jי ҰZxƋ9q[g="xgnVawm:my6ܭUz.LB۷l[ KnkZܜذ |f: ZZZmˈ4i 4LZv(-Ulю\}׍hkSTmMmOYW[v@ZӶ-e#G 恵 ,zd#OnzmG^csӽ&E7Wn8m9đ#GfϞMý1RW$nx'M=wkS:Uh7ߴFb5{״ܻ}ZJ:un)/H6'={[с-` ]f=h3XJad8ޕ1N n Ihm ޔ5{.[fc[}mZ=<։T];ӛşkCk.{(ښe H-FZ\)ekk憗܀q#ٲe?;JtӸzrcqDs͏<ȉ'p+8fziXD"4X7f Fnnn[[O<{D9s&&SbEim䦼|Ϟ=]HvM4F@!?hSO=E"߲ SZZf͚Q1ТV:Udr 7@ntcŶN$bx@c'`'_h; 2So|)Vt4m[qn!mWXs/W= Fcf``t /•O/]O/u;"E/ڦɏv=B{㗛z mKE¶UmvieO [,)b$h态_{?ZayY=!)`\[7|N]pVzĐ%lJ/u{*z;̔yU3l/"hf8SdՐy“<>Endg]װ ^|oyBc#.֛7(u)` Yݿ Iɓ'G7m'>@/nXf^a;v6;UnΪW PBÖCɗŧH$DYRu#,%GO^WfV%!=zxz |ojܵKظ[8o*E!8n $vuud*iwk.p큁^ +JiUv([=vIAطț7nnKc.Z-^|ǿ.l8JKBձeU,xmc߸#&ϙREzU%IeYSQ#Գ j>{=ESA֞0B#͍=ysBZROuߘ|Z؈xφ-G[%KgOc~ ,ݾ})e`*)qE8 yL?R=JT*%EO ~@QQ_Ez 9C%kjj[;nYr!4m!6D"ҘP 5oe˲2sKαNfSQ۰O ֪A~ XLU<~jܙ x1ZH9S, O HÛE, x%Cl_`d޸z MK:} Ձ!E$R"C/TDaIoU~ ˱Rڱ(uG7ִEg%(aTIQw?\T)+3(Ǚ3?n[_oJқi:y.N=(f4}z6nVX=zeW} yVQXFezN&9OPUz:jSخB m8^L]-˖Δ0!.m>{qo )Nu-/]jAX;㒥t{'cy ]Zc(Hdǰv4uO_<0e ߝwz2A^2Ȩ9_dggsqҙ0aT`0>#n h/W '''o6K.mnڸ|JCh@ny<&2jrsr'RZs6}*;===K/Q[o5*)sIc#hMQ0UpVfg{R;dאtwwwuuuvv]vm.qy Wk rq![PzHqD$!{T}[P׊8X^ f!Y!q!pSN(**vYqdPx Tjʔ)Yg;2es\k6)))!! 7T& Q'}2JKK[yz]8p7J^8sLoooܐ~vj]ɥ/~'xRF_8i t=v"S9Ĵ=8_#TDݹsRamF.Ufuuw^t5) Ѽ~uٲ⢢}w<\?CrZ~hdھz59Sqj[r?NvMnn.9V$:/Y^ӟ&-߱-)gI3 F6y:5|DMhE:_]k:s/,CPU|6TŋƄM;wuuGx,@\hj2ܨI&֐#?Mc.#%kp}EkF<9-E].jRU9Cçu=kIdr@N Y8Qq0TQWX^sٮӇ~sC?*( G>Ogs Y9Mqթ/\Ňz8Y yQ3qDp#v _`__N~kvG ]=yټH"7KEjw.7C=+nmRQdM.\"(>Pꅅ܍6A ƫ?gCcwB3/?OQ :d…6l(--=uTYY ;wgq7yŝ 8KdhzhRno&;===}}}z٫rZ42jzo~F~+_!a,2rFa˨gB7^oe(Cי w!DK55O>ټyG}D9-[FZC^]wD i\|r攞IQNMjNڰ`3K"&9\TTt-57Ν{̙r@~+ɍ_L"HdL3m,('5;Sdp =_1?1)ΡC6lXJ:u*GAn\ƜWFL Ԁ }= >^>n8O_q߾P]͗Pkg?K9Geee-?zϞ[onU50U @Si5#Ak"M誳9@I09SwI_Q?җL߳kE*R]^sڴivO\y7]#;Ld4 | _bywwĉ|OH5#q;76mJЁ02BRGb3=nz%tԩSWrlsg]Q|e6xd4-v` ?}+>Heƌ?9wUEזRWINn^t9L}8}:=^\\PP`"7r@:ogx"y@ogaK*:ܳ'Ou*=WU͘1T%MMYiq[WGg.z5t:d<^\^^gϞڸoooJ*#/XSS3gΜ$~a]_gwSNސSO*yD*--]f 7mȍ::e ?ƍ7^.ҹ?D"ZŐ]мvݑ~Y1LS!j̙UUUdIS.1?GɝwW^AMO뚵0Q\y%#eee'O.**⡬F!7 2(J+~{5w.9i#.`AG}=Y48<0yC, "t+Iy5O ̓'ġܨ9@꿮kdڸ\.2mx rCd@='gΤYNbbGZ/VNvɺ!xr8R+H&:_qĴiU|`EjUVOUT? _ZQQYYYQQA  ) il̽]=??A~X, ㏍UrH_rϛw+{VVVmcxdr m +Vt.]zaϞGql<N3%%%3\.>7L.i r6roBnn݆;g>ʮ1y2M2>yb њ_%_ 芓Fh ^ *JN0:WUut˛8qe$1dkx4+.45 Y7v) RqUHqH8! ä_?wIjN/Wq3I@Oz;SF֦ npǝ!)E!ͧcKq8\wx; ۻNS JTH]A9*%4ɔ,N#rGSkXsZ(IcFI)Gc]Y`Uqkt5/X7j&)>pUD2ܑ- 6L͘jocB1Gص؎GhfF UEiEd+X)uD|C:T?SΥcQj͋7wTZ"Jvg;)nә4}5^oF%nddrIk`it@ 7 @n] 70|r# ` CafHJ^˜a\))r";2c2WUR#8S*VL_NQQd Qc>2 B߀M|_TM\obZtTqSB |)5m?Dj;ڇJX˝m K0U ;5"ML; !72j[l&ݾу#_VVR tHa7"×hj.! /!TyA= )kX&Xhj.F0$ojms;j[\c"2cd{QXz .0"*i")e<c3nb@$58"DMR0̰9aMI[{UK']90Hg5 ݀n^.B}+ e aLOX* H0gLV|3&~C[ sgD՟jCA]}R!na¼,rҤ7V BM&E0L?F:+H)a IaboI`)_pG$3"$'u n M@n 7 r.@n>qٝ;cɶ;䆸;q.''++k``  OIU[G>8_R:{N{s͙1va}Jʩ>6,z-.9?u*MHK]Y>_J:7"9]ʦa V$ٺ),.wM++}7;;֛ևc|G<"IJH2g5~Lx$X4j5ءP -ꇿc+dB9n 2z* ˢ(r~o'JZZSS?GT!Lq5.r[hɩSʚJ{)vDX+^u7,ɞ!Sz%Lژbkp2"}SM^šZEa|I^FUj tŧHj!k._i?{ڀ>^V[k| zF9W mDU֤Ƚӵ赢w *]*1:F13.JOv𱳟=m~2mJr'N٭E\?݆~?N>L?,ѝ*:d%f&6([3nhZya%S 2E=6ʔ3IXq@vT=No| &EU-] ,DU!wR6D*WOv 5Ӻik ܻ?>L)/HnrscW1Idr}bQr;WV(F %զM-};C] -qZOKIɝ!3[nz{{&0;Kp>% fgg8/,SzPYuX ]S42T!mE uAxwPS -Rz6: nz1j_JDHMMWv:йKsF>7ԙʙ%Ierr&,r݅ 9 >Sn$YiI, hvx g*3;ٞ)/噧s_77{cŠb$Lɲ\XXWd *q&` ngyi0+ު^|FIqW012%A"z3r+ @.gho~#/Y~yY̚.8Y  \nj;sNTjEKe\˵;ZZg33rmjLnƀb+k'Nwbw_lyJY_`6#FfO+{G'RY? 3f)y_Os_y)θ;>|5i9eӿp^_o9'f_E'<xfb־1M;Fmw.U0F`1fq7\99߃4v0řQ*<Ӎb5Vd<鼟?g!+m>ȺiaY<; f&<#2hlG?~| FFd{7~S%c;R1qG5ƗL7}oSb-_#S*7`,(*qkn,]tDf伿zsdݧ ;YL1|ʾW~5˖?Crj?qG'2U+ܚ$)MEY4W[d v.;u}&>stt8]Z 2(ؕ&B,zݳ+[Z}Ka 7JD:=HS0,/zV2^MXeFS#scIS= ,G{HUFc8,攊x?f s|/k$S}][*hgṯÞ*#_ep(}T!!>,z/k UYO&SJ*"|RQXG;meG[j:Ts:lTXףw}=5|򡭲e|ٓŜ6Eݐ8e\6ȟ䬈yX?5LJNV'{ K|-|ZySV{匊Z6Τ髖}2ӛҧ3~r)dhz_%ɬ!YfsV}??9;j(/2f"u4_~8d&JttthȺlCM̽uWi{H Y͓#u dBc9qcү[T;I?;? y/76$*zy 7Lݬ9/ 坚mcC;2!ς_;F/8_]xW~_/~_D咛^.@E/Kу*/k%J/ 2dHzznJ#W^ \lYLL z3gϞݾ};آ _=ϝ[bEDDDRgzhݩxV,BD}E=A}_@~ p0ŋ 9aͶNbOW:/3qnBus>[(lcm%aggWпɏ2 5 Wcrs'cD&V¿B|F%prm5GIq=$_#L&S]]mh6i kͺmȪI M55vOn$&D,"e3SrkJS:z=hiiL(W3 .|饗,UbFFF.^;^p/]8lpF&#1bwW g JjP~N\;l+ufs>|FX|/_i1q‡PpЫC_혿p~p°O677UI~%e;op_q$99VK6W/|>i űTw??bb? l7\{ݼT, @O=хY/Rɤ2] 1 ˆ??7Y#mF]"'_^rS__OI2g(`i#7mG0j!  v6uuu r1+H$a?;dȐ?=tU,ğZ7|;]dݿ >%pz!]go3X gFGKRXv[w ^S{܃ QMM=qҥKQNW1U?}=tPr0*ύK\ ṵ3{W%r܂iE=Wa-7?<]R/hajtk)Nxf{sU2b8}DYp31Ã? DD03!ɕ3n J\?twGG}qBr*1 ERpN\Ɛ8G+pnŏ96+V][|Q̏P4>b|/ P'N\Ј<%Ja7m V96?Qd aȣlU*M:Q{{ + ۥX֍" dp[ϜICqimE\m# JƲԛwc3[Sm& v}} Iw7/I^Iؘ~# 5/A͡F`GurU̓؛̜?wÚ LC]_ܪb9uTn ExDx5{nĵF/H쵣68!`j匿{(J.x0͊OW}9Fj/x/yM</x]x RbݔAg as#Nc-Xo 8|ز)xm1M䐳lԠI \wȶB &ek'ZȫoHa}aɘ1åK'X|'EVm|5TSeduk~?}̋׍SI c9us^_Yus ,zR|~Q³|t3Z?_6r] e!@"/UgSTMU+IFKˬ2rZN2SòVZ jtպwl.ywXݬR㒜drcm,v88Ƹq hUT]ur޽~/^JʖjyU6& e'~#9'kS^9ǔSHN9T  %Z~9 gftIkK܎a o ][uvQLUƇjͥ9lrVKwg:cyviN67@m 6LJN2W:dNk;7~vUxK4wmҵ`KP8)oג{羛sluK<]K6)%əޠ3 |BZ9n1dic(NKV~.wYKYˡvu\jL<} uWLw\ݦ ^+ ڼE7|Νί6D>gYzSywt]2+[2D^l7G[&氾ư-׹/C?iڿL\G Hbj;0O^x}߬'O:Ikaq}*_xk76m };̫ z dC_[!p8zJۃc^/xt{n3s~߷g OahvQ&nA?{Y`_0@0@^U`|G/G ~ x s{OlWUO_28CG|}tG_|G@?/F\B$0@l4`}zqG La3*/ H@>?2m?' [8iZ6_fR,uՓ}F)t oq(^@/~ @/~ _@~ _@/ _/~_@/~ @~ _@/ _@/~_;6==Y/~ Jt; jkk@Ȑ! WW^ \lYLL zH={vtz,Z>@\sܹ+VDDD4667DTTC=~zzN:tBMMMtb^ _݅@?@zL>__uaػ**6W%}_ә}ۍwWBe]'56Ȃ;IڶW}J/Q>~_WǽE2~-z_Eԣ/ NND]V7GsX" FW~dyꂻԭn({㭵avoIKc .EuTw zw,U 9@nQʔJ$ΕgLέ !'gdqŖČbxKT[AqMw(.fe;x +>;C7WŊ }l UfȰT7 /EEi  $A;*E(8dmGLҬGne&6Fg|nnf!UWT!n{얩m͆)M KueTgN*/Zdd j>JU.1fdXk|XBkfn)jjR&]ƚ9ZB]FV;؞ ?JJWS S֗TH m cNzfH*rL185JĮOt dZZ.b6()n|%EK\:-B4&+JKe"QH^d>9 dGb6͢tE2^Lxk+cLYWNFӟC)qÛiòh t̛S '2 ^4NM9`j"&T-Ц$k  a62zZmA QSeo{Ƹs9)贸v~mhvq's}o.V7-dmjtTpgהhvs'"_tY+-]"~;q*1aJL9]k0bQX'qW6Ud*z=/=5]h}x,\c}͵GB&gRn j  'SRʒF=y^ʉ4%&R6Gֺ>n%0A]K/wQg,%g+dդMNR 钙|all}iqyf{&}TSY9y:!>)wG G [^m 2KIQq)ϩnF䨝:ys ON+|G26.z_Mbߛ/SdUu` BUi6-T%4|ؕrզ/+R#Zcܔȕڨ )ceeUcuCVV3&Ys?LV*Rr7Ѵ>~UЦ'V#Pn/ƞ2wj40M kupL߾δ4y ) y}H@pKY^5R$옙0#J3f)qCa:V^YjTkڞmQd-6ĸf',A<_xO˗nFEݐ.iN!&)N%YI.#cTJm%m&% ;֋=ٳcc㔥cUH1#ڨI"ZGhb1[=~Ձ0N,QBwmvIG/]C֟,'s%;F-~{bp_OB:dn:kyٿ!x3dPg,5T*Յ  v1N6=ړЯn]XX8oտmOX YIfEPri6HfvD㺬eX/[fJIR.ORag2 a s8jYg#?(fRZwMxQ@bd" oI\j\ssIΝL| @k ˃fIE$^pMҦhѷ#QD%5l4& wZ}~Oyɖ5J\if6Eʭ&Esw$;b%76J'"kZFߔVD@$ ]rE$fI֖$I>^LGdN8 бI& وj !7KԬ@ QzHq1:$g-]H$; [ Ҝp00LJZ͛o:~-\Y~]]ɁR5DQD- k {oI&qkpPhQCcwP(/JP`ebbbFp?쬐w}7Jx)"^&ɓ'~ٳϽeͳu')[M k`B7"00΀"&jѿ>]-X"""<K;vrt 2 hmi?~tthrl!CPrssI/ .*=63S<48`ċZn75`ctɽ" % tV. ---" DFFRcIAu'IR~hA|;mٳPZfuI$MbL_u-STrd/^$CluES #ͥpCo!>[;;!$['EӁ_STqF)ڹwމ3Gp7 g ~70U)$M?BLĐxVz|i0lrv$&5OM2#9J '[|rF N̜GbC SQbO;oīE33-ṯ{}ApB ->$1EƐ;i:f矯L챦u$z@5&%)JwfSūblSTZe 9&̧%%ː;yrnֳgE*^K덣DnQPDΣKe(.fe+V$$TӺc7ȵ5>h^9We xpI'0Si콙S3vږهج*JJjN}WN09B؞a([#2BӇ嗒Hbhhskvq݆o1 aZ1پ]1 ƒ/I@|-M&S+˚?v3gcSll̙gصs2Luuu.fܹ3ԱҚL!V?-3l;USAYieĶj>2neϐЕcbrGǼdNKYi79jik]M.V7-dm v'aMIsdUrN"_ƌ.Xvjѕy:@1+l9KtBZe8Rg1|~tyFcU?HuPlۢM3MV$'Qud^_)v îbĦѦ^_ʲz}Nvώ(a6*jSJJ4[kuscMmXB O甡]"6=]fRDNc2cH2\caZ\ϏҴ6y8<3vTȪ( 3v2Ng-}gI$IYKY9z>'GZhqW{:)ϗeٔuP?a_8k&Km4XبkSrK_Q?Cg\Ը$+W W:UX/x7Lf˖5X>IPFº@?~qI h}`|7;EڢUJVgf/~!K*F6m2lt eJ r_MMMxº5zaIIo.;To.4kq|f1Rg&iʙ=؉d4Lq<$aOMujvSOյ,8]̖+v%lWk-a7d;^~0y[!5IJMTGhmcbl ټY%rg-=2tynpB#b `3EnGL&daNclxoϞ QK4Bv|m~*Y_BSl(n>V:KX49~]s 3_19Wdy`3g# 0PW(Tɡ_: HET*Յ  v1%%L&O7/+38,G-v9ضԏMkB>QPQr$aEW4Q]2DGGΛ7O ,9(a q|by]b5t">:ۇDEEqLX@PR'W >h߲(fh^zޭ1Gȏ1 q/ dLEFF.T̖m]s5C  Iox9sN_ب>=t]-sGɓl;wqmY'I|=Hm5Gt)LclF>N?)d4ߔz qG2w<'YF %}PX|8;]!f2oii@sss@_!-knuӃW_kp,1F)Q=%]P.bY f$L\IAˮ֙(vwO?uJT4)d!sYTJ O j޹->rCbEkEZ̢H9j`Iv?h.Wg .5Υ6Ie·Y$`Yoˣ-8]$oq5g1YS+̬Ya"+gY$3-&?>93Y 6GǰdLbL|vaLBΕO> &4yqFJD 9%lblFETA1Z1ܜcf~1s6;цNGۑ ::s81+)53 o,ECoQڇth8fR@rBV?c Bw$zv"==tŵ7?y]ꍓ׆Rٛ:Xqc&+`,/io8RRRnMYES-'|=79Þ͖Rv^5AƷ!2{z˳$̪yg%Ƒ@6*]R1:'6|CBX( B$RO0KX( %Rժn2&);ZO=!}#<:vj3, C\v6C đG&?2[ãC5\єue#Y vC³o\{RNP#-)RZ4])C[2dޖil&+n2%[{KDAZ%eb\Riaws;M2rY85 Y,KF⪝@ý!|$% 1 3ҥ^Rn0H{R$(yu3NC9w)KN E~=f5T)ØBBw0C̝1$b,u_|)F⊟2d;vb}~CC)èA˵hRN}5d^7U67t o 1S FPX`rk܀!0қl trdGGor.N #]hQ^ h 16-`gΜuiVckbGD4}%uF@_λ#|bD}6=W \G{y]l( Ӷ={ڶf#]nf_ډ#UGL౲O=k{L'43ŵµ_0Ƥ.?ƤaSV@bO nŵ][7?+NTEA2QF",WN\Z kuh}ܚ*e{TK+cfZ0c' p$n ZfvsSsW-kP2 |f ۚy,p떖wmi9`ٜ RF{iυ;ؙA)-.>d}}m:::rodq'W6 Wo)o% "gGk̾?bgBAss͕AAO-y/  }BG >{m  p42Fl^j 2J 6  X$hQQ  b ӬQ  v-Z-eft+1K?LiE zL[ٌV%o\|IWӐ]:A2x;3Z|; YȺsAC[n0524M-:v]J#oC*LӴ-Mb`SQ /v[+U볳U#~k@MgW3MۡciȤ3߱M=-pVF6#}a4Ʋ23bc뎣)YȺsAO䕡[)0zc*ZX6eʬmXȅ9i۠:Qig*&ERTn궰WKTVNQ[c׆lXVNjXA?WFh+#4bu碨as7|8#'Yd4ٜ>Kd KI> ̮>W 3Ec+FT<&Wvx([#jga oFb,[ʣ v`-^*bBl켜(V5nISđ8djA'!0. .V/T@`v;!Y>D;M1~o"Tl}k-Z"36WS0soS ې~ɵ(r*_̼*r@J3uS(UvT&|aӔU1gyA,,o2r($SZ+i!>-_eфq=6r] ܣ&͠8CM4VLzG*z93}:C\j?> |?7ѽ*f 2$]A1[2-iv1l|a/[>M`֖|?0烍{fL ب\]JS9fFF1vϱ/Ao' {D3 v/ʹFϘ(`Z**Jw4|i4.$NƇ̑0?3p&lh{o\p\],\+# V~xx݁|nf8sxJԂS?-xx݆ 6> &A)k#  ؐoV@-cc! bR&qBA JEz:  v/uRfj  /iFTTT`! bhAA;4^a9`! btۧNBA31%Wfddtq bl(A$[hȐ!R !8WAA{_X*seA|L1o+DZm;W&++KREEEyyyYoiFT*ju}}͛7###B!rSYY hsڇnhhWγ 2ԨT*DΝ{Paa!$'Suvv\.^طo_<6f``x\VVNj# nnn{Uy@噔ݗ/_ 9۰j;.4, 1 ƍׁ H1<2QNmΧ/0ڹ466.rFpbK3gΐQMHKK#.꜋+]¨Q1 %P(@y@C3fL-€C TRRcs5ӽ{w1b?r61~N v6l zǏP?l(elbǬI`%j/:_$%cm۷ogdd7 \`#'$4zݻw.%)ؗJEEE1117%ӧH! iV ݫWee}Y8? Āٔfd$;p~~~U3à;wJ"lb $scDCbk W\&p,t*Ν;x{dm[p,$ov}߂: :޽:L&݉ZA:+CdydyddPI #4sttDUE6oNNN`& S| 0gq";JKKfaq_Rx8ǰzm8m|y9x-#LңGP9,65 4?B/tLll,8/_ӧ@ǀqTpЫW6 .^z$hqY mH=^RRϪtOڹ2p~:.LJX#5 MgggGGGѣG "aXӫM2aaa*0`Fqj@`m2whGt [ÈU]] N֍7b1dHAGLqq1"@>|tLPPdm63|8|˳@̀ jd:/!"d/<"fuGa7+rAT䅁 [ GX MD>'i+)S[WRM|2YzuJ7 At Ւ[>WU?fСV\YYY]] : ; ip1mHjɰdnگ]?beO>g=] CBCCAJ&%UUU 8,?w*W xXXXIIɑ#GLT*A>}@۴Aqn!.j u"EY4u veĖ;v]Zpȑ1~b\i]hܵCÊ_Ϛ5 +ygMÑ †Aʀc@C2V}mw-jlTwza1ؗWkF ?^4˒8{<;ܰOtacC!8}Qwң5e t:&JLȤ]l>AA{eZ^AAv¤\i ~'tycC!5  HG)N}Ao)c2eAw1cVo9}46  `X&m  vWAA{[̘2AAޅL  R eP  bRƢW  -ep    @    ,Ht  bRmDA )c*RLAdɼgty6<؉iWͻZ^^[<=="#B7xn7 5*{&  H<t=#)Hث[F$rջW7<~RXRQYUkrӏg6dwaNQ.N㩓(e)+MΕP\,3C'[λ#;iWgwA:Cʘh NAۏ4Yl\'Dž>4DĮ_1Z\UYqܹ䷗H*D&H`a^P ҹJXMœWK[ZZRQ.9i8~\eeE]]#$h͌3?ϑM1WީӨ2_17{TMm^nPVA:+cnگQiz ͕>dŭ&YRZ/L'7mJ3h~\y31'֘;[8ad)јF"|]( X,.--%->}i^&$]}Gn(?A/`w ?d& ҉Jޅ]H:]c  -x؅h'ɍ5U1#ԸŎW**&&͕ŧϝQۇh@6 vB55kR''i'%Ci(Zmϯέ-~b¢2._ [qQwnRg"y+Z)S^sb']\Ti4jMo~ EbX$k1_B1 H`$WMRNe?n.jnS lvjqN_ًjUu ; \I˭byx@XQ8w_Uv" : vKGX8!(TOݭ54c` . (eOã`v@i' AAA)  RAA2  (eAA =P(^XjF(fEDWkcoϑ yz?^ rsJ$~ 4ݨTj_&} ]AAA vAw90|@ȞR)JO!e@]X*i>#G vZo޼dbt))C$A=b6+'A$GWTB7=-^ӳkTG裏# EIbZe]8[pzEEZVTe5Uյ{@^a@UBP =vR c1@}}=A.(e@Ĩi6hAV$qwwwssurr:xJCa@i4,]]:iB:Ț-{PUUUSSSUU]ZZ-KAxyyyxxܾt\6eɉw#ʔصP5ׇqGi?l^VwX5M388:$$NwQ/-.dl p3[ƚi6;Kn(W;2W,T j[^]ϽDXEC|AbM HJi.׀9~TVkBX,vppD7tAzJC1KoXa˴a4Td2>Z13>M4](& QkU526eЌLeSL5c XuFJ9>svhYiCۇÆ<~|I,{YT,A {e VzcfD IszhΔcs4tGuwd~e0Ϟ_#twYʌ)a=f; 2=:S>Z6u&)Ŭ!u0%?``)|5قe-Hՠ:f*EfEDžY>.k<&YϵޢmX5guDzk0;vPӧS;vdpΕ_ R2a[Hx#?x2-}F 59lM쏗 vY6~6& y7kp /tT3$呇<e-ϝ1y) vf^lgЏWXe;OObԦQi6Ւ)v ,?l39SMY p s>d-eKEo?ۑwI^yx6mTf&2'ehJ;%Ǿ[uF2>Ka~~8V0;iљ;wfp[P bo; Zf3xhc˃O0ZD &:3IJ1cV\![c nznj:g^Ȝ).g1Sw 5zSm80g g;ml5W6=nXs~=+LS뽼bgmi' _Yq\LSf~5?v;ʦRUVV4u3{Ci&1M|̾W^)E6͞ ̵L5gǯ1*xҳ붞{(bb-| ...%R&QSl!5jN]3\ruCҿfr/nH[~({3 XSPT yL$3V{YcwfȔ9ޛ6cĄ}4Y~~2Fɳ/ͦHtɴ ˷靵X)u9LoECZ14Ųz{qZhyVETTdd^KVNgOĞ؉MDI合,-W&eg5q-؍0q=Y̧>WAJV͞49uZJC%?&bz0RM޿5 yjI@aڷxC WuVYL e)방}aMٙJ'F&,괰 "n?;8L]Z+:PQT-z6Zd5nD+nDFD|7(?Qi~Ӗu&SO~醑ٻ7''gR: L4AO+e4 K%CXHÌ4ը4]`~ ?v?M3[!r??y|7{.yc%do LILf^є]KLIjra9ۨAu_ߒʻI)j᭢x f*!ïS빃ݠ V|:5^^Y?eL`-X@LY~<b:rxև b$0?fO,ƂXOiHOL!?rb:x]𦯾[hn{#GřKp_8nx5lwowotǦh17r2={77-\pŊ׮]k Ӧmi5rNcHy;w[p?6~<P"/P7Ghh;Sf͚$pFrWV5aA~^ک5 E ~6eJmn}ZJ-ZHt:w?J݀mњoهڹ(=_ޞ2o)-4=WW^CӘۖ/29+ ]aK)ܡPZnUAMTܹd,u:Eb<vE߮GP&ʞo9NE7JnhTRYѽ o&GWD,1@u[؊D7V+U®@ { O͗D),00ƍ]P#|A f_RBI H1FTBχo2߶mryddxEEA&e.KئȟM/^jڵkAtJ$7|; ]M.>eN HW^b1NE&>Xkn Ϗ}K>Ŏ  Q͛7/^Hf;jq# e yFQQQ߾}kkk!&00̹sP  rHg6662Sd4w~V3Ek7!HkM&a RA7..NX)8 &@hhh@@'@4#>ZFidweC:۷oQ JKK)=#/o8 <5ޣG~ͼIMLH矶+dIHi2Y6$>rrr *++J%zeAm)_\\,BJH PL9{5/W3Z ߲EѺB 7쭢DXML%zH9tV:̃D,34`ĒńA͟ ╩E =/erssD=4D\;IrСo0D=ёH"n4ylF"$&9MHVșu9#(-M}Hm&*,KJ9*Oy1*39~yDMMM}}Jz]BIf EtY2{F$m~5BrZ/"=$$+=' u"KNu5҅C/3T2,6J6K.#)hFiP(L?_ONHl A eww^zeddܹsuM U[(v~57/1bY٢覧h]+$|?iN )A@K}={,>rM!鰗r^':ŴDHONIOeĔԤ-z7E5UA+,9`9;rKEܢJNkƀA@$lU$=?YYw?s:H6lX^r~ i)?}4< {L"Dt֖%0ؒ/H$rBn䕑%mnJ/_lQ$;YySdԬ&å[3P$BMU;;E}V;NQ8QD%:I d(І} ޳f 2O8j>??ߒ!B$Nj.NpVBZ~xcrZ׏ΐxuha]BM])5kA$Mi &*Skƌ/D4' t)C1Tڜiv.$>#UU&wqu* PGH; :|iZh5Fb$r㭷Ln/5e ! GhiՔ{הdQ[oaK9-BEB b)$iի-#AYOHÆyO t9s̵k*** ZVVVUUk``[hB9 ۷[Ua Y_GG 0L pDҬ1ؑ1 2n'!@܎j%رO%sڽed @˶ookTܟz%ſXA h#GW___WWWSPTT+I\]t_\LcAAK%#%^1 Cä˄똖(w +Dgd!acJJ* GkGʧO7V9LTmvq1raA2ѣGuVUUUSSSUU]ZZ-KAxyyyxxTT14SZk/ W$sYVё/YHć^t 'eLL]tR$^u1|/~8dlspRS3*(!N0gT=5S7/gK6o!,ϩS}eA2cܸq[n /)))--uuuj;#|}{sgg7kh&J".9ZY)4P1+şkNmMQ$̦6{fZ h4 2S<?$W9kLK8ܨbwT>?o2_"y weFA)c :pR)\ @L888~9BoLɱzq d ??"MRgW~b Hk_\,WXCfÿcΧ„)ݗo$DAb:.>udΥvc 2ߖLayg1uU"bDrH@˗8ZGΠҥ"6@783ޚIMÿsA2m!$$dԨQ!ܼ9 B$:7˓Tv|Ɓ[6Q/#<#_~dg$]"ClD"֣?]Z4$CL.O/EEJJ}>m{y~7dZ镐@Rp>#@ h|Rf+w2(O]z:,_~ܫ[ t!6߰Ac;n\\˧ri %7~rQP$D) >kw*j|qȑÆ 4kC+Y.;{ͨ~]rsa4~cL0cY^˖=" goM{oȐ˩ԭ#5%9^7@`#f'+u'~&Vݺ>?Ѳ*$< ) @͜roIKfJϚJ1(ΐn=)KI%n5,!WWW{{w- 000%V!GԳCX=uj_}t!HKr.6x_Ή 1MC~>y)siz],q+{Cjgt vpۃ3V~|L6'x2;'&m{Dz8`NOi2k3%Dma}-\š\ω|)%u,%D5;E!0ߨLڜu(Nn!9.dy gLeLPU0Է|t35Quܬ3$R^KM'mur303p"3lOT544hT6J%9{ohjΞڵC?CϞx"@A)x:6{~ի'OqKӣٙaŁT!pRV\{eO^t~YBP Ny!QϺItʙ]=…M?bm*B˨˄"@ӎTfu7Eb:T \1Z\>{197ډ5:YÃܙRW=-`?#ڰn}<4Ґ< yLɖ-~{sz~`D:/XP ~o9~rRB@IVvp *RRZSyR,U\Rp:&uGcn6/I٪HjR+ForIWɘU6& n1mFK5! ɹs/֪Uw7m}1} '2⻟^yHѣpICB*e/aaBP'U=] 3uWm.ǡEf(|LQP:7B afOdY:$5_ =}2G|iP]y饲ۛz_]H1 =<<{A+0@C 8Ν; JG~@֐ɭOoYj<<5AAׯ}麙Y'z͘?" ܛRIz/^L{{e21)$WW 2k! bOiBak]DDm*xX}A2gN~ǭV=:$D9lsQˎpiG>{ę3g_^QQA-++Cn-.Z#Hgi hsBϬZ9b(ZrEvAr$0gp =#e?<~%.:Cn*|#G!oi(*$nqurrp QPd:nSTTs`^}ݺyMLuA2cn<5~YIw {1'F훣Gv .p궪Z,Ž^^^ **<hN?]]]˝+MKTZ*ΦU+=Gɐ Hcsw-RA@[˂8 ѣ/\i1 '>!%   &Ljͩ*mv-A]:6toա{Ĩ-Ұ~UEE^yERgATԝ>,(@k嫯RQQc\|dHp 4dTH xb1\^'O8pSF69*[?BLy1>2g*hmrzACr7$jFyFjl+A2w-"Pӳ[nfsctHHȨQN:Ef҈DJĉ#FT.YrB%vذ,SRt^JIW %syZma>mdt@@'=t~ѣ7:fAQ+|@Dצ>>>f;J-1f̘2ƍGnr&@hEd"9Y +xIٔ%%u4MC@P[)r8kqh go5o^W+2ltbfu SM(/{/&fkbB@ׅ—^]\ 1#HT3 v'e$vjJenDKt !22EIdTFS DHAw)[{-JF)ySy5GAKo3!أ]}V(G@дVE›6Ҝt!=s$$+p.cՂpɢrVCw Y+R<&3RGM7XhSSy1c#?-{mԟ^M/|eYd/6 }I\$:tFzfh]-ؗybZ< Veݖ'-++@cioVM!??OVU3_T'}AHʨ"fVjE-žYՊ!_{E5iu.P3JJ3@͒Segy h b3~7<˄q,QwL6S}Ś͛& e HbyqӜZ"ɲ>Cfy/H$BݸI YrZZ/\JIsYonN:f;h$| x4[-[RIMROJF%l2&X5Ӧ o\l ׌@c–AKMFKEBTƐ~-((\e}wkYfML̠K,FDA,-tmhOh4KэW2&"CCC>^...zC֎p%B_Y_Gr~FVhYr<իbG=vN^o߾uVCCb)++STx"?l>Z*_ʜ5K~ӃlA7) \))e=z8- N eD_[[{@A&%Z7Tp W{Nu&ֺݺ9dD v'e|WłwqKI^-3  E Ew(N3tNb~~??'x+4ځbKOU~su J$?pɠ_fA:seJ!j?N>-=/c..jfkwx7͕V4TjjZQ7TS:X$8HNb#11xTAj{.}.1T +zM1L" x~&?!TVNPJ^YQ 78;;;Jv]T:#hυn+N6D#G-rrJbeA:ffR3E+WjVY#NfIӞQWWUU"TwgDRg+؏yD~wa~!q&vx GHxo'x ASh~"gføq\d#ںhǎL: >>>^^nn^^~~=4~ uEN7Sv.qw+anM3 H'OY(vE/`!t{e(}.WO?U6u.D>$: xС!sD ̈b^0@$P(xYA^i2c/CTAؚ<D69^L~:Eir4;%X_~- "..n%#v9 %P=~y+ ؟!jHgggɓ}OBTuǏ_9~k_rOlť"@K]2PkWWL!zRgf)y1"2F@2"&Yi5#"&2@84a*B^!wTueHBBY9g̚ ٓϻΜ9sϙ)D}o9oJudNmʥ!+OGHĬ3֗i|SśZohVqo:LJj d9(·'/h?O1m).ha9h[20d6(c4ӭV5449r-6?~?~~7>n0)%nbo9ۆq(\#qDy{&i\mVGߧ9O=JϑRk+ (TwB-_d)o-Ub%yFT&rKU%i!LZv9lH3jf5<=/Ŷ#([W.ͺ\zg8F.U"Cmf:2pm)l"UH!"o$cJ;nP7 $kL-i3` 5;"cJK:Z*aK7>dz<_bdlFw} c{+51SR⭱ "Jc3Q+0j9 (f>fb4w^9.镟O)9[՗\zqSwϟ8W#+?=96IhL1>_ +kdB='u{CmSdnj2OW'_2E2w|mK>}T- h>?lTS11/m-^5KP-UQFhjƚO}uܭc,ڷui5/wύ5~p䟭11)S_g0D^ZR0EwHNU)a-s"J~:yhΕ T"HW̑tSB^%IM<_:䎳=K20Lve}g9#~lYbڶ sSEXŪ$cr"+Mh1E (}yFI3q[R3ݭgc֡3J'ʠExRa쑯h5S2-_-kX@8?]tt on-th[ox;:eis?-P?5]F`]RN8sB/W=|Ĵ}c~v]+1#"4#"FMK0JQ{ Ro*(o0y|'TDv/ꨟy\gnoq7@#ni'ʾѳh>6)liX1MNl>GSvI2+?\~8.IBm0hRZnQ}`K0Y:RWeFƸ `o0EYh1'wD2qsC/l[\*I-}O]k&O'Iޒ>uS 7i圡\ݨJ]x$# J|y{E&U_,1jp(QFRnU 12Lt{Zٵkߟc4~r-@3T+i0$Ǩl0[ŀ-Lf]liXbM.k4O%%o۫SZcM4Ł{[׺W/8RńGٕ6^O縟kGl{/yrx'~>eNۯgU|Y~`'Uj6%i2ք=~iGn|2v?_8f_5%>}֟U.?>U{`_izB|v\n?TΔ;Y#ɿIjifvyu,/g\jW0WMJYWDSu#JHܑ~49lRa"nN(gR~ը*jw:B @wE;/Ϟ=+bcxrq[{9ۈ#D4bɟ{?>|ܩS-}^-MļyZLD.>+KD+L~vf:NbQwÉ71&SW~aCt9(_|񱱱}u:soMliQ0Tq<#Bz>uo~{w/HGwx:7+`㎉|g6p:"bcmۖK]`Z]S6GV)ZFӔa2ZǨE"nj=Zc`DdG)=Pʨgzˀj[9'ijD3mZ5| 7---bwЧ?T9x݊WBWOz9's$UXQk•~o8Zq5ӧ)DkF ęӕЂKljJEK*Z1Z7*C!t]+iF7jҌKYRQrƱ5}zuםPZ:LNgW>rWJ0MkҪMj\}ֿc3‹WԳq_пDwI1Dv_6UI@鮀{G ׁ#|/7ɞo\M*q5,Ě}uxB( mد\<7ya78:(dBY5h_:$^DȯeJ<1j'1\*k^-7SJ+ᨴO^fD eVZQ'h'D}6 6 )*8xMޔ۠$Ҳynr3bl1F1f1$Đd6O}=VGV3SIE-hCjdT1\Dn"prSA'xZO(ZRӖionG^1fܤmƑQ֐c|+gXճkJ4e2dLMTѢZD~H9鯫uB?+Y}Iccc͚>|ۄzbĴXôD 5A¦[S"%%j*' *!K<UrR_N.XRTzc"/|bM5g#2C9>bB\-1HKFE,P>Q/0bOeuϸ;a1X`轿70tX&y_TrL nhcN+yW0#窌7on)H%TDžCSnlMOnQle%7mڇ`E ŊM[MͭM/,/[nH-e/4o-,T_&rV 湅9Q~wi <8$UZՉ W{,g2rhS -,j2&iÃ%}s uͱuz_M|=(0e/rHee!DfA1BXqnJʴ²ҲZC4dN+_r(Q+ QV.>&W_Kmm=3cMsחoPn>ңc5IZᐍ,su?XWb֕]=gg),O1FH[td!cyu-WIju>^(r͑zwsbKsoy> }h@YFNu[nO+#C*|` ܞ[n_B g\ l}cSG J[l{w Y? aqm0{Vι>GBdnX}=Aa9iu~I_uI~͏^4_w/uW[KڽKquʘybs7RUjK_+f7=dp`=izL}IjD*?  _a/okowsrY㱶clIY2V$Coe }/-7NG~O 3 mDz2DV~jlR:WmorZﴽ?'a`pACsx\n@wi=x.mكߘ`YmjKzj=\e<=g19"=s9 Q]=e*B_2 g+l>}:+4'b3tv0z0ԢLw0c*D Qe2D e2(@ eQ(@ Q(2D Qe2D e2(@ eQ(@D Q(2D Qe2D@ e2(@ eQ(@D Q(2D Qe2D@ e2(@ Q(@D Q(2D e2D@ e2(@ Q(@D Q(2D e2D@ eQ(@ Q(@D Qe2D e2D@ eQ(@ Q(2D Qe2D e2(@ eQ(@ Q(2D Qe2D e2(@ eQ(@D Q(2D Qe2D@ e2(@ eQ(@D Q(2D Qe2D@ e2(@ Q(@D Q(2D e2D@=8 6B2}&@ eQ(@ Q(2D Qe2D e2(@ eQ(@ @1G3CxbhUw66ߎLü8 U^^>V;xlaDڰCj˖-7pt oMEFw0fuxrJJȑCc]$++K Dn%HUe{oQreZ[wWעeLBXkSNݻwQ<OWgp`0FxvZ[Zoq*o[WWgϞKmhOرo}kˮ鴘qVӧ7©S>.L,)ݻgѢEjҥKϜonn#c7V\޸+nV>eg{hY,\scNNRRRk*6S'*BMZLޯʸ++O444\SJ9_Qk85>6V܋!^6;4|j'^ؕ{˧xB |SÇ@OLk\sM6N{8(xlٝS{-ѕoc\ھqʕ?gԍwJq4eGvcVZuɝ;w֊ƍǎxܵubih=uWܜ[)RWJR;׵![\ohr&J}m,WZʯ< {ʷ6i~o{ѫ ݱveo^Nz6G L-?hD}.]9yd5ȑ#;b`ʔ)_|43ӛ^r_z)׿N-n^V+6y[|է t6vD˗/hq;\՞=Eilcr2ӧIhڀx`H:D)?8c4mF㲍2Nt]]]rb`ҤIMMg 1rss7 W,YQn] 2ާY$W~+K/מ|]Va Lf9!lݺ{շ8W/^~W'Oŝ1&4B?]}6<=;B2W}uS~%vgk֗˟H0b@kxB.+RB~Ty=/9eP%d]Tp-TfU2QSs7WŋٽE$ǗC>1c㡇_M_ 䇫';ڮ2a&r7oެd_F)9F>FӬ%QW^9pmݦ ^cǎH. gzuPiP( ‹ ɓ6kcQ{m{CF?MuϤ~NIݱÖF^F9FkRb%9e"nb@<b4Gqi͖ `Ҍ ƉV$HceSvQ޹}FxFU j\QSy:ġ^]_}8l//RzsךĈJ%H^IJE(x ~mY{IvZKC]E{W.ֈ#O_BK!RQ&"do8𬖽$!"Vhޮ5\F:C_I ^K(4=8T.!6x45K3CCOyMْ8*OE0[[3\eΥzd66qC'[='Mt6dqkK8I4}DSVQbZ,Kíf}-J.qECZsxСWe<]3e"ļN?R@B\vT1G+YUN+7(S}F׳ ,ZV\:==:"h;ND"={f"b7{(D^QNrHQ?;5hZ1[L؅pD,رCέRW* ;)8Ԏ^U &TPwߪNj[}T$LxUbg׼AFѣG'$$i?~׮]qqqr%ȲK$af:tO'`͜'N>|QFTzR|u")[=gCkXW#rɯ$V&%[SYgoO_QkU+T'rn'qN˴.[3[IeٺIGZr9|&ݲxV͎zBMhEZP]x~Xޛ}fo[jҿO}oS/eܝ~seE|чŻ$kVEP:b8\v,; \Bc65|owԃt97H?w,/5y$Lq2O%c_׏e+wOrF>.9/8j0Lv,xM@C8tO`WpuG˴ abnDJۯ7秿& dev=HR$Oo^гu\b1l]J?,/1eYGG_}q9ݓtgi߶1QM7=IY/I)0et?GQ za:Y8ࣈE?_Ur%';J!$2w uWH -?] 3a,l:z}q+{;B_EİQb-)Iߜ7Y7_t&(00_LP}>_H>|׬w4K|&ϖ~bā!i|NSD|u_eɗի暧_Ûw݋D̹Cէ5V|~\vqlm()PSSoƇX'WL'+p޶p?0vy|]nLE`2ns-a΀aTMζat|BuRɇ>̇P6q#_*e*?&+!Ƥf Ϗcʲe|f%mkʶI/^uu mD7UUU^%'cӯ]ZG}g %wkddT|XTGaɟ=×E툨k\紋R't|hq:_; | 3ZĀ-7[LNǼdžna/lxqOKe;a4c2G=qzRMF_K"Cc›cI|E 6e3"+ 9 ?cGFF/|pӧoi[[[xb|E}ɗ67քC=ap>'~d@/EC|}L 0Lݫ֩F!|xPF`'tXz^FtL݅@O *q8!e#_ SW8`@d2N=xecş^xu?/~$ʟB7BYQ?@+pYxc=j2~Tڰy-٧-8vY< Rt4,`r2,ˤlSĘ>>; ,)U)<łHE?LYxq᲼3JiȲx3[]SM5sgj奇CmS+/+Lx{ȑ,KӰЇ2l^z VWЮ@Q<<^6ϙv.I\ZM SiywCW0elboY;Qd*tuS@Dze"S?[V\ZrW3 SdϽ;e)<\.&I)e&ܖYͳ6Xе\tG#xHGfÄ) nKټsgv6Rތv-$3wF+߹4+mҶ\>*LJQgKjz#E*qH ƏDj M>a2Y]x[ol^1gmZ/y͏R)f4K\|_f2i_^DYJ˅Rz+TV*e/xk+r]P`fm|2OpGv2쵗1/m_p! L?/Qp0+f{ꑹ6sNt{™"ܓ&~Ѝt'4 Sދ؛+D^;UY[JZ>9k‡ B$e Zkg2S!YjIFk)b9 7|h᎗T-3|9=6W盖OZsz+laa`rHK! \B_g"+T}GO*Σk]z f1e\„d2ai ^)` sLYzefrᅔЏ&&T#l֜S,dnYz%w2Z^H.,YVYW^Z]U Ƨq^&-f-SAg"l~Ke^2QBX6] mv JX g%i)ebL5+*SRh>vTj,3WO~s [cw\h W;h=6,,G3"ulkh~ Ұ:Ay:yz#5k.Usk t;g[fG | 08Q߭ě~~/,{)/ruՅvҋz& 5UcEAӀLXJR~3N}oZH:IѤfϚ2ps֪^H1s~̼w*F瞧~SFRNw,zIIqh8=RCa%)ޣ7^Q^7p| Wp?S2L?02Nd w`FgH]QAJ͆@!rظ[j!x8ƇG#Hռ 49|DuԩS{Ac;ђ+2---YS;v 1 G'R` z:Usehʕ(^9DZ;Wp$%%!2m4?)m`QXx!8qeYr&L셵!'?uOypjw\{m؋1ȑ# (֒U||9Fչ/nll$6L&@]gt\9NNן?_~+..1cF|Q<[awcXBѳmk~h.WFF<ԩSC?~|TTT؋{m)uQ #c8:vU~Ʒ޺h<A7ƪA̻ցq$6vtݰĸ⊪1ۈ~׿_[tL#(}ٳ%%%{'+'e’9,B"UUUnܖ|7MJFm?r]ZZo"_l766AC¯ʐ=W-7w49Ev5c^vm F|jH¢"hIZPwTbڤFGmc-߶tِuGB {С$ϝ;7iҤGIxEEEJJJx̴(eU"e*HEyvw՟rYs_"r0Gw?+WR$?JD~'k׉vo|]w_?=>\l]dT+c{bbb+1D׏\F1lذa4phCB!&9Un`j74: Ƶ9|0… Q.PJhN:"ByVc/υh>1Ç' 2&G!hWC`¥䁱i]t 7BjҤIş?''Qnj=e]ۼbߍV$DKGG69`&ÿvp'32'O$gE!?mɡ!.Gxy'й2߸fr;u׏|%h[[|]8q%I'̸1CbOLnnkkiz\}՝v"Rxq{:6s\\m=&*!1p3g|!G F&]WT[ L|95su+# ^AE!6ǻҟ;Ηڏkn?iȉDN rpr޽t*^>\rE#j WWW7a„m`:::޹Gn2w u#P Du:xxBcMa2 7.^j=f1&L1$!j1s"\H7C:"_ Bٳg'O?S\G"m>tPgY1D0QDDpjfRm$}]qAv;/Nm˻X6u=ߝ_2/<~B℥ ѯIj:B] 蔬ǒFv}1{{[{smMcYzUS3ΓE E z6ǩs̈QLLT=4Ķ ѿDZcJJJxٔH.]v..2+ω!YI#G)Cr#IV;{~WdR#?y-[HK.]5ۦ]:FFF$YI(Bjisqp#:\IrQ-9&_Lqqqƍ K:#" ߽Dj99c6)믿eW/:݋%,O}'g]7e ?,#+]pnު+2Н1rB̹s o5y}'?~fwsdSN}|tCuqL' 0}^v5ad@cWIwyqut#9畈p!RܮԐ.j[[o5""$]k{Qo5}dԩS?\헲G K{>|oil=So+S4ml^cuq* eЉ'53|d;\b"u|?6}fGDFΓgZ.OOL>~x◓&?u80I:_쮺f+y~L[k8u1bӓ68782il̝ssRJN^p%=WOT7;}- QcmΕ9u;;8N';WҏVWW/\Ћ{'mΖ6l}`|Ԩq_<~iS5I)lm۶~uڴߦ֎vr%g]yc{{k\a{\˽Q!?b VУF5cr*wW1"Dr6'GJ/%k+X":1R׶퇮ç~[v蘦Ze~a/pSeb4~D6ľTjKpyF]QuDDCqYt1pxet6ϕ!:رcD^sss[[w.''?_ߜ/iۏ=~k~Lmhu9\NC聞^(.>!fNZ_+.ϛN x8@r=Ȍ2VVVVUU]~у;"-.eƏNV+rve?|8oȐ[ThN >) >ӱqG'5y}N'AdTip=աMteYSb1 \2~ ѣG(xH,?t8[ۏoknmjkkj4OfuvuҴ_G}'v'bm:l 뮻N޷Y333O$ʩ:S[[;{?o]}Uk +Ϝ8BJ$RXV<;n0IC'  WHi'[{Nm=IK:s D}r86;/2"i@ԗMю gƟ+J{ s5׌1"֏ul|S-y 㣇Tx␙ymT ŋB,X!]~}Ącp5FF!Eel0g;o]E9W7e+U#<V6pOUCTcccsfϞMNKs8\5q)C̝;E 0 IKrWِ15Z:ЃLw\[ne֭,p 1+ %5=;+:* ^+%8.3{gxQYYw(s?g1~>̉v9|}}+З',y˄H˲y6'::N{11OKk}vUoٳg=cǎ;E 1 pюh/}rE7=^FnGS'AQq)~ Д+` t ^&\ k0tQ.\s@])端B0*4z_`@~Ma? P[q?[_X3'NpɠA'$O^r K3Ͻ4TO*06Ɨ{eлŌW=]VES>_~DAXW-;?4cb0)xASDиʩK𼐊1!indr5֣mLl(Ś,1撒\#Z h\2' xs89W%ϜQpYDa@.mF>,ǰ$۲ ̘)Ō%'b*dΑ-%f[[?͸Q4jT&i1#CuYPjw8b4ѷt (r%(rE`R 2|!R5+K7qhQ!f0$]fUF0暬VBr؈]:}jqb2e4ʮFsImF-v[>͊v@T\(+#i^^^ʐ e72n܂0c$/G<]$ nB3Q> 69W fC1!s zԡAnAFkc fjyMS! ƿ1."h< O(gĝ~HS 6FYԔMsYZs_1p,OT xz5WgpۓhP52ce Jl cp n'!III= }ہiɡU9?\"I*L]Lxݏp(i 1MK8D{^>0M?hdiun  eW9Q˘s'05BP,JdC9P1`n*X9f6Ete 4kj76(2[hF䷐1y5S旑,(pQh\V4&L, -QL U2TєkZ%ݩeD0zQv8Lg}dFbV[p/ATzd4;$x50.°p_%3THI(vX8.n^e諳0z%r^@~sk :YV)4EQc@2y4 .n2Y< U!bpq||V~kG$E)c!(K;1in%#ArXc@1sdL\ a->ӵkzQXlhl.\LeIitTT ʦɖ˟U--TXzYLQ.KKߕKd7`Ma@`Cd{]L S(+i2_Aʈ3Ԅٵkׯ_-RUFv6SJ(,, ^HNb*Y8\&js|0CeXlay,r$@ P,&Y Cb|C)x9ĥ2\ռz;Y'DbŊK/DPB |(?j]yH|!b"-ׇcD!!M:r*p 73pg~-P+,h2ZrM:sPܰҪtPs?:AFT &,#7lK[({F4l4[x*cLSM49J07ć'u"db/^z?r%*߿p_,Y=~i~bFr\2TҤg{ѥ|*}qd'd|{ٲee,_[YAtM=[B:G Ϡ-K\DuSt.SdԗUVeesHi1 ,BhUP2PFsI\2R&l)/|jJ:@EH 84zRRH5t)ڵk͚586}R?o~~z2)CtC=4uԀRFxeSQ`Zj09`Zq# a&EHM6,)k0c8#:O0sL&g#@Z&IC b YŴuhK{ov}K,75/3)`YZXӚryD6%4zy#h=h̠dVspFT|5abQ% HyW%ݳ2|(zH+Jf%3}G& 2Z |LÓEMon>>+5CG"  PGD҆ rn) ]% >IsoӘF"jNS.)RULi1m,&YY65}iVrS>3yI_R,$]bߑIg,hBZ4W؏&':Kg$ W #hqeA%ZhƠOHuB[I_\rRoVD1@'@JdW+;IZt .i@Ȇůj9|HK^Η%#ha^jwQ3H1ELQԏ*@'U~XB$&Ge\z矛u.s&>һCWd I¶sBp!V'_A6C}Jx~($EIr4LZM8^::5 r=G4ڰIʴbG{{;zELLLG'_]}XT̬L՜ߞ^/*HBzr-Rtٛ㳒yPfT˦:j 3$>$/5!%~uܞ8gߑU wNTK5gpn "Lh[Vɏ;U3^F<ȇU+pDBSIzoNLr!Er< iN?Ͷ憨$]B(j:hʟ3 1h)S%ңDa"7DûłH!$sR__ODСCA@hu:ZqT6n}S-HIf4;,I)=4\i=P:Q!Vgnri;a@$'G1nhi:E;"Q6Udwͫ`*S4 <D4JޛCjZWZA,D JqZt5&fAz` J*ae0i4}8XyȔ_@mUg>Qoek4KTDUugaQ&.Lt46=1\.o\^ڳ.kP3 +HTaO8OBw[?iGCogQ~P dq{Hn3dMV#fY7U}}g=q,d%%/<5PM'fUs+gZXzn:+SonV5UKTspÎtH(dtqc:I Bt3"2ryW7 G78.tWFFF8:+#<}d1k:`'N^}\Gg"'sskjޟ/udzU6AH5A4HSU}IY~UHW_~B+`YW,kBJg ZN͠_ .U'Ιu!>K>.27F" aN>= >v26_ڗ&?Rw's9:q IGT$Qk3ֈMȥ3{ު PMDnv|bNnժ? ٳ:U?_nHNpʦj1ETj1chsn[Ư:ZfeF'Khp9:R8($MRDxeAʰս~'7^SSiT%EEIN'һJ"eOA{?[~ܳliVڕ,,Dgxπ! $1^/ϪX6W{|u^E_rd3liТ,ĩBEگHҊ̿ŽԟT ]bӪ&TT_#:!=.i=I+ψ<^x$1 7,O *usSvzT0c/TBu)__8>s~c+v=z#˖ѣGǏo5~n|öG?鮇tt{NMP{6mbA,O/]ivOhuDGGߗeӎ'W.y5Q__/1v0ű26oI/J_ E @ ^+cW95,)hAP.OHK^tIA}jOXz'Xa9voݷ`X^ڂ4fӶ+Ӻ8kY}& -6 ,A,Yj KdрлKse:Q4陋:?fl{P s{\{KM_|O܁6j[3풻' {˶z%%wwKVfl{:hdcOY}`l|Ѵ,jXTG0̥J$d&UӋ?}zuF:-)=B{Xd~Y_]My~1 ٱkjYȮ5eԬa>Ӗ}Q>ĺC6mbo_@clڼS$6Y3eA n47;n˟k6/4ZkJX͛ӘͥMI+ۼI]:iTv}{<)>ޥ tٚ, Lor_'nSr~EP7-\TBvMyyt߼3,9MvM9lToHvqM٣o[Y{RQK7-d[qM7SY{r2~T֟B# e%_s1?{g&:榜]W7Ǿq|qF +gJS?_ⶬ|zOo_n~Cfߘ/FL|f̛ٲRv (U*V+Fwn/͕yoϤhyGkߝ>~aOl:eT-//2%mZ.!/LN2DRg>V+Lb޺S<3SٵkٹW#oxLi,zЯ~%J-SC$}h˳RRiVV;k@WRLyezE"Z'ejv|Zsܜ?-5jC+^8| IL> ![laOlݚm{Ysf"__1B)B"̙ǔ3ۇeTZ7o^9>2WfȑMMd']tu0G֟Ϲk_ws_8 O>{e;x(p8yw׾AqpO빯8 ~QFeE)v!37 cbbz`rٚkYSݗ8W#@}E~_h L2pzqWn9s8_0`})IƪRG!.&"`~_?r8Oȸh ˝M_yOl8^hRwpFg.p#"" amNUYHޡcfh8Q|9XCf&V蛡6|ϱt}=zI e¥cb.8[w Y3|~[mͳ،MfƜg"̹V*HcO:+cƏ>"q|ϕm=ihk%Ϝk)s똎F9Ɗ~0|ݬ m޽6''n˔]ּ<&77û:f,XiddeǜLjɿJs#jehh#k-G$ ,B,{1kt778OC9rl}GY3^;\0BB7gZ:b GLqt~WN.)`4{Ai&y"!fg@'w8m ,s~c+v=z+:!~6wbV&Zs9c%}(G_\D_;p+3Ͻ_7;Ǝ'GN K緿:a@#+r?x1cGl빶r|7B:pRafJ`83^зTgҋN$`RO=Xsp17"bYNFȦ\ѿWQtB·,&x e:/:ACDā-Wxv,t{[po/ ϯhu?40j={@ϹUP|llvWDPguRL|v#43V_;}ſF̠G)J5jن4߭?eΖv4-Iwss2R&Z +@?|Ht ]%;pmr!Qѱ: gv6xZ\3bAZWxNnr'c.|VI%XŠˀy[v]*M֠Ҝ̥$T^l ۟KSK, r }Q[0^Րz\ txyQx<+_zVh>Z,2 .5jc +VS!e11O}>x)}ioi~V||!# ;Lt3iu rU",nAhpnuSqƒNfȭFȜN:9~Jk4N>c&Gw3 g¿R:$nwR}h=DcFQ(>ٿ ,;yҗ e|q^q2I/=zڄROr_^#{|}22LWw5ͯ qmJhGًYrc7Spd ?++>_>.ٟZ8>G^Dϴ$]zG늓M5Vuq_u`:84zX 22Ex.*ރ( 2f׮]k֬jɒÿ|9.@Zb DXT 3o~{$3A٬t S~9P][^zu*AR&:桇:u 6]_=Kp>M_'৐J˾ 2ݦcu3 XaMHp7}_,Y=5/30J" a2 2aqc[r%EbdYr L\_ЧX,t1P%1܍f[٦b:]We4R/]+ck Ԉc ))̕immE' e e)\&+BpqHO?tڵb*nؐ~vڵ|"{CBhRů+.ggKZ4?Kw5AnP$A~Ũgx>(e$c0ͣpqVa6?ɧ )eCfN3D,66 u!>B*&1H; B9;R&dND*Y\}+,,^*3|.Rvv6amq!}ժl.P'!-,9}r,5/SCfmew<‰V2~Q\\cɒ%$z2"'naa `*`)&6["m*1~rzYl~˗/;i z0_>F \`.\ϋ)ߎ>%}7=āQ۰IK>4{Z=;3?.' )|i?zw,V߷۰KNK|&u3Awd!@D2ܦ6脛X8EB6=@1M=U#lO{&!x1̳,vr7fҋY͙Y"AebVZ>c2E}΀/^]eVհMU}a */_0.s*+aqap4(]7:if%6:zXu:gCvtRVbr{h^FGI0|IwsCBs+<,ۨʻ؁fE0Ej&"H գi `O)yQ{eݰMU})+ZJé<m\?+oUW)H#Q;LM2)22meԪ[]S.?e̥Sy˴$mq!ru RO;5zrS ;boY4XHon4oF'Յx3ۘyJY3ruN1m؀j3nYQem>Oן*+?w\Aη\N>ZL+5X-X\?zy-+6<;\YFcJY6N[6[V/md*k_UiCLkw*yT^h4e/SjyG#'TsfL6!)3\XIBDobC@~.N>Lɢ빐PbaZQX(>?'٣I*h~i9N~a[e%zh@HWQc&֔htkaoKPMQx_j)b 4Ţ7C "/ksJ7z~EFUg4˕ĭHh!A^&y)SlŬ x盀0b39O31fUcn {jg$Eܔiß|b$>D<\3z+#&`tV ?yFuy?r\7xVʰXܓSThiگf$m܇nz6F*<ͻo7~Y?wu/DZtxE C=>jԫ%mze*3 J]ӑծAU\"xE^ؤ?.wO LbI, z(G0 g}v?:I+?{wFy}|vlǹC e9>myw ))nmtnޮnJU()Kn(MKp@ Pℤ8܉OzG͌FHh4=hyy6ׂ~Og"9M@_Qjg/x)ޒ_~x) Ec] `_??^b߲`8SL峁3^PTae K*D*'+)(ro~/gyYADm*c@Qcx?13Ճy9t4(@{{%O NfS~͏N=W6h?h('|3y2`n[;% ><[T(Xf2ՕJ^Nkټap˵y|k%7,kur`' ]]=.K7jmn~ˌY>d%3nU;g6=]ܶ$A^Ӵ;q2FG6;򵺀=e| h|kWn]O; ;@Ek0z% ZoJSmAljR4PM-WyF]]o6z֟nx,374[@%' l ZbFe"dvU*`RknзsZowbP Q&r}]G_Fݓw^[y:_nٍ+R|n䢉EW/sFKCS]a*P0Kezء* 5':^*LK1rH`qE-۬8p`cȟVd(2sLގ7&͎m';vP'<#Umf} #(q^sj)mVUA卫W7.]y|1&-hojhQU w(2J#B+HjdPu9v9](t47+ENI.{\7륿uo_v۔ĩ|n.AY0hcyŏx1)fѢՍjk\ ۇUD;e80L`ɤ_?Qk_OݗT #2&nM{Sق[xDמ:(3:yu^}GLLKqUGP-eFG葸 בڧO̸$eK]>x_SjYo}m1Uot_@9&Lof6x_| *Fe*եZ)E)m>o(Ur a r$<Qf,W{g͚49ngTUVW,SRI+%%%JCCR]n ’ej9 KJSy[7DXnئlOVUYjXfgsۮԛF eƪ7hqKdHR@aU%JQZG Z.Dg œ1POryEZ)1u95TוTSFIw#IԕEDXQ_bX(LʳHz3[D1{/[TXrSРKŽgGRe{|n 4u Pړ\UQPeTIcL-:54Za-(;D=\g*SX!;L7=ŷbOn 2cE onBQJAA"؀U'|k>"&PB+ o p]E$MbG162گoΘ}vǟv;_q;#j14y(զmy2΢@3ؤK8]m 4 Iw{xu I2cSbL7X4=Ol8+{ae `:MA=I0f-,/\P\9YOz0K->A*RORRP+^O}*)0 M2+t1Z, 0Y*.` }._kY r'?5Qͷ.gKf/C/+D[u+L.v|2{sٳΝwϜKupܬ9n'xIryx9>׽}mSg\u{X@q`&F$'E2nNKK kĭ4hh!I0zI0mE|AXFLF5>Krm(Gh>'NM0"hDvINN6! Ff5lɹ& Q|9yŊL{:" &55UՇ`9o©o`nF켙'O{>˖-Dc-uxі3>߰g"`u僳Ɂ^E/c?<>ŝTmm,.<׺Of6FIIIb;)S23}Kjyqy` Qo>77755UNyšh޽---S ,k?iMpKsÉGzKLI)\VR(ו:OGTuztӈGK* 2AR_f_[& &kyMm1/(vUzeby;L=S%ULsP}q.Ϧ^3 rQhQ5j[C۶0C0M2r|8fgg@3y566;vL{N*q)qn5\TX]iǾJ9FګT.gRZt%r onўh7{bWm×yFyNNNVVЩ'pݤ Q ,2Md#ck^paCCѣGš]YPҗp7}<{ula pCbsRG|xۇ;9:)P}}ihP y3տQLEI3{(C0 }pL_b„ -_zȑة1|1CgEL//*0+2T~< >Q@r?PfFZ6j(LJJJZZ>SDf2F}I /W‹/޽{G}o>qPk%!-D:L _Q_YYmjhpt$/C7v06Y}Yo/q#n++<@by:*96S{Ң߰2QCB]: ?jEO eQ@rn-=szzGϵC90sqLO}*66V^gP(`ftjrou=[}3M6ey>^ƚNwwuu%O̹km4r\0 KmQC;q"\0aB.!2Dc*͈\"Ҍ (j ͗_SSd\xwZ֦hi`OL9`1"̜!SC0: Šnkbҋ/&g\~Wjiuƌt9Z`ẖɓmY --M 1ii`1D"IIIqqq]]]bB|m[?^Ihl$o!zS !s` d^1c!ehdLq7đ]20Za dM9_ܱlđ_4w΁7ꌁb M,z#^B:4(f6#ɦ!8lu,g'$xF^FɒW\4(dƘHYǘr 7-n2IbIM,P . @p<8QI ; a8I'3 Y+ @ 9$d e Nd5Y@q"H<!F鄌 nM (rD U2D e2D@ eQ(@ Q(@D Qe2D e2D@ eQ(@ Q(2D Qe2D e2(@ eQ(@ Q(2D Qe2D e2(@ eQ(@D Q(2D Qe2D@ e2(@ eQ(@D Q(2D Qe2D@ e2(@ Q(@D Q(2D e2D@ e4qwۨK.@bb=c3Gg;zG{u/߳gq+f\#;:`fM7d}Ϟ]4%;{';2wms̙]]w|߾y_|Ll1!f8q^|ϛ^4[eKJJpԩGzjDU';%IWso)oݺubXf=͏| qɷۗ .YZ y(\lٌ3IN4_rM-]e}N}ei|jQeݪbdwٳgm۶gޮ.5bBĵÇ?:|X@,f~KKI%ʹlyꩧʌs:bbR\11 + #xh'PK,ikk=rcoF>?eʔQ 2.2gΥr֍=%S|30CQ^=< ʦ{.g Ɨ) }p al,sR/䓏[OעTzZiJY++\>ZZv<4~3 yVsoo>}ԙ3gwwwH#&.#G>|L,f~ލ7 ȥwK,i>͋7G]KK~D]R7Yrkĝ6=>3 ȯ~ 7 Rk٠Ω/RRWee}IyʆBR>Z_Y>HQ"#eUu%c bkH===ń>f̒G/{;rY9s߸?&}}feΥc\ʜ{Yh˛{^]K/øQfX8R)/Ѧ _Ĝ'N{|5_{N*޼/ޟפ)҆(9{9(ȝwi7瘂Jc`,UGȈ@SWQ`QFlQ]]݇~xFcq{br˞;'JW?wKɷE7.j\[ſo;_7> ^prͮKǿۿueceŠR^^*u -Ed~{V "*{r篺ꪶ$]Sz{{/첎;3eu+XwEy'6'D>cGeB[j&2qlQ-o1/8θgϲ0ʢLO[}>'+5g!%(3c:DHL6NQeF*huS eFTc-{9e m@f1 @Chk`# Q(2D QGRN7`DSgGNjmW^y㭷&%'{>㖖^Gsssg̘Q(~w|sԩ7^z_Rx⸸8ey筷 민r?yyqw$D^c(#L__),,lhhiGy`OλmHOp-ca(|߿TtT1]~-OGGN>e_O.&e\x{'/QWwnqqfl\==;.0{6rǕkFVԬX&Ԟ1<7LexC9wZxJ5x+ F`۸|ky5bB3H˝|k>p¤$ZbcccbbdIHH3Ǐޑɓ:swЙIb192Meg<)5CI;yyMk ׬ dQ!+u65x_peS6+w$%a# ,0.OLb0=sDyWqٳ"Lj4#OSNj?uP7|,LPOoXl|F5+;X?ZjjjneSSSx6D)^LLTLڄ$Sa5{ǻ::?1!Xȑ#Ǐ?zݻ{{{c5qqq"Y'ȷwMh_c-cGL񐈗b1b{QI N*֬4ݶ3m+8Km娑s{Akn@Kj7=EP^SZ+.Nlsu[l㷘_܁ dW69W^ʕ5}:>2˶2mz_3m p+hM5Jg/ԔYn5ţF g|mz.Dc;(_i3|.vMvSuu 0R\/⟘w<==ŭŻ5q+Ҍf&G-[7[:;m:hm[b2F_|Qvԙvp/2ՋLsevOm( ,/ XTڤQBz9jM5β(K!קO۱&AykYVrYUF32WގMZϥ\!aPJyڟ|xg bB3U![%_G "+14# |7W شoWC<ԛ ?4RێϦS@233<8Vm{V"^)[ 2J6G,!- bxüE֒^Ijrx&cL`zCvD="Lק54&sIW\1DҖUyfQMNe;mi=(kL baUiJ0w&Ey7~pgTp&?Φ\"EvQDV<ݛ!=s{/%E'MȿDGվxqK=[^uIG.3<%ǽZ;k7/'?D,f5OV  -(lZرcxjMI)r̆>SiF.銩IgyqSӱD7\GEUQN3-s?U7\>1Cy{k]~fX̾ߦض=($''3 KWwW oȩg%i<;E6,cTʚ>~2h%lii zaq%uo8iz[b$<%%%111 G" ;RHZe2=Q]34o,`N1کC{]@|>h߾}3h2` g>9,q9%F* e2`P`01RIENDB`robojournal-0.4.2/doc/img/screens/modify1.png0000775000175000017500000003415112142060704017617 0ustar willwillPNG  IHDRl(YgAMA7tEXtSoftwareAdobe ImageReadyqe<7IDATx |3 IxB% "*`VgCzwz%K냹$***l@  <'! !4cv7G?WٙfoflErYvB cǎl}|o+[vezz>?qDj dOBq$N[u[n]#fK?ow(o-]eIv$v/oşa-ϛ7G=h@0e֥ţC{Z!$ رce`0C0a& FV\Ry l5 lĻ[S>~=ArfʙY^9GZZR;GKv傸t0)''b/U{P<L[_{^MNKHSLVSO&9i,-/[{?.\PbhC7!qam٤VwjQ3/ԋpm2WZǙ _Y+Ŋ2ptm2Iq8vdR =>^x$ũs*JB6lU\۷OYO<EYu)EJYg!آÎ eB^j=;<|)OO|fӗ/I"}{I9^0(86fS|R?44kbShebr@%vL5ܐcJOϔ?i;&Kd9ΰXtăr\WK^#dPm6E!+˦񅟉 kǒx,UlV3.Ez^m ~"8D{~wr8kd||ǖMYD!9.]?Sgk|꾯?yX޿<-{ܻT鉫7Vh<3G_){"}ۦWz47~t'Vܗ>%1T"M?V%$i7=3Gvs^GS#ZIEwSCt)=B<7k~o%UOl Ra׫zn ^)s?ouw-LmYRN E1|+b/k-Φ?S]iJRۥtSm1e#jKrSL}gKDmYg>Oi Gr#[?Y3uzMrú.6QTAL)ymӏ- s6W?2]A Iڱeӂ'G^j n~vkH"\׮ݳ~F;ԉSQZ,Jr e<%mƅ-ZDT?itf?}}ʷ~Ү#>ھe$&bkXCjGTԜ,C,W*&Eζg,/G]y#V?i#)ZF}e+e3&|xMo_) )o)kn,[ru/X65æZyfa]M꣕aϟ^3}so zQZt6U~Xڜ|G='pOi 3]%׮~5I^KLR\kWe6){w„'~oWt]]a9wԋzyO|O9aBֈwL/Aksӯ??uNQ7p;~3C3W ڴCZu|khx?Yz S{; {7?'ZIH{þÍٷPcQ=n<,ݿBiߋ_Y+.?"?.3MY1?xE}\<oq2X!ت%nrEGk!ߠb{?5rg̜:}fIMϊ̛omקL1Yz_7޿W$K_8D3eJߒ\>3&q6Nڍkmm_|{9m[[Ճ7jiz9+M 6Ì9"]sǍrfLqzE~G^'ŧ? ii3R6x_Snxw|M/|W\'n~u yK_+͓wun:q]7X pw?7"̘}+;MoW摒krăX|Օw]4uՕSD;6ҐV>u~JթJ\^7+.S"m ̛7僣g?YIIvX}mϏ>6Ő86 [zOr%@̘{Ѩtv/qc@:ql9v}ZffF/`< CiiY6z荏6n:`  5K:ky]>mM5ʢʆ(6W:0vЊ2Dhd*Qtz[G@}x65}aնՖŮDQXU%%=u.s.p gRQyT`ӻڲҐ W20|A/dhq]s+zS>8>*Kw yQ֞Ϩ\SMifȓ=ɠ_; t$D'[ݵ悊:EDq^,X:9{AKf)% "-.Ux:}|g ]). wQR^Auhs=((/7"EfWO:ޮJwZv+6AFizQ5m:$*՛7:DS(-֍VKΥ\?(kA{$4kwU5걒WV+~s٪b1F;8.J?Xʜ5aFd;u7iyWR^%%%@v'3/Uv3S 7F= >:Ђwmy\@&t_7yyy |U^eeW[*Ѵ:u]Wm=k K%>|9[Ka7J]WPWWE+-J=1x7زO:z,@;N=䊋:űXS>C3NvJ۠c! v>>Ck8c;]y9[0Ptsv2Vvu\\0 m$&ź3KWQ!IKG2ZP.=s0dG+ҦŒg|s z5"}NveQQMqmkQ޷T6+Rz_T <W).y1V?(1I1btЕ56N#+J;+6 I;`1kǕ:j잎UbԐ}YSZTkAPSSrԭ:]]R[|C_]-"ȸz;ع:x%%Ŏ5̢;eꐋN1S0rJ*3c';Hb:]p%:};ؑV=q'#[WvN,mp K̋u]s c?\I癧D\fMoSz V:ָ3}-GmkϔaZ`|SJ6/^W _V6Ww]PO +$Ǯ%ý fg=aXj߬g~y8m\]n7>i< 1L Tٍ)ϗ }OP=fDkZ-5U%7VZY5Œg%/z-jk_(V[p1zoTZD97 ؚ֥7`v+>GXRaƮ1D;:,X}xKxSṝ<&a O֛PKR] wb) jW\EiIT"͟(ddd leĬ[}^sF~5Uꧼ[3αsYL7-yۜxcr(W^ù bGqTuki-ya]$>J=FfZrƍЧpݴS;z̑RѣFt@_ kM=-I2{@?6T< 4C$68XC@C7o7_6]=lِ||>yfw'Y=?0b.{ZK| 7o޲eɓ'cU`VVҥKZ@$v|<7xCvaaܹscUٳg_~equQ=ӺiҤI2n֭[/qƥǪld@p%N֩SF5zh;VeʼnoN}[aZrrrjjM&65}'$$$&&R@;D`Gؿng[vCoh]8l2ɊHI2>xŅc\}8_}„^}ÇO8ʚ8qdUێ}8%!9Gw-b0D;]_^:c$NRڡXlideqxzsmQO?]h3> _h& 9LUQSMXXJBbba)":i~Nz9K뭹ƍ;tdç1ii/8oW-I#;[G&'4hu}^Ծ,BDl8 ꪫm&:݀ݨҜ6~5]8|(6KW_T·ͶxB}kIޓrq yEآ}3jjj7cƌbqwp ⱘ+i8 >vCjZj}UyBI{ݭ8#=}^}i-- Qijtw߭]mp%o82`ctZfono>`2,(};;))l6;v,==}޽.Lvr>v/j#]]LOY M;M)g1/gnWUUΜ9SLi0 ͐!BۦåEZǛ$]9-\.Ct -- G.5/|yŋ _OMI]B8D;O'mtd?hiiYt/Z-ja9Gl:.g }2MS2䍋A6IסV[y~',\O{1oդîFY^=O:3sEصGY\Y^}!1EdvW]οT{՗ğV^rѻ{}q^Nw3MX]Vّݪ9ty{v(r_]ь;̵ LN6Ξ/b;g&&tYfr|v,n6ԫb4{Qb}M7]ro 7iS^|ә:-:wqE]WPdEцE/[E0IZ#ywHy#Ggwmm}bM'F$NÆ,̍I쾒U{۶m<Uض[l7}d"^C/'[^W*Zi]p=q񄭽th9M-IRfƈ.>}Oj3] p%U;zBķ۷G ,PϟzEzq5_;ĸY9ᐭɶ$Cؕnt64]>eiH_μtvab>Ӫ:3wc/|a/~;.س /ΜyvD!{єhޭQ?߮%GU~Tvŋݙ*~җ->Ҿ冄Ӭ;G]03̨dn}ϼ%3{_;Aݷj Q_7U#P.̙c|Eמm`/!v7pm*&&YN'%w'5;s+8{Z勥N|c]nfs( ڳW,MvlbM"*b8Wz%KN7oa)V;u"!f_m6%Ç+{6dYG/lmMu|uJg[G+ӈw>:6f 7~ƥWj@dvo>%7Yzls҇~;cݛ+VX7=xvtvNw9s~[};q_8+{謑IIqjͬiM߹aX6|; lڤݾgϞo[X{Yc\\?1(MlW'3<^ f>Eq(;bgO\@EZ_z{XԒ$.7c)\8^YS|#ϴiWzhyI߹ǃ2͚WNo沲1c&rKc~)c:t}d~=(cVX+r '~-DصoX`(ɓ9]]wa6w&%3W7LtX;&C{e?~S={}Klk?<&Ȕ ]1s̑!ēS3+O=zm `CYl}"0";6kO\{r=ve߽}ؾW0ڇz`Id=lzkdY.\gi^W8Q[)yM5G>" j-CuRB!q|y}SAa*SnTTՕD6%c  !q]1E!뀣.=Ƣ#li\gAϵ|w=h++X0Zញ%}])aeוq={xސs vZXa*C/ 24Eowcߙ?>Ѫyf@e=lŏL^3UxO Tc[VFR 5TPlVUK7}>wYuzpvCDzW3_B[ lғWDO(_׳vG-f' FCk//wU2Ž(.@WW1tfzCT`}:Y-X]"^5k<bW%,Tgqwa,dCVH /0}xo% $C@P/NQBCY8fs}@YRP^'Bn>-^1tS1;x -Jƕ/٨ |Ԃ w0t+vxm[K}!+7KE~ u[kYQy9y aMgZWR",Yo1Bh#MXlį]ZչDZ+  >u $)?׻,^dQ!1[Kowb_6x oc6 [k"Ҋh ܩǯLj+j1z?33 qǘaGݫU+:&v#,D-w}F:os$k}RKv✃Z2! sN|et^68闯+kZl Rro ѻޗpcZ6M|1=t]>ΓUv{bwzª-ֳunر~*벥k) {csMu~[5>lQxaj-+xM.m]jW!Y*Qd"ok |" {~zߙ7i!̸ =}QfBn]UcA:𮛆eX*$FKpԄS [= csqR,)g0>eya.ۛWbvOn뼝;¹.Q]}%oaTH̖-# p0L_/(ʛ;iqEOImZ1{gnYVn ᳑b9RY@zvk^S9DzZLVsZ{䕕ID /TVyKl2Cۺ@WzsKEA=2ԠЭp2 |F,##۵i< Zg3puVLdZ` upNA+΢׬:tеs5W{2#>׀6w5Z׆O TH]ְ7l]CuFza ފ53H{m0%1dUd c0xn:  B߆;v*>X;-q5.~7@5~6ȑV}?79ZAzB* o.0?]zvyw8<&qJJҥK.vVVJ Z6o]Ыq=( h- J𦦦K 0t1$R;Jxjװll@`@`BK|֮#TqKIENDB`robojournal-0.4.2/doc/img/screens/define_tag3.png0000775000175000017500000003012312142060704020412 0ustar willwillPNG  IHDR<gAMA7tEXtSoftwareAdobe ImageReadyqe</IDATx @Te wP@d,Q02-s_ \4e%sKnKJbmYݵ]M]w-7Qdsv+CM} 5 / ̼sÙ+ 0O4<3s.=9+V%Ɓ'9ʁx$.]jmmxXkP{ө{%4z٫7?0/._e4?p~E}uW9P[yYqm0_JU'x2VM LMò)SKZorx )c}i(>>ױDB+'%h(22R&%~;@ =_ȿ c_69 A;h43}|r,Vƪ>z-Rm6J}W`l#[vO'`4HF!֍ ?o @bo=_M?gmͿ/N֍kj}__2c5F.߸y0N׮=ub]m\#5Y+9h Z:iLi&%Q;B ޤhĠQ Ӱ dFe Ԧ55]To7Z24f߻LK 2vJ[uܿgt|fZGkL~b-VTdwŠ nmȉoӉZ G/d\_}Qc7MWߒ-fS ?ʮsTUǩdͩν7oxAI(lo7Z[LqKvlƆZI5?:{UZ2O)}iCGjr5'FG\X7d8ꤡaXdL.p+Ķ᣸#zh4Ƚ u[J[ @Z[ 5rIFzi[[mY#'&Ԧ_." Xkn#^b&Oi|Mͦ[ [4t}[OHJM5ͦGrwv}܅FQf_."}OO[2.5?Q[K*6PQ]vο:qׂG^+Yʼn ?1mpG LTԁlaw]g-)vڑɦ-{sooٞ<㬇^F9U)S=l.?0k/nL6ڦ9,ֈeOrÿw1䏮4;zL4on! 9OH~oڦ&6~v'34[h_tRbA5JGP+ ?6|ϲ>W?Gϝe/ϾD:5߲EqśVn$n[MX>r¹~u)tO~›^1† ͮb/}}&W|-57'a ҰoQN"t͙oS ַ^6!G?ٴî.jl;RZ~1|9ggYMqbƌ8u~xsg۳Mbո #_pY_c_ߐ7` +ut k-zeTNSY\ci";Yۙ34Da? l]&|Y,8/2a33oz )Y/8܈=Tnw~`GrُX ;SI \փ?Uִ?7ҩAM},JHUM' 6)S>|Qiokl9Sc(|h1=Ce^rg6=ϷMfss+sW2\6䞤G3_UrnwɘN}PȀ|̜Ji9ןJ{ڪzgFY$A|tB|so> ΪxѫQ9MG֌K|R:l:Uݽo6/Зrt夤ٯOeGJa2叚cW7o&N;uπ+kzb?zM"\Y_|awԑXFOf܅  /$3,>o^"^\ KC~hRWkWVhRrNTxPĨ{_);4sVG ƅS/z=TL|~p#s%LsGpfc@Ha81G4/m %?mLjRr=S/ܽg/ reAAaHp3æm4A@+[MD3nVpB\[0vc:Μ}u}>{ڳo˸7=?}\/=YBӵc.uWn=F4W3JJݢ;i4TU[>0(ubUJ`5P-XJUq;zjsj`X-C@(-Ǯڔ&U%A`OC xko xro^N`xE$&3rFxr%0r_2ޑ>!xpCP%? Ie}<^F{# ^/+p/!W} #HdO Ks\8$Wx.ve׍gQ*6mWmC+XlŻ    /_/  /_/  /_/ ]3_noy=%KMN8/[;YI]ڹS&@+Fz@?WOJʽamd>>>r\f+b,)⨻>n>rbZf}}}hF/VkkkKKKss3 s:*ǮjᯞT|6#' KTp:$G羃ڀW˽ꐤ:P s_`u9:]O FzYTG}Mz ] '&5\8WG?b=&>lޑe쿢 R!WHyٝbStH`1fK z`( N͌ތYΛ.N8q2j7ULmqSGjv[ G[;HC*18I,brU$%6(hꎐ;a1I3I6Emr^{Qۨ0hЇEoIbO'v:,f+6IAmnWa _]uf%7 RqcMMMf~/8+00,z%y$ܨ61"#gQDF kllz,1撛 )^Y 0\]GW%ukΒ憰p/GAR e]VcG.hz˹ .^H1IOY2&m ={sb=tXr1tdN^gAA/V?3Mi߿_YYk׮[?NKs1Ǭ:5~clѽs2ɘLnxeWcSh*bcc-[iӦÇ;w̜>}z#(*+ovm̈KQ]]}v ?Dw$_ʮڐVAAA}?WOO$OQ Q?L]|آEbS ghZdƍ҈o%,RՀBH^>c$5i,h飼RTDjZW(F˧Ei(b@h>yC31.]6h (:%@%ыƀ u~: >/&/Z7'蕆w+UǸ?xF))b}ОrMrYQ‰ƣG`[\וŲE:Zs2#k-wTG~bgR},8ąamq:|&6d9Io7@wXoN7*?֯d|("y)!CP/Bx2'!<~@ėR*Iv7u˒K##gl 3A_tPti&LmNi%]> /֩_ztvnnnnmcẆX]v$|{h[LK *H+O)*_Cc57 ;`e(kuqB>X`JXbUZg?EѶUSSc|~0}"75]oz䉦'Y,nC͌g-&}yLӨj޽ٛJN{٧Jڻ73s:SY\{O֭T.[jYe>g*W 5=^^ռYOR fV!,OV*V%-!$$ &)?0gkhhNQ\Ҏqcbaf՛clK'n9|u՛ixbc܁xVgn08ϱj" Z6?kW-k*+.<- ,n͚pQLVk"&!ZNњ568 3rL+x##`mp 9q7z5\PAǥo #M5Y`h#Zc{På7 m.Y6Qe63MU0RLSY9ǥ;u^ѝqR.p=I%\L^| VSC)$Ym }t;vN]lU]#c[TfV{S9Maqj(OGM(h>r憘{RMteS :E! lE{Y`d A`ExuW\\06ZtS^RNdpliΤcf9W@zW8.'#;ȓ\X$o\k-)|okzחJIRK[t%)<^ed]NҚlfA^;,bUx{XX_:KU 䔕OILNNugc픰FWj&1.%%I7Q~S3GcOtda), JH`Ê XgU`L*7g cX֬Fcx9r>AO@A3yYɻϊ~rZûMN_L?X<6o;4>0G+~5{5}l."76oU^PGT8ZӔ\#Xe./_+7SQQѹ^;ݦB'Wd GGWOnURX<ӕTXmWQ DC[LJrn<:&CBu1hRqQ@O^Qm>1 ¦ 8IYn=J.<źE$)KkK!y}U, U,B*;S.ܳFȚsN# >J$cd djE?ـ2*xo_mi-6leelbɢJqPffgŊNZAF{~]T?i4dHq#N2-8O6179')驭%hcPlE m%b3')v/7'v!&1+X,߻1gxsy`C=&^:Ν bI L$ѳL,eM8۩7lzXu;,;'E^v8::QS{+?;^yps>|,'׿[V4V \h.SwW"g|b6w}+Vh۰*θoVnN=}IۧOlah3>q׍ _^\,5^G{7ݐ̽\v#VJmmz7MAןLZ-ybNV1s^"͜y;o7Dq&L-T*[]$G7χNxC68Mϙh-ZD/fe1γR{2=ϛ7gw3ٚ˪;/^Ǐ9رA+7ݩXf<}R_J<ޫ{7ص ,:6^~}ذa.\pR})ާ@tt4myi_(ką*ᑃEDD 8.h-I7]Bojꍿ]cla1bTe%"QT[, fw[ϐ}OeLV%V'aWβ1"8x@0\s[0tiDv磏eD̥K:/,oE XvSbYY7"aO> g8j'yD@WT%(,YƱx^G+-Osy,&>֜^5&2Ͽ!|Vgf3lVRaU%u֩Y!9k +$Ֆx{vy*LO8 ? Ye#n!)=ww+5 r Ɉiph+?KV"2bv^yԢj,&<{J\I덮&L;lo~UEyh/ˑȤa c=bcwAbY/zH$P$HUzX}X,bb]%D}s_Vu2:v.c,t&:r Lj쮕CzOwڜ|GιTISՋD%Y Jpl3u_ح)Eӵ1u7&\-LuwZ\ݧCmG]xM3#4%^Z캌Ntfuk]Ԥ1wŞ'HJQT4WY=@*5rTjJJ&A*r>x=,&K$rVS+s"_%f75GN f$]x#Fh}8tS׮1Ci5XyJ:TowF{9=裞m5\,I{٤SŨCpeiR9khh`cu)zpG#(QQg&M4a;&*]i eߟzFTHcHc%gI$%7oBՕwE[bB-g]>yWeQnu+Qf)$rj5V%*_`?FvRg&n۩RKGN{3 jHq BAs6|?fÆbΛUoΧ)s1uVHے#ZU" xVv7jbT("ʪ9*Z[[kjj:بdARF5  H2q:C4M "P(jEA,ɮv7AAIɂæ%͢[l B"mK=m2P 5RBJ:vvͿU_s~uMҁR)AyΜ9&{xǾ#>YN{cÇ7~ۘƌr`mT\k@uzIhiuBvG6TY^S5<oJAqZ"F& iՇHY4TU{c9fiRє^@"H'ЛHgcx_g֥KAA@;ʹ4!e.C̮N iY- ˼hfbI҆4_ہWש5ZT"|jJ^.%sg$LGly ۫ q/LչŴO. =/eLS&,N}I>bǚ͂1j贴VK[+N)E acC*i:P)Z=O| iq1}=㓅&OUL"x!ZxEO-呏ڮ vq)pi\A2v24}wm~j/Ys^6zlY0^1XSX >#~!\ܻ+Ord=Ub/ЫKF:҃* EdWo8>6~LUk6.n3  mԴM14ĉvNrVV&G D=#~SVC(W td12B{˘']MŁ>Ii֪UǏe':"PN2=pbXuyҧ`KђG!nX <KiJF=!_guK~p f  HjWgcB3Y̚3؋HJN2G MAl_knyr3$ ;L6qv{m}-e@Qxt|Яe>^} ^~tdD\_ר#PONg>޾$py갼K/G1v>6Cd)^Rcs3u8mP-OC^_I?B[~~n0x#2<AiCLEU2G |%=ec<`0\`|;YS o6s7le9y7CQU=@|EoWVN/O*ETe *b~n_|5!҉MjݒO & c -7I)b^Iyt+A Wy^?sɂ{ɲwbPe eɘM[gԌ[J61\Tz&Fe y:L z-Yck,|E 3+q !K7.S,C򒥚Ms乯[ԥmsRQA u cmoD b1~7ij5Ϛ.d,]Hc'!>I?G_p Œ YDT &~iZD&m3-$LG@тxaIЅGM}tGum?NWFK',x8')C IQ?dI a f30_*^q=N  m'ebDe/Fq^DHm\-nb. bp3İUr ϩ ׃؅_4L*Íf LNHIXn NnjCCe'2ŏnWo-Xd73ɭ?4|}C/Έ`=X~qm;8|q?EѓG /-OEC?b&  m&e(X,zz<8x(Q{!M]n,!J|xM,REf>>`2|rĤ@hI_)mʻXG >(hf}%f@ g/kB~xS" gg57>7~9 yd~ƒǚ[M౲&tԸg濾O6}WIJC`[ AAڂAC;?RdR頡HYLZ5TU7 .HoamNdsx3! ҉X'|2  3L  ̙36?/AA-g}Cc! p{dWʨ5z8AA:be)աAAC ])a  ZD,eTj#^:wq'~y汩F5x8*qfL{,QY>;w-r4-ީ4/Þ{gulSAwbAZ۳43CR֟_i}SXi(zB+ٹm 6L zhӴd/٩8?{iOΒ8F%7^rlf ;S Uv*S]kozcZ㤬2k7-rGzywv87[-On֯PTaΞ/^uEȠGef=v*AޱZec oG.ie9J\LiN8xd Kާjev/=`}q,}y{5 |eC:RQTk#v=XgaY PȯFgR@+&szæs weZפKoJظdwMU<`Yønz\2ݍb.}cmAçCıg=TeVeLm8AjNaCkz̤ !?i~9JX9~<yܐK׋^O6(vKvIi ;pxtZT<ƶVYXփ}1{vԆ爧ek>%SD\̈́>}_DM7m܄b&CUym\:9z0(:|)j=Tl|@}xmV~ 7píՂye.e੅VFG!Xy&th+1] h0U\ bW|8$v612 %ͅ[p⚃AUw¸Fτ3-ZSMZAi}!ML,lMX ?;`}<;S{_N0|_B$vG&O揣%+EMR.+%@ڰhjlj-s损=vtjOU֥y⦏.L(, CPswk7CqqI(mnQnsHe.fwц-rU*3`OظBcH[9p%2d*hm!y3[g?& ѼCxgg+lq<\Ma KSƫ'Pvn!d}\CVMǸ0nw܁oo^jXn[k7o-(˷U8p8ءyit߉>1q 7&P9N41w9=9@%.:8HoXd-螴b{ڀR."}6׃$)x6W.Ğ9;D?7M_%j2?1cjxrL9/gsqT6/+EM|ZA=.+-]rp[[0 zG9s,W .{QG~y  3W-gNzlA .7Aq_0!bOɴf9 2(eč A) Z16  C?$nQ,AA])  HA횔0:k AE֭[㜏ȑa}Ob 81HZ5i1u;vTo٢8}^5ΝKv z93A\ e,X1f"&6ARԄ5 蘒 -k{^O=eOЀ msLiiinnСCā6BP(Kvozv{Ι1AH455˪QQQxKŴ%6ƀ"D"X,&D" FhYt:ݍ᷇q01π oAbg=A\1F$zxxxxyy7P3jFRjBҝ;#xKw߶V3 w2-[871ƀ`&һD:h4:4 H}=%K' ?fAiii?@{;1DxzzGDDu҅b&$A`!zΝ$M?Wort6 86劘wޱ2ޙAAAOJ-դ+teXn]]"|u?7o$΢={ y?t]\::!yyʍEg{aO@HR??.,Q%?q;e)BV,\HLKܹsW\P( 䁡gNj}/]6p(0+~ DHHP$D5c$|_Θ}c7^$liG%c"\h4x}W5VP(&pS)J+UM WntG5._L=RSScdAkuLRkxmN1S,>PhoɄ\h*$F*P0 \5eKCBTcp֨S]ŭ*Cs~nnrR"Zy֏dk@H?"5.g0zI_OOK q&k${PP@44{/Ml/qf )H MT*Ϡh3#}zfˋuT/?7HwEGGd{Avʐw5x'<A@SJ^:@^< &2`?TXz[)z66I0Y'e5*V1Ӕnr%)zUk- Yת$2h Br>ݻCR:F cIʂL",O]^lX.d|~eTu 񪯯sKvMU(QFCU;)SGLLsW@F@m;MtLddM*,0O=l$$E> - eeHV6lrS+{է%ZѷY|@ ^*VVV« >U3R>ڵk +-->>zVˀR yDG5rڠxZ3 RnYT;{쀀|"rirq|VYY M`vv6 ?cd0WWW(雕M>RG@ć_^߯_Ŋ[7 u{]|~ka*Zk5!FChUVhb3qhll)ٚz50SOԌHLK\RӤf_ު6j=%B ܡO*+ w\2sbN+SRRR__ 'LhwLIII1@YRQ5)&B.RK"ɇ}ӳnv[1c~AχG-t3z7 q㆟v}2Q!uje⾾qqqBGD/+׈{J4-tRPr;~)YUp%c_8xicot WU U$7;蘆*^Rx pϗ2dl袧/ގkRj5ZmيUtiEtX#%S҄XE]]tƎUƮ2c_ dFRI>YO//:AaqX<S[[ :&22:P6,-ñ@6*ToW7*U'%uŵѰ_B廛JS_{ľ٭}wȑ|j۷!MPNŭ1UUU=CFaq($P?iH͛M#KnYszF >ckf z9n/`ȓ{q[VN~e#F V?d9Ixߨjpxs bD}[_QMJVK)5H'>-Ѿ<9tC91ce "Ç݃o5ܮ/+76&2gkA^n^~[em8ZYsZL6M}wYOO<\kH Y27_8<ѩG.:z5358w'8jOyCpS _zV1ݾ}bp[ߝVhPh H37k%>]Dg 뒢}tzdN~41t -#vtN=z}>j(*3-v?gW^;^"Cuð߻h8 D>oM:^,V)s~v@Dr\IX8>@ 3DiMąҸ^kI/eȪdAֺO>!*/dBx}œvcj/eACZeS.Q=•V_0nR3f֌)T*aħFűWޝ|*5Gt9C,/t\ 9`e!/Eȴi eT*ňƐ!^^^fy/ 6JOC2hA,⍞h1b5p|5CHR8+AU|c A3gvۼm0ԌNs) W}}}}||, ~v"fq &My50b>%QQ::5A{;y.)JCՌFQ*۶)^f^d m·##GV K2c7l cX5z@^bOOm a.G4\eihha~ ݂CcA,sb iDDH&M۱C.v2zyx8ta ': | 6g_|u e֗ITf(T*s#oWXp[byxx\)eb6/'ӣG%e/} ~kk͖:/)-YR^SSw 3OHiI $!⤚!ke+A( ,U #jL'2cvүԹt{|j7ḥqx $WJ6NIAhH#Kz;m{`2ZKWĂJ KKA+hȜD4jjXkI2T C‰1 ])OKq!0`$.^^^:d^"z8F( bJٗ2NXv~9)C$ ֊xi[)C92F`\oU]o@܅ȷ;1FTzfqMJw`ђmea2r\B:)ӊ loBE}]sYjD+\(] I|, wIu|YZf\6A /nZW Ԭ1?A&t^lk2jG+9z%Kl(Ќ7L$3\`׮\IQ3f$f&#Yg wEmsfaΛllv[-`R%=`5`Ș4(5ޚ22عtV,՛Io1K.߿@0 TaaUvAqB