kanjipad-2.0.0/0040775000076400007640000000000007632231307013257 5ustar otaylorotaylorkanjipad-2.0.0/ChangeLog0100664000076400007640000000475107532224546015043 0ustar otaylorotaylorSun Aug 25 14:01:47 2002 Owen Taylor * Version 2.0.0 * kanjipad.c Makefile.am: Use a hardcoded path to kpengine. * kanjipad.spec.in: Auto-substitute version, update to modern RPM packaging standards. * jstroke/strokedata.h: Update with fixes from seer26@telocity.com. 2002-03-16 Owen Taylor * kanjipad.c (init_engine): Execute 'kpengine', if './kpengine', isn't found, put up a dialog on failure of executing kpengine. * kpengine.c Makefile.mingw: Build as a Windows program under Win32 (-mwindows on the link line, WinMain(), not Main()), to avoid popping up a console window. * kpengine.c Makefile: On Win32, look in the programs installation directory for jdata.dat. Fri Mar 15 19:11:33 2002 Owen Taylor * README: Update, convert to UTF-8. Fri Mar 15 19:03:55 2002 Owen Taylor * kanjipad.[ch] padarea.c: Port to GTK+-2.0. * kanjipad.[ch] padarea.c: Sensitize/desensitize menu items and buttons depending on whether we have strokes and/or guesses. * gtkglyphlabel.[ch]: Get rid of this, not needed with GTK+-2.0. * kpengine.c: Switch over to using stdio for file reading/writing. (A bit more portable, maybe a bit faster.) * conv_jdata.pl: Call 'binmode STDOUT'. * kanjipad.c: Add a Copy menu item for copying to the clipboard. Sun Jan 30 14:54:26 2000 Owen Taylor * gtkglyphlabel.c (gtk_glyph_label_set_string16): Fix bug in setting strings longer than one character pointd out by Forrest Cahoon Thu Apr 15 08:32:47 1999 Owen Taylor * gtkglyphlabel.[ch]: New widget for drawing strings of font glyphs. * karea.c: Use GtkGlyphLabel instead of hacking around with GtkLabel. * Released 1.2.2 Wed Mar 31 02:37:07 1999 Owen Taylor * v1.2.1 - Makefile cleanups for RPM-ization - Move data files to $(prefix)/share Fri Mar 19 22:36:16 1999 Owen Taylor * v1.2 - updates to GTK 1.2 - Use ItemFactory, not MenuFactory - Use new GtkTargetEntry style of handling the selection - hack the character labels to get them to display correctly (GtkLabel is i18n aware, and as a consequence, gets confused by 16 bit text masquerading as 8 bit text) 1998-04-08 Owen Taylor * v1.0 - updates to GTK 1.0 199?-??-?? Owen Taylor * v1.0b1 1997-10-27 Owen Taylor * Initial release of KanjiPad. v0.9 kanjipad-2.0.0/COPYING0100664000076400007640000004307607045107461014322 0ustar otaylorotaylor GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. END OF TERMS AND CONDITIONS Appendix: 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 convey 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) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. kanjipad-2.0.0/jstroke/0040775000076400007640000000000007632231307014740 5ustar otaylorotaylorkanjipad-2.0.0/jstroke/ChangeLog0100664000076400007640000000302007045107512016500 0ustar otaylorotaylorFri Sep 26 21:10:59 1997 Robert E. Wells * scoring.c (StrokeScorerTopPicks): One-line fix to the SJIS code calculation to avoid sign extension problems, and fix off by 0x100 problem with JStroke 1.1 that was reported by Peter Cumpson. Mon Sep 22 20:40:27 1997 Robert E. Wells * scoring.c (StrokeScorerTopPicks): Added SJIS:HHHH notation to list to give ShiftJIS codes suitable for entry into Canon Wordtank, as requested by Peter Cumpson . * *.[ch]: Merged in the changes made by Owen Taylor to split the sources into a more modular set of files, and isolate the Pilot dependencies. Went a bit further and broke out jstrpilot.h, maybe added another file or two myself. Added emacs magic on top line to set mode nicely, adapted from Owen's emacs magic at the bottom of the file. Mon Sep 01 15:03:15 1997 Robert E. Wells * readme.txt (http): Added header comment and GPL license information, and expanded discussion of build methods, credits, plans, links, etc. * jstroke.c: Added header comment and GPL license information. * jstroke.h: Added header comment and GPL license information. * memowrite.c: Added header comment and GPL license information. * memowrite.h: Added header comment and GPL license information. * jstroke.rcp: Added header comment and GPL license information. * compact.pl: Added header comment and GPL license information. * kkindex.txt: Added header comment and GPL license information. kanjipad-2.0.0/jstroke/README-kanjipad0100664000076400007640000000215307045107506017376 0ustar otaylorotaylorThis directory consists of files from Robert Well's Jstoke, available from: http://www.wellscs.com/pilot/ I've deleted some Pilot specific files, and applied the patch at the bottom. Otherwise everything is as in Jstroke.1.2 Owen Taylor October 27, 1997 diff -c -r jstrok12/jstroke.h jstroke/jstroke.h *** jstrok12/jstroke.h Mon Sep 22 22:07:04 1997 --- jstroke/jstroke.h Mon Oct 27 20:01:03 1997 *************** *** 40,46 **** #define __JSTROKE_H__ #ifdef FOR_PILOT_COMPAT ! #include "../pilotcompat.h" #endif /*FOR_PILOT_COMPAT*/ #ifdef FOR_PILOT_GCC --- 40,46 ---- #define __JSTROKE_H__ #ifdef FOR_PILOT_COMPAT ! #include "pilotcompat.h" #endif /*FOR_PILOT_COMPAT*/ #ifdef FOR_PILOT_GCC diff -c -r jstrok12/pilotcompat.h jstroke/pilotcompat.h *** jstrok12/pilotcompat.h Mon Sep 22 22:07:06 1997 --- jstroke/pilotcompat.h Mon Oct 27 20:01:43 1997 *************** *** 47,52 **** --- 47,53 ---- #define MemPtrFree free #define StrLen strlen #define StrIToA(str, n) sprintf((str),"%ld",(long)(n)) + #define StrIToH(str, n) sprintf((str),"%lx",(long)(n)) #define false 0 #define true 1 kanjipad-2.0.0/jstroke/angles.pl0100664000076400007640000001514507045107507016553 0ustar otaylorotaylor#!/usr/bin/perl ## angles.pl - PERL5 script to determine table for angle32 ## JStroke 1.x - Japanese Kanji handwriting recognition technology demo. ## Copyright (C) 1997 Robert E. Wells ## http://wellscs.com/pilot ## mailto:robert@wellscs.com ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either version 2 ## of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program (gpl.html); if not, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## ## Derived from prior work by Todd David Rudick on JavaDict and StrokeDic. ## Makes use of KANJIDIC data from Jim Breen of Monash University. ## Further credit details available at http://wellscs.com/pilot ## See readme.txt, changelo, and gpl.html for more information. ## ## Commentary: ## ## To run this perl script you need to acquire the following free software: ## ## 1. A PERL executable. See http://www.perl.com for information on ## downloading a copy of perl for your computer. ## ## You run it with a command line like this: ## ## perl angles.pl >angles.txt ## ## It generates a lot of printout in angles.txt, testing the table driven ## angle32 code against the PERL5 floating point trig library functions. ## ## This code was used to generate various "magic" angle and score values ## for use in JStroke 1.x. ## ## -rwells, 19970901. ## --------------------------------------------------------------------------- my $pi = atan2(1,1)*4; # See perl5 manual p146. # ----- test_ang32 ----------------------------------------------------------- sub test_ang32 { my ($ix, $iy) = @_; my $islope = !(-0.1<$iy&&$iy<0.1) ? int((100 * $ix) / $iy) : 'inf'; $i32th = ang32($ix, $iy); $check = int(((atan2($ix, $iy)+$pi*2) / ($pi*2)) * 32 + 0.5) % 32; printf("%2dX %2dY => %2d %2d, islope=%3s\n", $ix, $iy, $i32th, $check, $islope); } # ----- ang32 ---------------------------------------------------------------- # For given int $xdif and $ydif, calculate atan2 (the angle from origin) # in 32th's of a circle from 0 to 32, rather than radians. Note that it # returns 32 iff $xdif and $ydif are both zero, an ill-defined case. # Origin and direction are clockwise: # 0 => 12:00, 16 => 3:00, 32 => 6:00, 48 => 9:00. sub ang32 { my ($xdif, $ydif) = @_; my ($xneg, $yneg, $xyflip) = (0,0,0); my $xtmp; if ($xdif < -0.1) { $xdif = -$xdif; $xneg = 1; } if ($ydif < -0.1) { $ydif = -$ydif; $yneg = 1; } if (int($ydif) < int($xdif)) { $xtmp = $xdif; $xdif = $ydif; $ydif = $xtmp; $xyflip = 1; } if (-0.1 < $xdif && $xdif < 0.1) { if (-0.1 < $ydif && $ydif < 0.1) { return 32; } else { $i32th = 0; } } else { # The 4 comparison values were generated with the accompanying # perl script, then open coded here for speed and reasonable # space efficiency. The comparison operations (< or <=) were # chosen to make the results match those of atan2 in rounded double # precision floating point. -rwells, 970713. $islope = int ((100 * $xdif) / $ydif); if ($islope < 54) { #test #2, first test. if ($islope < 10) { #test #0, second test. $i32th = 0; } # got #0 after 2 tests. elsif ($islope < 31) { #test #1, third test. $i32th = 1; } # got #1 after 3 tests. else { $i32th = 2; } # got #2 after 3 tests. } elsif ($islope < 83) { #test #3, second test. $i32th = 3; } # got #3 after 2 tests. else { $i32th = 4; } # got #4 after 2 tests. } $i32th = ( 8 - $i32th) if ($xyflip); $i32th = (16 - $i32th) if ($yneg); $i32th = (32 - $i32th) if ($xneg); return $i32th % 32; } # ----- main ---------------------------------------------------------------- my $weight = 100; # To preserve precision in slope. my $angScale = 1000; my $sCost = int((($pi/60.0)*$angScale)+0.5); # Consider 0 = 3 O'Clock, 16 = 1:30 O'Clock, counter-clockwise. # In radians, 0 => 0 radians, 16 => $pi/4 radians. my $dRadMax = $pi/4; my $dRadConv = $dRadMax/(32/4); my $sCostConv = int(($dRadConv * $angScale) + 0.5); print "dRadMax=$dRadMax dRadConv=$dRadConv sCost=$sCost sCostConv=$sCostConv\n"; my ($i64th, $dRad, $dCos, $dSin, $dTan, $iCentered, $retcost); my $top64th = int(64/8); for ($i64th = 1; $i64th <= $top64th; $i64th++) { $dRad = $i64th * $dRadConv; $dDegrees = ($dRad / $pi) * 180.0; $dCos = cos($dRad); $dSin = sin($dRad); $dTan = $dSin / $dCos; $iCentered = int(($dTan * $weight) + 0.5); $retcost = int(($dRad * $angScale) + 0.5) + $sCost; $mycost = $i64th * $sCostConv + $sCost; $minCentered = $iCentered if ($i64th == 1); $maxCentered = $iCentered if ($i64th == $top64th); printf("%2d: i64th=%2d rads=%4.2f deg=%2.0f dTan=%4.2f icen=%8d cost=%3d mycost=%3d\n", int($i64th/2),$i64th, $dRad, $dDegrees, $dTan, $iCentered, $retcost, $mycost) if ($i64th % 2) == 1 || $i64th == $top64th; } $ratioCentered = $maxCentered / $minCentered; print "Centered ratio = $ratioCentered\n"; print "\nCIRCLE THE CLOCK\n"; test_ang32(0, 1); test_ang32(1, 1); test_ang32(1, 0); test_ang32(1, -1); test_ang32(0, -1); test_ang32(-1, -1); test_ang32(-1, 0); test_ang32(-1, 1); test_ang32(0, 1); print "\nDO THE HUNDRED at 12:00\n"; $iy = 100; for ($ix = 0; $ix <= 100; $ix++) { test_ang32($ix, $iy); } print "\nDO THE FIFTY at 01:30\n"; $ix = 50; for ($iy = 50; $iy >= 0; $iy--) { test_ang32($ix, $iy); } print "\nDO THE FIFTY at 03:00\n"; $ix = 50; for ($iy = 0; $iy >= -50; $iy--) { test_ang32($ix, $iy); } print "\nDO THE FIFTY at 04:30\n"; $iy = -50; for ($ix = 50; $ix >= 0; $ix--) { test_ang32($ix, $iy); } print "\nDO THE FIFTY at 06:00\n"; $iy = -50; for ($ix = 0; $ix >= -50; $ix--) { test_ang32($ix, $iy); } print "\nDO THE FIFTY at 07:30\n"; $ix = -50; for ($iy = -50; $iy <= 0; $iy++) { test_ang32($ix, $iy); } print "\nDO THE FIFTY at 09:00\n"; $ix = -50; for ($iy = 0; $iy <= 50; $iy++) { test_ang32($ix, $iy); } print "\nDO THE FIFTY at 10:30\n"; $iy = 50; for ($ix = -50; $ix <= 0; $ix++) { test_ang32($ix, $iy); } print "\nGOING NOWHERE\n"; test_ang32(int(0), int(0)); kanjipad-2.0.0/jstroke/compact.pl0100664000076400007640000001715407045107512016726 0ustar otaylorotaylor#!/usr/bin/perl ## compact.pl - PERL5 script to convert StrokeDic into C initializations ## JStroke 1.x - Japanese Kanji handwriting recognition technology demo. ## Copyright (C) 1997 Robert E. Wells ## http://wellscs.com/pilot ## mailto:robert@wellscs.com ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either version 2 ## of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program (gpl.html); if not, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## ## Derived from prior work by Todd David Rudick on JavaDict and StrokeDic. ## Makes use of KANJIDIC data from Jim Breen of Monash University. ## Further credit details available at http://wellscs.com/pilot ## See readme.txt, changelo, and gpl.html for more information. ## ## Commentary: ## ## To run this perl script you need to acquire the following free software: ## ## 1. A PERL executable. See http://www.perl.com for information on ## downloading a copy of perl for your computer. ## ## 2. A copy of the StrokeDic data file, renamed to StrokeDic.txt. ## See http://www.cs.arizona.edu/japan/JavaDict/index.html or contact ## Todd David Rudick (mailto:rudick@cs.arizona.edu) to get a copy of this ## file. ## ## 3. A copy of the KanjiDic data file, renamed to KanjiDic.txt, ## used to convert Unicode to Kuten to Shift-JIS codes. ## See ftp://ftp.cc.monash.edu.au/pub/nihongo/00INDEX.html ## or contact Jim Breen at Monash University for how to download this file. ## ## 4. kkindex.txt, included in this source distribution. I entered the ## codes used in Hadamitzky and Spahn's "Kanji & Kana: A Handbook and ## dictionary of the Japanese Writing System", and also in their "A Guide ## to Writing Kanji & Kana, Book 1 and 2", published by Tuttle. The ## handbook contains the correspondence between their numbers and ## Nelson numbers; this code uses KanjiDic to map Nelson numbers to ## corresponding Kanji. This is all in preparation for future development ## related to building up a regression test suite of raw handwritten ## strokes for each Kanji and Kana, for establishing and maintaining the ## accuracy of the recognition algorithm. By the by, I learned from ## Jim Breen after I entered this data that he recently got equivalent ## data from Hadamitzky and Spahn, and it will be merged into KanjiDic ## in the future. ## ## You run it with a command line like this: ## ## perl compact.pl >newdata.c ## ## It generates a single warning about no Unicode for Hepburn code 2268, ## and this warning can be safely ignored. ## ## The output file newdata.c is easier to look at if your computer can ## display Shift-JIS encoded Japanese characters; I use KanjiKit97 for this ## on Windows95. ## ## I intend to supercede this with a Java application to generate the Pilot ## database directly; this will use a Java package available in the Pilot ## development community, and probably some of Todd David Rudick's Java code ## for reading StrokeDic as well. PERL is a language I'm very comfortable ## with, and thus it was expedient for me to do initial text hacking in it. ## ## -rwells, 19970901. ## --------------------------------------------------------------------------- $KANJIDIC = 'KanjiDic.txt'; open(KANJIDIC) || die "$KANJIDIC: $!\n"; $STROKEDIC = 'StrokeDic.txt'; open(STROKEDIC) || die "$STROKEDIC: $!\n"; $KKINDEX = 'kkindex.txt'; open(KKINDEX) || die "$KKINDEX: $!\n"; while () { my ($jisCode1, $jisCode2, $jisInt1, $jisInt2); my ($rowOffset, $cellOffset, $sjis1, $sjis2, $sjisText, $kuten); my ($uniCode, $halCode, $strokes, $nelson); next if (/^ *\#/); # Skip comment at top... if (/^[^ ][^ ] +([0-9a-f][0-9a-f])([0-9a-f][0-9a-f]) +/) { $jisCode1 = $1; $jisCode2 = $2; $jisInt1 = hex($jisCode1); $jisInt2 = hex($jisCode2); # This conversion algorithm is found in Ken Lunde's # "Understanding Japanese Information Processing", # published by O'Reilly & Associates, 1993. if ($jisInt1 < 95) { $rowOffset = 112; } else { $rowOffset = 176; } if ($jisInt1 % 2) { if ($jisInt2 > 95) { $cellOffset = 32; } else { $cellOffset = 31; } } else { $cellOffset = 126; } $sjis1 = (($jisInt1 + 1) >> 1) + $rowOffset; $sjis2 = $jisInt2 + $cellOffset; $sjisText = sprintf('%c%c', $sjis1, $sjis2); $sjisEscaped = sprintf("\\%03o\\%03o", $sjis1, $sjis2); $sjisHex = sprintf('%02x%02x', $sjis1, $sjis2); $kuten = sprintf('%02d%02d', $jisInt1-32, $jisInt2-32); } if (/ +(U[0-9a-f]+) +/) { $uniCode = $1; } if (/ +(N[0-9]+) +/) { $nelson = $1; } if (/ +(H[0-9]+) +/) { $halCode = $1; } if (/ +S([0-9]+) +/) { $strokes = $1; } $uniLookup{$uniCode} = "$strokes:$sjisEscaped:$kuten:$jisCode1$jisCode2:$sjisText:$halCode:$nelson"; } while () { my ($kkNum, $kkNelson); s/\#.*$//; # Ignore comments starting with '#' if (/^ *kk([0-9]+) +(N[0-9]+)[ \t\r\n]*$/) { $kkNum = $1; $kkNelson = $2; $kkLookup{$kkNelson} = $kkNum; } } while () { my ($uniCode, $halCode, $strokeCodes, $filters, $nelson); next if (/^ *\#/); # Skip comment lines... next if (/^[ \t]*$/); # Skip blank lines... if (/^[ \t]*([0-9a-f]+)[ \t]*([0-9]+)[ \t]*\|(.+)$/) { $uniCode = "U$1"; $halCode = "H$2"; $strokeCodes = $3; $strokeCodes =~ s/^[ \t]+([^ \t])/$1/; # Strip white space at front... $strokeCodes =~ s/\|.*$//; # Strip filters at end... $strokeCodes =~ s/[ \t\r\n]+$//; # Strip white space at end... } # One line for Halpern 2268 has no unicode... if ($uniCode eq 'U0') { print STDERR "Warning: No Unicode for $_"; next; } if (/^[^\|]+\|[^\|]+\|(.*)$/) { $filters = $1; $filters =~ s/^[ \t]+([^ \t])/$1/; # Strip white space at front... $filters =~ s/[ \t\r\n]+$//; # Strip white space at end... } @strokeCodeList = split(/ +/, $strokeCodes); $realStrokeCount = @strokeCodeList; $comStrokes = ''; foreach $stroker (@strokeCodeList) { if ($stroker =~ /^(.)(.*)$/) { ($firstChar, $otherChars) = ($1, $2); $firstChar =~ tr/123456789xycb/ABCDEFGHIJKLM/; $otherChars =~ tr/123456789xycb/abcdefghijklm/; $stroker = "$firstChar$otherChars"; } $comStrokes .= $stroker; } $kanjiInfo = $uniLookup{$uniCode}; my ($kStrokes, $kSJIS, $kKuten, $kJIScode, $kSJISText, $kHalpern, $kNelson) = split(/:/, $kanjiInfo); ### $warn = ''; ### ### if ($kStrokes != $realStrokeCount) ### { ### print STDERR "Warning: $uniCode Stroke Count mismatch (s=$realStrokeCount k=$kStrokes)\n"; ### $warn .= "*S$kStrokes"; ### } ### ### print STDERR "Warning: $uniCode Halpern code mismatch (s=$halCode k=$kHalpern)\n" ### if ($kHalpern ne $halCode and $kHalpern ne ''); ### $realStrokeChar = sprintf('%c', 64+$realStrokeCount); ### print "$realStrokeChar:$kSJIS:$kKuten:$uniCode:$halCode:$comStrokes:$strokeCodes:$filters:$warn\n"; $kkNum = $kkLookup{$kNelson}; $kkNum = "kk$kkNum" if ($kkNum); $filters = "|$filters" if $filters ne ''; push(@results, "\"$realStrokeChar$kSJIS$comStrokes$filters\" // '$kSJISText' $kNelson $kkNum"); } foreach $result (sort(@results)) { print " $result\n"; } kanjipad-2.0.0/jstroke/compile.bat0100664000076400007640000000114107045107512017050 0ustar otaylorotaylorpilrc jstroke.rcp m68k-palmos-coff-gcc -DFOR_PILOT_GCC -O1 -c jstroke.c -o jstroke.o m68k-palmos-coff-gcc -DFOR_PILOT_GCC -O1 -c memowrite.c -o memowrite.o m68k-palmos-coff-gcc -DFOR_PILOT_GCC -O1 -c scoring.c -o scoring.o m68k-palmos-coff-gcc -DFOR_PILOT_GCC -O1 -c util.c -o util.o m68k-palmos-coff-gcc -DFOR_PILOT_GCC -O1 -c bootdata.c -o bootdata.o m68k-palmos-coff-gcc -O1 jstroke.o memowrite.o scoring.o util.o bootdata.o -o jstroke m68k-palmos-coff-obj-res jstroke build-prc JStroke.prc "JStroke" jStr *.grc *.bin dir *.prc @del jstroke @del *.grc @del *.bin @del *.o kanjipad-2.0.0/jstroke/dos2unix.pl0100664000076400007640000000742007045107512017046 0ustar otaylorotaylor#!/usr/bin/perl ## dos2unix.pl - PERL5 script to remove ^M from line-end before release. ## JStroke 1.x - Japanese Kanji handwriting recognition technology demo. ## Copyright (C) 1997 Robert E. Wells ## http://wellscs.com/pilot ## mailto:robert@wellscs.com ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either version 2 ## of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program (gpl.html); if not, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## ## Commentary: ## ## To run this perl script you need to acquire the following free software: ## ## 1. A PERL executable. See http://www.perl.com for information on ## downloading a copy of perl for your computer. ## ## You run it with a command line like this: ## ## perl dos2unix.pl ## ## It looks for text files that have trailing \r\n combos, and removes the ## \r (Control-M), renaming the original file to file.ext.cr. It uses a ## list of extensions to decide which are text files. DOS programs seem ## determined to put in the Control-M before the newline, but on Unix it ## tends to upset some compilers and is generally an annoyance, so we try ## to remove them before zipping and posting to the net. -rwells, 19970922. ## ## --------------------------------------------------------------------------- # ----- fileHasCarriageReturn ------------------------------------------------ sub fileHasCarriageReturn { my ($FILE) = @_; my $line; my $retval = 0; open FILE,$FILE or die "open error: $FILE: $!\n"; binmode FILE; # Do raw reads even on Windows/DOS. while ($line = ) { if ($line =~ /\r/) { $retval = 1; break; } } close FILE; return $retval; } # ----- fixFile -------------------------------------------------------------- sub fixFile { my ($FILE) = @_; my $OLDFILE = "$FILE.old"; my $NEWFILE = "$FILE.new"; my $line; print "Fixing $FILE..."; open FILE,$FILE or die "open error: $FILE: $!\n"; binmode FILE; # Do raw reads even on Windows/DOS. unlink $NEWFILE; open NEWFILE,">$NEWFILE" or die "create error: $NEWFILE: $!\n"; binmode NEWFILE; # Do raw writes even on Windows/DOS. while ($line = ) { $line =~ s/\r//g; print NEWFILE $line or die "print error: $NEWFILE: $!\n"; } close NEWFILE; close FILE; unlink $OLDFILE; rename $FILE,$OLDFILE or die "rename error: $FILE -> $OLDFILE: $!\n"; rename $NEWFILE,$FILE or die "rename error: $NEWFILE -> $FILE: $!\n"; print " done.\n"; } # ----- main ----------------------------------------------------------------- opendir THISDIR,"." or die "Error: .: $!\n"; my @allFiles = readdir THISDIR; closedir THISDIR; foreach $file (sort @allFiles) { # Ignore directory entries. next if $file eq '.' or $file eq '..'; next unless -f $file; # Ignore known binary files that are installed. next if ($file =~ /^.+\.pdb$/i or $file =~ /^.+\.prc$/i or $file =~ /^.+\.bmp$/i); # Ignore backup files we created ourselves... next if ($file =~ /^.+\.old$/i); # Ignore files which cause errors on Windows if Control-M's are removed. next if ($file =~ /^.+\.bat$/i); fixFile($file) if fileHasCarriageReturn($file); } exit 0; # ----- End of dos2unix.pl --------------------------------------------------- kanjipad-2.0.0/jstroke/gpl.html0100664000076400007640000005041207045107512016405 0ustar otaylorotaylor GNU General Public License - GNU Project - Free Software Foundation (FSF)

GNU General Public License

 [image of a Philosophical Gnu] (jpeg 7k) (jpeg 141k) no gifs due to patent problems


Table of Contents


GNU GENERAL PUBLIC LICENSE

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.  
59 Temple Place - Suite 330, Boston, MA  02111-1307, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

  • a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

  • b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

  • c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

  • a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

  • b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

  • c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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.

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 convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.

one line to give the program's name and an idea of what it does.
Copyright (C) 19yy  name of author

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright
interest in the program `Gnomovision'
(which makes passes at compilers) written 
by James Hacker.

signature of Ty Coon, 1 April 1989
Ty Coon, President of Vice

This 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 Library General Public License instead of this License.


Return to GNU's home page.

FSF & GNU inquiries & questions to gnu@prep.ai.mit.edu. Other ways to contact the FSF.

Comments on these web pages to webmasters@www.gnu.ai.mit.edu, send other questions to gnu@prep.ai.mit.edu.

Copyright notice above.
Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA

Updated: 4 Aug 1997 tower


kanjipad-2.0.0/jstroke/jstroke.h0100664000076400007640000001075607045107506016601 0ustar otaylorotaylor/* -*- mode: C; c-file-style: "bsd"; tab-width: 4 -*- */ /* jstroke.h - System-independent functions/defines * JStroke 1.x - Japanese Kanji handwriting recognition technology demo. * Copyright (C) 1997 Robert E. Wells * http://wellscs.com/pilot * mailto:robert@wellscs.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (gpl.html); if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Derived from prior work by Todd David Rudick on JavaDict and StrokeDic. * Makes use of KANJIDIC data from Jim Breen of Monash University. * Further credit details available at http://wellscs.com/pilot * See readme.txt, ChangeLog, and gpl.html for more information. * * CONDITIONAL COMPILATION FLAGS: * -DFOR_PILOT_GCC -- Robert Wells uses this for code that is specific to the * US Robotics/3COM Pilot GCC development environment. * Contact robert@wellscs.com, http://wellscs.com/pilot. * * -DFOR_PILOT_COMPAT -- Owen Taylor uses this for his perl front-ended * application. He puts this code in a subdirectory under the * rest of his code. Contact owt1@cornell.edu for more * information, or visit his web site at * http://www.msc.cornell.edu/~otaylor/. 9/1997. * * -------------------------------------------------------------------------*/ #ifndef __JSTROKE_H__ #define __JSTROKE_H__ #ifdef FOR_PILOT_COMPAT #include "pilotcompat.h" #endif /*FOR_PILOT_COMPAT*/ #ifdef FOR_PILOT_GCC #pragma pack(2) // $$$ Probably not needed anymore... -rwells, 19970921. #include #include #include #endif /*FOR_PILOT_GCC*/ /* Limit list to what we can afford (5), or what will fit on screen at most. * #define diMaxListCount (diScreenHeight/diFontLineHeight) */ #define diMaxListCount 5 #define diMaxXyPairs 256 /* Max pairs in stroke... */ /* ----- List Memory --------------------------------------------------------- * The idea here is to have a single nonmovable chunk of memory which contains * all the structures and cross-pointers needed to support the item list for * passing to LstSetListChoices, and related List control functions. We * allocate and free it as a single chunk of application memory. */ typedef struct { UInt m_argc; char** m_argv; } ListMem; /* ----- RawStroke ---------------------------------------------------------*/ typedef struct { UInt m_len; Byte m_x[diMaxXyPairs]; Byte m_y[diMaxXyPairs]; } RawStroke; /* ----- ScoreItem ---------------------------------------------------------*/ typedef struct ScoreItemStruct *ScoreItemPtr; typedef struct ScoreItemStruct { ULong m_iScore; CharPtr m_cp; } ScoreItem; /* ----- StrokeScorer------------------------------------------------------ */ typedef struct StrokeScorer *StrokeScorerPtr; typedef struct StrokeScorerStruct { CharPtr m_cpStrokeDic; RawStroke* m_pRawStrokes; UInt m_iStrokeCnt; ScoreItem* m_pScores; UInt m_iScoreLen; CharPtr m_cpPath; } StrokeScorer; ListMem* AppEmptyList(); Long Angle32(Long xdif, Long ydif); void ErrBox(CharPtr msg); void ErrBox2(CharPtr msg1, CharPtr msg2); /* Create a StrokeScorer object. (Returns NULL if can't get memory) */ StrokeScorer *StrokeScorerCreate (CharPtr cpStrokeDic, RawStroke *rsp, UInt iStrokeCnt); /* Destroy a StrokeScorer object */ void StrokeScorerDestroy (StrokeScorer *pScorer); /* Process some database entries (maximum iMaxCnt, -1 for all). * Returns 0 when none remaining (should eventually return count remaining * to facilitate a progressbar. */ Long StrokeScorerProcess (StrokeScorer *pScorer, Long iMaxCnt); /* Return best diMaxListCount candidates processed so far */ ListMem* StrokeScorerTopPicks (StrokeScorer *pScorer); #endif /*__JSTROKE_H__*/ /* ----- End of jstroke.h ------------------------------------------------- */ kanjipad-2.0.0/jstroke/jstrokerc.h0100664000076400007640000000422507045107506017120 0ustar otaylorotaylor// -*- mode: C++; c-file-style: "bsd"; tab-width: 4 -*- // jstrokerc.h - Pilot resource file IDs included by resource file and C code. // JStroke 1.x - Japanese Kanji handwriting recognition technology demo. // Copyright (C) 1997 Robert E. Wells // http://wellscs.com/pilot // mailto:robert@wellscs.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program (gpl.html); if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Derived from prior work by Todd David Rudick on JavaDict and StrokeDic. // Makes use of KANJIDIC data from Jim Breen of Monash University. // Further credit details available at http://wellscs.com/pilot // See readme.txt, changelo, and gpl.html for more information. // // The pilrc tool is very picky about its input, and this file is included // by jstroke.rcp. Only C++ style comments are supported, and there can't // be any comments once the #define lines have started. -rwells, 19970921. // --------------------------------------------------------------------------- #define formID_App 1000 #define menuID_App 2000 #define menuitemID_about 3000 #define menuitemID_copy 3001 #define menuitemID_paste 3002 #define fieldID_text 4001 #define fieldID_textMaxChars 80 #define alertID_about 5000 #define alertID_ErrBox 5001 #define buttonID_recognize 6000 #define buttonID_erase 6001 #define buttonID_angles 6002 #define buttonID_replay 6003 #define poptrigID_kanji 7000 #define listID_kanji 8000 kanjipad-2.0.0/jstroke/kkindex.txt0100664000076400007640000006254307045107504017144 0ustar otaylorotaylor## kkindex.txt - data giving Kanji&Kana to Nelson code mapping. ## JStroke 1.x - Japanese Kanji handwriting recognition technology demo. ## Copyright (C) 1997 Robert E. Wells ## http://wellscs.com/pilot ## mailto:robert@wellscs.com ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either version 2 ## of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program (gpl.html); if not, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## ## I entered the ## codes used in Hadamitzky and Spahn's "Kanji & Kana: A Handbook and ## dictionary of the Japanese Writing System", and also in their "A Guide ## to Writing Kanji & Kana, Book 1 and 2", published by Tuttle. The ## handbook contains the correspondence between their numbers and ## Nelson numbers; this code uses KanjiDic to map Nelson numbers to ## corresponding Kanji. This is all in preparation for future development ## related to building up a regression test suite of raw handwritten ## strokes for each Kanji and Kana, for establishing and maintaining the ## accuracy of the recognition algorithm. By the by, I learned from ## Jim Breen after I entered this data that he recently got equivalent ## data from Hadamitzky and Spahn, and it will be merged into KanjiDic ## in the future. ## ## Format: ## 1. '#' and following characters to end of line are ignored. ## 2. lines containing only white space are ignored. ## 3. Other lines should match the pattern / *kk(\d+) +N(\d+) *$/ ## The 'kk' code is the Kanji numbering system used in the ## Kanji&Kana books, and the 'N' code is the Nelson dictionary code. ## ## -rwells, 19970901. ## --------------------------------------------------------------------------- kk1 N339 kk2 N1 kk3 N273 kk4 N8 kk5 N2097 kk6 N1025 kk7 N15 kk8 N283 kk9 N261 kk10 N577 kk11 N146 kk12 N768 kk13 N617 kk14 N33 kk15 N156 kk16 N7 kk17 N2169 kk18 N2110 kk19 N2162 kk20 N2743 kk21 N2482 kk22 N2170 kk23 N4815 kk24 N1050 kk25 N96 kk26 N1171 kk27 N1355 kk28 N81 kk29 N5148 kk30 N5042 kk31 N9 kk32 N798 kk33 N1447 kk34 N1407 kk35 N2994 kk36 N2757 kk37 N665 kk38 N578 kk39 N667 kk40 N1037 kk41 N1054 kk42 N2126 kk43 N4949 kk44 N2991 kk45 N188 kk46 N348 kk47 N595 kk48 N1610 kk49 N162 kk50 N571 kk51 N352 kk52 N574 kk53 N97 kk54 N868 kk55 N3127 kk56 N3697 kk57 N1827 kk58 N4546 kk59 N4601 kk60 N380 kk61 N405 kk62 N3841 kk63 N4284 kk64 N4959 kk65 N3699 kk66 N4309 kk67 N4374 kk68 N4213 kk69 N202 kk70 N2082 kk71 N213 kk72 N4273 kk73 N751 kk74 N778 kk75 N1455 kk76 N878 kk77 N1359 kk78 N3176 kk79 N2857 kk80 N272 kk81 N1167 kk82 N1170 kk83 N1168 kk84 N82 kk85 N2439 kk86 N4767 kk87 N483 kk88 N132 kk89 N384 kk90 N1028 kk91 N622 kk92 N4707 kk93 N2773 kk94 N17 kk95 N4938 kk96 N3092 kk97 N1645 kk98 N1666 kk99 N3001 kk100 N715 kk101 N2996 kk102 N1185 kk103 N1264 kk104 N1191 kk105 N1283 kk106 N1308 kk107 N2993 kk108 N5050 kk109 N1271 kk110 N1281 kk111 N2064 kk112 N2466 kk113 N2832 kk114 N290 kk115 N2260 kk116 N2467 kk117 N2553 kk118 N1056 kk119 N2489 kk120 N361 kk121 N3343 kk122 N401 kk123 N2535 kk124 N3268 kk125 N3265 kk126 N579 kk127 N2210 kk128 N2301 kk129 N3366 kk130 N3397 kk131 N3719 kk132 N5113 kk133 N4608 kk134 N2480 kk135 N2507 kk136 N825 kk137 N275 kk138 N1358 kk139 N1451 kk140 N3317 kk141 N16 kk142 N4813 kk143 N2942 kk144 N166 kk145 N218 kk146 N2241 kk147 N1728 kk148 N5186 kk149 N4724 kk150 N4703 kk151 N4561 kk152 N1817 kk153 N1821 kk154 N1113 kk155 N285 kk156 N404 kk157 N454 kk158 N381 kk159 N383 kk160 N3394 kk161 N4940 kk162 N4944 kk163 N928 kk164 N3685 kk165 N1311 kk166 N1300 kk167 N1392 kk168 N1509 kk169 N804 kk170 N1384 kk171 N1387 kk172 N770 kk173 N2044 kk174 N2080 kk175 N4293 kk176 N4518 kk177 N25 kk178 N1279 kk179 N1317 kk180 N3510 kk181 N284 kk182 N2995 kk183 N757 kk184 N2 kk185 N4811 kk186 N1626 kk187 N1621 kk188 N4769 kk189 N295 kk190 N5248 kk191 N2191 kk192 N363 kk193 N4764 kk194 N1362 kk195 N99 kk196 N581 kk197 N431 kk198 N619 kk199 N101 kk200 N34 kk201 N2636 kk202 N26 kk203 N1297 kk204 N3889 kk205 N3095 kk206 N5403 kk207 N4534 kk208 N5076 kk209 N1714 kk210 N3097 kk211 N3499 kk212 N1560 kk213 N3168 kk214 N3169 kk215 N3172 kk216 N1562 kk217 N1571 kk218 N650 kk219 N2884 kk220 N763 kk221 N2090 kk222 N2088 kk223 N3724 kk224 N3461 kk225 N2057 kk226 N5138 kk227 N224 kk228 N3295 kk229 N1169 kk230 N923 kk231 N730 kk232 N532 kk233 N720 kk234 N774 kk235 N3167 kk236 N4814 kk237 N2552 kk238 N4358 kk239 N1067 kk240 N4486 kk241 N3637 kk242 N3492 kk243 N3544 kk244 N4375 kk245 N2052 kk246 N296 kk247 N2576 kk248 N2100 kk249 N3939 kk250 N3893 kk251 N3940 kk252 N95 kk253 N4001 kk254 N350 kk255 N3909 kk256 N364 kk257 N306 kk258 N313 kk259 N2829 kk260 N2826 kk261 N1799 kk262 N1731 kk263 N2146 kk264 N858 kk265 N3727 kk266 N882 kk267 N674 kk268 N1055 kk269 N1267 kk270 N5385 kk271 N3511 kk272 N108 kk273 N327 kk274 N5087 kk275 N27 kk276 N4469 kk277 N5139 kk278 N3354 kk279 N143 kk280 N2868 kk281 N2852 kk282 N2860 kk283 N5191 kk284 N5199 kk285 N5340 kk286 N230 kk287 N2473 kk288 N3656 kk289 N2550 kk290 N5281 kk291 N3668 kk292 N4448 kk293 N4391 kk294 N2922 kk295 N2923 kk296 N1293 kk297 N3100 kk298 N2943 kk299 N3580 kk300 N139 kk301 N1810 kk302 N186 kk303 N1667 kk304 N62 kk305 N177 kk306 N179 kk307 N913 kk308 N3231 kk309 N93 kk310 N3245 kk311 N178 kk312 N4844 kk313 N4855 kk314 N2261 kk315 N164 kk316 N1237 kk317 N1582 kk318 N2039 kk319 N3468 kk320 N3272 kk321 N3885 kk322 N5154 kk323 N5159 kk324 N817 kk325 N5158 kk326 N1295 kk327 N5174 kk328 N3416 kk329 N3264 kk330 N450 kk331 N432 kk332 N91 kk333 N362 kk334 N374 kk335 N2360 kk336 N2305 kk337 N745 kk338 N747 kk339 N1034 kk340 N4312 kk341 N4817 kk342 N4392 kk343 N50 kk344 N2685 kk345 N3537 kk346 N3538 kk347 N5110 kk348 N2154 kk349 N5115 kk350 N1979 kk351 N86 kk352 N2118 kk353 N3927 kk354 N2164 kk355 N1296 kk356 N2509 kk357 N2531 kk358 N2324 kk359 N4074 kk360 N407 kk361 N2119 kk362 N2452 kk363 N89 kk364 N2534 kk365 N2067 kk366 N103 kk367 N588 kk368 N615 kk369 N4658 kk370 N1462 kk371 N4318 kk372 N3497 kk373 N4541 kk374 N1622 kk375 N1598 kk376 N3873 kk377 N1511 kk378 N2635 kk379 N1513 kk380 N3042 kk381 N1780 kk382 N551 kk383 N2412 kk384 N638 kk385 N3718 kk386 N853 kk387 N1743 kk388 N24 kk389 N2530 kk390 N409 kk391 N3956 kk392 N2422 kk393 N271 kk394 N5123 kk395 N1589 kk396 N4950 kk397 N4945 kk398 N4958 kk399 N3287 kk400 N4373 kk401 N3658 kk402 N3671 kk403 N2341 kk404 N3385 kk405 N584 kk406 N875 kk407 N1207 kk408 N1204 kk409 N113 kk410 N3357 kk411 N2141 kk412 N321 kk413 N4723 kk414 N1051 kk415 N4738 kk416 N2060 kk417 N3285 kk418 N3520 kk419 N4274 kk420 N3128 kk421 N422 kk422 N783 kk423 N775 kk424 N2303 kk425 N488 kk426 N3644 kk427 N683 kk428 N4249 kk429 N4539 kk430 N1614 kk431 N2433 kk432 N2591 kk433 N4615 kk434 N379 kk435 N3908 kk436 N5031 kk437 N4709 kk438 N628 kk439 N4725 kk440 N4702 kk441 N4683 kk442 N4670 kk443 N1061 kk444 N4685 kk445 N4671 kk446 N4733 kk447 N1047 kk448 N4721 kk449 N3785 kk450 N1098 kk451 N1903 kk452 N1609 kk453 N347 kk454 N2998 kk455 N1882 kk456 N3516 kk457 N1322 kk458 N3521 kk459 N1161 kk460 N2122 kk461 N58 kk462 N3273 kk463 N3886 kk464 N3402 kk465 N3266 kk466 N3267 kk467 N2628 kk468 N2702 kk469 N3788 kk470 N53 kk471 N298 kk472 N2599 kk473 N4301 kk474 N4306 kk475 N3981 kk476 N240 kk477 N2429 kk478 N5428 kk479 N2434 kk480 N835 kk481 N373 kk482 N3251 kk483 N2045 kk484 N4341 kk485 N3540 kk486 N1951 kk487 N107 kk488 N4389 kk489 N455 kk490 N1282 kk491 N1027 kk492 N848 kk493 N2528 kk494 N1208 kk495 N1363 kk496 N1365 kk497 N1364 kk498 N5080 kk499 N1366 kk500 N1372 kk501 N196 kk502 N4700 kk503 N2436 kk504 N1507 kk505 N3383 kk506 N678 kk507 N1466 kk508 N1045 kk509 N3787 kk510 N4488 kk511 N4494 kk512 N2084 kk513 N4980 kk514 N1464 kk515 N4779 kk516 N4789 kk517 N2573 kk518 N1306 kk519 N703 kk520 N129 kk521 N1342 kk522 N2468 kk523 N223 kk524 N4768 kk525 N1556 kk526 N4361 kk527 N994 kk528 N2379 kk529 N2264 kk530 N5152 kk531 N2304 kk532 N5220 kk533 N5000 kk534 N187 kk535 N1949 kk536 N2606 kk537 N3564 kk538 N4879 kk539 N6 kk540 N626 kk541 N3684 kk542 N773 kk543 N3683 kk544 N3926 kk545 N3928 kk546 N4634 kk547 N4620 kk548 N3523 kk549 N2597 kk550 N5424 kk551 N270 kk552 N2189 kk553 N4490 kk554 N1026 kk555 N1684 kk556 N2662 kk557 N5038 kk558 N1033 kk559 N732 kk560 N1878 kk561 N406 kk562 N1508 kk563 N4759 kk564 N1164 kk565 N1177 kk566 N2478 kk567 N1236 kk568 N3496 kk569 N3396 kk570 N4360 kk571 N427 kk572 N1160 kk573 N1064 kk574 N4366 kk575 N5032 kk576 N2454 kk577 N4325 kk578 N430 kk579 N424 kk580 N2656 kk581 N255 kk582 N1828 kk583 N351 kk584 N1492 kk585 N1493 kk586 N1413 kk587 N2471 kk588 N5011 kk589 N4988 kk590 N3673 kk591 N3675 kk592 N3674 kk593 N4388 kk594 N4327 kk595 N4809 kk596 N3681 kk597 N2378 kk598 N2236 kk599 N5209 kk600 N1350 kk601 N787 kk602 N1946 kk603 N3217 kk604 N4296 kk605 N4288 kk606 N3248 kk607 N4285 kk608 N4487 kk609 N509 kk610 N2632 kk611 N2438 kk612 N428 kk613 N1288 kk614 N4991 kk615 N3228 kk616 N1294 kk617 N3247 kk618 N5018 kk619 N1334 kk620 N3229 kk621 N3234 kk622 N3243 kk623 N719 kk624 N2235 kk625 N1301 kk626 N2839 kk627 N2840 kk628 N1967 kk629 N1172 kk630 N5012 kk631 N1966 kk632 N2633 kk633 N535 kk634 N2634 kk635 N2153 kk636 N5046 kk637 N2160 kk638 N2138 kk639 N824 kk640 N1304 kk641 N1302 kk642 N1163 kk643 N2259 kk644 N155 kk645 N2797 kk646 N735 kk647 N5005 kk648 N4851 kk649 N2549 kk650 N2445 kk651 N2770 kk652 N2808 kk653 N4458 kk654 N1309 kk655 N4492 kk656 N3306 kk657 N3665 kk658 N3662 kk659 N3480 kk660 N2605 kk661 N4390 kk662 N2143 kk663 N5077 kk664 N2548 kk665 N3186 kk666 N2529 kk667 N1608 kk668 N2543 kk669 N2630 kk670 N2627 kk671 N1206 kk672 N281 kk673 N2940 kk674 N2960 kk675 N1468 kk676 N1470 kk677 N4214 kk678 N426 kk679 N4215 kk680 N3613 kk681 N4438 kk682 N3583 kk683 N3741 kk684 N1073 kk685 N1114 kk686 N1097 kk687 N2795 kk688 N3860 kk689 N3856 kk690 N900 kk691 N4701 kk692 N2551 kk693 N2494 kk694 N1499 kk695 N3522 kk696 N2212 kk697 N3567 kk698 N3326 kk699 N2684 kk700 N5307 kk701 N5295 kk702 N4722 kk703 N1354 kk704 N607 kk705 N2055 kk706 N4439 kk707 N812 kk708 N1628 kk709 N716 kk710 N850 kk711 N846 kk712 N1137 kk713 N1321 kk714 N699 kk715 N2637 kk716 N597 kk717 N3119 kk718 N4352 kk719 N3116 kk720 N1078 kk721 N1310 kk722 N963 kk723 N2239 kk724 N137 kk725 N2051 kk726 N2941 kk727 N554 kk728 N2865 kk729 N2858 kk730 N2121 kk731 N2856 kk732 N368 kk733 N573 kk734 N4708 kk735 N228 kk736 N2145 kk737 N4324 kk738 N4370 kk739 N4472 kk740 N540 kk741 N2257 kk742 N3539 kk743 N3565 kk744 N2140 kk745 N4516 kk746 N1066 kk747 N3415 kk748 N4503 kk749 N4497 kk750 N4510 kk751 N4509 kk752 N4493 kk753 N600 kk754 N150 kk755 N2237 kk756 N4501 kk757 N860 kk758 N3508 kk759 N2107 kk760 N4499 kk761 N3003 kk762 N4502 kk763 N1498 kk764 N2108 kk765 N1712 kk766 N490 kk767 N2056 kk768 N519 kk769 N1450 kk770 N1502 kk771 N4317 kk772 N215 kk773 N3164 kk774 N3166 kk775 N4661 kk776 N4660 kk777 N4667 kk778 N791 kk779 N2240 kk780 N5399 kk781 N2361 kk782 N35 kk783 N4425 kk784 N201 kk785 N2567 kk786 N1515 kk787 N294 kk788 N319 kk789 N4205 kk790 N518 kk791 N423 kk792 N4210 kk793 N899 kk794 N3667 kk795 N5010 kk796 N3772 kk797 N247 kk798 N2470 kk799 N2604 kk800 N4744 kk801 N1902 kk802 N4353 kk803 N331 kk804 N176 kk805 N1065 kk806 N1316 kk807 N3281 kk808 N4758 kk809 N5023 kk810 N3862 kk811 N4028 kk812 N4000 kk813 N5421 kk814 N4720 kk815 N1639 kk816 N722 kk817 N4761 kk818 N1454 kk819 N1457 kk820 N3500 kk821 N2491 kk822 N253 kk823 N3867 kk824 N1852 kk825 N1512 kk826 N1503 kk827 N1504 kk828 N289 kk829 N4854 kk830 N3536 kk831 N360 kk832 N642 kk833 N5431 kk834 N5124 kk835 N3837 kk836 N3840 kk837 N4957 kk838 N5136 kk839 N4003 kk840 N3533 kk841 N3007 kk842 N877 kk843 N4335 kk844 N1360 kk845 N2574 kk846 N4684 kk847 N4987 kk848 N3140 kk849 N3132 kk850 N2516 kk851 N3244 kk852 N3364 kk853 N2142 kk854 N1594 kk855 N4766 kk856 N5114 kk857 N5112 kk858 N5019 kk859 N3983 kk860 N3642 kk861 N4393 kk862 N3557 kk863 N4912 kk864 N1135 kk865 N2970 kk866 N4750 kk867 N5006 kk868 N5020 kk869 N3305 kk870 N2211 kk871 N1853 kk872 N1410 kk873 N4115 kk874 N4305 kk875 N5221 kk876 N1801 kk877 N1496 kk878 N479 kk879 N696 kk880 N3393 kk881 N682 kk882 N2869 kk883 N2872 kk884 N2906 kk885 N3643 kk886 N3646 kk887 N670 kk888 N1077 kk889 N4242 kk890 N1919 kk891 N4706 kk892 N1549 kk893 N512 kk894 N1518 kk895 N3314 kk896 N3180 kk897 N3337 kk898 N3316 kk899 N3313 kk900 N4603 kk901 N4423 kk902 N3845 kk903 N3847 kk904 N3846 kk905 N487 kk906 N4372 kk907 N14 kk908 N195 kk909 N449 kk910 N1273 kk911 N1790 kk912 N2547 kk913 N3764 kk914 N2469 kk915 N1756 kk916 N4255 kk917 N1627 kk918 N1605 kk919 N2784 kk920 N2772 kk921 N4743 kk922 N4276 kk923 N2359 kk924 N2678 kk925 N983 kk926 N5359 kk927 N922 kk928 N2256 kk929 N1215 kk930 N2823 kk931 N3982 kk932 N1590 kk933 N1947 kk934 N323 kk935 N2506 kk936 N2508 kk937 N2703 kk938 N2575 kk939 N266 kk940 N1265 kk941 N268 kk942 N197 kk943 N4002 kk944 N481 kk945 N491 kk946 N4999 kk947 N4994 kk948 N5064 kk949 N5044 kk950 N5065 kk951 N5069 kk952 N5049 kk953 N5055 kk954 N1920 kk955 N1197 kk956 N1220 kk957 N2711 kk958 N4465 kk959 N4466 kk960 N3094 kk961 N1526 kk962 N326 kk963 N1474 kk964 N2661 kk965 N3509 kk966 N4830 kk967 N4681 kk968 N4675 kk969 N1710 kk970 N1085 kk971 N563 kk972 N1036 kk973 N489 kk974 N2238 kk975 N3109 kk976 N4225 kk977 N1604 kk978 N3280 kk979 N5161 kk980 N4762 kk981 N1519 kk982 N92 kk983 N260 kk984 N22 kk985 N2234 kk986 N1885 kk987 N1877 kk988 N4619 kk989 N1917 kk990 N1280 kk991 N1291 kk992 N1385 kk993 N1845 kk994 N2503 kk995 N668 kk996 N2521 kk997 N2114 kk998 N2785 kk999 N5029 kk1000 N4543 kk1001 N4542 kk1002 N4544 kk1003 N4726 kk1004 N2085 kk1005 N2091 kk1006 N2093 kk1007 N183 kk1008 N42 kk1009 N3193 kk1010 N2343 kk1011 N4522 kk1012 N2657 kk1013 N4446 kk1014 N2157 kk1015 N2818 kk1016 N1986 kk1017 N2712 kk1018 N4316 kk1019 N4310 kk1020 N1829 kk1021 N1856 kk1022 N2413 kk1023 N2208 kk1024 N2078 kk1025 N3545 kk1026 N673 kk1027 N396 kk1028 N4339 kk1029 N1848 kk1030 N32 kk1031 N51 kk1032 N70 kk1033 N564 kk1034 N5082 kk1035 N485 kk1036 N1948 kk1037 N5086 kk1038 N1633 kk1039 N3716 kk1040 N752 kk1041 N1904 kk1042 N3766 kk1043 N102 kk1044 N210 kk1045 N2842 kk1046 N2843 kk1047 N2213 kk1048 N4491 kk1049 N382 kk1050 N1325 kk1051 N736 kk1052 N2425 kk1053 N506 kk1054 N3579 kk1055 N4669 kk1056 N375 kk1057 N1851 kk1058 N199 kk1059 N782 kk1060 N3006 kk1061 N3008 kk1062 N3680 kk1063 N408 kk1064 N2152 kk1065 N4993 kk1066 N1612 kk1067 N862 kk1068 N698 kk1069 N2074 kk1070 N211 kk1071 N3149 kk1072 N4697 kk1073 N1124 kk1074 N3955 kk1075 N5088 kk1076 N5092 kk1077 N452 kk1078 N2572 kk1079 N1326 kk1080 N1945 kk1081 N598 kk1082 N1585 kk1083 N3279 kk1084 N3473 kk1085 N4984 kk1086 N1290 kk1087 N3010 kk1088 N1961 kk1089 N3584 kk1090 N3395 kk1091 N3425 kk1092 N3424 kk1093 N163 kk1094 N3863 kk1095 N3870 kk1096 N3865 kk1097 N3113 kk1098 N3122 kk1099 N594 kk1100 N3115 kk1101 N1125 kk1102 N654 kk1103 N1469 kk1104 N2117 kk1105 N1483 kk1106 N1570 kk1107 N1478 kk1108 N403 kk1109 N3518 kk1110 N3608 kk1111 N1546 kk1112 N1514 kk1113 N1876 kk1114 N1603 kk1115 N1547 kk1116 N4386 kk1117 N3602 kk1118 N531 kk1119 N181 kk1120 N3299 kk1121 N3282 kk1122 N1430 kk1123 N788 kk1124 N789 kk1125 N781 kk1126 N453 kk1127 N4461 kk1128 N2568 kk1129 N1396 kk1130 N242 kk1131 N3585 kk1132 N1132 kk1133 N4716 kk1134 N4696 kk1135 N1781 kk1136 N1142 kk1137 N1162 kk1138 N1871 kk1139 N606 kk1140 N3612 kk1141 N1053 kk1142 N4359 kk1143 N1115 kk1144 N2377 kk1145 N3818 kk1146 N3736 kk1147 N5415 kk1148 N5255 kk1149 N236 kk1150 N185 kk1151 N3181 kk1152 N3271 kk1153 N1849 kk1154 N1199 kk1155 N2206 kk1156 N2202 kk1157 N2171 kk1158 N88 kk1159 N511 kk1160 N4718 kk1161 N2984 kk1162 N425 kk1163 N474 kk1164 N4630 kk1165 N589 kk1166 N605 kk1167 N4437 kk1168 N5056 kk1169 N2631 kk1170 N5137 kk1171 N4504 kk1172 N4745 kk1173 N4732 kk1174 N4686 kk1175 N4676 kk1176 N397 kk1177 N2527 kk1178 N1872 kk1179 N305 kk1180 N3581 kk1181 N4326 kk1182 N1196 kk1183 N520 kk1184 N303 kk1185 N507 kk1186 N4636 kk1187 N4611 kk1188 N2493 kk1189 N790 kk1190 N784 kk1191 N3566 kk1192 N3099 kk1193 N165 kk1194 N1032 kk1195 N1024 kk1196 N3695 kk1197 N3694 kk1198 N1198 kk1199 N4880 kk1200 N1930 kk1201 N1884 kk1202 N2401 kk1203 N2700 kk1204 N2598 kk1205 N649 kk1206 N131 kk1207 N130 kk1208 N2520 kk1209 N4336 kk1210 N153 kk1211 N681 kk1212 N2254 kk1213 N4349 kk1214 N4338 kk1215 N2933 kk1216 N94 kk1217 N572 kk1218 N4990 kk1219 N1681 kk1220 N3294 kk1221 N3300 kk1222 N3976 kk1223 N2920 kk1224 N4024 kk1225 N2918 kk1226 N1568 kk1227 N1494 kk1228 N112 kk1229 N1495 kk1230 N3292 kk1231 N3552 kk1232 N648 kk1233 N1950 kk1234 N942 kk1235 N3374 kk1236 N2532 kk1237 N1819 kk1238 N1818 kk1239 N2569 kk1240 N961 kk1241 N2698 kk1242 N3844 kk1243 N1765 kk1244 N3842 kk1245 N1532 kk1246 N974 kk1247 N4424 kk1248 N40 kk1249 N402 kk1250 N898 kk1251 N2949 kk1252 N881 kk1253 N883 kk1254 N914 kk1255 N901 kk1256 N885 kk1257 N154 kk1258 N1836 kk1259 N3855 kk1260 N1896 kk1261 N3543 kk1262 N2432 kk1263 N727 kk1264 N1820 kk1265 N3754 kk1266 N5236 kk1267 N2663 kk1268 N3000 kk1269 N4113 kk1270 N3798 kk1271 N3800 kk1272 N3731 kk1273 N3751 kk1274 N1879 kk1275 N1683 kk1276 N1075 kk1277 N3752 kk1278 N3774 kk1279 N1698 kk1280 N663 kk1281 N5040 kk1282 N666 kk1283 N3768 kk1284 N3749 kk1285 N1883 kk1286 N4042 kk1287 N3828 kk1288 N4517 kk1289 N1096 kk1290 N3560 kk1291 N4292 kk1292 N3596 kk1293 N758 kk1294 N4548 kk1295 N1847 kk1296 N3750 kk1297 N851 kk1298 N3799 kk1299 N3786 kk1300 N3767 kk1301 N2546 kk1302 N200 kk1303 N5171 kk1304 N5155 kk1305 N2174 kk1306 N3726 kk1307 N486 kk1308 N702 kk1309 N1184 kk1310 N1183 kk1311 N5028 kk1312 N4447 kk1313 N2912 kk1314 N3309 kk1315 N1697 kk1316 N222 kk1317 N533 kk1318 N3039 kk1319 N3028 kk1320 N3054 kk1321 N3040 kk1322 N3078 kk1323 N1340 kk1324 N545 kk1325 N151 kk1326 N2837 kk1327 N3938 kk1328 N4234 kk1329 N4223 kk1330 N4233 kk1331 N2761 kk1332 N1181 kk1333 N2745 kk1334 N2699 kk1335 N1448 kk1336 N2751 kk1337 N2602 kk1338 N2660 kk1339 N1803 kk1340 N193 kk1341 N816 kk1342 N818 kk1343 N820 kk1344 N1418 kk1345 N1414 kk1346 N2505 kk1347 N378 kk1348 N1653 kk1349 N3582 kk1350 N1423 kk1351 N1416 kk1352 N1417 kk1353 N2882 kk1354 N1915 kk1355 N2901 kk1356 N377 kk1357 N174 kk1358 N208 kk1359 N761 kk1360 N1176 kk1361 N1318 kk1362 N1426 kk1363 N1412 kk1364 N4525 kk1365 N1757 kk1366 N536 kk1367 N1402 kk1368 N1696 kk1369 N4961 kk1370 N3775 kk1371 N4864 kk1372 N772 kk1373 N1647 kk1374 N291 kk1375 N297 kk1376 N288 kk1377 N3941 kk1378 N1725 kk1379 N3526 kk1380 N1484 kk1381 N2935 kk1382 N4089 kk1383 N1341 kk1384 N4112 kk1385 N4111 kk1386 N725 kk1387 N5030 kk1388 N2435 kk1389 N3534 kk1390 N3232 kk1391 N4241 kk1392 N2659 kk1393 N2194 kk1394 N1855 kk1395 N4369 kk1396 N4691 kk1397 N931 kk1398 N940 kk1399 N2156 kk1400 N2680 kk1401 N175 kk1402 N4340 kk1403 N4320 kk1404 N4992 kk1405 N5001 kk1406 N2299 kk1407 N1147 kk1408 N1782 kk1409 N1654 kk1410 N1755 kk1411 N2683 kk1412 N1335 kk1413 N152 kk1414 N1648 kk1415 N3690 kk1416 N5052 kk1417 N561 kk1418 N3363 kk1419 N1631 kk1420 N1634 kk1421 N1785 kk1422 N1637 kk1423 N1999 kk1424 N1429 kk1425 N2345 kk1426 N3803 kk1427 N2649 kk1428 N4041 kk1429 N4027 kk1430 N3996 kk1431 N4040 kk1432 N4026 kk1433 N2601 kk1434 N1680 kk1435 N2544 kk1436 N583 kk1437 N1226 kk1438 N1700 kk1439 N1459 kk1440 N5118 kk1441 N534 kk1442 N2571 kk1443 N552 kk1444 N1944 kk1445 N1901 kk1446 N2674 kk1447 N1987 kk1448 N3593 kk1449 N4075 kk1450 N3448 kk1451 N2059 kk1452 N3535 kk1453 N4623 kk1454 N3507 kk1455 N3920 kk1456 N2850 kk1457 N2849 kk1458 N3997 kk1459 N2344 kk1460 N1741 kk1461 N2584 kk1462 N429 kk1463 N1349 kk1464 N1952 kk1465 N4540 kk1466 N2176 kk1467 N3915 kk1468 N3923 kk1469 N1936 kk1470 N2893 kk1471 N3882 kk1472 N3392 kk1473 N3414 kk1474 N3912 kk1475 N1602 kk1476 N1665 kk1477 N5423 kk1478 N5425 kk1479 N1625 kk1480 N1270 kk1481 N1567 kk1482 N1613 kk1483 N3597 kk1484 N138 kk1485 N510 kk1486 N376 kk1487 N4646 kk1488 N1303 kk1489 N1148 kk1490 N3082 kk1491 N4749 kk1492 N2988 kk1493 N3517 kk1494 N2989 kk1495 N4414 kk1496 N1241 kk1497 N1975 kk1498 N4337 kk1499 N2419 kk1500 N756 kk1501 N111 kk1502 N729 kk1503 N184 kk1504 N2936 kk1505 N2443 kk1506 N2448 kk1507 N4672 kk1508 N3276 kk1509 N370 kk1510 N4954 kk1511 N4973 kk1512 N5129 kk1513 N2735 kk1514 N3021 kk1515 N3222 kk1516 N755 kk1517 N2026 kk1518 N652 kk1519 N2025 kk1520 N2001 kk1521 N221 kk1522 N3206 kk1523 N5276 kk1524 N1122 kk1525 N5278 kk1526 N5280 kk1527 N4798 kk1528 N5398 kk1529 N5390 kk1530 N5392 kk1531 N5393 kk1532 N4948 kk1533 N3444 kk1534 N833 kk1535 N3980 kk1536 N4248 kk1537 N4267 kk1538 N141 kk1539 N1575 kk1540 N3255 kk1541 N212 kk1542 N480 kk1543 N2302 kk1544 N1178 kk1545 N2526 kk1546 N2679 kk1547 N612 kk1548 N3209 kk1549 N2626 kk1550 N194 kk1551 N4865 kk1552 N4852 kk1553 N1826 kk1554 N5141 kk1555 N1823 kk1556 N1825 kk1557 N444 kk1558 N4565 kk1559 N4571 kk1560 N4595 kk1561 N2718 kk1562 N637 kk1563 N4562 kk1564 N1898 kk1565 N3138 kk1566 N4682 kk1567 N2255 kk1568 N4558 kk1569 N4560 kk1570 N4536 kk1571 N3607 kk1572 N4109 kk1573 N246 kk1574 N4106 kk1575 N5443 kk1576 N3246 kk1577 N4357 kk1578 N2796 kk1579 N2895 kk1580 N2894 kk1581 N2883 kk1582 N2909 kk1583 N2897 kk1584 N2905 kk1585 N1641 kk1586 N1964 kk1587 N958 kk1588 N5274 kk1589 N5016 kk1590 N895 kk1591 N2120 kk1592 N1108 kk1593 N855 kk1594 N859 kk1595 N717 kk1596 N1664 kk1597 N1701 kk1598 N1726 kk1599 N4411 kk1600 N3081 kk1601 N1729 kk1602 N1685 kk1603 N3435 kk1604 N4843 kk1605 N4853 kk1606 N4842 kk1607 N2525 kk1608 N4883 kk1609 N3561 kk1610 N114 kk1611 N690 kk1612 N3563 kk1613 N1063 kk1614 N625 kk1615 N627 kk1616 N43 kk1617 N231 kk1618 N1758 kk1619 N349 kk1620 N1378 kk1621 N2533 kk1622 N2596 kk1623 N4254 kk1624 N1934 kk1625 N2710 kk1626 N2695 kk1627 N1453 kk1628 N2175 kk1629 N4354 kk1630 N5381 kk1631 N4067 kk1632 N1539 kk1633 N4281 kk1634 N4279 kk1635 N1404 kk1636 N4315 kk1637 N1400 kk1638 N989 kk1639 N508 kk1640 N5009 kk1641 N4715 kk1642 N1730 kk1643 N4736 kk1644 N2351 kk1645 N2137 kk1646 N941 kk1647 N4410 kk1648 N1965 kk1649 N3634 kk1650 N5003 kk1651 N1916 kk1652 N1960 kk1653 N1371 kk1654 N3619 kk1655 N2015 kk1656 N2810 kk1657 N4098 kk1658 N2139 kk1659 N1175 kk1660 N995 kk1661 N1773 kk1662 N3121 kk1663 N3121 kk1664 N4924 kk1665 N3881 kk1666 N3875 kk1667 N861 kk1668 N2592 kk1669 N1315 kk1670 N3147 kk1671 N329 kk1672 N293 kk1673 N4765 kk1674 N1133 kk1675 N304 kk1676 N312 kk1677 N110 kk1678 N117 kk1679 N802 kk1680 N1706 kk1681 N803 kk1682 N5188 kk1683 N3263 kk1684 N4371 kk1685 N4699 kk1686 N1977 kk1687 N4422 kk1688 N1250 kk1689 N1530 kk1690 N3704 kk1691 N2054 kk1692 N1976 kk1693 N2600 kk1694 N3009 kk1695 N115 kk1696 N1520 kk1697 N1516 kk1698 N3485 kk1699 N3475 kk1700 N3471 kk1701 N3469 kk1702 N3506 kk1703 N3498 kk1704 N3490 kk1705 N5404 kk1706 N799 kk1707 N3472 kk1708 N3467 kk1709 N4781 kk1710 N3179 kk1711 N4788 kk1712 N1874 kk1713 N1854 kk1714 N1963 kk1715 N2013 kk1716 N3325 kk1717 N3320 kk1718 N1941 kk1719 N1458 kk1720 N1895 kk1721 N1850 kk1722 N1973 kk1723 N3740 kk1724 N1846 kk1725 N1713 kk1726 N1380 kk1727 N2418 kk1728 N2456 kk1729 N2461 kk1730 N1059 kk1731 N517 kk1732 N3159 kk1733 N1682 kk1734 N2258 kk1735 N2047 kk1736 N421 kk1737 N4654 kk1738 N4655 kk1739 N4507 kk1740 N5242 kk1741 N5004 kk1742 N1092 kk1743 N1727 kk1744 N392 kk1745 N1239 kk1746 N1203 kk1747 N1189 kk1748 N1214 kk1749 N1249 kk1750 N3301 kk1751 N1120 kk1752 N1225 kk1753 N2570 kk1754 N3762 kk1755 N1677 kk1756 N1188 kk1757 N1216 kk1758 N5440 kk1759 N2655 kk1760 N3617 kk1761 N395 kk1762 N5163 kk1763 N5162 kk1764 N3285 kk1765 N2523 kk1766 N1522 kk1767 N4737 kk1768 N3220 kk1769 N4404 kk1770 N4383 kk1771 N764 kk1772 N1638 kk1773 N2794 kk1774 N4073 kk1775 N3907 kk1776 N466 kk1777 N2109 kk1778 N5229 kk1779 N3824 kk1780 N3834 kk1781 N1490 kk1782 N1551 kk1783 N808 kk1784 N3773 kk1785 N1742 kk1786 N4903 kk1787 N4610 kk1788 N4614 kk1789 N3336 kk1790 N2750 kk1791 N2752 kk1792 N2524 kk1793 N2676 kk1794 N2485 kk1795 N2771 kk1796 N80 kk1797 N1463 kk1798 N4664 kk1799 N2444 kk1800 N1881 kk1801 N1880 kk1802 N1386 kk1803 N1943 kk1804 N1095 kk1805 N1131 kk1806 N2682 kk1807 N4508 kk1808 N4513 kk1809 N3254 kk1810 N2629 kk1811 N3049 kk1812 N3041 kk1813 N3061 kk1814 N1662 kk1815 N1778 kk1816 N4881 kk1817 N4895 kk1818 N4874 kk1819 N4901 kk1820 N4840 kk1821 N4917 kk1822 N4837 kk1823 N5048 kk1824 N5045 kk1825 N2298 kk1826 N1084 kk1827 N1593 kk1828 N1091 kk1829 N4512 kk1830 N693 kk1831 N4514 kk1832 N1935 kk1833 N1873 kk1834 N3202 kk1835 N2294 kk1836 N1257 kk1837 N4804 kk1838 N1121 kk1839 N1146 kk1840 N1109 kk1841 N2322 kk1842 N2247 kk1843 N4983 kk1844 N4998 kk1845 N448 kk1846 N925 kk1847 N5128 kk1848 N5122 kk1849 N2782 kk1850 N5119 kk1851 N1337 kk1852 N1339 kk1853 N1361 kk1854 N1307 kk1855 N3192 kk1856 N1856 kk1857 N3734 kk1858 N1062 kk1859 N3505 kk1860 N3654 kk1861 N3649 kk1862 N4820 kk1863 N4778 kk1864 N4785 kk1865 N4786 kk1866 N4787 kk1867 N4783 kk1868 N1383 kk1869 N1382 kk1870 N2522 kk1871 N2233 kk1872 N2190 kk1873 N864 kk1874 N2106 kk1875 N4130 kk1876 N4123 kk1877 N57 kk1878 N4176 kk1879 N322 kk1880 N5198 kk1881 N5222 kk1882 N5200 kk1883 N3434 kk1884 N2581 kk1885 N4333 kk1886 N725 kk1887 N71 kk1888 N544 kk1889 N1993 kk1890 N467 kk1891 N359 kk1892 N90 kk1893 N664 kk1894 N1348 kk1895 N1377 kk1896 N1072 kk1897 N2076 kk1898 N160 kk1899 N2073 kk1900 N823 kk1901 N311 kk1902 N159 kk1903 N740 kk1904 N4872 kk1905 N4850 kk1906 N2252 kk1907 N2205 kk1908 N2300 kk1909 N3896 kk1910 N4069 kk1911 N4087 kk1912 N1143 kk1913 N1112 kk1914 N1870 kk1915 N1959 kk1916 N1865 kk1917 N969 kk1918 N1008 kk1919 N953 kk1920 N4382 kk1921 N3757 kk1922 N3782 kk1923 N2830 kk1924 N443 kk1925 N3175 kk1926 N23 kk1927 N394 kk1928 N502 kk1929 N2134 kk1930 N596 kk1931 N1234 kk1932 N1253 kk1933 N1186 kk1934 N5026 kk1935 N109 kk1936 N264 kk1937 N4695 kk1938 N4742 kk1939 N721 kk1940 N2451 kk1941 N4110 kk1942 N3053 kk1943 N5002 kk1944 N2724 kk1945 N3002 kanjipad-2.0.0/jstroke/memowrite.c0100664000076400007640000001200007045107504017101 0ustar otaylorotaylor/* -*- mode: C++; c-file-style: "bsd"; tab-width: 4 -*- */ // memowrite.c - Pilot code for MemoWrite utility trace functions. // JStroke 1.x - Japanese Kanji handwriting recognition technology demo. // Copyright (C) 1997 Robert E. Wells // http://wellscs.com/pilot // mailto:robert@wellscs.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program (gpl.html); if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // See readme.txt, changelo, and gpl.html for more information. // // Commentary: // // This provides a mechanism for generating traces from a program as Pilot // Memo entries, where they can be examined, HotSync'ed, and deleted using // standard applications. // --------------------------------------------------------------------------- #pragma pack(2) #include #include #include #include "memowrite.h" #ifdef FOR_MEMOWRITE // ----- Static data and defines --------------------------------------------- #define diAllocSize 1024 // Must be a power of 2, due to code below... #define diMaxSize (0xfff0) static DmOpenRef s_pMemoDb = 0; static UInt s_iRecNum = 0; static VoidHand s_RecHandle = 0; static UInt s_iOffset = 0; static UInt s_iAllocSize = 0; // ----- Memo_WriteOpen ------------------------------------------------------ void Memo_WriteOpen(void) { if (s_pMemoDb) return; s_pMemoDb = DmOpenDatabaseByTypeCreator('DATA', sysFileCMemo, dmModeReadWrite); if(!s_pMemoDb) return; s_iRecNum = DmNumRecords(s_pMemoDb); s_RecHandle = DmNewRecord(s_pMemoDb, &s_iRecNum, diAllocSize); s_iOffset = 0; s_iAllocSize = diAllocSize; } // ----- Memo_WriteClose ----------------------------------------------------- void Memo_WriteClose(void) { MemoWriteLen("", 0); // Make sure it is null terminated. // Release handle on record, resize to amount used... if (s_RecHandle) { (void) DmReleaseRecord(s_pMemoDb, s_iRecNum, true); if (s_iOffset+1 < s_iAllocSize && (s_RecHandle = DmResizeRecord(s_pMemoDb, s_iRecNum, s_iOffset+1))) (void) DmReleaseRecord(s_pMemoDb, s_iRecNum, true); s_RecHandle = NULL; } if (s_pMemoDb) (void) DmCloseDatabase(s_pMemoDb); s_pMemoDb = NULL; } // ----- Memo_WriteLen ------------------------------------------------------- void Memo_WriteLen(char* cp, UInt len) { Long newsize, newalloc; Ptr RecPointer; if (!s_pMemoDb || !cp) return; newsize = s_iOffset + len + 1; if (newsize > s_iAllocSize) { // If we need more room, round up to next multiple of diAllocSize. // This idiom only works if diAllocSize is a power of 2. newalloc = (newsize + diAllocSize-1) & ~(diAllocSize-1); if (newalloc > diMaxSize) { // If we are nearly maxed out, newalloc = diMaxSize; // use what we've got. if (newsize > diMaxSize) // If we are maxed out, give it up. return; } if (s_RecHandle) (void) DmReleaseRecord(s_pMemoDb, s_iRecNum, true); s_RecHandle = DmResizeRecord(s_pMemoDb, s_iRecNum, newalloc); if (s_RecHandle) s_iAllocSize = newalloc; } if (s_RecHandle) { if ((RecPointer = MemHandleLock(s_RecHandle))) { // Write extra char at end, often it will be null termination... if (!DmWrite(RecPointer, s_iOffset, cp, len+1)) // if no error... s_iOffset += len; (void) MemPtrUnlock(RecPointer); } } } // --------------------------------------------------------------------------- // ----- Memo_Write ---------------------------------------------------------- void Memo_Write(char* cp) { MemoWriteLen(cp, StrLen(cp)); } // ----- Memo_Write2 --------------------------------------------------------- void Memo_Write2(char* cp, char* cpVal) { MemoWriteLen(cp, StrLen(cp)); MemoWriteLen(cpVal, StrLen(cpVal)); } // ----- Memo_Writeln -------------------------------------------------------- void Memo_Writeln(char* cp) { MemoWriteLen(cp, StrLen(cp)); MemoWriteLen("\n", 1); } // ----- Memo_Write2d -------------------------------------------------------- void Memo_Write2d(char* cp, long iVal) { char buf[10]; MemoWriteLen(cp, StrLen(cp)); if (iVal < 0) { MemoWriteLen("-", 1); iVal = -iVal; } StrIToA(buf, iVal); MemoWriteLen(buf, StrLen(buf)); } // ----- Memo_Write2h -------------------------------------------------------- void Memo_Write2h(char* cp, long iVal) { char buf[10]; StrIToH(buf, iVal); MemoWriteLen(cp, StrLen(cp)); MemoWriteLen(buf, StrLen(buf)); } #endif /* FOR_MEMOWRITE */ // ----- end of memowrite.c -------------------------------------------------- kanjipad-2.0.0/jstroke/memowrite.h0100664000076400007640000000465707045107506017133 0ustar otaylorotaylor/* -*- mode: C; c-file-style: "bsd"; tab-width: 4 -*- */ /* memowrite.h - definitions for MemoWrite utility trace functions. * JStroke 1.x - Japanese Kanji handwriting recognition technology demo. * Copyright (C) 1997 Robert E. Wells * http://wellscs.com/pilot * mailto:robert@wellscs.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (gpl.html); if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * See readme.txt, changelo, and gpl.html for more information. * * Commentary: * * This provides a mechanism for generating traces from a program as Pilot * Memo entries, where they can be examined, HotSync'ed, and deleted using * standard applications. * ------------------------------------------------------------------------- */ #ifndef __MEMOWRITE_H__ #define __MEMOWRITE_H__ #ifdef FOR_MEMOWRITE #define MemoWriteOpen() Memo_WriteOpen() #define MemoWriteClose() Memo_WriteClose() #define MemoWriteLen(a,b) Memo_WriteLen((a),(b)) #define MemoWrite(a) Memo_Write(a) #define MemoWriteln(a) Memo_Writeln(a) #define MemoWrite2(a,b) Memo_Write2((a),(b)) #define MemoWrite2d(a,b) Memo_Write2d((a),(b)) #define MemoWrite2h(a,b) Memo_Write2h((a),(b)) void Memo_WriteOpen(void); void Memo_WriteClose(void); void Memo_WriteLen(char* cp, UInt len); void Memo_Write(char* cp); void Memo_Writeln(char* cp); void Memo_Write2(char* cp, char* cpVal); void Memo_Write2d(char* cp, long iVal); void Memo_Write2h(char* cp, long iVal); #else /* FOR_MEMOWRITE not defined */ #define MemoWriteOpen() #define MemoWriteClose() #define MemoWriteLen(a,b) #define MemoWrite(a) #define MemoWriteln(a) #define MemoWrite2(a,b) #define MemoWrite2d(a,b) #define MemoWrite2h(a,b) #endif /* FOR_MEMOWRITE not defined */ #endif /*__MEMOWRITE_H__*/ /* ----- end of memowrite.h ------------------------------------------------*/ kanjipad-2.0.0/jstroke/pilotcompat.h0100664000076400007640000000412707045107500017440 0ustar otaylorotaylor/* -*- mode: C; c-file-style: "bsd"; tab-width: 4 -*- */ /* pilotcompat.h - non-Pilot compatibility defines, particularly for Unix. * JStroke 1.x - Japanese Kanji handwriting recognition technology demo. * Copyright (C) 1997 Robert E. Wells * http://wellscs.com/pilot * mailto:robert@wellscs.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (gpl.html); if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * pilotcompat.h created by Owen Taylor , 9/1997. * Owen is using the jstroke recognition code on Linux in his KanjiPad * application, and uses pilotcompat.h to provide compatibility with some * Pilot environment definitions. Owen says: "It's a rough attempt - * it probably would need some small changes for machines where malloc * returns (char *) instead of (void *)." -19970907. * * -------------------------------------------------------------------------*/ #ifndef __PILOTCOMPAT_H__ #define __PILOTCOMPAT_H__ #include #include #include typedef int Boolean; typedef unsigned char Byte; typedef long Long; typedef unsigned long ULong; typedef unsigned int UInt; typedef void * VoidPtr; typedef char * CharPtr; #define MemPtrNew malloc #define MemPtrFree free #define StrLen strlen #define StrIToA(str, n) sprintf((str),"%ld",(long)(n)) #define StrIToH(str, n) sprintf((str),"%lx",(long)(n)) #define false 0 #define true 1 #endif /*__PILOTCOMPAT_H__*/ /* ----- End of pilotcompat.h --------------------------------------------- */ kanjipad-2.0.0/jstroke/readme.txt0100664000076400007640000001672307045107500016737 0ustar otaylorotaylor// readme.txt - general comments and build instructions. // JStroke 1.2 - Japanese Kanji handwriting recognition technology demo. // Copyright (C) 1997 Robert E. Wells // http://wellscs.com/pilot // mailto:robert@wellscs.com // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program (gpl.html); if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Derived from prior work by Todd David Rudick on JavaDict and StrokeDic. // Makes use of KANJIDIC data from Jim Breen of Monash University. // Further credit details available at http://wellscs.com/pilot // --------------------------------------------------------------------------- Version 1.2 of JStroke has a one-line fix to the SJIS code calculation to avoid sign extension problems, and fix problem reported by Peter Cumpson with previous version. -rwells, 19970926. Version 1.1 of JStroke includes the reorganization of the code into a more modular set of files, separating Pilot dependent code from platform independent recognition code. It also includes a feature enhancement requested by Peter Cumpson , to display the SJIS code number of recognized characters so it can be entered into a Canon Wordtank for more information about the Kanji, as a stop-gap until the Pilot dictionary app is available. It also includes dos2unix.pl, a little perl script to remove Carriage Returns (Control-M's) from the source files, for cleaner distribution, particularly to Unix. The source files that are not specific to the Pilot are now ANSI-C files that use only C style comments, no C++ // comments. Owen Taylor made most of these changes so he could use the recognition code on Linux in his KanjiPad application. Thanks, Owen! -rwells, 19970922. Version 1.0 of JStroke was intended as a demonstration of this Kanji handwriting recognition technology on the Pilot. I believe the technology shows great promise. I intend to rework in a later version as one or more shared libraries for the Pilot, and that is my intended production software vehicle, for incorporation into other applications and utilities. My long-term interest in this technology is primarily in relation to Japanese-English dictionaries and other learning aids for students of Japanese. This version is written in C and intended to be built with GCC for the Pilot; it builds correctly with the Feb 26 1997 Release 0.4.0 of win32-pilot-gcc, available for download by following links from http://www.massena.com/darrin/pilot/index.html. It goes beyond ANSI-C in using C++ // comments, which are supported by both the GCC and CodeWarrior C compilers for the Pilot. I currently just use a brutally simple compile.bat file to build the application on Windows/95; I'll add a Gnu make file in a later release, and will also upgrade to using release 0.5.0 of win32-pilot-gcc. This program builds on the previous work of Todd David Rudick on JavaDict; the stroke database is constructed from his StrokeDic data file, and the C code was developed by reading Todd's Java code and writing C code to accomplish similar results, with adaptations for language and platform differences, and to improve performance. In this release my major algorithmic innovation is to "thin" the strokes as they are entered by a series of smoothing and simplifying filters. Reducing the number of raw input strokes produces a near-linear reduction in runtime for the current algorithms. Todd and I have exchanged a series of email messages in August 1997 developing a set of algorithmic ideas which we expect will provide very significant further reductions in runtime for recognition - I hope to have these implemented for the Pilot for a release in late October. This program also builds on the work of Jim Breen and others who have built up the Monash Nihongo ftp archive, and the EDICT and KANJIDIC files of information on Japanese words and Kanji. More information and links to this work are on my web page at http://wellscs.com/pilot. I include the PERL5 program compact.pl that I used to convert the StrokeDic data into C string initializations which are embedded in the current jstroke.c file. This version of compact.pl does not exactly match the version I used to generate the initializations, but should work fine - I have been using it for other investigations and future planning. I intend to convert over to using a Java application to generate the Pilot database directly from StrokeDic and other data files, rather than using the current bootstrapping method of creating the database on the pilot and backing it up to the PC system where it can subsequently be loaded into the pilot directly. If you want to create the database the way I do here, you will need to create three successive versions of the JStroke.prc file; one with FOR_STROKE_DIC_CREATE_1 defined on line 65 of jstroke.c, one with FOR_STROKE_DIC_CREATE_1 defined on line 66, and the final version with neither defined. Download and run the first two versions successively, then hotsync to capture a copy of the database before downloading and running the final version, which will inhibit further backups of the database to the PC once it is run. jstroke.bmp is a Windows bitmap binary format file which contains the Pilot icon for JStroke. It can be edited with most any paint program on Windows, such as PaintShopPro. It is included by jstroke.rcp, and processed by pilrc 1.5. Previously I had been holding off on releasing the sources because I am intending to rework them extensively fairly soon. However, I've decided to go ahead and release the current sources due to requests, and the realization that I probably won't have my next release ready until near the end of October, since I am currently occupied with another project that needs to be finished by the end of September. I do intend a fairly major reworking of the code, so keep that in mind if you start working with it. Please email me (mailto:robert@wellscs.com) if you are interested in this code, so we can benefit from each others work and avoid contradictory changes if possible. If you email me I will put you on a mailing list to be notified of future releases. Please comment your changes with your name and the date and the reason for the change, and log them in ChangeLog before sending them back to me. Thanks. If you edit ChangeLog using NTEMACS on Windows, you will want the following settings in your .emacs file to support using C-X 4 a to add to the ChangeLog. See http://www.cs.washington.edu/homes/voelker/ntemacs.html to download a copy of NTEMACS for Win32 machines. Revise the user stuff to match your own identity, of course :-). (setq user-full-name "Robert E. Wells") ;9709 (setq user-mail-address "robert@wellscs.com") ;9709 (setq change-log-default-name "ChangeLog") ; 9709: windows defaults to changelo Robert E. Wells http://wellscs.com/pilot mailto:robert@wellscs.com Arlington, MA September 1, 1997 // ----- end of readme.txt --------------------------------------------------- kanjipad-2.0.0/jstroke/scoring.c0100664000076400007640000004515007045107500016545 0ustar otaylorotaylor/* -*- mode: C; c-file-style: "bsd"; tab-width: 4 -*- */ /* scoring.c - The handwriting recognition engine * JStroke 1.x - Japanese Kanji handwriting recognition technology demo. * Copyright (C) 1997 Robert E. Wells * http://wellscs.com/pilot * mailto:robert@wellscs.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (gpl.html); if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Derived from prior work by Todd David Rudick on JavaDict and StrokeDic. * Makes use of KANJIDIC data from Jim Breen of Monash University. * Further credit details available at http://wellscs.com/pilot * See readme.txt, changelo, and gpl.html for more information. * -------------------------------------------------------------------------*/ #include "jstroke.h" #include "memowrite.h" #define diAngCostBase 52 // See angles.pl for derivation. #define diAngCostScale 98 // See angles.pl for derivation. #define diHugeCost (((((ULong)24)*diAngCostScale)+diAngCostBase)*100) #define diMaxScoreToSquare ((ULong) 0xffff) #define diMaxScoreSquared (diMaxScoreToSquare*diMaxScoreToSquare) /* 2 for Kanji SJIS pair, 2+2 for spaces, * 9 for SJIS:967B, * 1 for number sign, and 10 for numeric score, a billion served? */ #define diScoreTextLen (2 + 2+2 + 9 + 1 + 10) #define diPathBufLen 16 CharPtr StrokeScorerEvalItem(StrokeScorer *pScorer, CharPtr cpEntry, ULong* ipScore /*OUT*/); ULong StrokeDicScoreStroke(Byte* bpX, Byte* bpY, UInt iLen, CharPtr cpPath, UInt iPathLen, UInt iDepth); CharPtr StrokeScorerExtraFilters(StrokeScorer *pscorer, CharPtr cp, ULong* ipScore /*OUT*/); Long StrokeScorerExtraEval(StrokeScorer *pscorer, char cArg, UInt iStroke); ULong SqrtULong(ULong val); /* ----- SqrtULong ---------------------------------------------------------*/ ULong SqrtULong(ULong val) { ULong root, rootLo, rootHi; if (val == 0) return 0; else if (val == 1) return 1; else if (val >= diMaxScoreSquared) return diMaxScoreToSquare; rootLo = 1; rootHi = (val >> 1); /* will be >= 1, since val > 1. */ if (rootHi > diMaxScoreToSquare) rootHi = diMaxScoreToSquare; while ((root = ((rootLo + rootHi) >> 1)) > rootLo) { if ((root * root) <= val) { rootLo = root; } else { rootHi = root; } } return root; } /* ----- StrokeScorerCreate-------------------------------------------------*/ /* Create a StrokeScorer object. (Returns NULL if can't get memory) */ StrokeScorer *StrokeScorerCreate (CharPtr cpStrokeDic, RawStroke *rsp, UInt iStrokeCnt) { StrokeScorer *pScorer = (StrokeScorer *) MemPtrNew(sizeof(StrokeScorer)); if (!pScorer) { ErrBox("Not enough memory."); return NULL; } pScorer->m_cpStrokeDic = cpStrokeDic; pScorer->m_pRawStrokes = rsp; pScorer->m_iStrokeCnt = iStrokeCnt; pScorer->m_iScoreLen = 0; pScorer->m_pScores = (ScoreItemPtr) MemPtrNew(diMaxListCount*sizeof(StrokeScorer)); if (!pScorer->m_pScores) { ErrBox("Not enough memory."); MemPtrFree(pScorer); return NULL; } pScorer->m_cpPath = MemPtrNew(diPathBufLen+1); if (!pScorer->m_cpPath) { ErrBox("Not enough memory."); MemPtrFree(pScorer->m_pScores); MemPtrFree(pScorer); return NULL; } return pScorer; } /* ----- StrokeScorerDestroy-------------------------------------------------*/ /* Destroy a StrokeScorer object */ void StrokeScorerDestroy (StrokeScorer *pScorer) { if (pScorer) { MemPtrFree (pScorer->m_pScores); MemPtrFree (pScorer->m_cpPath); MemPtrFree (pScorer); } } /* ----- StrokeScorerProcess-------------------------------------------------*/ /* Process some database entries (maximum iMaxCnt, -1 for all). Returns 0 when none remaining (should eventually return count remaining to facilitate a progressbar */ Long StrokeScorerProcess (StrokeScorer *pScorer, Long iMaxCnt) { CharPtr cp, cpNext; ULong iScore; Long iCnt; ScoreItemPtr pScore, pScoreBase, pSrc; if (!pScorer) { ErrBox("StrokeScorerProcess: pScorer == NULL."); return 0; } pScoreBase = pScorer->m_pScores; /* Evaluate all the items in cpStrokeDic against Context, * and update ScoreItems list as we go. */ iCnt = 0; for (cp = pScorer->m_cpStrokeDic; *cp; cp = cpNext) { iCnt++; if (iMaxCnt >= 0 && iCnt > iMaxCnt) break; cpNext = StrokeScorerEvalItem(pScorer, cp, &iScore); for (pScore = pScoreBase+pScorer->m_iScoreLen-1; pScore>=pScoreBase; pScore--) { if (iScore >= pScore->m_iScore) break; } pScore++; /* If we have a top score, lets register it. */ if (pScore < (pScoreBase + diMaxListCount)) { /* Increase the score list length if it isn't full yet. */ if (pScorer->m_iScoreLen < diMaxListCount) pScorer->m_iScoreLen++; /* Push down all lower scores in the list to make room. */ for (pSrc = pScoreBase+pScorer->m_iScoreLen-2; pSrc >= pScore; pSrc--) { pSrc[1].m_iScore = pSrc->m_iScore; pSrc[1].m_cp = pSrc->m_cp; } /* Actually store our info in the list. */ pScore->m_iScore = iScore; pScore->m_cp = cp; } } /* for each stroke description... */ if (cp) return 1; /* should be count remaining */ else return 0; } /* ----- StrokeScorerTopPicks -----------------------------------------------*/ /* Return best diMaxListCount candidates processed so far */ ListMem* StrokeScorerTopPicks (StrokeScorer *pScorer) { ListMem* pListMem; UInt iTotStrLen, iListSize, iTotSize; CharPtr cpList; CharPtr* cppList; ScoreItemPtr pScore, pScoreBase; UInt sJisVal; char buf[10]; if (!pScorer) { ErrBox("StrokeScorerTopPicks: pScorer == NULL."); return NULL; } /* If no list, just return an empty list. */ if (pScorer->m_iScoreLen <= 0) return AppEmptyList(); pScoreBase = pScorer->m_pScores; iTotStrLen = pScorer->m_iScoreLen * (diScoreTextLen + 1); iListSize = (pScorer->m_iScoreLen+1)*sizeof(CharPtr); /* One extra for NULL terminator */ iTotSize = sizeof(ListMem) + iListSize + iTotStrLen; if (!(cpList = MemPtrNew(iTotSize))) { ErrBox("ERROR: no mem in top picks"); return NULL; } pListMem = (ListMem *) cpList; cpList += sizeof(ListMem); cppList = (CharPtr *) cpList; cpList += iListSize; pListMem->m_argc = pScorer->m_iScoreLen; pListMem->m_argv = cppList; /* Copy now before we use it in loop... */ for (pScore = pScoreBase; pScore < (pScoreBase+pScorer->m_iScoreLen); pScore++) { *cppList++ = cpList; *cpList++ = pScore->m_cp[0]; *cpList++ = pScore->m_cp[1]; *cpList++ = ' '; *cpList++ = ' '; *cpList++ = 'S'; *cpList++ = 'J'; *cpList++ = 'I'; *cpList++ = 'S'; *cpList++ = ':'; // BUGFIX: Need to avoid sign extension. -rwells, 19970926. sJisVal = ((pScore->m_cp[0] & 0xff) << 8) + (pScore->m_cp[1] & 0xff); StrIToH(buf, sJisVal); *cpList++ = buf[4]; *cpList++ = buf[5]; *cpList++ = buf[6]; *cpList++ = buf[7]; *cpList++ = ' '; *cpList++ = ' '; *cpList++ = '#'; StrIToA(cpList, pScore->m_iScore); /* Null terminates */ cpList += StrLen(cpList) + 1; /* Skip ascii number and null. */ } *cppList = NULL; /* NULL terminated argv vector, for luck. */ return pListMem; } /* ----- StrokeScorerEvalItem -----------------------------------------------*/ CharPtr StrokeScorerEvalItem(StrokeScorer *pScorer, CharPtr cpEntry, ULong* ipScore /*OUT*/) { CharPtr cp = cpEntry; UInt iStroke; CharPtr cpPath = pScorer->m_cpPath; CharPtr cpPathEnd; RawStroke* rsp; ULong iThisScore; ULong iScore = 0; MemoWriteLen(pScorer->m_cpStrokeDic, 2); /* DEBUG: tag trace with SJIS char. */ if (*cp) cp++; /* Skip over first half SJIS char. */ if (*cp) cp++; /* Skip over second half SJIS char. */ /* The first char must have high order bit set, * and the second char MAY have high order bit set, * but a subsequent char with high order bit set must be * the beginning of the next entry. -rwells, 970712. */ /* Loop through stroke descriptions */ for (iStroke = 0; iStroke < pScorer->m_iStrokeCnt; iStroke++) { cpPathEnd = cpPath; switch (*cp) { /* Break out on first char value... */ case 'A': /* TDR='1' CLK=07:30 DEG=225 */ *cpPathEnd++ = 20; break; case 'B': /* TDR='2' CLK=06:00 DEG=180 */ *cpPathEnd++ = 16; break; case 'C': /* TDR='3' CLK=04:30 DEG=135 */ *cpPathEnd++ = 12; break; case 'D': /* TDR='4' CLK=09:00 DEG=270 */ *cpPathEnd++ = 24; break; case 'F': /* TDR='6' CLK=03:00 DEG=090 */ *cpPathEnd++ = 8; break; case 'G': /* TDR='7' CLK=10:30 DEG=315 */ *cpPathEnd++ = 28; break; case 'H': /* TDR='8' CLK=12:00 DEG=360 */ *cpPathEnd++ = 0; break; case 'I': /* TDR='9' CLK=01:30 DEG=045 */ *cpPathEnd++ = 4; break; case 'J': /* TDR='x' down 06:00 then 07:30 */ *cpPathEnd++ = 16; *cpPathEnd++ = 20; break; case 'K': /* TDR='y' down 06:00 then 04:30 */ *cpPathEnd++ = 16; *cpPathEnd++ = 12; break; case 'L': /* TDR='c' down 06:00 then 03:00 */ *cpPathEnd++ = 16; *cpPathEnd++ = 8; break; case 'M': /* TDR='b' across 03:00 then 06:00 */ *cpPathEnd++ = 8; *cpPathEnd++ = 16; break; default: goto NoMoreStrokes; } /* end switch on first char value */ for (cp++; ; cp++) { /* Loop through following chars for stroke */ switch (*cp) { /* Break out on char value... */ case 'a': /* TDR='1' CLK=07:30 DEG=225 */ *cpPathEnd++ = 20; break; case 'b': /* TDR='2' CLK=06:00 DEG=180 */ *cpPathEnd++ = 16; break; case 'c': /* TDR='3' CLK=04:30 DEG=135 */ *cpPathEnd++ = 12; break; case 'd': /* TDR='4' CLK=09:00 DEG=270 */ *cpPathEnd++ = 24; break; case 'f': /* TDR='6' CLK=03:00 DEG=090 */ *cpPathEnd++ = 8; break; case 'g': /* TDR='7' CLK=10:30 DEG=315 */ *cpPathEnd++ = 28; break; case 'h': /* TDR='8' CLK=12:00 DEG=360 */ *cpPathEnd++ = 0; break; case 'i': /* TDR='9' CLK=01:30 DEG=045 */ *cpPathEnd++ = 4; break; case 'j': /* TDR='x' down 06:00 then 07:30 */ *cpPathEnd++ = 16; *cpPathEnd++ = 20; break; case 'k': /* TDR='y' down 06:00 then 04:30 */ *cpPathEnd++ = 16; *cpPathEnd++ = 12; break; case 'l': /* TDR='c' down 06:00 then 03:00 */ *cpPathEnd++ = 16; *cpPathEnd++ = 8; break; case 'm': /* TDR='b' across 03:00 then 06:00 */ *cpPathEnd++ = 8; *cpPathEnd++ = 16; break; default: goto ThisStrokeDone; } /* end switch on char value */ } /* end loop through chars for stroke */ ThisStrokeDone: rsp = &(pScorer->m_pRawStrokes[iStroke]); iThisScore = StrokeDicScoreStroke(rsp->m_x, rsp->m_y, rsp->m_len, cpPath, (cpPathEnd - cpPath), 0 /*depth*/); MemoWrite2d(" s", iStroke+1); MemoWrite2d("=", iThisScore); /* DEBUG: stroke score */ if (iThisScore >= diMaxScoreToSquare) iThisScore = diMaxScoreSquared; else iThisScore = (iThisScore * iThisScore); if (iScore >= (diMaxScoreSquared - iThisScore)) iScore = diMaxScoreSquared; else iScore += iThisScore; } /* end loop through stroke descriptions */ NoMoreStrokes: iScore = SqrtULong(iScore); *ipScore = iScore; MemoWrite2d(" is=", iScore); /* DEBUG: overall stroke score */ /* Handle optional extra filters... may modify *ipScore, updates cp. */ if (*cp == '|') { cp = StrokeScorerExtraFilters(pScorer, cp+1, ipScore); } if (iStroke != pScorer->m_iStrokeCnt) ErrBox("JStrokeDic miscount"); if (!(*cp & 0x80) && (*cp != '\0')) ErrBox("JStrokeDic leftovers"); MemoWrite2d(" fs=", *ipScore); /* DEBUG: final score */ MemoWrite("\n"); return cp; } /* ----- StrokeDicScoreStroke ---------------------------------------------- */ ULong StrokeDicScoreStroke(Byte* bpX, Byte* bpY, UInt iLen, CharPtr cpPath, UInt iPathLen, UInt iDepth) { ULong iScore, iThisScore; Long iMid, iStep, iPathMid, iPathRest; Long iDifX, iDifY; UInt iAng32, iPath32, iDif32; if (iLen < 2 || iPathLen < 1) return diHugeCost; if (iPathLen == 1) { iDifX = bpX[iLen-1] - bpX[0]; iDifY = bpY[0] - bpY[iLen-1]; /* Flip from display to math axes. */ if (iDifX == 0 && iDifY == 0) /* Two samples at same place... */ return diHugeCost; /* Subdivide recursively while stroke is long and depth is shallow. * $$$ These values are pretty magic... review later. -rwells, 970719. * TDR used 20*20... -rwells, 970719. */ if ((iDifX*iDifX + iDifY*iDifY) > (20*20) && iLen > 5 && iDepth < 4) { iMid = iLen >> 1; /* Note that we use the middle point on both sides... */ iScore = StrokeDicScoreStroke(bpX, bpY, iMid+1, cpPath, iPathLen, iDepth+1); iScore += StrokeDicScoreStroke(bpX+iMid, bpY+iMid, iLen-iMid, cpPath, iPathLen, iDepth+1); return (iScore >> 1); } /* End if stroke is long, and depth is shallow... */ /* Time to score this segment against desired direction. */ iAng32 = Angle32(iDifX, iDifY); iPath32 = *cpPath; if (iAng32 >= iPath32) iDif32 = iAng32 - iPath32; else iDif32 = iPath32 - iAng32; return iDif32 * diAngCostScale + diAngCostBase; } /* end if path len is 1. */ else { iScore = diHugeCost * iPathLen * 2; iPathMid = iPathLen >> 1; iPathRest = iPathLen - iPathMid; if (iLen < 20) iStep = 1; else iStep = iLen / 10; for (iMid = iPathMid; iMid < iLen - iPathRest; iMid += iStep) { /* TDR original doesn't increase iDepth... -rwells, 970719. */ iThisScore = StrokeDicScoreStroke(bpX, bpY, iMid+1, cpPath, iPathMid, iDepth+1); iThisScore += StrokeDicScoreStroke(bpX+iMid, bpY+iMid, iLen-iMid, cpPath+iPathMid, iPathRest, iDepth+1); /* TDR original doesn't divide sum by 2... -rwells, 970719. */ iThisScore >>= 1; if (iThisScore < iScore) iScore = iThisScore; } /* end for trials on various mid-point divisions of stroke... */ return iScore; } /* end if path len is >1. */ } /* ----- StrokeScorerExtraFilters ---------------------------------------------*/ CharPtr StrokeScorerExtraFilters(StrokeScorer *pScorer, CharPtr cp, ULong* ipScore /*OUT*/) { char c; char cArg[2]; Byte iStroke[2]; Long iDiff, iVal[2]; UInt idx = 0; Boolean bMust = false; MemoWrite(" F("); cArg[0] = cArg[1] = 0; iStroke[0] = iStroke[1] = 0; /* Simple parser for Filter strings. assumes a1-b1 structure, * where a and b can be any single alphabetic cmd char, the * numbers can be multiple digit, and b1 can optionally be * followed by '!' to insist on the filter passing. There can * be multiple filters but they have to be separated by '!' or * space(s). The filter string is terminated by a null byte * or an 8-bit char, the beginning of the next entry. * Leading spaces and trailing spaces are ignored. -rwells, 970722. */ for (c = *cp; true; cp++, c = *cp) { switch (c) { case 'x': case 'y': case 'i': case 'j': case 'a': case 'b': case 'l': cArg[idx] = c; MemoWrite2d(" c",idx); MemoWrite("="); MemoWriteLen(cArg+idx, 1); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': iStroke[idx] = iStroke[idx] * 10 + (c - '0'); MemoWrite2d(":", iStroke[idx]); break; case '-': /* Switch to second arg when we see minus. */ idx = 1; MemoWrite(" - "); break; case '!': bMust = true; MemoWrite(" ! "); /* FALLTHRU */ case ' ': default: MemoWrite2d(" @", idx); MemoWrite(")"); /* If we are in the second argument, execute and reset. */ if (idx == 1) { iVal[0] = StrokeScorerExtraEval(pScorer, cArg[0], iStroke[0]); iVal[1] = StrokeScorerExtraEval(pScorer, cArg[1], iStroke[1]); iDiff = (iVal[0] - iVal[1]); MemoWrite(" "); MemoWriteLen(cArg+0, 1); MemoWrite2d("", iStroke[0]); MemoWrite2d(":", iVal[0]); MemoWrite("-"); MemoWriteLen(cArg+1, 1); MemoWrite2d("", iStroke[1]); MemoWrite2d(":", iVal[1]); MemoWrite2d("=", iDiff); if (iDiff < 0) { iDiff = -iDiff; if (bMust) iDiff = 9999999; if (*ipScore < (diMaxScoreSquared-iDiff)) *ipScore += iDiff; else *ipScore = diMaxScoreSquared; } else { if (*ipScore > iDiff) *ipScore -= iDiff; else *ipScore = 0; } MemoWrite2d(" ips=", *ipScore); /* Reset state for next filter... */ idx = 0; bMust = false; cArg[0] = cArg[1] = 0; iStroke[0] = iStroke[1] = 0; } /* If this is a terminating char, break out of loop and return. */ if ((c & 0x80) || (c == '\0')) goto ReturnNow; } /* end switch on char */ } /* end for each char in filter spec... */ ReturnNow: return cp; } /* ----- StrokeScorerExtraEval ------------------------------------------------*/ Long StrokeScorerExtraEval(StrokeScorer *pScorer, char cArg, UInt iStroke) { Long iVal, iSquared; Byte* bpX; Byte* bpY; UInt iLen; RawStroke* rsp; iStroke--; /* Formula strokes are 1-based, my stroke * array is 0-based. */ if (iStroke >= pScorer->m_iStrokeCnt) return 0; /* Should not happen... */ rsp = pScorer->m_pRawStrokes + iStroke; iLen = rsp->m_len; bpX = rsp->m_x; bpY = rsp->m_y; /* Heretofore we have left the coordinates as we got them, screen * coordinates with 0,0 in upper left, y increasing downward, * x increasing to the right. And the extra filters agree with this. * -rwells, 970723. * * Removed the subtraction of Rect_x, Rect_y here - it will mess * up debugging messages if the client doesn't subtract them before- * hand, but otherwise should be harmless. * - OWT, 970903 */ switch(cArg) { case 'x': return bpX[0]; case 'y': return bpY[0]; case 'i': return bpX[iLen-1]; case 'j': return bpY[iLen-1]; case 'a': return ((bpX[0] + bpX[iLen-1]) >> 1); case 'b': return ((bpY[0] + bpY[iLen-1]) >> 1); case 'l': /* These are byte values - they can't get very large, * so don't need to check against diMaxScoreToSquare... */ iSquared = (((Long) bpX[0]) - ((Long)bpX[iLen-1])); iVal = iSquared * iSquared; iSquared = (((Long) bpY[0]) - ((Long)bpY[iLen-1])); iVal += iSquared * iSquared; return (Long) SqrtULong((Long) iVal); } return 0; /* Unrecognized cArg cmd char. */ } /* ----- end of scoring.c --------------------------------------------------*/ kanjipad-2.0.0/jstroke/strokedata.h0100664000076400007640000016462407532223032017257 0ustar otaylorotaylor/* * The data in this file is generated from the stroke data * of the JavaDict program by Todd Rudick. Some fixes to the * original data were provided by seer26@telocity.com. */ "A\210\352F\n" "A\211\263Faf\n" "B\213\343JFl\n" "B\216\265FL\n" "B\217\134FB|b1-y2\n" "B\220\154JC|y2-y1! x1-x2!\n" "B\222\232FB|b2-b1\n" "B\223\201MgJ|b2-y1\n" "B\223\361FF\n" "B\223\374AC|x1-x2! y1-y2!\n" "B\224\252AC|x2-x1! y1-y2\n" "B\226\224FaC\n" "B\227\271FaBg\n" "B\227\315MgJ|y1-y2\n" "C\211\272FBC|i3-x2\n" "C\212\261FFB\n" "C\212\333JFlC|x1-x2\n" "C\213\166AFaC|x3-x2\n" "C\213\171JFafaC\n" "C\213\174MFBmg\n" "C\214\310MFL\n" "C\214\373BMF\n" "C\215\110FBF|b2-b1 l3-l1\n" "C\215\313FBA\n" "C\216\117FFF\n" "C\216\122BLB\n" "C\216\155FBF|b1-y2 l1-l3\n" "C\216\161FaBgF\n" "C\216\331AMgC\n" "C\217\227AcJF\n" "C\217\254BAC\n" "C\217\343BFF\n" "C\217\344FJC|x2-x3\n" "C\220\156MgJC\n" "C\220\241FBC|x2-i3\n" "C\220\347AFB\n" "C\220\354JBB\n" "C\221\345FJC|x3-i2\n" "C\223\171FBF|b1-y2 l3-l1\n" "C\226\123BFL\n" "C\226\175JFlC|x3-x1\n" "C\226\234FMgJ\n" "C\226\347MgBL\n" "C\227\133AFaC|l1-l3\n" "C\227\136FBmgF\n" "D\210\344FFJB\n" "D\210\370MFBfbdB\n" "D\211\135FFAfC\n" "D\211\176BMBF\n" "D\211\244FBFF\n" "D\211\273ABAL\n" "D\211\316CAJC\n" "D\211\356ACJB\n" "D\212\240ACBB\n" "D\213\215AFFB|b1-y4\n" "D\213\245ACLB\n" "D\213\322AJFB|a1-x2\n" "D\213\346FACL\n" "D\214\207AFaJC\n" "D\214\216JMFF|j2-y4! j1-y4! x1-i1 j1-b4 j2-b4\n" "D\214\242FJCC|b1-b4\n" "D\214\263FFJL\n" "D\214\266AcAfCM\n" "D\214\313FMFJ\n" "D\214\334FBMF\n" "D\214\337AFFB|b4-b2\n" "D\214\366ACAfC\n" "D\215\105FaBgIL\n" "D\215\241ACFFa\n" "D\216\170FBFaC\n" "D\216\176BFBF\n" "D\216\201ABiFK\n" "D\216\332MFJC\n" "D\216\350AFFB|a1-x2\n" "D\217\241AJFB|x2-i1\n" "D\217\255BACA\n" "D\217\347BFaJFl\n" "D\220\123ALCC\n" "D\220\155ABFF\n" "D\220\205BFaAC\n" "D\220\330FLFjJ\n" "D\221\157FjCFjK\n" "D\221\276FJCC|b4-b1\n" "D\222\117JMCF\n" "D\222\206BMFB\n" "D\222\242MFBmgB\n" "D\223\126FFJC|l1-l2\n" "D\223\154CCFB\n" "D\223\324ALBL\n" "D\223\340BMJC\n" "D\223\372BMFF|y4-b1! j4-b2!\n" "D\224\275FJFaC|a1-x2\n" "D\224\344FLAL\n" "D\225\103FJLL\n" "D\225\163FABC\n" "D\225\166FFJC|b1-y3\n" "D\225\203ACJC\n" "D\225\247ABAfC\n" "D\225\252ACMgJ\n" "D\225\266BFJK|x3-x4!\n" "D\225\320JBFM\n" "D\225\373BFMgJ\n" "D\226\122ABFaCf\n" "D\226\122ABFaIcf\n" "D\226\321AFFL\n" "D\226\330FBAC\n" "D\226\346AMgAC\n" "D\226\357FJMgL\n" "D\227\106FJFaC|b1-y2 x2-x1\n" "D\227\134FaCFaBg\n" "D\230\132BFAC|x4-x3!\n" "D\230\274ABMJ\n" "E\210\263FJFBF|b3-y4\n" "E\210\310BICAC\n" "E\211\105JFBMF\n" "E\211\151CFbFaAC\n" "E\211\232MfBFLB\n" "E\211\233BMFJC|x5-i4\n" "E\211\301FjJBMF\n" "E\211\302FBMFB\n" "E\212\117JFjCBC\n" "E\212\216BMFFF|l5-l4 i1-x5! i5-i2!\n" "E\212\247FFBBB\n" "E\212\303FBBFF\n" "E\213\165ABFBF\n" "E\213\214BBMFF\n" "E\213\216FBFAfC\n" "E\213\220BFMFF\n" "E\213\312FBFFC\n" "E\213\345AMgBMF\n" "E\214\132BMFJL\n" "E\214\212BBFaAC\n" "E\214\272BFAcAfC\n" "E\214\303FBBMF\n" "E\214\367FBIFaJ\n" "E\215\111FBIFBmg|y3-j2\n" "E\215\114BFJAfC\n" "E\215\142BMFFB|b5-y3\n" "E\215\206BMFFBmg\n" "E\215\236ACCFacaCf\n" "E\215\266FJFBF|b4-b3\n" "E\215\373BMBBF|j1-y5\n" "E\216\104FBACL\n" "E\216\115BMBBF|y5-b1\n" "E\216\144ABFBF|y5-y3\n" "E\216\151MFBMF\n" "E\216\152BMFJC|x4-x5 y5-y3\n" "E\216\154BMJLF\n" "E\216\163BFBMB\n" "E\216\246FFBAC|l2-l1 y3-y1\n" "E\216\266BMFAL\n" "E\216\270AFFJC|y2-y4\n" "E\216\312BFaFBmgF\n" "E\216\345CFBFF\n" "E\216\372BMJCF\n" "E\216\373BBIFjC\n" "E\217\140CCIFB\n" "E\217\157BLBLB\n" "E\217\210AFaCJFl\n" "E\217\242MgJBMF\n" "E\220\113MFJJFl\n" "E\220\134BMFFB|y1-y5\n" "E\220\242FBBFL\n" "E\220\263FBFBF\n" "E\220\266AFBFF\n" "E\220\313AJFBC\n" "E\220\316FJBMF\n" "E\220\345ABBLB\n" "E\220\350BFBMF\n" "E\221\274ABMBL|y3-y5\n" "E\221\305FBIFB|j2-y3 y1-y2\n" "E\221\343ABFKC\n" "E\221\344AfCBMF\n" "E\222\241BFJFB\n" "E\223\143BMBFF|b3-y1\n" "E\223\172BcJFFjC\n" "E\223\176AFaCCC\n" "E\223\312FBMfLB\n" "E\223\362MFJAL\n" "E\224\222ABMFF\n" "E\224\274CAFFB\n" "E\224\306ACbAML\n" "E\224\347JFaBFaC\n" "E\225\113CALAC\n" "E\225\130BCFjAC\n" "E\225\164ABFBC\n" "E\225\172JFBMB\n" "E\225\245FBIAfC|j2-y3\n" "E\225\270FBMJC\n" "E\225\275FCAFB\n" "E\225\323MgJCFacaCf\n" "E\225\331AfCFJB\n" "E\225\352AcMCCF\n" "E\225\357AMgMFL\n" "E\226\153FBIAL\n" "E\226\173FBACF\n" "E\226\226FFBAC|l1-l2\n" "E\226\242FFBAC|l2-l1\n" "E\226\257MFBiFK\n" "E\226\265FaCFaBA\n" "E\226\332BMFFF\n" "E\226\356AFFJC|b4-y2\n" "E\227\122BMBFF|y1-y3\n" "E\227\143AcAfCFjJ\n" "E\227\160JMFFB\n" "E\227\247BFCAF\n" "E\227\337ACCFaC\n" "E\227\337ACFMgB\n" "E\227\347BFaBCL\n" "F\210\265FBIJFafaK|j2-y3\n" "F\210\300BBFaBcJF\n" "F\210\337BFABiAC\n" "F\210\360FBBFFB\n" "F\210\363ABFFMB\n" "F\210\366BMFJCF\n" "F\211\106BBFaFFB\n" "F\211\110MCIMCI\n" "F\211\120ABMFFF|x3-x2\n" "F\211\230CCIFFBm\n" "F\211\274ABFJFjC\n" "F\211\357ACFFAfC\n" "F\211\361BMBMFF\n" "F\212\104FJBAJC\n" "F\212\145AFaCBMF|i3-i5\n" "F\212\276CCIFFB\n" "F\212\312AFFBLB\n" "F\212\351ACBFBF\n" "F\212\353AFaFJMgL\n" "F\212\367FBACJFl\n" "F\213\103AFFFkAC\n" "F\213\147FBFBMF\n" "F\213\170ABFBAC\n" "F\213\172BMFJFafaC\n" "F\213\200FBACFBmg\n" "F\213\244FBBFAC\n" "F\213\251BMFBFB\n" "F\213\302ABABiMB\n" "F\213\310BMBBFF\n" "F\214\131FFJBBB\n" "F\214\214ABMBBF\n" "F\214\217ABAFFB\n" "F\214\360BFACAC|b6-b1!\n" "F\214\365BCAFJL\n" "F\214\374ABMBMF\n" "F\215\100AJFBMF\n" "F\215\104BcJFFaBF\n" "F\215\106FBFAFabgF\n" "F\215\135CCIFBF\n" "F\215\154FBFAALbg\n" "F\215\163AABFFB\n" "F\215\207ACFBMF\n" "F\215\304FBMBFF\n" "F\215\335FJBFBF\n" "F\216\174ALBMFF\n" "F\216\200FAFaCAL\n" "F\216\205AcAfCBAC\n" "F\216\212FAfCFBF\n" "F\216\232BBFaFaBgF\n" "F\216\233FBFFBC\n" "F\216\237CIAFaJK\n" "F\216\247FABMBB\n" "F\216\250FBFFIB\n" "F\216\251ABMFFF|y5-y4\n" "F\216\256FFBIKC\n" "F\216\305FBBBFaCf\n" "F\216\305FBBBFaIcf\n" "F\216\347BBFaFBC\n" "F\216\351AFFBAC|b6-b1!\n" "F\217\102AJCBCB\n" "F\217\115AJMCBF\n" "F\217\133BFAfCJL\n" "F\217\173AMgBMFF\n" "F\217\204AcAcAcCFacaCf\n" "F\217\240FAJFBL\n" "F\217\257BFJFBF\n" "F\220\106AFaMBFL\n" "F\220\163MFJCCC\n" "F\220\166FkFBCFacaCf\n" "F\220\254JFMgKAC\n" "F\220\274FBMJLF\n" "F\220\343AFBBMF\n" "F\220\346AFBFJL\n" "F\221\123ACFBFF\n" "F\221\163BCIFBF\n" "F\221\201BMFFFB\n" "F\221\210AFaMFFB\n" "F\221\266FJBFaBgF\n" "F\221\275AFaCAFaC\n" "F\221\356BBFaAFL\n" "F\222\143BMFBCF\n" "F\222\156FBFMBL\n" "F\222\162CCIFbBL\n" "F\222\174AFBAFB\n" "F\222\207ABBMFB\n" "F\222\216BMFBIC\n" "F\222\233JCILAC\n" "F\222\322FBCCFacaCf\n" "F\223\140ABFFAfC\n" "F\223\146BMFFBF\n" "F\223\224BIJCFBg\n" "F\223\226BCAMFF\n" "F\223\257BMFBMF\n" "F\223\363FFFIKC\n" "F\223\367BMJCAC\n" "F\224\100BcJFBMF\n" "F\224\103ABAFBF\n" "F\224\116AFFBFB\n" "F\224\247JMFFJFl\n" "F\224\260ABFCAC\n" "F\224\277BMBJFlC\n" "F\224\334BcJFMFL\n" "F\225\123FABMFF\n" "F\225\232ABFJCC\n" "F\225\304CAFBAC\n" "F\226\132BACBFL\n" "F\226\160FBACBC\n" "F\226\210AFAfMBF\n" "F\226\222BFJBAC|b6-b1!\n" "F\226\274AFaCBMF|i5-i3\n" "F\226\317BFLAcJF\n" "F\227\114JFBMFF\n" "F\227\162CAFFFB\n" "F\227\231FBMFJC\n" "F\227\274FBMBLB\n" "F\227\361FJFaCBB\n" "F\227\362BACAMgJ\n" "F\230\152FBMFFF\n" "G\210\237FBMFBBF\n" "G\210\312ABBFCAF\n" "G\210\315BMFFJBF\n" "G\210\343FAFFJCL\n" "G\210\353FBFBFaAL\n" "G\211\236BFJALCC\n" "G\211\253CCIBMFB\n" "G\211\275ABFBMFB\n" "G\211\324FBBABAL\n" "G\211\344AFBIKAC\n" "G\211\365BACMFJC\n" "G\211\372FFJBKAC\n" "G\211\374MFLAFJK\n" "G\212\114BMFFFAC\n" "G\212\160AFaJMBFF\n" "G\212\256BBFaFFJL\n" "G\212\314JMFFFFB\n" "G\212\334ACFFaBMF\n" "G\212\362BLBFBFaC\n" "G\212\363ACAFBMB\n" "G\212\365MFLALCC\n" "G\213\104CCIAFFFk\n" "G\213\132FBIFBFaC|j2-y3\n" "G\213\160FBFAfCMgB\n" "G\213\201FBCIACC\n" "G\213\206BBFaJLJFl\n" "G\213\266ABgAFBFF\n" "G\213\307MFJMgBMF\n" "G\213\317FBIJMCI\n" "G\213\337AJFBCFacaCf\n" "G\213\341BMFACFM\n" "G\214\116MFFJBMF\n" "G\214\140FFJBAAA\n" "G\214\156AAcAfCBAC\n" "G\214\174FBBFFAfC\n" "G\214\175ABiMgBCFacaCf\n" "G\214\210CCIMFJC\n" "G\214\251BMFFFJL\n" "G\214\276CFFFBMF\n" "G\214\340BMFBmFAC\n" "G\215\102FBIBFJFl\n" "G\215\107BBFaFJAfC\n" "G\215\122FBIBFJFl|j2-y3\n" "G\215\125FBIAFJK\n" "G\215\130FBMFFJC\n" "G\215\216FBBMFJL\n" "G\215\220AFBFBMF\n" "G\215\242BMFBACF\n" "G\215\262ABFJFBF\n" "G\215\320AcAcAcCAJC\n" "G\215\336FBACFBA\n" "G\215\342FBIFJFaC\n" "G\215\343FaCaBFJFaC\n" "G\215\354ABAFBFF\n" "G\216\146ABMFBMF\n" "G\216\165FBFALCC\n" "G\216\204AFBACAfC|y6-y7 i6-x7!\n" "G\216\227ABBICJC\n" "G\216\231BBMFFJL\n" "G\216\320BFaBCFBF\n" "G\216\324FBMFFFB\n" "G\216\365FFFJFBC\n" "G\217\107AFBACJMmg\n" "G\217\132ABCFBFF\n" "G\217\211BFaBACMgA\n" "G\217\225BMFFIMgJ\n" "G\217\230BFJFaCFaBg\n" "G\217\260BFJFBAC\n" "G\217\264FBIBACA|j2-y3\n" "G\217\321BACBMFF\n" "G\217\360AFaCFBAC\n" "G\217\363BCIFJCC\n" "G\220\114ABBMFFB\n" "G\220\142BFBMFBF\n" "G\220\147ABMFFIA\n" "G\220\150BFCAFFB\n" "G\220\175BMCCACF\n" "G\220\201BMFAFaJK\n" "G\220\231FBACAAA\n" "G\220\272FBFMBFJ\n" "G\220\324FBFJBAC\n" "G\220\334FBIAJFB|j2-y3\n" "G\221\226FBFBFJC\n" "G\221\246MFFBiCMgB\n" "G\221\251FBMFBAC\n" "G\221\253BMFBFJC\n" "G\221\272FBACFBC\n" "G\221\303ACCAAcJF\n" "G\221\314ABFBACF\n" "G\221\316BFJCFBC\n" "G\221\360FBIMFJC|j2-y3\n" "G\221\362CCIJMFC\n" "G\222\101ABBMFFF\n" "G\222\112ACACBMF\n" "G\222\152BMBFFMgJ\n" "G\222\254BMBFFFBg\n" "G\222\276CCIBFaJL\n" "G\222\341ABABiFKF\n" "G\222\346BMFFBFF|y4-j2\n" "G\222\354AFBFFaFaCf\n" "G\222\355CAMFBmgBA\n" "G\223\167AcAFFaCMgJ\n" "G\223\212FBIJFlFaC|j2-y3\n" "G\223\244FBMFCAF\n" "G\223\337MFFJFaCdB\n" "G\224\101MFJBFaAC\n" "G\224\104BcJFAFBF\n" "G\224\105MgJCALCC\n" "G\224\143FBIMBFL|j2-y3\n" "G\224\204FBFBFaJL\n" "G\224\214ABABMFF\n" "G\224\236FBFFAFaC\n" "G\224\262FBIFJFaC|j2-y3\n" "G\224\272ABCAFFB\n" "G\224\273CAFFBBB\n" "G\224\333FABCBMF\n" "G\224\341FBIFBiAL|j2-y3\n" "G\224\354JMFFMBL\n" "G\224\366MFJAFFL\n" "G\225\175FBIFFJC|j2-y3\n" "G\225\272ABFBFAC\n" "G\225\312BMFMgABB\n" "G\225\324FJFaCCFacaCf\n" "G\225\341FBMFFBC\n" "G\226\106FBBBFMgJ\n" "G\226\115FFFJFaCdB\n" "G\226\126FBIBFFbgJ\n" "G\226\127BcJFBFFbgJ\n" "G\226\131BFLBLCC\n" "G\226\150FaCaBBFFbgJ\n" "G\226\166CCIJFlFaC\n" "G\226\230AFFlCCFacaCf\n" "G\226\255BcJFBACA\n" "G\226\337FMFJFJC\n" "G\226\360AABJFlFaC\n" "G\227\135ACFFBAC\n" "G\227\175FBIABiMB|j2-y3\n" "G\227\210FCAFBAC\n" "G\227\220AFBBMFL\n" "G\227\230AFBACBB|y7-y6 x7-i6!\n" "G\227\242BMFFBFF|j2-y3\n" "G\227\307BMFFBiAC\n" "G\227\342CIACCFaC\n" "G\227\342CIACFMB\n" "G\227\343FJFMgJMgJ\n" "G\230\112CCABFaMgJ\n" "G\343\350JMFFFBF\n" "H\210\266BBFaAFaCML\n" "H\210\313ABBFABiAK\n" "H\210\317AFBACAcJF\n" "H\210\325BMFFAMgAA\n" "H\210\347BFAfCBMFF\n" "H\211\112FBMBCCCC\n" "H\211\152CCICFbgFaAC\n" "H\211\160FBBBMFJC\n" "H\211\204ABFBFFaFaC\n" "H\211\210CCIACBMF\n" "H\211\212CAJCCAJC\n" "H\211\221FBBJFaCML\n" "H\211\235AABCFBFF\n" "H\211\237FBIBMFFB|j2-y3\n" "H\211\242FJCLAFaJC\n" "H\211\243FJCLJLFaC\n" "H\211\252BMCAFBLB\n" "H\211\277ABFBMBBF\n" "H\211\300ABFBFFBF\n" "H\211\312BMFFFBAC|y5-y3\n" "H\211\315CCIFBMFB\n" "H\211\346FBMBFFLB\n" "H\211\350FBBFBFBA\n" "H\211\366ACBFaCFBF\n" "H\211\373FBIBMFFbgJ|j2-y3\n" "H\212\116BFAcAACMgJ\n" "H\212\147FBIBFJAfC|j2-y3\n" "H\212\167CCABFaFaBgF\n" "H\212\170ABFBFBLB\n" "H\212\257BBFaBMFMF\n" "H\212\335BLBFJFFB\n" "H\212\342BLBFJBMF\n" "H\212\357FJCFBMFB\n" "H\213\106BFaBCAJFB\n" "H\213\107AFBACFaBgF\n" "H\213\130BBFaBMFFF\n" "H\213\203CCIBFCAF\n" "H\213\217MFJFBBMF\n" "H\213\221FBIBFMFF|j2-y3\n" "H\213\222FBIJFjKJFl|j2-y3\n" "H\213\235BFBMFFaBgC\n" "H\213\236BFBMFBAC\n" "H\213\237ABFBBFAC\n" "H\213\246FBMJMJMJ\n" "H\213\254BLBFCAJC\n" "H\213\265CCIBMFJL\n" "H\213\340ACFFBCAF\n" "H\213\352FBBFBBMF\n" "H\213\357BMFFFFAC\n" "H\213\363BBFaJLFBF\n" "H\213\374MFJBLBLB\n" "H\214\141AABFaCFBF\n" "H\214\163FBBFaCFBF\n" "H\214\224CAFFJCMgJ\n" "H\214\250FMFJBMFF\n" "H\214\267MFLbgBFAcAfC\n" "H\214\304BMFACAFBg\n" "H\214\305BMFBBMFF\n" "H\214\325BFJFaFLJL\n" "H\214\370BFACJCMgJ\n" "H\215\113FBFCAFFB\n" "H\215\123FBIAMgBMF|j2-y3\n" "H\215\126BMFFABiMgB\n" "H\215\155BFBFBMFF\n" "H\215\217BFAcAACBB\n" "H\215\221BMFBFFCF\n" "H\215\251BMFFFBiAL\n" "H\215\310FMFFBAcJF\n" "H\215\374MFJBMBBB\n" "H\216\121AfCFJCAAA\n" "H\216\147ABFBMFJC\n" "H\216\150FBMBACBB\n" "H\216\156BcJFAfCBMF\n" "H\216\157BcJFBFBMB\n" "H\216\175FBACFBFjK\n" "H\216\203BFaBCBFBF\n" "H\216\210JMFFFBFaC\n" "H\216\226FBMFMFFB\n" "H\216\230ABFBFFBC\n" "H\216\241CCIAfCBMF\n" "H\216\300BBFaFFFJC\n" "H\216\311ACFBFBMF\n" "H\216\322FBFABMFF\n" "H\216\327FBFBAFaCdB\n" "H\216\341FBBJFBMF\n" "H\216\346FBFFIBFaC\n" "H\216\363ACCABFaFaC\n" "H\216\374JMFBFBMF\n" "H\217\100BBFaFFBAC\n" "H\217\146BFFBACFjK\n" "H\217\161FBACCCFacaCf\n" "H\217\212FMFJAJFB\n" "H\217\256BCABMBMF\n" "H\217\263FaBFFFFaAC\n" "H\217\265FBIFbgJBMF|j2-y3\n" "H\217\270BMFFAJFB\n" "H\217\274FBACACAfC\n" "H\217\300CCIMJBMF\n" "H\220\202AFFBBFBF\n" "H\220\206CAJCAFaJC\n" "H\220\225FBACFACL\n" "H\220\247AFFBMBBB\n" "H\220\251BcJFAFBFF\n" "H\220\252AABFBFBF\n" "H\220\253ACBAFBFF\n" "H\220\302FBFFBMFF\n" "H\220\304BFACJFFB\n" "H\220\314FBBFBMFF\n" "H\220\315FBACAJFB\n" "H\220\331FBIBLBLB|j2-y3\n" "H\221\152FaCdBBMFFF\n" "H\221\262BFACACFB\n" "H\221\354BFBMFFFB\n" "H\221\361FBIFJBMF|j2-y3\n" "H\222\123FBIBMFFF|j2-y3\n" "H\222\155AFFJCBMF\n" "H\222\210BBFaBMBFF\n" "H\222\211BMFBALCC\n" "H\222\212FBIBMBFF|j2-y3\n" "H\222\215CCICFBFF\n" "H\222\267BFFFFBiAC\n" "H\222\274FBBMFFFL\n" "H\222\330FBIFCAFB\n" "H\222\350BBFaFBFJC\n" "H\222\352BFJABiFCF\n" "H\222\357FBIABiFCF|j2-y3\n" "H\223\100ABiFCFFaCdB\n" "H\223\104CCIMFJAL\n" "H\223\111ABMFFAMgC\n" "H\223\122AFFJCCFacaCf\n" "H\223\124BMBBFFAC\n" "H\223\130BFJBFBMF\n" "H\223\214FBMFFBAC\n" "H\223\236FAfCFBIBB\n" "H\223\305FBFFAfMBF\n" "H\223\313BBFaJLFJK\n" "H\223\315MFJBMBFF\n" "H\223\373ACCAFaBgIL\n" "H\224\117ACFFaBLCC\n" "H\224\147CCIJFaBFaC\n" "H\224\161FBIFFFFB|j2-y3\n" "H\224\164FBACFABC\n" "H\224\217FBIABMFF|j2-y3\n" "H\224\221CCIABMFF\n" "H\224\227ABMFFCFacaCf\n" "H\224\302FBACFJFjK\n" "H\224\305JBFMFJFaC\n" "H\224\336AABJFaBFaC\n" "H\224\342FBIJFaBFaC|j2-y3\n" "H\224\345CCICJKCC\n" "H\224\361JFFIBFFF\n" "H\225\134FBFFABiAC\n" "H\225\143FBBBMBFF\n" "H\225\173BFJABFBC\n" "H\225\174ACBAFBMB\n" "H\225\215FaCdBABFBC\n" "H\225\216ABAFLMFB\n" "H\225\220FFBFBIKC\n" "H\225\236JMFFBMFaC\n" "H\225\246CCIMFBmgJB\n" "H\225\250AFBIAMgAA\n" "H\225\271ABCAFFJB\n" "H\225\300CAFBBCAF\n" "H\225\340BFBFBACA\n" "H\225\362FFFJCFFB\n" "H\225\363BBFaFBFFC\n" "H\225\370FBIAMgMFL|j2-y3\n" "H\225\372BFMgJAFJK\n" "H\226\100CCIFBFAfC\n" "H\226\101CCIAMMFL\n" "H\226\133FMFJBFMgJ\n" "H\226\142JMFFBFMgJ\n" "H\226\161AFBIAFJC\n" "H\226\172FJCFBFJB\n" "H\226\205BcJFFFBAC\n" "H\226\207FBACAFJK\n" "H\226\225FBIFFBAC|j2-y3\n" "H\226\241BMFFFBAC|a6-a3\n" "H\226\246BLBBMFFB\n" "H\226\275ACFBMFMB\n" "H\226\276BMFFJMFF\n" "H\226\306AFaBMBFJL\n" "H\226\316FBBJFKAC\n" "H\226\323BFLBMFFF\n" "H\226\345BMFFBMFF\n" "H\226\351BFABAFaCC\n" "H\226\373CCIBMBFF\n" "H\227\321FBACFBAC\n" "H\227\341ABFJFaCBB\n" "H\230\106CAJCFMFJ\n" "H\230\141AFBACBMF\n" "H\230\147FBACJFlFB\n" "H\237\251CCIBCAJL\n" "H\347\214BMBFFCFacaCf\n" "I\210\243BFBMFABiAC\n" "I\210\320JFFAcAFKAC\n" "I\210\327CAMMMACCC\n" "I\210\335BMBFFBMFF\n" "I\210\367BcJFBMFJCF\n" "I\211\146BMFFBMFJC\n" "I\211\150CCABFaFBAC\n" "I\211\165BFJCIJFlFaC\n" "I\211\256MFJFAfCFBF\n" "I\211\265AFFBFBIMB\n" "I\211\271BFCAFBMFF\n" "I\211\310AFBACCCFB\n" "I\211\313MgJBMFFBAC\n" "I\211\367ACBAFJfMJF\n" "I\212\103CCIAFBfFjJF\n" "I\212\105BMBFFACJB\n" "I\212\106FBiALABMFF\n" "I\212\137FBIFBMFFF\n" "I\212\166FBBFBMFFB\n" "I\212\207FBIAFBBMF|j2-y3\n" "I\212\210CCIAFBBMF\n" "I\212\245BFaFFJLFBC\n" "I\212\252CAFFJCMFL\n" "I\212\305AFFJBMFFF\n" "I\213\111AcAfCBACMFL\n" "I\213\117FBMFFFBJFl\n" "I\213\161BBFaAFaCBMF\n" "I\213\163BFJFaFLFFL\n" "I\213\164CAFLBJCFacaCf\n" "I\213\175AFaMFFALCC\n" "I\213\211AcAfCBACJFafaC\n" "I\213\212AcAfCBACBFB\n" "I\213\262FBIFCAFJC|j2-y3\n" "I\213\267ABgAFCAFJC\n" "I\214\122BFaFBMFFFB\n" "I\214\127ABAAcAfCBAC\n" "I\214\136FFJBBBFBF\n" "I\214\137FBFIMgJFJC\n" "I\214\166CFFFBMFFB|b8-y9\n" "I\214\232MFFFFBFaFaCf\n" "I\214\244FJBMFFFJB\n" "I\214\247BMFFFLBAC\n" "I\214\300FaCdBMFFBiAC\n" "I\214\307FaBgIAJBICK\n" "I\214\312MFBmgAJBICK\n" "I\214\314FBBMFACJK\n" "I\214\315FBACFBBMF\n" "I\214\343AABAcAfCJFaC\n" "I\214\362ABMFAFFJK\n" "I\214\372FJBMFFFaBgF\n" "I\215\120ACBFBMFFF\n" "I\215\127BMFFBCAJL\n" "I\215\136CCIFBBFAC\n" "I\215\143ABMFFFBFF\n" "I\215\147AcAfCBACFBF\n" "I\215\162FBBBFLJBL\n" "I\215\170BFACJCFaCdB\n" "I\215\201AFBACBMFF\n" "I\215\211FBIFBFAABmg|j2-y3\n" "I\215\246ACBMFFBiAC|a5-a3\n" "I\215\270FBACBMFFF|b5-b2\n" "I\215\273FJBMFBACA\n" "I\215\323FJBMFJFlFB\n" "I\215\347BMFCAFFJC\n" "I\215\355BCABMFFBB\n" "I\215\360BMFFAFMFF\n" "I\216\160CIAFaJCAcJF\n" "I\216\166BMBFFALCC\n" "I\216\167FBIALBMFF|j2-y3\n" "I\216\173BFJMgAFMBL\n" "I\216\235FBIFBFFBC|j2-y3\n" "I\216\272BBFaFAfCFBF\n" "I\216\353ABgABBFaFBC\n" "I\216\361CAFABMFFF\n" "I\217\105FBIACFBMF|j2-y3\n" "I\217\110AFBACCAJC\n" "I\217\114ABMFFFFJC\n" "I\217\137FaCFaBAFBAC\n" "I\217\144AFBMFFBFF\n" "I\217\152BFaBCBMFJL\n" "I\217\162ABAbCJLJFjC\n" "I\217\164FFFJCBMFF\n" "I\217\202AJFBBMFFF\n" "I\217\226ACFFBACFjC\n" "I\217\272BMFFMJBMF\n" "I\217\310BACABMFFF\n" "I\217\346AFFBBFBAC\n" "I\217\351FBIJFFbgCAC\n" "I\217\362CCIAFaMFFB\n" "I\220\110ACBMFFBiAC|b6-y1\n" "I\220\115ABCFFFBMF\n" "I\220\116ABMFFAFaFaC\n" "I\220\137BFaBCBMFFB\n" "I\220\162FBBFFFJLL\n" "I\220\203ABMFMFBMB\n" "I\220\210CABACJFlFB\n" "I\220\245BMFFFBFJC\n" "I\220\255FBFBIAFJC\n" "I\220\257BMFFAFBFF\n" "I\220\265AFBIAFBFF\n" "I\220\336BBFaJLALMgJ\n" "I\220\351BBFaFBMFFF\n" "I\220\352FBMFFBFBC\n" "I\220\362ABMFFBFaAC\n" "I\220\363CCIFFFKAC\n" "I\220\364CCIAFBFJL\n" "I\220\365CCIJFlFBAC\n" "I\221\117CAFBMFFBB\n" "I\221\143BFaBCBMFFF\n" "I\221\164FFFJCFFJC\n" "I\221\212FBACBMFFF|a5-a2\n" "I\221\220FBBBMFFFB\n" "I\221\221FBBBCIFBF\n" "I\221\227CAFFJCCFacaCf\n" "I\221\243ABBMFBFJK\n" "I\221\245BMFFFACBB\n" "I\221\255ABACACBMF\n" "I\221\317FABMBBFBC\n" "I\221\322AABFBFFBC\n" "I\221\323AfCBMFALCC\n" "I\221\331JMFFAfCBMF\n" "I\221\336MFFBiACCFacaCf\n" "I\222\120CCABMFFFB\n" "I\222\131BMBFJCAJC\n" "I\222\137JMFFBMFFF\n" "I\222\151ABFFFJFlFaC\n" "I\222\203FBBACFBAC\n" "I\222\213MFJCBMFFF\n" "I\222\214FBACCFBFF\n" "I\222\217FBMFBABiAC\n" "I\222\247FBIJCILAC|j2-y3\n" "I\222\272FBMFBACMgJ\n" "I\222\277FBFIACAAA\n" "I\222\303CCIMFFFFB\n" "I\222\307ABMFMFCFacaCf\n" "I\222\340BFBMFBFaFB\n" "I\222\345BFBMFFFAC\n" "I\222\351BFCABFaBMB\n" "I\222\371CFFFBMFFB|b9-b8\n" "I\223\137BFBMFACCC\n" "I\223\170BFJFBBFFaC\n" "I\223\173AcJFFaCALCC\n" "I\223\246JCILACCFacaCf\n" "I\223\264CCIBMFBMF\n" "I\223\273BLBBFFFBC\n" "I\223\275FFBBABMFL\n" "I\223\306ABgABMFBIC\n" "I\223\354FBBMCAFFB\n" "I\224\150CCIAJAJAC\n" "I\224\167FBIALBMFF\n" "I\224\170JMFFBFBMB\n" "I\224\250CAJCBMBFF\n" "I\224\255FaCACAFFJL\n" "I\224\332ABMBFFAFB\n" "I\224\362FkACBAJFkAC\n" "I\224\374CAFBFFFJC\n" "I\225\142AFBACBACA\n" "I\225\151BMFBMFBMF\n" "I\225\211AFaBMFFFAC\n" "I\225\213FBFBFACBC\n" "I\225\225FBFFBIFBC\n" "I\225\227JFkABMFBIC\n" "I\225\262CABACACMgJ\n" "I\225\277FBACFBMJC\n" "I\225\305FABMFFFAC\n" "I\225\317BFJBACAFaC\n" "I\225\326ABFBMFFJC\n" "I\225\333ABBMFFBAC\n" "I\226\105JMFFAMMFL\n" "I\226\136FBBFFFBAC\n" "I\226\140BMFFBMFFF\n" "I\226\176ACMgABMBBF\n" "I\226\300CAFBACCFacaCf\n" "I\226\312FABMBBFFF\n" "I\226\361AcAfCBACAMgC\n" "I\226\366FBACABiJMgB\n" "I\227\105FaCBMBFFMgJ\n" "I\227\110BAcAfCAcAfCLB\n" "I\227\123BFaBCJFBMF\n" "I\227\155CCICAFFFB\n" "I\227\166FBMBBFAcJF\n" "I\227\201CCIACACbMF\n" "I\227\245AABMFFFFB\n" "I\227\277CABACCCFB\n" "I\227\320FJBMFFBFF\n" "I\227\346FBFIACCFaC\n" "I\227\346FBFIACFMgB\n" "I\230\131BMFFBiCFaCdB\n" "I\237\253CCIAMgBMFF\n" "J\210\304BBFaAcJFFBAC\n" "J\210\365BMFBMFFFAC\n" "J\211\100FaCdBBBFaFFJL\n" "J\211\131CCIFBMFFBC\n" "J\211\166CAFACBMBBF\n" "J\211\170ACBCABMFJL\n" "J\211\203BBFaBMFFAcJF\n" "J\211\245ACAfCMCIMCI\n" "J\211\264ABFJCBMFFL\n" "J\211\266BMFJCFALCC\n" "J\211\304FABMFFFAFaC\n" "J\211\306BBFaFACbgAAAC\n" "J\211\327FBBABFBMFB\n" "J\211\330FBBFFBBFFB\n" "J\211\341BMFBICBFJK\n" "J\212\121BBFaFBFFBMF\n" "J\212\151FBACAFaCBMF\n" "J\212\152FBACBFAcAAC\n" "J\212\224FBACAFFBAC\n" "J\212\327FaCdBAFaBBMFF\n" "J\212\371MFFBiCFBFJL\n" "J\213\101BJMFFAFaBMF\n" "J\213\114CFFFBMFMFL\n" "J\213\116FBFBFACMFL\n" "J\213\121ACBMFFBiCJFl\n" "J\213\123ABMBFFJLAfC\n" "J\213\173BBFaBMFABMF\n" "J\213\223CCAFACAFFBg\n" "J\213\260FBIJFlCALCC\n" "J\213\261FBBFACBACC\n" "J\213\271JMFFAMgACLB\n" "J\213\272MgAMgAMgABMFF\n" "J\214\111FBMBBFFBAC\n" "J\214\113FaCFaCFaCFBAC\n" "J\214\120CFFFBMFJBB\n" "J\214\123MFFJBMFFaCdB\n" "J\214\142FBMFFBALCC\n" "J\214\220ABACFBMFJC\n" "J\214\223CAFMFFBBAC\n" "J\214\225ACFBMFJCBB\n" "J\214\254FBMFFFBFFB\n" "J\214\264FJABMFFBAC\n" "J\214\302ABBMFBBMFF\n" "J\214\311BFJFBMFFFB\n" "J\214\342BcJFBMFBmFAC\n" "J\214\345ACBFBMFBMF\n" "J\214\363ABBMFAFFJK\n" "J\215\132FBACBFACJK\n" "J\215\153FFFBACFFJB\n" "J\215\161AJMCBIBFJFl\n" "J\215\166FBFBMFFFAC\n" "J\215\176FaCdBAFaCFBFB\n" "J\215\202BFBMFBMBMF\n" "J\215\204BMCAFBLBBB\n" "J\215\234BMBFBFaBMFF\n" "J\215\252FBACMFFBiAC\n" "J\215\264BMFAfCALAFaC\n" "J\215\267CAFBFFAFBF\n" "J\215\300BFJACACFBF\n" "J\215\311BBFaBFCAFFB\n" "J\215\315FBFFBACKAC\n" "J\215\334BFACJFFBBB\n" "J\215\340BMFFFACFBA\n" "J\215\365FBBFaAcAfCBAC\n" "J\215\367FBACCCAAcJF\n" "J\216\105ACFBACJFlFaC\n" "J\216\126FBACFFFCAC\n" "J\216\134FFJCBMFBFC\n" "J\216\143FJFjCFFFCAC\n" "J\216\164ABMFMFFBMB\n" "J\216\206AcAfCBACABiFK\n" "J\216\211JMFFALBMFF\n" "J\216\236BMFFFBFFBC\n" "J\216\276BFJCIAFFJC\n" "J\216\313ABMFFIIFBC\n" "J\216\321AcAfCBACBACA\n" "J\216\330ABFBBFBMFF\n" "J\216\336FBMJLFFAMgC\n" "J\216\343MFBmgCIMFBmgCI\n" "J\216\352FJFjCAFFBAC\n" "J\216\354FBFIAFFBAC\n" "J\216\360CCIFBMJLFF\n" "J\217\103ABBAFACAAA\n" "J\217\135AABCAFBFAC\n" "J\217\171CIABAFBFFF\n" "J\217\175FJFjCAMgBMFF\n" "J\217\203AcAfCBACALBL\n" "J\217\221MFFFFBBMFF\n" "J\217\231AABACFFBAC\n" "J\217\234FaCdBACFFBAC\n" "J\217\252BBFaBCABMFF\n" "J\217\253BCIACCAFBC\n" "J\217\301CCIBCABMFF\n" "J\217\307BFJCIFBFBF\n" "J\217\313BFaBCCAFBFF\n" "J\217\314AFBACAFBAC\n" "J\217\316AFBAFBAFJC\n" "J\220\112FJFFBiACFBC\n" "J\220\117FJFFBiACBMF\n" "J\220\120BcJFFJFFBiAC\n" "J\220\125FBIFJFFBiAC|j2-y3\n" "J\220\127FBBCAFBMFF\n" "J\220\132CCIMFFBFaFaC\n" "J\220\136FBBMFFFFAC\n" "J\220\152ACFFBCAIFB\n" "J\220\167FaCdBFBMFFFB\n" "J\220\212BFBMFFABiAC\n" "J\220\244BFBMBFFAFjC\n" "J\220\300FBIAJFBCFacaCf\n" "J\220\307ABAFBFFFFaC\n" "J\220\310BFJFBBFBMB\n" "J\220\356FMFJMCIMCI\n" "J\220\360FBACACFBFF\n" "J\221\144AFBACBMFFF\n" "J\221\146FBFFAcAfCBAC\n" "J\221\161ACFMFFJBMF\n" "J\221\173FBIBMFFBFaC|j2-y3\n" "J\221\175FBIAFBMFFB|j2-y3\n" "J\221\242AFBFBMFCFacaCf\n" "J\221\247ABMFFFALCC\n" "J\221\254FBMFBACCFacaCf\n" "J\221\263BFaBACBMBFF\n" "J\221\267FaBgIAAcAfCBAC\n" "J\221\321FBBBFBFaBMB\n" "J\221\327FFFJCBCIAC\n" "J\221\365CFFFBMFAFL\n" "J\222\154ABFBBMFFFL\n" "J\222\160FBFFIBBLCC\n" "J\222\166FAfCFBIAFJK\n" "J\222\173BFAcAfCBMBFF\n" "J\222\200FACbgAAACCFacaCf\n" "J\222\201AFBACAFFJC\n" "J\222\275JMFFCAFFJC\n" "J\222\312FaCBMFFBCFacaCf\n" "J\222\353BFJAFBFFaFaCf\n" "J\222\374AJFFBMBCFacaCf\n" "J\223\116FBIAJFBBMF\n" "J\223\127MFJFBBFBiAC\n" "J\223\153AABFBFBFAC\n" "J\223\162ACFFBACCFacaCf\n" "J\223\174ABFAfCFBIBB\n" "J\223\175BCABFaBMFJL\n" "J\223\200CIFBMFFBAC\n" "J\223\202BFJMFFBBMF\n" "J\223\207ABMFFFMgBLB\n" "J\223\215FBACJCILAC\n" "J\223\242CFFFBMFFBC\n" "J\223\247AFBACAMmgCFacaCf\n" "J\223\267JMFFBMFBMF\n" "J\223\301AFBIFBFFBC\n" "J\224\131ACBCCAACLB\n" "J\224\133AcAfCBACBMJC\n" "J\224\134AfCBMFFALAL\n" "J\224\152FJBMFJFaBFaC\n" "J\224\156BFBFFMgCCCC\n" "J\224\157ABJFFFBFFF\n" "J\224\172FBMJLFFMFL\n" "J\224\173ABBFCAFBMF\n" "J\224\176FBACAFLMBF\n" "J\224\307FBFIBJFBFF\n" "J\224\310BMBFFCAFFB\n" "J\224\312AJMCBIJFlFaC\n" "J\224\346BFJCIJFaBFaC\n" "J\224\351AFBACCALBC\n" "J\224\355BFaBACJFaBFaC\n" "J\225\120BcJFBFBMFBF\n" "J\225\125ABFBFFJBiAaC\n" "J\225\141BFJCIFBMJC\n" "J\225\154CCIABFBFAC\n" "J\225\161AFLMBFAFJK\n" "J\225\162CAFFJBFBiFlC\n" "J\225\202CCIACCAFaBgF\n" "J\225\264AcAfCBACACMgJ\n" "J\225\303FaCdBFBiALFBF\n" "J\225\327AFaBMBFJLMgJ\n" "J\225\337FBIFBMFFBC|j2-y3\n" "J\225\355ABBFFbgJJFJK\n" "J\225\356ABFFFJCFFB\n" "J\225\364BLBAFaCFFFB\n" "J\226\103FJBMFAMMFL\n" "J\226\125BFCAFBMFBB\n" "J\226\141AcAfCBACBFMgJ\n" "J\226\204FBIBMFFBFF\n" "J\226\254JMFFAJABAC\n" "J\226\260BMFFFMFBiFC\n" "J\226\272BcJFBMFFBiAC\n" "J\226\325FFFBACAFFL\n" "J\226\344AcAfCBACBFJK\n" "J\227\145BBFaACACBMF\n" "J\227\254CCIBFAfCJBL\n" "J\227\257ABiCMgJBMBFF\n" "J\227\263BFCAFBMFFL\n" "J\227\267BFMgJAFABAC\n" "J\227\317ABACFBMFBB\n" "J\227\334CCIFMFJFJC\n" "J\227\363FAFaCBBACCC\n" "J\227\366BFJBACALCC\n" "J\230\101FBMFFFBCFacaCf\n" "J\230\116BMFFBiCJMFF\n" "J\230\121CCIBMFFBiAC\n" "K\210\253FBMFBBFALCC\n" "K\210\262FBACBFCAFFB\n" "K\210\321MFJFFBACFBC\n" "K\210\331BMBFFFBBFAC\n" "K\210\332AFBACAFaCAFaC\n" "K\210\346FBIFBMFICAC\n" "K\210\355AFaBMBFJLCFacaCf\n" "K\211\101FaCdBACFMFFAfC\n" "K\211\164CCIBFABAFaCC\n" "K\211\251FBBFBMBFFAC\n" "K\211\331FBBBMFFFBAC\n" "K\211\335ABALBMFFFAC\n" "K\212\102FBACFFJBKJC\n" "K\212\125CCIFJFBFFBF\n" "K\212\153FBFAFaJMiJFlFaC\n" "K\212\163BFBMFFaBgIFaCdB\n" "K\212\174FBIFBFFBIBC|j2-y3\n" "K\212\205BMFBMFFAMgAL\n" "K\212\211CCIBMFFAMgAL\n" "K\212\243FBBMFFFBAFFaf\n" "K\212\250FBBFFFJLLMgJ\n" "K\212\263BMFBMFBALCC\n" "K\212\321LMBFBMFFFAC\n" "K\212\341BMFFFMFFBiAC\n" "K\212\356FBBFFFACFBF\n" "K\212\361BBFaFJCFBMFB\n" "K\213\113FFJCBMFFFJL\n" "K\213\124AFaBMFFBMFFL\n" "K\213\125ABCAMMMBCCC\n" "K\213\145FBBAMgCAFBAC\n" "K\213\162JMFFFBFAfCMgB\n" "K\213\176FBCIACCAFAC\n" "K\213\205FBFIFBCIACC\n" "K\213\225BFJFaFLBBCAF\n" "K\213\226CFFFBMFAFFB\n" "K\213\233AFaBMBFFACCC\n" "K\213\255MFBmgAfCBMFBIC\n" "K\213\263FBFAFaBgIAFAC\n" "K\213\275AcAfJMFFBiCFaCdB\n" "K\213\333FBBBMAFBACF\n" "K\213\364ABBMFFBMBFC\n" "K\214\100FBIMFJFLBLB|j2-y3\n" "K\214\133FMFJAFACBMF\n" "K\214\146FBIBMFFAMgAL|j2-y3\n" "K\214\153CCIACCAFFJC\n" "K\214\157AcAfCBACFaCFBF\n" "K\214\165CCABFaBMFBFC\n" "K\214\222ABMFFFFBFaFaC\n" "K\214\257FaCdBACFBMFJC\n" "K\214\273FBFIBMFFFJL\n" "K\215\116BFJMFFBCIAC\n" "K\215\124FBIBBFaJLFBF|j2-y3\n" "K\215\225BMFFBFFACCC\n" "K\215\240DLFABMFFFAC\n" "K\215\245BcJFABiFKBMFF\n" "K\215\254CCIBMFFFBiAL\n" "K\215\256AcAfCBACFBBFF\n" "K\215\305BMFFFBFFIFaC\n" "K\215\312ACCAFBACAAA\n" "K\215\314FBIACCAFBAC|j2-y3\n" "K\215\317CCIBFACJFFB\n" "K\215\325AFaCCFaCFFBAC\n" "K\215\326BFACJFFBACB\n" "K\215\327AcAfCBACBMBFF\n" "K\215\330FBBACCAFBAC\n" "K\215\350BLBFJCFBMFBg\n" "K\216\123ACBAfCFACAAA\n" "K\216\131BFCAFJAFBFF\n" "K\216\213BFaBCBMFFFJL\n" "K\216\267FBFCAFFBJFlC\n" "K\216\314FBIACFBFBMF|j2-y3\n" "K\216\315FBFJBBCAFJK\n" "K\216\316ACFFBACCCFB\n" "K\216\326BMFBICBBFaAL\n" "K\216\337ACAFBACMFJC\n" "K\216\342BBFaBFFBACFaC\n" "K\216\366FBIACCABFaFaC|j2-y3\n" "K\217\111AcAfCBACACaCCC\n" "K\217\113MCIMCIABMFF\n" "K\217\124JMFBFBMFCFacaCf\n" "K\217\141CCIBFBFCIAC\n" "K\217\150BBFaABFABMFF\n" "K\217\151CCIFBFBACFjK\n" "K\217\154MFFBCAFACJB\n" "K\217\160AABFBACCFFBg\n" "K\217\216BFJFBBFACCC\n" "K\217\244BFCABMJLBMF\n" "K\217\245BMFBMFFBMFF\n" "K\217\302CCIBFBFBACA\n" "K\217\315BFCAFBMFFFB\n" "K\217\320AcAfCBACMgJBMF\n" "K\217\327CFFFBMFACAfC\n" "K\217\350AFFBBFBACBB\n" "K\217\355BCABFaBMFBMB\n" "K\217\356ACBFBFFBMFF\n" "K\220\133CCIBFaJLFBAC\n" "K\220\141AcAfCBACBMFFB\n" "K\220\151ABAFBFFFCFacaCf\n" "K\220\204FBIABAFBFFF|j2-y3\n" "K\220\214FBMJLFFJFlFB\n" "K\220\222BLBBBFaFFBAC\n" "K\220\230FBIMFJFBBMF|j2-y3\n" "K\220\235BACABAFBFFF\n" "K\220\264CCIFBFFBMFF\n" "K\220\311ACBFBBFBMFF\n" "K\220\323FBFFBMFFFAC\n" "K\220\332FBIBFCAFAcJF|j2-y3\n" "K\220\335CFFFBMFJFlFaC\n" "K\220\341FBFaBCCCCMFF\n" "K\220\371BFMgJAFFaBFJC\n" "K\221\104AJMCBIACBMF\n" "K\221\133FBIFBBFBMFF|j2-y3\n" "K\221\145CAFBACBMFFF\n" "K\221\147AcAfCBACBMFFF\n" "K\221\174FBIMFFBFaBMB|j2-y3\n" "K\221\202FBMBBFFBMFF\n" "K\221\203CCABMFFFBAC\n" "K\221\213BBFaJLAfCALCC\n" "K\221\244ABBMFFFACBB\n" "K\221\260BFMgJACAFFJC\n" "K\221\334ABFCCBFABiAC\n" "K\221\337MFFBCIACCFacaCf\n" "K\221\346AFBAFBMFBmgBA\n" "K\222\105JMFFCABMFJL\n" "K\222\124FBIBFaJLFBAC|j2-y3\n" "K\222\127CCIBIJKBIJK\n" "K\222\146CAFBACLAJFB\n" "K\222\202BBFaJLFAfCFBF\n" "K\222\230FBBFBFABMFF\n" "K\222\240BMBBFFFFBiAC\n" "K\222\243MFBmgBFFFFBiAC\n" "K\222\244JMFBFBMFAAA\n" "K\222\255BMFFFJCILAC\n" "K\222\257JMFFBFFFBiAC\n" "K\222\270FBFABMFFFAC\n" "K\222\271ABMFFFMgCCCC\n" "K\222\302FaCdBFBMFFBAC\n" "K\222\336ACFFBCAIAMgC\n" "K\222\342ABBFBMFBFaFB\n" "K\222\343ABBFBMFFFAC\n" "K\223\112AFBAFBBMBFF\n" "K\223\131CCIAFJCBACC\n" "K\223\135FBMFFFBFFAfC\n" "K\223\163FBFABMFFFaCdB\n" "K\223\211ACBBFBMFFFB\n" "K\223\220CIAFaJCBMBBF\n" "K\223\251FaCdBAMAFFBLB\n" "K\223\256AFBMFFBFIMgJ\n" "K\223\260BCABFaBMFFBF\n" "K\223\276AABBMFFFFBC\n" "K\223\330JMFFFACbgAAAC\n" "K\223\356FBMFFFBAFaJC\n" "K\224\114ABgAFBBBMBFF\n" "K\224\123CAFBACBFBMF\n" "K\224\135JMFFCCAACLB\n" "K\224\153CCIJFaBFaCAfJF\n" "K\224\162FBIJFFFBFFF|j2-y3\n" "K\224\163BMFFFACAFJK\n" "K\224\174FBIBFCAFBMF\n" "K\224\206FaCdBBFCAFBMF\n" "K\224\225AJMCBIABMFF\n" "K\224\314BMFFFACFJFaC\n" "K\225\115AFBAFBMFFFB\n" "K\225\133FBMBBFFFBAC\n" "K\225\140FBIFBBBMBFF|j2-y3\n" "K\225\156ACMgABMFFFAC\n" "K\225\167BcJFMFFBFaBMB\n" "K\225\204AFBAFBABFBC\n" "K\225\224BFCAFBMFFaCdB\n" "K\225\233FBMFBMBFFBB\n" "K\225\302BMFFBMFFFBA\n" "K\225\316ABFMFJBMFBB\n" "K\225\366BLBJMFFJMFF\n" "K\226\107FBBBMFFJMFF\n" "K\226\113CFFFBMFBFMgA\n" "K\226\135BFLJMFFFBFF\n" "K\226\170FBIMFJBLBLB\n" "K\226\203BFJFBACFBAC\n" "K\226\247BBFaBALBCBLB\n" "K\226\261FaCFaBgAAFACMgJ\n" "K\226\322ABgCFaBgFBMBBF\n" "K\226\342BMFFBMFFBMF\n" "K\226\354BMFFBFIFaCFaBg\n" "K\226\363CFFFBMFMFJC\n" "K\227\102BMFABAFBFFF\n" "K\227\111ABBAFACALCC\n" "K\227\130AFFBBFBIFaCdB\n" "K\227\146BFJMFFBMFFB\n" "K\227\156CCIBBFaACBMF\n" "K\227\176ACACBMFAFaJC\n" "K\227\202MCIMCIBFCAF\n" "K\227\235FBFIBMFFBFF\n" "K\227\244FaCdBFBFALFBF\n" "K\227\246BFAcAfCCIACFB\n" "K\227\252BMBFFAFaCBMF\n" "K\227\261CAFBACBFCAF\n" "K\227\262FaCdBAFaCAFBFF\n" "K\227\301CCIBFBMFBAC\n" "K\227\302ABgACCAJFkFFB\n" "K\227\313FaCdBFBFALAFaC\n" "K\227\335BMBFFAcAfCBAC\n" "K\235\352JFMgKACBMBBF\n" "L\210\250FBBFaCACAFFJC\n" "L\210\254FBIMFJFAfCFBF|j2-y3\n" "L\210\314ABBMFBMFFBFB\n" "L\210\371ACBMFFBiCAFaJC\n" "L\211\121CCIBMBFBMBMF\n" "L\211\136BMFBMFFFBCFacaCf\n" "L\211\137FBFaBCCCCFFAfC\n" "L\211\143CCABFaBMFABMF\n" "L\211\154FBFIFBBBMFJC\n" "L\211\162CFFFBMFCMFaAC\n" "L\211\172FBFBFACBiFKAC\n" "L\211\207FBIACCAFFJFaC|j2-y3\n" "L\211\234ABMCAFBACFJC\n" "L\211\267CCIBMFFBMBBF\n" "L\211\305BcJFBBFaACbgAAAC\n" "L\211\337BMBFBMBMFCFacaCf\n" "L\211\352MgJBMFBMFFFAC\n" "L\212\107AcAfCBACACFFAfC\n" "L\212\112BMFFBMFFFFJB\n" "L\212\113FaCdBFBiALABMFF\n" "L\212\130AABFBFFBIFFB\n" "L\212\157CCABFaBMFFFJL\n" "L\212\204BBFaFBFFBMFBB\n" "L\212\246BBFaFBBFFACCC\n" "L\212\253BMFAFaBMJLFJC\n" "L\212\254FBIFBBFFFALL\n" "L\212\267FBIAFaBMJLFJC|j2-y3\n" "L\212\270FBFBFFIBAFJC\n" "L\212\273FBACBBFaBMFMF\n" "L\212\274FBFFFBACAFaJC\n" "L\212\324BMFFBMFFBMFF|l1-l5\n" "L\212\325BMFFBMFFFBAC\n" "L\212\354FBFBMFCAFBMF\n" "L\212\364AcAfCAcAfCFJCKAC\n" "L\212\366FBIBFaFBMFFFB|j2-y3\n" "L\212\372FBBFFFACJMFF\n" "L\212\373FBACFBBFFFAC\n" "L\213\115BMFBFBMFFFAC\n" "L\213\134FBBFFFACAFaJC\n" "L\213\151BMFFBFIMgAFJC\n" "L\213\213AcAfCBACACFBMF\n" "L\213\227BMFBFBIBFMFF\n" "L\213\305BMFFFBFBBFJL\n" "L\213\316FBBBMFBFFIMgJ\n" "L\213\325FBFIFBFFACFFa\n" "L\213\330AFBAFBJMFFMgJ\n" "L\213\366BMFFBMBICCFacaCf\n" "L\213\367FaCdBBMFFBMFFC\n" "L\214\150FBBAFmgBMFAFJC\n" "L\214\151BMFFBFBMFBAC\n" "L\214\171FBMFFFBFaCFBF\n" "L\214\213AcAfCBACFBFBMF\n" "L\214\227BMCAFFJCMFLF\n" "L\214\230BFBMFBFFaCFBF\n" "L\214\237FBACACFBMFJC\n" "L\214\270CCIJFFBMFCAC\n" "L\214\316CCIFBBMFJMFF\n" "L\214\331FMFJABBFBFFF\n" "L\214\344AABAFFBFBIMgB\n" "L\215\121ACBFBBBFLJBL\n" "L\215\140CCIFBBFACMFL\n" "L\215\144FJBMFFBMFFJC\n" "L\215\151AcAfCBACBFACJK\n" "L\215\200FBIFABMFFFAC\n" "L\215\274CFFFBMFAFBFF\n" "L\215\331FBFBFABiACKAC\n" "L\215\364AFBAFBFBMBAC\n" "L\216\120ACACACACACFB\n" "L\216\125FBBFBMFFAFJC\n" "L\216\207BFBIALAcAfCBAC\n" "L\216\214CFFFBMFMFBMF\n" "L\216\225BFBFCAFBACLB\n" "L\216\240CCICAFAcAfCAcAfC\n" "L\216\262FBMFFFBBMBFF\n" "L\216\274CCIBMFFBBCAF\n" "L\216\317FBFABMFFACCC\n" "L\217\101BFBMFBACFJLC\n" "L\217\117ABMBBFABAAAC\n" "L\217\127ABAFBFFFFBAC\n" "L\217\172AABAJFBBMFFF\n" "L\217\207JBBFABMFFFAC\n" "L\217\213BMFFFBFABMFF\n" "L\217\237JMFFCAFFJCFaJ\n" "L\217\266BCABFaBMFAFFBg\n" "L\217\273BMFFBMFFBMFF|y5-y1\n" "L\217\304CAJCFBFBBFJL\n" "L\217\305ABAFBFFFACCC\n" "L\217\311FJBMFBCABMFF\n" "L\217\317CAFBACBFJFBF\n" "L\217\330CFFFBMFFBFBF\n" "L\217\331CFFFBMFMgABMF\n" "L\217\333AFaBMBFACbgAAAC\n" "L\217\364BMBFFBFaBMFFF\n" "L\220\101FBACFBBMFFFL\n" "L\220\102FJFjCFBBMFFFL\n" "L\220\130FBACFBACFBAC\n" "L\220\146CFFFBMFACAAA\n" "L\220\161MFFFBIBMFFBC\n" "L\220\174FBMJLFFAFBFF\n" "L\220\213CAFACbgAAACCFacaCf\n" "L\220\217FaCdBAFBMFFCFacaCf\n" "L\220\260BMFFFBFFBMFF\n" "L\220\305AFBACCABMFJL\n" "L\220\342AcAfCBACAFaMBFL\n" "L\221\120CAFFFBCAFBMF\n" "L\221\122AFaCCFJCCACCC\n" "L\221\141FaBFBIFBMFBAC\n" "L\221\151CFFFBMFAJFBC\n" "L\221\156ACFMFFJBMFBB\n" "L\221\162FBBMFBMFFBiAC\n" "L\221\222FBBFAFaCALFJB\n" "L\221\225BCIFBFBFABiAC\n" "L\221\252CCIBMFFFACBB\n" "L\221\256MFJABMFBMBIC\n" "L\221\265FBICAFBMFFBB|j2-y3\n" "L\221\270CAFBMJLFFFBC\n" "L\221\302FaCdBJFBMFFFBF\n" "L\221\304ACBFJFBFBMFF\n" "L\221\326FFJCFFJCBMFF\n" "L\221\335ABFCCBMFFFAC\n" "L\221\340FaCdBCAFACbgAAAC\n" "L\222\102FBFCAFFFBCFacaCf\n" "L\222\111FBACJMFFJMFF\n" "L\222\132AFFJCFBMFCAF\n" "L\222\145MFBmgCCABMFFFB\n" "L\222\161AFFJCBMFBMFF\n" "L\222\170MFJCAFFFBCFacaCf\n" "L\222\205CAFBFFABMFFF\n" "L\222\231BMFFFACBBFaFB\n" "L\222\251FBBMFFFBJMFF\n" "L\222\264FBFBFACMgABMF\n" "L\222\311BFJCIFaCBMFFB\n" "L\222\313FBIBFaFACbgAAAC\n" "L\222\347FBIBMFFFBFJC\n" "L\222\361FBIBMFFFBFJC|j2-y3\n" "L\222\366AFBACBMFFBFF\n" "L\223\141MJFBBFACJFlFaC\n" "L\223\156CCIBFJFBBFFaC\n" "L\223\157FaCACAFBMFCAF\n" "L\223\203FBIFBBACFBMF\n" "L\223\213FBIFBBACFBMF|j2-y3\n" "L\223\217FBACFBMFFBAC\n" "L\223\222CCIBMFFBAFaAA\n" "L\223\227BFJCIFBMFCAF\n" "L\223\231AFBAFBFBFFBC\n" "L\223\232AFBAFBACFBMF\n" "L\223\233AFBAFBBMFBMF\n" "L\223\235AcAfCBACBFAfCJL\n" "L\223\266BFCAFBMFFBFF\n" "L\223\271CAFABMFFFCFacaCf\n" "L\223\335ACFFBCAIALBL\n" "L\224\160BFJFaCACAFFJL\n" "L\224\175BcJFFBBFFFBAC\n" "L\224\203BMBBFBMFFFAC\n" "L\224\216FBFBMFFBCFBC\n" "L\224\321ACBMFFBiCFJFaC\n" "L\224\323BMFFAFaBMBFJL\n" "L\224\324ACAFBACBMBFF\n" "L\224\330BFJBACBMFBIC\n" "L\224\337JFFFBFFFALCC\n" "L\224\340FMFJJFFIBFFF\n" "L\224\357MFBmgJBBMFFFAC\n" "L\224\365ABFBBFABMFFB\n" "L\225\135CFFFBMFFCAFB\n" "L\225\170BBFaFBMFBMBFF\n" "L\225\201CAFBBCAFBMFF\n" "L\225\234AABAFBMFFAFaC\n" "L\225\235BMBFBMFBMBFF\n" "L\225\265FBFaBCCCCACMgJ\n" "L\225\273FBIBMFFFJFagAA\n" "L\225\325FMFJBMFBBCFacaCf\n" "L\225\342BFaBACFBMFFBC\n" "L\225\345FBBBMFFFACMgJ\n" "L\225\361FBFCAFFBMgBFaC\n" "L\226\124ABBFCABFaBFFbgA\n" "L\226\130BMBBMFFBMFFF\n" "L\226\137FBACFFFJCFFB\n" "L\226\146ABiCMgJBMFFFAC\n" "L\226\236CCIFBBFBMBLB\n" "L\226\263AFFBBBBFACCC\n" "L\226\271BcJFFaBFJCBMFF\n" "L\226\371ACBACFBMFFBB\n" "L\227\120ABgACAFBMJLFF\n" "L\227\124BFaBACACACBMF\n" "L\227\126BFMgJAFFaBgFCFacaCf\n" "L\227\131FJAfCABAFBFFF\n" "L\227\147FBIBMFFFJFagAA|j2-y3\n" "L\227\150FBIACCAFFBLB|j2-y3\n" "L\227\164FBBFBBFLFBAC\n" "L\227\172FaCdBBMFFFAFagAA\n" "L\227\215AcAfCBACAFaCBMF\n" "L\227\216FBBCCIAFaCBMF\n" "L\227\222BLBJFkABMFBIC\n" "L\227\237BFJCIAFBACBB\n" "L\227\260FJBMFBFAfCJBL\n" "L\227\312BMFFFBMFFBFF\n" "L\227\333BMBFFCIACFBF\n" "L\227\364FAFaCBBBFABiAC\n" "L\230\114BFJBMFFBiCFaCbgB\n" "L\230\146FBMFIKACALCC\n" "L\230\160CCIBFJBACMFBmg\n" "L\230\162JMFFBBFaJFjCML\n" "M\210\244ACCABFaALCCAFaC\n" "M\210\303BMFFBFCAFBMFF\n" "M\210\323BFCAFBMFFALCC\n" "M\210\341BMFBMFFBFBCFacaCf\n" "M\211\200BMFBFBMFABACF\n" "M\211\214CAJCFBMBBFFBF\n" "M\211\216ABgAFBFBMFABiAC\n" "M\211\223FBFBMFABACCFacaCf\n" "M\211\224ACFFBCAIACBMF\n" "M\211\226FBIAFBMFBMBBF\n" "M\211\311BMFFMFBFFMFFaC\n" "M\211\320BFaBCBMBFBMBMF\n" "M\211\353FBFBAABAFBFFF\n" "M\211\360AFaJMBFFMgAAFFB\n" "M\211\362FBIABMBFFJLAfC\n" "M\212\123ACBMFFBiCFBFJL\n" "M\212\131CFFFBMFBFAcAAC\n" "M\212\162FBMFFFBBFACAC\n" "M\212\165FaCdBFBMFBMALFB\n" "M\212\171ABMFFCIACFBAC\n" "M\212\212CCIBMBFBFaBLFF\n" "M\212\214BFaBACBMFFAMgAL\n" "M\212\251AFFJBBFBFFFMgJ\n" "M\212\260BBFaFBBBMFFFAL\n" "M\212\262FBBMFFFBACFFB\n" "M\212\264JFFBMFKACALCC\n" "M\212\277CCIFBBBMFFFJC|y10-j7\n" "M\212\346FFJBiFABMFFFAC\n" "M\212\374BFAfCFBBBFFBAC\n" "M\213\140CAFBFFAFBIKAC\n" "M\213\154CFFFBMFFBFBMF\n" "M\213\306BBCAFCAFFFBAC\n" "M\213\311FBACFBMgBMFFaCF\n" "M\213\326FBACFBACFFBAC\n" "M\213\360BMFFBMBICALCC\n" "M\213\361BFJFaFLBMFBmFAC\n" "M\214\103FBBFBMFFBABAL\n" "M\214\121MFFJBMFCAFFFB\n" "M\214\130ABALFABMFFFAC\n" "M\214\147FBIABBFBFFFAFafag|j2-y3\n" "M\214\160AcAfCBACCAFBACL\n" "M\214\206ABJFjCFBFBFBAC\n" "M\214\231BcJFCAFMFFBBAC\n" "M\214\243FBBMCAFFBFJCC\n" "M\214\246AcAfCBACBMFBMFF\n" "M\214\255BMFBFBMFMFCFacaCf\n" "M\214\271CCIFJBBMFFBAC\n" "M\214\326CFFFBMFFJCFFBmg\n" "M\214\333FBFBMFCAIFBFaC\n" "M\214\351FBBFFFACFABMF\n" "M\215\141CCIFBBFFBMBFF\n" "M\215\172ACFFBCAIBFJAfC\n" "M\215\230JMFFFBMBBFAcJF\n" "M\215\302ABFBFFBMFFFAC\n" "M\215\303ABBLBABBFBFFF\n" "M\215\316BFBFJFFBACCAC\n" "M\215\332FBFFBMFFFBKAC\n" "M\215\337BMBBFJFFIBFFF\n" "M\215\357FBIBBFaJLAFBFF|j2-y3\n" "M\216\153BMFBMFBBMFBMF\n" "M\216\215CFFFBMFFBFFBC\n" "M\216\216CFFFBMFFFBIKC\n" "M\216\221CIAFaJCBMFFFAC\n" "M\216\224ACBMFFBiCMFBMF\n" "M\216\234CAFAcAfCAcAfCALCC\n" "M\216\253AFBBMFBFCAFFB\n" "M\217\104AFBACBAJCALCC\n" "M\217\126FBMJLFFAJCBCB\n" "M\217\200CCIABAFBFFFFB\n" "M\217\220BMBBFFBFABMFF\n" "M\217\235ABAFBMFFFAMAA\n" "M\217\247BCIACCAFBCFJC\n" "M\217\306BMFFMgABMFACCC\n" "M\217\332CFFFBMFCAFFFB\n" "M\217\366FBBFaBgFaAFFACCC\n" "M\217\374ACBMFFBiCAFBMB\n" "M\220\107AFaJMBFFBMFBIC\n" "M\220\121BBFaBCIMFFBFaFaC\n" "M\220\124ACBFBBMFFFFAC\n" "M\220\126BFCAFFBACAJFB\n" "M\220\207BMFFFAFFBBFBF\n" "M\220\224CAFBACAcJFAFJK\n" "M\220\250FBFJLFBIJFlCMgJ\n" "M\220\271FBFFIBBMFFBFF\n" "M\220\275CFFFBMFJFMKAC\n" "M\220\325BMFBFBIBFJBAC\n" "M\220\333FBIFBFFIBCAAC|j2-y3\n" "M\220\337AFBAFBMFFBiCMB\n" "M\220\355CCABMFFFBFKAC\n" "M\221\102JMFFABMFFBFaAC\n" "M\221\110BMFBFBIFFFKAC\n" "M\221\124BFaBCCCABMFFFB\n" "M\221\131CAFLBJJMFFFBF\n" "M\221\155ABCABMBFFBMFF\n" "M\221\172FBACBMFFFALCC\n" "M\221\257BMFFFACFFBKAC\n" "M\221\261AcAfCBACFBFBFaJL\n" "M\221\271FBIBMFBMFFFAC|j2-y3\n" "M\221\330CCIFBBBFBFaBMB\n" "M\221\352CCIBFCAFBMFFL\n" "M\222\121BMFFBBBMFFFJC\n" "M\222\147BMFFACCAFFJFaC\n" "M\222\163BFJCIAFFJCBMF\n" "M\222\164AFBACABAFBFFF\n" "M\222\165BMBBFFBBMFFFL\n" "M\222\176FBBBFAcAfCBMBFF\n" "M\222\260JMFFBMFFFJMgAA\n" "M\222\265BMFBFBIJCILAC\n" "M\222\300ABAFBFBMFFFAC\n" "M\222\370AJMCBIAFBFFaFjC\n" "M\223\123ACFFBCAIAFFJC\n" "M\223\144FBFaBCCCCBMFFL\n" "M\223\150CCIACFFBACFBF\n" "M\223\255ABAFBMFFBFIMJ\n" "M\223\302BFFBACFaCBMFFF\n" "M\224\137BMBBFFFJFFBiAC\n" "M\224\231CCIFBBBMFFFJC|j7-y9\n" "M\224\253ACFFBCAIFBACF\n" "M\224\300FBIAJMCBIAFlFaC|j2-y3\n" "M\224\317CAJCFABMFFFAC\n" "M\224\320ACMJFABMFFFAC\n" "M\224\367AABBLBFJBiAFJK\n" "M\225\237BFaBCFBMFBMBFF\n" "M\225\240JMFFAFBMFFAFaC\n" "M\225\346FBBBMFFFACFBF\n" "M\226\114BMBBFFFBMFCAF\n" "M\226\117ACBMFFBiCAMgMFL\n" "M\226\213FBBBMFFFACBMB\n" "M\226\262FBBBMBBFAFaAFaC\n" "M\226\277BMFFJMFFBMBBF\n" "M\226\305CCIFJFBAJCCAC\n" "M\227\137CCAFACCFFFBMF\n" "M\227\141FaCFaBgFABMFFFAC\n" "M\227\165FBBBBFaACACBMF\n" "M\227\207BFaBACBMFFFBAC\n" "M\227\213FBFaBCCCCBMBFF\n" "M\227\217FBMJLFFAFaCBMF\n" "M\227\240BFBMFFBFFABiAC\n" "M\227\270BFJFaFLBMBFFMgJ\n" "M\227\351ACFFBCAIACCFaC\n" "M\227\351ACFFBCAIACFMgB\n" "M\227\353FBFaBCCCCACCFaC\n" "M\227\353FBFaBCCCCACFMgB\n" "M\227\365BFJCAFMFFBBAC\n" "M\230\110BMFBFBIAFaCBMF\n" "M\230\117FBACCAFBACAcJF\n" "M\230\142CFFFBMFAFBBMF\n" "M\230\144BMFFFACJFBMFF\n" "M\350\361ACAfCFABMFFFAC\n" "N\210\273AcAfCBACFBFJLAFaC\n" "N\210\333AcAfCBACABAFBFFF\n" "N\210\356AFBACACCABBMFF\n" "N\211\102FaCdBACCAMFFAMCC\n" "N\211\167BFBFFMgBCCCMFJC\n" "N\211\211CCIBBFaFBMBFFAC\n" "N\211\307BBFaFBBMFFFACMgA\n" "N\211\314FBMFBFBMFBAFaJC\n" "N\211\323AFBAFBBMFBBMFF\n" "N\212\124FBACMFFBiCFBFJL\n" "N\212\164BMFFBMFFAFaCBMF\n" "N\212\265ACBLMBFBMFFFAC\n" "N\212\307AFBAFBBBFaBMFMF\n" "N\212\326BMFFBMFFCAFFJC\n" "N\212\370BFMgJAFFBBFFFAC\n" "N\213\136ALAFFJCFaCFaBFJC\n" "N\213\231CCIAFaBMBFFACCC\n" "N\213\253FBIBFCAFBMFFJL\n" "N\213\342ACFFBCAIMFFBiAC\n" "N\213\354BFBFFMgBCCCFJCL\n" "N\214\352CFFFBMFFBMFBMF\n" "N\214\353CFFFBMFBMFLbFAC\n" "N\215\134FBACFBBFFBMBFF\n" "N\215\152AcAfCBACBMCAFBLB\n" "N\215\171FBMJLFFFBFAFaBgF\n" "N\215\213BFBMFBFaFACbgAAAC\n" "N\215\222FBFBFaAFBACJFlFaC\n" "N\215\223FBMJLFFAFBFBMF\n" "N\215\226ABgACFFFBMFFJKC\n" "N\215\260FFAfCABMBFFJLAfC\n" "N\215\333FaCdBAFaCCFaCFFBgAC\n" "N\216\100BBFaAFaCCFaCFFBAC\n" "N\216\107JFlFBACABAFBFFF\n" "N\216\132AFBAFBBMFFFFJB\n" "N\216\137FBMJLFFAfCJLAFaC\n" "N\216\217CFFFBMFFBFALCC\n" "N\216\223BFBIALABAFBFFF\n" "N\216\245FJBMFCAFAcAfCAcAfC\n" "N\216\275CCIFBACACBCAAC\n" "N\216\325BFJFBBFACCCCFacaCf\n" "N\216\355AFBACAFBMFFBFF\n" "N\216\371FBFaBCCCCFABMBB\n" "N\217\145ACFFBCAIBFAfCJL\n" "N\217\155BFBMFFaBgIJFlCFBF\n" "N\217\156BFBMFFaBgIJFlACCC\n" "N\217\217AcAfCBACFBFABMFF\n" "N\217\262BFCAFBMFFFBAAA\n" "N\217\341FaCdBBFCAFBMFFFB\n" "N\220\270CAFBACFBFFBMFF\n" "N\220\273AFFBMBBBBFABiAC\n" "N\220\276FBIAJFBCFFFBMF\n" "N\220\303FBFFBMFFAFaMFFB\n" "N\220\340CFFFBMFCABMFJL\n" "N\221\113ACFFBCAIFFFKAC\n" "N\221\114ACFFBCAIAFBFJL\n" "N\221\121CCIFBMFFFBAJFB\n" "N\221\167MFJCABMBFFBMFF\n" "N\221\215AcAfCBACACAfCBLCC\n" "N\221\230FBMBBFFBMFFCFacaCf\n" "N\221\234ABAFaBMBFACbgAAAC\n" "N\221\235FBICABMBFFBMFF\n" "N\221\236ACBCABMBFFBMFF\n" "N\221\312BFBFFMgBCCCFJCC\n" "N\221\324AfCBMFFALALALCC\n" "N\222\104FJCABAFBFFFFBC\n" "N\222\133BFCAIBLBFABMBB\n" "N\222\204BcJFBFCABMFBBMF\n" "N\222\245AABBLBFBFIAFJK\n" "N\222\320CCIFBFFBMFFFAC\n" "N\223\105FBIBFCABMFBBMF|j2-y3\n" "N\223\110CCIBFCABMFBBMF\n" "N\223\272ACFFBCAIBMFBMF\n" "N\223\277AABFBBMBBFALCC\n" "N\223\307CFFFBMFFBFBFaJL\n" "N\224\106CFFFBMFMgACALCC\n" "N\224\112BBFaALCCBMBBFFB\n" "N\224\257BFFFFAfCAAAFJFaC\n" "N\224\261BMBBFCFFFBMFBB\n" "N\224\264BMFFBMFFABFKAC\n" "N\224\350FJBMFABMBFFAFB\n" "N\225\100ABMFFFBMBFFFJK\n" "N\225\131CCIFBMBBFFFBAC\n" "N\225\205BFJABFBCBMACAC\n" "N\225\241BFaBACACBMFFAFaC\n" "N\225\267BMFFBMFFFBFFIB\n" "N\225\311FBFIABMFFFABMF\n" "N\225\347FBBBMFFFJCBACC\n" "N\225\351FBBBMFFFACBMFF\n" "N\226\154ABBBCAFCAFFFJC\n" "N\226\156BMFFBFFACCCFBF\n" "N\226\214JMFFFBBBMFFFJC\n" "N\226\235ACBBMFFBMBBFFaC\n" "N\226\237CCIBMFFBMBBFFaC\n" "N\226\301ACFFBCAIAFaCBMF\n" "N\226\302BMFABMFFFMgABCC\n" "N\226\310AcAfCBACABMFFBMB\n" "N\226\315FBACFBBBMFFFJC\n" "N\226\324AcAfCBACBMCAFBFL\n" "N\227\125CFFFBMFAFBACAFafag\n" "N\227\154FBACCAFFFBCIAC\n" "N\227\170BMFBFBIFaCBMFFB\n" "N\227\273ABFJCCABMFFBAC\n" "N\227\314ACCFaCFABMFFFAC\n" "N\227\314ACFMgBFABMFFFAC\n" "N\227\316AcAfCBACMFFBCIAC\n" "N\227\357FJFBACFBACBMFF\n" "N\227\360FJFBACFBACBFBF\n" "N\227\373AcAfCBACFBMFFBAC\n" "N\230\122CCIMFJFBMBCCCC\n" "O\210\324MFJFFBACFBCALCC\n" "O\210\342BMFBFBMFFFACCFacaCf\n" "O\211\145BMFFBFBMFBACAAA\n" "O\211\163ACFFBCAICABMFJL\n" "O\211\171CFFFBMFBMFFAMgAL\n" "O\211\173BMFFBMFFCABMFJL\n" "O\211\217AcAfCBACMFFACbgAAAC\n" "O\211\241FBACFBBFBMBFFAC\n" "O\211\255ABBFCAFBMFFACCC\n" "O\211\322AFBACBBFaFACbgAAAC\n" "O\211\333CFFFBMFBMFFFBAC\n" "O\211\354ACBMFFBiCAFBAKAC\n" "O\212\155FJBMFBFaJBAFBFFF\n" "O\212\203CCIABFMFFAMgACCC\n" "O\212\275AFFJBBFBFFFAFaJK\n" "O\212\304BFBMFBFAFFBMBBF\n" "O\212\311AcAfCBACACCAFFJFaC\n" "O\212\355BMFBMFFJCBMFBMF\n" "O\212\360BcJFFBFBMFCAFBMF\n" "O\213\120BCAFJBiBFaFBMFFFB\n" "O\213\126ABCAFBFFAFBICAC\n" "O\213\131BFJFaFLBBCAIFKAC\n" "O\213\207BBFaALABMFFIAMFBmg\n" "O\213\331BMBMFBFFaCAcAfCBAC\n" "O\213\356BFBFFMgBCCCAMgBMF\n" "O\214\115AFBMFFBFIMgJACCC\n" "O\214\143BFJMBBFFaACfCCAFaC\n" "O\214\200BFJFaFLFACbgAAACBB\n" "O\214\202FBMFFFBAFlFaCAFFBg\n" "O\214\211CCIFBFFMgAAcAfCBAC\n" "O\214\240FBACAFFJBBFBFFF\n" "O\215\145AFBACBFBMFBMBMF\n" "O\216\102FBIBMFFFBFFIBFaC|j2-y3\n" "O\216\136FFJCFFJCBMFFFAC\n" "O\216\142FBMFFFBAJFBBMFF\n" "O\216\222BMFFFACBMFFAFcgCC\n" "O\216\277AJFBAJFBBMFFFAC\n" "O\216\357FBFBFACFBFFIBFaC\n" "O\217\201CCIBMFFBMgFFFBFF\n" "O\217\205CAFBMJLFFFBCCFacaCf\n" "O\217\224CFFFBMFFBFABMFF\n" "O\217\325AABAFBMFFBFIFFB\n" "O\217\334BCABFaBMFBMFFFAC\n" "O\217\372BMFMFJABMFBMBFC\n" "O\220\122BBFaACAFBACBMBFF\n" "O\220\153FBFaBCCCCFJFFBiAC\n" "O\220\237CCIFaCACAFBMFCAF\n" "O\220\277CFFFBMFFBFFBMFF\n" "O\220\366CCIFFJCFFJCBMFF\n" "O\220\374AcAfCBACABMFFBFaAC\n" "O\221\111MFLMFLFBBFACCFacaCf\n" "O\221\112FBMBBFFACMFLCFacaCf\n" "O\221\205FBACFBBMBBFBMFF\n" "O\221\240FBBJFBFBMFBFKAC\n" "O\221\370CFFFBMFFBBJFBMF\n" "O\222\116CFFFBMFABAFBFFF\n" "O\222\141CFFFBMFABFBFFaCaC\n" "O\222\153CFFFBMFCAJCCAJC\n" "O\222\222ACFFBCAIFFFJFBC\n" "O\222\223BFBFFMgBCCCCFBFF\n" "O\222\252CCIFBBMFFFBJMFF\n" "O\222\262CFFFBMFJMFBFBMF\n" "O\222\304FaCdBCAFACbgAAACFBF\n" "O\222\367AcAfCBACBFCABFaBMB\n" "O\223\107BFCABMFBBMFAFJK\n" "O\223\117AABBFAfCBMFFAFJK\n" "O\223\120FBIBFAfCBMFFAFJK|j2-y3\n" "O\223\234CAFBACBFJFbFFBMF\n" "O\223\245BMFBFBIBFaACBMFF\n" "O\223\261CAFABMFFFCFacaCfFBC\n" "O\223\352AcAfCBACBMFFBMFFL\n" "O\224\115FBFALFBIJFlCACCC\n" "O\224\171JFFIBFFFFBMFFFB\n" "O\224\205BMFFFACBFCAFBMF\n" "O\224\240AFBAFBFBACBMFFF\n" "O\224\315AFBAFBFBMFFFBMgL\n" "O\224\325AJMCBIJLFaCBMBBF\n" "O\224\353BMBBFAfCBMFFALAL\n" "O\225\127FBACFBMBBFFFBAC\n" "O\225\157BBFaFBACABMFFFAC\n" "O\225\176FBMFFBCBFMgJAFJK\n" "O\225\206BFJFaFLBMBFFBMFF\n" "O\225\212BMFFFACFFBFBIKC\n" "O\225\221AFFBBBBFAFaCFBFB\n" "O\225\254BMFFBFBBBMFFFAC\n" "O\225\255FBIFBFBBBMFFFAC\n" "O\225\256BACFBFBBBMFFFAC\n" "O\225\274BCABMBACAFACBMB\n" "O\225\276BCABMBACAFACFJB\n" "O\225\322AcAfCBACFMFJBMFBB\n" "O\225\334ACFBFBMFFBMFFBC\n" "O\225\344AFBACFBMFFBALCC\n" "O\226\112BFABBMFFBACABiAC\n" "O\226\134BMFFFBBFACBCIAC\n" "O\226\157FBIBBCAFCAFFFJC|j2-y3\n" "O\226\200BFJFBACFBACAFFBg\n" "O\226\243ABMBFFJLAfCFFBAC\n" "O\226\331BMFFBFIFJCCACCC\n" "O\227\112FABMFFBFaALCCAFaC\n" "O\227\161BBFaALCAFBFFACCC\n" "O\227\173CAFBFFACBMFFBiAC\n" "O\227\232MFJAABAFBMFFAFaC\n" "O\227\266BFJFaFLBMBFFALCC\n" "O\227\276BBFaFJCCABMFFBAC\n" "O\227\326FBMFFFBACFBMFBB\n" "O\227\354FBFaBCCCCFFBBCAF\n" "O\230\137CFFFBMFACFBMFBB\n" "P\210\334AcAfCBACBMFBMFFBFB\n" "P\211\161AABBMFBMFFBFBFFBg\n" "P\211\257ACBBFCAFBMFFACfCC\n" "P\211\270AFBACACCAMFFALCC\n" "P\211\363FBIFBBMBBFBFABiAC\n" "P\211\371ACBFBBMBBFBFABiAC\n" "P\212\154ABgAFBBABAFBFFFFaC\n" "P\212\266ACBJFFBMFCACACfCC\n" "P\212\322BMBBFFBMFABACCFacaCf\n" "P\212\331ACBMFFBiCBBFaBMFMF\n" "P\213\100FBACAcAfCAcAfCFJCKAC\n" "P\213\264FBACAFJCBMFBMBMF\n" "P\213\273ABFFBMFBMFMFFFAC\n" "P\213\303CIALAFFJCFaCFaBFJK\n" "P\214\117FBBAFBMFFBFFACCC\n" "P\214\145AFBBMFABMFFFALCC\n" "P\214\203CCIABMFFBFMgJAFJK\n" "P\214\233BBFaFBFFBMBBFALCC\n" "P\214\253BFBMFBFFaCBMFFFAC\n" "P\215\164AABAFaBMBFFFJCFFBg\n" "P\215\244ACCACbgAAMFFBiACFBF\n" "P\215\366ACFFBCAIFBBFBMFF\n" "P\216\220CFFFBMFCIAFaJCBMF\n" "P\216\362ABFAFaBCCCCFABMBB\n" "P\216\367FBACFBFBMFCAIFBC\n" "P\217\142CCABMBFFFBMFFJKC\n" "P\217\143AcAfCBACAABCAFBFJC\n" "P\217\353FBIBFACFBBFFABiAC\n" "P\217\354BcJFBFACFBBFFABiAC\n" "P\217\371ACFFBCAIBBFaFBFJC\n" "P\220\144FBBBFCAFFBACAJFB\n" "P\220\145BFCAFFBACBMFFFJL\n" "P\220\216ACFFBCAIAFFBBFBF\n" "P\220\256FBMFBACAFACFBFBF\n" "P\220\317AFBACFBFFBMFFFAC\n" "P\221\105FBBBFJMBBFFBmgACCC\n" "P\221\200FBIBMFBMFBMFFBAC|j2-y3\n" "P\221\367CCIBMBBFAMgBMFBIC\n" "P\222\144FBIBFBMBMFFBMFFF\n" "P\222\172AFBAFBFBIJFlCFBAC\n" "P\223\252FBMFCAIFABMFFFAC\n" "P\223\304AFBAFBBMBFFMgACCC\n" "P\223\334BMFFFBFaBCCCCFFAfC\n" "P\224\122CAJCJFjCCFJCCACCC\n" "P\224\132CCIBMBBFFFJFFBiAC\n" "P\224\226FBBCCIFBMFFBCFBC\n" "P\224\233AcAfCBACFBMFFBCFBC\n" "P\224\311AFAcMBFAFACAcAfCBAC\n" "P\224\360MFJBMFBFCAFFBCFacaCf\n" "P\225\231FBBBMFBFBIAFaCBMF\n" "P\225\261FJCABAFBFFFBMBFF\n" "P\225\307MFJBMFBFCAFFBFBF\n" "P\226\104AcAfCBACAFaCFFFBCFacaC\n" "P\226\143JMFFFBFBMFCAIAAA\n" "P\226\144CFFFBMFFBBFFFBAC\n" "P\226\201BFJFBACFBACFABMF\n" "P\226\362FBBABMFFCIACFBAC\n" "P\227\100CFFFBMFACFBMFFBB\n" "P\227\101FBMFFFBACFBMFFBB\n" "P\227\132FBMFBMJLFBBMFBIC\n" "P\227\151FBIBFAcAfJABAFBFFF\n" "P\227\167CFFFBMFACCAFFBLB\n" "P\227\212FBMFBACFABMFFFAC\n" "P\227\264FBCAFBMFFFLbFLFFF\n" "P\227\327FaCdBCAFBACAFaCFBFB\n" "P\227\352FBFFFBACMFFBCIAC\n" "P\230\102ACFFBCAIFBMFFBAC\n" "P\230\136ACFFBCAIMFFBCIAC\n" "Q\212\144BMFFBFJBACFBFJBAC\n" "Q\212\215FBMFFFBBBFaFBFFBMF\n" "Q\212\302FBFIBMBBFFBMFABAC\n" "Q\212\330FBBMFFFBBMFBMFFLB\n" "Q\213\133FBIALAFFJCFaCFaBFJC|j2-y3\n" "Q\213\135AFBICAFBFFAFBgICAC\n" "Q\213\270AFFJCAFACBMFBMBMF\n" "Q\213\336CFFFBMFFBBBMFBFFF\n" "Q\214\252CFFFBMFCAFMFFBBAC\n" "Q\214\256ACFFBCAIMFFFFBFaFaC\n" "Q\214\265CCAFJFBFBFFIBAFAC\n" "Q\215\165CFFFBMFFBBFFBMBFF\n" "Q\215\167BMFFFACFBBFFBMBFF\n" "Q\215\247ACCACbgAAMFFBiACALCC\n" "Q\216\103FBIBBFaAFaCCFaCFFBAC|j2-y3\n" "Q\216\323CFFFBMFABMFFFAFBC\n" "Q\216\335ACCABMBBFMFFBiCFBC\n" "Q\217\130FBMJLFFABMBFFJLAfC\n" "Q\217\153AcAfCBACBBFaABFABMFF\n" "Q\217\236ABBCABFaBMFBMFFFAC\n" "Q\217\312FJBMFABAFBFFFACCC\n" "Q\220\321AcAfCBACFBFFBMFFFAC\n" "Q\221\100AcAfCBACFBFBBCAIKAC\n" "Q\221\116AFaBMBFFBCCCCAFFFB\n" "Q\221\207CAJCBMFBMFBMFFBAC\n" "Q\221\232FBFaBCCCCFBACBMFFF\n" "Q\221\363CCIMFFMFFABAFBFFF\n" "Q\222\142ACFFBCAIABFFIAFlFaC\n" "Q\222\256FBFFIBFBBMBBFBLCC\n" "Q\223\243JMFFCAFFJCCFFFBMF\n" "Q\223\265BMFFFBFCAFBMFFBFF\n" "Q\225\160BFBFBACAFABMFFFAC\n" "Q\227\104ABFABMFFAFaALCCAFaC\n" "Q\227\203MCIMCIBMBFFFBBFAC\n" "Q\227\227BFBMFBFAFFBMFFFJL\n" "Q\227\303BFJCIFJCCABMFFBAC\n" "Q\227\344BLBACCFaCFABMFFFAC\n" "Q\227\344BLBACFMgBFABMFFFAC\n" "Q\227\356BFBFCAFBACLBACCFaC\n" "Q\227\356BFBFCAFBACLBACFMB\n" "Q\350\117ACFFBCAIBMBFBMBMF\n" "R\212\156AFBACFBBABBFBFFFFaC\n" "R\212\172BBFaJFaCBMFFABMFFFAC\n" "R\212\310AFBAFBBMFFBMFFBMFF\n" "R\212\317AFFJBBFBFFFBMFFFJL\n" "R\212\347BFCAFJAAAFABMFFFAC\n" "R\213\122FBBFFMgBCCCFJCFBMFB\n" "R\213\335BFaBACFBACFBACFFBAC\n" "R\214\260BMFFBBCAIFABMFFFAC\n" "R\214\261BFBFFMgBCCCACFBMFJC\n" "R\215\275ACFFBCAIBCABMFFFAC\n" "R\217\165BMFFFACCABFaJFjCFBFB\n" "R\220\104AcAfCBACBFCAFBMFFKAC\n" "R\220\105FBFFIBBFCAFBMFFKAC\n" "R\221\125AcAfCBACCAFFFBCAFBMF\n" "R\221\142FJBMFFBACFBACFaBFAC\n" "R\221\241BMFFFACCABMBFFBMFF\n" "R\221\325FBFBMBFFFBFBFACKAC\n" "R\221\350BMFFFBFACFABMFFFAC\n" "R\222\246AABBLBFBFFAFACALCC\n" "R\222\301ACFFBCAIFBBMFFFFAC\n" "R\223\254BMFFBMFFFBMFCAIFBC\n" "R\223\357FBBBMFFFJCABBFBFFF\n" "R\224\313FBBCCIACAFBACBMBFF\n" "R\225\210CFFFBMFCAFBBACBMFF\n" "R\225\242FBMBBFAABAFBMFFAFaC\n" "R\225\310BFJCIMFJBMFBFCAFFB\n" "R\225\353AFBAFBCCIFBMFFBFBC\n" "R\226\174ACAFBACBMBFFMCIMCI\n" "R\226\232FBBBMBAcAfCBACBMFBIC\n" "R\226\266FBFaBCCCCFaCFaBAFACMgJ\n" "R\226\374BFJCIACFBMCCAcAcALCC\n" "R\227\152BMFFMFFMFFABAFBFFF\n" "R\227\224CCIBFBMFBFAFFBMBBF\n" "R\227\243BFACLBBMAfCABBFBFFF\n" "R\227\306CAFBACBMFFFBMFFBFF\n" "R\227\325BFBMFBFAFBMFBMFBMF\n" "R\227\336CAFBACFJCFABMFFFAC\n" "S\211\103BFCAFBMFFBMFBMFFFAC\n" "S\212\350FJBBMFFBACFABMFFFAC\n" "S\213\276ACFFBCAIBFCAFBMFFJL\n" "S\214\112AcAfCBACBMFBMFBMFFBAC\n" "S\214\170FBBAMgBMFAFACCFFFBMF\n" "S\214\173ACCAFFJCABMFFFMgBCCC\n" "S\214\176AFaBMBFFBCCCBFBMFBAC\n" "S\216\243FACBMBACACACACFBFFC\n" "S\216\257CFFFBMFBFCAFBMFFKAC\n" "S\220\221BMBFBFaBMFFAFBMFFCFacaC\n" "S\220\243CCIFBMFBACFABMFFFAC\n" "S\221\224FBBCCIBMFBMFBMFFBAC\n" "S\221\237JMFFFBBJFBFBMFBFKJC\n" "S\224\145FBMBBFFBBFBMFFBJMFF\n" "S\224\232CAJCBMFFFBBFACBCIAC\n" "S\226\202BFJFBACFBACABMBFFAL\n" "S\227\205BMBBFAcAfCBACABAFBFFF\n" "S\227\355FBMCFBMCBFJMBBFABiAL\n" "T\213\143CFFFBMFCAFBFFAFBICAC\n" "T\213\243BFCAFBMFJBiBFCAFBMFJL\n" "T\213\277AcAfAMFFBiCFaCdBBFCAFBMFF\n" "T\214\234BMFFFLBACAAcAfCBACALCC\n" "T\214\354CFFFBMFFBBABAFBFFFFaC\n" "T\217\340ACFFBCAIBFCAFBMFFBFF\n" "T\217\367CFFFBMFBFACFBBFFABiAC\n" "T\217\370FBMJLFFBFACFBBFFABiAC\n" "T\220\320AFBAFBFFFBACFBBFBMFF\n" "T\223\253JMFFCAFFJCBFBFFMgACCC\n" "T\227\223FBACBMFFBMFFFBMFFBAC\n" "U\212\315AJMCBIBMBMFBFAFFBMBBF\n" "U\214\332FMFJABBFBFFFFABMFFFAC\n" "U\226\364BMFBFBIMFFMFFABAFBFFF\n" "U\230\111FBFaBCCCCBMFBFBIAFaCBMF\n" "V\213\301FBBAMgBMFAFACBFBFFMgACCC\n" "V\217\120BFCAFBMFFFBmFLFFFBFABiAC\n" "V\342\304AFBAFBBFCAFBMFFFBmFLFFF\n" "W\212\323ACFFBCAIBMBMFBFAFFBMBBF\n" kanjipad-2.0.0/jstroke/util.c0100664000076400007640000001126107045107466016065 0ustar otaylorotaylor/* -*- mode: C; c-file-style: "bsd"; tab-width: 4 -*- */ /* util.c - Functions shared between handwriting engine and UI * JStroke 1.x - Japanese Kanji handwriting recognition technology demo. * Copyright (C) 1997 Robert E. Wells * http://wellscs.com/pilot * mailto:robert@wellscs.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (gpl.html); if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Derived from prior work by Todd David Rudick on JavaDict and StrokeDic. * Makes use of KANJIDIC data from Jim Breen of Monash University. * Further credit details available at http://wellscs.com/pilot * See readme.txt, changelo, and gpl.html for more information. * -------------------------------------------------------------------------*/ #include "jstroke.h" #include "jstrokerc.h" /* ----- AppEmptyList ------------------------------------------------------*/ ListMem* AppEmptyList() { UInt iTotSize; ListMem* pListMem; CharPtr cpList; CharPtr* cppList; iTotSize = sizeof(ListMem) + 2 * sizeof(CharPtr) + 1; if (!(cpList = MemPtrNew(iTotSize))) { ErrBox("ERROR: no mem in top picks"); return NULL; } pListMem = (ListMem *) cpList; cpList += sizeof(ListMem); cppList = (CharPtr *) cpList; cpList += 2 * sizeof(CharPtr); pListMem->m_argc = 1; pListMem->m_argv = cppList; cppList[0] = cpList; cppList[1] = NULL; *cpList = '\0'; return pListMem; } /* ----- Angle32 ------------------------------------------------------------- * For given int xdif and ydif, calculate atan2 (the angle from origin) * in 32nd's of a circle from 0 to 32, rather than radians. Note that it * returns 32 iff xdif and ydif are both zero, an ill-defined case. * Origin and direction are clockwise: * 0 => 12:00, 8 => 3:00, 16 => 6:00, 24 => 9:00. * Why 32nds? So we can divide them into 8 pieces evenly, and so we get * 4x over-sampling for the 8th's in the path descriptions... * -rwells, 970713. */ Long Angle32(Long xdif, Long ydif) { Boolean xneg, yneg, xyflip; Long i32nd, xtmp, islope; if ((xneg = (xdif < 0))) xdif = -xdif; if ((yneg = (ydif < -0.1))) ydif = -ydif; if ((xyflip = (ydif < xdif))) { xtmp = xdif; xdif = ydif; ydif = xtmp; } if (xdif == 0) { if (ydif == 0) return 32; else i32nd = 0; } else { /* The 4 comparison values were generated with the accompanying * perl script, then open coded here for speed and reasonable * space efficiency. The values were chosen to make the results * match those of atan2 in rounded double * precision floating point. -rwells, 970713. */ islope = (100 * xdif) / ydif; if (islope < 54) { /* test #2, first test. */ if (islope < 10) /* test #0, second test. */ i32nd = 0; /* got #0 after 2 tests. */ else if (islope < 31) /* test #1, third test. */ i32nd = 1; /* got #1 after 3 tests. */ else i32nd = 2; /* got #2 after 3 tests. */ } else if (islope < 83) /* test #3, second test. */ i32nd = 3; /* got #3 after 2 tests. */ else i32nd = 4; /* got #4 after 2 tests. */ } if (xyflip) i32nd = (8 - i32nd); if (yneg) i32nd = (16 - i32nd); if (xneg) i32nd = (32 - i32nd); return i32nd % 32; } #ifdef FOR_PILOT_COMPAT /* ----- ErrBox ------------------------------------------------------------*/ void ErrBox(CharPtr msg) { fprintf(stderr,"%s\n",msg); } /* ----- ErrBox2 -----------------------------------------------------------*/ void ErrBox2(CharPtr msg1, CharPtr msg2) { fprintf(stderr,"%s\n%s\n",msg1,msg2); } #else /* !FOR_PILOT_COMPAT */ /* ----- ErrBox ------------------------------------------------------------*/ void ErrBox(CharPtr msg) { (void) FrmCustomAlert(alertID_ErrBox, msg, "", ""); } /* ----- ErrBox2 -----------------------------------------------------------*/ void ErrBox2(CharPtr msg1, CharPtr msg2) { (void) FrmCustomAlert(alertID_ErrBox, msg1, msg2, ""); } #endif /* FOR_PILOT_COMPAT */ /* ----- End of util.c ---------------------------------------------------- */ kanjipad-2.0.0/Makefile0100664000076400007640000000416407532224546014727 0ustar otaylorotaylorOPTIMIZE=-g -Wall #OPTIMIZE=-O2 GTKINC=$(shell pkg-config --cflags gtk+-2.0) -DG_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED GTKLIBS=$(shell pkg-config --libs gtk+-2.0) GLIBLIBS=$(shell pkg-config --libs glib-2.0) PREFIX=/usr/local DATADIR=$(PREFIX)/share # location in which binaries are installed BINDIR=$(PREFIX)/bin # location in which data files will be installed LIBDIR=$(DATADIR)/kanjipad # # On Win32, uncomment the following to avoid getting console windows # #LDFLAGS=-mwindows INSTALL=install ####### No editing should be needed below here ########## PACKAGE = kanjipad VERSION = 2.0.0 OBJS = kpengine.o scoring.o util.o CFLAGS = $(OPTIMIZE) $(GTKINC) -DFOR_PILOT_COMPAT -DKP_LIBDIR=\"$(LIBDIR)\" -DBINDIR=\"$(BINDIR)\" all: kpengine kanjipad jdata.dat scoring.o: jstroke/scoring.c $(CC) -c -o scoring.o $(CFLAGS) -Ijstroke jstroke/scoring.c util.o: jstroke/util.c $(CC) -c -o util.o $(CFLAGS) -Ijstroke jstroke/util.c kpengine: $(OBJS) $(CC) -o kpengine $(OBJS) $(GLIBLIBS) $(LDFLAGS) kanjipad: kanjipad.o padarea.o $(CC) -o kanjipad kanjipad.o padarea.o $(GTKLIBS) $(LDFLAGS) jdata.dat: jstroke/strokedata.h conv_jdata.pl perl conv_jdata.pl < jstroke/strokedata.h > jdata.dat install: kanjipad kpengine jdata.dat install -d $(DESTDIR)$(BINDIR) install -m 0755 kanjipad $(DESTDIR)$(BINDIR)/kanjipad install -m 0755 kpengine $(DESTDIR)$(BINDIR)/kpengine install -d $(DESTDIR)$(LIBDIR) install -m 0644 jdata.dat $(DESTDIR)$(LIBDIR)/jdata.dat clean: rm -rf *.o jdata.dat kpengine kanjipad $(PACKAGE).spec: $(PACKAGE).spec.in ( sed s/@VERSION@/$(VERSION)/ < $< > $@.tmp && mv $@.tmp $@ ) || ( rm $@.tmp && false ) dist: $(PACKAGE).spec distdir=$(PACKAGE)-$(VERSION) ; \ tag=`echo $$distdir | tr a-z.- A-Z__` ; \ cvs tag -F $$tag && \ cvs export -r $$tag -d $$distdir $(PACKAGE) && \ cp $(PACKAGE).spec $$distdir && \ tar cvf - $$distdir | gzip -c --best > $$distdir.tar.gz && \ rm -rf $$distdir distcheck: dist distdir=$(PACKAGE)-$(VERSION) ; \ tar xvfz $$distdir.tar.gz && \ cd $$distdir && \ make && \ cd .. && \ rm -rf $$distdir .PHONY: dist distcheckkanjipad-2.0.0/README0100664000076400007640000000745107532223032014136 0ustar otaylorotaylorKanjiPad -------- KanjiPad is a very simple program for handwriting recognition - The user draws a character into the box, then requests translation. The best candidates are displayed along the right hand side of the window and can be selected for pasting into other programs. It is meant primarily for dictionary purposes for learners of Japanese - it does not support entering kana, so it's usefulness as an input method is limited. Furthermore, if you already know the reading of a character, conventional pronunciation based methods of entering the character are probably faster. The handwriting recognition algorithms were invented by Todd David Rudick for his program JavaDict: http://www.cs.arizona.edu/japan/JavaDict/ and translated into C by Robert Wells for his program JStroke: http://www.wellscs.com/pilot/ JStroke runs on Pilot handheld computers. The contents of the jstroke/ subdirectory are from the JStroke distribution. KanjiPad works fine with a mouse. However, drawing characters is faster, more accurate, and more fun with a graphics tablet. (I use the Wacom Artpad II, available for about US $110.00) For more information about using graphics tablets with X Windows, see the XInput HOWTO at: http://www.gtk.org/~otaylor/xinput/XInput-HOWTO.html Availability ------------ The latest version of KanjiPad is available from http://fishsoup.net/software/kanjipad/ Prerequisites ------------- KanjiPad uses the GTK+ toolkit, version 2.0; it's been mostly developed on Unix and Linux, but with version 2.0 of GTK+, it can also be used on Microsoft Windows. GTK is available from: ftp://ftp.gtk.org/ Information about GTK+ on Win32 is available at: http://www.gimp.org/~tml/gimp/win32/ Note that you'll need the GTK+-2.0 packages, not the GTK+-1.3.0 version. Perl is also required to build the file 'jdata.dat'. Information about perl is available from http://www.perl.com GNU make is required for building KanjiPad. You probably already have this installed, but if not, you can get it from: http://www.gnu.org/software/make/ Installation ------------ * Make sure that pkg-config is in your path, and if you installed GTK+ in a different prefix than pkg-config, that PKG_CONFIG_PATH includes /prefix/of/gtk/lib/pkgconfig. * Edit the makefile and check that BINDIR and LIBDIR are set to the location where you want to install KanjiPad. * Build the program make [ Become root if necessary ] make install Use --- Draw your character into the large box, and click on "引" (The upper button, abbreviating "look up") The use of Japanese abbreviations is for space reasons. I may eventually replace them with graphical icons. The characters used were picked rather casually. If you know of better characters to use for these purposes, please let know. Candidates will appear in the box to the right of the main area. Click on the desired character to select it for pasting into other programs. (Typically, pasting the selection is done in X by clicking the center mouse button.) To clear and start over, click on "消" (The lower button, abbreviating "clear") To quit select "Close" in the file menu. "Save" in the character menu will write out the points in the character, and the selected character to a file "samples.dat" in the current directory. This is intended for making a file of characters for automated testing. If "Annotate" in the character menu is selected, the strokes will be annotated with their order. License ------- KanjiPad is Copyright 1997-1999, 2002 Owen Taylor, and licensed under the terms of the GNU Public License. See the file COPYING for details. See the file jstroke/readme.txt for information about the license and copyright of JStroke. Owen Taylor October 27, 1997 March 19, 1999 [ update for GTK+-1.2 ] August 25, 2002 [ update for GTK+-2.0 ] kanjipad-2.0.0/TODO0100664000076400007640000000142607045107463013752 0ustar otaylorotaylorKanjiPad enhancements --------------------- * GNOME-ize KanjiPad * Add command line options to point to the data file * Work some more on thinning and see if we can make it work OK. (Though not really needed for speed) * Options dialog - Thinning Data file location Immediate lookup as user writes the character? * Write a browser for sample files * Automatic test program running engine against sample files * Make strokes thicker - calligraphic ? Integrate with gsumi??? ;-) * Allow entering multiple characters and storing them for pasting as a bunch into another application Enhancments in cooperation with JavaDict and JStroke ---------------------------------------------------- * Kana * Stroke count error tolerance * Recognizing ligatures (radical based methods?) kanjipad-2.0.0/conv_jdata.pl0100775000076400007640000000104007444506511015722 0ustar otaylorotaylor#!/usr/bin/perl -w @chars = (); $line = 0; binmode STDOUT; while (<>) { $line++; next if !/^\s*\"/; $data = eval $_; if (!defined $data) { die "Could not parse line $line: $!"; } $strokecount = ord(substr($data,0,1)) - ord('A') + 1; if (!defined $chars[$strokecount]) { $chars[$strokecount] = ""; } $chars[$strokecount] .= substr($data,1,-1); } for (0..$#chars) { if (defined $chars[$_]) { print pack("NN",$_,length($chars[$_])+1); print $chars[$_]; print "\0"; } } print pack("NN",0,0); kanjipad-2.0.0/kanjipad.c0100664000076400007640000004120007532224546015204 0ustar otaylorotaylor/* KanjiPad - Japanese handwriting recognition front end * Copyright (C) 1997 Owen Taylor * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include "kanjipad.h" typedef struct { gchar d[2]; } kp_wchar; #define WCHAR_EQ(a,b) (a.d[0] == b.d[0] && a.d[1] == b.d[1]) /* Wait for child process? */ /* user interface elements */ static GdkPixmap *kpixmap; GtkWidget *karea; GtkWidget *clear_button; GtkWidget *lookup_button; GtkItemFactory *factory; #define MAX_GUESSES 10 kp_wchar kanjiguess[MAX_GUESSES]; int num_guesses = 0; kp_wchar kselected; PadArea *pad_area; /* globals for engine communication */ static int engine_pid; static GIOChannel *from_engine; static GIOChannel *to_engine; static char *data_file = NULL; static char *progname; static void exit_callback (); static void copy_callback (); static void save_callback (); static void clear_callback (); static void look_up_callback (); static void annotate_callback (); static void update_sensitivity (); static GtkItemFactoryEntry menu_items[] = { { "/_File", NULL, NULL, 0, "" }, { "/File/_Quit", NULL, exit_callback, 0, "", GTK_STOCK_QUIT }, { "/_Edit", NULL, NULL, 0, "" }, { "/Edit/_Copy", NULL, copy_callback, 0, "", GTK_STOCK_COPY }, { "/_Character", NULL, NULL, 0, "" }, { "/Character/_Lookup", "L", look_up_callback }, { "/Character/_Clear", "X", clear_callback }, { "/Character/_Save", "S", save_callback }, { "/Character/sep1", NULL, NULL, 0, "" }, { "/Character/_Annotate", NULL, annotate_callback, 0, "" }, }; static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]); static void karea_get_char_size (GtkWidget *widget, int *width, int *height) { PangoLayout *layout = gtk_widget_create_pango_layout (widget, "\xe6\xb6\x88"); pango_layout_get_pixel_size (layout, width, height); g_object_unref (layout); } static gchar * utf8_for_char (kp_wchar ch) { gchar *string_utf; GError *err = NULL; gchar str[3]; str[0] = ch.d[0] + 0x80; str[1] = ch.d[1] + 0x80; str[2] = 0; string_utf = g_convert (str, -1, "UTF-8", "EUC-JP", NULL, NULL, &err); if (!string_utf) { g_printerr ("Cannot convert string from EUC-JP to UTF-8: %s\n", err->message); exit (1); } return string_utf; } static void karea_draw_character (GtkWidget *w, int index, int selected) { PangoLayout *layout; gchar *string_utf; gint char_width, char_height; gint x; karea_get_char_size (w, &char_width, &char_height); if (selected >= 0) { gdk_draw_rectangle (kpixmap, selected ? w->style->bg_gc[GTK_STATE_SELECTED] : w->style->white_gc, TRUE, 0, (char_height + 6) *index, w->allocation.width - 1, char_height + 5); } string_utf = utf8_for_char (kanjiguess[index]); layout = gtk_widget_create_pango_layout (w, string_utf); g_free (string_utf); x = (w->allocation.width - char_width) / 2; gdk_draw_layout (kpixmap, (selected > 0) ? w->style->white_gc : w->style->black_gc, x, (char_height + 6) * index + 3, layout); g_object_unref (layout); } static void karea_draw (GtkWidget *w) { gint width = w->allocation.width; gint height = w->allocation.height; int i; gdk_draw_rectangle (kpixmap, w->style->white_gc, TRUE, 0, 0, width, height); for (i=0; iwindow, event->width, event->height, -1); karea_draw (w); return TRUE; } static int karea_expose_event (GtkWidget *w, GdkEventExpose *event) { if (!kpixmap) return 0; gdk_draw_drawable (w->window, w->style->fg_gc[GTK_STATE_NORMAL], kpixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return 0; } static int karea_erase_selection (GtkWidget *w) { int i; if (kselected.d[0] || kselected.d[1]) { for (i=0; iy / (char_height + 6); if (j < num_guesses) { kselected = kanjiguess[j]; karea_draw_character (w, j, 1); if (!gtk_clipboard_set_with_owner (clipboard, targets, G_N_ELEMENTS (targets), karea_primary_get, karea_primary_clear, G_OBJECT (w))) karea_primary_clear (clipboard, w); } else { kselected.d[0] = 0; kselected.d[1] = 0; if (gtk_clipboard_get_owner (clipboard) == G_OBJECT (w)) gtk_clipboard_clear (clipboard); } update_sensitivity (); gtk_widget_queue_draw (w); return TRUE; } static void exit_callback (GtkWidget *w) { exit (0); } static void copy_callback (GtkWidget *w) { if (kselected.d[0] || kselected.d[1]) { gchar *string_utf = utf8_for_char (kselected); gtk_clipboard_set_text (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD), string_utf, -1); g_free (string_utf); } } static void look_up_callback (GtkWidget *w) { /* kill 'HUP',$engine_pid; */ GList *tmp_list; GString *message = g_string_new (NULL); GError *err = NULL; tmp_list = pad_area->strokes; while (tmp_list) { GList *stroke_list = tmp_list->data; while (stroke_list) { gint16 x = ((GdkPoint *)stroke_list->data)->x; gint16 y = ((GdkPoint *)stroke_list->data)->y; g_string_append_printf (message, "%d %d ", x, y); stroke_list = stroke_list->next; } g_string_append (message, "\n"); tmp_list = tmp_list->next; } g_string_append (message, "\n"); if (g_io_channel_write_chars (to_engine, message->str, message->len, NULL, &err) != G_IO_STATUS_NORMAL) { g_printerr ("Cannot write message to engine: %s\n", err->message); exit (1); } if (g_io_channel_flush (to_engine, &err) != G_IO_STATUS_NORMAL) { g_printerr ("Error flushing message to engine: %s\n", err->message); exit (1); } g_string_free (message, FALSE); } static void clear_callback (GtkWidget *w) { pad_area_clear (pad_area); } static void save_callback (GtkWidget *w) { static int unknownID = 0; static FILE *samples = NULL; int found = FALSE; int i; GList *tmp_list; if (!samples) { if (!(samples = fopen("samples.dat", "a"))) g_error ("Can't open 'samples.dat': %s", g_strerror(errno)); } if (kselected.d[0] || kselected.d[1]) { for (i=0; istrokes; while (tmp_list) { GList *stroke_list = tmp_list->data; while (stroke_list) { gint16 x = ((GdkPoint *)stroke_list->data)->x; gint16 y = ((GdkPoint *)stroke_list->data)->y; fprintf(samples, "%d %d ", x, y); stroke_list = stroke_list->next; } fprintf(samples, "\n"); tmp_list = tmp_list->next; } fprintf(samples, "\n"); fflush(samples); } static void annotate_callback () { pad_area_set_annotate (pad_area, !pad_area->annotate); } void pad_area_changed_callback (PadArea *area) { update_sensitivity (); } static void update_path_sensitive (const gchar *path, gboolean sensitive) { GtkWidget *widget = gtk_item_factory_get_widget (factory, path); gtk_widget_set_sensitive (widget, sensitive); } static void update_sensitivity () { gboolean have_selected = (kselected.d[0] || kselected.d[1]); gboolean have_strokes = (pad_area->strokes != NULL); update_path_sensitive ("/Edit/Copy", have_selected); update_path_sensitive ("/Character/Lookup", have_strokes); gtk_widget_set_sensitive (lookup_button, have_strokes); update_path_sensitive ("/Character/Clear", have_strokes); gtk_widget_set_sensitive (clear_button, have_strokes); update_path_sensitive ("/Character/Save", have_strokes); } #define BUFLEN 256 static gboolean engine_input_handler (GIOChannel *source, GIOCondition condition, gpointer data) { static gchar *p; static gchar *line; GError *err = NULL; GIOStatus status; int i; status = g_io_channel_read_line (from_engine, &line, NULL, NULL, &err); switch (status) { case G_IO_STATUS_ERROR: g_printerr ("Error reading from engine: %s\n", err->message); exit(1); break; case G_IO_STATUS_NORMAL: break; case G_IO_STATUS_EOF: g_printerr ("Engine no longer exists"); exit (1); break; case G_IO_STATUS_AGAIN: g_assert_not_reached (); break; } if (line[0] == 'K') { unsigned int t1, t2; p = line+1; for (i=0; imessage); gtk_dialog_run (GTK_DIALOG (dialog)); g_error_free (err); exit (1); } g_free (uninstalled); if (!(to_engine = g_io_channel_unix_new (stdin_fd))) g_error ("Couldn't create pipe to child process: %s", g_strerror(errno)); if (!(from_engine = g_io_channel_unix_new (stdout_fd))) g_error ("Couldn't create pipe from child process: %s", g_strerror(errno)); g_io_add_watch (from_engine, G_IO_IN, engine_input_handler, NULL); } /* Create Interface */ void usage () { fprintf(stderr, "Usage: %s [-f/--data-file FILE]\n", progname); exit (1); } int main (int argc, char **argv) { GtkWidget *window; GtkWidget *main_hbox; GtkWidget *vseparator; GtkWidget *button; GtkWidget *main_vbox; GtkWidget *menubar; GtkWidget *vbox; GtkWidget *label; GtkAccelGroup *accel_group; PangoFontDescription *font_desc; int i; char *p; p = progname = argv[0]; while (*p) { if (*p == '/') progname = p+1; p++; } gtk_init (&argc, &argv); for (i=1; i", accel_group); gtk_item_factory_create_items (factory, nmenu_items, menu_items, NULL); /* create a menubar */ menubar = gtk_item_factory_get_widget (factory, "
"); gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0); gtk_widget_show (menubar); /* Install the accelerator table in the main window */ gtk_window_add_accel_group (GTK_WINDOW (window), accel_group); main_hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX(main_vbox), main_hbox, TRUE, TRUE, 0); gtk_widget_show (main_hbox); /* Area for user to draw characters in */ pad_area = pad_area_create (); gtk_box_pack_start (GTK_BOX (main_hbox), pad_area->widget, TRUE, TRUE, 0); gtk_widget_show (pad_area->widget); vseparator = gtk_vseparator_new(); gtk_box_pack_start (GTK_BOX (main_hbox), vseparator, FALSE, FALSE, 0); gtk_widget_show (vseparator); /* Area in which to draw guesses */ vbox = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (main_hbox), vbox, FALSE, FALSE, 0); gtk_widget_show (vbox); karea = gtk_drawing_area_new(); g_signal_connect (karea, "configure_event", G_CALLBACK (karea_configure_event), NULL); g_signal_connect (karea, "expose_event", G_CALLBACK (karea_expose_event), NULL); g_signal_connect (karea, "button_press_event", G_CALLBACK (karea_button_press_event), NULL); gtk_widget_set_events (karea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); #ifdef G_OS_WIN32 font_desc = pango_font_description_from_string ("MS Gothic 18"); #else font_desc = pango_font_description_from_string ("Sans 18"); #endif gtk_widget_modify_font (karea, font_desc); gtk_box_pack_start (GTK_BOX (vbox), karea, TRUE, TRUE, 0); gtk_widget_show (karea); /* Buttons */ label = gtk_label_new ("\xe5\xbc\x95"); /* We have to set the alignment here, since GTK+ will fail * to get the width of the string appropriately... */ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_widget_modify_font (label, font_desc); gtk_widget_show (label); lookup_button = button = gtk_button_new (); gtk_container_add (GTK_CONTAINER (button), label); g_signal_connect (button, "clicked", G_CALLBACK (look_up_callback), NULL); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_widget_show (button); label = gtk_label_new ("\xe6\xb6\x88"); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_widget_modify_font (label, font_desc); gtk_widget_show (label); clear_button = button = gtk_button_new (); gtk_container_add (GTK_CONTAINER (button), label); g_signal_connect (button, "clicked", G_CALLBACK (clear_callback), NULL); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_widget_show (button); gtk_widget_show(window); pango_font_description_free (font_desc); init_engine(); gtk_main(); return 0; } kanjipad-2.0.0/kanjipad.h0100664000076400007640000000057707444506511015222 0ustar otaylorotaylor#include typedef struct _PadArea PadArea; struct _PadArea { GtkWidget *widget; gint annotate; GList *strokes; /* Private */ GdkPixmap *pixmap; GList *curstroke; int instroke; }; PadArea *pad_area_create (); void pad_area_clear (PadArea *area); void pad_area_set_annotate (PadArea *area, gint annotate); void pad_area_changed_callback (PadArea *area); kanjipad-2.0.0/kanjipad.spec.in0100664000076400007640000000206707532223755016332 0ustar otaylorotaylor# Note that this is NOT a relocatable package Summary: KanjiPad Name: kanjipad Version: @VERSION@ Release: 1 License: GPL Group: Applications/Utilities Source: http://fishsoup.net/software/kanjipad/kanjipad-%{version}.tar.gz URL: http://fishsoup.net/software/kanjipad/ BuildRoot: /var/tmp/kanjipad-%{PACKAGE_VERSION}-root %description KanjiPad is a tiny application that allows the user to enter Japanese characters graphically. It uses the handwriting-recognition algorithm from Todd Rudick's program JavaDic. %prep %setup -q %build make BINDIR=%{_bindir} DATADIR=%{_datadir} OPTIMIZE="$RPM_OPT_FLAGS" %install make BINDIR=%{_bindir} DATADIR=%{_datadir} DESTDIR=$RPM_BUILD_ROOT install %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-, root, root) %doc COPYING ChangeLog README %{_bindir}/* %{_datadir}/* %changelog * Sun Aug 25 2002 Owen Taylor - Version 2.0.0, clean up spec file * Thu Apr 15 1999 Owen Taylor - Up version to 1.2.2, added to tar file * Wed Mar 31 1999 Owen Taylor - Initial spec file kanjipad-2.0.0/kanjipadrc0100664000076400007640000000016507045107464015313 0ustar otaylorotaylorstyle "kanji_area" { fontset = "-*-fixed-medium-r-*--24-*-*-*" } widget_class "*DrawingArea*" style "kanji_area" kanjipad-2.0.0/kpengine.c0100664000076400007640000001306307444530052015223 0ustar otaylorotaylor/* KanjiPad - Japanese handwriting recognition front end * Copyright (C) 1997 Owen Taylor * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include "jstroke/jstroke.h" #define MAX_STROKES 32 #define BUFLEN 1024 static char *stroke_dicts[MAX_STROKES]; static char *progname; static char *data_file; void load_database() { FILE *file; int i; if (data_file) { file = fopen (data_file, "rb"); } else { #ifdef G_OS_WIN32 char *dir = g_win32_get_package_installation_directory (NULL, NULL); #else char *dir = g_strdup (KP_LIBDIR); #endif char *fname = g_build_filename (dir, "jdata.dat", NULL); file = fopen (fname, "rb"); if (!file) file = fopen ("jdata.dat", "rb"); g_free (fname); g_free (dir); } if (!file) { fprintf(stderr,"%s: Can't open %s\n", progname, data_file ? data_file : "jdata.dat"); exit(1); } for (i=0;i MAX_STROKES)) { fprintf(stderr, "%s: Corrupt stroke database\n", progname); exit(1); } if (nstrokes == 0) break; stroke_dicts[nstrokes] = malloc(len); n_read = fread(stroke_dicts[nstrokes], 1, len, file); if (n_read != len) { fprintf(stderr, "%s: Corrupt stroke database", progname); exit(1); } } fclose (file); } /* From Ken Lunde's _Understanding Japanese Information Processing_ O'Reilly, 1993 */ void sjis2jis(unsigned char *p1, unsigned char *p2) { unsigned char c1 = *p1; unsigned char c2 = *p2; int adjust = c2 < 159; int rowOffset = c1 < 160 ? 112 : 176; int cellOffset = adjust ? (c2 > 127 ? 32 : 31) : 126; *p1 = ((c1 - rowOffset) << 1) - adjust; *p2 -= cellOffset; } int process_strokes (FILE *file) { RawStroke strokes[MAX_STROKES]; char *buffer = malloc(BUFLEN); int buflen = BUFLEN; int nstrokes = 0; /* Read in strokes from standard in, all points for each stroke * strung together on one line, until we get a blank line */ while (1) { char *p,*q; int len; if (!fgets(buffer, buflen, file)) return 0; while ((strlen(buffer) == buflen - 1) && (buffer[buflen-2] != '\n')) { buflen += BUFLEN; buffer = realloc(buffer, buflen); if (!fgets(buffer+buflen-BUFLEN-1, BUFLEN+1, file)) return 0; } len = 0; p = buffer; while (1) { while (isspace (*p)) p++; if (*p == 0) break; strokes[nstrokes].m_x[len] = strtol (p, &q, 0); if (p == q) break; p = q; while (isspace (*p)) p++; if (*p == 0) break; strokes[nstrokes].m_y[len] = strtol (p, &q, 0); if (p == q) break; p = q; len++; } if (len == 0) break; strokes[nstrokes].m_len = len; nstrokes++; if (nstrokes == MAX_STROKES) break; } if (nstrokes != 0 && stroke_dicts[nstrokes]) { int i; ListMem *top_picks; StrokeScorer *scorer = StrokeScorerCreate (stroke_dicts[nstrokes], strokes, nstrokes); if (scorer) { StrokeScorerProcess(scorer, -1); top_picks = StrokeScorerTopPicks(scorer); StrokeScorerDestroy(scorer); printf("K"); for (i=0;im_argc;i++) { unsigned char c[2]; if (i) printf(" "); c[0] = top_picks->m_argv[i][0]; c[1] = top_picks->m_argv[i][1]; sjis2jis(&c[0],&c[1]); printf("%2x%2x",c[0],c[1]); } free(top_picks); } printf("\n"); fflush(stdout); } return 1; } void usage () { fprintf(stderr, "Usage: %s [-f/--data-file FILE]\n", progname); exit (1); } int real_main(int argc, char **argv) { int i; char *p = progname = argv[0]; while (*p) { if (*p == '/') progname = p+1; p++; } for (i=1; i /* To avoid a console window coming up while running our * program, on Win32, we act as a GUI app... a WinMain() * and no main(). */ #ifdef __GNUC__ # ifndef _stdcall # define _stdcall __attribute__((stdcall)) # endif #endif int _stdcall WinMain (struct HINSTANCE__ *hInstance, struct HINSTANCE__ *hPrevInstance, char *lpszCmdLine, int nCmdShow) { return real_main (__argc, __argv); } #else int main(int argc, char **argv) { return real_main (argc, argv); } #endif kanjipad-2.0.0/padarea.c0100664000076400007640000001565107444506511015030 0ustar otaylorotaylor#include "kanjipad.h" #include #include #include static void pad_area_free_stroke (GList *stroke) { GList *tmp_list = stroke; while (tmp_list) { g_free (tmp_list->data); tmp_list = tmp_list->next; } g_list_free (stroke); } static void pad_area_annotate_stroke (PadArea *area, GList *stroke, gint index) { GdkPoint *cur, *old; /* Annotate the stroke with the stroke number - the algorithm * for placing the digit is pretty simple. The text is inscribed * in a circle tangent to the stroke. The circle will be above * and/or to the left of the line */ if (stroke) { old = (GdkPoint *)stroke->data; do { cur = (GdkPoint *)stroke->data; stroke = stroke->next; } while (stroke && abs(cur->x - old->x) < 5 && abs (cur->y - old->y) < 5); if (stroke) { char buffer[16]; PangoLayout *layout; int swidth, sheight; gint16 x, y; double r; double dx = cur->x - old->x; double dy = cur->y - old->y; double dl = sqrt(dx*dx+dy*dy); int sign = (dy <= dx) ? 1 : -1; GdkRectangle update_area; sprintf (buffer, "%d", index); layout = gtk_widget_create_pango_layout (area->widget, buffer); pango_layout_get_pixel_size (layout, &swidth, &sheight); r = sqrt(swidth*swidth + sheight*sheight); x = 0.5 + old->x + 0.5*r*dx/dl + sign * 0.5*r*dy/dl; y = 0.5 + old->y + 0.5*r*dy/dl - sign * 0.5*r*dx/dl; x -= swidth/2; y -= sheight/2; update_area.x = x; update_area.y = y; update_area.width = swidth; update_area.height = sheight; x = CLAMP (x, 0, area->widget->allocation.width - swidth); y = CLAMP (y, 0, area->widget->allocation.height - sheight); gdk_draw_layout (area->pixmap, area->widget->style->black_gc, x, y, layout); g_object_unref (layout); gdk_window_invalidate_rect (area->widget->window, &update_area, FALSE); } } } static void pad_area_init (PadArea *area) { GList *tmp_list; int index = 1; guint16 width = area->widget->allocation.width; guint16 height = area->widget->allocation.height; gdk_draw_rectangle (area->pixmap, area->widget->style->white_gc, TRUE, 0, 0, width, height); tmp_list = area->strokes; while (tmp_list) { GdkPoint *cur, *old; GList *stroke_list = tmp_list->data; old = NULL; if (area->annotate) pad_area_annotate_stroke (area, stroke_list, index); while (stroke_list) { cur = (GdkPoint *)stroke_list->data; if (old) gdk_draw_line (area->pixmap, area->widget->style->black_gc, old->x, old->y, cur->x, cur->y); old = cur; stroke_list = stroke_list->next; } tmp_list = tmp_list->next; index++; } gtk_widget_queue_draw (area->widget); } static int pad_area_configure_event (GtkWidget *w, GdkEventConfigure *event, PadArea *area) { if (area->pixmap) g_object_unref (area->pixmap); area->pixmap = gdk_pixmap_new (w->window, event->width, event->height, -1); pad_area_init (area); return TRUE; } static int pad_area_expose_event (GtkWidget *w, GdkEventExpose *event, PadArea *area) { if (!area->pixmap) return 0; gdk_draw_drawable (w->window, w->style->fg_gc[GTK_STATE_NORMAL], area->pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return TRUE; } static int pad_area_button_press_event (GtkWidget *w, GdkEventButton *event, PadArea *area) { if (event->button == 1) { GdkPoint *p = g_new (GdkPoint, 1); p->x = event->x; p->y = event->y; area->curstroke = g_list_append (area->curstroke, p); area->instroke = TRUE; } return TRUE; } static int pad_area_button_release_event (GtkWidget *w, GdkEventButton *event, PadArea *area) { if (area->annotate) pad_area_annotate_stroke (area, area->curstroke, g_list_length (area->strokes) + 1); area->strokes = g_list_append (area->strokes, area->curstroke); area->curstroke = NULL; area->instroke = FALSE; pad_area_changed_callback (area); return TRUE; } static int pad_area_motion_event (GtkWidget *w, GdkEventMotion *event, PadArea *area) { gint x,y; GdkModifierType state; if (event->is_hint) { gdk_window_get_pointer (w->window, &x, &y, &state); } else { x = event->x; y = event->y; state = event->state; } if (area->instroke && state & GDK_BUTTON1_MASK) { GdkRectangle rect; GdkPoint *p; int xmin, ymin, xmax, ymax; GdkPoint *old = (GdkPoint *)g_list_last (area->curstroke)->data; gdk_draw_line (area->pixmap, w->style->black_gc, old->x, old->y, x, y); if (old->x < x) { xmin = old->x; xmax = x; } else { xmin = x; xmax = old->x; } if (old->y < y) { ymin = old->y; ymax = y; } else { ymin = y; ymax = old->y; } rect.x = xmin - 1; rect.y = ymin = 1; rect.width = xmax - xmin + 2; rect.height = ymax - ymin + 2; gdk_window_invalidate_rect (w->window, &rect, FALSE); p = g_new (GdkPoint, 1); p->x = x; p->y = y; area->curstroke = g_list_append (area->curstroke, p); } return TRUE; } PadArea *pad_area_create () { PadArea *area = g_new (PadArea, 1); area->widget = gtk_drawing_area_new(); gtk_widget_set_size_request (area->widget, 100, 100); g_signal_connect (area->widget, "configure_event", G_CALLBACK (pad_area_configure_event), area); g_signal_connect (area->widget, "expose_event", G_CALLBACK (pad_area_expose_event), area); g_signal_connect (area->widget, "button_press_event", G_CALLBACK (pad_area_button_press_event), area); g_signal_connect (area->widget, "button_release_event", G_CALLBACK (pad_area_button_release_event), area); g_signal_connect (area->widget, "motion_notify_event", G_CALLBACK (pad_area_motion_event), area); gtk_widget_set_events (area->widget, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); area->strokes = NULL; area->curstroke = NULL; area->instroke = FALSE; area->annotate = FALSE; area->pixmap = NULL; return area; } void pad_area_clear (PadArea *area) { GList *tmp_list; tmp_list = area->strokes; while (tmp_list) { pad_area_free_stroke (tmp_list->data); tmp_list = tmp_list->next; } g_list_free (area->strokes); area->strokes = NULL; #if 0 tmp_list = thinned; while (tmp_list) { pad_area_free_stroke (tmp_list->data); tmp_list = tmp_list->next; } g_list_free (thinned); thinned = NULL; #endif g_list_free (area->curstroke); area->curstroke = NULL; pad_area_init (area); pad_area_changed_callback (area); } void pad_area_set_annotate (PadArea *area, gint annotate) { if (area->annotate != annotate) { area->annotate = annotate; pad_area_init (area); } } kanjipad-2.0.0/runtest.pl0100775000076400007640000000151307045107456015325 0ustar otaylorotaylor#!/usr/bin/perl -w use IO::File; use IPC::Open2 qw(open2); use strict; my $in = new IO::File; my $out = new IO::File; open2( $in, $out, "./kpengine") || die "Cannot run recognition engine"; $out->autoflush(); if (!@ARGV) { push @ARGV, "samples.dat"; } my $unknown = 0; my @scores; $/ = ""; while (<>) { my ($jis, $strokes) = /(\w{4})\s[^\n]*\n(.*)/s; defined $jis or warn "Bad stroke entry:\n$_\n", next; next if ($jis eq "0000"); print $out $strokes; $/ = "\n"; my @result = split(' ',substr(scalar <$in>, 1)); $/ = ""; my $score = 0; for (@result) { last if $_ eq $jis; $score++; } if ($score == @result) { $unknown++; } else { $scores[$score]++; } } print "Not found: $unknown\n"; print "Found, at rank:\n"; for (0..$#scores) { print $_+1," $scores[$_]\n"; } kanjipad-2.0.0/samples.dat0100664000076400007640000000026207045107463015415 0ustar otaylorotaylor0000 ??0 393b ¹» 3c78 ¼ø 0000 ??0 4874 Èô 4b65 Ëå 3e6f ¾ï 4873 Èó 317c ±ü 312b ±« 3e29 ¾© 433b û 3c64 ¼ä 4044 ÀÄ 0000 ??0 0000 ??0 0000 ??0 0000 ??1 0000 ??0 kanjipad-2.0.0/kanjipad.spec0100664000076400007640000000206307632231307015712 0ustar otaylorotaylor# Note that this is NOT a relocatable package Summary: KanjiPad Name: kanjipad Version: 2.0.0 Release: 1 License: GPL Group: Applications/Utilities Source: http://fishsoup.net/software/kanjipad/kanjipad-%{version}.tar.gz URL: http://fishsoup.net/software/kanjipad/ BuildRoot: /var/tmp/kanjipad-%{PACKAGE_VERSION}-root %description KanjiPad is a tiny application that allows the user to enter Japanese characters graphically. It uses the handwriting-recognition algorithm from Todd Rudick's program JavaDic. %prep %setup -q %build make BINDIR=%{_bindir} DATADIR=%{_datadir} OPTIMIZE="$RPM_OPT_FLAGS" %install make BINDIR=%{_bindir} DATADIR=%{_datadir} DESTDIR=$RPM_BUILD_ROOT install %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-, root, root) %doc COPYING ChangeLog README %{_bindir}/* %{_datadir}/* %changelog * Sun Aug 25 2002 Owen Taylor - Version 2.0.0, clean up spec file * Thu Apr 15 1999 Owen Taylor - Up version to 1.2.2, added to tar file * Wed Mar 31 1999 Owen Taylor - Initial spec file