first commit

This commit is contained in:
dabonetn 2015-10-24 08:56:00 -04:00
commit 3ba02aabf0
83 changed files with 51229 additions and 0 deletions

21
linapple-pie/CHANGELOG Normal file
View File

@ -0,0 +1,21 @@
For LinApple version 2b has been made:
!! Fixed gcc version 4.8.4 <unistd.h> includes
!! Some cleanup on Makefile, INSTALL, README and some others
For LinApple version 2.0 has been made:
!! Fixed screen corruption bug for x64 systems
!! Fixed gcc 4.4 compilation error lacking <strings>
++ FTP support. You can load disk images on Slots 6 (1 & 2) and Hard disks images, using FTP server such as apple.asimov.net
Press Alt+F3, Alt+Shift+F3 for load disk image through FTP
++ Screen sizes are now flexible. You can set any screen size you wish, just be catious - not all screen sizes can work in full screen mode
++ .zip images support for FDD 140K (in read-only mode). Just first file in .zip archive will be read and inserted as an image.
You can load .zip images directly from your file system (by F3/F4 keypress), or from FTP server (by pressing ALT+F3(F4)).
-- Sound is still glitched. Needs repairing. Please help!
For LinApple version 1.1 has been added:
++ 1. Opening of compressed .gz files - in read-only mode. Works only for FDD 140Kb drives.
++ 2. Super quick load-save states (CTRL+0..9 - quick load state, CTRL+SHIFT+0..9 - quick save it) in current states directory.
++ 3. Add Mockingboard (but not Phasor??) support, without speech, as I could take it.
But Mockingboard works! You may test it in such games as Berzap! (you need to switch Mockingboard on after pressing Ctrl+C in the game), in Willy Byte in the Digital Dimensions, in Pitfall II(tm), in UltimaIV and few others.
++ 4. VideoBenchmark added! Run `linapple -b' to see benchmark running and its result in console.
++ 5. Parallel Printer file name can be set in linapple.conf (default was Printer.txt in working directory)

84
linapple-pie/INSTALL Normal file
View File

@ -0,0 +1,84 @@
Linapple - crossplatfom emulator of Apple ][ (Apple2, Apple 2e) series computer for Linux or other OSes with SDL support.
[INSTALL]
You need SDL, cURL, zlib and libzip libraries development versions with -dev or -devel suffixes.
For Debian/Ubuntu their names are:
libsdl1.2-dev - Simple Direct Media crossplatform library for video,audio, events etc.
libcurl4 - openssl-dev - cURL net functions
zlib1g-dev - access .gz files
libzip-dev - access .zip files
All these libraries are available for free around the world.
For example for Debian/Ubuntu to install:
$ sudo apt-get install libsdl1.2-dev libcurl4-openssl-dev zlib1g-dev libzip-dev
After being SDL, zlib, cURL and libzip installed you will be able to compile linapple from sources:
Untar the package (in .bz2 format):
$ tar xjf linapple_src-2b.tar.bz2
Then go to src directory and compile.
$ cd linapple_src-2b/src
$ make
If there are no errors, you may install it if you wish:
$ sudo make install
It will be installed in /usr/local/linapple folder, whre you can find linapple.conf file for changing some linapple settings,
and empty `images` and `ftp` folders, where Apple 2 images files and downloaded through FTP cached images are meant to be in.
Of course you are free to choose any directories of your choice changing it in Makefile in src directory.
Note: you should read/write permissions for these folders, or linapple could not work properly.
For linaaple ability to unpack .zip and .gz files on the fly (either from local disks or from FTP) you also need read/write access for linapple working folder (which by default is /usr/local/linapple), for linapple unpacks these files as drive0.dsk and drive1.dsk for drive 1 and 2 respectively.
OK. If you installed it, you are able to run emulator from any place, just run it like this:
$ linapple
If you have chosen not to install it, go to the upper directory then and run the beast:
$ cd ..
$ ./linapple
If all files are on their places, you should see an X-Window with splash screen.
Press F2 (or F3 before to choose some disk image in drive 1), and go to work.
Note: linapple needs some files in its current working directory for proper working.
These files are:
splash.bmp - splash screen
charset40.bmp - charset for Apple][ (Apple 2e, etc.) text modes.
font.bmp - font for Help screen and Disk Select screens.
icon.bmp - nice icon, logo of Apple][ computer.
linapple.conf - configuration file.
Master.dsk - disk image with Applesoft(tm) DOS 3.3 inside. See Apple license (on apple.com) for details.
Essential are font.bmp and charset40.bmp, others can be omitted peacefully.
P.S. You may play with some options in Makefile in src directory, if you know what you want to do.
Note: See README file for more detailed instructions on using linapple.
[UNINSTALL]
To uninstall previously installed linapple (by `sudo make install` command) you may write this:
$ sudo make uninstall
This will remove by default entire `/usr/local/linapple` folder and `/usr/local/bin/linapple` script.
Also there is possible command for cleaning compiled binaries in src directory:
$ make clean
Note: `linapple` executable in upper directory will remain intact.
[CONTACT]
I will be glad to see your comments, suggestions and so on on my email beotiger@gmail.com
Sincerely Yours,
beotiger, December 2007 AD - March 2012 AD - June 2015
http://beotiger.com beotiger@gmail.com
Let Apple 2 live forever!

340
linapple-pie/LICENSE Normal file
View File

@ -0,0 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 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
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 a brief idea of what it does.>
Copyright (C) <year> <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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 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) year 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.

BIN
linapple-pie/Master.dsk Normal file

Binary file not shown.

0
linapple-pie/Printer.txt Normal file
View File

140
linapple-pie/README Normal file
View File

@ -0,0 +1,140 @@
*** LINAPPLE 2b***
[INTRO]
What is linapple?
It is an emulator of Apple2 (Apple][, Apple 2, Apple 2e etc.) computer series for Linux or other OSes with SDL support.
(SDL means Simple Direct Media Layer written by Sam Lantinga and others).
Linapple works out of the box, just make it once and run whenever you wish.
Why not AppleLin? Yes, at first I think to call it such, but later linapple seemed better to me. And one point!
This is my work for making it possible to have comprehensive emulator of Apple][ computer series in Linux.
The original source is from AppleWin (http://applewin.berlios.de) by Tom Charlesworth and others.
I just adapted it for: video+audio for SDL, other functions for POSIX compliant OS, which Linux is in particularly.
Later some sort of Windows support had been added, so you may try to compile it under Windows.
[INSTALL]
I will show brief instructions for compiling and installing linapple here.
Please, see INSTALL file for comprehensive installing tips.
After SDL1.2, zlib, libcurl and libzip (development versions with -dev or -devel suffixes) are installed in your system, you can build sources.
Unpack downloaded linapple archive and go to src directory:
$ cd src
Then run:
$ make
or
$ sudo make install
If there is no errors, run:
$ linapple
or without being installed:
$ cd ..
$ ./linapple
If all files are on their places, you should see an X-Window with splash screen.
Press F2 (or F3 or Alt+F3) before to choose some disk image in drive 1), and go to work.
It works as well as AppleWin, although it needs testing and supporting.
Where to install? Anywhere you feel fit, just let linapple be with some files it needs for comprehenceive working.
These files are:
splash.bmp - splash screen
charset40.bmp - charset for Apple][ (Apple 2e, etc.) text modes.
font.bmp - font for Help screen and Disk Select screens.
icon.bmp - nice icon, logo of Apple][ computer.
linapple.conf - configuration file.
Master.dsk - disk image with Applesoft(tm) DOS 3.3 inside. See Apple license (on apple.com) for details.
[USING LINAPPLE]
At first start you should see some nice splashscreen. Press F2 to start emualtion. Master.dsk should load, and you will see an DOS3.3(tm) prompt. By pressing F3 you may select an image file name (usually having extensions .dsk, .do, .po) into Slot 6 Drive 1. After selecting it, you either can reboot anew (by pressing F2 key) and try to boot from the inserted disk, or type any DOS3.3(tm) commands to view disk contents and to run any program located in it. Common DOS commands are `CATALOG' (like `ls' in Linux), `BRUN FILENAME' - running any binary (B) program, or `RUN FILENAME' - running any Basic program (A or I). Usually, most game images have alternative way to run programs in them.
You may find a lot of disk images on may be the largest and the oldest ftp archive for various Apple ][ stuff - ftp.apple.asimov.net
From version 2 of linapple you are able to download such images directly from FTP! Use Alt+F3 or Alt+F4 for charging drive 1 and drive 2 for slot 6 (if you know what I am about :) ) - they are just common disk sources of Apple 2 computer for reading/writing its files, such as system, games, utilities and so on. Change `FTP Local Dir` parameter in linnaple. conf file to point to some writable directory and make directory named `cache` inside it (install routine does it for you).
To quit emualtor peacefully, press F10. F6 toggles fullscreen mode, Scroll Lock toggles fullspeed mode.
Other possible key commands of linapple are the following:
F1 - Show help screen
F2 - Cold reset
Shift+F2 - Reload conf file and restart
F3, F4 - Choose an image file name for floppy disk in Slot 6 drive 1 or 2 respectively
Shift+F3, Shift+F4 - The same thing for Apple hard disks (in Slot 7)
Alt+F3,Alt+F4 - same as F3,F4 using FTP (see linapple.conf about configuring FTP accounts)
Alt+Shift+F3, Alt+Shift+F4 - same as Shift+F3, Shift+F4 but using FTP account (see above)
F5 - Swap drives for Slot 6
F6 - Toggle fullscreen mode
F7 - Reserved for Debugger!
F8 - Save current screen as a .bmp file
Shift+F8 - Save settings changable in runtime in conf file
F9 - Cycle through various video modes
F10 - Quit emulator
F11 - Save current state to file, Alt+F11 - quick save
F12 - Reload it from file, Alt+F12 - quick load
Ctrl+0..9 - fast load state snapshot with corresponding number, saved previously by
Ctrl+Shift+0..9 - fast save snapshot to current snapshot directory with corresponding number 0..9
Ctrl+F12 - Hot reset
Pause - Pause emulator
Scroll Lock - Toggle full speed
Num pad keys:
Grey + - Speed up emulator
Grey - - Speed it down
Grey * - Normal speed
Other powerful way to control behaviour of linapple is to change different settings in linapple.conf file, which should be located in the same directory where linapple is. Please, see linapple.conf contents to know what each setting means.
Note one point, too. When mouse works as a joystick, or Mouse Interface is on, when you first left-click on the window of emulator, mouse cursor is grabbed for using inside it. To release cursor, you should click left-mouse button again with SHIFT or CTRL key pressed. In fullscreen mode mouse cursor is always grabbed, to release it you may want to switch to windowed mode by pressing F6 key.
In version 1.1 appeared VideoBenchmark: start linapple with -b command-line key to see its results, like this:
$ ./linapple -b - run VideoBenchmark and exit emulator. Note: if fullscreen mode is on in linapple.conf, then
VideoBenchmark will be runned in fullscreen mode.
In version 2 besides FTP support there is also support for changable Window sizes (see at the end of linapple.conf file for details).
Just be aware when you are not running emulator on its native mode (560x384) you can suffer slowdown if you are using old box.
[SUPPORT]
Wanted:
-- We need to get rid of some SOUND glitches. HELP!
--DEBUGGER
I just owe at 9300 lines of code of AppleWin debugger. Michael Pohoreski, you are he-man, I tell you.
Besides Debugger.cpp alone, there are some helper files such as Debugger_Assembler.cpp,
Debugger_Console.cpp, Debugger_Display.cpp and so on. Who is able to port it to linapple?
--PHASOR
Who knows how does that great thing work? Please, help adopting it to lianpple.
All sources for sound support are in Mockingboard.cpp and SoundCore.cpp.
SDL Audio used. Speakers are working out in Speaker.cpp. Who may think, heh?
From version 1.1 Mockingboard support are done.
More testing and debugging needed, of course. I would be grateful for any comment or suggestion regarding linapple, and using it on OSes other than Linux.
[CONTACTS]
I am beotiger, you may contact me at your will by my email beotiger@gmail.com
Web-sites:
http://beotiger.com
http://linapple.sourceforge.net
Thank you very much.
Long Live Linux!
And Apple][!
--
24 March 2012 AD
26 June 2015 AD

View File

@ -0,0 +1,44 @@
This is another conversion on linapple geared toward retropie.
Changes done by Mark Ormond.
Now needs SDL_image to compile.
Changes are as follows.
The sdl mouse cursor is disabled.
The charset40.bmp, font.bmp, and splash.bmp have now been encoded in the
main executable. So no need for these files anymore.
Added the -1 swtich for mounting and running a disk in drive 1. Usage is
linapple -1 /home/pi/Retropie/roms/apple2/Frogger.dsk
The location for linapple.conf is /opt/retropie/configs/apple2/linapple.conf
The location for Master.dsk is /opt/retropie/emulators/linapple/Master.dsk
Neither of these files are required for operation, but linapple.conf is needed to change video modes, etc.
To change location of linapple.conf edit the Registry.h file and change the line..
#define REGISTRY "/opt/retropie/configs/apple2/linapple.conf"
To where ever and what ever you want to call the file.
To change the location of the Master.dsk edit the Applewin.cpp file and change the line.,
char *MASTER_DISK="/opt/retropie/emulators/linapple/Master.dsk";
After any changes, be sure to make clean, then make and then copy your new linapple where you need it.
Enjoy,
dabone

BIN
linapple-pie/icon.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

252
linapple-pie/linapple.conf Normal file
View File

@ -0,0 +1,252 @@
#
# linapple.conf - config file used by LinApple, Apple][ (Apple2, Apple 2) emulator for Linux and other POSIX systems with SDL support
#
# for linapple version 2.0 and above
#
# Please remember - all lines beginning with '#' are considered comments.
# All values are CASE SENSITIVE, you should not use, for example, 'joystick 0' instead of 'Joystick 0'.
#
####################################################################
# First of all let us determine our machine type
# that is:
# 0 - old Apple][, right out of the hands of Steve Wozniak and Steve Jobs in far 1977? year.
# 1 - Apple][+ - same as Apple][ with somewhat enbettered functionality
# 2 - Apple//e - Enhanced Apple][ with 80-column mode and other useful additions
# 3 - Apple//e enhanced - currently same as Apple//e? Please, ask Tom Charlesworth about it.
# Default is 3
Computer Emulation = 2
####################################################################
#
# Sound Emulation.
# Possible values currently are 0 - none, and 1 - use SDL Audio for sounds
# Default is 1
Sound Emulation = 1
#######################################################################
#
# Soundcard Type means what do you want to use in Slot7 as a sound card
#
# 0 - uninit //??
# 1 - nothing - disable sound card in Slot 4
# 2 - use Mockingboard in Slot 4 (Mockingboard is like SoundBlaster for PC, if you hear about it)
# 3 - use Phasor in Slot 4. Phasor is also a sort of ancient sound cards. Ahhh, what sounds they have!!!
#
# Default value is 2 (use Mockingboard).
# But, please, remember, that currently Mockingboard/Phasor support was not done fully in linapple.
# I need some help for this to port it from AppleWin. ^_^
Soundcard Type = 2
#######################################################################
#
# Joysticks, those sticks of joy! There may be 2 joysticks at the same time
# Possible values are:
# 0 - joystick disabled
# 1 - use PC joystick #1 or #2, for corresponding joystick
# 2 - Keyboard standard
# 3 - Keyboard centered
# When joysticks used as a keyboard, they are stuck to Numpad keys (1-9 - axis movement, 0 - button1, . - button2)
# when centered used, axis of joystick will be centered after releasing any cursor (Numpad 1..9) key.
# otherwise it assumed to be pressed always
# 4 - Use mouse as a joystick. Rather interesting thing, try it. Useful in Fantavision(tm)by Broderbund Software
# Default values are 2 for Joystick 0, and 0 for Joystick 1
Joystick 0 = 3
Joystick 1 = 0
##########################################################################
#
# Serial Port joins your Apple][ machine to any device through serial ports.
# Possible values are 0 - disabled, and 1 to 100 which means device /dev/ttyS0 .. /dev/ttyS99 relatively
#
# Default is 0, disabled. Needs testing.
Serial Port = 0
##########################################################################
# Emulation Speed is speed of emulator.
# Values are from 0 (lowest speed) till 40 (fastest)
# Default value is 10 (normal speed)
Emulation Speed = 10
##########################################################################
#
# Enhance Disk Speed - if the disk spinning should be as in real computer
# Possible values - 0 - yes, the disk spinning speed is like in real Apple][
# and 1 - use enhanced disk speed.
# Default is 1.
Enhance Disk Speed = 1
##########################################################################
#
# Video Emulation - a type of video emulation.
# Please, remember that you always can change it using F9 key in emulator.
# Possible values are:
# 0 - use monochrome screen with given color as white (see below Monochrome Color section)
# Color modes, which names speak for themselves.
# 1 - Color Standard
# 2 - Color Text Optimized
# 3 - Color TV emulation
# 4 - Color Half-Shift
# Monochrome modes with predefined monochrome colors
# 5 - Monochrome Amber
# 6 - Monochrome Green
# 7 - Monochrome White
#
# Default value is 3 - Color TV emulation!
Video Emulation = 1
##########################################################################
#
# Monochrome Color - define monochrome color that suit you best here.
# Color defined as #RRGGBB, where RR - 2 digits for Red color intensity, GG - same for Green color, and BB for Blue.
# All digits are in HEX-format, 0-9 and A - F.
# Default value is #C0C0C0.
Monochrome Color = #FFC010
##########################################################################
#
# Mouse in slot 4. Yes, old Apples][ have it! First they saw it in Xerox Development Center.
# Possible values are 0 - off, and 1 - on.
# Remember, that you can not use Mouse and Mockingboard/Phasor at the same time, for they use same slot (#4).
# So, before enabling mouse support in your machine, switch off Mockingboard (see section above).
# Default is 0.
Mouse in slot 4 = 0
##########################################################################
#
# Parallel printer allows you to print any DOS3.3 or Applesoft Basic(tm) output to specified file
# (after PR#1 at DOS3.3 prompt)
#
# Default is Printer.txt in working directory (which is set inside linapple bin)
Parallel Printer Filename =
##########################################################################
#
# HDD - Hard Disk Device for Apple][
#
# Harddisk Enable. Same as for mouse. 0 means no Harddisk support, and 1 - yes, give that Harddisk!
# Remember, that hard disk images for Apple][ are in .HDV format as a rule (with .hdv extensions)
# Hard disk uses Slot 7 in Apple][. So, to access it use something like '] PR#7' at Applesoft Basic(tm) prompt.
# Default is 0.
Harddisk Enable = 0
# HDV Starting Directory is the starting directory for choose HDV disk images
# Default: your home directory (if not set)
HDV Starting Directory =
# And you may also predefine hard disk images here, for 1 and 2 correspondingly.
# Please, use Shift+F3 and Shift+F4 in emulator for change them in real time.
# Remember, that values given here will be rewritten if you change them in emulator.
# Default - do not use any HDV images
Harddisk Image 1 =
Harddisk Image 2 =
##########################################################################
#
# Slot 6 Directory - starting directory for chosing Apple's disk images in slot 6
# (usual slot for FDD 140Kb Apple's disks)
#
# Default: your home directory (if not set)
Slot 6 Directory = /home/justy/Asimov.NET/action/bubble_bobble
# You may also provide images to be inserted in 1 and 2 drive (D1 or D2) of Slot 6 at startup
# Default: do not use, starting with image named Master.dsk in current directory
# To get access to the disk in second drive(D2), use something like '] CATALOG,D2' at Applesoft DOS(tm) prompt.
Disk Image 1 = /home/justy/Asimov.NET/action/bubble_bobble/bubble_bobble2.dsk.gz
Disk Image 2 =
# The next parameter defines if you wish to auto-load these disk images in drives at startup!
# Default value is 0 (Off), suggested: 1 (On)
Slot 6 Autoload = 0
##########################################################################
#
# Save State Filename - file name for saving/loading state with keys F11 and F12 in emulator.
# Default is none. Note: you can choose it at runtime by pressing F11 (for saving) or F12 (for loading)
Save State Filename =
# SaveSate Directory is a directory where current states will be saved by using F11,F12 (or ALT+F11, ALT+F12 keys, or Ctrl+0..9, Ctrl+Shift+0..9)
#Default is none, which means your home directory
Save State Directory =
# Define if you wish to save state on exit and restore it at startup by the next parameter:
# Possible values are 0 - off, and 1 - on. When On, save state will be saved in Save State Filename at exit,
# and will be restored at startup
# Default value is 0.
Save State On Exit = 0
##########################################################################
#
# Next parameters enables some functions at startup
#
# Fullscreen - if emulator should startup in Fullscreen mode (0 - no, 1 - yes!)
# Boot at startup - if emulator should boot after starting up from Disk1 in SLot 6 (0 - yes, 1 - no)
# Booting at startup disables show logo.
#
# Show Leds 1/0 - show leds while accessing disks (140Kb and HDD) or not, default - 1
Fullscreen = 0
Boot at Startup = 0
Show Leds = 1
##########################################################################
#
# FTP Server - full path to default FTP server with Apple2 disk images
# FTP UserPass - user:password for accessing this server
# FTP Local Dir - path on local disk to store downloaded ftp files,
# !!! Warning: FTP Local Dir should be existing directory with write access either FTP won't work
# Note : FTP Server MUST end with '/' sign either it won't work! FTP Local Dir should not end with '/'
FTP Server = ftp://ftp.apple.asimov.net/pub/apple_II/images/games/action/
FTP ServerHDD = ftp://ftp.apple.asimov.net/pub/apple_II/images/
FTP UserPass = anonymous:my-mail@mail.com
FTP Local Dir =
##########################################################################
#
# Screen properties
# Note: not all screen sizes can work in full screen mode, so be careful
# Also if you are using not default mode, the speed of emulator can become slow,
# which can be spotted easily on old machines
# Use this as screen factor in zooming screen.
# Values less than 1.0 will make screen smaller and vice versa!
# Suggested values are 0.3 till 3.0?
# Screen factor = 1.5
# Note: if you want to use Screen Width and Screen Height directly, comment out `Screen factor` whole option
# otherwise they won't take effect
# Default Screen Width is 560, Screen Height is 384
Screen Width = 800
Screen Height = 600

View File

@ -0,0 +1,265 @@
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# !! Note 1: this configuration file is for installed linapple
# !! If you have edited Makefile (in src directory of linaple package)
# !! to change INSTDIR - path where lianpple are to be installed
# !! you should consider change some paths for disk images and FTP local directory
# !! in order to let linapple find proper way to access needed stuff
# Note 2: Default install directory (for *nix) is /usr/local/linapple/
# (defined in Make file in src directory as INSTDIR variable)
#
# linapple.conf - config file used by LinApple, Apple][ (Apple2, Apple 2) emulator for Linux and other systems with SDL support
#
# Please, note: This file is for linapple version 2.0 and above
#
# Remember - all lines beginning with '#' are considered comments.
# All values are CASE SENSITIVE, you should not use, for example, 'joystick 0' instead of 'Joystick 0'.
####################################################################
# First of all let us determine our machine type
# that is:
# 0 - old Apple][, right out of the hands of Steve Wozniak and Steve Jobs in far 1977? year.
# 1 - Apple][+ - same as Apple][ with somewhat enbettered functionality
# 2 - Apple//e - Enhanced Apple][ with 80-column mode and other useful additions
# 3 - Apple//e enhanced - currently same as Apple//e? Please, ask Tom Charlesworth about it.
# Default is 3
Computer Emulation = 2
####################################################################
#
# Sound Emulation.
# Possible values currently are 0 - none, and 1 - use SDL Audio for sounds
# Default is 1
Sound Emulation = 1
#######################################################################
#
# Soundcard Type means what do you want to use in Slot7 as a sound card
#
# 0 - uninit //??
# 1 - nothing - disable sound card in Slot 4
# 2 - use Mockingboard in Slot 4 (Mockingboard is like SoundBlaster for PC, if you hear about it)
# 3 - use Phasor in Slot 4. Phasor is also a sort of ancient sound cards. Ahhh, what sounds they have!!!
#
# Default value is 2 (use Mockingboard).
# But, please, remember, that currently Mockingboard/Phasor support was not done fully in linapple.
# I need some help for this to port it from AppleWin. ^_^
Soundcard Type = 2
#######################################################################
#
# Joysticks, those sticks of joy! There may be 2 joysticks at the same time
# Possible values are:
# 0 - joystick disabled
# 1 - use PC joystick #1 or #2, for corresponding joystick
# 2 - Keyboard standard
# 3 - Keyboard centered
# When joysticks used as a keyboard, they are stuck to Numpad keys (1-9 - axis movement, 0 - button1, . - button2)
# when centered used, axis of joystick will be centered after releasing any cursor (Numpad 1..9) key.
# otherwise it assumed to be pressed always
# 4 - Use mouse as a joystick. Rather interesting thing, try it. Useful in Fantavision(tm)by Broderbund Software
# Default values are 2 for Joystick 0, and 0 for Joystick 1
Joystick 0 = 3
Joystick 1 = 0
##########################################################################
#
# Serial Port joins your Apple][ machine to any device through serial ports.
# Possible values are 0 - disabled, and 1 to 100 which means device /dev/ttyS0 .. /dev/ttyS99 relatively
#
# Default is 0, disabled. Needs testing.
Serial Port = 0
##########################################################################
# Emulation Speed is speed of emulator.
# Values are from 0 (lowest speed) till 40 (fastest)
# Default value is 10 (normal speed - 1 MHz)
Emulation Speed = 10
##########################################################################
#
# Enhance Disk Speed - if the disk spinning should be as in real computer
# Possible values - 0 - yes, the disk spinning speed is like in real Apple][
# and 1 - use enhanced disk speed.
# Default is 1.
Enhance Disk Speed = 1
##########################################################################
#
# Video Emulation - a type of video emulation.
# Please, remember that you always can change it using F9 key in emulator.
# Possible values are:
# 0 - use monochrome screen with given color as white (see below Monochrome Color section)
# Color modes, which names speak for themselves.
# 1 - Color Standard
# 2 - Color Text Optimized
# 3 - Color TV emulation
# 4 - Color Half-Shift
# Monochrome modes with predefined monochrome colors
# 5 - Monochrome Amber
# 6 - Monochrome Green
# 7 - Monochrome White
#
# Default value is 3 - Color TV emulation!
Video Emulation = 1
##########################################################################
#
# Monochrome Color - define monochrome color that suit you best here.
# Color defined as #RRGGBB, where RR - 2 digits for Red color intensity, GG - same for Green color, and BB for Blue.
# All digits are in HEX-format, 0-9 and A - F.
# Default value is #C0C0C0.
Monochrome Color = #FFC010
##########################################################################
#
# Mouse in slot 4. Yes, old Apples][ have it! First they saw it in Xerox Development Center.
# Possible values are 0 - off, and 1 - on.
# Remember, that you can not use Mouse and Mockingboard/Phasor at the same time, for they use same slot (#4).
# So, before enabling mouse support in your machine, switch off Mockingboard (see section above).
# Default is 0.
Mouse in slot 4 = 0
##########################################################################
#
# Parallel printer allows you to print any DOS3.3 or Applesoft Basic(tm) output to specified file
# (after PR#1 at DOS3.3 prompt)
#
# Default is Printer.txt in working directory (which is set inside linapple bin)
Parallel Printer Filename =
##########################################################################
#
# HDD - Hard Disk Device for Apple][
#
# Harddisk Enable. Same as for mouse. 0 means no Harddisk support, and 1 - yes, give that Harddisk!
# Remember, that hard disk images for Apple][ are in .HDV format as a rule (with .hdv extensions)
# Hard disk uses Slot 7 in Apple][. So, to access it use something like '] PR#7' at Applesoft Basic(tm) prompt.
# Default is 0.
Harddisk Enable = 0
# HDV Starting Directory is the starting directory for choose HDV disk images
# Default: your home directory (if not set)
HDV Starting Directory = /usr/local/linapple/images
# And you may also predefine hard disk images here, for 1 and 2 correspondingly.
# Please, use Shift+F3 and Shift+F4 in emulator for change them in real time.
# Remember, that values given here will be rewritten if you change them in emulator.
# Default - do not use any HDV images
Harddisk Image 1 =
Harddisk Image 2 =
##########################################################################
#
# Slot 6 Directory - starting directory for chosing Apple's disk images in slot 6
# (usual slot for FDD 140Kb Apple's disks)
#
# Default: your home directory (if not set)
Slot 6 Directory = /usr/local/linapple/images
# You may also provide images to be inserted in 1 and 2 drive (D1 or D2) of Slot 6 at startup
# Default: do not use, starting with image named Master.dsk in current directory
# To get access to the disk in second drive(D2), use something like '] CATALOG,D2' at Applesoft DOS(tm) prompt.
Disk Image 1 =
Disk Image 2 =
# The next parameter defines if you wish to auto-load these disk images in drives at startup!
# Default value is 0 (Off), suggested: 1 (On)
Slot 6 Autoload = 0
##########################################################################
#
# Save State Filename - file name for saving/loading state with keys F11 and F12 in emulator.
# Default is none. Note: you can choose it at runtime by pressing F11 (for saving) or F12 (for loading)
Save State Filename = /usr/local/linapple/images/SaveState1.aws
# SaveSate Directory is a directory where current states will be saved by using F11,F12 (or ALT+F11, ALT+F12 keys, or Ctrl+0..9, Ctrl+Shift+0..9)
#Default is none, which means your home directory
Save State Directory = /usr/local/linapple/images
# Define if you wish to save state on exit and restore it at startup by the next parameter:
# Possible values are 0 - off, and 1 - on. When On, save state will be saved in Save State Filename at exit,
# and will be restored at startup
# Default value is 0.
Save State On Exit = 0
##########################################################################
#
# Next parameters enables some functions at startup
#
# Fullscreen - if emulator should startup in Fullscreen mode (0 - no, 1 - yes!)
# Boot at startup - if emulator should boot after starting up from Disk1 in SLot 6 (0 - yes, 1 - no)
# Booting at startup disables show logo.
#
# Show Leds 1/0 - show leds while accessing disks (140Kb and HDD) or not, default - 1
Fullscreen = 0
Boot at Startup = 0
Show Leds = 1
##########################################################################
#
# FTP Server - full path to default FTP server with Apple2 disk images
# FTP UserPass - user:password for accessing this server
# FTP Local Dir - path on local disk to store downloaded ftp files,
# !!! Warning: FTP Local Dir should be existing directory with write access either FTP won't work
# Note : FTP Server MUST end with '/' sign either it won't work! FTP Local Dir should not end with '/'
# Note : Also there must be cache directory (e.g. directory named `cache` inside FTP Local Dir
# where all downloaded directories are cached for 3 days
FTP Server = ftp://ftp.apple.asimov.net/pub/apple_II/images/games/
FTP ServerHDD = ftp://ftp.apple.asimov.net/pub/apple_II/images/
FTP UserPass = anonymous:my-mail@mail.com
FTP Local Dir = /usr/local/linapple/ftp
##########################################################################
#
# Screen properties
# Note: not all screen sizes can work in full screen mode, so be careful
# Also if you are using not default mode, the speed of emulator can fall,
# which can be spotted on old machines
# Use this as screen factor in zooming screen.
# Values less than 1.0 will make screen smaller and vice versa!
# Suggested values are 0.3 till 3.0?
# Screen factor = 1.5
# Note: if you want to use Screen Width and Screen Height directly, comment out `Screen factor` whole option
# otherwise they won't take effect
# Default Screen Width is 560, Screen Height is 384
Screen Width = 800
Screen Height = 600

531
linapple-pie/src/6821.cpp Normal file
View File

@ -0,0 +1,531 @@
// Based on MAME's 6821pia.c
// - by Kyle Kim (Apple in PC)
//
// From mame.txt (http://www.mame.net/readme.html)
//
// VI. Reuse of Source Code
// --------------------------
// This chapter might not apply to specific portions of MAME (e.g. CPU
// emulators) which bear different copyright notices.
// The source code cannot be used in a commercial product without the written
// authorization of the authors. Use in non-commercial products is allowed, and
// indeed encouraged. If you use portions of the MAME source code in your
// program, however, you must make the full source code freely available as
// well.
// Usage of the _information_ contained in the source code is free for any use.
// However, given the amount of time and energy it took to collect this
// information, if you find new information we would appreciate if you made it
// freely available as well.
//
#include "wincompat.h"
#include "6821.h"
// Ctrl-A(B) register bit mask define
/*
0 1
bit0 IRQ1_DISABLED IRQ1_ENABLED
bit1 C1_HIGH_TO_LOW C1_LOW_TO_HIGH
bit2 DDR_SELECTED OUTPUT_SELECTED
bit3 RESET_C2 SET_C2 ( C2_OUTPUT & C2_SETMODE )
bit3 STROBE_C1_RESET STROBE_E_RESET ( C2_OUTPUT & C2_STROBE_MODE )
bit4 C2_STROBE_MODE C2_SETMODE ( C2_OUTPUT )
bit3 IRQ2_DISABLED IRQ2_ENABLED ( C2_INPUT )
bit4 C2_HIGH_TO_LOW C2_HIGH_TO_LOW ( C2_INPUT )
bit5 C2_INPUT C2_OUTPUT
*/
#define PIA_IRQ1 0x80
#define PIA_IRQ2 0x40
#define SET_IRQ1(c) c |= PIA_IRQ1;
#define SET_IRQ2(c) c |= PIA_IRQ2;
#define CLEAR_IRQ1(c) c &= ~PIA_IRQ1;
#define CLEAR_IRQ2(c) c &= ~PIA_IRQ2;
#define IRQ1(c) ( c & PIA_IRQ1 )
#define IRQ2(c) ( c & PIA_IRQ2 )
#define IRQ1_ENABLED(c) ( c & 0x01 )
#define IRQ1_DISABLED(c) !( c & 0x01 )
#define C1_LOW_TO_HIGH(c) ( c & 0x02 )
#define C1_HIGH_TO_LOW(c) !( c & 0x02 )
#define OUTPUT_SELECTED(c) ( c & 0x04 )
#define DDR_SELECTED(c) !( c & 0x04 )
#define IRQ2_ENABLED(c) ( c & 0x08 )
#define IRQ2_DISABLED(c) !( c & 0x08 )
#define STROBE_E_RESET(c) ( c & 0x08 )
#define STROBE_C1_RESET(c) !( c & 0x08 )
#define SET_C2(c) ( c & 0x08 )
#define RESET_C2(c) !( c & 0x08 )
#define C2_LOW_TO_HIGH(c) ( c & 0x10 )
#define C2_HIGH_TO_LOW(c) !( c & 0x10 )
#define C2_SET_MODE(c) ( c & 0x10 )
#define C2_STROBE_MODE(c) !( c & 0x10 )
#define C2_OUTPUT(c) ( c & 0x20 )
#define C2_INPUT(c) !( c & 0x20 )
#define PIA_W_CALLBACK(st, val) \
if ( st.func ) st.func( this, st.objTo, 0, val )
//////////////////////////////////////////////////////////////////////
C6821::C6821()
{
Reset();
m_stOutA.objTo = NULL;
m_stOutA.func = NULL;
m_stOutB.objTo = NULL;
m_stOutB.func = NULL;
m_stOutCA2.objTo = NULL;
m_stOutCA2.func = NULL;
m_stOutCB2.objTo = NULL;
m_stOutCB2.func = NULL;
m_stOutIRQA.objTo = NULL;
m_stOutIRQA.func = NULL;
m_stOutIRQB.objTo = NULL;
m_stOutIRQB.func = NULL;
}
C6821::~C6821()
{
}
void C6821::SetListenerA(void *objTo, mem_write_handler func)
{
m_stOutA.objTo = objTo;
m_stOutA.func = func;
}
void C6821::SetListenerB(void *objTo, mem_write_handler func)
{
m_stOutB.objTo = objTo;
m_stOutB.func = func;
}
void C6821::SetListenerCA2(void *objTo, mem_write_handler func)
{
m_stOutCA2.objTo = objTo;
m_stOutCA2.func = func;
}
void C6821::SetListenerCB2(void *objTo, mem_write_handler func)
{
m_stOutCB2.objTo = objTo;
m_stOutCB2.func = func;
}
BYTE C6821::Read(BYTE byRS)
{
BYTE retval = 0;
byRS &= 3;
switch ( byRS )
{
/******************* port A output/DDR read *******************/
case PIA_DDRA:
// read output register
if ( OUTPUT_SELECTED(m_byCTLA) )
{
// combine input and output values
retval = ( m_byOA & m_byDDRA ) | ( m_byIA & ~m_byDDRA );
// IRQ flags implicitly cleared by a read
CLEAR_IRQ1( m_byCTLA );
CLEAR_IRQ1( m_byCTLB );
UpdateInterrupts();
// CA2 is configured as output and in read strobe mode
if ( C2_OUTPUT(m_byCTLA) && C2_STROBE_MODE(m_byCTLA) )
{
// this will cause a transition low; call the output function if we're currently high
if ( m_byOCA2 )
PIA_W_CALLBACK( m_stOutCA2, 0 );
m_byOCA2 = 0;
// if the CA2 strobe is cleared by the E, reset it right away
if ( STROBE_E_RESET( m_byCTLA ) )
{
PIA_W_CALLBACK( m_stOutCA2, 1 );
m_byOCA2 = 1;
}
}
}
// read DDR register
else
{
retval = m_byDDRA;
}
break;
/******************* port B output/DDR read *******************/
case PIA_DDRB:
// read output register
if ( OUTPUT_SELECTED( m_byCTLB ) )
{
// combine input and output values
retval = ( m_byOB & m_byDDRB ) + ( m_byIB & ~m_byDDRB );
// IRQ flags implicitly cleared by a read
CLEAR_IRQ2( m_byCTLA );
CLEAR_IRQ2( m_byCTLB );
UpdateInterrupts();
}
/* read DDR register */
else
{
retval = m_byDDRB;
}
break;
/******************* port A control read *******************/
case PIA_CTLA:
// read control register
retval = m_byCTLA;
// when CA2 is an output, IRQA2 = 0, and is not affected by CA2 transitions.
if ( C2_OUTPUT( m_byCTLA ) )
retval &= ~PIA_IRQ2;
break;
/******************* port B control read *******************/
case PIA_CTLB:
retval = m_byCTLB;
// when CB2 is an output, IRQB2 = 0, and is not affected by CB2 transitions.
if ( C2_OUTPUT( m_byCTLB ) )
retval &= ~PIA_IRQ2;
break;
}
return retval;
}
void C6821::Write(BYTE byRS, BYTE byData)
{
byRS &= 3;
switch( byRS )
{
/******************* port A output/DDR write *******************/
case PIA_DDRA:
// write output register
if ( OUTPUT_SELECTED( m_byCTLA ) )
{
// update the output value
m_byOA = byData;
// send it to the output function
if ( m_byDDRA )
PIA_W_CALLBACK( m_stOutA, m_byOA & m_byDDRA );
}
// write DDR register
else
{
if ( m_byDDRA != byData )
{
m_byDDRA = byData;
// send it to the output function
if ( m_byDDRA )
PIA_W_CALLBACK( m_stOutA, m_byOA & m_byDDRA );
}
}
break;
/******************* port B output/DDR write *******************/
case PIA_DDRB:
// write output register
if ( OUTPUT_SELECTED( m_byCTLB ) )
{
// update the output value
m_byOB = byData;
// send it to the output function
if ( m_byDDRB )
PIA_W_CALLBACK( m_stOutB, m_byOB & m_byDDRB );
// CB2 is configured as output and in write strobe mode
if ( C2_OUTPUT( m_byCTLB ) && C2_STROBE_MODE( m_byCTLB ) )
{
// this will cause a transition low; call the output function if we're currently high
if ( m_byOCB2 )
PIA_W_CALLBACK( m_stOutCB2, 0 );
m_byOCB2 = 0;
// if the CB2 strobe is cleared by the E, reset it right away
if ( STROBE_E_RESET( m_byCTLB ) )
{
PIA_W_CALLBACK( m_stOutCB2, 1 );
m_byOCB2 = 1;
}
}
}
// write DDR register
else
{
if ( m_byDDRB != byData )
{
m_byDDRB = byData;
// send it to the output function
if ( m_byDDRB )
PIA_W_CALLBACK( m_stOutB, m_byOB & m_byDDRB );
}
}
break;
/******************* port A control write *******************/
case PIA_CTLA:
// Bit 7 and 6 read only
byData &= 0x3f;
// CA2 is configured as output and in set/reset mode
if ( C2_OUTPUT( byData ) )
{
// determine the new value
int temp = SET_C2( byData ) ? 1 : 0;
// if this creates a transition, call the CA2 output function
if ( m_byOCA2 ^ temp)
PIA_W_CALLBACK( m_stOutCA2, temp );
// set the new value
m_byOCA2 = temp;
}
// update the control register
m_byCTLA = ( m_byCTLA & ~0x3F ) | byData;
// update externals
UpdateInterrupts();
break;
/******************* port B control write *******************/
case PIA_CTLB:
/* Bit 7 and 6 read only - PD 16/01/00 */
byData &= 0x3f;
// CB2 is configured as output and in set/reset mode
if ( C2_OUTPUT( byData ) )
{
// determine the new value
int temp = SET_C2( byData ) ? 1 : 0;
// if this creates a transition, call the CA2 output function
if ( m_byOCB2 ^ temp)
PIA_W_CALLBACK( m_stOutCB2, temp );
// set the new value
m_byOCB2 = temp;
}
// update the control register
m_byCTLB = ( m_byCTLB & ~0x3F ) | byData;
// update externals
UpdateInterrupts();
break;
}
}
void C6821::Reset()
{
m_byIA = 0;
m_byCA1 = 0;
m_byICA2 = 0;
m_byOA = 0;
m_byOCA2 = 0;
m_byDDRA = 0;
m_byCTLA = 0;
m_byIRQAState = 0;
m_byIB = 0;
m_byCB1 = 0;
m_byICB2 = 0;
m_byOB = 0;
m_byOCB2 = 0;
m_byDDRB = 0;
m_byCTLB = 0;
m_byIRQBState = 0;
}
void C6821::UpdateInterrupts()
{
BYTE byNewState;
// start with IRQ A
byNewState = 0;
if ( ( IRQ1( m_byCTLA ) && IRQ1_ENABLED( m_byCTLA ) ) ||
( IRQ2( m_byCTLA ) && IRQ2_ENABLED( m_byCTLA ) ) )
byNewState = 1;
if ( byNewState != m_byIRQAState )
{
m_byIRQAState = byNewState;
PIA_W_CALLBACK( m_stOutIRQA, m_byIRQAState );
}
/* then do IRQ B */
byNewState = 0;
if ( ( IRQ1( m_byCTLB ) && IRQ1_ENABLED( m_byCTLB ) ) ||
( IRQ2( m_byCTLB ) && IRQ2_ENABLED( m_byCTLB ) ) )
byNewState = 1;
if ( byNewState != m_byIRQBState )
{
m_byIRQBState = byNewState;
PIA_W_CALLBACK( m_stOutIRQB, m_byIRQBState );
}
}
void C6821::SetCA1(BYTE byData)
{
byData = byData ? 1 : 0;
// the new state has caused a transition
if ( m_byCA1 ^ byData )
{
// handle the active transition
if ( ( byData && C1_LOW_TO_HIGH( m_byCTLA ) ) ||
( !byData && C1_HIGH_TO_LOW( m_byCTLA ) ) )
{
// mark the IRQ
SET_IRQ1(m_byCTLA);
// update externals
UpdateInterrupts();
// CA2 is configured as output and in read strobe mode and cleared by a CA1 transition
if ( C2_OUTPUT( m_byCTLA ) && C2_STROBE_MODE( m_byCTLA ) && STROBE_C1_RESET( m_byCTLA ) )
{
// call the CA2 output function
if ( !m_byOCA2 )
PIA_W_CALLBACK( m_stOutCA2, 1 );
// clear CA2
m_byOCA2 = 1;
}
}
}
// set the new value for CA1
m_byCA1 = byData;
}
void C6821::SetCA2(BYTE byData)
{
byData = byData ? 1 : 0;
// CA2 is in input mode
if ( C2_INPUT( m_byCTLA ) )
{
// the new state has caused a transition
if ( m_byICA2 ^ byData )
{
// handle the active transition
if ( ( byData && C2_LOW_TO_HIGH( m_byCTLA ) ) ||
( !byData && C2_HIGH_TO_LOW( m_byCTLA ) ) )
{
// mark the IRQ
SET_IRQ2( m_byCTLA );
// update externals
UpdateInterrupts();
}
}
}
// set the new value for CA2
m_byICA2 = byData;
}
void C6821::SetCB1(BYTE byData)
{
byData = byData ? 1 : 0;
// the new state has caused a transition
if ( m_byCB1 ^ byData )
{
// handle the active transition
if ( ( byData && C1_LOW_TO_HIGH( m_byCTLB ) ) ||
( !byData && C1_HIGH_TO_LOW( m_byCTLB ) ) )
{
// mark the IRQ
SET_IRQ1( m_byCTLB );
// update externals
UpdateInterrupts();
// CB2 is configured as output and in read strobe mode and cleared by a CA1 transition
if ( C2_OUTPUT( m_byCTLB ) && C2_STROBE_MODE( m_byCTLB ) && STROBE_C1_RESET( m_byCTLB ) )
{
// the IRQ1 flag must have also been cleared
if ( !IRQ1( m_byCTLB ) )
{
// call the CB2 output function
if ( !m_byOCB2 )
PIA_W_CALLBACK( m_stOutCB2, 1 );
// clear CB2
m_byOCB2 = 1;
}
}
}
}
// set the new value for CA1
m_byCB1 = byData;
}
void C6821::SetCB2(BYTE byData)
{
byData = byData ? 1 : 0;
// CA2 is in input mode
if ( C2_INPUT( m_byCTLB ) )
{
// the new state has caused a transition
if ( m_byICB2 ^ byData )
{
// handle the active transition
if ( ( byData && C2_LOW_TO_HIGH( m_byCTLB ) ) ||
( !byData && C2_HIGH_TO_LOW( m_byCTLB ) ) )
{
// mark the IRQ
SET_IRQ2( m_byCTLB );
// update externals
UpdateInterrupts();
}
}
}
// set the new value for CA2
m_byICB2 = byData;
}
void C6821::SetPA(BYTE byData)
{
m_byIA = byData;
}
void C6821::SetPB(BYTE byData)
{
m_byIB = byData;
}
BYTE C6821::GetPA()
{
return m_byOA & m_byDDRA;
}
BYTE C6821::GetPB()
{
return m_byOB & m_byDDRB;
}

68
linapple-pie/src/6821.h Normal file
View File

@ -0,0 +1,68 @@
// Motorola MC6821 PIA
typedef void (*mem_write_handler) (void* objFrom, void* objTo, int nAddr, BYTE byData);
typedef struct _STWriteHandler
{
void* objTo;
mem_write_handler func;
} STWriteHandler;
//
#define PIA_DDRA 0
#define PIA_CTLA 1
#define PIA_DDRB 2
#define PIA_CTLB 3
class C6821
{
public:
C6821();
virtual ~C6821();
BYTE GetPB();
BYTE GetPA();
void SetPB(BYTE byData);
void SetPA(BYTE byData);
void SetCA1( BYTE byData );
void SetCA2( BYTE byData );
void SetCB1( BYTE byData );
void SetCB2( BYTE byData );
void Reset();
BYTE Read( BYTE byRS );
void Write( BYTE byRS, BYTE byData );
void UpdateInterrupts();
void SetListenerA( void *objTo, mem_write_handler func );
void SetListenerB( void *objTo, mem_write_handler func );
void SetListenerCA2( void *objTo, mem_write_handler func );
void SetListenerCB2( void *objTo, mem_write_handler func );
protected:
BYTE m_byIA;
BYTE m_byCA1;
BYTE m_byICA2;
BYTE m_byOA;
BYTE m_byOCA2;
BYTE m_byDDRA;
BYTE m_byCTLA;
BYTE m_byIRQAState;
BYTE m_byIB;
BYTE m_byCB1;
BYTE m_byICB2;
BYTE m_byOB;
BYTE m_byOCB2;
BYTE m_byDDRB;
BYTE m_byCTLB;
BYTE m_byIRQBState;
STWriteHandler m_stOutA;
STWriteHandler m_stOutB;
STWriteHandler m_stOutCA2;
STWriteHandler m_stOutCB2;
STWriteHandler m_stOutIRQA;
STWriteHandler m_stOutIRQB;
};

796
linapple-pie/src/AY8910.cpp Normal file
View File

@ -0,0 +1,796 @@
/***************************************************************************
ay8910.c
Emulation of the AY-3-8910 / YM2149 sound chip.
Based on various code snippets by Ville Hallik, Michael Cuddy,
Tatsuyuki Satoh, Fabrice Frances, Nicola Salmoria.
***************************************************************************/
//
// From mame.txt (http://www.mame.net/readme.html)
//
// VI. Reuse of Source Code
// --------------------------
// This chapter might not apply to specific portions of MAME (e.g. CPU
// emulators) which bear different copyright notices.
// The source code cannot be used in a commercial product without the written
// authorization of the authors. Use in non-commercial products is allowed, and
// indeed encouraged. If you use portions of the MAME source code in your
// program, however, you must make the full source code freely available as
// well.
// Usage of the _information_ contained in the source code is free for any use.
// However, given the amount of time and energy it took to collect this
// information, if you find new information we would appreciate if you made it
// freely available as well.
//
#include "wincompat.h"
#include <stdio.h>
#include <string.h>
#include <SDL/SDL.h>
//#include <unistd.h>
//#include <stdlib.h>
//#include <crtdbg.h>
#include "AY8910.h"
#include "Common.h"
#include "Structs.h"
#include "AppleWin.h" // For g_fh
#include "Mockingboard.h" // For g_uTimer1IrqCount
///////////////////////////////////////////////////////////
// typedefs & dummy funcs to allow MAME code to compile:
typedef UINT8 (*mem_read_handler)(UINT32);
typedef void (*mem_write_handler)(UINT32, UINT8);
static void logerror(char* psz, ...)
{
}
static unsigned short activecpu_get_pc()
{
return 0;
}
//
///////////////////////////////////////////////////////////
#define MAX_OUTPUT 0x7fff
// See AY8910_set_clock() for definition of STEP
#define STEP 0x8000
static int num = 0, ym_num = 0;
struct AY8910
{
int Channel;
int SampleRate;
mem_read_handler PortAread;
mem_read_handler PortBread;
mem_write_handler PortAwrite;
mem_write_handler PortBwrite;
int register_latch;
unsigned char Regs[16];
int lastEnable;
unsigned int UpdateStep;
int PeriodA,PeriodB,PeriodC,PeriodN,PeriodE;
int CountA,CountB,CountC,CountN,CountE;
unsigned int VolA,VolB,VolC,VolE;
unsigned char EnvelopeA,EnvelopeB,EnvelopeC;
unsigned char OutputA,OutputB,OutputC,OutputN;
signed char CountEnv;
unsigned char Hold,Alternate,Attack,Holding;
int RNG;
unsigned int VolTable[32];
};
/* register id's */
#define AY_AFINE (0)
#define AY_ACOARSE (1)
#define AY_BFINE (2)
#define AY_BCOARSE (3)
#define AY_CFINE (4)
#define AY_CCOARSE (5)
#define AY_NOISEPER (6)
#define AY_ENABLE (7)
#define AY_AVOL (8)
#define AY_BVOL (9)
#define AY_CVOL (10)
#define AY_EFINE (11)
#define AY_ECOARSE (12)
#define AY_ESHAPE (13)
#define AY_PORTA (14)
#define AY_PORTB (15)
static struct AY8910 AYPSG[MAX_8910]; /* array of PSG's */
static bool g_bAYReset = false; // Doing AY8910_reset()
//-----------------------------------------------------------------------------
//#define LOG_AY8910
#ifdef LOG_AY8910
static void LogAY8910(int n, int r, UINT uFreq)
{
// TO DO: Determine freq from 6522 timer
if ((g_fh == NULL) || g_bAYReset)
return;
static UINT nCnt = 0;
const UINT nNumAYs = 4; // 1..4
if((r == 0))
{
if(nCnt == 0)
{
fprintf(g_fh, "Time : ");
for(UINT i=0; i<nNumAYs; i++)
fprintf(g_fh, "APer BPer CPer NP EN AV BV CV ");
fprintf(g_fh, "\n");
}
fprintf(g_fh, "%02d.%02d: ", g_uTimer1IrqCount/uFreq, g_uTimer1IrqCount%uFreq);
for(int j=0; j<n*(3*5+5*3+1); j++)
fprintf(g_fh, " ");
UINT i=n;
{
UCHAR* pAYRegs = &AYPSG[i].Regs[0];
fprintf(g_fh, "%04X ", *(USHORT*)&pAYRegs[AY_AFINE]);
fprintf(g_fh, "%04X ", *(USHORT*)&pAYRegs[AY_BFINE]);
fprintf(g_fh, "%04X ", *(USHORT*)&pAYRegs[AY_CFINE]);
fprintf(g_fh, "%02X ", pAYRegs[AY_NOISEPER]);
fprintf(g_fh, "%02X ", pAYRegs[AY_ENABLE]);
fprintf(g_fh, "%02X ", pAYRegs[AY_AVOL]);
fprintf(g_fh, "%02X ", pAYRegs[AY_BVOL]);
fprintf(g_fh, "%02X ", pAYRegs[AY_CVOL]);
}
fprintf(g_fh, "\n");
nCnt++;
}
}
#endif
//-----------------------------------------------------------------------------
void _AYWriteReg(int n, int r, int v)
{
struct AY8910 *PSG = &AYPSG[n];
int old;
PSG->Regs[r] = v;
#ifdef LOG_AY8910
LogAY8910(n, r, 60);
#endif
/* A note about the period of tones, noise and envelope: for speed reasons,*/
/* we count down from the period to 0, but careful studies of the chip */
/* output prove that it instead counts up from 0 until the counter becomes */
/* greater or equal to the period. This is an important difference when the*/
/* program is rapidly changing the period to modulate the sound. */
/* To compensate for the difference, when the period is changed we adjust */
/* our internal counter. */
/* Also, note that period = 0 is the same as period = 1. This is mentioned */
/* in the YM2203 data sheets. However, this does NOT apply to the Envelope */
/* period. In that case, period = 0 is half as period = 1. */
switch( r )
{
case AY_AFINE:
case AY_ACOARSE:
PSG->Regs[AY_ACOARSE] &= 0x0f;
old = PSG->PeriodA;
PSG->PeriodA = (PSG->Regs[AY_AFINE] + 256 * PSG->Regs[AY_ACOARSE]) * PSG->UpdateStep;
if (PSG->PeriodA == 0) PSG->PeriodA = PSG->UpdateStep;
PSG->CountA += PSG->PeriodA - old;
if (PSG->CountA <= 0) PSG->CountA = 1;
break;
case AY_BFINE:
case AY_BCOARSE:
PSG->Regs[AY_BCOARSE] &= 0x0f;
old = PSG->PeriodB;
PSG->PeriodB = (PSG->Regs[AY_BFINE] + 256 * PSG->Regs[AY_BCOARSE]) * PSG->UpdateStep;
if (PSG->PeriodB == 0) PSG->PeriodB = PSG->UpdateStep;
PSG->CountB += PSG->PeriodB - old;
if (PSG->CountB <= 0) PSG->CountB = 1;
break;
case AY_CFINE:
case AY_CCOARSE:
PSG->Regs[AY_CCOARSE] &= 0x0f;
old = PSG->PeriodC;
PSG->PeriodC = (PSG->Regs[AY_CFINE] + 256 * PSG->Regs[AY_CCOARSE]) * PSG->UpdateStep;
if (PSG->PeriodC == 0) PSG->PeriodC = PSG->UpdateStep;
PSG->CountC += PSG->PeriodC - old;
if (PSG->CountC <= 0) PSG->CountC = 1;
break;
case AY_NOISEPER:
PSG->Regs[AY_NOISEPER] &= 0x1f;
old = PSG->PeriodN;
PSG->PeriodN = PSG->Regs[AY_NOISEPER] * PSG->UpdateStep;
if (PSG->PeriodN == 0) PSG->PeriodN = PSG->UpdateStep;
PSG->CountN += PSG->PeriodN - old;
if (PSG->CountN <= 0) PSG->CountN = 1;
break;
case AY_ENABLE:
if ((PSG->lastEnable == -1) ||
((PSG->lastEnable & 0x40) != (PSG->Regs[AY_ENABLE] & 0x40)))
{
/* write out 0xff if port set to input */
if (PSG->PortAwrite)
(*PSG->PortAwrite)(0, (UINT8) ((PSG->Regs[AY_ENABLE] & 0x40) ? PSG->Regs[AY_PORTA] : 0xff)); // [TC: UINT8 cast]
}
if ((PSG->lastEnable == -1) ||
((PSG->lastEnable & 0x80) != (PSG->Regs[AY_ENABLE] & 0x80)))
{
/* write out 0xff if port set to input */
if (PSG->PortBwrite)
(*PSG->PortBwrite)(0, (UINT8) ((PSG->Regs[AY_ENABLE] & 0x80) ? PSG->Regs[AY_PORTB] : 0xff)); // [TC: UINT8 cast]
}
PSG->lastEnable = PSG->Regs[AY_ENABLE];
break;
case AY_AVOL:
PSG->Regs[AY_AVOL] &= 0x1f;
PSG->EnvelopeA = PSG->Regs[AY_AVOL] & 0x10;
PSG->VolA = PSG->EnvelopeA ? PSG->VolE : PSG->VolTable[PSG->Regs[AY_AVOL] ? PSG->Regs[AY_AVOL]*2+1 : 0];
break;
case AY_BVOL:
PSG->Regs[AY_BVOL] &= 0x1f;
PSG->EnvelopeB = PSG->Regs[AY_BVOL] & 0x10;
PSG->VolB = PSG->EnvelopeB ? PSG->VolE : PSG->VolTable[PSG->Regs[AY_BVOL] ? PSG->Regs[AY_BVOL]*2+1 : 0];
break;
case AY_CVOL:
PSG->Regs[AY_CVOL] &= 0x1f;
PSG->EnvelopeC = PSG->Regs[AY_CVOL] & 0x10;
PSG->VolC = PSG->EnvelopeC ? PSG->VolE : PSG->VolTable[PSG->Regs[AY_CVOL] ? PSG->Regs[AY_CVOL]*2+1 : 0];
break;
case AY_EFINE:
case AY_ECOARSE:
// _ASSERT((PSG->Regs[AY_EFINE] == 0) && (PSG->Regs[AY_ECOARSE] == 0));
old = PSG->PeriodE;
PSG->PeriodE = ((PSG->Regs[AY_EFINE] + 256 * PSG->Regs[AY_ECOARSE])) * PSG->UpdateStep;
if (PSG->PeriodE == 0) PSG->PeriodE = PSG->UpdateStep / 2;
PSG->CountE += PSG->PeriodE - old;
if (PSG->CountE <= 0) PSG->CountE = 1;
break;
case AY_ESHAPE:
// _ASSERT(PSG->Regs[AY_ESHAPE] == 0);
/* envelope shapes:
C AtAlH
0 0 x x \___
0 1 x x /___
1 0 0 0 \\\\
1 0 0 1 \___
1 0 1 0 \/\/
___
1 0 1 1 \
1 1 0 0 ////
___
1 1 0 1 /
1 1 1 0 /\/\
1 1 1 1 /___
The envelope counter on the AY-3-8910 has 16 steps. On the YM2149 it
has twice the steps, happening twice as fast. Since the end result is
just a smoother curve, we always use the YM2149 behaviour.
*/
PSG->Regs[AY_ESHAPE] &= 0x0f;
PSG->Attack = (PSG->Regs[AY_ESHAPE] & 0x04) ? 0x1f : 0x00;
if ((PSG->Regs[AY_ESHAPE] & 0x08) == 0)
{
/* if Continue = 0, map the shape to the equivalent one which has Continue = 1 */
PSG->Hold = 1;
PSG->Alternate = PSG->Attack;
}
else
{
PSG->Hold = PSG->Regs[AY_ESHAPE] & 0x01;
PSG->Alternate = PSG->Regs[AY_ESHAPE] & 0x02;
}
PSG->CountE = PSG->PeriodE;
PSG->CountEnv = 0x1f;
PSG->Holding = 0;
PSG->VolE = PSG->VolTable[PSG->CountEnv ^ PSG->Attack];
if (PSG->EnvelopeA) PSG->VolA = PSG->VolE;
if (PSG->EnvelopeB) PSG->VolB = PSG->VolE;
if (PSG->EnvelopeC) PSG->VolC = PSG->VolE;
break;
case AY_PORTA:
if (PSG->Regs[AY_ENABLE] & 0x40)
{
if (PSG->PortAwrite)
(*PSG->PortAwrite)(0, PSG->Regs[AY_PORTA]);
else
logerror("PC %04x: warning - write %02x to 8910 #%d Port A\n",activecpu_get_pc(),PSG->Regs[AY_PORTA],n);
}
else
{
logerror("warning: write to 8910 #%d Port A set as input - ignored\n",n);
}
break;
case AY_PORTB:
if (PSG->Regs[AY_ENABLE] & 0x80)
{
if (PSG->PortBwrite)
(*PSG->PortBwrite)(0, PSG->Regs[AY_PORTB]);
else
logerror("PC %04x: warning - write %02x to 8910 #%d Port B\n",activecpu_get_pc(),PSG->Regs[AY_PORTB],n);
}
else
{
logerror("warning: write to 8910 #%d Port B set as input - ignored\n",n);
}
break;
}
}
// /length/ is the number of samples we require
// NB. This should be called at twice the 6522 IRQ rate or (eg) 60Hz if no IRQ.
void AY8910Update(int chip,INT16 **buffer,int length) // [TC: Removed static]
{
struct AY8910 *PSG = &AYPSG[chip];
INT16 *buf1,*buf2,*buf3;
int outn;
buf1 = buffer[0];
buf2 = buffer[1];
buf3 = buffer[2];
/* The 8910 has three outputs, each output is the mix of one of the three */
/* tone generators and of the (single) noise generator. The two are mixed */
/* BEFORE going into the DAC. The formula to mix each channel is: */
/* (ToneOn | ToneDisable) & (NoiseOn | NoiseDisable). */
/* Note that this means that if both tone and noise are disabled, the output */
/* is 1, not 0, and can be modulated changing the volume. */
/* If the channels are disabled, set their output to 1, and increase the */
/* counter, if necessary, so they will not be inverted during this update. */
/* Setting the output to 1 is necessary because a disabled channel is locked */
/* into the ON state (see above); and it has no effect if the volume is 0. */
/* If the volume is 0, increase the counter, but don't touch the output. */
if (PSG->Regs[AY_ENABLE] & 0x01)
{
if (PSG->CountA <= length*STEP) PSG->CountA += length*STEP;
PSG->OutputA = 1;
}
else if (PSG->Regs[AY_AVOL] == 0)
{
/* note that I do count += length, NOT count = length + 1. You might think */
/* it's the same since the volume is 0, but doing the latter could cause */
/* interferencies when the program is rapidly modulating the volume. */
if (PSG->CountA <= length*STEP) PSG->CountA += length*STEP;
}
if (PSG->Regs[AY_ENABLE] & 0x02)
{
if (PSG->CountB <= length*STEP) PSG->CountB += length*STEP;
PSG->OutputB = 1;
}
else if (PSG->Regs[AY_BVOL] == 0)
{
if (PSG->CountB <= length*STEP) PSG->CountB += length*STEP;
}
if (PSG->Regs[AY_ENABLE] & 0x04)
{
if (PSG->CountC <= length*STEP) PSG->CountC += length*STEP;
PSG->OutputC = 1;
}
else if (PSG->Regs[AY_CVOL] == 0)
{
if (PSG->CountC <= length*STEP) PSG->CountC += length*STEP;
}
/* for the noise channel we must not touch OutputN - it's also not necessary */
/* since we use outn. */
if ((PSG->Regs[AY_ENABLE] & 0x38) == 0x38) /* all off */
if (PSG->CountN <= length*STEP) PSG->CountN += length*STEP;
outn = (PSG->OutputN | PSG->Regs[AY_ENABLE]);
/* buffering loop */
while (length)
{
int vola,volb,volc;
int left;
/* vola, volb and volc keep track of how long each square wave stays */
/* in the 1 position during the sample period. */
vola = volb = volc = 0;
left = STEP;
do
{
int nextevent;
if (PSG->CountN < left) nextevent = PSG->CountN;
else nextevent = left;
if (outn & 0x08)
{
if (PSG->OutputA) vola += PSG->CountA;
PSG->CountA -= nextevent;
/* PeriodA is the half period of the square wave. Here, in each */
/* loop I add PeriodA twice, so that at the end of the loop the */
/* square wave is in the same status (0 or 1) it was at the start. */
/* vola is also incremented by PeriodA, since the wave has been 1 */
/* exactly half of the time, regardless of the initial position. */
/* If we exit the loop in the middle, OutputA has to be inverted */
/* and vola incremented only if the exit status of the square */
/* wave is 1. */
while (PSG->CountA <= 0)
{
PSG->CountA += PSG->PeriodA;
if (PSG->CountA > 0)
{
PSG->OutputA ^= 1;
if (PSG->OutputA) vola += PSG->PeriodA;
break;
}
PSG->CountA += PSG->PeriodA;
vola += PSG->PeriodA;
}
if (PSG->OutputA) vola -= PSG->CountA;
}
else
{
PSG->CountA -= nextevent;
while (PSG->CountA <= 0)
{
PSG->CountA += PSG->PeriodA;
if (PSG->CountA > 0)
{
PSG->OutputA ^= 1;
break;
}
PSG->CountA += PSG->PeriodA;
}
}
if (outn & 0x10)
{
if (PSG->OutputB) volb += PSG->CountB;
PSG->CountB -= nextevent;
while (PSG->CountB <= 0)
{
PSG->CountB += PSG->PeriodB;
if (PSG->CountB > 0)
{
PSG->OutputB ^= 1;
if (PSG->OutputB) volb += PSG->PeriodB;
break;
}
PSG->CountB += PSG->PeriodB;
volb += PSG->PeriodB;
}
if (PSG->OutputB) volb -= PSG->CountB;
}
else
{
PSG->CountB -= nextevent;
while (PSG->CountB <= 0)
{
PSG->CountB += PSG->PeriodB;
if (PSG->CountB > 0)
{
PSG->OutputB ^= 1;
break;
}
PSG->CountB += PSG->PeriodB;
}
}
if (outn & 0x20)
{
if (PSG->OutputC) volc += PSG->CountC;
PSG->CountC -= nextevent;
while (PSG->CountC <= 0)
{
PSG->CountC += PSG->PeriodC;
if (PSG->CountC > 0)
{
PSG->OutputC ^= 1;
if (PSG->OutputC) volc += PSG->PeriodC;
break;
}
PSG->CountC += PSG->PeriodC;
volc += PSG->PeriodC;
}
if (PSG->OutputC) volc -= PSG->CountC;
}
else
{
PSG->CountC -= nextevent;
while (PSG->CountC <= 0)
{
PSG->CountC += PSG->PeriodC;
if (PSG->CountC > 0)
{
PSG->OutputC ^= 1;
break;
}
PSG->CountC += PSG->PeriodC;
}
}
PSG->CountN -= nextevent;
if (PSG->CountN <= 0)
{
/* Is noise output going to change? */
if ((PSG->RNG + 1) & 2) /* (bit0^bit1)? */
{
PSG->OutputN = ~PSG->OutputN;
outn = (PSG->OutputN | PSG->Regs[AY_ENABLE]);
}
/* The Random Number Generator of the 8910 is a 17-bit shift */
/* register. The input to the shift register is bit0 XOR bit3 */
/* (bit0 is the output). This was verified on AY-3-8910 and YM2149 chips. */
/* The following is a fast way to compute bit17 = bit0^bit3. */
/* Instead of doing all the logic operations, we only check */
/* bit0, relying on the fact that after three shifts of the */
/* register, what now is bit3 will become bit0, and will */
/* invert, if necessary, bit14, which previously was bit17. */
if (PSG->RNG & 1) PSG->RNG ^= 0x24000; /* This version is called the "Galois configuration". */
PSG->RNG >>= 1;
PSG->CountN += PSG->PeriodN;
}
left -= nextevent;
} while (left > 0);
/* update envelope */
if (PSG->Holding == 0)
{
PSG->CountE -= STEP;
if (PSG->CountE <= 0)
{
do
{
PSG->CountEnv--;
PSG->CountE += PSG->PeriodE;
} while (PSG->CountE <= 0);
/* check envelope current position */
if (PSG->CountEnv < 0)
{
if (PSG->Hold)
{
if (PSG->Alternate)
PSG->Attack ^= 0x1f;
PSG->Holding = 1;
PSG->CountEnv = 0;
}
else
{
/* if CountEnv has looped an odd number of times (usually 1), */
/* invert the output. */
if (PSG->Alternate && (PSG->CountEnv & 0x20))
PSG->Attack ^= 0x1f;
PSG->CountEnv &= 0x1f;
}
}
PSG->VolE = PSG->VolTable[PSG->CountEnv ^ PSG->Attack];
/* reload volume */
if (PSG->EnvelopeA) PSG->VolA = PSG->VolE;
if (PSG->EnvelopeB) PSG->VolB = PSG->VolE;
if (PSG->EnvelopeC) PSG->VolC = PSG->VolE;
}
}
#if 0
*(buf1++) = (vola * PSG->VolA) / STEP;
*(buf2++) = (volb * PSG->VolB) / STEP;
*(buf3++) = (volc * PSG->VolC) / STEP;
#else
// Output PCM wave [-32768...32767] instead of MAME's voltage level [0...32767]
// - This allows for better s/w mixing
if(PSG->VolA)
{
if(vola)
*(buf1++) = (vola * PSG->VolA) / STEP;
else
*(buf1++) = - (int) PSG->VolA;
}
else
{
*(buf1++) = 0;
}
//
if(PSG->VolB)
{
if(volb)
*(buf2++) = (volb * PSG->VolB) / STEP;
else
*(buf2++) = - (int) PSG->VolB;
}
else
{
*(buf2++) = 0;
}
//
if(PSG->VolC)
{
if(volc)
*(buf3++) = (volc * PSG->VolC) / STEP;
else
*(buf3++) = - (int) PSG->VolC;
}
else
{
*(buf3++) = 0;
}
#endif
length--;
}
}
static void AY8910_set_clock(int chip,int clock)
{
struct AY8910 *PSG = &AYPSG[chip];
/* the step clock for the tone and noise generators is the chip clock */
/* divided by 8; for the envelope generator of the AY-3-8910, it is half */
/* that much (clock/16), but the envelope of the YM2149 goes twice as */
/* fast, therefore again clock/8. */
/* Here we calculate the number of steps which happen during one sample */
/* at the given sample rate. No. of events = sample rate / (clock/8). */
/* STEP is a multiplier used to turn the fraction into a fixed point */
/* number. */
PSG->UpdateStep = (unsigned int) (((double)STEP * PSG->SampleRate * 8 + clock/2) / clock); // [TC: unsigned int cast]
}
static void build_mixer_table(int chip)
{
struct AY8910 *PSG = &AYPSG[chip];
int i;
double out;
/* calculate the volume->voltage conversion table */
/* The AY-3-8910 has 16 levels, in a logarithmic scale (3dB per step) */
/* The YM2149 still has 16 levels for the tone generators, but 32 for */
/* the envelope generator (1.5dB per step). */
out = MAX_OUTPUT;
for (i = 31;i > 0;i--)
{
PSG->VolTable[i] = (unsigned int) (out + 0.5); /* round to nearest */ // [TC: unsigned int cast]
out /= 1.188502227; /* = 10 ^ (1.5/20) = 1.5dB */
}
PSG->VolTable[0] = 0;
}
#if 0
void ay8910_write_ym(int chip, int addr, int data)
{
struct AY8910 *PSG = &AYPSG[chip];
// if (addr & 1)
// { /* Data port */
// int r = PSG->register_latch;
int r = addr;
if (r > 15) return;
if (r < 14)
{
if (r == AY_ESHAPE || PSG->Regs[r] != data)
{
/* update the output buffer before changing the register */
// stream_update(PSG->Channel,0);
AY8910Update(chip, INT16 **buffer, int length)
}
}
_AYWriteReg(PSG,r,data);
}
// else
// { /* Register port */
// PSG->register_latch = data & 0x0f;
// }
}
#endif
void AY8910_reset(int chip)
{
g_bAYReset = true;
int i;
struct AY8910 *PSG = &AYPSG[chip];
PSG->register_latch = 0;
PSG->RNG = 1;
PSG->OutputA = 0;
PSG->OutputB = 0;
PSG->OutputC = 0;
PSG->OutputN = 0xff;
PSG->lastEnable = -1; /* force a write */
for (i = 0;i < AY_PORTA;i++)
_AYWriteReg(chip,i,0); /* AYWriteReg() uses the timer system; we cannot */
/* call it at this time because the timer system */
/* has not been initialized. */
g_bAYReset = false;
}
//-------------------------------------
void AY8910_InitAll(int nClock, int nSampleRate)
{
for(int nChip=0; nChip<MAX_8910; nChip++)
{
struct AY8910 *PSG = &AYPSG[nChip];
memset(PSG,0,sizeof(struct AY8910));
PSG->SampleRate = nSampleRate;
PSG->PortAread = NULL;
PSG->PortBread = NULL;
PSG->PortAwrite = NULL;
PSG->PortBwrite = NULL;
AY8910_set_clock(nChip, nClock);
build_mixer_table(nChip);
}
}
//-------------------------------------
void AY8910_InitClock(int nClock)
{
for(int nChip=0; nChip<MAX_8910; nChip++)
{
AY8910_set_clock(nChip, nClock);
}
}
//-------------------------------------
BYTE* AY8910_GetRegsPtr(UINT nAyNum)
{
if(nAyNum >= MAX_8910)
return NULL;
return &AYPSG[nAyNum].Regs[0];
}

15
linapple-pie/src/AY8910.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef AY8910_H
#define AY8910_H
#define MAX_8910 4
void _AYWriteReg(int n, int r, int v);
void AY8910_write_ym(int chip, int addr, int data);
void AY8910_reset(int chip);
void AY8910Update(int chip,INT16 **buffer,int length);
void AY8910_InitAll(int nClock, int nSampleRate);
void AY8910_InitClock(int nClock);
BYTE* AY8910_GetRegsPtr(UINT nAyNum);
#endif

View File

@ -0,0 +1,71 @@
#pragma once
#ifdef _WIN32
#define FILE_SEPARATOR TEXT('\\')
#else
#define FILE_SEPARATOR TEXT('/')
#endif
#define FTP_SEPARATOR TEXT('/')
// let it be our second version!
#define LINAPPLE_VERSION 2
#include <curl/curl.h>
extern FILE * spMono,*spStereo;
extern char VERSIONSTRING[]; // Contructed in WinMain()
extern TCHAR *g_pAppTitle;
extern eApple2Type g_Apple2Type;
extern BOOL behind;
extern DWORD cumulativecycles;
extern DWORD cyclenum;
extern DWORD emulmsec;
extern bool g_bFullSpeed;
// Win32
//extern HINSTANCE g_hInstance;
extern AppMode_e g_nAppMode;
extern UINT g_ScreenWidth;
extern UINT g_ScreenHeight;
extern DWORD needsprecision;
//extern TCHAR g_sProgramDir[MAX_PATH];
extern TCHAR g_sCurrentDir[MAX_PATH];
extern TCHAR g_sHDDDir[MAX_PATH];
extern TCHAR g_sSaveStateDir[MAX_PATH];
extern TCHAR g_sParallelPrinterFile[MAX_PATH];
// FTP vars
extern TCHAR g_sFTPLocalDir[MAX_PATH]; // FTP Local Dir, see linapple.conf for details
extern TCHAR g_sFTPServer[MAX_PATH]; // full path to default FTP server
extern TCHAR g_sFTPServerHDD[MAX_PATH]; // full path to default FTP server
//extern TCHAR g_sFTPUser[256]; // user name
//extern TCHAR g_sFTPPass[256]; // password
extern TCHAR g_sFTPUserPass[512]; // full login line
extern CURL * g_curl;
extern bool g_bResetTiming;
extern BOOL restart;
extern DWORD g_dwSpeed;
extern double g_fCurrentCLK6502;
extern int g_nCpuCyclesFeedback;
extern DWORD g_dwCyclesThisFrame;
extern FILE* g_fh; // Filehandle for log file
extern bool g_bDisableDirectSound; // Cmd line switch: don't init DS (so no MB support)
extern UINT g_Slot4; // Mockingboard or Mouse in slot4
void SetCurrentCLK6502();

File diff suppressed because it is too large Load Diff

1738
linapple-pie/src/CPU.cpp Normal file

File diff suppressed because it is too large Load Diff

30
linapple-pie/src/CPU.h Normal file
View File

@ -0,0 +1,30 @@
#pragma once
typedef struct _regsrec {
BYTE a; // accumulator
BYTE x; // index X
BYTE y; // index Y
BYTE ps; // processor status
WORD pc; // program counter
WORD sp; // stack pointer
BYTE bJammed; // CPU has crashed (NMOS 6502 only)
} regsrec, *regsptr;
extern regsrec regs;
extern unsigned __int64 g_nCumulativeCycles;
void CpuDestroy ();
void CpuCalcCycles(ULONG nExecutedCycles);
DWORD CpuExecute (DWORD);
ULONG CpuGetCyclesThisFrame(ULONG nExecutedCycles);
void CpuInitialize ();
void CpuSetupBenchmark ();
void CpuIrqReset();
void CpuIrqAssert(eIRQSRC Device);
void CpuIrqDeassert(eIRQSRC Device);
void CpuNmiReset();
void CpuNmiAssert(eIRQSRC Device);
void CpuNmiDeassert(eIRQSRC Device);
void CpuReset ();
DWORD CpuGetSnapshot(SS_CPU6502* pSS);
DWORD CpuSetSnapshot(SS_CPU6502* pSS);

152
linapple-pie/src/Common.h Normal file
View File

@ -0,0 +1,152 @@
#pragma once
#define USE_SPEECH_API
const double _M14 = (157500000.0 / 11.0); // 14.3181818... * 10^6
const double CLK_6502 = ((_M14 * 65.0) / 912.0); // 65 cycles per 912 14M clocks
//const double CLK_6502 = 23 * 44100; // 1014300
// The effective Z-80 clock rate is 2.041MHz
// See: http://www.apple2info.net/hardware/softcard/SC-SWHW_a2in.pdf
const double CLK_Z80 = (CLK_6502 * 2);
const UINT uCyclesPerLine = 65; // 25 cycles of HBL & 40 cycles of HBL'
const UINT uVisibleLinesPerFrame = 64*3; // 192
const UINT uLinesPerFrame = 262; // 64 in each third of the screen & 70 in VBL
const DWORD dwClksPerFrame = uCyclesPerLine * uLinesPerFrame; // 17030
#define NUM_SLOTS 8
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define RAMWORKS // 8MB RamWorks III support
#define MOCKINGBOARD // Mockingboard support
// Use a base freq so that DirectX (or sound h/w) doesn't have to up/down-sample
// Assume base freqs are 44.1KHz & 48KHz
const DWORD SPKR_SAMPLE_RATE = 44100; // that is for Apple][ speakers
const DWORD SAMPLE_RATE = 44100; // that is for Phasor/Mockingboard?
enum AppMode_e
{
MODE_LOGO = 0
, MODE_PAUSED
, MODE_RUNNING // 6502 is running at normal speed (Debugger breakpoints may or may not be active)
, MODE_DEBUG // 6502 is paused
, MODE_STEPPING // 6502 is running at full speed (Debugger breakpoints always active)
};
#define SPEED_MIN 0
#define SPEED_NORMAL 10
#define SPEED_MAX 40
#define DRAW_BACKGROUND 1
#define DRAW_LEDS 2
#define DRAW_TITLE 4
#define DRAW_BUTTON_DRIVES 8
// Function Keys F1..F12
#define BTN_HELP 0
#define BTN_RUN 1
#define BTN_DRIVE1 2
#define BTN_DRIVE2 3
#define BTN_DRIVESWAP 4
#define BTN_FULLSCR 5
#define BTN_DEBUG 6
#define BTN_SETUP 7
#define BTN_CYCLE 8
#define BTN_QUIT 9
#define BTN_SAVEST 10
#define BTN_LOADST 11
//#define MAXIMAGES 16
// TODO: Move to StringTable.h
#define TITLE_APPLE_2 TEXT("Apple ][ Emulator")
#define TITLE_APPLE_2_PLUS TEXT("Apple ][+ Emulator")
#define TITLE_APPLE_2E TEXT("Apple //e Emulator")
#define TITLE_APPLE_2E_ENHANCED TEXT("Enhanced Apple //e Emulator")
#define TITLE_PAUSED TEXT(" Paused ")
#define TITLE_STEPPING TEXT("Stepping")
#define LOAD(a,b) RegLoadValue(TEXT("Configuration"),a,1,b)
#define SAVE(a,b) RegSaveValue(TEXT("Configuration"),a,1,b)
// Configuration
#define REGVALUE_APPLE2_TYPE "Apple2 Type"
#define REGVALUE_SPKR_VOLUME "Speaker Volume"
#define REGVALUE_MB_VOLUME "Mockingboard Volume"
#define REGVALUE_SOUNDCARD_TYPE "Soundcard Type"
#define REGVALUE_KEYB_BUFFER_ENABLE "Keyboard Buffer Enable"
#define REGVALUE_SAVESTATE_FILENAME "Save State Filename"
#define REGVALUE_SAVE_STATE_ON_EXIT "Save State On Exit"
#define REGVALUE_HDD_ENABLED "Harddisk Enable"
#define REGVALUE_HDD_IMAGE1 "Harddisk Image 1"
#define REGVALUE_HDD_IMAGE2 "Harddisk Image 2"
#define REGVALUE_DISK_IMAGE1 "Disk Image 1"
#define REGVALUE_DISK_IMAGE2 "Disk Image 2"
#define REGVALUE_PPRINTER_FILENAME "Parallel Printer Filename"
#define REGVALUE_PDL_XTRIM "PDL X-Trim"
#define REGVALUE_PDL_YTRIM "PDL Y-Trim"
#define REGVALUE_SCROLLLOCK_TOGGLE "ScrollLock Toggle"
#define REGVALUE_MOUSE_IN_SLOT4 "Mouse in slot 4"
// Preferences
#define REGVALUE_PREF_START_DIR TEXT("Slot 6 Directory")
#define REGVALUE_PREF_HDD_START_DIR TEXT("HDV Starting Directory")
#define REGVALUE_PREF_SAVESTATE_DIR TEXT("Save State Directory")
#define REGVALUE_SHOW_LEDS TEXT("Show Leds")
// For FTP access
#define REGVALUE_FTP_DIR TEXT("FTP Server")
#define REGVALUE_FTP_HDD_DIR TEXT("FTP ServerHDD")
#define REGVALUE_FTP_LOCAL_DIR TEXT("FTP Local Dir")
#define REGVALUE_FTP_USERPASS TEXT("FTP UserPass")
//#define REGVALUE_FTP_USER TEXT("FTP User")
//#define REGVALUE_FTP_PASS TEXT("FTP Pass")
#define WM_USER_BENCHMARK WM_USER+1
#define WM_USER_RESTART WM_USER+2
#define WM_USER_SAVESTATE WM_USER+3
#define WM_USER_LOADSTATE WM_USER+4
enum eSOUNDCARDTYPE {SC_UNINIT=0, SC_NONE, SC_MOCKINGBOARD, SC_PHASOR}; // Apple soundcard type
typedef BYTE (*iofunction)(WORD nPC, WORD nAddr, BYTE nWriteFlag, BYTE nWriteValue, ULONG nCyclesLeft);
typedef struct _IMAGE__ { int unused; } *HIMAGE;
enum eIRQSRC {IS_6522=0, IS_SPEECH, IS_SSC, IS_MOUSE};
//
#define APPLE2E_MASK 0x10
#define APPLE2C_MASK 0x20
#define IS_APPLE2 ((g_Apple2Type & (APPLE2E_MASK|APPLE2C_MASK)) == 0)
#define IS_APPLE2E (g_Apple2Type & APPLE2E_MASK)
#define IS_APPLE2C (g_Apple2Type & APPLE2C_MASK)
// NB. These get persisted to the Registry, so don't change the values for these enums!
enum eApple2Type {
A2TYPE_APPLE2=0,
A2TYPE_APPLE2PLUS,
A2TYPE_APPLE2E=APPLE2E_MASK,
A2TYPE_APPLE2EEHANCED,
// A2TYPE_APPLE2C=APPLE2C_MASK, // Placeholder
A2TYPE_MAX
};
enum eBUTTON {BUTTON0=0, BUTTON1};
enum eBUTTONSTATE {BUTTON_UP=0, BUTTON_DOWN};
// sizes of status panel
#define STATUS_PANEL_W 100
#define STATUS_PANEL_H 48

129
linapple-pie/src/Debug.cpp Normal file
View File

@ -0,0 +1,129 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Debugger
*
* Author: Copyright (C) 2006, Michael Pohoreski
*/
/* Needs adaptation for SDL and POSIX --bb */
/* There are just dummy wrappers for real functions can be found in AppleWin sources
at http://applewin.berlios.de */
// disable warning C4786: symbol greater than 255 character:
//#pragma warning(disable: 4786)
#include "stdafx.h"
// Full-Speed debugging
int g_nDebugOnBreakInvalid = 0;
int g_iDebugOnOpcode = 0;
bool g_bDebugDelayBreakCheck = false;
int g_nBreakpoints = 0;
DWORD extbench = 0;
bool g_bDebuggerViewingAppleOutput = false;
BOOL g_bProfiling = 0;
int g_nDebugSteps = 0;
// Still called from external file
void DebugDisplay( BOOL bDrawBackground )
{
// Update_t bUpdateFlags = UPDATE_ALL;
// if (! bDrawBackground)
// bUpdateFlags &= ~UPDATE_BACKGROUND;
// UpdateDisplay( bUpdateFlags );
}
//===========================================================================
void DebuggerMouseClick( int x, int y )
{
if (g_nAppMode != MODE_DEBUG)
return;
}
void DebugEnd ()
{
}
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
void DebuggerProcessKey( int keycode )
//void DebugProcessCommand (int keycode)
{
if (g_nAppMode != MODE_DEBUG)
return;
}
//===========================================================================
void DebuggerUpdate()
{
// DebuggerCursorUpdate();
}
void DebugContinueStepping ()
{
}
//===========================================================================
void DebugDestroy ()
{
// DebugEnd();
}
//===========================================================================
void DebugInitialize ()
{
// AssemblerOff(); // update prompt
}
void DebuggerInputConsoleChar( TCHAR ch )
{
if ((g_nAppMode == MODE_STEPPING) && (ch == DEBUG_EXIT_KEY))
{
g_nDebugSteps = 0; // Exit Debugger
}
if (g_nAppMode != MODE_DEBUG)
return;
}

175
linapple-pie/src/Debug.h Normal file
View File

@ -0,0 +1,175 @@
#pragma once
#include <vector>
#include <algorithm> // sort
#include <map>
#include <string>
using namespace std;
#include "Debugger_Types.h"
// #include "Debugger_Parser.h"
// #include "Debugger_Console.h"
// #include "Debugger_Assembler.h"
// #include "Debugger_Help.h"
// #include "Debugger_Display.h"
// #include "Util_MemoryTextFile.h"
// Globals __________________________________________________________________
// Benchmarking
extern DWORD extbench;
// Bookmarks
extern int g_nBookmarks;
extern Bookmark_t g_aBookmarks[ MAX_BOOKMARKS ];
// extern vector<int> g_aBookmarks;
// Breakpoints
extern int g_nBreakpoints;
extern Breakpoint_t g_aBreakpoints[ MAX_BREAKPOINTS ];
extern const char *g_aBreakpointSource [ NUM_BREAKPOINT_SOURCES ];
extern const TCHAR *g_aBreakpointSymbols[ NUM_BREAKPOINT_OPERATORS ];
// Full-Speed debugging
extern int g_nDebugOnBreakInvalid;
extern int g_iDebugOnOpcode ;
extern bool g_bDebugDelayBreakCheck;
// Commands
extern const int NUM_COMMANDS_WITH_ALIASES; // = sizeof(g_aCommands) / sizeof (Command_t); // Determined at compile-time ;-)
extern int g_iCommand; // last command
extern Command_t g_aCommands[];
extern Command_t g_aParameters[];
// Config - FileName
extern char g_sFileNameConfig[];
// Cursor
extern WORD g_nDisasmTopAddress ;
extern WORD g_nDisasmBotAddress ;
extern WORD g_nDisasmCurAddress ;
extern bool g_bDisasmCurBad ;
extern int g_nDisasmCurLine ; // Aligned to Top or Center
extern int g_iDisasmCurState ;
extern int g_nDisasmWinHeight;
extern const int WINDOW_DATA_BYTES_PER_LINE;
// Config - Disassembly
extern bool g_bConfigDisasmAddressColon ;
extern bool g_bConfigDisasmOpcodesView ;
extern bool g_bConfigDisasmOpcodeSpaces ;
extern int g_iConfigDisasmTargets ;
extern int g_iConfigDisasmBranchType ;
extern int g_bConfigDisasmImmediateChar;
// Config - Info
extern bool g_bConfigInfoTargetPointer ;
// Disassembly
// extern int g_aDisasmTargets[ MAX_DISPLAY_LINES ];
// Display
extern bool g_bDebuggerViewingAppleOutput;
// Font
extern int g_nFontHeight;
extern int g_iFontSpacing;
// Memory
extern MemoryDump_t g_aMemDump[ NUM_MEM_DUMPS ];
// extern MemorySearchArray_t g_vMemSearchMatches;
extern vector<int> g_vMemorySearchResults;
// Source Level Debugging
extern TCHAR g_aSourceFileName[ MAX_PATH ];
// extern MemoryTextFile_t g_AssemblerSourceBuffer;
extern int g_iSourceDisplayStart ;
extern int g_nSourceAssembleBytes ;
extern int g_nSourceAssemblySymbols;
// Version
extern const int DEBUGGER_VERSION;
// Watches
extern int g_nWatches;
extern Watches_t g_aWatches[ MAX_WATCHES ];
// Window
extern int g_iWindowLast;
extern int g_iWindowThis;
extern WindowSplit_t g_aWindowConfig[ NUM_WINDOWS ];
// Zero Page
extern int g_nZeroPagePointers;
extern ZeroPagePointers_t g_aZeroPagePointers[ MAX_ZEROPAGE_POINTERS ]; // TODO: use vector<> ?
// Prototypes _______________________________________________________________
// Bookmarks
bool Bookmark_Find( const WORD nAddress );
// Breakpoints
bool GetBreakpointInfo ( WORD nOffset, bool & bBreakpointActive_, bool & bBreakpointEnable_ );
// 0 = Brk, 1 = Invalid1, .. 3 = Invalid 3
inline bool IsDebugBreakOnInvalid( int iOpcodeType )
{
bool bActive = (g_nDebugOnBreakInvalid >> iOpcodeType) & 1;
return bActive;
}
inline void SetDebugBreakOnInvalid( int iOpcodeType, int nValue )
{
if (iOpcodeType <= AM_3)
{
g_nDebugOnBreakInvalid &= ~ ( 1 << iOpcodeType);
g_nDebugOnBreakInvalid |= ((nValue & 1) << iOpcodeType);
}
}
// Color
inline COLORREF DebuggerGetColor( int iColor );
// Source Level Debugging
int FindSourceLine( WORD nAddress );
LPCTSTR FormatAddress( WORD nAddress, int nBytes );
// Symbol Table / Memory
bool FindAddressFromSymbol( LPCSTR pSymbol, WORD * pAddress_ = NULL, int * iTable_ = NULL );
WORD GetAddressFromSymbol (LPCTSTR symbol); // HACK: returns 0 if symbol not found
void SymbolUpdate( Symbols_e eSymbolTable, char *pSymbolName, WORD nAddrss, bool bRemoveSymbol, bool bUpdateSymbol );
LPCTSTR FindSymbolFromAddress (WORD nAdress, int * iTable_ = NULL );
LPCTSTR GetSymbol (WORD nAddress, int nBytes);
Update_t DebuggerProcessCommand( const bool bEchoConsoleInput );
// Prototypes _______________________________________________________________
enum
{
DEBUG_EXIT_KEY = 0x1B, // Escape
DEBUG_TOGGLE_KEY = SDLK_F1 + BTN_DEBUG
};
void DebugBegin ();
void DebugContinueStepping ();
void DebugDestroy ();
void DebugDisplay (BOOL);
void DebugEnd ();
void DebugInitialize ();
// void DebugProcessChar (TCHAR);
void DebuggerInputConsoleChar( TCHAR ch );
// void DebugProcessCommand (int);
void DebuggerProcessKey( int keycode );
void DebuggerUpdate();
void DebuggerCursorNext();
void DebuggerMouseClick( int x, int y );

File diff suppressed because it is too large Load Diff

1153
linapple-pie/src/Disk.cpp Normal file

File diff suppressed because it is too large Load Diff

42
linapple-pie/src/Disk.h Normal file
View File

@ -0,0 +1,42 @@
#pragma once
#define DRIVE_1 0
#define DRIVE_2 1
#define DRIVES 2
#define TRACKS 35
extern BOOL enhancedisk;
void DiskInitialize (); // DiskManagerStartup()
void DiskDestroy (); // no, doesn't "destroy" the disk image. DiskManagerShutdown()
void DiskBoot ();
void DiskEject( const int iDrive );
LPCTSTR DiskGetFullName (int);
enum Disk_Status_e
{
DISK_STATUS_OFF ,
DISK_STATUS_READ ,
DISK_STATUS_WRITE,
DISK_STATUS_PROT ,
NUM_DISK_STATUS
};
void DiskGetLightStatus (int *pDisk1Status_,int *pDisk2Status_);
LPCTSTR DiskGetName (int);
int DiskInsert (int,LPCTSTR,BOOL,BOOL);
BOOL DiskIsSpinning ();
void DiskNotifyInvalidImage (LPCTSTR,int);
void DiskReset ();
bool DiskGetProtect( const int iDrive );
void DiskSetProtect( const int iDrive, const bool bWriteProtect );
void DiskSelect (int);
void Disk_FTP_SelectImage (int);
void DiskUpdatePosition (DWORD);
bool DiskDriveSwap();
void DiskLoadRom(LPBYTE pCxRomPeripheral, UINT uSlot);
DWORD DiskGetSnapshot(SS_CARD_DISK2* pSS, DWORD dwSlot);
DWORD DiskSetSnapshot(SS_CARD_DISK2* pSS, DWORD dwSlot);

View File

@ -0,0 +1,459 @@
/*
////////////////////////////////////////////////////////////////////////////
//////////// Choose disk image for given slot number? ////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
//// Adapted for linapple - apple][ emulator for Linux by beom beotiger Nov 2007 /////
///////////////////////////////////////////////////////////////////////////////////////
// Original source from one of Brain Games (http://www.braingames.getput.com)
// game Super Transball 2.(http://www.braingames.getput.com/stransball2/default.asp)
//
// Brain Games crew creates brilliant retro-remakes! Please visit their site to find out more.
//
*/
#ifdef _WIN32
#include "windows.h"
#else
#include <stddef.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include "ctype.h"
#endif
#include "stdafx.h"
#include "list.h"
#include "DiskChoose.h"
//#include "ctype.h"
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//#include "SDL/SDL.h"
//#include "SDL_mixer.h"
//#include "SDL_image.h"
/*
#include "auxiliar.h"
#include "tiles.h"
#include "maps.h"
#include "transball.h"
#include "encoder.h"
*/
// how many file names we are able to see at once!
#define FILES_IN_SCREEN 21
// delay after key pressed (in milliseconds??)
#define KEY_DELAY 25
/////////////////////////////////////////////////////////////////////
/* FONT prev decls */
//bool fonts_initialization(void);
//void font_print(int x,int y,char *text,SDL_Surface *surface);
//void font_print_centered(int x,int y, char *text, SDL_Surface *surface);
/////////////////////////////////////////////////////////////////////
/* AUX funcs prev decls */
//void rectangle(SDL_Surface *surface, int x, int y, int w, int h, Uint32 pixel);
//void surface_fader(SDL_Surface *surface,float r_factor,float g_factor,float b_factor,float a_factor,SDL_Rect *r);
////////////////////////////////////////////////////////////////////////////////////////
#ifndef _WIN32
int getstat(char *catalog, char *fname, int * size)
{
// gets file status and returns: 0 - special or error, 1 - file is a directory, 2 - file is a normal file
// In: catalog - working directory, fname - file name
struct stat info;
char tempname[MAX_PATH];
snprintf(tempname, MAX_PATH, "%s/%s", catalog, fname); // get full path for the file
if(stat(tempname, &info) == -1) return 0;
if(S_ISDIR(info.st_mode)) return 1; // seems to be directory
if(S_ISREG(info.st_mode)) {
if(size != NULL) *size = (int)(info.st_size / 1024); // get file size in Kbytes?!
return 2; // regular file
}
return 0;
}
#endif
////////////////////////////////////////////////////////////////////////////////////////
bool ChooseAnImage(int sx,int sy, char *incoming_dir, int slot, char **filename, bool *isdir, int *index_file)
{
/* Parameters:
sx, sy - window size,
incoming_dir - in what dir find files,
slot - in what slot should an image go (common: #6 for 5.25' 140Kb floppy disks, and #7 for hard-disks).
slot #5 - for 800Kb floppy disks, but we do not use them in Apple][?
(They are as a rule with .2mg extension)
index_file - from which file we should start cursor (should be static and 0 when changing dir)
Out: filename - chosen file name (or dir name)
isdir - if chosen name is a directory
*/
/* Surface: */
SDL_Surface *my_screen; // for background
if(font_sfc == NULL)
if(!fonts_initialization()) return false; //if we don't have a fonts, we just can do none
List<char> files; // our files
List<char> sizes; // and their sizes (or 'dir' for directories)
int act_file; // current file
int first_file; // from which we output files
printf("Disckchoose! We are here: %s\n",incoming_dir);
// files.Delete();
// sizes.Delete();
#ifndef _WIN32
/* POSIX specific routines of reading directory structure */
DIR *dp;
struct dirent *ep;
dp = opendir (incoming_dir); // open and read incoming directory
char *tmp;
int i,j, B, N; // for cycles, beginning and end of list
// build prev dir
if(strcmp(incoming_dir, "/")) {
tmp = new char[3];
strcpy(tmp, "..");
files.Add(tmp);
tmp = new char[5];
strcpy(tmp, "<UP>");
sizes.Add(tmp); // add sign of directory
B = 1;
}
else B = 0; // for sorting dirs
if (dp != NULL)
{
while (ep = readdir (dp)) // first looking for directories
{
int what = getstat(incoming_dir, ep->d_name, NULL);
if (strlen(ep->d_name) > 0 && /*strcmp(ep->d_name,".")*/// omit "." (cur dir)
ep->d_name[0] != '.'/*strcmp(ep->d_name,"..")*/ && what == 1) // is directory!
{
tmp = new char[strlen(ep->d_name)+1]; // add entity to list
strcpy(tmp, ep->d_name);
files.Add(tmp);
tmp = new char[6];
strcpy(tmp, "<DIR>");
sizes.Add(tmp); // add sign of directory
} /* if */
}
}
#else
/* Windows specific functions of reading directory structure */
/* Find subdirs: */
if(strcmp(incoming_dir, "/")) {
// we are not in upper direcory
tmp = new char[3];
strcpy(tmp, "..");
files.Add(tmp);
tmp = new char[5];
strcpy(tmp, "<UP>");
sizes.Add(tmp); // add sign of directory
B = 1;
}
else B = 0; // for sorting dirs
WIN32_FIND_DATA finfo;
HANDLE h;
h=FindFirstFile(incoming_dir,&finfo);
if (h!=INVALID_HANDLE_VALUE) {
char *tmp;
if(finfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY != 0) {
// add this entry if it is directory
tmp=new char[strlen(finfo.cFileName)+1];
strcpy(tmp,finfo.cFileName);
files.Add(tmp);
tmp = new char[6];
strcpy(tmp, "<DIR>");
sizes.Add(tmp); // add sign of directory
}
while(FindNextFile(h,&finfo)==TRUE) {
if(finfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY != 0) {
// add this entry if it is directory
tmp=new char[strlen(finfo.cFileName)+1];
strcpy(tmp,finfo.cFileName);
files.Add(tmp);
tmp = new char[6];
strcpy(tmp, "<DIR>");
sizes.Add(tmp); // add sign of directory
}
} /* while */
} /* if */
#endif
// sort directories. Please, don't laugh at my bubble sorting - it the simplest thing I've ever seen --bb
if(files.Length() > 2)
{
N = files.Length() - 1;
// B = 1;`- defined above
for(i = N; i > B; i--)
for(j = B; j < i; j++)
if(strcasecmp(files[j], files[j + 1]) > 0)
{
files.Swap(j,j + 1);
sizes.Swap(j,j + 1);
}
}
B = files.Length(); // start for files
#ifndef _WIN32
/* POSIX specific routines of reading directory structure */
(void) rewinddir (dp); // to the start
// now get all regular files
while (ep = readdir (dp))
{
int fsize;
if (strlen(ep->d_name) > 4 && ep->d_name[0] != '.'
&& (getstat(incoming_dir, ep->d_name, &fsize) == 2)) // is normal file!
{
tmp = new char[strlen(ep->d_name)+1]; // add this entity to list
strcpy(tmp, ep->d_name);
files.Add(tmp);
tmp = new char[10]; // 1400000KB
snprintf(tmp, 9, "%dKB", fsize);
sizes.Add(tmp); // add this size to list
} /* if */
}
(void) closedir (dp);
#else
/* Windows specific functions of reading directory structure */
/* Find files: */
h=FindFirstFile(incoming_dir,&finfo);
if (h!=INVALID_HANDLE_VALUE) {
// char *tmp; - must be defined in previous section, when searching subdirs
if(finfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY == 0) {
// add this entry if it is NOT directory!
tmp=new char[strlen(finfo.cFileName)+1];
strcpy(tmp,finfo.cFileName);
files.Add(tmp);
tmp = new char[10]; // 1400000KB
snprintf(tmp, 9, "%dKB",
((finfo.nFileSizeHigh * (MAXDWORD+1)) + finfo.nFileSizeLow));
sizes.Add(tmp); // add this size to list
}
while(FindNextFile(h,&finfo)==TRUE) {
if(finfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY == 0) {
// add this entry if it is NOT directory!
tmp=new char[strlen(finfo.cFileName)+1];
strcpy(tmp,finfo.cFileName);
files.Add(tmp);
tmp = new char[10]; // 1400000KB
snprintf(tmp, 9, "%dKB",
((finfo.nFileSizeHigh * (MAXDWORD+1)) + finfo.nFileSizeLow));
sizes.Add(tmp); // add this size to list
}
} /* while */
} /* if */
#endif
// do sorting for files
if(files.Length() > 2 && B < files.Length())
{
N = files.Length() - 1;
// B = 1;
for(i = N; i > B; i--)
for(j = B; j < i; j++)
if(strcasecmp(files[j], files[j + 1]) > 0)
{
files.Swap(j,j + 1);
sizes.Swap(j,j + 1);
}
}
// Count out cursor position and file number output
act_file = *index_file;
if(act_file >= files.Length()) act_file = 0; // cannot be more than files in list
first_file = act_file - (FILES_IN_SCREEN / 2);
if (first_file < 0) first_file = 0; // cannot be negativ...
// Show all directories (first) and files then
// char *tmp;
char *siz;
// int i;
// prepare screen
double facx = double(g_ScreenWidth) / double(SCREEN_WIDTH);
double facy = double(g_ScreenHeight) / double(SCREEN_HEIGHT);
SDL_Surface *tempSurface = NULL;
if(!g_WindowResized) {
if(g_nAppMode == MODE_LOGO) tempSurface = g_hLogoBitmap; // use logobitmap
else tempSurface = g_hDeviceBitmap;
}
else tempSurface = g_origscreen;
if(tempSurface == NULL)
tempSurface = screen; // use screen, if none available
my_screen = SDL_CreateRGBSurface(SDL_SWSURFACE, tempSurface->w, tempSurface->h, tempSurface->format->BitsPerPixel, 0, 0, 0, 0);
if(tempSurface->format->palette && my_screen->format->palette)
SDL_SetColors(my_screen, tempSurface->format->palette->colors,
0, tempSurface->format->palette->ncolors);
surface_fader(my_screen, 0.2F, 0.2F, 0.2F, -1, 0); // fade it out to 20% of normal
SDL_BlitSurface(tempSurface, NULL, my_screen, NULL);
while(true)
{
SDL_BlitSurface(my_screen, NULL, screen, NULL); // show background
font_print_centered(sx/2 ,5*facy , incoming_dir, screen, 1.5*facx, 1.3*facy);
if (slot == 6) font_print_centered(sx/2,20*facy,"Choose image for floppy 140KB drive", screen, 1*facx, 1*facy);
else
if (slot == 7) font_print_centered(sx/2,20*facy,"Choose image for Hard Disk", screen, 1*facx, 1*facy);
else
if (slot == 5) font_print_centered(sx/2,20*facy,"Choose image for floppy 800KB drive", screen, 1*facx, 1*facy);
else
if (slot == 1) font_print_centered(sx/2,20*facy,"Select file name for saving snapshot", screen, 1*facx, 1*facy);
else
if (slot == 0) font_print_centered(sx/2,20*facy,"Select snapshot file name for loading", screen, 1*facx, 1*facy);
font_print_centered(sx/2,30*facy, "Press ENTER to choose, or ESC to cancel",screen, 1.4*facx, 1.1*facy);
files.Rewind(); // from start
sizes.Rewind();
i = 0;
// printf("We've printed some messages, go to file list!\n");
// show all fetched dirs and files
// topX of first fiel visible
int TOPX = int(45*facy);
while(files.Iterate(tmp)) {
sizes.Iterate(siz); // also fetch size string
if (i >= first_file && i < first_file + FILES_IN_SCREEN)
{ // FILES_IN_SCREEN items on screen
// char tmp2[80],tmp3[256];
if (i == act_file) { // show item under cursor (in inverse mode)
SDL_Rect r;
r.x= 2;
r.y= TOPX + (i-first_file) * 15 * facy - 1;
if(strlen(tmp) > 46) r.w = 46 * 6 * 1.7 * facx + 2;
else r.w= strlen(tmp) * 6 * 1.7 * facx + 2; // 6- FONT_SIZE_X
r.h= 9 * 1.5 * facy;
SDL_FillRect(screen, &r, SDL_MapRGB(screen->format,255,0,0));// in RED
} /* if */
// print file name with enlarged font
char ch;
ch = 0;
if(strlen(tmp) > 46) { ch = tmp[46]; tmp[46] = 0;} //cut-off too long string
font_print(4, TOPX + (i - first_file) * 15 * facy, tmp, screen, 1.7*facx, 1.5*facy); // show name
font_print(sx - 70 * facx, TOPX + (i - first_file) * 15 * facy, siz, screen, 1.7*facx, 1.5*facy);// show info (dir or size)
if(ch) tmp[46] = ch; //restore cut-off char
} /* if */
i++; // next item
} /* while */
/////////////////////////////////////////////////////////////////////////////////////////////
// draw rectangles
rectangle(screen, 0, TOPX - 5, sx, 320*facy, SDL_MapRGB(screen->format, 255, 255, 255));
rectangle(screen, 480*facx, TOPX - 5, 0, 320*facy, SDL_MapRGB(screen->format, 255, 255, 255));
SDL_Flip(screen); // show the screen
SDL_Delay(KEY_DELAY); // wait some time to be not too fast
//////////////////////////////////
// Wait for keypress
//////////////////////////////////
SDL_Event event; // event
Uint8 *keyboard; // key state
event.type = SDL_QUIT;
while(event.type != SDL_KEYDOWN) { // wait for key pressed
SDL_Delay(10);
SDL_PollEvent(&event);
}
// control cursor
keyboard = SDL_GetKeyState(NULL); // get current state of pressed (and not pressed) keys
if (keyboard[SDLK_UP] || keyboard[SDLK_LEFT]) {
if (act_file>0) act_file--; // up one position
if (act_file<first_file) first_file=act_file;
} /* if */
if (keyboard[SDLK_DOWN] || keyboard[SDLK_RIGHT]) {
if (act_file < (files.Length() - 1)) act_file++;
if (act_file >= (first_file + FILES_IN_SCREEN)) first_file=act_file - FILES_IN_SCREEN + 1;
} /* if */
if (keyboard[SDLK_PAGEUP]) {
act_file-=FILES_IN_SCREEN;
if (act_file<0) act_file=0;
if (act_file<first_file) first_file=act_file;
} /* if */
if (keyboard[SDLK_PAGEDOWN]) {
act_file+=FILES_IN_SCREEN;
if (act_file>=files.Length()) act_file=(files.Length()-1);
if (act_file>=(first_file+FILES_IN_SCREEN)) first_file=act_file-FILES_IN_SCREEN + 1;
} /* if */
// choose an item?
if (keyboard[SDLK_RETURN]) {
// dup string from selected file name
*filename = strdup(files[act_file]);
// printf("files[act_file]=%s, *filename=%s\n\n", files[act_file], *filename);
if(!strcmp(sizes[act_file], "<DIR>") || !strcmp(sizes[act_file], "<UP>"))
*isdir = true;
else *isdir = false; // this is directory (catalog in Apple][ terminology)
*index_file = act_file; // remember current index
files.Delete();
sizes.Delete();
SDL_FreeSurface(my_screen);
return true;
} /* if */
if (keyboard[SDLK_ESCAPE]) {
files.Delete();
sizes.Delete();
SDL_FreeSurface(my_screen);
return false; // ESC has been pressed
} /* if */
if (keyboard[SDLK_HOME]) { // HOME?
act_file=0;
first_file=0;
} /* if */
if (keyboard[SDLK_END]) { // END?
act_file=files.Length() - 1; // go to the last possible file in list
first_file=act_file - FILES_IN_SCREEN + 1;
if(first_file < 0) first_file = 0;
} /* if */
}
} /* ChooseAnImage */

View File

@ -0,0 +1,4 @@
#pragma once
bool ChooseAnImage(int sx,int sy, char *incoming_dir, int slot, char **filename, bool *isdir, int *index_file);

View File

@ -0,0 +1,561 @@
/*
////////////////////////////////////////////////////////////////////////////
//////////// Choose disk image for given slot number? ////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
//// Adapted for linapple - apple][ emulator for Linux by beom beotiger Nov 2007 /////
///////////////////////////////////////////////////////////////////////////////////////
// Original source from one of Brain Games (http://www.braingames.getput.com)
// game Super Transball 2.(http://www.braingames.getput.com/stransball2/default.asp)
//
// Brain Games crew creates brilliant retro-remakes! Please visit their site to find out more.
//
*/
/* March 2012 AD by Krez, Beom Beotiger */
#include "stdafx.h"
# include <string.h>
#include <stddef.h>
#ifndef _WIN32
//#include <sys/types.h>
#include <sys/stat.h>
//#include <dirent.h>
#endif
#include <time.h>
#include "list.h"
#include "DiskFTP.h"
#include "ftpparse.h"
// how many file names we are able to see at once!
#define FILES_IN_SCREEN 21
// delay after key pressed (in milliseconds??)
#define KEY_DELAY 25
// define time when cache ftp dir.listing must be refreshed
#define RENEW_TIME 24*3600
char * md5str (const char *input); // forward declaration of md5str func
TCHAR g_sFTPDirListing[512] = TEXT("cache/ftp."); // name for FTP-directory listing
////////////////////////////////////////////////////////////////////////////////////////
int getstatFTP(struct ftpparse *fp, int * size)
{
// gets file status and returns: 0 - special or error, 1 - file is a directory, 2 - file is a normal file
// In: fp - ftpparse struct ftom ftpparse.h
if(!fp->namelen) return 0;
if(fp->flagtrycwd == 1) return 1; // can CWD, it is dir then
if(fp->flagtryretr == 1) { // we're able to RETR, it's a file then?!
if(size != NULL) *size = (int)(fp->size / 1024);
return 2;
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
bool ChooseAnImageFTP(int sx,int sy, char *ftp_dir, int slot, char **filename, bool *isdir, int *index_file)
{
/* Parameters:
sx, sy - window size,
ftp_dir - what FTP directory to use,
slot - in what slot should an image go (common: #6 for 5.25' 140Kb floppy disks, and #7 for hard-disks).
slot #5 - for 800Kb floppy disks, but we do not use them in Apple][?
(They are as a rule with .2mg extension)
index_file - from which file we should start cursor (should be static and 0 when changing dir)
Out: filename - chosen file name (or dir name)
isdir - if chosen name is a directory
*/
double facx = double(g_ScreenWidth) / double(SCREEN_WIDTH);
double facy = double(g_ScreenHeight) / double(SCREEN_HEIGHT);
SDL_Surface *my_screen; // for background
struct ftpparse FTP_PARSE; // for parsing ftp directories
#ifndef _WIN32
struct stat info;
#endif
if(font_sfc == NULL)
if(!fonts_initialization()) return false; //if we don't have a fonts, we just can do none
char tmpstr[512];
char ftpdirpath [MAX_PATH];
snprintf(ftpdirpath, MAX_PATH, "%s/%s%s", g_sFTPLocalDir, g_sFTPDirListing, md5str(ftp_dir)); // get path for FTP dir listing
// printf("Dir: %s, MD5(dir)=%s\n",ftp_dir,ftpdirpath);
List<char> files; // our files
List<char> sizes; // and their sizes (or 'dir' for directories)
int act_file; // current file
int first_file; // from which we output files
char ch = 0;
// prepare screen
SDL_Surface *tempSurface;
if(!g_WindowResized) {
if(g_nAppMode == MODE_LOGO) tempSurface = g_hLogoBitmap; // use logobitmap
else tempSurface = g_hDeviceBitmap;
}
else tempSurface = g_origscreen;
my_screen = SDL_CreateRGBSurface(SDL_SWSURFACE, tempSurface->w, tempSurface->h, tempSurface->format->BitsPerPixel, 0, 0, 0, 0);
if(tempSurface->format->palette && my_screen->format->palette)
SDL_SetColors(my_screen, tempSurface->format->palette->colors,
0, tempSurface->format->palette->ncolors);
surface_fader(my_screen, 0.2F, 0.2F, 0.2F, -1, 0); // fade it out to 20% of normal
SDL_BlitSurface(tempSurface, NULL, my_screen, NULL);
SDL_BlitSurface(my_screen, NULL, screen, NULL); // show background
// ch = 0;
#define NORMAL_LENGTH 60
if(strlen(ftp_dir) > NORMAL_LENGTH) { ch = ftp_dir[NORMAL_LENGTH]; ftp_dir[NORMAL_LENGTH] = 0;} //cut-off too long string
font_print_centered(sx/2 ,5 * facy , ftp_dir, screen, 1.5 * facx, 1.3 * facy);
if(ch) ftp_dir[NORMAL_LENGTH] = ch; //restore cut-off char
font_print_centered(sx/2,20 * facy, "Connecting to FTP server... Please wait.", screen, 1 * facx, 1 * facy);
SDL_Flip(screen); // show the screen
bool OKI;
#ifndef _WIN32
if(stat(ftpdirpath,&info) == 0 && info.st_mtime > time(NULL) - RENEW_TIME) {
OKI = false; // use this file
}
else {
OKI = ftp_get(ftp_dir, ftpdirpath); // get ftp dir listing
}
#else
// in WIN32 let's use constant caching? -- need to be redone using file.mtime
if(GetFileAttributes(ftpdirpath) != DWORD(-1)) OKI = false;
else OKI = ftp_get(ftp_dir,ftpdirpath); // get ftp dir listing
#endif
if(OKI) { // error
printf("Failed getting FTP directory %s to %s\n",ftp_dir,ftpdirpath);
font_print_centered(sx/2,30 * facy, "Failure. Press any key!",screen, 1.4 * facx, 1.1 * facy);
SDL_Flip(screen); // show the screen
SDL_Delay(KEY_DELAY); // wait some time to be not too fast
//////////////////////////////////
// Wait for keypress
//////////////////////////////////
SDL_Event event; // event
Uint8 *keyboard; // key state
event.type = SDL_QUIT;
while(event.type != SDL_KEYDOWN) { // wait for key pressed
SDL_Delay(100);
SDL_PollEvent(&event);
}
SDL_FreeSurface(my_screen);
return false;
}
FILE *fdir = fopen(ftpdirpath,"r");
char *tmp;
int i,j, B, N; // for cycles, beginning and end of list
// build prev dir
if(strcmp(ftp_dir, "ftp://")) {
tmp = new char[3];
strcpy(tmp, "..");
files.Add(tmp);
tmp = new char[5];
strcpy(tmp, "<UP>");
sizes.Add(tmp); // add sign of directory
B = 1;
}
else B = 0; // for sorting dirs
while (tmp = fgets(tmpstr,512,fdir)) // first looking for directories
{
// clear and then try to fill in FTP_PARSE struct
memset(&FTP_PARSE,0,sizeof(FTP_PARSE));
ftpparse(&FTP_PARSE, tmp, strlen(tmp));
int what = getstatFTP(&FTP_PARSE, NULL);
if (strlen(FTP_PARSE.name) > 0 && what == 1) // is directory!
{
tmp = new char[strlen(FTP_PARSE.name)+1]; // add entity to list
strcpy(tmp, FTP_PARSE.name);
files.Add(tmp);
tmp = new char[6];
strcpy(tmp, "<DIR>");
sizes.Add(tmp); // add sign of directory
} /* if */
}
// sort directories. Please, don't laugh at my bubble sorting - it the simplest thing I've ever seen --bb
if(files.Length() > 2)
{
N = files.Length() - 1;
// B = 1; - defined above
for(i = N; i > B; i--)
for(j = B; j < i; j++)
if(strcasecmp(files[j], files[j + 1]) > 0)
{
files.Swap(j,j + 1);
sizes.Swap(j,j + 1);
}
}
B = files.Length(); // start for files
(void) rewind (fdir); // to the start
// now get all regular files
while (tmp = fgets(tmpstr,512,fdir))
{
int fsize;
// clear and then try to fill in FTP_PARSE struct
memset(&FTP_PARSE,0,sizeof(FTP_PARSE));
ftpparse(&FTP_PARSE, tmp, strlen(tmp));
if ((getstatFTP(&FTP_PARSE, &fsize) == 2)) // is normal file!
{
tmp = new char[strlen(FTP_PARSE.name)+1]; // add this entity to list
strcpy(tmp, FTP_PARSE.name);
files.Add(tmp);
tmp = new char[10]; // 1400000KB
snprintf(tmp, 9, "%dKB", fsize);
sizes.Add(tmp); // add this size to list
} /* if */
}
(void) fclose (fdir);
// do sorting for files
if(files.Length() > 2 && B < files.Length())
{
N = files.Length() - 1;
// B = 1;
for(i = N; i > B; i--)
for(j = B; j < i; j++)
if(strcasecmp(files[j], files[j + 1]) > 0)
{
files.Swap(j,j + 1);
sizes.Swap(j,j + 1);
}
}
// Count out cursor position and file number output
act_file = *index_file;
if(act_file >= files.Length()) act_file = 0; // cannot be more than files in list
first_file = act_file - (FILES_IN_SCREEN / 2);
if (first_file < 0) first_file = 0; // cannot be negativ...
// Show all directories (first) and files then
// char *tmp;
char *siz;
// int i;
while(true)
{
SDL_BlitSurface(my_screen, NULL, screen, NULL); // show background
font_print_centered(sx/2 ,5 * facy , ftp_dir, screen, 1.5 * facx, 1.3 * facy);
if (slot == 6) font_print_centered(sx/2,20 * facy,"Choose image for floppy 140KB drive", screen, 1 * facx, 1 * facy);
else
if (slot == 7) font_print_centered(sx/2,20 * facy,"Choose image for Hard Disk", screen, 1 * facx, 1 * facy);
else
if (slot == 5) font_print_centered(sx/2,20 * facy,"Choose image for floppy 800KB drive", screen, 1 * facx, 1 * facy);
else
if (slot == 1) font_print_centered(sx/2,20 * facy,"Select file name for saving snapshot", screen, 1 * facx, 1 * facy);
else
if (slot == 0) font_print_centered(sx/2,20 * facy,"Select snapshot file name for loading", screen, 1 * facx, 1 * facy);
font_print_centered(sx/2,30 * facy, "Press ENTER to choose, or ESC to cancel",screen, 1.4 * facx, 1.1 * facy);
files.Rewind(); // from start
sizes.Rewind();
i = 0;
// printf("We've printed some messages, go to file list!\n");
// show all fetched dirs and files
// topX of first fiel visible
int TOPX = 45 * facy;
while(files.Iterate(tmp)) {
sizes.Iterate(siz); // also fetch size string
if (i >= first_file && i < first_file + FILES_IN_SCREEN)
{ // FILES_IN_SCREEN items on screen
// char tmp2[80],tmp3[256];
if (i == act_file) { // show item under cursor (in inverse mode)
SDL_Rect r;
r.x= 2;
r.y= TOPX + (i-first_file) * 15 * facy - 1;
if(strlen(tmp) > 46) r.w = 46 * 6 * 1.7 * facx + 2;
else r.w= strlen(tmp) * 6 * 1.7 * facx + 2; // 6- FONT_SIZE_X
r.h= 9 * 1.5 * facy;
SDL_FillRect(screen, &r, SDL_MapRGB(screen->format,255,0,0));// in RED
} /* if */
// print file name with enlarged font
ch = 0;
if(strlen(tmp) > 46) { ch = tmp[46]; tmp[46] = 0;} //cut-off too long string
font_print(4, TOPX + (i - first_file) * 15 * facy, tmp, screen, 1.7 * facx, 1.5 * facy); // show name
font_print(sx - 70*facx, TOPX + (i - first_file) * 15 * facy, siz, screen, 1.7 * facx, 1.5 * facy);// show info (dir or size)
if(ch) tmp[46] = ch; //restore cut-off char
} /* if */
i++; // next item
} /* while */
/////////////////////////////////////////////////////////////////////////////////////////////
// draw rectangles
rectangle(screen, 0, TOPX - 5, g_ScreenWidth, 320 * facy, SDL_MapRGB(screen->format, 255, 255, 255));
rectangle(screen, 480 * facx, TOPX - 5, 0, 320 * facy, SDL_MapRGB(screen->format, 255, 255, 255));
SDL_Flip(screen); // show the screen
SDL_Delay(KEY_DELAY); // wait some time to be not too fast
//////////////////////////////////
// Wait for keypress
//////////////////////////////////
SDL_Event event; // event
Uint8 *keyboard; // key state
event.type = SDL_QUIT;
while(event.type != SDL_KEYDOWN) { // wait for key pressed
SDL_Delay(10);
SDL_PollEvent(&event);
}
// control cursor
keyboard = SDL_GetKeyState(NULL); // get current state of pressed (and not pressed) keys
if (keyboard[SDLK_UP] || keyboard[SDLK_LEFT]) {
if (act_file>0) act_file--; // up one position
if (act_file<first_file) first_file=act_file;
} /* if */
if (keyboard[SDLK_DOWN] || keyboard[SDLK_RIGHT]) {
if (act_file < (files.Length() - 1)) act_file++;
if (act_file >= (first_file + FILES_IN_SCREEN)) first_file=act_file - FILES_IN_SCREEN + 1;
} /* if */
if (keyboard[SDLK_PAGEUP]) {
act_file-=FILES_IN_SCREEN;
if (act_file<0) act_file=0;
if (act_file<first_file) first_file=act_file;
} /* if */
if (keyboard[SDLK_PAGEDOWN]) {
act_file+=FILES_IN_SCREEN;
if (act_file>=files.Length()) act_file=(files.Length()-1);
if (act_file>=(first_file+FILES_IN_SCREEN)) first_file=act_file-FILES_IN_SCREEN + 1;
} /* if */
// choose an item?
if (keyboard[SDLK_RETURN]) {
// dup string from selected file name
*filename = strdup(php_trim(files[act_file],strlen(files[act_file])));
// printf("files[act_file]=%s, *filename=%s\n\n", files[act_file], *filename);
if(!strcmp(sizes[act_file], "<DIR>") || !strcmp(sizes[act_file], "<UP>"))
*isdir = true;
else *isdir = false; // this is directory (catalog in Apple][ terminology)
*index_file = act_file; // remember current index
files.Delete();
sizes.Delete();
SDL_FreeSurface(my_screen);
return true;
} /* if */
if (keyboard[SDLK_ESCAPE]) {
files.Delete();
sizes.Delete();
SDL_FreeSurface(my_screen);
return false; // ESC has been pressed
} /* if */
if (keyboard[SDLK_HOME]) { // HOME?
act_file=0;
first_file=0;
} /* if */
if (keyboard[SDLK_END]) { // END?
act_file=files.Length() - 1; // go to the last possible file in list
first_file=act_file - FILES_IN_SCREEN + 1;
if(first_file < 0) first_file = 0;
} /* if */
}
} /* ChooseAnImageFTP */
/* md5.c - an implementation of the MD5 algorithm and MD5 crypt */
/* See RFC 1321 for a description of the MD5 algorithm.
*/
#define cpu_to_le32(x) (x)
#define le32_to_cpu(x) cpu_to_le32(x)
typedef unsigned int UINT4;
/* F, G, H and I are basic MD5 functions.
*/
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
/* ROTATE_LEFT rotates x left n bits.
*/
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x >> (32 - (n)))))
static UINT4 md5_initstate[4] =
{
0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476
};
static char s1[4] = { 7, 12, 17, 22 };
static char s2[4] = { 5, 9, 14, 20 };
static char s3[4] = { 4, 11, 16, 23 };
static char s4[4] = { 6, 10, 15, 21 };
static UINT4 T[64] =
{
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
};
static UINT4 state[4];
static unsigned int length;
static unsigned char buffer[64];
static void
md5_transform (const unsigned char block[64])
{
int i, j;
UINT4 a,b,c,d,tmp;
const UINT4 *x = (UINT4 *) block;
a = state[0];
b = state[1];
c = state[2];
d = state[3];
/* Round 1 */
for (i = 0; i < 16; i++)
{
tmp = a + F (b, c, d) + le32_to_cpu (x[i]) + T[i];
tmp = ROTATE_LEFT (tmp, s1[i & 3]);
tmp += b;
a = d; d = c; c = b; b = tmp;
}
/* Round 2 */
for (i = 0, j = 1; i < 16; i++, j += 5)
{
tmp = a + G (b, c, d) + le32_to_cpu (x[j & 15]) + T[i+16];
tmp = ROTATE_LEFT (tmp, s2[i & 3]);
tmp += b;
a = d; d = c; c = b; b = tmp;
}
/* Round 3 */
for (i = 0, j = 5; i < 16; i++, j += 3)
{
tmp = a + H (b, c, d) + le32_to_cpu (x[j & 15]) + T[i+32];
tmp = ROTATE_LEFT (tmp, s3[i & 3]);
tmp += b;
a = d; d = c; c = b; b = tmp;
}
/* Round 4 */
for (i = 0, j = 0; i < 16; i++, j += 7)
{
tmp = a + I (b, c, d) + le32_to_cpu (x[j & 15]) + T[i+48];
tmp = ROTATE_LEFT (tmp, s4[i & 3]);
tmp += b;
a = d; d = c; c = b; b = tmp;
}
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
}
static void
md5_init(void)
{
memcpy ((char *) state, (char *) md5_initstate, sizeof (md5_initstate));
length = 0;
}
static void
md5_update (const char *input, int inputlen)
{
int buflen = length & 63;
length += inputlen;
if (buflen + inputlen < 64)
{
memcpy (buffer + buflen, input, inputlen);
buflen += inputlen;
return;
}
memcpy (buffer + buflen, input, 64 - buflen);
md5_transform (buffer);
input += 64 - buflen;
inputlen -= 64 - buflen;
while (inputlen >= 64)
{
md5_transform ((unsigned char*)input);
input += 64;
inputlen -= 64;
}
memcpy (buffer, input, inputlen);
buflen = inputlen;
}
static unsigned char *
md5_final()
{
int i, buflen = length & 63;
buffer[buflen++] = 0x80;
memset (buffer+buflen, 0, 64 - buflen);
if (buflen > 56)
{
md5_transform (buffer);
memset (buffer, 0, 64);
buflen = 0;
}
*(UINT4 *) (buffer + 56) = cpu_to_le32 (8 * length);
*(UINT4 *) (buffer + 60) = 0;
md5_transform (buffer);
for (i = 0; i < 4; i++)
state[i] = cpu_to_le32 (state[i]);
return (unsigned char *) state;
}
static char *
md5 (const char *input)
{
md5_init();
// memcpy ((char *) state, (char *) md5_initstate, sizeof (md5_initstate));
// length = 0;
md5_update (input, strlen (input));
return (char *)md5_final ();
}
char *
md5str (const char *input)
{
char result[16 * 3 +1];
unsigned char* digest = (unsigned char*)md5 (input);
int i;
for (i=0; i < 16; i++)
sprintf (result+2*i, "%02X", digest[i]);
return result;
}

View File

@ -0,0 +1,6 @@
#pragma once
extern TCHAR g_sFTPDirListing[512]; // name for FTP-directory listing
/* Choose an image using FTP */
bool ChooseAnImageFTP(int sx,int sy, char *ftp_dir, int slot, char **filename, bool *isdir, int *index_file);

View File

@ -0,0 +1,937 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Disk Image
*
* Author: Various
*/
/* Adaptation for SDL and POSIX (l) by beom beotiger, Nov-Dec 2007 */
#include "stdafx.h"
#include "wwrapper.h"
//#pragma hdrstop
/* DO logical order 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/* physical order 0 D B 9 7 5 3 1 E C A 8 6 4 2 F */
/* PO logical order 0 E D C B A 9 8 7 6 5 4 3 2 1 F */
/* physical order 0 2 4 6 8 A C E 1 3 5 7 9 B D F */
typedef struct _imageinforec {
TCHAR filename[MAX_PATH];
DWORD format;
HANDLE file;
DWORD offset;
BOOL writeprotected;
DWORD headersize;
LPBYTE header;
BOOL validtrack[TRACKS];
} imageinforec, *imageinfoptr;
typedef BOOL (*boottype )(imageinfoptr);
typedef DWORD (*detecttype)(LPBYTE,DWORD);
typedef void (*readtype )(imageinfoptr,int,int,LPBYTE,int *);
typedef void (*writetype )(imageinfoptr,int,int,LPBYTE,int);
BOOL AplBoot (imageinfoptr ptr);
DWORD AplDetect (LPBYTE imageptr, DWORD imagesize);
DWORD DoDetect (LPBYTE imageptr, DWORD imagesize);
void DoRead (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimagebuffer, int *nibbles);
void DoWrite (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimage, int nibbles);
DWORD IieDetect (LPBYTE imageptr, DWORD imagesize);
void IieRead (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimagebuffer, int *nibbles);
void IieWrite (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimage, int nibbles);
DWORD Nib1Detect (LPBYTE imageptr, DWORD imagesize);
void Nib1Read (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimagebuffer, int *nibbles);
void Nib1Write (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimage, int nibbles);
DWORD Nib2Detect (LPBYTE imageptr, DWORD imagesize);
void Nib2Read (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimagebuffer, int *nibbles);
void Nib2Write (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimage, int nibbles);
DWORD PoDetect (LPBYTE imageptr, DWORD imagesize);
void PoRead (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimagebuffer, int *nibbles);
void PoWrite (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimage, int nibbles);
BOOL PrgBoot (imageinfoptr ptr);
DWORD PrgDetect (LPBYTE imageptr, DWORD imagesize);
typedef struct _imagetyperec {
LPCTSTR createexts;
LPCTSTR rejectexts;
detecttype detect;
boottype boot;
readtype read;
writetype write;
} imagetyperec, *imagetypeptr;
static imagetyperec imagetype[IMAGETYPES] = {{TEXT(".prg"),
TEXT(".do;.dsk;.iie;.nib;.po"),
PrgDetect,
PrgBoot,
NULL,
NULL},
{TEXT(".do;.dsk"),
TEXT(".nib;.iie;.po;.prg"),
DoDetect,
NULL,
DoRead,
DoWrite},
{TEXT(".po"),
TEXT(".do;.iie;.nib;.prg"),
PoDetect,
NULL,
PoRead,
PoWrite},
{TEXT(".apl"),
TEXT(".do;.dsk;.iie;.nib;.po"),
AplDetect,
AplBoot,
NULL,
NULL},
{TEXT(".nib"),
TEXT(".do;.iie;.po;.prg"),
Nib1Detect,
NULL,
Nib1Read,
Nib1Write},
{TEXT(".nb2"),
TEXT(".do;.iie;.po;.prg"),
Nib2Detect,
NULL,
Nib2Read,
Nib2Write},
{TEXT(".iie"),
TEXT(".do.;.nib;.po;.prg"),
IieDetect,
NULL,
IieRead,
IieWrite}};
static BYTE diskbyte[0x40] = {0x96,0x97,0x9A,0x9B,0x9D,0x9E,0x9F,0xA6,
0xA7,0xAB,0xAC,0xAD,0xAE,0xAF,0xB2,0xB3,
0xB4,0xB5,0xB6,0xB7,0xB9,0xBA,0xBB,0xBC,
0xBD,0xBE,0xBF,0xCB,0xCD,0xCE,0xCF,0xD3,
0xD6,0xD7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,
0xDF,0xE5,0xE6,0xE7,0xE9,0xEA,0xEB,0xEC,
0xED,0xEE,0xEF,0xF2,0xF3,0xF4,0xF5,0xF6,
0xF7,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF};
static BYTE sectornumber[3][0x10] = {{0x00,0x08,0x01,0x09,0x02,0x0A,0x03,0x0B,
0x04,0x0C,0x05,0x0D,0x06,0x0E,0x07,0x0F},
{0x00,0x07,0x0E,0x06,0x0D,0x05,0x0C,0x04,
0x0B,0x03,0x0A,0x02,0x09,0x01,0x08,0x0F},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
static LPBYTE workbuffer = NULL;
/****************************************************************************
*
* NIBBLIZATION FUNCTIONS
*
***/
//===========================================================================
LPBYTE Code62 (int sector) {
// CONVERT THE 256 8-BIT BYTES INTO 342 6-BIT BYTES, WHICH WE STORE
// STARTING AT 4K INTO THE WORK BUFFER.
{
LPBYTE sectorbase = workbuffer+(sector << 8);
LPBYTE resultptr = workbuffer+0x1000;
BYTE offset = 0xAC;
while (offset != 0x02) {
BYTE value = 0;
#define ADDVALUE(a) value = (value << 2) | \
(((a) & 0x01) << 1) | \
(((a) & 0x02) >> 1)
ADDVALUE(*(sectorbase+offset)); offset -= 0x56;
ADDVALUE(*(sectorbase+offset)); offset -= 0x56;
ADDVALUE(*(sectorbase+offset)); offset -= 0x53;
#undef ADDVALUE
*(resultptr++) = value << 2;
}
*(resultptr-2) &= 0x3F;
*(resultptr-1) &= 0x3F;
int loop = 0;
while (loop < 0x100)
*(resultptr++) = *(sectorbase+(loop++));
}
// EXCLUSIVE-OR THE ENTIRE DATA BLOCK WITH ITSELF OFFSET BY ONE BYTE,
// CREATING A 343RD BYTE WHICH IS USED AS A CHECKSUM. STORE THE NEW
// BLOCK OF 343 BYTES STARTING AT 5K INTO THE WORK BUFFER.
{
BYTE savedval = 0;
LPBYTE sourceptr = workbuffer+0x1000;
LPBYTE resultptr = workbuffer+0x1400;
int loop = 342;
while (loop--) {
*(resultptr++) = savedval ^ *sourceptr;
savedval = *(sourceptr++);
}
*resultptr = savedval;
}
// USING A LOOKUP TABLE, CONVERT THE 6-BIT BYTES INTO DISK BYTES. A VALID
// DISK BYTE IS A BYTE THAT HAS THE HIGH BIT SET, AT LEAST TWO ADJACENT
// BITS SET (EXCLUDING THE HIGH BIT), AND AT MOST ONE PAIR OF CONSECUTIVE
// ZERO BITS. THE CONVERTED BLOCK OF 343 BYTES IS STORED STARTING AT 4K
// INTO THE WORK BUFFER.
{
LPBYTE sourceptr = workbuffer+0x1400;
LPBYTE resultptr = workbuffer+0x1000;
int loop = 343;
while (loop--)
*(resultptr++) = diskbyte[(*(sourceptr++)) >> 2];
}
return workbuffer+0x1000;
}
//===========================================================================
void Decode62 (LPBYTE imageptr) {
// IF WE HAVEN'T ALREADY DONE SO, GENERATE A TABLE FOR CONVERTING
// DISK BYTES BACK INTO 6-BIT BYTES
static BOOL tablegenerated = 0;
static BYTE sixbitbyte[0x80];
if (!tablegenerated) {
ZeroMemory(sixbitbyte,0x80);
int loop = 0;
while (loop < 0x40) {
sixbitbyte[diskbyte[loop]-0x80] = loop << 2;
loop++;
}
tablegenerated = 1;
}
// USING OUR TABLE, CONVERT THE DISK BYTES BACK INTO 6-BIT BYTES
{
LPBYTE sourceptr = workbuffer+0x1000;
LPBYTE resultptr = workbuffer+0x1400;
int loop = 343;
while (loop--)
*(resultptr++) = sixbitbyte[*(sourceptr++) & 0x7F];
}
// EXCLUSIVE-OR THE ENTIRE DATA BLOCK WITH ITSELF OFFSET BY ONE BYTE
// TO UNDO THE EFFECTS OF THE CHECKSUMMING PROCESS
{
BYTE savedval = 0;
LPBYTE sourceptr = workbuffer+0x1400;
LPBYTE resultptr = workbuffer+0x1000;
int loop = 342;
while (loop--) {
*resultptr = savedval ^ *(sourceptr++);
savedval = *(resultptr++);
}
}
// CONVERT THE 342 6-BIT BYTES INTO 256 8-BIT BYTES
{
LPBYTE lowbitsptr = workbuffer+0x1000;
LPBYTE sectorbase = workbuffer+0x1056;
BYTE offset = 0xAC;
while (offset != 0x02) {
if (offset >= 0xAC)
*(imageptr+offset) = (*(sectorbase+offset) & 0xFC)
| (((*lowbitsptr) & 0x80) >> 7)
| (((*lowbitsptr) & 0x40) >> 5);
offset -= 0x56;
*(imageptr+offset) = (*(sectorbase+offset) & 0xFC)
| (((*lowbitsptr) & 0x20) >> 5)
| (((*lowbitsptr) & 0x10) >> 3);
offset -= 0x56;
*(imageptr+offset) = (*(sectorbase+offset) & 0xFC)
| (((*lowbitsptr) & 0x08) >> 3)
| (((*lowbitsptr) & 0x04) >> 1);
offset -= 0x53;
lowbitsptr++;
}
}
}
//===========================================================================
void DenibblizeTrack (LPBYTE trackimage, BOOL dosorder, int nibbles) {
ZeroMemory(workbuffer,0x1000);
// SEARCH THROUGH THE TRACK IMAGE FOR EACH SECTOR. FOR EVERY SECTOR
// WE FIND, COPY THE NIBBLIZED DATA FOR THAT SECTOR INTO THE WORK
// BUFFER AT OFFSET 4K. THEN CALL DECODE62() TO DENIBBLIZE THE DATA
// IN THE BUFFER AND WRITE IT INTO THE FIRST PART OF THE WORK BUFFER
// OFFSET BY THE SECTOR NUMBER.
{
int offset = 0;
int partsleft = 33;
int sector = 0;
while (partsleft--) {
BYTE byteval[3] = {0,0,0};
int bytenum = 0;
int loop = nibbles;
while ((loop--) && (bytenum < 3)) {
if (bytenum)
byteval[bytenum++] = *(trackimage+offset++);
else if (*(trackimage+offset++) == 0xD5)
bytenum = 1;
if (offset >= nibbles)
offset = 0;
}
if ((bytenum == 3) && (byteval[1] = 0xAA)) {
int loop = 0;
int tempoffset = offset;
while (loop < 384) {
*(workbuffer+0x1000+loop++) = *(trackimage+tempoffset++);
if (tempoffset >= nibbles)
tempoffset = 0;
}
if (byteval[2] == 0x96)
sector = ((*(workbuffer+0x1004) & 0x55) << 1)
| (*(workbuffer+0x1005) & 0x55);
else if (byteval[2] == 0xAD) {
Decode62(workbuffer+(sectornumber[dosorder][sector] << 8));
sector = 0;
}
}
}
}
}
//===========================================================================
DWORD NibblizeTrack (LPBYTE trackimagebuffer, BOOL dosorder, int track) {
ZeroMemory(workbuffer+4096,4096);
LPBYTE imageptr = trackimagebuffer;
BYTE sector = 0;
// WRITE GAP ONE, WHICH CONTAINS 48 SELF-SYNC BYTES
int loop;
for (loop = 0; loop < 48; loop++)
*(imageptr++) = 0xFF;
while (sector < 16) {
// WRITE THE ADDRESS FIELD, WHICH CONTAINS:
// - PROLOGUE (D5AA96)
// - VOLUME NUMBER ("4 AND 4" ENCODED)
// - TRACK NUMBER ("4 AND 4" ENCODED)
// - SECTOR NUMBER ("4 AND 4" ENCODED)
// - CHECKSUM ("4 AND 4" ENCODED)
// - EPILOGUE (DEAAEB)
*(imageptr++) = 0xD5;
*(imageptr++) = 0xAA;
*(imageptr++) = 0x96;
#define VOLUME 0xFE
#define CODE44A(a) ((((a) >> 1) & 0x55) | 0xAA)
#define CODE44B(a) (((a) & 0x55) | 0xAA)
*(imageptr++) = CODE44A(VOLUME);
*(imageptr++) = CODE44B(VOLUME);
*(imageptr++) = CODE44A((BYTE)track);
*(imageptr++) = CODE44B((BYTE)track);
*(imageptr++) = CODE44A(sector);
*(imageptr++) = CODE44B(sector);
*(imageptr++) = CODE44A(VOLUME ^ ((BYTE)track) ^ sector);
*(imageptr++) = CODE44B(VOLUME ^ ((BYTE)track) ^ sector);
#undef CODE44A
#undef CODE44B
*(imageptr++) = 0xDE;
*(imageptr++) = 0xAA;
*(imageptr++) = 0xEB;
// WRITE GAP TWO, WHICH CONTAINS SIX SELF-SYNC BYTES
for (loop = 0; loop < 6; loop++)
*(imageptr++) = 0xFF;
// WRITE THE DATA FIELD, WHICH CONTAINS:
// - PROLOGUE (D5AAAD)
// - 343 6-BIT BYTES OF NIBBLIZED DATA, INCLUDING A 6-BIT CHECKSUM
// - EPILOGUE (DEAAEB)
*(imageptr++) = 0xD5;
*(imageptr++) = 0xAA;
*(imageptr++) = 0xAD;
CopyMemory(imageptr,Code62(sectornumber[dosorder][sector]),343);
imageptr += 343;
*(imageptr++) = 0xDE;
*(imageptr++) = 0xAA;
*(imageptr++) = 0xEB;
// WRITE GAP THREE, WHICH CONTAINS 27 SELF-SYNC BYTES
for (loop = 0; loop < 27; loop++)
*(imageptr++) = 0xFF;
sector++;
}
return imageptr-trackimagebuffer;
}
//===========================================================================
void SkewTrack (int track, int nibbles, LPBYTE trackimagebuffer) {
int skewbytes = (track*768) % nibbles;
CopyMemory(workbuffer,trackimagebuffer,nibbles);
CopyMemory(trackimagebuffer,workbuffer+skewbytes,nibbles-skewbytes);
CopyMemory(trackimagebuffer+nibbles-skewbytes,workbuffer,skewbytes);
}
/****************************************************************************
*
* RAW PROGRAM IMAGE (APL) FORMAT IMPLEMENTATION
*
***/
//===========================================================================
BOOL AplBoot (imageinfoptr ptr) {
SetFilePointer(ptr->file,0,NULL,FILE_BEGIN);
WORD address = 0;
WORD length = 0;
DWORD bytesread;
ReadFile(ptr->file,&address,sizeof(WORD),&bytesread,NULL);
ReadFile(ptr->file,&length ,sizeof(WORD),&bytesread,NULL);
if ((((WORD)(address+length)) <= address) ||
(address >= 0xC000) ||
(address+length-1 >= 0xC000))
return 0;
ReadFile(ptr->file,mem+address,length,&bytesread,NULL);
int loop = 192;
while (loop--)
*(memdirty+loop) = 0xFF;
regs.pc = address;
return 1;
}
//===========================================================================
DWORD AplDetect (LPBYTE imageptr, DWORD imagesize) {
DWORD length = *(LPWORD)(imageptr+2);
return (((length+4) == imagesize) ||
((length+4+((256-((length+4) & 255)) & 255)) == imagesize));
}
/****************************************************************************
*
* DOS ORDER (DO) FORMAT IMPLEMENTATION
*
***/
//===========================================================================
DWORD DoDetect (LPBYTE imageptr, DWORD imagesize) {
if (((imagesize < 143105) || (imagesize > 143364)) &&
(imagesize != 143403) && (imagesize != 143488))
return 0;
// CHECK FOR A DOS ORDER IMAGE OF A DOS DISKETTE
{
int loop = 0;
BOOL mismatch = 0;
while ((loop++ < 15) && !mismatch)
if (*(imageptr+0x11002+(loop << 8)) != loop-1)
mismatch = 1;
if (!mismatch)
return 2;
}
// CHECK FOR A DOS ORDER IMAGE OF A PRODOS DISKETTE
{
int loop = 1;
BOOL mismatch = 0;
while ((loop++ < 5) && !mismatch)
if ((*(LPWORD)(imageptr+(loop << 9)+0x100) != ((loop == 5) ? 0 : 6-loop)) ||
(*(LPWORD)(imageptr+(loop << 9)+0x102) != ((loop == 2) ? 0 : 8-loop)))
mismatch = 1;
if (!mismatch)
return 2;
}
return 1;
}
//===========================================================================
void DoRead (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimagebuffer, int *nibbles) {
SetFilePointer(ptr->file,ptr->offset+(track << 12),NULL,FILE_BEGIN);
ZeroMemory(workbuffer,4096);
DWORD bytesread;
ReadFile(ptr->file,workbuffer,4096,&bytesread,NULL);
*nibbles = NibblizeTrack(trackimagebuffer,1,track);
if (!enhancedisk)
SkewTrack(track,*nibbles,trackimagebuffer);
}
//===========================================================================
void DoWrite (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimage, int nibbles) {
ZeroMemory(workbuffer,4096);
DenibblizeTrack(trackimage,1,nibbles);
SetFilePointer(ptr->file,ptr->offset+(track << 12),NULL,FILE_BEGIN);
DWORD byteswritten;
WriteFile(ptr->file,workbuffer,4096,&byteswritten,NULL);
}
/****************************************************************************
*
* SIMSYSTEM IIE (IIE) FORMAT IMPLEMENTATION
*
***/
//===========================================================================
void IieConvertSectorOrder (LPBYTE sourceorder) {
int loop = 16;
while (loop--) {
BYTE found = 0xFF;
int loop2 = 16;
while (loop2-- && (found == 0xFF))
if (*(sourceorder+loop2) == loop)
found = loop2;
if (found == 0xFF)
found = 0;
sectornumber[2][loop] = found;
}
}
//===========================================================================
DWORD IieDetect (LPBYTE imageptr, DWORD imagesize) {
if (strncmp((const char *)imageptr,"SIMSYSTEM_IIE",13) ||
(*(imageptr+13) > 3))
return 0;
return 2;
}
//===========================================================================
void IieRead (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimagebuffer, int *nibbles) {
// IF WE HAVEN'T ALREADY DONE SO, READ THE IMAGE FILE HEADER
if (!ptr->header) {
ptr->header = (LPBYTE)VirtualAlloc(NULL, 88, 0x1000, 0);
if (!ptr->header) {
*nibbles = 0;
return;
}
ZeroMemory(ptr->header,88);
DWORD bytesread;
SetFilePointer(ptr->file,0,NULL,FILE_BEGIN);
ReadFile(ptr->file,ptr->header,88,&bytesread,NULL);
}
// IF THIS IMAGE CONTAINS USER DATA, READ THE TRACK AND NIBBLIZE IT
if (*(ptr->header+13) <= 2) {
IieConvertSectorOrder(ptr->header+14);
SetFilePointer(ptr->file,(track << 12)+30,NULL,FILE_BEGIN);
ZeroMemory(workbuffer,4096);
DWORD bytesread;
ReadFile(ptr->file,workbuffer,4096,&bytesread,NULL);
*nibbles = NibblizeTrack(trackimagebuffer,2,track);
}
// OTHERWISE, IF THIS IMAGE CONTAINS NIBBLE INFORMATION, READ IT
// DIRECTLY INTO THE TRACK BUFFER
else {
*nibbles = *(LPWORD)(ptr->header+(track << 1)+14);
DWORD offset = 88;
while (track--)
offset += *(LPWORD)(ptr->header+(track << 1)+14);
SetFilePointer(ptr->file,offset,NULL,FILE_BEGIN);
ZeroMemory(trackimagebuffer,*nibbles);
DWORD bytesread;
ReadFile(ptr->file,trackimagebuffer,*nibbles,&bytesread,NULL);
}
}
//===========================================================================
void IieWrite (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimage, int nibbles) {
// note: unimplemented
}
/****************************************************************************
*
* NIBBLIZED 6656-NIBBLE (NIB) FORMAT IMPLEMENTATION
*
***/
//===========================================================================
DWORD Nib1Detect (LPBYTE imageptr, DWORD imagesize) {
return (imagesize == 232960) ? 2 : 0;
}
//===========================================================================
void Nib1Read (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimagebuffer, int *nibbles) {
SetFilePointer(ptr->file,ptr->offset+track*NIBBLES,NULL,FILE_BEGIN);
ReadFile(ptr->file,trackimagebuffer,NIBBLES,(DWORD *)nibbles,NULL);
}
//===========================================================================
void Nib1Write (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimage, int nibbles) {
SetFilePointer(ptr->file,ptr->offset+track*NIBBLES,NULL,FILE_BEGIN);
DWORD byteswritten;
WriteFile(ptr->file,trackimage,nibbles,&byteswritten,NULL);
}
/****************************************************************************
*
* NIBBLIZED 6384-NIBBLE (NB2) FORMAT IMPLEMENTATION
*
***/
//===========================================================================
DWORD Nib2Detect (LPBYTE imageptr, DWORD imagesize) {
return (imagesize == 223440) ? 2 : 0;
}
//===========================================================================
void Nib2Read (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimagebuffer, int *nibbles) {
SetFilePointer(ptr->file,ptr->offset+track*6384,NULL,FILE_BEGIN);
ReadFile(ptr->file,trackimagebuffer,6384,(DWORD *)nibbles,NULL);
}
//===========================================================================
void Nib2Write (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimage, int nibbles) {
SetFilePointer(ptr->file,ptr->offset+track*6384,NULL,FILE_BEGIN);
DWORD byteswritten;
WriteFile(ptr->file,trackimage,nibbles,&byteswritten,NULL);
}
/****************************************************************************
*
* PRODOS ORDER (PO) FORMAT IMPLEMENTATION
*
***/
//===========================================================================
DWORD PoDetect (LPBYTE imageptr, DWORD imagesize) {
if (((imagesize < 143105) || (imagesize > 143364)) &&
(imagesize != 143488))
return 0;
// CHECK FOR A PRODOS ORDER IMAGE OF A DOS DISKETTE
{
int loop = 4;
BOOL mismatch = 0;
while ((loop++ < 13) && !mismatch)
if (*(imageptr+0x11002+(loop << 8)) != 14-loop)
mismatch = 1;
if (!mismatch)
return 2;
}
// CHECK FOR A PRODOS ORDER IMAGE OF A PRODOS DISKETTE
{
int loop = 1;
BOOL mismatch = 0;
while ((loop++ < 5) && !mismatch)
if ((*(LPWORD)(imageptr+(loop << 9) ) != ((loop == 2) ? 0 : loop-1)) ||
(*(LPWORD)(imageptr+(loop << 9)+2) != ((loop == 5) ? 0 : loop+1)))
mismatch = 1;
if (!mismatch)
return 2;
}
return 1;
}
//===========================================================================
void PoRead (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimagebuffer, int *nibbles) {
SetFilePointer(ptr->file,ptr->offset+(track << 12),NULL,FILE_BEGIN);
ZeroMemory(workbuffer,4096);
DWORD bytesread;
ReadFile(ptr->file,workbuffer,4096,&bytesread,NULL);
*nibbles = NibblizeTrack(trackimagebuffer,0,track);
if (!enhancedisk)
SkewTrack(track,*nibbles,trackimagebuffer);
}
//===========================================================================
void PoWrite (imageinfoptr ptr, int track, int quartertrack, LPBYTE trackimage, int nibbles) {
ZeroMemory(workbuffer,4096);
DenibblizeTrack(trackimage,0,nibbles);
SetFilePointer(ptr->file,ptr->offset+(track << 12),NULL,FILE_BEGIN);
DWORD byteswritten;
WriteFile(ptr->file,workbuffer,4096,&byteswritten,NULL);
}
/****************************************************************************
*
* PRODOS PROGRAM IMAGE (PRG) FORMAT IMPLEMENTATION
*
***/
//===========================================================================
BOOL PrgBoot (imageinfoptr ptr) {
SetFilePointer(ptr->file,5,NULL,FILE_BEGIN);
WORD address = 0;
WORD length = 0;
DWORD bytesread;
ReadFile(ptr->file,&address,sizeof(WORD),&bytesread,NULL);
ReadFile(ptr->file,&length ,sizeof(WORD),&bytesread,NULL);
length <<= 1;
if ((((WORD)(address+length)) <= address) ||
(address >= 0xC000) ||
(address+length-1 >= 0xC000))
return 0;
SetFilePointer(ptr->file,128,NULL,FILE_BEGIN);
ReadFile(ptr->file,mem+address,length,&bytesread,NULL);
int loop = 192;
while (loop--)
*(memdirty+loop) = 0xFF;
regs.pc = address;
return 1;
}
//===========================================================================
DWORD PrgDetect (LPBYTE imageptr, DWORD imagesize) {
return (*(LPDWORD)imageptr == 0x214C470A) ? 2 : 0;
}
//
// ----- ALL GLOBALLY ACCESSIBLE FUNCTIONS ARE BELOW THIS LINE -----
//
//===========================================================================
BOOL ImageBoot (HIMAGE imagehandle) {
imageinfoptr ptr = (imageinfoptr)imagehandle;
BOOL result = 0;
if (imagetype[ptr->format].boot)
result = imagetype[ptr->format].boot(ptr);
if (result)
ptr->writeprotected = 1;
return result;
}
//===========================================================================
void ImageClose (HIMAGE imagehandle) {
imageinfoptr ptr = (imageinfoptr)imagehandle;
if (ptr->file != INVALID_HANDLE_VALUE)
CloseHandle(ptr->file);
for (int track = 0; track < TRACKS; track++)
if (!ptr->validtrack[track]) {
DeleteFile(ptr->filename);
break;
}
if (ptr->header)
VirtualFree(ptr->header,0,/*MEM_RELEASE*/0);
VirtualFree(ptr,0,/*MEM_RELEASE*/0);
}
//===========================================================================
void ImageDestroy () {
VirtualFree(workbuffer,0,/*MEM_RELEASE*/0);
workbuffer = NULL;
}
//===========================================================================
void ImageInitialize () {
workbuffer = (LPBYTE)VirtualAlloc(NULL,0x2000,0x1000,/*PAGE_READWRITE*/0);
}
//===========================================================================
int ImageOpen (LPCTSTR imagefilename,
HIMAGE *hDiskImage_,
BOOL *pWriteProtected_,
BOOL bCreateIfNecessary)
{
if (! (imagefilename && hDiskImage_ && pWriteProtected_ && workbuffer))
return IMAGE_ERROR_BAD_POINTER; // HACK: MAGIC # -1
// TRY TO OPEN THE IMAGE FILE
HANDLE file = INVALID_HANDLE_VALUE;
if (! *pWriteProtected_)
// file = CreateFile(imagefilename,
// GENERIC_READ | GENERIC_WRITE,
// FILE_SHARE_READ | FILE_SHARE_WRITE,
// (LPSECURITY_ATTRIBUTES)NULL,
// OPEN_EXISTING,
// FILE_ATTRIBUTE_NORMAL,
// NULL);
file = fopen(imagefilename, "r+b"); // open file in r/w mode
// File may have read-only attribute set, so try to open as read-only.
if (file == INVALID_HANDLE_VALUE)
{
// file = CreateFile(
// imagefilename,
// GENERIC_READ,
// FILE_SHARE_READ,
// (LPSECURITY_ATTRIBUTES)NULL,
// OPEN_EXISTING,
// FILE_ATTRIBUTE_NORMAL,
// NULL );
file = fopen(imagefilename, "rb"); // open file just for reading
if (file != INVALID_HANDLE_VALUE)
*pWriteProtected_ = 1;
}
if ((file == INVALID_HANDLE_VALUE) && bCreateIfNecessary)
// file = CreateFile(
// imagefilename,
// GENERIC_READ | GENERIC_WRITE,
// FILE_SHARE_READ | FILE_SHARE_WRITE,
// (LPSECURITY_ATTRIBUTES)NULL,
// CREATE_NEW,
// FILE_ATTRIBUTE_NORMAL,
// NULL );
file = fopen(imagefilename, "a+b"); // create file
// IF WE AREN'T ABLE TO OPEN THE FILE, RETURN
if (file == INVALID_HANDLE_VALUE)
return IMAGE_ERROR_UNABLE_TO_OPEN; // HACK: MAGIC # 1
// DETERMINE THE FILE'S EXTENSION AND CONVERT IT TO LOWERCASE
LPCTSTR imagefileext = imagefilename;
if (_tcsrchr(imagefileext,FILE_SEPARATOR))
imagefileext = _tcsrchr(imagefileext,FILE_SEPARATOR)+1;
if (_tcsrchr(imagefileext,TEXT('.')))
imagefileext = _tcsrchr(imagefileext,TEXT('.'));
#define _MAX_EXT 5
TCHAR ext[_MAX_EXT];
_tcsncpy(ext,imagefileext,_MAX_EXT);
CharLowerBuff(ext,_tcslen(ext));
DWORD size = GetFileSize(file,NULL);
LPBYTE view = NULL;
LPBYTE pImage = NULL;
const DWORD UNKNOWN_FORMAT = 0xFFFFFFFF;
DWORD format = UNKNOWN_FORMAT;
if (size > 0)
{
// MAP THE FILE INTO MEMORY FOR USE BY THE DETECTION FUNCTIONS
/* HANDLE mapping = CreateFileMapping(
file,
(LPSECURITY_ATTRIBUTES)NULL,
PAGE_READONLY,
0,0,NULL );
view = (LPBYTE)MapViewOfFile(mapping,FILE_MAP_READ,0,0,0);*/
view = (LPBYTE)malloc(size);
fread(view, 1, size, (FILE*)file);
fseek((FILE*)file, 0, FILE_BEGIN); // I just got accustomed to mrsftish FILE_BEGIN, FILE_END, etc. Hmm. ^_^
pImage = view;
if (pImage)
{
// DETERMINE WHETHER THE FILE HAS A 128-BYTE MACBINARY HEADER
if ((size > 128) &&
(!*pImage) &&
(*(pImage+1) < 120) &&
(!*(pImage+*(pImage+1)+2)) &&
(*(pImage+0x7A) == 0x81) &&
(*(pImage+0x7B) == 0x81))
{
pImage += 128;
size -= 128;
}
// CALL THE DETECTION FUNCTIONS IN ORDER, LOOKING FOR A MATCH
DWORD possibleformat = UNKNOWN_FORMAT; // 0xFFFFFFFF;
int loop = 0;
while ((loop < IMAGETYPES) && (format == UNKNOWN_FORMAT)) // 0xFFFFFFFF)) {
{
if (*ext && _tcsstr(imagetype[loop].rejectexts,ext))
++loop;
else
{
DWORD result = imagetype[loop].detect(pImage,size);
if (result == 2)
format = loop;
else if ((result == 1) && (possibleformat == UNKNOWN_FORMAT)) // 0xFFFFFFFF))
possibleformat = loop++;
else
++loop;
}
}
if (format == UNKNOWN_FORMAT) // 0xFFFFFFFF)
format = possibleformat;
// CLOSE THE MEMORY MAPPING
// UnmapViewOfFile(view);
free(view); // free memory block, allocated before
}
//CloseHandle(mapping);
}
else
{
// WE CREATE ONLY DOS ORDER (DO) OR 6656-NIBBLE (NIB) FORMAT FILES
for (int loop = 1; loop <= 4; loop += 3)
{
if (*ext && _tcsstr(imagetype[loop].createexts,ext))
{
format = loop;
break;
}
}
}
// IF THE FILE DOES MATCH A KNOWN FORMAT...
if (format != UNKNOWN_FORMAT)
{
// CREATE A RECORD FOR THE FILE, AND RETURN AN IMAGE HANDLE
*hDiskImage_ = (HIMAGE)VirtualAlloc(NULL,sizeof(imageinforec),0x1000,0);
if (*hDiskImage_)
{
ZeroMemory(*hDiskImage_,sizeof(imageinforec));
// do this in DiskInsert vv
_tcsncpy(((imageinfoptr)*hDiskImage_)->filename,imagefilename,MAX_PATH);
((imageinfoptr)*hDiskImage_)->format = format;
((imageinfoptr)*hDiskImage_)->file = file;
((imageinfoptr)*hDiskImage_)->offset = pImage-view;
((imageinfoptr)*hDiskImage_)->writeprotected = *pWriteProtected_;
for (int track = 0; track < TRACKS; track++)
((imageinfoptr)*hDiskImage_)->validtrack[track] = (size > 0);
return IMAGE_ERROR_NONE; // HACK: MAGIC # 0
}
}
CloseHandle(file);
if (!(size > 0))
DeleteFile(imagefilename);
return IMAGE_ERROR_BAD_SIZE; // HACK: MAGIC # 2
}
//===========================================================================
void ImageReadTrack (HIMAGE imagehandle,
int track,
int quartertrack,
LPBYTE trackimagebuffer,
int *nibbles) {
imageinfoptr ptr = (imageinfoptr)imagehandle;
if (imagetype[ptr->format].read && ptr->validtrack[track])
imagetype[ptr->format].read(ptr,track,quartertrack,trackimagebuffer,nibbles);
else
for (*nibbles = 0; *nibbles < NIBBLES; (*nibbles)++)
trackimagebuffer[*nibbles] = (BYTE)(rand() & 0xFF);
}
//===========================================================================
void ImageWriteTrack (HIMAGE imagehandle,
int track,
int quartertrack,
LPBYTE trackimage,
int nibbles) {
imageinfoptr ptr = (imageinfoptr)imagehandle;
if (imagetype[ptr->format].write && !ptr->writeprotected) {
imagetype[ptr->format].write(ptr,track,quartertrack,trackimage,nibbles);
ptr->validtrack[track] = 1;
}
}

View File

@ -0,0 +1,24 @@
#pragma once
#define TRACKS 35
#define IMAGETYPES 7
#define NIBBLES 6656
BOOL ImageBoot (HIMAGE);
void ImageClose (HIMAGE);
void ImageDestroy ();
void ImageInitialize ();
enum ImageError_e
{
IMAGE_ERROR_BAD_POINTER =-1,
IMAGE_ERROR_NONE = 0,
IMAGE_ERROR_UNABLE_TO_OPEN = 1,
IMAGE_ERROR_BAD_SIZE = 2
};
//int ImageOpen (LPCTSTR,HIMAGE *,BOOL *,BOOL);
int ImageOpen (LPCTSTR imagefilename, HIMAGE *hDiskImage_, BOOL *pWriteProtected_, BOOL bCreateIfNecessary );
void ImageReadTrack (HIMAGE,int,int,LPBYTE,int *);
void ImageWriteTrack (HIMAGE,int,int,LPBYTE,int);

1296
linapple-pie/src/Frame.cpp Normal file

File diff suppressed because it is too large Load Diff

52
linapple-pie/src/Frame.h Normal file
View File

@ -0,0 +1,52 @@
#pragma once
enum {NOT_ASCII=0, ASCII};
// 3D Border (do not iuse for now? --bb)
#define VIEWPORTX 5
#define VIEWPORTY 5
// if you gonna change these values, consider changing some values in Video.cpp --bb
#define SCREEN_WIDTH 560
#define SCREEN_HEIGHT 384
#define SCREEN_BPP 8
extern SDL_Surface * screen;
#define SHOW_CYCLES 15
// Win32
//extern HWND g_hFrameWindow;
//extern HDC g_hFrameDC;
extern BOOL fullscreen;
extern BOOL g_WindowResized;
extern SDL_Rect origRect;
extern SDL_Rect newRect;
int InitSDL();
int FrameCreateWindow ();
//HDC FrameGetDC ();
//HDC FrameGetVideoDC (LPBYTE *,LONG *);
void FrameRefreshStatus (int);
void FrameRegisterClass ();
void FrameReleaseDC ();
void FrameReleaseVideoDC ();
void DrawFrameWindow (); // draw it!
void FrameDispatchMessage(SDL_Event * e); // replacement for FrameWndProc.
/*LRESULT CALLBACK FrameWndProc (
HWND window,
UINT message,
WPARAM wparam,
LPARAM lparam );*/
void SetUsingCursor (BOOL);
void SetFullScreenMode ();
void SetNormalMode ();
extern bool g_bScrollLock_FullSpeed;

View File

@ -0,0 +1,714 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Hard drive emulation
*
* Author: Copyright (c) 2005, Robert Hoem
*/
/* Adaptation for SDL and POSIX (l) by beom beotiger, Nov-Dec 2007 */
#include "stdafx.h"
#include "wwrapper.h"
#include "ftpparse.h"
#include "DiskFTP.h"
//#pragma hdrstop
//#include "resource.h"
/*
Memory map:
C0F0 (r) EXECUTE AND RETURN STATUS
C0F1 (r) STATUS (or ERROR)
C0F2 (r/w) COMMAND
C0F3 (r/w) UNIT NUMBER
C0F4 (r/w) LOW BYTE OF MEMORY BUFFER
C0F5 (r/w) HIGH BYTE OF MEMORY BUFFER
C0F6 (r/w) LOW BYTE OF BLOCK NUMBER
C0F7 (r/w) HIGH BYTE OF BLOCK NUMBER
C0F8 (r) NEXT BYTE
*/
/*
Hard drive emulation in Applewin.
Concept
To emulate a 32mb hard drive connected to an Apple IIe via Applewin.
Designed to work with Autoboot Rom and Prodos.
Overview
1. Hard drive image file
The hard drive image file (.HDV) will be formatted into blocks of 512
bytes, in a linear fashion. The internal formatting and meaning of each
block to be decided by the Apple's operating system (ProDos). To create
an empty .HDV file, just create a 0 byte file (I prefer the debug method).
2. Emulation code
There are 4 commands Prodos will send to a block device.
Listed below are each command and how it's handled:
1. STATUS
In the emulation's case, returns only a DEVICE OK (0) or DEVICE I/O ERROR (8).
DEVICE I/O ERROR only returned if no HDV file is selected.
2. READ
Loads requested block into a 512 byte buffer by attempting to seek to
location in HDV file.
If seek fails, returns a DEVICE I/O ERROR. Resets hd_buf_ptr used by HD_NEXTBYTE
Returns a DEVICE OK if read was successful, or a DEVICE I/O ERROR otherwise.
3. WRITE
Copies requested block from the Apple's memory to a 512 byte buffer
then attempts to seek to requested block.
If the seek fails (usually because the seek is beyond the EOF for the
HDV file), the Emulation will attempt to "grow" the HDV file to accomodate.
Once the file can accomodate, or if the seek did not fail, the buffer is
written to the HDV file. NOTE: A2PC will grow *AND* shrink the HDV file.
I didn't see the point in shrinking the file as this behaviour would require
patching prodos (to detect DELETE FILE calls).
4. FORMAT
Ignored. This would be used for low level formatting of the device
(as in the case of a tape or SCSI drive, perhaps).
3. Bugs
The only thing I've noticed is that Copy II+ 7.1 seems to crash or stall
occasionally when trying to calculate how many free block are available
when running a catalog. This might be due to the great number of blocks
available. Also, DDD pro will not optimise the disk correctally (it's
doing a disk defragment of some sort, and when it requests a block outside
the range of the image file, it starts getting I/O errors), so don't
bother. Any program that preforms a read before write to an "unwritten"
block (a block that should be located beyond the EOF of the .HDV, which is
valid for writing but not for reading until written to) will fail with I/O
errors (although these are few and far between).
I'm sure there are programs out there that may try to use the I/O ports in
ways they weren't designed (like telling Ultima 5 that you have a Phazor
sound card in slot 7 is a generally bad idea) will cause problems.
*/
char Hddrvr_dat[] =
"\xA9\x20\xA9\x00\xA9\x03\xA9\x3C\xA9\x00\x8D\xF2\xC0\xA9\x70\x8D"
"\xF3\xC0\xAD\xF0\xC0\x48\xAD\xF1\xC0\x18\xC9\x01\xD0\x01\x38\x68"
"\x90\x03\x4C\x00\xC6\xA9\x70\x85\x43\xA9\x00\x85\x44\x85\x46\x85"
"\x47\xA9\x08\x85\x45\xA9\x01\x85\x42\x20\x46\xC7\x90\x03\x4C\x00"
"\xC6\xA2\x70\x4C\x01\x08\x18\xA5\x42\x8D\xF2\xC0\xA5\x43\x8D\xF3"
"\xC0\xA5\x44\x8D\xF4\xC0\xA5\x45\x8D\xF5\xC0\xA5\x46\x8D\xF6\xC0"
"\xA5\x47\x8D\xF7\xC0\xAD\xF0\xC0\x48\xA5\x42\xC9\x01\xD0\x03\x20"
"\x7D\xC7\xAD\xF1\xC0\x18\xC9\x01\xD0\x01\x38\x68\x60\x98\x48\xA0"
"\x00\xAD\xF8\xC0\x91\x44\xC8\xD0\xF8\xE6\x45\xA0\x00\xAD\xF8\xC0"
"\x91\x44\xC8\xD0\xF8\x68\xA8\x60\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x7F\xD7\x46"
;
typedef struct
{
TCHAR hd_imagename[16];
TCHAR hd_fullname[128];
BYTE hd_error;
WORD hd_memblock;
WORD hd_diskblock;
WORD hd_buf_ptr;
BOOL hd_imageloaded;
HANDLE hd_file;
BYTE hd_buf[513];
} HDD, *PHDD;
static bool g_bHD_RomLoaded = false;
bool g_bHD_Enabled = false;
static BYTE g_nHD_UnitNum = DRIVE_1;
// The HDD interface has a single Command register for both drives:
// . ProDOS will write to Command before switching drives
static BYTE g_nHD_Command;
static HDD g_HardDrive[2] = {0};
static UINT g_uSlot = 7;
static int HDDStatus = DISK_STATUS_OFF; // status: 0 - none, 1 - read, 2 - write
//===========================================================================
int HD_GetStatus(void) {
int result = HDDStatus;
// HDDStatus = DISK_STATUS_OFF;
return result;
}
void HD_ResetStatus(void) {
HDDStatus = DISK_STATUS_OFF;
}
static void GetImageTitle (LPCTSTR imagefilename, PHDD pHardDrive)
{
TCHAR imagetitle[128];
LPCTSTR startpos = imagefilename;
// imagetitle = <FILENAME.EXT>
if (_tcsrchr(startpos,FILE_SEPARATOR))
startpos = _tcsrchr(startpos,FILE_SEPARATOR)+1;
_tcsncpy(imagetitle,startpos,127);
imagetitle[127] = 0;
// if imagetitle contains a lowercase char, then found=1 (why?)
BOOL found = 0;
int loop = 0;
while (imagetitle[loop] && !found)
{
if (IsCharLower(imagetitle[loop]))
found = 1;
else
loop++;
}
// commented by me, bb! ^_^
// if ((!found) && (loop > 2))
// CharLowerBuff(imagetitle+1,_tcslen(imagetitle+1));
// fptr->fullname = <FILENAME.EXT>
_tcsncpy(pHardDrive->hd_fullname,imagetitle,127);
pHardDrive->hd_fullname[127] = 0;
if (imagetitle[0])
{
LPTSTR dot = imagetitle;
if (_tcsrchr(dot,TEXT('.')))
dot = _tcsrchr(dot,TEXT('.'));
if (dot > imagetitle)
*dot = 0;
}
// fptr->imagename = <FILENAME> (ie. no extension)
_tcsncpy(pHardDrive->hd_imagename,imagetitle,15);
pHardDrive->hd_imagename[15] = 0;
}
static void NotifyInvalidImage (TCHAR* filename)
{
// TC: TO DO
printf("HDD: Could not load %s\n", filename);
}
static void HD_CleanupDrive(int nDrive)
{
if(g_HardDrive[nDrive].hd_file) CloseHandle(g_HardDrive[nDrive].hd_file);
g_HardDrive[nDrive].hd_imageloaded = false;
g_HardDrive[nDrive].hd_imagename[0] = 0;
g_HardDrive[nDrive].hd_fullname[0] = 0;
}
static BOOL HD_Load_Image(int nDrive, LPCSTR filename)
{
/* g_HardDrive[nDrive].hd_file = CreateFile(filename,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
NULL);*/
// TO-DO UnZip and UnGzip hard disks images? Is it needed?
g_HardDrive[nDrive].hd_file = fopen(filename, "r+b");
if (g_HardDrive[nDrive].hd_file == INVALID_HANDLE_VALUE)
g_HardDrive[nDrive].hd_imageloaded = false;
else
g_HardDrive[nDrive].hd_imageloaded = true;
return g_HardDrive[nDrive].hd_imageloaded;
}
static LPCTSTR HD_DiskGetName (int nDrive)
{
return g_HardDrive[nDrive].hd_imagename;
}
//===========================================================================
// everything below is global
static BYTE /*__stdcall*/ HD_IO_EMUL (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
static const DWORD HDDRVR_SIZE = 0x100;
bool HD_CardIsEnabled()
{
return g_bHD_RomLoaded && g_bHD_Enabled;
}
void HD_SetEnabled(bool bEnabled)
{
if(g_bHD_Enabled == bEnabled)
return;
g_bHD_Enabled = bEnabled;
LPBYTE pCxRomPeripheral = MemGetCxRomPeripheral();
if(pCxRomPeripheral == NULL) // This will be NULL when called after loading value from Registry
return;
if(g_bHD_Enabled)
HD_Load_Rom(pCxRomPeripheral, g_uSlot);
else
memset(pCxRomPeripheral + g_uSlot*256, 0, HDDRVR_SIZE);
RegisterIoHandler(g_uSlot, HD_IO_EMUL, HD_IO_EMUL, NULL, NULL, NULL, NULL);
// printf("Hddrvr.bin loaded and registered!\n");
}
LPCTSTR HD_GetFullName (int nDrive)
{
return g_HardDrive[nDrive].hd_fullname;
}
VOID HD_Load_Rom(LPBYTE pCxRomPeripheral, UINT uSlot)
{
if(!g_bHD_Enabled)
return;
//
// read resource (HDD firmware)
// firmware for HDD
// #define IDR_HDDRVR_FW "Hddrvr.bin"
// char BUFFER[HDDRVR_SIZE];
// FILE * hdfile = NULL;
// hdfile = fopen(IDR_HDDRVR_FW, "rb");
// if(hdfile == NULL) return; // no file?
// int nbytes = fread(BUFFER, 1, HDDRVR_SIZE, hdfile);
// fclose(hdfile);
// if(nbytes != HDDRVR_SIZE) return; // have not read enough?
BYTE* pData = (BYTE*) Hddrvr_dat; // NB. Don't need to unlock resource - hmmmmmm....... i love linux
// if(pData == NULL)
// return;
g_uSlot = uSlot;
memcpy(pCxRomPeripheral + uSlot*256, pData, HDDRVR_SIZE);
g_bHD_RomLoaded = true;
}
VOID HD_Cleanup()
{
for(int i=DRIVE_1; i<DRIVE_2; i++)
{
HD_CleanupDrive(i);
}
}
// pszFilename is not qualified with path
BOOL HD_InsertDisk2(int nDrive, LPCTSTR pszFilename)
{
if (*pszFilename == 0x00)
return false;
// char szFullFilename[MAX_PATH];
// RegLoadString(TEXT("Preferences"),TEXT("HDV Starting Directory"), 1, szFullFilename, MAX_PATH);
// strcat(szFullFilename, pszFilename);
return HD_InsertDisk(nDrive, pszFilename);
}
// imagefilename is qualified with path
BOOL HD_InsertDisk(int nDrive, LPCTSTR imagefilename)
{
if (*imagefilename == 0x00)
return false;
if (g_HardDrive[nDrive].hd_imageloaded)
HD_CleanupDrive(nDrive);
BOOL result = HD_Load_Image(nDrive, imagefilename);
if (result)
GetImageTitle(imagefilename, &g_HardDrive[nDrive]);
else NotifyInvalidImage((char*)imagefilename); // could not load hd image
return result;
}
void HD_FTP_Select(int nDrive)
{
// Selects HDrive from FTP directoriy
static int findex = 0; // file index will be remembered for current dir
static int backdx = 0; //reserve
static int dirdx = 0; // reserve for dirs
char * filename = NULL; // given filename
char fullpath[MAX_PATH]; // full path for it
char tmppath [MAX_PATH];
bool isdir; // if given filename is a directory?
findex = backdx;
isdir = true;
strcpy(fullpath, g_sFTPServerHDD); // global var for FTP path for HDD
while(isdir)
{
printf("HD_FTP_Select: fullpath=%s\n", fullpath);
if(!ChooseAnImageFTP(g_ScreenWidth, g_ScreenHeight, fullpath, 7, &filename, &isdir, &findex)) {
DrawFrameWindow();
return; // if ESC was pressed, just leave
}
// Debug output
printf("HD_FTP_Select: we got next:\n");
printf("isdir=%d, findex=%d, filename=%s\n", isdir, findex, filename);
// --
if(isdir)
{
if(!strcmp(filename, ".."))
// go to the upper directory
{
filename = strrchr(fullpath, FTP_SEPARATOR); // look for last '/'
if(filename) {
*filename = '\0'; // cut it off
filename = strrchr(fullpath, FTP_SEPARATOR); // look for last '/'
if(filename) *(++filename) = '\0'; // leave it on the place
}
if(strlen(fullpath) == 0) strcpy(fullpath,"/"); //we don't want fullpath to be empty
findex = dirdx; // restore
}
else
{
if(strcmp(fullpath, "/")) snprintf(tmppath, MAX_PATH, "%s%s/", fullpath, filename); // next dir
else snprintf(tmppath, MAX_PATH, "/%s/", filename);
strcpy(fullpath, tmppath); // got ot anew
printf("HD_FTP_Select: we build %s\n", tmppath);
dirdx = findex; // store it
findex = 0; // start with beginning of dir
}
}/* if isdir */
} /* while isdir */
// we chose some file
strcpy(g_sFTPServerHDD, fullpath);
RegSaveString(TEXT("Preferences"),REGVALUE_FTP_HDD_DIR, 1, g_sFTPServerHDD);// save it
snprintf(tmppath, MAX_PATH, "%s/%s", fullpath, filename);
strcpy(fullpath, tmppath); // fullpath - full path to file on FTP server
snprintf(tmppath, MAX_PATH, "%s/%s", g_sFTPLocalDir, filename); // local path for file
int error = ftp_get(fullpath, tmppath);
if(!error) {
if (HD_InsertDisk2(nDrive, tmppath))
{
// save file names for HDD disk 1 or 2
if(nDrive) RegSaveString(TEXT("Preferences"),REGVALUE_HDD_IMAGE2,1,tmppath);
else RegSaveString(TEXT("Preferences"),REGVALUE_HDD_IMAGE1,1,tmppath);
}
}
backdx = findex; //store cursor position
DrawFrameWindow();
}
void HD_Select(int nDrive)
{
// Selects HDrive from file list
static int findex = 0; // file index will be remembered for current dir
static int backdx = 0; //reserve
static int dirdx = 0; // reserve for dirs
char * filename = NULL; // given filename
char fullpath[MAX_PATH]; // full path for it
char tmppath [MAX_PATH];
bool isdir; // if given filename is a directory?
findex = backdx;
isdir = true;
strcpy(fullpath, g_sHDDDir); // global var for disk selecting directory
while(isdir)
{
if(!ChooseAnImage(g_ScreenWidth, g_ScreenHeight, fullpath, 7, &filename, &isdir, &findex)) {
DrawFrameWindow();
return; // if ESC was pressed, just leave
}
if(isdir)
{
if(!strcmp(filename, "..")) // go to the upper directory
{
filename = strrchr(fullpath, FILE_SEPARATOR); // look for last '/'
if(filename) *filename = '\0'; // cut it off
if(strlen(fullpath) == 0) strcpy(fullpath,"/"); //we don't want fullpath to be empty
findex = dirdx; // restore
}
else
{
if(strcmp(fullpath, "/")) snprintf(tmppath, MAX_PATH, "%s/%s", fullpath, filename); // next dir
else snprintf(tmppath, MAX_PATH, "/%s", filename);
strcpy(fullpath, tmppath); // got ot anew
dirdx = findex; // store it
findex = 0; // start with beginning of dir
}
}/* if isdir */
} /* while isdir */
// we chose some file
strcpy(g_sHDDDir, fullpath);
RegSaveString(TEXT("Preferences"),REGVALUE_PREF_HDD_START_DIR, 1, g_sHDDDir);// save it
snprintf(tmppath, MAX_PATH, "%s/%s", fullpath, filename); // next dir
strcpy(fullpath, tmppath); // got ot anew
// in future: save file name in registry for future fetching
// for one drive will be one reg parameter
// RegSaveString(TEXT("Preferences"),REGVALUE_<SOMETHING>, 1,filename);
if (HD_InsertDisk2(nDrive, fullpath))
{
// save file names for HDD disk 1 or 2
if(nDrive) RegSaveString(TEXT("Preferences"),REGVALUE_HDD_IMAGE2,1,fullpath);
else RegSaveString(TEXT("Preferences"),REGVALUE_HDD_IMAGE1,1,fullpath);
printf("HDD disk image %s inserted\n",fullpath);
}
// else
// {
// NotifyInvalidImage(filename);
// }
backdx = findex; //store cursor position
DrawFrameWindow();
}
//-----------------------------------------------------------------------------
#define DEVICE_OK 0x00
#define DEVICE_UNKNOWN_ERROR 0x03
#define DEVICE_IO_ERROR 0x08
static BYTE /*__stdcall*/ HD_IO_EMUL (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft)
{
BYTE r = DEVICE_OK;
addr &= 0xFF;
/* if(addr == 0xF8 && bWrite == 0) printf("-"); // data read
else
printf("HD_IO_EMUL: pc=%04x, addr=%04x, bWrite=%02x, d=%02x\n", pc, addr, bWrite, d);*/
if (!HD_CardIsEnabled())
return r;
PHDD pHDD = &g_HardDrive[g_nHD_UnitNum >> 7]; // bit7 = drive select
if (bWrite == 0) // read
{
switch (addr)
{
case 0xF0:
{
if (pHDD->hd_imageloaded)
{
// based on loaded data block request, load block into memory
// returns status
switch (g_nHD_Command)
{
default:
case 0x00: //status
if (GetFileSize(pHDD->hd_file,NULL) == 0)
{
pHDD->hd_error = 1;
r = DEVICE_IO_ERROR;
}
break;
case 0x01: //read
{
HDDStatus = DISK_STATUS_READ;
DWORD br = GetFileSize(pHDD->hd_file,NULL);
if ((DWORD)(pHDD->hd_diskblock * 512) <= br) // seek to block
{
SetFilePointer(pHDD->hd_file,pHDD->hd_diskblock * 512,NULL,FILE_BEGIN); // seek to block
if (ReadFile(pHDD->hd_file,pHDD->hd_buf,512,&br,NULL)) // read block into buffer
{
pHDD->hd_error = 0;
r = 0;
pHDD->hd_buf_ptr = 0;
}
else
{
pHDD->hd_error = 1;
r = DEVICE_IO_ERROR;
}
}
else
{
pHDD->hd_error = 1;
r = DEVICE_IO_ERROR;
}
}
break;
case 0x02: //write
{
HDDStatus = DISK_STATUS_WRITE;
DWORD bw = GetFileSize(pHDD->hd_file,NULL);
if ((DWORD)(pHDD->hd_diskblock * 512) <= bw)
{
MoveMemory(pHDD->hd_buf,mem+pHDD->hd_memblock,512);
SetFilePointer(pHDD->hd_file,pHDD->hd_diskblock * 512,NULL,FILE_BEGIN); // seek to block
if (WriteFile(pHDD->hd_file,pHDD->hd_buf,512,&bw,NULL)) // write buffer to file
{
pHDD->hd_error = 0;
r = 0;
}
else
{
pHDD->hd_error = 1;
r = DEVICE_IO_ERROR;
}
}
else
{
DWORD fsize = SetFilePointer(pHDD->hd_file,0,NULL,FILE_END);
DWORD addblocks = pHDD->hd_diskblock - (fsize / 512);
FillMemory(pHDD->hd_buf,512,0);
while (addblocks--)
{
DWORD bw;
WriteFile(pHDD->hd_file,pHDD->hd_buf,512,&bw,NULL);
}
if (SetFilePointer(pHDD->hd_file,pHDD->hd_diskblock * 512,NULL,FILE_BEGIN) != 0xFFFFFFFF) { // seek to block
MoveMemory(pHDD->hd_buf,mem+pHDD->hd_memblock,512);
if (WriteFile(pHDD->hd_file,pHDD->hd_buf,512,&bw,NULL)) // write buffer to file
{
pHDD->hd_error = 0;
r = 0;
}
else
{
pHDD->hd_error = 1;
r = DEVICE_IO_ERROR;
}
}
}
}
break;
case 0x03: //format
HDDStatus = DISK_STATUS_WRITE;
break;
}
}
else
{
HDDStatus = DISK_STATUS_OFF;
pHDD->hd_error = 1;
r = DEVICE_UNKNOWN_ERROR;
}
}
break;
case 0xF1: // hd_error
{
r = pHDD->hd_error;
}
break;
case 0xF2:
{
r = g_nHD_Command;
}
break;
case 0xF3:
{
r = g_nHD_UnitNum;
}
break;
case 0xF4:
{
r = (BYTE)(pHDD->hd_memblock & 0x00FF);
}
break;
case 0xF5:
{
r = (BYTE)(pHDD->hd_memblock & 0xFF00 >> 8);
}
break;
case 0xF6:
{
r = (BYTE)(pHDD->hd_diskblock & 0x00FF);
}
break;
case 0xF7:
{
r = (BYTE)(pHDD->hd_diskblock & 0xFF00 >> 8);
}
break;
case 0xF8:
{
r = pHDD->hd_buf[pHDD->hd_buf_ptr];
pHDD->hd_buf_ptr++;
}
break;
default:
printf("Unknow coomand: bWrite=0\n");
return IO_Null(pc, addr, bWrite, d, nCyclesLeft);
}
}
else // write
{
switch (addr)
{
case 0xF2:
{
g_nHD_Command = d;
}
break;
case 0xF3:
{
// b7 = drive#
// b6..4 = slot#
// b3..0 = ?
g_nHD_UnitNum = d;
}
break;
case 0xF4:
{
pHDD->hd_memblock = pHDD->hd_memblock & 0xFF00 | d;
}
break;
case 0xF5:
{
pHDD->hd_memblock = pHDD->hd_memblock & 0x00FF | (d << 8);
}
break;
case 0xF6:
{
pHDD->hd_diskblock = pHDD->hd_diskblock & 0xFF00 | d;
}
break;
case 0xF7:
{
pHDD->hd_diskblock = pHDD->hd_diskblock & 0x00FF | (d << 8);
}
break;
default:
printf("Unknow coomand: bWrite=1\n");
return IO_Null(pc, addr, bWrite, d, nCyclesLeft);
}
}
FrameRefreshStatus(DRAW_LEDS); // update status area
return r;
}

View File

@ -0,0 +1,17 @@
#pragma once
extern bool g_bHD_Enabled;
bool HD_CardIsEnabled();
void HD_SetEnabled(bool bEnabled);
LPCTSTR HD_GetFullName (int drive);
VOID HD_Load_Rom(LPBYTE pCxRomPeripheral, UINT uSlot);
VOID HD_Cleanup();
BOOL HD_InsertDisk2(int nDrive, LPCTSTR pszFilename);
BOOL HD_InsertDisk(int nDrive, LPCTSTR imagefilename);
void HD_Select(int nDrive);
void HD_FTP_Select(int nDrive);
int HD_GetStatus(void);
void HD_ResetStatus(void);

View File

@ -0,0 +1,631 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Joystick emulation via keyboard, PC joystick or mouse
*
* Author: Various - hmm, I know him, and you..? ^_^ --bb
*/
// TC: Extended for 2nd joystick:
// Apple joystick #0 can be emulated with: NONE, JOYSTICKID1, KEYBOARD, MOUSE
// Apple joystick #1 can be emulated with: NONE, JOYSTICKID2, KEYBOARD, MOUSE
// If Apple joystick #0 is using {KEYBOARD | MOUSE} then joystick #1 can't use it.
// If Apple joystick #1 is using KEYBOARD, then disable the standard keys that control Apple switches #0/#1.
// - So that in a 2 player game, player 2 can't cheat by controlling player 1's buttons.
// If Apple joystick #1 is not NONE, then Apple joystick #0 only gets the use of Apple switch #0.
// - When using 2 joysticks, button #1 is used by joystick #1 (Archon).
// Apple joystick #1's button now controls Apple switches #1 and #2.
// - This is because the 2-joystick version of Mario Bros expects the 2nd joystick to control Apple switch #2.
/* Adaptation for SDL and POSIX (l) by beom beotiger, Nov-Dec 2007 */
#include "stdafx.h"
//#pragma hdrstop -- g++ complains on this pragma
#include "MouseInterface.h"
#define BUTTONTIME 5000
#define DEVICE_NONE 0
#define DEVICE_JOYSTICK 1
#define DEVICE_KEYBOARD 2
#define DEVICE_MOUSE 3
#define MODE_NONE 0
#define MODE_STANDARD 1
#define MODE_CENTERING 2
#define MODE_SMOOTH 3
typedef struct _joyinforec {
int device;
int mode;
} joyinforec, *joyinfoptr;
static const joyinforec joyinfo[5] = {{DEVICE_NONE,MODE_NONE},
{DEVICE_JOYSTICK,MODE_STANDARD},
{DEVICE_KEYBOARD,MODE_STANDARD},
{DEVICE_KEYBOARD,MODE_CENTERING},
{DEVICE_MOUSE,MODE_STANDARD}};
// Key pad [1..9]; Key pad 0,Key pad '.'; Left ALT,Right ALT
enum JOYKEY { JK_DOWNLEFT=0,
JK_DOWN,
JK_DOWNRIGHT,
JK_LEFT,
JK_CENTRE,
JK_RIGHT,
JK_UPLEFT,
JK_UP,
JK_UPRIGHT,
JK_BUTTON0,
JK_BUTTON1,
JK_OPENAPPLE,
JK_CLOSEDAPPLE,
JK_MAX
};
const UINT PDL_MIN = 0;
const UINT PDL_CENTRAL = 127;
const UINT PDL_MAX = 255;
static BOOL keydown[JK_MAX] = {FALSE};
static POINT keyvalue[9] = {{PDL_MIN,PDL_MAX}, {PDL_CENTRAL,PDL_MAX}, {PDL_MAX,PDL_MAX},
{PDL_MIN,PDL_CENTRAL},{PDL_CENTRAL,PDL_CENTRAL},{PDL_MAX,PDL_CENTRAL},
{PDL_MIN,PDL_MIN}, {PDL_CENTRAL,PDL_MIN}, {PDL_MAX,PDL_MIN}};
static DWORD buttonlatch[3] = {0,0,0};
static BOOL joybutton[3] = {0,0,0};
static int joyshrx[2] = {8,8};
static int joyshry[2] = {8,8};
static int joysubx[2] = {0,0};
static int joysuby[2] = {0,0};
DWORD joytype[2] = {DEVICE_JOYSTICK, DEVICE_NONE}; // Emulation Type for joysticks #0 & #1
static BOOL setbutton[3] = {0,0,0}; // Used when a mouse button is pressed/released
static int xpos[2] = {PDL_CENTRAL,PDL_CENTRAL};
static int ypos[2] = {PDL_CENTRAL,PDL_CENTRAL};
static unsigned __int64 g_nJoyCntrResetCycle = 0; // Abs cycle that joystick counters were reset
static short g_nPdlTrimX = 0;
static short g_nPdlTrimY = 0;
SDL_Joystick *joy1 = NULL;
SDL_Joystick *joy2 = NULL;
//===========================================================================
void CheckJoystick0 ()
{
if(!joy1) return; // if no joystick#1 then everything will be useless
static DWORD lastcheck = 0;
DWORD currtime = GetTickCount();
if ((currtime - lastcheck >= 10) || joybutton[0] || joybutton[1])
{
lastcheck = currtime;
// JOYINFO info;
// if (joyGetPos(JOYSTICKID1,&info) == JOYERR_NOERROR)
// {
SDL_JoystickUpdate(); // update all joysticks states
if ((SDL_JoystickGetButton(joy1, 0)) && !joybutton[0])
buttonlatch[0] = BUTTONTIME;
if ((SDL_JoystickGetButton(joy1, 1)) && !joybutton[1] &&
(joyinfo[joytype[1]].device == DEVICE_NONE) // Only consider 2nd button if NOT emulating a 2nd Apple joystick
)
buttonlatch[1] = BUTTONTIME;
joybutton[0] = SDL_JoystickGetButton(joy1, 0);
if (joyinfo[joytype[1]].device == DEVICE_NONE) // Only consider 2nd button if NOT emulating a 2nd Apple joystick button
joybutton[1] = SDL_JoystickGetButton(joy1, 1);
xpos[0] = (SDL_JoystickGetAxis(joy1, 0)-joysubx[0]) >> joyshrx[0];
ypos[0] = (SDL_JoystickGetAxis(joy1, 1)-joysuby[0]) >> joyshry[0];
// NB. This does not work for analogue joysticks (not self-centreing) - except if Trim=0
if(xpos[0] == 127 || xpos[0] == 128) xpos[0] += g_nPdlTrimX;
if(ypos[0] == 127 || ypos[0] == 128) ypos[0] += g_nPdlTrimY;
// }
}
}
void CheckJoystick1 ()
{
if(!joy2) return; // we should have second joystick to do anything
static DWORD lastcheck = 0;
DWORD currtime = GetTickCount();
if ((currtime-lastcheck >= 10) || joybutton[2])
{
lastcheck = currtime;
// JOYINFO info;
// if (joyGetPos(JOYSTICKID2,&info) == JOYERR_NOERROR)
// {
SDL_JoystickUpdate(); // update all joysticks states
if (SDL_JoystickGetButton(joy2, 0) && !joybutton[2])
{
buttonlatch[2] = BUTTONTIME;
if(joyinfo[joytype[1]].device != DEVICE_NONE)
buttonlatch[1] = BUTTONTIME; // Re-map this button when emulating a 2nd Apple joystick
}
joybutton[2] = SDL_JoystickGetButton(joy2, 0);
if(joyinfo[joytype[1]].device != DEVICE_NONE)
joybutton[1] = SDL_JoystickGetButton(joy2, 0); // Re-map this button when emulating a 2nd Apple joystick
xpos[1] = (SDL_JoystickGetAxis(joy2, 0) - joysubx[1]) >> joyshrx[1];
ypos[1] = (SDL_JoystickGetAxis(joy2, 1) - joysuby[1]) >> joyshry[1];
// NB. This does not work for analogue joysticks (not self-centreing) - except if Trim=0
if(xpos[1] == 127 || xpos[1] == 128) xpos[1] += g_nPdlTrimX;
if(ypos[1] == 127 || ypos[1] == 128) ypos[1] += g_nPdlTrimY;
// }
}
}
//
// ----- ALL GLOBALLY ACCESSIBLE FUNCTIONS ARE BELOW THIS LINE -----
//
void JoyShutDown()
{
// First of all, let's close all existing SDL joysticks
if(joy1) SDL_JoystickClose(joy1);
if(joy2) SDL_JoystickClose(joy2);
}
//===========================================================================
void JoyInitialize ()
{
// Emulated joystick #0 can only use JOYSTICKID1 (if no joystick, then use mouse)
// Emulated joystick #1 can only use JOYSTICKID2 (if no joystick, then disable)
//
// Init for emulated joystick #0:
//
#define AXIS_MIN -32768 /* minimum value for axis coordinate */
#define AXIS_MAX 32767 /* maximum value for axis coordinate */
// First of all, let's close all existing SDL joysticks
if(joy1) SDL_JoystickClose(joy1);
if(joy2) SDL_JoystickClose(joy2);
int number_of_joysticks = SDL_NumJoysticks();
if (joyinfo[joytype[0]].device == DEVICE_JOYSTICK)
{
// JOYCAPS caps;
if (number_of_joysticks > 0) //(joyGetDevCaps(JOYSTICKID1,&caps,sizeof(JOYCAPS)) == JOYERR_NOERROR)
{
joy1 = SDL_JoystickOpen(0); // open joystick and get its information into SDL_Joystick struct
joyshrx[0] = 0;
joyshry[0] = 0;
joysubx[0] = AXIS_MIN; //(int)caps.wXmin; // just do not know how to get wXmin and alike from SDL joysticks
joysuby[0] = AXIS_MIN; //(int)caps.wYmin;
UINT xrange = AXIS_MAX /*caps.wXmax-*/ - AXIS_MIN;
UINT yrange = AXIS_MAX /*caps.wYmax-*/ - AXIS_MIN;
while (xrange > 256)
{
xrange >>= 1;
++joyshrx[0]; // joystick threshold??
}
while (yrange > 256)
{
yrange >>= 1;
++joyshry[0];
}
}
else
{
joytype[0] = DEVICE_MOUSE;
}
}
//
// Init for emulated joystick #1:
//
if (joyinfo[joytype[1]].device == DEVICE_JOYSTICK)
{
// JOYCAPS caps;
if (number_of_joysticks > 1) //(joyGetDevCaps(JOYSTICKID2,&caps,sizeof(JOYCAPS)) == JOYERR_NOERROR)
{
joy2 = SDL_JoystickOpen(1); // open joystick #2 and get its information into SDL_Joystick struct
joyshrx[1] = 0;
joyshry[1] = 0;
joysubx[1] = AXIS_MIN; //(int)caps.wXmin;
joysuby[1] = AXIS_MIN; //(int)caps.wYmin;
UINT xrange = AXIS_MAX /*caps.wXmax*/ - AXIS_MIN; //caps.wXmin;
UINT yrange = AXIS_MAX /*caps.wYmax*/ - AXIS_MIN; //caps.wYmin;
while (xrange > 256)
{
xrange >>= 1;
++joyshrx[1];
}
while (yrange > 256)
{
yrange >>= 1;
++joyshry[1];
}
} // if
else
{
joytype[1] = DEVICE_NONE; // do not use
}
}
}
//===========================================================================
BOOL JoyProcessKey (int virtkey, BOOL extended, BOOL down, BOOL autorep)
{
BOOL isALT = ((virtkey == SDLK_LALT) | (virtkey == SDLK_RALT)); //if either ALT key pressed
if( (joyinfo[joytype[0]].device != DEVICE_KEYBOARD) &&
(joyinfo[joytype[1]].device != DEVICE_KEYBOARD) &&
(!isALT)) return 0;
// Joystick # which is being emulated by keyboard
int nJoyNum = (joyinfo[joytype[0]].device == DEVICE_KEYBOARD) ? 0 : 1;
int nCenteringType = joyinfo[joytype[nJoyNum]].mode; // MODE_STANDARD or MODE_CENTERING
//
BOOL keychange = !extended;
if (isALT /*virtkey == VK_MENU*/) // VK_MENU == ALT Key (Button #0 or #1)
{
keychange = 1;
keydown[JK_OPENAPPLE + (extended != 0)] = down;
}
else if (!extended)
{
if ((virtkey >= SDLK_KP1) && (virtkey <= SDLK_KP9))
{
keydown[virtkey-SDLK_KP1] = down;
}
else
{
switch (virtkey)
{//Here VK_PRIOR means “Page Up”, VK_NEXT is “Page Down”
case SDLK_END: keydown[ 0] = down; break;
case SDLK_DOWN: keydown[ 1] = down; break;
case SDLK_PAGEDOWN: keydown[ 2] = down; break;
case SDLK_LEFT: keydown[ 3] = down; break;
case SDLK_CLEAR: keydown[ 4] = down; break; // where is that clear key???? I don't have one! --bb
case SDLK_RIGHT: keydown[ 5] = down; break;
case SDLK_HOME: keydown[ 6] = down; break;
case SDLK_UP: keydown[ 7] = down; break;
case SDLK_PAGEUP: keydown[ 8] = down; break;
case SDLK_KP0: keydown[ 9] = down; break; // Button #0
case SDLK_INSERT: keydown[ 9] = down; break; // Button #0
case SDLK_KP_PERIOD: keydown[10] = down; break; // Button #1
case SDLK_DELETE: keydown[10] = down; break; // Button #1
default: keychange = 0; break;
}
}
}
//
if (keychange)
{
if ((virtkey == SDLK_KP0) || (virtkey == SDLK_INSERT))
{
if(down)
{
if(joyinfo[joytype[1]].device != DEVICE_KEYBOARD)
{
buttonlatch[0] = BUTTONTIME;
}
else if(joyinfo[joytype[1]].device != DEVICE_NONE)
{
buttonlatch[2] = BUTTONTIME;
buttonlatch[1] = BUTTONTIME; // Re-map this button when emulating a 2nd Apple joystick
}
}
}
else if ((virtkey == SDLK_KP_PERIOD) || (virtkey == SDLK_DELETE))
{
if(down)
{
if(joyinfo[joytype[1]].device != DEVICE_KEYBOARD)
buttonlatch[1] = BUTTONTIME;
}
}
else if ((down && !autorep) || (nCenteringType == MODE_CENTERING))
{
int xkeys = 0;
int ykeys = 0;
int xtotal = 0;
int ytotal = 0;
int keynum = 0;
while (keynum < 9)
{
if (keydown[keynum])
{
if ((keynum % 3) != 1)
{
xkeys++;
xtotal += keyvalue[keynum].x;
}
if ((keynum / 3) != 1)
{
ykeys++;
ytotal += keyvalue[keynum].y;
}
}
keynum++;
}
if (xkeys)
xpos[nJoyNum] = xtotal / xkeys;
else
xpos[nJoyNum] = PDL_CENTRAL+g_nPdlTrimX;
if (ykeys)
ypos[nJoyNum] = ytotal / ykeys;
else
ypos[nJoyNum] = PDL_CENTRAL+g_nPdlTrimY;
}
}
return keychange;
}
//===========================================================================
BYTE /*__stdcall */ JoyReadButton (WORD, WORD address, BYTE, BYTE, ULONG nCyclesLeft)
{
address &= 0xFF;
if(joyinfo[joytype[0]].device == DEVICE_JOYSTICK)
CheckJoystick0();
if(joyinfo[joytype[1]].device == DEVICE_JOYSTICK)
CheckJoystick1();
BOOL pressed = 0;
switch (address) {
case 0x61:
pressed = (buttonlatch[0] || joybutton[0] || setbutton[0] || keydown[JK_OPENAPPLE]);
if(joyinfo[joytype[1]].device != DEVICE_KEYBOARD)
pressed = (pressed || keydown[JK_BUTTON0]);
buttonlatch[0] = 0;
break;
case 0x62:
pressed = (buttonlatch[1] || joybutton[1] || setbutton[1] || keydown[JK_CLOSEDAPPLE]);
if(joyinfo[joytype[1]].device != DEVICE_KEYBOARD)
pressed = (pressed || keydown[JK_BUTTON1]);
buttonlatch[1] = 0;
break;
case 0x63:
KeybUpdateCtrlShiftStatus();
pressed = (buttonlatch[2] || joybutton[2] || setbutton[2] || (g_bShiftKey));// SHIFT is PRESSED
buttonlatch[2] = 0;
break;
}
return MemReadFloatingBus(pressed, nCyclesLeft);
}
//===========================================================================
// PREAD: ; $FB1E
// AD 70 C0 : (4) LDA $C070
// A0 00 : (2) LDA #$00
// EA : (2) NOP
// EA : (2) NOP
// Lbl1: ; 11 cycles is the normal duration of the loop
// BD 64 C0 : (4) LDA $C064,X
// 10 04 : (2) BPL Lbl2 ; NB. 3 cycles if branch taken (not likely)
// C8 : (2) INY
// D0 F8 : (3) BNE Lbl1 ; NB. 2 cycles if branck not taken (not likely)
// 88 : (2) DEY
// Lbl2:
// 60 : (6) RTS
//
static const double PDL_CNTR_INTERVAL = 2816.0 / 255.0; // 11.04 (From KEGS)
BYTE /*__stdcall*/ JoyReadPosition (WORD programcounter, WORD address, BYTE, BYTE, ULONG nCyclesLeft)
{
int nJoyNum = (address & 2) ? 1 : 0; // $C064..$C067
CpuCalcCycles(nCyclesLeft);
ULONG nPdlPos = (address & 1) ? ypos[nJoyNum] : xpos[nJoyNum];
// This is from KEGS. It helps games like Championship Lode Runner & Boulderdash
if(nPdlPos >= 255)
nPdlPos = 280;
BOOL nPdlCntrActive = g_nCumulativeCycles <= (g_nJoyCntrResetCycle + (unsigned __int64) ((double)nPdlPos * PDL_CNTR_INTERVAL));
return MemReadFloatingBus(nPdlCntrActive, nCyclesLeft);
}
//===========================================================================
void JoyReset ()
{
int loop = 0;
while (loop < JK_MAX)
keydown[loop++] = FALSE; // clear all joystick buttons and axis states
}
//===========================================================================
BYTE /*__stdcall*/ JoyResetPosition (WORD, WORD, BYTE, BYTE, ULONG nCyclesLeft)
{
CpuCalcCycles(nCyclesLeft);
g_nJoyCntrResetCycle = g_nCumulativeCycles;
if(joyinfo[joytype[0]].device == DEVICE_JOYSTICK)
CheckJoystick0();
if(joyinfo[joytype[1]].device == DEVICE_JOYSTICK)
CheckJoystick1();
return MemReadFloatingBus(nCyclesLeft);
}
//===========================================================================
// Called when mouse is being used as a joystick && mouse button changes
void JoySetButton (eBUTTON number, eBUTTONSTATE down)
{
if (number > 1) // Sanity check on mouse button #
return;
// If 2nd joystick is enabled, then both joysticks only have 1 button
if((joyinfo[joytype[1]].device != DEVICE_NONE) && (number != 0))
return;
// If it is 2nd joystick that is being emulated with mouse, then re-map button #
if(joyinfo[joytype[1]].device == DEVICE_MOUSE)
{
number = BUTTON1; // 2nd joystick controls Apple button #1
}
setbutton[number] = down;
if (down)
buttonlatch[number] = BUTTONTIME;
}
//===========================================================================
// Set new joystick type
BOOL JoySetEmulationType (/*HWND window,*/ DWORD newtype, int nJoystickNumber)
{
if(joytype[nJoystickNumber] == newtype)
return 1; // Already set to this type. Return OK.
if (joyinfo[newtype].device == DEVICE_JOYSTICK)
{
// JOYCAPS caps;
// unsigned int nJoyID = nJoystickNumber == JN_JOYSTICK0 ? JOYSTICKID1 : JOYSTICKID2;
if (SDL_NumJoysticks() <= nJoystickNumber)
{
/* MessageBox(window,
TEXT("The emulator is unable to read your PC joystick. ")
TEXT("Ensure that your game port is configured properly, ")
TEXT("that the joystick is firmly plugged in, and that ")
TEXT("you have a joystick driver installed."),
TEXT("Configuration"),
MB_ICONEXCLAMATION | MB_SETFOREGROUND);*/
fprintf(stderr, "Can not find joystick #%d - disabling it\n", nJoystickNumber);
return 0;
}
}
else if ((joyinfo[newtype].device == DEVICE_MOUSE) &&
(joyinfo[joytype[nJoystickNumber]].device != DEVICE_MOUSE))
{
if (sg_Mouse.Active())
{
/*MessageBox(window,
TEXT("Mouse interface card is enabled - unable to use mouse for joystick emulation."),
TEXT("Configuration"),
MB_ICONEXCLAMATION | MB_SETFOREGROUND);*/
fprintf(stderr, "Mouse interface card is enabled - unable to use mouse for joystick emulation.\n");
return 0;
}
/*MessageBox(window,
TEXT("To begin emulating a joystick with your mouse, move ")
TEXT("the mouse cursor over the emulated screen of a running ")
TEXT("program and click the left mouse button. During the ")
TEXT("time the mouse is emulating a joystick, you will not ")
TEXT("be able to use it to perform mouse functions, and the ")
TEXT("mouse cursor will not be visible. To end joystick ")
TEXT("emulation and regain the mouse cursor, click the left ")
TEXT("mouse button while pressing Ctrl."),
TEXT("Configuration"),
MB_ICONINFORMATION | MB_SETFOREGROUND);*/
printf("To release mouse cursor, press Ctrl + left mouse button.\n");
}
joytype[nJoystickNumber] = newtype;
JoyInitialize();
JoyReset();
return 1;
}
//===========================================================================
// Called when mouse is being used as a joystick && mouse position changes
void JoySetPosition (int xvalue, int xrange, int yvalue, int yrange)
{
int nJoyNum = (joyinfo[joytype[0]].device == DEVICE_MOUSE) ? 0 : 1;
xpos[nJoyNum] = (xvalue * 255) / xrange;
ypos[nJoyNum] = (yvalue * 255) / yrange;
}
//===========================================================================
void JoyUpdatePosition ()
{
if (buttonlatch[0]) --buttonlatch[0];
if (buttonlatch[1]) --buttonlatch[1];
if (buttonlatch[2]) --buttonlatch[2];
}
//===========================================================================
BOOL JoyUsingMouse ()
{
return (joyinfo[joytype[0]].device == DEVICE_MOUSE) || (joyinfo[joytype[1]].device == DEVICE_MOUSE);
}
//===========================================================================
void JoySetTrim(short nValue, bool bAxisX)
{
if(bAxisX)
g_nPdlTrimX = nValue;
else
g_nPdlTrimY = nValue;
int nJoyNum = -1;
if(joyinfo[joytype[0]].device == DEVICE_KEYBOARD)
nJoyNum = 0;
else if(joyinfo[joytype[1]].device == DEVICE_KEYBOARD)
nJoyNum = 1;
if(nJoyNum >= 0)
{
xpos[nJoyNum] = PDL_CENTRAL+g_nPdlTrimX;
ypos[nJoyNum] = PDL_CENTRAL+g_nPdlTrimY;
}
}
short JoyGetTrim(bool bAxisX)
{
return bAxisX ? g_nPdlTrimX : g_nPdlTrimY;
}
//===========================================================================
DWORD JoyGetSnapshot(SS_IO_Joystick* pSS)
{
pSS->g_nJoyCntrResetCycle = g_nJoyCntrResetCycle;
return 0;
}
DWORD JoySetSnapshot(SS_IO_Joystick* pSS)
{
g_nJoyCntrResetCycle = pSS->g_nJoyCntrResetCycle;
return 0;
}

View File

@ -0,0 +1,24 @@
#pragma once
enum JOYNUM {JN_JOYSTICK0=0, JN_JOYSTICK1};
extern DWORD joytype[2];
void JoyInitialize ();
void JoyShutDown();
BOOL JoyProcessKey (int,BOOL,BOOL,BOOL);
void JoyReset ();
void JoySetButton (eBUTTON,eBUTTONSTATE);
BOOL JoySetEmulationType (/*HWND,*/DWORD,int);
void JoySetPosition (int,int,int,int);
void JoyUpdatePosition ();
BOOL JoyUsingMouse ();
void JoySetTrim(short nValue, bool bAxisX);
short JoyGetTrim(bool bAxisX);
DWORD JoyGetSnapshot(SS_IO_Joystick* pSS);
DWORD JoySetSnapshot(SS_IO_Joystick* pSS);
BYTE JoyReadButton (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE JoyReadPosition (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE JoyResetPosition (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);

View File

@ -0,0 +1,486 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Keyboard emulation
*
* Author: Various
*/
/* Adaptation for SDL and POSIX (l) by beom beotiger, Nov-Dec 2007 */
#include "stdafx.h"
//#pragma hdrstop
static bool g_bKeybBufferEnable = false;
#define KEY_OLD
/*static BYTE asciicode[2][10] = {
{0x08,0x0D,0x15,0x2F,0x00,0x00,0x00,0x00,0x00,0x00},
{0x08,0x0B,0x15,0x0A,0x00,0x00,0x00,0x00,0x00,0x7F}
}; // Convert PC arrow keys to Apple keycodes*/
/*static*/ bool g_bShiftKey = false;
/*static*/ bool g_bCtrlKey = false;
/*static*/ bool g_bAltKey = false;
static bool g_bCapsLock = true;
static int lastvirtkey = 0; // Current PC keycode
static BYTE keycode = 0; // Current Apple keycode
static DWORD keyboardqueries = 0;
#ifdef KEY_OLD
// Original
static BOOL keywaiting = 0;
#else
// Buffered key input:
// - Needed on faster PCs where aliasing occurs during short/fast bursts of 6502 code.
// - Keyboard only sampled during 6502 execution, so if it's run too fast then key presses will be missed.
const int KEY_BUFFER_MIN_SIZE = 1;
const int KEY_BUFFER_MAX_SIZE = 2;
static int g_nKeyBufferSize = KEY_BUFFER_MAX_SIZE; // Circ key buffer size
static int g_nNextInIdx = 0;
static int g_nNextOutIdx = 0;
static int g_nKeyBufferCnt = 0;
static struct
{
int nVirtKey;
BYTE nAppleKey;
} g_nKeyBuffer[KEY_BUFFER_MAX_SIZE];
#endif
static BYTE g_nLastKey = 0x00;
//
// ----- ALL GLOBALLY ACCESSIBLE FUNCTIONS ARE BELOW THIS LINE -----
//
//===========================================================================
void KeybReset()
{
#ifdef KEY_OLD
keywaiting = 0;
#else
g_nNextInIdx = 0;
g_nNextOutIdx = 0;
g_nKeyBufferCnt = 0;
g_nLastKey = 0x00;
g_nKeyBufferSize = g_bKeybBufferEnable ? KEY_BUFFER_MAX_SIZE : KEY_BUFFER_MIN_SIZE;
#endif
}
//===========================================================================
//void KeybSetBufferMode(bool bNewKeybBufferEnable)
//{
// if(g_bKeybBufferEnable == bNewKeybBufferEnable)
// return;
//
// g_bKeybBufferEnable = bNewKeybBufferEnable;
// KeybReset();
//}
//
//bool KeybGetBufferMode()
//{
// return g_bKeybBufferEnable;
//}
//===========================================================================
bool KeybGetAltStatus ()
{
return g_bAltKey;
}
//===========================================================================
bool KeybGetCapsStatus ()
{
return g_bCapsLock;
}
//===========================================================================
bool KeybGetCtrlStatus ()
{
return g_bCtrlKey;
}
//===========================================================================
bool KeybGetShiftStatus ()
{
return g_bShiftKey;
}
//===========================================================================
void KeybUpdateCtrlShiftStatus()
{
// g_bShiftKey = (GetKeyState( VK_SHIFT ) & KF_UP) ? true : false; // 0x8000 KF_UP
// g_bCtrlKey = (GetKeyState( VK_CONTROL) & KF_UP) ? true : false;
// g_bAltKey = (GetKeyState( VK_MENU ) & KF_UP) ? true : false;
Uint8 *keys;
keys = SDL_GetKeyState(NULL);
g_bShiftKey = (keys[SDLK_LSHIFT] | keys[SDLK_RSHIFT]); // 0x8000 KF_UP SHIFT
g_bCtrlKey = (keys[SDLK_LCTRL] | keys[SDLK_RCTRL]); // CTRL
g_bAltKey = (keys[SDLK_LALT] | keys[SDLK_RALT]); // ALT
}
//===========================================================================
BYTE KeybGetKeycode() // Used by MemCheckPaging() & VideoCheckMode()
{
return keycode;
}
//===========================================================================
DWORD KeybGetNumQueries () // Used in determining 'idleness' of Apple system
{
DWORD result = keyboardqueries;
keyboardqueries = 0;
return result;
}
//===========================================================================
void KeybQueueKeypress (int key, BOOL bASCII)
{
// static bool bFreshReset; - do not use
if (bASCII == ASCII)
{
/* if (bFreshReset && key == 0x03)
{
bFreshReset = 0;
return; // Swallow spurious CTRL-C caused by CTRL-BREAK
}
bFreshReset = 0;*/
if (key > 0x7F) return;
// Conver SHIFTed keys to their secondary values
// may be this is straitfoward method, but it seems to be working. What else we need?? --bb
KeybUpdateCtrlShiftStatus();
if(g_bShiftKey) // SHIFT is pressed
switch(key) {
case '1': key = '!'; break;
case '2': key = '@'; break;
case '3': key = '#'; break;
case '4': key = '$'; break;
case '5': key = '%'; break;
case '6': key = '^'; break;
case '7': key = '&'; break;
case '8': key = '*'; break;
case '9': key = '('; break;
case '0': key = ')'; break;
case '`': key = '~'; break;
case '-': key = '_'; break;
case '=': key = '+'; break;
case '\\': key = '|'; break;
case '[': key = '{'; break;
case ']': key = '}'; break;
case ';': key = ':'; break;
case '\'': key = '"'; break;
case ',': key = '<'; break;
case '.': key = '>'; break;
case '/': key = '?'; break;
default: break;
}
else if (g_bCtrlKey) {
if(key >= SDLK_a && key <= SDLK_z) key = key - SDLK_a + 1;
else switch(key) {
case '\\': key = 28; break;
case '[' : key = 27; break;
case ']' : key = 29; break;
case SDLK_RETURN: key = 10; break;
default: break;
}
}
if (!IS_APPLE2)
{
if (g_bCapsLock && (key >= 'a') && (key <='z'))
keycode = key - 32;
else
keycode = key;
}
else
{
if (key >= '`')
keycode = key - 32;
else
keycode = key;
}
lastvirtkey = key;
}
else
{
/* if ((key == VK_CANCEL) && (GetKeyState(VK_CONTROL) < 0)) - implement in Frame.cpp
{
// Ctrl+Reset
if (!IS_APPLE2)
MemResetPaging();
DiskReset();
KeybReset();
if (!IS_APPLE2)
VideoResetState(); // Switch Alternate char set off
MB_Reset();
#ifndef KEY_OLD
g_nNextInIdx = g_nNextOutIdx = g_nKeyBufferCnt = 0;
#endif
CpuReset();
bFreshReset = 1;
return;
}
*/
/* No pasting??? Ye-e-e-e-et! */
// if ((key == VK_INSERT) && (GetKeyState(VK_SHIFT) < 0))
// {
// // Shift+Insert
// ClipboardInitiatePaste();
// return;
// }
// if (!((key >= VK_LEFT) && (key <= VK_DELETE) && asciicode[IS_APPLE2 ? 0 : 1][key - VK_LEFT]))
// return;
// keycode = asciicode[IS_APPLE2 ? 0 : 1][key - VK_LEFT]; // Convert to Apple arrow keycode
// lastvirtkey = key;
// {0x08,0x0D,0x15,0x2F,0x00,0x00,0x00,0x00,0x00,0x00}, - good old APPLE2
// {0x08,0x0B,0x15,0x0A,0x00,0x00,0x00,0x00,0x00,0x7F}
if(IS_APPLE2)
switch(key) {
case SDLK_LEFT: keycode = 0x08; break;
case SDLK_UP: keycode = 0x0D; break;
case SDLK_RIGHT:keycode = 0x15; break;
case SDLK_DOWN: keycode = 0x2F; break;
case SDLK_DELETE:keycode = 0x00;break;
default: return;
}
else
switch(key) {
case SDLK_LEFT: keycode = 0x08; break;
case SDLK_UP: keycode = 0x0B; break;
case SDLK_RIGHT:keycode = 0x15; break;
case SDLK_DOWN: keycode = 0x0A; break;
case SDLK_DELETE:keycode = 0x7F;break;
default: return;
}
lastvirtkey = key;
}
#ifdef KEY_OLD
keywaiting = 1;
#else
bool bOverflow = false;
if(g_nKeyBufferCnt < g_nKeyBufferSize)
g_nKeyBufferCnt++;
else
bOverflow = true;
g_nKeyBuffer[g_nNextInIdx].nVirtKey = lastvirtkey;
g_nKeyBuffer[g_nNextInIdx].nAppleKey = keycode;
g_nNextInIdx = (g_nNextInIdx + 1) % g_nKeyBufferSize;
if(bOverflow)
g_nNextOutIdx = (g_nNextOutIdx + 1) % g_nKeyBufferSize;
#endif
}
//===========================================================================
/*static HGLOBAL hglb = NULL;
static LPTSTR lptstr = NULL;
static bool g_bPasteFromClipboard = false;
static bool g_bClipboardActive = false;*/
/*
void ClipboardInitiatePaste()
{
if (g_bClipboardActive)
return;
g_bPasteFromClipboard = true;
}
static void ClipboardDone()
{
if (g_bClipboardActive)
{
g_bClipboardActive = false;
GlobalUnlock(hglb);
CloseClipboard();
}
}
static void ClipboardInit()
{
ClipboardDone();
if (!IsClipboardFormatAvailable(CF_TEXT))
return;
if (!OpenClipboard(g_hFrameWindow))
return;
hglb = GetClipboardData(CF_TEXT);
if (hglb == NULL)
{
CloseClipboard();
return;
}
lptstr = (char*) GlobalLock(hglb);
if (lptstr == NULL)
{
CloseClipboard();
return;
}
g_bPasteFromClipboard = false;
g_bClipboardActive = true;
}
static char ClipboardCurrChar(bool bIncPtr)
{
char nKey;
int nInc = 1;
if((lptstr[0] == 0x0D) && (lptstr[1] == 0x0A))
{
nKey = 0x0D;
nInc = 2;
}
else
{
nKey = lptstr[0];
}
if(bIncPtr)
lptstr += nInc;
return nKey;
}*/
//===========================================================================
BYTE /*__stdcall */KeybReadData (WORD, WORD, BYTE, BYTE, ULONG)
{
keyboardqueries++;
// if(g_bPasteFromClipboard)
// ClipboardInit();
//
// if(g_bClipboardActive)
// {
// if(*lptstr == 0)
// ClipboardDone();
// else
// return 0x80 | ClipboardCurrChar(false);
// }
//
#ifdef KEY_OLD
return keycode | (keywaiting ? 0x80 : 0);
#else
BYTE nKey = g_nKeyBufferCnt ? 0x80 : 0;
if(g_nKeyBufferCnt)
{
nKey |= g_nKeyBuffer[g_nNextOutIdx].nAppleKey;
g_nLastKey = g_nKeyBuffer[g_nNextOutIdx].nAppleKey;
}
else
{
nKey |= g_nLastKey;
}
return nKey;
#endif
}
//===========================================================================
BYTE /*__stdcall */KeybReadFlag (WORD, WORD, BYTE, BYTE, ULONG)
{
keyboardqueries++;
//
// if(g_bPasteFromClipboard)
// ClipboardInit();
//
// if(g_bClipboardActive)
// {
// if(*lptstr == 0)
// ClipboardDone();
// else
// return 0x80 | ClipboardCurrChar(true);
// }
//
Uint8 *keys;
keys = SDL_GetKeyState(NULL); // get current key state - thanx to SDL developers! ^_^ beom beotiger
#ifdef KEY_OLD
keywaiting = 0;
return keycode | (keys[lastvirtkey] ? 0x80 : 0);
#else
BYTE nKey = (keys[g_nKeyBuffer[g_nNextOutIdx].nVirtKey]) ? 0x80 : 0;
nKey |= g_nKeyBuffer[g_nNextOutIdx].nAppleKey;
if(g_nKeyBufferCnt)
{
g_nKeyBufferCnt--;
g_nNextOutIdx = (g_nNextOutIdx + 1) % g_nKeyBufferSize;
}
return nKey;
#endif
}
//===========================================================================
void KeybToggleCapsLock ()
{
if (!IS_APPLE2)
{
g_bCapsLock = !g_bCapsLock;// never mind real CapsLock status, heh???(GetKeyState(VK_CAPITAL) & 1);
// printf("g_bCapsLock=%d\n", g_bCapsLock);
// FrameRefreshStatus(DRAW_LEDS);
}
}
//===========================================================================
DWORD KeybGetSnapshot(SS_IO_Keyboard* pSS)
{
pSS->keyboardqueries = keyboardqueries;
pSS->nLastKey = g_nLastKey;
return 0;
}
DWORD KeybSetSnapshot(SS_IO_Keyboard* pSS)
{
keyboardqueries = pSS->keyboardqueries;
g_nLastKey = pSS->nLastKey;
return 0;
}

View File

@ -0,0 +1,24 @@
#pragma once
extern bool g_bShiftKey;
extern bool g_bCtrlKey;
extern bool g_bAltKey;
//extern bool g_bCapsLock;
void ClipboardInitiatePaste();
void KeybReset();
bool KeybGetAltStatus();
bool KeybGetCapsStatus();
bool KeybGetCtrlStatus();
bool KeybGetShiftStatus();
void KeybUpdateCtrlShiftStatus();
BYTE KeybGetKeycode ();
DWORD KeybGetNumQueries ();
void KeybQueueKeypress (int,BOOL);
void KeybToggleCapsLock ();
DWORD KeybGetSnapshot(SS_IO_Keyboard* pSS);
DWORD KeybSetSnapshot(SS_IO_Keyboard* pSS);
BYTE KeybReadData (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE KeybReadFlag (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);

47
linapple-pie/src/Log.cpp Normal file
View File

@ -0,0 +1,47 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski, Nick Westgate
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Log
*
* Author: Nick Westgate
*/
#include "stdafx.h"
//#pragma hdrstop
#include <string.h>
//---------------------------------------------------------------------------
void LogOutput(LPCTSTR format, ...)
{
TCHAR output[256];
va_list args;
va_start(args, format);
vsnprintf(output, sizeof(output) - 1, format, args);
// OutputDebugString(output);
fprintf(stderr, output);
}
//---------------------------------------------------------------------------

11
linapple-pie/src/Log.h Normal file
View File

@ -0,0 +1,11 @@
#pragma once
#ifndef _VC71 // __VA_ARGS__ not supported on MSVC++ .NET 7.x
#ifdef _DEBUG
#define LOG(format, ...) LogOutput(format, __VA_ARGS__)
#else
#define LOG(...)
#endif
#endif
extern void LogOutput(LPCTSTR format, ...);

73
linapple-pie/src/Makefile Normal file
View File

@ -0,0 +1,73 @@
CXX ?= c++
CXXFLAGS ?= -O3
CXXFLAGS += -w
OBJS := $(filter-out Applewin.cpp Util_MemoryTextFile.cpp,$(wildcard *.cpp))
OBJS := $(OBJS:.cpp=.o)
SDL_CONFIG ?= sdl-config
SDL_CFLAGS = $(shell $(SDL_CONFIG) --cflags)
SDL_LIBS = $(shell $(SDL_CONFIG) --libs)
CURL_CONFIG ?= curl-config
CURL_CFLAGS = $(shell $(CURL_CONFIG) --cflags)
CURL_LIBS = $(shell $(CURL_CONFIG) --libs)
CXXFLAGS += $(SDL_CFLAGS)
CXXFLAGS += $(CURL_CFLAGS)
LDLIBS += $(SDL_LIBS) $(CURL_LIBS) -lSDL_image -lz -lzip
# Define executable and installing directory
EXE = linapple
INSTDIR = /usr/local/$(EXE)
STARTUP = /usr/local/bin/$(EXE)
DATA = ../charset40.bmp ../font.bmp ../icon.bmp ../splash.bmp ../Master.dsk ../linapple.installed.conf
.PHONY: all clean install uninstall
all: $(EXE)
Applewin: $(OBJS)
$(EXE): Applewin
# $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@
mv $^ $@
strip $@
@echo " o $(EXE) compiled succesfully"
cp $@ ../
clean:
rm -f $(EXE) *.o
#
# Installation routines
#
install: all
@echo " o Creating install directory '$(INSTDIR)'"
mkdir "$(INSTDIR)"
@echo " o Creating additional directories 'images' and 'ftp' in '$(INSTDIR)'"
mkdir "$(INSTDIR)/images"
mkdir -p "$(INSTDIR)/ftp/cache"
@echo " o Installing game and data to '$(INSTDIR)'"
cp $(EXE) $(DATA) "$(INSTDIR)"
@echo " o Preparing configuration file 'linapple.conf'"
mv "$(INSTDIR)/linapple.installed.conf" "$(INSTDIR)/linapple.conf"
chmod -R 777 "$(INSTDIR)/"
@echo " o Creating startup script $(STARTUP)"
echo "cd \"$(INSTDIR)\"; ./$(EXE); cd -" >"$(STARTUP)"
chmod 755 "$(STARTUP)"
@echo ""
@echo "Type $(EXE) to start the beast!"
@echo "To change some settings edit \"$(INSTDIR)/linapple.conf\""
uninstall:
@echo " o Removing ALL data from $(INSTDIR)"
rm -rf "$(INSTDIR)"
@echo " o Removing startup script $(STARTUP)"
rm -f "$(STARTUP)"
@echo " o All done! Linapple has been successfully removed from your system"

1361
linapple-pie/src/Memory.cpp Normal file

File diff suppressed because it is too large Load Diff

46
linapple-pie/src/Memory.h Normal file
View File

@ -0,0 +1,46 @@
#pragma once
enum MemoryInitPattern_e
{
MIP_ZERO
, MIP_FF_FF_00_00
, NUM_MIP
};
extern MemoryInitPattern_e g_eMemoryInitPattern;
extern iofunction IORead[256];
extern iofunction IOWrite[256];
extern LPBYTE memwrite[0x100];
extern LPBYTE mem;
extern LPBYTE memdirty;
#ifdef RAMWORKS
extern UINT g_uMaxExPages; // user requested ram pages (from cmd line)
#endif
void RegisterIoHandler(UINT uSlot, iofunction IOReadC0, iofunction IOWriteC0, iofunction IOReadCx, iofunction IOWriteCx, LPVOID lpSlotParameter, BYTE* pExpansionRom);
void MemDestroy ();
bool MemGet80Store();
bool MemCheckSLOTCXROM();
LPBYTE MemGetAuxPtr (WORD);
LPBYTE MemGetMainPtr (WORD);
LPBYTE MemGetCxRomPeripheral();
void MemPreInitialize ();
int MemInitialize ();
BYTE MemReadFloatingBus(const ULONG uExecutedCycles);
BYTE MemReadFloatingBus(const BYTE highbit, const ULONG uExecutedCycles);
void MemReset ();
void MemResetPaging ();
BYTE MemReturnRandomData (BYTE highbit);
void MemSetFastPaging (BOOL);
void MemTrimImages ();
LPVOID MemGetSlotParameters (UINT uSlot);
DWORD MemGetSnapshot(SS_BaseMemory* pSS);
DWORD MemSetSnapshot(SS_BaseMemory* pSS);
BYTE IO_Null(WORD programcounter, WORD address, BYTE write, BYTE value, ULONG nCycles);
BYTE MemCheckPaging (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE MemSetPaging(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
#pragma once
extern bool g_bMBTimerIrqActive;
extern UINT32 g_uTimer1IrqCount; // DEBUG
void MB_Initialize();
void MB_Reinitialize();
void MB_Destroy();
void MB_Reset();
void MB_Mute();
void MB_Demute();
void MB_StartOfCpuExecute();
void MB_EndOfVideoFrame();
void MB_CheckIRQ();
void MB_UpdateCycles(ULONG uExecutedCycles);
eSOUNDCARDTYPE MB_GetSoundcardType();
void MB_SetSoundcardType(eSOUNDCARDTYPE NewSoundcardType);
double MB_GetFramePeriod();
bool MB_IsActive();
DWORD MB_GetVolume();
void MB_SetVolume(DWORD dwVolume, DWORD dwVolumeMax);
DWORD MB_GetSnapshot(SS_CARD_MOCKINGBOARD* pSS, DWORD dwSlot);
DWORD MB_SetSnapshot(SS_CARD_MOCKINGBOARD* pSS, DWORD dwSlot);
extern short * pDSMockBuf; // Mockingboard data buffer (in size of g_dwDSMockBufferSize samples?)
extern UINT nDSMockWCur; // write cursor
extern UINT nDSMockRCur; // read cursor
//extern DWORD g_dwDSMockBufferSize; // size of low-level buffer

View File

@ -0,0 +1,571 @@
// Based on Apple in PC's mousecard.cpp
// - Permission given by Kyle Kim to reuse in AppleWin
/* Adaptation for SDL and POSIX (l) by beom beotiger, Nov-Dec 2007 */
#include "stdafx.h"
//#pragma hdrstop
//#include "resource.h"
#include "MouseInterface.h"
// Sets mouse mode
#define MOUSE_SET 0x00
// Reads mouse position
#define MOUSE_READ 0x10
// Services mouse interrupt
#define MOUSE_SERV 0x20
// Clears mouse positions to 0 (for delta mode)
#define MOUSE_CLEAR 0x30
// Sets mouse position to a user-defined pos
#define MOUSE_POS 0x40
// Resets mouse clamps to default values
// Sets mouse position to 0,0
#define MOUSE_INIT 0x50
// Sets mouse bounds in a window
#define MOUSE_CLAMP 0x60
// Sets mouse to upper-left corner of clamp win
#define MOUSE_HOME 0x70
// Set VBL Timing : 0x90 is 60Hz, 0x91 is 50Hz
#define MOUSE_TIME 0x90
#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80
char MouseInterface_rom[] =
"\x2C\x58\xFF\x70\x1B\x38\x90\x18\xB8\x50\x15\x01\x20\xF4\xF4\xF4"
"\xF4\x00\xB3\xC4\x9B\xA4\xC0\x8A\xDD\xBC\x48\xF0\x53\xE1\xE6\xEC"
"\x08\x78\x8D\xF8\x07\x48\x98\x48\x8A\x48\x20\x58\xFF\xBA\xBD\x00"
"\x01\xAA\x08\x0A\x0A\x0A\x0A\x28\xA8\xAD\xF8\x07\x8E\xF8\x07\x48"
"\xA9\x08\x70\x67\x90\x4D\xB0\x55\x29\x01\x09\xF0\x9D\x38\x06\xA9"
"\x02\xD0\x40\x29\x0F\x09\x90\xD0\x35\xFF\xFF\xB9\x83\xC0\x29\xFB"
"\x99\x83\xC0\xA9\x3E\x99\x82\xC0\xB9\x83\xC0\x09\x04\x99\x83\xC0"
"\xB9\x82\xC0\x29\xC1\x1D\xB8\x05\x99\x82\xC0\x68\xF0\x0A\x6A\x90"
"\x75\x68\xAA\x68\xA8\x68\x28\x60\x18\x60\x29\x01\x09\x60\x9D\x38"
"\x06\xA9\x0E\x9D\xB8\x05\xA9\x01\x48\xD0\xC0\xA9\x0C\x9D\xB8\x05"
"\xA9\x02\xD0\xF4\xA9\x30\x9D\x38\x06\xA9\x06\x9D\xB8\x05\xA9\x00"
"\x48\xF0\xA8\xC9\x10\xB0\xD2\x9D\x38\x07\x90\xEA\xA9\x04\xD0\xEB"
"\xA9\x40\xD0\xCA\xA4\x06\xA9\x60\x85\x06\x20\x06\x00\x84\x06\xBA"
"\xBD\x00\x01\xAA\x0A\x0A\x0A\x0A\xA8\xA9\x20\xD0\xC9\xA9\x70\xD0"
"\xC5\x48\xA9\xA0\xD0\xA8\x29\x0F\x09\xB0\xD0\xBA\xA9\xC0\xD0\xB6"
"\xA9\x02\xD0\xB7\xA2\x03\x38\x60\xFF\xFF\xFF\xD6\xFF\xFF\xFF\x01"
"\x98\x48\xA5\x06\x48\xA5\x07\x48\x86\x07\xA9\x27\x85\x06\x20\x58"
"\xFC\xA0\x00\xB1\x06\xF0\x06\x20\xED\xFD\xC8\xD0\xF6\x68\x85\x07"
"\x68\x85\x06\x68\xA8\xD0\x5B\xC1\xF0\xF0\xEC\xE5\xCD\xEF\xF5\xF3"
"\xE5\x8D\xC3\xEF\xF0\xF9\xF2\xE9\xE7\xE8\xF4\xA0\xB1\xB9\xB8\xB3"
"\xA0\xE2\xF9\xA0\xC1\xF0\xF0\xEC\xE5\xA0\xC3\xEF\xED\xF0\xF5\xF4"
"\xE5\xF2\xAC\xA0\xC9\xEE\xE3\xAE\x8D\x8D\xC2\xE1\xE3\xE8\xED\xE1"
"\xEE\xAF\xCD\xE1\xF2\xEB\xF3\xAF\xCD\xE1\xE3\xCB\xE1\xF9\x8D\x00"
"\xB9\x82\xC0\x29\xF1\x1D\xB8\x05\x99\x82\xC0\x68\x30\x0C\xF0\x80"
"\xD0\x09\xA9\x00\x9D\xB8\x05\x48\xF0\xE6\x60\xBD\x38\x07\x29\x0F"
"\x09\x20\x9D\x38\x07\x8A\x48\x48\x48\x48\xA9\xAA\x48\xBD\x38\x06"
"\x48\xA9\x0C\x9D\xB8\x05\xA9\x00\x48\xF0\xC5\xA9\xB3\x48\xAD\x78"
"\x04\x18\x90\xEC\xA9\xBC\x48\xAD\xF8\x04\x18\x90\xE3\xA9\x81\x48"
"\x7E\x38\x06\x90\x05\xAD\x78\x05\xB0\xD6\x8A\x48\xA9\xD8\x48\xA9"
"\x0C\x9D\xB8\x05\xA9\x01\x48\xD0\x97\xBD\x38\x06\x8D\x78\x05\x60"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC2"
"\xBD\x38\x07\x29\x0F\x09\x40\x9D\x38\x07\x8A\x48\x48\x48\xA9\x11"
"\xD0\x27\xA9\x1E\x48\xA9\x0C\x9D\xB8\x05\xA9\x01\x48\xD0\x51\xAD"
"\xB3\xFB\xC9\x06\xD0\x21\xAD\x19\xC0\x30\xFB\xAD\x19\xC0\x10\xFB"
"\xAD\x19\xC0\x30\xFB\xA9\x7F\xD0\x00\x48\xA9\x50\x48\xA9\x0C\x9D"
"\xB8\x05\xA9\x00\x48\xF0\x29\xA5\x06\x48\xA5\x07\x48\x98\x48\xA9"
"\x20\x85\x07\xA0\x00\x84\x06\xA9\x00\x91\x06\xC8\xD0\xFB\xE6\x07"
"\xA5\x07\xC9\x40\xD0\xF1\x68\xA8\xA5\x08\x48\xA9\x00\xF0\x1C\xFF"
"\xB9\x82\xC0\x29\xF1\x1D\xB8\x05\x99\x82\xC0\x68\x30\x0A\xF0\x80"
"\xA9\x00\x9D\xB8\x05\x48\xF0\xE8\x60\xD0\xAE\xA9\x01\x8D\xD0\x3F"
"\x8D\xE0\x3F\xAD\x57\xC0\xAD\x54\xC0\xAD\x52\xC0\xAD\x50\xC0\xEA"
"\x85\x06\x85\x07\x85\x08\xE6\x06\xD0\x0E\xE6\x07\xD0\x0C\xE6\x08"
"\xA5\x08\xC9\x01\x90\x0A\xB0\x1F\x08\x28\x08\x28\xA9\x00\xA5\x00"
"\xAD\xFF\xCF\xB9\x82\xC0\x4A\xEA\xEA\xB0\xDB\xAD\xFF\xCF\xB9\x82"
"\xC0\x4A\xA5\x00\xEA\xB0\xCF\x68\x85\x08\x68\x85\x07\x68\x85\x06"
"\xA9\xE3\xD0\xA5\xAD\x51\xC0\xAD\x56\xC0\x18\x90\x93\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC1"
"\xBD\x38\x06\xC9\x20\xD0\x06\xA9\x7F\x69\x01\x70\x01\xB8\xB9\x82"
"\xC0\x30\xFB\xB9\x81\xC0\x29\xFB\x99\x81\xC0\xA9\xFF\x99\x80\xC0"
"\xB9\x81\xC0\x09\x04\x99\x81\xC0\xBD\x38\x06\x99\x80\xC0\xB9\x82"
"\xC0\x09\x20\x99\x82\xC0\xB9\x82\xC0\x10\xFB\x29\xDF\x99\x82\xC0"
"\x70\x44\xBD\x38\x06\xC9\x30\xD0\x35\xA9\x00\x9D\xB8\x04\x9D\xB8"
"\x03\x9D\x38\x05\x9D\x38\x04\xF0\x25\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xB9\x82\xC0\x29\xF1\x1D\xB8\x05\x99\x82\xC0\x68\xF0\x82\xA9\x00"
"\x9D\xB8\x05\x48\xF0\xEA\xB9\x81\xC0\x29\xFB\x99\x81\xC0\xA9\x00"
"\x99\x80\xC0\xB9\x81\xC0\x09\x04\x99\x81\xC0\xB9\x82\xC0\x0A\x10"
"\xFA\xB9\x80\xC0\x9D\x38\x06\xB9\x82\xC0\x09\x10\x99\x82\xC0\xB9"
"\x82\xC0\x0A\x30\xFA\xB9\x82\xC0\x29\xEF\x99\x82\xC0\xBD\xB8\x06"
"\x29\xF1\x1D\x38\x06\x9D\xB8\x06\x29\x0E\xD0\xB2\xA9\x00\x9D\xB8"
"\x05\xA9\x02\x48\xD0\x9A\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC3"
"\xE4\x37\xD0\x2D\xA9\x07\xC5\x36\xF0\x27\x85\x36\x68\xC9\x8D\xF0"
"\x74\x29\x01\x09\x80\x9D\x38\x07\x8A\x48\xA9\x84\x48\xBD\x38\x07"
"\x4A\xA9\x80\xB0\x01\x0A\x48\xA9\x0C\x9D\xB8\x05\xA9\x00\x48\xF0"
"\x3F\xE4\x39\xD0\xD7\xA9\x05\x85\x38\xBD\x38\x07\x29\x01\xD0\x14"
"\x68\x68\x68\x68\xA9\x00\x9D\xB8\x03\x9D\xB8\x04\x9D\x38\x04\x9D"
"\x38\x05\xF0\x3C\xBD\x38\x07\x29\x01\x09\x80\x9D\x38\x07\x8A\x48"
"\xA9\xA1\x48\xA9\x10\x48\xA9\x0C\xD0\x30\xFF\xFF\xFF\xFF\xFF\xFF"
"\xB9\x82\xC0\x29\xF1\x1D\xB8\x05\x99\x82\xC0\x68\x30\x11\xF0\x80"
"\x6A\xB0\x89\x90\xB4\xA9\x00\x9D\xB8\x05\xA9\x01\x48\xD0\xE1\x60"
"\xA9\xC0\x9D\xB8\x06\x8C\x22\x02\xA9\x0A\x9D\xB8\x05\xA9\x00\x48"
"\xF0\xCE\x68\x68\x68\x68\xA9\x05\x9D\x38\x06\xB9\x81\xC0\x29\xFB"
"\x99\x81\xC0\xA9\x00\x99\x80\xC0\xB9\x81\xC0\x09\x04\x99\x81\xC0"
"\xB9\x82\xC0\x0A\x10\xFA\xB9\x80\xC0\x48\xB9\x82\xC0\x09\x10\x99"
"\x82\xC0\xB9\x82\xC0\x0A\x30\xFA\xB9\x82\xC0\x29\xEF\x99\x82\xC0"
"\xDE\x38\x06\xD0\xDB\x68\x9D\xB8\x06\x68\x9D\x38\x05\x68\x9D\x38"
"\x04\x68\x9D\xB8\x04\x68\x9D\xB8\x03\x18\x90\x99\xFF\xFF\xFF\xC8"
"\x8A\x48\x48\x48\xA9\x12\x48\xBC\xB8\x03\xBD\xB8\x04\xAA\x98\xA0"
"\x05\xD0\x6D\xAE\xF8\x07\xA9\x24\x48\xBC\x38\x04\xBD\x38\x05\xAA"
"\x98\xA0\x0C\xD0\x5B\xAE\xF8\x07\xA9\x43\x48\xAD\x00\xC0\x0A\x08"
"\xBD\xB8\x06\x2A\x2A\x2A\x29\x03\x49\x03\x38\x69\x00\x28\xA2\x00"
"\xA0\x10\xD0\x4D\xA9\x8D\x8D\x11\x02\x48\xA9\x11\x48\x48\xA9\x00"
"\xF0\x12\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xAE\xF8\x07\xAC\x22\x02\x9D\xB8\x05\xA9\x01\x48"
"\xB9\x82\xC0\x29\xF1\x1D\xB8\x05\x99\x82\xC0\x68\x30\x4E\xF0\x80"
"\xE0\x80\x90\x0D\x49\xFF\x69\x00\x48\x8A\x49\xFF\x69\x00\xAA\x68"
"\x38\x8D\x21\x02\x8E\x20\x02\xA9\xAB\x90\x02\xA9\xAD\x48\xA9\xAC"
"\x99\x01\x02\xA2\x11\xA9\x00\x18\x2A\xC9\x0A\x90\x02\xE9\x0A\x2E"
"\x21\x02\x2E\x20\x02\xCA\xD0\xF0\x09\xB0\x99\x00\x02\x88\xF0\x08"
"\xC0\x07\xF0\x04\xC0\x0E\xD0\xDB\x68\x99\x00\x02\x60\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xCD"
"\xB8\x50\x13\xBD\x38\x07\x29\x01\xF0\x47\xA9\x10\x48\xA9\x05\x9D"
"\x38\x06\xA9\x7F\x69\x01\xB9\x82\xC0\x30\xFB\xB9\x81\xC0\x29\xFB"
"\x99\x81\xC0\xA9\xFF\x99\x80\xC0\xB9\x81\xC0\x09\x04\x99\x81\xC0"
"\x68\x99\x80\xC0\xB9\x82\xC0\x09\x20\x99\x82\xC0\xB9\x82\xC0\x10"
"\xFB\x29\xDF\x99\x82\xC0\x70\x3F\x70\x07\xBD\x38\x07\x4A\x4A\x4A"
"\x4A\xB8\x9D\xB8\x05\xF0\x02\xA9\x80\x48\x50\x14\xFF\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xB9\x82\xC0\x29\xF1\x1D\xB8\x05\x99\x82\xC0\x68\xF0\x82\xC9\x02"
"\xF0\x81\xD0\x02\xF0\xC2\xB8\xB9\x81\xC0\x29\xFB\x99\x81\xC0\xA9"
"\x00\x99\x80\xC0\xB9\x81\xC0\x09\x04\x99\x81\xC0\xB9\x82\xC0\x0A"
"\x10\xFA\xB9\x80\xC0\x70\x05\x9D\x38\x06\x50\x01\x48\xB9\x82\xC0"
"\x09\x10\x99\x82\xC0\xB9\x82\xC0\x0A\x30\xFA\xB9\x82\xC0\x29\xEF"
"\x99\x82\xC0\x50\x19\xDE\x38\x06\xD0\xD2\x68\x9D\xB8\x06\x68\x9D"
"\x38\x05\x68\x9D\x38\x04\x68\x9D\xB8\x04\x68\x9D\xB8\x03\xA9\x00"
"\xF0\xA2\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC1"
"\xBD\x38\x06\xC9\x40\xF0\x22\xC9\x60\xF0\x0D\xC9\x61\xF0\x09\xC9"
"\xA0\xD0\x2E\x48\xA9\x02\xD0\x45\xAD\xF8\x05\x48\xAD\x78\x05\x48"
"\xAD\xF8\x04\x48\xAD\x78\x04\xB0\x0F\xBD\x38\x05\x48\xBD\x38\x04"
"\x48\xBD\xB8\x04\x48\xBD\xB8\x03\x48\xBD\x38\x06\x48\xA9\x05\xD0"
"\x1C\x29\x0C\x4A\x4A\x4A\xB0\x3E\x4A\x90\x0C\xAD\x78\x05\x48\xBD"
"\x38\x06\x48\xA9\x02\xD0\x06\xBD\x38\x06\x48\xA9\x01\x9D\x38\x06"
"\xD0\x4F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xB9\x82\xC0\x29\xF1\x1D\xB8\x05\x99\x82\xC0\x68\xD0\x82\xA9\x00"
"\x9D\xB8\x05\x48\xF0\xEA\x4A\xB0\x13\xAD\xF8\x04\x48\xAD\x78\x04"
"\x48\xBD\x38\x06\x48\xA9\x03\x9D\x38\x06\xD0\x15\xAD\x78\x05\x48"
"\xAD\xF8\x04\x48\xAD\x78\x04\x48\xBD\x38\x06\x48\xA9\x04\x9D\x38"
"\x06\xB9\x82\xC0\x30\xFB\xB9\x81\xC0\x29\xFB\x99\x81\xC0\xA9\xFF"
"\x99\x80\xC0\xB9\x81\xC0\x09\x04\x99\x81\xC0\x68\x99\x80\xC0\xB9"
"\x82\xC0\x09\x20\x99\x82\xC0\xB9\x82\xC0\x10\xFB\x29\xDF\x99\x82"
"\xC0\xDE\x38\x06\xF0\x98\xB9\x82\xC0\x30\xFB\x10\xD6\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xCE"
;
WRITE_HANDLER( M6821_Listener_B )
{
((CMouseInterface*)objTo)->On6821_B( byData );
}
WRITE_HANDLER( M6821_Listener_A )
{
((CMouseInterface*)objTo)->On6821_A( byData );
}
//CALLBACK_HANDLER( MouseHandler )
//{
// ((CMouseInterface*)objTo)->OnMouseEvent();
//}
//===========================================================================
CMouseInterface::CMouseInterface() :
m_pSlotRom(NULL)
{
m_6821.SetListenerB( this, M6821_Listener_B );
m_6821.SetListenerA( this, M6821_Listener_A );
// g_cDIMouse.SetMouseListener( this, MouseHandler );
m_by6821A = 0;
m_by6821B = 0x40; // Set PB6
m_6821.SetPB(m_by6821B);
m_bVBL = FALSE;
//
m_iX = 0;
m_iMinX = 0;
m_iMaxX = 1023;
m_iRangeX = 0;
m_iY = 0;
m_iMinY = 0;
m_iMaxY = 1023;
m_iRangeY = 0;
m_bButtons[0] = m_bButtons[1] = FALSE;
//
Reset();
memset( m_byBuff, 0, sizeof( m_byBuff ) );
m_bActive = false;
}
CMouseInterface::~CMouseInterface()
{
delete [] m_pSlotRom;
}
//===========================================================================
void CMouseInterface::Initialize(LPBYTE pCxRomPeripheral, UINT uSlot)
{
const UINT FW_SIZE = 2*1024;
// HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_MOUSEINTERFACE_FW), "FIRMWARE");
// if(hResInfo == NULL)
// return;
//
// DWORD dwResSize = SizeofResource(NULL, hResInfo);
// if(dwResSize != FW_SIZE)
// return;
//
// HGLOBAL hResData = LoadResource(NULL, hResInfo);
// if(hResData == NULL)
// return;
// instead of reading wndzooozes resources, just read it from a mere file on a disk!? bb
// #define IDR_MOUSEINTERFACE_FW "MouseInterface.rom"
// char BUFFER[FW_SIZE];
// FILE * hdfile = NULL;
// hdfile = fopen(IDR_MOUSEINTERFACE_FW, "rb");
// if(hdfile == NULL) return; // no file?
// UINT nbytes = fread(BUFFER, 1, FW_SIZE, hdfile);
// fclose(hdfile);
// if(nbytes != FW_SIZE) return; // have not read enough?
//
BYTE* pData = (BYTE*) MouseInterface_rom; // NB. Don't need to unlock resource
m_uSlot = uSlot;
if (m_pSlotRom == NULL)
{
m_pSlotRom = new BYTE [FW_SIZE];
if (m_pSlotRom)
memcpy(m_pSlotRom, pData, FW_SIZE);
}
//
SetSlotRom();
RegisterIoHandler(uSlot, &CMouseInterface::IORead, &CMouseInterface::IOWrite, NULL, NULL, this, NULL);
m_bActive = true;
printf("MouseInterface Rom loaded and registered\n");
}
void CMouseInterface::SetSlotRom()
{
LPBYTE pCxRomPeripheral = MemGetCxRomPeripheral();
if (pCxRomPeripheral == NULL)
return;
UINT uOffset = (m_by6821B << 7) & 0x0700;
memcpy(pCxRomPeripheral+m_uSlot*256, m_pSlotRom+uOffset, 256);
if (mem)
memcpy(mem+0xC000+m_uSlot*256, m_pSlotRom+uOffset, 256);
}
//===========================================================================
BYTE CMouseInterface::IORead(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nCyclesLeft)
{
UINT uSlot = ((uAddr & 0xff) >> 4) - 8;
CMouseInterface* pMouseIF = (CMouseInterface*) MemGetSlotParameters(uSlot);
BYTE byRS;
byRS = uAddr & 3;
return pMouseIF->m_6821.Read( byRS );
}
BYTE CMouseInterface::IOWrite(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nCyclesLeft)
{
UINT uSlot = ((uAddr & 0xff) >> 4) - 8;
CMouseInterface* pMouseIF = (CMouseInterface*) MemGetSlotParameters(uSlot);
BYTE byRS;
byRS = uAddr & 3;
pMouseIF->m_6821.Write( byRS, uValue );
return 0;
}
//===========================================================================
void CMouseInterface::On6821_A(BYTE byData)
{
m_by6821A = byData;
}
void CMouseInterface::On6821_B(BYTE byData)
{
BYTE byDiff = ( m_by6821B ^ byData ) & 0x3E;
if ( byDiff )
{
m_by6821B &= ~0x3E;
m_by6821B |= byData & 0x3E;
if ( byDiff & BIT5 ) // Write to 0285 chip
{
if ( byData & BIT5 )
m_by6821B |= BIT7; // OK, I'm ready to read from MC6821
else // Clock Activate for read
{
m_byBuff[m_nBuffPos++] = m_by6821A;
if ( m_nBuffPos == 1 )
OnCommand();
if ( m_nBuffPos == m_nDataLen || m_nBuffPos > 7 )
{
OnWrite(); // Have written all, Commit the command.
m_nBuffPos = 0;
}
m_by6821B &= ~BIT7; // for next reading
m_6821.SetPB( m_by6821B );
}
}
if ( byDiff & BIT4 ) // Read from 0285 chip ?
{
if ( byData & BIT4 )
m_by6821B &= ~BIT6; // OK, I'll prepare next value
else // Clock Activate for write
{
if ( m_nBuffPos ) // if m_nBuffPos is 0, something goes wrong!
m_nBuffPos++;
if ( m_nBuffPos == m_nDataLen || m_nBuffPos > 7 )
m_nBuffPos = 0; // Have read all, ready for next command.
else
m_6821.SetPA( m_byBuff[m_nBuffPos] );
m_by6821B |= BIT6; // for next writing
}
}
m_6821.SetPB( m_by6821B );
//
SetSlotRom(); // Update Cn00 ROM page
}
}
void CMouseInterface::OnCommand()
{
switch( m_byBuff[0] & 0xF0 )
{
case MOUSE_SET:
m_nDataLen = 1;
m_byMode = m_byBuff[0] & 0x0F;
break;
case MOUSE_READ: // Read
m_nDataLen = 6;
m_byState &= 0x20;
m_nX = m_iX;
m_nY = m_iY;
if ( m_bBtn0 ) m_byState |= 0x40; // Previous Button 0
if ( m_bBtn1 ) m_byState |= 0x01; // Previous Button 1
m_bBtn0 = m_bButtons[0];
m_bBtn1 = m_bButtons[1];
if ( m_bBtn0 ) m_byState |= 0x80; // Current Button 0
if ( m_bBtn1 ) m_byState |= 0x10; // Current Button 1
m_byBuff[1] = m_nX & 0xFF;
m_byBuff[2] = ( m_nX >> 8 ) & 0xFF;
m_byBuff[3] = m_nY & 0xFF;
m_byBuff[4] = ( m_nY >> 8 ) & 0xFF;
m_byBuff[5] = m_byState; // button 0/1 interrupt status
m_byState &= ~0x20;
break;
case MOUSE_SERV:
m_nDataLen = 2;
m_byBuff[1] = m_byState & ~0x20; // reason of interrupt
CpuIrqDeassert(IS_MOUSE);
break;
case MOUSE_CLEAR:
Reset();
m_nDataLen = 1;
break;
case MOUSE_POS:
m_nDataLen = 5;
break;
case MOUSE_INIT:
m_nDataLen = 3;
m_byBuff[1] = 0xFF; // I don't know what it is
break;
case MOUSE_CLAMP:
m_nDataLen = 5;
break;
case MOUSE_HOME:
m_nDataLen = 1;
SetPosition( 0, 0 );
break;
case MOUSE_TIME: // 0x90
switch( m_byBuff[0] & 0x0C )
{
case 0x00: m_nDataLen = 1; break; // write cmd ( #$90 is DATATIME 60Hz, #$91 is 50Hz )
case 0x04: m_nDataLen = 3; break; // write cmd, $0478, $04F8
case 0x08: m_nDataLen = 2; break; // write cmd, $0578
case 0x0C: m_nDataLen = 4; break; // write cmd, $0478, $04F8, $0578
}
break;
case 0xA0:
m_nDataLen = 2;
break;
case 0xB0:
case 0xC0:
m_nDataLen = 1;
break;
default:
m_nDataLen = 1;
//TRACE( "CMD : UNKNOWN CMD : #$%02X\n", m_byBuff[0] );
//_ASSERT(0);
break;
}
m_6821.SetPA( m_byBuff[1] );
}
void CMouseInterface::OnWrite()
{
int nMin, nMax;
switch( m_byBuff[0] & 0xF0 )
{
case MOUSE_CLAMP:
nMin = ( m_byBuff[3] << 8 ) | m_byBuff[1];
nMax = ( m_byBuff[4] << 8 ) | m_byBuff[2];
if ( m_byBuff[0] & 1 ) // Clamp Y
ClampY( nMin, nMax );
else // Clamp X
ClampX( nMin, nMax );
break;
case MOUSE_POS:
m_nX = ( m_byBuff[2] << 8 ) | m_byBuff[1];
m_nY = ( m_byBuff[4] << 8 ) | m_byBuff[3];
SetPosition( m_nX, m_nY );
break;
case MOUSE_INIT:
m_nX = 0;
m_nY = 0;
ClampX( 0, 1023 );
ClampY( 0, 1023 );
SetPosition( 0, 0 );
break;
}
}
void CMouseInterface::OnMouseEvent()
{
int byState = 0;
if ( !( m_byMode & 1 ) ) // Mouse Off
return;
BOOL bBtn0 = m_bButtons[0];
BOOL bBtn1 = m_bButtons[1];
if ( m_nX != m_iX || m_nY != m_iY )
byState |= 0x22; // X/Y moved since last READMOUSE | Movement interrupt
if ( m_bBtn0 != bBtn0 || m_bBtn1 != bBtn1 )
byState |= 0x04; // Button 0/1 interrupt
if ( m_bVBL )
byState |= 0x08;
//byState &= m_byMode & 0x2E;
byState &= ((m_byMode & 0x0E) | 0x20); // Keep "X/Y moved since last READMOUSE" for next MOUSE_READ (Contiki v1.3 uses this)
if ( byState & 0x0E )
{
m_byState |= byState;
CpuIrqAssert(IS_MOUSE);
}
}
void CMouseInterface::SetVBlank(bool bVBL)
{
if ( m_bVBL != bVBL )
{
m_bVBL = bVBL;
if ( m_bVBL ) // Rising edge
OnMouseEvent();
}
}
void CMouseInterface::Reset()
{
m_nBuffPos = 0;
m_nDataLen = 1;
m_byMode = 0;
m_byState = 0;
m_nX = 0;
m_nY = 0;
m_bBtn0 = 0;
m_bBtn1 = 0;
ClampX( 0, 1023 );
ClampY( 0, 1023 );
SetPosition( 0, 0 );
// CpuIrqDeassert(IS_MOUSE);
}
//===========================================================================
void CMouseInterface::ClampX(int iMinX, int iMaxX)
{
if ( iMinX < 0 || iMinX > iMaxX )
return;
m_iMaxX = iMaxX;
m_iMinX = iMinX;
if ( m_iX > m_iMaxX ) m_iX = m_iMaxX; else if ( m_iX < m_iMinX ) m_iX = m_iMinX;
}
void CMouseInterface::ClampY(int iMinY, int iMaxY)
{
if ( iMinY < 0 || iMinY > iMaxY )
return;
m_iMaxY = iMaxY;
m_iMinY = iMinY;
if ( m_iY > m_iMaxY ) m_iY = m_iMaxY; else if ( m_iY < m_iMinX ) m_iY = m_iMinY;
}
void CMouseInterface::SetPosition(int xvalue, int yvalue)
{
if ((m_iRangeX == 0) || (m_iRangeY == 0))
{
m_nX = m_iX = m_iMinX;
m_nY = m_iY = m_iMinY;
return;
}
m_iX = (UINT) ((xvalue*m_iMaxX) / m_iRangeX);
m_iY = (UINT) ((yvalue*m_iMaxY) / m_iRangeY);
}
void CMouseInterface::SetPosition(int xvalue, int xrange, int yvalue, int yrange)
{
m_iRangeX = (UINT) xrange;
m_iRangeY = (UINT) yrange;
SetPosition(xvalue, yvalue);
OnMouseEvent();
}
void CMouseInterface::SetButton(eBUTTON Button, eBUTTONSTATE State)
{
m_bButtons[Button]= (State == BUTTON_DOWN) ? TRUE : FALSE;
OnMouseEvent();
}

View File

@ -0,0 +1,79 @@
#include "6821.h"
#include "Common.h"
#define WRITE_HANDLER(func) void func( void* objFrom, void* objTo, int nAddr, BYTE byData )
#define CALLBACK_HANDLER(func) void func( void* objFrom, void* objTo, LPARAM lParam )
extern class CMouseInterface sg_Mouse;
class CMouseInterface
{
public:
CMouseInterface();
virtual ~CMouseInterface();
void Initialize(LPBYTE pCxRomPeripheral, UINT uSlot);
void Uninitialize(){ m_bActive = false; }
void SetSlotRom();
static BYTE IORead(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nCyclesLeft);
static BYTE IOWrite(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nCyclesLeft);
void SetPosition(int xvalue, int xrange, int yvalue, int yrange);
void SetButton(eBUTTON Button, eBUTTONSTATE State);
bool Active() { return m_bActive; }
void SetVBlank(bool bVBL);
protected:
void On6821_A(BYTE byData);
void On6821_B(BYTE byData);
void OnCommand();
void OnWrite();
void OnMouseEvent();
void Reset();
friend WRITE_HANDLER( M6821_Listener_A );
friend WRITE_HANDLER( M6821_Listener_B );
//friend CALLBACK_HANDLER( MouseHandler );
void SetPosition(int xvalue, int yvalue);
void ClampX(int iMinX, int iMaxX);
void ClampY(int iMinY, int iMaxY);
C6821 m_6821;
int m_nDataLen;
BYTE m_byMode;
BYTE m_by6821B;
BYTE m_by6821A;
BYTE m_byBuff[8]; // m_byBuff[0] is mode byte
int m_nBuffPos;
BYTE m_byState;
int m_nX;
int m_nY;
BOOL m_bBtn0;
BOOL m_bBtn1;
bool m_bVBL;
//
UINT m_iX;
UINT m_iRangeX;
UINT m_iMinX;
UINT m_iMaxX;
UINT m_iY;
UINT m_iRangeY;
UINT m_iMinY;
UINT m_iMaxY;
BOOL m_bButtons[2];
//
bool m_bActive;
LPBYTE m_pSlotRom;
UINT m_uSlot;
};

View File

@ -0,0 +1,173 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski, Nick Westgate
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Parallel Printer Interface Card emulation
*
* Author: Nick Westgate
*/
/* Adaptation for SDL and POSIX (l) by beom beotiger, Nov-Dec 2007 */
#include "stdafx.h"
//#pragma hdrstop
//#include "resource.h"
char Parallel_bin[] =
"\x18\xB0\x38\x48\x8A\x48\x98\x48\x08\x78\x20\x58\xFF\xBA\x68\x68"
"\x68\x68\xA8\xCA\x9A\x68\x28\xAA\x90\x38\xBD\xB8\x05\x10\x19\x98"
"\x29\x7F\x49\x30\xC9\x0A\x90\x3B\xC9\x78\xB0\x29\x49\x3D\xF0\x21"
"\x98\x29\x9F\x9D\x38\x06\x90\x7E\xBD\xB8\x06\x30\x14\xA5\x24\xDD"
"\x38\x07\xB0\x0D\xC9\x11\xB0\x09\x09\xF0\x3D\x38\x07\x65\x24\x85"
"\x24\x4A\x38\xB0\x6D\x18\x6A\x3D\xB8\x06\x90\x02\x49\x81\x9D\xB8"
"\x06\xD0\x53\xA0\x0A\x7D\x38\x05\x88\xD0\xFA\x9D\xB8\x04\x9D\x38"
"\x05\x38\xB0\x43\xC5\x24\x90\x3A\x68\xA8\x68\xAA\x68\x4C\xF0\xFD"
"\x90\xFE\xB0\xFE\x99\x80\xC0\x90\x37\x49\x07\xA8\x49\x0A\x0A\xD0"
"\x06\xB8\x85\x24\x9D\x38\x07\xBD\xB8\x06\x4A\x70\x02\xB0\x23\x0A"
"\x0A\xA9\x27\xB0\xCF\xBD\x38\x07\xFD\xB8\x04\xC9\xF8\x90\x03\x69"
"\x27\xAC\xA9\x00\x85\x24\x18\x7E\xB8\x05\x68\xA8\x68\xAA\x68\x60"
"\x90\x27\xB0\x00\x10\x11\xA9\x89\x9D\x38\x06\x9D\xB8\x06\xA9\x28"
"\x9D\xB8\x04\xA9\x02\x85\x36\x98\x5D\x38\x06\x0A\xF0\x90\x5E\xB8"
"\x05\x98\x48\x8A\x0A\x0A\x0A\x0A\xA8\xBD\x38\x07\xC5\x24\x68\xB0"
"\x05\x48\x29\x80\x09\x20\x2C\x58\xFF\xF0\x03\xFE\x38\x07\x70\x84"
;
static DWORD inactivity = 0;
static FILE* file = NULL;
DWORD const PRINTDRVR_SIZE = 0x100;
//===========================================================================
static BYTE /*__stdcall*/ PrintStatus(WORD, WORD, BYTE, BYTE, ULONG);
static BYTE /*__stdcall*/ PrintTransmit(WORD, WORD, BYTE, BYTE value, ULONG);
VOID PrintLoadRom(LPBYTE pCxRomPeripheral, const UINT uSlot)
{
// HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDR_PRINTDRVR_FW), "FIRMWARE");
// if(hResInfo == NULL)
// return;
//
// DWORD dwResSize = SizeofResource(NULL, hResInfo);
// if(dwResSize != PRINTDRVR_SIZE)
// return;
//
// HGLOBAL hResData = LoadResource(NULL, hResInfo);
// if(hResData == NULL)
// return;
// #define IDR_PRINTDRVR_FW "Parallel.rom"
// char BUFFER[PRINTDRVR_SIZE];
// FILE * hdfile = NULL;
// hdfile = fopen(IDR_PRINTDRVR_FW, "rb");
// if(hdfile == NULL) return; // no file?
// UINT nbytes = fread(BUFFER, 1, PRINTDRVR_SIZE, hdfile);
// fclose(hdfile);
// if(nbytes != PRINTDRVR_SIZE) return; // have not read enough?
//
BYTE* pData = (BYTE*) Parallel_bin; // NB. Don't need to unlock resource
// if(pData == NULL)
// return;
memcpy(pCxRomPeripheral + uSlot*256, pData, PRINTDRVR_SIZE);
//
RegisterIoHandler(uSlot, PrintStatus, PrintTransmit, NULL, NULL, NULL, NULL);
}
//===========================================================================
static BOOL CheckPrint()
{
inactivity = 0;
if (file == NULL)
{
/* TCHAR filepath[MAX_PATH * 2];
_tcsncpy(filepath, g_sProgramDir, MAX_PATH);
_tcsncat(filepath, _T("Printer.txt"), MAX_PATH);*/
file = fopen(g_sParallelPrinterFile, "ab"); // always for appending?
}
return (file != NULL);
}
//===========================================================================
static void ClosePrint()
{
if (file != NULL)
{
fclose(file);
file = NULL;
}
inactivity = 0;
}
//===========================================================================
void PrintDestroy()
{
ClosePrint();
}
//===========================================================================
void PrintUpdate(DWORD totalcycles)
{
if (file == NULL)
{
return;
}
if ((inactivity += totalcycles) > (10 * 1000 * 1000)) // around 10 seconds
{
// inactive, so close the file (next print will overwrite it)
ClosePrint();
}
}
//===========================================================================
void PrintReset()
{
ClosePrint();
}
//===========================================================================
static BYTE /*__stdcall*/ PrintStatus(WORD, WORD, BYTE, BYTE, ULONG)
{
CheckPrint();
return 0xFF; // status - TODO?
}
//===========================================================================
static BYTE /*__stdcall*/ PrintTransmit(WORD, WORD, BYTE, BYTE value, ULONG)
{
if (!CheckPrint())
{
return 0;
}
char c = value & 0x7F;
fwrite(&c, 1, 1, file);
return 0;
}
//===========================================================================

View File

@ -0,0 +1,6 @@
#pragma once
void PrintDestroy();
void PrintLoadRom(LPBYTE pCxRomPeripheral, UINT uSlot);
void PrintReset();
void PrintUpdate(DWORD);

View File

@ -0,0 +1,260 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Registry module
*
* Author: Various
*/
/* Adaptation for SDL and POSIX (l) by beom beotiger, Nov-Dec 2007 */
#include "stdafx.h"
//#pragma hdrstop
FILE * registry;
// the following 3 functions are from PHP 5.0 with Zend engine sources
// I'll tell, folks, PHP group is just great! -- bb
void php_charmask(char *input, int len, char *mask)
{
char *end;
char c;
memset(mask, 0, 256);
for (end = input+len; input < end; input++) {
c=*input;
mask[c]=1;
}
}
char *estrndup(const char *s, uint length)
{
char *p;
p = (char *) malloc(length+1);
if (!p) {
return (char *)NULL;
}
memcpy(p, s, length);
p[length] = 0;
return p;
}
char *php_trim(char *c, int len)
{
register int i;
int trimmed = 0;
char mask[256];
php_charmask(" \n\r\t\v\0", 6, mask);
// trim chars from beginning of the line
for (i = 0; i < len; i++) {
if (mask[(unsigned char)c[i]]) {
trimmed++;
} else {
break;
}
}
len -= trimmed;
c += trimmed;
// trim chars from line end
for (i = len - 1; i >= 0; i--) {
if (mask[(unsigned char)c[i]]) {
len--;
} else {
break;
}
}
return estrndup(c, len); // from c to c+len
}
BOOL ReturnKeyValue(char * line, char ** key, char ** value)
{
// line should be: some key = some value
// functions returns trimmed key and value
char * br = strchr(line, '=');
if(!br) return FALSE; // no sign of '=' sign. Sorry for some kalambur --bb
*br = '\0'; // cut the string where '=' is (or was)
br++; //to the value
*key = php_trim(line, strlen(line)); // trim those strings from beginning and trailing spaces
if(*key != NULL && **key == '#') return FALSE; // omit comments (lines with #)
*value = php_trim(br, strlen(br));
// printf("----- ReturnKeyValue: *key = %s, *value = %s\n", *key, *value);
if(*key && *value) return TRUE;
return FALSE;
}
#define BUFSIZE 256
char *ReadRegString(char *key)
{
// reads key for given value from the registry. Hmmm. What registry in Linux? I donna. --bb
fseek(registry, 0, SEEK_SET); //to the start of file
char *mkey;
char *mvalue;
char line[BUFSIZE];
int nkey = strlen(key); // length of key
while(fgets(line, BUFSIZE, registry))
if(ReturnKeyValue(line, &mkey, &mvalue) && (!strncmp(mkey, key, nkey)))
return mvalue;
return NULL; // key has not been found in registry?
}
//===========================================================================
BOOL RegLoadString (LPCTSTR section, LPCTSTR key, BOOL peruser,
char** buffer, DWORD chars) {
// will ignore section, peruser
BOOL success = FALSE;
char *value;
/* TCHAR fullkeyname[256];
wsprintf(fullkeyname,
TEXT("Software\\AppleWin\\CurrentVersion\\%s"),
(LPCTSTR)section);
HKEY keyhandle;
if (!RegOpenKeyEx((peruser ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE),
fullkeyname,
0,
KEY_READ,
&keyhandle)) {
DWORD type;
DWORD size = chars;
success = (!RegQueryValueEx(keyhandle,key,0,&type,(LPBYTE)buffer,&size)) &&
size;
RegCloseKey(keyhandle);
}*/
value = ReadRegString((char*)key); // read value for a given keyhandle
if(value) {
success = TRUE; // success!
if(strlen(value) > chars) value[chars] = '\0'; // cut string
*buffer = strdup(value);
}
return success;
}
//===========================================================================
BOOL RegLoadValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD *value) {
if (!value) return 0;
// TCHAR buffer[32] = TEXT("");
// printf("Getting value...\n");
char *sztmp;
if (!RegLoadString(section, key, peruser, &sztmp, 32))
return 0;
// strncpy(buffer, sztmp, 32);
// buffer[31] = 0;
*value = (DWORD)atoi(sztmp);
// printf("Value gotten:%d\n", *value);
return 1;
}
void RegSaveKeyValue(char * NKey, char * NValue)
{
char MyStr[BUFSIZE];
char line[BUFSIZE];
char templine[BUFSIZE];
char *sztmp;
FILE * tempf = tmpfile(); // open temp file
// FILE * tempf = fopen("linapple-temp.conf", "w+");
if(!tempf) return;
snprintf(MyStr, BUFSIZE, "\t%s =\t%s\n", NKey, NValue); // prepare string
fseek(registry, 0, SEEK_SET); //
bool found = false;
while(fgets(line, BUFSIZE, registry))
{
// printf("---1:%s", line);
strcpy(templine, line);
if(ReturnKeyValue(templine, &sztmp, &NValue) && !(strcmp(sztmp, NKey)))
{
fputs(MyStr, tempf);
found = true;
// printf("------ !!!!!!!!!!!!!!!! I FOUND IT!!!!!\n\n");
}
else fputs(line, tempf);
// printf("---2:%s", line);
}
if(!found) fputs(MyStr, tempf);
// now swap tempf and registry
fclose(registry);
fflush(tempf);
fseek(tempf, 0, SEEK_SET);
// fclose(tempf);
// return;
registry = fopen(REGISTRY, "w+t"); // erase if been
while(fgets(line, BUFSIZE, tempf)) {
fputs(line, registry);
// printf("---Saving Line:%s", line);
}
fflush(registry);
fclose(tempf);
// fflush(registry); // for chance... --bb
// do not close registry, it should be open while emu working...
}
//===========================================================================
void RegSaveString (LPCTSTR section, LPCTSTR key, BOOL peruser, LPCTSTR buffer) {
RegSaveKeyValue((char*)key, (char*)buffer);
/* TCHAR fullkeyname[256];
wsprintf(fullkeyname,
TEXT("Software\\AppleWin\\CurrentVersion\\%s"),
(LPCTSTR)section);
HKEY keyhandle;
DWORD disposition;
if (!RegCreateKeyEx((peruser ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE),
fullkeyname,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WRITE,
(LPSECURITY_ATTRIBUTES)NULL,
&keyhandle,
&disposition)) {
RegSetValueEx(keyhandle,
key,
0,
REG_SZ,
(CONST BYTE *)buffer,
(_tcslen(buffer)+1)*sizeof(TCHAR));
RegCloseKey(keyhandle);
}*/
}
//===========================================================================
void RegSaveValue (LPCTSTR section, LPCTSTR key, BOOL peruser, DWORD value) {
TCHAR buffer[33] = TEXT("");
// _ultot(value,buffer,10);
// _itoa(value, buffer, 10); // convert value to string
snprintf(buffer, 32, "%d", value);
RegSaveString(section,key,peruser,buffer);
}

View File

@ -0,0 +1,16 @@
#pragma once
// configuration file
#define REGISTRY "/opt/retropie/configs/apple2/linapple.conf"
extern FILE * registry; // our opened file
BOOL RegLoadString (LPCTSTR,LPCTSTR,BOOL,char**,DWORD);
BOOL RegLoadValue (LPCTSTR,LPCTSTR,BOOL,DWORD *);
BOOL RegLoadBool(LPCTSTR,LPCTSTR,BOOL,BOOL *);
void RegSaveString (LPCTSTR,LPCTSTR,BOOL,LPCTSTR);
void RegSaveValue (LPCTSTR,LPCTSTR,BOOL,DWORD);
void RegSaveBool (LPCTSTR,LPCTSTR,BOOL,BOOL);
char *php_trim(char *c, int len); // trimming string like PHP function trim does!

143
linapple-pie/src/Riff.cpp Normal file
View File

@ -0,0 +1,143 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: RIFF funcs --- my GOD, what is RIFF?
*
* Author: Various
*/
/* Adaptation for SDL and POSIX (l) by beom beotiger, Nov-Dec 2007 */
#include "wincompat.h"
#include "Riff.h"
#include "wwrapper.h"
static HANDLE g_hRiffFile = INVALID_HANDLE_VALUE;
static DWORD dwTotalOffset;
static DWORD dwDataOffset;
static DWORD g_dwTotalNumberOfBytesWritten = 0;
static unsigned int g_NumChannels = 2;
int RiffInitWriteFile(char* pszFile, unsigned int sample_rate, unsigned int NumChannels)
{
// g_hRiffFile = CreateFile(pszFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
g_hRiffFile = fopen(pszFile, "w");
if(g_hRiffFile == INVALID_HANDLE_VALUE)
return 1;
g_NumChannels = NumChannels;
//
UINT32 temp32;
UINT16 temp16;
DWORD dwNumberOfBytesWritten;
WriteFile(g_hRiffFile, "RIFF", 4, &dwNumberOfBytesWritten, NULL);
temp32 = 0; // total size
dwTotalOffset = SetFilePointer(g_hRiffFile, 0, NULL, FILE_CURRENT);
WriteFile(g_hRiffFile, &temp32, 4, &dwNumberOfBytesWritten, NULL);
WriteFile(g_hRiffFile, "WAVE", 4, &dwNumberOfBytesWritten, NULL);
//
WriteFile(g_hRiffFile, "fmt ", 4, &dwNumberOfBytesWritten, NULL);
temp32 = 16; // format length
WriteFile(g_hRiffFile, &temp32, 4, &dwNumberOfBytesWritten, NULL);
temp16 = 1; // PCM format
WriteFile(g_hRiffFile, &temp16, 2, &dwNumberOfBytesWritten, NULL);
temp16 = NumChannels; // channels
WriteFile(g_hRiffFile, &temp16, 2, &dwNumberOfBytesWritten, NULL);
temp32 = sample_rate; // sample rate
WriteFile(g_hRiffFile, &temp32, 4, &dwNumberOfBytesWritten, NULL);
temp32 = sample_rate * 2 * NumChannels; // bytes/second
WriteFile(g_hRiffFile, &temp32, 4, &dwNumberOfBytesWritten, NULL);
temp16 = 2 * NumChannels; // block align
WriteFile(g_hRiffFile, &temp16, 2, &dwNumberOfBytesWritten, NULL);
temp16 = 16; // bits/sample
WriteFile(g_hRiffFile, &temp16, 2, &dwNumberOfBytesWritten, NULL);
//
WriteFile(g_hRiffFile, "data", 4, &dwNumberOfBytesWritten, NULL);
temp32 = 0; // data length
dwDataOffset = SetFilePointer(g_hRiffFile, 0, NULL, FILE_CURRENT);
WriteFile(g_hRiffFile, &temp32, 4, &dwNumberOfBytesWritten, NULL);
return 0;
}
int RiffFinishWriteFile()
{
if(g_hRiffFile == INVALID_HANDLE_VALUE)
return 1;
//
UINT32 temp32;
DWORD dwNumberOfBytesWritten;
temp32 = g_dwTotalNumberOfBytesWritten - (dwTotalOffset + 4);
SetFilePointer(g_hRiffFile, dwTotalOffset, NULL, FILE_BEGIN);
WriteFile(g_hRiffFile, &temp32, 4, &dwNumberOfBytesWritten, NULL);
temp32 = g_dwTotalNumberOfBytesWritten - (dwDataOffset + 4);
SetFilePointer(g_hRiffFile, dwDataOffset, NULL, FILE_BEGIN);
WriteFile(g_hRiffFile, &temp32, 4, &dwNumberOfBytesWritten, NULL);
return CloseHandle(g_hRiffFile);
}
int RiffPutSamples(short* buf, unsigned int uSamples)
{
if(g_hRiffFile == INVALID_HANDLE_VALUE)
return 1;
//
DWORD dwNumberOfBytesWritten;
BOOL bRes = WriteFile(
g_hRiffFile,
buf,
uSamples * sizeof(short) * g_NumChannels,
&dwNumberOfBytesWritten,
NULL);
g_dwTotalNumberOfBytesWritten += dwNumberOfBytesWritten;
return 0;
}

5
linapple-pie/src/Riff.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
int RiffInitWriteFile(char* pszFile, unsigned int sample_rate, unsigned int NumChannels);
int RiffFinishWriteFile();
int RiffPutSamples(short* buf, unsigned int uSamples);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,302 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Save-state (snapshot) module
*
* Author: Copyright (c) 2004-2006 Tom Charlesworth
*/
/* Adaptation for SDL and POSIX (l) by beom beotiger, Nov-Dec 2007 */
#include "stdafx.h"
#include "wwrapper.h"
#pragma hdrstop
#define DEFAULT_SNAPSHOT_NAME "SaveState.aws"
bool g_bSaveStateOnExit = false;
static char g_szSaveStateFilename[MAX_PATH] = {0};
//-----------------------------------------------------------------------------
char* Snapshot_GetFilename()
{
return g_szSaveStateFilename;
}
void Snapshot_SetFilename(char* pszFilename)
{
if(*pszFilename)
strcpy(g_szSaveStateFilename, (const char *) pszFilename);
else
strcpy(g_szSaveStateFilename, DEFAULT_SNAPSHOT_NAME);
}
//-----------------------------------------------------------------------------
void Snapshot_LoadState()
{
char szMessage[32 + MAX_PATH];
APPLEWIN_SNAPSHOT* pSS = (APPLEWIN_SNAPSHOT*) new char[sizeof(APPLEWIN_SNAPSHOT)];
try
{
if(pSS == NULL)
throw(0);
memset(pSS, 0, sizeof(APPLEWIN_SNAPSHOT));
//
/* HANDLE hFile = CreateFile( g_szSaveStateFilename,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);*/
HANDLE hFile = (FILE*)fopen(g_szSaveStateFilename, "rb");
if(hFile == INVALID_HANDLE_VALUE)
{
strcpy(szMessage, "File not found: ");
strcpy(szMessage + strlen(szMessage), g_szSaveStateFilename);
throw(0);
}
DWORD dwBytesRead;
BOOL bRes = ReadFile( hFile,
pSS,
sizeof(APPLEWIN_SNAPSHOT),
&dwBytesRead,
NULL);
CloseHandle(hFile);
if(!bRes || (dwBytesRead != sizeof(APPLEWIN_SNAPSHOT)))
{
// File size wrong: probably because of version mismatch or corrupt file
strcpy(szMessage, "File size mismatch");
throw(0);
}
if(pSS->Hdr.dwTag != AW_SS_TAG)
{
strcpy(szMessage, "File corrupt");
throw(0);
}
/* Let it be any version, never mind it! ^_^ */
if(pSS->Hdr.dwVersion != MAKE_VERSION(1,0,0,1))
{
strcpy(szMessage, "Version mismatch");
throw(0);
}
// TO DO: Verify checksum
//
// Reset all sub-systems
MemReset();
if (!IS_APPLE2)
MemResetPaging();
DiskReset();
KeybReset();
VideoResetState();
MB_Reset();
//
// Apple2 uint
//
CpuSetSnapshot(&pSS->Apple2Unit.CPU6502);
sg_SSC.CommSetSnapshot(&pSS->Apple2Unit.Comms);
JoySetSnapshot(&pSS->Apple2Unit.Joystick);
KeybSetSnapshot(&pSS->Apple2Unit.Keyboard);
SpkrSetSnapshot(&pSS->Apple2Unit.Speaker);
VideoSetSnapshot(&pSS->Apple2Unit.Video);
MemSetSnapshot(&pSS->Apple2Unit.Memory);
//
//
// Slot4: Mockingboard
MB_SetSnapshot(&pSS->Mockingboard1, 4);
//
// Slot5: Mockingboard
MB_SetSnapshot(&pSS->Mockingboard2, 5);
//
// Slot6: Disk][
DiskSetSnapshot(&pSS->Disk2, 6);
// Hmmm. And SLOT 7 (HDD1 and HDD2)? Where are they??? -- beom beotiger ^_^
}
catch(int)
{
/* MessageBox( g_hFrameWindow,
szMessage,
TEXT("Load State"),
MB_ICONEXCLAMATION | MB_SETFOREGROUND);*/
fprintf(stderr, "%s\n", szMessage); // instead of wndzoooe messagebox let's use powerful stderr
}
delete [] pSS;
}
//-----------------------------------------------------------------------------
void Snapshot_SaveState()
{
APPLEWIN_SNAPSHOT* pSS = (APPLEWIN_SNAPSHOT*) new char[sizeof(APPLEWIN_SNAPSHOT)];
if(pSS == NULL)
{
// To do
return;
}
memset(pSS, 0, sizeof(APPLEWIN_SNAPSHOT));
pSS->Hdr.dwTag = AW_SS_TAG;
pSS->Hdr.dwVersion = MAKE_VERSION(1,0,0,1);
// pSS->Hdr.dwVersion = LINAPPLE_VERSION; //defined in AppleWin.h
pSS->Hdr.dwChecksum = 0; // TO DO
//
// Apple2 uint
//
pSS->Apple2Unit.UnitHdr.dwLength = sizeof(SS_APPLE2_Unit);
pSS->Apple2Unit.UnitHdr.dwVersion = MAKE_VERSION(1,0,0,0);
// pSS->Apple2Unit.UnitHdr.dwVersion = LINAPPLE_VERSION;
CpuGetSnapshot(&pSS->Apple2Unit.CPU6502);
sg_SSC.CommGetSnapshot(&pSS->Apple2Unit.Comms);
JoyGetSnapshot(&pSS->Apple2Unit.Joystick);
KeybGetSnapshot(&pSS->Apple2Unit.Keyboard);
SpkrGetSnapshot(&pSS->Apple2Unit.Speaker);
VideoGetSnapshot(&pSS->Apple2Unit.Video);
MemGetSnapshot(&pSS->Apple2Unit.Memory);
//
// Slot1: Empty
pSS->Empty1.Hdr.UnitHdr.dwLength = sizeof(SS_CARD_EMPTY);
pSS->Empty1.Hdr.UnitHdr.dwVersion = MAKE_VERSION(1,0,0,0);
pSS->Empty1.Hdr.dwSlot = 1;
pSS->Empty1.Hdr.dwType = CT_Empty;
//
// Slot2: Empty
pSS->Empty2.Hdr.UnitHdr.dwLength = sizeof(SS_CARD_EMPTY);
pSS->Empty2.Hdr.UnitHdr.dwVersion = MAKE_VERSION(1,0,0,0);
pSS->Empty2.Hdr.dwSlot = 2;
pSS->Empty2.Hdr.dwType = CT_Empty;
//
// Slot3: Empty
pSS->Empty3.Hdr.UnitHdr.dwLength = sizeof(SS_CARD_EMPTY);
pSS->Empty3.Hdr.UnitHdr.dwVersion = MAKE_VERSION(1,0,0,0);
pSS->Empty3.Hdr.dwSlot = 3;
pSS->Empty3.Hdr.dwType = CT_Empty;
//
// Slot4: Mockingboard
MB_GetSnapshot(&pSS->Mockingboard1, 4);
//
// Slot5: Mockingboard
MB_GetSnapshot(&pSS->Mockingboard2, 5);
//
// Slot6: Disk][
DiskGetSnapshot(&pSS->Disk2, 6);
//
// HANDLE hFile = CreateFile( g_szSaveStateFilename,
// GENERIC_WRITE,
// 0,
// NULL,
// CREATE_ALWAYS,
// FILE_ATTRIBUTE_NORMAL,
// NULL);
HANDLE hFile = fopen(g_szSaveStateFilename, "wb");
// DWORD dwError = GetLastError();
// _ASSERT((dwError == 0) || (dwError == ERROR_ALREADY_EXISTS));
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwBytesWritten;
/*BOOL bRes =*/ WriteFile( hFile,
pSS,
sizeof(APPLEWIN_SNAPSHOT),
&dwBytesWritten,
NULL);
// if(!bRes || (dwBytesWritten != sizeof(APPLEWIN_SNAPSHOT)))
// dwError = GetLastError();
CloseHandle(hFile);
}
else
{
// dwError = GetLastError();
; //just do nothing
}
// _ASSERT((dwError == 0) || (dwError == ERROR_ALREADY_EXISTS));
delete [] pSS;
}
//-----------------------------------------------------------------------------
void Snapshot_Startup()
{
static bool bDone = false;
if(!g_bSaveStateOnExit || bDone)
return;
Snapshot_LoadState();
bDone = true;
}
void Snapshot_Shutdown()
{
static bool bDone = false;
if(!g_bSaveStateOnExit || bDone)
return;
Snapshot_SaveState();
bDone = true;
}

View File

@ -0,0 +1,10 @@
#pragma once
extern bool g_bSaveStateOnExit;
char* Snapshot_GetFilename();
void Snapshot_SetFilename(char* pszFilename);
void Snapshot_LoadState();
void Snapshot_SaveState();
void Snapshot_Startup();
void Snapshot_Shutdown();

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,129 @@
#pragma once
#include <pthread.h>
extern class CSuperSerialCard sg_SSC;
enum {COMMEVT_WAIT=0, COMMEVT_ACK, COMMEVT_TERM, COMMEVT_MAX};
enum eFWMODE {FWMODE_CIC=0, FWMODE_SIC_P8, FWMODE_PPC, FWMODE_SIC_P8A}; // NB. CIC = SSC
//////// windows specific values
#define NOPARITY 0
#define ODDPARITY 1
#define EVENPARITY 2
#define MARKPARITY 3
#define SPACEPARITY 4
#define ONESTOPBIT 0
#define ONE5STOPBITS 1
#define TWOSTOPBITS 2
///////////////////////////////
// Undocumented CMSPAR flag for MARKPARITY and SPACEPARITY???
#ifndef CMSPAR
#define CMSPAR 010000000000
#endif
/////////////////////////////////////
typedef struct
{
//DIPSW1
UINT uBaudRate;
eFWMODE eFirmwareMode;
//DIPSW2
UINT uStopBits;
UINT uByteSize;
UINT uParity;
bool bLinefeed;
bool bInterrupts;
} SSC_DIPSW;
class CSuperSerialCard
{
public:
CSuperSerialCard();
virtual ~CSuperSerialCard() {}
void CommInitialize(LPBYTE pCxRomPeripheral, UINT uSlot);
void CommReset();
void CommDestroy();
void CommSetSerialPort(/*HWND,*/DWORD);
void CommUpdate(DWORD);
DWORD CommGetSnapshot(SS_IO_Comms* pSS);
DWORD CommSetSnapshot(SS_IO_Comms* pSS);
DWORD GetSerialPort() { return m_dwSerialPort; }
void SetSerialPort(DWORD dwSerialPort) { m_dwSerialPort = dwSerialPort; }
static BYTE SSC_IORead(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nCyclesLeft);
static BYTE SSC_IOWrite(WORD PC, WORD uAddr, BYTE bWrite, BYTE uValue, ULONG nCyclesLeft);
private:
BYTE CommCommand(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE CommControl(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE CommDipSw(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE CommReceive(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE CommStatus(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE CommTransmit(WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
void GetDIPSW();
void SetDIPSWDefaults();
BYTE GenerateControl();
UINT BaudRateToIndex(UINT uBaudRate);
void UpdateCommState();
BOOL CheckComm();
void CloseComm();
void CheckCommEvent(DWORD dwEvtMask);
static DWORD CommThread(LPVOID lpParameter);
bool CommThInit();
void CommThUninit();
//
private:
DWORD m_dwSerialPort;
static SSC_DIPSW m_DIPSWDefault;
SSC_DIPSW m_DIPSWCurrent;
// Derived from DIPSW1
UINT m_uBaudRate;
// Derived from DIPSW2
UINT m_uStopBits;
UINT m_uByteSize;
UINT m_uParity;
// SSC Registers
BYTE m_uControlByte;
BYTE m_uCommandByte;
//
int m_hCommHandle; // file for communication with COM
DWORD m_dwCommInactivity;
// how does CRITICAL_SECTION work in Linux? -- see in Wikipedia: http://en.wikipedia.org/wiki/Critical_section
// --> to main file
// CRITICAL_SECTION m_CriticalSection; // To guard /g_vRecvBytes/
BYTE m_RecvBuffer[uRecvBufferSize]; // NB: More work required if >1 is used
volatile DWORD m_vRecvBytes;
//
bool m_bTxIrqEnabled;
bool m_bRxIrqEnabled;
bool m_bWrittenTx;
//
volatile bool m_vbCommIRQ;
HANDLE m_hCommThread;
HANDLE m_hCommEvent[COMMEVT_MAX];
OVERLAPPED m_o;
BYTE* m_pExpansionRom;
};

View File

@ -0,0 +1,372 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Core sound related functionality
*
* Author: Tom Charlesworth
*/
/* Adaption for Linux+SDL done by beom beotiger. Peace! LLL */
#include "stdafx.h"
// for Assertion
#include <assert.h>
bool g_bDSAvailable = false;
// forward decls ------------------------
void SDLSoundDriverUninit(); // for DSInit()
bool SDLSoundDriverInit(unsigned wantedFreq, unsigned wantedSamples); // for DSUninit?
bool DSInit()
{
if(g_bDSAvailable) return true; // do not need to repeat all process?? --bb
// const DWORD SPKR_SAMPLE_RATE = 44100; - defined in Common.h
g_bDSAvailable = SDLSoundDriverInit(SPKR_SAMPLE_RATE, 4096);// I just do not know what number of samples use.
return g_bDSAvailable; //
}
//-----------------------------------------------------------------------------
void DSUninit()
{
if(!g_bDSAvailable)
return;
SDLSoundDriverUninit(); // using code from OpenMSX
// SDL_CloseAudio();
}
void SoundCore_SetFade(int how) //
{
if(how == FADE_OUT) SDL_PauseAudio(1); //stop playing sound
else SDL_PauseAudio(0); //start playing
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////// Code from OpenMSX (http://openmsx.sourceforge.net) ////
///////////////////////////////////////////////////////////////////////////////////
// Definitions
void mute();
void unmute();
unsigned getFrequency();
unsigned getSamples();
double uploadBuffer(short* buffer, unsigned len);
void reInit();
unsigned getBufferFilled();
unsigned getBufferFree();
static void audioCallbackHelper(void* userdata, BYTE* strm, int len);
void audioCallback(short* stream, unsigned len);
unsigned frequency;
short* mixBuffer;
short* mockBuffer;
unsigned fragmentSize;
unsigned bufferSize;
unsigned readIdx, writeIdx, readIdx2, writeIdx2;
double filledStat; /**< average filled status, 1.0 means filled exactly
the right amount, less than 1.0 mean under
filled, more than 1.0 means overfilled. */
bool muted;
/////////////////// Main part //////////////////////
bool SDLSoundDriverInit(unsigned wantedFreq, unsigned wantedSamples)
{
SDL_AudioSpec desired;
desired.freq = wantedFreq;
desired.samples = wantedSamples;
desired.channels = 2; // stereo(2) or mono(1)
// be courteous with BIG_Endian systems, please! --bb
#if ( SDL_BYTEORDER == SDL_BIG_ENDIAN )
desired.format = AUDIO_S16MSB;
#else
desired.format = AUDIO_S16LSB;
#endif
desired.callback = audioCallbackHelper; // must be a static method
desired.userdata = NULL;
/*
if (SDL_InitSubSystem(SDL_INIT_AUDIO) != 0) {
printf("Unable to initialize SDL audio subsystem: %s", SDL_GetError());
return false;
}
*/
SDL_AudioSpec audioSpec;
if (SDL_OpenAudio(&desired, &audioSpec) != 0) {
// SDL_QuitSubSystem(SDL_INIT_AUDIO);
printf("Unable to open SDL audio: %s", SDL_GetError());
return false;
}
//std::cerr << "DEBUG wanted: " << wantedSamples
// << " actual: " << audioSpec.size / 4 << std::endl;
frequency = audioSpec.freq;
bufferSize = 4 * (audioSpec.size / sizeof(short));
// bufferSize = SPKR_SAMPLE_RATE * 2 * sizeof(short); // 1 second of stereo short data
/*
fragmentSize = 256;
while ((bufferSize / fragmentSize) >= 32) {
fragmentSize *= 2;
}
while ((bufferSize / fragmentSize) < 8) {
fragmentSize /= 2;
}
*/
mixBuffer = new short[bufferSize]; // buffer for Apple2 speakers
mockBuffer = new short[bufferSize]; // buffer for Mockingboard
reInit();
printf("SDL_MIX_MAXVOLUME=%d\n",SDL_MIX_MAXVOLUME);
printf("Freq=%d,format=%d,channels=%d,silence=%d\n",
audioSpec.freq,audioSpec.format,audioSpec.channels,audioSpec.silence);
printf("samples=%d,size=%d,bufferSize=%d\n",audioSpec.samples,audioSpec.size,bufferSize);
// SDL_PauseAudio(0);
return true;
}
void SDLSoundDriverUninit()
{
delete[] mixBuffer;
delete[] mockBuffer;
SDL_CloseAudio();
// SDL_QuitSubSystem(SDL_INIT_AUDIO);
}
void reInit()
{
memset(mixBuffer, 0, bufferSize * sizeof(short));
memset(mockBuffer, 0, bufferSize * sizeof(short));
readIdx = readIdx2 = 0;
writeIdx = writeIdx2 = 0;//(5 * bufferSize) / 8;
filledStat = 1.0;
}
void mute()
{
if (!muted) {
muted = true;
SDL_PauseAudio(1);
}
}
void unmute()
{
if (muted) {
muted = false;
reInit();
SDL_PauseAudio(0);
}
}
unsigned getFrequency()
{
return frequency;
}
unsigned getSamples()
{
return fragmentSize;
}
void audioCallbackHelper(void* userdata, BYTE* strm, int len)
{
assert((len & 3) == 0); // stereo, 16-bit
audioCallback((short*)strm, len / sizeof(short));
}
unsigned getBufferFilled()
{
int tmp = writeIdx - readIdx;
int result = (0 <= tmp) ? tmp : tmp + bufferSize;
assert((0 <= result) && (unsigned(result) < bufferSize));
return result;
}
unsigned getBufferFree()
{
// we can't distinguish completely filled from completely empty
// (in both cases readIx would be equal to writeIdx), so instead
// we define full as '(writeIdx + 2) == readIdx' (note that index
// increases in steps of 2 (stereo)).
int result = bufferSize - 2 - getBufferFilled();
assert((0 <= result) && (unsigned(result) < bufferSize));
return result;
}
//////////////////////////////////////////////////////////////////
//////// for Mockingboard support using another buffer //////////
//////////////////////////////////////////////////////////////////
unsigned getBuffer2Filled()
{
int tmp = writeIdx2 - readIdx2;
int result = (0 <= tmp) ? tmp : tmp + bufferSize;
assert((0 <= result) && (unsigned(result) < bufferSize));
return result;
}
unsigned getBuffer2Free()
{
// we can't distinguish completely filled from completely empty
// (in both cases readIx would be equal to writeIdx), so instead
// we define full as '(writeIdx + 2) == readIdx' (note that index
// increases in steps of 2 (stereo)).
int result = bufferSize - 2 - getBuffer2Filled();
assert((0 <= result) && (unsigned(result) < bufferSize));
return result;
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
void audioCallback(short* stream, unsigned len)
{
// clear Audio buffer
memset(stream,0,len * sizeof(short));
assert((len & 1) == 0); // stereo
unsigned len1, len2;
unsigned available = getBufferFilled();
//std::cerr << "DEBUG callback: " << available << std::endl;
unsigned num = std::min(len, available);
if ((readIdx + num) < bufferSize) {
memcpy(stream, &mixBuffer[readIdx], num * sizeof(short));
readIdx += num;
} else {
len1 = bufferSize - readIdx;
memcpy(stream, &mixBuffer[readIdx], len1 * sizeof(short));
len2 = num - len1;
memcpy(&stream[len1], mixBuffer, len2 * sizeof(short));
readIdx = len2;
}
/* Note: cleared at the begininng of the func
int missing = len - available;
if (missing > 0) {
// buffer underrun
//std::cerr << "DEBUG underrun: " << missing << std::endl;
memset(&stream[available], 0, missing * sizeof(short));
}
*/
unsigned target = (5 * bufferSize) / 8;
double factor = double(available) / target;
filledStat = (63 * filledStat + factor) / 64;
//std::cerr << "DEBUG filledStat: " << filledStat << std::endl;
#ifdef MOCKINGBOARD
// And add Mockingboard sound data to the stream
available = getBuffer2Filled();
//std::cerr << "DEBUG callback: " << available << std::endl;
num = std::min(len, available);
unsigned i;
if ((readIdx2 + num) < bufferSize) {
// memcpy(stream, &mixBuffer[readIdx], num * sizeof(short));
for(i = 0; i < num; i++)
stream[i] |= mockBuffer[readIdx2 + i];
readIdx2 += num;
} else {
len1 = bufferSize - readIdx2;
// memcpy(stream, &mixBuffer[readIdx], len1 * sizeof(short));
for(i = 0; i < len1; i++)
stream[i] |= mockBuffer[readIdx2 + i];
len2 = num - len1;
// memcpy(&stream[len1], mixBuffer, len2 * sizeof(short));
for(i = 0; i < len2; i++)
stream[len1 + i] |= mockBuffer[i];
readIdx2 = len2;
}
#endif
// normalization
/* const short MY_MAX_VOLUME = (short)SDL_MIX_MAXVOLUME / 2;
for(unsigned k=0;k<len;k+=2)
if((short)stream[k] > MY_MAX_VOLUME)
stream[k] = MY_MAX_VOLUME;
*/
} // audioCallback
double DSUploadBuffer(short* buffer, unsigned len)
{
SDL_LockAudio();
// len *= 2; // stereo
unsigned free = getBufferFree();
if (len > free) {
// std::cerr << "DEBUG overrun: " << len - free << std::endl;
printf("DEBUG overrun: len=%d,free=%d\n\n", len, free);
}
unsigned num = std::min(len, free); // ignore overrun (drop samples)
if ((writeIdx + num) < bufferSize) {
memcpy(&mixBuffer[writeIdx], buffer, num * sizeof(short));
writeIdx += num;
} else {
// printf("DEBUG split: writeIdx=%d,num=%d\n\n", writeIdx, num);
unsigned len1 = bufferSize - writeIdx;
memcpy(&mixBuffer[writeIdx], buffer, len1 * sizeof(short));
unsigned len2 = num - len1;
memcpy(mixBuffer, &buffer[len1], len2 * sizeof(short));
writeIdx = len2;
}
//unsigned available = getBufferFilled();
//std::cerr << "DEBUG upload: " << available << " (" << len << ")" << std::endl;
double result = filledStat;
filledStat = 1.0; // only report difference once
SDL_UnlockAudio();
return result;
}
///// Uploading sound data for Mockingboard buffer
void /*double*/ DSUploadMockBuffer(short* buffer, unsigned len)
{
SDL_LockAudio();
// len *= 2; // stereo
unsigned free = getBuffer2Free();
//if (len > free) {
// std::cerr << "DEBUG overrun: " << len - free << std::endl;
//}
unsigned num = std::min(len, free); // ignore overrun (drop samples)
if ((writeIdx2 + num) < bufferSize) {
memcpy(&mockBuffer[writeIdx2], buffer, num * sizeof(short));
writeIdx2 += num;
} else {
unsigned len1 = bufferSize - writeIdx2;
memcpy(&mockBuffer[writeIdx2], buffer, len1 * sizeof(short));
unsigned len2 = num - len1;
memcpy(mockBuffer, &buffer[len1], len2 * sizeof(short));
writeIdx2 = len2;
}
SDL_UnlockAudio();
// return 1.0; // do not use result?
}

View File

@ -0,0 +1,21 @@
#pragma once
// Define max 1 of these:
//#define RIFF_SPKR
//#define RIFF_MB
// max volume for disable sound distortion
#define SD_VOLUME SDL_MIX_MAXVOLUME / 2
enum {FADE_OUT, FADE_IN };
bool DSInit(); // init SDL_Auidio
void DSUninit(); // uninit SDL_Auidio
//void DSSndPlay(void * mydata, Uint8 *stream, int len); // callback func for playing sound
void SoundCore_SetFade(int how); //
double DSUploadBuffer(short* buffer, unsigned len);
void DSUploadMockBuffer(short* buffer, unsigned len); // Upload Mockingboard data
//LONG NewVolume(DWORD dwVolume, DWORD dwVolumeMax);
extern bool g_bDSAvailable;

View File

@ -0,0 +1,492 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Speaker emulation
*
* Author: Various
*/
/* Remake for SDL Audio for Linux (or other SDL-compliant OSes) by beom beotiger --bb */
#include "stdafx.h"
// for _ASSERT ion. (here _ASSERT means Unix(tm) assert) --bb
#include <assert.h>
// Notes:
//
// [OLD: 23.191 Apple CLKs == 44100Hz (CLK_6502/44100)]
// 23 Apple CLKS per PC sample (played back at 44.1KHz)
//
//
// The speaker's wave output drives how much 6502 emulation is done in real-time, eg:
// If the speaker's wave buffer is running out of sample-data, then more 6502 cycles
// need to be executed to top-up the wave buffer.
// This is in contrast to the AY8910 voices, which can simply generate more data if
// their buffers are running low.
// number of channels and buffer size for Apple][ Speakers
static const unsigned short g_nSPKR_NumChannels = 1;
//-------------------------------------
// Globals (SOUND_WAVE)
const short SPKR_DATA_INIT = (short)0x8000; // data written to speakers buffer
static short g_nSpeakerData = SPKR_DATA_INIT;
static short *g_pSpeakerBuffer = NULL;
static UINT g_nBufferIdx = 0;
static short *g_pStereoBuffer = NULL; // buffer for stereo samples
static short *g_pRemainderBuffer = NULL; // Remainder buffer
static UINT g_nRemainderBufferSize; // Setup in SpkrInitialize()
static UINT g_nRemainderBufferIdx; // Setup in SpkrInitialize()
// Application-wide globals:
DWORD soundtype = SOUND_WAVE; //default
double g_fClksPerSpkrSample; // Setup in SetClksPerSpkrSample()
// Globals
static unsigned __int64 g_nSpkrQuietCycleCount = 0;
static unsigned __int64 g_nSpkrLastCycle = 0;
static bool g_bSpkrToggleFlag = false;
static bool g_bSpkrAvailable = false;
static bool g_bSpkrRecentlyActive = false;
//-----------------------------------------------------------------------------
// Forward refs:
//ULONG Spkr_SubmitWaveBuffer_FullSpeed(short* pSpeakerBuffer, ULONG nNumSamples);
static ULONG Spkr_SubmitWaveBuffer(short* pSpeakerBuffer, ULONG nNumSamples);
static void Spkr_SetActive(bool bActive);
//=============================================================================
// Let us leave benchmark for the near future --bb ^_^
#if 0
static void DisplayBenchmarkResults ()
{
DWORD totaltime = GetTickCount() - extbench;
VideoRedrawScreen();
TCHAR buffer[64];
sprintf(buffer,
TEXT("This benchmark took %u.%02u seconds."),
(unsigned)(totaltime / 1000),
(unsigned)((totaltime / 10) % 100));
/* MessageBox(g_hFrameWindow,
buffer,
TEXT("Benchmark Results"),
MB_ICONINFORMATION | MB_SETFOREGROUND);*/
printf("This benchmark took %u.%02u seconds.",
(unsigned)(totaltime / 1000), (unsigned)((totaltime / 10) % 100));
}
#endif
//=============================================================================
static void SetClksPerSpkrSample()
{
// // 23.191 clks for 44.1Khz (when 6502 CLK=1.0Mhz)
// g_fClksPerSpkrSample = g_fCurrentCLK6502 / (double)SPKR_SAMPLE_RATE;
// Use integer value: Better for MJ Mahon's RT.SYNTH.DSK (integer multiples of 1.023MHz Clk)
// . 23 clks @ 1.023MHz SPKR_SAMPLE_RATE = 44100Hz!?
g_fClksPerSpkrSample = (double) (UINT) (g_fCurrentCLK6502 / (double)SPKR_SAMPLE_RATE);
}
//=============================================================================
static void InitRemainderBuffer()
{
delete [] g_pRemainderBuffer;
SetClksPerSpkrSample();
g_nRemainderBufferSize = (UINT) g_fClksPerSpkrSample;
if ((double)g_nRemainderBufferSize != g_fClksPerSpkrSample)
g_nRemainderBufferSize++;
g_pRemainderBuffer = new short [g_nRemainderBufferSize];
memset(g_pRemainderBuffer, 0, g_nRemainderBufferSize);
g_nRemainderBufferIdx = 0;
}
//
// ----- ALL GLOBALLY ACCESSIBLE FUNCTIONS ARE BELOW THIS LINE -----
//
//=============================================================================
void SpkrDestroy ()
{
Spkr_DSUninit();
if(soundtype == SOUND_WAVE)
{
delete [] g_pSpeakerBuffer;
delete [] g_pStereoBuffer;
delete [] g_pRemainderBuffer;
g_pSpeakerBuffer = NULL;
g_pStereoBuffer = NULL;
g_pRemainderBuffer = NULL;
}
}
//=============================================================================
void SpkrInitialize ()
{
if(g_fh)
{
fprintf(g_fh, "Spkr Config: soundtype = %d ", (int)soundtype);
switch(soundtype)
{
case SOUND_NONE: fprintf(g_fh, "(NONE)\n"); break;
case SOUND_WAVE: fprintf(g_fh, "(WAVE)\n"); break;
default: fprintf(g_fh, "(UNDEFINED!)\n"); break;
}
}
if(g_bDisableDirectSound)
{
// SpeakerVoice.bMute = true;
}
else
{
//DSInit();
g_bSpkrAvailable = Spkr_DSInit();
}
if (soundtype == SOUND_WAVE)
{
InitRemainderBuffer();
// Buffer can hold a max of 1 seconds worth of samples
g_pSpeakerBuffer = new short [SPKR_SAMPLE_RATE];
g_pStereoBuffer = new short [SPKR_SAMPLE_RATE * 2]; // doubled for stereo
}
}
//=============================================================================
// NB. Called when /g_fCurrentCLK6502/ changes
void SpkrReinitialize ()
{
if (soundtype == SOUND_WAVE)
{
InitRemainderBuffer();
}
}
//=============================================================================
void SpkrReset()
{
g_nBufferIdx = 0;
g_nSpkrQuietCycleCount = 0;
g_bSpkrToggleFlag = false;
InitRemainderBuffer();
Spkr_SubmitWaveBuffer(NULL, 0);
Spkr_SetActive(false);
Spkr_Demute();
}
//=================2012 AD =========================================================
#if 0
BOOL SpkrSetEmulationType (DWORD newtype)
{
if (soundtype != SOUND_NONE)
SpkrDestroy();
soundtype = newtype;
if (soundtype != SOUND_NONE)
SpkrInitialize();
if (soundtype != newtype)
switch (newtype) { // some fault occured
case SOUND_WAVE:
/* MessageBox(window,
TEXT("The emulator is unable to initialize a waveform ")
TEXT("output device. Make sure you have a sound card ")
TEXT("and a driver installed and that windows is ")
TEXT("correctly configured to use the driver. Also ")
TEXT("ensure that no other program is currently using ")
TEXT("the device."),
TEXT("Configuration"),
MB_ICONEXCLAMATION | MB_SETFOREGROUND);*/
// Need to tuck SDL_GetError() hhere? ------------------------------------------
fprintf(stderr, "Unable to initialize a waveform output device.\n");
return 0;
}
return 1;
}
#endif
//=============================================================================
static void ReinitRemainderBuffer(UINT nCyclesRemaining)
{
if(nCyclesRemaining == 0)
return;
for(g_nRemainderBufferIdx=0; g_nRemainderBufferIdx<nCyclesRemaining; g_nRemainderBufferIdx++)
g_pRemainderBuffer[g_nRemainderBufferIdx] = g_nSpeakerData;
_ASSERT(g_nRemainderBufferIdx < g_nRemainderBufferSize);
}
static void UpdateRemainderBuffer(ULONG* pnCycleDiff)
{
if(g_nRemainderBufferIdx)
{
while((g_nRemainderBufferIdx < g_nRemainderBufferSize) && *pnCycleDiff)
{
g_pRemainderBuffer[g_nRemainderBufferIdx] = g_nSpeakerData;
g_nRemainderBufferIdx++;
(*pnCycleDiff)--;
}
if(g_nRemainderBufferIdx == g_nRemainderBufferSize)
{
g_nRemainderBufferIdx = 0;
signed long nSampleMean = 0;
for(UINT i=0; i<g_nRemainderBufferSize; i++)
nSampleMean += (signed long) g_pRemainderBuffer[i];
nSampleMean /= (signed long) g_nRemainderBufferSize;
if(g_nBufferIdx < SPKR_SAMPLE_RATE-1)
g_pSpeakerBuffer[g_nBufferIdx++] = (short) nSampleMean;
}
}
}
static void UpdateSpkr()
{
if(!g_bFullSpeed /*|| SoundCore_GetTimerState()*/)
{
ULONG nCycleDiff = (ULONG) (g_nCumulativeCycles - g_nSpkrLastCycle);
UpdateRemainderBuffer(&nCycleDiff);
ULONG nNumSamples = (ULONG) ((double)nCycleDiff / g_fClksPerSpkrSample);
ULONG nCyclesRemaining = (ULONG) ((double)nCycleDiff - (double)nNumSamples * g_fClksPerSpkrSample);
while((nNumSamples--) && (g_nBufferIdx < SPKR_SAMPLE_RATE-1))
g_pSpeakerBuffer[g_nBufferIdx++] = g_nSpeakerData;
ReinitRemainderBuffer(nCyclesRemaining); // Partially fill 1Mhz sample buffer
}
g_nSpkrLastCycle = g_nCumulativeCycles;
}
//=============================================================================
// Called by emulation code when Speaker I/O reg is accessed
BYTE SpkrToggle (WORD, WORD, BYTE, BYTE, ULONG nCyclesLeft)
{
g_bSpkrToggleFlag = true;
if(!g_bFullSpeed)
Spkr_SetActive(true);
needsprecision = cumulativecycles; // ?
// if (extbench)
// {
// DisplayBenchmarkResults();
// extbench = 0;
// }
if (soundtype == SOUND_WAVE)
{
CpuCalcCycles(nCyclesLeft);
UpdateSpkr();
g_nSpeakerData = ~g_nSpeakerData;
}
return MemReadFloatingBus(nCyclesLeft); // reading from $C030..$C03F retrurns unpredictable value?
}
//=============================================================================
// Called by ContinueExecution()
void SpkrUpdate (DWORD totalcycles)
{
if(!g_bSpkrToggleFlag)
{
if(!g_nSpkrQuietCycleCount)
{
g_nSpkrQuietCycleCount = g_nCumulativeCycles;
}
else if(g_nCumulativeCycles - g_nSpkrQuietCycleCount > (unsigned __int64)g_fCurrentCLK6502/5)
{
// After 0.2 sec of Apple time, deactivate spkr voice
// . This allows emulator to auto-switch to full-speed g_nAppMode for fast disk access
Spkr_SetActive(false);
}
}
else
{
g_nSpkrQuietCycleCount = 0;
g_bSpkrToggleFlag = false;
}
if (soundtype == SOUND_WAVE)
{
UpdateSpkr();
ULONG nSamplesUsed;
if(g_bFullSpeed) g_nBufferIdx = 0; // try this --bb
// nSamplesUsed = Spkr_SubmitWaveBuffer/*_FullSpeed*/(g_pSpeakerBuffer, g_nBufferIdx);
else {
nSamplesUsed = Spkr_SubmitWaveBuffer(g_pSpeakerBuffer, g_nBufferIdx);
_ASSERT(nSamplesUsed <= g_nBufferIdx);
if(nSamplesUsed == 0) return;
memmove(g_pSpeakerBuffer, &g_pSpeakerBuffer[nSamplesUsed], g_nBufferIdx-nSamplesUsed);
g_nBufferIdx -= nSamplesUsed;
}
}
}
//=============================================================================
//-----------------------------------------------------------------------------
static ULONG Spkr_SubmitWaveBuffer(short* pSpeakerBuffer, ULONG nNumSamples)
{
// submit nNumSamples (== 2bytes long each (sizeof short))??
// from pSpeakerBuffer to pDSSpkrBuf for callback DSPlaySnd
if(!g_bSpkrRecentlyActive) return nNumSamples;//if not active, just return?
if(pSpeakerBuffer == NULL)
{
// just init sound buffer and cursors??
return 0;
}
// conver mono Speakers sounds to stereo (mainly for Mockingboard support)
UINT len = nNumSamples * 2; // stereo = 2 * mono
UINT i;
for(i = 0; i < len; i += 2)
g_pStereoBuffer[i] = g_pStereoBuffer[i + 1] = pSpeakerBuffer[i >> 1];
// use code from OpenMSX
// DSUploadBuffer(pSpeakerBuffer, nNumSamples);
DSUploadBuffer(g_pStereoBuffer, len); // submit stereo wave data
return nNumSamples; // always return as if we've filled everything!? --bb
}
///////////// Mute - set volume to MINIMUM, Demute - set volume to NORMAL STATE? -bb
void Spkr_Mute()
{
SDL_PauseAudio(1); // dangerous functiouse - will mute Mockingboard, too. Need to be changed
}
void Spkr_Demute()
{
SDL_PauseAudio(0);
}
//-----------------------------------------------------------------------------
static void Spkr_SetActive(bool bActive)
{ // yes, I know the right way is: g_bSpkrRecentlyActive = bActive;, but... ^_^ --bb
if(bActive)
{
// Called by SpkrToggle() or SpkrReset()
g_bSpkrRecentlyActive = true;
}
else
{
// Called by SpkrUpdate() after 0.2s of speaker inactivity
g_bSpkrRecentlyActive = false;
}
}
bool Spkr_IsActive()
{
return g_bSpkrRecentlyActive;
}
//-----------------------------------------------------------------------------
// How to deal with volume in SDL Audio
// may be need to go to SDL Mixer?
DWORD SpkrGetVolume()
{
// return SpeakerVoice.dwUserVolume;
return 0;
}
void SpkrSetVolume(DWORD dwVolume, DWORD dwVolumeMax)
{
/* SpeakerVoice.dwUserVolume = dwVolume;
SpeakerVoice.nVolume = NewVolume(dwVolume, dwVolumeMax);
if(SpeakerVoice.bActive)
SpeakerVoice.lpDSBvoice->SetVolume(SpeakerVoice.nVolume);*/
}
//=============================================================================
bool Spkr_DSInit()
{
//
// Create single Apple speaker voice
//
if(!g_bDSAvailable)
return false; // do not have DirectSound? Sorry, SDL Audio! ^_^ --bb
return true;
}
void Spkr_DSUninit()
{
}
//=============================================================================
DWORD SpkrGetSnapshot(SS_IO_Speaker* pSS)
{
pSS->g_nSpkrLastCycle = g_nSpkrLastCycle;
return 0;
}
DWORD SpkrSetSnapshot(SS_IO_Speaker* pSS)
{
g_nSpkrLastCycle = pSS->g_nSpkrLastCycle;
return 0;
}

View File

@ -0,0 +1,36 @@
#pragma once
//
// For audio use only none or SDL_SOUND subsystem
#define SOUND_NONE 0
//#define SOUND_DIRECT 1
//#define SOUND_SMART 2
#define SOUND_WAVE 1
extern DWORD soundtype;
extern double g_fClksPerSpkrSample;
// needed for DSPlaySnd callback function
extern short * pDSSpkrBuf; // speaker data buffer (in size of g_dwDSSpkrBufferSize samples?
extern DWORD g_dwDSSpkrBufferSize; // size of Speakers audio buffer
extern UINT nDSSpkrWCur; // write cursor
extern UINT nDSSpkrRCur; // read cursor
void SpkrDestroy ();
void SpkrInitialize ();
void SpkrReinitialize ();
void SpkrReset();
//BOOL SpkrSetEmulationType (/*HWND,*/DWORD); -2012aD
void SpkrUpdate (DWORD);
//void SpkrUpdate_Timer();
DWORD SpkrGetVolume();
void SpkrSetVolume(DWORD dwVolume, DWORD dwVolumeMax);
void Spkr_Mute();
void Spkr_Demute();
bool Spkr_IsActive();
bool Spkr_DSInit();
void Spkr_DSUninit();
DWORD SpkrGetSnapshot(SS_IO_Speaker* pSS);
DWORD SpkrSetSnapshot(SS_IO_Speaker* pSS);
BYTE SpkrToggle (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);

279
linapple-pie/src/Structs.h Normal file
View File

@ -0,0 +1,279 @@
// Structs used by save-state file
// *** DON'T CHANGE ANY STRUCT WITHOUT CONSIDERING BACKWARDS COMPATIBILITY WITH .AWS FORMAT ***
#define MAKE_VERSION(a,b,c,d) ((a<<24) | (b<<16) | (c<<8) | (d))
#define AW_SS_TAG 'SSWA' // 'AWSS' = AppleWin SnapShot
typedef struct
{
DWORD dwTag; // "AWSS"
DWORD dwVersion;
DWORD dwChecksum;
} SS_FILE_HDR;
typedef struct
{
DWORD dwLength; // Byte length of this unit struct
DWORD dwVersion;
} SS_UNIT_HDR;
/////////////////////////////////////////////////////////////////////////////////
const UINT nMemMainSize = 64*1024;
const UINT nMemAuxSize = 64*1024;
typedef struct
{
BYTE A;
BYTE X;
BYTE Y;
BYTE P;
BYTE S;
USHORT PC;
unsigned __int64 g_nCumulativeCycles;
// IRQ = OR-sum of all interrupt sources
} SS_CPU6502;
const UINT uRecvBufferSize = 9;
typedef struct
{
DWORD baudrate;
BYTE bytesize;
BYTE commandbyte;
DWORD comminactivity; // If non-zero then COM port open
BYTE controlbyte;
BYTE parity;
BYTE recvbuffer[uRecvBufferSize];
DWORD recvbytes;
BYTE stopbits;
} SS_IO_Comms;
typedef struct
{
unsigned __int64 g_nJoyCntrResetCycle;
} SS_IO_Joystick;
typedef struct
{
DWORD keyboardqueries;
BYTE nLastKey;
} SS_IO_Keyboard;
//typedef struct
//{
//} SS_IO_Memory;
typedef struct
{
unsigned __int64 g_nSpkrLastCycle;
} SS_IO_Speaker;
typedef struct
{
bool bAltCharSet; // charoffs
DWORD dwVidMode;
} SS_IO_Video;
typedef struct
{
DWORD dwMemMode;
BOOL bLastWriteRam;
BYTE nMemMain[nMemMainSize];
BYTE nMemAux[nMemAuxSize];
} SS_BaseMemory;
typedef struct
{
SS_UNIT_HDR UnitHdr;
SS_CPU6502 CPU6502;
SS_IO_Comms Comms;
SS_IO_Joystick Joystick;
SS_IO_Keyboard Keyboard;
// SS_IO_Memory Memory;
SS_IO_Speaker Speaker;
SS_IO_Video Video;
SS_BaseMemory Memory;
} SS_APPLE2_Unit;
/////////////////////////////////////////////////////////////////////////////////
typedef struct
{
DWORD dwComputerEmulation;
bool bCustomSpeed;
DWORD dwEmulationSpeed;
bool bEnhancedDiskSpeed;
DWORD dwJoystickType[2];
bool bMockingboardEnabled;
DWORD dwMonochromeColor;
DWORD dwSerialPort;
DWORD dwSoundType; // Sound Emulation
DWORD dwVideoType; // Video Emulation
} SS_AW_CFG;
typedef struct
{
char StartingDir[MAX_PATH];
DWORD dwWindowXpos;
DWORD dwWindowYpos;
} SS_AW_PREFS;
typedef struct
{
SS_UNIT_HDR UnitHdr;
DWORD dwAppleWinVersion;
SS_AW_PREFS Prefs;
SS_AW_CFG Cfg;
} SS_APPLEWIN_CONFIG;
/////////////////////////////////////////////////////////////////////////////////
typedef struct
{
SS_UNIT_HDR UnitHdr;
DWORD dwType; // SS_CARDTYPE
DWORD dwSlot; // [1..7]
} SS_CARD_HDR;
enum SS_CARDTYPE
{
CT_Empty = 0,
CT_Disk2, // Apple Disk][
CT_SSC, // Apple Super Serial Card
CT_Mockingboard,
CT_GenericPrinter,
CT_GenericHDD, // Hard disk
CT_GenericClock,
CT_MouseInterface,
};
/////////////////////////////////////////////////////////////////////////////////
typedef struct
{
SS_CARD_HDR Hdr;
} SS_CARD_EMPTY;
/////////////////////////////////////////////////////////////////////////////////
const UINT NIBBLES_PER_TRACK = 0x1A00;
typedef struct
{
char szFileName[MAX_PATH];
int track;
int phase;
int byte;
BOOL writeprotected;
BOOL trackimagedata;
BOOL trackimagedirty;
DWORD spinning;
DWORD writelight;
int nibbles;
BYTE nTrack[NIBBLES_PER_TRACK];
} DISK2_Unit;
typedef struct
{
SS_CARD_HDR Hdr;
DISK2_Unit Unit[2];
WORD phases;
WORD currdrive;
BOOL diskaccessed;
BOOL enhancedisk;
BYTE floppylatch;
BOOL floppymotoron;
BOOL floppywritemode;
} SS_CARD_DISK2;
/////////////////////////////////////////////////////////////////////////////////
typedef struct
{
union
{
struct
{
BYTE l;
BYTE h;
};
USHORT w;
};
} IWORD;
typedef struct
{
BYTE ORB; // $00 - Port B
BYTE ORA; // $01 - Port A (with handshaking)
BYTE DDRB; // $02 - Data Direction Register B
BYTE DDRA; // $03 - Data Direction Register A
//
// $04 - Read counter (L) / Write latch (L)
// $05 - Read / Write & initiate count (H)
// $06 - Read / Write & latch (L)
// $07 - Read / Write & latch (H)
// $08 - Read counter (L) / Write latch (L)
// $09 - Read counter (H) / Write latch (H)
IWORD TIMER1_COUNTER;
IWORD TIMER1_LATCH;
IWORD TIMER2_COUNTER;
IWORD TIMER2_LATCH;
//
BYTE SERIAL_SHIFT; // $0A
BYTE ACR; // $0B - Auxiliary Control Register
BYTE PCR; // $0C - Peripheral Control Register
BYTE IFR; // $0D - Interrupt Flag Register
BYTE IER; // $0E - Interrupt Enable Register
BYTE ORA_NO_HS; // $0F - Port A (without handshaking)
} SY6522;
typedef struct
{
BYTE DurationPhonome;
BYTE Inflection; // I10..I3
BYTE RateInflection;
BYTE CtrlArtAmp;
BYTE FilterFreq;
//
BYTE CurrentMode; // b7:6=Mode; b0=D7 pin (for IRQ)
} SSI263A;
typedef struct
{
SY6522 RegsSY6522;
BYTE RegsAY8910[16];
SSI263A RegsSSI263;
BYTE nAYCurrentRegister;
bool bTimer1IrqPending;
bool bTimer2IrqPending;
bool bSpeechIrqPending;
} MB_Unit;
const UINT MB_UNITS_PER_CARD = 2;
typedef struct
{
SS_CARD_HDR Hdr;
MB_Unit Unit[MB_UNITS_PER_CARD];
} SS_CARD_MOCKINGBOARD;
/////////////////////////////////////////////////////////////////////////////////
typedef struct
{
SS_FILE_HDR Hdr;
SS_APPLE2_Unit Apple2Unit;
// SS_APPLEWIN_CONFIG AppleWinCfg;
SS_CARD_EMPTY Empty1; // Slot1
SS_CARD_EMPTY Empty2; // Slot2
SS_CARD_EMPTY Empty3; // Slot3
SS_CARD_MOCKINGBOARD Mockingboard1; // Slot4
SS_CARD_MOCKINGBOARD Mockingboard2; // Slot5
SS_CARD_DISK2 Disk2; // Slot6
SS_CARD_EMPTY Empty7; // Slot7
} APPLEWIN_SNAPSHOT;
/////////////////////////////////////////////////////////////////////////////////

237
linapple-pie/src/Timer.cpp Normal file
View File

@ -0,0 +1,237 @@
/*
AppleWin : An Apple //e emulator for Windows
Copyright (C) 1994-1996, Michael O'Brien
Copyright (C) 1999-2001, Oliver Schmidt
Copyright (C) 2002-2005, Tom Charlesworth
Copyright (C) 2006-2007, Tom Charlesworth, Michael Pohoreski
AppleWin 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.
AppleWin 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 AppleWin; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Description: Core sound related functionality
*
* Author: Tom Charlesworth
*/
/* Adaption for Linux+SDL done by beom beotiger. Peace! LLL */
// Timers like functions for Windows and Posix
// for usleep()
#include <unistd.h>
#include "stdafx.h"
#include "Timer.h"
#ifndef _WIN32
//for Timers try to use POSIX compliant timers
#include <signal.h>
#include <sys/time.h>
#endif
// for Assertion
#include <assert.h>
#ifndef _WIN32
//===============================================================================//
// Timer Functions - POSIX specific //
//=============================================================================//
// Vars
static bool g_bRefClockTimerActive = false;
static DWORD g_dwLastUsecPeriod = 0;
static bool g_bTimerToggle = false;
struct sigaction sa_SysClk;
struct itimerval mytimeset;
void SysClk_TickTimer(int signum)
{ // should occur every specified times per second
g_bTimerToggle = true; // just set the toggle flag, and leave peacefully? --bb
}
bool SysClk_InitTimer()
{// first initialization of the timer
/* memset(&sa_SysClk, 0, sizeof(sa_SysClk)); // clear sigaction struct
sa_SysClk.sa_handler = &SysClk_TickTimer;
sigaction(SIGALRM, &sa_SysClk, NULL); // set SIGALRM handler*/
if(signal(SIGALRM, SysClk_TickTimer) == SIG_ERR)
return false;
printf("Timer has been initted!\n");
return true;
}
void SysClk_UninitTimer()
{
SysClk_StopTimer();
// signal(SIGALRM, NULL);
}
void SysClk_WaitTimer()
{
// printf("Waiting timer...\n");
if(!g_bRefClockTimerActive)
return;
// pause() - better than that?
while(!g_bTimerToggle)
usleep(1); // do nothing is something doing also? 0_0 --bb
g_bTimerToggle = false;
// printf("Timer has been ticked!\n");
}
void SysClk_StartTimerUsec(DWORD dwUsecPeriod)
{
// starting timer during dwUsecPeriod in microseconds???
// printf("Timer started %d usec\n", dwUsecPeriod);
if(g_bRefClockTimerActive && (g_dwLastUsecPeriod == dwUsecPeriod))
return;
SysClk_StopTimer();
// to comply with Windows DirectShow REFERENCE_TIME, which is in units of 100 nanoseconds
mytimeset.it_interval.tv_sec = 0;
mytimeset.it_interval.tv_usec = dwUsecPeriod;// * 10 100;
mytimeset.it_value.tv_sec = 0;
mytimeset.it_value.tv_usec = dwUsecPeriod;// * 10 / 100;
if(setitimer(ITIMER_REAL, &mytimeset, NULL) != 0) {
fprintf(stderr, "Error creating timer (setitimer failed)\n");
_ASSERT(0);
return;
}
g_dwLastUsecPeriod = dwUsecPeriod;
g_bRefClockTimerActive = true;
}
void SysClk_StopTimer()
{
if(!g_bRefClockTimerActive)
return;
// Zero values just disables timers
mytimeset.it_interval.tv_sec = 0;
mytimeset.it_interval.tv_usec = 0;
mytimeset.it_value.tv_sec = 0;
mytimeset.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &mytimeset, NULL);
g_bTimerToggle = true;
g_bRefClockTimerActive = false;
}
#else
//===============================================================================//
// Timer Functions - WINDOWS specific //
//===============================================================================//
// Vars
static DWORD g_dwAdviseToken;
static IReferenceClock *g_pRefClock = NULL;
static HANDLE g_hSemaphore = NULL;
static bool g_bRefClockTimerActive = false;
static DWORD g_dwLastUsecPeriod = 0;
bool SysClk_InitTimer()
{
g_hSemaphore = CreateSemaphore(NULL, 0, 1, NULL); // Max count = 1
if (g_hSemaphore == NULL)
{
fprintf(stderr, "Error creating semaphore\n");
return false;
}
if (CoCreateInstance(CLSID_SystemClock, NULL, CLSCTX_INPROC,
IID_IReferenceClock, (LPVOID*)&g_pRefClock) != S_OK)
{
fprintf(stderr, "Error initialising COM\n");
return false; // Fails for Win95!
}
return true;
}
void SysClk_UninitTimer()
{
SysClk_StopTimer();
SAFE_RELEASE(g_pRefClock);
if (CloseHandle(g_hSemaphore) == 0)
fprintf(stderr, "Error closing semaphore handle\n");
}
//
void SysClk_WaitTimer()
{
if(!g_bRefClockTimerActive)
return;
WaitForSingleObject(g_hSemaphore, INFINITE);
}
void SysClk_StartTimerUsec(DWORD dwUsecPeriod)
{
if(g_bRefClockTimerActive && (g_dwLastUsecPeriod == dwUsecPeriod))
return;
SysClk_StopTimer();
REFERENCE_TIME rtPeriod = (REFERENCE_TIME) (dwUsecPeriod * 10); // In units of 100ns
REFERENCE_TIME rtNow;
HRESULT hr = g_pRefClock->GetTime(&rtNow);
// S_FALSE : Returned time is the same as the previous value
if ((hr != S_OK) && (hr != S_FALSE))
{
fprintf(stderr, "Error creating timer (GetTime failed)\n");
_ASSERT(0);
return;
}
if (g_pRefClock->AdvisePeriodic(rtNow, rtPeriod, g_hSemaphore, &g_dwAdviseToken) != S_OK)
{
fprintf(stderr, "Error creating timer (AdvisePeriodic failed)\n");
_ASSERT(0);
return;
}
g_dwLastUsecPeriod = dwUsecPeriod;
g_bRefClockTimerActive = true;
}
void SysClk_StopTimer()
{
if(!g_bRefClockTimerActive)
return;
if (g_pRefClock->Unadvise(g_dwAdviseToken) != S_OK)
{
fprintf(stderr, "Error deleting timer\n");
_ASSERT(0);
return;
}
g_bRefClockTimerActive = false;
}
#endif

7
linapple-pie/src/Timer.h Normal file
View File

@ -0,0 +1,7 @@
#pragma once
void SysClk_WaitTimer();
bool SysClk_InitTimer();
void SysClk_UninitTimer();
void SysClk_StartTimerUsec(DWORD dwUsecPeriod);
void SysClk_StopTimer();

View File

@ -0,0 +1,121 @@
#include "stdafx.h"
//#pragma hdrstop
// MemoryTextFile _________________________________________________________________________________
const int EOL_NULL = 0;
//===========================================================================
bool MemoryTextFile_t::Read( char *pFileName )
{
bool bStatus = false;
FILE *hFile = fopen( pFileName, "rt" );
if (hFile)
{
fseek( hFile, 0, SEEK_END );
long nSize = ftell( hFile );
fseek( hFile, 0, SEEK_SET );
m_vBuffer.reserve( nSize + 1 );
m_vBuffer.insert( m_vBuffer.begin(), nSize+1, 0 );
char *pBuffer = & m_vBuffer.at(0);
fread( (void*)pBuffer, nSize, 1, hFile );
m_vBuffer.push_back( EOL_NULL );
fclose(hFile);
m_bDirty = true;
GetLinePointers();
bStatus = true;
}
return bStatus;
}
//===========================================================================
void MemoryTextFile_t::GetLine( const int iLine, char *pLine, const int nMaxLineChars )
{
if (m_bDirty)
{
GetLinePointers();
}
ZeroMemory( pLine, nMaxLineChars );
strncpy( pLine, m_vLines[ iLine ], nMaxLineChars-1 );
}
// cr/new lines are converted into null, string terminators
//===========================================================================
void MemoryTextFile_t::GetLinePointers()
{
if (! m_bDirty)
return;
m_vLines.erase( m_vLines.begin(), m_vLines.end() );
char *pBegin = & m_vBuffer.at( 0 );
char *pLast = & m_vBuffer[ m_vBuffer.size() ];
char *pEnd = NULL;
char *pStartNextLine;
while (pBegin < pLast)
{
m_vLines.push_back( pBegin );
pEnd = const_cast<char*>( SkipUntilEOL( pBegin ));
if (*pEnd == EOL_NULL)
{
// Found EOL via null
pStartNextLine = pEnd + 1;
}
else
{
pStartNextLine = const_cast<char*>( EatEOL( pEnd ));
// DOS/Win "Text" mode converts LF CR (0D 0A) to CR (0D)
// but just in case, the file is read in binary.
int nEOL = pStartNextLine - pEnd;
while (nEOL-- > 1)
{
*pEnd++ = ' ';
}
// assert( pEnd != NULL );
*pEnd = EOL_NULL;
}
pBegin = pStartNextLine;
}
m_bDirty = false;
}
//===========================================================================
void MemoryTextFile_t::PushLine( char *pLine )
{
char *pSrc = pLine;
while (pSrc && *pSrc)
{
if (*pSrc == CHAR_CR)
m_vBuffer.push_back( EOL_NULL );
else
if (*pSrc == CHAR_LF)
m_vBuffer.push_back( EOL_NULL );
else
m_vBuffer.push_back( *pSrc );
pSrc++;
}
m_vBuffer.push_back( EOL_NULL );
m_bDirty = true;
}

View File

@ -0,0 +1,49 @@
#pragma once
// Memory Text File _________________________________________________________
class MemoryTextFile_t
{
vector<char > m_vBuffer;
vector<char *> m_vLines ; // array of pointers to start of lines
bool m_bDirty ; // line pointers not up-to-date
void GetLinePointers();
public:
MemoryTextFile_t()
// : m_nSize( 0 )
// , m_pBuffer( 0 )
// , m_nLines( 0 )
: m_bDirty( false )
{
m_vBuffer.reserve( 2048 );
m_vLines.reserve( 128 );
}
bool Read( TCHAR *pFileName );
void Reset()
{
m_vBuffer.erase( m_vBuffer.begin(), m_vBuffer.end() );
m_vLines.erase( m_vLines.begin(), m_vLines.end() );
}
inline int GetNumLines()
{
if (m_bDirty)
GetLinePointers();
return m_vLines.size();
}
inline char *GetLine( const int iLine ) const
{
return m_vLines.at( iLine );
}
void GetLine( const int iLine, char *pLine, const int n );
void PushLine( char *pLine );
};

2312
linapple-pie/src/Video.cpp Normal file

File diff suppressed because it is too large Load Diff

85
linapple-pie/src/Video.h Normal file
View File

@ -0,0 +1,85 @@
#pragma once
// Types ____________________________________________________________
enum VIDEOTYPE
{
VT_MONO_CUSTOM
, VT_COLOR_STANDARD
, VT_COLOR_TEXT_OPTIMIZED
, VT_COLOR_TVEMU
, VT_COLOR_HALF_SHIFT_DIM
, VT_MONO_AMBER
, VT_MONO_GREEN
, VT_MONO_WHITE
, VT_NUM_MODES
};
/*long*/
enum AppleFont_e
{
// 40-Column mode is 1x Zoom (default)
// 80-Column mode is ~0.75x Zoom (7 x 16)
// Tiny mode is 0.5 zoom (7x8) for debugger
APPLE_FONT_WIDTH = 14, // in pixels
APPLE_FONT_HEIGHT = 16, // in pixels
// Each cell has a reserved aligned pixel area (grid spacing)
APPLE_FONT_CELL_WIDTH = 16,
APPLE_FONT_CELL_HEIGHT = 16,
// The bitmap contains 3 regions
// Each region is 256x256 pixels = 16x16 chars
APPLE_FONT_X_REGIONSIZE = 256, // in pixelx
APPLE_FONT_Y_REGIONSIZE = 256, // in pixels
// Starting Y offsets (pixels) for the regions
APPLE_FONT_Y_APPLE_2PLUS = 0, // ][+
APPLE_FONT_Y_APPLE_80COL = 256, // //e (inc. Mouse Text)
APPLE_FONT_Y_APPLE_40COL = 512, // ][
};
// Globals __________________________________________________________
extern INT32 g_iStatusCycle; // cycler for status panel showing
extern BOOL g_ShowLeds; // if we should show drive leds
extern BOOL graphicsmode;
extern COLORREF monochrome;
extern DWORD videotype;
// Surfaces for drawing
//extern HBITMAP g_hLogoBitmap;
extern SDL_Surface *g_hLogoBitmap; // our Linux logo!
extern SDL_Surface *g_hStatusSurface; // status panel
extern SDL_Surface *g_hSourceBitmap;
extern SDL_Surface *g_hDeviceBitmap;
extern SDL_Surface * g_origscreen; // reserved for stretching
// Prototypes _______________________________________________________
void CreateColorMixMap();
BOOL VideoApparentlyDirty ();
void VideoBenchmark ();
void VideoCheckPage (BOOL);
void VideoChooseColor ();
void VideoDestroy ();
void VideoDrawLogoBitmap(/* HDC hDstDC */);
void VideoDisplayLogo ();
BOOL VideoHasRefreshed ();
void VideoInitialize ();
void VideoRealizePalette (/*HDC*/);
void VideoRedrawScreen ();
void VideoRefreshScreen ();
void VideoReinitialize ();
void VideoResetState ();
WORD VideoGetScannerAddress(bool* pbVblBar_OUT, const DWORD uExecutedCycles);
bool VideoGetVbl(DWORD uExecutedCycles);
void VideoUpdateVbl (DWORD dwCyclesThisFrame);
void VideoUpdateFlash();
bool VideoGetSW80COL();
DWORD VideoGetSnapshot(SS_IO_Video* pSS);
DWORD VideoSetSnapshot(SS_IO_Video* pSS);
BYTE VideoCheckMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE VideoCheckVbl (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);
BYTE VideoSetMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG nCyclesLeft);

View File

@ -0,0 +1,776 @@
/* XPM */
static char *charset40_xpm[] = {
/* columns rows colors chars-per-pixel */
"256 768 2 1",
" c #000000",
". c #FFFFFF",
/* pixels */
".... .... ...... ...... .. .... .... .... .. .... .. .. .. .. .... .. .. ...... .. .... .... .......... .. .. ...... .. .. .......... .. ...... .. .. ...... .. .... .... ",
".... ............ .......... .......... ........ ........ ...... ........ ...... ...... ........ ................ ...... ...... ...... .............. ...... ...... ...... ........ ......",
".. ...... ........ .. ........ ...... ...... ...... ...... ...... ...... .............. .............. .............. ...... .......... .................. ...... .... ........ .............. .. ...... ...... ...... ...... ....",
".. ...... ........ .. ........ ...... ...... ...... ...... ...... ...... .............. .............. .............. ...... .......... .................. ...... .... ........ .............. .. ...... ...... ...... ...... ....",
".. .. .. ...... ...... ...... ...... ...... .............. ...... ...... .............. .............. .............. ...... .......... .................. ...... .. .......... .............. .. .. ...... .... ...... ...... ....",
".. .. .. ...... ...... ...... ...... ...... .............. ...... ...... .............. .............. .............. ...... .......... .................. ...... .. .......... .............. .. .. ...... .... ...... ...... ....",
".. .. ...... ...... ...... ........ .............. ...... ...... ........ ........ .............. .......... .................. ...... ............ .............. .. .. ...... .. .. ...... ...... ....",
".. .. ...... ...... ...... ........ .............. ...... ...... ........ ........ .............. .......... .................. ...... ............ .............. .. .. ...... .. .. ...... ...... ....",
".. .. ........ ...... ...... ...... .............. ...... ...... .............. .............. .... ...... ...... .......... .................. ...... .. .......... .............. ...... ...... .... ...... ...... ....",
".. .. ........ ...... ...... ...... .............. ...... ...... .............. .............. .... ...... ...... .......... .................. ...... .. .......... .............. ...... ...... .... ...... ...... ....",
".. .............. ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. ...... ...... ...... .......... .......... ...... ...... .... ........ .............. ...... ...... ...... ...... ...... ....",
".. .............. ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. ...... ...... ...... .......... .......... ...... ...... .... ........ .............. ...... ...... ...... ...... ...... ....",
".... ...... ...... ...... .......... ........ ........ ...... ................ ...... ...... ........ .......... ........ ...... ...... ...... ...... ...... ...... ........ ......",
".... .. .. ...... .. .. .... .... .... .. .... .. .. .. .......... .... .. .. ...... .. .... .... .... .... .. ...... .. .. .. .. ...... .. .. ...... .. .... .... ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".. .... .... .... .. .... .... .... .. .. .. ...... .. .. ...... .. .. ...... .. .. ...... .. .. ...... .. .. .. .. .. .............. .. .. .............. .............. ",
".. .......... ........ .......... ........ ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...................... ....................................",
".. ...... ...... ...... ...... ...... ...... ...... .......... .......... ...... ...... ...... ...... ...... ...... ...... ...... ...... .............. ...... ............ .................... ....................................",
".. ...... ...... ...... ...... ...... ...... ...... .......... .......... ...... ...... ...... ...... ...... ...... ...... ...... ...... .............. ...... ............ .................... ....................................",
".. ...... ...... ...... ...... ...... ...... .................. .......... ...... ...... ...... ...... ...... ........ .. .......... .. .............. ........ .............. .................. .......... ........................",
".. ...... ...... ...... ...... ...... ...... .................. .......... ...... ...... ...... ...... ...... ........ .. .......... .. .............. ........ .............. .................. .......... ........................",
".. ........ ...... ...... .......... ............ .......... ...... ...... ...... ...... .. .. .......... .............. .............. .......... ................ ................ ........ .. ......................",
".. ........ ...... ...... .......... ............ .......... ...... ...... ...... ...... .. .. .......... .............. .............. .......... ................ ................ ........ .. ......................",
".. .............. .. .. ...... .. .................. .......... .......... ...... ...... ...... ...... .. .. ........ .. ............ ............ ............ .................. .............. ...... ...... ....................",
".. .............. .. .. ...... .. .................. .......... .......... ...... ...... ...... ...... .. .. ........ .. ............ ............ ............ .................. .............. ...... ...... ....................",
".. .............. .... ........ .... ........ ...... .......... .......... ...... ........ .. ........ .. ...... ...... .......... .......... .............. .................... ............ ....................................",
".. .............. .... ........ .... ........ ...... .......... .......... ...... ........ .. ........ .. ...... ...... .......... .......... .............. .................... ............ ....................................",
".. ................ .. ...... ...... ........ ............ ............ ............ .......... ...... ...... ...... .......... .......... ...... ...................... ....................................",
".. .......... .... .. .. .. ...... .. .... .... ...... ...... .... .... ...... ...... .. ...... .. .. ...... .. ...... ...... .. .. .. .. .............. .. .. .............. .............. ",
"................................................................................................................................................................................................................................................ ..",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".............. ...... ...... .... .. .... .... .. .... ...... ...... .. ........ .... ........ ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. .............. .............. .............. ",
"...................... ............ .. .......... .. ............ .......... .............. ................ .............. .............. .............. ........................................................................................",
"...................... ............ .. .......... .. .......... ...... .... ...... .. .............. ............ .................. ........ .. .. .......... .................................................................. ....",
"...................... ............ .. .......... .. .......... ...... .... ...... .. .............. ............ .................. ........ .. .. .......... .................................................................. ....",
"...................... ............ .. ........ ...... .. ................ ........ .. .............. .......... ...................... ........ ............ ................................................................ ......",
"...................... ............ .. ........ ...... .. ................ ........ .. .............. .......... ...................... ........ ............ ................................................................ ......",
"...................... ............................ .. .......... ............ ............ ............................ ...................... .......... .......... ...................... .......................... ........",
"...................... ............................ .. .......... ............ ............ ............................ ...................... .......... .......... ...................... .......................... ........",
"...................... .......................... .......... .. ........ ............ .. .. ...................... ...................... ........ ............ .............. ............................................ ..........",
"...................... .......................... .......... .. ........ ............ .. .. ...................... ...................... ........ ............ .............. ............................................ ..........",
".................................................... .. ........ ........ .... ...... .... .......................... .................. ........ .. .. .......... .............. .......................................... ............",
".................................................... .. ........ ........ .... ...... .... .......................... .................. ........ .. .. .......... .............. .......................................... ............",
"...................... ............................ .. ............ ................ ........ .. .......................... .............. .............. ............................ ................................ ........................",
".............. ...... ...... .............. .... .. .... ...... ...... ........ .. .... .. .. .............. ...... ...... ...... ...... ...... ...... .............. .... ........ .............. ...... ...... .............. ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".... .... ...... ...... .... .... .. .. ........ .... .. .. ...... .. .. .. .... .... .... .... .............. .............. ........ .... .............. .... ........ .... .... ",
".... ............ ............ ........ ............ ........ .......... ...... ........ .......... .............................................. .......................... .............. ......",
".. ...... ........ .......... ...... .............. .......... ........ ................ .................... ...... ...... ...... ...... .......................................... .............................. .......... ...... ....",
".. ...... ........ .......... ...... .............. .......... ........ ................ .................... ...... ...... ...... ...... .......................................... .............................. .......... ...... ....",
".. .... .......... .................. ............ .......... .. ........ ........ .................... ........ ...... ...... ...... .......... .............. ............ ............ ............ .............. ......",
".. .... .......... .................. ............ .......... .. ........ ........ .................... ........ ...... ...... ...... .......... .............. ............ ............ ............ .............. ......",
".. .. .. .......... .............. ............ ........ .... ................ ...... ............ ............ .......... ...................................... ...................................... .......... ........",
".. .. .. .......... .............. ............ ........ .... ................ ...... ............ ............ .......... ...................................... ...................................... .......... ........",
".. .... .......... ............ .................... ...... .............. ...... ...... ........ ............ ...... .............. .......... .............. ............ ............ ............ ............ ........",
".. .... .......... ............ .................... ...... .............. ...... ...... ........ ............ ...... .............. .......... .............. ............ ............ ............ ............ ........",
".. ...... .......... .......... .............. ...... ............ ........ ...... ...... ...... ........ ............ ...... ............ ............................ .............. .............................. ........................",
".. ...... .......... .......... .............. ...... ............ ........ ...... ...... ...... ........ ............ ...... ............ ............................ .............. .............................. ........................",
".... .......... ........ ........ .............. .......... .......... .......... .............. ........ ............................ .................. .......................... ................ ........",
".... .... .... .... .. .. .... .... ........ .... .... .... .... .... .... ........ .... .... .. ...... .............. .... ........ ........ .... .............. .... ........ ...... ...... ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".... .... ...... ...... .. .... .... .... .. .... .. .. .. .. .... .. .. ...... .. .... .... .......... .. .. ...... .. .. .......... .. ...... .. .. ...... .. .... .... ",
".... ............ .......... .......... ........ ........ ...... ........ ...... ...... ........ ................ ...... ...... ...... .............. ...... ...... ...... ........ ......",
".. ...... ........ .. ........ ...... ...... ...... ...... ...... ...... .............. .............. .............. ...... .......... .................. ...... .... ........ .............. .. ...... ...... ...... ...... ....",
".. ...... ........ .. ........ ...... ...... ...... ...... ...... ...... .............. .............. .............. ...... .......... .................. ...... .... ........ .............. .. ...... ...... ...... ...... ....",
".. .. .. ...... ...... ...... ...... ...... .............. ...... ...... .............. .............. .............. ...... .......... .................. ...... .. .......... .............. .. .. ...... .... ...... ...... ....",
".. .. .. ...... ...... ...... ...... ...... .............. ...... ...... .............. .............. .............. ...... .......... .................. ...... .. .......... .............. .. .. ...... .... ...... ...... ....",
".. .. ...... ...... ...... ........ .............. ...... ...... ........ ........ .............. .......... .................. ...... ............ .............. .. .. ...... .. .. ...... ...... ....",
".. .. ...... ...... ...... ........ .............. ...... ...... ........ ........ .............. .......... .................. ...... ............ .............. .. .. ...... .. .. ...... ...... ....",
".. .. ........ ...... ...... ...... .............. ...... ...... .............. .............. .... ...... ...... .......... .................. ...... .. .......... .............. ...... ...... .... ...... ...... ....",
".. .. ........ ...... ...... ...... .............. ...... ...... .............. .............. .... ...... ...... .......... .................. ...... .. .......... .............. ...... ...... .... ...... ...... ....",
".. .............. ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. ...... ...... ...... .......... .......... ...... ...... .... ........ .............. ...... ...... ...... ...... ...... ....",
".. .............. ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. ...... ...... ...... .......... .......... ...... ...... .... ........ .............. ...... ...... ...... ...... ...... ....",
".... ...... ...... ...... .......... ........ ........ ...... ................ ...... ...... ........ .......... ........ ...... ...... ...... ...... ...... ...... ........ ......",
".... .. .. ...... .. .. .... .... .... .. .... .. .. .. .......... .... .. .. ...... .. .... .... .... .... .. ...... .. .. .. .. ...... .. .. ...... .. .... .... ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".. .... .... .... .. .... .... .... .. .. .. ...... .. .. ...... .. .. ...... .. .. ...... .. .. ...... .. .. .. .. .. .............. .. .. .............. .............. ",
".. .......... ........ .......... ........ ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...................... ....................................",
".. ...... ...... ...... ...... ...... ...... ...... .......... .......... ...... ...... ...... ...... ...... ...... ...... ...... ...... .............. ...... ............ .................... ....................................",
".. ...... ...... ...... ...... ...... ...... ...... .......... .......... ...... ...... ...... ...... ...... ...... ...... ...... ...... .............. ...... ............ .................... ....................................",
".. ...... ...... ...... ...... ...... ...... .................. .......... ...... ...... ...... ...... ...... ........ .. .......... .. .............. ........ .............. .................. .......... ........................",
".. ...... ...... ...... ...... ...... ...... .................. .......... ...... ...... ...... ...... ...... ........ .. .......... .. .............. ........ .............. .................. .......... ........................",
".. ........ ...... ...... .......... ............ .......... ...... ...... ...... ...... .. .. .......... .............. .............. .......... ................ ................ ........ .. ......................",
".. ........ ...... ...... .......... ............ .......... ...... ...... ...... ...... .. .. .......... .............. .............. .......... ................ ................ ........ .. ......................",
".. .............. .. .. ...... .. .................. .......... .......... ...... ...... ...... ...... .. .. ........ .. ............ ............ ............ .................. .............. ...... ...... ....................",
".. .............. .. .. ...... .. .................. .......... .......... ...... ...... ...... ...... .. .. ........ .. ............ ............ ............ .................. .............. ...... ...... ....................",
".. .............. .... ........ .... ........ ...... .......... .......... ...... ........ .. ........ .. ...... ...... .......... .......... .............. .................... ............ ....................................",
".. .............. .... ........ .... ........ ...... .......... .......... ...... ........ .. ........ .. ...... ...... .......... .......... .............. .................... ............ ....................................",
".. ................ .. ...... ...... ........ ............ ............ ............ .......... ...... ...... ...... .......... .......... ...... ...................... ....................................",
".. .......... .... .. .. .. ...... .. .... .... ...... ...... .... .... ...... ...... .. ...... .. .. ...... .. ...... ...... .. .. .. .. .............. .. .. .............. .............. ",
"................................................................................................................................................................................................................................................ ..",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".............. ...... ...... .... .. .... .... .. .... ...... ...... .. ........ .... ........ ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. .............. .............. .............. ",
"...................... ............ .. .......... .. ............ .......... .............. ................ .............. .............. .............. ........................................................................................",
"...................... ............ .. .......... .. .......... ...... .... ...... .. .............. ............ .................. ........ .. .. .......... .................................................................. ....",
"...................... ............ .. .......... .. .......... ...... .... ...... .. .............. ............ .................. ........ .. .. .......... .................................................................. ....",
"...................... ............ .. ........ ...... .. ................ ........ .. .............. .......... ...................... ........ ............ ................................................................ ......",
"...................... ............ .. ........ ...... .. ................ ........ .. .............. .......... ...................... ........ ............ ................................................................ ......",
"...................... ............................ .. .......... ............ ............ ............................ ...................... .......... .......... ...................... .......................... ........",
"...................... ............................ .. .......... ............ ............ ............................ ...................... .......... .......... ...................... .......................... ........",
"...................... .......................... .......... .. ........ ............ .. .. ...................... ...................... ........ ............ .............. ............................................ ..........",
"...................... .......................... .......... .. ........ ............ .. .. ...................... ...................... ........ ............ .............. ............................................ ..........",
".................................................... .. ........ ........ .... ...... .... .......................... .................. ........ .. .. .......... .............. .......................................... ............",
".................................................... .. ........ ........ .... ...... .... .......................... .................. ........ .. .. .......... .............. .......................................... ............",
"...................... ............................ .. ............ ................ ........ .. .......................... .............. .............. ............................ ................................ ........................",
".............. ...... ...... .............. .... .. .... ...... ...... ........ .. .... .. .. .............. ...... ...... ...... ...... ...... ...... .............. .... ........ .............. ...... ...... .............. ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".... .... ...... ...... .... .... .. .. ........ .... .. .. ...... .. .. .. .... .... .... .... .............. .............. ........ .... .............. .... ........ .... .... ",
".... ............ ............ ........ ............ ........ .......... ...... ........ .......... .............................................. .......................... .............. ......",
".. ...... ........ .......... ...... .............. .......... ........ ................ .................... ...... ...... ...... ...... .......................................... .............................. .......... ...... ....",
".. ...... ........ .......... ...... .............. .......... ........ ................ .................... ...... ...... ...... ...... .......................................... .............................. .......... ...... ....",
".. .... .......... .................. ............ .......... .. ........ ........ .................... ........ ...... ...... ...... .......... .............. ............ ............ ............ .............. ......",
".. .... .......... .................. ............ .......... .. ........ ........ .................... ........ ...... ...... ...... .......... .............. ............ ............ ............ .............. ......",
".. .. .. .......... .............. ............ ........ .... ................ ...... ............ ............ .......... ...................................... ...................................... .......... ........",
".. .. .. .......... .............. ............ ........ .... ................ ...... ............ ............ .......... ...................................... ...................................... .......... ........",
".. .... .......... ............ .................... ...... .............. ...... ...... ........ ............ ...... .............. .......... .............. ............ ............ ............ ............ ........",
".. .... .......... ............ .................... ...... .............. ...... ...... ........ ............ ...... .............. .......... .............. ............ ............ ............ ............ ........",
".. ...... .......... .......... .............. ...... ............ ........ ...... ...... ...... ........ ............ ...... ............ ............................ .............. .............................. ........................",
".. ...... .......... .......... .............. ...... ............ ........ ...... ...... ...... ........ ............ ...... ............ ............................ .............. .............................. ........................",
".... .......... ........ ........ .............. .......... .......... .......... .............. ........ ............................ .................. .......................... ................ ........",
".... .... .... .... .. .. .... .... ........ .... .... .... .... .... .... ........ .... .... .. ...... .............. .... ........ ........ .... .............. .... ........ ...... ...... ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
" ...... .. .. .. ........ .. ...... .. ........ .. .......... .. .......... .. ........ .. .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .. .. .. ...... ..",
" ...... .. ........ ...... ........ .......... .......... ........ .. .. ...... .. .. .. .. .. .. .. .. ...... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ........ .. .. ........ ...... ........ .......... .. ........ .. .. ...... ...... .. .. .......... .. .. .. .. ...... ",
" ........ .. .. .. .. ........ .. ...... .. ........ .. .......... .. .. .. ........ .. .. .. .. ...... .. ...... .. .. .. .. .......... .. .. .. .. .. .. .. ...... ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ........ .. ...... .. ........ .. ...... .. .......... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. ..",
" ........ ...... ........ ...... .......... .. .. .. .. .. .. .. .. .. .. .......... .......... .......... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .... .. .. .. ...... .. ...... .. .. .. .. .. .. .......... .......... .......... ",
" .. .. .... .. .. .. .. .. ...... .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. ..",
" .............. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..................",
" .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" .. .. .. .. .. .. .... .. .. .. .. .. ",
" .. .. .. .. .. ........ .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. ........ .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .......... .. .. .. .. .. .. .. .. ...... .. .. ",
" .. .. .. .......... .. .. .. .. .. .. .. .. ...... .. .. ",
" .. .. .. ...... .. .. .. .. .. .......... .......... .. ",
" .. .. .. ...... .. .. .. .. .. .......... .......... .. ",
" .. .......... .. .. .. .. .. .. .. .. ...... .. .. .. ",
" .. .......... .. .. .. .. .. .. .. .. ...... .. .. .. ",
" .. .. ........ .. .... .. .. .. .. .. .. .. .. .. .. ",
" .. .. ........ .. .... .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .... .... .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .... .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ...... .. .. .. ...... .. .......... .. .. .. .......... .. ...... .. .......... .. ...... .. ...... .. .. .. .. .. .. .. .. ...... ..",
" ...... .. ...... .......... .. .......... ...... .......... ...... ...... .. .. ...... ",
" .. .. .... .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .... .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .... .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .... .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .. .. .. .... .... .. .. .. ........ .. ...... ........ .. .. .. ",
" .. .. .. .. .... .... .. .. .. ........ .. ...... ........ .. .. .. ",
" .... .. .. .. .. .......... .. .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .... .. .. .. .. .......... .. .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ...... ...... .......... ...... .. ...... ...... .. ...... ...... .. .. .. .. ",
" ...... .. ...... .. .......... .. ...... .. .. .. ...... .. ...... .. .. .. ...... .. ...... .. .. .. .. .. .. .. .. .. .. ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ...... .. .. .. ........ .. ...... .. ........ .. .......... .. .......... .. ........ .. .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .. .. .. ...... ..",
" ...... .. ........ ...... ........ .......... .......... ........ .. .. ...... .. .. .. .. .. .. .. .. ...... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ........ .. .. ........ ...... ........ .......... .. ........ .. .. ...... ...... .. .. .......... .. .. .. .. ...... ",
" ........ .. .. .. .. ........ .. ...... .. ........ .. .......... .. .. .. ........ .. .. .. .. ...... .. ...... .. .. .. .. .......... .. .. .. .. .. .. .. ...... ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ........ .. ...... .. ........ .. ...... .. .......... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. ..",
" ........ ...... ........ ...... .......... .. .. .. .. .. .. .. .. .. .. .......... .......... .......... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .... .. .. .. ...... .. ...... .. .. .. .. .. .. .......... .......... .......... ",
" .. .. .... .. .. .. .. .. ...... .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. ..",
" .............. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..................",
" .. .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. .. ..",
" .. .. .. .... .. .. .. .. .... ",
" .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. ",
" .. ...... ........ ........ ........ ...... .. ...... ........ .... .... .. .. .. .... .... ........ ...... ",
" .. ...... ........ ........ ........ ...... .. ...... ........ .... .... .. .. .. .... .... ........ ...... ",
" .. .. .. .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ........ .. .. .. .. .. .......... .. .. .. .. .. .. .. ...... .. .. .. .. .. .. .. .. ",
" ........ .. .. .. .. .. .......... .. .. .. .. .. .. .. ...... .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ........ ........ ........ ........ ........ .. .. .. .. ...... .. .. .. .. ...... .. .. .. .. ...... ",
" .. ........ .. ........ .. ........ .. ........ .. ........ .. .. .. .. .. .. .. .. ...... .. .. .. .. .. .. .. ...... .. .. .. .. .. .. .. ...... ..",
" ...... .... ",
" .. .. .. .. .. .. .. ...... .. .. .. .... .. .. .. .. .. ..",
" .. .. .. .. .. .. .. .. .. .. .. ...... .. .. .. ...... .. .... .. .. ..",
" ...... .. ...... .... .. ",
" .. .... .. .... .. .... .. .. .. ",
" .. .... .. .... .. .... .. .. .. ",
" ........ ........ .. ...... ........ ........ .. .. .. .. .. .. .. .. .. .. .......... .... .. .... .. .. ",
" ........ ........ .. ...... ........ ........ .. .. .. .. .. .. .. .. .. .. .......... .... .. .... .. .. ",
" .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. .. ",
" .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. .. ",
" .. .. .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" ........ ........ .. .. .. .. .. .... .. .. .. .. .. .. .. ........ .. .... .. .... .. .. .. ",
" ........ ........ .. .. .. .. .. .... .. .. .. .. .. .. .. ........ .. .... .. .... .. .. .. ",
" .. .. .. ........ .... .... .. .. .... .... .. .. .. .......... ...... .. ...... ",
" .. .. .. .. .. .. ........ .. .... .. .... .. .. .. .. .... .... .. .. .. .. .. .. .......... .. ...... .. .. .. ...... .. .. ..",
" .. .. ...... .. ",
" .. .. .. .. .. .. .. .. .. .. ...... .. .. .. .. .. .. .. ..",
".... .... ...... ...... .. .... .... .... .. .... .. .. .. .. .... .. .. ...... .. .... .... .......... .. .. ...... .. .. .......... .. ...... .. .. ...... .. .... .... ",
".... ............ .......... .......... ........ ........ ...... ........ ...... ...... ........ ................ ...... ...... ...... .............. ...... ...... ...... ........ ......",
".. ...... ........ .. ........ ...... ...... ...... ...... ...... ...... .............. .............. .............. ...... .......... .................. ...... .... ........ .............. .. ...... ...... ...... ...... ....",
".. ...... ........ .. ........ ...... ...... ...... ...... ...... ...... .............. .............. .............. ...... .......... .................. ...... .... ........ .............. .. ...... ...... ...... ...... ....",
".. .. .. ...... ...... ...... ...... ...... .............. ...... ...... .............. .............. .............. ...... .......... .................. ...... .. .......... .............. .. .. ...... .... ...... ...... ....",
".. .. .. ...... ...... ...... ...... ...... .............. ...... ...... .............. .............. .............. ...... .......... .................. ...... .. .......... .............. .. .. ...... .... ...... ...... ....",
".. .. ...... ...... ...... ........ .............. ...... ...... ........ ........ .............. .......... .................. ...... ............ .............. .. .. ...... .. .. ...... ...... ....",
".. .. ...... ...... ...... ........ .............. ...... ...... ........ ........ .............. .......... .................. ...... ............ .............. .. .. ...... .. .. ...... ...... ....",
".. .. ........ ...... ...... ...... .............. ...... ...... .............. .............. .... ...... ...... .......... .................. ...... .. .......... .............. ...... ...... .... ...... ...... ....",
".. .. ........ ...... ...... ...... .............. ...... ...... .............. .............. .... ...... ...... .......... .................. ...... .. .......... .............. ...... ...... .... ...... ...... ....",
".. .............. ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. ...... ...... ...... .......... .......... ...... ...... .... ........ .............. ...... ...... ...... ...... ...... ....",
".. .............. ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. ...... ...... ...... .......... .......... ...... ...... .... ........ .............. ...... ...... ...... ...... ...... ....",
".... ...... ...... ...... .......... ........ ........ ...... ................ ...... ...... ........ .......... ........ ...... ...... ...... ...... ...... ...... ........ ......",
".... .. .. ...... .. .. .... .... .... .. .... .. .. .. .......... .... .. .. ...... .. .... .... .... .... .. ...... .. .. .. .. ...... .. .. ...... .. .... .... ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".. .... .... .... .. .... .... .... .. .. .. ...... .. .. ...... .. .. ...... .. .. ...... .. .. ...... .. .. .. .. .. .............. .. .. .............. .............. ",
".. .......... ........ .......... ........ ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...................... ....................................",
".. ...... ...... ...... ...... ...... ...... ...... .......... .......... ...... ...... ...... ...... ...... ...... ...... ...... ...... .............. ...... ............ .................... ....................................",
".. ...... ...... ...... ...... ...... ...... ...... .......... .......... ...... ...... ...... ...... ...... ...... ...... ...... ...... .............. ...... ............ .................... ....................................",
".. ...... ...... ...... ...... ...... ...... .................. .......... ...... ...... ...... ...... ...... ........ .. .......... .. .............. ........ .............. .................. .......... ........................",
".. ...... ...... ...... ...... ...... ...... .................. .......... ...... ...... ...... ...... ...... ........ .. .......... .. .............. ........ .............. .................. .......... ........................",
".. ........ ...... ...... .......... ............ .......... ...... ...... ...... ...... .. .. .......... .............. .............. .......... ................ ................ ........ .. ......................",
".. ........ ...... ...... .......... ............ .......... ...... ...... ...... ...... .. .. .......... .............. .............. .......... ................ ................ ........ .. ......................",
".. .............. .. .. ...... .. .................. .......... .......... ...... ...... ...... ...... .. .. ........ .. ............ ............ ............ .................. .............. ...... ...... ....................",
".. .............. .. .. ...... .. .................. .......... .......... ...... ...... ...... ...... .. .. ........ .. ............ ............ ............ .................. .............. ...... ...... ....................",
".. .............. .... ........ .... ........ ...... .......... .......... ...... ........ .. ........ .. ...... ...... .......... .......... .............. .................... ............ ....................................",
".. .............. .... ........ .... ........ ...... .......... .......... ...... ........ .. ........ .. ...... ...... .......... .......... .............. .................... ............ ....................................",
".. ................ .. ...... ...... ........ ............ ............ ............ .......... ...... ...... ...... .......... .......... ...... ...................... ....................................",
".. .......... .... .. .. .. ...... .. .... .... ...... ...... .... .... ...... ...... .. ...... .. .. ...... .. ...... ...... .. .. .. .. .............. .. .. .............. .............. ",
"................................................................................................................................................................................................................................................ ..",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".............. ...... ...... .... .. .... .... .. .... ...... ...... .. ........ .... ........ ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. .............. .............. .............. ",
"...................... ............ .. .......... .. ............ .......... .............. ................ .............. .............. .............. ........................................................................................",
"...................... ............ .. .......... .. .......... ...... .... ...... .. .............. ............ .................. ........ .. .. .......... .................................................................. ....",
"...................... ............ .. .......... .. .......... ...... .... ...... .. .............. ............ .................. ........ .. .. .......... .................................................................. ....",
"...................... ............ .. ........ ...... .. ................ ........ .. .............. .......... ...................... ........ ............ ................................................................ ......",
"...................... ............ .. ........ ...... .. ................ ........ .. .............. .......... ...................... ........ ............ ................................................................ ......",
"...................... ............................ .. .......... ............ ............ ............................ ...................... .......... .......... ...................... .......................... ........",
"...................... ............................ .. .......... ............ ............ ............................ ...................... .......... .......... ...................... .......................... ........",
"...................... .......................... .......... .. ........ ............ .. .. ...................... ...................... ........ ............ .............. ............................................ ..........",
"...................... .......................... .......... .. ........ ............ .. .. ...................... ...................... ........ ............ .............. ............................................ ..........",
".................................................... .. ........ ........ .... ...... .... .......................... .................. ........ .. .. .......... .............. .......................................... ............",
".................................................... .. ........ ........ .... ...... .... .......................... .................. ........ .. .. .......... .............. .......................................... ............",
"...................... ............................ .. ............ ................ ........ .. .......................... .............. .............. ............................ ................................ ........................",
".............. ...... ...... .............. .... .. .... ...... ...... ........ .. .... .. .. .............. ...... ...... ...... ...... ...... ...... .............. .... ........ .............. ...... ...... .............. ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".... .... ...... ...... .... .... .. .. ........ .... .. .. ...... .. .. .. .... .... .... .... .............. .............. ........ .... .............. .... ........ .... .... ",
".... ............ ............ ........ ............ ........ .......... ...... ........ .......... .............................................. .......................... .............. ......",
".. ...... ........ .......... ...... .............. .......... ........ ................ .................... ...... ...... ...... ...... .......................................... .............................. .......... ...... ....",
".. ...... ........ .......... ...... .............. .......... ........ ................ .................... ...... ...... ...... ...... .......................................... .............................. .......... ...... ....",
".. .... .......... .................. ............ .......... .. ........ ........ .................... ........ ...... ...... ...... .......... .............. ............ ............ ............ .............. ......",
".. .... .......... .................. ............ .......... .. ........ ........ .................... ........ ...... ...... ...... .......... .............. ............ ............ ............ .............. ......",
".. .. .. .......... .............. ............ ........ .... ................ ...... ............ ............ .......... ...................................... ...................................... .......... ........",
".. .. .. .......... .............. ............ ........ .... ................ ...... ............ ............ .......... ...................................... ...................................... .......... ........",
".. .... .......... ............ .................... ...... .............. ...... ...... ........ ............ ...... .............. .......... .............. ............ ............ ............ ............ ........",
".. .... .......... ............ .................... ...... .............. ...... ...... ........ ............ ...... .............. .......... .............. ............ ............ ............ ............ ........",
".. ...... .......... .......... .............. ...... ............ ........ ...... ...... ...... ........ ............ ...... ............ ............................ .............. .............................. ........................",
".. ...... .......... .......... .............. ...... ............ ........ ...... ...... ...... ........ ............ ...... ............ ............................ .............. .............................. ........................",
".... .......... ........ ........ .............. .......... .......... .......... .............. ........ ............................ .................. .......................... ................ ........",
".... .... .... .... .. .. .... .... ........ .... .... .... .... .... .... ........ .... .... .. ...... .............. .... ........ ........ .... .............. .... ........ ...... ...... ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
" .. .. .. .. .................. .................. ........ .. .. .. .. .. .. .. .................. ................ ...... .. ..",
" .. .. .............. .............. ...... .. .. .. .............. .. ............ .... .. ",
" .. .. .. .. .. ............ .... .... .. .. ...... .. ............ .... ",
" .. .. .. .. .. ............ .... .... .. .. ...... .. ............ .... ",
" .... .... .... .... .. .. .. .. .......... .. ............ ...... .. .. .. .. .. .. ............ ...... ",
" .... .... .... .... .. .. .. .. .......... .. ............ ...... .. .. .. .. .. .. ............ ...... ",
".............. .. .. .... .. .. .. .... .... .. .... .............. .. .. .. .. .. .. ............ ............ ",
".............. .. .. .... .. .. .. .... .... .. .... .............. .. .. .. .. .. .. ............ ............ ",
"............ .. .. ...... .. .. .. .. .. ...... .. ........ ...... .. .. .. .. .. .... .. ............ ...... ",
"............ .. .. ...... .. .. .. .. .. ...... .. ........ ...... .. .. .. .. .. .... .. ............ ...... ",
"............ .. .. ........ .. .. .. .... ........ .... .... .. .. .. .. .. .............. ............ .... ",
"............ .. .. ........ .. .. .. .... ........ .... .... .. .. .. .. .. .............. ............ .... ",
" ............ .. .. .. .... .... .. .. .. .. .... ........ ............ .. .. ...... .. .... ............ .. ",
" .............. .. .. .... .... .... .. .. .. .. .. .. ...... ...................... .. .. .. .. .. .. ...... .. .. .. .. .... .............. .. .. ..",
" .... .... .... .... .. .. .............. .............. .. ...... .. .. .. .. .. .. ............ ........ .... ",
" .... .... .. .... .... .. .. .................... .................. .. .. ........ .. .. .. .. .. .. .. .. .. .. .. .............. .......... ......",
" .. ...... .... .... .... .. .. .. .. .. .. .... .. .. .... .. .. .... .. .................. .. .. .................... ..",
" .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .............. .. .. .............. .. ",
" .... .. .. .. .. .. .. .. .. .. .. .. .. .. .......... .. ...... .. .. .. .. ",
" .... .. .. .. .. .. .. .. .. .. .. .. .. .. .......... .. ...... .. .. .. .. ",
" ...... .. ...... .. .. .. .. .. .. .. .. .. .. .. ............ .. .......... ...... ...... .. .. ",
" ...... .. ...... .. .. .. .. .. .. .. .. .. .. .. ............ .. .......... ...... ...... .. .. ",
"............ .............. .......... .............. .. .............. .. .. .. .. .. .. .. .. .. .. .............. .... .. .. ",
"............ .............. .......... .............. .. .............. .. .. .. .. .. .. .. .. .. .. .............. .... .. .. ",
" ...... .......... .............. .. .. .. .. .. .. .. .. .. .. .. .. .......... ...... ...... .... .. .. ",
" ...... .......... .............. .. .. .. .. .. .. .. .. .. .. .. .. .......... ...... ...... .... .. .. ",
" .... ...... .. .. .. .. .. .. .. .. .. .. .. .. .. ...... .. .. .. .. ",
" .... ...... .. .. .. .. .. .. .. .. .. .. .. .. .. ...... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .............. .............. .. .. .. .. .. .. ",
" .. .. .. .... .. .... .... .. .. .. .. .. .. .... .. .. .................................... .... .. .. .. .. .. .. ...... ..",
".... ........ .. .. .............. .. .. .. .. .. .. .. .. .............. .............. .. ",
".... .......... .... .... .................. .... .. .. .... .. .. .. .. .. .. .... .................. .................... ..",
".... ........ .............. .. .......... .............. .......... .. .............. ...... .... .............. .. .......... ...... ...... ........ .... .. .......... .... ...... .............. .............. .............. ",
".... ............................ ...................................... .......................... ........................ .................. ................ ........ ................ ........................................................",
"...... .......................... ...................................... ........................ .... ...................... .............................................. .................. ........................................................",
"...... .......................... ...................................... ........................ .... ...................... .............................................. .................. ........................................................",
"........ .......... ........ .......... ........ ........ .......... .............. ........ .......... .............. ........ ...... .......... .......... .. ...... .......... ......",
"........ .......... ........ .......... ........ ........ .......... .............. ........ .......... .............. ........ ...... .......... .......... .. ...... .......... ......",
".......................... ...... ...... ...... .............. ...... ...... ...... ...... ........ ...... ...... ...... .......... ................ ........ .... ............ .......... .. .. ...... ...... ...... ...... ....",
".......................... ...... ...... ...... .............. ...... ...... ...... ...... ........ ...... ...... ...... .......... ................ ........ .... ............ .......... .. .. ...... ...... ...... ...... ....",
".................... ...... ...... ...... .............. ...... ...... ........ ............ ...... ...... ...... .......... ................ ........ .............. .......... .. .. ...... ...... ...... ...... ....",
".................... ...... ...... ...... .............. ...... ...... ........ ............ ...... ...... ...... .......... ................ ........ .............. .......... .. .. ...... ...... ...... ...... ....",
".................. ...... ...... ...... ...... .............. ...... ...... ................ .............. ...... ...... .......... ................ ........ .... ............ .......... .. .. ...... ...... ...... ...... ....",
".................. ...... ...... ...... ...... .............. ...... ...... ................ .............. ...... ...... .......... ................ ........ .... ............ .......... .. .. ...... ...... ...... ...... ....",
".................... ...... .......... ........ ........ ........ .................... ...... ...... ........ ........ .... ........ ...... ........ ........ ...... ...... ...... ........ ......",
".............. .... .. .. .... .... .. .... .. .... .. .... ........ .......... .. .. ...... .. .... .... .. .... .... .. ...... .. .... .... .. ...... .. .. ...... .. .... .... ",
".................................................................................................................... .......................................... ........................................................................................",
".............. .............. .............. .............. .............. .............. .............. .... .... .............. .............. .... ...... .............. .............. .............. .............. .............. ",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ...... .. ...... ...... .. ...... .... .. .. .............. ",
"...................................................................................................................................................................................... .......... .......... ............ .. ....................",
".................................................................... .............................................................................................................. .............. .............. ........ .. ........ .. .. ....",
".................................................................... .............................................................................................................. .............. .............. ........ .. ........ .. .. ....",
".. .......... ...... .. ........ ...... ........ ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ........ .............. .............. .......................... .. ......",
".. .......... ...... .. ........ ...... ........ ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ........ .............. .............. .......................... .. ......",
".. ...... ...... ...... ...... ............ ................ ............ ...... ...... ...... ...... ...... ........ .. ........ ...... ............ ........ ................ ................ ...................... .. .. ....",
".. ...... ...... ...... ...... ............ ................ ............ ...... ...... ...... ...... ...... ........ .. ........ ...... ............ ........ ................ ................ ...................... .. .. ....",
".. ...... ...... ...... ...... ................ .......... ............ ...... ...... ...... ...... .. .. .......... .......... ...... .......... ............ .............. .............. .......................... .. ......",
".. ...... ...... ...... ...... ................ .......... ............ ...... ...... ...... ...... .. .. .......... .......... ...... .......... ............ .............. .............. .......................... .. ......",
".. .......... ...... ...................... ........ .... ...... .... ........ .. ........ .. .. ........ .. .......... ........ .............. .............. .............. ........................ .. .. ....",
".. .......... ...... ...................... ........ .... ...... .... ........ .. ........ .. .. ........ .. .......... ........ .............. .............. .............. ........................ .. .. ....",
".. ...................... ...... .............. ............ .......... .. .......... .......... .. ...... ...... .............. ...... .......... .......... .......... ........................................",
".. .......... .......... .. .. .......... .. .... ...... .... .... .. .. ...... ...... .. .. .. .. ...... .. .......... .. .. .. ...... .. ...... ...... .. ...... .............. .............. ",
".. ...................... ........................................................................................................................ ............................................ ........................................................",
".. .......... .......... .. .............. .............. .............. .............................. .............. .............. .... .... .............. ............... ...... ...... .............. .............. .............. ",
" ...... .. .. .. ........ .. ...... .. ........ .. .......... .. .......... .. ........ .. .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .. .. .. ...... ..",
" ...... .. ........ ...... ........ .......... .......... ........ .. .. ...... .. .. .. .. .. .. .. .. ...... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ........ .. .. ........ ...... ........ .......... .. ........ .. .. ...... ...... .. .. .......... .. .. .. .. ...... ",
" ........ .. .. .. .. ........ .. ...... .. ........ .. .......... .. .. .. ........ .. .. .. .. ...... .. ...... .. .. .. .. .......... .. .. .. .. .. .. .. ...... ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ........ .. ...... .. ........ .. ...... .. .......... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. ..",
" ........ ...... ........ ...... .......... .. .. .. .. .. .. .. .. .. .. .......... .......... .......... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .... .. .. .. ...... .. ...... .. .. .. .. .. .. .......... .......... .......... ",
" .. .. .... .. .. .. .. .. ...... .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. ..",
" .............. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..................",
" .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" .. .. .. .. .. .. .... .. .. .. .. .. ",
" .. .. .. .. .. ........ .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. ........ .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .......... .. .. .. .. .. .. .. .. ...... .. .. ",
" .. .. .. .......... .. .. .. .. .. .. .. .. ...... .. .. ",
" .. .. .. ...... .. .. .. .. .. .......... .......... .. ",
" .. .. .. ...... .. .. .. .. .. .......... .......... .. ",
" .. .......... .. .. .. .. .. .. .. .. ...... .. .. .. ",
" .. .......... .. .. .. .. .. .. .. .. ...... .. .. .. ",
" .. .. ........ .. .... .. .. .. .. .. .. .. .. .. .. ",
" .. .. ........ .. .... .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .... .... .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .... .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ...... .. .. .. ...... .. .......... .. .. .. .......... .. ...... .. .......... .. ...... .. ...... .. .. .. .. .. .. .. .. ...... ..",
" ...... .. ...... .......... .. .......... ...... .......... ...... ...... .. .. ...... ",
" .. .. .... .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .... .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .... .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .... .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .. .. .. .... .... .. .. .. ........ .. ...... ........ .. .. .. ",
" .. .. .. .. .... .... .. .. .. ........ .. ...... ........ .. .. .. ",
" .... .. .. .. .. .......... .. .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .... .. .. .. .. .......... .. .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ...... ...... .......... ...... .. ...... ...... .. ...... ...... .. .. .. .. ",
" ...... .. ...... .. .......... .. ...... .. .. .. ...... .. ...... .. .. .. ...... .. ...... .. .. .. .. .. .. .. .. .. .. ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ...... .. .. .. ........ .. ...... .. ........ .. .......... .. .......... .. ........ .. .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .. .. .. ...... ..",
" ...... .. ........ ...... ........ .......... .......... ........ .. .. ...... .. .. .. .. .. .. .. .. ...... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ........ .. .. ........ ...... ........ .......... .. ........ .. .. ...... ...... .. .. .......... .. .. .. .. ...... ",
" ........ .. .. .. .. ........ .. ...... .. ........ .. .......... .. .. .. ........ .. .. .. .. ...... .. ...... .. .. .. .. .......... .. .. .. .. .. .. .. ...... ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ........ .. ...... .. ........ .. ...... .. .......... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. ..",
" ........ ...... ........ ...... .......... .. .. .. .. .. .. .. .. .. .. .......... .......... .......... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .... .. .. .. ...... .. ...... .. .. .. .. .. .. .......... .......... .......... ",
" .. .. .... .. .. .. .. .. ...... .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. ..",
" .............. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..................",
" .. .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. .. ..",
" .. .. .. .... .. .. .. .. .... ",
" .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. ",
" .. ...... ........ ........ ........ ...... .. ...... ........ .... .... .. .. .. .... .... ........ ...... ",
" .. ...... ........ ........ ........ ...... .. ...... ........ .... .... .. .. .. .... .... ........ ...... ",
" .. .. .. .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ........ .. .. .. .. .. .......... .. .. .. .. .. .. .. ...... .. .. .. .. .. .. .. .. ",
" ........ .. .. .. .. .. .......... .. .. .. .. .. .. .. ...... .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ........ ........ ........ ........ ........ .. .. .. .. ...... .. .. .. .. ...... .. .. .. .. ...... ",
" .. ........ .. ........ .. ........ .. ........ .. ........ .. .. .. .. .. .. .. .. ...... .. .. .. .. .. .. .. ...... .. .. .. .. .. .. .. ...... ..",
" ...... .... ",
" .. .. .. .. .. .. .. ...... .. .. .. .... .. .. .. .. .. ..",
" .. .. .. .. .. .. .. .. .. .. .. ...... .. .. .. ...... .. .... .. .. ..",
" ...... .. ...... .... .. ",
" .. .... .. .... .. .... .. .. .. ",
" .. .... .. .... .. .... .. .. .. ",
" ........ ........ .. ...... ........ ........ .. .. .. .. .. .. .. .. .. .. .......... .... .. .... .. .. ",
" ........ ........ .. ...... ........ ........ .. .. .. .. .. .. .. .. .. .. .......... .... .. .... .. .. ",
" .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. .. ",
" .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. .. ",
" .. .. .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" ........ ........ .. .. .. .. .. .... .. .. .. .. .. .. .. ........ .. .... .. .... .. .. .. ",
" ........ ........ .. .. .. .. .. .... .. .. .. .. .. .. .. ........ .. .... .. .... .. .. .. ",
" .. .. .. ........ .... .... .. .. .... .... .. .. .. .......... ...... .. ...... ",
" .. .. .. .. .. .. ........ .. .... .. .... .. .. .. .. .... .... .. .. .. .. .. .. .......... .. ...... .. .. .. ...... .. .. ..",
" .. .. ...... .. ",
" .. .. .. .. .. .. .. .. .. .. ...... .. . .. .. .. .. .. ..",
"................................................................................................................................................................................................................................................................",
"................................................................................................................................................................................................................................................................",
".... .... ...... ...... .. .... .... .... .. .... .. .. .. .. .... .. .. ...... .. .... .... .......... .. .. ...... .. .. .......... .. ...... .. .. ...... .. .... .... ",
".... ............ .......... .......... ........ ........ ...... ........ ...... ...... ........ ................ ...... ...... ...... .............. ...... ...... ...... ........ ......",
".. ...... ........ .. ........ ...... ...... ...... ...... ...... ...... .............. .............. .............. ...... .......... .................. ...... .... ........ .............. .. ...... ...... ...... ...... ....",
".. ...... ........ .. ........ ...... ...... ...... ...... ...... ...... .............. .............. .............. ...... .......... .................. ...... .... ........ .............. .. ...... ...... ...... ...... ....",
".. .. .. ...... ...... ...... ...... ...... .............. ...... ...... .............. .............. .............. ...... .......... .................. ...... .. .......... .............. .. .. ...... .... ...... ...... ....",
".. .. .. ...... ...... ...... ...... ...... .............. ...... ...... .............. .............. .............. ...... .......... .................. ...... .. .......... .............. .. .. ...... .... ...... ...... ....",
".. .. ...... ...... ...... ........ .............. ...... ...... ........ ........ .............. .......... .................. ...... ............ .............. .. .. ...... .. .. ...... ...... ....",
".. .. ...... ...... ...... ........ .............. ...... ...... ........ ........ .............. .......... .................. ...... ............ .............. .. .. ...... .. .. ...... ...... ....",
".. .. ........ ...... ...... ...... .............. ...... ...... .............. .............. .... ...... ...... .......... .................. ...... .. .......... .............. ...... ...... .... ...... ...... ....",
".. .. ........ ...... ...... ...... .............. ...... ...... .............. .............. .... ...... ...... .......... .................. ...... .. .......... .............. ...... ...... .... ...... ...... ....",
".. .............. ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. ...... ...... ...... .......... .......... ...... ...... .... ........ .............. ...... ...... ...... ...... ...... ....",
".. .............. ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. ...... ...... ...... .......... .......... ...... ...... .... ........ .............. ...... ...... ...... ...... ...... ....",
".... ...... ...... ...... .......... ........ ........ ...... ................ ...... ...... ........ .......... ........ ...... ...... ...... ...... ...... ...... ........ ......",
".... .. .. ...... .. .. .... .... .... .. .... .. .. .. .......... .... .. .. ...... .. .... .... .... .... .. ...... .. .. .. .. ...... .. .. ...... .. .... .... ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".. .... .... .... .. .... .... .... .. .. .. ...... .. .. ...... .. .. ...... .. .. ...... .. .. ...... .. .. .. .. .. .............. .. .. .............. .............. ",
".. .......... ........ .......... ........ ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...................... ....................................",
".. ...... ...... ...... ...... ...... ...... ...... .......... .......... ...... ...... ...... ...... ...... ...... ...... ...... ...... .............. ...... ............ .................... ....................................",
".. ...... ...... ...... ...... ...... ...... ...... .......... .......... ...... ...... ...... ...... ...... ...... ...... ...... ...... .............. ...... ............ .................... ....................................",
".. ...... ...... ...... ...... ...... ...... .................. .......... ...... ...... ...... ...... ...... ........ .. .......... .. .............. ........ .............. .................. .......... ........................",
".. ...... ...... ...... ...... ...... ...... .................. .......... ...... ...... ...... ...... ...... ........ .. .......... .. .............. ........ .............. .................. .......... ........................",
".. ........ ...... ...... .......... ............ .......... ...... ...... ...... ...... .. .. .......... .............. .............. .......... ................ ................ ........ .. ......................",
".. ........ ...... ...... .......... ............ .......... ...... ...... ...... ...... .. .. .......... .............. .............. .......... ................ ................ ........ .. ......................",
".. .............. .. .. ...... .. .................. .......... .......... ...... ...... ...... ...... .. .. ........ .. ............ ............ ............ .................. .............. ...... ...... ....................",
".. .............. .. .. ...... .. .................. .......... .......... ...... ...... ...... ...... .. .. ........ .. ............ ............ ............ .................. .............. ...... ...... ....................",
".. .............. .... ........ .... ........ ...... .......... .......... ...... ........ .. ........ .. ...... ...... .......... .......... .............. .................... ............ ....................................",
".. .............. .... ........ .... ........ ...... .......... .......... ...... ........ .. ........ .. ...... ...... .......... .......... .............. .................... ............ ....................................",
".. ................ .. ...... ...... ........ ............ ............ ............ .......... ...... ...... ...... .......... .......... ...... ...................... ...................... ....",
".. .......... .... .. .. .. ...... .. .... .... ...... ...... .... .... ...... ...... .. ...... .. .. ...... .. ...... ...... .. .. .. .. .............. .. .. .............. .. .. ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".............. ...... ...... .... .. .... .... .. .... ...... ...... .. ........ .... ........ ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. .............. .............. .............. ",
"...................... ............ .. .......... .. ............ .......... .............. ................ .............. .............. .............. ........................................................................................",
"...................... ............ .. .......... .. .......... ...... .... ...... .. .............. ............ .................. ........ .. .. .......... .................................................................. ....",
"...................... ............ .. .......... .. .......... ...... .... ...... .. .............. ............ .................. ........ .. .. .......... .................................................................. ....",
"...................... ............ .. ........ ...... .. ................ ........ .. .............. .......... ...................... ........ ............ ................................................................ ......",
"...................... ............ .. ........ ...... .. ................ ........ .. .............. .......... ...................... ........ ............ ................................................................ ......",
"...................... ............................ .. .......... ............ ............ ............................ ...................... .......... .......... ...................... .......................... ........",
"...................... ............................ .. .......... ............ ............ ............................ ...................... .......... .......... ...................... .......................... ........",
"...................... .......................... .......... .. ........ ............ .. .. ...................... ...................... ........ ............ .............. ............................................ ..........",
"...................... .......................... .......... .. ........ ............ .. .. ...................... ...................... ........ ............ .............. ............................................ ..........",
".................................................... .. ........ ........ .... ...... .... .......................... .................. ........ .. .. .......... .............. .......................................... ............",
".................................................... .. ........ ........ .... ...... .... .......................... .................. ........ .. .. .......... .............. .......................................... ............",
"...................... ............................ .. ............ ................ ........ .. .......................... .............. .............. ............................ ................................ ........................",
".............. ...... ...... .............. .... .. .... ...... ...... ........ .. .... .. .. .............. ...... ...... ...... ...... ...... ...... .............. .... ........ .............. ...... ...... .............. ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".... .... ...... ...... .... .... .. .. ........ .... .. .. ...... .. .. .. .... .... .... .... .............. .............. ........ .... .............. .... ........ .... .... ",
".... ............ ............ ........ ............ ........ .......... ...... ........ .......... .............................................. .......................... .............. ......",
".. ...... ........ .......... ...... .............. .......... ........ ................ .................... ...... ...... ...... ...... .......................................... .............................. .......... ...... ....",
".. ...... ........ .......... ...... .............. .......... ........ ................ .................... ...... ...... ...... ...... .......................................... .............................. .......... ...... ....",
".. .... .......... .................. ............ .......... .. ........ ........ .................... ........ ...... ...... ...... .......... .............. ............ ............ ............ .............. ......",
".. .... .......... .................. ............ .......... .. ........ ........ .................... ........ ...... ...... ...... .......... .............. ............ ............ ............ .............. ......",
".. .. .. .......... .............. ............ ........ .... ................ ...... ............ ............ .......... ...................................... ...................................... .......... ........",
".. .. .. .......... .............. ............ ........ .... ................ ...... ............ ............ .......... ...................................... ...................................... .......... ........",
".. .... .......... ............ .................... ...... .............. ...... ...... ........ ............ ...... .............. .......... .............. ............ ............ ............ ............ ........",
".. .... .......... ............ .................... ...... .............. ...... ...... ........ ............ ...... .............. .......... .............. ............ ............ ............ ............ ........",
".. ...... .......... .......... .............. ...... ............ ........ ...... ...... ...... ........ ............ ...... ............ ............................ .............. .............................. ........................",
".. ...... .......... .......... .............. ...... ............ ........ ...... ...... ...... ........ ............ ...... ............ ............................ .............. .............................. ........................",
".... .......... ........ ........ .............. .......... .......... .......... .............. ........ ............................ .................. .......................... ................ ........",
".... .... .... .... .. .. .... .... ........ .... .... .... .... .... .... ........ .... .... .. ...... .............. .... ........ ........ .... .............. .... ........ ...... ...... ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".... .... ...... ...... .. .... .... .... .. .... .. .. .. .. .... .. .. ...... .. .... .... .......... .. .. ...... .. .. .......... .. ...... .. .. ...... .. .... .... ",
".... ............ .......... .......... ........ ........ ...... ........ ...... ...... ........ ................ ...... ...... ...... .............. ...... ...... ...... ........ ......",
".. ...... ........ .. ........ ...... ...... ...... ...... ...... ...... .............. .............. .............. ...... .......... .................. ...... .... ........ .............. .. ...... ...... ...... ...... ....",
".. ...... ........ .. ........ ...... ...... ...... ...... ...... ...... .............. .............. .............. ...... .......... .................. ...... .... ........ .............. .. ...... ...... ...... ...... ....",
".. .. .. ...... ...... ...... ...... ...... .............. ...... ...... .............. .............. .............. ...... .......... .................. ...... .. .......... .............. .. .. ...... .... ...... ...... ....",
".. .. .. ...... ...... ...... ...... ...... .............. ...... ...... .............. .............. .............. ...... .......... .................. ...... .. .......... .............. .. .. ...... .... ...... ...... ....",
".. .. ...... ...... ...... ........ .............. ...... ...... ........ ........ .............. .......... .................. ...... ............ .............. .. .. ...... .. .. ...... ...... ....",
".. .. ...... ...... ...... ........ .............. ...... ...... ........ ........ .............. .......... .................. ...... ............ .............. .. .. ...... .. .. ...... ...... ....",
".. .. ........ ...... ...... ...... .............. ...... ...... .............. .............. .... ...... ...... .......... .................. ...... .. .......... .............. ...... ...... .... ...... ...... ....",
".. .. ........ ...... ...... ...... .............. ...... ...... .............. .............. .... ...... ...... .......... .................. ...... .. .......... .............. ...... ...... .... ...... ...... ....",
".. .............. ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. ...... ...... ...... .......... .......... ...... ...... .... ........ .............. ...... ...... ...... ...... ...... ....",
".. .............. ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. ...... ...... ...... .......... .......... ...... ...... .... ........ .............. ...... ...... ...... ...... ...... ....",
".... ...... ...... ...... .......... ........ ........ ...... ................ ...... ...... ........ .......... ........ ...... ...... ...... ...... ...... ...... ........ ......",
".... .. .. ...... .. .. .... .... .... .. .... .. .. .. .......... .... .. .. ...... .. .... .... .... .... .. ...... .. .. .. .. ...... .. .. ...... .. .... .... ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".. .... .... .... .. .... .... .... .. .. .. ...... .. .. ...... .. .. ...... .. .. ...... .. .. ...... .. .. .. .. .. .............. .. .. .............. .............. ",
".. .......... ........ .......... ........ ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...................... ....................................",
".. ...... ...... ...... ...... ...... ...... ...... .......... .......... ...... ...... ...... ...... ...... ...... ...... ...... ...... .............. ...... ............ .................... ....................................",
".. ...... ...... ...... ...... ...... ...... ...... .......... .......... ...... ...... ...... ...... ...... ...... ...... ...... ...... .............. ...... ............ .................... ....................................",
".. ...... ...... ...... ...... ...... ...... .................. .......... ...... ...... ...... ...... ...... ........ .. .......... .. .............. ........ .............. .................. .......... ........................",
".. ...... ...... ...... ...... ...... ...... .................. .......... ...... ...... ...... ...... ...... ........ .. .......... .. .............. ........ .............. .................. .......... ........................",
".. ........ ...... ...... .......... .............. .......... ...... ...... ...... ...... .. .. .......... .............. .............. .......... ................ ................ ........ .. ......................",
".. ........ ...... ...... .......... ............. .......... ...... ...... ...... ...... .. .. .......... .............. .............. .......... ................ ................ ........ .. ......................",
".. .............. .. .. ...... .. .................. .......... .......... ...... ...... ...... ...... .. .. ........ .. ............ ............ ............ .................. .............. ...... ...... ....................",
".. .............. .. .. ...... .. .................. .......... .......... ...... ...... ...... ...... .. .. ........ .. ............ ............ ............ .................. .............. ...... ...... ....................",
".. .............. .... ........ .... ........ ...... .......... .......... ...... ........ .. ........ .. ...... ...... .......... .......... .............. .................... ............ ....................................",
".. .............. .... ........ .... ........ ...... .......... .......... ...... ........ .. ........ .. ...... ...... .......... .......... .............. .................... ............ ....................................",
".. ................ .. ...... ...... ........ ............ ............ ............ .......... ...... ...... ...... .......... .......... ...... ...................... ...................... ....",
".. .......... .... .. .. .. ...... .. .... .... ...... ...... .... .... ...... ...... .. ...... .. .. ...... .. ...... ...... .. .. .. .. .............. .. .. .............. .. .. ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".............. ...... ...... .... .. .... .... .. .... ...... ...... .. ........ .... ........ ...... ...... ...... ...... ...... ...... ...... ...... .............. .............. .............. .............. .............. ",
"...................... ............ .. .......... .. ............ .......... .............. ................ .............. .............. .............. ........................................................................................",
"...................... ............ .. .......... .. .......... ...... .... ...... .. .............. ............ .................. ........ .. .. .......... .................................................................. ....",
"...................... ............ .. .......... .. .......... ...... .... ...... .. .............. ............ .................. ........ .. .. .......... .................................................................. ....",
"...................... ............ .. ........ ...... .. ................ ........ .. .............. .......... ...................... ........ ............ ................................................................ ......",
"...................... ............ .. ........ ...... .. ................ ........ .. .............. .......... ...................... ........ ............ ................................................................ ......",
"...................... ............................ .. .......... ............ ............ ............................ ...................... .......... .......... ...................... .......................... ........",
"...................... ............................ .. .......... ............ ............ ............................ ...................... .......... .......... ...................... .......................... ........",
"...................... .......................... .......... .. ........ ............ .. .. ...................... ...................... ........ ............ .............. ............................................ ..........",
"...................... .......................... .......... .. ........ ............ .. .. ...................... ...................... ........ ............ .............. ............................................ ..........",
".................................................... .. ........ ........ .... ...... .... .......................... .................. ........ .. .. .......... .............. .......................................... ............",
".................................................... .. ........ ........ .... ...... .... .......................... .................. ........ .. .. .......... .............. .......................................... ............",
"...................... ............................ .. ............ ................ ........ .. .......................... .............. .............. ............................ ................................ ........................",
".............. ...... ...... .............. .... .. .... ...... ...... ........ .. .... .. .. .............. ...... ...... ...... ...... ...... ...... .............. .... ........ .............. ...... ...... .............. ",
"................................................................................................................................................................................................................................................................",
".............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. .............. ",
".... .... ...... ...... .... .... .. .. ........ .... .. .. ...... .. .. .. .... .... .... .... .............. .............. ........ .... .............. .... ........ .... .... ",
".... ............ ............ ........ ............ ........ .......... ...... ........ .......... .............................................. .......................... .............. ......",
".. ...... ........ .......... ...... .............. .......... ........ ................ .................... ...... ...... ...... ...... .......................................... .............................. .......... ...... ....",
".. ...... ........ .......... ...... .............. .......... ........ ................ .................... ...... ...... ...... ...... .......................................... .............................. .......... ...... ....",
".. .... .......... .................. ............ .......... .. ........ ........ .................... ........ ...... ...... ...... .......... .............. ............ ............ ............ .............. ......",
".. .... .......... .................. ............ .......... .. ........ ........ .................... ........ ...... ...... ...... .......... .............. ............ ............ ............ .............. ......",
".. .. .. .......... .............. ............ ........ .... ................ ...... ............ ............ .......... ...................................... ...................................... .......... ........",
".. .. .. .......... .............. ............ ........ .... ................ ...... ............ ............ .......... ...................................... ...................................... .......... ........",
".. .... .......... ............ .................... ...... .............. ...... ...... ........ ............ ...... .............. .......... .............. ............ ............ ............ ............ ........",
".. .... .......... ............ .................... ...... .............. ...... ...... ........ ............ ...... .............. .......... .............. ............ ............ ............ ............ ........",
".. ...... .......... .......... .............. ...... ............ ........ ...... ...... ...... ........ ............ ...... ............ ............................ .............. .............................. ........................",
".. ...... .......... .......... .............. ...... ............ ........ ...... ...... ...... ........ ............ ...... ............ ............................ .............. .............................. ........................",
".... .......... ........ ........ .............. .......... .......... .......... .............. ........ ............................ .................. .......................... ................ ........",
".... .... .... .... .. .. .... .... ........ .... .... .... .... .... .... ........ .... .... .. ...... .............. .... ........ ........ .... .............. .... ........ ...... ...... ",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ...... .. .. .. ........ .. ...... .. ........ .. .......... .. .......... .. ........ .. .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .. .. .. ...... ..",
" ...... .. ........ ...... ........ .......... .......... ........ .. .. ...... .. .. .. .. .. .. .. .. ...... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ........ .. .. ........ ...... ........ .......... .. ........ .. .. ...... ...... .. .. .......... .. .. .. .. ...... ",
" ........ .. .. .. .. ........ .. ...... .. ........ .. .......... .. .. .. ........ .. .. .. .. ...... .. ...... .. .. .. .. .......... .. .. .. .. .. .. .. ...... ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ........ .. ...... .. ........ .. ...... .. .......... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. ..",
" ........ ...... ........ ...... .......... .. .. .. .. .. .. .. .. .. .. .......... .......... .......... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .... .. .. .. ...... .. ...... .. .. .. .. .. .. .......... .......... .......... .......... ",
" .. .. .... .. .. .. .. .. ...... .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. .......... ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" .. .. .. .. .. .. .... .. .. .. .. .. ",
" .. .. .. .. .. ........ .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. ........ .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .......... .. .. .. .. .. .. .. .. ...... .. .. ",
" .. .. .. .......... .. .. .. .. .. .. .. .. ...... .. .. ",
" .. .. .. ...... .. .. .. .. .. .......... .......... .. ",
" .. .. .. ...... .. .. .. .. .. .......... .......... .. ",
" .. .......... .. .. .. .. .. .. .. .. ...... .. .. .. ",
" .. .......... .. .. .. .. .. .. .. .. ...... .. .. .. ",
" .. .. ........ .. .... .. .. .. .. .. .. .. .. .. .. ",
" .. .. ........ .. .... .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .... .... .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .... .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ...... .. .. .. ...... .. .......... .. .. .. .......... .. ...... .. .......... .. ...... .. ...... .. .. .. .. .. .. .. .. ...... ..",
" ...... .. ...... .......... .. .......... ...... .......... ...... ...... .. .. ...... ",
" .. .. .... .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .... .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .... .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .... .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .. .. .. .... .... .. .. .. ........ .. ...... ........ .. .. .. ",
" .. .. .. .. .... .... .. .. .. ........ .. ...... ........ .. .. .. ",
" .... .. .. .. .. .......... .. .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .... .. .. .. .. .......... .. .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ...... ...... .......... ...... .. ...... ...... .. ...... ...... .. .. .. .. ",
" ...... .. ...... .. .......... .. ...... .. .. .. ...... .. ...... .. .. .. ...... .. ...... .. .. .. .. .. .. .. .. .. .. ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ...... .. .. .. ........ .. ...... .. ........ .. .......... .. .......... .. ........ .. .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .. .. .. ...... ..",
" ...... .. ........ ...... ........ .......... .......... ........ .. .. ...... .. .. .. .. .. .. .. .. ...... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. ...... .. .. ........ .. .. .. ........ ........ .. .......... .. .. .... .. .. .. .. .. .. .. .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .... .......... .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ........ .. .. ........ ...... ........ .......... .. ........ .. .. ...... ...... .. .. .......... .. .. .. .. ...... ",
" ........ .. .. .. .. ........ .. ...... .. ........ .. .......... .. .. .. ........ .. .. .. .. ...... .. ...... .. .. .. .. .......... .. .. .. .. .. .. .. ...... ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ........ .. ...... .. ........ .. ...... .. .......... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. ..",
" ........ ...... ........ ...... .......... .. .. .. .. .. .. .. .. .. .. .......... .......... .......... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" ........ .. .. ........ ...... .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .... .. .... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .. .. .. .. .. .. .. .. .. .. .. .... .... .. .. .. .. .... .. .... ",
" .. .... .. .. .. ...... .. ...... .. .. .. .. .. .. .......... .......... .......... .......... ",
" .. .. .... .. .. .. .. .. ...... .. .. .. ...... .. .. .. .. .. .. .. .. .. .. .. .......... .. .......... .. .. .......... .. .. .......... ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" .. .. .. .. .. .. .. .. .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" .. .. .. .. .. .. .... .. .. .. .. .. ",
" .. .. .. .. .. ........ .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. ........ .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .......... .. .. .. .. .. .. .. .. ...... .. .. ",
" .. .. .. .......... .. .. .. .. .. .. .. .. ...... .. .. ",
" .. .. .. ...... .. .. .. .. .. .......... .......... .. ",
" .. .. .. ...... .. .. .. .. .. .......... .......... .. ",
" .. .......... .. .. .. .. .. .. .. .. ...... .. .. .. ",
" .. .......... .. .. .. .. .. .. .. .. ...... .. .. .. ",
" .. .. ........ .. .... .. .. .. .. .. .. .. .. .. .. ",
" .. .. ........ .. .... .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .... .... .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .... .. .... .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..",
" ...... .. .. .. ...... .. .......... .. .. .. .......... .. ...... .. .......... .. ...... .. ...... .. .. .. .. .. .. .. .. ...... ..",
" ...... .. ...... .......... .. .......... ...... .......... ...... ...... .. .. ...... ",
" .. .. .... .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .... .. .. .. .... .. .. .. .. .. .. .. .. .. .. .. ",
" .. .... .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .... .. .. .. .. .. ........ .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .. .. .. .... .... .. .. .. ........ .. ...... ........ .. .. .. ",
" .. .. .. .. .... .... .. .. .. ........ .. ...... ........ .. .. .. ",
" .... .. .. .. .. .......... .. .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .... .. .. .. .. .......... .. .. .. .. .. .. .. .. .. .. .......... .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ",
" ...... ...... .......... ...... .. ...... ...... .. ...... ...... .. .. .. .. ",
" ...... .. ...... .. .......... .. ...... .. .. .. ...... .. ...... .. .. .. ...... .. ...... .. .. .. .. .. .. .. .. .. .. .."
};

462
linapple-pie/src/font.xpm Normal file
View File

@ -0,0 +1,462 @@
/* XPM */
static char *font_xpm[] = {
/* columns rows colors chars-per-pixel */
"320 200 256 2",
" c #000000",
". c #000033",
"X c #000066",
"o c #000099",
"O c #0000CC",
"+ c #0000FF",
"@ c #003300",
"# c #003333",
"$ c #003366",
"% c #003399",
"& c #0033CC",
"* c #0033FF",
"= c #006600",
"- c #006633",
"; c #006666",
": c #006699",
"> c #0066CC",
", c #0066FF",
"< c #009900",
"1 c #009933",
"2 c #009966",
"3 c #009999",
"4 c #0099CC",
"5 c #0099FF",
"6 c #00CC00",
"7 c #00CC33",
"8 c #00CC66",
"9 c #00CC99",
"0 c #00CCCC",
"q c #00CCFF",
"w c #00FF00",
"e c #00FF33",
"r c #00FF66",
"t c #00FF99",
"y c #00FFCC",
"u c #00FFFF",
"i c #330000",
"p c #330033",
"a c #330066",
"s c #330099",
"d c #3300CC",
"f c #3300FF",
"g c #333300",
"h c #333333",
"j c #333366",
"k c #333399",
"l c #3333CC",
"z c #3333FF",
"x c #336600",
"c c #336633",
"v c #336666",
"b c #336699",
"n c #3366CC",
"m c #3366FF",
"M c #339900",
"N c #339933",
"B c #339966",
"V c #339999",
"C c #3399CC",
"Z c #3399FF",
"A c #33CC00",
"S c #33CC33",
"D c #33CC66",
"F c #33CC99",
"G c #33CCCC",
"H c #33CCFF",
"J c #33FF00",
"K c #33FF33",
"L c #33FF66",
"P c #33FF99",
"I c #33FFCC",
"U c #33FFFF",
"Y c #660000",
"T c #660033",
"R c #660066",
"E c #660099",
"W c #6600CC",
"Q c #6600FF",
"! c #663300",
"~ c #663333",
"^ c #663366",
"/ c #663399",
"( c #6633CC",
") c #6633FF",
"_ c #666600",
"` c #666633",
"' c #666666",
"] c #666699",
"[ c #6666CC",
"{ c #6666FF",
"} c #669900",
"| c #669933",
" . c #669966",
".. c #669999",
"X. c #6699CC",
"o. c #6699FF",
"O. c #66CC00",
"+. c #66CC33",
"@. c #66CC66",
"#. c #66CC99",
"$. c #66CCCC",
"%. c #66CCFF",
"&. c #66FF00",
"*. c #66FF33",
"=. c #66FF66",
"-. c #66FF99",
";. c #66FFCC",
":. c #66FFFF",
">. c #990000",
",. c #990033",
"<. c #990066",
"1. c #990099",
"2. c #9900CC",
"3. c #9900FF",
"4. c #993300",
"5. c #993333",
"6. c #993366",
"7. c #993399",
"8. c #9933CC",
"9. c #9933FF",
"0. c #996600",
"q. c #996633",
"w. c #996666",
"e. c #996699",
"r. c #9966CC",
"t. c #9966FF",
"y. c #999900",
"u. c #999933",
"i. c #999966",
"p. c #999999",
"a. c #9999CC",
"s. c #9999FF",
"d. c #99CC00",
"f. c #99CC33",
"g. c #99CC66",
"h. c #99CC99",
"j. c #99CCCC",
"k. c #99CCFF",
"l. c #99FF00",
"z. c #99FF33",
"x. c #99FF66",
"c. c #99FF99",
"v. c #99FFCC",
"b. c #99FFFF",
"n. c #CC0000",
"m. c #CC0033",
"M. c #CC0066",
"N. c #CC0099",
"B. c #CC00CC",
"V. c #CC00FF",
"C. c #CC3300",
"Z. c #CC3333",
"A. c #CC3366",
"S. c #CC3399",
"D. c #CC33CC",
"F. c #CC33FF",
"G. c #CC6600",
"H. c #CC6633",
"J. c #CC6666",
"K. c #CC6699",
"L. c #CC66CC",
"P. c #CC66FF",
"I. c #CC9900",
"U. c #CC9933",
"Y. c #CC9966",
"T. c #CC9999",
"R. c #CC99CC",
"E. c #CC99FF",
"W. c #CCCC00",
"Q. c #CCCC33",
"!. c #CCCC66",
"~. c #CCCC99",
"^. c #CCCCCC",
"/. c #CCCCFF",
"(. c #CCFF00",
"). c #CCFF33",
"_. c #CCFF66",
"`. c #CCFF99",
"'. c #CCFFCC",
"]. c #CCFFFF",
"[. c #FF0000",
"{. c #FF0033",
"}. c #FF0066",
"|. c #FF0099",
" X c #FF00CC",
".X c #FF00FF",
"XX c #FF3300",
"oX c #FF3333",
"OX c #FF3366",
"+X c #FF3399",
"@X c #FF33CC",
"#X c #FF33FF",
"$X c #FF6600",
"%X c #FF6633",
"&X c #FF6666",
"*X c #FF6699",
"=X c #FF66CC",
"-X c #FF66FF",
";X c #FF9900",
":X c #FF9933",
">X c #FF9966",
",X c #FF9999",
"<X c #FF99CC",
"1X c #FF99FF",
"2X c #FFCC00",
"3X c #FFCC33",
"4X c #FFCC66",
"5X c #FFCC99",
"6X c #FFCCCC",
"7X c #FFCCFF",
"8X c #FFFF00",
"9X c #FFFF33",
"0X c #FFFF66",
"qX c #FFFF99",
"wX c #FFFFCC",
"eX c #FFFFFF",
"rX c #000000",
"tX c #0D0D0D",
"yX c #1A1A1A",
"uX c #282828",
"iX c #353535",
"pX c #434343",
"aX c #505050",
"sX c #5D5D5D",
"dX c #6B6B6B",
"fX c #787878",
"gX c #868686",
"hX c #939393",
"jX c #A1A1A1",
"kX c #AEAEAE",
"lX c #BBBBBB",
"zX c #C9C9C9",
"xX c #D6D6D6",
"cX c #E4E4E4",
"vX c #F1F1F1",
"bX c #FFFFFF",
"nX c #532300",
"mX c #663300",
"MX c #7B4317",
"NX c #935323",
"BX c #000000",
"VX c #000000",
"CX c #000000",
"ZX c #000000",
"AX c #000000",
"SX c #000000",
"DX c #000000",
"FX c #000000",
"GX c #000000",
"HX c #000000",
"JX c #000000",
"KX c #000000",
"LX c #000000",
"PX c #000000",
"IX c #000000",
"UX c #FFFFFF",
/* pixels */
"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[. ",
"[. [. eXeX [. w w [. {.{. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. UX [.UXUX UXUX [. UX UX [. UXUXUXUX [.UXUX UX [. eX [. eX [. eX [.eX [. eX [. [. [. ",
"[. [. eX eX [. w w w w [. {.{.{.{. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. UX [. UX UX [. UX UX [.UX UX [.UXUX UX [.eX eX [. eX [. eX [. eX [.eX eX eX [. [. [. ",
"[. [.eX eX[.w w w w w w [.{.{.{.{.{.{.[. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. UX [.UX UX [.UXUXUXUXUX [.UX UX [. UX [.eX eX [. eX [.eX [. eX [. eXeXeX [. eX [. [. ",
"[. [.eX eX[.w w w w w w [.{.{.{.{.{.{.[. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. UX [. [. UX UX [. UXUXUX [. UX [. eX [. [.eX [. eX [. eX [. eX [. [. ",
"[. [.eX eX[.w w w w w w [.{.{.{.{.{.{.[. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. UX [. [.UXUXUXUXUX [. UX UX [. UX [.eX eX eX [. [.eX [. eX [. eXeXeX [.eXeXeXeXeX [. UXUX [. ",
"[. [. eX eX [. w w w w [. {.{.{.{. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. UX UX [. UX UX [. UX UXUX [.eX eX [. [. eX [. eX [.eX eX eX [. eX [. UX [. ",
"[. [. eXeX [. w w [. {.{. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. UX [. [. UX UX [.UXUXUXUX [.UX UXUX [. eXeX eX [. [. eX [.eX [. eX [. eX [. UX [. ",
"[. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. ",
"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[. ",
"[. [. [. UX [. UXUXUX [. UX [. UXUXUX [. UXUXUX [. UX UX [. UXUXUX [. UXUXUX [. UXUXUX [. UXUXUX [. UXUXUX [. [. [. eX [. [.eX [.UXUXUXUX [. eXeXeX [. UXUXUX [.UXUXUXUX [. UXUXUXUX [.UXUXUXUX [.UXUXUXUXUX [.UXUXUXUXUX [. UXUXUXUX [.UX UX [. UXUXUX [. UXUXUX [.UX UX [.UX [.UX UX [.UX UX [. UXUXUX [.UXUXUXUX [. UXUXUX [.UXUXUXUX [. UXUXUXUX [.UXUXUXUXUX [.UX UX [.UX UX [.UX UX [.UX UX [.UX UX [. ",
"[. [. [. UX [. UX UX [. UXUX [. UX [. UX [. UX UX [. UX [. UX [. UX [. UX UX [. UX UX [. [. [. eX [. [. eX [. UX [.eX eX [.UX UX [.UX UX [.UX [.UX UX [.UX [.UX [.UX [.UX UX [. UX [. UX [.UX UX [.UX [.UXUX UXUX [.UXUX UX [.UX UX [.UX UX [.UX UX [.UX UX [.UX [. UX [.UX UX [.UX UX [.UX UX [.UX UX [.UX UX [. ",
"[. [. [. UX [. UX UX [. UX [. UX [. UX [. UX UX [. UX [. UX [. UX [. UX UX [. UX UX [. [. [. eX [. [. eX [. UX [.eX eX eX [.UX UX [.UX UX [.UX [.UX UX [.UX [.UX [.UX [.UX UX [. UX [. UX [.UX UX [.UX [.UX UX UX [.UX UX UX [.UX UX [.UX UX [.UX UX [.UX UX [.UX [. UX [.UX UX [.UX UX [.UX UX [. UX UX [. UX UX [. ",
"[. UXUXUX [. [. UX [. UX UX [. UX [. UXUXUX [. UXUX [. UXUXUX [. UXUXUX [. UXUXUX [. UX [. UXUXUX [. UXUXUX [. UX [. eX [.eX [.eXeXeXeXeX [. eX [. UXUX [.eX eXeXeX [.UXUXUXUXUX [.UXUXUXUX [.UX [.UX UX [.UXUXUX [.UXUXUX [.UX UXUX [.UXUXUXUXUX [. UX [. UX [.UXUX [.UX [.UX UX [.UX UXUX [.UX UX [.UXUXUXUX [.UX UX [.UXUXUXUX [. UXUXUX [. UX [.UX UX [.UX UX [.UX UX [. UX [. UX [. ",
"[. [. [. UX [. UX UX [. UX [. UX [. UX [. UX [. UX [. UX UX [. UX [. UX UX [. UX [. [. [. eX [. [. eX [. UX [.eX eXeX [.UX UX [.UX UX [.UX [.UX UX [.UX [.UX [.UX UX [.UX UX [. UX [. UX [.UX UX [.UX [.UX UX [.UX UX [.UX UX [.UX [.UX UX [.UX UX [. UX [. UX [.UX UX [.UX UX [.UX UX [. UX UX [. UX [. ",
"[. [. [. UX [. UX UX [. UX [. UX [. UX [. UX [. UX [. UX UX [. UX [. UX UX [. UX [. UX [. eX [. eX [.eXeXeXeXeX [. eX [. [.eX [.UX UX [.UX UX [.UX [.UX UX [.UX [.UX [.UX UX [.UX UX [. UX [.UX UX [.UX UX [.UX [.UX UX [.UX UX [.UX UX [.UX [.UX UXUX [.UX UX [. UX [. UX [.UX UX [. UX UX [.UX UX UX [.UX UX [. UX [. ",
"[. [. UX [.UX [. UXUXUX [. UXUXUX [. UXUXUX [. UXUXUX [. UX [. UXUXUX [. UXUXUX [. UX [. UXUXUX [. UX [. [. eX [. eX [. [.eX [. UX [. eXeXeXeX [.UX UX [.UXUXUXUX [. UXUXUXUX [.UXUXUXUX [.UXUXUXUXUX [.UX [. UXUXUXUX [.UX UX [. UXUXUX [. UXUX [.UX UX [.UXUXUXUXUX [.UX UX [.UX UX [. UXUXUX [.UX [. UXUXUXUX [.UX UX [.UXUXUXUX [. UX [. UXUXUX [. UX [. UX UX [.UX UX [. UX [. ",
"[. [. [. [. [. [. [. [. [. [. [. [. [. [. [. eX [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. [. ",
"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[. ",
"[.UXUXUXUXUX [. UXUXUX [.UX [. UXUXUX [. [. [. UXUX [. [.eX [. [. eX [. [. eXeX [. [.eX [. eX [. eX [.eX [.eXeX [. [. [. [. [. [. [. [. eX [. [. [. [. [. [. [. UXUX [. UX [. UXUX [. UXUXUX [. ",
"[. UX [. UX [. UX [. UX [. [. [. UX [. [.eX [. [. eX [. [. eX eX [. [.eX [. [. [.eX eX [. eX [. [. [. [. [. [.eX eXeXeX [. [. eX [. [. [. [. [. [. [. UX [. UX [. UX [.UX UX [. ",
"[. UX [. UX [. UX [. UX [. eX [. [. UX [. eXeXeX [.eX [. eXeXeX [. eX [. eXeXeX [. eX [. eXeXeX [.eXeXeXeX [.eXeX [. eXeX [.eX eX [. eX [.eXeX eXeX [.eXeXeXeX [. eXeXeX [. eXeX [. eXeXeX [.eXeX [. eXeXeXeX [. eX [.eX eX [.eX eX [.eX eX [.eX eX [.eX eX [.eXeXeXeXeX [. UX [. UX [. UX [.UXUX UX [. ",
"[. UX [. UX [. UX [. UX [. eX eX [. [. [. eX [.eXeXeX [.eX [. eXeXeXeX [.eX eX [.eXeXeXeX [.eX eX [.eX eX [. eX [. eX [.eXeXeX [. eX [.eX eX eX [.eX eX [.eX eX [.eX eX [.eX eX [.eX [.eX [.eXeXeX [.eX eX [.eX eX [.eX eX [. eX eX [.eX eX [. eX [. UX [. [. UX [.UX UX UX [. ",
"[. UX [. UX [. UX [. UX [.eX eX [. [. [. eXeXeXeX [.eX eX [.eX [.eX eX [.eXeXeXeXeX [. eX [.eX eX [.eX eX [. eX [. eX [.eX eX [. eX [.eX eX eX [.eX eX [.eX eX [.eX eX [.eXeX eX [.eX [. eXeXeX [. eX [.eX eX [.eX eX [.eX eX eX [. eX [.eX eX [. eX [. UX [. UX [. UX [.UX UXUX [. ",
"[.UX [. UX [. UX [. UX [. [. [. [.eX eX [.eX eX [.eX [.eX eX [.eX [. eX [. eXeXeXeX [.eX eX [. eX [. eX [.eX eX [. eX [.eX eX [.eX eX [.eX eX [.eXeXeX [. eXeXeX [.eX [. eX [. eX eX [.eX eXeX [. eX eX [.eX eX eX [. eX eX [. eXeXeXeX [. eX [. UX [. UX [. UX [.UX UX [. ",
"[.UXUXUXUXUX [. UXUXUX [. UX [. UXUXUX [. [.eXeXeXeXeX [. [. eXeXeXeX [.eXeXeX [. eXeXeX [. eXeXeXeX [. eXeXeXeX [. eX [. eX [.eX eX [.eXeXeX [.eX eX [.eX eX [.eXeXeXeX [.eX eX [.eX eX [. eXeXeX [.eX [. eX [.eX [.eXeXeXeX [. eXeX [. eXeX eX [. eX [.eXeX eXeX [.eX eX [. eX [.eXeXeXeXeX [. UXUX [. UX [. UXUX [.UX UX [. ",
"[. [. [. [. [. [. [. [. [. [. [. [. [. [. eXeXeX [. [. [. eX [. [. [. [. [. [.eX [. eX [. [. [. [. [. [. [. [. eXeXeX [. [. [. [. [. [. ",
"[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[. ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "
};

View File

@ -0,0 +1,507 @@
// This sourse includes a FTPPARSE:
/* ftpparse.c, ftpparse.h: library for parsing FTP LIST responses
20001223
D. J. Bernstein, djb@cr.yp.to
http://cr.yp.to/ftpparse.html
Commercial use is fine, if you let me know what programs you're using this in.
Currently covered formats:
EPLF.
UNIX ls, with or without gid.
Microsoft FTP Service.
Windows NT FTP Server.
VMS.
WFTPD.
NetPresenz (Mac).
NetWare.
MSDOS.
Definitely not covered:
Long VMS filenames, with information split across two lines.
NCSA Telnet FTP server. Has LIST = NLST (and bad NLST for directories).
*/
#include "stdafx.h"
#include <time.h>
#include <stdio.h>
#include <curl/curl.h>
#include "ftpparse.h"
struct FtpFile {
const char *filename;
FILE *stream;
};
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream) {
struct FtpFile *out=(struct FtpFile *)stream;
if(out && !out->stream) {
/* open file for writing */
out->stream=fopen(out->filename, "wb");
if(!out->stream)
return -1; /* failure, can't open file to write */
}
return fwrite(buffer, size, nmemb, out->stream);
}
CURLcode ftp_get(const char *ftp_path, const char *local_path) {
// Download file from ftp_path to local_path
CURLcode res;
struct FtpFile ftpfile;// = {
// char *fname, /* name to store the file as if succesful */
// NULL
// };
ftpfile.stream = NULL;
ftpfile.filename = local_path; // where to download a file
curl_easy_setopt(g_curl, CURLOPT_URL, ftp_path);
/* Define our callback to get called when there's data to be written */
curl_easy_setopt(g_curl, CURLOPT_WRITEFUNCTION, my_fwrite);
curl_easy_setopt(g_curl, CURLOPT_WRITEDATA, &ftpfile);
curl_easy_setopt(g_curl, CURLOPT_USERPWD, g_sFTPUserPass);
/* Switch on full protocol/debug output */
// curl_easy_setopt(g_curl, CURLOPT_VERBOSE, 1L);
res = curl_easy_perform(g_curl);
if(res != CURLE_OK) {
/* we failed */
printf("Curl error with errorcode = %d\n", res);
}
if(ftpfile.stream)
fclose(ftpfile.stream); /* close the local file */
return res;
}
/////////////////////////////////////////////////////////////
/* FTP Parse */
/////////////////////////////////////////////////////////////
static long totai(long year,long month,long mday)
{
long result;
if (month >= 2) month -= 2;
else { month += 10; --year; }
result = (mday - 1) * 10 + 5 + 306 * month;
result /= 10;
if (result == 365) { year -= 3; result = 1460; }
else result += 365 * (year % 4);
year /= 4;
result += 1461 * (year % 25);
year /= 25;
if (result == 36524) { year -= 3; result = 146096; }
else { result += 36524 * (year % 4); }
year /= 4;
result += 146097 * (year - 5);
result += 11017;
return result * 86400;
}
static int flagneedbase = 1;
static time_t base; /* time() value on this OS at the beginning of 1970 TAI */
static long now; /* current time */
static int flagneedcurrentyear = 1;
static long currentyear; /* approximation to current year */
static void initbase(void)
{
struct tm *t;
if (!flagneedbase) return;
base = 0;
t = gmtime(&base);
base = -(totai(t->tm_year + 1900,t->tm_mon,t->tm_mday) + t->tm_hour * 3600 + t->tm_min * 60 + t->tm_sec);
/* assumes the right time_t, counting seconds. */
/* base may be slightly off if time_t counts non-leap seconds. */
flagneedbase = 0;
}
static void initnow(void)
{
long day;
long year;
initbase();
now = time((time_t *) 0) - base;
if (flagneedcurrentyear) {
day = now / 86400;
if ((now % 86400) < 0) --day;
day -= 11017;
year = 5 + day / 146097;
day = day % 146097;
if (day < 0) { day += 146097; --year; }
year *= 4;
if (day == 146096) { year += 3; day = 36524; }
else { year += day / 36524; day %= 36524; }
year *= 25;
year += day / 1461;
day %= 1461;
year *= 4;
if (day == 1460) { year += 3; day = 365; }
else { year += day / 365; day %= 365; }
day *= 10;
if ((day + 5) / 306 >= 10) ++year;
currentyear = year;
flagneedcurrentyear = 0;
}
}
/* UNIX ls does not show the year for dates in the last six months. */
/* So we have to guess the year. */
/* Apparently NetWare uses ``twelve months'' instead of ``six months''; ugh. */
/* Some versions of ls also fail to show the year for future dates. */
static long guesstai(long month,long mday)
{
long year;
long t;
initnow();
for (year = currentyear - 1;year < currentyear + 100;++year) {
t = totai(year,month,mday);
if (now - t < 350 * 86400)
return t;
}
}
static int check(char *buf,const char *monthname)
{
if ((buf[0] != monthname[0]) && (buf[0] != monthname[0] - 32)) return 0;
if ((buf[1] != monthname[1]) && (buf[1] != monthname[1] - 32)) return 0;
if ((buf[2] != monthname[2]) && (buf[2] != monthname[2] - 32)) return 0;
return 1;
}
static const char *months[12] = {
"jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"
} ;
static int getmonth(char *buf,int len)
{
int i;
if (len == 3)
for (i = 0;i < 12;++i)
if (check(buf,months[i])) return i;
return -1;
}
static long getlong(char *buf,int len)
{
long u = 0;
while (len-- > 0)
u = u * 10 + (*buf++ - '0');
return u;
}
int ftpparse(struct ftpparse *fp,char *buf,int len)
{
int i;
int j;
int state;
long size;
long year;
long month;
long mday;
long hour;
long minute;
fp->name = 0;
fp->namelen = 0;
fp->flagtrycwd = 0;
fp->flagtryretr = 0;
fp->sizetype = FTPPARSE_SIZE_UNKNOWN;
fp->size = 0;
fp->mtimetype = FTPPARSE_MTIME_UNKNOWN;
fp->mtime = 0;
fp->idtype = FTPPARSE_ID_UNKNOWN;
fp->id = 0;
fp->idlen = 0;
if (len < 2) /* an empty name in EPLF, with no info, could be 2 chars */
return 0;
switch(*buf) {
/* see http://pobox.com/~djb/proto/eplf.txt */
/* "+i8388621.29609,m824255902,/,\tdev" */
/* "+i8388621.44468,m839956783,r,s10376,\tRFCEPLF" */
case '+':
i = 1;
for (j = 1;j < len;++j) {
if (buf[j] == 9) {
fp->name = buf + j + 1;
fp->namelen = len - j - 1;
return 1;
}
if (buf[j] == ',') {
switch(buf[i]) {
case '/':
fp->flagtrycwd = 1;
break;
case 'r':
fp->flagtryretr = 1;
break;
case 's':
fp->sizetype = FTPPARSE_SIZE_BINARY;
fp->size = getlong(buf + i + 1,j - i - 1);
break;
case 'm':
fp->mtimetype = FTPPARSE_MTIME_LOCAL;
initbase();
fp->mtime = base + getlong(buf + i + 1,j - i - 1);
break;
case 'i':
fp->idtype = FTPPARSE_ID_FULL;
fp->id = buf + i + 1;
fp->idlen = j - i - 1;
}
i = j + 1;
}
}
return 0;
/* UNIX-style listing, without inum and without blocks */
/* "-rw-r--r-- 1 root other 531 Jan 29 03:26 README" */
/* "dr-xr-xr-x 2 root other 512 Apr 8 1994 etc" */
/* "dr-xr-xr-x 2 root 512 Apr 8 1994 etc" */
/* "lrwxrwxrwx 1 root other 7 Jan 25 00:17 bin -> usr/bin" */
/* Also produced by Microsoft's FTP servers for Windows: */
/* "---------- 1 owner group 1803128 Jul 10 10:18 ls-lR.Z" */
/* "d--------- 1 owner group 0 May 9 19:45 Softlib" */
/* Also WFTPD for MSDOS: */
/* "-rwxrwxrwx 1 noone nogroup 322 Aug 19 1996 message.ftp" */
/* Also NetWare: */
/* "d [R----F--] supervisor 512 Jan 16 18:53 login" */
/* "- [R----F--] rhesus 214059 Oct 20 15:27 cx.exe" */
/* Also NetPresenz for the Mac: */
/* "-------r-- 326 1391972 1392298 Nov 22 1995 MegaPhone.sit" */
/* "drwxrwxr-x folder 2 May 10 1996 network" */
case 'b':
case 'c':
case 'd':
case 'l':
case 'p':
case 's':
case '-':
if (*buf == 'd') fp->flagtrycwd = 1;
if (*buf == '-') fp->flagtryretr = 1;
if (*buf == 'l') fp->flagtrycwd = fp->flagtryretr = 1;
state = 1;
i = 0;
for (j = 1;j < len;++j)
if ((buf[j] == ' ') && (buf[j - 1] != ' ')) {
switch(state) {
case 1: /* skipping perm */
state = 2;
break;
case 2: /* skipping nlink */
state = 3;
if ((j - i == 6) && (buf[i] == 'f')) /* for NetPresenz */
state = 4;
break;
case 3: /* skipping uid */
state = 4;
break;
case 4: /* getting tentative size */
size = getlong(buf + i,j - i);
state = 5;
break;
case 5: /* searching for month, otherwise getting tentative size */
month = getmonth(buf + i,j - i);
if (month >= 0)
state = 6;
else
size = getlong(buf + i,j - i);
break;
case 6: /* have size and month */
mday = getlong(buf + i,j - i);
state = 7;
break;
case 7: /* have size, month, mday */
if ((j - i == 4) && (buf[i + 1] == ':')) {
hour = getlong(buf + i,1);
minute = getlong(buf + i + 2,2);
fp->mtimetype = FTPPARSE_MTIME_REMOTEMINUTE;
initbase();
fp->mtime = base + guesstai(month,mday) + hour * 3600 + minute * 60;
} else if ((j - i == 5) && (buf[i + 2] == ':')) {
hour = getlong(buf + i,2);
minute = getlong(buf + i + 3,2);
fp->mtimetype = FTPPARSE_MTIME_REMOTEMINUTE;
initbase();
fp->mtime = base + guesstai(month,mday) + hour * 3600 + minute * 60;
}
else if (j - i >= 4) {
year = getlong(buf + i,j - i);
fp->mtimetype = FTPPARSE_MTIME_REMOTEDAY;
initbase();
fp->mtime = base + totai(year,month,mday);
}
else
return 0;
fp->name = buf + j + 1;
fp->namelen = len - j - 1;
state = 8;
break;
case 8: /* twiddling thumbs */
break;
}
i = j + 1;
while ((i < len) && (buf[i] == ' ')) ++i;
}
if (state != 8)
return 0;
fp->size = size;
fp->sizetype = FTPPARSE_SIZE_BINARY;
if (*buf == 'l')
for (i = 0;i + 3 < fp->namelen;++i)
if (fp->name[i] == ' ')
if (fp->name[i + 1] == '-')
if (fp->name[i + 2] == '>')
if (fp->name[i + 3] == ' ') {
fp->namelen = i;
break;
}
/* eliminate extra NetWare spaces */
if ((buf[1] == ' ') || (buf[1] == '['))
if (fp->namelen > 3)
if (fp->name[0] == ' ')
if (fp->name[1] == ' ')
if (fp->name[2] == ' ') {
fp->name += 3;
fp->namelen -= 3;
}
return 1;
}
/* MultiNet (some spaces removed from examples) */
/* "00README.TXT;1 2 30-DEC-1996 17:44 [SYSTEM] (RWED,RWED,RE,RE)" */
/* "CORE.DIR;1 1 8-SEP-1996 16:09 [SYSTEM] (RWE,RWE,RE,RE)" */
/* and non-MutliNet VMS: */
/* "CII-MANUAL.TEX;1 213/216 29-JAN-1996 03:33:12 [ANONYMOU,ANONYMOUS] (RWED,RWED,,)" */
for (i = 0;i < len;++i)
if (buf[i] == ';')
break;
if (i < len) {
fp->name = buf;
fp->namelen = i;
if (i > 4)
if (buf[i - 4] == '.')
if (buf[i - 3] == 'D')
if (buf[i - 2] == 'I')
if (buf[i - 1] == 'R') {
fp->namelen -= 4;
fp->flagtrycwd = 1;
}
if (!fp->flagtrycwd)
fp->flagtryretr = 1;
while (buf[i] != ' ') if (++i == len) return 0;
while (buf[i] == ' ') if (++i == len) return 0;
while (buf[i] != ' ') if (++i == len) return 0;
while (buf[i] == ' ') if (++i == len) return 0;
j = i;
while (buf[j] != '-') if (++j == len) return 0;
mday = getlong(buf + i,j - i);
while (buf[j] == '-') if (++j == len) return 0;
i = j;
while (buf[j] != '-') if (++j == len) return 0;
month = getmonth(buf + i,j - i);
if (month < 0) return 0;
while (buf[j] == '-') if (++j == len) return 0;
i = j;
while (buf[j] != ' ') if (++j == len) return 0;
year = getlong(buf + i,j - i);
while (buf[j] == ' ') if (++j == len) return 0;
i = j;
while (buf[j] != ':') if (++j == len) return 0;
hour = getlong(buf + i,j - i);
while (buf[j] == ':') if (++j == len) return 0;
i = j;
while ((buf[j] != ':') && (buf[j] != ' ')) if (++j == len) return 0;
minute = getlong(buf + i,j - i);
fp->mtimetype = FTPPARSE_MTIME_REMOTEMINUTE;
initbase();
fp->mtime = base + totai(year,month,mday) + hour * 3600 + minute * 60;
return 1;
}
/* MSDOS format */
/* 04-27-00 09:09PM <DIR> licensed */
/* 07-18-00 10:16AM <DIR> pub */
/* 04-14-00 03:47PM 589 readme.htm */
if ((*buf >= '0') && (*buf <= '9')) {
i = 0;
j = 0;
while (buf[j] != '-') if (++j == len) return 0;
month = getlong(buf + i,j - i) - 1;
while (buf[j] == '-') if (++j == len) return 0;
i = j;
while (buf[j] != '-') if (++j == len) return 0;
mday = getlong(buf + i,j - i);
while (buf[j] == '-') if (++j == len) return 0;
i = j;
while (buf[j] != ' ') if (++j == len) return 0;
year = getlong(buf + i,j - i);
if (year < 50) year += 2000;
if (year < 1000) year += 1900;
while (buf[j] == ' ') if (++j == len) return 0;
i = j;
while (buf[j] != ':') if (++j == len) return 0;
hour = getlong(buf + i,j - i);
while (buf[j] == ':') if (++j == len) return 0;
i = j;
while ((buf[j] != 'A') && (buf[j] != 'P')) if (++j == len) return 0;
minute = getlong(buf + i,j - i);
if (hour == 12) hour = 0;
if (buf[j] == 'A') if (++j == len) return 0;
if (buf[j] == 'P') { hour += 12; if (++j == len) return 0; }
if (buf[j] == 'M') if (++j == len) return 0;
while (buf[j] == ' ') if (++j == len) return 0;
if (buf[j] == '<') {
fp->flagtrycwd = 1;
while (buf[j] != ' ') if (++j == len) return 0;
}
else {
i = j;
while (buf[j] != ' ') if (++j == len) return 0;
fp->size = getlong(buf + i,j - i);
fp->sizetype = FTPPARSE_SIZE_BINARY;
fp->flagtryretr = 1;
}
while (buf[j] == ' ') if (++j == len) return 0;
fp->name = buf + j;
fp->namelen = len - j;
fp->mtimetype = FTPPARSE_MTIME_REMOTEMINUTE;
initbase();
fp->mtime = base + totai(year,month,mday) + hour * 3600 + minute * 60;
return 1;
}
/* Some useless lines, safely ignored: */
/* "Total of 11 Files, 10966 Blocks." (VMS) */
/* "total 14786" (UNIX) */
/* "DISK$ANONFTP:[ANONYMOUS]" (VMS) */
/* "Directory DISK$PCSA:[ANONYM]" (VMS) */
return 0;
}

View File

@ -0,0 +1,54 @@
#ifndef FTPPARSE_H
#define FTPPARSE_H
/*
ftpparse(&fp,buf,len) tries to parse one line of LIST output.
The line is an array of len characters stored in buf.
It should not include the terminating CR LF; so buf[len] is typically CR.
If ftpparse() can't find a filename, it returns 0.
If ftpparse() can find a filename, it fills in fp and returns 1.
fp is a struct ftpparse, defined below.
The name is an array of fp.namelen characters stored in fp.name;
fp.name points somewhere within buf.
*/
#include <curl/curl.h>
struct ftpparse {
char *name; /* not necessarily 0-terminated */
int namelen;
int flagtrycwd; /* 0 if cwd is definitely pointless, 1 otherwise */
int flagtryretr; /* 0 if retr is definitely pointless, 1 otherwise */
int sizetype;
long size; /* number of octets */
int mtimetype;
time_t mtime; /* modification time */
int idtype;
char *id; /* not necessarily 0-terminated */
int idlen;
};
#define FTPPARSE_SIZE_UNKNOWN 0
#define FTPPARSE_SIZE_BINARY 1 /* size is the number of octets in TYPE I */
#define FTPPARSE_SIZE_ASCII 2 /* size is the number of octets in TYPE A */
#define FTPPARSE_MTIME_UNKNOWN 0
#define FTPPARSE_MTIME_LOCAL 1 /* time is correct */
#define FTPPARSE_MTIME_REMOTEMINUTE 2 /* time zone and secs are unknown */
#define FTPPARSE_MTIME_REMOTEDAY 3 /* time zone and time of day are unknown */
/*
When a time zone is unknown, it is assumed to be GMT. You may want
to use localtime() for LOCAL times, along with an indication that the
time is correct in the local time zone, and gmtime() for REMOTE* times.
*/
#define FTPPARSE_ID_UNKNOWN 0
#define FTPPARSE_ID_FULL 1 /* unique identifier for files on this FTP server */
extern int ftpparse(struct ftpparse *,char *,int); // parse ftp dir listing
extern CURLcode ftp_get(const char *, const char *); // get remote file from ftp server
#endif

44
linapple-pie/src/icon.xpm Normal file
View File

@ -0,0 +1,44 @@
/* XPM */
static char *icon_xpm[] = {
/* columns rows colors chars-per-pixel */
"32 32 6 1",
" c #000000",
". c #FF0000",
"X c #00FF00",
"o c #FFFF00",
"O c #0000FF",
"+ c #FF00FF",
/* pixels */
" ",
" XXX ",
" XXXX + ",
" XXXXX + ",
" XXXXX + ",
" XXXXX ++ ",
" XXXXX + ",
" XXXX ++ ",
" XXX + ",
" XXX XXXX ",
" XXXXXXX XXXXXXXX ",
" XXXXXXXXXXXXXXXXXXXX + ",
" XXXXXXXXXXXXXXXXXXX ++ ",
" oooooooooooooooooo +++ ",
" ooooooooooooooooooo + ",
" oooooooooooooooooo ++ ",
" oooooooooooooooooo + ",
" oooooooooooooooooo + ",
" oooooooooooooooooo + ",
" ooooooooooooooooooo ",
" ................... + ",
" .................... ",
" ..................... ",
" + ",
" + ",
" + ",
" ++ ",
" OOOOOOOOOOOOOOOOO ++ ",
" OOOOOO OOOOOO ++ ",
" OOO +++ OOO ++ ",
" +++ + ++ ",
" +++ +++ "
};

347
linapple-pie/src/list.h Normal file
View File

@ -0,0 +1,347 @@
#ifndef GENERIC_LIST
#define GENERIC_LIST
/*
Funciones para LISTAS:
void Delete()
void Instance(List<T> &l)
void Rewind(void)
void Forward(void)
void Next(void)
void Prev(void)
T *GetObj(void)
LLink<T> *GetPos(void)
bool EmptyP()
bool EndP()
bool LastP()
bool BeginP()
void Insert(T *o)
void Add(T *o)
void AddAfter(LLink<T> *pos,T *o)
bool Iterate(T *&o)
T *ExtractIni(void)
T *Extract(void)
bool MemberP(T *o)
T *MemberGet(T *o)
bool MemberRefP(T *o)
int Length()
void Copy(List l)
bool DeleteElement(T *o)
T *GetRandom(void)
void SetNoOriginal(void)
void SetOriginal(void)
bool operator==(List<T> &l)
T *operator[](int index)
*/
template <class T> class LLink {
public:
LLink<T>(T *o,LLink<T> *n=NULL) {
obj=o;next=n;
};
~LLink<T>() {delete obj;
if (next!=NULL) delete next;};
inline LLink<T> *Getnext() {return next;};
inline void Setnext(LLink<T> *n) {next=n;};
inline T *GetObj() {return obj;};
inline void Setobj(T *o) {obj=o;};
void Anade(T *o) {
if (next==NULL) {
LLink<T> *node=new LLink<T>(o);
next=node;
} else {
next->Anade(o);
}
};
private:
T *obj;
LLink<T> *next;
};
template <class T> class List {
public:
List<T>() {list=NULL;act=NULL;top=NULL;original=true;};
~List<T>() {
if (original) {
delete list;
} /* if */
};
List<T>(List<T> &l) {list=l.list;act=list;top=l.top;original=false;};
void Delete() {
if (original) {
delete list;
} /* if */
list=NULL;
act=NULL;
top=NULL;
};
void Instance(List<T> &l) {list=l.list;act=list;top=l.top;original=false;};
void Rewind(void) {act=list;};
void Forward(void) {act=top;};
void Next(void) {
if (act!=NULL) act=act->Getnext();
};
void Prev(void) {
LLink<T> *tmp;
if (act!=list) {
tmp=list;
while(tmp->Getnext()!=act) tmp=tmp->Getnext();
act=tmp;
} /* if */
};
T *GetObj(void) {return act->GetObj();};
LLink<T> *GetPos(void) {return act;};
bool EmptyP() {return list==NULL;};
bool EndP() {return act==NULL;};
bool LastP() {return act==top;};
bool BeginP() {return act==list;};
void Insert(T *o) {
if (list==NULL) {
list=new LLink<T>(o);
top=list;
} else {
list=new LLink<T>(o,list);
} /* if */
};
void Add(T *o) {
if (list==NULL) {
list=new LLink<T>(o);
top=list;
} else {
top->Anade(o);
top=top->Getnext();
} /* if */
};
void AddAfter(LLink<T> *pos,T *o)
{
if (pos==NULL) {
if (list==NULL) {
list=new LLink<T>(o);
top=list;
} else {
list=new LLink<T>(o,list);
} /* if */
} else {
LLink<T> *nl=new LLink<T>(o);
nl->Setnext(pos->Getnext());
pos->Setnext(nl);
if (nl->Getnext()==NULL) top=nl;
} /* if */
} /* AddAfter */
T *operator[](int index) {
LLink<T> *tmp=list;
while(tmp!=NULL && index>0) {
tmp=tmp->Getnext();
index--;
} /* while */
if (tmp==NULL) throw;
return tmp->GetObj();
};
// this functions was added by me, beom beotiger, for sorting these Lists! Ha-ha-ha ^_^
void Swap(int index1, int index2) { // swap two object with index1, index2
LLink<T> *tmp=list;
LLink<T> *tmp2=list;
T *o;
while(tmp!=NULL && index1 > 0) { // find List obj for index1
tmp=tmp->Getnext();
index1--;
} /* while */
if (tmp==NULL) throw;
while(tmp2!=NULL && index2 > 0) { // find List object for index2
tmp2=tmp2->Getnext();
index2--;
} /* while */
if (tmp2==NULL) throw;
o = tmp->GetObj(); // temp
tmp->Setobj(tmp2->GetObj());
tmp2->Setobj(o);
// return tmp->GetObj(); inline T *GetObj() {return obj;};
};/* Swap */
bool Iterate(T *&o) {
if (EndP()) return false;
o=act->GetObj();
act=act->Getnext();
return true;
} /* Iterate */
T *ExtractIni(void) {
LLink<T> *tmp;
T *o;
if (list==NULL) return NULL;
o=list->GetObj();
tmp=list;
list=list->Getnext();
tmp->Setnext(NULL);
if (act==tmp) act=list;
if (top==act) top=NULL;
tmp->Setobj(NULL);
delete tmp;
return o;
} /* ExtractIni */
T *Extract(void) {
LLink<T> *tmp,*tmp2=NULL;
T *o;
if (list==NULL) return NULL;
tmp=list;
while(tmp->Getnext()!=NULL) {
tmp2=tmp;
tmp=tmp->Getnext();
} /* while */
o=tmp->GetObj();
if (tmp2==NULL) {
list=NULL;
top=NULL;
act=NULL;
} else {
tmp2->Setnext(NULL);
top=tmp2;
} /* if */
if (act==tmp) act=top;
tmp->Setobj(NULL);
delete tmp;
return o;
} /* Extract */
bool MemberP(T *o) {
LLink<T> *tmp;
tmp=list;
while(tmp!=NULL) {
if (*(tmp->GetObj())==*o) return true;
tmp=tmp->Getnext();
} /* while */
return false;
} /* MemberP */
T *MemberGet(T *o) {
LLink<T> *tmp;
tmp=list;
while(tmp!=NULL) {
if (*(tmp->GetObj())==*o) return tmp->GetObj();
tmp=tmp->Getnext();
} /* while */
return NULL;
} /* MemberGet */
bool MemberRefP(T *o) {
LLink<T> *tmp;
tmp=list;
while(tmp!=NULL) {
if (tmp->GetObj()==o) return true;
tmp=tmp->Getnext();
} /* while */
return false;
} /* MemberRefP */
int Length() {
LLink<T> *tmp;
int count=0;
tmp=list;
while(tmp!=NULL) {
tmp=tmp->Getnext();
count++;
} /* while */
return count;
};
void Copy(List l) {
T *o;
Delete();
original=true;
l.Rewind();
while(l.Iterate(o)) {
o=new T(*o);
Add(o);
} /* while */
} /* Copy */
bool DeleteElement(T *o)
{
LLink<T> *tmp1,*tmp2;
tmp1=list;
tmp2=NULL;
while(tmp1!=NULL && tmp1->GetObj()!=o) {
tmp2=tmp1;
tmp1=tmp1->Getnext();
} /* while */
if (tmp1!=NULL) {
if (tmp2==NULL) {
/* Eliminar el primer elemento de la lista: */
list=list->Getnext();
tmp1->Setnext(NULL);
if (act==tmp1) act=list;
tmp1->Setobj(NULL);
delete tmp1;
} else {
/* Eliminar un elemento intermedio: */
tmp2->Setnext(tmp1->Getnext());
if (act==tmp1) act=tmp1->Getnext();
if (top==tmp1) top=tmp2;
tmp1->Setnext(NULL);
tmp1->Setobj(NULL);
delete tmp1;
} /* if */
return true;
} else {
return false;
} /* if */
} /* DeleteOne */
T *GetRandom(void) {
int i,l=Length();
i=((rand()*l)/RAND_MAX);
if (i==l) i=l-1;
return operator[](i);
} /* GetRandom */
bool operator==(List<T> &l) {
LLink<T> *tmp1,*tmp2;
tmp1=list;
tmp2=l.list;
while(tmp1!=NULL && tmp2!=NULL) {
if (!((*(tmp1->GetObj()))==(*(tmp2->GetObj())))) return false;
tmp1=tmp1->Getnext();
tmp2=tmp2->Getnext();
} /* while */
return tmp1==tmp2;
} /* == */
void SetNoOriginal(void) {original=false;}
void SetOriginal(void) {original=true;}
private:
bool original;
LLink<T> *list,*top;
LLink<T> *act;
};
#endif

3608
linapple-pie/src/resource.h Normal file

File diff suppressed because it is too large Load Diff

646
linapple-pie/src/splash.xpm Normal file
View File

@ -0,0 +1,646 @@
/* XPM */
static char *splash_xpm[] = {
/* columns rows colors chars-per-pixel */
"560 384 256 2",
" c #000000",
". c #0B0303",
"X c #0B0D07",
"o c #040509",
"O c #0C0E09",
"+ c #090708",
"@ c #130E0A",
"# c #160804",
"$ c #0E100A",
"% c #071403",
"& c #14130B",
"* c #1B150C",
"= c #1B190D",
"- c #171308",
"; c #1A1912",
": c #020D17",
"> c #260B03",
", c #271608",
"< c #371B05",
"1 c #261D12",
"2 c #330704",
"3 c #092F00",
"4 c #3C230C",
"5 c #3A2307",
"6 c #2C2214",
"7 c #392714",
"8 c #2E220E",
"9 c #343230",
"0 c #011C31",
"q c #4D1907",
"w c #42250B",
"e c #442A0D",
"r c #4B2C0C",
"t c #462605",
"y c #542C09",
"u c #57340C",
"i c #442B13",
"p c #4A2D13",
"a c #452A17",
"s c #4C3214",
"d c #4B331A",
"f c #563819",
"g c #4F2F10",
"h c #7A2907",
"j c #663B18",
"k c #6F3210",
"l c #553B23",
"z c #5B3E24",
"x c #573B26",
"c c #483626",
"v c #673C23",
"b c #671C04",
"n c #135D01",
"m c #5C411B",
"M c #67451B",
"N c #7A4517",
"B c #774D17",
"V c #5D4225",
"C c #5D4229",
"Z c #564328",
"A c #584734",
"S c #624325",
"D c #63452A",
"F c #66492C",
"G c #6C4C2C",
"H c #6A4925",
"J c #714E2D",
"K c #764923",
"L c #6E512E",
"P c #665525",
"I c #73522D",
"U c #795529",
"Y c #6C4D31",
"T c #664C34",
"R c #724D31",
"E c #6D5235",
"W c #735432",
"Q c #795633",
"! c #7C5A34",
"~ c #7C5C3A",
"^ c #755838",
"/ c #7D6137",
"( c #002D4F",
") c #152962",
"_ c #735A47",
"` c #7B6448",
"' c #606060",
"] c #6A6866",
"[ c #756B65",
"{ c #7A7269",
"} c #6B7473",
"| c #4F4E4E",
" . c #063F74",
".. c #872C09",
"X. c #8C330A",
"o. c #883308",
"O. c #9C3B0B",
"+. c #963708",
"@. c #8F3612",
"#. c #A23D0A",
"$. c #A33C07",
"%. c #AB2C0B",
"&. c #A62A18",
"*. c #CF1409",
"=. c #FF0000",
"-. c #F50907",
";. c #EC1612",
":. c #D43531",
">. c #ED2A22",
",. c #834717",
"<. c #914C17",
"1. c #A5420C",
"2. c #AA440C",
"3. c #A9460B",
"4. c #AA4712",
"5. c #B14D13",
"6. c #875A27",
"7. c #945C26",
"8. c #835C34",
"9. c #835E3A",
"0. c #895E35",
"q. c #8E4828",
"w. c #95632B",
"e. c #9A652C",
"r. c #9C692D",
"t. c #966327",
"y. c #8B6235",
"u. c #85623C",
"i. c #8A643C",
"p. c #896539",
"a. c #9C6B32",
"s. c #966837",
"d. c #9C7338",
"f. c #8B622C",
"g. c #A26B33",
"h. c #A5763A",
"j. c #A66D31",
"k. c #A7592C",
"l. c #E34D2C",
"z. c #8B6641",
"x. c #8D6A43",
"c. c #876746",
"v. c #926B43",
"b. c #936C47",
"n. c #98744A",
"m. c #997855",
"M. c #896E52",
"N. c #A67B46",
"B. c #A47C54",
"V. c #B26D4F",
"C. c #8C7B6C",
"Z. c #867668",
"A. c #927D6B",
"S. c #8B7D72",
"D. c #917F71",
"F. c #886C62",
"G. c #AB7667",
"H. c #A1534C",
"J. c #D86352",
"K. c #CE364A",
"L. c #24B600",
"P. c #21A701",
"I. c #1C8E00",
"U. c #75D060",
"Y. c #69A558",
"T. c #AB824A",
"R. c #BC8C4B",
"E. c #B68748",
"W. c #BD914C",
"Q. c #AA8556",
"!. c #B78C56",
"~. c #BD9253",
"^. c #BC935C",
"/. c #AA984C",
"(. c #96826D",
"). c #948373",
"_. c #998675",
"`. c #9C8976",
"'. c #9D8A79",
"]. c #998778",
"[. c #8D8175",
"{. c #B88963",
"}. c #BC9464",
"|. c #A28C7A",
" X c #A38B75",
".X c #A9937B",
"XX c #B69A7B",
"oX c #AB8968",
"OX c #B89F75",
"+X c #C18E4D",
"@X c #C2924E",
"#X c #C6944D",
"$X c #C49453",
"%X c #C3965A",
"&X c #C5995C",
"*X c #CB9C5C",
"=X c #C99755",
"-X c #C89556",
";X c #CEA15E",
":X c #CB9D62",
">X c #C59B67",
",X c #C78E6B",
"<X c #CDA163",
"1X c #CBA16C",
"2X c #D2A464",
"3X c #D5A869",
"4X c #CBA475",
"5X c #D4A877",
"6X c #D9B27B",
"7X c #E69172",
"8X c #B09348",
"9X c #015EA4",
"0X c #61798C",
"qX c #1375CD",
"wX c #6000A8",
"eX c #9304FE",
"rX c #A26CB6",
"tX c #608DAF",
"yX c #0092FF",
"uX c #0C97FF",
"iX c #0990F5",
"pX c #60BBFF",
"aX c #61B3F2",
"sX c #65ABE5",
"dX c #63A0D2",
"fX c #6CC0FF",
"gX c #918F8C",
"hX c #A99683",
"jX c #B59D85",
"kX c #A99288",
"lX c #BBA287",
"zX c #BAA694",
"xX c #AEAEAE",
"cX c #8B89BA",
"vX c #C6AA88",
"bX c #CBB18D",
"nX c #CDB493",
"mX c #D5BA93",
"MX c #D9BC94",
"NX c #D5BB9A",
"BX c #DABE9B",
"VX c #D3B695",
"CX c #D4B28B",
"ZX c #DBB89C",
"AX c #DCC19C",
"SX c #DBC098",
"DX c #DDC2A2",
"FX c #D7C2B1",
"GX c #E3C8A8",
"HX c #E0C69E",
"JX c #C9C9C9",
"KX c #FFFFFF",
"LX c #F4F3F3",
"PX c #E8E8E8",
"IX c #E2DDDA",
"UX c #A8CBDA",
/* pixels */
"= ; 6 ; ; ; = 1 1 ; ; ; ; ; ; ; = ; 3 ; ; ; ; ; ; ; = 3 8 , = , = & = & = 3 , = = = , = = = , ; = , 1 , ; = * - = = = = = = 1 * ; , = = 1 , ; = = , = 6 = = = = ; , ; = 1 ; ; 1 * ; , ; 1 , = 1 1 = = , ; , * ; , = 1 ; 1 ; 1 1 = = 1 = ; 1 ; 1 * @ # @ * * * * & @ - # @ @ @ * * * , * # * > * * * * * * * ; ; * * * * * * * @ * * * > * * - - % # - & * * & & ; & & & & & & & & $ & $ & & & O @ & & & & * & & & & & @ @ @ $ & & @ & @ $ & @ O @ @ @ & $ $ $ $ $ @ O $ @ : @ + + O O O $ $ $ & & @ & & O @ O & X . < c.^.%X+X!.,X{.!.!.!.,X,X!.^.}.^.^.!.!.^.,X!.!.V.!.B.V.!.{.{.{.!.{.{.^.!.{.,X!.!.!.{.Q.}.{.Q.^.}.^.oX^.}.}.!.}.!.{.^.{.^.Q.!.{.}.{.!.{.^.^.!.!.{.,XQ.s.s.!.}.^.^.}.}.^.^.^.}.^.^.!.!.^.}.^.Q.{.oX~ V l 9 4 8 = & & & & O O O O O O O X @ @ + O O O @ O O O X - O $ O O & O O & O O O O O O O O + O O O O O : + O O O O : O : X $ O : X : X % X X X : X X X X X : o : O + O : + o o O + O O X X o o X X o X $ X X X o O O $ $ : $ $ $ $ $ $ % $ $ $ $ X % O X X X # % $ O O X O % O % X $ : O O % % O O X X % O O O O O O X X $ # $ $ $ $ % O X O X X % X % : o % % O O X X X X X X X X X X X X % @ $ O $ $ $ $ $ $ $ & $ & $ $ $ $ $ $ $ $ ",
"= ; ; 1 ; ; ; ; ; = 3 6 ; ; ; ; ; ; ; ; ; 3 ; ; ; ; = = = = = = = 6 = = = - = = , 3 * = * = = , = 1 = = , ; , = = = = * * = * 1 = = * = = = ; = = = 1 ; = = 1 = 1 = 1 ; = = , = ; , = 1 = 1 = = = , 1 6 1 = = 1 = 8 = , , = = = , ; 1 ; = , ; = * ; * * @ @ @ @ & - - - - @ - * , * ; , , * * , > * ; > 1 * @ * * @ * @ * @ * > * @ * @ @ - @ - - - & & & & & & & @ & $ & $ $ ; $ ; ; ; : ; ; ; ; ; & & & & * & & * & & & @ ; & ; : : & $ & & & @ & & O $ $ + @ @ : $ $ O @ & : $ & $ $ @ @ & $ + & @ @ O O $ $ $ . 1 c.!.!.!.!.!.,X!.B.!.%X^.!.^.{.>X^.{.,X{.^.,X!.B.Q.B.N.V.!.!.!.^.{.{.!.,X!.{.^.{.!.Q.!.!.^.}.^.^.^.}.!.^.!.}.!.}.!.{.^.!.!.!.!.!.{.{.%X%X{.,X!.!.{.Q.s.n.!.,X!.}.^.^.{.^.}.{.^.^.{.!.{.}.^.!.!.Q.! Z m 7 6 8 = = & & @ O O $ O O O O O @ O @ & $ $ O & & @ - X X $ $ @ O O O $ & $ $ $ $ O O O O O O O : O X X O : O X O X X X o X X X X X : X X O o X X : X X X % O O O O o X X O O $ : O X % O : X : X : O X X X X X $ $ $ $ $ $ : & $ $ O $ $ $ O O : % $ % O % O X $ X O O O O O % X % X O O : O X X X O O O O % X X X X X $ @ $ $ O O % X X X X X X % % X X X O O X X % X X X % X # % - X O % $ $ $ X $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
"* * ; ; = ; = = ; ; 3 ; ; = = ; = = = & ; ; ; ; ; ; ; ; = = , 1 ; ; ; ; = * = = = = = , ; 1 1 1 , , 1 ; , = * * ; = * = , = = * * ; , ; 1 = ; * = = , = , = = , = 1 = = , ; = * = = = , = 1 = 1 = = 8 = = = = = = = = , ; = 1 = = = * * * * * * * ; * * - @ @ @ - * * - # - - = * ; * * * , * , ; * * * * 1 * * & * & * @ @ * @ @ @ * @ @ & & - - $ * & & & & & @ : @ @ & $ & & $ & : & & & @ @ O $ & ; = $ = $ % - % - & $ $ $ & $ @ O $ $ $ $ $ $ & $ @ & & & & & & & & $ & @ @ @ & & : @ $ & : & & : $ & & $ X . 6 M.{.!.Q.!.}.,X!.V.G.%X}.!.!.%X,X{.!.,X^.{.^.Q.V.!.N.V.!.{.!.!.!.!.!.{.^.!.^.{.!.!.!.!.{.^.!.!.!.oX!.}.oX^.}.!.!.!.{.^.^.!.!.{.,X%X%X{.{.%X!.!.!.%XT.s.v.V.}.^.{.%X^.^.{.%X^.^.{.!.!.!.}.^.^.{.Q.! Z Z 7 7 8 1 & * & & @ O $ $ O O O X $ O @ $ : @ O O O O $ # - O O O O O $ $ $ $ $ & $ O + O @ @ $ O O $ O $ $ O O O O X X X X O X X X X X X O X % % o X : X X X $ : : O + o : o X o + o X o o X X X o X X X : o : % O O $ O O $ $ $ $ : : O $ $ % O O O $ % % $ % X X X O X X O X X X X $ % $ X O O X X $ X : X X X X X $ $ O O O % X X X X X X X X o X X X X X X X % X + X % X X X % O X X O $ $ O $ $ $ $ - $ $ $ $ $ $ $ $ & $ $ $ $ ",
"* * ; ; ; = = = ; ; 6 ; = = = 3 = = = = ; ; 6 3 ; ; ; ; = 1 = 1 , ; 1 = 1 = , = = 8 = = 1 = , , * * = , , ; , 1 1 , , * * ; , ; , * , 1 1 ; , , 1 = = , = = 1 = 1 = , = = , 1 = , = , ; = = , = , = = = , = * , = 1 = = 1 = = , = , * * * = = = * * @ @ # @ @ * - * - * - - * - * > * @ * * # * * * * * * * * * * - - - @ * @ * * * @ * * & & & - - & & & & ; & ; @ & * & & & & & & & & @ @ ; * & & & & $ = & & & - & @ & & & & & $ & $ $ $ & - $ $ $ & @ @ @ : & & & @ ; @ & @ & & @ : @ & & & ; & & & & & & : + . 7 M.}.!.Q.!.}.}.{.!.!.}.}.^.{.>X^.!.}.!.!.>X}.!.N.B.N.B.T.!.!.!.^.{.%X{.!.}.}.%X>X!.!.!.^.^.^.^.^.^.!.!.^.!.!.!.}.{.!.}.!.!.!.!.!.^.{.!.%X{.{.!.!.^.!.s.v.!.,X{.%X}.{.}.%X{.{.^.%X^.!.^.}.}.!.{.oX~ V d d 7 6 = * & & @ & @ $ & & O $ - O & @ @ @ @ & & & & $ @ % X O O @ @ O @ $ $ @ @ O O $ @ + : X O $ O $ O $ O O O O X X X X X X X X X X % O $ O X X X % o X X O X O O O X % o X X X O o : % O o % $ X X X % % O O O O $ $ $ : : $ $ $ $ O $ O O O O O $ X X X X % X X % X X X % X O X X X $ $ O % O X X X X X X X X X O O O @ @ $ # X X X % X X % % X X % X X X O O X X X X X X X @ % % X $ $ $ $ $ $ $ $ $ $ $ $ $ & $ $ $ $ $ $ % ; ",
"3 ; ; = = ; = = ; ; = 1 = = = = = = 8 = = = = ; ; ; ; = = 1 1 1 , 1 1 ; ; , 1 , 6 , , = , = - - * > # * * * * * - , - # - - - - * * * * - - * * > - > - - * * > - - - , * > * 1 = - , * > - * > > , * , * - , - - , , * , * = = * * * , - * , * * & # # # - # - - - # - # - - * * , - - > - * # * > # * > @ # @ # # # # # - - - # > # * # # - @ # @ # # @ - @ @ # @ @ @ * # @ @ & ; * # * # # @ # * @ * & * @ @ & O - - @ # & & & & # & @ @ @ @ O X O @ @ @ @ @ O @ @ @ O & @ & & : @ @ @ O O O @ X @ O $ $ $ $ + . 7 M.}.^.Q.!.}.{.{.!.Q.}.{.^.^.^.}.^.{.^.{.}.}.!.B.Q.B.B.Q.!.{.!.!.{.}.!.^.}.^.^.}.!.Q.^.!.{.^.oX!.^.oX^.!.{.!.}.{.!.^.}.{.!.!.^.^.{.^.{.>X^.^.!.!.}.Q.i.v.{.>X{.,X}.}.>X}.}.>X{.}.{.!.!.}.}.!.{.Q.^ z l c a 6 6 1 = ; = * * * * * - * * & & * * * ; ; * * * = * ; & & & * @ ; @ @ ; ; ; * @ @ ; @ @ & @ @ * & & $ & $ - & & $ & & ; $ $ $ $ $ $ & & $ & $ $ O $ O $ $ $ $ $ $ $ $ $ X O $ X $ % $ $ $ $ $ $ X $ $ $ & $ $ % $ $ $ $ $ & $ & & $ $ & $ O $ $ - X $ % $ # X O X O X X O O X X O $ $ O $ $ $ $ X X O O X X X X O O O O % O O X O X X X % X O X X X O O % X X X X % X O % - X X % @ O $ O $ O O $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
"; ; 1 1 ; = ; ; 6 ; 1 = 1 = = = = = = = = = = ; 3 1 = = , , , - # # # # # # # # - - > , , , > , , > , , , > > > , > # > > , > > , > , > > > , , , - , , , , , , , , > > > , > , , > , > > , > , , > , , , , , , , > , > , > , > , , , > , , , , , > > # - # > > - > > > , , > , , > > > , > , > > > > 2 > , , > > , - > > - > > * > # > > > > > , , > # # > # > # > > > # # > - # # # # # # # # # # # - # # # # # # # . # # # # # . . . . . . . . . . . + . . o . . . o o . . . . . . . . . . . . . . . . . . . . . < c.XX{.Q.!.}.}.{.Q.!.}.}.!.!.}.}.^.}.^.}.{.{.oXB.B.B.B.Q.{.!.G.!.{.{.{.{.}.{.}.{.!.{.!.^.}.}.}.^.!.!.^.{.!.!.!.!.}.!.^.!.!.!.!.}.^.^.!.{.!.}.Q.Q.{.!.s.d.Q.>X}.{.}.^.{.}.,X^.%X}.}.{.}.}.^.!.oXoX~ D x l a 7 7 6 6 1 1 1 , , , 1 1 1 1 1 1 1 1 1 ; 1 1 1 1 1 1 1 1 ; 1 1 1 ; 1 1 1 1 ; 1 1 1 1 ; 1 1 , ; ; * = ; & = = ; ; * * ; ; & ; & ; ; & & = ; & * = & & & & $ & & & & $ $ $ O $ $ $ & $ & $ & $ $ & $ $ & & & & - * - & & * & & & & & * ; & & & ; ; & & & $ & $ & % - % - - $ & - @ $ $ - - & - $ & O $ $ % O O $ $ @ O @ @ @ @ O @ X X X X X X O X O % X X X X X O X X X O O O % X X O $ $ $ $ $ % $ $ $ $ $ $ $ $ ; $ $ $ $ $ : ; ",
"; ; = = ; 1 6 3 6 1 ; 1 1 = 1 = = = 8 = = 3 6 1 6 ; = 1 , * , , a c a w i 4 < 5 t 4 p Z F ^ _ ` c.` M.M.M.Z.(.(. X XoXA.(.B.A.A.A.G.oXoX(.`.oX(.(.Q.(.(.Q.(.(.m.m.m.m.M.M.M.c.c.c.` _ _ _ _ ` _ _ ` c._ ` _ _ ` _ _ _ _ _ _ ` ` _ _ _ _ ~ _ _ _ _ _ _ _ _ ^ ^ _ _ T _ ^ ~ ^ _ ^ _ _ ^ _ ~ _ ` ` ` ` 9._ _ 9._ ` _ _ _ _ ~ _ _ _ _ _ ^ _ _ ^ _ _ _ ^ _ _ E _ W ^ _ R R _ E ^ ^ E _ E _ E E _ T T R T E T T T G D T T T F C D F A F Z Z V z C x z x x x l l c c c c x c l c d c a c a a a 7 a a a 7 7 a 7 7 7 7 6 6 < f M.{.{.,X^.}.}.}.oX{.}.}.{.}.}.}.XXXX>X}.XX}.{.B.{.B.Q.oX{.{.{.{.}.}.}.}.>X}.}.}.{.{.^.!.}.}./.}.}.}.}.}.}.}.}.}.oX}.}.oX^.{.{.>X}.{.}.}.^.^.^.!.}.T.s.s.!.}.}.}.}.}.}.}.}.{.>X}.}.!.}.}.}.{.!.oX9.G D x c c 7 7 7 7 7 7 7 6 7 7 6 6 6 7 6 6 7 6 7 6 7 6 6 6 7 6 6 7 6 6 6 6 7 7 6 7 6 6 6 6 6 6 1 1 1 1 1 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 1 6 6 6 1 1 6 6 1 1 1 ; 1 ; = = = = = = ; = = = = = = - = - ; , ; = = = = = = = = * = = ; 6 1 = = ; ; ; ; ; = & = & = = * - & * * * * & & - - * * * & & & $ $ $ $ & O O $ $ $ O O O O O X # O O X X X X X X X o % X X X X O X X O O $ O O O $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ & & % ",
"& ; ; ; ; ; ; 6 3 ; 6 1 = = ; 1 = = = = 6 = 1 ; ; ; = 6 = > , A G.vXlXXXXXXXXXXXXXm./ ^ c.` ` c.M.M.M.M.n.m.m.m.B.m.A.A.m.m.m.b.m.A.m.A.B.m.m.m.m.m.m.m.m.M.m.m.M.m.M.M.m.M.M.c.c.M.M.b.c.M.z.c.M.c.M.c.c.` c.u.9.` c.c._ c.` c.u.c.c.` _ u.` 9.~ ~ 9.` ` ` ` ` c.~ _ ` c.` ` ~ ~ c.c.c.c.c.z.c.z.M.c.c.b.M.b.M.c.b.z.x.c.c.c.c.b.M.c.b.b.M.b.M.M.M.b.M.m.b.n.M.m.m.M.m.m.m.m.(.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.B.(.m.m.n.(.m.oXm.A.m.m.A.A.m.A.A.m.A.B.A.m.B.A.m.A.B.A.m.A.m.A.A.m.m.A.A.m.m.m.A.m.A.m.F.M.M.M.M.m.B.B.B.G.B.Q.Q.Q.Q.Q.oXQ.Q.oX{.Q.oXQ.oX{.Q.oXB.B.B.B.Q.Q.Q.oXQ.oXoX!.oXoX}.oX!.oX!.oX!.oX}.}.oX}.oX}.}.}.XX}.}.}.}.XX}.}.}.}.XX}.>XXX}.>X1XXX}.}.Q.Q.B.}.>X}.>X>X>X>X>X}.,X>X,X>X}.,X>X>X>X}.!.9.H D x x d d c d i 7 w 7 4 7 4 7 7 7 7 7 7 4 7 7 7 6 7 4 5 8 7 7 7 7 8 6 6 7 7 1 7 7 6 6 7 7 7 7 6 7 8 7 6 7 6 7 6 6 6 7 7 6 6 6 6 6 6 6 1 6 8 8 6 6 8 8 6 6 6 7 7 6 6 7 6 7 7 6 6 6 6 6 7 6 6 8 8 6 7 8 6 1 6 1 1 8 6 6 6 8 6 6 6 6 6 6 6 6 1 1 1 1 6 6 6 1 6 6 6 = 6 1 6 6 1 6 1 1 1 , = 1 1 = 1 = = - = ; = = & & ; ; & & & & & O X X O O O X X X X X X X X $ X O % O % # O % X O O $ O O % $ O $ $ O $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ & ",
"& = = ; ; & = ; 6 ; 6 = = = 1 ; = = - - = = = = ; = = = 1 - > C G.4X}.{.}.oX}.OXXXm.J z H F D D V S S S D F S f z f v V v D D l v D z S C v D S C C S S S V V S S m V V H H F F F G Y Y Y G Y F F G G Y F F F D D D F G G D G T G F F F F F F F F F G G F T L T P L T P L L L L G Y J J J R W Q R W Q R R Q ~ ! Q Q ~ ! ! ! ! ! / ~ ! ! ~ ! ~ 9.8.Q ~ 9.8.9.u.u.p.c.u./ u.u.u.u.p.p.c.p.c.p.i.c.z.c.x.p.c.c.i.x.n.x.x.M.c.x.x.x.b.x.c.x.b.c.c.b.n.b.b.c.b.M.x.b.b.n.M.m.n.b.n.n.n.m.n.n.n.M.m.n.M.b.b.b.b.b.b.b.b.M.z.z.9.0.0.9.u.p.u.u.u.p.p.i.c.u.z.9.c.9.9.z.c.u.i.c.u.u.z.~ u.u.u.u.u.u.u.u.u.u.u.p.u.p.i.i.i.i.d.p.z.i.p.x.x.i.x.x.v.b.v.v.n.M.b.n.b.b.n.v.v.n.n.n.N.m.n.N.n.B.B.n.n.B.B.n.n.n.B.B.B.N.B.B.N.N.B.z.9.9.9.9.9._ 9._ ~ _ ^ ^ ^ ^ ^ ^ R _ ^ _ ~ _ E E ^ E _ T T T T F T T T z v z A z z x f l l l f d p d d d a a a a 7 4 4 4 4 4 < w 5 < < < 8 5 8 < < , , , , , , , , , , 8 < 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 i 7 7 7 7 7 7 7 7 7 7 a 9 a 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 7 7 7 7 6 7 6 7 9 7 6 6 8 8 6 6 = , ; = = = & - $ % O $ O O X X X X % X X O X X $ @ O O O @ O O % $ $ O $ $ $ O $ $ O $ $ O $ $ % $ $ $ $ $ $ $ $ $ ",
"& = ; ; 3 ; ; = = ; ; 1 = = = 3 % - - - & - = & = = = = - # # d n.{.B.N.B.n.v.b.v.9.H G J J F D S D F S F R J F W G F G D Y T G T F F T F F G T T L P T G L L G G G G H F L L L W L G G G G Y G R R R ^ ^ W W W W W E W E W R L L E L L L L L R L W L L L L W L W ^ W W ^ L ^ W W W Q ^ Q Q ^ Q Q ! Q ! ~ Q Q Q ~ 8.! 9.9.9.u.u.u.u.u.u.u.9.u.u.9.9.9.u.u.u.p.p.p.p.p.p.u.c.i.p.p.p.c.x.p.x.x.x.c.x.x.x.x.x.x.x.x.x.c.d.x.x.x.x.x.x.n.x.b.n.n.n.n.n.n.n.b.b.b.b.v.c.x.x.b.x.x.x.x.v.c.x.x.b.b.b.b.b.b.b.v.v.b.z.c.z.z.v.b.v.z.z.c.u.i.u.u.9.9.u./ u./ u.` 9.9./ ~ ~ / 9.~ 9./ u./ ~ ! ! / u./ ! / / / / ! ! / / / / / ^ ~ Q ! ! / ! ! Q U Q Q Q I Q Q Q Q Q Q U J Q U U I 8.Q Q U U Q Q Q U Q Q U U U ! 8.U 6.8.8.8.i.9.i.u.9.c.c.b.c.M.b.b.b.b.c.n.M.c.b.M.m.b.M.m.m.M.M.m.b.m.m.m.n.m.n.m.m.B.G.m.m.m.m.B.m.m.M.m.m.n.m.m.m.m.m.m.m.m.m.m.m.m.m.m.A.B.oXoXoXoXoX.X.XoXoX XoX X(.Q.(.(.m.m.x.` _ E T P m Z P P A P Z P Z m m Z Z m m d m d f d s s p p s d d d a a e i d d i i a i 7 4 4 7 7 8 8 5 8 8 < 5 5 4 4 8 < , < 2 , , 8 7 8 8 7 7 8 6 6 8 = ; = & $ - O $ $ O % X X O X X X O X X O O O O O O O O @ O $ $ $ $ $ $ $ $ $ $ $ O $ $ $ $ $ $ $ $ $ $ & $ ",
"; ; ; = ; ; = ; 3 6 1 ; = = & $ - % X X % - $ & = = = ; , - > Z m.G.B.N.B.n.n.b.p.I S H G F D G T R R F T F D F R T F G G E Y Y Y T F T T F F F F F F F F D D F F F G G F G G L G G R G G R Y J Y R R R J J J L G G G G G G G Y L L T L L L Y Y G L L L I L P W L L L W W W ^ Q Q Q ^ ^ Q Q ~ Q Q ! 8.~ 8.Q Q Q ! ! 8.~ 8.! 8.9.u.u.9.9.8.u.9.i.9.u.0.9.p.c.p.i.p.p.x.p.p.c.i.c.x.M.x.b.x.x.x.x.x.b.x.b.x.b.x.x.x.i.x.x.n.b.b.n.n.M.n.n.m.n.m.m.m.m.n.m.m.n.m.m.n.n.n.b.n.n.m.n.n.M.M.n.n.n.n.n.n.n.n.n.n.b.b.b.x.c.z.b.b.b.z.c.i.c.i.v.z.i.p.c.c.x.i.c.c.c.z.c.u.u.` u.z.c.c./ c.9.9.c./ c.9.c.c.u.c.u.u.u.9.u.u./ / / 9.9.9.9.u.u.~ u./ 9.! ~ 9.9.9.9.~ u.8.~ Q ~ 9.8.9.8.! ~ u.u.~ 9.8.9.9.~ 9.9.9.9.9.8.8.8.8.0.i.i.9.z.9.H.z.9.c.9.9.9.9.u.z.9.z.c.c.9.9.z.z.u.u.u.u.z.u.z.u.u.i.i.i.z.i.z.z.z.b.v.v.z.z.z.b.v.b.b.n.m.n.n.n.m.n.n.n.n.m.m.m.m.m.B.m.Q.Q.Q.Q.Q.oXoXQ.oXoXoXQ.oX}.oXoXoXoXoXoXoXQ.oX(.Q.Q.(.(.Q.oXoXoXoXoXoXoXoXoXoXoXQ.Q.oXQ.Q.B.A.B.B.Q.(.m.m.m.n.M.M.M.c.M.c.c.~ ` ~ ~ ^ ^ Q I L L G H F D D D V z z l l d s 5 , , < 5 4 8 = 8 6 1 = - & $ $ X X X X X O O O O O - % @ O X @ X O X O X $ $ $ O $ $ $ $ O $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ ",
"$ & ; ; ; = = = ; ; = = = & & & - % X % - % = & = 3 ; ; 1 ; , x m.!.B.B.N.n.M.b.u.J v G W G D T F F F D F T D D T D G G T Y T D F F F T F D F F D F F V F F F F D F F F P F G L G L J G L W W R G R W ^ W G W G I L G Y Y Y E W R E L L E L Y Y G L P J P L W L W L I L L I W W W W Q Q W Q Q ^ Q Q ~ Q Q ~ 8.Q 8.9.9.u.9.9.9.i.u.u.u.u.u.u.9.z.i.i.9.i.u.i.u.i.p.` p.p.c.i.x.p.i.x.x.x.x.c.p.x.c.x.v.x.b.x.b.b.v.v.n.M.c.x.n.b.n.b.b.b.M.m.n.n.m.m.n.m.n.T.m.m.n.m.m.m.m.m.m.n.n.n.n.b.m.n.m.n.b.n.b.b.n.n.b.b.v.n.b.z.b.z.z.b.x.c.c.x.c.i.c.z.c.c.u.u.c./ u.c.c.u.u.c.c.u.u.u.u.~ 9.` z.9.9.9.9.9.u.c.9.9.c.c.u.u.u./ 9.9.9.~ ! ! 9./ 9.u.c.9.u.9.9.~ 9.~ u.9.~ 9.9.9.9.9.9.9.9.u.9.9.9.9.9.9.! 9.9.9.9.9.9.8.8.9.9.9.9.9._ 9.c.9.9.9.u.z.z.u.c.9.9.u.9.9.c.u.p.c.i.c.z.z.z.z.i.z.z.z.z.0.i.i.i.i.p.v.v.z.b.b.v.b.b.z.i.H.b.v.v.z.v.v.s.v.v.s.z.v.v.i.s.i.v.c.p.d.p.p.p.x.p.i.v.v.x.p.v.i.v.n.n.n.n.n.n.n.n.b.n.n.m.m.B.B.B.B.Q.Q.Q.oXQ.oXoX}.oXoXoX}.oXXX}.}.>XXX}.XXXX,XXX}.,XXXXX,XXX4X4XOX4XXX>XXX,XXX>X,XXX4X4XXX}.XXlXXXoXm.M.M.c.` ` ` ` T d = 6 1 * * & O X O X X O O O @ & O O O O O O X O O O $ $ $ X X $ $ O $ $ O O $ $ O $ $ $ $ $ $ $ $ $ $ $ $ ",
"$ $ ; $ & ; ; ; ; ; = = & % & & & & & & & = = ; ; ; ; ; ; - > l m.{.Q.B.V.b.b.b.c.G z J ^ R F v F D F D T E T D Y D T G D T F F G F F Y Y G G F G D F G F H H D G Y R R Y F G Y Y R Y J J W R R R J W Q R J R R W Y R W R G R G L E W Y E W E R L W R L W W I W W W L I R R R Q Q ^ Q Q Q Q Q R ~ Q Q 8.8.8.8.9.8.9.9.8.0.u.9.9.9.u.u.9.9.i.0.9.z.9.z.i.u.z.i.c.c.p.c.i.x.i.i.x.v.v.x.v.s.x.x.v.v.v.v.v.x.v.v.v.b.x.b.x.v.n.n.b.v.d.n.n.n.B.n.Q.m.Q.m.m.Q.Q.m.m.n.m.n.n.n.m.B.n.m.m.b.B.n.m.n.n.m.b.n.n.n.n.b.n.n.n.m.M.x.x.m.b.b.x.x.x.z.c.i.x.z.z.z.c.z.c.c.c.z.u.c.z.c.c./ c.c.u.c.u.z.z.z.z.c.z.c.u.9.~ 9.z.c.u.9.9.9.9.9.9.u./ 9.9.9.8.9.9.9.9.9.! ! ! 9.9.9.9.Q 8.9.z.9.9.9.9.9.9.8.9.9.9.9.9.u.z.9.9.z.9.Q 9.9.9.9.9.9.9.9.9.z.9.9.9.0.9.i.9.z.9.u.c.z.9.u.u.i.i.i.z.z.0.i.z.z.i.i.i.v.v.i.i.i.v.z.v.s.z.z.v.v.z.v.v.v.i.v.z.v.b.v.v.v.i.v.x.v.v.v.v.n.d.x.n.d.n.n.x.x.s.s.i.n.p.v.s.n.v.s.v.n.d.c.d.d.x.d.b.v.v.v.v.b.h.c.s.b.v.v.v.n.n.n.v.s.i.z.p.p.x.v.n.v.v.n.n.n.m.m.n.B.m.B.m.B.B.m.B.B.B.B.B.B.Q.B.B.Q.Q.Q.oXQ.Q.Q.!.oX4X>XoXoXoXOX XT , 7 6 , & & & O O X $ $ $ O O $ O O O O O X O $ O $ $ @ X % O O - O $ $ % $ $ $ O $ $ $ $ $ % % & $ & % & ",
"% $ & & & % $ ; = ; & & = = ; 3 * & ; = % = 3 ; = = ; & ; # # d m.{.B.n.m.m.b.z.Q G H G Y Y F T G T T G T D T T T F D G D G T R Y Y F Y T D D Y D G G H G F F F T D T F F G G G F R W G W G J R R R R W W Q W R R R R W I W R R E G R ^ R W ^ R W L I R W W R W W W ^ ^ Q W Q W Q Q 9.Q Q ~ R 9.8.9.~ 9.9.Q 9.8.9.9.9.9.9.9.9.u.0.u.i.9.9.u.u.z.9.i.u.u.z.u.u.z.x.x.x.c.i.x.v.i.x.i.v.x.x.v.v.x.v.x.v.v.x.v.x.b.x.x.x.x.M.n.n.n.n.n.x.n.n.Q.Q.n.m.T.Q.B.m.m.m.T.T.B.T.m.T.n.B.n.N.n.n.b.n.n.m.n.n.n.b.b.n.n.b.n.n.M.b.b.n.n.n.b.x.b.x.x.z.z.c.i.9.z.z.z.z.c.z.z.c.c.u.z.u.u.c.u.c.u.u.c.c.z.z.c.z.c.z.9.u.c.u.9.u.u.z.9.9.9.9.z.u.8.9.9.9.9.9.9.9.9.9.9.u.~ 9.9.9.Q 9.9.9.9.9.8.8.9.u.9.9.9.~ 9.9.u.u.9.c.9.u.9.9.9.9.9.z.z.9.c.9.9.9.z.z.0.z.u.u.z.0.z.z.0.i.z.z.i.z.z.i.i.z.z.i.s.v.z.s.i.v.i.i.v.v.v.z.s.v.v.v.z.i.v.i.v.b.z.s.b.z.v.v.v.x.v.v.s.n.v.v.v.v.v.d.n.x.i.d.n.v.n.v.n.d.n.v.n.v.v.v.v.v.x.n.x.v.n.v.n.d.v.n.n.b.b.n.p.p.n.v.x.p.p.s.i.i.p.p.8.p.8.! 8.p.u.c.p.i.p.p.p.i.i.i.p.i.i.i.i.v.i.b.s.i.i.s.i.i.i.i.8.s.n.m.n.n.n.n.n.v.n.n.M.T 4 8 8 , * & @ O O X X X # $ X O X % X O O X O O O $ X O O O O O O % X $ X $ $ $ $ $ $ $ $ $ $ $ : ; : & $ ",
"$ % ; : & $ ; % $ & = = = = = = = = = & = = & = ; ; ; = = > > l n.oXB.b.m.n.b.c.8.G H G R Y S F D F G D v D T F T D F F v T F T Y T F T F v G G D G T D F G F F T v Y F D R G G F W W R W Y L R G W R W R W W W W W I G G J J W ~ W R R R R W R L L L R R L I R L W ^ ^ ^ ^ ^ W W W R ^ Q ~ Q Q ~ ~ 8.9.Q 8.~ ~ ! ~ 9.u.9.9.8.~ ~ 8.9.9.u.u.u.u.i.u.u.p.c.u.c.p.x.p.x.x.x.p.x.x.x.x.x.i.x.x.i.x.x.v.x.v.x.x.x.x.b.b.x.n.n.n.n.n.n.N.n.m.B.n.m.n.n.n.m.B.T.n.m.n.m.m.Q.m.m.T.m.B.B.n.n.m.n.T.m.B.m.n.n.n.b.n.n.n.b.b.M.m.M.M.n.b.b.x.x.x.z.v.z.z.z.z.i.z.u.c.u.c.i.p.u.c.u.c.i.c.c.x.c.p.c.p.z.i.9.z.9.z.i.u.9.z.u.i.u.i.u.9.c.9.u.9.9.9.9.9.9.9.9.9.9.9.9.9.~ 9.9.9.9.9.~ 9.9.~ 8.9.9.9.0.9.9.9.9.9.9.9.9.9.9.u.u.9.i.i.9.9.z.i.9.z.i.9.z.9.z.9.9.z.0.z.z.z.z.z.i.i.i.i.i.v.s.z.s.i.s.z.v.z.s.z.v.s.v.z.v.z.v.z.z.v.z.i.z.v.b.v.v.b.v.v.x.b.x.x.v.v.x.b.v.v.n.v.v.v.x.s.x.d.s.x.v.x.n.x.s.v.z.v.v.v.v.n.x.v.v.v.s.n.v.n.n.b.n.n.n.i.p.n.d.x.p.i.c.p.i.p.8.u.u.u./ p.i.i.i.u.u.u.u.u.i.i.u.u.i.u.u.i.z.8.i.i.p.p.x.p.i.v.p.8.v.B.B.B.n.N.n.n.n.n.n.m.E e 7 7 1 = & & O O O O X X $ X $ X O $ O O X % @ O X X % % X X O % O O O $ O $ % O $ $ $ $ $ $ $ ; % ; $ $ ",
"$ ; ; ; ; ; ; ; ; ; = = = 1 = 6 ; = = & & = = & ; 3 = = , # - l M.oXQ.V.n.m.b.c.Q H v D R Y S D D F T D T T F D F D G D z G F v T D v Y T D G G D F G D Y F F G E v Y G F G Y R G R R G W G G R J W W R R Y R R J W J J I J H H J J J J J J G G G L L L L L L L E W R L L W ^ ^ W W W ~ Q ~ ^ ! Q ~ ~ ! 9.Q Q 8.9.8.9.! 9.u./ u.u.u.u.u.u.u.9.p.9.i.u.u.u.p.p.c.x.x.p.i.i.c.x.p.x.i.x.x.i.x.x.x.c.i.x.x.i.v.b.v.x.v.b.v.v.v.n.n.m.n.B.B.B.B.B.T.m.Q.m.m.Q.m.Q.Q.B.Q.Q.m.m.Q.Q.B.B.B.m.B.m.m.T.n.m.m.n.n.b.n.n.b.n.b.n.n.n.n.n.b.b.b.v.b.v.b.b.z.z.z.z.i.i.z.z.i.c.i.c.x.c.p.i.c.i.x.i.c.i.u.z.z.z.i.z.u.u.i.i.9.9.9.9.9.u.z.9.9.u.u.u.u.9.8.9.9.9.9.9.~ 9.9.~ 9.9.9.9._ 9.9.~ 9.9.9.9.9.9.9.9.0.9.9.0.u.9.9.9.9.z.9.9.9.9.9.9.i.z.9.9.z.9.i.9.i.9.i.z.9.z.0.z.i.i.i.i.z.i.i.i.i.z.i.v.z.i.v.z.v.i.v.z.v.z.v.z.v.v.i.i.v.z.i.v.b.v.z.v.i.i.x.v.c.d.x.d.v.v.v.v.v.v.v.v.v.v.c.v.n.x.d.n.x.v.z.v.v.v.v.x.v.c.x.v.x.x.b.b.b.v.n.g.b.n.i.p.s.v.v.i.i.c.p.p.y./ 8.u.u./ p.c.u.u.u./ i.p.u.x.x.p.z.x.z.z.z.z.c.x.x.x.x.x.p.i.z.i.p.v.B.B.m.N.n.B.n.n.n.n.m.W e 7 7 1 = & & X - O O O % X $ X $ $ O O O X $ O O $ X @ X % @ $ O O O $ O O $ $ O $ $ $ $ $ $ $ $ $ $ $ $ ",
"; 3 ; ; ; ; = ; ; 1 ; = = ; 6 = = = = 3 - = = = = & = = , > > l n.Q.Q.n.n.n.b.c.W S S G Y Y D D D D F T T G T v G D D D z Y F T T D D E E T G Y D H D D G G T G T D G D G G G D G G G Y W T G G L L L R L R R G T L R L W L G G J W W R W W P L T P P L W P ^ E P ^ P L L P ^ W W Q ! ! ! ! ! Q ! ! ! 8.8.Q 8.Q ! 8.8.8.8.8.! 8.u.u.i.8.u.u.u.i.i.u.i.9.i.i.i.z.z.z.i.i.s.i.z.v.i.v.i.x.i.v.x.x.n.i.v.v.v.i.i.x.x.v.v.s.v.v.b.n.N.n.B.B.N.Q.Q.Q.B.B.B.m.B.m.Q.B.Q.Q.oXB.B.Q.m.Q.B.B.m.m.n.Q.m.m.m.B.B.n.n.n.n.n.n.n.m.M.m.n.n.v.b.b.b.b.n.v.v.x.x.x.x.i.z.z.c.z.z.z.z.b.H.z.v.z.x.x.z.v.i.i.i.z.u.9.z.u.u.u.u.u.9.9.9.c.z.9.9.~ 9.9.c.9.9.9.c.9.9.9.9.9.9.9.9.9.9.9.9.9.9.~ 9.u.9.9.~ ! 9.u.9.9.9.9.9.u.9.9.9.0.9.i.9.9.u.0.9.u.i.9.9.z.9.z.9.0.9.i.i.i.i.i.i.i.i.i.i.i.i.x.i.i.v.i.s.z.v.i.z.z.H.z.z.v.v.z.v.v.v.v.b.x.x.x.v.x.z.v.v.z.v.s.z.v.v.v.s.n.v.b.v.v.v.v.v.v.v.H.b.v.b.b.v.b.b.v.v.v.v.v.x.v.b.x.x.v.b.b.b.b.b.n.n.b.n.i.i.v.v.z.i.z.c.i.i.u.8.8.u.! u.u.u.9.9.~ ~ 9.9.! u.~ u.u.u.u.u.u.u.u.c.i.u.i.x.u.c.p.p.p.x.T.B.B.v.n.N.n.n.n.n.B.W e 7 7 6 ; ; & O O $ O $ X $ X $ X O $ X % O O $ O X O % X $ O O % X $ O $ $ $ $ O $ $ O $ O $ $ $ $ $ $ $ ",
": ; ; ; ; 3 ; ; ; = 1 6 ; ; = = = 6 = * - - = 3 = = = = = - - l M.Q.Q.c.n.M.b.z.R f z J W Y D F D v Y T F T T F Y D G D v F F F G D D Y T v D T D D G D D D v F T v D D D G F F G J R G W G G R L L L L L L R L L L L G G L W W W Q E R E ` ^ ^ E L E E ^ ^ ^ ^ E W ^ ^ ^ ^ P W Q Q / I Q ! ! Q ! ! 8.Q 8.8.Q 8.p.8.9.u.9.p.u.u.u.8.9.i.y.0.u.0.0.9.i.i.i.i.i.i.z.z.z.i.i.i.i.i.i.x.v.i.s.i.v.x.i.v.i.i.s.v.v.v.v.x.v.v.n.v.b.n.n.B.B.B.m.T.m.m.N.B.B.B.Q.Q.B.Q.oXQ.Q.Q.G.Q.Q.Q.Q.m.m.B.Q.m.Q.m.N.B.n.n.n.n.n.n.n.n.m.T.n.n.n.M.n.n.b.x.b.n.n.v.v.v.v.z.v.z.H.c.z.b.z.b.b.c.b.b.x.z.i.i.i.p.i.u.z.c.z.9.z.9.c.9.9.9.9.u.9.c.z.c.c.9.9.9.9.9.9.9._ 9.9.9.9.c.9.c.u.9.c.~ 9.9.u.u.9.~ 9.9.9.9.z.9.u.u.0.9.p.y.9.9.0.9.i.i.u.9.i.i.9.i.z.u.0.z.i.z.y.i.i.0.i.i.i.i.i.z.i.i.i.i.i.v.i.z.z.v.z.s.s.z.i.s.z.s.v.v.z.s.z.z.x.x.i.x.s.x.b.b.v.v.i.v.v.v.v.i.v.v.v.v.s.n.b.b.v.v.b.d.b.b.v.b.b.v.z.v.v.v.v.v.b.v.x.x.v.v.x.b.b.b.b.b.b.v.n.i.i.b.b.v.z.0.z.u.z.u.u.! u.u.u.u.u.~ z.9.u.u.i./ u.u.p.i.i.u.u.c.u.u.p.x.c.z.c.u.p.u.u.p.x.n.n.n.v.v.n.V.n.n.n.n.L e i 7 1 = & & O O O O X $ X $ % $ $ O $ X X % O O $ O @ X X O O X % X $ O $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ",
"; ; ; ; ; ; ; ; 6 1 = = = = = = = & = = - = = & & & = = - - > Z b.Q.m.x.v.n.b./ G j M J W Y S T T F Y v F Y G G T F T T T T G G R T v T T D D R T G R D G v T G T F G G D G H G G G G G W Y F G T L L L L L L G L P L L L T E T m d l Z A P Z Z Z Z Z m Z P Z Z Z Z T ^ ` / E ^ ^ ^ I / Q ^ ~ Q ! ! 8.8.8.Q 8.8.8.8.9.8.8.u.8.u.u.8.u.u.0.i.i.9.i.i.z.i.i.i.z.z.z.s.i.z.i.i.i.i.i.s.i.i.x.p.x.x.i.x.c.v.v.x.v.x.i.x.z.b.n.n.b.n.n.B.B.B.m.n.m.m.n.n.Q.Q.Q.Q.oXQ.Q.m.B.Q.Q.Q.Q.oXQ.m.Q.Q.m.Q.Q.n.m.N.n.B.T.m.m.n.T.M.n.n.b.n.n.n.n.M.n.n.n.n.n.x.M.v.x.x.z.b.b.b.b.c.b.b.c.z.c.M.z.z.z.x.c.p.z.c.c.z.c.c.c.9.u.u.c.u.~ c.~ ~ u.u.c.~ ~ ~ _ 9.9.9.9.9.9.9.9.9.9.9.9.i.9._ c.9.9.u.9.9.9.u.9.9.9.8.8.u.u.0.8.p.8.i.9.i.i.9.0.u.0.9.i.9.H.u.z.9.9.i.i.i.i.i.i.z.z.i.i.z.i.c.i.x.v.i.i.v.i.H.H.v.z.H.s.v.v.v.s.b.v.v.v.s.v.i.x.x.x.v.v.v.i.v.z.v.v.v.s.i.v.b.v.v.b.n.v.s.v.z.v.v.v.v.v.v.v.v.z.v.z.v.i.v.x.i.x.c.x.x.v.z.b.v.b.b.x.n.n.i.i.v.b.z.9.u.u.9.z.9.! ! u.9./ u.u.9.9.~ 9.9.u.u.z.i.u.u.p.u.u.u.i.9.u.z.u.c.p.i.u.i.u.u.x.m.B.n.n.n.n.b.N.b.n.n.R i 7 7 1 , * & O O @ O O O X $ O O O O $ X X O O O X $ X % % O O $ O O O O $ $ $ O O % $ O $ $ $ $ $ $ O $ ",
": ; ; ; ; ; ; = ; ; = = = = = = = = = * = = = = = = ; = > - > V M.T.n.p.s.b.c.^ G f S R R G D G F G T T D v D T T v D T D v D T Y T D D D D v G z G G D G F D F G D G G G T G G F Y G G Y G G I G L L L L L L G G G T L L ^ E f 7 7 4 7 7 Z c 7 4 7 8 8 7 7 7 4 d i Z A A F E E E E L L ^ ~ Q Q ! ! 8.Q Q 8.8.Q 8.! 8.9.8.! u.8.8./ 9.8.9.9.9.i.9.u.i.9.i.u.z.i.z.z.z.z.i.z.i.v.x.i.i.c.x.x.x.p.c.d.d.x.x.x.x.x.v.b.v.v.b.n.n.n.n.n.m.m.n.m.T.Q.B.Q.oXQ.Q.B.m.B.B.B.m.Q.Q.oXQ.Q.Q.Q.Q.Q.Q.Q.B.Q.B.B.n.m.T.m.n.T.T.Q.m.m.n.b.n.n.b.b.b.v.b.M.n.b.b.b.x.x.b.z.b.c.b.z.c.c.z.b.z.z.c.i.c.p.x.c.c.c.c.9.9.c.9.c.9.` 9.c.z.~ / u./ u.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.H.9.9.9.8.9.i.u.u.0.9.9.Q u.8.8.u.8.8.9.0.9.i.9.i.9.i.z.9.9.i.9.9.9.z.0.0.i.i.i.i.i.0.9.z.i.u.u.u.i.i.i.i.i.i.v.z.i.v.s.z.v.z.i.i.H.z.z.v.v.v.x.v.i.x.v.v.i.v.v.s.b.v.s.v.v.v.v.i.v.b.b.s.b.b.b.b.v.v.b.x.z.b.b.v.z.v.b.b.x.n.x.x.p.p.x.i.z.v.z.v.z.b.b.x.v.i.i.i.z.z.z.9.z.9.i.9.8.! 9.9.9.9.9.~ z.9.8.9.p.u.c.u.! u.u./ u.u.u.9.c.z.u.z.c.u.u.p./ / x.n.B.N.n.b.n.n.v.n.m.m.R w a 7 6 , & & O O $ O O $ $ O O O O % X $ X O O % $ X X X X X O $ O O O O O $ % O O $ $ $ O $ $ $ $ $ $ $ ",
"$ ; ; ; = & & & ; = ; = = = = = = = = = & = = 3 = = ; = * # , f c.T.c.i.z.z.9.R H f F G G G F S D D G D T D T T Y D T D D D T D D F D F F D v D S D G G Y Y S D G D H D D R R G Y Y G F G G G F G G I I L L L G W L G G F ^ D 5 f A d , 8 c E c 8 8 , - Z A 8 7 A Z d d , i x i s C r p G ^ ~ W Q 9.9.Q ~ 9.~ 8.9.u.~ 9.9.9.z.c.c.z.9.9.9.z.z.z.z.9.9.c.u.9.u.z.u.u.z.z.z.z.x.z.z.u.z.c.c.i.z.u./ p.c.p.c.v.x.v.b.b.b.v.v.n.m.B.B.n.n.n.m.n.n.B.Q.B.Q.(.m.B.n.B.Q.B.B.Q.oXQ.B.Q.oXB.B.B.G.m.B.B.m.B.B.m.m.m.m.m.M.M.m.T.m.n.n.b.n.n.n.n.b.n.M.n.b.v.x.x.c.x.x.x.b.c.z.c.b.z.v.z.b.c.x.c.c.c.u.u.z.c.9.c.c.9.9.c.c.9.u.c.u.u.u.9.9.u.u.u.u.u.i.9.H.9.9.9.9.0.9.9.9.9.9.9.i.9.9.9.8.9.0.9.9.9.0.H.9.9.i.0.8.9.0.z.z.z.i.i.u.i.z.u.9.z.z.i.i.0.z.z.c.i.x.i.p.u.i.i.p.c.i.u.i.i.i.i.i.i.v.s.z.i.z.s.v.s.z.H.i.s.v.i.i.i.i.v.i.s.x.v.v.z.v.b.s.v.s.v.i.v.z.i.v.b.v.i.9.R Q n.Q.M.c.M.m.m.m.M.x.b.b.c.c.u.i.z.n.x.i.i.i.v.v.x.x.i.v.v.i.i.i.v.i.z.i.i.z.0.9.9.8.~ 9.8.~ ~ 9.~ ~ 9.8.9.9.8.9.9.! u.9.9.! u.9.9.z.c.u.u.p.u.u.u.! ! p.T.B.n.b.n.m.b.v.b.b.m.Y i 7 7 6 ; = ; $ X X X X X X X X X X X X X X X $ X O % O - - % O O O $ O % O $ $ $ $ $ $ O $ $ $ $ $ $ $ $ ",
"$ 3 ; ; ; ; = ; 3 ; 1 = = = = = = = = = 3 = = = ; = ; 1 , # > x M.m.x.i.z.z.c.W D j S R Y G D D D S T D D T D D T v T D v D T D D F D F T D S D D D G D G G S D G D D S D G F D F Y Y F L F G L G G L I L R L I I L W R ^ F p < 5 s 5 > < 7 7 8 < 5 < - 7 7 5 4 7 Z E d < l C 4 < d t f W c.c.Q Q ~ 9.c.9.9.8.~ 8.9.u.u.9.9.9.9.9.9.z.u.9.z.z.9.z.9.z.9.z.c.u.u.z.i.z.z.z.z.z.x.z.z.z.z.z.c.z.i.c.x.x.x.x.x.x.n.n.x.x.n.n.m.n.m.B.m.B.m.m.Q.m.Q.Q.oXQ.Q.oXoXQ.Q.Q.Q.Q.oXQ.Q.oXQ.B.n.n.B.oXQ.m.m.B.n.B.B.m.T.Q.m.m.Q.T.M.n.n.m.b.n.M.n.M.b.x.x.c.x.n.x.x.x.x.x.v.b.b.c.b.M.z.b.z.x.x.c.x.p.p.c.c.z.z.u.9.u.u.9.u.~ 9.u.~ c.u.9.u.9.9.9.9.9.u.9.9.8.9.9.9.9.9.H.9.c.9.9.9.9.0.9.9.0.9.9.9.9.0.9.9.9.0.9.9.H.9.9.u.0.i.9.9.u.u.9.z.i.i.u.z.0.z.z.9.p.i.p.c.i.c.u.c.x.p.c.i.i.x.i.i.z.0.i.z.z.s.z.v.i.v.v.v.v.i.v.v.v.v.x.v.x.v.x.i.i.v.v.v.z.i.v.v.b.s.v.b.n.i.i.x.J 2 t ` _ f m T ^ Y V C ` M.^ d f ! z.c.i.v.i.i.i.s.i.i.x.v.s.x.i.i.0.b.i.z.u.0.9.9.9.9.~ ~ u.` 9.c.9.9.9._ 9.i.u.! u.u.8.9.u.9.u.u.u.9.u.c.! u.x.u.u.u.u.! i.n.B.n.b.b.n.n.b.n.b.m.W i 7 7 6 ; & & & O O % X - O O O O $ $ $ O O $ O % O $ X X X X O O O O $ X O O X $ $ $ $ O % $ $ $ $ $ $ $ ",
"$ & ; $ = $ ; = ; = ; = = = * = = = = - * & = = & = ; = , * , Z b.T.x.i.9.z.9.R S f v G Y Y G D S D Y T T v v F G D T T T G T T T G D T Y F D F D T G G G G H G T D F S F Y R T Y Y G Y L G T L G G I I R I J J W I L J ^ Y V f m Z l d f Z Z Z Z Z Z m V A V V V E ^ T f T ^ F m F E _ ` ` Q ! ~ Q Q W R 8.8.9.8.9.9.9.~ 9.9.9.9.9.u.u.u.u.z.z.z.z.9.z.c.u.z.u.z.z.v.z.z.v.z.b.b.v.x.v.x.v.x.x.x.x.b.x.x.x.x.M.x.b.b.b.M.n.n.n.n.m.m.(.Q.(.Q.Q.(.Q.Q.oXoXoXoXoXoXoXoXoXQ.Q.Q.oXB.n.b.Q.{.oXQ.Q.Q.T.Q.Q.Q.m.Q.m.m.Q.m.M.m.n.n.n.n.n.n.n.n.M.v.M.v.b.x.n.b.c.c.M.c.b.M.b.b.M.c.z.c.c.c.c.x.c.c.u.z.u.9.z.9.9.c.~ u.~ c.u.u.u.c.p.9.9.9.u.u.9.9.9.9.u.z.9.i.9.9.9.9.9.c.9.i.9.9.u.i.z.c.z.9.9.9.9.9.9.i.9.c.9.9.9.9.z.i.9.u.u.i.u.z.9.u.u.u.i.z.z.x.c.x.c.c.p.p.p.i.c.z.u.i.i.i.i.i.v.s.z.i.i.z.v.s.v.i.v.b.v.v.z.v.v.v.i.x.x.x.x.b.v.v.v.v.b.v.b.b.v.z.n.b.! H ~ ^ z c.T < < F i < i 7 7 C E x w G b.n.z.c.i.s.i.p.i.v.i.i.x.i.v.z.i.z.z.z.z.u.9.9.8.9.8.Q 9.~ u.~ 9.9.Q 9.9.~ u.u.~ u.u.9.u.u.9.~ z.u.~ u.u.~ u.c.u.u.c./ ! c.n.B.n.b.b.m.n.n.b.n.m.E a 7 7 1 , * & & X X % O O % O O O X O O O $ O O O O O X @ X X X $ O O O O O % $ X $ O O $ O O O O O O X $ ",
"$ : ; $ & ; 3 ; ; 1 = = = = & = = = = = * & = - = & ; = ; > , x b.m.i.9.i.9.8.Q H j S G Y Y F D v D T D D D T F G D D D D D T D D D D T F F F F D G D D D D S F J S S S F Y R G Y L Y F R G L L J J W G W R J J J J W G T E ~ ^ E E _ ` _ T E _ ^ ^ ` _ ^ E _ ` _ _ _ ^ _ ` ^ _ ` ^ ` ` _ W ^ _ c.z._ _ 9.c._ ` 9.9.` c.c.c.c.c.c.M.c.c.c.c.c.c.b.M.c.M.z.M.M.M.M.c.c.M.M.c.M.M.M.m.M.m.M.M.M.M.m.M.m.M.M.M.m.m.M.M.M.m.M.m.m.(.m.m.m.m.m.m.m.(.Q.(.Q.(.oX XoXoXoXoXoXoXQ.A.m.oX(.m.M.m.(.Q.(.Q.(.(.(.m.(.m.m.(.m.T.Z.m.M.m.M.M.m.M.M.m.M.m.n.M.M.M.M.c.M.M.c.M.c.M.M.c.c.c.c.c.c.c.M.c.c.c.M.` c._ c.9.~ ~ ` / c.c.u.` ` / ` ` c.` c.9.c.9.9.c.c.9.9.9.9.9.9._ 9.9.9.9.c.9.9.` 9.9.9.9.9.9.9.c.9.9.c.9.9.9.9.c.9.9.9.9.u.u./ u.u.u.u.u.u.u.u.u./ p.u.p.c.u.u./ u.u.u.u.u.i.i.i.0.i.i.i.i.v.v.z.b.i.v.i.i.v.i.x.x.x.v.x.x.x.v.b.b.b.b.v.b.s.v.i.v.s.b.b.b.b.9.J v w _ l > 4 T i d Z f T < > a c.m.b.Q z.m.x.p.c.s.x.s.p.v.i.x.x.i.0.0.z.z.z.u.0.9.~ 9.9.Q ! / ~ ~ 9.` ~ 9.~ ~ z.u.~ 9.u.! ! 9.! ! / 8.~ u.u.~ u.c./ u.u.u.! c.m.m.n.b.z.b.n.b.b.b.m.E d 7 7 6 ; & & $ + X O O O O O O O O O O O X O $ O @ % X % X % $ X % O $ O O $ X $ O O $ O O % O O O O O O ",
"% ; : ; % & ; ; ; ; = = = = = = = = = = - = - & = = ; * , * , x c.n.v.p.u.u.~ J j f S F L L F D D D D D C C F A F z D D C D D D z D v D F D D D S D F S G G v D G D D S F G G G T Y R F L Y G L G J W J Y R L R E Y Y Y E T A x c c Z c c c A c c A Z Z 9 c c Z A x c c x A c c A A A c c A A A x A x A c A x A x A x A A A A A A A A A C A A A A T A T T A T T T T A _ T T E T _ T T _ T E _ _ _ | _ E _ _ _ T _ _ _ _ _ _ _ _ _ ` ` _ ` ' _ ` [ ` ` ` [ ` [ ` { M.[ ` [ ` ` { { ` _ ` M.{ [ Z.M.M.` { M.[ ` M.M.[ M.` M.{ M.M.` ` [ M.Z.M.M.M.M.[ ` ` [ M.M.` ` M.[ M.M.[ M.` { ` ` [ [ M.` ` c.M.M.` M.` ` ` ` M.` ` ` ` ` M.` ` M.` ` ` ` ` c.` ` ` M.M.M.` M.` c.M.` M.` c.M.` c.` c.` ` c.c.c.c.` ` c.c.` c.c.u.c.c./ c.c.c.c.c.c.c.c.c.` p.p.M.p.x.p.c.c.c.i.c.i.c.p.c.u.i.p.i.z.z.v.z.x.z.z.z.i.z.i.x.x.x.x.b.x.x.b.n.x.v.x.v.x.v.v.x.i.0.v.b.v.v.n.m.9.f < x z f a d z _ T f _ 4 < E m.c.~ i.v.i.y.p.p.i.i.i.i.v.x.p.x.z.i.i.i.u.i.9.9.u.8.9.~ Q / ~ ! ^ 9.~ ~ 9.~ 9.9.9.~ 9.9.8.9.9.! ~ u.~ 9.c.9.~ c.c.~ u.u.~ ! u.n.m.n.i.i.z.b.b.u.z.M.E i i 7 1 ; = & & O O $ O O X @ O X O O O O % O O $ O % O X O X $ X % O O O $ O X X O X O X X O X X % X O O ",
"% : ; ; & & ; % & & = = = = = ; = = = & - % = = 3 = * * * > , x z.n.i.p.! u.! W S f S P Y L F F S D T D F C D F T z D D D D D D D T D T F D D D D D F D D D D F D D G S F R Y Y G R R G R G L R G J R J G R L L L E E E _ T a # # @ & @ $ & & & % % - * - # - $ - # O @ @ $ @ @ & - & @ @ O # @ O O - @ & @ @ @ - - @ * * * - - - , * * - - * & * * - * - - * = * * - O - - ; & & * & = * * & ; 1 , * * & * ; ; , * = ; 1 ; ; , ; 6 ; 6 = 1 1 6 6 6 1 1 6 ; 6 6 6 6 7 6 7 6 1 6 7 9 6 6 6 7 7 7 7 9 9 7 9 7 7 9 7 9 9 d c c 9 c 9 Z 9 Z c c 9 9 7 Z Z Z c c c c Z 9 c c c c Z c Z Z Z Z Z c Z A A x c A Z Z A A A Z A Z A A A A E A A A T A T T | A T T T A T T T T _ A _ _ _ _ E E _ _ _ E _ _ _ _ _ _ ^ _ _ _ _ ` _ ` ` ` ` ` ` ` ` ` c.` c.M.M.` (.` ` ` ` M.M.M.` M.M.c.c.M.M.M.c.M.c.M.M.b.M.M.m.M.M.M.M.m.M.m.m.M.m.m.M.m.M.M.x.M.M.M.m.b.b.b.m.M.c.M.m.m.M.c.c.9._ E E F E _ T E T _ M.M.c.z.v.p.0.y.u.i.c.p.i.i.x.i.x.x.z.9.i.z.u.u.9.9.u.9.9.~ Q ^ ! Q ! ~ ^ Q ~ Q ~ 9.~ ~ u.~ ~ 9.c./ ~ c./ u.u.~ ~ ~ u.` u.u./ ! c.n.m.n.i.8.i.z.z.0.z.b.T a 7 7 1 1 & & $ O X X O O O O X O O O O @ O O O O $ X % X O O X $ O O % $ X O X X X X X X X O X X O O O O ",
"$ $ & $ ; & ; ; * = ; = = = * & = = = & - - & & & & ; * * - > C M.n.i.z.y.u.~ G S f V F T F F D C C F D D F D D T D z T D D D D D G D T G D D D D D F S G D D D G D D H F G W G Y R W Y R L I G I I J I L L L L L E E E ^ _ c . KXKX| o o % KXKXKXKXKX o o % % xXKXKXKXKXKX o % % o o . o % % . . KXKXy.i.p.p.i.i.p.i.p.x.p.p.z.u.9.z.u.u.u.u.9.9.9.^ Q / Q W ^ 9.9.~ _ 8.9.9.9.! ~ / / / u./ ~ ` ~ ^ ~ 9.~ c./ 9.~ 9./ ! u.x.m.n.i.i.i.i.z.9.9.M.E 4 7 6 1 = * & & $ $ X $ O @ O @ X X @ @ % O $ O O % $ @ X X % X $ O O O O O O X O X X X % X O X X X X O O ",
"& $ $ ; $ ; & ; ; ; 1 ; = & = = = & = - & = & $ & ; = , , - > A n.n.v.s.p.p.~ I S f V F F F C C z D F D S D D S T z D D D D D D D D D T T D F G D G G F D G F D G D D G F T R T G G Y R I L R I W I I I W W W W R L L L E _ c . KXKX| KXKX} } KXKX ' KXKX KXKX KXKX . KXKX' o KXKXv.i.i.i.i.i.c.p.x.p.c.x.z.0.9.z.u.u.u.~ 9.9.~ W ^ / ^ W Q 9._ ~ 9.~ Q _ ~ ~ ~ 9.! ~ / / ~ ~ ~ ! _ ` 9.9.u.~ u.c.u.~ u.n.n.n.v.i.9.i.0.9.9.c.E a a 7 1 , * & O O X O O O @ @ O @ O X X O O O % O O # % X O % O O $ O O X O O O O X X X : X % O O X X O O ",
"$ $ $ $ ; ; ; ; ; ; ; ; = ; = = & & = = = & & = & = = = = # > A m.n.i.z.i.u.~ R S f S F T P F T D D T G F F F F Y D D T D T T D G T D T T D F F D F G D G G G G Y G G G G Y W Y Y Y Y J W I J W J Q I I I L I W W L L T E E c X KXKX| | LXJX KXKX} } KXKX ' KXKX KXLX KXKX . KXKX' PXKXKXKXKXKXz.u.z.0.i.i.i.i.i.i.i.z.z.9.9.z.i.u.u.9.9.9.~ W ! / ^ W ^ ^ Q ~ 9.~ ~ ~ ~ ~ ~ / / ^ ! ^ ! ! ^ ^ 9.~ 9.c.~ u.9.9.u.u.p.n.B.n.v.p.0.9.9.9.9.c.T i 7 7 1 1 = & @ + X O @ O O $ O # O X @ O O O O O O $ O % O % O O X $ X $ O O X X X X X X O X O X X % O % ",
"; $ ; ; $ ; ; ; & ; = * * = & = & - & = = = ; = ; * = , , - # Z M.m.i.0.9.8.~ Y f f V F T F C C z z D D S D S F T D z D v D D z v D v D D D D F S S S D D D v D G D S F D T R T G G L J I R I I J I I I W I W W W L R L E E c # KXKX| ' gXgXKXKXgXgXgXgXgX IXKXLX KXKX| o 6 KXKX } KXKX 9 KXKX IXKXKX KXKX KXKXgX KXKXc.z.u.u.i.v.i.z.z.i.z.v.z.0.9.z.u.u.9.u.u.~ / U ^ ! W W ^ ~ _ Q ~ W Q 9.~ ^ ~ ~ ^ / / / ^ ` ~ ^ 9.9.9.9.9.~ 9.u.! ! u.b.n.m.i.p.9.9.0.9.9.c.Y 4 a 6 1 1 & * - O @ $ O @ O @ O $ O O X O $ $ O O O O O O O X O $ O X $ X O % % O X X X O X X X X O O X X ",
": 3 ; $ $ ; % ; ; & * ; * ; = = & & = = = = & ; = ; * * , - > Z b.n.z.0.8.! ^ W M f V T Y T D D z A D D S D D F D D D D D T T D T T v T G D S F S D F D G G D G Y T T G G R E R E R L I W W I W Q W I Q Q I W J W I L L ^ E c X KXKX| o 9 KXKX KXKXxX KXKX o xXKXKX KXKX KXKX KXKXeXKXKXgX KXKXc.z.z.0.i.i.i.i.i.i.i.v.v.9.0.z.u.u.9.9.u.u.! W ^ ! ^ W ^ ~ ~ ^ ~ W ^ ^ / ^ ! / ! ^ / ^ ^ ~ ^ ^ ~ ~ ~ _ / 9.~ u.! ! p.v.n.n.s.u.9.0.0.9.9.b.Y 4 7 4 1 , = * - @ X @ O O O @ O O O O O O X % X % $ O O O X $ O $ % O X $ O % O O X O O X : % X X O O X X ",
"$ ; ; $ ; ; = ; ; ; = & = * = ; ; = = = = = ; = ; = - - * - - Z M.n.0.0.8.9.Q L V f V P Y T D A D C D D D D S D T D C z D D D z D T D F F D S D S D D S D D D D Y v D D D H R Y Y Y I G R W W W W Q I I W W W I W E ^ L L _ c # KXKX| 9 KXKX KXKXKXKXKXKX KXKXeXKXKXKXKXKX o gXKXKXKXKXKXKXKXxX KXKXeXIXKXKXKXKX KXKXL.IXKXKXKXKX KXKX KXKXKXKXKXKXKXKX KXKXxX KXKXKXKXKXKX KXKXKXKXKXPX ; KXKX o PXKXKXKXKXKXc.z.i.z.i.i.i.i.x.s.i.z.z.9.9.v.i.9.9.9.9.! / Q ^ / ^ W ^ ~ Q ^ ~ ^ ^ ~ ~ Q / ^ ^ / ! ! ~ ~ ~ Q ~ ~ 9.9.~ ! u.u.8.! / v.n.n.p.u.9.z.0.0.9.c.W p s 4 1 1 * * - @ O O @ O @ O @ O O @ O O O O $ O O O O O $ X O O $ X $ $ O O O O O % X X X X X X X X X X ",
"; $ ; ; $ ; ; ; ; 3 = = ; * ; ; 1 ; ; & * & = = = = = - > - > A n.n.i.i.u.9.^ G v f m F T T C C C C F F D D F D F F C C z T z D D T D F F D D F D G D G G D D G R T G Y Y E W R Y W J G J W I W Q W W I Q W W I W W ^ E E E c # KXKX| xXKXKX KXKX9 9 KXKX KXKXKX9 KXKXPX KXKX; o ' KXKX o 6 KXKX KXKXKXJX gXLXgX | LXJX KXKX9 KXKX & KXKX KXKX xXLXKX KXKX ; KXKX KXKXu.u.i.i.i.i.i.i.i.z.i.z.z.9.u.i.u.u.u.u.u.~ / W Q ^ ^ W Q ~ ^ ! ~ ^ W ^ / W ^ / ^ / / Q ^ / ^ ^ ^ ! ! ~ ^ ! u.u.! ! ! x.n.n.p./ 8.0.0.8.9.z.Q f l a 6 1 ; = @ @ & O O @ O @ O O @ O O O O O $ O X @ O O X $ X X X $ O O X O X X O X O O O O X X X X O O ",
": & $ ; ; ; ; ; ; ; = 1 ; = = = * = * & - = ; = = & * * - - , Z M.n.9.i.u.9.9.R S f V F L F V A A F C C D F D D G C D A D D T v D F z D D C v G D T F v D H D F D D D D F Y Y F T Y G J J R I I W I Q Q Q ^ Q J L W L W E ^ c @ KXKX| o xXKXKX KXKX9 9 KXKX KXKX KXKXLX KXKX; ' KXKX o 6 KXKX KXKX9 gXKXgX | KXJX KXKX6 KXKX KXKX xXKXKX IXKXKXeXKXKX ; KXKX KXKXu.u.i.8.u.i.i.9.i.i.i.i.z.9.9.i.i.c.! ! / / / ^ ^ ^ / ^ ^ ^ ! W ^ ^ ^ / ^ W / / P I / / ^ ` / ^ ~ ~ ~ ~ ! Q ~ ~ I Q ! x.n.b.p.8.0.9.i.8.8.z._ v z 7 7 1 , * * & - @ @ O @ O O O O O O X $ X O O O O $ X $ $ $ $ O % O O X X X X X O % X X % X X X O O O ",
": ; ; ; ; ; ; ; ; ; ; ; 1 = ; ; ; = ; & = $ = & * * * * * - , F m.n.i.i.u.9.Q J V f V F F T C F D C F C D F D D F D C D D D F D D D D D F D D G D G G D R D S F R D G G F Y W T G Y G W W R I Q Q Q Q Q Q W W J R W W E ^ E c @ KXKX| o . . . 9 KXJX KXKX KXKX KXKX KXKX] KXKX PXKXKX xXKXKX KXKX KXKXKX JXKXKX KXKX KXKX ' KXKX KXLXPX KXKXKXKXKXKXKXKXKXKX] xXKXKX KXKXc.u.u.u.u.i.i.i.i.i.i.z.z.i.u.u.u.u.! ! u.! / W W / ^ ^ ^ ^ ^ W ^ ^ ^ Q ^ L Q I W Q Q W ^ ! ^ W ^ ^ ! ~ W ! ~ 9.U ! ! x.n.x.p.8.9.0.0.8.8.u.9.G T a < 1 1 , * @ O # % O O O O O O O % X X $ % O $ X O O @ O $ O O $ O X % O % X X X X X X O X X X X X % ",
"& $ ; 3 ; ; ; ; ; ; ; ; * ; = = = ; = * = = ; & = = * = = # , A b.n.i.i.u.9.~ G M f V F T P F A C C C Z V D V S F C Z C D v F D D T D F D D D D v D D D G D S D G D H F F G R G G R R J W W W W I W Q Q Q ^ Q I E W W W ^ _ c & KXKX| o ) wX wXwX [.FXtXA | xXKX| 9 xXIX| o xXKX| xXKX| ; o xXKX| o xXKXxX| xXIXPX| | xXKX| xXLXxX| xXLXJX| xXKX| | KXJXxX o gXJXKX| xXLXgX| KXKX| | xXKXKXxX xXIXPX| KXKXu.u.i.u.i.i.u.i.i.i.i.i.z.8.u.u.u.u.! ! / / / I W ^ / I ~ ~ ^ ^ ^ ^ ^ ^ ^ W / ^ W / / Q ^ ^ ^ ^ ~ ~ ! 9.! ^ u.9.! ! 8.p.n.p.y.u.9.z.0.8.Q 9.c._ T a < 8 1 * - - O X @ O O @ O O O O O $ $ X O O X $ X O O O $ O O O X X O O X X : X X X X X X : % O O X ",
"$ ; ; ; ; $ ; & ; ; * * ; = ; = ; ; = = = = & * - = = = , - , C m.n.9.0.z.9.Q J m f V F L T C F C F F C D D D S F C z D D T G z D F v T F D z D C D D F G D v D Y D H D G G Y G Y R R L W W W W W Q I Q Q Q W W I R R E E _ c @ KXKX' . { KXKXL.KXKXxX . + LXKXKXKXKXL.JXKX| } KXKX | KXJX o KXKX KXKX & KXKXKX KXKXKXKX KXKXIX ] KXKX KXKX} . KXKXxX KXKX KXKX | KXKX KXKXPX IXKXKX KXKX' | KXKXKX o & KXKXeXKXKX; KXKX KXKXz.i.i.u.u.i.i.i.i.i.z.i.z.! u.u.u.u.! ! / / ~ W I / ^ ^ ^ ^ ^ ^ ^ W L ^ Q I / Q I / Q Q W / ^ W ^ Q ! ~ ^ Q / / Q U / x.b.v.p.u.u.i.0.8.! 9.c.9.E a 8 6 1 - * @ # @ O @ X @ O - X X O $ O $ O O $ X O O O - X % X $ O X X X X X O O % X X X O O X X O X ",
"$ $ $ ; $ ; ; ; & ; ; ; ; * = ; ; = = = = & * & - = - * = # , C m.n.i.0.9.9.Q G M f V P E F F A C A T C D F D D F C A D D D T D G F D D F D G F S D F D G F D D Y D D R G G ^ T E R L W R J I Q Q Q Q Q W ^ Q W I W L E ^ ^ c * KXKX| : eX o } KXKXKXKXKXJX eX) } KXgX KXKXKXLXKXJX KXKXKXKXKXKX gXKXKX KXKXKXKXLX>.KXKX LXKXuXpXKXKXKXKXKXKX| LXKXKX KXKX JXKXKXKXKXKX o KXKX KXKXKXKXKX] KXLXxX KXKXPX PXKXKX $ KXKX IXKXKXKXKX . ) eXeXKXKX9.u.9.u.0.p.z.0.i.i.0.i.i.9.9.u.u.u.! ! 9.! ! ^ ^ I W ^ ~ ^ W ^ ^ W L W ^ L / ^ W Q Q W ^ ^ ^ L ^ ! ^ ! Q Q ! ! W ! ! p.n.i.u./ i.u.0.8.9.9.z.c.E 7 < 7 < * & @ $ O O O O X X X % X O O X O $ O X $ O X X O $ $ % O O O X O X X O O X X X X X % X % X X ",
"3 & $ $ $ $ ; $ ; & * ; ; * ; = ; 6 ; = $ = * * & & - = = - > A M.n.i.H.9.9.Q G V f V T L E F F F F F D D F D z D C D D D D T D T T D D F F D T D D S D T G D T Y F G D F Y E Y Y E R R W W W W Q Q Q I W Q Q W W W R R E _ c * KXKX| 9 KXKX . . wXeXeXeXeXeXwX KXKXF.+ } KXgX KXKXIXJXKXKXKX X o o o LXKXKXgXo gXKXKXKX PXKXKXeXKXKXc.9.0.i.i.i.i.z.i.i.u.9.i.9.8.u.9.u.! ! / Q ^ Q ^ ^ ^ I ~ W W ^ ^ ^ W ^ Q P ^ ^ W ! / ^ ^ / ^ ^ ~ ^ ~ ~ ^ Q / ! W U ^ x.n.n./ ! 8.i.8.8.0.z.c./ L 4 4 7 6 - & & $ $ O O O $ O $ O O O O O O O O % X O O O $ $ $ O O % O X % X O X X % O O X X X O O X X ",
"& $ $ & ; $ ; = ; ; ; * * 1 ; = ; ; = ; ; & ; = - = = = , # , F b.m.i.0.9.9.Q J S f V T T L C Z C C F C S D D D D C C F D v F z v D D D D V C F v S D S D G v D T v G D D Y Y F L L R R R W Q Q Q W I Q W W Q ^ ^ ^ E E ^ E c @ KXKX| o xXKXKXKXKXo + } LXLXL.KXKXxX KXKXKXKXLX + LXKXKXKXKXKX9 % KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKX . PXKXKXeXKXKXc.9.0.9.u.i.9.z.i.z.z.z.z.9.u.u.u.u.! / / ! ~ Q L W / ^ ^ ~ W W / W W ^ Q W / ^ P / W I I ^ ^ W / ^ ! ^ ^ W ~ ! Q Q / p.x.c.p./ ! 8.8.8.9.i.u.` L p 8 6 1 = - - O - @ O O $ X @ O O O O O O O O O X - X O O O O O O X $ $ O O O X $ X O O O O O O X X X ",
"$ $ $ & ; & ; & ; ; ; = ; = ; = ; = ; = = = & & = = = = , # > T b.n.0.0.9.9.Q G V f z T Y T v C V C F C C C D z G D D T T D T D D T D D T D D E T D F T D T D T T F T Y T Y R T W E R R L W W Q W Q J Q I Q Q / W ^ W W ^ _ c # KXKX| 9 ] PXJX9 9 IXKXgX9 JXPXJX6 ' KXIX9 9 cXPXLX9 + o 9 9 9 9 6 9 9 9 9 9 9 9 9 9 : 9 KXKXPXxX & 9 9 9 9 9 KXKXgX KXKXc.u.u.i.9.i.z.i.0.z.z.i.z.8.u.c.8.u.! 9.9.! ~ ! ^ ^ ^ ^ ^ ` W ^ / ^ ^ ^ ^ Q / / L Q L ^ / / W W ` ! W ^ W W / / W W ! p.v.c.u.6./ f.8./ 0.z.u./ E i 8 7 1 = - O O & O O X $ X O % @ X O O - X X X % @ O O O X X O X @ X X $ O O O O % $ O O O % $ O X X ",
"$ $ $ & & & & ; = = ; ; & = ; = ; = = = * = = & & = & ; ; # , T m.n.z.8.8.8.Q G v d v F F Y D D C D F C V C V V D z z F D D D D D D D D D D v T D D T v D T v F T v v G G Y R G Y Y E R W W W Q Q Q I Q Q I W I P ^ W W ^ T c + KXKX' PXLXIXJXLXKXKXPXeXUXKXPXPXPXLXPXPXPXPXPXeXPXKXKXLXLXL.KXPX PXLXJXL.KXPX xXKXKXPXeXKXKXo KXKX; ; | LXFX KXKXKX] PXPXPXLXKXKXKXKXKXPXPXPXPX IXKX9 ; KXKXu.9.8.p.0.i.9.i.z.i.i.z.z.8.9.u.~ u.! ! 9.! ~ W I W ^ W ^ ^ W L ^ ^ W ^ / W ^ P P W / I L ^ W L ~ ^ W ^ ^ Q ~ ~ W / / u.x.i.u.u./ 8.u.6.8.u.u.~ L i 8 8 8 = - - O O O O $ O O O @ O O X O X O O $ X O O O O X - % X O $ O X O $ O O O O O O O O O O % X ",
"$ $ & & & ; ; $ $ = & & & * * * & ; = * * * * * & ; & ; * # , T b.b.0.0.8.~ W D z f z D T Y D D D F F F F F F D T v D D D z D D D D D v F D D T D D D D v T D D T T T T F Y E F Y W L L I W ^ ^ W Q Q Q I Q Q W W ^ W E ^ _ c @ KXKX| o KXKXeXeXKXKXKXKXKXKXU.L.KXKXKXLXKXKXKXLXY.KXKXKXKXKXKXKXeXKXKX LXKXLXKXKXKXKXKX| xXKXKXKXKXKXKX+ KXKX 9 KXJXo KXKXKXKXLXeXKXKXKXKXKXKXKXKXKX KXKXKX: . KXKXc.u.u.8.i.z.u.z.i.i.i.z.u.9.9.i.! u.! / ~ ~ ! W W W ^ ^ ^ ^ W W ^ ^ Q / Q W ^ W W / W ^ W / W W / ^ ^ ^ ^ ^ ` ^ ^ I / c.v.x.p./ u.U 6.8.8.8.u.c.L i 8 8 8 = - & @ @ O O X X @ X O O O @ O O O O X $ X O X @ X % % @ O % O O O $ $ % O O $ O O O O % $ O ",
"$ $ $ $ ; : & $ ; ; ; ; = ; * = = * ; ; * * & * $ ; & ; , # , T m.b.i.8.! u.Q G V f D T G T D T S A F C V Z V C D D z F D D D D D T D D D D S T D D D D D T D G E v D T Y Y R F Y E E R R W W Q Q Q Q Q Q Q W W W P W W ^ E c # KXKX| KXKXL.IXKXKXKXKXeXKXKXKXKXrXKXKXKXKXKXUXeXKXKXKXeXKXKXKXKXKXL.KXLX9 KXKX= KXKX9 xXKXKX KXKXO KXKXKXKXKX| o KXKXKXKXKX KXKXKXKX KXKXKX KXKXc.u.u.p.9.i.u.H.9.i.z.z.u.8.! 9.! 9.~ 9.9.! ~ I L I ^ W W W L W ^ ^ W ^ I W Q ^ W Q ^ I ^ ^ ^ W ~ / Q ^ ^ ^ ~ / I ^ Q p.n.x.p.u./ 8./ f.9.i.z.~ E i 5 8 1 = - @ O O O O X @ X O O O O X O O X $ $ O O O O X X X X O O X O O O % O O O O $ % O O O O O O ",
"$ $ X X $ & & ; ; ; ; ; * = ; = ; ; = * = = = & ; ; ; & ; # > T m.n.z.0.8.u.Q G z l v F F Y v z V C F D V C C D T D D T T D T D T T D T G D D Y D D T D v R F T E T T T Y Y R T Y W Y R J W ^ ^ W Q Q Q U Q W Q W ^ W W ^ E c - KXKX| o ] KXKXeXKXLXLX| gXKXxXL.KXKXKXY.U.LXJX o LXKXLXeXLXKXxX o JXLXKXLXKX. o o X o o O o X X o O o X . X o X o o + . o o o O o + o o o X o o X o X o o O o o LXKXKXKXKXKXKXKX o o . xXKXKXKXLXo KXKXc.u.i.0.i.i.i.9.9.H.u.z.i.8.8.u.u.u.! ! 8.! ~ W P I ^ ^ ^ ^ W ^ ^ W L W L W / Q I I ^ Q ^ I ^ L / ^ W ^ Q Q ^ / E ^ ^ c.M.x.p./ U 8.6.8.u.u.i.c.E i 8 8 1 = - - @ O O O O X - X O X O O O X O O O % O O X O X - X X X $ O % O O O O O % X $ X O $ O O % ",
"$ $ X X O & & ; * ; * ; ; ; ; * = = * ; & = = & $ 3 & ; > # > T b.b.z.0.9.8.Q F v x v T T F v T C V C C C C D C F z z v D v D v D D v z z z z T C D D D T F z z T z v v F Y R F Y Y E R W W W Q ! W I Q W W Q Q I W ^ E ^ _ c @ KXKX[.| | KXxXo | | | 3 | | $ o | xXKXKXKXJX[. | | 3 | | | xXKX} o | KXxX xXxXxXxXJXxX9 ; xXxXxXxXxXxX] gXxXxXJXxX ] xXxXxXxXxXxX; o xXxXo @ xXxX xXxXxXJXxX xXxX& xXxX } xXxXxXxX xXxXxXxXxXxXxXgX 9 xXxXxXxXxXxX' xXxX6 o xXxX+ xXxXxXJX; xXxXxXxXxXJXxX o xXxX xXxX xXxXxXxX o o KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX| KXKXz.u.i.i.i.i.i.i.z.9.u.z.u.! 9.u.! u.! ~ / ! ~ W W ^ I L ^ ^ W ^ ^ ^ W W W W W ^ W I W P L / W L / ^ L ^ I ^ / / L W / p.n.p.p.u.! U / 8.p.i.u.` E i 5 6 1 = @ @ O O O X O O O O O O @ X O O X @ O @ O O @ O X O X % $ X O O $ O O O $ $ % O O O O O O X ",
"$ O O X O $ $ & & & * ; ; ; ; = = ; = = = = = & ; $ ; $ * # > _ b.b.0.z.i.8.R G z f z Y T D D D C C D C C D D D T D F D D D D D D T D D D D D G D D D T T D T T T v G G T R R Y Y W Y W W J R ^ ! Q W I ! Q Q ! ^ L ^ W ^ E 9 & KXKX| KXKX+ xXKXgXgXgXPXIX} KXKX9 KXKX LXKXKXgXgXKXgX| ; gXgXKXKXJXgX| ] IXPXgXgXgX | gXgXKXKXgXgX; o KXKX] $ KXKX ] KXgXgXgXgX KXKX; KXKX ] JXLXgXgXgX gXgXgXKXKXgXgX} 9 KXKXgXgXgXgX| KXKXgX| ; ] KXKX ] KXgXgXgX; gXgXKXKXxXgXgX KXKX] 9 KXKX 9 ] KXgXgXgX ; { ] ] } ] KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXu.u.z.i.z.u.H.u.i.z.i.i.u.9.8.u.8.u.u.! ! ! / ^ W / ^ L / ^ ^ W / I L ^ W P / I / ^ ^ ^ ^ I ^ ^ ~ ^ ^ ^ / ^ / ^ ^ Q Q u.M.x.c./ 8./ 8.8.8.p.u./ W i 8 8 1 ; & & @ X O O O O X $ O O O O # O X X X % O $ % O $ % O $ O O O O % O O X X X X X X X X X X X ",
"O O O X + $ & ; $ & & ; = * = = = = = = & - & ; $ $ = & * # > R n.b.z.0.0.8.Q D z l v Y T T D D V C D V D C v D D z D D D z D D D D D D T D v T v D T v T D x v T T D D D T R T Y W G Y W J W Q ! W Q ! ! U ^ ^ I / W W ^ _ c - KXKX| KXKXL.U.KXgX KXKX JXKXKX KXKX| KXKX LXKXKX KXKXJX o X KXKX} KXKX9 o X KXKXo o KXKXKXKX & KXKX KXKXo LXKX& KXKX KXKXIX+ O o X KXKX+ o o . 6 KXKX + o + o KXKXKXKXKXKXKXKXKX X KXKXo o O KXKX; o KXKXKXKXPX KXKX ' KXKXo KXKXKXKX KXKXKXKX KXKXKXKXKXKX KXKXrXeXKXKX KXKXc.u.z.0.z.z.u.u.z.i.z.i.9.8.u.u.~ u./ ! / ! ! W W W ^ L L ^ L ^ ^ I W ^ / L W ^ ^ I / I ^ ^ ^ I / E W / W W ^ ^ W ^ ! p.n.x.p.p.! 8.8.8.8.8.u./ E s 8 6 1 ; * & @ X O O O O % X @ O O O % O % @ X # $ O O O O O O O O O $ O $ % o X X X X X X X X X X + ",
"$ X O O O $ & & O $ & ; & ; = = = * = & = * = * = $ $ $ * - , T n.b.i.0.9.9.Q G x g v T R T z D z D F C C F C D F C C D D D D D D G v D F F D T D F D T D T v D T v T D T Y Y F R W Y W I L W ! ! W I Q Q Q ! ^ ^ ^ Q ^ ~ E c @ KXKXKXKXKXKX } KXKX o o . KXKX JXKXKX KXKX| KXKX LXKXKX>.KXKX9 o KXKX{ o o KXKX9 KXKX KXKXyXKXKX7Xl.KXKX KXKXKXPX KXKXKXKXKX xXKXKXKX KXKX 9 KXKXKXKXKXKXo KXKXl.J.KXPXyXKXKX KXKXKX KXKX; o KXLX>.GXKXKXyXKXKX ' KXKX KXKXPXo KXKX KXKXo KXKXu.c.p.i.i.i.i.i.z.z.z.i.i.Q 9.u.9.u.! 8.! ! Q L W I W P W W P W ^ L L ^ ^ W Q Q ^ I / L W / ^ W W P E / ^ ^ ^ ^ ^ I Q c.x.x.p./ 8.8.u.8.8.p.u.u.E d 8 7 1 , * & O O X + O O O O O O O O X X O X O O O % O O O O O $ O O O X $ % X X X X X X X X X o % X ",
"$ $ O X O $ & $ & $ @ & * & & = = & ; = * = = & ; $ = = - # , E n.b.i.i.0.9.Q G v f z T T v D D v z F C C C D D F v D D D z D z D D D z D F S F D D D G D D z T T T v T T Y R T R E Y W W W W ^ / / I Q Q Q Q ! I W W E ^ _ x - KXKX| o o KXKX9 KXKXU.L.KXKX JXKXKX KXKX9 o o KXKX LXKXLXl.KXKX9 KXKX} KXKX9 KXKXKX KXKX KXKX KXKXLXKXKX o gXKXKX PXKXKX KXKX KXKX 9 KXKXo o KXKX9 X KXKX o o KXLX9 KXKX1 o KXKX. . ; KXKXKXKX ' LXKX o KXKXPX KXKX KXKX. o o KXKXu.u.i.i.i.z.9.i.i.i.i.z.z.8.9.z.~ c.~ ! ! ! / W W Q ^ W ^ W ^ ^ ^ W W W W P ^ W L L W L W ^ ^ L ^ L R ^ ^ P / / L ^ Q u.x.x.c.p./ 6.6.8.8.8.u.` E i 5 6 1 = & & O X X X O O O O O O O O X X O O O O O X O % $ $ O O $ $ X $ O O X X X X X X X X X X X % ",
"O O O X $ $ & $ $ $ $ $ * = * & & & ; = = & = * & & * & - # , E M.b.z.0.0.9.Q G z f v R R T z A D D D C C C D D T D D D D D D D D D D z D D D F F D D D T D D T T v v T G Y R G Y W Y W W L I ^ ! W U Q Q Q W Q ^ ^ W W _ ^ c * KXKX{ | 9 9 | 9 9 9 | 9 | 9 9 IXKXKXKXKXKX9 | gXLXxX9 | 9 | c } KXIX9 | 9 o JXPX9 9 ' KXJX LXKXLX KXKXJX + | 9 KXKXgX| 6 JXLXJX9 } KXJX 6 9 | KXKX9 c : KXKX { FXKXKX 9 | 9 JXLXJX PXKXKX o 9 9 c | KXJX KXKX 9 LXKX9 9 | 9 6 KXKX9 KXKX 9 9 9 KXJX; o 9 KXJX 9 | KXKX' 9 9 o KXKX JXKXKX | JXKX9 9 | 6 KXKX 9 9 9 | 9 9 KXKXKXgX9 | 9 9 9 | 9 9 9 KXKXKX9 9 | | KXKXKX| 9 9 9 9 9 KXKXu.u.i.i.i.i.u.i.z.z.z.i.9.9.9.z.9.9.~ Q ! W ! I L W L L E W L W W L W ^ ^ L ^ Q I / / W W Q ^ ^ ^ I L / I W ^ W W I / / x.c.p.u.8.! 0.8.8.0.z.~ E i 8 7 1 = & & O X O X $ O O O O O O O @ O O O O O $ X O O X $ % $ $ $ X $ O O X X O O X X % X X O X O ",
"O X X X + $ @ & & $ = ; ; & * & & = = * & = & ; = & & * - # , Y n.b.0.u.z.9.R R z l v T T v v D z C D C C D C D D S z D z z D z D D S D D D D F D D D z z D v z T z T v v T T G Y Y W Y W L L Q ! W W Q I Q ! ^ ^ ^ ^ E E _ c * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX X ; & X O O O - X & & O + $ $ O : O o X $ & : @ o & $ O O & : o o O O $ O + X $ O O $ $ O o $ & : : O O O + $ O O + O X $ O o $ O ; $ & $ O O + X : @ $ O & O & $ $ : $ + X o O O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXLXKXKXKXKXKXKXKXc.c.i.i.i.i.z.i.z.0.i.z.i.! 9.9.9.u.8.8.! Q ^ I L ^ W L W W L W L L L W ^ L / I ^ ^ L I I ^ L W ! W W / W W ^ ^ W I Q u.x.x.i.p.! 6.8.8.8.9.z.~ E i 4 6 1 * * % O X O X O $ O O O O O X $ X O O O O X X % X X $ $ $ X $ X X X O X % O O X X : X X X X X ",
"O O O O O O @ & & & & ; & = = & 3 = & & = = & & ; & = = - # * T b.b.0.9.8.! ! F f f F G Y F v D F Z D D F F D D F D V D T v T v D D D F F A D T F D F G v T D T E T T Y T R R Y W Y G W ^ L L / ^ W Q ! ! ! ^ W I ^ ^ ^ Q _ c # yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXuXyXyXyXyXyXyXyXyXyXiX9X u.u.p.c.i.z.u.u.i.i.z.z.z.9.0.u.u.9.Q ~ ! ^ ^ W L ^ ^ L Q ^ L W ^ ^ W ^ I L W ^ ^ ^ W L ^ I W ^ ^ ^ W Q W P / ^ I W Q u.b.x.i.p.u.6.8.6.0.9.z.9.E d 4 6 , = % - % O O O X X : X X O X X X % O O X X X $ O O $ % X $ X X $ O O $ X X X O X X X X X X X % ",
"O O O O O @ $ & $ & & & & & = ; ; = = = = & & = & ; & = - X > _ m.b.i.0.8.! W G z z F R Y F x D C V V V C C C C C v V S z z D T F D D D F C D F F D T T T D v D T v F F v T E Y W Y G W Q L W / ! W Q ! Q ! ! ! Q Q ^ ^ _ E c - c.u.z.p.i.i.i.i.i.9.z.z.9.9.9.z.c.9.~ Q ! ! ~ E L L ^ L ^ ^ W ^ W L W ^ ^ L W W Q ^ W W L ^ L ^ ^ W W ^ W W ^ ^ L W Q u.M.n.p./ 8.8.0.0.8.9.u.u.^ i 4 8 8 = = - O O X O % : O O X X X X X X X O X % X X : X O O X % $ X O % O % X X X X X X X X $ X O O ",
"@ O @ O O O O @ $ & & & = & = & & ; ; & = & = & & & * & - # , T b.b.0.9.8.! W G z f D G Y F z S C V C C C D F D D z v D T z G v D D D D F C F F D D D T D T D D G F v T T Y E G E R G ^ L L W Q Q ^ ! ^ Q ^ Q ~ Q ^ W W ^ _ c > gXKXKXKXKXKX KXKXKXKXKX' KXKXKXKXKXKXKX KXKXKXKXKXKX LXKXKXKXKXKXKXJX 9 LXKX . gXKXgX KXKXKXKXKXKXKX c.u.i.i.i.i.i.i.0.z.9.0.z.9.9.z.9.9.~ ~ ~ ! ^ W L W W L W W L W L L P ^ L L ^ ^ ^ ^ W L L ^ W / ^ W I ^ W W ^ Q I Q Q u.v.v.x.p.! 8.6.8.q.9.i.u.^ i 4 6 1 = - # O O % O X O O O X O X X X X X X O O X X O O O O X O O O O $ O O O X X X X O O % X X X X ",
"& $ O @ O O + O % & & & = = * ; = = = = = - = = & & & - - # = E m.H.0.8.8.! W G f f z G Y Y l D F C C D C D D D D D D z z v z z z D C D C C C A D z F D z D D T T D T T v F G G R E G W W L W / ! ! Q ! Q W ^ Q ~ Q ^ W ^ _ c - o gXKXKX KXKX; KXKX KXKXPX KXKX . o xXKX| LXKXKX 9 KXKXKXyXfXLXgX JXKXKX yX u.c.u.i.i.i.i.i.z.i.z.i.z.9.9.9.9.c.~ ^ ^ ! / L L L L L ^ ^ L L W L W W W P W W L ^ L W L ^ P W ^ W W ^ W W / ^ W W I u.n.v.i.p.8.8.8.6.8.9.u.z.E p 4 8 1 = - - O O o O O X O O X o X X X X X X O X O $ X X O $ $ O $ O O O O O O % X X O O O O X X X X ",
"O $ O O @ O O @ O $ & ; ; & = 3 & = = = = = & = & $ & = - # > E M.b.0.0.! ! W F m f F T Y G z D C C F V C F C D D S S D z v T D D F C F F F V F D F F F A F C F T D D D T G R T E R G ^ W L W ~ ^ Q Q ~ Q ^ W Q ~ ~ ^ R _ ^ c * gXKXKXgXgXgX KXKXgXgXLXxX] KXKXgXgXgXgX gXgXgXgXKX} LXKXKXgXgXgX; 9 KXKXMXKXKXKXgX JXKXKX gXKXKX c.u.u.u.i.u.i.i.z.i.z.z.u.9.9.z.9.9.Q ~ ~ ! ^ W L L W L W W L L ^ L W W W L W W W ^ ^ W ^ W W W ^ W W ^ W R ~ Q Q W Q 9.b.n.i.p.0.0.0.0.8.8.i.9.E a 5 6 8 - - - % X O O O O O O % o o X % X X O X O O O O O O O O O O O O X $ X X % O X % X % O : X X X ",
"& O & O O O @ @ & @ $ & & = = = = & $ = = - = & = ; & & - # * E n.b.0.0.8.! I H z f D G Y F l D C V Z V V C D C D V z z T v D D V T C C A C V A A D F F C D C C T v v D v T Y Y E L H W W L Q ! Q W ^ Q Q Q ^ Q R Q ^ R ^ _ c # gXKXKX KXKX KXKXPX KXKXKXLXKXKXKX xXKXKXKXKXKX. LXKXKXLXKXKXKXJX 9 LXKX. gXKXgX JXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKX JXKXKXKXKX u.u.i.i.i.i.i.i.i.i.9.i.9.8.9.9.9.9.~ Q ^ Q ^ W L W ^ L ^ ^ ^ W ^ L W ^ W L W ^ ^ ^ L W L ^ W ^ ^ W W ^ R Q ~ ^ W Q Q 9.b.n.v.i.0.0.6.8.6.8.u.z.^ d 4 8 8 * - $ X X o % O O O O O X % X X X X X X % O O O O % O $ O % $ % $ X $ X O O X X O X X X X X X ",
"& $ O O O @ & @ & O & $ & & = ; ; 3 ; & & & & = ; = = & * X > T M.H.0.0.8.Q R H f f S F Y F z V F V D C C F D D D D S S D z D D D F C F F F C F C S F F D A F F T D D T T Y R T W R G W W L W ^ ^ W W Q Q ~ ~ Q R Q ^ ~ _ _ c * . + . o . ' KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKX c.u.i.x.i.i.i.u.i.9.0.9.9.8.~ 9.~ 9.Q ~ ~ ! ^ L L ^ ^ L ^ W W ^ W L W ^ ^ L ^ W W ^ L L W ^ W W / W W ^ W W Q ^ Q W Q 9.b.m.b.i.9.0.6.8.6.0.z.9.^ a 5 6 1 , - @ # O X O : O : % O X X X X O O X O @ X O X $ $ O X $ X X O O $ X X X X X X X X X X X % O ",
"$ O X + X O @ & & & $ @ $ $ = ; & = = & & - = = ; ; = = * # , T b.b.0.0.9.8.W D z l S F F S z V C Z F C F D V z S F D S D z D D S D C V C V Z F A V C F V T F C T D D v F F Y v L L I ^ I P ^ ^ ^ ^ Q Q Q Q Q ^ 9.Q R ^ 9.E c # KXKX KXKXxX KXKXPX ' KXKX } KXgX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJX u.u.p.x.x.c.p.i.i.9.z.9.u.Q 9.z.~ 9.9.~ 9.Q Q R L W L L L L H L L L W W L L W P L L L L W L W ^ ^ W E / W R ~ ~ W Q Q z.b.b.n.8.8.0.8.8.U 9.i.~ E d 4 8 1 , = % X % X O % O $ $ O O X $ X % O O O % O O $ O O O $ X $ X : O X X $ O $ X O $ $ X $ O O O ",
"& $ O O O X @ O @ & & $ & & = $ & & = & & & & = = = = = * # - T m.b.0.8.9.8.Q S f f V F F F z V C C F C C C V z z D D D z z v D C D V C C Z V F C V C C C F C F D D D F D Y Y G Y T L ^ L G W ~ ~ Q ^ Q Q Q ^ ^ ~ Q R R _ E c - KXKXKXKX KXKXKXKXxX KXKXKXKXKX KXKXKXKXKX KXKXKXgX . o & KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX u.p.p.p.p.i.i.i.9.i.z.z.z.Q 9.c.~ 9.~ ! ~ W ^ L L W W L I L P L L L W W L L ^ W L W L L ^ L L W W ^ ^ ^ ^ W ^ ~ W I W i.n.n.n.9.8.8.0.6.0.0.z.~ ^ p 7 6 1 , = $ X O O O X O O : O O X X O O O O O O O O O X $ O O X O X X X X X O O % X X % X X X X % O ",
"& & & O X X O O & $ & & & ; = & = & & & % = & = = & ; = * # , T b.b.0.0.u.Q Q D z f S G G F V V F C Z V V F V V D D D D D v D D V F C C C V F T C C C F D F D A G D G G G T W F Y L L ^ J G W ~ ~ ^ Q ^ Q Q Q ! Q Q ^ ~ 9._ c # KXKXKXKXKXKXKXKXKXKXKX; xXKXKXKXKXKXKXKXKXKX KXKXKXKXgX } KXKX . gXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX9 c.u.p.i.i.i.i.u.9.i.9.z.u.8.9.u.~ u.~ Q ! ! W L L L ^ L L ^ W W W L L ^ W W ^ W L ^ W W ^ ^ W ^ W P L ^ W ~ ~ Q I W Q z.b.b.n.9.Q 8.8.6.0.z.u.~ ^ a 4 7 8 ; & - + O O O O O O O O X X O O O @ O O X % # O O % O O $ O O X % X X O % X X X O O X X X X O ",
"& & : & O O O @ $ @ $ & $ & ; = & & = & = & - & & ; & = - # > T n.b.0.0.u.~ R D f f D F G D z C C C C V C F C V D D z D D z T D S D C D F C Z F F V D F C F D F T D T T T G Y F Y G L ^ R G R ~ ^ R ^ ^ Q Q ! Q Q Q ^ Q _ ~ c # | KXKXKXKXKXKXKXKXKX| X 9 ' KXKXKXKXKXKXxX| xXxXxXKXKXKXKXKXKXgX JXKXKX xXxX} KXKXKXKXKX| | | | 9 xXxXxXxXxXxXxXxXxX xXxXxXxXxXxXxXxXxX%.7XKXKXKXKXKXKXKXGX.XxXxXxXxXxXxXxXxXxX u.u.p.p.i.i.i.i.i.z.i.z.9.8.9.u.~ u.~ ! 9.^ Q L L ^ L L L L L W ^ L L ^ W W ^ W L ^ W ^ Q W W W W L W ^ W Q ~ ^ W I Q u.b.n.m.i.8.8.6.0.0.i.u.9.^ a 4 7 1 , = $ X $ : & $ O O O O O X O O O O O O @ O O O X $ O % O O O X $ O X O O O O O O $ O O O O O ",
"& & & & @ O @ O $ @ & $ & & ; ; & & & & - = = = & & = & * # , T M.b.0.0.9.8.W D z f V G T D z v C V F V C C V V D D D v D z D z V D V V D V Z F C Z Z F C F C V T D v T v G Y F G G L Q R H R ~ Q ^ Q Q Q Q Q ~ Q Q ^ E ~ _ c - KXKXKXKXKXKXKX KXKXKXKX; 9 KXKXKXKXKXKXgX KXKXKX KXKXKXKXKX KXKXKXPX KXKXKXKXKXKXKX KXKXKXKXKXKXKX 9 KXKXKXKXKXKXgX c.u.p.p.i.u.i.u.i.9.9.z.z.8.9.u.~ 9.~ ~ ! ! ^ L L L W L ^ W L Q ^ L L ^ W L / ^ E / P W W W L W ^ L W ^ W Q ~ Q I Q Q z.b.n.n.i.U 8.0.0.0.i.u.~ ^ a 4 7 1 , * $ X $ O $ O O $ O X O O O @ X O O O O O O O O X O $ O % X X X X X O O O X $ O % O O X $ O ",
"& & @ & - O O + @ O @ @ & ; & ; ; ; & & * ; ; * @ & @ * * # > T b.v.0.8.u.! I D z f S F F D z V C V D C D D z z D T D D v D D D D D C D D D D T D z D D D T D F F D F F T Y R G R G J W J H J Q Q W Q Q Q Q Q Q Q Q R R 9._ c - KXKXKXKXKXKXKX KXKXKXKX; ; KXKXKXKXKXKXgX gXKXKXKXKX KXKXKXKXKX KXKX] KXKXKXKXKXKXKX xXKXKXKXKXKX 9 LXKXKXKXKXKX c.u.i.i.9.9.i.i.i.i.9.z.9.8.9.9.~ c.Q ~ 9.Q ^ L L L R G L L L ^ W P L W L L ^ ^ L W L L W L L W W P W ^ R W Q Q R W Q i.b.n.B.z.8.8.6.8.0.0.9.9.R a w 6 1 , ; @ O @ @ O O O $ $ $ : % X O O O O O @ O O O O O O $ X O X O X O % + X X X X X X X X X X X ",
"& & & & $ O - - - & - & & & & ; & & ; & & & * & & & ; * * # > T m.b.0.0.u.! I H f f S F F F z C C C D C A C C z D D v z D z T v V F V C z A C D C C D D D D C C D V S D D G G D G Y G Q I G I Q Q Q Q Q W Q Q Q Q Q ~ _ E _ c - KXKXKXKXKXKXKX KXKXKXKX& 9 KXKXKXKXKXKXgX KXLXKXKXKXKX KXKXxX yX KXKXKXKXKXKXKX JXKXKXKXKXKX 9 KXKXKXKXKXKX c.i.i.i.z.i.i.9.i.9.z.u.z.9.9.9.~ 9.~ ~ 9.Q ^ W L W R E ^ W ^ ^ Q I W ^ W W / ^ ^ ^ L L ^ L L W ^ W W ^ R ^ Q ^ W W Q i.v.n.Q.i.Q 8.8.8.0.0.c.9._ p < 4 1 , * @ & O O O O + $ + X X X X O O O O O O O O O O X X X X X X X X X X % X X % X X X X X X % ",
"& & & O @ # - @ & @ @ & & & @ ; ; = ; * & * @ * & & & * * # > _ b.v.p.p.! ! W D S f S F Y F V C Z C D D D V D D D z D D T x v A z D D D T v T T D D T G D T T F F S S F F Y Y H R J R R R J W Q W Q Q I Q Q Q Q Q Q ~ ^ ^ E 9 - KXKXKXKXKXKXKX KXKXKXKX& ; KXKXKXKXKXKXgX 9 KXKXKXKXKXKXKXKXKXKXKXKXKXKXJX KXKXKXKXKXKXKX X xXKXKXKXKXKXKX xXKXKXKXKXKXKXKX z.u.i.i.z.i.i.i.9.z.i.z.9.9.9.9.9.9.Q ~ _ Q ^ L L L L L E L L ^ L L L L L L W L L L L W ^ W W ^ ^ L W ^ R ~ ~ R Q I I 9.z.n.}.z.U 8.6.0.0.i.0.9.Q d < 7 6 , * @ $ @ O O $ + + $ O X X X O X X O X X X X % O X X % O X X X X o % X X X X X X X O X X $ O ",
"; ; - - X $ O - & & @ & * & @ * ; * ; & & * ; & & ; * # * # , T n.v.p.p.! ! I S j f S F Y F C z z z z C Z V v z D D z D C x T x z D C C T z x v C z D D v D C D D S V D G F G D G J J R Q J I Q Q Q Q Q Q Q Q Q Q Q ^ E _ _ c - KXKXKXKXKXKXKX KXKXKXKX; o ; KXKXKXKXKXKXgX o 9 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJX 2 KXKXKXKXKXKXKX gXKXKXKXKXKXKX xXKXKXKXKXKXPXJX c.u.z.i.i.z.z.z.i.9.z.z.c.9.9.c.9.9.~ Q 9.Q ! R L W L L W L L W W L L W ^ L ^ L L W L L W L L ^ W L L ^ W Q W Q W J I 9.b.m.,Xb.Q 6.8.8.0.i.0.9.^ d < 7 6 * * ; & $ O O O O $ + o X X X X X % O X X O X O X X X O O X X X X X O X X X + X X % X X X X ",
"* * @ @ X X X @ O @ - - & ; @ @ & * & ; * * * ; & & & ; * # > T n.v.0.i.! ! I H z z S D G D z D V V Z C z T x x z z T z T x z T C D T z T z T T D D D D C F D F D S D F D G T G G Y D Q R G J Q Q U Q Q I W Q I W U ! ^ ^ E Z - KXKXKXKXKXKXKX KXKXKXKX& 9 KXKXKXKXKXKXgX o ; ; ; ; KXKXKXKXKXKXKX; ; ; ; ; & o JXPXPX PXLX PXPXPXPXPXPXPX PXPXPXPXPXPXPXPXPX 9 PXPXPX ] PXPXPXPXPXPXPXPXPX KXKXKXKXKXKXKX KXKXKXKXKXKX xXKXKXKXKXKX} c.z.i.z.i.i.z.i.0.u.z.u.i.9.9.u.9.9.Q 9./ ^ ^ L L L L L W L L W L L L W L L ^ L L W L ^ ^ ^ L ^ ^ W W ^ ^ Q W ^ Q I I 9.b.B.}.b.Q 8.8.8.8.H.9.c.9.g < 7 6 1 * * @ O + X O O + O O O X $ X $ X O % X X X O X X X O O X X X X O o X % o % X % + % X % % o ",
"& & * * - # # O # O & O @ & ; ; & & & ; ; * @ & ; $ & @ # # , E b.b.i.0.! ! I S V f S D G F z z V x C D z T z T D D v T v T T v z T z v T v x v D D D D C D D z D z z S D G G D G G H R R K J W Q Q I I I U Q I W Q ^ W ^ _ 9 - KXKXKXKXKXKXKX KXKXKXKX; ; KXKXKXKXKXKXgX KXKXKXKXKXKXKX KXLXKXKX ' LXKXKXKXKXKXKXKXKXKXKXKXKX; KXKXKXKXKXKXKXKXKXKXKXKXX 9 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXKXgX | KXKXKXKXKXKXS. c.u.z.0.i.i.i.z.z.9.u.z.9.8.9.H._ 9.Q Q ~ Q ^ L L L L L W W L W W L L W W L W W L ^ R L L W L W ^ W W / W W Q ^ Q W J 8.z.m.}.v.U Q 6.8.0.z.i.9._ p < < 1 , @ @ & O # @ O + O O O O X X X X X X O O X X X O X O O O % X X X % O X + % X X X X X X o X X ",
"; @ & @ @ O @ O @ O @ @ @ & ; @ & & & = ; * & @ $ ; & & * # > T n.v.0.u.! ! R S j z z D T D V z z z C C z z x T T x z T z z T D z D z T z v T T C D D T D D D D D S v D G G R v J J H R R H R Q J Q Q Q I I U Q I I E ^ ^ _ 9 - KXKXKXKXKXKXKX KXKXKXKX; 6 KXKXKXKXKXKXgX KXKXKXKXKXKXKX KXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgX 6 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX{ KXKXKXKXKXKXKX KXKXKXKXKXKXKX{ 9 KXKXKXKXKXKX} c.z.i.z.i.z.z.i.0.z.u.z.i.9.9.9.9.u.~ ~ 9.! ^ L L L R L W L W W L L L ^ L L ^ W L ^ W ^ ^ ^ W ^ ^ W W ^ Q W Q Q W W I 9.z.m.{.i.6.8.0.6.6.0.9.9.9.a 4 7 6 1 * & @ O @ X O X + + X X X X X % X X X O X X O O X X O % X X X X X X X X X X X o X X X X X X ",
"@ ; & @ @ O - @ @ O # @ @ & @ ; & ; * * * @ ; ; & & & @ * # > _ n.v.i.u.8.! J D f l z F G T z z Z z z C T z z z z v T z T z v z z T T z T z z T D z D D D D D D D S D D D D R D G J G R R J J Q Q I U I I I R Q W ^ ^ E E _ Z - KXKXKXKXKXKXKX KXKXKXKX: 6 KXKXKXKXKXKXgX KXKXKXKXKXKXKX o KXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX KXLXKXKXKX JXLXKXKXKXKXKXKX} KXKXKXKXKXKXKX xXKXKXKXKXKXgX o 9 KXKXKXKXKX . c.9.i.i.i.i.i.i.z.9.z.z.i.9.9.9.9.9.~ Q ~ W ^ L L L L L W W L E L L L L L L ^ L L W L L I L L W W W W ^ W W ^ Q I J W 8.z.N.{.i.U 8.8.0.0.i.i.c.R a < 7 1 , * & & O X X O X O O O O X O O O O X X O % X % X X X X + X X X X o % X X X X X X + % X X X X ",
"& & & : @ O O O O @ @ @ & ; @ ; ; ; @ ; @ @ ; @ : & ; @ * # , E b.b.0.9.9.Q W F f f v G F v z D D z x T x z z z C V C z D z T x T v z T z T x T D z D T v D D D D S D S S F G D G R R Q J J I Q Q Q I I Q I Q R Q R Q R E _ 9 & KXKXKXKXKXKXKX KXKXKXKX; 6 KXKXKXKXKXKXgXo KXKXKXKXKXKXKX 9 | | 9 KXKXKXKXKXKX | KXKXKXKXKXKXKXKX| | | 9 | | KXKXKXKXKXKXKXKXKX} | | | | | KXKXKXKXKXKXKX | KXKXKX' o | LXKXKXKXKXKX} KXKXKXKXKXKXKX xXKXKXKXKXKXIXX gXJXKXKXKXKXKX z.u.i.u.i.i.z.i.9.9.0.z.z.9.9.9.9.9.9.9.~ W Q W J W W J E R L W W R W ^ L ^ ^ L W W L E ^ L L W ^ ^ ^ / L W ^ W I W J i.i.n.>Xv.U 8.0.8.8.0.9.9.R f w 7 1 1 * & @ X + @ O O O O % o : X O X X X X X X O % X X X % + X + X X X % X O X O X X O X % O X X ",
"& & & & @ @ @ O @ $ @ @ & & ; @ & * ; * * * @ ; & & ; * > # , T n.z.9.8.8.Q Q D x f z T T D x D D z z z z A v z C v S D D z D T x T T x T z v T D D D D D D D D D D S S S F G G G R G R R J J Q Q I I I I Q Q R R U R R E _ c % KXKXKXKXKXKXKX KXKXKXKX& 6 KXKXKXKXKXKXgX KXKXKXKXKXKXKX o KXKXKXKXKXKX KXKXKXKXKXKXKXKX o KXKXKXKXKXKXKXKXKX| KXKXKXKXKXKXKX] gXgXgX| | KXKXKXKXKXKX{ KXKXKXKXKXKXKX xXKXKXKXKXKXKX+ JXKXKXKXKXKXKX c.u.z.z.i.i.z.i.i.z.z.i.9.9.9.9.9.9.R ^ ! ! ^ R G I R G E L G E L L L W L W W L L L G R / L L P L L L ^ W W ! W I W Q 9.z.n.XXb.6.8.0.8.8.i.9.9.R d 7 7 1 , * & @ # O X O O O O $ X X % X X X X X X X O X X X X X X X % X O X X % X X X X X X X O O X X ",
"& & @ $ O @ O O O @ @ @ & & @ ; * * ; * * * ; ; ; & ; ; * # > _ b.z.0.8.9.U R D x f v T D D z z z z z D T z x z z D v D z z T v z T v T v T v T z z D F D D z D D S z S D L G H G R G R J H H Q Q I U I I U Q R Q I W W E _ c & KXKXKXKXKXKXKX KXKXKXKX; ; KXKXKXKXKXKXgX KXKXKXKXKXKXKX KXKXKXKXKXKX KXKXKXKXKXKXKX LXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXLX KXKXKXKXKXKXKX 6 KXKXKXKXKXO JXLXKXKXKXKX c.u.i.i.i.i.i.z.9.9.z.z.u.9.9.c.9.9.~ ~ 9.! ^ W J G W G L L G E L L L L L W W L L L P W ^ E L W L L W ^ Q Q W W I Q I 9.i.n.}.b.I 8.0.6.8.i.0.9.R d q 6 < = * * & O X @ O O O O O X X X X X X O X X X X X % X X o % X X X O X X O O X X X X X X X X X o ",
": @ @ & @ @ O @ $ $ $ @ @ & ; @ * & * ; * * * * & ; @ & * # , T b.v.9.8.0.8.R D l f S D F D z v A x z D x z T x D D C z z z z z z z z D z x z z z z D D z D z D D V S v D F F D H G G R J G J W Q J J Q I I I R Q R I W E _ c & KXKXKXKXKXKXKX KXKXKXKXKXgX 9 KXKXKXKXKXKXgX KXKXKXKXKXKXKX KXKXKXKXKXKX KXKXKXKXKXKXKX o LXKXKXKXKXKXKX KXKXKXKXKXKXKX gXKXKXKXKX KXKXKXKXKXKXLX KXKXKXKXKXKXKX 6 KXKXKXKXKX+ JXKXKXKXKXKX u.c.i.i.i.9.z.9.z.9.i.z.z.9.~ H._ c.~ 9.~ ! ^ W I W I G R R G L L L L ^ L L ^ L L W L W W L L W W W L W W W ^ W J Q I u.9.n.}.i.8.8.8.Q 6.i.z.9.9.a 7 7 1 * * & O O + X O O O O O X : X X X % O O % X X X o X X X X X X X X X X X : X % X % X X X % X X ",
"$ & $ $ & O @ $ $ @ O @ @ * @ @ * * * * * > ; ; ; ; @ & @ # > T b.s.9.9.9.Q R H x f z D F D z D D z z z z z z D D D z D z z T z v z T z v T x T D v z D D T v D D D F D G G J D G G G R J G H W Q U J U I I Q Q U R Q ^ ^ _ c ; KXKXKXKXKXKXKX o KXKXKXKXKXKXKX ; KXKXKXKXKXKXgX KXKXKXKXKXKXKX KXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXKXKX KXKXKXKXKXKXLX KXKXKXKXKXKXKX 6 KXKXKXKXKXKXgX KXKXKXKXKXKXKX c.i.c.i.i.i.i.z.u.i.z.z.9.8.9.9.` 9.~ Q ~ Q ^ W G W W G R L F R G P L R G L W L L W L L W L G L L L L W R W ^ W R Q J 9.i.n.}.b.8.8.8.6.8.z.u.9._ p a 7 8 , * * @ X X X O O O O O O X O X X X X X $ X X X X % O X X X X $ X % O $ O X O X X X X X X X X ",
"O $ & O $ $ $ O O $ O @ @ @ * * * * * * * @ @ * & & & ; * @ , _ n.z.9.9.8.Q R D f l v D D v l z z z x A x A A v D D z z z x z x z T v z T z z T D z T T D z z z D T T D D D G S R R G R J G J Q Q I I J I I W R R Q R R T _ c & KXKXKXKXKXKXKX9 + 9 KXKXKXKXKXKXKX 9 LXKXKXKXKXKXgX KXKXKXKXKXKXKX KXKXKXKXKXKX KXKXKXKXKXKXKX LXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXJXJXJXKXKX9 KXKXKXKXKXKXLX KXKXKXKXKXKXKX KXKXKXKXKXhX KXKXKXKXKXKX u.u.i.p.i.i.u.i.u.9.9.i.z.9.9.9.9.9.~ ~ ! Q W I W W W G E L L E R L L E L L W L L L F I W L L L W L L ^ W W W W J W U 9.z.n.4Xn.8.8.8.6.6.0.z.~ R p q 7 1 = * @ @ + @ X O O O O O O X X X $ O O X X X X o X o O X + X X X X X O X X X O X X X O X X X X ",
"& $ & - - O O @ @ @ @ @ @ @ * @ @ * * * * * * * * @ * * * # , T M.z.8.8.9.Q Q v f f v G F D z z z z x D x D z z D C z v T v z D T v T x T z z T D x v T D D D D F v D D D F T D R G F R R G I Q Q W I W Q I Q Q Q R Q R E E c @ KXKXKXKXKXKXKXKX ; KXKXKXKXKXKXKXKX ; KXKXKXKXKXKXgX KXKXKXKXKXKXKX KXKXKXKXKXKX KXKXKXKXKXKXKX LXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKX $ O KXKXKXKXKXKXLXo KXKXKXKXKXKXKX KXKXKXKXLXLXPXl.LXKXKXKXKXKXKX z.c.i.p.i.v.i.i.z.0.9.z.i.9.9.i.! 9.! ! ^ ! W L L L W G L L G G L Y L L L R L L L ^ F L L L L L L R L W R Q ^ W I I J 9.x.n.G.v.9.8.8.6.8.0.u.~ ~ a 6 7 8 = - & @ @ O @ O O O O O O X X X X O O X % O X % O X O % X X X X X X X X X % O X X O O X X % ",
"$ - & % X @ O @ + @ @ @ @ ; @ * @ * * * * * * ; * * * * > # > _ n.v.8.8.0.8.Q z f f C D D F D z A x z z x z D z D A z z T z T v z T z z v T z D D z z T z T z D T D z D D D G D Y T F R R G J W W I J Q Q R R Q R Q R R ^ _ c & KXKXKXKXKXKXKXKXKX; xXKXKXKXKXKXKXKXKXKX 9 KXKXKXKXKXKXgX KXKXKXKXKXKXKX KXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXKX 9 KXKXKXKXKXKX KXKXKXKXKXKXLX KXKXKXKXKXKXKX KXKXKXKXLXLXLXl.KXKXKXKXKXKXKX c.p.c.x.i.i.i.z.z.z.i.i.z.9.9.9.~ u.! I Q ^ Q L L I L L R L G G Y L R W E L L L L Q L L ^ L L L L L W W I Q Q W W W J 9.x.n.m.x.0.9.0.8.6.i.z.~ ~ a < < 1 , * - @ X O O O @ O O O O % X X X O % X X : X $ O X % O X X X O X X X X X X O O X % X X X X X ",
"$ $ & - @ @ # @ # O @ @ @ & & & - * & * * * = - = - = = * # > E b.b.8.8.8.! I S f f D D G D D z z x A C z A D z C C C C T x T T z T T v x x z D D D D D z D C D D D D D F G G D G G F R L G G I I W R Q J W R W R R R R _ _ c @ KXKXKXKXKXKXKXKXKXKXxX KXKXKXKXKXKXKXKXKXKXKX 9 LXKXKXKXKXKXgX KXKXKXKXKXKXKX 2 >. KXKXKXKXKXKX KXKXKXKXKXKXKX LXKXKXKXKXKXKX KXKXKXKXKXKXKX 9 KXKXKXKXKXKX KXKXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKX>.KXKXKXKXKXIX c.z.x.p.i.i.x.i.i.i.i.i.i.9.9.9.8.9.R R Q ^ Q L H G L L L L L E R L E E L E L G L W L L ^ L L L L W W W G ^ ^ W Q I I ! x.b.m.v.8.8.0.0.8.0.z.Q ^ p 5 < 1 = - - @ O # O O O O @ O O O X O % X X O X % O $ O X O X X % X O O X X % O X X X % X X O X X % ",
"$ - $ & & & @ @ # @ @ @ - @ @ * & * * * * = - = - = = * > # > _ m.z.9.8.8.8.J S f z z D D D z z z C z D z D A z D C z D x v z z v T z v T x z z v D C D z D D v T D z A D D F D T L F G L H G I J I J J Q W J J R ^ R Y _ _ c @ KXKXKXKXKXKXKXKXKXLXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgX 6 KXKXKXKXKXKXgX KXKXKXKXKXKXKX KXLX KXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXKX 9 KXKXKXKXKXKX | KXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXJX c.u.c.p.p.p.i.i.u.i.i.i.i.9.9.9.8.9.9.Q Q ^ ^ P P G W L L G G ^ R L E W R W W L L W L L L L L L L P E W G W W I W I J / c.b.m.s.8.8.0.6.8.i.9.8.^ p 5 6 8 , * & @ X X O O O O X O @ O X X X X X X X O O X O X O X O X X X % X X O O X : X X X X X X X X ",
"$ & = ; * & @ @ - @ @ @ @ & & * * * * * - - * - * * , * * # > T b.x.8.8.8.U J z f j v D D T D z z x z C x Z D C C C v C T x T z z T x z D z x v z z z D D D z D T T v D D D G D G F F L F F G L J W I R J R J W R R R E E _ c @ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX ; KXKXKXKXKXKXgX KXKXKXKXKXKXKX | KXKXKX KXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKX KXKXKXKXKXgX JXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXJX yX c.u.i.p.p.y.i.i.u.i.u.i.i.9.9.9.Q 9.8.Q / Q Q L H I ^ W L L L L L R R R R E W L L W G L W L L L L L W W G W ^ I I I J 8.c.n.B.v.8.8.0.0.6.s.u.Q W s 8 8 8 = - @ O X X O O O # O O O $ X X O X X X X X O O O O % O X X X X X X $ X X X X X X o % X X X % ",
"- $ $ = & * * # - O @ @ @ @ @ * & * & * = = & = & * * * > # , _ n.x.8.9.8.Q J v g f z D D T z z z z z z l z z z C D C D T x v z x T z T T D C D z z F D D D D T F z D D D G T z G F D Y G H G L J I I J W W W W Q ^ R R ^ _ c @ | gXgXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXgXgXO | gXKXKXKXKXKXKXJX} gXJXKXKXKXKXKXKXKXKXKX] KXKXKXKXKXKX KXKXKXKXKXKXKX LXKXKXKXKXKXKX KXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXIXgXk.KXKXKXKXKXKXKX} KXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKX| o gXKXKX c.z.i.p.i.p.i.u.i.i.i.i.i.9.9.9.8.9.~ W Q Q I I I I L L L L L W L Y Y L L E W L L ^ L L ^ L L W W E W W L ^ ! W Q I J ~ c.x.B.x.8.8.8.0.8.i.u.^ E r 8 5 1 = - & @ O X # O O O O O O % X X X : O % O X $ O O X X X X X X X X X X X X % X X X X X X X X o ",
"% - & ; * & @ * @ @ @ @ @ * @ * @ * * * = = = = * * * * > # , R M.x.9.8.8.! J j f f z v D D z z z z l z x x z z S C v C C z z v z z x T z D D D D z D D z z z D T D D D D G D D F F H G G H G I J W I I R Q R Q Q R R R _ _ c @ KXKXKXKXKXKXKXKXKXKXPX KXKXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXxX o KXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKX KXKXKXKXKXKX KXKXKXKXKXKXKXKXKX9 KXKXKXKXKXKXKXKXyXKXKXKXKXyXyXyXyX KXKXKXKXKXKXKXKXKX>.KXKXKXKXKXKXKX KXKXKXKXKXKXKXKXKXKXKXKXJXo . JXKXKXKXKX c.c.i.i.p.i.i.i.u.i.i.i.u.8.9.8.~ 9.9.Q W Q U W P L L L L L L ^ L L Y L P L W L L ^ L R W L L W L ^ W W L ^ ^ W ^ W I 9.v.b.m.s.9.8.8.8.0.i.u.W L s 5 8 1 = & $ $ X X O O O O O O % O X X X O % X X X X O O X X X X % : X % X X X X X X X X X X X X % + ",
"- - @ * & * * @ @ # + @ @ * @ * * * = = * * & & = * , @ * # > _ m.i.8.u.8.8.J H f f z D G z z z C z x C z z T z D D z D F C z T D D D v z z z F D z z D D D D v v D z D D G T G F L D L G S G I G J J J J J J J R G R R R _ c # KXKXKXKXKXKX *.%. KXKXKX X % LXKXKXKXKXKXKXKXKXKXKXKXKX KXKX } KXKXKXKXKXKXKXKXKX c.x.s.i.p.i.i.p.i.9.8.i.i.8.9.u.Q 9.! Q W Q Q P I W W L W L L W L G W E L ^ W L W W G I L L L L W R W ^ L W W ! ! Q I 8.x.v.n.v.p.8.8.8.i.x.! L D 7 8 6 1 * & - $ O O X O O O O O @ $ O X X O O X X X $ % $ O O O X O O X X X X O X O X X X X X X X X X ",
"- @ & & @ @ @ @ - # @ @ * @ * * * - * = * - & * * & @ - > # > T n.z.8.8.U 8.J S f z z D T D x D D x x z x z z x z S z D D z D D z D D D D z z F z z z D z z z T T z D D G G Y D F F D L L H H J J J I J Q J J W R R R ^ _ T c @ KXKXKXKXgX % l.%. yXyXyX KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJX c.i.i.i.i.p.i.i.i.8.i.i.i.8.9.u.! 9.! I Q Q W I L I Q L W L L ^ L L L W W W W L L W P G W L L L W W W W I W Q ^ ! ^ I ! x.x.n.c.8.p.8.8.i.i./ H V 4 4 6 = & & $ $ O $ O O O $ X O X % O X X X X O % X O $ X % X X X X % X X X X X % X X X X o X X X X % ",
"- & * & * @ @ * @ @ # @ @ @ * * @ * * * = - & * - - # - @ # , ^ n.z.! u.8.Q J S f f z G F v z z A x z z z C D x D z z D D x z D D z z D z x z v D z v D z D z z T z z D F Y Y D L F F R F H G G J J I J J J J J R R R E T _ c @ KXKXKXKXKXgX *.%. yXyXyX & KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX z.x.v.i.p.i.c.i.u.i.u.i.u.9.8.u.! u.! ! I ! Q I L L I G W L L ^ L R W W L W W L L W T L W L L W W I L I G W W ^ Q Q I 8.c.s.b.i.8.8.6.8.u.z.! V s 7 7 7 1 & & & O X O $ $ O X $ X $ O O X X X X O O X $ X O X X O X X O X X o % X o X X X X % X X X o % ",
"# * @ * * # @ @ - # @ @ # @ * * * * * ; = * & * * * * # > # , T b.v.8.9.8.8.I S x f z T D z x D z z x z z z T x D v z T v z T z z v D z S V z D S z z S D D D T T T z T F F Y D Y Y F G G H G L G I J J J J I J R J R E ^ _ c @ . o KXKXKXLXO . gXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX c.z.i.i.p.p.i.u.9.i.i.i.z.8.9.9.! 9.! Q I Q Q I G G W P L L P W L L E W L W L L L W P L ^ L L ^ L L L W G L I W Q I J ! z.x.v.u.8.8.8.6.8.x.9.f < 6 7 7 = * & $ $ O $ O O O O O % O O O O O X X X X $ $ O O X o % O X X X X X X X X X % X X X X X X X ",
"* # * ; * * * @ @ @ @ @ @ * * * & * * = = = = & * * @ , * # , T M.z.8.9.8.8.I z f f z D G v x z z x x z z z v z z z z z T z x x z D D z C v z S C z z S z D D D F v v z D F G S F F G G G G G L G I I J I L I I J W Y W ^ E c @ } xXKXKXKX| 9 KXKXKXKXKX| | | | | | | | | | | | | | KXKXKXKXKXKXKXKXKXKXKXKXKXKX| | | | 9 b.z.i.i.p.i.i.i.i.u.i.i.i.9.9.9.! u.~ Q W Q Q W L L I L L L L W L L L W L W L L W W L R L L L ^ W L L W G W W W W Q I ! x.i.v.p.8.8.8.8.9.b.c.f , < 7 6 = & & O $ O O O O O % $ O O O O O O X X X X X X O X X X O O X X X X % X X X X X X X % X X X X X ",
"# @ * @ # * @ @ @ @ @ @ @ & * @ & - & * = * * & & * * - > # 2 _ n.x.8.0.Q 8.J S f f z v D S l v z x x z z z z z D z z v z z x T z D D z z z S F D z z S z D D D T z D T D D D v G F D G H H H J G I I J G R J I J J Y R _ _ 9 # xXKXKX KXKXKXLX c.z.i.i.i.i.i.i.8.i.i.i.z.8.9.9.Q 9.! W W ^ ^ I L L I G L L F R L L L L L L L L W Q G L L G G L W L L L G I W I Q Q I 8.c.i.v.8.8.y.0.8.8.b.b.z > 1 6 6 - - & O O $ $ O $ O O O O O O O X X X % O O X $ X $ X % % X X X X X o X X X X X X X o X o % X X ",
"@ * * * * @ * & * @ @ @ O @ @ & - $ * = * - - - @ & * @ , # , E b.v.8.9.8.U I V f x z v D D z C A z z D z A D z z D z T z z v T z D z z D D z D D z D D C D D C D z D z D F F D F G G G J P J J J J H I I I Y J W G W E ^ _ c . KXKX] c.z.i.i.i.p.u.i.i.i.9.i.9.9.9.u.9.u.! ^ Q ! ! W L I L G L L T L L L L W R L ^ L L W L L ^ L L W L L ^ L I W W W W W I ! x.v.x.8.8.y.0.9.8.u.c.z > 1 6 1 * & & O O O $ $ $ O O O O O @ O X X X O X % X X X X X O X X X X % X + % + % X + X X X X X X X X ",
"# * * @ & @ @ @ @ O # X # O - & - - = = = - = & & & * * , # > T n.i.0.i.! U I j f l v D S S z z T x x z x x z z z z z T x z z z z D z v C C z z v C D z v D D v D D D D D D G D Y G G G G G H J J G R J W I G W I G G W R _ c + o yX o b.v.i.i.i.i.i.i.i.i.i.u.9.9.9.9.u.u.! ! Q ~ Q J G I P G I L F L L L W L L W W L L W L ^ W W L ^ L L W L I W W W I I J 8.x.v.u.u.6.8.0.0.8.z.x.V , , 7 6 * * & @ O O % $ X % O O X @ X X X X X X : X X X X X X O X O % X + X X X X X X % X X O X X X $ X ",
"@ @ * & - - & O @ @ O O O @ & & - % * & = = & & * & & * * > > E M.v.8.0.8.U G S f f S S D z z D z x x C z z T z D z z z T v z z C v z D D C z D D D D D D T D D D D D D T D R D F G H F G H J J W W W W J G W J J J L W _ _ c @ o o o . o . o o c.z.z.s.i.i.i.i.z.z.i.u.9.i.u.9.u.u.! ! Q ~ Q W I W L L ^ W L ^ L L L L W L L L L E L W W L L ^ L L ^ L J I W R W I H Q i.x.p.u.8.8.8.0.9.p.c.D > , 6 1 * * @ O O @ O $ $ X O O X O O O X X X O X X % X X X O O O O O % X X X X X X X X % X X X X O X $ ",
"@ - @ @ O @ @ O @ O O @ O & & * & & & = = - & = & - - - * # > _ b.v.0.0.8.Q R v f f z D D D v C T x x z x z z z z x z v z z v z z z z z z l l z V z z l x D z z v z D D D D G D F G D G G H J J J W Y J I G R R J G Y Y R _ c @ 9 9 9 9 9 9 o 9 9 9 9 9 9 9 9 ; 9 c 9 9 9 $ 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ; 9 9 9 9 9 9 9 9 9 9 o 9 9 9 9 9 9 9 9 9 9 9 9 9 & o 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 c 9 9 9 9 9 9 9 X 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 & b.i.i.i.i.i.i.y.i.0.0.9.i.9.9.9.9.9.! Q Q ~ Q J L L L H L L L L L L I L L L ^ L L W L W W L L W L L L L J I W J I I J Q i.z.p.u.9.8.0.0.8.z.x.V > , 6 1 * * & @ O - $ $ $ X $ O X X O X @ X X O X X X X X X O X X X X o X X X % X X X + + X % X % O O O ",
"- @ & @ - @ @ @ & @ O O @ & ; & & % & = - & & & & * - - > # > T b.v.9.u.8.Q R v g v v S S D z z v z z z x z D x D x T x z T x x D D S z D S z v D D D D z F D z F D D F D G G z F G G H H G J J I R W I G L R I R J Y R E T c @ PXKXKXLXPX ; 1 uX0 KXKX; | PXKXuXKXKX; o ' IXKXl.KXKX; + o ; gXKXgX; ; KXKX| : JXKXKX; PXKXKXLXIX o ; KXKX; ; ; ; KXKX; ; KXKX; ; PXKXKX; ; KXKX; o ; KXKX6 0 ; ; ; 1 5.%. ] PXKXl.KXKXJX; PXKX7Xl.KXPXPX ; KXKX KXKX; o gXPXKXl.KXPXPX+ ; KXKXJX: | KXKX; ; gXKXgX; . PXKXl.HXKXPXPX PXKX; ; KXLXIX z.z.i.i.s.y.i.i.z.9.z.z.9.0.9.u.u.~ ! ! Q ~ Q W L L L G W L L L L L R L L L L L L W P W W L I ^ L L W L J W W W Q J J ! z.x.i.8.8.8.0.0.9.z.c.D > 1 6 1 * & & O X O $ $ X $ X $ X X @ O O X O O O X X O O O % X X X X X X X X % o X % X X X O O O X X ",
"X # - O X X - O & O @ $ @ & & & & & * * & = & % = & - * - # , R n.z.8.0.8.Q J S f f v D S S z z z z x z l z z z x z z v x z z T z S z z D z z C v D D z z D D D G z D D D G G D F G G G I H H J G W R G I J W J G J L E E T c @ o . KXKX | LXJX KXKX9 KXKX IXKXKX >. PXKXKX qX h . KXKX9 o 0 yX 9 KXKX gXKXKX KXKX >. >.% PXKXKX 9X KXKXX . . KXKX qX9Xo KXKX & KXKX KXKX KXKXo KXKXIX KXKXtX. yX0 9 KXKX .. 9 KXKX gXKXKX | KXKXKX gXKXKX z.z.i.i.i.i.i.i.i.i.9.0.8.u.u.u.p.! ! ! ! ! W J L I L G L L G E L L L L L L L L L W L W W L L ^ L L W L J I J J I J J Q i.i.i.8.8.8.0.0.8.z.b.z > , 7 6 , @ & O O & $ $ X X % O X O @ O X O X X X X X O X $ X X X % X X X X X X % o % % o O % X % X X X ",
"# % - $ # - & @ @ @ $ @ $ & & * = * & = = - = = 3 = - * > # , E n.i.0.9.8.I G v f f v D D D C D v D z A z z D z T z v A z z x z z z z z D S z D D D D z z G z D D D D D D F F D G L G G G H H H G J W R W G R G I J L R ^ T c # } KXKXKX | KXKXKX KXKXKX6 KXKX KXKXKXKX . % KXKXKXKXKX h . KXKX9 o 0 yX KXKXKX gXKXKXKX KXKX % . >.. PXKXKX qX KXKXl.7XKXKX gXKXKXKX o KXKX $ KXKX KXKXKX KXKX. o xXKX| KXKXgX yX0 o 9 KXKX .. KXKX gXKXKX KXKX gXKXKXKX M.i.z.s.s.i.i.i.z.i.0.9.u.8.! ! 8./ ! Q W ! ! I L L F L W R L W L L L L L L L L L L L W W L L ^ L L I I J W R W Q I R Q i.z.i.i.9.9.0.0.9.v.z.D > , 6 1 * * @ @ O O $ $ X $ O O X O O O O O X X X X X O $ X X X O O X X X X X X O X O o % O O O O X O X ",
"& $ - $ $ & & & & O & @ $ O O O & & & & & = & ; ; & ; = , - 2 T m.v.8.0.8.Q J z f z v D D S z z A z z D z z z x D z T z z v x z D D C V D z l v D z C D z D z z z v z D D D F D S G G H G H J J W J J J G J W R I G L E _ _ 9 * . } KXKX KXKX KXKX KXKX o KXKXxX yX LXKXKXKXKX KXKX9 KXKX o KXKX KXKX # o % PXKXKX KXKXLXLXKXKXKX gXLXgX >.> KXKX o o & KXKX KXKX KXKX + xXKX| o + KXKX{ 9 LXKX o KXKX o gXKXKX KXKX o o gXKXKXLX z.z.i.s.i.i.i.i.i.0.0.u.i.9.8.u./ ! ! Q Q ! I I L W L W W L L E L L L G L L G H L L G L L G R L L L W L J W R Q Q Q J 8.x.z.i.8.0.0.0.9.0.H.c.z , , 6 1 * @ @ O O O O X O % O X X O O O X O X O X X X X X O O % O O X X X X X X O X O O X X X X O O O O ",
"$ & $ $ $ & & $ & @ O O O & & & & & $ = = = = = & & * = > > , T b.H.8.8.Q Q J v f f z v v D z D z z v z z x x v v z z z T z T x D z v z D D z D D D D D v D C v D D z D D D F D H L J G G J G J W J G J W J W G J G I E E T a @ KXKXKX KXKXKX KXKXKX KXKX KXKXKXxX| | KXKX | gXKXKXKXxX9 KXKX9 | KXKXKX o KXKXKX KXKXJXxXxXGX X PXKXKX KXKX# | KXKXJXgX KXKXKXxX| A KXKX9 KXKXKXxXxXxXJXLXKX KXKXKX KXKXo KXKXKXIXxXxXxXKXKXgX 9 KXKX | LXKXKXxXxXxXIXKXKX KXKXqXxXxXPXKX| b.z.v.i.i.0.i.i.i.i.u.i.i.u.! 9.u.! ! Q Q ! I I P L L I ^ L L ^ L L L L L E L G L L G L L P L ^ L L W L G I J R R W J Q u.i.i.8.0.0.0.0.0.c.b.z > , 1 1 = & & @ O O O X O X O X O O O O O @ O O $ X O X X X X X X X X X X X X X X X O O X X X O X O O O ",
"$ & & $ & O & $ $ & O @ - O $ & & & & = = = = & & & & , * > , T b.b.8.0.8.I J S f x z D D v l f z z z z z z z z z v x z z x z z z z z v D x f z z z z D V C z z C S z D D F G v S F J G H J J J J J J R J W R G G I R L E _ c > JXKXKX o o KXKXgX gXKXKX KXKX gXKXKXxX gXfX# . 9 gXKXKXKXgX o KXKX| 9 gXKXKX X KXKXgX KXKXfXLXKXLXX . PXKXKX KXKX+ KXKXKXJX gXJXKXgX gXHX6 KXKXKXgXgXgXgXKXKX gXKXKX o KXKXo KXKXKXxXgXgXgXKXKXgX 9 KXKX | KXKXKXgXgXgXJXKXKX KXKX9XgXgXUXfX z.z.z.s.0.i.i.i.i.i.i.9.i.8.8.9.8.! ! ! ! ! I I L G G L L P F W L L L L L L L F L L G L L L L L R L ^ L J W W R J J J Q z.c.u.u.! 8.9.0.0.b.c.V > , 6 1 * & & O O O X O O X X X X O O O O O @ O X % O X X X X + X % O O X X X X X X X X O X $ X O O O O ",
"$ $ $ & O & & $ & $ O O O $ & $ = & & = = = = & & & * @ * # > T b.v.8.0.8.8.J S f j D v S z l z z z z z z v T x z T T x D T v D D D z C F D z D D D D D D D D D D z z D v T D D F G G G G G G J W W J J I G J W J I L R E E 9 # } KXKXKXyXPXKXKX KXKXKX9 KXKX KXKXKXKX . KXKXKXKX| KXKX9 KXKXKX gXKXKXKX KXKX # >. PXKXKX KXKXO . KXKX9 gXKXKXKX . . KXKX ; KXKX KXKX ; KXKX o xXKX' KXKX} 9 KXKX KXKX o gXKXKX KXKX gXKXKX c.z.i.i.H.i.i.i.i.0.9.i.i.i.8.u.p.! ! ! Q ! U I W I L L W L T W L L L F L L L G G L L L L L L W L ^ W L J W Q R Q Q J ! z.i.p.8.8.8.0.0.9.z.M.v , , 6 1 * - & X O X X O X X X % X O O O O O O O X X X X O O : % X O O X % X X X X X X X X X X X % O O O ",
"& & $ $ $ $ & $ O O O @ - O $ - % % - & & & = & & & * * , # 2 T b.b.0.0.8.I J z f v x z D z z z z v x v x x z z x z z z x z z z z l z z C z x z D v z D v C z S C v D z D T G S F G G J H J G J G W J J R I W R J I G T E _ 9 # KXKX | KXJX KXKX9 KXKXKX IXKXKX >.% yX: # . KXKXKXKX| KXKX9 9 KXKX gXKXKX KXKX PXKXKX KXKX+ LXKX9 o KXKXX . qXqX KXKX : KXKX KXKX ; KXKX JXKX| KXKXgX 9 KXKX KXKX gXKXKX KXKX . @ KXKX v.i.z.s.i.i.i.i.i.9.i.9.i.u.9.u.9.! ! I ! ! W I L L L L W G G W L W L L L W L H G I L L L L L ^ L L W L J W R R R Q G Q c.i.p.u.8.8.y.0.8.z.b.D > 1 1 1 * & & @ O + % O X X X O O O O O O O O O % X X X % O $ X X X X X % O X X % O X X X X % O X X O O ",
"% % $ $ $ $ & & & O @ @ % O - O = & & - & = - = & & * @ * > , E b.v.0.0.8.Q J j f f z v S S z v z x z T z T v T T v T z z D z z D D z S D v l D C z D z z D S z S z D D z F F S H G G H G J G J R J J G L G R W J J G D _ T c @ KXKXKXUXyXKXKX KXKX; KXKX ' KXLXyXKXKXX KXKXHX>.KXKXLX| KXKX| KXKXKXKXLX KXKX PXKXKX KXKXX >. { KXLX>.KXKXxX KXKX & KXKX KXKXKXLXKX xXKX| KXLXgX 9 KXKX KXKX gXKXKX KXKX @ KXKX . o z.z.i.z.0.0.i.i.i.i.i.9.i.8.! ~ u.! ! ! ! u.W I L G P L L G F W L L L L L L L F L L G L L F L L L L W L R W W W Q Q I 8.x.x.u.u.8.y.8.8.9.z.c.j , , 6 1 * - & O X O X X X X X O O O O O O O O O O X X X X X X X X X X X X O O O O X X X O X O O X $ O $ ",
"$ $ & O $ & & & $ & @ @ @ $ - - - - - - & * * * = = * * > # , E m.z.0.i.0.R J z f l v v D D z D x z z z z z D v x z x z z l z z l z x x D D z D z z C V V C z V D V z S D F F S D G H G G G G J J W G J G R W W G G L Y _ A 9 @ JXJXcXqXJXxXJX JXxXJXJXJX JXJXxX JXJXxXJXJXFX JXxXJXJXgX JXJX| JXxXJXJXxXxXo JXxXJXJXxX JXJXFXJX] JXJXJXgX JXxXJX9 xXJXJX . } JXJXJX JXJXxX FXJXJX9 JXxXJX' gXJXJXxXJX 9 JXJXxXo JXJXxXJX o 9 xXJXJXJX O JXxXo b.i.9.i.i.i.i.i.i.i.9.i.i.8.8.u.9.! ~ ! Q Q W L W L L W W L L R F L L L G L L G L L P L L F L L P L W L G I G L W W J Q u.p.u.8.8.8.p.8.0.b.M.z > , 6 1 * * @ $ X X $ X O O X $ O @ O O @ - X X X $ X $ % O O O O O O X X X O O : X % + X O % X X X % $ ",
"$ $ & $ @ & $ @ & $ @ & @ @ O @ $ & - - * * , * = * @ * * # , E b.z.8.0.0.R H z f f z S D v z z z z v z z x z z z z x T D z z D z D z z D z z A z l C D C D S S D C S S D D G H J G H G G K J R G I J W I W W R I W L R T _ c & % . o o . . o . o . o . o . o . . o . b.i.z.i.i.s.i.i.u.i.i.i.u.9.! 9.u.~ ! ! Q Q L ^ / I L L L L L ^ L L ^ L L L L L L L T L L L L W T L W L G L G G W I H Q i.c.p.8.8.9.8.8.9.z.b.D > , 1 1 * * - O $ # X $ O % $ X O O O O O O O O $ X $ X O O O $ $ X % X X X % X X X X X X X O O X X O O ",
"O $ O @ @ @ & & $ @ & & O - # - - * - * * = * * = * * @ > # , E b.z.8.0.8.R K v f f z D D z z z z x x z z v z z z z z x z f z l x z l x x x x z l l z C V S z z z z z f z S D v H G D G H H J J G J R W W J R W J W E E _ T 9 @ z.i.v.i.i.z.i.i.0.z.H.9.i.9.! 9.u.~ ~ ! W Q L R L L L L R G G R L L L L G L L T L L F L L F L L L L E L G G G H J I H I u.c.p.p.! u.y.8.9.z.M.D > , 6 1 , & * % $ # % X O O X $ O O O O @ O O O O O O O O O $ X O X O O X $ X X X X % O X O O X X O O O ",
"& $ @ O @ : & $ & $ & & & @ & & - & * - * = , * * * * > # # > _ M.z.q.0.8.R G v f f v v D D z z v z z x x T z z z z z v C v D S z D z C D z D D C z C D D D S V D D z S S D G D K G G H G D G J G J G G R G W R G G L R E T c @ iXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX v.i.i.i.i.u.9.H.z.u.9.9.u.9.! 9.u.~ ~ ! Q ^ L W L L L L E L R E L L W L L L L L L L L L L L L ^ L W ^ L I ^ J I I Q I Q p.x.p.u.! u.p.8.9.b.M.v > , 6 1 * - @ @ $ % $ O O $ $ X O O O O $ O O O O O $ O % O $ % O X X % X X $ X X X X X X X X X X X O O ",
"O @ @ O @ & @ & @ @ & & @ @ @ * & $ - - @ , * * * * @ , , # , R M.z.0.0.9.Q J D f f v v v z x z x x x x x x x x z z v z z z S l z z z z A z C D V x Z D V V f V D S D S S F F S S H H G H H G G G J J G J G G J J J G T E E c - yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXo x.i.z.i.z.i.0.z.u.z.i.i.i.~ ! 9.u.! ^ Q ^ ~ ^ W L G G L R G G R H L W L L L L L L L G G P F L L T L L L L W I G W W U I z.x.i./ / y.u./ 8.x.M.A > , 6 1 * * @ @ @ @ O $ % O O O O O O @ O O O O X $ % O O O O O $ X X X X X X % O X X O X X X O X X X O ",
"& O O O O $ @ @ & & & @ @ @ @ @ - - - @ * ; * , * * * * * # > _ n.i.8.0.9.Q J v f f v v T z v x x T v x x v T v v z z D C z S z z z z Z z z x D V l Z C Z V V V S V D D D H G H G G H G H H G J H J J G G I W G J J Y Y ^ | 9 @ yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX: x.i.s.z.i.z.z.z.0.z.i.9.z.~ ! 9.u.~ ~ Q ^ ~ ! W L L G L L G Y E F L W L L L L L L L L W L R L W L L ^ L G L G L W I J Q c.x.p.8.! u.u.6.8.c.b.F > , 6 1 * * @ % - % O O O O O $ X @ O O X O X @ @ X X $ $ $ O O $ O X X X X X O X X X X X X % O % X $ $ ",
"@ @ @ @ @ @ @ ; & @ @ @ @ @ @ @ @ - - - * , , * * * ; * , # , E b.i.q.0.8.Q K v f x T v z z x z x z z x x x A z A z z z l z v l x z x z x l l Z x l Z C z V Z f D C S V V S S S v H K G D G G J G G J G G J J Y G R Y E E A 9 $ ( . .yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX x.i.i.i.s.H.i.z.z.i.9.i.u.9.9.9.u.~ ! Q ! ~ ^ W L L G L W Y E W L L W L L L L L L L P Y L T P W P L L L L L L G I I J Q u.p.p.u.6./ p.8.9.c.b.C > 1 6 1 = * X X $ X O O $ X $ X O X O O O X O X % O O O O $ O % O O O O X X X X X O % O X X X X O X O O ",
"O @ @ & & ; @ & & & @ & @ @ # @ @ - * @ * * * , * * > # * # > T M.z.8.0.8.Q R v g z z T v T z z z z x T x v z z D z z z z z z V x z z z Z x x C V x D C V V V C D v C S S D H S H D G D K G G J J J J J J G R W R R R E E _ Z $ 9XyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX c.x.i.i.i.i.z.0.i.i.z.9.u.! ! u.u.~ 9.Q W Q W I G I G L E L L L L L ^ L F E L L L L L L W L W W L R ^ L L R L L Q I G I u.c.p.u.! u.p.u.8.z.c.G , , 1 1 ; - - - $ $ % X $ $ $ X O O O O O @ X $ O O $ O $ X X $ % O O O O O X X X O O O + % X X X X X X ",
"@ @ @ @ @ * * @ * * @ @ @ # @ - # & & * * * - = = * * > @ # > _ m.z.0.0.8.Q R S f z v v z v x z z l l l f l x x z V f z z z z C A z z z Z z x C z x C C z V z V D z S S D F H S H G G G H G H G L R J G G F G Y R G Y T E T c @ 9XyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX b.i.i.i.z.z.0.z.i.i.i.9.u.! ! 9.u.~ ! W W Q Q W Y W G G R F G R F L L L F L H F L L F R L L L I L W E L G L G L W J J Q u.c.p.p./ u.y.u.! i.M.P > , 8 1 ; @ & & O O O O $ $ O O X O @ O O @ O O % X $ O O % O O O $ O O O % X X % X O O X O X O % O O X ",
"@ @ ; ; ; @ @ @ @ @ * & @ - @ @ - - - - * , - > * * * * * > > T n.i.8.0.8.U R v f f z D T v z z z x x z l z z z V v z z l z V C z z z z z x x Z x l z C V C V V S V S D D D G H H J D H K G G G L I G J G G R R W R Y L E T 9 @ yXyXyXyXyXyXyXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXyXyXyXyXyXyXyX x.v.z.z.z.z.u.z.9.i.9.9.u.! ! u.9.! ^ ! W ! Q G J G G G E L L R G P W L L L L L L R T P P F L L L L ^ R L I L I Q W J U u.u.u.u.8./ 8.8.! c.M.F , , 6 1 1 * @ @ - O % X $ O O O X O O O O O O O O $ O O O X $ $ $ O O O O O $ O O O O O O O X $ O O X O ",
"@ @ @ @ @ @ @ * * @ * @ - @ - @ - - - @ - - , * - * > * * # > _ m.i.8.0.8.Q G v f l v D F D z z z z z v z v D z z z z z z z z C z z x x z l l z l f Z C V V z V V V z D S S G S D D G G G G G G G L G G G G Y R G J T E _ A 9 @ yXyXyXyXyXKXKXKXgXo n L.L.L. L.L.L.3 L.L.L.n % 3 L. L. L. .yXyXyX o yXyXyX0 yXyXyX9X yXyXyXyX o iXyXyXyX .yXyXyX yXyXyX0 3 L. L. KXKX eX o KXKX] n P. KXKXuXyXyXyXyX z.z.z.i.z.i.9.0.0.i.i.9.u.! Q 9.9.! ~ ^ W ! ^ J I L G L L Y F L H G L H M G F P P R L R F G F L G L L L L L G G R W H I 8.c.i.8.6.p.u.9.u.u.b.F , , 6 1 ; @ & O X X $ $ O % O $ X O O @ O O O O O O O O X O O O X $ X % O O X O O $ $ $ $ $ $ X : % X X ",
"* @ # @ @ @ @ ; * * @ & @ @ @ @ - @ - * - - - - , * * , > @ > T b.z.0.0.8.Q R v f j D D z D z z z x x z l x z l z l z z V v C C D A z C Z x x A Z l C D V V V V D V S S S S S S H K G G D G H R G I I L G G R R R R L E E _ c @ yXyXyXyXyXKXKXKXLXL.P.L.L.L.L.L.I. L.L.L.L.L.P.L.L. L.L.L.L.L.L.L.L. L. L.3 I.I. qX9X yXyXyX yX 9Xo 0 ( qX yXyXyX L. L.3 ] KXKXKXKX9 o KXKXKXxX KXKXKXKXPX L. KXKXuXuXyXyXyX x.i.i.i.i.i.z.9.i.9.9.u.u.! ! ~ 9.! ~ ! Q ! W J G I G L R L F L F G L G F G F H L L F P G H L L G L W L L L G G I J H I / i.i.8./ 8.8.8.! u.M.F > , 6 6 1 & & & O X $ X O $ $ X O O O O O O O O O O O % O O O O % X $ O O O O O $ $ $ X O % $ $ X O X X ",
"@ @ @ @ @ @ @ & @ @ @ ; $ - @ & - @ - @ - - - - * * * ; * # , T M.i.8.0.8.I R v f f T z v T z v z z z z l V C x l l z v x V V C z A x V Z x x C A x z z l V V V v z z Z v D D S H H G G G G G K G J J G Y G R R Y W Y Y _ T 9 @ yXyXyXyXyXKXKXKXKXL.L.L.L.L.L.L.I. L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. % 3 3 % ( 9X9X9Xo ( ( ( ( 9X9X9X: 0 ( ( ( yX( o 9XqXo o 0 yX yX 9X9X9X: 0 ( ( | | 3 | LXKXKXKXKXKXKXPX9 eX) | | | xXKXKXKXKXKXKXLXJX3 LXKXuXuXyXyXyX c.i.i.9.i.0.z.i.9.9.i.9.c.! ! ! 9.! ~ ! W W W G G I G G R F L R F I W G H P L F L F F L L F G R F L I L L L L G W J H J u.u.i.8.! 8.8.8./ u.M.F > , 8 6 = @ @ & # X X O $ $ O $ O O O O O - X O $ X O $ O $ X $ % O O $ % $ $ $ O % $ $ $ $ $ O X X % + ",
"@ @ @ @ & * * & & ; @ @ - @ - O - - & - * - - - * > * , , # > _ n.i.0.0.8.Q R S g v v v v z z z z z x D x V C l z f l V V z Z z z z V x Z V l C z z z A l V l l D z D v S D J F G D G D R v G J W G J G Y Y G G R J G Y E A c + yXyXyXyXyXKXKXKXgX n L.L.L. L.L.L.3 L.L.L.I. L.% P.n n L. o qXyXyXqX o o ( yXyXyX : yX yX yX yX . o o ( yXyXyX L.% L.n LXKXKX KXKXJX eX. . KXKX gXKXKX L.% LXKXuXyXyXyXyX c.9.9.H.i.i.9.i.i.9.i.9.u.8.! ! 9.! ~ ! W ! I G J G G G R G G G G G G G G L F L L L F L L L L L F L L L F L G L W R H I u.u.u.8.! u.p.8.! u.c.T , , 8 1 * - * @ % X X O O $ O O O O O O O X O O X $ O X % O O X X $ O O O $ O O $ $ O O $ $ O % X X O % ",
"@ @ ; * & & & & & & @ & - O $ - O @ & * - @ - * * * * * > # , _ b.i.8.8.8.I R S f x v v T T z x l x x z l l Z x Z V l l Z f x l x z l l z z x z T x x v v z z z z z z z D D D v H Y v G G G H G J J J H G K G Y Y J J Y R _ c * yXyXyXyXyXKXKXKX0X. I.L.L.L. 3 L.L.L. L.L.L.n n P. % % L. L. yX o yX : yX yX yX yX . o yX n P. % L. LXKXKX KXKXFX eXo + o % % KXKX gXKXKX n P. KXKXuXyXyXyXyX M.i.z.z.z.i.i.i.u.y.8.p.u.! ! 9.u.! 9.~ ! Q L G R F G G Y Y G G G G Y F G L F G L T F L L L L E G L L F F L F L W J H I ! u.i.u.U / p.8.u.u.c.L , , 7 1 * - & & @ $ X X O $ O O O O O O @ O O O $ X O O % $ O O $ X O O O O O O X O O O O X O X O X O O ",
"@ @ * @ & & $ & & & & @ $ - $ $ @ & & @ - - & & @ * * > * > > ^ b.i.8.8.0.Q R S f f v x z z v x V x x z l l l f x x z Z l l Z x x z l l Z z z C z z T z x T z z D D z C v D G S G v G G G v v G J G G J G J R J J J J G R T 9 # yXyXyXyXyXKXKXKX[.. I.L.L.L.L.L.L.P.n 3 L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. yXyXyXyX 9XyXyXyX yX iX9X 9XyX o yX 9XyXyXyX LXKXKXKXKXKXLXJXJXKXKXeXKXKXU.L.KXKXeXKXKXL.U.KXPXeXKXKXL.xXKXKXeXKXKXL.IXKXKXeXKXKXKXKXKXKXKX KXKXuXyXyXyXyX b.i.z.0.z.9.i.i.i.9.i.u.u.! ! ! 9.~ ~ ! Q Q R L L G G Y E Y G L G G J F F L F L L L H L E L L E L L E Y Y E F L J J H J u.u.u.u.u.f.u.u./ u.c.T < < 8 1 , - & & @ @ X O $ O % O O O @ X X X O O O O O O O O O O O $ O O O O % O X O % X X O X X X X X X ",
"@ @ * @ @ @ @ @ & & & O - $ - O @ & & & @ - & * ; * * * * > > _ b.z.9.9.9.Q R S f z v D D D z z z l z V l l x l Z x z x Z x C Z z Z l x C z z C T x T z v T x v z v z z z D D z v R G R K G v G J G G G G R Y J J J G Y E T 9 # yXyXyXyXyXKXKXKXtX. I.L.L.L.L.L.L.P.n 3 L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. .yXyXyX yXyXyX0 o yX yXo iX9X .yX yXyXyX0 o LXKXKXKXKXKXKXJXJXKXKXeXKXKXU.L.KXKXeXKXKXY.U.LXIXeXKXKXL.xXLXKXeXKXKXL.IXKXKXeXKXKXKXKXKXKXKX KXKXuXyXyXyXyX c.i.i.i.i.i.9.i.9.0.8.u.u.! ! ! 9.Q ~ Q W Q G G G G G G Y G F F G G G S F G S F Y F D F L F L F F F L D F F F G J G H J ~ u.z./ ! u.i.8.9.c.M.L , , 8 8 * - - & @ O X X O O $ O % # X $ O X O O O $ O O O O O $ X $ % O $ X % X O X X X X X O O O X X X ",
"@ @ * @ @ @ @ @ & $ & - - $ @ - $ & - * * - - * * @ , # # # , E b.i.0.0.8.Q G v f z z v v D z z V l l Z l l Z f x x l l l l f l x Z l l x l l z z x z x x z x x T z A v v z D C G R v v G D G G G K G G K R G R J G G Y _ E c @ yXyXyXyXyXKXKXKXS.. % n I.L.L.L.L.I.I.n 3 I.I.L.L.L.I.I.I. I.I.L.L.L.P.I.I. 3 I. % 3 I. 3 I. 3 9X9X 0 0 0 0 qX 0 0 0 iX9X .yX yX yX 0 qX 0 0 0 3 I. % 3 I. 3 LXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXLXLXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX 3 I. % 3 LXKXuXyXyXyXyX M.u.i.9.u.i.9.9.9.9.u.9.u.! W ! 9.Q ! Q W Q J G G Y G T Y G Y Y D G F S F L F P R P H L L F T L L L L F F Y Y G W I J J 9.z.u.8./ u.u.9.! u.c.L , , 6 8 = # - & @ O X O O % X O O O O X O O % # $ O O O O @ $ X $ X X $ X O X X % X X X O X X X O % X X ",
"; ; : @ & @ & & & & & @ O $ @ $ @ - * @ - - & & * & * * - # 2 _ b.b.0.8.8.I J v f x z D D D z z f l l x f l x l Z z x x x l Z x l V x x C Z l C v z z x x v z v T x x T T T z v T G G G G v R G D G H R R K R R J J G Y E A 9 @ yXyXyXyXyXKXKXKXgX 3 P.P.P. % % % P.P.P.3 % % % P.P.P.n % % % P. % P.3 % n I. % : : : iXiXiXqX : : : 9XqXiXqX : o iX o : iX : iX0 : qX9X : : : 9XqXiXiX P. % P.3 % LXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX P. % KXKXuXuXyXyXyX M.u.i.9.i.8.u.0.8.9.i.u.u.! ! ! ~ ! ! W I W J J G F D G Y T F F G G G S G L F F L F F T L F L L F L L F T R Y Y W J G W ~ u.u.8.6.p.i.8.8.z.c.T < , 8 8 , - * & @ O O X O $ O $ O O X @ @ X X O X $ O O O O O % X O O O $ X X X O O X X % X X X O % X X ",
"@ @ @ ; & & ; & & $ & O $ & $ - $ $ @ * @ # - * * * * * > # , _ b.i.8.8.8.I J z g v v z D D v z V Z z V x Z x l Z x x x x x Z x l l d l C z x C T z v T z z T x v z z D z v v z D R G D R G v G G K D K G G R G J J Y Y ^ _ a * yXyXyXyXyXKXKXKXKXL.L.L.L.L.L.L.I. L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. .yXyXyX yXyXyX0 iX iX yX0 qX9X yXyXyX0 LXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX. 9 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX . LXKXuXyXyXyXyX z.z.9.i.u.i.i.u.i.8.9.y.p.! Q 9.~ ! Q W I W G G G F G Y L G L G G F G G F L H F L T H F F D F L F R L T G E Y G J G H J u.u.p.u.! / i.8.~ u.M.L , , 8 6 * - @ @ O O O X O O $ O O O O O X @ O O $ X O O O O O X % O O $ $ X : X X X X X O X X X X O O X ",
"@ @ & & ; & & & $ & - - & & - % % $ - - - - - @ * * > * * # > R b.v.8.8.U Q G v d x v v z D z z f Z V V l Z x l C x x Z x x z l l C l x x Z z V x l z D x | v v T x x z z v v z v Y R D G K F D G J J G G G R G J G R Y T _ c @ yXyXyXyXyXKXKXKXKXL.L.L.L.L.L.L.I. L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. qXyXyXqX ( yXyXyX yX 9Xo o 0 ( qX ( yXyXyX LXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX9 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX LXKXuXyXyXyXyX c.z.9.u.u.p.8.u.9.u.9.8.u.! 8.9.~ ! ! W I ^ J G G G G T R Y F E G F G F F L S H L F H L L F P L P L E Y E Y R W W G J J ! u.9.8.! p.u.u./ u.M.E , , 8 8 = - - X O O O O $ O O O O X @ X @ @ O @ X % O $ $ O O $ X % $ O X X X % O O O % X X X O O X X : ",
"@ ; @ & @ & & @ & $ & - - - & - - # @ - - - - - * @ ; * * # > E b.z.8.8.U Q G x f f x v D C z z V l l x l l x l C x x Z x x z l x C x x V Z l z l x v z T v z z z T v T D D D D G R G G v G G R G J J R G R R R R G G Y R T c @ yXyXyXyXyXKXKXKXKXL.L.L.L.L.L.L.I. L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. L. L. L.n yX o o yX o yX( 9XqX 0 yX o o o yX yX o L. L. LXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX9 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX L.L.KXKXuXuXyXyXyX c.u.u.9.u.8.9.0.8.8.i.u.u.! ! 9.u.! ^ Q W Q W J G G G G E Y F L G L L H F L F F Y P D G G G F H F G E L Y Y Y E W I J I ! u.u.! ! 8.8.8.u./ c.E , , 8 8 , - - % O % $ O X % $ O X $ X $ # % O O % # O $ $ $ $ X X X O O $ X O O X X O O X O X O X X X X ",
"@ & & @ @ & @ & $ & - $ $ $ $ $ X - - - - - - & @ * ; * , # , T b.v.8.8.Q I R v f f x v D v z z z l Z V x V Z x Z z x Z x c Z l x Z l x x x l V l f z z x D z x v z z D z D v z v G G H v G G G G K R R G G R R Y R Y Y T _ c @ yXyXyXyXyXKXKXKXgX % 3 3 3 3 3 3 % 3 3 3 3 3 3 % % 3 ( qX9X9X ( ( ( ( 9X9X9X: 0 ( ( ( o 9X9XqX .o o ( ( ( 9X9X9X9X o ( ( ( : 9X9X9X9X ( ( ( ( ( 9X9X9X ( ( ( ( 9X9X9X: 0 ( ( ( 3 3 % LXKXKXKXKXLXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX9 KXKXKXKXKXKXKXKXLXKXKXLXKXKXKXKXKXKXKXKXKX 3 LXKXuXyXyXyXyX c.u.u.u.p.8.8.8.y.8.p.8.u.! ! 9.9.! Q W I Q R W Y R G Y L L G L F R L L G L F P L T D L L F L L F Y L Y W E Y G R W J I ! u.u.! 8.p.u.8.! u.x.^ , , 6 1 * - # X X X O X X X X X @ X O O $ O O O O O O $ O O X $ $ $ $ $ O % O O X X X O X X % O X X % X ",
"@ @ @ @ O O & $ $ $ - - - $ - $ # @ O - @ @ - * & * ; , # # > _ b.i.8.8.Q Q v v f x x v D D z V V f f l d l x l Z x x x x x x l l A l x V x V C z l D D z z v z z z z z z z D v T R R v G G G G G R K R R R R G R G G Y R T c @ yXyXyXyXyXKXKXLXgX 3 3 n n n 3 n % 3 3 % n n .: 0 9X9X9Xo ( ( 9X9X9X: : . .9X9X( 9X9X9X9X . o 9X9X9X9X .: 0 9X9X9X ( ( 9X9X9X: : . 3 n n gXgXgXgXxXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXxX; o gXgXgXgXgXgXgXgXgXgXxXxXgXgXgXgXgXgXgXgXgX % n KXKXuXyXyXyXyX c.u.9.y.u.8.p.p.8.p.8.9.u.! ! 9.8.! Q I W Q J J Y G D G G F D F D F F D G L F G L F H F L G F L F G L T Y Y Y G J G G J ! / u.! U 8.u.p.! / v.^ , , 8 1 * - - X X X % X X X X X X O O O O O O O O O % O % $ $ X $ $ $ O O O $ O X X X % O X X X O X X X ",
": O @ O X - O $ - O & - @ % - O $ - - & @ - - & & = = = > # , E b.b.8.q.W W J z g v x v x v v x x l x V l Z x l x x l Z l l x x l C x z C x z C V l D z x D z z D z x T v v T v D Y G R G D G G G G G K K R Y R G G R G E _ 9 # yXyXyXyXyXKXKXKXKXL.L.L.L.L.L.L.I. L.L.L.L.L.L.L.L. L. L. L.3 0 yXyXyX yXyXyX yXyXyX yX 9X o 0 ( yXyXyX yXyXyX L. L.3 I.I. % % 3 L. L. L. KXKXuXyXyXyXyX c.u.u.9.0.9.0.0.9.9.9.9.9.8.Q ~ / ! Q I I W L G Y G F G G F F F F F G F F L F L R G F F G F T L F G L F L T Y G G G H J U u./ ! ! 8.i.8.! 9.M.^ 2 , 8 8 * - - X X X X X X X X X O O O @ X O O X O % @ O X O O O O O O O O $ X X X X O O : X X O X % O O ",
"@ @ O + X O O - $ - @ & # $ $ @ $ # - @ @ - * - & & * * # # , T b.i.8.8.Q W K z d x v v z T z z v l l x d x l l Z x l x f l x l l z l c Z x z C Z z D D z A z z T v T z x z F z v F v D H G R v v R G R G G G G G G G G R T a @ yXyXyXyXyXKXKXKXKXL.L.L.L.L.L.L.I. L.L.L.L.L.L.L.L. L. L. L. yXyXyXyX yXyXyXyX 9XyXyXyX yX o o 9XqX 0 yX yXyXyXyX 9XyXyXKXKX L. n n % L. L. LXKXuXiXyXyXyX c.~ 9.i.9.9.9.9.9.9.9.0.0.Q Q ! / Q Q W W W L G L F F Y Y F F Y G G G G G L F T E G F L L F F L L F G F Y L F L L L G L ! u.u.! 8.8.p.8.! 9.b.^ < , 6 = * - # X . X X X X X X % X O O X O O O O O O O O $ $ O O $ % O O O % X X X X % O X X X X X X X O ",
"# X X + + X O O - & & & O - - O # X - & - @ - & & & * * * # > _ b.i.8.8.Q I J v d v z v z v x x l l l Z x x z l x x x Z Z x Z x Z C Z Z C Z l z z z z D z v x x z T z T v z v z T v v v G R G G G G G R G G v G G G G Y T T 9 # yXyXyXyXyXKXKXKXKXL.L.L.L.L.L.L.I. L.L.L.L.L.L.L.L. iXyXyXyX .yXyXyX o yXyXyX0 ' KXKXKXKXKXKXKXPX 9XiX 0 yX .yXyXyX yXyXyX0 KXKXuXyXyXyXyX c.u.9.9.9.u.9.9.9.9.9.9.u.! Q Q / W ! W J I W W G F G Y Y G Y Y Y Y F F T L F F Y F F G F F G R F G T F T F F F L L G L ~ / / ! ! 8.i.8.8.9.b._ < , 8 6 = - - % X X X X X X X X O O # O X @ O O O O $ O O % O O $ O O O O O X O X X X % X X % O X X X X ",
"O X X X # X X O @ & & @ @ $ - # X X O # O - - * & & @ * # # , _ m.i.8.Q 8.Q H z x x z x T z z T l l l z x x z c x l l l x l x Z x Z x x x x l z z x z D z D z T x z z v z v T D v G T Y R v G R R G G G G R R R K R D R _ T c # yXyXyXyXyXKXKXKXgXX 3 I.I.I. % 3 3 3 I.I.I.% 3 3 3 I. 3 % I.% % 3 I.n % 3 qXqXqX0 o 0 9XqX9X9X 0 0 9XqXqX 0 o < 9X . o 9 | 9 o qX< yX yX 9XqXqX9X 0 0 qXqXqX 0 I.% % 3 I.n 3 3 I. 3 I. 3 I. 3 % I.% 3 3 KXKXuXuXyXyXyX. c.~ 9.u.9.9.i.9.0.9.9.9.8.8.! Q / I Q L H W W G F H F Y G F F T F F F D F R F F F F F G G F R E Y G Y G L L L L W G L I ~ / u.8.9.9.0.8.8.9.b.^ < , 6 8 > - - # X X X % X X X X O X $ O @ % O O O O O % O O O X O O % $ % O O O O X X O X X X X O X X X ",
"O O X O O @ $ - @ & & O - @ @ @ O X X X - % @ @ & & ; ; @ # > _ b.0.U 8.8.Q J j f f v v v z z z l l l Z l z C l l l l l l l C x x x x x C x z z z z z D z v v x z z v z z T v x v Y v Y Y R Y R K v R G K G G G G G v G T T 9 * yXyXyXyXyXKXKXKX[.o I.P.L.L.L.L.P.P.n 3 P.L.L.L.L.P.P.P. % : iXiXiXiX o iXiXiXiX o 9XiXiXiXiXiX. iXO $ $ iX( . iX o iX . o .iX o iXiXiXiX o 9XiXiXiX % % % LXKXuXuXyXyXyX c.9.9.u.9.9.9.9.9.9.9.9.9.! ! ! ! Q ^ L L L L L G F L R L T F L Y Y Y F G L F R L F F Y F F Y R F F Y G F T P F F H F L ^ ~ / Q ! ! 8.8.8.z.b._ < , 8 8 = - - % @ X % X X X X X # X @ @ - O X $ $ X $ X % O O $ O X $ O O O O O % X O O % X O X O X X X ",
"O O X X O O @ @ & & & - O O @ X # X # @ # # X X & $ & & # . > _ m.0.8.8.! I G z a v x x A A x z x d l x l x x d l l d d x x C x x Z x Z x z z C z z z D z A z z T z T D T v T v Y T T v G T v v R Y v G R G G G K H R G E T 9 ; yXyXyXyXyXKXKXKXgX I.L.L.L.L.L.L.L.n 3 L.L.L.L.L.L.L.P. iXyXyXyX .yXyXyX yXyXyX0 KXKXKXKXKX xXKXKXKXKXyXyX: o iX9X .yXyXyX yXyXyX0 LXKXuXyXyXyXyX c.` 9.u.z.9.9.9.9._ H._ u.! ! ^ / W ^ L F W R L G F L L R Y F L G Y W F H T F Y E F Y Y G G Y R D G Y G E E T L L L L L ^ / / Q ! u.0.0.8.9.H.R , , 8 1 , - - # # % # X X X X X X X X O X X O @ O $ O % O O O O X % : O O O O O O O X X O X X X O % X X ",
"+ X X X X X @ O @ @ & @ O O @ @ @ O # X X X X X % X $ & @ # > T M.z.Q 8.Q J G z d x z x z z x z l l l Z l x x d l l c l l x Z x x x x x Z x z D D x z D v z z z z T D z z D D v F v v Y v Y Y Y R G G G H H G G R H H G E T c * yXyXyXyXyXKXKXKX0X I.L.P.L.L.L.L.L.n 3 L.L.L.L.L.L.L.L. I.I. 3 L. L. yX0 qX9X ( yX ' KXKXKXKXKXKXKXPX ( yX yX qX9X ( yX 3 L. L. L. L.3 I.I. 3 L. KXKXuXyXyXyXyX c.~ 9.u.9.9.9.9.9.9.9.9.9.! ! ! / ^ ^ L L I L L G P T L F F F G F T Y G D T F G E F F F F F F T S D F F L F F F F F H G L ^ ^ W I ! i.8.8.0.b.^ < , 6 8 * - # X $ % X X X X X X X X O X O O O $ $ O O O O $ O % $ X % $ O $ $ O O X X X O : O X % O X X ",
"X X X . . O O @ # @ @ @ @ $ @ @ @ O O X X . X X o X + + . . , _ b.s.8.8.8.J G z f x z z v T z z x l l x x x Z l l l l l l l Z x x x x l x x l x x l z z x x z z z x x z z v T D T T v v Y v v G R D G R R G G G R G G T ^ T 9 @ yXyXyXyXyXKXKXKX[. I.L.L.L. 3 L.L.L. L.n n P. % L. ( yXyXyX o yXyXyX yXyXyX yX .yX yX o yXyXyX yXyXyX n P. % L. L. L. L.n n P. KXKXuXyXyXyXyX c.c.~ u.9.i.9.9.9.z.9.9.~ 8.^ ! ! Q / L G L L L F S H T G F G Y F F F D F L F F Y D F G F F Y R F G Y F L F H H F L F G ^ / / / ! u.i.8.0.9.b.W < , 8 1 * - - @ - O X O X X X X - X $ O O O X $ X O $ O O O O $ X $ O O O % O O % X X X X X X X X O O X ",
"O O O O O & & & & $ @ @ & O @ & O @ O O + X o o X . . . . # _ m.z.9.8.Q I F j s l v z z z z z x l l Z l x x l x l l x Z x Z C V Z z x x x l z z x x T x T v T v D v T D T D z T F v G R v G R R G G R K G G K K R G Y E _ 7 + yXyXyXyXyXKXKXKXgXo n L.L.L. L.L.L.3 L. L. L.3 yXyXyXyX o o yXyXyXyX 9XyXyXyX KXKXKXKXKX' yX yX0 o o o o yXyXyXyX 9XyXyXyX L. L.3 I.I. 3 L. L. L. LXKXuXyXyXyXyX c._ 9.9.9.9.9.9.9.9.9.9./ / Q Q / I ^ I G L L T H S F G L T L L F F F D T R D T T G T G G G Y R G Y T D T L F F F L F Y ^ ~ / ~ 8.0.i.0.9.0.b.^ , , 4 1 * - - - % @ O O O X O $ - @ O O $ O O @ O O $ X $ % O O O $ X O O O $ $ X X O O X X O O O % O O ",
"O O O O $ @ & @ & - @ & & $ O @ & & X + + + X o X X + + . . > T M.0.8.8.8.I J z f f z z T z x x l d l x l l l x l l x z V x x x l Z z z V Z z D z z x z x z x z T x x x v z v D T R T v v G G G K G D D G G D G K G G G E T c & yXyXyXyXyXKXKXKXLXL.P.L.L.L.L.L.I. L.L.L.L.L.L.L.L. o .9X9X9X . . .: 0 9X .9X ( . .( 9X9X .: : . . . IXKXKXKXKX7XKXKXKXKXKX 9X ( 9X: : : 0 .9X9X . . .( .9X9X: 0 . . . KXKXuXyXyXyXyX c.c.9.9.9.9.9.9.9.q.9.9.u./ Q Q / ^ ! Q L L L L L P L L R F L T D F Y G G G D G G R D G F G Y T Y G G G R G G G L L L P ^ ~ ! ^ 9.9.0.8.8.9.H._ < , 4 6 * - - # X O # X O O O O X X O O O O X X X O X X X X O O X O X X % X X X O % O O O % % X X o X X ",
"+ O O O O O X @ $ @ & @ & @ O & & $ O + + + O + . X O + + . > _ b.9.Q 8.8.I G V f f z v D v l l z l x x x Z Z l x l l l l l l l l l l Z x x V C z x z v x v x x z T z z D D D z T v v R T D v G F G G K G G H D D G G Y T _ 9 @ yXyXyXyXyXKXKXKXKXL.P.L.L.L.L.L.I. L.L.L.L.L.L.L.L. % L. L. L. o 0 yX yX yX ' KXKXKXKXKXKXKXPX 9XqX 0 yX yX yX L. L. L.n n L. % L. L.L.KXKXuXuXyXyXyX c.` 9.9.~ 9.9.9.9._ 8._ ~ ! W Q ^ L ^ P H L L L H D L L F D F Y F F F F G D D D T G H D D T G G T G G G Y Y F F L F H G W / Q ! Q 9.9.8.9.9.b.9.< , 6 1 , - - @ # $ X O O X O O X O O O @ O O X O X X X X X $ O X X % O O X X X O O O O X O O X + X X X ",
"O + O O O O X X O O X X O & O O $ $ O + + O O O % O # . . # T M.i.8.Q ! I G z f f z z z z l l l l l d l f d l l l d l f l l l l z l x V x l C z x x T x T A v z z z z z z D v v T Y v v G Y Y G G G D G H G R K R G G E A c @ yXyXyXyXyXKXKXKXgXo n L.L.L. L.L.P.3 L. L.% P.n yXyXyXyX yXyXyXyX 9XyXyXyX KXKXKXKXKX' o yXiXiX9X yXyXyXyX yXyXyXyX 9XyXyXyX L.% P.n n L. L. L. L.% LXKXuXyXyXyXyX c.~ 9.9.8.~ 9.9.9.9.9.9.~ Q U W / I / L F L L F H H F T F F G G D F T F G T D G G D D D D D G D G T v D G P H F F H D G W ^ Q Q 9.9.0.8.8.0.M.R , > 4 6 * - - X % O X X % @ O O O O O @ X O X X O O % X X X X $ X O O X X O X X X % O X O X $ X X % X ",
"O O O X X + X X X . X X + + O O O O X X + X + O X X + X # . > _ b.i.8.Q ~ Q G v f x x v v x l l f l f l l l l l l f l l x l l Z V x Z x x x x D z z z T T x v x T x T x v T D D T Y T v G G R R G R G G K R G K J J T L E _ 9 X yXyXyXyXyXKXKXKX0X . iXyXyXyX .yXyXyX yXyXyX0 yXyXyXyX o iXyXyXyX o .yXyXyX o yXyXyX0 . KXKXuXyXyXyXyX c.~ 9.! ~ 8.R 9.9.9.R 9.! ! Q Q / W Q L F L L L L F G E Y F Y E D T Y G G G T G Y T F F H R Y G v Y G D G F F L F L P P W / ^ Q 8.9.9.0.8.0.b._ < < 6 1 = - - O X O X O @ O O O X O O % O O % O O X X X % O O O O % X X X : % X X X X X X X O X % X X ",
"O + O o . X X X X X . + + O X o X + o X X X X % X X . X + . , _ b.i.^ q.Q J H v f f x v T v x x x x l l l x x l l l l l l l f l l l l f x l l z z x z v v x x x z x z z x z D z T v v Y Y v v Y G G G G G G G G G J G Y E T 9 @ yXyXyXyXyXKXKXKX[.. n L.L.L. L.3 I.I. yX o yX yX0 qXqX ( yX yX yX yX0 qX9X ( yX yX . L. L. L.3 I.I. L.L.L.L. LXKXuXuXyXyXyX c.u.8.9.~ Q 9.9.9.9.H.R 9.Q Q Q Q / ^ L L R L F P F G R G F G G v D G D D T D D F D F S D D F F D T D z F F F D F H S S P ^ ! W R 9.0.8.8.9.b.^ 2 , 8 6 , - @ @ # @ X X O O O O O O X @ O X # X X X X X X X O O X X X X X X X X X % X X X X O O + X X % ",
": O O X X X + X X . + + + X X o X X + + $ O X X X X O @ # + 2 T M.i.8.8.8.Q H z f f v x x x x x l l l x l x x x x Z V x l l x x x z l z z z z v z z D T v T v x T T z v D D T D T Y v v F Y v F G D v R H G G R K G Y Y E T c # yXyXyXyXyXKXKXKXKXL.P.L.L.L.L.L.I. 3 L. L. o o yXyXyX( o o qXyXyXqXo o o 0 yXyXyX o o o yXyXyX o o yXyXyX o yXyXyX( o o o qXiXyXqX o o 0 yXyXyX o o o o yXyXyX o o yXyXyX o o yXyXyX( o # . L.3 I.I. 3 L. L. L.L.L.L.L.L.L.L. KXKXuXyXyXyXyX c.~ 9.! 8.Q ^ ^ 9.9.R 9.9.! I ! Q I ^ L G L R L L F G L Y F G Y D F G T T G D D F F F F G G G F G G F T L T G L T L F T W / Q Q 8.9.8.8.8.9.b.^ < , 6 1 , - - X $ $ X X O O # % O @ O O @ O X X X X X O X X $ O O O % X X O X X X X X X $ X X % + % . % ",
"O + O O O O O O O X # @ @ O O O X O @ X @ O # % X X # @ + # @ T b.i.8.R U J D v f f x v T v z x l f l l l f l f l l x f l l l l l l l x z x x z x x x z x T x v z z z z z D v z z G Y Y Y v R G G G G Y G G G D K R Y T E T c @ yXyXyXyXyXKXKXKXKXL.L.L.L.L.L.L.I. % 3 9X9X9X . o ( ( ( qX9X9X9X ( ( ( 0 9X9X9X9X . ( ( ( ( ( 9X9X9X ( 0 ( ( ( ( o 9X9X9X: : ( 0 ( ( ( 9X9X9X . o ( ( ( o 9X9X9X9X o ( ( ( 0 9X9X9X9X ( ( ( ( ( 9X9X9X ( ( ( ( o 9X9X9X: 0 ( ( ( o 9X9X9X . o ( ( | | ) eXwXxXxX9 % % 3 L.L.L.L.L.L.L.L. KXKXuXyXyXyXyX c.~ 8.~ ~ 9.9.9.9.9.9.9.~ ! Q I / I Q L L L L F P F D L F F F F D F G D D G S D F D F F D D G D F T Y v L T G F L F H H W / I Q R 9.8.8.8.8.b.^ < , 4 1 - - - @ - X X X O & O O O O O O X O X X O $ X X O X X X O O X X X X X X X X X X X X X X X X X ",
"X o O O O O O @ & @ - 2 > q q 2 q 2 q 2 2 q 2 q q 2 q q 2 q q q.H.k.k.q.q.@.q.k h h v @.@.v @.k k k @.v k @.v @.v @.@.k v @.v &.k k q.k q.k @.v v h k q.@.v @.v &.v q.k @.k q.k v @.q.@.q.,.q.N @.q.@.q.q.@.v q.q.@.q.@.q.v v q qXqXtXqXqXIXIXGXA.2 5 P.P L.2 2 2 2 2 2 2 2 2 2 > > 2 I.q 2 2 2 2 2 2 2 > 2 2 2 # 2 2 I.q 2 2 2 2 2 2 > 2 2 2 > 2 > 2 2 2 2 > qXqXqXq 2 2 2 > 2 2 > 2 2 2 2 > qXqXqX2 > 2 2 2 2 > 2 2 2 # 2 2 qXqXqX9 > 2 2 > > 2 2 2 2 2 2 2 9XqXqX0X> 2 > 2 2 # 2 2 > 2 2 > 9 qXqXqXq 2 2 2 2 # > 2 2 2 2 2 2 qXqXtX2 > 2 > 2 2 2 > 2 2 2 > 2 qXqXqX2 2 2 2 2 2 2 2 2 2 2 2 2 qXqXtX) > > 2 2 2 2 > 2 2 2 > 2 9XqXqX9Xq q 2 2 2 # # . o o ( yXyXyX yXyXyX o ' KXKXKX n P. L. L. L.L.L.L. KXKXuXyXyXyXyX ` 8.9.9.9.9.9.9.9.9.~ Q ^ ~ I Q ! U Q L L R T P G D D G F F G F F F Y D F T P D F F T T D F L F D F T F F D F V V D V V P ^ / W ! u.8.8.! u.b._ < , < = = @ @ * # X X O O O @ X O O O O X O O $ % X X X % O X X X X X X % O X X X X X o X X % % o X o X ",
"O O + + O O @ @ - r v | | ] ] ] ] ' [ ' ] ' ' ' ' ] ' ' ' ' ] gXjXjXkX.XkXkX|. X[.D.D.].].].gX].gXD.D.]._.D.D.D.].[.D.].].].[.S.].].D.].].].].].rXG.].].D.D.].].gX].D.].gXkXD._.D.kX].|.D.|.'.|.kXD.|.|.].kX|.].|.|.gX|.kXgX[.] aXaXpXpXaXKXLXLXxX' ' ' ] M.' ' ' Y.U.U.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.Y.' ' ' ' ' ' ' ' ' ' ] ' ' aX0X' ' ' ' ' ' ' ' ' ' ' ' ' ' dXsX' ' ' ' ' ' ' ' ' ' ' ] ' ' } aX' ' ' ' ' ' ' ' ' ' ' ] [ ' ' pX' ' ' ' ' ' ' ' ' ' ' ' ] ' ' pX' ' ' ' ' ' ' ' ' | ' ] ' ' ' pX0X' ' ' ' ' ' ' ' ' ' | ' [ ] dXsX' ' ' ' ' ' ' ' ' ' ] ' ' ' } pX' ' ' ' ' ' ' ' ' ' ' ' F.] ' aX' ' ' | | x q # yX yX( ) eX % L. L. L. L.n L.L.L.P. LXKXuXiXyXyXyX 9.~ 8.8.9.9.9.9._ 9.Q 8.9.! U Q ! ! ! L L L L F P S F L G F F P D Y F F F T Z F F F P F A F L Y F T D C F F F T G T P F ^ ^ ^ W ! ! ! 8.8.! c.^ < , 8 6 , - * @ # @ O $ O X O O X X O O O O O $ O X X X X O O X O X O X O O X X X X $ % X X X . o % % X ",
"o O O X + # O 2 A ] ] ] ] ] ] ] ] ' [ [ ] [ ] ] ] ] ] ] ' _ [ kXjXjXkXXXkX.X|.|.D.].].].].].].D.].].].]._.].].D.].].D.D.].].gXD.]._.).].].].].].].].].].].kX].].].].].].].].|.'.kXkX|.|.|.|..X`. X|.|.|.kXG.|.|..X|.kX|.kX'.S.] pXpXpXpXpXKXKXKXxX' ' ' ' ' ' Y.U.U.U.U.U.U.U.Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXtX' ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' tXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXtX' ' ' ' ' ' ' ' ' ' ' ' pXpXaXpX' ' ' ' ' ' ' ' ' ' ' ' aXpXpXpX' ' A 2 o 9XyXyXyX : yXyXyXeXKXKXKXKX L.L.L.L.L.L.L.L.L.KXKXuXyXyXyXyX ` 8.9.9.9.9.9.9.9.9.Q Q ~ Q Q Q u.! ^ G H R G F H H F L F D F T F G F D F L Z F F F T F F F F F D F F C F F C F F F F P E ^ ^ P ! / 8.! ! 9.b.^ < , 1 1 = - @ @ $ X X # O O X $ $ $ O O O O X O O X % : X X X X % O O X X X O X X X X X o X X % X X % X ",
"X O O X @ # f ] ] ] ] ` ] ] ] ] ] ] ] ' ] ' ] ] ' ] ] ] [ ' [ kXzXjXXXXXkX.X XD.D.D.].].].].].D.].].D.D.D.].].D.].].].D.].D.].].].].).].D.].D.].].D.].].].D.].].].D.].].].].]._. XD.|. X|.|.`..X|.|.|.|.|.kX|.|. X|.'.|.kXgXS.] pXpXpXpXpXKXKXKXxX' ' ' ' ' ' U.U.U.U.U.U.U.U.} ' ' ' ' ' ' ' ' ' ' ' ' | ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pXpXaXdX' ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' aXaXpXpX' ' ' ' ' ' ' ' ' ' ' ' tXpXpXpX' ' ' ' pXpXpX' ' ' ' ' ' pXaXpX} ' ' ' aXaXpX' ' ' ' ' ' pXaXpXdX' ' ' ' ' ' ' ' ' ' ' ' pXpXpXaX' ' ' ' ' ' ' ' ' ' ' ' aXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' tXpXpXaX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXc . yXyXyX9X KXKXKXKX KXKXKX| KXKXKXgX L.L.L.L.L.L.L.L.L.KXKXuXyXyXyXyX ` 9.! 9.9.9.R 9.9.^ Q Q ~ Q I Q / ! I J G P L G F S F L F F H F D F F D C L F F F C T E F D G A C F F D A D F F V F C F P W / Q U ! ! 6.8.Q c.W < , 8 , , - @ - @ X X X X X X X X X X X O X X X X X O X X X X X X O X O X X X O X X X X % X . X X X X ",
"X X + O + a [ ] ] ] ] ] ] ] ] ] ] ] ] ] ' [ ] ] ] ] ] [ ' ' ] kXzXjXkXjX.X.X XD.D.D.D.].].].].].].D.D.].D.].].].D.].].D.].].D.].].].).).].).].].].D.].].].].].].kXkX]. X'.kX]._.|.|.|.|.`..X`.`. X|.|.|.|.|.|.|.|.|.|.'.|.'.[.] pXpXpXpXpXKXKXKXxX] ' ' ' ' ] Y.U.U.U.U.U.U.Y.Y.' ' ' ' ' Y.' ' ' ' ' ' ] ' ' ' ' ' ' ' ' Y.Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' dX' 0X0X0X' ' ' ' ' ' ' ' ' ' ' dX' } 0X0X} ' ' ' ' ' ' ' ' ' ' dX0X' 0X] 0X' ' ' ' ' ' ' | ' ' dXtX' 0X0X} ' ' ' ' ' ' ' ' ' | 0XsX' } 0X0X' ' ' ' ' ' ' ' ' ' ' sX' 0X0X0X' ' ' ' ' ' ' ' ' ' ' sX| } 0X} 0X' ' ' ' | ' ' ' ' ' dX} ' 0X0X0X' ' ' ' ' ' ' ' ' ' dXtX' 0X} 0X' ' ' ' ' ' ' ' ' ' | qX 0 0 0 qX 0 0 0 : LXKXKXKXKXKXKXJXY.JXPXKXKXKXKXKXgX I. 3 I.% 3 n n 3 % I.I.L.L.L.L.I.I.I.KXKXuXuXyXyXyX _ 9.8.8.R R 9.9.9._ q.~ ! ^ U W ! Q Q L H L P F P V F F F V H F C F F C P A V C F F F T F F F V C T F A T T D F F F P P ^ / ^ P ! ! U ! Q ~ c.^ , , 8 , = * @ * @ O # X X X X X X X X % % O X X X X X X X X % : O X X O X X X X X X X o X X + X + X ",
"+ + @ O @ ' ] ] ] ] ] ] ] ] ] ] ] ] ` [ [ ' [ ' ] ] [ ' [ ] ] kXjXjXkXXXkX.X|. XD.D.D.].].].D._.D.].].].].D.D.].].].D.].].].].].).].].).].].].].D.].].].].].].].D.D.'.D.].].]._.D.|. X|.`.`..X`.|.|.hX|.|.|.|.|.|..X|.kXgXgXgX] pXpXpXpXpXKXKXKXxX' } U.U.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' } U.' ' ' ] ' ' ' ' ' ' ' ' ' ' ' U.| ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ] ' ' aXaXaX' ' ' ' ' ' ' ' ' ' ' ' ' aXaXaXtX' ' ' ' ' ' ' ' 0X' ' ' aXaXaXsX' ' ' ' ' dXdX' ' ' ' ' aXaXaXaX' ' ' ' ' 0XaX' ' } ' ' tXaXaXaX' ' ' ' ' ' ' ' ' ' ' ' ' aXaXaX' ' ' ' ' ' ' ' ' } ' ' ' aXaXaXtX' ' ' ' ' ' ' ' ] ' ' ' aXaXaXaX| ' ' ' ' ' ' ' ' ' ' ' aXaXsXaX' ' ' ' ' ' 2 : : : 9XiXqXiX : : : o : qXiXPXKXKXKXKXKXKXKX xXKXKXKXKXKX{ n I. % 3 P. % % P. % P.P.P.P. % % % % LXKXuXyXyXyXyX ` 9.8.Q 9.8.9._ 9._ _ Q ! ! Q I ! I ^ W F L G G G H F F F F F F D F F F F L F F C D T T C F F F F F F C D D C C C C Z V E E / P ! ! ! ! 8.8.M.~ 5 , 8 = , - @ @ # O X X % X X X X X X X O O X X X % X X X X X X X X % O X X X X X X % % X X X % X X % X ",
"@ @ O # # ] ] ] ' ] ] ] ] ] ] ] ] ' [ ' [ ' ' ] ] ' ] ] [ ' [ '.jXjX.XXX.X.XkX].D.D.].].].].D._.].].D.].].D. X].D.kX].].].].].].].]._.].]._.].'.].D.].].].].D.D.'.D.].].].].|._._.|.|.|.`..X|.|.|.|.|.hX.X|.|..X X|.|.|..XhXS.] pXpXpXpXpXKXKXKXKXU.U.U.U.U.U.U.Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' aXpXpXdX' ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' aXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' tXaXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX} ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXdX| ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' aXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' tXpXpXpX' | ' ' ' ' ' ' ' ' ' ' ' pXpXpX] ' | > o yXyXyX9X KXKXKXKXKXKXKX xXKXKXKXKXKXgX L.L.L.L.L.L.L.L. KXKXuXyXyXyXyX ~ 9.Q 8.R 8.R 9.9.9.R 9.^ ! ! U ! L Q W L L G G G H H L G F L F F T F C F T F F F V T F C P F F F F T D T D F F F P F F P ^ P W Q ! U / ! 9.c.~ 5 8 8 , ; * - @ % O X O O X X X % X X X X X O X X O X X O O X X X X X X X X X X % X X o % X X % X X X ",
"@ @ @ + # ] ] ] ] ] ] ] ` ] ' ` ] ] ' ] ' ] ] ] ] ] [ ] ] _ [ gXzXjXkX.XkXkXG.D.].S.G.].].]._.D.].D.D.D.D.gXD.D.D.D.].G.D.D.D.D.).).).).].D.).].].].].].].].D.].'.].D.kX'.'.|.].].].|. X.X`.|.|.|.|.|.|.|.|.|.|.|.'.hX|..XgX[.] pXpXpXpXpXKXKXKXKXU.U.U.U.U.U.U.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXaXaX0X' ' ' ' ' ' ' ' ' ' ' ' sXpXpXdX' ' ' pXpXpXpX' ' ' ' | tXpXpXpX' ' ' tXpXpXpX' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXaX0X' ' ' ' ' ' ' ' ' ' ' ' sXpXpXsX' ' ' ' ' ' ' ' ' ' ' ' 0XpXtXyX yXyXyX L.L.L.L.L.L.L.L. KXKXuXyXyXyXyX _ 9.9.8.9.R 9.R R 9.9.9.Q Q W W ! I W Q R L L F G H V L F F T P C F F V V F F V F V F F C V F C C D D D T F C F F F V F L E ^ W I / ! U Q ! z.Q 5 , 8 = , @ - - # X X O O X X X + X X X X O X X X X X O X O % $ O @ X X % X O O + X X X X X X X X X X X ",
"O O X # O ] ] ] ] ] ] ] ] ] ' ] ] ' ] ] ' ] ] ] ' ] ] ] ] ] [ ].jXjX.X.X.X|.|._.D.D._._.].]._.].].).).].).].).).]._._._.].].).].).].].].].].].].].].].].).].).).].].].].].].kXD.'..X`.|.|.`.|.|.|.|.|.|.|.|.|. X|.|.|..X|.gX[.} pXpXpXpXpXKXKXKXKXU.U.U.U.U.U.U.Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Y.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' aXtX' ' ' ' ' ' ' ' ' ' ' ' ' ' dXsX| | ' ' | ' ' ' ' ' ' ' ' ' 0XaX' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pX' ' ' ' ' ' ' | ' ' ' ' ' ' ' pX| ' ' ' ' ' ' ' ' ' ' ' ' ' ' pX0X' ' ' ' ' ' ' ' ' ' ' ' ' ' dXdX' ' | ' ' ' ' ' ' ' ' ' ' ' 0XpX' ' ' ' ' ' ' ' ' ' ' ' ' ' ' aX' ' ' ' ' ' ' | ' ' ' ' x . yX yX( o L. L.n n L. L.L.L.L.L.L.P.L.P.L. KXKXuXyXyXyXyX ~ ! ! 8.! Q Q Q Q ~ R 9.! ! W I ! I W ^ L W L L G H V L F F F H D F F C F T F V D C T T F C F C F D F F F F C F T D P V E ^ / P U ! ! ! 8.Q z.~ 7 8 1 1 1 @ @ @ # + X X X X O O O X # X O X O X X X X X O X X X X X X X O X X X O O + X + + X X X X X X ",
"@ # O @ # ] ] ] ] ] ` ] ] ] ] ] ] ] ] ` ` ] ] ] ] ] ] [ [ _ [ kXzXjX.X.XXX.X|._.A.A._._.]._.D.).].).).).).).).[._.D._.D.).]._.).].].D.].]._.].'.].).).].).]._.).]._.].].].kX'.).`.`.'.|.`..X|.|.|. X|.|.|.|.|..X|.|.|.hXhXhX{ ] pXpXpXpXpXKXKXKXxX' ] ] ] Y.' ' ' ' ' ' ' ' ' ' ' ' | Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' dXdXdXtX' | ' ' ' ' | ' 0X0X0X' dXdXdXdX' ' ' ' ' ' ' ' } tX0X0XdXdXdXdX' ' ' ' ' ' ' ' 0X0X0X0X0XdXdXdX' ' ' ' ' ' ' ' 0X0X0X0X' dXdXdX0X' ' ' ' ' ' ' 0X0X0X0X' dXdXdXtX' ' ' ' ' ' ' ' 0X0X0X' dXdXdXdX' ' ' ' ' ' ' ' 0X0X0X} dXdXdXdX' ' ' ' ' ' ' ' 0X0X0X0X0XdXdXdX' ' ' ' ' ' ' ' 0X0X0X0X' dXdXdX0X' ' ' 2 0 ( ( ( 9XqX9X . o ( ( ( 3 % % 3 3 3 3 3 3 3 LXKXuXyXyXyXyX ` ! ! ! Q Q Q Q 9.Q 9.^ I ! I Q ! L L I P W F H S S V L D V F V V C V V V F F V D Z F F V V F V V F F C F A C F F C V V P W P I Q / U U Q 9.z._ < < 6 , * * @ @ @ O X X X X O O O X X + X + O + . X . X O . . X . X X O + X + # O O O O X # O O X X + # ",
"@ @ # @ # ] ] [ ] ] ] ] ' [ ] ] ] ] ] ' ] ] ] ] ] ] ] [ [ ' [ gXjXjX.X.X.X.X X_.D.D.).].|.].D._.].[.].).].).].]._._.)._.).].D.].).).].).].).].]._.).].]._.].`.].].].].].].'.kX).`.|.|.`..X`.|.|.|.|.|. X|. X X|.|.|.|.gXhXgXS.] pXpXpXpXpXKXKXKXxX' ] Y.Y.} ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Y.' ' ' ' ' ' ' ' ' ' ' | ' ' ' } Y.' ' ' ' ' ' ' ' ' ' ' dXtXtXtX' tX' ' ' ' ' ' ' ' ' ' tXtXtXtX' tX' ' ' ' ' ' ' ' ' ' tXtXtXdX' 0X' ' ' ' ' ' ' ' ' ' 0XtXtXdX' 0X0X' ' ' ' ' ' ' ' ' ' tXdXtX' } 0X' ' ' ' ' ' ' ' ' ' tXtXtXtX' 0X' ' ' ' ' ' ' ' ' ' tXtXdXfXxX' ' ' ' gXxXgX' ' ' ' tXdXtXUXxX' ' ' ' ] kXkX' ' ' ' 0XdXtXtX' tX0X| ' ' ' ' ' ' ' ' ' tXdXtX' } 0X' 2 9X9X9X( . .o o n n n n % n n n 3 n n n n KXKXuXuXyXyXyX ~ 8.Q ! Q ! ! ! ^ R 9.Q Q Q Q I ! I L I L L L L G H F T F D P F F F T C P T F F D D G T F F F F V F T F T F C F F F V V P W W Q I / ! U Q ! z.^ 8 , 1 , * * @ @ @ # $ O @ X @ O X # @ O O @ X # # X @ X O X O % X # O # X @ @ O O O O O O @ O # @ O $ $ ",
"- # - @ # ] [ ] ] ] ] ] [ ] ] ' ] ] ] ] ' ] ] ] ] ] ] [ ] [ [ .XzXhX.X.X.X.X|._.A.A.).).].].D.D.].).[.).).).).).).)._._._.)._.).].].D.]._.).D.].].).].].].'.].].'.'.].'.'.'.'.).`.`.|.|.`..X|.|.|.|. X|. X|.|.|..X X|..XhXgX{ ] pXpXpXpXpXKXKXKXKXU.U.U.U.U.U.U.Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' | ' ' ' ' ' ' pXpXpXtX' ' ' ' ' ' ' ' ' ' ' ' dXpXpXaX' ' ' ' ' ' ' ' ' ' ' ' 0XaXpXaX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX0X' ' ' ' ' ' LXKXKXKXKX' ' KXKXKXKXKX' ' ' ' xXLXKXKXLXgX' JXKXKXKXKX' ' ' ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ] qXyXyX o o yXyXyX( o o 9XyXyXqX I.I. L.L.L.L.P.L.L.L. L.L.P.L.L.L.L.L. L.L.L.P.L.L.L.L. . LXKXuXyXyXyXyX ~ ! Q ! ! ! ! / Q 9.R 9.Q Q I I ! L I L L L L G G F D L D S F F D F D D C F F F D D D T F Z F V V F F A T F C V C F m V F W I I I U W ! ! 8.b.~ 5 < < 8 1 , 1 @ - @ - & @ @ @ @ & @ @ @ & @ @ * & * @ - & * & ; & & & & @ & & & & & & & & & & & & & - $ ",
"# O @ @ @ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] [ ' ] ] ] ] ` } ] ] { gXjXXXXX.X.X|.|._.D.D.(._.].].D.D.).).).).).).].).].).).).D.].D.].[.].].].].].D.].].].].]._.].].].'.].`.].].].'.].'.'.|.|.`.|.|..X|.|.|.`. X X|.|.'.|.|.|.hXgX[.} pXpXpXpXpXKXKXKXKXU.U.U.U.U.U.U.U.' ' ' ' ' ' ' ' Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' | ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXtX' ' ' ' ' pX0X' ' ' ' ' pXpXpXpX' ' ' ' ' sXdX| ' ' ' ' pXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' tXpXpXpX' ' ' ' | ' ' ' ' ' ' ' ' pXpXaXrXKXKXFX' ' KXKXKXKXgX' ' KXLX' ' LXKXKX' ' KXKXKXKXIX' ' LXKXxX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' ' ' ' ' ' 2 9XyXyXyX : yXyXyX yXyXKXKXO L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. KXKXuXyXyXyXyX _ U ! ! Q Q Q Q Q Q Q U Q U I I U I W L L W R L F H H G F H F F F T G v D F D D D D D T D D D F V C F F F F C F F V V S T W I L I U ! U ! ! b.~ 5 < 7 7 1 1 * , * = * * = = , * ; = 1 1 = 1 = * * = , ; = = = ; & * ; 3 , ; 1 ; ; ; ; 3 * * ; ; = = ; ; ",
"@ O X @ @ ] ] ] ] ] ] ] ] ] ] ] [ ' ] ' ] ] ] ] ] ] ] ] ] ` ] '.jXlX.X.X.X.X'.].A.D.)._.].[.).D.[.).).).].[.[.].).).).).).).).D.].D.D.[.].].D.D.].).].].).].].].]._.`.`.].].'.].'.'.`.|.`.|.`.`.|.|. X|.|. X.X|..X|.|.|..XgX{ ] pXpXpXpXpXKXKXKXKXU.U.U.U.U.U.U.Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXdX' ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' | ' ' ' ' ' ' ' ' aXpXpXpX' ' | ' ' ' ' ' ' ' ' ' tXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX} | ' ' ' ' ' ' ' ' ' ' ' pXpXpXdX' ' ' ' ' ' ' ' ' ' ' KXKX} ' ' ' ' KXKX' ' ' ' ' KXKXKXKXxX' ' ' ' IXKXgX' ' ' ' KXLXLXaXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX} ' ' ' 2 yXyXyX9X yXyXyXyX L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. LXKXuXuXyXyXyX ` ! Q ! / U Q Q Q Q Q ! Q ! I J W ! W L F R G F H D S F D F F D D F T F F F D F T D D T D F D T F F F C C P C C P V F V P W L I Q Q ! Q I I c.^ 5 5 d 7 7 < 6 6 6 6 6 1 1 6 1 1 1 1 1 1 1 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 6 6 6 7 6 6 6 6 6 6 6 6 6 6 6 1 ",
"# # @ # # ] ] ] ] ] ] ] ` ] ] ] ' ] ' [ ' ] ] ] ] ] ] ] ] ] [ hXjXjXXX.XhX|.|.].D.D.).).].).D.].].[.[.).].).).).).).).).[.).).).[.].].].].].gX X].].].].].].`.`.].`.`.'._.`.'.`.`.`.`.`..X`.|.|.|.|.'.|. X|.|.|.|.|.|.|.|.hX[.} pXpXpXpXpXKXKXKXxX' } U.Y.U.' ' ] ] } ] Y.| ' ' ' ' ' Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Y.' ' ' ' ' ' ' ' ] ' ' ' ' ' ' ' ' ' ' dXdXsX' } } ' ' ' ' ' ' ' ' ' ' dXdXsX' } 0X' ' ' ' ' ' ' ' ' ' dXdXsX0X' 0X' ' ' ' ' ' ' ' ' ' tXsXdXdX' 0X' ' ' ' ' ' ' ' ' ' 0XsXdXdX' 0X' ' ' ' ' ' ' ' ' ' ' dXdXsX' 0X} ' ' ' ' U.' ' ' ' tXKXIX[.' ' ' ' ' ' IXIX' ' ' ' gXKXIXxX' ' ' ' ' ' rXrX0X' ' ' ' dXdXsXtX' 0X' ' ' | ' ' ' ' ' ' 0XdXsX9X 0 qXqXqX 0 : qXqXqX 0 0 3 I. 3 I.I.I.% 3 3 3 I.I.I.n 3 3 3 % I.I.I.I. 3 3 3 3 KXKXuXyXyXyXyX / ^ Q Q ! Q ! Q I ! Q ! I U I G W I W G L L L F P H S G F F F H D D T D F F D F G D D v F D D D D D F D F Z C F Z C V m P ^ L G I Q 8.Q ! ! i.! t e Z Z l c c c c c c c a c c c c d c c c c c c c c c 7 7 c c 7 c 9 7 c c 7 c 7 Z 9 7 7 c 9 d 7 d 7 c Z ",
"O X + + X ] ] ] [ ] ] ] ] ] ] ] [ ] [ ' ] ' _ ] ] ] ] ] ] ' [ |.jXhX.X.XhX|.'.].D.).).].].).).].[.[.].].[.].].).].).].).).].).].].].[.[.].].D.].].].].'.).`.].].'.).].'.'.`.'.'.`..X|..X`.`.`.|.|.|.|.|.|. X|.|.|.|.|.|.hXgX[.] pXpXpXpXpXKXKXKXxX] ' ' ' ' ' Y.U.U.U.U.U.U.U.} ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' aXaXaX' ' ' ' ' ' ' ' ' ' ' ' ' aXaXaXtX' ' ' ' ' ' ' ' ' ' ' ' aXaXaXaX' ' ' ' ' ' ' ' | ' ' ' pXaXaXaX' ' ' ' ' ' ' ' ' ' ' ' tXpXaXaX' ' ' ' ' ' ' ' ' ' ' ' ] aXaXLXLX' ' kXLXLX] ' JXLXtX' ' ' ' LXLX' ' ' LXKX' ' gXLXJX' ' ' ' 0XrX' ' ' ' ' ' ' ' ' ' ' ' aXpXaXaX' ' ' ' ' ' ' ' q o 9XiXiXiX : : iXiXiXo o o iXiXiX . 3 P.P.L.L.L.P.P.P. P.P.L.L.L.L.P.P. P.P.L.L.L.L.P.P.P.KXKXuXyXyXyXyX ` / Q / Q / I U Q I W / Q Q I I I W W L H L F G F F D G F D F D D F G z F T D F T D F F D D D F D F D D V F C C V F V V G I I I U 8.Q Q U U 8.J t < t e p a a a 4 w d a i a d a p i a p p i a s i d a d d d s s s r 7 m s d d f 7 m m m s d m s m d m 7 ",
"O # # X # ] ] ] ] ] [ ] ] ] [ ] ] [ ] ' ] ' ] ] ] ] ] ] [ ] [ |.jXjX.X.XhX|.'.].D.).(._.).].(.).).).).[.).).).).).).].D.).[.).).).[.).[.).[.D.].].D.].].].].].]._.).`.`.).`.`.`.|.|.`.`..X`.`..X|. X`.|.|.|.|. X|..X|.|..XgXgX] pXpXpXpXpXKXKXKXxX' ' ' ' ' ' U.U.U.U.U.U.U.U.Y.' ' ' ' ' ' ' ' ' ' ' | ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXdX' ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' ' ' | ' ' ' ' ' ' aXpXpXpX' ' ' 0XpXpXpX' ' ' ' ' 0XpXpXpX' ' ' ' pXpXpX' ' ' ' ' ' pXpXpX} ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXdX' ' ' ' ' ' ' ' ' ' ' LXKXKXKXKX' ' ' ' ' ' ' ' ' KXKXKXKXKXKXKX' ' IXLXLXKXKX' ' KXKXKXpXaXpXpX' ' ' ' ' ' ' ' | ' ' ' ' pXpXpX' ' ' ' 2 . yXyXyX9X yXyXyXyX 3 L.L.L.L.L.L.L.P. L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L.L.KXKXuXyXyXyXyX ` / / Q / ! U W I ! I U W Q U H W L L L F L G F H D S G G F H F D G T D T Y D T E D D D D D D D D D D D V F C C P Z V Z F ^ L L I U 8.Q U U Q 6.~ x.z.i.0.z.b.z.z.z.i.v.z.z.z.z.v.z.b.z.b.b.b.M.x.x.b.M.x.T.M.M.n.M.M.M.n.n.M.m.m.n.m.m.m.Q.Q.Q.Q.Q.Q.B.",
"@ X O O # ] ] ] [ ] ] ] ] ] ] ] ] ' [ ] ] ] ] ] ] ] [ ] ' ' [ gXjXhX.X.XhX.X'.].C.).)._.`.).[.(.[.).).D.[.).).).].[.D.).).D.).).).[.].].].].].[.].].].].].]._._.]._._.`.`.).`.`.`.`.`.|.'.`.|.|.|.|.|.|.|.|.|. X|.|.|.|.kXgXS.] pXpXpXpXpXKXKXKXxX' ' ' ' ' ' Y.U.U.U.U.U.U.U.Y.' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pX' ' | ' ' ' ' ' ' ' ' ' ' ' ' pX' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pX} ' ' ' ' ' ' ' ' ' ' ' ' ' ' sXdX' ' ' ' ' ' ' ' ' ' ' ' ' | 0XpX' ' ' ' ' ' ' ' ' ' ' | ' ' ' pX' ' ' ' ' | ' ' ' ' KXKXJX' ' KXKXKXKXgX' ' KXKX' ' LXKXKX' ' KXKXIX' } KXKXKXKXxX' ' ' ' ' ' dXdX' ' ' ' ' ' ' ' ' ' ' ' ' ' 0XaX' 2 yX yX L. 3 L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L.L.LXKXuXyXyXyXyX ` I P / W ! ! ! ! I Q ! W Q U I W I W L G L L F H H S F D D G D z D T z v T z D F D D z D T D D D D D D V F C C V V V m S P L G W U 8.8.I 6.U s.4XCXMXCXCX7XCXCXCXCX6XCXCX6X6XCXCX6XCX6XCXCX6X6XCX6X6XCXCXCXbX6X6X6X6X6XbXbX6X6X5XCX6XvX4XbXOX5X4XvX4XvX",
"@ @ $ @ $ ] ] ] [ ] ] ] ] [ [ ] [ ' ] ] ] ' ' ] ] ] ] [ [ _ [ kXjXhX.XhX.X.X'.].[.A.(._._.).).[.).C.).).).).[.).).[.).).).).[.].].].D.G.;.=.=.>.V._.].].D.]._.]._._.].'._.`.`.`.`.|.`.`.|.|.`.`.|.|..X|. X`.|.'.|. X|.|.hXgX[.] pXpXpXpXpXKXKXKXxX] ' ' ' ' ' ' ' Y.U.U.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.Y.' ' ' ' ' ' ' ' ' ' ' pXpXpXtX' ' ' ' ' ' ' ' ' ' ' ' dXpXpXaX' ' ' ' ' ' ' ' ' ' ' ' 0XpXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX' ] ' ' ' ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXaXtX' ' ' ' ' ' ' ' ' KXKX' ' KXKXPX' ' ' ' ' ' xXKXKXKXKX[._ q.;.=.=.=.;.*.q.' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' qXyXyX yXyXyX( qXyXyXqX L. 3 L.L.L. % L.L.L.n L.L.L.P. KXKXuXuXyXyXyX / ^ U Q ! ! ! U Q Q Q Q ! ! I G Q W W L H P L H D V H G F D F S G T D D D T T D T v D T T D D D D D z D F C C V C C V m D L L G W / / ! U U K i.6XMXCX6XCX6XCX6X6X6XCX6X6X7X5X5X5X5X5X5X5X5X5X5X4X6X6X5X6X4X5X6X4X6X4X6X4X5X5X5X5X5X5X5X4X4X4X5X4X4X5X4X",
"# # # # # ] ] ] ' ] [ ' ] ] ] [ ' [ ] ;.=.=.=.-.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.;.).(.).).).).).).).).).).).).).].).).[.).).).[.].:.=.=.=.=.=.=.K.).].]._._._.'._._.]._.`.'._.`.`.`.`.`.|.`..X|. X`.|.|.|.|.|..X|.|.|.|.gX[.] pXpXpXpXpXKXKXKXxX' } U.U.U.' ' ' } ' ' ' ' ' ' ' ' ' ' ' ' ' Y.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' | ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXtX' ' ' ' ' pX0X| ' ' ' ' pXpXpXpX_ =.=.=.=.=.=.=.=.=.=.=.=.sXpXpX' ' ' ' ' ' ' ' ' ' ' ' tXpXpXpX' ' ' ' ' ' ' ' ' ' | ' } pXaXLXLX' ' gXKXKX' ' ' ' JXKXKX' ' KXKX' ' ' KXKX_ ;.-.=.=.=.=.=.=.=.=.=.:.' ' ' ' ' ' ' ' ' ' pXpXpXaX' ' ' ' ' ' ' ' 2 9XyXyXyX o : yXyXyXo o yXiXiX9X I.I. L.L.L.3 L.L.L.n L.L.L.L. LXKXuXyXyXyXyX ` E / Q W ! U W U Q Q U W I I I W L L L G L L T H H F G F S F D D D F F G T v T D D D D v D D D D D z D V V V P V P V V F G G P W ! U U U 6.U s.5X6XCX5XCX5X5X5X7X6X6X7X6X6X6X5X6X5X5X5X5X5X5X5X6X5X5X5X5X4X5X4X6X4X5X4X4X3X1X4X1X4X1X1X1X4X1X4X1X4X1X>X",
"# > > # > [ [ [ F.[ [ F.[ F.F.{ M.{ Z.Z.F.{ M.:.=.=.=.=.=.=.=.=.=.=.=.=.;.V.G.].A.A.)._.]._.D.).).[.C.).[.).).).).).[.).).).).).].V.=.=.=.=.=.=.=.=.V.D.].D._._.]._.]._.].].'.`.`.`.`.`.`.|.`.|.`.|.|.|.|. X|.|.|..X|.'.gXhXS.] pXpXpXpXpXKXKXKXKXU.U.U.U.U.U.U.Y.' ' ' ' ' | ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' tXtXtX0X' tXtXtX' ' ' ' ' ' ' ' tXtXtXtX' tXtXtX' ' ' ' ' ' ' ' tXtXtXtX' tXtXtX} ' ' ' tXtXtXtX} tXrX;.=.=.=.=.=.=.=.=.=.0XtXtX| tXtXtX} } tXtXtX| ' ' ' ' ' ' ' tXtXtX0X' tXtXtX' ' ' ' ' ' ' xXIXrXJXKXKX' ' ' ' JXKXKXU.JXxXxXLXLXKXxX&.=.=.=.=.=.=.=.=.=.=.=.=.=.;.0X] 0XtXtX0X' ' ' ' ' ' ' ' dXtXtX' ] tXtX) .9X9X( . . . o o 9X9X .9X . . .o o L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. KXKXuXyXyXyXyX / ^ ! Q W U I Q I ! / W U I I I W L L L G L F F P S F F F S D D D D D D D D D T D D T D F T F T D D D D V V F Z m Z V V F L H F W Q ! U U U B u.2X4X>X>X>X>X,X>X>X,X%X,X,X%X%X,X!.^.^.}.^.^.}.^.}.}.}.!.}.!.^.!.^.!.}.!.^.!.!.!.!.!.!.!.^.Q.!.!.Q.!.!.!.",
"M.m.m.m.A.nXzXbXzXbXzXbXnXnXnXzXnXnXnXnXFXFXZXFXJ.-.=.=.=.=.=.=.=.=.=.-. X.X|._.C.A.D.).).).D.).).).).).).).).D.).).).).).).).].).:.=.=.=.=.=.=.=.=.:.].'.]._.].]._.].].`.`.].`.`.`.`..X`.`.`.`.|.`. X X X|.|.|. X|.|.|.|.hX{ } pXpXpXpXpXKXKXKXKXU.U.U.U.U.U.U.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Y.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' aXtX' ' ' ' ' ' ' ' ' ' ' ' ' ' dXaX' ' ' ' ' ' ' ' ' ' ' | ' ' } pX' | ' ' ' ' ' | _ =.=.=.=.=.=.=.=.=._ ' ' ' ' ' ' ' ' ' ' ' ' pX' ' ' ' ' ' ' ' ' ' ' | ' ' ' pXtX' ' ' ' ' ' 0XgXKXKX' ' ' ' JXKXKX' ] ' ' ' xXLXJ.-.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=._ ' ' ' ' ' pX' ' ' ' ' ' ' ' ' ' ' ' ' 2 yX yX( 9XqX L.L.L.L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. LXKXuXyXyXyXyX ` W I Q Q Q ! I Q I I I I I J I I L L L L G H H H V S F D S D S D D D D D D D v D C D D z D v z D D D z F V V V V Z m V C L L L L / ! ! U J H 6.,X>X>X{.!.^.{.%X%X!.!.%X!.!.!.,X^.^.^.{.^.^.^.!.!.!.}.!.!.^.^.^.^.^.^.^.^.^.^.{.}.!.!.{.^.^.}.{.}.{.{.}.",
"5XCXCXCXCXGXGXGXGXGXGXGXGXIXGXGXGXIXFXFXGXGXGXIXGX=.=.=.=.=.=.=.=.=.=.K.hXhX|.D.C.D.).).).).D.).).).[.[.).).).).[.).[.).[.).).].).;.=.=.=.=.=.=.=.=.;.].].].D._.`.)._._.].`.'.`.`..X`.`.`..X|.|.|.`.`..X|.|. X|.|.|.|.hXkXgX[.] pXpXpXpXpXKXKXKXxX' Y.U.U.U.' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' | ] pXpXpX' ' ' ' ' ' ' ' ' ' ' | ' pXpXpXtX' ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' ' -.=.=.=.=.=.=.=.=.dXpXpX' ' ' ' ' ' ' ' ' ' ' ' tXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXaXpX' ' ' rXKXKX' ' ' ' JXKXKX' ' ' ' ' ' :.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.;.' ' ' ' ' ' ' pXpXpXpX' ' ' ' ' ' ' ' 2 9XyXyXyX : yXyXyX yXyXyX9X n P. L.L.L.3 L.L.L.I. L.L.L.L. KXKXuXuXyXyXyX ` P P Q U I Q U U I ! U I I J I I L L L G G F F H D F F D S D D D D D D T D D D D D D D v D D T F F z z V V V Z V V V V P L F G L W ! ! U U P s.XX5X1X>X1X1X1X4X:X1X4X1X1X4X1X>X>X1X1X4X1X1X1X1X1X1XOX1X>X>X1X>X1X4X4X1X1X1X1XOX>X1X1X>X1X>X>X1X>X>X1X1X",
"1X4X>X>X4XFXGXGXFXGXFXGXGXGXGXGXGXGXGXGXGXGXGXGXGX>.=.=.=.=.=.=.=.=.=.J..X|.]._.D.D.).).].).D.).[.).A.).[.).[.).[.].].).).).).[.).:.=.=.=.=.=.=.=.=.:.).].D.].].].`._._.].`.'.`.`.`.`.`.`.`.|.|.|.`..X`.|. X|.|.|.|.|.'.hXgX} ] pXpXpXpXpXKXKXKXxX' ' ] ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' | ' pXpXpXdX' ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' aXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' tXpXpXpX;.-.=.=.=.=.=.=.=.' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXdX' ' ' ' ' ' ' ' ' ' ' ' ' ' xXKXKX' ' ' ' JXKXKX' ' ' ' ' q.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.&.' ' ' ' ' ' ' ' ' ' ' aXaXaX' ' ' ' 2 yXyXyX9X yXyXyXyX LXKXuXyXyXyXyXo / ^ / Q Q Q Q I I Q I Q I I G U I G L L G P F F D S S F D S S S D v D D D z T D D D D C D D z T v D z D F Z V V m Z V V D L G F I ! ! U U I U p.1X5X4X4X4X2X>X>X1X,X1X>X>X>X>X>X>X>X>X>X}.>X1X}.}.<X}.>X>X>X}.}.}.>X>X}.>X}.^.^.^.{.}.}.}.}.}.}.}.}.}.}.",
"5X5X4X4X5XGXGXGXFXGXGXGXFXGXFXDXGXGXGXGXGXDXGXGXGX>.=.=.=.=.=.=.=.=.=.V..X'.`._.C.A.).D.D.D.].D.).).[.).D.[.C.).).[.D.].).).].D.D.V.=.=.=.=.=.=.=.=.V.].D.|.D.D._._.).].`.`.`.`.`.'.'.|.|.`.'.'.|.|.|.|.`.`.|.|.|.|.|.|.hXgX[.] pXpXpXpXpXKXKXKXxX] ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' | ' ' ' ' ' Y.Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' Y.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pX' ' ' ' ' ' ' ' ' ' | ' | ' ' pX0X' ' ' ' ' ' ' ' ' ' ' ' ' *.-.=.=.=.=.=.=.=._ ' ' ' ' ' ' ' 0XpX' ' ' ' ' ' ' ' ' ' ' ' ' Y.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' -.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.H.' ' ' KXKX' ' ' ' ' ' ' ' ' 0XpX' 2 o yX o yX o o o yX0 o qX9X L.L.L.n L.L.L.L. LXKXuXyXyXyXyX ` Q Q Q Q Q Q I I Q I Q I I K I I G L L G G F F H D F G D S F V F F C F D F F F T D F F T D T D T F V V C F V V m V V V F L G G W ! Q ! I U P y.}.1X}.^.^.^.}.^.^.^.^.^.^.^.^.^.!.^.^.^.^.^.^.^.^.^.^.^.!.!.!.!.!.!.!.!.!.!.!.!.Q.!.!.Q.!.!.Q.Q.^.Q.!.!.",
"!.!.^.^.!.VXVXnXnXZXVXVXVXVXVXNXBXZXVXVXnXVXVXVXNX>.=.=.=.=.=.=.=.=.=.V..X'.`.).D.D.D.).D.kXD.D.C.C.).[.).).).[.).].].[.[.].).].].].K.=.=.=.=.-.=.K.].].|.D.|.kX`.].`.`.].`.`.].`.'.`.`.'.'.'.|.|.`.|.`.`..X|.|. X X XkX|.'.[.] pXpXpXpXpXKXKXKXxX' ' ' ' ' ' ' ' Y.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' } U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' dXpXpXsX' ' ' ' ' ' ' ' ' ' ' ' 0XpXpXpX' ' ' ' ' ' ' ' ' ;.-.=.=.=.=.=.=.=._ ' ' ' ' ' ' ' ' ' ' pXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.} ' ' ' ' ' ] &.=.=.=.CXPX[.' JXIXl.=.=.=.=.=.=.=.=.=.=.=.J.' 0XKXKXKXKXxX| ' ' ' ' ' ' ' ' ] qXyXyX o o yXyXyX( 9XyXyXqX o ( yXyXyX o o yXyXyX L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. KXKXuXyXyXyXyX ` ^ W Q Q I Q I Q I Q I I I J J I G L L F G D H H V S F D S F C V C C C F A C C A C V V z C C D Z V V V C Z V V Z V V V D F H H I I ! U U I U i.}.4X}.}.}.}.>X}.^.}.^.^.^.^.}.^.^.}.!.^.^.^.^.^.%X^.{.%X%X,X^.^.^.!.^.^.!.^.!.^.}.!.^.}.!.{.!.{.!.^.oX^.",
"!.!.B.!.!.VXVXVXVXVXnXVXVXVXVXNXVXNXVXNXNXZXNXNXNX>.=.=.=.=.=.=.=.=.=.G.|.'._._.D.D.D._.].D.].D.).[.).D.[.).D.).).[.[.).D.).[.).D.D.D.V.;.-.=.;.V.].].D.D.].|.D.`.].].].].].`.].'.'.'.'.'.'.|.'.|.|..X|.|.`.|..X X X|.|.hX|.[.] pXpXpXpXpXKXKXKXJX' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' } ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' } ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' dXdXdXdX' ' ' ' ' ' ' ' 0X0X0X} dXdXdXdX' ' ' ' ' ' ' ' tX0X0X0X0XdXdXdX;.=.=.=.=.=.=.=.=.0XtX0X| dXdXdX' ' ' ' ' ' ' ' } 0X0XgXgX' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Y.| ' ' ' ' ' ' ' ' ' ' ' ' ' ' gX=.-.>._ ' gXPXKXxXgX' H.-.=.=.=.=.=.=.=.=.=.-.LXPXgX' ' gXJXLXJXdXdXdXdX' ' [ ' 2 0 ( ( ( 9X9X9X . o ( ( ( 9X9X9X9X ( ( ( 0 9X9X9X9X ( ( ( ( ( 9X9X9X ( ( ( | U.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. KXKXuXuXyXyXyX _ ^ ^ Q Q I J Q I U Q I I Q J J ^ L G G G G D G P S S F C F V F V C A D V C C Z z z Z C C C C C C F V Z C V C P P Z V V F T F L I Q ! Q U U I p.}.4XOX^.}.>X}.^.^.>X^.>X>X}.>X^.}.}.}.^.^.}.}.}.^.!.%X^.!.^.}.^.^.{.!.,X^.!.{.!.^.oX^.!.!.!.!.!.^.oX^.!.",
">X>X:X,X,XZXDXDXDXDXDXFXDXDXDXDXGXZXGXDXDXDXDXGXGX>.=.=.=.=.=.=.=.=.-.J..X X`.(.A.D.).).].D.D.D.D.D.D.).[.).).).).).).].].].[.].D.gXD.).].].).].].].].].D.|.D.D.]._.)._.].`.'.].].'.|.'.'.'.|.|.`.|.`.|.|.|.|.`.|. X|.'.|.gX[.} pXpXpXpXpXKXKXKXxX' Y.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' | ' ' ' ' pXpXpX' | ' ' ' ' ' ' ' ' ' ' ' pXpXpX0X' ' ' | ' ' ' ' ' ' ' *.=.=.=.=.=.=.=.=.c.' ' ' ' | ' ' tXpXpXpX' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.Y.' ' ' ' ' ' ' ' ' ' ' ' v.=.:.' ' ' KXKXIX' ] ' ' H.=.=.=.=.=.=.=.=.=.-.GX' ' ' ' ' ' 0XrX' ' ' ' ' 0XpXaXqX yXyXyX o o yXyXyX o o yXyXyX( o o qXyXyXqX L.L.L.I. L.L.L.L. LXKXuXyXyXyXyX ` ^ W W Q W Q W Q Q I I I I J J ^ G G G G P D D F V V F V F V V C V D D F C C C D C D C D D D A C V C C V m Z Z m Z V V V P G G L I ! U U U K 8.}.4X>X}.^.^.>X}.&X>X>X}.}.>X}.^.>X}.^.}.>X^.}.>X,X>X{.$X^.^.^.}.^.^.^.{.}.^.}.^.^.^.^.}.^.}.}.^.}.^.!.^.",
">X>X,X,X>XZXNXDXFXNXZXNXNXNXZXZXNXZXZXFXZXDXZXZXZX>.=.=.=.=.=.=.=.=.=.V.hX|._.).).A.D._.].D.D.D.).D.D.D.C.).[.[.[.D.[.D.[.D.[.).D.[.).D.D.D.D.D.D.D.].D.].D.].D.]._._.].`.`.'.].'.'.gX`.'.|.|.'.|.|.'.|.`.|.|.|.|. X X|.'.'.S.] pXpXpXpXpXKXKXKXxX] ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' Y.U.' ' ' ' ' ' | ' ' ' ' ' ' dXsX' ' ' ' ' ' ' ' ' ' ' ' ' ' 0XpX' ' ' ' ' ' ' ' ' ;.-.=.=.=.=.=.=.=._ ' ' ' ' ' ' ' ' ' ' ' ' pX' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Y.U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ;.-.' ' ' LXLXgX' ' ' ' ' ' &.=.=.=.=.=.=.=.=.=.R ' ' ' ' ' ' ' 0X' ' ' ' ' ' ' ' 2 yX yX( o o 9XqX 0 yX yX L.L.L.n L.L.L.P. KXKXuXyXyXyXyX _ ^ ^ Q W I W I Q J Q Q R W K G W G G G F G F G P D V F D Z F V C C F F F D C F C C C C C C C C C C C C V V V V V Z Z m F F P G P W ! U U U P U /.1X1X>X1X}.1X&X,X>X>X>X>X^.}.>X>X}.>X}.}.^.}.}.>X^.>X,X>X,X>X,X>X}.%X!.,X^.{.}.^.^.}.}.}.}.^.}.}.^.>X^.",
"!.Q.!.!.!.VXVXVXZXVXnXNXNXNXNXnXNXNXVXnXZXZXVXNXBX>.=.=.=.=.=.=.=.=.=.G.|.|. X(.A.D.A.D.].D.].D.[.).).[.).[.).).).).).).).).).).).).).D.).]._.].D.].D.].D.].D.kX`._._._._.].`.).].'.'.'.'.`.`.'.`.`.|.|.|.`.|.`.|. X`.|.hXgXgX] pXpXpXpXpXKXKXKXxX' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' | ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXtX' ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' ' *.=.=.=.=.=.=.=.=.sXpXpX' ' ' ' ' ' ' ' ' ' ' ' tXpXpXpX' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' -._ ' ' KXKX' ' 0XKXIX' ' ' [ =.=.=.=.=.=.=.=.=.H.KXLX' ' ' ' ] rX' ' ' ' ' ' ' ] 2 9XyXyXyX o : yXyXyX o o yXyXiX9X yXyXyXyX yXyXyXyX L.L.L.L.L.P.L.L. L.L.L.L.L.L.L.L.L.KXKXuXyXyXyXyX _ ^ ^ W W Q W Q J Q I W J R R G W J G G F Y F G F S V D V V P F V C C C V C V C C V F Z C C C D F V V V F V Z P V V V V F F F L L U ! ! U U K 8.oXOX>XOX1XOX1X1X>X>X>X>X1X>X>X>X>X,X>X>X>X>X>X>X>X>X,X2X>X>X>X>X>X>X>X>X^.>X>X>X}.}.}.>X}.}.>X}.}.}.}.}.",
"!.!.!.!.{.NXNXNXNXVXnXNXNXNXNXNXNXNXNXNXNXNXZXNXNX>.=.=.=.=.=.=.=.=.=.J..X X`.`.A.D.D.D.D.].D.D.).D.[.D.D.).).[.).C.D.).[.D.D.).).[.).D.).)._.).D._._.D.D.|.D.].].).)._._.].`._.].].'.'.`.'.'.'.'.`.'.'.'.'.`.|. X X|.'.'.gXS.} pXpXpXpXpXKXKXKXxX' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' pXpXpXpX' ' ' ' ' | ' ' ' ' ' ' aXpXpXpX' ' ' ' ' | ' ' ' ' ' ' tXpXpXpX*.=.=.=.=.=.=.-.=._ ' ' ' pXpXpX} | ' ' | ' ' ' ' ' ' ' ' ' ' ' ] ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' xXLXKXKXKX' ' IXKXKXKXKX' ' KXl.=.=.=.=.=.=.=.=.GXKXLXKX' ' xXLXLXpXsXaXaX0X' ' ' 2 yXyXyX9X yXyXyXyX iXyXyXyX .yXyXyX L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L.L.KXKXuXuXyXyXyX ` ^ R W R Q W Q J J Q I R R K R Q G G G G G D G F S S H D D F V Z F C C F V C F C C V C V V Z Z C Z V C Z V V V P Z m Z V F F P L Q ! U I U P u.Q.Q./.!.^.!.!.!.!.!.^.!.!.!.Q.!.B.!.!.B.Q.T.T.Q.N.B.E.N.N.N.N.N.N.N.N.B.N.N.N.N.N.N.T.n.N.N.N.N.T.n.n.d.",
"+X!.%X{.!.VXNXVXVXNXNXNXNXnXNXNXNXNXZXNXNXZXNXZXDX>.=.=.=.=.=.=.=.=.=.G. X X_.).D.D.D.A.].D.D.D.C.).[.).).[.).).).).[.).).).).[.).).[.D.].[.D._.]._.D._.].|.D.].].].`.].].].`.].'.'.'.].'.'.`.'.'.'.`.`.|.`.|. X X X|.|. XgX[.] pXpXpXpXpXKXKXKXxX' ' ' ] Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' | U.' ' ' ' ' ' } ' ' ' ' ' ' ' ' Y.Y.' ' ' ' ' } ' ' ' ' ' ' | ' Y.Y.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' sX' } 0X0X} ' ' ' ' ' ' ' ' ' ' sX} ' 0X} 0X| ' ' ' ' ' ' ' ' *.=.=.=.=.=.=.-.-._ ' ' ' ' ' ' ' 0XsX' 0X} 0X' ' ' ' ' ' ' ' ' } Y.' ' ' ' ' ' ] ' ' ' ' ' ' ' ' Y.' ' ' ' ' ' ' ' ' ' ' IXPXKX[.{ KXIXJX' } IXKXKXIXJ.=.=.=.=.=.=.=.=.IX' ' IXKXKXLXIX' ' ] ' ' ' 0XdX' 6 0 0 qX 0 0 0 : qX 0 0 0 0 qX0 o 0 0 0 9X9X 0 0 0 I.I.L.L.L.P.I.I. I.I.L.L.L.L.I.I.I.KXKXuXyXyXyXyX _ _ W W Q Q R J Q I J I R R J D Q G D T F F S F F S V D V S F V Z C C C V Z Z C V C C V V V V V V V Z C V V Z m Z V V m V F F F L W ! ! W U P ^ T.Q.n.T.Q.!.!.!.!.!.!.Q.!.Q.!.Q.!.T.!.Q.Q.!.!.!.!.Q.!.B.!.T.!.Q.T.!.Q.!.!.Q.T.T.Q.Q.Q.E.T.!.Q.Q.T.Q.Q.Q.",
"{.!.!.!.!.NXNXVXNXNXNXNXNXNXNXNXNXZXFXNXNXZXNXNXDX>.-.=.=.=.=.=.=.=.-.J. X|. XA.A.A.D.D._._.D.D.).D.[.).).[.).D.[.D.(.[.).[.).A.).).[.).).).).).).).D.).D.].].]._.)._._.].].].].].'.'.'.].].].].'. XK.>.-.=.=.>.V.G.].'.'.'.[.] pXpXpXpXpXKXKXKXxX' ' ' ' ' &.:.*.=.=.=.=.;.&.H.' ' ' ' ' ' ' ] U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' H.*.-.=.-.;.&.' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ] } ' ] ' sXsXrX;.-.=.-.*.H.' ' ' ] ] ' ' aXaXaXaX' ' ' ' ;.=.=.=.=.=.=.=.=.dXaXaX' ' ' ' ' ' ' ' ' } ' ' 0XrX;.-.=.=.;.&._ ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' ' ' ' ' ' Y.' ' ] KXKX] ' ' ' ' ' ] KXLXCX=.=.=.=.=.=.=.-.' ' ' ' } KXLXPXPX' ' ' ' | ' ' ' 2 : : 9XqXiXiX : : : o : iXqXiX : : : : iXiXqX . : : : qXiXiXiX : : : iXiXqXiX P.P.P.n % % % P.P.P.P. % % % % LXKXuXuXuXyXyX _ ^ E Q Q Q R R R U J J J J G J W G G G G Y G F F S S D S V D V Z C C C C C C F P V C Z C V Z V V V Z V V l Z V V V V V V F F P L W ! W I U I p.}.OX1X5X6X6X5X5X6X5X5X5X5X6X5X5X5X4X5X4X5X5X5X5X5X5X5X5X5X5X4X5X5X5X5X5X5X5X5X4X5X4X5X4X5X5X4X5X4X5X4X4X",
",X!.!.,X>XZXNXNXNXNXZXZXNXNXZXNXNXNXNXNXNXDXZXDXNX>.=.=.=.=.=.=.=.=.-.V..X|. X_.D.D.D.].).D.D.D.).D.D.).[.).).).).).[.).).[.=.=.=.=.=.=.=.=.=.=.=.=.V.).].|.].D.V.=.=.=.=.=.=.=.=.=.=.=.;.].|. XV.=.=.=.=.=.=.=.=.;.G.].'.gX[.] pXpXpXpXpXKXKXKXxX' ] q.-.-.-.-.-.-.=.=.=.=.-.-.;.' ' ' ' ' ' ' ' ' ' *.=.=.=.=.=.=.=.=.=.=.=.:.' ' _ ;.-.=.=.=.=.-.-.=.&.' ' ' ' ' ' ' ' ' _ -.=.=.=.=.=.=.=.=.=.=.-._ ' ' H.=.=.=.=.=.=.=.=.-.H.' ' ' ' ' ' ' ' ' tXpXpXpX*.-.=.=.=.=.=.=.=._ ' ' ' pXpXpX} ' ' ' ' ' ' *.=.=.=.=.=.=.=.=.-.;._ ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' xXKXKXKXKX' ' ' ' ' ' ' ' ' KXZX=.=.=.=.=.=.=.&.' ' ' ' ' ' xXKXKXpXpXpXpX0X' ' ' 2 yXyXyX9X o yXyXyXyX iXyXyXyX .yXyXyX L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. LXKXuXyXyXyXyX _ ~ ^ W Q Q Q Q U R U J H J J H R G J G G Y F F S S z D V S D V S A D D C C C C Z F C V C V C V Z z z V V z m V V m Z m P C F V L W U ! U U L p.1X6X4X4X4X1X<X1X5X1X1X1X4X1X1X1X1X4X1X4X1X1X,X4X1X>X,X1X:X1X>X,X>X1X1X>X>X>X>X:X>X>X>X1X>X>X>X>X>X>X}.>X",
",X>X>X,X>XZXZXDXZXZXDXDXDXZXZXFXDXZXNXZXZXZXNXNXDX>.=.=.=.=.=.=.=.=.=.V..X|. XD.D.A.D.D.D.D.S.D.D.).[.D.C.).D.).).).[.).).).D.G.:.=.=.=.=.=.=.=.=.=.H.].|.].D.].D.D.V.=.=.=.=.=.=.=.=.=.>.].).:.=.=.=.=.=.=.=.=.=.=.-.G.|.gX[.] pXpXpXpXpXKXKXKXxXH.=.=.-.*._ ' ' _ &.-.=.=.=.=.=.=.H.' ' ' ' ' ' ' ' ' ' &.-.=.=.=.=.=.=.=.-.&.' H.=.=.-.=.=.=.=.=.=.=.-.-.' ' | ' ' ' ' ' ' ' _ ;.=.=.=.=.=.=.=.=.=.q.' :.-.=.=.=.=.=.=.=.=.=.-.H.0X' ' ' ' ' ' ' ' ' ' ' ;.-.=.=.=.=.=.=.-._ ' ' ' ' ' ' ' 0XpXpXaXH.-.=.=.-.:.' ' _ ;.=.=.=.=.H.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' | ' ' ' ' ' ' LXKXKX' ' ' ' ' ' ' ' ' KXKXJ.=.=.=.=.=.=.=.H.' ' ' ' ' KXKXKX' ' ' ' ' ' 0XpXpXqX yXyXyX yXyXyX yXyXyX( qXyXyXqX L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. KXKXuXyXyXyXyX _ ^ R ^ Q R Q I R U R J J J J H W F F F S G F F D S S D D V F C C A S C C V C F V C C Z C V Z V z Z V V Z V Z V Z m V Z Z F F P G I Q Q W U P p.OX4X1X>X>X}.>X>X<X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X:X>X>X>X>X>X>X>X>X}.>X>X}.>X}.>X>X}.}.}.}.}.}.}.>X",
"!.T.!.T.B.nXVXVXVXVXVXVXVXnXVXVXnXNXVXVXVXVXVXnXNX>.=.=.=.=.=.=.=.=.=.V. X|.|.D.A.A.D.].D.D.D.].).C.D.).).[.D.[.C.).).).).[.D.D.).-.=.=.=.=.=.=.=.=.V.D.D.|.D.D.|.D. XH.=.=.=.=.=.=.=.=.;._.>.-.=.=.=.=.=.=.=.=.=.=.=.>.'.gX[.] pXpXpXpXpXKXKXLXK.=.=.=.:.' ' ' ' ' ' K.=.=.=.=.=.=.=._ ' ' ' ' ' ' ' ' ' ' :.=.=.=.=.=.=.=.=.:.R =.=.=.=.=.=.=.=.=.=.=.=.-.-.] ' ' ' ' ' ' ' U.' ' -.=.=.=.=.=.=.=.=.cXK.-.-.=.=.=.=.=.=.=.=.=.-.-.&.0XpX' ' ' ' ' ' ' ' ' *.=.=.=.=.=.=.-.-._ ' ' ' ' ' ' ' ' ' ' *.=.=.=.=.:.' ' ' ' _ =.=.=.=.-.9.' ' ' ' ' U.' ' ' ' ' ' ' ' ' ' ' ' ' ' ' U.' ' ' xXKXKX' ' IXKXgX' ' KXKX' &.=.=.=.=.=.=.-.gXKXIX' ' KXKXxX' ' ' ' ' ' ' ' ] ' 2 yX o X yX( o 9XqXo o o 0 yX o o o yX L.L.L.L.L.L.L.L. L.L.L.L.L.L.L.L. KXKXuXyXyXyXyX _ E W R R Q R I R I U J J J G J J G G F S F S F S S V D D V C C C V Z C V Z V Z V V V C Z V z V z z Z z V f V m Z V V m C F P V P W Q ! U I G f./.4X4X1X4X1X>X3X<X1X1X1X>X1X>X1X>X4X1X>X>X>X1X>X1X>X1X,X:X>X>X4X>X>X>X>X1X>X>X>X>X}.>X>X>X>X>X>X>X>X>X>X",
"T.!.V.!.!.nXVXVXnXVXVXVXVXVXNXNXNXNXNXDXDXZXZXZXZX>.=.=.=.=.=.=.=.=.=.G.|.|. XA.C.C.A.D.D.D.D.[.).D.C.[.D.D.D.D.D.[.).[.[.).[.).).:.-.=.=.=.=.=.=.=.V.D.].D.D.|.D.D.D.G.=.=.=.=.=.=.=.=.;.>.-.;.G.].G.;.=.=.=.=.=.=.=.=.G.gX[.[ pXpXpXpXpXKXKXJ.=.=.=.=.9.' ' ' ' ' ' ' =.=.=.=.=.=.=.=._ ' ' ' ' ' ' | ' ' H.=.=.=.=.=.=.=.=.*.-.=.:._ ] ' q.=.=.=.=.=.=.=.=.*.' ' ] ' ' ' ] ' ' ' K.-.=.=.=.=.=.=.=.*.=.=.H.} 0X' K.-.-.-.=.=.-.=.=.H.] ' 0X0X0X0X0XdXsXsX;.=.=.=.=.=.=.=.=.{ 0X0X' sXdXsX0X' ' &.-.-.=.=.=.0X0X0X' ' } &.=.=.=.=.-._ ' ' ' | ' ' ' ' } } ' ' ' ' | ' ' ' ' ' ' ' ' ' | ' gXKXKXxXgXIXKXKXgX' ' ;.=.=.=.=.=.=.CXIXgXcXKXKXgX' ' ' ' ' sXsXdX0X' ' ' 2 . 0 ( ( ( qX9X9X . o ( ( ( 9XqX9XqX. ( ( ( 0 9X9X9XqX o o ( ( ( 0 ( qX9X9X ( ( ( ( 3 3 3 3 o o 3 3 3 3 o LXKXuXyXyXyXyX _ E W W Q J I R I I I J J J J G R G G G H F F F F S S F D V F C C D C C C V V V V C V C C V Z C V V V V Z V Z z m V Z Z V F F P L L U U I I P / 4X6X4X4X3X4X1X1X1X3X3X5X4X1X5X1X1X1X4X1X4X1X4X1X3X1X1X>X>X1X1X1X>X1X4X2X1X1X>X4X>X1X>X>X1X>X<X4X1X1X>X>X",
"1X1X4X1X1XGXGXGXGXGXGXGXFXGXGXGXGXGXGXGXGXGXGXGXGX>.=.=.=.=.=.=.=.=.=.J..X X_.A.A.C.D.D.].D.D.D.[.S.[.D.).D.).).).).).).).).).).[.K.-.=.=.=.=.=.=.=.V.D.D.].D.|.kXD.D.G.=.=.=.=.=.=.=.=.=.=.;.).'.`.|.G.=.=.=.=.=.=.=.=.:.|.[.] pXpXpXpXpXUXFX=.=.=.=.=.K.xXkXxXxXcXgXxX>.=.=.=.=.=.=.=.K.xXgXxXkXxXxXxXcXxXG.=.=.=.=.=.=.=.=.=.=.J.zXcXgXxXxXG.=.=.=.=.=.=.=.=.G.xXgXxXgXxXgXxXcXxXJ.-.=.=.=.=.=.=.=.=.-.G.cXxXxXxXUXK.=.=.=.=.-.-.=.=.kXcXxXkXgXxXUXUXUXUX>.-.=.=.=.=.=.=.=.kXgXxXxXUXUXUXxXcXJ.=.-.-.=.=.K.zXxXgXgXxXxXkX=.=.=.=.=.>.gXxXxXxXxXgXxXxXgXxXxXgXgXxXxXxXgXxXxXxXgXxXxXgXxXgXxXKXKXxXgXPXKXLXxXzXkX=.=.=.=.=.=.=.LXIXxXFXKXLXxXgXxXgXxXxXUXUXUXxXxXkXgXF.} ] ] ] ] ] ] ] pXpXfXdX] ] [ } ] ] [ } ] ] ] } fXfXfXaX} ] [ } ] } ] ] ] ] ] [ fXfXfXfX] ] } ] ] ] ] } ] } } ] tXpXfXfX] } ] ] ] ] ] } ] ] ] [ [ } } ] ] } ] ] ] ] } ] [ } ] ] ] [ } ] } } ] ] ] ] } ] [ } ] } fXUXuXyXyXyXyX _ ^ W I I I J I J J J J H J H G Y G G G P L F H F S V V V V C V C C Z Z V V V V V Z l Z z V V z z z l Z z l Z z l Z z V V F V H L L W I J I B p.4X6X6X4X5X7X1X5X4X5X5X3X5X5X6X3X5X5X7X3X5X5X5X5X6X7X5X3X5X1X3X4X3X7X5X1X4X1X7X3X5X1X7X5X5X1X5X3X4X1X4X1X",
",X>X>X>X>XDXDXZXZXDXDXDXDXZXZXDXDXNXDXNXDXZXZXZXGX>.=.=.=.=.=.=.=.=.=.V.|.|.|.D.D.A.D.D.D.D.D.D.D.D.D.D.D.D.).[.).[.).D.[.D.D.[.A.K.=.=.=.=.=.=.=.=.V.D.D.D.D.D.|.D.D.G.=.=.=.=.=.=.=.=.=.-.G._.`.`.|.|.>.=.=.=.=.=.=.=.;.'.[.] ' ' dXpXpXpX>.-.=.=.=.=.=.cXaXpXaXpXpXpX:.=.=.=.=.=.=.=.:.pXpXpXpXpXpXpXpXpXcX-.=.=.=.=.=.=.=.=.K.aXpXpXpXpXpXpXK.=.=.=.=.=.=.=.;.aXpXpXpXpXpXpXpXpXK.-.=.=.=.=.=.=.=.=.rXpXpXpXaXpXpXsX=.=.=.=.=.=.=.=.G.aXpXpXpXpXpXpXpXpX:.=.=.=.=.=.=.=.=.sXpXpXpXpXpXpXpXdX-.=.=.=.=.=.cXpXpXpXpXpXpXaX=.=.=.=.=.=.tXfXpXpXpXpXaXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXaXpXpXpXpXpXpXpXpXpXcX-.-.=.=.=.=.rXpXpXaXaXpXpXpXpXpXpXaXpXpXpXpXpXpXpXpXqXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXuXuXyXyXyXyXyX _ E Y G I J J H J J J R G G J R R Y G G F L H T T F D D C C F C D D C D A Z C V V C C V C Z V Z V Z z V V V V l V V Z V C F F F L W ! I I I P f.6X6X6X6X6X6XMX6X6XCXCX6X5X6X6X6X5X5X6X6X6X6X6X6X6X6X6X6X6X6XCX5X6X6XCX7X6X5X6X5X5X6X5X5X5X5X7X6X5X6X6X5X",
">X^.,X%X%XNXNXNXZXZXNXZXZXNXNXNXNXZXZXDXNXNXNXBXDX>.=.=.=.=.=.=.=.=.=.G. X X XD.D.D.D.D.].[.D.D.).D.S.D.D.[.).).).).D.).).).).). XH.=.=.=.=.=.=.=.=.H.gX].D.|.D.D.D.D.G.=.=.=.=.=.=.=.=.=.J.].].`.]._._.;.=.=.=.=.=.=.=.=.gX[.[ ' ' dXpXpXcX=.=.=.=.=.=.=.=.aXpXpXpXpXpX:.=.=.=.=.=.=.=.=.pXpXpXpXpXpXpXpXpXcX=.=.=.=.=.=.=.=.=.dXpXpXpXpXpXpXpXrX=.=.=.=.=.=.=.=.cXpXpXpXpXpXpXpXpXG.=.=.=.=.=.=.=.=.>.aXpXpXpXpXpXpXpXK.-.=.=.=.=.=.=.-.aXpXpXpXpXpXpXpXpXK.=.=.=.=.=.=.=.=.sXpXpXpXpXpXpXpXK.=.=.=.=.=.=.sXpXpXpXpXpXpXpX;.=.=.=.=.=.K.pXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXaXK.-.-.=.=.=.K.pXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXfXqXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX ` W G I J J J J J J J J G J F H Y F F G F F P S V V C V C C C Z Z x z z V V Z l l x Z l x x l z x Z x Z x l z l x x z x V F D F P W Q Q U I P / 6XSX6XSX6X6X6X6X6X6X6X6X6XCX6XCXCX6X6XCX6X6XCX6XMX7X6XCX6X7XCX6XCX6X6X6X6X6XCX6X6X6X6X6X6XCXCX6X6X6XCX6X",
">X^.>X,X>XBXDXDXDXDXZXDXDXNXDXDXZXHXDXDXDXAXDXDXGX>.=.=.=.=.=.=.=.=.-.V.kX|.D.D.D.D.D.D.D.D.D.].[.D.D.D.[.[.).).D.[.).[.).).).).[.H.=.=.=.=.=.=.-.-.V.D.D.D._.D.D.|.D.G.=.=.=.=.=.=.=.=.-.].].].].`.`.`.:.=.=.=.=.=.=.=.=.`.S.] ' ' dXpXpXtX=.=.=.=.=.=.=.=.cXpXpXpXpXpX:.=.=.=.=.=.=.=.=.pXpXpXpXpXpXpXpXpXcX=.=.=.=.=.-.-.;.K.pXpXpXpXpXpXpXpXsX=.=.=.=.=.=.=.-.K.pXpXpXpXpXpXpXpXG.-.-.-.-.-.=.=.=.cXpXpXpXpXpXpXpXpXcX=.=.=.=.=.=.=.=.cXpXpXpXpXpXpXpXpX:.=.=.=.=.=.=.=.=.dXpXpXpXpXpXpXdX=.=.=.=.=.=.-.pXpXpXpXpXpXpXpXK.=.=.=.=.=.=.sXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXsX=.=.=.=.=.=.dXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXaXdXqXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXiXyX F P R L L I G I J J J J G G G H L F F H D H P F V V V V V C C V V V Z z z C Z x z Z x x z V z z Z V x x Z z z Z Z C z x V F F F P ^ W U I W P p.CXMXMX6XCXMX6X6X6X6XCX6XCX6X6X6X6X6X6X6X7XCXCX6X6X6X6X6XCX6X6XCX6X6XCX6X7XCX6XCX6X6X6XCX6X7XCX5X6X5X5XCX",
">X>X>X>X>XDXBXDXNXDXDXBXDXDXDXZXHXHXZXDXDXDXDXDXDX>.=.=.=.=.=.=.=.=.-.J.|. X|.D.D.C.D.D.].D.D.].D.D.S.S.D.D.D.D.C.).D.).).[.).C.].k.=.=.=.=.=.=.=.-.H.D. X_.D._.D.D.D.G.=.=.=.=.=.=.=.=.>.'.].].].].'.'.:.=.=.=.=.=.=.=.=.G.gXhX' ' ' ' ] cX=.=.=.=.=.=.=.=.cXpXpXpXpXpX:.=.=.=.=.=.=.=.=.sXpXpXpXpXpXpXpXpXcX=.=.=.=.=.-.-.-.K.pXpXpXpXpXpXpXpXpX>.=.=.=.=.=.=.=.=.aXpXpXpXpXpXpXpXK.-.-.-.=.=.=.=.=.cXpXpXpXpXpXpXpXpXdX=.=.=.=.=.=.=.=.K.pXpXpXpXpXpXpXpXK.=.=.=.=.=.=.=.=.sXpXpXpXpXpXpXrX=.=.=.=.=.=.:.pXpXpXpXpXpXpXpX:.=.=.=.=.=.=.cXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXrX=.=.=.=.=.rXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXaXqXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXqXqXqX L I I I W I I J I I J J J G H F G H F F D P F V V D V C V C F C C Z C C C z Z z z z Z x l x Z x x l l Z x z x x x z z l Z V F H L Q Q W I W M p.4X6X5X6X6X6X6X5X5X6X5X4X5X4X4X4X5X4X5X4X3X5X1X5X7X5X4X7X1X1X7X>X,X3X1X>X3X1X3X>X,X,X2X>X1X4X1X>X,X2X2X,X",
">X>X>X>X>XDXGXGXDXDXDXDXDXDXDXDXHXGXGXGXDXGXGXGXGX>.=.=.=.=.=.=.=.=.=.V.|. X XD.C.C.A.D.D.].D.D.D.D.D.D.D.).).[.).[.).).[.).).D.D.K.=.=.=.=.=.=.=.=.V.D.D.D._.D.D.D.|.G.=.=.=.=.=.=.=.=.;.].].].'.].'.`.:.=.=.=.=.=.=.=.=.G.jXzX' ' ' ' ' ] -.=.=.=.=.=.=.=.sXpXpXpXpXpXK.=.=.=.=.=.=.=.=.sXpXpXpXpXpXpXpXpXcX=.=.=.=.=.=.=.=.G.pXpXpXpXpXpXpXpXpXK.=.=.=.=.=.=.=.=.cXaXpXpXpXpXpXpXJ.-.=.=.=.=.=.=.-.cXpXpXpXpXpXpXpXpXsX=.=.=.=.=.=.=.=.-.pXpXpXpXpXpXpXpX:.=.=.=.=.=.=.=.=.dXpXpXpXpXpXpX:.=.=.=.=.=.=.K.pXpXpXpXpXpXpXpX:.=.=.=.=.=.=.rXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXaX;.=.=.=.=.G.aXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXqXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX: I J U J U G G J J H G I G G G H L H F F D G F F V P F Z D C D D C V Z C C C A z C x z z x x x x Z x z x z Z z z z z Z l V C S F L ^ Q I I I M / }.XX>X}.}.XX>X>X%X>X>X}.^.}.,X}.,X!.}.{.,X,X%X{.,X}.^.,X,X%X}.,X,X{.>X>X,X}.,X{.>X>X,X>X,X>X{.>X{.>X,X,X",
">X>X1X4X4XDXGXGXFXDXGXGXGXGXDXGXGXGXGXGXGXGXGXGXGX>.=.=.=.=.=.=.=.=.=.V.|.|. XD.A.A.D.D.D.D.D.D.S.D.D.D.).C.D.D.D.D.C.[.D.D.).[.D.V.=.=.=.=.=.=.=.=.V.D.D.].D.]. XD.D.G.=.=.=.=.=.=.=.=.>.D.].].]._.'.'.:.=.=.=.=.=.=.=.=.G.|.].' ' ' ' ' ' 9.=.=.=.=.=.=.rXpXpXpXpXpXpX:.=.=.=.=.=.=.=.=.dXpXpXpXpXpXpXpXpXcX=.=.=.=.=.=.=.=.G.pXpXpXpXpXpXpXpXaXG.=.=.=.=.=.=.=.=.rXpXpXpXpXpXpXpXG.-.=.=.=.=.=.=.=.cXpXpXpXpXpXpXpXpXpX=.=.=.=.=.=.=.=.=.sXpXpXpXpXpXpXpX:.=.=.=.=.=.=.=.=.sXpXpXpXpXpXaX=.=.=.=.=.=.=.:.pXpXpXpXpXpXpXpX:.=.=.=.=.=.=.K.pXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXG.-.=.=.=.K.aXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX J I H J H J I G J J G H H G H F G H H G D F F V V V V V Z A x z Z Z Z z Z x z x Z x z A Z V V Z z z Z V z z Z z V Z C z V A V D L W ! W U I M / 4X4X4X4X>X>X,X1X>X4X1X4X1X1X4X4X1X1X1X>X:X>X1X1X>X1X:X>X1X1X>X,X:X1X>X4X1X>X1X1X1X>X,X1X1X1X1X>X>X>X,X:X",
"6X6X5XCX6XGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGX>.-.-.=.=.=.=.=.=.=.G.kX|.D.D.A.C.A.D.D.[.).).[.).D.D.S.).D.).D.D.D.D.D.D.D.D.D.K.=.=.=.=.=.=.=.=.V.[.D. XD.D.].D.D.m.=.=.=.=.=.=.=.=.;._._._._.`._.|.:.-.=.=.=.=.=.=.=.G._._.(.(.`.)._.(._.G.:.=.=.-.V.|.|.|.D.kXG.K.=.=.=.=.=.=.=.=.=.G. X'.]. X XD.].kXV.=.=.=.=.=.=.=.=.:.'. X X|. X|.|. X XJ.-.=.=.=.=.=.=.=.:.|. X XD. X'.|.:.=.=.=.=.=.=.=.=.V.|.|.|.|. X|.|.|.|.;.=.=.=.=.=.=.=.=.V.|. X.X|.|.'.].>.=.=.=.=.=.=.=.=.G.|.|.|.|..XG.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.>.|.|.|.|..X.X.X|.|.hX|.hX|.|..X'.|.|.|.|.|.|.hX|..XhX.X|.|.|.kXG.-.=.=.=.-.G..X|.hX.X XkX.X X|.|.kX|.hX|.|.hX|.hX|. XkX|.].q.v R R R R K R Y G G G G G H R G R G R R R J W W J J I I W R R R R J W R R I J W R R W W R Q Q Q ^ Q W W W W R I G W W I I W W W W I G R W L W G I W W ^ ^ W W E G L Y W W G W G W Y J Y J J R W W W I J J J W G I J J J I H G I I G U P G P J H G L G I H H G H L H D F S F F V V V Z V C Z z C D z x T C z z A z z z x z Z C z z z x Z Z V V Z Z V Z Z C C F F L ^ Q W Q I H p.4XCXCX6X5X5X5X6XCX5X5X5X6X5X5X4X5X5X5X7X5X5X5XCX5X5X5X5X5X5X5X4X5X1X5X5X5X4X4X1X1X4X4X4X1X1X4X1X5X1X4X4X",
"6X6X6X5X6XGXGXGXIXGXGXGXGXGXIXGXGXGXGXIXGXIXGXGXGX>.=.=.=.=.=.=.=.=.=.J.|.|.|.D.D.D.C.D.).D.D.D.D.C.D.C.D.S.S.[.D._.D.D.D.D.).[._.H.=.=.=.=.=.=.=.=.V.D.D.].D.].D.D.D.G.=.=.=.=.=.=.=.=.>._._._._._._._.:.=.=.=.=.=.=.=.=.G._.).(.(.[.(.[.).).(.A.(.)._.).(.D.|.G.:.=.=.=.=.=.=.=.=.=.=.=.G._.|.|.|.].kX|.G.G.=.=.=.=.=.=.=.=.:. X X_. XG.kX X|.|.K.=.=.=.=.=.=.=.=.:.|.|.].|.|.|.hX:.=.=.=.=.=.=.=.=.G.|. X X|. X|.|.|.|.>.=.=.=.=.=.=.=.=.J.|.|.|.|.|.|.hX;.=.=.=.=.=.=.=.=.G.`.|.|.|.|.V.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.;.|.|.|.|.|.'.'.hX|.|..X|.hX'.'..X|.'.'.'.hX.X`.'.hX|.|.'.|.hX'.>.=.=.=.=.V..X|.|.|.|.|.|.|.|. X'.|.|.|.|.|.|.|.|..XkX|.].kXq.R R G G G D Y R R G R R R J G G Y G v R G J J J J J G J K J J J J J J J J I R J J J J J R R R R J W I R J W G I I J J I J I J W W J I R R I G W L L R G I J R I L L I R J W I Y G G J G J J R W R J G W J G I I L L J P H L G I I G H G U J J G G G L I J J H H F H H S D P V V V V V V C C C C x z A z z A z x A z x x x x x Z x Z x x V x x Z V Z l x C F V V L W W I I I M p.4XMXCX6X6XCX5X5X5X5X5X5X5X5XvX5X5X6XCX5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X4X5X5X5X5X4X1X4X5X4X5X",
"5X4X5X5X5XGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGX>.=.=.=.=.=.=.=.=.=.G.|.|.|.D.D.C.D.D.D.D.D.D.D.D.S.D.D.D.D.D.D.).D.D.[.D.D.D.D.K.=.=.=.=.=.=.=.-.H.].D.D.].D.D.D.D.G.=.=.=.=.=.=.=.=.;.]._._.].].].].:.-.=.=.=.=.=.=.=.G.'.).[.Z.Z.Z.C.[.).D.).(.).D.[.C.(.:.=.=.=.;.;.=.=.=.=.=.=.=.=.G.|. X].|.]. X].'.V.=.=.=.=.=.=.=.=.:.'.|.|._.]. X_.|.|.V.=.=.=.=.=.=.=.=.>. X X|.|.|.|.|.:.-.=.=.=.=.=.=.-.J.|. X|.|.|.|.|.|.|.:.=.=.=.=.=.=.=.=.H..X|.|.|.|.|.|.;.=.=.=.=.=.=.=.=.G.|.|.|.|.'.K.=.=.=.=.=.=.=.=.|.|.|.|.`.|.kX|.'.hXhX|.|.|.|.|._.|.'.`.'.'.'.'.|.|.|.'.'.|.|.|.|.'.|.'.|.|.`.|.|.|.|.|.|.'.J.-.=.=.=.V.kX|.|.hX XkX.X|.|.kX|.|.|.|.|.|.|..X|.kX|.|.|.kX|.@.R R v R R R R R R G R R R R R R R R R D J J R R J J J J J J J J J J J R J Q R I R J J Q R R Q J J I J R I I R J J I W R I R I I J J J J L I J J I G I W G J R J I W R R R J R R R R R J R R Y Y Y Y Y Y G G L G J J G G I I J I P I J U J J I J J G J I J H G G G F H D D H F C V F V C D D D A A z A z z x z z A z z x C x z x Z x x x l l x x z x l m Z P S S G W I I I J H u.>XvX5X5X5X5X1X5X1X1X4X4X4X>X1X1X,X>X4X,X,X4X1X,X>X4X,X>X,X>X1X4X,X>X,X:X>X,X,X,X:X>X%X,X,X!.,X>X}.,X,X!.",
"%X>X%X,X>XZXAXZXHXHXNXNXBXMXAXHXBXBXAXAXHXHXNXDXDX>.=.=.=.=.=.=.=.=.=.V.|.|. XA.D.C.D.D.D.D.D.D.[.D.).[.[.D.D.D.D.=.H.D.].D.].[.|.H.=.=.=.=.=.=.=.-.H.].].D.D.].D.D.D.G.=.=.=.=.=.=.=.-.;.]._._._.].D. X:.=.=.=.=.=.=.=.=.G.'.).(.{ Z.Z.[.Z.C.Z.Z.Z.C.C.C.:.-.=.=.-.K.'.>.=.=.=.=.=.=.=.=.G.'.].|.]. X|.].'.G.=.=.=.=.=.=.=.=.:.|.`. X|.|. X|.|.kXV.=.=.=.=.=.=.=.=.;. X X|._.|.|.|.:.=.=.=.=.=.=.=.=.V.|.|.|.|.|.|.|.|..X:.=.=.=.=.=.=.=.=.K.|.|.|.|. X|. X>.=.=.=.=.=.=.=.=.G.|.|.|.'.'.J.=.=.=.=.=.=.=.=.|.|.|.|.|.|.|.'.|.kX|.|.].|.|.|.|.|..X'.|.hX|.|..X|.|.|.|..X|.|.|.'.hXhX|.|.|.'.|.|.|.'.hXG.=.=.=.=.J.|.|.|.|.|.|. X|.kX|.|.|.|.kX|.hX|.|.|.|.|. X|.kXD.|.q.Y v Y R v G R R v R R R R R v R R R K R G R R R J J J J J J I J J J R J R R R R J R R J J Q R J Q J W R R J J W R G R R R J R R J J R J I G R J G I R I R I W G J I J W W Y R Y Y R Y R R R R R R R R Y W J I G G I J U L G P K I H J G J H J G G J G H G F G D F P T F F D C C P V V Z z A z z z D z z A z A x x Z x Z x Z Z x x Z x x Z x x Z x x Z f Z V S S G W Q I J U H / {.}.!.!.!.^.!.!.!.!.!.!.!.!.!.Q.!.{.!.!.!.+X!.!.!.V.!.!.Q.!.!.V.Q.Q.!.B.!.B.!.Q.V.!.B.B.!.Q.Q.!.T.Q.{.!.",
"!.^.!.,X!.NXNXVXZXZXVXZXNXVXVXVXNXNXNXVXZXZXZXZXZX>.=.=.=.=.=.=.=.=.=.J.'.'._.).D.C.D.D.D.D.S.D.S.D.S.S.D.D.D.D.G.=.H.D.D.D.S.D.D.K.=.=.=.=.=.=.=.=.V.D.D.].].D.D.D._.G.=.=.=.=.=.=.=.=.>.].]._._._._._.:.=.=.=.=.=.=.=.=.G.].[.Z.{ { { C.Z.Z.Z.Z.C.A.H.=.-.=.=.=.V.D.|.;.=.=.=.=.=.=.=.=.G.|.].|._.|. X].|.V.=.=.=.=.=.=.=.=.:. X].|.|. X].|.|. XV.=.=.=.=.=.=.=.=.;.|.|.].|. X|.|.:.=.=.=.=.=.=.=.-.J.gX|.|.|.|.|.D. XD.:.=.=.=.=.=.=.=.=.J.].kXD. XG.kX|.;.=.=.=.=.=.=.=.=.G.kX|.|.|.|.V.=.=.=.=.=.=.=.=.G.|.|.|.kXkX'.].'.'.'.|.hXhXD.|.|.kX|.D.].|.kX_. X].kX'.D.kX].'.'.].kX'.|.kX'.|.'.|.|._.kX;.=.=.=.K.|.|.|.|.'.hX|.kX'.|.hX'.|.|.kX|.|.|. X|.|.|.|.|.|.kX X@.x _ G G v R Y R E R R R R T v R R R R v G R R G R Y J G Y G R Y R L E R Y W R R E E R W R W Y R W R W R R R R R R R W W R W W R R R Y W E Y L R R R Y R L R R Y J Y R Y L L R G Y R Y J Y R R R R R R R J J I H H J I I J J J J J J J H J H G J G J R H G R v T G F F F D D D C C Z C C A C C C C C z z z A z z x C x x C x C x Z C x x l x l l l l Z l V V V D G W Q W U J G u.}.5X4X>X1X1X1X>X>X>X1X>X>X>X1X4X1X1X1X1X5X1X1X>X1X>X>X4X1X4X5X5X4X3X5X5X1X5X4X4X5X1X1X3X5X1X>X4X1X>X4X,X",
"1X1X1X5X4XDXDXDXGXDXDXDXDXFXGXGXDXGXGXFXGXGXFXGXGX>.=.=.=.=.=.=.=.=.=.G.'.]._.).A.C.C.D.D.D.D.D.S.S.S.D.S.D.D.D.:.=.G.S.S.D.D.D.).H.=.=.=.=.=.=.=.=.H.].D.D.D.D.].D.D.G.=.=.=.=.=.=.=.=.;.[._._.`._._._.:.=.=.=.=.=.=.=.=.G.].[.C.S.Z.[.[.[.(.[.A.A.;.=.=.=.=.-.V.|.|. X>.=.=.=.=.=.=.=.=.G._.|. X].].]. X].V.-.=.=.=.=.=.=.-.:.|.]._.|._.|._.|.`.V.=.=.=.=.=.=.=.=.:. X|.|.|. X|.'.l.-.=.=.=.=.=.=.-.V.D.|.D.|.|. XkX XhX:.=.=.=.=.=.=.=.=.V.]. XkXkXD.|.|.>.=.=.=.=.=.=.=.=.G. X'.|.|.|.K.=.=.=.=.=.=.=.=.G.|.'.|.'.'.].].kXkXkX'.D.kXgXkX|.D.kXjXkXD.D.hXjX].S.kXkXjXkX].hXkXD._.kX]._.kXkXD.].hX:.=.=.=.l.|.'.|.hX].'.].'.'.|.|.|.|.|.|.|.|.|.|.kX|.kX|.kX|.|.kX|.q.T v T Y T Y v Y v Y T R R Y G Y R T R R G Y Y R R Y Y Y G Y Y Y R Y Y W E R W Y R R Y Y L Y Y Y R R R W W R W L Y R R Y R Y Y Y R Y Y Y Y L E R L Y Y Y Y G Y Y Y Y E W E G L G G G G G G G G R R R G G G J G G I G G H H G G J H G J J J J G G G G G G H D D G F F G D D D C C V V Z V x x x x A Z A z z x A x Z C Z x x Z x z x x Z x Z l l Z l l l Z V V V F L W ^ W P J H u.}.vX5X>X}.4X1X>X}.,X}.}.>X>X>X,X{.,X,X!.^.,X^.{.{.{.{.^.!.!.G.!.+XG.B.!.V.!.Q.V.B.Q.B.B.B.V.B.N.B.N.N.B.",
"1X>X1X>X1XDXDXDXDXDXDXZXGXDXDXDXDXGXDXGXZXGXGXFXGX>.-.=.=.=.=.=.=.=.=.V.|.'.`.).D.C.A.D.D.D.D.D.D.D.D.D.D.).D.D.-.=.m.D.D.).S.].).K.-.=.=.=.=.=.=.=.V.].D.D.D.D.D.D.D.G.=.=.=.=.=.=.=.=.;.D.).]._.).)._.:.=.=.=.=.=.=.=.=.G.|. X[.).].]._._.).).H.-.=.=.=.=.=.K.D. XD.kX>.=.=.=.=.=.=.=.=.G._.`. X|.|.|.kXD.V.=.=.=.=.=.=.=.=.:.].|. X].].|._.].].V.=.=.=.=.=.=.=.=.:. XD.|.D.|.'.|.:.=.=.=.=.=.=.=.=.V.D.|.kX XD.kX]. X|.:.=.=.=.=.=.=.=.=.G.G.D.|.|.|.|. X;.=.=.=.=.=.=.=.=.G.|.].|.]. XV.=.=.=.=.=.=.=.=.K..X|.'.kX'.'.jXzXzXjXF.] |.FXFX|.[ F.FXFX).D.FXnXS.Z.zXFXzXhXF.D.kX].kXkXD.A.zXzX).].G.=.=.=.l.hX)._.|.|.|.'.'.'.'.|.|.|.-.G.|.|.|.kX|.|. X|.|.|.|.kX].kXv Y G Y Y G F R T G Y R Y Y G G Y Y R T R Y J R Y G J G H G G G J J J G W W I W W J I W G W J R W Y I I G R I W W W R R W W R G R L Y J Y G Y G Y Y G J Y Y G G R R G W Y Y L G J G G L G G G G G G G R G G G L G G G G G J H G J J G J G G H J G G G G G G G D G F F D D D D C D V V V V z C C Z z A z A z A z z z x z Z Z x Z x x Z x Z x x l x f l Z V C F S H G W Q I K G I 6.x.p.9.y.6.6.y.0.y.8.6.8.8.6.6.8.6.6.8.6.6.6.6.6.U 6.6.q.U U 6.U q.U 6.U 6.U 6.q.6.K U q.K K 6.K U K U K ",
"4X4X5X1X1XGXDXGXDXDXGXDXGXDXGXGXGXDXGXDXZXGXGXZXGX>.=.=.=.=.=.=.=.=.=.G.|.|.`.(.D.C.A.D.D.D.D.D.D.D.D.S.D.D.D.H.=.=.D.).D.).[.D.).H.=.=.=.=.=.=.-.-.H.D.D.].].D.D.C.C.G.=.=.=.=.=.=.=.=.>._._._._.).]._.:.=.=.=.=.=.=.=.=.G.D.D._.].'.].].|. XH.=.=.=.=.=.=.>.'.kX X|.D.;.=.=.=.=.=.=.=.=.G._. X]._.|._.kXG.G.=.=.=.=.=.=.=.-.:.|.].].].|._.|. X].J.=.=.=.=.=.=.=.=.V.|.|.]. X|.'..X:.=.=.=.=.=.=.=.=.V.|.|.|. X|.|.|. X|.;.=.=.=.=.=.=.=.=.G.|.kX X|.|. XgX>.=.=.=.=.=.=.=.=.G. X X|.|.|.G.=.=.=.=.=.=.=.-.>.|.|.].'.'.].kXzXzXgX[ [ kXzXzXkX[ F.zXzXkXkXFXzXZ.[ kXzXkX[.] Z.jX].jXkXZ.Z.xXzXhXXX=.=.=.:._.).]._.|.|.|.'.|.|.hX.X.XK.=. X'.hX|.|. X|.kX|.|.|.|.|.].kX@.T G v R Y G Y R R Y G R R G G R Y R Y R J Y J J J G G G G G H G G J J J J J J J I I J J G I J G J G G J L R R Y R J R R R Y R J G I G W L L G W I G J G I G J G G I G I L G L G G G H L G G J H J D G G G G G G G G G L G J G J G G G J H J G K G G G R G D H D G G D S D v C V V V x Z Z z z x z z z x z x x z z Z x x x x z x x x x x l Z l x x Z l l Z V V S G R Q Q J K P U Q U U 8.6.6.6.6.6.6.6.6.6.6.8.6.8.6.8.0.8.6.6.8.6.6.8.f.7.0.0.w.y.0.6.0.6.y.6.8.6.0.f.0.f.y.6.y.0.y.w.y.",
"}.%X{.^.^.VXVXNXZXZXVXZXZXnXZXZXVXVXZXnXnXZXnXVXZX>.=.=.=.=.=.=.=.=.=.J.|.`._.).A.C.A.D.D.D.D.C.S.D.D.S.D.D.D.>.=.;.[.D.D.D.D.D.(.K.=.=.=.=.=.=.=.=.V.D._.D.D._.D.D.D.G.=.=.=.=.=.=.=.=.;.].[.].).).].].:.=.=.=.=.=.=.=.=.G.|.D.].].|.D._.].V.-.=.=.=.=.=.=.G.].|.D.].].>.=.=.=.=.=.=.=.=.G.`.'.]. XkXD.|.|.V.=.=.=.=.=.=.=.=.:.]. X|. X|. XD.|.gXK.=.=.=.=.=.=.=.=.V.|.|.].|.|.|.|.:.=.=.=.=.=.=.=.=.G.kXkXD.|.|.|.|. X|.>.=.=.=.=.=.=.=.;.|.|.|.|.|.|.|.|.;.=.=.=.=.=.=.=.=.G.|.|.|.|.|.G.=.=.=.=.=.=.=.=.=.G.|.'.|.].D.D.kXvXvXS.Z.zXkXkXkXZ.[ zXzXjXzXkXzXD.[ Z.zXFXzX[ [ zX'.kXhXZ.{ zX'.hX>.=.=.>.kXhXjXhX_._.|.kX|.|.'.hX'.G.=.;.].gX'.|.'.'.|.|.kX|.|.'.|.|.kXq.T Y G G R v R Y G R G G R K G G G G R R J R J J J H G J J G G I G W I W J W R J Y I Y I W J J J J J W G G I J G J G J J J J G J J G J G G I G G G G J J G G J G G J G G G Y G G G G G G G H I G G D R K H G H G G G G G J J G J J G G H G J H H H H H G K v S H F F D S V V V V m m Z Z z V V V x V l z z C z V l l l l l Z x x x x l x l l c V Z l Z d V P V S G I I I I I I U B.Q.Q.Q.Q.T.Q.N.N.B.N.B.B.N.B.Q.B.N.B.Q.N.T.B.B.Q.N.Q.B.Q.T.T.Q.T.B.Q.Q.Q.T.T.B.!.N.T.T.B.B.Q.T.E.Q.T.!.",
"N.B.N.V.N.nXvXbXvXnXnXzXzXnXnXnXnXnXnXVXnXnXZXZXVX>.=.=.=.=.=.=.=.=.=.G.'.`._.).A.C.D.D.D.D.D.D.S.C.S.C.S.D.F.=.-.;.C.).S.D.D.D.).H.=.=.=.=.=.=.=.=.H.].A.D.D.D.D.D.S.G.=.=.=.=.=.=.=.=.>.S.].].].).].].:.=.=.=.=.=.=.=.=.G.D.|.].].G.|. XG.-.=.=.=.=.=.=.;.D.|.|. X].'.;.-.=.=.=.=.=.=.=.G.|.'. X].D. XD.|.G.=.=.=.=.=.=.=.-.:.|.|.D.kXD.|.|.|.`.K.=.=.=.=.=.=.=.=.D._.|. X_.|.`.|.:.-.=.=.=.=.=.=.=.V. X|.|.|.|.|.|.|.|.;.=.=.=.=.=.=.=.:. XkX|.|.|.|.|.|.>.=.=.=.=.=.=.=.=.G.|.].|. XkXkX>.=.=.=.=.=.=.=.-.J.|. XkX'.kXkXzXzXzXgXD.zXkXkXkX).C.kX].kXzXkXkXD.D.hXzXnXjX).D.kXzXzXhX[.[.kX].:.=.-.>.|.zXzXzXhX'.'.|.|.|.|.|.G.J.-.=.:.|.|.hX|.|.kX|.|.'.'.|.|.|.|. X@.G R v G T E v R G G R K H G G G D K G G G J G J J J J G J R R I I G Y J J G L W I R W G I Y G W I G J I W G Y J G I G J G J J J J I G I G J G J J J J J G I R I J J J J L G J G Y Y G G G G J R G R R D G H H J J J J G G G J G H J J H G H J G G H G J G F H S F H D V V Z m V m Z V f V V x Z x V l Z x x Z x l l l f l d l l x x x Z l l l l f l m f Z V S H G W I I I I I p.Q.>X,X>X,X}.>X}.>X>X>X>X}.>X>X}.}.>X>X}.>X,X-X>X>X^.>X>X%X,X>X,X,X%X>X>X}.>X{.>X>X,X}.}.-X%X>X{.}.%X^.,X",
"1X4X1X1X,XDXFXDXZXFXFXGXGXFXDXGXFXFXDXGXFXGXGXGXGX>.=.=.=.=.=.=.=.=.=.V. X|.`.(.A.C.C.D._.].D.S.D.D.D.S.D.).>.=.=.:.D.[.[.).D.).).V.=.=.=.=.=.=.=.=.V._._.D._.D.].D.|.G.=.=.=.=.=.=.=.=.;.].].].].].].].:.=.=.=.=.=.=.=.=.m.D.D.].].D.|.].V.=.=.=.=.=.=.=.:.|._.D.kX].'.>.=.=.=.=.=.=.=.=.G.].'.D. XD.].|.D.V.-.=.=.=.=.=.=.=.:.|.].G. X|.|.D.|. X:.-.=.=.=.=.=.=.:.|. X|._.|.|.'.|.:.=.=.=.=.=.=.=.=.V.'.kXkXD.|.|.|.|. X=.=.=.=.=.=.=.=.V.|.D.|.D.].|.]. X;.=.=.=.=.=.=.=.=.G. X|.|. X].|.K.=.=.=.=.=.=.=.=.-. X X|.|.|.kXhXhXkXkX].|.H.J.kXkXkXhXkX|.kX].kXkXhXkXhXgXkXkXkXkXhXkXhX XhX|.J.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.J.|.|..X'.|.|.|.|.|.|.|.|.kX|.gX@.v R R R R v R G v R D D G G H H G G G G H J G J G J G R R R G R G J G I G I G J G J G J J J J J G I I G J J J J R J G G G Y R R R Y G J L R I G W Y L G G R G W R G R J R G G G G v G K H H J Y R Y G R G H F J G H J H J G G H G G G G H G H J G H G G J F H H S F D S V V V m m Z V V Z V Z V Z V z x x V x Z l z l Z l l x Z x x Z Z x l l l x l Z f V D S H G W I I J K M u.!.XX4X4X>X>X>X>X>X>X>X>X>X>X1X}.1X>X>X>X>X>X>X>X>X>X>X:X>X>X>X>X>X>X,X>X>X1X>X,X>X>X>X,X>X>X>X}.}.>X>X>X",
"!.B.Q.Q.B.nXnXnXCXnXvXnXvXvXbXvXvXvXvXvXlXlXlXvXvX>.=.=.=.=.=.=.=.=.=.V. X'.).).C.C.D.D.D.D.D.D.S.D.D.C.D.H.=.=.-.K.D.S.D.D.D.D.(.K.=.=.=.=.=.=.=.=.H.D.).D.A._.D.D.D.G.=.=.=.=.=.=.=.=.>.].].[.].[.].].:.=.=.=.=.=.=.=.=.G.].].D.].].].D.>.=.=.=.=.=.=.=.J.]. X XD.].].;.=.=.=.=.=.=.=.=.G.].'.kX].|.|.|.|.J.-.=.=.=.=.=.=.-.:.'.'.kXkXD.|.|.].`.>.=.=.=.=.=.=.=.V. X]. X|.]. X|..X:.=.=.=.=.=.=.=.=.V.kXG.kX|.|.|.|.|.G.=.=.=.=.=.=.=.=. X|.|. XkX|. X|.gX>.=.=.=.=.=.=.=.=.G.|.].D.kX].|.oX=.=.=.=.=.=.=.=.=.K.|.|.D. X|.|.|.G.kXkXG.=.:.gX XkX|.|.|.|.|.|.].|.|.|.).].kXkX].].].gX|.'.G.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.G.|.|.|.hXkX|.kX|.|.].kX|.D.kX].q.G Y D R R G R G R D K G D H G D K D G G J G G G G G G G G G G G G J R G J G I G J J G J I G G J G G L G G G G I G G G R G G W G G J Y J G G R G G G G G G G G G J Y G J Y J G G G G G G G F G R v G G G H F G J J G G J G J G J G G K G G G H G H G H G G H H S F H H D V V V V V V m Z V z C z Z x z Z x Z V x l l l l l l x l l l x x Z x l l f l l m m V m S G Q Q Q I J H u.XX4X4X4X4X1X>X5X,X<X,X1X>X>X4X1X4X4X>X,X4X>X,X1X1X1X1X>X1X1X1X4X>X>X1X1X>X>X1X1X>X>X1X1X1X,X4X1X1X,X>X>X",
"K K B U K .X X X X XoX.XoX.XoX XoX.X X.X{. XoX X.X;.=.=.=.=.=.=.=.=.=.H. X X`.(.D.A.D.D.D.).D.D.C.D.C.C.m.=.=.=.=.V.D.D.S.S.S.C.[.K.-.=.=.=.=.=.=.=.V.S.D.A.D.D.D.D.D.G.=.=.=.=.=.=.=.=.;.).].)._.)._.).:.=.=.=.=.=.=.=.=.G._._.|.D.|.G.`.=.=.=.=.=.=.=.=.:.`._.|.|.D.G.=.=.=.=.=.=.=.=.=.G.].'.kXD.|.].].].G.=.=.=.=.=.=.=.=.:.|.|.|.]. XD.|. X_.=.=.=.=.=.=.=.-._.].].`.|. X|.|.|.:.=.=.=.=.=.=.=.=.G.|.|.|.|.|.].|.|.V.=.=.=.=.=.=.=.:. X|.|.|.|.kXD..XG.>.=.=.=.=.=.=.=.=.G.|.|.|.|.'.|.'.:.=.=.=.=.=.=.=.=.=.V.kX].|.|.|.|.].|.G.>.=. X`.'._. X X].|.kX|.|.]._.|.|.kX].].|.kX'.'.|. X;.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=. XhX|.hX'.'.'.|..X|.|.|.|.'.kX].@.A T T G G G G G D G G D G G G v G D T D G G G T G G G G G G G G G G Y G Y G G Y G Y G R G G G F G G F G G F G G G F G F G G G Y F F G G G G G G F G F G F G G G G G G G R G D G G D G G G G R D G G G v F G H G J H G G H J F G H F L G F P G G H F G G G H H S H F F D P V V V V m m Z V l x Z l V l z l l z Z l l Z f l l x l l l x x x l x x d Z m Z m V S S H W Q W I I J p.>XCX4X>X7X1X4X1X5X1X5X1X4X1X1X4X1X1X4X,X1X1X1X1X1X1X7X1X4X1X1X7X1X1X1X>X1X1X,X1X,X1X3X,X1X1X>X1X1X>X4X>X",
"6.q.6.U 6..XXXXXXXXXXXXX.XkXjXXXjXXXXXkXjXjXlXjXjX>.=.=.=.=.=.=.=.=.=.J. X X(.).C.C.D.D.).D.D.D.C.S.A.F.-.=.=.=.=.H.S.D.D.D.S.D.[.k.=.=.=.=.=.=.=.=.H.D.D.D.D.D.D.D.D.G.=.=.=.=.=.=.=.=.>.[.).).).].).].:.=.=.=.=.=.=.=.=.G._._.D.|.D.kX`.=.=.=.=.=.=.=.=.=.G._.D.|.D.>.=.=.=.=.=.=.=.=.=.oX'.'. X|.].|.|.|.V.=.=.=.=.=.=.=.=.;.G.|.|.|. XkX XD.G.=.=.=.=.=.=.=.J.].]. X_. X].|. X'.:.=.=.=.=.=.=.=.=.:.|.].|.|.].kX|.|.K.=.=.=.=.=.=.=.G.|.|.|.D.|.|.D.|.|.>.=.=.=.=.=.=.=.=.oX|.|.].|.|.|.|. X=.=.=.=.=.=.=.=.=.=.V.].'.|.|.|.|.D.>.=.V.|.|.|.|.|.].|.|.|.|.'.|.'.'.|.|.].|._.).|.'.].>.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.;. X'.'.'.hX|.|.|.|.|.|.'.'.|.|.|.q.G G G G G G G G R G R G R v Y Y G G G G G D G G Y F T G G G T Y F T G Y G G G Y G G Y G F G G G G G G L G Y L G G G G F G G G G G L Y G G F G F F F G G Y Y G F G G G K G K K R R K D R D R G H G G K G H H G G J G G G G G H G F L P H H G G H F H F P G F H S F H F S F V P Z V Z Z d f Z l l l l Z f l l x V l l l l f Z x x x x l x l x Z Z m Z d m Z V m S P W ! U U P M p.}.CX5X5X6X5X5X5X5X3X3X5X5X5X4X4X7X5X5X4X5X5X7X5X5X4X4X1X5X1X1X4X4X5X7X5X5X3X5X5X5X1X4X3X4X5X5X,X4X7X4X5X",
"N.N.N.B.B.vXvXnXnXnXbXnXnXnXnXnXnXnXnXnXVXVXVXVXCX=.=.=.=.=.=.=.=.=.=.>. X|.].).D.A.C.D.).D.D.D.D.D.H.=.=.=.=.=.=.H.D.D.D.D.S.S.[.:.=.=.=.=.=.=.=.=.K.)._.D.D.].D.D.D.V.=.=.=.=.=.=.=.=.;.).].).).).).).>.=.=.=.=.=.=.=.=.V._._.D.D.D.kX_.;.=.=.=.=.=.=.=.=.;.G.].G.;.:.:.=.=.=.=.=.=.=.=.K.].).D.|.|.].D.kXV.=.=.=.-.=.=.=.=.=.:.kX|.|.D.].|.kX:.=.=.=.=.=.=.>. X X|.|.].|.|.'.|.|.:.-.=.=.=.=.=.=.=.=.V.kX|..X|.|.|.G.-.=.=.=.=.=.-.J.kX'.|.|.kXkX X|.].kX-.=.=.=.=.=.=.=.=.G.|.|.|.|.|.|.'.'.J.-.=.=.=.=.=.=.=.=.=.:.G. X]. XJ.-.=.:. X|.|..X|.|.|.|.|.|.].|.|.kX'.kX|.|.kX|.].|.].:.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.:.|.'.|.|.|.|.|.|.gX'.|.gX.X].|.D.q.D G T G G G T G G G G G G G T G F G Y Y Y F G Y Y R Y Y T G Y Y G Y Y Y Y G F F F F G Y L L L L L T L F G F F L G F F G F G F G G G G G G G G G G G F F F G R I D R G G H D D G Y G G G G D G F G G R Y G S S G H H G H H H G G H F T F F G G G G P H H H H G H D H F F V F V F F C D C C C C C C C C A C C A V C C A D A C C C C C A D C V C C Z m Z m m m m V G I Q ! U I M i.3XCXCX5XCX6X5X5X5X7X5X5X5X5X5X5X5X5X5X5X5X5X5X4X5X5X5X5X5X4X5X4X5X5X4X5X5X5X4X4X5X1X4X4X,X1X5X5X5X4X4X3X",
"{.{.!.!.{.NXNXNXVXNXVXVXNXVXNXNXNXNXNXZXZXZXZXZXJ.=.=.=.=.=.=.=.=.=.=.=.>.G.'.[.D.C.S.D.D.D.F.G.K.-.=.=.=.=.=.=.=.G.D.D.D.D.D.S.D.-.=.=.=.=.=.=.=.=.>.).D.D.D.D.D.D.D.H.=.=.=.=.=.=.=.=.=.G.].).).).).G.=.=.=.=.=.=.=.=.=.K.].).|.|.D.D.].K.=.=.=.=.=.=.=.=.=.=.=.=.K.|.V.=.=.=.=.=.=.=.=.=.=.=.K.].].].kXG.G.=.=.=.=.=.=.=.=.:.-.:.D.gX|. X].G.=.=.=.=.=.=.-. X].].|. X X|.]. X'.'.:.=.=.=.=.=.=.=.=.:.=.J.D. X|.gXkXK.=.=.=.=.=.=.:.'.'.'.|.'. XD. X X].G.=.=.=.=.=.=.=.=.=.K.]. X|.'.'.|.|.|.).:.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.:.|.D. X'.|.|.|.|.|.].|._.|.'.].'.'.|.].].|.'.'.J.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.V..XgX'.'.'.|.|.|.|.|.|.|.|.kXD.kXq.G D D G F G G G D G G F G D F G G G T Y Y G G T T G Y Y T G G F Y G Y Y Y Y Y Y Y Y F G F F F F F L F L L T G F G G Y G Y G G F F F F F G F F F G G G G G G G Y R G K G R R K H Y T D F D T T T F G D G G G G G G H G G H G H G F F G F F H F G H S S S S D H S D S S D F V F V C F D D C D D C C C C C C C C C C Z C x V Z C C z Z z z C C D Z V V m Z Z m f M G I W / Q I M y.4XCXCX>X,X3X4X<X5X5X5X4X5X3X7X4X5X4X1X1X1X1X5X>X1X1X4X1X,X1X1X1X>X>X4X5X4XV.N.N.,X,X1X1X5X>X1X1X,X>X1X,X",
"{.}.{.}.^.NXZXZXZXZXZXNXNXNXZXZXZXZXDXZXZXDXCXJ.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.[.D.D.].D.D.G.;.-.=.=.=.=.=.=.=.=.=.:.G.[.D.D.D.G.K.-.=.=.=.=.=.=.=.=.=.;.G.S.).).G.;.=.=.=.=.=.=.=.=.=.=.H.G.D. XD.|.D.G.=.=.=.=.=.=.=.=.=.=.-.G.]. XD.-.=.=.=.=.=.=.=.=.=.:.'.'.'.].].'.V.=.=.=.=.=.=.=.=.:.G.-.;.V. X].G.-.=.=.=.=.-.;.G.'.]. X'.`.|.`.`.`.`.`.:.-.=.=.=.=.=.=.=.V.J.=.:.G.|. XJ.=.=.=.=.=.=.:.|.kX|.|.|.|.|.].|. XV.;.=.=.=.=.=.=.=.=.=.=.J._.'.'.|.|.|.|.].'.K.-.=.=.=.=.=.=.=.=.=.=.=.=.=.:.'.'.'.|.'.'.'.|.|.|.|.'.|.kX|.'.|.|.'.|.'.|.|.V.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.G.|.|.|.|.'.|.'.'.'.'.|.|.|.|.kX|.q.E E E E R E E E T Y Y R R Y Y Y Y Y Y Y Y Y E Y Y Y E Y G Y Y E Y W Y R E E E R W Y Y E R Y Y R Y G Y R L Y F L G G Y L L G R T L L T L Y L Y L L Y Y Y Y R G G G J G G G G Y T D D T _ E E E E E E E T T L T G G G G F F S S D F G D S F S D D S v S S S S S S S z z z V V V V Z Z l m x l f l l x l l Z x x x x x Z l l l x l d l l f Z f V Z f m m Z m m V P P W ! Q U I M 8.,X4X4X,X>X>X>X,X-X,X>X,X,X,X>X{.,X%X}.,X,X!.%X!.{.{.}.{.{.!.!.!.Q.!.!.Q.0.M 6.N.V.Q.!.!.B.Q.V.T.B.B.Q.B.",
"}.}.>X,X,XZXZXNXZXNXZXZXNXDXZXNXZXZXDX>.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.D.D.D.D.D.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.D.D.V.-.=.=.=.=.=.=.=.=.=.=.=.=.=.:._.:.=.=.=.=.=.=.=.=.=.=.=.=.=.=.V.D.].].D.gXG.=.=.=.=.=.=.=.-.:.D. X]. X].V.=.=.=.=.=.=.=.=.J.].'.].'.'.'.].V.=.=.=.=.=.=.=.=.:.|. X>.=.=.=.=.=.=.=.=.=.:. X'.|.|.'.'.'.'.'.'.`.'.'.:.=.=.=.=.=.=.=.=.G.kXG.;.=.=.=.=.=.=.=.=.=.V.'.'.].|.'.'.'.|.kXV.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.:.|.|.|.'.|.|.|. XG.;.=.=.=.=.=.=.=.=.=.=.;.G._.].|.'.`.'.'.'.'.'.'.|.'.'.].|.|.|.'.'.'.'.|.kX-.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=. X|.`.`.`.`.`.`.`.`.'.'.'.'.]. X`.k z z v v z v D v D v D D D v D v D z D v D v z v D z v z v z D D z v z z z v z v z D z S z v D S S z z z V m V z z l z z z z V v Z f f Z z V V l l V f l l f z v v z v v z v z x a i c c 9 c 7 7 a c Z c i 7 d d f l f f f f s f f f f f f f f s f f s s s f f f f s f p d s s d s s d s p d p a s a a i i p a i a s d d i p p s i a d d i s s s 4 s m m Z V H I I ^ ! ! W U J U b.N.N.B.N.n.n.N.N.b.N.v.v.g.n.s.v.v.s.v.v.b.n.v.n.s.s.i.v.s.i.s.v.b.s.U k y v.{.B.N.n.n.n.d.i.0.0.6.6.0.",
">X>X1X,X>XGXDXDXFXDXZXDXFXDXZXDXDXDXDXGXDXDXDXGXGXDXGXDXFXGXGXFX.X(..X|.|.|.`.).A.A.D.C.C.C.C.C.[.C.C.[.C.C.C.[.D.S.S.S.S.C.C.C.C.C.C.C.C.C.S.C.C.C.S.D.D.S.D.A.D.C.S.S.D.A.C.A.D.D.A.D.D.D.[.D.A.D.D.D.D.D.D.D.D.(.[.).(.).).(.D.D.G.D.D.D.D.G.K.-.-.=.;.K.(.(.D.D. XD.D.D.G.:.-.=.=.-.K.m.).(.).(.).).)._.V.=.=.=.=.=.=.=.=.:.D.).A.G.:.;.=.=.-.;.H.G.[.(.).).D.).).(.(.(.).[.).).:.=.=.=.=.=.=.=.=.H.C.D.D.V.>.-.=.=.-.:.H.(.).(.D.(.(.).).).D.D.(.).).).).).).).(.).).).).(.).(.).).).(.).).[.(.).(.`.B.:.;.-.=.=.=.;.K.m.(.(.[.[.[.[.(.(.).).).D.(.D._.)._.).)._.).).).(.).).).).).(.).).[.).).(.).).).(.).).).(.).).D.).).).).D.).(.(.).(.[.).).(.(.[.[.(.D.D.D.b f d d g g d d f d f d f d s f d f p s s d p s f f s d s s s d d s d s f d d d d f s f d d d f s s s s f s f s s s f d f s p s s s s s p p p p p s s s f s s p d p d p s p d d 7 , # , > - - > - , 7 d 7 , # > 4 p s d p i e e p s s p s s s p p p r p r g p p a i r s a i i s p i i i i i i p a i i i w i i s i i i s i i i i i i i a i i s s i s d m V P L Q ^ / / ! ! ! I U Q 8.U U 8.6.N N 6.6.q.8.6.6.6.6.6.6.6.U q.q.6.U U q.U B K U U U 0.0.6.K j j 8.Q.}.Q.B.N.V.N.N.s.0.6.U U N ",
">X1X4X1X4XDXGXDXDXGXGXGXGXGXGXGXGXGXDXGXGXGXGXGXGXGXGXGXGXGXGXNX.X`. X.X.X X`._.).D.D.C.C.C.C.Z.Z.Z.Z.Z.Z.C.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.C.Z.Z.Z.Z.Z.Z.Z.C.C.C.C.C.Z.S.Z.C.Z.C.D.C.C.C.Z.C.C.C.C.C.A.C.A.C.C.C.A.C.C.C.C.A.D.C.D.D.D.C.A.A.A.A.(.(.Z.Z.[.C.(.[.A.D.A.A.D.A.D.F.D.D.S.D.(.[.C.D.D.C.C.(.).).H.=.=.=.=.=.=.=.=.:.A.C.D.C.C.C.A.D.A.D.A.(.(.(.[.(.D.C.A.D.D.C.).(.(.C.:.=.=.=.=.=.=.=.=.V.C.C.A.A.C.S.C.).S.[.(.A.A.A.D.D.A.D.A.).A.A.A.D.A.).A.A.).A.).C.(.).A.).C.).(.).(.Z.A.(.).).).).).(.[.[.D.D.D.D.D.).[.(.[.(.(.).(.C.[.).).[.D.).D.D.D.D.A.D.(.).(.(.(.D.(.A.D.).(.).).(.).[.).).).).D.).).).).D.).).A.).A.D.).D.).).(.).).).).(.(.(.(.).].].D.h f x f f f f l f f f f f f l f f f l l f x f l f f l x f f z f f f f x l f f f f f s f f f f f f f f f l f f l f f f l f f f f f f f f f f f f f f f f z f f f f f f f f f l l i > , 1 1 * , * * 1 c A c , # > c l l f l l f f f f l f f z f f f f f f z f f f f f f d f f f s d f f d s s p d d d d d f s d s d d d f l f l l d d d d f d s s s d m Z P F L / / / ! I I P U I ! y.8.6.6.6.B U K K B ,.N U K K K K B U U K U K ,.U U U 6.q.U 6.6.q.I K M M b.{.!.Q.Q.N.B.B.N.B.N.b.s.0.8.",
"1X4X5X4X5XGXGXGXGXGXGXGXGXGXDXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXFX.X X.X.X.X|.|._.(.A.D.A.C.C.Z.Z.Z.Z.Z.Z.Z.C.Z.C.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.C.C.Z.C.C.C.C.Z.C.Z.C.C.C.C.C.C.C.A.A.A.C.C.C.D.A.D.D.C.A.A.[.(.Z.(.[.Z.(.C.C.).C.A.C.).(.C.D.D.D.D.C.).).).(.A.A.D.(.(.(.).(.(.).).).).[.[.(.(.(.(.[.(.(.[.(.).(.).D.D.V.=.=.=.=.=.=.=.=.:.).).(.(.).).).).).).(.[.[.(.).).).).(.[.(.(.).[.).).:.=.=.=.=.=.=.=.=.V.(.(.[.[.).(.(.[.(.).).[.(.)._.(.(.(.).(.).(.(.).).).).(.(.).).(.).`.`.).).(.).(.).(.).).(._.).).`.).[.`.).).).[.).).).[.).(.`.).).).`.)._._.)._.]._.).)._.)._._._.`.(.(.).`.`.`.).).].).).).].).].)._.].`.)._.)._._._.)._.)._._.`.).`.`.).`.).`.).`.`.).)._._.k z V V f f f m z f z f j z z v x z z v z z v z z z f z z v z z j l f z z v z z z v z v z z j v z v v v z z j S z f z V f z f S S S M v z S j m m z f M f f m V f V V m S V A C d > # , > - > - # , c A c , . > c x z v V f f l m V m V f V m V f m f f f z j f f f m m m m f f f V f V f z f V z f f f z f l f l f z l f f f l m f l x x l l m Z S F F F P L W ! 8.Q J I U Q K 0.{.{.Q.T.N.T.Q.h.n.h.n.s.d.s.y.0.6.8.6.8.6.8.y.6.y.y.0.0.6.6.q.0.U 6.6.U M s.oXQ.Q.Q.Q.Q.m.T.T.T.Q.n.n.i.",
">X,X>X,X,XDXZXDXDXDXDXDXZXDXZXZXZXZXDXDXZXZXDXDXDXDXDXDXZXGXGXNX.X X.X.X.X|.|. X_.A.A.D.).).C.C.Z.(.[.Z.C.C.C.C.C.C.D.C.).C.C.C.C.C.A.D.D.C.C.C.A.D.D.D.A.A.A.D.D.D.D.D.D.D.D.D.D.A.D.A.D.A.A.A.(.(.(.(.(.(.(.(.(.).).(.).).).(.(.(.(.).(.(.(.).).).)._.)._.)._.].`.(.).`.(.(.`.).).[.`.(.(.`.`.).(.(._.oXA.V.=.=.=.=.=.=.=.-.:._._.]._.)._._.]._._.).).`.).).(.`.).).`.`.`.`.`._.].:.=.=.=.=.=.=.=.=.V.`.`.`.`.`.(.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.(.).`.`.`.`.|.].].`.`.`.`.`.].`.`.`.'.|.|.`.`.`.`.`.`.`.`.`.).`.`.`.`._._.`.`. X_.].)._. X`.'.`.`.`. X`.'.`.`.`.`.'.`.`.`.`.].`.`.`.'.`.].`.|.`.`.'.`. X'.'.'.|.`.`. X|.`.|.'.|.`.`.`. X X X@.H D H S H H S H H S G F G D v v H D D v S G D v S S H H F H v D G H K J G v F H H H G v H F H H D H G G J G G H J H H H H G G J H G D G G G G H H J G H H L H H H G H G L L E z 4 , , < , , < > , x _ A i 2 4 x G Y J G H M H G L G L G F L G G H H G I H L L H G H H H H G G G G J H G J L G G G G G G G H G J J H G L P T F F Y G T G F Y E R L W W Q L W ! ! Q R I I I U K 9.,X4X1X>X>X^.>X,X}.,X}.}.^.{.!.Q.B.B.n.N.Q.T.B.B.Q.Q.V.b.8.8.s.s.8.y.8.K U N.^.oXT.T.T.Q.Q.T.m.Q.Q.T.T.n.",
",X%X{.%X,XVXBXVXZXZXZXZXZXNXZXZXVXNXVXNXCXZXVXZXZXZXVXVXVXNXNXzXXX X.X.X|..X|.|.D. XD.A.(.(.A.(.(.Z.(.(.C.(.(.C.D.D.C.).(.(.[.).D.A.A.D.D.D.[.).D.D.).(.A.).).).).D.D.G.D. X_.D.D.D.G.D.)._._._.(.`.`.`.).).(.`._._._.`.'.'.'.`._. X].`.`.`.`.`. X X_.`.`.`.|.'.`. X|.|.`.`..X`.`.|.|.`.`.`.`.`.`.`.`. X X XV.=.=.=.=.=.=.=.=.:.`.`.'.'.'..X'.'.'. X X.X.X|.|.|.`.`.`.`.`.`.`..X X Xl.=.=.=.=.=.=.=.=.V.`..X`..X|.|.|.|..X X|.|.|..X.X|..X|..X X|.|..X|.|..X X X.X`.|.hX|.|.|.|..X.X.X.X.X.X.X.X.X|..X.X.X.X|.|..X.X|..X.X.X|..X|..X|.|..X'..X.XhX|..XhX.X.X.XhX.X.X.X.XhX.X.X.XhX.X.XhX.X.X.X.X.X.XhX.X.X.XhXhX.X.X.XhX.XhXhXhX.XhX.XjXhXjXhXhXhX.XhX.X.X.X.XOXkXhXkXq.! ! Q Q ! ! ! ! ! ! ! ! Q 8.8.8.8.8.9.0.0.9.8.8.8.8.8.Q 8.8.8.8.! 8.! 8.9.8.8.8.8.8.8.8.8.8.8.9.8.8.8.Q 8.! / / 8.u.u.p.u.u.9.! / ! / / 8.u.! p.u.u.y.p.y.f./ p.p.! p.u./ p.c.u.^ L ^ ` _ ^ ^ E ^ c.n.c.~ E ~ z.u.c.u.u.u.u.u.u.u.9.9.u.u.u.p.u./ ! 8./ u.6./ / u./ / 8./ ! Q 8.! ! ! ! ! / ! ! ~ ~ ! 8./ ~ ! / 8.! ! / ^ ^ ~ ~ ~ ^ _ R ~ / u.^ ^ / 9.9.! ! 8.! 8.Q Q Q U K K 8.b.B.}.4X>X}.>X}.>X}.{.}.}.!.!.!.{.!.!.!.!.!.Q.~.^.{.T.N.0.0.e.s.y.i.8.U 6.Q.}.Q.Q.Q.Q.T.Q.T.n.Q.Q.T.Q.T.",
"V.b.N.H.g.lXlXjXlXjXlXlXjXjXlXlXjXlXjXjXlXlXjXlXjXjXjXlXjXlXjXjX.X.X.X.XhXhXhXhXhX.X|. X|.|.(.(.`.(.'.(.(.`._._.`._.`.`.`.`.`.]._._._.`.|.|.|.]. X|.'. X X|.|.|. X|.|.kX|.hX X.X.X XkX|..X X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XhXhXjX.XhX.XhXhXhX.XhX.XOXhX.XXX.X.XjX.XOXhX.XXXhXXX.XjXjXG.=.=.=.=.=.=.=.=.l.jXhXjXkXjXhXjXhXhXhXjXhXhXhXlXhXhXOXjXjX.XOXjX.XjX.X:.=.=.=.=.=.=.=.-.{..XOXjXjXjXXXjXjXXXhXjXhXjX.XjXjXjX.XjXhXjXXXhXjXXX.XlXXXjXhXjXhXOXjXXXjXhXhXjXjXjXjXhXhXjXjXhXlXhXXXjXjXjXjXjXjXjXOXlXhXjXjXjXjXjXjXjXOXjXjXjXkXjXjXjXjXjXjXjXhXjXjXjXjXjXjXjXjXlXjXjXjXjXlXjXjXlXlXjXjXlXlXlXhXlXlXlXhXjXlXjXjXhXlXlXjXlXlXlXjXlXjXjXjXjXjXjXk.i.u.i.i.p.u.u.p.i.i.i.z.z.u.i.z.i.i.i.z.i.0.v.i.b.z.z.z.z.z.z.i.z.x.x.z.z.i.z.z.z.z.u.i.i.z.0.z.z.i.z.z.i.i.p.c.i.x.p.c.x.x.x.c.c.u.c.p.u.p.p.p.p.p.i.p.i.p.p.p.p.p.p.p.p.p.i.i.p.c.x.x.c.x.M.n.c.u.u.u.9.z.c.x.p.u.p.p.u.p.i.p.i.u.! u.u.u.p.p.u.u.u.p.u./ u.p.p.u.p.u.u.i.9.u.u.i.p.u.u.u.c.u.u.u.u.u.u.u.u./ u.9.u.~ ^ ~ ~ ~ ~ c.9.9.u.c.9.9.! u.z.i.i.9.i.u.9.9.9.9.8.Q 9.v y t u H 8.B.^.^.!.!.}.}.!.!.oX!.!.!.Q.B.Q.Q.B.Q.!.^.!.Q.h.H.b.v.s.s.8.U i.!.}.Q.T.T.Q.Q.Q.Q.T.T.T.T.T.(.",
",.6.q.U 6..X.XXX.X.X X.X X.X{. X.X.XG.jX.X{. X.X{..X.X{..X.XXX.X.XXXjXhXkXjXjXkX.X.X.XhX.X.X.X'.`. X X.XoX.X.X.X X|..X.X.X.X.X.X.X.X|..X.X.X|.|.|.|..X|.'..XhX.XhX.X.XXXhXhX.XhX.X.X.X.X.X.XXX.X.X.XOX.XXX.X.XjXjXhX.XhXjX.X.XhXhXhXjXjXlXjXhXhXhXhXhXjXjXjXhXhXjXjXjXhX.XjXOX.XjX.XjXjXjXjXjXjXjXXXjXjXjX.XJ.-.=.=.=.=.=.=.=.K.jXjXjXjXjXkXjXjXjXjXjXhXjXjXhXlXjXOXhXzXjXjXjXhXjXhXl.-.=.=.=.=.=.=.=.G..XlXOXjXjXjXjXjXXXjXjXjXlXjXhXlXhXlXjXjXjXjXlXjXjXjXjXjXlXjXjXjXjXjXjXOXjXjXlXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXlXjXzXjXjXjXjXjXjXzXjXjXjXjXkXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXzXlXhXlXjXlXjXjXlXlXlXlXlXlXlXlXlXjXlXlXjXlXlXjXlXjXzXlXlXlXlXlXk.v.i.i.x.x.p.p.x.x.i.x.x.z.z.z.b.b.b.H.z.v.z.b.z.v.b.b.b.b.b.b.x.v.v.b.b.b.b.n.n.M.n.M.n.b.n.n.b.b.b.b.M.n.v.n.b.M.x.x.M.M.x.c.x.x.M.x.b.x.c.x.v.i.v.v.x.b.x.x.c.x.c.c.c.i.p.u.c.v.x.c.u.p.x.n.b.c.i.b.M.x.c.x.i.c.c.p.x.x.x.b.z.z.z.u.c.c.c.c.p.c.i.c.u.x.M.x.x.c.c.c.c.c.c.c.c.c.M.M.c.c.` c.` ` ` ` ` ` ^ ` ` ` ` ` ` ` _ ! ~ R ~ 9.0.9.0.8.9.9.0.9.8.8.6.8.U K K Q U K K 8.J p 2 , u y.!.,X,X!.B.!.+X!.!.+X!.E.!.E.N.N.T.N.N.!.!.!.!.!.V.N.N.n.n.0.Q T.}.oXQ.Q.Q.Q.Q.Q.T.n.Q.Q.T.Q.T.",
"N ,.K K K .X{..X.X X{..XkX,XkXXX.XXX.X.XXXkXXX.XkX.X.X.XXX.X.X.X.X.X.XjXjXXX.XjX.X.X.XXXhX.X.X X X.X X X.X.X X.X.X.X.X|..X|.|..XhXhXkXhX.X.XhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXjXhXhX.X.XhX.XjX.XOX.XjXjX.XjXXXjXjXjXjXhXjXjXjXjXjXjXjXhXjXjXjXjXjXkXjXhXlXlXjXjXhXhXlXzXOXhXzXjXjXjXjXlXjXjXjXjXjXjXlXjXzXG.=.=.=.=.=.=.=.=.l.jXjXzXjXzXzXjXkXjXzXlXlXzXjXlXjXzXlXzXjXlXjXjXzXlXlXl.=.=.=.=.=.=.=.-.J.lXlXzXhXjXlXlXjXlXjXjXjXjXjXlXlXjXlXlXlXlXjXjXlXjXzXjXjXjXOXjXjXjXzXjXjXlXjXjXjXjXjXzXOXjXjXjXjXlXOXjXjXjXjXjXlXjXlXlXjXjXjXjXjXjXjXjXjXjXjXzXjXjXjXjXlXjXzXjXjXjXlXjXzXzXOXjXjXjXjXzXlXjXjXjXjXjXlXlXjXjXjXjXjXjXlXhXlXjXjXlXXXjXhXjXXXjXhXjX.XjXjXjXhXhXlXhX7.u.u.u.i.u.u.u./ p.p.u.u.z.c.u.9.9.z.u.9.u.z.9.9.~ 9.9.~ ~ ~ ~ ^ ~ _ ~ _ ~ ` ` _ _ ` ^ / ^ _ _ ~ _ ~ ^ _ _ ~ ^ _ ` _ / ^ ` ^ _ / ` / ^ ^ ` / / / ^ ^ ^ W E E ^ ^ W W I L ^ W P W ^ L G H L E I H D F Y D C Z P V S H F G L P G G D D D D D H F P C V V V V C V f f f d d f s a a a d d d a a 7 a a 7 7 7 7 7 7 7 a a l z C T Y D v f f f j f k f j u y y y u j k j K K M y u j j v 9.G.vXCXZX5X7X,X%X,X+XT.B.E.V.B.N.B.!.Q.Q.T.Q.E.N.B.V.T.!.Q.N.N.B.y.6.Q.OX}.Q.T.T.n.Q.Q.T.Q.Q.Q.T.Q.T.",
"U q.6.8.q..XXXkXXX.XkXXXG.jXkXkXXXXXXXXXXX.XXXXXXXjXkXXXXXXXXX.X.X.XXXjXjX.X X.X.X.X.X.X.X.X X X_. X X X X X X`.|.'.|.|.'.|.hXkXhXkXkX'.kXgX].hXkXhXkXkXkXkXkXkXkXhXkXhXkXhXkX.XhXhXhXhXhX.XhX.X X.X.X X.X.X.X.X.X.XhX.XhX.XhX.XhX.XhX|..X.X.X.XhXhXhXhXhXhX.X.XhXhXhXhX.X.XhX.XhX.XhXhX.X.X.X XhXhXhXhXhXhX{.=.=.=.=.=.=.=.=.K.hXhXhXkXkXkXkXkXhXhXgX|.hX|.hX'.`..X'.'..X|.|..X.X.XK.=.=.=.=.=.=.=.-.G..X.X.X.X|..X|.hX.X.X|.|.|.|.|.|.|.|.|. X'.|.`. X X`.|.|.`.`.|.|.'.hX`..X|.`.`.`.'.|.|.`.`.`.'.'.`.|.|.`.'.`.'.'.`.`.|.|.'.'.`.`.`..X`.`.]. X'._.].'.'.'.|.|._. X_.`.].].(.`.`.`.`.[.`.`.(.).].].(._.).(._.).[.].).(._.].[.).).).).(.(.(.).).(.(.(.(.(.).(.(.).k f s s s d f f m Z m s f f a f d d d s d f d a a e e 7 4 < < < < < , , , , # > # > # # > - * > - - - # > - # # - - = , , = * , , = 8 , 8 8 7 7 7 d 7 7 7 d d 7 a i a a 7 7 s 4 i 7 < < < 5 < > 2 < < , > , , , , 5 8 7 4 d 7 i i a w w a 7 e 7 4 5 8 8 , , , , = , > > # # # . o . . . . . . . . . . . . . . . . . . # # , 4 a p g g g y q t q q 2 q q y K 6.i.s.s.s.s.K y u u u K b.,X,X!.V.N.+X+XV.+Xh.V.j.h.V.h.j.V.N.G.!.,X!.B.B.T.T.N.!.T.T.n.T.n.x.OX}.oX/.T.M.Q.Q.T.T.T.T.T.Q.T.(.",
"0.0.0.0.0.XXkX,XkXXXjXjXjXjXjX,XXXjXjXXXjXXX,XkXXXXXjX,XjXjXXXXXoXG.A.(.(.G.G.G.oXA.A.(.A.A.G.(.(.(.oX(.(.(.`. X.XkXzXjXhXD.{ [ [ { [ [ [ [ { { [ { [ [ F.[ [ [ [ [ [ [ { [ Z.{ { { Z.Z.Z.C.C.C.(.[ (.[.[.Z.Z.Z.F.Z.Z.{ Z.{ Z.{ { Z.Z.{ { Z.Z.Z.{ Z.C.S.Z.(.[.[.[.(.).(.[.[.[.Z.[.Z.{ { { { { Y.{ { } [ } [ H.=.=.=.=.=.=.=.=.:.' [ ' [ [ ' [ ] ] ] [ [ ' [ [ [ [ [ ] } [ { { { Z.{ :.=.=.=.=.=.=.=.=.H.Z.Z.{ { S.Z.Z.Z.Z.Z.[.(.S.C.C.C.C.C.[.C.(.[.Z.(.[.(.[.[.(.(.[.(.[.[.[.(.[.(.(.(.[.[.(.(.(.(.[.).(.[.(.(.[.(.(.[.(.[.(.(.).[.[.(.(.(.[.[.(.D.(.(.D.).(.Y.D.A.).(.(.(.D.).(.[.(.(.[.[.).[.(.[.(.[.[.(.(.[.(.(.C.[.(.Z.[.Y.C.(.A.Z.[.(.[.(.[.(.(.(.[.Z.(.[.C.Z.C.b e e i w i e 7 4 4 4 7 4 a w w a w w w 4 < 4 < < 8 5 < 5 8 , , , , , , - > - - - # # # . . . . . . . . . . . . . . . . X . X X % - - - = = = 6 6 6 6 7 7 7 9 7 9 7 7 7 7 7 7 7 7 4 8 7 7 8 8 6 1 8 6 7 6 7 7 6 7 7 7 7 7 7 7 7 a 7 7 7 4 7 7 7 7 7 8 < 8 8 8 , 1 1 6 8 1 1 1 ; * 1 ; % # @ - X # # @ @ # X # - & * > - > , < 4 p f v f y y < q j U y.n.B.N.g.v.s.h.s.6.N j j j u j j U 7.e.k.k.k.j.k.k.k.j.j.k.k.k.k.7.k.e.h.V.,X+X!.R.V.N.R.!.E.N.d.N.}.}.Q.Q.Q.T.Q.T.T.(.T.T.(.T.Q.T.",
"y.s.s.i.s.lXlXlXlXlXlXlXjXlXjXlX7XkXjXkXlXlXlXjXlXvX,XzXjX7XzXkX,XlX,XlXlXlXCXvXlXzXlXZXzXCXzXVXbXvXnXvXzXnXFXNXFXzXgXF.{ ] ' ' ' ' ' ' ' ' ' ' ' ' ' ' ] ' ' ' ' ] ' ] [ ] [ ] [ ' ] [ ` [ { [ ` { { { [ M.{ F.{ [ [ [ { [ [ ] [ [ [ [ [ { { { { { { Z.Z.Z.[.Z.Z.{ { { { [ [ { [ [ ] ` ] ] ] ] ' ' ' ] ' ] H.=.=.=.=.=.=.=.=.*.' ' ] ' ] ' ' ] ] ' ] [ [ ] ] [ [ [ [ [ [ { [ { [ { :.=.=.=.=.=.=.=.=.H.F.Z.Z.Z.Z.Z.Z.{ Z.(.Z.Z.Z.C.(.[.Y.(.(.[.[.(.(.[.(.(.[.(.(.(.Y.(.).(.).(.(.[.[.`.).`.[.`.).).[.`.`.`.).).[.`.).).).).).`.`.).`.).`.[.`.[.).`.[.(.`.[.(.`._._._.`.`.`.`.].].[.`.`.[.`.`.[.`.).].).).).).`.[.`.`.[.`.`.`.`.`.[.`.[.`.[.`.[.(.(.).[.).(.[.).).).D.k l d f d s p d d d p p a a a a a a a a a a a a a w 7 7 7 7 7 7 8 7 4 6 6 6 6 6 1 6 1 1 = , * * * % - - @ # X # X X X . . . . X X . . . . % X X # @ @ * * = 1 6 6 6 9 7 9 7 9 c 9 7 9 7 7 7 6 7 7 7 1 6 6 7 7 7 c c 9 a d c d 7 7 7 c 7 c d a d 7 7 7 < 1 8 1 , 8 1 1 , 6 8 6 8 , 8 6 6 = 6 c A A A | T A A A A A A A A A A C Z V S M g t y j B 0.N.B.n.s.s.a.f.6.f.s.f.6.M u u M u u k k N N ,.<.7.<.5.7.t.<.3.3.<.1.O.<.1.@.@.<.<.4.g.j.j.h.h.E.h.j.j.E.>X>XQ.Q.!.Q.Q.T./.T.Q.T.Q.M.T.Q.",
"T.Q.!.Q.B.VXnXVXZXZXCXCXCXZXCXZXZXZXZX7XCXCXZXVXZXCXZXCXZXZXZXZXZXZXZXDXZXZXZXZXZXGXZXGXZXZXZXZXHXDXGXGXGXGXFXzX'.Z.] ' ' ' ] ] ] ' ] ' ' ] ] ] ] ] ] ] ] ] ] ] ] [ { { [ [ [ { { [ [ [ { { { { { { { Z.{ { { { { { { { { { { { [ [ { { { { Z.C.S.[.[.Z.Z.{ { { { { { { [ [ ] [ [ ] ] ] ] ] ' ] ] ] ' ' ' ' &.=.=.=.=.=.=.=.=.-._ ' ] [ [ [ [ [ [ { [ } { { { { Y.{ { { { Z.[.{ { F.=.=.=.=.=.=.=.=.=.:.C.Z.C.(.[.C.[.(.(.[.(.[.[.(.[.).(.(.[.(.[.(.).).(.[.`.(.`.[.`.].[.].[.`.(.`.`.[.`.`.`.[.`.`.`.`.`.[.`.`.).`.`.`.(.`.).[.).`.`.`.`.[.`.`.`.`.`.`.[.`.`.`._.].`.`.'.'.`.`.`.].[.`.`.`.'.`.`.`.'.`.`.`.`.`.`.`.'.`.`.'.'.`.`.`.`.`.`.`.`.[.).`.[.`.`.`.).`._.]._.k z z l l l x x f f f x f f c d p d p a a a p a a a a a a i i 7 i 7 7 7 7 7 7 6 6 6 6 6 6 1 6 1 1 1 = = , - - - - & - # X X X # X X X X . . . . . . . X o $ O - & * 1 1 1 6 7 7 9 7 7 9 7 6 6 7 6 , 6 ; 1 , 1 6 7 7 7 d 9 a a 9 a 9 9 9 7 c c 7 1 1 , 8 1 , 1 < 1 1 1 1 8 1 = 8 8 8 6 c A A T T T T T T A T T F T E E F F F P S f j 8.n.T.Q.N.s.y.f.f.6.6.6.6.f.f.6.B k u k k M k u k k k ,.<.7.7.5.5.3.3.5.1.1.O.1.<.1.O.o...o.@.4.3.<.5.5.<.<.7.V.1X}.T.!.Q.Q.T.Q.Q.Q.T.Q.T.Q.T.Q.",
">X>X,X<X,XZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXCXCXCXCXCXZXCXCXZXZXZXZXZXZXZXZXGXHXGXGXGXGXGXGXFXGXGXGXGXGXGXAXgX[ [ [ { { Z.{ S.{ Z.{ S.{ { { Z.S.{ [.{ { [ { { [ { { } [ [ [ [ } [ [ ] [ { { [.{ { { { { { { { { { { { [ { } { [ [ [ { { { { { { { { { { } { { { { [ ] ] ] ] ' ] ' ' ' ' ' ' ' ' ' ] ' ' _ K.=.=.=.=.=.=.=.=.=.=.;.F.{ { { { { { { { { { { { { [.{ { { { { Z.{ Z.M.;.=.-.=.=.=.=.=.=.=.=.:.Z.C.[.C.(.C.(.[.(.[.[.(.).).).)._.`.).(.`.`.`.`.`.`.[.`.`.[.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.'.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.[.`.`.`.].].`.[.`.[.`.`.`.`.`.`.].`.`.`.'.`.`.`.`.`.'.`.'.[.`.[.'.`.`.`.`.`.`.`.'.'.`.`.`.'.`.`.`.`.].].D.q.v z v z v z z f x x x x x c x c x d d d d a d d a a d a a i a i 7 7 i 7 i 7 7 7 7 7 7 7 7 7 8 7 8 8 6 8 8 = 1 , = 8 = % * - - - X - - X X X X X . + o X . . o . . X + + O & ; ; ; 6 6 9 9 7 9 9 9 9 6 1 , > - - - * , 1 6 7 7 c 7 7 d 7 9 7 9 7 1 , 1 1 6 1 6 1 8 1 6 8 8 = , 8 8 6 7 d Z Z Z F C V V V A D V V P Z V F F P V M ! n.m.n.s.s.6.6.f.f.f.6.U ,.6.6.B B B k u u u j M j m u u M k B <.<.5.t.5.j.3.3.1.1.$.1.1.4.<.1.1.1.3.<.1.<.4.1.7.+X2X-XN.B.T.Q.T.Q.T.Q.Q.T.T.T.Q.Q.",
"2X7X<X,X7XGXZXGXGXZXGXZXZXZXCXCXCXzXCXvXCX7XCXvXvXvX7XvX7XCXvXvXCXCXCXZXZXZXZXZXZXZXZXZXZXGXFXZXDXZXFXZXnX XZ.F.[.].).[._.[.[.[.[.[.[.gX[.gXS.S.[.[.gXS.F.{ { } { ] { ] [ [ ] { [ [ ] [ [ { { { { { { { { { { { { [ ] [ ] [ [ ] ] { [ } } { } { [ [ } ] [ ] ' ' ' ] ' ] ' ] ' ' ] ' ' ' ' ' ] ' ' ] ] *.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.F.{ { { { [.Z.{ { Z.{ [.C.{ S.Z.Z.S.M.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.:.[.(.[.[.(.[.(.(.).).(.).)._.).`.).).`.).`.[.`.`.`.`.`.`.).).).`.[.`.`.`.`.[.`.`.`.`.[.`.`.).`.[.[.`.`.[.`.).`.`.`.`.`.[.`.`.`.[.`.`.[.`.`.`.`.`.`.).].].`.`.`.`.`.`.`.`.].`.'.`.`.`.`.`.].].`.`.'.'.'.`.`.`.'.'.`.`.`.`.[.`.].].`.`.`.].`.'.'.'.'.|.D.k x z z z z z x v x x x x x f f x x x d x d x c d d d d d d d i i i d i 7 s 7 d i d 7 7 7 4 7 7 7 7 7 7 7 8 7 7 6 8 6 8 8 8 , = , > - * = - - # - - O O X + + X O $ O $ o . X o . . @ @ * * , 1 6 6 9 9 9 9 7 7 7 6 1 , - - 1 1 1 1 6 7 6 7 7 7 1 1 1 6 6 6 7 6 1 1 8 8 8 1 8 6 7 < 5 7 Z C V P F V F S D H D m Z Z V V V m m M I c.p./ 6.8.y.f.6.B U B B B B B B M M u j k k k u u k M N k k N k N ,.<.<.k.4.3.1.4.1.#.1.4.1.1.O.1.3.<.3.5.<.<.k.-X1X,XN.!.T.Q.Q.T.Q.T.Q.Q.Q.Q.T.Q.",
"+XV.+XV.V.CXCXvXbXvXvXCX7XCXvX,X,X7X,XkX,X,X{.,X,X,X,X,X,XjX,X,X4XXX,X,XG.kX,XkX7XkXG.kXkXG.kXG.].F.F.F.{ Z.D.D.[.[.C.(.[.Z.S.S.[.S.[.[.S.[.S.S.[.[.[.Z.{ [ { { [ { [ [ { [ } [ [ [ ] [ [ { { { { { { { { { [ [ ] ] ] ] ] [ } } { { { { { } [ ] ] ] ] ' ' ' ' ] ] ] ' ] ' ' ' [ ] ] ' ] [ ] [ ] ] ] ] [ } { { } } { { { { { { { { { Z.{ { { { { Z.{ Z.{ Z.{ [.{ { [.Z.[.S.S.Z.S.S.{ [.(.[.(.Z.[.Z.(.[.(.[.[.(.[.(.[.(.[.[.(.(.[.).[.).).(.(.).).).`.[.).).).`.).`.[.(.`.`.).`.).`.`.[.`.`.`.).`.`.`.`.`.`.`.[.`.`.`.].].].).].].[.`.`.).`.).`.`.`.[.`.`.`.[.`.`.].[.].`.].`.`.`.[.'.`.`.`.'.'.`.'.'.`.`.].].].].'.'.'.`.'.'.'.'.`.`.`.`.].`.].].].].].'.'.'.].'.].].F.v x z D z z C z z x x z x l l d x d f c f f d c d d l c d d d a d i d d i i i i a a 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 7 8 8 6 6 6 1 8 1 1 = = * ; * & ; @ @ @ @ + O . . . . X . + O X % o . O * ; 1 6 6 6 9 9 9 7 6 6 6 1 , - = ; 1 1 1 , * , , 1 1 1 1 6 6 8 8 1 8 6 8 7 6 < , 5 d Z F E ^ ` ` / ` c.c.` ^ ^ E E F S S f S I ! 8.8.U B B M B B B B M N M k B N u u y u u u u u m m m M u k y k k h <.<.4.5.1.3.1.O.+.O.+.1.o.1.<.<.5.<.<.j.&X%XV.T.Q.T.Q.T.Q.T.T.T.T.T.m.T.T.",
"<.<.<.<.<.{.,XG.{.{.G.G.G.G.G.,XG.G.J.G.,XV.G.,XG.,XG.G.J.G.J.G.J.,XG.G.G.,XG.G.G.G.F.G.F.F.F.] F.[ ] [ { C.D.D.Z.[.[.[.[.[.S.[.S.S.S.[.S.S.S.S.C.[.[.Z.{ { { { { { { [ ] [ [ [ [ ] [ [ { { S.{ { [ [ [ [ ] ] ] [ [ { [ { } [ { ] } ' ] ] ' ' ' ] ' ' ' ] ' ] ' ' ' ] ' ] ] ] ] ] ] ] [ [ ] { } { { { { { { { Z.{ { S.{ Z.S.{ Z.{ S.S.{ Z.Z.Z.Z.{ Z.{ [.{ { { Z.Z.{ Z.{ { Z.Z.{ Z.Z.[.[.[.{ [.(.[.Z.[.{ [.Z.(.Z.Z.[.[.(.(.[.[.(.).).).).[.(.).).).).`.).[.`.).).).).`.[.[.).).`.[.`.[.`.).`.`.[.[.).).).[.`.[.`.).].].].).].).].[.`.`.).`.`.`.`.[.`.[.`.[.`.[.`.).`.`.[.`.[.`.`.`.[.[.`.[.].].].'.[.].].`.`.].].].`.].].`.[.`.[.[.'.'.[.].'.].].].].].].].].`.gX].].H.V A z z z v z z x x x x f f l x x x f x c c f f d d a f d d d d i i d d d d i a d a d d d 7 d 7 7 7 d i 7 7 7 7 7 d 7 7 7 7 7 7 7 7 7 7 6 6 6 1 8 1 , = , 1 ; = * * * * @ * & @ - O + X X + . X . . . + # + . @ @ - , = 6 6 9 9 7 9 9 7 6 1 , * - X # - * * , , 1 1 1 8 1 6 1 < 6 < 6 8 7 d A P A E E E E E E E W / ` ` / ` ` ~ E W ~ ~ 6.U K B 6.B B B B B B B U B U 6.U ,.P B B B B B U B B U U B K B 6.,.,.7.k.j.k.k.k.k.k.k.r.e.r.k.k.e.k.t.k.N.V.T.N.n.n.N.n.n.N.T.n.T.n.n.n.n.T.",
"@.@.X.X.O.G.G.,X{.{.,XG.,XG.,XG.,XJ.G.,XG.,X{.,XG.,X,X,XG.lX,X,XG.,XG.,XG.G.G.G.F.[ F.F.[ F.F.H.F.F.D.G.A.D.D.C.Z.[.Z.[.[.[.[.[.[.[.].[.).].[.D.[.(.(.{ { { { { { { { [ [ [ { [ [ [ [ [ [ [ } } ] ] ] { [ { { { { { { } ] ] ] ] ' ' ' ' ' ' ' ] ' ' ' ] ] ] [ ] ] ` ] ' ] [ [ [ [ [ [ [ [ { { { { { { { { { { { Z.Z.{ Z.{ { Z.{ Z.{ S.{ Z.Z.{ Z.{ [.Z.[.Z.[.[.{ [.{ Z.Z.{ [.Z.[.{ [.S.Z.{ M.{ Z.{ Z.Z.[.Z.[.Z.[.[.[.Z.(.[.[.[.[.[.[.(.[.(.[.[.(.[.(.).).).(.[.).).).).).).[.(.[.[.[.(.[.(.[.[.`.).).`.).[.`.`.[.[.].[.].].].].).).`.).`.[.).).).`.`.[.[.`.(.[.[.).`.`.`.[.`.[.].`.[.`.`.].'.'.].].].].].[.].].].[.'.'.[.[.`.[.`.[.`.`.[.[.`.[.`.].[.`.`.'.[.[.`.D.D.@.z x z l x x x x l x f f c d f x f c x d d d d d d a d d d a a d d d i d 7 i i i 7 i i a a d d 7 d d i 7 i 7 7 d 7 7 7 7 7 7 7 4 7 7 7 7 8 7 7 6 6 8 6 6 6 8 8 1 1 1 > 1 1 * , = * - - X - - + + X + O X # . + X . . . . X X $ & * = 1 6 9 9 6 6 , , , * - , @ - * * * 1 = 1 6 6 6 6 6 < 7 7 c A c 7 4 , , , < < 8 5 5 i f Z V T R E ^ ` M.m.Q.n.n.n.n.d.d.h.j.h.h.T.h.N.h.d.T.d.d.T.T.N.T.d.n.T.h.T.N.N.N.N.h.h.h.g.j.j.h.j.h.h.h.h.j.h.h.h.h.h.j.h.d.d.h.d.d.s.d.d.n.d.p.d.d.n.d.d.d.d.",
"+.+.+.+.+.,XG.,X{.,XJ.,X,XG.G.{.,XG.,XG.,XG.,XJ.G.,X,XJ.,XJ.G.G.,XG.7XG.G.G.F.H.F.H.F.F.G.G.kXkXG.kXkXG.A.D.C.S.[.[.[.[.[.[.[.).[.[.[.[.[.gXkXkX(.{ [.Z.[ [ { { { { { } [ { } [ ] ] ] ] ] ] ] ] { } { } { { [ [ } [ ] ' ] ] ' ' ] ' ] ' ] ] ' ] ] ] [ [ ] ] ] ] ] ] ] [ [ [ [ [ [ { } { { { { { { { S.{ { S.{ Z.{ { S.{ Z.S.{ Z.{ Z.{ Z.Z.{ [.{ Z.Z.Z.{ { S.Z.S.Z.Z.[.Z.Z.{ [.{ S.{ S.Z.S.Z.[.Z.Z.[.[.Z.Z.Z.[.Z.Z.[.Z.[.[.Z.Z.[.(.(.[.[.[.(.[.[.(.[.[.(.[.[.[.(.[.(.[.).[.(.[.).(.(.[.`.[.).(.[.).[.[.).).).[.).).].).[.).).).).`.[.).[.[.`.`.[.[.`.(.`.[.`.`.`.).`.[.`.].`.].[.[.`.`.[.].[.`.[.`.[.].'.`.`.].].`.`.`.`.'.[.`.`.'.`.[.'.].`.'.[.`.`.`.[.`.`.`.[.gXq.x z l x l l l x l l d x x f d c d x d d f d d d c d d d a x d d d a d d i d a d i i i a a a i 7 a 7 7 7 i 7 d 7 7 i d 7 d 7 7 7 7 7 7 4 8 7 4 7 7 7 7 8 6 6 6 7 6 6 1 1 8 1 1 , 1 , , , * = * ; = * @ @ & @ @ @ - # O O X X . . . # # # * ; ; * * 1 6 1 1 6 1 1 , * * * * = 1 1 6 6 6 8 7 Z A Z 7 8 , , 8 8 8 8 7 7 i 7 5 < 5 4 e e t f L c.m.Q.T.T.T.T.h.h.h.N.N.h.N.h.N.d.N.d.h.d.d.h.d.d.d.d.d.h.n.d.N.h.h.d.d.h.h.j.d.h.j.g.h.h.j.d.d.a.h.g.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.s.",
"+.+.+.+.+.k.G.G.,XG.{.G.,X{.,XG.V.,X,X,X,XG.G.J.,X,XG.,X,X{.G.,X{.,XG.G.G.G.G.G.jXG.G.,XlX,X,X,XlX7XG.D.F.D.[.[.S.[.S.S.S.{ { { { { { { [ S.gXkXkXZ.F.{ { [ { Z.S.} { { } { [ ] ] ] ] [ [ ] [ { 0XZ.{ [ ] [ ' ' ] [ ] ] ] ] ' ' ] ' ] ] ' ] ] ] ] ] [ { ] [ ] ] { { { [ { { { { { { { (.[ { { Z.{ { { { Z.{ { S.{ { S.{ [.{ { Z.{ { { Z.{ [.{ { [.{ { Z.Z.Z.S.Z.C.Z.Z.S.{ Z.{ [.{ Z.[.{ Z.[.Z.Z.[.{ (.{ Z.S.Z.Z.[.Z.Z.[.Z.[.Z.(.C.D.C.C.C.C.C.C.C.[.C.[.C.).C.D.[.).D.D.[.(.C.).C.).[.).[.).C.).D.D.).D.).).D._.D.D.).).).).).).).).).).).).).].].).].).).).).).[.`.[.`.[.].).].).].].[.).`.)._.].].).`.).).`.`._._._._._.).(.`._.`.)._._._.).(._.)._.(._._._._.b.v l l l l z l l l l d l c f l d c l d l c d l d l d d d d d a d d a d p d d d i d a d a a a d i i i i i i i 7 7 i 7 i i 7 7 7 7 4 7 i 7 7 5 8 4 7 7 5 8 7 8 8 8 8 8 8 8 8 8 , 8 7 1 < 1 1 , , = , = - - - - - - , = - - - - - - # X X . X # . X # - - - # - - = 1 6 6 6 6 6 1 6 ; 1 = = = = , 8 , 7 c 7 8 < 8 8 8 , 1 7 c x T E E ^ E T Z d 4 < , 5 g G p.n.T.T.T.n.d.d.d.d.h.h.d.h.N.d.d.h.d.d.d.d.d.d.d.d.d.d.d.n.g.h.d.g.d.g.h.g.h.h.h.d.h.d.h.d.d.g.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.",
"+.+.+.+.O.$.l.,XJ.,X,X{.J.,XG.,X,XG.J.,XG.,X,X,X,X{.,XG.J.,X,XJ.,XG.G.7X,X,X,X,X,X7X,X,XJ.lXG.kXG.kXkXG.F.F.{ { [ [ [ [ [ F.[ { { { { { [ [ Z.kXzXgXZ.[ [ Z.{ { { { { { [ [ } { { { [ [ [ [ [ ] [ [ ] ] ] ] ] ] [ [ { ] ] ' ] [ ] ] ] [ [ [ ] [ { { } { { { { [ } [ { [ { [ { { { { { { [ { { { Z.{ Z.{ { Z.{ Z.{ Z.{ { { { Z.{ Z.[.Z.Z.Z.{ Z.Z.[.Z.Z.Z.Z.Z.{ Z.C.Z.S.{ Z.C.[.Z.Z.[.(.Z.[.Z.Z.[.{ (.Z.[.C.S.[.S.Z.[.[.Z.(.Z.[.Z.C.C.S.C.C.S.C.C.S.C.C.C.C.C.D.C.C.C.[.C.[.C.C.[.[.C.C.(.A.D.C.).).D.D.).).).).).).).).D.).(.).).).).).[.).].).).).).[.).).).].).).).).`.].).].).].).).(.].)._._.`.[.).).`.).).]._._.).).(.`._.(._.(.`.(.(.(._._.(._.)._._._._.b.v z x l z f z z f l l l f l l d l f d l d f d d d d d d d d d a a a d a d p p d d a s i s s i a a d d a i i i i i i a i a i i i 7 d 7 i e 4 7 4 7 7 4 7 7 8 7 8 5 8 4 4 5 8 5 8 4 8 4 8 , 8 8 6 , , , 1 1 , - - - , , , - = , * , * , - , * # # % % - , , - # - # # % - ; ; ; 6 6 6 6 6 6 , = , , , - > , , 1 , , , , 6 7 7 l l A E _ ` ` _ _ T Z d s s f u m I c.T.n.T.T.m.N.n.d.n.n.d.h.d.d.N.N.h.h.h.d.T.N.h.N.d.n.h.d.h.d.N.n.d.N.h.n.g.g.n.h.d.N.d.N.h.g.h.h.h.d.d.d.N.h.d.N.d.d.d.d.h.h.d.",
"+.+.O.O.O.+.#.%.!.!.G.J.G.,X,XJ.,X,XG.,X,X,XG.V.{.,X,XJ.-XG.V.,X,X,X,XJ.J.,XV.,XG.,X,XG.{.,XG.G.F.F.F.F.F.Z.Z.Z.C.D.D.D.].D.[.[.C.{ { { F.[ [ S.kXkX[.Z.[ Z.{ { ] [ [ { { } { { { [ [ ] [ ] ] ] ' ] ] ] ] ] [ ] [ [ [ ] [ [ [ [ [ [ ] [ [ [ { { [ { { { { { { { { { [ { { { { { { { { { Z.Z.{ (.Z.{ { Z.Z.{ Z.{ [.{ S.Z.{ Z.{ Z.{ { [.{ Z.Z.Z.Z.{ M.Z.Z.Z.{ [.Z.Z.Z.Z.Z.Z.Z.Z.Z.[.{ { (.Z.Z.Z.C.(.{ (.{ C.C.[.C.[.Z.[.[.C.[.C.C.D.D.A.D.[.[.C.(.C.C.C.C.D.D.).D.C.D.).[.(.C.C.).A.C.[.[.).A.).).).(.)._.).).).).(.).).).).).).].`.).`.(.).).).).).).`.).].).).].`.).).).].`.].].).`.).`._._.)._.`.`.`.`.`.`.`.`._._._._. X_. X_. X`.`.`.`.`._._. X`. X X XA.q.v f m V m j f z f f V z z V f l m l f f f f f f x f f f f f f d g f g f g f d f d s d s s s s s s s s i s i i e i i e 7 e e e 7 e e 7 i 7 e 5 r 7 7 4 7 5 5 8 8 8 4 7 7 4 5 7 7 5 5 4 7 7 4 8 8 4 8 8 8 8 8 8 8 8 8 8 8 7 8 8 7 8 8 7 8 7 7 7 8 8 8 8 8 5 4 7 7 9 8 < , > - - # # ; ; * , 6 6 6 6 6 6 1 1 1 6 1 , , 5 Z A _ T D l d s m Z T ^ _ ` ^ E T T T V m u m m E c.T.Q.Q.T.T.Q.N.h.T.N.T.T.N.h.T.h.T.N.N.T.N.N.N.N.N.N.N.T.N.N.E.N.E.N.N.N.T.d.h.T.N.N.N.E.T.N.T.N./.N./.N.N./.N././.N./.N.",
"+.O.+.+.O.+.#.+.%.J.V.,X,X{.,X,XJ.,X,X,XJ.,X,X,X,X,X,X}.G.,X,X,XG.G.,X,X,X,X,X,X7XG.,X,X XG.G.G.G.F.D.F.D.kXkXkXkXkXkXzXkXkXgX].C.Z.Z.{ [ F.[ F.[ { { [ F.[ [ { { { { F.{ [ [ [ ] [ [ { [ [ [ [ F.{ { Z.Z.F.[ { F.Z.{ { [ [ [ [ { [ { { [ [ { [ [ [ { { M.[ { { [ [ { { M.{ [ [ [ { { { { ` { [ { Z.Z.Z.Z.C.Z.Z.Z.Z.Z.Z.Z.Z.C.{ (.(.{ (.Z.C.Z.Z.Z.(.[.Z.(.(.Z.[.C.C.C.Z.S.C.C.C.Z.Z.(.Z.[.C.C.A.[.[.(.(.D.C.C.[.[.(.(.[.(.C.(.[.D.D.D.D.D.A.).C.[.(.(.).).D.).[.(.(.D.(.A.).).).(.(.(.(.(.(.).(.).(.)._.).(.(.).).).).(.(._.).`.).).(.(.).).).).`.`.`.(.).`.).].`.`.`.).`.`.].].`.].`._._.`._.).`.`.`.`.`.`.`.`._. X X X_. X`. X_._. X`. X`. X_. X_._.A.H.q.D v H M S m z S S S S S S S S m V V S V V V z v z f V f z V v z v l j x f z f x f f z f z f f z f m f f m f f f f f f f f f m f m f m m m f m s m m d m m m m m m m m d d s d d d f d d d d d d d d d d d d s 7 s d 7 8 7 d Z c l d d f f Z Z d f d d m m 5 5 i Z P Z d a i a 6 , - # # # # - * , 1 1 6 6 6 7 8 1 7 Z _ M.M.F.M.` ~ ^ T V s p l T ^ ` ` _ E T F V Z u s m m H / M.T.Q.!.Q.Q.T.T.T.T.E.N././.T.T.T.h.E.N.E.N.T.h.T.T.N.E.N.E.N.T.N.N.T.h.T.N.N.h.N.h.N.h.h.N.h.d.d.N.d.d.N.d.N.d.N.N.",
"+.+.+.O.$.#.#.#.2.2.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.%.%.%.%.%.%.$.%.&.#.&.&.@.@.@.@.q.&.q.q.q.q.q.q.q.q.q.@.k k k k v k b b q q q q q q q q q q b q q b q q q q q b y k k k b k k k b b k v k k k k k b y b y b b y b b y y b y y y b y y q b y y y y t y b y y b b y y r y y b q b b y b k b y b k y k b y k k k y b k k k b k k b k k k y k k b k k k k k k k k k h k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k @.k k @.k @.o.k @.v @.k @.k @.k k @.k ,.@.k @.k @.k @.k @.k @.k @.v @.k N @.k @.@.k @.N N @.k ,.@.N v @.N @.K @.,.,.q.@.,.,.,.q.,.,.q.q.@.q.q.,.,.q.q.@.,.q.q.q.q.q.q.,.<.q.q.@.q.q.q.q.q.@.q.U J I I I I I I I I I I I I J I I L I I L I G P G J H I G J H H H P G H H D H G H H H H H G H G H G H H H G G H H H P H H F H H H H S F H S H S H m M m M M V m V V V P V Z m V V V V V V V Z V V Z V V Z m V m V Z V V P m s s m Z V m Z V m f V Z Z m m m m m e m 5 4 m Z f f Z m Z 7 i 7 < 1 , * - # # - * , 8 1 , 1 7 c l Z _ M.M.M.M.b.c.Q F f f f f m A ^ ^ ^ E E F Z m m s f m m P / p.T./.E.T.d.d.d.d./.d.d./.h.h.h.h.d.N.h.h.h.h.h.N.d.N.h.d.d.d.n.d.h.h.d.d.d.h.d.d.d.h.d.N.d.d.d.h.h.d.N.d.d.d.",
"+.$.O.O.+.O.$.$.#.$.$.$.$.$.$.$.#.#.5.2.#.#.2.4.#.5.$.O.1.3.#.$.#.4.1.O.1.1.1.@.<.@.,.k K R v _ _ 9.| _ _ _ F.9._ R z f g d v z Y ^ ^ _ T x a < 2 < w 2 2 < 2 2 w w 2 < < 4 e 7 d l d f c c g a p c p f f c f f x V l s r s l d s f l d f s s d s m m 7 i i 7 d s s d 7 s s d 7 i s m d m m f m d f l l l z z m V V m Z C z m V m m V m m Z V m V V m m m M S D V V z S z j z S V m S S D S S S m M P S S S H H S H S H V S G G H G J F J H G G G I G G G G H P G T J H G R P I W L W I I I W Y P G R L W I L P I W J H I I G J I I L ^ I U E L P I W W I I Q U W I L ^ W U R R W W W R W / W W ^ W I / ! U ! ^ ! ! I U I Q Q / Q I U Q I W U W I Q I Q I U U U I ! U ! ! U Q U U I U U U U U W U U I I I I I I I I I I I I I G J K J G P J J J J J G H G G G H L H P H H H G H P H G P P H M P P P H H P M H P P S S M m m m M P m P m m V m m m m m m m m m m m m V m m m m m m m s s m m m m V V m u u m f f m m u m m 5 m e f Z m V f f m Z z z x x i 7 , , # > , , , < < < , 8 5 7 d V F ^ M.M.m.M.M.9.G V s d m C E E ` ^ E P F V m m m u m m B U p.d.d.N.d.d.d.d.d.d.d.d.h.d.N.h.N.d.N.h.d.h.h.d.d.N.d.N.d.d.h.d.h.h.N.h.h.h.h.h.d.h.h.N.N.d.d.N.d.d.N.d.",
"#.#.#.O.+.+.$.%.O.O.$.+.+.+.$.2.#.#.#.#.$.$.1.#.#.#.#.#.$.O.$.O.O.O.<.1.<.@.o.@.,.@.K K K K Y R R R 9.c.H._ ` Y v f f f v D Q 9._ 9.9._ T v a a q q q q q y v K v f t t f l f f l f f f d f f f f f f f f f g f l f m f f m f f m s f f f f m m m m d m s d m d m m 7 Z f Z f m m m m m d m m m m m m V l V V V V V F P C V D V V P m V S S M S S M H M S M M S H M H S S S M M M M V M H S M M M H M S H H H H H G P H M G H H H P H H J H H H G H H K G H J G G H J P G H J I P I U K I P J J I U U I W I I U I J U U I J P I I I L I I P K U I J R I I U I U I U W Q U W ! U I Q Q Q Q U ! U W W U U U ! U Q ! U U Q U I U U Q I Q Q Q U U Q I ! ! U U Q W U U U U P U U U U U I I U I U U P U P I I U P I U I P P H J P K U B P K P M U U H H G H P M B M H H B G H P H H H H H H M B G H S M M P M M M M M M m M m P m M m m m V m V m m m m m m m m m m m m m m u m m u m m m f s e m m m f m M m u m m f m M m m m m m 5 s m m m m m M m f s f d f f f p w 5 5 5 7 i 7 < 7 6 < 1 7 4 4 s l D W c.m.m.m.M.~ L P V Z m F P P P Z m Z P V P m m m m P d.T.n.d./.d.d.d.d.d.d.d.N.d.N.h.d.h.d.d.h.d.h.d.d.d.h.d.h.d.N.N.h.h.h.h.h.N.d.d.d.N.d.d.d.N.d./.d.d.N.",
"#.O.#.O.+.+.+.+.+.+.+.+.+.%.$.$.O.+.O.#.#.#.O.1.#.#.#.#.O.$.$.O.1.1.X.o.@.N N N K J K H F D G R v _ 9.9.9.T S f f z G R Q 9.z.z.0.K v f b g b b b b k k q.0.H.q.v y y r f f f u s f f u y f y f f f f u f f j f f j m u f u u f u u f f f f u u m f s m s f d m d m m m f m d m m s s m m m m m m f m f V m m V V M S V V m S m m M m S M V m P S M M H M H M P H M M M H M H P H H P H M H M H M S P H H H H H M H M H H H H H H K P H H J H P J J P P H J H K J J U H K J K H G I P J H G B J H U P J I I U I I J P U U I U K H U I P H U G U P J U I J U J J I I I W I J I U I U Q I U W U U ! U ! ! U U U U U U U U I U U U U U U U U I U ! I U I U U U U ! ! U U / U Q U U U U U P I P U B U U L B U U U I K U U U U K P P L U H K U P P H U B J B P U H H B P H M H B H P B K P H H P M B P H M M P M S M S M P M M m m m m m m M m m m m m m m m M m m M m m M M m m m m m m m u s u m m m M m M M M M M m m m m m m m u s s r m m u u u f M j M j u f u f u y r q < < l A x a 7 7 4 4 7 w w e s Z G ^ c.m.M.` Z Z m Z m Z Z Z Z Z m V V m m m m P / T.d.d.d.d./.d.d.d.d.d.d.d.h.d.h.d.h.h.N.h.N.h.N.d.N.N.h.N.h.h.N.N.h.T.N.h.T.d./.N.N.d./.d.d.d.d.N.d.",
"O.O.$.$.+.+.+.+.$.%.+.$.+.+.O.$.%.+.O.%.+.#.#.&.$.+.$.+.%.$.#.#.1.<.,.k k v @.v K v S S S D F R 8.8.9.R R v f v R 9.u.c.b.b.9.Q v j y j j k k ,.q.q.<.q.k.7.k.@.k u j j u j m u u m u u u u f m f m u f u u u M M f u u m m u M u M u u m u m m m m m s m s s f m d s f d m u m s m u m m f m m m m m S M S S j V M S m m m m m M S H M S M M M M M M m M M M M M M M M P M M H G B H M M H H M H M H H M P K M H H H P M P M K B H P B G H U H U H H J J J J J J U I I U I U P U U U J U G J U U I P U P U U I U I U I U U I I U I U U I P U U P U I U P U U U U U U U W W U U U U W ! U U U / U U ! U U U 8./ U / U U U / U U U U U U U f.U U U ! U U / U U U U U f.U U / U U U U U U U U U U U U U U P U U U U U U P B J U U P U L H U P U P L I B U P B U K H H U M K H P K H H J K J B H H M B H M M M B M M M M M M M m M m M M m m m m M m m M M m M M m M m m M M M M M M m M P m u m m M m m m m u u u u m m u m m u m 5 t M d.Q.n.d.p.n.T.n.d.s.f.6.8.f.y.y.8.u.H r < 5 d c 7 7 4 7 5 4 7 7 4 5 5 e m P Z m s s m P Z m Z Z P Z Z m m P m f u U d.T.n.d.d.d.d.d.d.d.d.d.d.d.d.d.h.h.h.N.N.N.h.N.h.N.N.N.N.h.N.N.N.h.N.h.N.N.h.h.T.h.N.h.d.d.d.N.d./.d.",
"O.O.O.+.%.+.$.+.+.+.+.%.%.+.+.+.+.+.O.+.O.O.#.#.O.%.+.O.+.$.O.+.o.o.h b k k j y g g p w t q q t q q q k k v K 8.0.0.U K v j b y q b b b b h h h @.@.....X.@.q.N k u j u y u u y u u u y u u u u u u u s u u m M j j m M M u M u m m m m m M u m u m s u u f m f f f m m s u m u u m m u u m m f f m j f j M M m M S M M m m H M M M M M M M H M M M M M M M M M M M P B B P B M M P H M K M P H B K H H B H H P H B H H K H H H H G H J U H H H M H K H B H M P B K P U H J B U K P I U I U I U U P U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U 6.U 6.U U U U U U U U U U U U U U U ! U 6.U 6./ U U ! U / / U / 6.U U / U 6.U U U U 6.U U U U U U U U U U U U U U U B U U B I U P U P B P B P K B U K B H M B B P M B M B B M P M B M B M B M M M B M B M B M M M M M M M M M M M M M m M m m m M m m m m m m m m m u m m m m m m m u u u u u u u m m u u u u m M m u r r u M N M M M B B B B B B B U B U B B f.T.^.&X1X&X&X~.$X~.^.^.~.~.~.^.>X>X>X{.y.r , , 7 d d c c Z d a i 4 8 5 5 e 7 m m 7 m P Z m m m m m m m s m u r u P p.n.T.d.d.N.d.h.d.h./.h.8XN.T.h.T.T.T.N.N.h.N.N.N.N.h.N.h.E.N.h.h.N.N.h.N.h.N.N.h.d.N.d.N.d.N.d.d.h.d.d.",
"#.#.$.+.+.+.+.%.+.+.+.+.%.+.+...%.+.+.+.+.$.#.$.+.+.+.%.O.#.+.X...h y b q b q q q q q q q q q q q q q q b k q.q.k v k k b b b b h h k X.o.o.h o.o.X.o.X.1.7.7.,.N k k U 6.6.6.U U 6.U K B U K B B B B B B B M m u u u u u u u u m u m u u m m m m m u m m m f m m m m m m m m m m m m m m u m m M M m m m M S M m M M M M M m m S M B M P M m M H M M M H M B H B M P P M M M M H M B M H M M M H H B H H H H H H B H B M B P B P B H H M M J K B H M K H M H M M H M M B M M M M P M P H J P B M B B M B P B P P P P B P B P B B B P P B U B P U B B I U P B U U U B U U B U U B U K U U P B P U U U P P B U I I B U B P B U P U B P U U B P U U U U U U P B U U B B U B B U P U B B B B P B B B B U B U B B P B K B P B P P B B B B B B B B K P B B H K B P M P B B B U B K B B P U P U U U B B U B U U U U U U B B U U U U U B U U U B U U 6.6.U 6./ / f.f.6.6.6.y.f.6.f.6./ 6.f./ U 6.6.B B y.T.E.N.T.!.E./.W.~./.~.&X^.^.&X&X~.T.d.h.W.&X&XW.$X=X#X*X+XE.g.a.a.r.w.f.d.T.p.m 5 < 5 8 8 7 7 c c 7 8 8 5 5 8 e 7 5 5 5 5 5 e 7 e e r 5 r m m u u M p.n.T.x.n.d.T.T.N.8Xd.T.h.h.T.T.E.T.T.N.h.N.N.N.N.N.N.N.h.h.h.h.N.N.h.N.h.h.d.h.d.d.N.d.h.d.d.h.d.d.d.N.N.",
"#.O.$.$.+.+.+.+.+.%.+.....+...%.+.+.$.+.+.+.O.+.+.%.+.O.%.+.O.+.X.h h b b y y k k b b b k y b h k k b k k k k k ,.@.k o.@.@.O.q.q.<.4.7.4.4.4.<.<.1.<.<.<.k.7.o.k N 6.N.T.N.N.T.T.h.N.T.^.^.!.!.!.^.!.~.>X/.f.M u M B u M u m M u u u u u u u r u u 5 t u u r u u r u u u u u m u u m u u u u u u u u u u u u u f u u m u f m m m u u m u m m m m m m M M u M M m m m m m m M M M M m M M M m m M M M M M M M M M M M M M M M M M M B M B P B M P M M M B P B P M B P B B P U K B U U B B B U U U U U U U U U 6.U 6.U f.U U U U U / f.U / U 6.f.U f.8.f.f.f.y.f.f.s.p.p.s.y.s.f.s.y.s.w.d.p.d.s.f.f.s.d.s.s.d.s.d.d.p.d.d.s.d.s.d.d.v.d.d.d.d.d.d.d.d.n.d.T.d.h.d.n.d.n.h.N.d.T.d.T.N.h.n.N.n.N.T.n.T.T.d.T.T.T.T.T.N.N.N.N.N.N.B.T.m.T.Q.Q.T.Q.T.T.Q.T.Q.T.!.T.T.!.Q.Q.Q.Q.!.Q.!.Q.E./.Q.Q.E.!.^.!.!.~.!.!.~.^.^.^.^.~.^.^.^.^./.$X^.^.^.^.}.}.^.^.^.}.~.^.^.~.^.^.!.^.W.$X^.&X&X~.^.^.&X&X^./.d./.~.$X%X%X$X$X~.*X&XW.W.$X$XW.&X&XE.h.h.E.@X*X#X;X=X;X=X=X+XR.R.+X+X~.W.~.<X3XQ.M 5 , , 5 7 7 7 d 7 s 8 m Z m m i m m m m m f m P / ` T.p./ M.T.v.d.n.n.i.T.T.T.N.E.T.8Xh.h.T.T.h.N.E.T.h.N.N.h.h.N.h.g.N.h.N.h.N.h.h.h.h.d.d.h.N.N.h.N.h.d.N.N.d.d.a.d.d.d.d.",
"1.#.#.O.$.$.O.$.$.+.+.+.+.+.+.+.+.+.%.+.+.+.+.$.+.+.$.$.#.O.+.+.O.@.o.k k h k k @.k h k k o.k @.@.@.k @.@.@.@.@.O.@.<.<.4.O.O.<.1.1.1.4.1.1.<.1.+.<.<.<.@.<.<.,.6.w.g.a.t.6.t.t.a.f.f.a.E.$X%X~.R.~.~.~.~./.T.T.T.T.Q.T.h.T.T.T.B.N.N.T.T.n.d.n.d.P M U U U U 6.U U U 6.6.f.U / / f.p.f.f.f.p.f./ d.p.d.p.p.f.p.s.s.d.p.p.d.d.d.d.d.d.v.d.n.d.d.n.d.n.d.d.d.d.n.T.p.n.d.x.T.d.N.d.T.T.d.n.T.T.T.n.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T./.T.T./.T.T.T.T.T.T.Q.T.T.T.Q.T./.T./.Q./.Q.!./.!.!.!./.!./.!.!.!.!./.^.^./.^.!.~.^.^.^.^.^.!.^./.^.^.^.~.^.^.^.^.^.>X^.{.%X%X>X>X}.%X>X>X>X^.^.%X>X>X>X>X>X>X,X&X1X>X}.1X<X<X1X1X>X>X>X>X1X1X1X1X1X1X>X>X&X>X>X>X1X&X1X<X1X>X1X>X1X&X>X1X>X1X>X<X&X1X}.:X>X>X>X>X1X>X>X>X>XOX&X>X>X<X}.<X1X1X>X<X1X<X&X<X^.1X^.}.>X^.^.&X>X>X>X>X<X<X>X>X:X}.&XOX&X&X}./.;X;X/.}.^.^.&X^.^.^.^.^.^.^.^.^.&X%X%X&X^.^.%X^.%X^.%X^.^.^.^.^.^.&X^.^.%X%X%X&X^.&X^.^.&X^.&X$X&X&X/.T.h.E.*X;X&X#X#X$X*X=X$X$X=X=X=X*X*X#XW.W.@X=X=X=X=XW.#X#X;X;X;X#X8XE.h.h.h.h.E.T.d.P i , , 7 d 7 8 5 7 7 i m 8 8 5 e m P P P F P P / n.Q.M.T.T.n.v.n.T.d.T.n.T.T.T.T././.T.T.T.h.T.h.h.h.N.h.h.h.N.h.h.d.h.h.h.h.N.N.h.n.g.n.h.h.N.h.h.d.d.h.N.d.h.N.N.h.N.T.N.",
"#.1.O.O.+.O.$.+.+.+.$.O.%.+.+.%.+.$.+.+.+.O.$.$.+.$.O.%.%.$.+.+.+.+.+.<.X.o.@.X.o.o.o.o.X.X.@.@.O.@.<.O.@.O.@.#.O.O.#.#.#.$.O.1.1.2.4.1.1.1.1.+.o.+.o.o.,.7.7.7.a.h.~.%XW.W.W.W.&X^.!.~.#X=X$X$X%X$X$XW.W./.W.@X>X*X*X&X#X&X^.^.%X%X^.}.~.^.^.1X^.d.N./.^./.~.~.W././.~./.&X&X^.&X~.^.^.~.^.&X&X&X&X/.&X&X^.&X&X^.&X&X>X&X&X}.}.^.^.&X&X>X&X^.&X&X&X&X&X^.;X>X&X&X&X&X&X/.&X&X&X&X&X&X}.<X&X~.&X&X&X}.^.&X&X}.&X^.<X^.&X&X&X}.>X&X&X&X}.^.&X&X&X*X*X&X&X<X*X&X<X&X&X>X&X&X&X&X&X^.&X&X&X&X&X^.<X&X*X1X*X<X>X&X<X<X*X<X&X*X>X*X<X1X<X&X&X&X*X^.<X&X>X&X&X*X&X>X:X&X:X:X:X&X:X:X<X:X:X>X>X&X:X:X:X<X&X&X>X<X^.^.1X1X&X<X<X>X&X&X<X<X^.*X*X>X&X>X<X>X&X<X;X<X<X1X<X>X1X1X<X>X&X<X1X1X<X<X<X:X:X<X<X>X<X<X>X&X;X<X&X<X>X>X&X<X&X:X&X&X<X}.>X>X<X<X<X<X&X;X<X>X&X:X&X>X&X&X>X;X*X*X>X&X&X&X&X1X;X;X;X&X<X>X<X:X;X<X&X*X;X<X&X<X*X&X;X;X;X&X;X&X*X*X*X<X*X;X*X&X&X*X&X&X<X:X&X*X<X<X&X&X;X<X&X=X8X;X;X&XW.$X=X*X;X;X;X;X*X=X;X=X;X=X;X*X=X*X*X#X#X=X=X=X;X=X#X#X#X#X#Xh.j.r.r.r.h.h.j.T.^.Q./ r # > , 7 8 , 8 8 7 7 7 e 8 8 m d m m m f m H / d.m.n.p.d.d.d.d.n.d.d.d.N.T.T.N.N.h.h.d.h.d.h.d.h.N.h.n.h.h.h.h.h.N.h.h.h.g.a.N.g.N.h.d.d.d.T.N.T.h.T.T.T.T.T././.E.!.E.",
"#.$.O.+.%.+.$.+.+.%.+.%.O.$.$.$.+.+.+.O.$.+.$.+.+.+.O.$.$.+.+.O.O.+.O.O.+.+.@.O.@.1.@.O.O.O.1.O.1.1.1.4.4.4.5.#.#.4.4.4.5.$.$.5.3.4.4.4.1.1.1.+.1.,.o.h <.k.g.7.t.t.t.t.t.t.t.t.7.t.h.E.#X#X#X#X#X&X*X#X#X$X=X%X$X%X$X%X$X@X@X$X$X~.$XW.~.!.W.~.T.d.T.&X~.~.^.~.&X~.%X~.~.^.~.~./.~.~.~./.~.~.^.~.$X$X~./.&X&X=X/.&X^.&X~.&X&X~.&X~.^.&X~.&X^.~.~.^.%X~.~.&X^.&X~.&X~.&X&X&X^.^.~.^./.&X^.&X%X%X&X^.&X&X~.&X^.~.^.^.%X~.&X~.^.&X$X&X$X=X~.&X~.&X=X~.&X&X%X%X&X&X&X&X&X=X~.&X&X%X&X$X%X%X&X^.&X&X&X&X&X&X^.&X&X<X<X&X&X&X&X*X*X*X*X&X&X*X*X<X;X<X*X:X*X>X*X&X&X*X&X*X*X>X*X:X&X*X*X<X<X<X:X:X*X:X&X<X<X<X<X<X<X<X;X;X<X*X;X<X;X<X&X<X<X*X;X<X<X<X;X<X<X1X;X1X<X<X1X<X<X<X1X<X<X<X1X<X<X<X<X<X<X;X;X;X<X<X<X<X<X<X<X<X<X<X<X<X>X>X<X<X<X<X<X<X<X*X;X<X;X<X;X<X<X<X<X<X<X<X<X<X<X<X<X<X&X;X;X;X3X;X<X<X<X;X<X;X<X<X<X<X;X<X*X*X*X&X*X*X<X*X&X;X*X&X&X;X;X&X<X*X;X*X;X&X&X:X<X<X<X;X<X;X;X;X;X;X/.;X;X;X=XE.E.@X=X*X=X=X#X=X=X;X=X=X=X=X=X=X*X$X#X*X=X=X;X=X#X#X#X=X#X#X=X;X;X;X;X#X%X&X4X>Xv.y , > 8 d 7 7 7 7 7 4 d m 7 s e n u f u m M U p./.T.d.p.d.d.d.d.d.d.n.N.d.N.h.d.d.d./.d.d.d.d.d.d.d.d.h.h.h.h.h.h.N.h.h.h.N.N.N.N.T.T.T.!.T.E.E././.E.R.E./.E.!.!.!.R.",
"#.$.$.+.+.+.$.$.+.+.+.$.$.#.$.O.$.+.$.O.O.%.$.+.+.+.#.#.#.+.%.$.$.O.$.1.#.#.#.#.<.1.1.O.1.1.4.1.1.#.$.#.#.1.#.5.#.#.4.#.$.$.5.$.3.4.4.1.1.1.+.1.1.1.X.@.7.g.g.a.j.E.E.E.8Xh.h.E.j.j.E.+X;X;X=X#X=X=X=X=X=X;X*X$X$X&X&X=X*X=X*X*X=X*X*X*X*X&X;XW.E.8X$X~.~.~.W.~.~.~.%X$X~.&X~.~.=X~.$X$X*X~.$X&X&X&X&X=X&X=X~.=X*X~.&X#X&X$X&X&X&X&X&X^.~.$X&X&X~.&X$X&X*X&X*X*X;X&X&X&X&X&X;X&X&X&X<X<X&X=X%X&X&X&X;X&X;X&X;X&X;X;X&X;X&X;X&X;X;X&X&X*X&X&X;X&X&X&X&X&X&X&X*X*X*X*X&X*X*X&X&X&X;X&X&X;X&X*X*X*X&X&X;X&X&X*X*X&X<X&X&X<X*X*X*X&X&X*X<X&X*X*X*X*X;X;X*X:X:X:X:X<X*X>X:X:X:X:X*X<X;X*X*X;X*X;X2X:X;X;X*X;X*X;X*X<X;X<X;X<X<X;X;X<X<X;X;X<X;X<X&X&X;X&X&X;X;X<X&X<X<X<X<X<X<X;X;X<X;X*X<X<X*X;X*X;X&X;X&X<X<X<X<X<X*X<X>X;X<X<X;X;X&X<X*X>X<X*X*X&X*X;X&X;X&X&X;X&X;X&X;X&X;X&X&X%X&X&X&X&X;X;X;X/.&X&X&X&X&X&X*X*X&X&X*X*X&X&X&X&X&X=X*X&X*X&X=X&X&X=X&X&X&X*X*X&X&X&X*X&X<X*X;X&X&X$X&X^.=X;X;X=X~.;X;X=XE.E.@X=X=X;X=X#X=X=X$X#X=X#X$X=X#X=X#X=X=X#X#X#X#X#X#X#X;X#X=X;X#X#X#X#X&X~.^.>X>Xn.f > , , 6 6 7 7 8 8 3 5 5 e s m P W Q P U U / d.x.T.d.d.d.d.d.d.d.h.d.d.h.N.h.d.d.N.d.N.d.N.h.N.h.h.h.N.h.N.N.h.N.N.E.T.E.T.!.E.E.!.R./.~.!.!.W.!.E.!.!.E.!.!.R.!./.",
"#.#.$.+.+.$.#.O.O.$.O.#.O.$.$.O.O.$.O.#.#.4.O.+.+.+.$.$.+.+.$.$.$.$.#.4.O.O.#.#.#.1.#.+.O.3.3.3.1.1.3.3.$.3.$.3.2.2.$.$.2.3.2.5.3.2.2.2.#.$.#.5.1.<.<.j.j.e.j.h.E.-X*X-X*X;X;X2X7X2X;X;X#X#X#X=X#X/.#X#X;X;X#X/.=X;X#X=X=X;X=X=X=X=X=X;X#X;X;XE.h.W.;X%X%X&X~.R.~.%X~.~.%X~.%X%X#X;X#X/.#X#X$X&X$X$X~.#X/.&X&X&X^.&X&X$X&X&X&X&X$X&X&X/.*X$X&X&X&X&X=X&X*X*X*X-X:X-X%X&X&X-X&X&X*X*X%X%X*X%X$X%X&X*X*X*X&X-X&X*X*X=X=X&X*X&X&X&X&X;X*X*X&X&X&X*X&X&X;X&X*X*X*X>X;X*X>X*X*X*X*X*X&X*X<X&X&X:X:X>X*X>X>X&X*X&X:X-X&X&X<X:X:X:X:X*X;X&X>X;X:X:X:X-X:X*X:X*X*X*X:X*X:X*X:X<X:X;X*X:X*X;X:X;X;X;X*X2X2X2X<X*X2X*X:X2X*X2X2X;X;X7X2X2X<X;X2X<X;X2X*X;X;X*X;X;X2X;X2X*X:X2X:X:X;X;X;X;X;X;X2X;X;X;X;X;X;X2X;X;X2X2X;X;X;X;X;X;X;X2X;X;X*X*X<X;X;X=X;X=X2X=X;X;X;X=X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X*X*X;X;X;X=X;X;X=X;X;X;X&X;X;X*X=X;X;X;X;X;X;X;X=X=X;X=X*X=X&X=X;X&X&X=X$X~./.=X/.;X&X&X#X=X;X#X#Xj.E.#X=X#X=X=X=X#X#X#X=X#X=X=X#X=X=X#X#X=X=X#X#X#X#X;X#X#X=X=X=X=X#X#X;X;X#X;X:X>XQ.f 2 # , < 8 8 7 7 7 5 5 7 Z / c.m.v.p.p.p.d.d.d.d.d.N.d.d.d.d.d.d.d.d.N.d.h.d.h.h.h.N.N.T.T.T.T.T.E.T.E.~.!.R.!.R.R.~.!.!.E.!.R.R.!.!./.~.~.~.~.R.!.!./.E.!.!.!.E.",
"#.#.$.+.%.O.#.#.#.O.$.#.$.$.$.O.O.#.#.4.4.#.O.O.O.O.+.$.$.+.+.$.#.#.#.4.O.#.#.#.#.2.#.+.O.3.3.1.1.1.3.3.3.3.3.3.5.2.$.$.$.2.2.2.2.5.2.2.#.2.#.2.1.<.<.k.j.j.j.h.-X+X+X-X+X-X=X-X=X=X#X#X#X#X#X#X#X;X#X=X;X#X;X;X=X;X=X=X=X=X=X#X=X=X#X;X;X=X;Xh.a.*X<X^.*X;X%X$X%X%X%X&X~.%X$X%X#X#X#X;X=X=X~.&X;X/.&X^.;X&X&X&X&X&X$X&X$X&X&X&X&X&X&X&X*X&X=X&X$X*X&X&X=X*X*X*X*X&X=X&X*X&X-X&X*X=X%X*X*X*X*X*X$X*X*X*X&X&X:X:X*X*X*X=X&X&X&X&X*X&X&X&X&X&X-X*X&X&X*X<X:X:X:X*X*X:X:X*X:X>X*X>X<X<X:X<X:X:X:X:X2X:X:X:X:X:X>X:X<X1X:X<X:X:X:X<X<X<X<X:X:X:X:X2X:X*X:X:X:X2X*X2X:X*X*X<X<X*X:X;X2X<X2X2X2X2X2X2X2X<X2X7X2X;X7X2X7X2X;X;X*X*X2X2X;X;X2X2X2X;X2X;X;X;X;X2X;X2X2X2X:X2X2X*X<X2X2X2X;X;X2X;X;X;X2X;X=X=X;X;X=X=X;X;X=X=X;X;X7X=X*X;X;X;X;X;X;X;X;X2X2X2X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X2X3X;X;X;X;X;X;X2X3X2X;X;X2X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X;X*X;X;X;X;X;X;X;X&X&X=X$X=X=X=X;X=X#XE.E.=X2X;X=X;X;X;X=X=X;X;X*X=X2X;X=X;X;X=X=X2X;X;X2X;X=X;X=X2X2X;X#X=X;X;X=X$X*X^.Q.z > > , 8 8 8 5 5 5 5 5 5 e r u P i.p.d.p.p.p.d.N.d.h.T.d.h.d./.N.T.N.N.T./.N.T.T.E.E./.R.!.R.~.^.~.~.!.~.@X/.!.!.!.R.R.~.!.~.!.R.R.R.!.~./.!.!.W./.~.!.~.~.~./.",
"#.$.+.+.#.#.#.#.$.$.$.$.#.#.#.$.$.#.2.#.2.$.O.+.#.O.$.#.$.+.+.O.#.4.#.#.#.#.#.#.#.2.2.$.$.3.3.3.3.3.3.$.2.2.3.2.4.2.#.#.2.2.5.5.2.5.#.2.1.O.1.4.4.k.5.j.j.h.h.#X-X-X-X-X-X-X=X-X=X=X;X=X;X=X;X#X=X=X;X#X;X#X#X;X=X=X;X#X=X=X;X;X;X=X;X#X;X=X=Xh.h.*X;X;X*X;X&X&X=X&X&X&X&X=X=X&X#X;X;X;X&X/.;X;X;X;X;X&X&X;X&X&X*X*X&X*X&X&X;X~.$X&X&X&X&X&X&X=X=X;X*X=X&X*X*X*X*X&X*X*X*X;X:X&X=X;X=X;X*X;X*X=X;X&X;X;X*X*X:X;X;X;X*X;X*X;X;X;X;X;X&X;X:X:X:X:X;X;X;X;X<X:X;X:X<X;X*X;X:X:X<X;X<X<X;X;X<X<X<X:X:X:X<X:X:X>X2X2X<X<X<X<X<X<X:X<X<X<X:X2X:X2X2X1X2X:X2X2X2X2X2X2X1X7X2X1X2X:X1X1X2X1X2X2X7X1X2X3X2X:X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X:X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X3X2X;X;X2X2X;X;X2X2X2X2X;X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X3X3X;X2X;X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X2X3X2X3X;X3X3X;X;X;X;X;X;X;X;X;X;X2X;X3X;X;X;X3X;X;X3X;X;X;X2X;X#XE.#X3X;X;X=X;X;X;X;X;X=X;X2X=X=X;X=X;X=X=X;X;X=X;X;X;X;X;X;X;X=X;X;X;X=X;X=X=X-X,XB.v 2 > < 5 5 5 e e 8 5 5 5 5 5 g B / p.d./ f.d.d.d././.E.W./.W.!.E.!./.R.E.~./.!.~.~.!.~.~.~.~.~.!.~.R.R.W.R.!.R.~.R.~.!.!.!.W.~.R.!.W.R.~.!./.R.!.E.R.R.!.!.R.",
"#.O.$.#.#.#.#.#.1.$.#.$.1.#.#.1.1.2.2.4.2.$.$.$.#.#.O.#.$.$.$.#.1.1.#.#.4.#.O.#.2.2.$.#.1.3.3.2.$.3.3.3.2.2.2.$.2.2.2.#.5.2.%.5.5.2.#.$.O.1.4.1.4.5.j.j.j.j.V.=X:X-X,X*X*X=X;X;X=X;X;X=X;X;X;X;X;X;X;X;X=X;X;X;X2X=X;X;X;X;X;X=X;X=X#X;X;X;XW.j.E.2X2X;X<X<X<X;X;X<X<X;X;X<X;X<X;X;X;X3X;X;X;X;X;X;X;X;X;X;X<X<X<X2X<X<X<X<X;X<X;X;X;X;X;X;X;X;X;X;X;X;X*X;X*X;X*X<X;X;X;X;X;X2X;X2X;X;X*X;X2X2X;X;X;X;X2X2X2X;X;X;X;X;X;X;X<X<X<X3X3X<X1X2X2X2X3X;X2X2X2X2X2X2X<X2X<X3X2X2X2X2X<X2X2X2X2X<X2X3X2X3X3X3X3X3X3X2X3X3X3X<X1X2X3X1X3X3X1X3X3X3X3X3X3X3X3X3X1X1X3X3X3X3X3X3X3X3X3X2X3X3X3X3X3X3X3X3X2X7X3X3X2X2X2X1X3X2X2X7X3X3X2X3X2X3X2X2X2X2X2X2X2X2X3X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X3X2X3X3X3X3X3X2X3X3X2X3X2X2X3X2X2X2X2X3X2X2X2X2X3X3X3X2X2X2X3X3X3X2X2X3X3X3X3X3X3X3X3X3X6X3X3X3X3X6X3X3X3X3X3X6X3X3X6X3X3X3X3X3X6X6X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X2X;X2X2X2X;X;X2X2X2X;X2X;X;X3X<X<X3X;X2X2X2X;X;X#X+X=X;X;X;X=X=X=X=X;X=X;X=X2X=X;X=X;X;X;X=X=X;X#X=X=X=X;X#X=X=X;X#X=X=X#X=X-X-X+X*XB.H t w s 5 m s m m m m m m m u u m P / d.N.h.d.d.d.d.h.T.R./.!.E.!.~./.!.~.!.!.!.R.!.!./.~.~.~.~.W.~.E.R.W.E.R.E./.!.R.R.R./.!.~.R.R./.R.R.R.R.~./.R.!.E./.R.",
"$.$.+.$.O.#.+.$.$.$.$.$.#.$.#.1.#.2.2.2.4.#.O.O.#.$.+.#.#.#.#.#.O.4.#.#.#.#.#.&.#.#.#.#.$.5.$.2.5.2.2.2.2.2.$.2.1.1.1.4.1.1.3.4.3.1.O.1.1.4.4.<.1.<.j.j.h.j.h.=X7X=X=X;X=X7X;X=X2X;X=X;X=X;X;X=X;X;X;X;X;X;X=X;X;X;X;X=X=X;X;X;X;X=X=X;X3X;Xh.j.#X3X3X2X;X2X2X3X3X3X3X3X3X3X3X3X3X3X3X3X2X3X3X3X3X;X3X3X3X;X2X2X2X2X2X2X2X2X2X3X3X3X3X3X2X3X;X3X2X;X2X2X2X;X;X2X2X2X2X2X2X2X2X2X2X2X2X2X;X2X2X2X2X2X<X:X;X2X2X2X2X2X3X3X2X2X2X1X<X3X3X3X3X2X3X2X2X2X2X3X2X2X;X2X;X3X2X2X2X2X2X3X2X3X2X2X2X2X2X2X<X3X3X2X2X2X3X3X3X2X<X3X3X<X2X<X1X2X3X3X3X3X3X3X3X3X3X3X3X3X3X1X3X3X1X2X2X3X2X2X1X3X3X1X3X3X1X3X3X1X2X3X3X1X3X7X2X2X3X2X2X2X3X2X3X3X2X2X2X2X7X2X2X2X7X3X3X2X2X2X:X2X2X3X3X2X3X2X3X3X2X2X2X2X2X2X3X2X3X3X2X3X3X3X3X2X2X2X2X2X2X2X2X2X;X2X2X3X3X2X3X2X2X3X2X2X2X2X<X<X3X3X2X3X<X3X3X3X3X3X3X;X;X3X3X3X3X3X2X<X3X2X3X3X3X3X3X3X3X3X3X3X<X<X<X<X2X<X2X<X<X<X;X2X;X;X<X;X2X2X<X<X<X<X;X;X<X<X&X&X;X;X;X=X;X;X;X2X3X#Xj.#X=X;X=X*X#X=X;X=X;X;X=X;X;X=X=X=X=X;X;X;X;X#X=X=X=X=X=X=X=X=X=X#X=X=X;X=X-X+XE.R.E.8.u 5 u m s m m m u r u m f r t u M P B f.p.d.d.d.d.d.d.T./.~.~.~.~.%X~.^.W./.~.~.~.~./.^.!.!.W.R.R./.R.R.~.E.~./.!.E.R.R.E.!.R.~.E.!.R.R.!.R.W././.W.R.R.",
"+.+.$.+.#.O.+.$.+.$.$.O.#.#.#.#.1.#.#.1.4.#.+.%.#.#.+.$.4.#.#.#.#.#.#.4.#.#.#.4.#.#.#.#.%.$.2.2.#.2.#.#.$.2.2.2.1.1.1.1.1.1.3.3.1.1.1.1.4.4.<.1.<.5.j.j.j.j.+X=X;X;X=X#X=X=X=X;X=X#X2X;X;X;X;X;X;X;X=X;X=X;X=X;X;X=X=X;X;X;X;X=X;X;X;X;X2X;Xj.E.2X3X2X2X2X;X3X2X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X2X3X3X3X3X2X2X2X2X2X;X;X3X;X;X2X;X;X;X;X2X2X2X2X2X2X2X2X2X2X2X3X3X2X2X2X3X2X;X;X2X2X2X2X;X<X2X2X3X2X2X2X2X2X2X2X1X2X2X2X<X2X2X;X3X;X2X;X;X2X2X2X;X;X<X<X<X;X<X2X3X;X2X2X3X;X2X2X2X;X<X<X<X2X2X<X:X2X<X<X<X2X<X<X<X<X2X2X<X2X<X<X<X2X<X2X1X2X1X2X2X2X2X<X2X1X<X<X<X:X:X2X<X2X2X1X7X2X2X2X2X2X2X2X2X3X2X2X3X2X3X<X<X2X2X2X2X2X7X2X2X2X2X2X2X3X7X2X2X2X7X2X2X2X2X7X2X2X2X2X2X2X2X2X;X7X2X2X2X2X2X2X2X2X2X2X7X2X2X2X2X2X2X;X2X2X2X2X2X;X;X2X;X;X2X2X2X2X<X<X<X<X<X2X<X3X;X;X3X3X3X;X3X3X3X3X3X;X3X3X3X3X3X3X3X3X2X2X2X2X2X3X<X3X3X2X<X<X<X<X:X:X;X;X;X;X*X<X*X:X;X<X*X<X;X;X<X<X;X&X;X;X=X;X;X;X=X;X2X#XE.E.;X=X;X*X;X;X;X=X=X=X;X=X=X=X=X;X=X#X=X=X#X;X=X;X=X=X=X=X=X*X;X=X=X=X=X=X-X*Xh.E.R.N.M m f.p./ P P m m m m M M M m m M M m M U d.d.d.d.d.d.d.d.T.E.!.~.^./.~.~.%X%X~.%X/.~.~.W.~.R.~.R.R.W.!.R.!.R.~.!.~.W.!.R./.W.!.W./.!.R.R./.R.R.W.E.E./.",
"$.$.+.%.$.$.$.+.$.$.$.+.$.$.1.2.#.#.2.$.1.$.O.O.#.O.#.#.#.#.#.#.&.5.#.%.#.#.#.#.$.2.$.$.2.2.2.2.#.5.2.2.#.2.2.2.4.1.1.4.1.1.3.4.1.3.1.4.4.4.4.<.3.j.J.j.j.h.+X;X;X#X=X7X;X#X=X;X;X7X;X;X;X;X;X;X=X;X;X=X;X;X;X;X=X;X;X2X7X=X=X;X;X=X;X;X2X;Xj.h.3X3X;X2X2X2X2X2X2X3X3X3X3X3X3X6X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X2X2X2X2X<X:X:X;X;X<X<X<X<X;X3X2X2X2X2X2X2X2X2X2X2X;X;X2X2X2X2X2X2X2X2X2X2X2X:X2X2X2X2X1X2X2X3X2X2X2X1X3X2X2X2X2X2X2X<X;X2X;X;X2X;X;X2X2X;X2X2X;X3X<X2X2X2X<X;X2X<X<X2X2X;X<X2X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X<X2X<X2X<X<X2X2X<X<X2X2X2X2X2X2X2X2X2X2X2X<X<X<X;X2X:X2X2X2X2X:X2X<X<X:X2X2X<X:X2X2X2X<X<X<X<X<X<X*X;X<X2X:X2X2X2X2X2X2X,X:X2X2X2X2X2X2X2X<X2X2X<X2X*X2X;X*X2X:X2X;X;X7X2X;X;X2X2X;X;X2X2X<X:X2X2X2X2X;X2X;X2X;X2X;X;X2X;X;X;X;X;X<X;X<X<X2X2X<X<X;X3X;X;X;X;X3X3X3X;X;X3X<X<X<X2X<X2X2X2X<X:X:X<X;X2X2X3X3X1X<X:X<X:X<X:X;X;X;X;X:X:X*X>X>X;X<X*X&X<X<X<X;X&X;X;X;X;X=X;X;X;X=X=X#XE.#X=X;X#X=X;X=X=X=X;X=X=X=X;X=X=X=X;X=X;X;X#X=X=X=X=X*X=X*X=X=X=X=X#X#X#X-X;X#Xh.h.E.r.f.s.f.f.P m m u m u u u m u s u m M U d.d.d.d.d.h.h.d.a.d.h.T.E.~.~.~.~.~./.!.~.!.W.W.~.~.~.R.!.W.W.R.R.W.!.R.R.R.~.R.W.R.~.W.@X~.W.W.~.R.W.W.!.R.R.R.",
"+.%.$.+.#.$.$.$.+.$.$.$.$.$.#.2.1.1.1.1.1.$.O.$.O.%.+.1.&.#.#.#.4.4.#.#.#.#.#.#.$.$.$.2.$.2.$.3.5.%.2.#.2.2.2.4.1.1.4.4.1.1.4.4.3.1.1.1.1.O.o.o.3.j.E.j.j.h.#X2X2X=X=X2X;X=X;X=X=X;X;X2X=X;X;X;X;X;X;X;X;X;X;X=X;X;X;X=X;X;X=X;X2X;X=X;X3X=Xt.E.3X2X=X2X2X2X2X2X2X;X3X3X3X3X3X3X6X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X2X2X1X2X2X2X;X3X<X<X3X<X<X;X:X:X2X2X;X;X2X2X2X2X7X2X2X2X2X2X2X<X<X<X2X2X:X:X<X2X2X2X2X2X2X3X1X<X3X<X3X<X2X2X<X<X<X<X;X;X2X;X2X*X;X;X;X;X2X:X;X;X;X;X<X<X<X;X:X<X<X<X2X;X*X<X;X<X<X<X<X<X<X<X<X;X<X<X<X;X<X<X:X2X<X<X<X<X<X;X:X:X;X2X:X:X2X,X<X:X<X:X2X:X<X<X:X2X2X:X:X:X:X:X:X:X:X:X*X*X:X:X*X:X:X:X;X<X2X<X7X*X2X<X<X:X:X2X<X:X2X:X2X2X:X2X2X2X,X2X<X2X<X<X2X2X-X7X2X2X2X-X2X2X;X2X7X;X;X;X2X;X2X;X<X>X2X2X;X2X2X2X2X2X2X;X;X;X;X2X2X2X;X;X;X&X;X;X<X;X*X:X;X;X;X;X;X;X/.3X;X;X;X3X2X<X<X<X<X2X;X;X:X:X:X*X;X2X;X;X<X<X<X<X:X:X;X>X&X;X&X;X:X:X*X:X<X*X*X&X;X&X&X&X<X&X&X&X;X;X=X;X;X=X=X;X#Xh.E.=X;X#X=X=X=X=X=X=X=X=X=X=X=X;X;X=X=X#X;X#X#X=X=X#X=X=X=X#X=X#X=X=X-X#X#X#X#X#Xh.h.h.t.m m B U f.r.n.d.n.d.d.d.d.p.f.d.T./././.~././.~.~././.R.E.!.W.~.~.~.~.~.~.R.~.W.W.~.~.~.~.~.R.W.~.~.~.R.~.~.~.W.!.W.W.~.~.@X~.W.$X~.W.~.W.~.W.~.W.~.",
"$.$.%.+.$.%.O.$.$.$.+.$.$.$.2.#.#.$.#.#.1.+.+.$.$.+.+.$.$.$.1.2.#.#.4.#.$.O.$.$.O.$.$.1.3.3.3.3.3.$.3.3.1.3.3.3.1.3.1.3.4.4.5.4.1.1.1.1.<.+.h h <.j.h.j.j.E.#X=X=X=X;X#X;X=X;X=X;X;X;X;X;X=X;X;X=X;X=X;X;X;X=X=X;X=X7X=X*X*X*X;X=X=X=X7X3X-X7.N.6X2X=X2X;X;X;X2X2X2X;X2X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X2X2X<X:X:X;X<X<X>X:X<X<X:X:X:X:X:X>X;X:X:X;X;X;X;X<X<X<X:X<X:X<X2X2X<X:X1X<X2X<X2X:X2X7X:X<X2X:X:X:X:X7X:X1X<X:X*X;X;X;X=X;X;X*X*X:X;X:X2X;X:X:X:X;X*X2X:X:X:X:X:X:X:X:X:X<X<X:X:X*X:X:X:X:X:X:X:X>X;X<X<X<X<X>X<X<X<X<X<X<X:X<X<X<X;X<X>X:X*X:X:X:X*X:X:X:X<X:X:X:X:X:X&X:X&X&X*X*X;X&X;X;X&X;X&X&X<X;X&X&X<X<X<X1X<X<X3X1X:X:X<X:X<X1X:X:X:X:X:X<X<X<X2X2X-X&X:X:X:X:X:X;X;X-X2X:X2X2X:X:X2X:X:X*X>X2X<X&X<X2X>X<X;X<X;X;X;X*X*X*X*X;X<X:X:X:X*X<X<X:X:X:X*X>X*X&X:X*X%X=X;X<X<X<X&X<X<X<X*X&X:X*X*X:X;X;X;X;X;X&X&X;X&X*X*X*X*X&X:X*X&X&X&X&X&X%X&X&X;X&X&X&X;X;X/.&X&X#X;X&X&X#X=X$X&X<X~.h.W.;X=X&X#X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X=X$X#X#X$X#X#X#X$X$X+X@X$X$X$X@X@X=X#XE.h.E.t.B M Q.<X3X3X3X<X<X<X<X&X>X&X<X>X&X^.^.^.^.~.^.~.^.%X%X~.%X^.%X~.&XW.~.W.$X~.&X~.~.~.~.~.~.%X~.$X~.~.W.~.~.^.W.~.~.~.$X~.~.~.~.W.~.~.~.~.W.~.~.W.~.~.",
"$.$.+.$.$.$.O.+.+.$.$.+.+.$.#.#.$.#.#.1.$.O.$.$.$.+.%.$.$.$.$.#.#.#.#.#.1.$.O.O.O.O.$.1.3.3.3.$.3.3.$.3.3.3.1.1.1.1.4.1.1.4.4.4.1.1.<.4.1.1.<.<.t.h.E.j.j.E.=X;X#X;X#X;X=X;X=X;X=X;X=X=X;X=X=X=X=X;X=X=X*X*X;X=X=X=X=X=X=X=X=X;X=X=X#X;X2XE.,.N.6X2X;X2X;X;X;X<X;X;X;X;X;X;X;X2X2X2X3X2X2X3X2X2X3X3X3X;X2X2X3X3X2X1X2X,X<X:X:X2X;X<X<X&X:X:X:X:X:X2X7X:X<X<X:X:X;X;X2X;X<X<X:X:X:X<X<X:X:X:X:X:X*X:X<X:X:X2X*X:X:X:X:X:X2X:X*X*X*X:X2X:X=X7X;X2X*X*X;X*X*X:X*X*X>X*X:X:X,X:X-X:X:X:X-X7X:X-X7X-X<X*X*X:X>X:X:X:X:X:X>X:X<X;X&X<X&X<X&X<X*X&X>X<X:X:X<X<X<X>X:X*X:X*X:X:X:X:X:X*X:X:X:X*X:X&X:X:X:X:X:X*X>X*X;X&X;X;X&X&X&X<X;X&X%X&X<X1X&X&X<X3X:X:X:X:X<X:X,X:X>X&X:X:X:X:X<X:X>X*X>X:X:X:X:X:X;X;X*X,X,X;X2X:X:X:X:X*X>X2X2X2X&X&X;X&X;X&X%X&X;X;X;X;X=X;X*X:X<X<X<X>X%X<X3X<X&X&X*X&X>X<X<X*X/.;X&X&X*X<X&X1X<X<X:X&X*X:X<X&X%X%X%X^.$X&X%X&X%X$X%X=X&X*X=X%X=X%X;X&X%X&X;X&X/.&X&X&X;X&X;X&X=X=X;X;X;X&X=X&X;X=Xh.8X#X;X;X=X$X$X=X=X=X$X=X=X=X=X=X=X=X=X=X=X=X#X$X#X=X$X$X$X$X#X$X$X=X#XW.@X#X#XE.E.E.h.6.B d.~.<X^.$X/.$X$X/.~.^.^.^.^.^.^.^.^.&X%X%X%X%X%X%X~.%X~.~.~.~.~.$X~.&X~.~.~.~.~.~.%X%X~.~.~.~.~.~.~.~.~.~.W.~.W.W.~.~.~.~.~.~.W.~.T.~.~.~.%X%X~.",
"$.+.$.$.$.+.%.+.$.#.$.$.#.#.$.#.#.#.#.#.$.$.$.O.$.$.+.$.O.+.O.#.#.4.4.#.$.O.O.O.O.O.1.1.3.$.3.3.3.$.3.3.1.1.3.1.1.1.1.1.3.1.3.1.#.#.#.O.<.o.1.7.j.j.j.E.E.R.=X=X=X=X=X=X;X=X=X=X;X;X=X;X;X=X;X=X;X=X;X=X-X-X=X=X=X=X=X=X=X$X$X=X=X=X#X2X<Xh.,.N.3X*X=X;X;X~.&X;X#X;X#X2X;X;X;X;X;X2X2X2X;X;X;X;X;X;X;X;X2X<X:X2X2X;X2X:X*X*X>X*X&X<X<X<X*X:X;X<X*X:X*X>X;X*X;X;X*X7X*X*X;X<X<X;X:X:X:X:X*X:X<X<X:X:X,X2X;X*X:X:X7X*X-X*X-X:X*X*X*X:X*X*X*X*X2X*X;X=X=X2X*X-X:X:X*X:X*X>X-X:X:X:X:X:X:X:X:X:X:X:X&X:X>X*X-X:X>X:X*X:X*X*X&X>X>X:X&X<X&X<X<X^.>X&X>X&X*X&X>X:X*X:X>X*X>X:X>X:X:X>X:X*X>X*X:X&X:X:X>X*X*X&X=X&X&X&X&X&X&X&X;X&X&X&X&X;X<X&X^.^.&X<X:X:X:X:X:X:X:X:X:X>X:X:X:X>X&X&X:X&X:X:X>X-X*X-X=X-X2X1X>X-X-X:X>X*X>X&X*X:X:X1X<X3X<X<X<X<X<X<X;X;X;X;X1X<X:X%X&X:X:X*X%X&X<X1X:X:X*X*X*X*X>X:X2X<X&X<X<X;X%X~.~.%X^.&X:X&X&X&X%X<X<X*X*X&X<X*X&X:X:X>X:X<X:X&X&X&X&X&X%X&X:X%X;X<X&X~.&X&X&X;X;X;X/.&X&X&X&X&X&X&XW.h.E.;X;X#X$X$X#X=X$X$X#X$X#X#X=X#X#X#X#X=X$X#X=X#X$X#X$X#X#X#X#X$X#X$X@X=X#X;X#XE.E.E.r.6.B w.T.~.~.&X~.&X&X&X&X$X~.&X%X&X&X&X%X%X&X%X%X%X&X%X&X%X&X%X%X%X&X=X*X&X&X$X^.&X=X&X%X%X%X%X&X%X^.&X&X~.%X%X&X%X&X&X^.&X&X&X*X&X&XT.&X&X&X=X%X%X",
"$.+.%.$.$.$.+.$.#.#.$.$.2.#.#.#.1.1.2.#.O.O.$.$.O.O.O.$.$.O.$.#.#.2.#.2.1.$.$.1.O.1.1.$.3.3.$.$.3.3.3.3.3.1.1.$.1.1.1.1.1.1.1.1.#.+.+.@.1.o.<.k.j.E.j.j.E.$X=X=X=X#X=X=X#X;X=X;X#X=X=X=X=X;X#X=X=X=X;X=X=X=X=X-X=X=X=X=X=X=X=X=X=X=X#X2X*Xt.7.!.3X*X;X=X=X~.&X&X;X;X#X;X&X&X;X;X;X=X;X;X;X;X;X;X;X;X;X;X*X:X*X*X*X*X*X,X*X*X*X*X&X*X*X&X*X*X;X;X*X*X*X*X&X;X&X;X*X*X*X*X&X;X&X;X*X*X*X:X*X*X&X*X:X*X*X*X,X:X-X*X-X*X-X:X*X*X*X:X*X*X*X:X*X*X=X=X7X*X;X-X:X*X:X-X:X:X:X*X>X:X:X:X:X:X:X-X:X:X-X:X:X*X:X*X:X*X*X:X:X:X:X:X<X*X;X:X1X&X<X<X*X<X&X<X*X:X*X:X*X&X&X&X&X*X*X&X-X*X*X*X*X>X:X&X>X:X:X:X*X*X:X&X*X&X&X*X&X&X&X<X;X&X;X&X&X;X1X<X<X;X&X&X,X:X>X&X,X-X>X:X:X:X*X>X*X&X&X%X:X<X&X%X+X>X3X5X2X:X2X:X%X%X:X5X1X:X2X>X1X2X:X1X1X<X<X&X^.<X<X&X;X=X;X;X<X:X<X3X:X~.^.<X>X~.^.<X:X%X>X>X>X%X^.%X;X&X^.&X&X^.!.E.T.!.~.~.^.%X%X&X^.^.~.^.^.&X^.E.T.E.!.E.T.R.~.^.%X~.!.T.E.!.^.^./.N.d.8XT./.h.E.&X;X;X$X$X=X&X&X=X;X#Xh.h.#X;X#X$X=X=X$X=X=X=X=X=X=X=X#X#X#X#X#X=X#X@X@X$X$X#X$X@X#X@X@X@X@XW.=X#X#X#XW.h.E.8Xt.B B a.E.^.^.W./.$X~.$XW.&X~.%X*X&X&X%X%X%X%X%X%X~.%X&X&X&X&X&X&X&X&X&X&X&X&X*X&X&X&X*X&X&X;X*X&X*X*X*X*X&X&X&X;X&X&X*X*X*X;X;X&X;XN.>X&X&X&X&X&X",
"$.%.$.$.+.$.+.$.#.#.4.4.#.#.#.#.1.1.2.1.$.+.$.1.$.+.$.$.$.O.$.#.#.#.#.#.1.$.$.$.1.1.1.1.$.1.3.3.3.3.3.$.3.3.1.1.1.1.1.1.1.1.1.O.O.O.+.+.+.<.<.j.j.j.j.j.#X#X$X=X#X=X$X&X#X&X$X$X#X=X&X=X=X=X&X=X=X=X=X=X$X=X=X$X=X#X$X%X$X-X#X$X=X=X%X3X&X,.w.%X2X:X&X=X~.%X=X$X#X=X&X;X/.;X;X$X=X=X&X&X&X&X&X&X#X;X&X&X&X*X&X&X-X-X*X$X&X&X*X&X&X&X&X&X*X=X&X/.&X-X*X&X=X&X&X&X$X*X&X&X&X*X&X&X*X-X*X&X&X*X&X*X-X*X&X&X*X&X&X&X&X&X*X%X*X*X&X*X,X*X&X*X>X-X*X&X#X=X*X:X>X-X*X:X*X&X:X&X>X*X&X&X-X>X*X&X:X*X:X*X&X>X&X:X-X>X:X*X>X&X:X>X*X&X:X&X&X<X&X<X<X<X^.<X&X<X&X;X:X&X>X*X*X&X:X*X&X:X*X&X&X:X:X:X&X>X&X:X<X&X&X&X&X^.&X&X&X&X&X*X&X<X<X<X<X~.R.E.E.E.T.T.E.^.&X*X:X:X:X>X>X&X&X&X:X&X:X<X:X&X%XN.N.N.E.Q.N.!.%X!.V.N.E.!.T.N.T.!.E.N.T./.T.h.h.N.h.T.!.E./.E.T.d.d.h.T.^.T.d.d.T.T.d.d.T.N.d.N.N.T.N.h.d.h.s.f.d.n.T.d.d.N.d.d.f.f.d.s.w.w.f.w.s.T.T.T.d.d.N.T.s.6.6.a.T.T.T.N.N.T.T.^.^.N.t.d.T.T.d.d.d./.;X&X&X;X&X&X&X$X;X&XT.h./.*X$X$X#X=X$X=X$X=X$X$X=X-X+X#X=X#X$X#X$X=X=X#X@X@X#X@X@X@X+X@X@XW.@X@X@X$X@XE.E.8Xh.B M B d.!.^.~.^./.~.~.~.~.^.$X$X%X~.~.W.~.^.~.~.~.~.^.&X%X&X&X~.%X&X~.&X&X*X&X;X;X&X;X&X&X*X=X&X*X&X&X&X&X&X&X&X&X&X&X~.$X~.&X&X=Xn.%X=X%X&X&X$X",
"$.+.$.%.$.+.$.+.#.#.#.#.#.#.#.#.$.#.1.1.$.+.O.#.$.$.+.O.$.#.1.$.#.#.$.#.$.$.O.O.O.1.1.1.$.O.$.3.3.3.3.3.3.3.3.3.1.1.4.4.4.1.1.1.$.O.O.<.3.<.5.j.j.+Xj.j.E.#X=X#X=X#X$X$X$X#X=X$X#X#X#XW.#X#XW.$X=X=X=X=X$X$X-X$X#X=X+X$X$X-X$XR.#X#X$X3X!.N w.&X:X-X%X%X~.$X&X$X=X=X$X&X=X&X&X$X=X=X&X&X&X&X&X&X;X#X&X&X&X&X%X&X*X&X%X%X$X&X&X&X&X&X&X&X&X&X&X&X&X*X&X&X&X&X&X&X=X&X;X&X&X&X&X&X&X*X&X*X&X&X*X*X*X*X*X&X*X&X&X*X*X&X&X%X:X%X&X&X*X-X&X&X%X-X&X%X&X*X&X%X&X*X&X&X&X&X>X-X>X-X>X-X>X-X-X&X>X-X*X-X*X%X>X-X&X-X&X*X&X&X&X&X&X&X&X*X&X&X&X^.&X^.&X&X&X&X&X&X&X:X&X*X&X>X&X>X&X*X&X&X*X:X>X%X&X&X&X*X&X&X&X&X&X<X&X&X&X^.&X*X&X&X;X1X%XT.d.s.s.d.f.6.d.!.^.^.>X&X*X,X&X&X:X>X%X&X%X&X>X&X:XN.N.T.N.d.6.d.T./.T.N.N.N.y.f.d.d.s.n.N.T.s.U w.T.N./.!.!.T.T.d.d.d.N.T.~./.d.N.^.^.T.T.~.T.d.!.>X^.!.N.!.{.!./.Q.~.!.Q.T.}.>X/.T./.!.!./.T./.!.^.^.}.&X}.^.^.}.^.!.!.~.~.1X<X1X&X&X>X<X;X^././.^.&X~.T./.~.^.W.^.&X$X&X$X&X&X&XW.j.h.$X&X$X$X@X@X#X=X#X$X#X#X$X=X=X#X$X#X@X@X@X@X@X#X@X@X@X+X@X@X@X@XW.#X@XR.@X=XW.h.h.E.w.N u 6.n.B.!.^.&X=X~.W.~.~.~./.R.R.~.~.~.~.$X~.~.~.~.~.~.~.~.~.~.$X~.$X%X~.&X~.&X~.&X~.%X%X~.&X~.%X&X%X~.%X$X~.$X&X~.$X~.&X&X~.$Xn.%X~.~.~.~.W.",
"$.+.$.+.$.$.$.O.#.#.#.#.#.#.4.#.1.$.$.$.$.$.$.$.$.O.$.O.$.1.#.$.O.+.$.#.1.#.$.$.1.1.1.3.1.$.3.$.$.2.3.3.$.3.$.1.1.1.<.1.4.4.1.1.O.1.1.1.1.4.t.j.j.E.j.j.#X#X#X#X#X#X#X~./.~.$X$X#X#X$X=X&X$X$X#X#X#X#X=X$X$X$X$X+X$X$X$XR.$XW.W.=X#X+X<XE.u j.<X>X%X$X%X%X%X%X~.#X=X#X$XW./.;X&X=X=X;X#X/.&X^.&X#X;X&X;X&X&X&X&X&X&X&X&X&X&X&X&X&X&X^.&X&X&X&X&X%X^.&X&X&X&X&X&X&X*X<X&X&X;X&X&X&X&X&X&X<X;X^.&X:X:X:X&X&X:X:X&X%X&X>X*X^.>X*X%X&X>X*X&X>X&X&X&X%X&X&X&X$X~.-X*X:X&X*X:X*X&X*X:X*X-X>X,X*X:X-X,X*X&X*X&X>X:X-X>X*X&X&X&X<X&X&X&X&X&X&X<X&X&X&X&X&X&X&X&X&X>X>X&X&X&X&X*X:X&X&X&X&X&X%X&X>X>X&X&X&X&X&X&X&X>X<X^.^.<X>X>X^.<X&X&X~.!.E.!.~.~.!.~.!.&X=X*X&X>X&X>X&X>X:X*X:X>X>X^.%X:X:X%X>X1X5X4X>X>X4X5X5X>X>X>X}.1X4X1X>X>X4X1X}.}.>X1X>X5X4X1X>X^.}.1X1X5X5X5X}.OX1X1X}.>X1X1X>X}.>X>X>X1X>X}.Q.^.1X>X}.>X>X^.>X^.^.}.>X^.~.^.}.^.^.^.!.!.!./.^.1X}./.Q.!.}.>X!.n.N.!.Q.T.n.T./.;X&X&X&X^.^.^.&X^.&X~.~.%X~.=X^.&X&X~.h.h.E.~.$X=X*X#X$X+X#X@X#X$X#X@X@X#X=X#X@X@X@X#X@X@X@X@X+X@X@XW.@XW.W.$X#X@X$X$XW.E.E.E.T.f.k u K d.T./.^././.=X/.W.~.^.~.R.!.~.~.!.!.~.!.^.^./.~.~.!.^.~.~.&X~.^.~.~.~.~.~.^.~.~.^.~.$X~.&X~.&X$X&X^.^.%X%X$X~.~.~.~.~.~.n.~.~.W.~.~.W.",
"$.%.+.$.$.+.%.O.#.#.#.#.#.#.#.4.#.#.$.$.$.$.$.$.O.$.$.$.#.$.$.O.#.#.#.#.1.1.1.1.1.1.3.1.1.1.3.3.2.2.$.$.$.$.$.1.1.1.1.1.1.1.<.1.O.$.1.<.<.<.k.h.#X5.j.E.#X#X#X#X#X#X#X~.#X#X#X$X=X=X=X$X#X~.#X$X#X#X#X#X@X$X$X$X$X-X$X+X@XR.$XW.#X#X@X:XN.y N.2X%X&X&X%X~.~.&X~.;X#X$X$X$X$X$X$X#X#X#X&X&X&X~.&X;X$X$X/.~.%X&X%X&X%X%X%X&X&X%X%X%X&X&X&X&X&X^.&X&X&X&X^.~.&X&X^.^.&X^.&X&X&X&X&X%X%X%X&X^.~.&X*X&X-X>X%X%X:X:X>X%X$X*X>X*X<X&X%X%X*X*X&X&X>X*X&X&X&X>X*X>X%X>X&X-X%X%X-X-X-X&X-X-X:X-X:X-X:X>X-X&X>X&X:X*X&X>X-X&X:X&X:X&X&X>X&X&X^.^.}.}.}.^.oXoX^.^.oXoX!.oX!.oX!.{.oX!.oXoXoX^.{.oX!./.}.oX^.oXoXoX}.{./.oX}.}.oX^./.oX}.}.Q.Q.Q.oX}.oXoX}.oXoX^.oXoX{.{.oXQ.oX!.oXoXQ.oX{.Q.oX{.oXB.n.n.m.Q.m.m.b.c.n.m.B.Q.Q.n.n.n.m.m.Q.x.n.b.m.m.Q.` p.Q.Q.c.x.Q.x.u.m.m.T.M.Q.M.u./ c.c.b.m.b.~ ` m.Q.v./ c.Q.c./ / n.n.x.p.u.c.x.c.c.c.c./ u.c./ / c./ ` Q.Q.c.c.m.Q.n.c./ u.M.n.x./ i.Q.oXoXoXoX/.oXoXQ./.Q.oXQ./.oX/.oX^./.^./.d.n./.!.Q.Q.!.Q.Q./.Q.!.Q./.Q.Q.!.Q.Q.Q.Q.!.Q.Q.T.T.Q.!./.Q.T.T.Q.Q.Q.Q.!./.Q.Q./.T.d.m.n.! f z ~ x.n.(.Q.Q./.Q.Q./.Q.Q.Q.Q.Q.Q.oXQ.Q.oXQ.Q.Q.Q.Q.Q.Q./.Q.Q.Q.Q.Q./.Q.Q.Q.Q.Q./.Q.Q.Q.oX/.Q.Q.Q.Q.Q.!.!.!./.~.W.~.~.~.~.d.W.!.~.~.~.~.",
"#.#.O.#.O.#.#.#.#.#.#.#.#.2.#.2.$.$.$.$.$.1.$.$.$.#.#.2.#.#.#.$.#.#.$.1.1.1.$.1.1.1.1.1.$.$.3.3.3.3.1.1.1.1.1.1.1.3.1.3.1.1.1.+.+.1.<.1.3.j.j.j.j.j.j.E.#X#X#X+X#X#X#XW.#XW.#X#X@X#X@X#X#X#X#X#X$X$XW.@X$X+X$X$X$X$X$X$XW.W.$X~.W.W.*X*Xj.u N.5X>X&X%X%X/.~.&X~.~.~.~.~.~.~.~./.%X/.^.~.~.&X&X/.~.~.~.~.&X^.~.^.%X%X%X^.%X^.&X~.~.&X~.&X&X~.^.^.&X&X~.&X&X~.^.~.^.&X&X&X&X&X^.&X&X&X$X&X^.*X>X&X=X&X*X>X~.~.%X&X&X&X$X&X&X&X$X$X%X&X%X&X*X:X*X*X>X:X&X;X<X<X*X>X*X&X&X%X&X&X>X&X*X&X-X*X&X&X&X%X%X%X-X&X%X>X>X-X&X&X>X&X&X&X&X%XQ.XXbXmXNXNXAXAXAXAXAXDXAXAXBXBXAXAXAXAXAXAXHXSXAXSXAXHXAXAXAXZXHXHXAXAXAXAXAXDXBXAXAXAXDXHXBXBXMXBXBXBXAXNXAXBXBXBXBXBXDXBXBXDXAXFXnXAXAXNXNXAXDXDXAXnXzXvXbXzXvXlXOXlXlXlXbXmXbXjX.XlXzXSXzXzXlXzXbXSXSXzXlXSXnXnXAXSXlXzXAXDXnXnXNXzXNXnXzXSXSXGXSXzXzXSXSXSXnXDXDXzXSXSXSXSXSXHXNXNXnXNXAXNXNXSXSXSXSXSXzXnXzXSXHXSXSXAXDXAXSXAXAXAXDXSXSXSXSXAXDXAXSXSXHXHXmXmXSXmXmXSXNXSXSXSXSXDXDXbXOXAXAXSXSXSXSXSX6XCXSXSXSX6XSXCXSXSXMXMXMXMXMXMXMXMXMXMXMXMXCXMXMXMXMXMXSXSXSXCXCX6XbXbXOX(.(.Q..XOXSXSXSXSXSXSXnXSXSXbXSXSXbXbXSXSXSXSXnXnXSXnXmXmXnXbXSXmXSXbXSXSXbXSXSXSXbXSXSXbXSXSXCXSXSXnXSXbXbXbX4XOXT./.!.W.~.n.~.W.W.~.W.~.",
"#.%.#.O.#.#.#.#.#.#.$.#.#.#.4.1.$.$.$.1.1.$.O.O.O.#.#.#.#.#.#.1.1.#.1.$.$.$.1.1.1.1.3.2.3.3.3.3.1.1.$.1.1.1.1.3.1.1.3.<.1.1.1.1.1.1.+.+.3.5.j.j.j.r.j.#X@X+X+X#XW.W.#X#XW.#XW.#X@X@X@X@X@XW.W.#XW.@X@X$X+X$X+X$X+X+X~.+X@XW.%X@X~.E.<X$X6.k !.3X%X~.~.^.&X&X^.<X1X1X1X>X>X<X1X&X<X<X1X1X<X<X<X;X<X<X<X&X<X<X1X<X1X<X1X1X1X<X1X1X1X<X1X1X<X1X3X1X<X1X<X<X1X1X<X<X<X<X1X3X3X3X5X1X<X1X3X3X5X3X1X<X>X1X1X>X:X&X1X1X5X3X<X<X3X1X3X6X3X4X3X3X5X1X1X5X1X4X>X4X1X1X1X1X1X5X:X&X&X&X-X&X-X-X>X&X-X>X-X%X-X%X>X%X-X&X-X%X&X%X&X%X&X&XQ.XXSXSXSXSXBXSXBXSXAXBXAXAXAXBXAXAXZXAXAXAXSXAXZXSXZXAXAXZXZXAXAXAXAXAXBXBXBXBXAXAXBXBXBXAXAXBXmXNXNXBXBXBXBXBXBXBXBXBXBXBXNXBXBXBXNXAXAXAXNXAXAXNXSXAXDXDXHXAXAXAXHXHXHXHXHXFXNXmXAXSXAXDXAXSXAXAXAXHXAXSXAXAXAXAXSXSXzXSXDXSXnXSXSXSXNXNXnXFXSXSXnXzXzXSXSXSXlXzXSXzXzXSXSXzXSXzXzXnXnXnXbXzXbXnXzXzXlXzXAXDXDXAXlXlXzXnXzXOXzXNXSXlXlXlXOXzXSXlXOXjXlXjXlXnXNXNXNXNXNXSXNXSXSXNXAXNXnXDXAXnX4XCXSXSXSXCXSXCXSXSX6XSXSXCXSXSXSX6XMX6XMXMXMXMXMXMXMXMX6XMXSXMXSXCXMXMX6XMXSXSXSXSXbXbXSX.X(.(.(.OXjXzXzXSXnXSXSXnXSXSXbXSXSXSXSXbXnXSXnXSXmXmXmXmXmXmXSXbXSXbXbXSXSXbXnXSXSXbXbXSXbXSXSXbXSXnXSXnXSXbXSXSXbXoXT.R./.d.E.!.!.E.E.!.",
"#.#.#.#.#.%.#.#.#.#.#.$.#.4.2.2.1.O.$.$.O.$.O.$.$.$.1.#.1.#.#.#.#.1.$.1.O.$.$.1.3.1.1.2.2.2.3.3.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.,.<.j.E.j.j.t.h.#X@X+XE.#XW.W.W.W.W.W.#X#XW.W.+XW.W.+XW.W.@XW.+X$XR.+X!.+X+X!.+X~.+XW.$X~.~.R.;X/.B B !.>X^.~.&X&X>X^.~.!.T.N.T.T.Q.Q.T.T.Q.Q.Q.T./.T.d.N.T.Q.N.T.T.T.d.T.N.B.T.T.T.m.Q.n.T.T.Q.n.T.m.n.T.T.n.n.n.n.T.n.T.T.n.T.p.n.p.v.d.d.p.p.p.p.d.v.s.i.s.i.N.1XCX1XT.p.f.U s.d.p.f./ y.y.y.y.f.8.8.8.y.8.U i.u.U 6.U 8.N.%X>X>X&X&X&X>X&X&X&X>X&X&X%X%X%X%X%X%X-X>X%X&X&X%X%X&XQ.bXBXBXNXSXNXBXBXBXBXBXBXBXBXAXAXAXAXAXAXAXAXZXSXZXAXZXSXSXAXAXBXAXAXBXBXBXBXBXBXBXZXBXBXBXBXAXBXmXBXAXBXBXBXBXBXBXBXBXDXBXNXNXNXBXNXSXAXNXAXDXAXNXAXSXSXSXnXnXvXlXOXOXlXzXlXbXzXOXOXlXlXbXzXOX.XOXOXlXjXlXlXlX.XzXAXzX.X.XnXnXzXlXlXlXjXXXlXlXlXzXzXlXjXOX.XzXlXlXlXlXjXlXzXSXzXzXlXlXOXOXvXlXU.nXnXbXlXOXbXzXSXAXDXSXzXSXnXbXzXbXSXzXlXvXzXzXzXSXzXzXbXnXnXnXmXSXSXNXNXmXmXmXNXmXNXAXSXSXnXSXSXbXOXCXSXSXSXSXSXSXSXCXCXSXSXCXSXSXCXMXMXMX6XMXMXMXMXMXMXMXMXMXMXMXSX6XCXMXMXCXMXSXmXbXbXSXOX(.(.(.(..XlXOXSXSXSXSXSXnXzXSXvXnXSXbXSXSXnXU.mXmXNXmXmXbXSXSXbXbXSXbXSXbXbXSXbXlXSXSXSXmXnXSXbXbXSXbXSXbXSXbXSXbXSXzXT.E.s./.R.E.R.!.R.",
"#.#.O.O.#.#.$.#.#.#.$.#.#.#.#.1.$.O.$.$.1.$.$.$.#.#.#.1.1.2.1.1.#.#.1.$.1.$.1.1.3.3.2.3.2.3.3.1.1.$.1.1.1.1.1.1.1.1.1.1.1.1.1.4.<.1.<.1.3.j.j.j.j.j.h.+X#XR.+X#XW.W.E.W.W.W.E.#XW.W.+XW.W.+X#XW.W.@X+X+X~.$X+X%X$X$X+XR.$X$XW.!.~.W.;Xh.N 6.$X:X~.~./.~.<X^.f.P u f m u m u u m u u u m u e m m m m m u u u u m u u u u f u u u u s u u f u u f s r u s u u s r s r u r u m u s s m s u e u g g u y t u B.4Xs.f t t r r f m r t r u u y r u g g g r u f f r g y t j Q.1X>X&X&X&X>X&X&X&X&X%X&X%X-X>X-X>X&X>X-X>X>X&X&X%XQ.vXBXAXAXAXSXSXBXBXBXBXBXBXSXBXAXAXZXAXZXAXAXAXAXAXAXAXAXAXAXZXAXAXZXZXBXBXBXAXBXAXZXAXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXNXAXAXAXNXAXAXNXSXDXAXAXNXnXbXbXbXnXnXSXnXnXNXNXnXnXNXNXAXSXAXFXAXSXAXDXDXSXAXDXSXSXDXDXAXNXDXSXNXAXnXSXSXnXAXDXSXnXnXSXDXAXDXAXSXSXDXSXAXHXHXHXNXNXHXSXHXNXDXDXAXDXDXAXFXAXAXSXAXAXSXnXmXNXNXnXSXAXAXAXDXAXSXnXmXmXNXnXnXnXvXSXNXSXmXmXmXSXmXNXSXAXSXSXSXSXSXOX6XMXSXSXCXCXSX6XSXSXCXSXSXCXSXSXMXMXMXMX6XMXMXMXMXMXMXMXSXCXMXCXMXSXMXMXSXSXSXCXbXbXbXbXOX(.` (.).`.OXnXnXSXbXSXSXSXSXSXSXnXSXnXHXHXGXNXmXmXSXmXSXbXSXSXSXbXSXbXSXSXnXSXSXSXSXzXnXSXbXSXSXbXSXCXSXnXSXbXSXbXSX4Xm.d.!.R.!./.W.R.",
"O.O.+.$.#.O.%.#.#.#.#.1.$.1.1.1.$.$.$.O.$.$.1.$.1.1.2.#.1.1.#.#.#.$.#.#.1.1.1.2.1.1.3.3.3.3.3.1.1.$.1.1.3.1.1.1.1.1.1.1.3.3.3.4.5.<.1.,.5.j.j.j.r.j.#X#X#XE.E.E.E.+XE.W.#XE.+X+XR.R.@XR.#XE.#X#X@X@XW.@X+X$X$X-X$X+X+X+X$X+X~.R.~.!.2XN.u 7.%X;X&X~.W.&X&XT.m 5 u g f f u u s t i s u m m n m P m n m r m s u m f f d d d d f m d d s f d m m d m m s m f d m m m i m s f s m m m m m Z Z x d d f l 4 r Q.OX/ f r m m m m d m s s m s u g u f f f l x x l d V S q y T.6X>X%X%X>X&X&X>X&X&X:X%X>X%X&X&X*X>X%X&X-X%X&X&X%XoXAXAXAXBXBXDXBXBXBXNXAXBXBXBXBXAXAXAXAXBXAXAXAXAXAXBXBXAXAXAXZXAXAXDXAXAXZXAXAXAXBXBXBXDXBXBXBXBXBXBXBXBXAXAXAXNXSXBXBXBXBXBXBXBXBXBXBXSXAXnXNXSXNXAXNXSXAXDXDXNXNXSXSXnXSXmXnXNXNXnXNXDXnXbXnXSXnXnXnXAXSXnXzXnXnXnXmXnXSXnXbXbXnXnXnXbXvXnXnXbXbXnXnXzXbXbXSXzXzXbXlXlXlXzXOXlXOXSXzXbXzXbXlXzXHXmXOXOXzXzXlX4XmXnXlXvXvXlXOXlXOXvXvXlXOXOXOXXXlXvXvXlXOX.XOXlXOXOXzXmXSXNXmXNXmXNXmXSXSXSXSXSXSXSXlXOXbXSXSXSXSXSXSXSXSXSXCXSXSXSXCXCXMXMXMXMXMXMXMXMXMXMXMXMX6XMXMXCXSXSXSXSXCXSXSX6XbXbXbXlXoX(.(.(.(.`.lXSXSXzXSXVXNXmXSXbXSXnXSXNXmXmXmXmXmXmXNXbXSXmXnXSXbXSXSXbXSXbXSXSXSXbXSXbXSXnXSXbXSXbXSXnXSXnXSXbXSXbXSXOXv.R.R.R.E.~.W.",
"%.O.#.$.#.#.+.O.#.%.#.#.O.#.1.#.$.+.O.O.O.$.$.$.#.1.1.2.1.#.#.#.#.1.1.$.O.$.$.$.1.1.1.1.1.1.1.3.3.1.3.3.3.3.3.3.3.3.3.3.3.<.3.4.4.1.,.1.j.j.j.j.t.h.8X#X#XE.E.#XW.E.E.E.E.E.E.E.R.W.R.R.E.#XW.E.R.@X@XW.+XR.+X+X+X$X+X+XR.+X$X~.R.~.3Xs.t N.:X*XW.$X/.<XOXd.m m m f g f u t u m s 5 5 5 m P / P P s m e e 4 r 7 s i i d d s d 7 d s i 5 e d d d 7 s 7 7 i i d d 7 m _ E d s d i 7 7 7 7 a a d l x l i f (.OX~ f m m d d m 7 Z ^ m.` F m Q M.c.W V l l x l Z Z V g u m.6X:X%X%X%X-X%X&X&X&X&X%X&X%X>X>X-X%X%X-X>X%X&X%XB.nXAXAXNXAXBXBXBXBXBXDXBXDXBXBXBXBXZXAXBXBXBXBXZXBXAXAXBXAXSXBXAXZXAXAXAXAXDXBXDXBXAXAXDXBXNXBXBXAXBXmXBXAXBXNXAXBXNXBXBXBXBXBXAXBXBXBXBXAXSXAXAXnXNXAXSXFXnXNXAXSXzXzXlXlXlXvXzXnXOX.XzXnXvXlXbXzXlXlXlXSXzXjXhXlXOXlXzXzXlXjXjXzXvXnXnXlXlXlXnXbXbXnXNXbXlXzXSXSXbXlXzXbXbXlXlXzXSXSXSXmXzXbXbXmXHXNXzXvXSXSXbXlXnXAXnXnXnXNXNXSXnXnXNXmXlXlXnXNXAXNXmXmXHXSXSXSXHXSXnXmXNXSXSXSXmXNXSXnXSXSXSXSXSXSXSXOXbXAXSXCXSXCXSXMXCXSXMX6XSXSXSXMXMXMXMXMXMXMXMXMXMXMXCXMXMXMXMXSXCXSXSXCXSXSXCXSXbXbXbXSXOX(.(.(.(.`./.OXzXSXSXmXMXnXmXSXbXmXbXmXnXmXmXmXmXmXNXSXbXmXbXbXSXbXbXSXbXSXbXSXbXSXbXSXbXmXCXSXbXSXbXSXbXmXmXSXCXSXnXmXs.~.W.W.!.~.R.",
"O.%.#.#.#.#.#.#.#.#.#.#.$.1.1.$.$.+.+.$.+.$.O.#.#.#.1.#.1.1.1.O.O.$.O.$.$.$.1.1.2.1.3.3.1.1.1.1.3.3.$.3.3.3.3.3.3.3.<.3.3.3.3.3.1.1.1.<.5.h.j.r.j.h.8X#X+XE.+XE.#XE.E.W.#XE.E.R.R.R.R.E.+XE.E.#X+XW.@XR.+X+X$X+X+X+X%X+X$X$X$XW.R.~.<Xf.y B.2X&X~.$X~.&XOXp.u f f g y y u N B B B B B P B B P B P P P P m m A P P P T Z d Z L F F P ` ` V s s Z F E P ^ ` E S s s ` OX(.P d Z P ` c./ ` c.^ D c c f e s Q.4X/ u d m Z 7 e f Z.VXvXn.L c.4XbXoXG p d l l Z f l f f u n.4X&X&X%X>X%X&X&X-X%X%X%X%X%X%X%X%X%X%X>X%X%X&X%XN.BXBXBXBXNXAXBXAXBXBXBXBXBXBXBXBXBXBXMXAXBXBXBXBXBXAXBXBXZXSXBXBXAXAXBXBXBXDXBXBXBXDXBXDXDXBXBXmXBXmXNXBXBXNXNXAXNXBXBXNXNXNXmXNXBXBXDXBXNXNXSXSXDXAXAXDXSXnXAXNXnXnXAXNXnXNXNXDXHXnXbXnXAXNXNXDXAXSXAXAXAXAXFXAXHXSXnXAXSXHXAXnXNXNXHXDXDXDXNXNXDXDXDXGXHXAXAXDXDXAXDXSXHXGXDXFXDXDXAXSXNXHXHXHXSXmXHXHXAXSXDXDXAXSXSXAXHXNXNXSXAXHXHXHXAXAXAXSXAXAXAXNXAXHXFXSXHXAXAXNXNXNXSXNXNXNXSXmXnXSXSXSXSXSXSXSXbX4XnXHXSXCXCXSXSX6XSXSXSXCXCXSXMXMXMXMXMX6XMXCXCXMXMXMXMXMXMX6XSXCXSXbXCXSXCXSXSXbXSXbXlXlX.X(.Z.M.(.(..XOXnXSXMXNXnXmXbXSXSXbXmXmXmXnXmXmXmXnXbXmXnXSXbXSXbXSXbXbXbXSXbXSXbXSXbXSXbXSXCXSXnXSXbXSXbXmXnXSXbXSXmXd.R.!.R.R.!.R.",
"#.#.#.#.O.#.O.#.#.#.#.#.O.$.$.$.+.$.+.$.$.+.$.#.#.#.1.#.$.1.$.O.O.+.$.O.1.1.1.3.1.1.1.1.1.3.1.1.1.$.$.3.3.3.3.3.3.3.3.3.3.3.3.3.<.1.<.<.j.j.j.r.h.h.W.+X#XE.E.E.E.E.E.R.E.E.E.E.R.R.R.R.E.+XE.#X@X@XW.@X+X+X+X-X+X+X%X-X$X$XW.R.R.*X%XU k !.3X;XW.$X/.>X^./ t e r y j i.E.E.8X8X#X8Xh.8XE.8X8X8X8X/.d.f.m.m.m.` ` (.oX Xc.u.oXXX(.M.c.M.XXoX^ L .XXXoXM.c.m..XA.^ / .XoXM.M..XoXx.` (.OXlXA.T l d f r f Q.4X/ r r Z s m Z ` vXlXc.S ! XXbXoXj r D E A l d d f s u u n.3X>X&X%X%X%X%X%X&X&X>X&X%X%X%X%X%X%X%X%X%X&X&X&Xn.BXBXAXBXAXBXBXNXBXNXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXAXAXAXBXBXAXAXBXBXBXDXBXBXBXBXBXBXBXBXBXBXAXNXDXDXNXSXAXDXAXBXBXAXAXDXDXDXDXDXBXNXDXDXFXAXSXAXAXSXSXAXDXSXSXDXDXHXHXHXSXFXHXHXHXAXDXFXDXAXDXAXAXAXAXSXDXGXAXDXDXDXHXHXHXFXDXDXDXDXDXDXNXDXDXDXAXAXDXDXAXAXAXDXDXAXAXAXAXDXDXSXSXmXHXNXNXHXSXNXHXSXnXSXmXnXSXAXSXmXSXHXnXvXnXNXnXnXmXnXVXNXNXSXNXnXbXbXbXSXAXnXNXmXHXNXSXSXSXmXSXSXSXnXnXSXSXSXAXMXOXOXAXSXSXSXCXSXSXSX6XSXSXSXCXMXMXMXMXMXSXMXMXMXMXMXMXMXMXMXMXSXSX6XSXSXCXSXSX6XbXSXSXOXSXlX`.(.(.Z.(.`..XjXzXmXVXSXbXSXbXSXSXmXmXmXmXmXmXmXmXSXbXSXbXSXbXSXbXSXSXSXbXSXbXSXbXSXbXSXnXSXbXSXbXSXbXSXbXSXbXSXbXSXi.W.!./.R.!.!.",
"#.#.#.#.#.+.$.$.#.O.%.O.$.#.$.O.$.$.$.$.O.O.$.O.$.$.$.#.1.1.O.O.O.+.O.O.1.O.3.1.1.1.1.1.1.1.1.1.$.1.1.1.1.1.1.1.1.1.1.1.1.O.1.1.1.,.1.7.j.j.e.r.h.W.@XW.R.R.E.#XE.#XE.E.#XE.E.E.E.+X+XE.+XE.+XE.R.@X@XW.R.@X@X+X+X#X+X#X#X@XW.W.~.2XE.B k %X1X-XR.R.>X:X}.! r u y j 0.V.J.J.#Xl.V.j.l.#Xl.#XJ.J.#Xj.q.q.,XoXM.v r L XXvXM.u.}..X/ r s W .XvXm.` XXoXQ s g ^ XXvXm.c.{.(.c.oXbXoXL V c.oXoX_ l a f l r f Q.4X8.u r s s T |.nXlXM.T m.CXVXm.K 9.G.oXoXA._ l d V Z s u v.4X1X&X>X&X%X%X&X-X>X&X%X&X*X%X&X&X>X&X%X%X%X%X&Xn.AXAXBXBXBXBXBXNXBXBXZXBXBXBXBXDXBXBXDXBXBXBXBXBXBXBXBXBXBXDXBXBXBXNXBXDXBXBXZXDXBXBXDXBXDXBXBXBXBXVXnXnXnXSXnXmXnXSXmXnXVXnXnXnXnXnXnXnXnXbXnXbXzXnXnXAXnXSXSXAXSXVXbXbXzXbXnXbXzXSXSXSXbXSXzXSXNXnXlXvXVXVXbXvXnXVXVXbXbXzXzXSXbXnXbXmXvXlXvXvXvXnXbXlXjXnXnXvXvXlXbXlXlXlXOXlXOXbXlXOXOXOXjXlXzXbXmXbXOXU.bXbXOXlXbXOX.XvXnXzXOXOXOXOXXXvXbXvXvXbXbXvXlXXXXXvXVXBXBXNXmXAXNXNXAXSXnXSXSXSXnXSXSXSXSXSXAXOXOXSXSXMXMXCXSXMXCXSXCX6XSXCXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMX6X6XCXSXSXSX6XSXSXSXSXbX6X6XzXbXOX(.Z.m.Z.(.(..XOXvXnXAXSXSXAXSXbXSXSXbXSXnXSXmXnXSXnXmXnXmXmXVXNXbXSXnXSXSXCXSXbXSXnXSXbXCXSXnXSXbXSXbXSXbXSXnXSXSXp.!.R.R.R.!.W.",
"#.#.%.$.O.#.#.#.#.$.O.$.$.1.$.O.+.$.#.$.$.$.O.$.$.$.1.$.#.#.1.+.O.O.O.O.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.$.1.1.1.1.,.O.+.O.O.<.o.<.k.j.j.j.j.h.W.@XR.E.R.#XE.E.E.#XE.E.E.E.E.E.+XE.+XE.+X#XE.R.@XW.@X@XR.+X~.+X+X+X@X@XR.W.W.&X1Xh.u M &X,X%XR.~.%X>XQ.H u u y j q.e.k.5.k.5.:.&.5.k.5.5.4.4.l.5.q.q.H.oXG.M.L T (.oX^ / CXoXW L M.oXQ.` z W XXXX` G b.A.m.` F ` XXA.T F z.A.m.m.m.A.oXc.T f f f r j oX4Xu.u f Z f E .XlXM.Z E A..Xm.D f ^ A.A.M.c.T l d x z u r n.5X1X^.&X&X%X%X%X>X&X%X&X%X*X%X&X&X%X%X>X%X%X%X%Xn.BXBXBXBXBXBXBXBXBXNXDXDXZXBXBXBXBXBXBXBXBXDXDXBXBXDXDXBXDXBXBXDXDXDXBXBXBXBXBXBXDXZXBXBXBXBXBXDXmXvXXX4XlXlXlXXXOXlXlXzXlXXXXXjXlXvXlXlXlX.XXXXXOXbXbXnXNXAXnXAXAXSXnXvXvXvXlXOXOXOXzXlXOXOXOXOXXXXXXXlXVXnXlXXXlXNXVXnXbXlXlXjXOXbXzXnXvXlXvXbXvXnXnXlXlXNXnXvXvXvXnXnXbXbXbXbXzXSXSXbXSXSXbXSXmXNXHXSXnXzXHXHXSXnXNXnXbXnXNXHXHXNXNXnXnXAXDXDXNXVXNXNXmXNXmXNXAXAXDXNXmXmXNXSXSXSXSXnXnXSXnXSXSXSXnXSXAXnXOXbXmXSXSXMXMXMXSXSXSXSXSXSXMXMXCXMXMXMXCXMXMXMXMX6XMXMXMXMXSXSXSXCXSXbXSX6X6XSXSXSXCXzXbXlXoXC.(.Y.(.(.`.`.lXnXnXnXnXnXSXnXSXHXSXbXmXmXmXmXnXmXmXSXmXmXmXNXSXbXSXnXbXSXnXSXbXSXbXSXmXmXSXbXSXCXSXbXSXbXSXbXSXd.R.~.!.W.!.R.",
"O.+.$.+.O.#.#.#.#.O.#.#.1.#.#.#.$.$.1.#.O.$.$.$.O.$.$.1.1.1.1.1.1.1.O.O.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.4.4.2.3.1.1.1.1.+.+.O.+.,.o.o.<.j.j.j.t.r.h.@X#X#XE.W.R.E.E.E.E.#X8XE.E.#X+XE.E.E.E.E.#X#XR.@XR.@X@XR.+XR.R.+X+XW.+X+XR.R.~.1Xs.y K >X1X,X%X~.}.1Xn.m r u u y k @.q.&.<.4.&.H.q.&.%.&.&.&.q.&.q.q.j f D E V f Z Z f _ XX(.F V E Z l d a ~ jX(.T Z C f d a d x E C l p d s d V l Z Z x l l l d e f oX4X^ r f m l Z D Z d d C m f f l f l l l d l l c d l f s t u.5X>X}.%X%X%X%X&X>X&X%X%X%X%X&X%X&X%X%X%X%X^.%X&Xn.BXBXBXBXBXBXBXDXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXZXDXBXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXBXBXnXbXNXSXmXnXnXnXmXnXAXNXVXVXNXNXNXNXBXSXFXSXSXSXNXDXDXDXSXSXnXAXAXSXNXNXAXHXHXSXSXGXHXAXSXSXzXnXNXnXNXFXDXDXAXDXDXVXNXHXGXHXDXDXDXSXmXAXDXDXNXNXDXDXAXDXBXNXNXNXnXNXmXnXAXAXSXSXzXSXSXSXAXSXSXmXmXbXzXSXSXHXnXnXnXnXnXmXnXzXnXbXvXNXFXbXvXbXnXbXbXvXvXnXVXbXvXlXvXvXvXOXlXnXSXnXAXSXnXSXnXSXSXSXSXnXSXAXSX4XOXCXSXSXMXCXSXCXSXCXSXCXSXCXMXSXMXMXMXMXMXMXMXMXMXMX6XCXMXSX6X6XSXSXSXCXSXSXCXbXSXCX6XlXSXOX(.M.(.Z.(.(.(. XXXzXSXzXSXSXnXmXU.mXmXnXmXmXmXSXnXmXnXnXmXNXnXbXSXbXSXnXmXmXmXSXbXSXnXSXnXSXbXbXSXnXSXbXSXbXSXnXd././.~./.!.R.",
"O.+.+.$.+.O.#.#.#.#.#.#.1.#.#.$.$.$.1.#.$.$.O.$.1.1.$.O.+.1.1.1.1.O.O.1.+.1.1.1.1.1.1.1.1.<.1.1.1.1.3.4.5.5.5.4.1.1.+.X.+.+.1.o.o.,.<.j.j.r.t.j.E.#X#XE.W.+XR.E.#XE.E.E.#XE.E.E.E.E.E.#X#XE.E.E.R.W.+XR.R.+XR.R.W.+X#X+XR.R.W.R.&X1XU y s.:X,X%X^.^.}.>Xv.u y u u u k k q.v q.q.v q.H.@.q.q.q.q.q.H.q.v y t e e i s s s i f V z s i s 4 e i s f m V d s d p p d s s e s p p d g s s e s p p i f f i 5 f Q.XX! t 5 s l f 7 e d f s p i e p s a e r i 7 i d p f w 5 t v.4X>X>X%X>X%X%X-X&X%X%X%X>X%X&X%X&X%X>X%X-X>X&X^.n.BXBXBXBXBXBXBXBXBXBXBXBXBXBXDXNXBXNXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXNXBXBXDXZXBXBXNXBXBXBXBXBXBXBXBXBXBXAXDXSXNXSXAXAXSXFXDXAXDXDXZXDXDXNXSXFXSXFXDXSXnXAXSXnXSXSXDXAXnXlXbXbXnXbXSXlXlXlXlXbXbXlXlXnXNXnXnXvXlXbXlXlXjXlXlXOXOXlXlXnXbXlXlXvXlXlXzXvXlXlXlXlXlXvXnXzXlXlXjXOXlX.XjXlXjXlXOXOXlXzXvXzXOXOXlXzXbXvXlXlXlXjXbXbXvXOXOX.XlXnXvXXXlXlXlXlXXXlXvXvXvXlXvXOXvXvXvXbXnXSXSXAXSXSXSXSXSXnXbXSXSXSXSXHXSXOXOXSXSXMXMXCXSXCXSXSXCXSXMXMXMXMXMX6XMXMXMX6XMXMXMXMXMXMXSXSXbXSX6XSXSX6XSXSXbXSXSXbXvXbXvXXX(.Z.Z.(.(.(.`.oXOXbXbXnXnXSXmXmXmXmXmXmXNXnXSXnXmXmXmXmXVXVXSXnXSXnXSXCXmXmXCXSXbXSXbXSXnXSXnXnXmXnXSXbXSXCXSXp.!.~.R.R.!.R.",
"$.+.+.O.#.#.#.#.#.#.4.4.4.2.#.#.#.2.2.2.1.$.$.O.O.$.O.O.+.O.#.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.4.1.2.4.1.4.4.4.1.1.O.1.1.1.1.<.@.<.k.j.h.j.a.h.E.#XE.E.E.#XE.#XE.#XE.#XE.#XE.E.E.R.E.E.R.R.W.R.R.R.R.+XR.R.@X+X+X+X#X+XR.R.R.~.>X>XK u N.>X,X~.~.~.^.&Xn.M y y r r y r p f v v D v v x v v v j v 9.K u t r r t e e e 4 e t t t t t e r r r e t t t r 4 e i e i r i s i y g g s s s s s s s s f m m f ! }.vXB.P m u m f u f m f f m m M j f m M m m m M m m m P M U Q.1X>X&X>X%X%X&X&X&X&X%X%X&X>X&X&X&X&X-X&X>X&X>X&XT.AXNXNXAXBXBXBXBXBXBXBXBXDXBXBXBXBXBXBXBXBXBXBXBXBXZXBXBXBXBXBXBXBXBXBXBXBXBXDXNXBXBXBXBXBXDXBXBXBXBXBXBXNXSXSXSXSXNXSXAXAXNXAXNXNXNXNXDXAXSXNXnXAXAXSXSXAXnXFXSXAXAXbXbXbXvXlXlXlXOXlXlXlXlXlXlXlXbXVXnXnXnXzXNXnXlXbXnXbXzXbXbXVXNXNXnXnXnXnXVXNXNXnXnXVXVXnXNXDXnXAXDXSXnXNXDXnXDXDXAXNXnXDXHXnXNXNXNXSXSXHXHXAXNXNXNXHXHXSXAXAXAXAXDXNXNXNXNXDXAXAXBXBXBXAXDXDXNXAXAXHXAXSXAXAXNXnXSXbXSXnXSXzXSXSXSXSXSXSXOXOXAXSXNXSXSXSXCXSXSXSX6XMXMXMX6XSXCXMXSXMXMXCXMXMXCXMXMXbXSXSXSX6XSXbXSX6XSXSXnXCXbXbXlXbXlX(.(.(.(.(.(.(.(..XzXlXSXbXnXmXmXmXnXnXnXSXbXnXSXnXSXmXmXmXmXnXmXmXmXmXmXmXmXSXbXbXSXbXSXSXbXSXbXSXbXbXSXbXSXmXv.R./.R.R.!.W.",
"+.$.+.$.#.#.#.#.#.#.#.4.4.2.#.#.#.#.#.$.$.$.O.$.1.$.$.O.O.O.+.$.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.#.&.#.#.O.+.X.@.+.o.o.@.<.k.j.h.j.h.h.E.E.E.+X#X#XE.#XE.E.E.#X#XE.E.#X+XE.#XE.R.R.R.W.@XR.@X+X+X@X@X+X+X#X+XW.R.~.R.W.2X>XK f !.,X^.~.^.~./.>X^.B.u.p.f.8./ / z.c._ H.c.c.M.c._ M.c.c.H.b.b.p.u.x.x.n.x.M.T.c.n.n.n.n.n.n.n.n.n.n.n.n.n.m.T.n.n.n.T.T.T.m.T.Q.B.m.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.}.>X1X>X^.Q./.Q.Q.Q.}.{.!.{.!.!.oX{.!.oX!.}./.oX}.oXQ.!.}.}.^.^.>X>X%X&X%X&X&X%X%X&X&X-X>X&X&X%X>X&X>X-X%X^.<X^.n.AXAXAXAXZXDXBXBXBXBXBXBXNXBXZXBXBXZXBXDXBXBXBXBXBXBXBXBXBXNXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXBXBXNXMXVXVXBXSXmXNXNXSXmXnXSXNXNXAXSXNXNXNXNXnXSXFXSXSXAXzXSXAXAXSXSXSXNXAXNXSXNXDXHXHXHXAXHXAXAXAXDXAXAXAXAXNXAXAXAXAXDXDXDXAXDXAXmXNXDXDXNXnXNXVXNXNXVXNXAXDXVXnXVXSXbXzXnXnXnXnXnXnXnXSXSXbXzXnXbXbXNXNXnXlXbXSXzXbXbXbXbXlXzXbXnXlXOXzXOXOXbXnXnXbXlXlXlXlXvXbXNXAXAXNXNXSXSXSXAXSXnXSXSXSXSXSXSXSXSXSXSXAXSXSXmX4XbXNXMXCXCXSXSXCXSXSXSXMXCXMXMXCXSXCXCXMXMXMXMXMXMXMXMXCXSXbXSXbXSXSXSXCXSXSXSXbX6X6XbXbXbX X(.M.(.(.(.(.(.`.OXOXzXbXnXnXmXmXmXSXSXbXbXSXnXzXSXmXmXmXVXmXmXmXmXnXmXnXSXbXSXSXSXSXbXbXSXCXSXSXSXSXnXSXbXVXd.!.~.!.W.!.R.",
"+.+.+.+.+.#.O.#.1.4.#.4.#.#.$.$.$.#.$.#.$.$.$.O.O.$.$.O.$.O.O.+.+.+.1.O.O.O.X.+.1.+.+.1.+.+.1.+.+.+.$.$.+.+.1.O.O.+.+.o.o.o.o...,.<.g.g.g.j.h.N.#X#X#XE.j.#X#Xj.E.E.#X#XE.#XE.E.E.#XR.E.R.R.W.E.R.R.R.R.+X@XR.+X+XE.W.W.W.W.E.!.:X{.u k ,X>X^.!.~.~.!.^.>X>X}.}.^.&XOX<X}.OX}.}.>XOXOX}.,X4X>X>X}.>X>X>X1X1X1XOXOX1X>X1X>X1X1X1X1X1X1X1X1X1X1X4X1X1X4X1X1X1X1X4XOX1X1X1X1X1X>X>X>X1X1X1X1X4X1X1X<X1X>X>X%X%X:X^.&X1X1X&X1X1X>X>X}.1X1X&X1X<X1X&X&X>X}.1X&X&X&X<X;X%X~.%X&X%X%X%X%X-X%X&X&X&X>X-X-X>X&X-X%X%X%X%X&X^.oXT.NXAXNXAXBXBXBXBXBXBXDXBXBXBXBXBXBXBXNXBXNXNXDXBXBXBXNXBXBXBXBXNXBXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXNXVXVXmXSXSXnXnXmXSXmXmXNXNXNXNXNXBXNXNXSXSXFXnXSXSXnXFXSXSXnXDXAXNXNXVXlXOXnXSXnXlXOXOXSXSXzXOXlXlXvXlXlXOXXXXXOXlXvXXXlXXX.X.XXXnXnXlXlXXXOXlXjXlXvXnXbXlXlXlXlXjXlX.XjX.XXXXXlXlXlXzXlXlXlXOXOXzXbXbXSXbXOXOX.XOXlXOXlXbXzXOX.XOXlXbXbXVXVXnXbXvXvXvXvXvXbXBXNXNXSXSXSXSXnXAXAXSXnXSXnXnXSXnXSXSXSXbXSXSXAXSXOXOXCXSXSXSXCXSXCXSXCXSXMXMXCXSXMXMXSXMXMXSXMXMXMXMXMXMXSXSXSXSXSXSXSXSXSXSX6X6X4XvX6XlXbXbXvX XZ.Z.(.A.(.(.`.`..X.XlXnXmXmXmXmXbXSXbXSXSXSXSXSXmXmXmXmXmXmXnXmXmXnXmXCXSXSXbXbXbXCXSXnXSXbXbXSXCXSXmXmXVXd.!.E.E.E.E.!.",
"+.+.+.%.#.#.O.#.#.#.4.#.2.#.$.$.#.#.$.$.$.$.O.$.O.O.$.+.1.1.#.O.1.+.O.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@.+.+...+.o.+.o...,.k.g.g.r.j.j.h.E.#X#XE.#XE.E.E.E.E.j.E.E.E.E.E.E.R.E.E.E.E.E.E.E.E.E.E.R.E.R.R.+XE.R.R.E.~.R.!.1XN.q f >X,X%X+XE.E.R.%X^.^.!.^.^./.~.^./.^.!././.~.~.~.^.!.^.%X^.!.!.~.^.%X^.~.^.^.^.^.^.!.~.%X^.~.^.^.^.^.&X^.%X&X^.^.^.~.~.^.^.~.&X^.^.^.^.^.~.^.^.^.^.!.^.~.~.^.~.%X%X%X%X%X&X&X~.~.~.^.~.%X%X~.%X~.^.^.~.^.^.&X/.~.&X&X&X$XW.~.$X$X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X>X%X%X^.&X^.M.SXAXAXSXBXBXBXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXDXBXBXBXBXDXBXBXBXBXNXNXDXBXBXBXBXBXBXBXMXBXNXnXnXSXnXnXnXNXAXSXmXmXNXAXSXMXNXnXSXSXAXSXnXSXAXAXSXnXSXSXSXNXbXOXlXbXnXnXlXlXbXbXnXbXlXlXbXnXmXbXlXbXlXbXnXnXbXbXbXbXvXbXVXAXnXmXNXVXVXVXmXMXNXNXNXmXNXSXSXSXSXAXNXSXAXAXSXDXHXHXHXHXSXNXNXHXAXSXDXDXHXSXAXDXHXSXHXAXHXSXHXHXHXSXNXVXNXBXNXBXAXDXBXBXBXSXNXNXSXAXDXSXAXSXAXDXSXSXSXSXSXSXSXSXSXSXAXAXAXmX4XCXSXMXMXSXSXSXSXCXSXMXMXMXMXCXSXMXCXMX6XMXCXmXmXCXMXbXCX6XbX6XvX4XbX4XbXlXvXlXlXlXbXvXbXSXOX(.m.Z.Y.(.(.).Y.`..XOXvXbXbXbXnXmXbXSXSXlXSXlXSXmXVXmXmXnXSXmXmXmXmXmXnXbXbXbXSXSXbXbXSXbXSXnXbXmXmXnXmXnXs.E.R.E./.R.E.",
"$.$.#.#.#.#.#.2.2.1.1.#.#.#.#.#.$.#.$.#.$.#.O.+.$.%.+.$.#.#.O.O.+.1.+.1.O.+.+.+.X.+.O.O.+.+.O.O.+.+.O.+.+.O.1.O.@.X...........h X.g.V.r.r.r.r.d.d.8X8XW.8XE.E.E.E.R.E.E.E.R.R.R.R.E.E.R.E.W.E.W.R.E.R.R.E.!.R.R.R.R.W.W.W.R.!.~.<Xp.q j 4X>X%X!.+XE.%X%X&X}.^.^.^.W.~.^.~.%X~.~.~.^.$X~.~.+X$X%X&X&X~.~.~.&X^.&X~.^.^./.&X^.~./.~.~.^.^.&X^.&X&X&X&X;X&X&X&X~.%X&X&X&X&X&X^.~.&X^.~.^.&X&X>X%X%X~.^./.=X%X$X%X&X%X~.~.~.%X~.%X^.^.~.&X^.^.~.~.~./.^./.&X&X&X&X^.~.~.%X%X&X%X%X%X%X%X-X%X%X%X%X%X%X%X&X&X&X&X%X>X%X%X%Xn.SXSXAXDXDXNXNXJ.-.=.=.=.=.=.=.;.l.ZXZXDXBXBXBXBXBXDXBXBXBXBXBXBXDXBXBXBXAXBXBXDXBXBXBXAXDXZXDXAXBXAXDXBXAXAXnXnXVXmXAXAXAXNXNXAXNXAXNXAXNXBXBXJ.=.=.=.=.=.=.=.=.=.>.BXBXMXMXJ.;.=.=.>.J.BXAXDXDXDXAXAXDXAXAXAXGXDXGXDXAXAXAXGXDXAXAXSXSXAXAXAXAXAXSXAXAXAXAXHXAXAXAXSXSXAXAXDXHXAXAXAXSXSXSXSXSXAXDXDXDXSXSXDXAXHXBXAXGXMXMXSXDXAXAXAXSXAXBXBXBXAXSXBXBXMXBXBXBXSXAXSXSXSXSXSXSXSXSXSXSXSXAXNXl.=.=.=.=.-.=.=.=.=.l.jXbXbXvXCXvXJ.=.=.4XvXvXvXvXvXvX5XvXvXvXvXJ.>.=.=.;.,XvXvX4XvXvXlX4X4XvXvXvXvXvXvXvX4XbXnXnXjXoXZ.C.C.A.D.A.K.=.=.J.lXbXbXSXbXSXSXbXSXSXSXlXbXMXVXmXmXmXMXCXVXl.=.=.7XCXmXmXmXmXMXVXSXbXSXbXbXbXSXbXmXs.E.R.R.R.R.!.",
"$.$.#.#.#.#.&.4.#.4.2.1.#.#.$.$.%.$.#.#.2.2.#.$.+.+.+.$.#.O.O.O.1.+.1.o.O.+.+.+.+.#.O.O.O.O.O.#.1.O.1.O.+.O.@.O.@.@...+.+.@.X.h <.g.h.r.t.t.t.t.t.t.j.8X#XE.#X#X+X@X@X+X+X#XR.+X+X+X+X@X@XW.@X@X#X@X@XR.R.~.$X+X+X@X@X~.W.W.~.<X1X8.t U >X&X!.%X%X+X!.!./.^.%X~.~.~.%X%X~.$X&X%X$X%X$X%X$X%X-X+X&X&X;X~.%X~.$X^.&X&X&X&X/.&X&X&X&X&X&X&X&X&X&X&X&X~.&X/.&X~.&X&X&X&X&X~.&X&X^.&X&X&X%X&X&X&X*X%X&X~.*X;X%X%X&X&X%X&X&X&X*X&X%X;X&X;X&X>X&X;X>X<X<X&X&X;X;X&X&X^.&X>X%X%X%X&X%X>X-X>X>X>X>X%X-X>X&X&X&X&X&X:X%X>X%X>X&XB.SXHXAXAXDX{.h *.=.=.=.=.=.=.=.=.=.;.CXZXBXBXBXBXAXBXBXDXBXBXDXAXAXDXAXBXDXAXDXZXDXAXDXAXAXAXBXBXDXDXAXAXAXAXDXAXBXBXBXDXAXDXNXAXNXAXAXNXMX!...%.=.=.=.=.=.=.=.=.=.>.BXCXV.=.=.=.=.=.-.=.>.mXBXNXmXBXMXMXAXNXVXBX7XJ.NXAXNXNXmXmXSXSXmXSXSXSXnXmXSXSXmXnXVXVXNXVXnXmXSXSXnXnXSXSXSXmXmXnXSXbXbXSXVXbXbXnXzXSXSXzXbXbXnXbXbXVXVXbXbXbXbXnXbXbXbXbXbXbXCXbXbXbX7XJ.bXbXbXbXSXlXlXSXvXbXvXbXbXH...*.=.=.=.=.=.=.=.=.=.l.{.XXvXvX!...-.=.=.,XvXvX4XvXvXvX4XvXvX{.&.=.=.=.=.=.1XvXvXvXvX4XvXvXbXvXvX4XvXvXbXOXlXOXvXSXVX XF.C.C.C.b...%.=.=.J.lXOXvXSXSXlXSXSXlXSXSXSXMXVXmXVXbXmXmXV.X.*.=.=.7XmXmXmXmXVXMXMXbXSXbXSXSXmXbXSXMXv.!./.!.R.R.W.",
"#.#.#.#.#.#.#.#.4.#.%.%.$.$.#.#.$.$.+.%.#.O.%.#.%.$.$.$.O.#.O.O.+.O.+.o.%.+.+.%.+.+.@.O.O.O.O.O.O.+.O.#.O.+.+.O.o.....X.o.o.h o.k.h.j.7.t.t.r.t.t.<.6.t.r.j.h.E.h.T.T.T.E.E.E.E.T.E.E.E.E.E.E./.E.E.R.R.R.R.R.W.R.R.R.R.W./.!.>X5Xk b b.5X>X%X-X=X*X%X!.%X~.^.~.%X%X%X%X&X&X$X~.%X%X%X$X%X%X%X%X$X$X&X$X&X=X^.&X&X/.&X&X$X&X&X/.&X^.&X&X/.;X#X/.&X&X&X&X&X&X^.~.&X~.~.~.^.~.&X%X%X%X&X&X%X%X%X%X^.&X^.%X%X$X^.$X^.$X^.%X%X^.~.%X/.&X&X/.&X&X&X/.^.~./.%X~.~.~.^.%X^.^.^.~.!.!.!.!.!.%X!.~.!.!.$X!.^.~./.~.~.~.~.!.W.!.s.SXnXSXSXVXQ.X.%.=.=.=.=.=.=.=.=.=.=.l.VXVXVXVXCXmXmXVXnXnXnXVXVXVXbXnXbXbXnXCXbXbXCXbXVXbXCXbXbXbXCXbXbXbXSXzXbXvXbXnXbXbXbXbXnXbXnXbXbXbXG...%.=.=.=.=.=.=.=.=.=.>.4X@.*.=.=.*...X.*.=.=.J.vXvXbXvXvXvXvXvX}.:.-.J.vXvXvXvXvXvXlXvXvXvXlXvXbXvXvXvXzXvXvXvXvXvXvXvXbXvXlXbXvX4XOXlXvXvXlXlXzXvXvXvXvXvX6XbXOXlXbXvXbXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX,X:.=.J.lXvXvXvXOXzXSXOXlXbXvXvXvXg...*.=.=.=.=.=.=.=.=.=.l..XXXbX4X@.-.-.=.=.,XvXvXvXvXvX5XvXlX}.@.%.=.=.*.OXvXvXvXvXvXvX4XvXvXlXvXvXbXvX4XvXvXOX4XvXMXGXvXA.Z.Z.[.9...%.=.=.V..XOXvXbXSXSXlXlXSXvX6XSXMXCXVXVXmXmXMXH...*.=.=.7XbXMXCXVXmXMXCXSXCXSXbXSXCXCXSXmXs.+XN.E.E.!.R.",
"#.#.#.#.#.#.#.%.#.#.#.#.%.$.$.$.$.$.+.+.O.#.O.+.+.+.$.+.O.O.+.+.+.+.+.+...+.X.X.X.%.O.O.O.O.O.O.O.O.O.O.O.X.X.X...........h h <.g.k.g.g.t.t.B f.6.t.t.t.t.<.7.7.r.e.e.r.t.t.t.e.t.e.r.t.r.r.t.r.r.r.r.r.j.a.a.d.a.r.r.r.r.s.a.h.T.y q s.^.T.N.N.T.V.N.N.T.T.T.T.T.T.h.N.h.T.T.T.N.T.N.N.N.h.N.N.T.h.T.T.N.N.T.h.T.N.N.T.N.h.8Xh.N.T.d.T.h.h.8X/.T.h.N.T.N.h.N.N.h.N.h.T.T.N.T.h.N.N.h.N.N.h.N.N.h.h.N.h.N.h.h.h.h.N.h.h.h.h.h.h.h.h.h.h.d.d.d.d.h.d.h.h.h.N.h.h.h.h.h.h.N.g.N.h.h.h.h.d.h.d.a.h.h.d.h.d.d.d.d.d.d.d.d./ vXvXOXvXvXV...*.=.=.%.........*.=.=.-.bXvXvXvXvXvXlXvXvXvXvXvXvXvXvXvXvXvXvXvXlXvXvXvXvXvXvXvXlXvXvXvXvXOXlXbXlXvXvXvXvXlXvXlXvXvXlXvXlXjXV...*.=.=.%.......X.q.vXzXk.X.-.-.=.vXH.....=.=.l.vXvXvXvXvXvXlXg.%.=.=.J.vXvXvXvXvXbXvXvXvXvXvXvXlXbXvXvXvXvXvXvXbXvXbXvXlXbXSXlXzXbXbXbXbXbXbXbXbXvXbXbXvXvXzXzXOXSXvXvXbXbXvXvXbXbXbXvXbXbXvXvXvXbXbXbXvXn.%.=.-.J.bXvXvXbXOXSXlXlX6XbXbXvXvXb...*.=.=.%.o.......b.bXOX{.XX4X&.=.=.=.=.=.,X4XvX4XvXvXvXvXvXB.h *.=.=.J.bX5X5XvXvX4XvXvXvXbX6XbXvXlX4XvX4XvX6XbXCXSXHXNXXXF.m.C.u...*.=.=.K.`.XXlXvXOXSXSXSXbXSXSXlXVXVXCXZXmXmXCXb...*.=.=.7XCXmXCXmXCXCXCXbXmXnXSXSXbXSXbXVXb.R.R.R.E.R.!.",
"#.2.#.4.#.#.#.#.#.2.#.4.#.#.%.O.O.O.%.+.+.+.O.O.+.+.O.+.#.+.@.+.+.+.+.X.+.+.+.+.+.+.+.O.@.O.@.O.+.+.+.O.@.@.&.@.X...o.o.h h ..k.V.7.<.t.t.f.f.t.6.t.a.r.t.t.t.t.w.w.s.w.r.w.w.w.e.w.w.w.w.w.t.t.w.w.t.t.t.f.f.t.t.t.t.f.r.t.t.d.n.q y 0.n.d.s.f.w.a.f.s.r.f.f.f.w.a.t.f.f.d.f.d.w.s.w.a.g.a.d.a.d.r.d.r.d.r.d.r.d.d.d.r.d.d.r.d.d.r.t.d.d.r.t.d.r.d.d.d.d.d.d.r.d.d.r.d.d.a.d.a.a.d.a.d.a.d.d.d.d.d.d.d.d.g.s.d.d.d.d.d.d.d.d.g.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.a.d.d.d.s.a.d.g.d.d.d.d.d.d.d.d.d.d.d.d.d.U 6XlX4XlXvXB.h *.=.=.J.vXOXB.X...-.=.=.vXvXJ.=.=.J.l.=.-.J.nXbX,X>.=.-.-.J.vXvXvXvXvX7X:.=.=.=.;.J.4XvXvXbXvX,X>.-.-.=.;.J.4XlXSXvXvXvXvXvXB.X.%.=.=.J.vXvXvXvXvXvXvXq.@...vXvXvX,X..X.=.=.>.vXnXvXbXvXbXB.-.=.=.=.=.=.l.bXvXvX,X>.-.=.-.>.4XvXbXbXvXvXbXvXvXvXbXl.=.=.J.l.=.-.,XnXvXJ.;.-.=.>.,XbXbXbXbXbX>X>.-.=.=.;.J.CXvXvXCXbXvXl.;.=.=.:.4XCXbXV.*.=.=.=.=.=.l.vXvXbXOXbXvXvXbXbXvXCXg...*.=.=.,XnXbXvXvXnXvXlXoXB.%.=.=.=.-.=.=.,XvX4XvX4X4X4XvXlXV.=.=.=.=.=.-.l.vXvXvXJ.>.=.=.-.J.4XOXvXbXvX=.=.-.7X-.=.>.GXCXG.Z.F.H...%.-.=.H.V.-.=.-.l.vXbXMXSXSXbXJ.-.=.=.l.5XVXmXn...*.=.=.7XSXSXl.=.=.CXJ.-.=.;.7XSXSXSXSXBXB.%X-X%X%X%X^.",
"#.#.4.#.5.%.#.#.#.5.&.@.#.$.+.+.O.O.+.+.+.+.+.+.$.+.+.O.+.O.&.O.O.+.+.+...+.+.+.+.+.X.O.O.O.@.O.<.1.+.+.O.@.@.......X.o...h o.V.-Xj.6.,.6.f.t.t.f.f.f.w.t.t.t.f.a.w.r.a.r.s.r.r.r.a.r.a.r.r.r.r.r.r.r.r.r.d.r.r.a.r.d.a.d.f.w.n.i.q y i.B.d.s.d.s.d.s.d.d.d.a.s.s.d.s.d.d.d.r.d.d.d.d.d.a.s.a.d.d.d.d.d.d.d.d.d.r.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.h.d.d.d.d.d.h.d.h.d.d.h.h.h.h.h.h.h.h.h.N.h.h.h.h.h.g.h.h.h.d.h.d.h.h.d.h.d.h.h.h.d.d.h.h.h.h.h.g.h.h.h.d.h.d.d.h.g.N.d.h.s.d.N.d.d.N.d.d.N.d.h.d.h.d.6.vXlXbXlXvXV...%.=.=.J.vXvXvX&.%.=.=.-.B...%.=.=.-.=.=.=.,X}.&.=.=.=.=.=.=.>.vXvXlX4.=.=.=.=.=.=.=.;.vXvXXXk.-.=.=.=.=.=.-.>.lXOXvXvXbXlXvXB...*.=.=.J.vXbXvXvXvXvXbXvXvXvXvXvXbXXXh *.=.=.l.vXvXvXbXbXq...*.=.=.=.=.-.l.vXXX:.=.=.=.=.=.-.=.J.vXbXbXbXvXbXbXg...*.=.=.-.-.=.=.vXV.*.=.=.-.=.=.=.J.bXbX}.4.=.=.=.=.=.=.=.>.vXvXvXV.-.=.=.=.=.=.=.J.q.X.-.=.=.=.-.-.l.vXvXlXSXvXbXvXvXvXbXvXV...*.=.=.J.mXvXvXvXbXvXvXn.X.*.=.=...*.=.=.,XvXvXvXvXvXvXvX....=.=.=.=.=.=.l.bX!.*.=.=.=.=.=.-.-.4XSX....=.=.=.-.=.=.l.HXZXvXA.[ 9...*.-.=.=.=.=.=.=.=.>.vXVXbXN.-.=.=.=.=.=.=.7XnXV...*.=.=.J.n.@.*.=.=.-.=.=.=.=.=.J.lXlXlXvXQ 0.0.i.y.8.6.",
"5.4.&.4.5.4.4.4.#.5.4.4.4.1.$.#.#.O.#.O.#.O.#.&.#.#.O.O.+.O.#.O.O.+.+.+.%.+.+.O.O.@.O.+.+.+.O.O.1.@.@.+.@.@.@.....o.@.@.h h <.h.-X+Xj.7.B B B f.t.t.f.f.t.r.r.r.d.r.r.d.d.r.d.r.a.a.w.w.r.s.r.d.a.r.r.s.r.r.t.r.f.d.r.a.d.f.d.T.b.t q b.N.n.d.s.s.d.f.s.f.s.f.d.s.s.a.s.r.f.d.r.d.a.r.r.a.r.a.d.r.d.r.d.d.r.d.d.d.r.d.d.d.r.d.d.d.d.r.d.r.d.d.d.d.d.d.d.d.h.d.h.h.d.h.d.h.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.a.d.d.h.h.d.d.h.h.d.h.d.h.d.d.d.d.d.d.d.d.d.d.h.d.h.d.h.d.d.g.N.h.h.d.h.h.h.d.h.g.h.h.h.h.d.d.N.h.d.h.d.h./ vXvXbXbXvXB...*.=.=.=.=.=.=.=.=.=.=.l.G...*.=.=.=.%.XX,XQ.X.=.=.;.....&.=.=.J.,XX.*.=.=.%.X...*.=.=.J.}.X.*.=.=.%.X...*.=.=.J.vXlXSXvXvXvXV...*.=.=.=.=.=.=.=.=.>.vXvXvXvXbXvXvXB.%.=.=.=.J.vXvXvXvXbXq.....*.-.=.:.nXvXB.%.=.=.-.%...&.-.-.=.,XbXvXvXvXvXvXb...*.=.=.-.+.vX,Xk.%.=.=.*.....>.=.=.,X{...-.=.=.......;.=.=.,XXXq.*.=.=.%.@.&.>.=.-.k.X...%.=.=.:.nXvXbXvXvXlXvXvXvXvXbXvXvXg...*.=.=.=.=.=.=.=.=.l.bXV...%.l.g...*.=.=.7XCXCXCXMXCXZXCX..X...%.=.=.:.BXMXg.*.-.=.*.....%.=.=.;.MX....=.=.=.*.k.CXCXZXZXZX XF.9...%.=.=.=.%.....-.=.=.,XjX<.*.=.=.%.....;.=.=.G.8...*.=.=.V.q...*.=.=.-.&...%.=.=.=.F.{ Z.F., < < 2 < < 2 ",
"#.#.4.#.%.#.&.4.#.%.&.4.O.&.O.O.O.&.@.O.@.O.O.@.O.@.@.@.X.O.&.<.O.@.X.O.@.O.O.<.O.<.@.+.,.<.X.X.@.+.<.@.@.@.h &.o.@.@.k h h 7.+X+XV.E.T.h.r.r.t.7.f.t.t.f.f.t.r.r.w.a.r.r.w.r.r.w.r.a.r.r.r.r.r.a.r.r.r.r.d.a.r.r.r.d.r.r.w.d.Q.c.q y b.n.d.p.d.d.s.d.d.d.d.d.d.d.s.d.a.r.d.d.d.s.d.d.d.d.g.d.d.d.d.d.d.d.d.r.d.d.d.d.r.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.h.d.d.d.d.d.d.h.d.d.d.d.d.d.d.d.d.d.d.h.d.d.a.d.d.j.d.d.h.d.d.h.d.d.d.d.d.h.d.h.h.h.d.h.d.N.d.h.d.h.d.d.h.d.g.h.d.h.h.h.d.d.d.d.h.d.d.d.h.d.h.N./ vXvX4XlXvXV...%.=.=.=.=.=.=.=.=.=.;.4XE...%.=.=.>.XXvX4Xh *.=.=.,XB...X.;.=.-.g...*.=.=.l.H...X.Q.vXvXH...-.=.=.l.H.....Q.vXSXlXOXlX4XvXvXB...%.=.=.=.=.=.=.=.=.>.vXvX4XvXvXvX}.&.=.=.=.;.vXvXvXvXvXvXvXV...%.=.=.J.bX,X..*.=.=.,XXX@...&.=.=.l.vXvXvXvXvXbXH...*.=.-.l.XXvXG.X.-.=.;.vXk...X.=.=.J.q...=.=.=.J.k.....XXnXmXV...-.=.>.vXq...%.=.=.J.V...*.=.=.J.VXVXVXVXSXSXbXSXmXmXMXMXNXH...*.=.=.=.=.=.=.=.-.l.NXN.H.nXVXV.h *.=.=.CXAXHXSXHXSXSXSXHX{...*.=.-.J.HXV...-.=.-.BX,X..o.*.=.=.7X....=.=.=.,XCXMXCXCXHXHXvX`.9...*.=.=.:.A.@...*.=.=.V.H...=.=.:.` q...%.=.=.H.q...*.=.=.H.R ..*.=.=.q.' ....*.=.=.H.[ ] ] # # # # . . # ",
"..%...+.......%.@.X...%.................h h h h h ..h h ..h ..h h ..h ....@.....h ....h ..h ..h &...@.h h h h b h @.k h h ..V.-X#X#XE.#X#XW.E.E.h.h.h.h.g.g.g.g.g.g.d.a.r.r.a.t.r.t.t.t.t.t.r.r.r.r.r.r.r.j.r.r.r.f.t.t.r.f.f.d.z.< y z.B.n.d.d.d.f.d.f.s.a.s.d.f.d.a.d.d.f.a.a.r.d.r.d.d.r.d.d.d.d.r.d.d.r.d.d.d.d.a.d.d.a.d.s.r.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.s.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.a.d.d.d.r.d.j.d.d.s.d.d.r.d.d.s.a.d.d.r.d.r.d.d.d.d.a.d.d.a.d.d.d.d.s.a.a.d.d.d.r.d.a.d.r.d.a.d.d.d.d.d./ lXOXlXlXvXB...*.=.=.=.=.=.=.=.-.J.vXvXV...%.=.=.J.MXCXV...*.=.=.=.=.=.=.=.=.=.k...*.-.=.=.=.>.J.bXbXvXk...%.=.=.=.=.>.J.bXbXbXbXCXbXbXbXCXB...%.=.=.=.=.=.=.=.=.>.nXbXCXbXbX,X&.-.=.=.=.7XVXmXVXVXmXMXVXG...%.=.=.J.AXV.X.=.=.=.mXMX4X....=.=.=.MXMXMXBXBXBXV...*.-.=.7XMXBX&.X.=.=.=.=.=.=.=.=.=.>.X...*.=.=.=.=.l.7XAXAXSX..&.=.=.=.=.=.=.=.=.=.J.G.+.%.=.=.J.HXZXHXHXHXHXHXHXHXHXHXHXHXV...*.=.=.=.=.=.=.=.=.J.SXCXvXbXSXN...*.=.=.CXSXSXMXHXSXMXSXMX-XX.*.=.-.J.HXX.%.=.-.l.ZXZXV.+.%.=.=.J.....=.=.=.6XSXSXSX6XMXSXMX.X0.X.*.=.=.H.C.q.@.*.=.=.V...+.=.=.=.=.=.=.=.=.=.K.v ..*.=.=.H.v &.*.-.=.H.' R @.&.=.=.K.' ] ] X X # # X # . ",
"........+.+.....+.X.X.....................h h h h h h h h h h h h ..b h h h b b b b h b b h b b b b b b b b b b b b b b b h V.-X+X+XE.#XW.W.W.+X=X*X-X$X%X+X+X!.+X+XR.R.E.R.E.E.8XE.E.8XE.E.E.E.E.h.E.h.h.h.N.h.8Xh.h.T.8Xd.d.T.b.2 q b.n.s.s.s.d.d.d.d.d.s.s.a.d.d.a.d.d.r.d.d.d.r.s.a.f.d.r.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.N.h.d.h.h.h.d.d.d.d.d.T.d.d.h.h.d.T.d.d.N.d.T.h.h.d.N.h.h.h.N.h.h.T.T.E.h.N.T.T.h.h.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T./.E.T.T.E.E./.E.E.E./.E.E.!.E./.E./.E.!.R.!./.p.SXSXSXmXnX!...%.=.=.%.....q.!.bXVXVXmXG...*.=.=.J.GXSXg...;.=.=.=.=.=.=.=.=.=.J.....*.=.=.=.=.=.=.J.BX{.....*.=.=.=.=.=.=.J.AXDXAXDXAXAXZX{.X.*.=.=.*.......k.HXHXHXHXDXHXvX+.=.=.=.=.7XAXHXAXAXHXHXHXHX,X..*.=.=.7XHX@.X.=.=.=.GXHXBXX...-.=.=.HXHXAXDXHXHXV...*.=.=.7XHXMX....=.=.=.=.=.=.=.=.-.>.V.....*.=.=.=.=.=.-.J.CX..%.=.=.=.=.=.=.=.=.=.l.,X..*.=.=.7XHXHXHXHXHXSXHXSXSXSXHXHXMXV...*.=.=.%.....X.V.DXSXAXSX5XvXSXV.X.*.=.=.5XMXSXMXMXSXMXMXSXV.X.%.=.-.J.5XX.%.=.-.l.ZXSX,XX...=.=.l.+...=.=.=.SX6X6X6XMXCXMXAXbXH...%.=.=.K.Z.H...%.=.=.J...%.=.=.=.=.=.=.=.=.=.:.q...*.=.=.H.R h *.=.=.F.] _ ..%.=.-.:.' ] ] o X X . X . X ",
"+.+.X.X.+.+.+.@.&.@.@.@.+.......@.X.@.................@.@.@...@.&.v k ..h h h @.o.h h h h h h b b k b h b ..b h h h k b b ,.J.=X+X+XE.E.E.W.E.#X@X@X+X+X$X-X-X=X=X=X=X&X=X=X=X=X#X=X=X;X=X;X*X=X=X=X=X*X*X=X%X$XW.=X$X&X&X~.&X4X{.q x ,X,X!.!.~./.~.~.~./.W.~.%X/.$X~.~./.W.~.~./.~.W.~.=X/./.#X^.&X~.&X#X/.&X^.~.~.^.&X~.%X%X&X&X&X&X>X&X&X&X<X=X;X/.&X~.^.&X&X^.&X&X*X;X&X<X&X;X&X&X&X;X&X&X;X;X;X;X&X;X;X&X<X;X<X<X<X;X<X;X;X<X<X<X<X*X&X<X<X;X;X<X1X;X<X<X<X;X<X<X<X*X;X<X<X<X<X<X;X;X<X*X;X<X;X<X<X:X<X<X<X;X<X<XQ.AXDXDXAXHXG...*.=.=.J.HXHXDXDXDXHXGXDX+Xh *.=.=.J.GXGXk...*.=.=...........CXGXAXG...h ..%.*.-.=.=.=.l.HXV...X.X.%.*.=.=.=.=.l.DXHXHXHXHXDX,X..%.=.=.J.HXDXDXHXHXHXHXAXAX5X&.=.=.=.=.7XDXAXHXAXHXAXHXHXAX{...%.=.=.J.AX....-.=.=.BXDXZXk.X.=.=.-.HXAXAXAXAXAXV...*.=.=.7XAXCX..%.=.=.*.......X.q.HXGXSXg.....X.%.*.=.=.=.-.l.@.%.=.=.*...X.X...V.HXDX{...%.=.=.J.HXZXHXSXSXSXSXSXSXSXSXSXSXN...*.=.=.7XSXmXSXSXSXSXSXSX4XlXnXV...*.=.=.CXMXMXSXMXMXMXMXMXV...*.=.=.J.>X..%.=.=.l.MXBXCX..%.=.=.l.....=.=.=.SX6XSXSXSXCXCXSXHXV.X.%.=.=.H.A.z.h *.=.=.H...%.=.=.*.X.......R ] ] v h *.=.=.H.T h *.=.=.F.] _ ..%.=.=.&.] ] ] X X X X + + # ",
"+...+...+.....+...+.+.....+.....X.@.X.X.......@.@...@.k @.@.@.@.@.@.@.@.h ..h ..h k o.k k h ..h h h @.k &.v &.k q.@.@.h o.e.-X-X#X+X+XE.E.W.+X#X@X@X+X+X+X+X$X$X$X$X$X$X$X@X$X$X#X#X#X#X#X#X@X@X#X#X$X$X#X=X$X$XW.$X$X$X&X^.&X1XB.2 v vX4X>X&X*X&X&X>X<X<X<X<X<X<X<X<X;X;X;X;X;X;X*X;X*X<X;X;X3X2X2X<X<X;X3X3X3X3X<X<X<X<X<X1X<X<X;X<X2X3X<X1X<X;X;X3X<X<X;X;X;X<X1X<X<X;X<X1X*X;X;X<X<X;X;X;X;X;X;X&X;X;X;X;X;X;X*X>X*X;X;X<X;X<X<X<X<X;X;X<X<X<X<X<X<X<X<X<X<X<X<X<X*X;X>X<X;X*X&X&X&X&X;X&X*X&X;X&X;X:X&X>X*X&X*X<XT.AXAXDXAXHXG...%.=.=.7XGXAXDXAXBXAXAXDX,X..%.=.=.J.ZXDXk...*.=.=.7XAXSXmX=.=.>.AXAXNX4Xg.@.......=.=.=.DXAXBX4XH.@.X.....=.=.=.DXAXAXAXDXAXG...*.=.=.7XHXAXAXSXAXSXAXAXCXX.=.=.=.=.7XAXSXSXAXAXAXSXSXSXSXG...%.=.=.J.AX@...*.=.=.7XDXZX..&.=.=.l.SXAXAXAXAXAXg...*.=.=.7XZXCX....-.=.=.ZXMXBX7X=.=.J.HXHXMX,XH.@.....%.=.=.>.X...=.=.;.SXSXAXJ.=.=.7X{...%.=.-.J.SXZXSXSXSXSXSXSXAXSXSXSXSXH...*.=.=.7XBXSXSXSXSXSXSXSXSXvX4Xg...*.=.=.7XCXMXMXMX6XMXMXMX{...%.=.=.J.4XX...=.=.;.MXBX,X..*.=.=.7X....=.=.=.MXSXSXCXSXSXCXMXHXG.X.*.=.=.:.F.9...%.=.=.V.....=.=.;.] ] ] H.=.=.H.R ..*.=.=.H.v ..*.=.=.&.} _ h *.=.-.H.] ] ] . X + O O O + ",
"X.X...+.X.X.+.X.+.+.@.X.+...X...@.@.....h ........@...h ........h ....h ..h h h h h h ....h h h h h h h ..k o.h h h @.k o.h.+X+XE.+X#XE.E.E.#XW.#X#X-X%X$X$X+X+X+X+X~.+X+X@XR.@X@XW.@X@X@X@X@X@X#XW.#XW.@X@X$X$XR.R.W.R.W.E.*X&X0.2 6.5X>X!.~.~.$X%X%X%X%X=X%X%X&X&X&X$X~.&X=X~.&X$X&X^.$X&X&X&X&X&X&X&X&X;X&X&X&X&X&X&X&X&X&X&X%X&X&X&X&X;X&X&X&X&X&X&X&X&X&X&X&X&X&X^.&X&X&X&X&X&X&X&X&X&X$X$X/.&X*X&X*X&X>X&X&X*X&X*X^.&X=X&X&X&X&X&X&X&X&X*X^.&X&X&X&X&X&X&X&X&X&X&X&X;X&X&X&X&X&X&X&X%X=X&X&X=X&X&X&X&X&X&X&X&X&XT.AXAXAXAXSX,X..*.-.=.J.GXBXBXAXBXSXAXBXG...*.=.=.J.HXAXV...%.=.=.;.CX..*.=.=.7XDXMX-.=.=.7XnX..%.=.=.;.BXMX-.=.=.CXCX..%.=.=.;.BXSXBXBXAXHX+X..%.=.=.J.AXSXAXSXAXMXAXMX@.*.=.=.=.7XAXAXAXAXSXAXSXSXAXSXBX1X..%.=.=.J.DXV...%.=.=.;.CX4XX.-.=.-.CXSXSXSXBXBXBXV...*.=.=.7XAXAXq...*.=.=.l.,X..-.=.=.CXZXCX=.=.;.CX4X..%.=.=.>...X.*.=.=.J.G.%.=.=.;.ZX4X..%.=.=.l.SXMXBXJ.=.=.J.SXSXSXSXSXMXV...*.=.=.7XSXSXSXSXSXmXSXSXHXbXXXH.X.*.=.=.CXMXMXMXMXMXMXMXMX!...*.=.=.J.6XX...*.=.=.>.MXV.%.=.=.>.MX....=.=.=.SXMXmXCXMXMXMXCXMX,X..%.=.=.K.C.H.h *.=.-.V.....*.=.=.K.T ..=.-.;.[ R ..*.=.=.H.R ..*.=.=.=._ _ %.=.=.=.] ] [ ] . + @ @ + @ : ",
"X.X.+...X...X.+.+.+.+.+.+.+...&.X.X.X.............h k ......h h b ....b h h h h h h h k @.h h h h h h ....o.o.o.....X.h <.#X-X+XE.E.E.+XW.8XW.R.R.V.E.+XR.+X+X!.+XR.+X+XR.R.@X+X#XW.R.W.R.W.R.W.W.W.W.W.W.W.W.W.@XW.$XW.E./.>X%XN y s.5X,X^.~.$X%X$X$X%X$X%X=X%X=X%X$X&X&X&X&X&X/.&X$X$X&X&X&X&X$X&X&X&X&X~.$X~.~.&X&X^.~.&X&X&X^.&X&X&X^.&X&X&X&X&X&X&X&X&X&X&X&X&X&X*X&X&X*X&X&X&X>X&X&X;X;X&X;X;X;X&X*X&X&X%X~.&X~.&X&X&X~.&X=X&X&X&X%X=X&X=X&X&X>X&X&X&X>X&X&X&X&X&X;X/.^.&X&X$X$X&X%X%X~.&X%X%X&X%X&X%X%X%X%X%X^.n.AXNXAXNXAXV...%.=.=.J.AXBXBXBXBXBXAXNX,X..%.=.=.J.HXAX5X..h %.=.=.=.=.=.=.l.MX@...%.=.=.=.=.=.=.=.=.7X@...%.=.=.=.=.=.=.=.=.7XAXAXAXBXAXHXV...*.=.-.J.HXAXAXAXAXBXBXV.X.-.=.=.=.=.=.=.=.=.>.BXSXBXSXSXBX,X..%.=.=.=.=.l.....%.=.=.=.=.=.=.=.J.SXSXSXSXSXBXBXV...*.=.=.7XAXAXV...h ;.=.-.=.=.=.=.7XCX....%.=.=.=.=.=.=.=.=.CXV...+.-.=.=.=.=.=.=.7XDX,X....=.=.-.=.:...%.=.=.7XAXSXSXSXSXMXN...*.=.=.7XSXSXmXSXSXbXSXSXSXmX4Xg...*.=.=.5XMXMXMXMXMXMXMXMXG...%.=.-.J.MXN.....;.=.=.=.=.=.=.;.7XNX..X.=.=.=.mXMXCXMXMXMX6XMXCXG...%.=.=.k.C.H...%.=.-.G.q.....-.=.=.=.=.=.-.H.] v X.*.=.=.H.R ..*.=.=.*.-.=.=.=.-.H.] ] ] ] X @ @ + @ + @ ",
"+.o.+.X.+.+.+...X.X...+.@.+.+...X.X.........................h h h h ..b b h h h h h h @...h h ............h h o.o.o.o.k <.#X+XE.E.E.E.E.E.E.R.R.E.E.R.R.R.+X+XR.$X@XR.W.@XR.R.W.W.W.W.@X@XR.R.@X@XR.E.W.R.W.W.R.R.W.@XW.R.E.<X%Xu y N.1X!.%X~.%X~.%X~.$X~.$X$X$X=X~.~.$X~.*X&X$X&X*X$X&X$X&X=X&X&X&X=X%X&X&X$X&X&X&X&X&X&X&X&X&X%X%X%X%X^.&X^.&X&X&X&X&X&X&X&X&X&X%X%X&X^.&X&X&X&X&X&X&X&X$X$X&X$X&X&X&X*X&X&X&X&X&X&X~.&X&X&X&X&X*X*X&X=X%X&X&X&X*X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X~.&X$X&X~.&X&X%X&X&X&X&X&X%X&X&X^.&XT.SXAXSXSXSX{...*.=.=.J.AXBXBXBXSXBXSXAX{...*.-.=.7XSXZXHXG.....%.-.=.=.-.J.HXMX,X....+.*.-.=.=.=.>.CXAX4X....&.*.-.=.=.=.>.CXAXBXBXSXBXBXSX,X..%.=.=.J.HXAXSXAXSXDXBX..%.=.=.=.=.=.=.=.=.=.>.SXAXSXSXAXAXCXX...&.=.=.-.l.G.....%.*.=.=.=.>.CXNXSXHXHXSXAXSXAXV...*.=.=.7XSXSXMXk.....%.=.=.=.;.7XZXMX{.....%.*.=.=.=.=.l.ZXAXmX@.X...*.-.=.=.>.CXAXAXvX....%.=.=.-.>.o.*.=.=.J.DXSXSXSXSXSXV...*.=.=.7XSXmXmXSXSXSXSXSXCXSXmXg...*.=.=.5XMXMXMXMXMXMXCXMX,XX.*.=.=.J.SXSX7.....%.-.=.=.-.l.MXMXVX....=.=.=.mXMXMXMXMX6XMXMXMX{...*.=.=.H.C.9.h *.=.=.V.D.......*.-.-.-.;.F.' ] q...*.=.=.H.v ..*.=.=.&.*.-.=.;.H.' ] ] ] ] + @ O + @ + @ ",
"o...+.+.+.+.+.+.+.+.%...+.X.@.O.@.X.X.X.X.............h b ..h h h h ..&.@.h ....h h h @.h ..h ....h ....@...o.o.o.o.h @.j.J.+XE.E.E.#XE.W.E.E.E.R.R.!.R.R.R.~.R.R.R.$X@XR.@X@XW.@X@XW.@XR.@X+X@XR.@X@XR.W.E.W.R.W.W.R.E.E.E.:X!.q y N.1X^.%X%X~.~.~.%X~.%X~.~.~.~.$X~.$X$X~.$X&X~.$X$X&X^.&X$X$X$X&X%X&X%X&X&X&X&X=X&X&X=X%X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X^.&X&X%X%X&X&X&X&X&X&X;X/.&X$X&X&X$X&X$X&X&X&X%X%X&X&X&X&X&X~.=X&X$X=X&X$X=X&X&X*X%X%X%X&X&X&X=X%X&X&X^.<X&X=X&X&X#X&X&X=X=X&X&X=X%X%X&X&X&X&X&X%X&X&X&X*Xn.SXSXSXSXAX+X....{.NXDXAXBXBXBXMXSXSXAX+X....B.BXHXZXSXSXSX5Xk.....@.{.mXHXAXBXNXCXV.@.....@.k.CXBXBXBXZXCXn.@.....@.k.CXAXDXAXSXMXBXBXMXHXG...X.{.DXAXAXAXAXAXAXZX4X........X.........q.AXAXAXBXSXSXMXAXAX,X@.....H.HXSXMXCXk.@...X.k.bXSXNXMXNXMXZXSXZXSXAXh.....>XBXMXSXSXAXBX,X@.....k.5XSXSXZXMXVXvXk.@.....@.V.CXBXSXBXSXNXV.@...o.k.5XZXBXMXMXNX,X@.....V.mX{...@.V.=.7XSXmXbXSXSXCXV...o.,XMXCXMXSXmXSXbXSXbXSXSXMXMXV.....4XMXMXMXCXMXMXMXMXMXMXV.X...!.SXSXSXCXNX,X7...h @.B.CXmXmXmXMX......mXMXSXCXmXMXMXMXCXMXMX!...h V.A.F.C.c.....M.kX].S.[ 8.k ....@.' ] ] [ [ R ...._ ] [ R ..*.=.=.&...@.Z.} ' ' ] ] ] ] X O + + @ @ + ",
"+.+.+.+.+.+.+.+.+...%.+...X.+...X.X.X.................b ..h b ..h h o.k ......h h ..h ..h o.......h ............o.o.h <.h.#X+X+XE.E.E.8XE.#XE.E.E.R.R.R.R.R.E.W.E.W.E.W.W.R.W.+XW.R.R.R.@XR.R.W.$XR.R.~.R.R.W.W.R.R.R.@X@X+X+Xg.q u N.1X^.!.~.~.~.~.~.~.$X^.~.%X$X~.~.~.=X~.^.$X~.$X%X~.%X%X&X$X~.&X~.=X&X$X$X=X~.&X&X$X=X&X=X&X&X&X$X$X/.*X&X$X&X&X&X&X%X$X%X$X%X%X&X%X%X&X~.&X&X#X&X&X~.&X&X&X$X$X&X&X^.$X&X^.%X%X=X=X&X~.;X=X=X&X~.W.^.&X#X=X&X&X$X&X&X&X$X&X%X%X%X%X%X$X%X%X$X&X$X&X&X/.;X&X$X&X&X&X&X&X%X%X%X%X$Xn.SXSXmXSXMXSXSXNXSXNXSXSXSXMXBXSXSXMXBXBXSXAXSXSXBXAXSXNXNXMXSXSXSXMXMXMXSXMXSXSXMXMXSXSXSXAXSXHXMXMXSXSXSXSXSXZXAXSXZXMXMXZXSXSXMXSXMXSXSXSXSXMXMXMXBXSXSXSXSXSXMXMXSXZXZXMXSXSXSXSXMXMXBXMXSXSXSXSXMXAXSXSXSXAXAXBXSXMXMXMXMXSXMXBXMXBXmXMXBXMXMXMXMXSXSXMXMXMXMXSXSXMXMXMXMXSXMXMXBXBXZXMXMXMXMXMXMXCXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXSXmXmXmXmXMXMXMXVXZXMXMXMXMXZXCX..l.-.ZXZXSXMXZXMXMXMXMXMXMXMXmXCXSXSXSXSXSXbXCXSXSXbX6XSXMXMXCXMXbXSXbXSXSXCXMXMXCXSXSXCXMXMXMXCXmXmXSXCXSXCXSXbXSX6XSXbXSX6XSXbXSXbXSXCXCXSXCXSXSXCXmXmXAXmX.XZ.F.(.A.A.(._. XZ.[ ] ] ] ] F.0X0XF.F.F.F.[ } { { { H...*.-.=.[ [ S.rX[ ] ] ] ] ] ] + + @ @ + @ @ ",
"+.+.o.+.+.X.+.+.+...X.+.@.+.......+.&...X...X...h ....b ....b ....h ......h h h ..h h h ..h ..h ..........%.....,.o.o.<.V.#XE.+X#X#XE.8XE.E.W.8XR.R.R.R.E.W.W.R.W.+XR.W.R.W.+XR.W.+XW.W.R.@XR.@XR.R.+XR.R.$XW.W.R.R.R.@X+XR.R.N.7.s.!.%X~.R.~.~.W.~.~.$X~.$X$X~.~.$XW.~.~.#X^.$X~.$X~.$X~.~.~.W.$XW.~.W.$X~.~.$XW.W.$XW.~.W.~.~.~.~.~.&X~.=X~.&X~.&X~.~.$X%X$X%X$X~.~.$X~.$X%X~.^.$X~.~.~.$X~.&X&X~.~.&X$X&X&X#X$X%X%XW.W.$X/.#X#X~.$X$X$X$X/.*X$X~.&X~.~.~.#X~.$X$X%X%X$X%X&X~.$X~.$X~.$X$X$X~.W.~.&X/.~.~.~.%X%X~.~.n.SXSXSXSXNXNXSXSXSXSXNXmXMXMXMXMXMXBXBXMXMXMXSXBXBXMXNXNXSXSXNXmXMXMXMXMXMXMXMXMXMXMXMXNXAXMXMXMXSXSXMXMXSXSXSXSXAXMXSXMXSXAXZXHXZXSXMXZXBXSXBXMXMXMXBXBXMXSXSXZXZXHXSXHXSXHXSXSXZXAXAXAXSXMXBXMXNXNXSXMXMXZXMXSXMXMXMXMXSXSXMXMXBXMXBXMXMXBXMXBXBXMXSXMXSXMXMXMXMXMXMXSXMXMXMXMXMXMXMXBXZXSXZXMXMXCXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXSXMXSXmXSXSXMXMXMXMXCXZXZXMXMXCXg.*.>.CXSXSXBXMXZXVXMXMXMXMXMXMXMXMXbXSXSXSXSXSXSXSXSXSXSXSXMXMXMXMXSXSXSXSXMXMXMXMXSXCXSXSXMXCXMXCXMXCXCXMXCXSXSXSXSXbXbXSXSXSXbXSXSXSXSXSXSXSXSXbXCXSXbX4XmXAXvX(.F.Z.A.A.(. XgXZ.[ ] ] ] ] [ F.F.] rX0XF.} F.0XS.{ R ..*.=.=._ S.gXS.[ ] ] ] ] ] ] # : + + + # + ",
"+.+.1.+.O.O.+.@.+.X.+.+.&.+...X...X...X.+...X...................o.h ........h ..h ..............h ......X.X.....o.h O.j.#X+XJ.E.#X#XE.E.E.E.W.W.R.R.+XR.W.W.@XW.W.#X+X#XW.@X@XW.+X@X@X@X$XR.@X@XR.$X+XR.W.R.~.@X$X@X@XR.R.E.+X,X%X%X~.~.~.$X~.!.~.~.W.~.~.~.$X$X~.~.~.~.@X&X~.#XW.~.~.~.$X$XW.$X~.~.~.#X~.@X@X$X=X$X$XW.~.#XW.W.#X~.#X~.$X$X$X~.~.&X&X~.%X~.$X%X$X%X%X%X&X~.$X~.$X$X&X~.$X/.*X~.~.$X$X$X#X&X$X~.%X$X$X$X=X$X$X~.#X;X$X&X=X$X$X$X&X~.$X$X#X*X&X~.%X$X%X%X%X%X%X$X$X~.=X$X;X#X$X$X$X&X$X#X%X$X%X%X%X%X%Xh.SXCXSXSXSXSXSXSXmXSXMXSXMXSXMXSXAXSXBXMXMXBXBXSXBXBXSXSXSXmXmXSXMXMXMXmXMXMXMXMXMXMXMXSXMXMXMXZXSXSXSXMXMXMXMXMXMXSXSXZXSXSXZXZXSXSXMXSXBXBXBXAXAXSXSXMXSXMXSXSXSXMXSXSXZXZXSXSXBXBXBXBXBXBXBXAXSXAXSXBXAXSXSXMXMXBXSXSXSXAXAXAXSXBXBXBXBXBXBXBXBXMXSXZXMXMXMXMXMXSXSXAXZXBXZXSXBXBXZXBXMXSXAXSXMXMXMXMXMXMXSXZXMXMXMXZXSXSXMXMXMXBXBXNXSXSXMXSXBXZXZXMXZXZXMXZXMX>XH.CXBXBXZXZXMXBXBXBXZXMXMXMXBXMXBXVXSXbXSXSXSXSXSXnXCXSXbXSXSXSXMXMXSXSXSX6XSXCXMXMXSXSXCXSXMXCXMXMXMXCXMXMXCXSXCXSXCXSXCXSXbXSXbXSXSXSX6XSXCXSXSXCXSXSXCX6XvXCXnXhXA.C.A.A.(.|.'.Z.F.] [ ] ] F.] F.] [ [ ] [ [ [ [ [ q...*.=.=.F.Z.[.S.[ ] ] ] ] ] ] + + @ @ + @ @ ",
"+.+.o.<.O.@.O.O.+.+.X.X.+.+.X.X.+.X.+.X...+.X.........h ..................h ..h ........................X...X...o.h 1.h.=X#XE.E.h.h.E.E.#XW.W.W.W.+XW.R.@XW.W.@XW.+XW.#X@X@X@X@X@X@XW.@X+X$XR.$X+X$X$X$X$X@XR.@XW.@X$XR.R.+X$X%XR.+XR.R.!.R.~.+XR.~.$X~.~.~.~.~.$X~.~.~.~./.W.W.~.W.~.$X$X~.$XW.#X#X$X$X@X~.$X@X$X$X$X#X$X=X$X#X~.~.~.~.$X~.~.&X$X$X=X~.$X~.~.~.~.%X~.%X$X$X&X$X$X$X~.$X$X$X=X#X=X~.&X~.~.^.$X&X$X$X%X$X$X$X&X#X#X/.&X#X$X$X~.&X$X&X&X$X=X/.#X&X$X%X$X%X~.&X%X%X&X&X&X$X=X/.$X&X&X=X&X&X~.%X%X$X~.$X%Xn.SXSXSXSXMXMXmXMXmXSXSXSXSXMXBXBXAXAXBXBXBXBXSXMXBXMXMXSXSXSXSXMXSXMXMXmXMXMXMXMXMXMXSXNXSXSXZXZXAXMXSXZXMXSXMXMXMXMXZXBXSXSXHXSXHXZXHXAXAXAXAXAXAXAXAXSXMXSXMXMXSXSXAXSXHXSXHXSXBXBXBXBXAXAXAXAXAXAXAXAXHXMXMXMXSXBXMXSXBXAXAXAXAXSXAXAXBXBXMXBXMXZXSXZXSXMXSXSXMXCXSXSXMXBXMXMXBXMXMXBXmXCXMXMXMXMXMXMXMXSXSXVXCXCXMXMXMXMXZXSXMXVXmXnXmXbXnXVXMXMXMXMXHXMXMXCXvXbXbXbXCXVXCXVXVXVXVXVXCXMXCXCXCXvXCXbXbX4XbXvXbXbXSXSXCXSXSXSXSXCXMXMXSXbXSXCXSXSXMXMXSX6XSXSXCXSXMXZXMXMXMXMXSXSXCXSXSXSXSXSXSXSXSX6XCXbXSXbXSXSXCXSXSXCXSXCXvXlXbXvXoXF.F.A.(.|.].Z.] ] [ ] ] ] ] ] ] ] ] ] ] [ ] ' ] v ..&.] ' ] ] { [ [ ] ] [ ] } } + @ @ + @ + + ",
"O.O.+.O.O.O.O.O.O.X.X.X.X.+.+.+.X...X.X.+.X.X.X.X...............................o.....................@.......X.o.h <.V.#Xh.j.r.j.E.#X8X8XW.W.E.@XR.W.@XW.W.W.W.W.+XW.@X@XW.@X@X~.$X$X$X~.~.+X+X$X+X$X$X$X$X$X@X$X+X+X+X+X%X+X+XE.E.R.$X$XR.!.$XW.~.$X~.~.%X%X~.~.~.~.%X$X~.%X~.$X$X~.~.~.~.$X~.#X$X$XW.$X&X$X=X$X$X$X$X$X$X$X&X$X~.=X~.~.$X$X$X~.W.$X$X&X%X~.%X%X%X>X%X&X%X%X&X=X$X$XW.=X=X$XW.~.~.%X%X&X&X%X&X%X%X%X-X$X%X&X=X&X=X$X&X/.;X%X$X%X%X%X&X&X&X&X~.&X>X&X-X-X&X&X>X&X&X&X~.=X$X#X~.=X=X*X&X&X&X&X&X%X&X&Xn.MXSXSXAXSXSXNXSXSXSXMXMXMXMXNXSXBXAXBXBXZXAXBXMXSXmXSXSXMXNXSXSXMXMXMXMXCXZXBXZXSXMXMXBXZXZXZXCXmXVXMXmXMXMXMXBXSXSXBXBXVXVXMXMXMXNXBXNXmXmXnXbXnXSXSXSXMXMXMXMXAXAXMXmXbXvXCXVXmXVXVXmXVXnXbXbXnXmXBXBXMXZXSXSXHXCXvXvXvXvXCXbXnXvXvXvXvXvXvXvXbXMXAXMXMXZXSXMXbX4XlXlXvXvXvXnXvXvXvXvXvXXXvXvXMXMXSXMXBXBXMXvXXXjXvXXX4XjXvXlXvX4XjX4XOXOXvXbXNXVXVXBXZXbXlXXXXXXXXX.X X.XXX.X.XXXXXXXXXlXlX4XlX,XlX,XOXOXlXOXlXSXHXSXSXSXSXSXBXBXSXMXSXSXSXSXBXSXSXMXSXSXSXSXZXMXMXMXSXSXSXSXSXSXSXMXCXSXSXCXbXSXSXSXSXCXSXSXbXSXbXSXCXMXMXMXCX4XvXvXXXA.F.A.D.D.].Z.] ' ] ] [ ] ' [ ] ' [ ] ] ] ] ] ] ] 0X] ] ] ] ] ] ] ] ] ] ] ] ] ] + @ @ @ + @ @ ",
"@.+.@.+.@.O.@.O.O.X.+.&.+.+.+.X.+.+.+.X.+.X.+.o.X.X.........X...X.......X.......h ..o...........X.X.@.@.....X...h h j.+Xh.e.t.r.h.E.#X#XE.E.#X#XR.R.R.@XW.W.W.@X+XW.W.W.W.R.R.@X+XR.R.R.+X$X$X$XR.R.R.+X~.+XR.~.$X+X$XR.+X+X%X%X$X+X$X$X$X+X!.$X~.W.W.%X%X!.R.~.%X%X%X&X&X~.~.%X$X/.~.~.$X=XW.~.W.&X&X=XW.$X$XW.&X%X$X$X&X&X~.~.~.~.$X=X%XW.R.$X=X&XW.E.E.~.>X:X,X{.%X%X^.^.!.E./.E.~.;X~.W.~.=X%X&X~.E./.!.^.^.%X>X%X!.~.^.~.W./.$X$X&X=X;X=X&X&X^.E.R.T.E.^.;X%X!.E.!.!.!.E.E.E.~.*X~.#X~.~.&XW.E.N.h.h.T.T.R.!.E.T.y.bXbXvXbXVXAXHXSXMXSXSXSXVXbXbXvXvXbXnXbXbXvXbXvXbXOXvXbXMXMXMXMXMXMXMXMXCXvXlXlXvXvXvXvXvXvXCXvXvX4XvXbXZXHXBXNXAXZXCXvXlX4XXXXX,XvXvXvXvXvXvXXXOXOXnXAXSXMXMXBXAXMXvXXXXXOXXXXXOXvXvXvXvXOXXXXXXXvXVXAXZXMXSXHXMXOXXXXXXXXX}..XXX4XjXjXjXjXXXXXvXnXBXMXMXHXHXCXOXOXOXXXXXXXXXjXXX.XXXjXXXXXXX4XCXSXAXAXDXBXvX X.XhXXX.X.X.XjXjXjXjXXXjXjXXX4XbXZXDXDXGXNXjXoXXXjXlXXXXXjXhX{.kX.X.X.XOXkX4XlXlXlXlXlXlXlXlXlXlXlXnXAXSXbXCXSXSXmXnXVXMX6XbXbXvXvXbXbXvX4XlXbXbXvXvXCXvX4XlX4XvX6XbXmXSXSXSX6XSXCXSX6XSXSXSXSXbXbXSXCXSXMXmXVXMXCXvXlXlXjX XA.m.D.].].Z.[ [ ] ] ] ] [ ] ' F.0X] ] ] ] ] ] ] ' ] ] ] ] ] ] ] ] ] ' ] ] ] ] + @ : X X + + ",
"o.+.O.<.#.O.O.O.O.+.+.+.@.+.X.+.+.X.+.+.X.X.X...X.@.......X.X.X.X.+.X...X.............o...........%...X...o.@.k h N j.V.j.e.t.j.E.W.#XE.E.#X8X#XR.W.W.+XR.@XR.R.#X#X#XW.R.R.E.R.R.+X~.+X+X~.R.!.R.$X$X+X+X~.W.$X$X!.+X$X!.+X+X+X+X+X$X$X$X@XR.R.R.~.~.!.h.a.t.r.N.n.h.n.T.d.d.d.d.a.d.T.$X&XR.W./.&X~.h.r.a.t.f.g.h.d.h.h.g.d.w.t.r.N.$X*X@XR.%X;X&XR.d.a.y.6.q.6.i.N.v.s.d.w.s.t.f.T.;X#X/./.=X*X%XN.d.s.6.U 6.s.h.d.s.h.d.t.f.t.h.8X$X&X/.W.%X&XE.f.f.6.B B f.s.d.s.w.y.w.w.0.f.T.$X~.~./.=X;X~.d.6.6.U B B B 6.w.e.U XXOXXXXXlXVXAXAXNXSXAXnXvXOXXX.X.XXXXXXXjXXXjX4XOXXXXXOXCXHXSXMXMXAXBXvXXXlXXX{. X{.jXvXlXlX4XlXXXXXXXvXMXDXDXZXHXZXlXXXXXXXXX.XXXXXXXjXXXlXlX4XlXXXlXSXAXAXBXDXZXvXXXXXXXoXXXXXjX4XXXjXjXlXlXXXXXXXnXDXGXHXGXSXXXoX X4XvXlXXX.XXXjXXXXXlXOXXXXXvXnXZXZXAXHXZXvXoX.XlXOXXXXXXXXXXXXXjXXXvXXXlXvXvXbXVXNXBXVXXXA.oXjXzXjXjXXXjXlX4XjXXX4XlXXXOXvXCXvXvXvXlXG.A..XlXlXjXlXvXvXvXjXvXvXlXlXlXjXlXjXvXlXlX4XvXlXOXlXOXlXlXOXOXXXoXOX{.XXXXXXXXOXOXOXXX4XXXXXXXXXXXXXXXXXXXoXXXXX}..XXXoXXX4XSXSXCXSXSXSXSXCXbX6XSXSXSXSXbXbXCXMXMXMXVXCXvXvXvX.XA.F. X|.].F.' ' [ ] ] ] [ ' [ ] ] ] 0X[ ] ] ] ] ' ] ] ] ] ] ] ] ] ] ] ] ] ] ] + + + + X + . ",
"+.+.O.@.O.@.O.O.+.O.@.+.X.+.+.+.X.+.X.X.+.X...o.X.X.......X...........X...........h ....o.....o.....X.o.....X.@.o.1.k.j.j.t.r.j.E.W.E.W.#XE.W.W.@XW.@XW.@XW.W.R.W.@X@X@X+XR.R.R.R.$X$X$X$X$X+X+X$X$X%X$X%X+X$X$X$X$X$X+X$XR.R.+X!.$X+X~.~.~.%X!.E.~.~.d.f.B N u M N B B B 6.6.f.6.6.6.s.E.&X~.!.*X*XT.f.B B B B 6.f.w.f.f.6.U 6.6.B 7.h.~.=X~.~.&X/.N.s.f.K u t y N 0.y.y.y.f.U B 6.a./.<X;X~.^.%X!.d.f.y.6.u k U 6.0.6.s.f.f.6.B U r.W.2X&X&X3X^.d.6.7.6.B M M 6.0.s.0.s.0.y.6.6.f.R.<X;X&X<X;XT.f.U 6.w.U B K 6.0.s.U jXjXlX.XXXvXDXDXAXGXDXvXXXXXXXXXXXXXlXlX4XXXjXjXlXXXOXXXbXHXGXAXAXGXVX.XoXXXlXlXjXXXjXvXlXlXlXXXlXvXXXlXCXZXGXGXDXnX XoXjXvXlXjXvXlXjXvXlXlXlXlXlXOXlXmXDXBXBXNXVXXXoX XlXlXXXlXjXjXjXjXXXXXlXlXXXXXlXnXVXVXZXvX XoX.XlXjXjXXXjXlXlXvXjXjXlXXXlXjXjX4XlXlXlXjXoX(.(.jXlXjXjXjXlXlXlXjXvXjXlXXXlXjXXX.X.X.XoXA.A. XjXlXjXXXjX,XjXjXjXlXlXlXlXjXXX XG.(.`._.A.A.G.jXvXvXlXjXvXjXvXlXlXlXlXlX4XlX4XjXlXvXlXlXlXlXlXlXOXoXXXbX4XvXlXCXVXnXXXXXOXlXlXXXlX4XvXvXvXvXOXvXjXXXlXnXDXSXbXvXvXOXOXOXCXSXSXCXSXbXSXSXSXSXbX6XSXSXSXMXmXMXMXMXMXvX4XvX4X XG.A. XD.[ F.' ] ] ] ] 0X[ ] ] ] ] _ ] ] ] ] ] ] ] ' ] ] ] ] ] ] ] ] ] ] ] ] + @ + X + X X ",
"+.o.1.o.1.o.+.+.+.+.+.@.+.X.+.+.+.+.+.o.o.+.o.o.X.X.................&.......................h &.@.....&.....o.o.k <.r.j.t.t.r.h.h.8XE.E.W.W.E.R.@XW.W.W.R.@X@X@X@XR.R.@X#XW.@X@X%X$XW.R.R.R.R.$X#X$X$X~.$X~.@X~.%X~.$XW.$X$X$X~.-X%X%X%X&X^.&X^.;X^./.s.f.y.f.U B U B U U f.y.s.6.6.U 6.T.5X1X:X>X:XN.6.w.0.6.6.s.s.f.6.f.f.s.0.7.U B e.E.>X%X>X:XQ.s.6.s.v.0.U K 0.0.0.p.y.6.f.6.6.6.d.>X1X1X1X}.N.8.6.i.i.6.8.i.s.i.y.s.y.y.f.6.6.f.T.>X>X1X>Xn.6.0.y.i.s.b.v.0.q.i.s.s.i.i.6.6.U N.^.%X^.%XT.p.B 6.v.s.0.y.s.i.s.v.Q lXjXlXXX.XlXbXnXNXVXbXhX.XXXOXlXlXlXlXjXjXjXlXjXjXXXXXjXOXbXnXnXnXbX4X X XjXvXvXjXXXlXlXjXjXvXjXlXlXlXjXXXjXlXlXjX.XA. XjXvXjXXX.XjXvXlXlXlXlXlXlXlXlX.X.XXX.X.X.XoXA..XlXXX.X.X.XXXlXlX4XjXjXjXlXlX.X XG._. X`.A.A..XjXjX X X.XXXlXvXjXvXjXvXlXjXXX).A.A.(.(.(.Z.(.XXzXjXjXjXjXlXlXlXjXjXvXlXlXjXA.A.A.(.C.A.M.).XXlXlXXX.XXXjXjXjXjXjXjXjXlXXX(.M.(.(.A.A.C.(. XlXlXlXlXlXlXlXlXlXOXlXlXlXlXvXOXvXvXlXlXlXzXlXzXlX(..XAXDXDXDXNXbXjXXX.XlXvXjXjXjXlXvXbXbXzXvXzXvXlXvXbXNXAXAXSXSXnXOXOXCXSXSX6XSXbXbXSXbXSXbXSXSXCXSXCXMXMXVXSXMXCX4XlXvXjXG.A. XD.F.[ ] ] ' ] ] ] ] ' ] ] ] ] ] ] ] ' 0X] ] ] ' F.] ] ] ] ] ' ] ] ] ] . + . X . X ",
"1.+.+.1.+.+.+.+.+.1.O.O.+.o.....o.X.o.+.o.o.o.+.+...........+.............................h ....@.......o.....h o.<.e.r.t.t.j.h.8X#XW.#XE.E.W.W.E.W.W.E.R.@X$X$XW.R.@X$X@XW.@X#XN.g.r.7.6.t.t.t.6.7.7.t.w.7.t.7.t.t.t.t.r.t.w.r.e.r.r.e.t.t.f.w.s.d.6.6.y.y.y.s.s.s.s.0.y.y.y.0.0.6.K M U d.i.6.y.y.6.6.y.0.8.8.y.0.0.6.y.y.y.6.y.0.U U y.s.s.f.i.6.U 8.0.0.8.6.0.z.0.0.y.y.U y.p.U M P f.p.y.p.6.I U u.i.i.0.8.0.i.s.f.y.y.y.y.6.U M M B U U U M M 0.z.y.6.K 6.i.s.y.0.0.6.6.i.6.N M B B B M M u M p.s.U j K 8.s.i.y.H lXXXXXjX.X X X`.|. X(.A.`.XXlX.X X XXX.XjXlXjXjXjXjXjXXX X(.(.(.A.A.A.(. XjXlXjX.X.XjXlXvXvXvXlXlXlXlXlX XA.C.m.C.m.A.(.jXzXhX`. X.XjXjXOXlXlXlXlXlXOX`.A.Z.C.m.m.A.(..XlXlX.X X X.XjXlXjXjXlXlXlXlX.X(.F.Z.A.A.A.A. XjXzXjX.XXX.XXXvXjXjXjXjXvXvXkX(.Z.Z.A.(.m.(.(..XOXlXjXjXlXlXlXlXlXjXlXzXvXjX XF.A.C.(.(.(.(.`.jXlXjXhXlXlXlXvXlXvXlXlXzXlX X(.{ (.Z.Z.Z.Z.`.XXlXzXlXlXvXlXlXlXlXlXvXlXvXlXlXzXzXlXlXlXjXlXlXjX(.Z.jXDXGXAXvX`.F.F. XjXlXjXXXXX.X.XjXOXXXjXXXXXXXlXzXnXMXNXbXSXSXSXOXOXvXSXSXSXSXSXSX6XSXSXbX6XSXCXmXmXMXCXMXMXCXvX4X4XlX{.A. XD.[ ] } ] ] ] ] ] ' ] ] ] ] ] ] ] ] ] ] ] ] 0X] ' ] ] ] ] ] 0X' ] ' ] o . X X . o ",
"1.o.<.+.+.+.O.+.+.O.O.O.+.+.....+...+.o.+...+.o.......................h ......X.................X.X.....o...o.o.o.<.j.e.7.t.h.h.E.W.W.E.E.W.R.W.R.R.R.R.R.R.+X+XR.R.+XR.W.R.8Xj.t.,.<.6.6.<.6.7.7.6.6.<.6.6.6.6.6.,.6.<.6.6.7.<.6.B ,.6.U B B M y y u U s.s.s.s.i.i.y.y.p.p.0.8.p.p.U u u f y t y y j 8.0.6.K N 6.0.8.y.f.0.6.8.i.0.M u y y y t y y M y.i.6.M M U y.0.0.y.U 6.y.i.U M u f y t t y u H i.z.Q N M U 0.0.0.y.y.s.p.8.U M r t t q t y M z.b.i.K j v i.v.0.8.0.6.9.z.u.H y y t t t t u H p.b.! M j U i.i.0.G jXlXlXlXXX`.(.m.A.A.Z.m.`.lXzXhX X X.XjXzXlXjXjXlXlXlXjX X(.A.C.C.F.A.A.G.jXlXzXlXlXlXvXvXjXjXvXlXlXzXlX.XA.Z.A.C.A.A.).kXzXjXjX.XlXvXlXzXbXlXlXbXzXlX|.A.m.C.A.A.A.A. XjXzXlXlXjXvXvXvXvXlXlXvXlXlXjX_.C.C.A.(.D.A._. XhXlXlXlXzXlXlXlXvXjXjXjXjXhX XZ.Z.C.(.(.(.(.(. XkXjXjXjXlXzXzXjXjXjXhXkXhX(.A.Z.C.D.).A.Z.Z.(.|.|..X.XhXjXjXhXkX.X.X|.'.).(.M.[.(.Z.Z.Z.Z.C.(.`.(.oX`.(. X X`.oX|.`. X X|.|.`.`.`.).(.(.).).(.[ (.DXDXDXNXhXF.Z.A..XjXjXjXXX.XoX.X.X.X.X.X.XjXjXlXbXNXSXbXSXSXSXbXOXOXSXSXbXSXbXSXSX6XSXSXbXCXSXMXMXmXMXCXMXMXCX4XlXlX,XXX|.C.[ ] ] } ] ] ] ] ] ] ' ' ] ] ] ] ] ' ] ' ' ' ] ] ' ] ' ] ] ] ' ] ] ] o + + + + X X ",
"<.1.1.+.+.+.O.O.+.o.O.@.O.o.+.+.+.+.+.o.+.o.o.o.....+...+.....+.@.....&...%.X.@.................@.X.X...X.,.o.o.,.k.k.7.7.t.j.E.W.#X8XE.W.E.W.E.R.W.R.R.R.R.R.R.@XR.R.+X~.E.r.t.h.E.E./.W.E.E.E.~.+X~.!.R.E.R.R.W.W.W.W.R.+X!.$XW.R.E.E.E.T.!.6.y t M 8.v.v.b.i.s.s.i.b.s.i.i.i.p.i.U u t t t q t t S b.n.c.U U 0.x.i.y.y.i.i.8.i.8.H y t t t t t y S i.b.z.U Q 8.i.b.z.i.i.p.i.i.J M M y t < q t p j 9.n.b.! U 8.s.v.z.p.y.p.p.p.! M y t r w t t f ~ z.c.z.0.i.z.z.z.v.b.i.i.i.! j r r t t t e r f W x.n.v.v.i.x.v.v.^ lXjXzXlX.X X(.Z.Z.Z.C.).)..XlXlXlXlXlXzXlXlXzXlXlXzXjX.X|.(.C.[ C.A.A.C.D. X XkXjXlXlXXXzXvXjXjXjXlXXX.X_.A.C.Z.D.(.C.C.D.|.|.jXhXjXjXjX.XlX.X`..X|.].`.).Z.Z.C.A.D.A.Z.).'.|.|.hXjXhX.XkX.X.X.X X(._.(.C.F.A.C.C.D.D.C.C.[.).).`. X X(. X XA.A.A.(.A.Z.Z.C.[.[.(.{ (.{ F.G.A.F.D.G.D.D.].A.C.A.A.A.A.Z.C.).C.C.[.Z.(.Z.{ [.A.A.F.A.C.A.C.A.{ M.[.(.{ (.C.[.[.(.Z.Z.Z.Z.Z.Z.C.M.(.{ (.{ Z.F.Z.F.C.Z.Z.F.Z.Z.Z.Z.C.Z.C.M.Z.zXNXAXDXbXZ.F.F. XlXzXlXzXlXlXlXlXOXXXlXlXlXlXOXlXbXAXSXSXCXSXSX4XOXbXSXbXSXSXSXlXSXSXbXSXSXbXMXCXMXCXCXCXSXMXCXlXlXvXlX.XF.[ ] ] ] ' ] } ] ] ] ' 0X' ' ] ] ' ] ' ] [ ] ] ] ] ] ] ] ] ] ] ] ] ] + O O O O O O ",
"+.+.1.1.o.1.O.+.+.+.+.O.@.+.o.o...o.o.+.+.o.o.+.+.................@.......&...&...&.................X.....@.o.k <.k.k.7.7.r.h.+XW.E.E.W.W.R.R.R.E.W.R.R.R.R.R.+XR.R.R.$XE.h.h.E.~.$X$X$X#XW.W.W.$X$X~.%X$X$X%X$X~.@X@X$X$X$X$X$X#XW.E.E.W.=X!.f 2 u j H Q p.i.0.i.b.b.x.x.c.9.~ ! W M r e w w t t t s H u.u.8.i.z.z.i.i.i.i.u.! W G f r r e 5 < < e s f H ! ! ^ 9.9.0.8.Q Q I G H j f f a w < w a p r f F ~ u.u.8.8.u.8.9.! I J H M u s w < w w p r s f G W Q Q 9.Q R W W J j M M f f s 4 < 4 d s t 5 g M G G H G J G l |.|.]._.).).).(.M.Z.(.).(.Z.(.(.`. X`.(.`.(.).(.).(.(.[.'.].S.Z.Z.S.D.C.C.Z.m.C.D.(.(.(.D._.(.C.(.(.Z.(.(.).Z.Z.D.D.S.C.C.C.Z.C.C.Z.(.(.Z.(.Z.Z.M.Z.(.).[.Z.F.C.D.D.C.C.[.Z.Z.Z.[.Z.Z.Z.A.F.Z.Z.Z.C.).).C.Z.Z.).).D.C.C.C.Z.Z.Z.A.Z.Z.Z.Z.Z.Z.Z.C.C.D.C.Z.C.).C.C.C.C.Z.Z.Z.Z.C.Z.F.F.{ Z.Z.Z.C.C.C.Z.Z.C.A.D.A.A.C.Z.Z.Z.Z.Z.[.Z.Z.Z.F.F.C.F.C.Z.Z.Z.[.Z.[.C.[.Z.Z.Z.Z.Z.Z.(.Z.[.M.{ (.Z.Z.Z.M.Z.Z.Z.Z.{ Z.Z.{ Z.Z.[.Z.[ (.mXDXDXNX.XZ.F.D.|.jXjXlXzXlXXXjXjXlXlXlXlXlXlXjXlXNXBXVXMXSXSXbXOXlXSXSXSX6XSXSXbXSXCXSXSXSXSXCXCXSXSXSXMXMXCXCX4XvXvXkXF.] ] ] ] ] ] ] ] ] ] ] ] ] 0X[ ] ] ] ] ] ] ] ] ] ] ] ] ' 0X] } ] ] ] X + O . + + X ",
"<.1.+.1.1.o.+.+.+.+.O.@.O.@.o.o.o...o.+.o.o.o.o.......................@.......................@.X...@.@.@.X.h o.<.e.j.e.7.j.h.+X#XE.R.W.E./.E./.W.E.R.E.R.!.+XR.R.E.R.R.E.h.h.E.R.~.R.R.W.W.R.R.R.R.R.+XR.W.R.R.W./.R.R.R.R.R.R.E.8XE.8X~.&XB.g > f f r r u u u j f M f S f f p r s r p d d < < < 5 5 t e r g f f M f V j g r e r s g s s i 4 5 4 i e w 5 5 w t r g f f y r t t w s l f d < , < a a i e i t t e t r r r r r e t r u s s i 4 < d a w < 5 5 t 5 q w w q w r t t t p s l l 5 , 4 7 i 4 5 5 5 < < < t e w < [ C.C.C.C.).).).Z.C.C.C.(.Z.Z.M.(.{ (.[ (.{ (.(.Z.Z.Z.(.).].C.Z.Z.D.D.D.D.C.Z.Z.Z.Z.C.Z.Z.F.Z.F.M.Z.{ (.).].Z.Z.C.D.D.D.C.Z.Z.Z.Z.Z.Z.Z.Z.Z.(.(.C.Z.Z.).).Z.{ Z.D.D.C.C.Z.{ Z.Z.Z.A.Z.Z.C.Z.Z.S.Z.Z.Z.).Z.Z.C.[.C.C.C.Z.Z.Z.Z.C.C.Z.Z.Z.Z.Z.C.Z.Z.Z.C.Z.[ Z.Z.C.Z.Z.Z.Z.Z.F.Z.Z.S.F.S.S.C.Z.F.Z.C.C.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.M.{ Z.C.S.Z.C.Z.Z.C.S.Z.[.Z.Z.Y.Z.{ { Z.M.Z.[.(.Z.{ Z.{ { (.{ Z.Z.).[.[.C.Z.Z.Z.Z.C.C.C.(.`._.Z.Z.bXDXNXNXvXZ.F.C.).A.]._.`._.(.(.(.`.(._.`._.(.(..XnXSXNXbXmXSXSX4XOXCXSXSXbXSXbXSX6XSXSX6XSXCXSXSXCXSXCXCXCXMXCXvXlXvXjXF._ ] [ ] ] ] ] ] ] ] ] ] ' ] ' 0X] ] ] ] ' ' ] ] ' ] ' ] ] ] ' ' ] ' o + o . o o o ",
"o.O.O.O.1.@.1.+.+.+.1.1.@.O.+.1.+.o.+.X.o.o...o.o.....+.X.X.....@...............&.........@.@...X.X.@.@.@.h h o.7.e.e.7.t.j.h.R.R.E.E.R.R.E.!.R.E.E.R.R.R.E.R.R.R.R.+XR.E.j.h.R.~.R.R.R.+XR.R.R.+XR.+XR.~.R.R./.!.R.W.W.+X+XR.+X#XE.E.E.^.^./ < < l z e < 5 < < < 5 < < 5 < < < < < e d d 7 7 < < 7 7 7 < 4 5 2 < 5 < < < 5 < 5 t t p d d i < < 7 i i 4 4 4 4 4 w < < < < < < < 4 i d Z c < , < a a 7 < < 5 < 5 5 5 5 4 e 5 5 < 5 5 s l i < < i a i e 4 4 w 4 w 4 4 < w w < w < 5 p f d < , 7 7 i 7 i e 5 < t a e i w < _ Z.F.Z.C._.`.Z.F.Z.D.C.Z.Z.Z.Z.{ (.[.(.Z.{ Z.(.Z.Z.{ Z.).).).{ { S.C.C.Z.Z.Z.Z.Z.Z.C.[.C.Z.C.C.Z.Z.{ Z.C.).Z.[ Z.C.C.Z.Z.{ Z.Z.Z.[.Z.Z.Z.Z.Z.Z.Z.Z.Z.[.[.Z.{ M.F.C.F.A.Z.{ Z.Z.Z.Z.Z.C.S.Z.Z.Z.Z.Z.[.[.[.Z.Z.(.Z.Z.Z.Z.Z.C.C.Z.Z.{ C.Z.Z.Z.S.S.[.].'.).C.C.).C.).C.D.D._.).D.C.Z.S.Z.S.C.Z.C.).kXhX_.)._._.(.(.(.(.`.'. X).(.{ Z.Z.Z.Z.F.Z.D.kXhXhX`.`. X|.'.|.|..X.X.X.X).F.Z.Z.C.Z.Z.Z.[.hXjXjXkX.XjXXXjXhXjXhXjXlXzX|.F.|.nXDXDXZXkXF.{ Z.Z.Z.Z.Z.Z.Z.Z.M.Z.Z.A.Z.Z.Z.F.Z.XXNXAXNXSXSXSX4XOX4XSXSXSX6XSXSXbXSXCXbX6XSXSXCXSXSXCXCXSXMXCXvXlXvXlXrXF.] [ ] ] ' ] ] ] ] ] ] 0X] ] ] ] ] ' ] ' ] ] ' ' ] ' ] ' ' ' ] ' | o o o ",
"+.O.O.O.+.1.<.+.+.+.+.+.+.+.+.@.+.X.+.+.+.o.o.....o.X.X.X.X...X...@...&.................h &.k @...@.@...k h k ,.7.k.g.7.t.j.+X+XR.E.W.W.R.R.E.!.W.W.R.E.R.R.R.R.~.R.$XR.h.h.E.R.!.R.R.R.+XR.~.R.R.R.~.~.R.W.W.!.W.~.R.W.!.+XR.R.8X#X8XW.&X}./ < < d l e < < < < < < < < < < < 7 8 5 a d a 4 < , , < 4 4 , < 4 i 7 < < 5 7 4 < < 5 < 5 e i 4 > < < 4 , < < < 8 5 4 4 2 < 4 < 4 4 5 4 s i i > > 5 < 4 , , < 8 5 4 7 4 4 5 7 5 5 5 5 4 d d 4 < , < < < 5 < < 5 w 7 w 4 4 4 w < w t 5 p f p < , 4 < 5 5 5 5 5 5 w w < < 7 7 c Z.Z.Z.Z.).(.Z.{ F.C.C.Z.Z.Z.M.Z.{ Z.[.{ Z.{ Z.Z.Z.(.(.(.).A.F.F.D.C.Z.F.C.A.(.Z.M.Z.Z.Z.Z.Z.Z.Z.[.(.`.].`.A.A.D.(.D.A.A.A.[.).(.Z.Z.Z.Z.(.Z.{ [.].hX.X X'.).'.kX XD.D. X.X.X`.A.Z.{ Z.Z.Z.Z.Z.].hXhXhX X X`..X.XhX.X.XhXhXhX(.Z.Z.C.[.Z.F.Z.].kXjXjXhX|..XjXjXjXjXjXjXzXjX.XD.Z.F.S.Z.F.Z.C.'.zXjXhX.XjXzXlXjXlXlXlXzXzXlX`.Z.[ { Z.Z.Z.Z.].zXzXjX.XjXlXlXlXjXzXzXlXlXzX.XZ.{ C.{ { { [.[.hXjXlXjXhXjXlXlXlXlXlXlXlXlXXXA.Z.lXFXNXZXvXA.[ F.[ [ F.[ Z.F.Z.[ [ F.F.{ { C.F.F. XnXAXNXnXSXSXSXOXOXbXSXSXSXSXbXSXbXSXSXSXSXCXSXCXMXMXCXMXZXZXCX4XvXvXzXF.] ] ] ] ] ] ' ' ' ' ' ' ' ' ' ' ] ' ' 0X' ] ' 0X] ' ' ' ' 0X' ] 9 o o ",
"O.@.4.@.O.@.O.O.O.+.O.&.+.X.+.O.O.+.@.<.+.o.o...o.o.+.o.o.X.X.X.X...X.X.......@.......@.@...h ......b b b b b ,.H.g.g.7.e.h.+X$XR.E.R.R.R.!.R.E.~.R.!.R.R.R.!.+XR.R.+XE.h.h.#X@XR.R.@XR.W.+X~.R.~.R.+XR.~.R.W.!.R.W.W.R.R.R.$X+X#X8XE.E.%XXXQ 2 4 d s d f d s p e p e w w 4 < 4 5 5 5 e i t 5 5 e e 5 w 4 4 8 5 , 8 8 < < 5 5 s f s f f f e w w w r w e d 4 8 < < 7 7 < < 5 p C Z m V V m i 4 s s d d f Z f 5 5 5 4 4 8 < 4 d C P S S m f p p g f f v v v s t < 5 5 4 < < i D G H H I G z f f S S z v R z e < w 4 5 5 8 8 T kXkX.X.X.X|.|. X X'..XhXhX|.].).Z.{ Z.Z.Z.{ [.`.jXjXjXhX.XkXhXjXjXhXhX.XhXjXkXD.Z.Z.Z.Z.Z.Z.C.|.jXjXhXhXhX.XhXlXhXjXzXjXzXjXkXA.F.C.Z.Z.Z.F.[.jXzXjXhXjXjXzXzXlXlXzXzXzXzXjX_.Z.Z.Z.Z.{ Z.[.gXzXlXhX.X.X.XlXlXjXlXzXvXnXzXhXC.Z.Z.C.S.F.Z.).kXlXjX.X.XjXjXjXlXlXvXvXlXzXlX).Z.Z.Z.Z.C.Z.D.kXjXjXlXjXjXlXlXlXlXlXjXjXzXlXkXD.Z.Z.Z.Z.Z.S.).hXlXjX.XjXjXjXjXjXjXjXjXjXvXjX].Z.F.{ { Z.Z.(._.hXlXlX.XjXXXlXlXlXlXlXjXlXlX.XA.`.bXAXAXDXXX X`.`.`. X`.|..X.X.XhXhXhXjXhXlXjXOXvXSXSXSXSXSXSXSXbXOX4XbXSXSXSXbXSXMXVXMXCXMXMXSXSXCXSXCXCXMXMXMXvX4XvXvXkX[ ] ] ] ] ] ] ' ' ] ] ] ] ] ] ] ' ] ] ] ] ' ] ] ] ] ' ] ] ] ] 9 & + + + O o X + ",
"4.4.O.4.#.O.O.O.+.O.<.#.4.1.O.O.1.@.O.+.+.o.o.+.o.o.o.+.o.o.X.X.X.o.X...X.................@...h h h b b b q k q.g.g.7.w.7.N.%X-XE.R.!.!.R.E.R.!.E.R.E.R.R.+XE.+XR.E.~.E.h.h.R.@X+XR.R.R.R.R.R.R.+X+X~.+X~.~.W.!./.@X!.W.+XR.R.R.R.8XE./.,X}.z > < l V W ` ^ D G S F ^ ^ ~ ^ ^ G I W G L I U I W u./ ~ / c.F 5 < 5 5 7 < , 8 C M.c.9.! ! ! ! Q 8.9.! ^ u.c.R s 8 < 4 7 < < i T M.M./ I Q L Q / c.M./ c.c.` P 5 5 5 7 7 8 < i F c./ L I / z.z.b.z.z.i.c.b.M.W s < < 5 w < < s c.b./ I J 8.z.b.b.n.v.z.b.m.M.v < < 5 8 5 < 5 i ` jXlX.X XlXjXlXlXjXlXzXzXlXzX`.Z.Z.Z.Z.Z.Z.Z.`.zXzXjX.X.XjXlXlXlXlXlXlXlXzXjXD.Z.Z.Z.Z.Z.Z.C.gXzXzXXX.X.XlXzXbXvXzXjXlXzXjXkXA.C.Z.Z.Z.Z.Z.).|.jXjX.XlXlXlXvXjXlXlXlXjXjXlX.XC.Z.Z.{ Z.Z.C.|.jXjXjXXXXX.XjXlXjXlXlXjXjXzXjX).F.Z.{ F.Z.S.S.'.zXjXXXjXvXlXlXlXjXjXjXlXlXlXhX[.{ { F.F.D.D.D.hXzXjX.XjXlXlXlXjXjXjXjXjXlXjXhXZ.F.F.Z.S.S.D.`.jXzXlX.XXXjXvXjXlXlXjXjXjXvXhXS.[ [ Z.C.[.(.(.|.jXlXjXXXjXlXlXlXjXjXjXjXlXlX(.m.XXDXSXSXAXAXAXAXAXAXDXAXDXDXFXDXAXAXDXAXDXDXAXSXSXSX6XSXCXSXSXSXlXOX6XbXbXSXSXbXMXMXMXmXMXCXCXSXCXSXSXSXMXMXMX6XvX4XvXvXD.[ ] [ } ] ] 0X} ] ] [ ] ] ] ] } } ] ] ] } ] [ 0X] [ [ } ' 9 ; ; & & ; ; ; ; ; ",
"@.O.#.O.O.O.O.+.O.O.#.#.<.O.O.O.<.1.O.O.@.<.<.+.o.o.o.o.o.o.o.+.o.....X.......X...........h h h b b b b q q k i.g.w.w.w.j.N.%XV.E.R.%XR.R.R.R.!.!.R.R.R.R.V.!.+X+XR.R.N.h.h.W.R.R.R.R.R.R.R.R.R.R.R.+XR.R.R.R.R.~.R.@XR.+XR.R.+XW.W.E.~.>XoXa > w D ^ c.c.I M H M H J I ~ u.u.8.u.y.u.p.p.p.y.y.p.p.i.c.x.L 4 < 5 5 4 < , 4 ^ M.z.8.Q R U 8.i.v.i.i.i.x.M.~ f < , 7 7 < < f _ b.i.L H K M Q i.v.i.i.i.x.x.W r 5 8 8 4 < < e T z.! G J U 9.z.z.v.0.0.8.0.i.W f 5 < 8 < < < p ~ M.8.J K U 0.i.i.p.p.8.9.n.z.v a < < 7 8 < < s _ c.M. XXXXXjXvXvXjXlXjXjXjXjX|.A.Z.F.{ Z.S.C.'.lXzXjX.X.XlXlXjXjXlXlXjXlXlXjX|.F.F.F.Z.Z.C.C.'.jXjX.XOXlXXXlXlXlXlXjXjXlXvXlX|.C.F.F.Z.F.A.(.|.lXlXlXlXlXlXlXlXlXlXjXjXvXjX.X_.Z.[ Z.Z.S.C.`..XlXlXlXOXOXlXvXlXlXjXjXjXlXlX.X).[ [ { S.D.D.`.jXzXlXjXlXlXlXlXlXXXlXjXlXlXzX|.Z.[ F.A.D.D.D. XjXjX.X.XXXXXlXlXjXjXjXjXjXvXkXS.[ [ S.S.D.A.(.|.lXlX.X.XjXjXjXlXvXjXjXjXzXzX).[ { C.[.[.Z.(.`.hXzXlXjXjXlXjXlXlXlXlXlXzXzXjXA. XNXAXnXNXNXmXmXSXNXNXNXSXAXSXSXSXSXNXSXSXSXSXSXSXSXSX6XSX6XSXSXSXOX4XSXSXCXSXbXMXCXCXMXCXSXMXCXCXCXCXSX6XMXSXCXbX4XvXbXkXF.] ] } } { } } [ [ } } { } { { [ { } { } { } { } } [ | 1 ; , ; @ ; * & * ; & ",
"O.@.@.O.@.4.O.O.O.O.O.@.O.O.O.O.O.O.O.1.1.+.o.o.+.o.o.o.o.o.....o...o.X...................@.h h k h b b q q @.b.g.a.e.7.j.+X+X!.E.R.R.R.R.R.+X+XR.R.R.~.+X+XR.R.+X=X#Xh.r.E.@XR.E.R.R.+XR.R.~.+XR.R.~.R.R.R.R.~.R.W.R.+XR.E.R.+XR.E.!.^.1XQ.w 2 w T ^ c.u.p.9.8.8.! ! 8.i.i.p.f.y.6.y.f.8.f.0.0.y.y.i.y.u.P s 5 < , < 1 < i ^ b.z.0.8.q.U 8.i.i.i.i.i.i.9.! z w 4 < , < < f 9.b.x.y.p.p.6.p.i.y.y.p.8.p.p.I f e 5 , , < 8 s Y b.p.y.u.8.0.z.s.i.0.0.6.8.u.! f t 5 , < < t s ~ x.p.y.i.y.i.s.s.y.8.6.8.0.u.T d 4 < 1 < 4 7 f R z.u.p.p.p.i.i.0.i.i.i.i.i.c.Q u < < > < q e z ~ z.y.0.i.s.s.y.s.y.p.p.i.i.c.R d < 2 > < p p f Q i.p.8.s.p.w.y.y.p.s.y.0.y.i.U g 2 > 4 a w r m u.i.y.p.p.p.y.s.y.0.f.0.i.z.Q z 4 2 , a d i m I i.v.p.p.s.s.H.0.0.s.i.i.H.z.^ s 2 , a x x q s W z.v.s.s.s.g.d.p.s.s.s.x.c.M.E 7 > < a d g g f 9.z.i.p.y.s.s.v.v.s.s.b.v.m.M.a > < d d a p s F / c./ 8.v.n.b.b.H.v.s.v.b.c.x < 7 7 d d s 5 f D ^ ! 9.! u.c./ c.p.u.u./ ~ ! t y b.>X/.R.~.R.$X/.^.W.~./.~././.W.W.!.~.~./.W.8X8X8X8X#XW./.=X=X/.h.t.h.#X#XW./.W.W.R.R.W.W.W.R.W.W.#X8XW.W.W.W.E.h.r.N.v.g > # + ; ; & ; * * * ; ; * * ; ; = & = & * @ @ @ @ * * @ * * @ O @ @ @ @ @ @ ",
"O.@.<.O.<.O.+.+.@.O.O.O.O.O.O.O.O.@.O.O.<.+.X.+.o.+.+.o.+.o.o.o...o.o.o...h h ........h ..h h k b v b q q b K v.s.e.e.r.j.+X+X+XR.$XR.R.+X$XR.R.R.R.R.R.R.R.R.+X+X~.+Xh.j.E.@X@XR.~.+X!.R.+XR.R.~.R.+X~.W.W.W.R.R.R.R.+X+XR.+X+XR.W.E.#X>Xm.w > d R 9.z.f./ u.y.8.0.0.8.0.y.y.8.6.f.6.p.y.0.y.s.w.y.i.i.i.J s 4 < < , < < w R c.b.z.v.s.s.v.s.s.s.y.0.8.y.Q V e 7 6 2 < w f 9.b.x.p.p.i.s.v.i.y.y.y.0.0.y.Q f s 4 , , < 7 f W x.b.i.y.i.y.0.0.0.8.y.y.y.8.! S s < , < 4 a f 8.z.p.y.s.i.0.s.y.6.f.y.8.y.z.W D a , > < a a l W z.x.i.0.y.i.0.0.0.0.0.0.b.b.9.x < < < w a a D z.v.v.0.y.i.y.y.p.p.8.p.p.p.z.R x w > 2 a a r f 8.b.v.s.y.p.s.y.s.s.s.i.i.s.s.8.f < 2 i s a r u Q z.i.s.i.s.v.d.v.s.s.i.v.z.z.R w > , d x a f H U p.s.v.v.n.d.z.v.b.b.b.z.z.~ d 2 < a x p a g S Q 8.0.H.z.v.n.s.s.i.i.c./ c.D < > w d f a g y z I Q 8.8.8.0.0.0.z.z.9.9.c._ p , 4 d d s i r s f S J I W ! 9.8.U ! ! G M S d 5 5 d c d 7 i i e t g f f m m M M m j f u f f t t U !.+X!.+X+X+X$X~.+X+X~.W.W.W.W.W.W.W.R.W.@XW.W.W.W.8XW.W.#X@XW.T.a.j.E.=XW.W.W.W.@XR.R.+X+XR.#XW.W.+XW.E.#X#X#XE.j.g.N.Q 5 # * * @ @ @ @ @ @ @ @ @ @ $ O @ @ @ X @ X # @ @ @ @ @ + @ X + # @ X # # O ",
"O.O.O.@.O.+.X.+.O.+.O.@.+.+.+.+.O.O.+.+.+.X.+.+.o.o.o.+.o.+.o.o.o.o.o.o...............h ..h ..k h b b q q y q.h.e.k.e.a.N.E.$XR.R.V.R.R.V.R.R.R.R.R.R.R.R.R.R.R.+XR.E.h.j.E.@X+XR.R.+XR.~.R.+XR.R.R.R.+XW.R.~.R.W.!.+X@X+X+X+X+XR.E.E.~.}.z.2 , f Q z.z.p.8.y.p.y.8.0.6.8.0.0.y.p.y.y.p.y.y.y.w.0.8.i.i.9.S s 7 < , > > < d ` b.b.v.z.v.i.0.i.i.y.0.0.i.v.! z p < > > < e z 9.M.v.p.i.s.i.s.s.i.y.y.i.i.i.U u f w > > e f z Y u.s.y.y.i.s.z.H.0.y.y.y.i.p.! W C w > 2 e g z W u.v.b.v.i.i.s.s.i.i.p.p.p.u.G D l < > , a a f R c.b.v.v.v.i.v.s.v.v.b.z.9.u.9.v w , < a d p f W i.i.b.b.b.v.i.s.i.d.x.x.x.z._ v w > a v x p g v J / p.y.i.n.s.v.i.v.z.z.9.9.~ v < , i f s w g j J I I Q 8.0.9.9.0.8.8.Q Q _ v a 2 < d x f p r f M M I K ! 9.0.8.8.I H S D T l 2 , p d f p s p r y f f j M H K M M m u s s c w , w d d d g r r g g g u y f j j f u u t p f w < 4 a p p p p e 5 5 t t 4 t e t t t e t t r i 4 5 7 7 d s i 4 5 5 5 5 5 5 5 5 5 5 5 5 t t s s < y n.%X~.R.+X+XR.+X+X+X@X@X@XW.W.W.W.W.W.W.8XW.#X@XW.W.@X@X@X$X$XW.h.r.h.W.#X#XW.W.W.W.E.R.R.R.W.W.W.W.+XW.+X#X#XR.h.t.N.N.S , # . # . + # + # + O + @ X O O # # X + # # + + @ @ + @ . . . + . . X + . ",
"@.O.@.#.@.O.@.O.+.@.@.+.+.+.o.+.@.@.+.<.X.o.o.o.+.o.o.o.+.o.o.o.o.o.o.o.o.h ..h ....h ..h ..h ..@.b b q q k 0.s.g.7.e.g.N.+XR.R.R.R.!.V.E.+XR.E.R.E.E.R.R.R.R.R.R.E.N.h.h.E.#XE.E.R.R.R.R.R.R.R.R.R.R.@XR.+X!.R.R.!.W.@X+X+XR.E.R.E.E.~.}.G 2 < S L R Q Q ! y.p.i.p.p.i.z.i.i.i.i.y.p.p.i.i.i.p.i.s.b.c.J V d 7 6 , # , 8 f W c.z.z.b.n.b.s.s.b.v.v.i.p.u.G g p i , > 5 i m L / / p.i.v.i.i.i.u.z.z.9.! Q H f V p > , p d f f I ^ ! u.i.z.z.z.9.0.y.y.U I H F v a 2 2 g f f v D I ! 8.8.8.0.i.8.f.U I J I M z l 4 > 7 c l p f f G I Q ! 8.8.9.9.0.Q K G H v z s < < a l g r r s f M G J I U J J I M M m x v x a > q x f f g r t e u m M M M M m j f f p y x l w 2 a x f p w a t t r p p f f g g g g y q a a a < q a d f p w < t r e t t r t g t q t q i l l < < a d d d p w < < t t 5 w r t 5 5 5 5 e e p a < a d a s s p r w < w t t t t t t t t 5 w i e 4 4 w d p d a i e t < 5 4 4 5 < < 8 5 < t t e 4 5 4 4 i 4 4 4 4 e 5 5 t 5 5 < < 5 < 5 < < r s 2 < J Q.^.R.~.+X+X+X+X+XW.W.W.R.W.W.W.W.W.W.#X#XW.W.W.W.W.W.@X=X=X$XW.j.r.8XW.W.W.W.W.R.E.+X+XR.+XE.+X+X@XR.R.W.E.@XW.j.w.n.i.5 # # # @ @ # + + + + + X . + O + # + + + + + # + # @ . + X . + @ # + @ + ",
"1.@.@.O.O.<.O.@.+.+.X.+.o.+.o.o.+.@.@.o.X.o.o.o.o.o.o.+.o.o.+.o...o.o.o...o.......h ..h h ....k k h b b b ,.H.g.g.e.7.h.E.R.R.R.R.R.+X+X+XE.R.E.R.R.R.R.R.E.R.!.R.R.h.h.E.+XW.E.R.R.R.R.R.R.R.R.R.R.+XR.R.R.R.~.R.W.E.E.R.+XR.R.!.R.E.^.!.f > a S f p s m u u f f m M H H P H H J J P G G H M M j f M f g d d 7 7 - > 8 7 i p s f j v R R K J H K j j j f f s d d 4 < 7 a i s r s f M H G H M j H j f u r s V C d < > d l p p r u g u s f j f j f u u f r e f C d < a c f a w w t t t r g f g u u r t y u s S V 4 > 4 l d e 5 t 5 t t t r p g g p y p q p f l x w < s d f i e w w w < t t p g r t 5 t t w f v c 2 < a f s p r w 4 e 5 5 5 5 5 t e i w q < a x a 2 w d a p p e < 4 w w w w w t w w e w < 4 d d w 4 a a a p e i i e e w e 5 < t 5 < e t w a f i < w d a e w i a i 4 7 w 4 5 5 5 5 5 5 5 5 p p < < w e s s w w w < w w w t < < t w 5 5 4 4 t 5 < < w w w w 5 5 4 5 5 4 4 7 i Z Z m r r s r s p e s s t 5 4 e e e 4 5 5 5 t t t t e r g g s p < q B.>X&XR.+XR.R.+X+XW.@XW.W.W.~.W.W.W.W.W.W.W.W.@XW.W.W.~.%X$X~.$Xh.t.j.8XW.W.W.W.W.E.R.+X+XE.R.+XR.R.W.W.W.W.@X#Xh.w.d.T.P , # . # + + @ # @ @ @ O # X + # O X # # @ @ @ + + + @ . X . + @ O @ @ @ ",
"<.@.+.+.<.1.<.@.@.<.o.X.+.o.o.+.o.o.o.o.X.X.o.o.o.o.o.+.o.o.+...o.............h h ....h h h @.k @.b h k k 7.b.j.j.t.k.j.+XE.R.R.R.+X!.+XR.+XR.R.R.!.R.R.R.R.E.R.@XR.E.h.E.R.R.E.R.+XR.R.R.W.R.~.R.R.R.+XR.+XR.R.R.+XR.R.E.+X+XR.W.E.E.>XQ.g > d D p < 5 5 < < < 5 5 5 5 5 t 5 5 t 4 4 5 5 5 5 5 5 5 < 5 i d c d 7 - # < 7 7 7 4 < < 5 w 5 < t t t t t < a d l d a , > 7 d 7 7 5 4 5 5 5 t t t t < < w w w a l C d , > a x a 4 5 4 5 5 < 5 5 w 4 4 t 4 e 4 4 f C l < 4 d a a w 4 w w w < < w w w 4 t t t e p l z i > i l d i i 7 w w w < 4 w w t q < q < < a f z i 5 i i a a i 5 < 7 7 w 4 w 5 5 5 t 5 t w s z f < < p p q a w < 4 s 4 t e w e 5 < 5 4 4 4 i c a , i p p e a e a w 4 w w 4 t 5 5 < w w < 5 p f < 5 t i w 4 i i 4 5 5 7 5 5 e s t t t t < < f s < < p r e 4 4 a 4 7 5 5 7 8 m m m r 5 5 5 g g t < u m f r 5 5 w a w < w w d m f f u u p r f f g f v T z f w < w 4 4 < 8 7 Z ` ` / H P G H P G L I L P H P L L L E L L P L W I W Q ! / Q ! ^ w 2 8.{.%X!.R.R.R.+X+X+X+X$X+XW.W.@XR.W.R.W.W.W.~.$X$XR.E.$X$XR.~.*XE.t.t.8X#X+X+X#XW.R.+X@XR.E.R.@XR.E.+X@X@XR.W.R.~.N.a.h.n.l > . @ @ + # + # @ + + o X . X . X X X # X + . # + + @ # X # X O # + O ",
"@.+.+.<.o.+.O.@.@.1.+.X.o.+.o.o.o.+.o.+.X.o.O.X.+.+.+.O.+.o.+.+.+.X.o.o.o...o.o...h ........@.o.k @.k k q.H.k.g.e.e.j.E.E.+X@XR.R.R.+XR.V.R.E.R.R.R.R.+XR.R.E.R.@X@Xj.h.E.$XE.R.R.R.R.!.R.R.R.R.R.R.R.R.R.R.+X+X+X+X!.+XV.+XE.R.R.T.T.1X!.5 2 d x e < 4 4 5 < 5 < 5 < 4 < < < < 5 8 5 5 5 5 5 5 w 5 5 5 7 7 7 c 7 # - 7 c 7 7 7 4 5 t 4 < < < < < < < 5 w a d l i < < 4 a a 4 8 7 7 4 5 5 5 5 < < t < < 4 a d x i > , i d 7 7 5 4 7 5 < 4 4 4 < 5 5 4 < < 5 f V s < < a i 7 7 w 4 4 a w < < w < t 5 t < 5 e p f e , < i d 4 5 5 7 7 w 4 4 i w 5 < w t < < w d l 4 < 4 l i 4 7 5 7 a a 7 4 e e 4 < 5 t t < < f f t < r f t w w 5 5 7 4 4 e d s i e r e 5 4 s l f a a l f t < 7 4 a a < w w f f Z f p s r r f f f f m F V e < 5 4 s 7 5 5 r V / ! M f H H M H K G I W W ^ V e < 6 7 5 8 5 m E / / P B U U U Q ! ! ~ i./ W M t w a 7 < < p H c.b./ P G W u.x.x.p.i.z.b.b.^ s < < i , < i i m ^ x.x.u.U Q I U I I U U U U u.p.i.i.p./ p.u./ p.p.p.p.p.p.p.v.b.F < q N.4X$XE.E.R.+XE.R.+X!.!.~.W.R.@XW.W.~.W.W.+X$X+XR.R.W.$X$XR.W.*X8X<.r.8X#X8XW.#XE.@X@XR.+XR.E.R.+XR.R.R.R.R.~.$XR.g.d.n.c.< # # # @ # + + ; + + X X % + X X + X O O # # O + @ @ . X + O + X @ + ",
"+.+.+.@.+.o.@.@.<.X.X.o.o.o.o.+.o.+.+...+.+.@.1.1.+.1.O.O.O.O.+.+.O.<.@.o.o.o.o.............o.@.@.@.k k q.k.g.k.e.e.j.E.E.@X@XR.E.R.R.R.R.+XE.R.R.R.R.R.R.R.R.R.R.E.h.h.R.+XR.R.R.R.R.E.R.E.R.R.R.R.R.R.!.+XR.!.E.+X!.+X#X+XR.E.E.E.E.}.B.< < p a a w a s e < < t 5 < < 4 < < 4 < < < 8 8 5 < 8 < < < 8 5 s i i 4 > , 5 7 7 4 4 7 4 4 < t e r t w t < < 2 w d f i w e 7 4 7 8 7 8 4 < 4 e p s r r e t w w w p z f < i d 4 5 5 8 5 5 8 w f Z f p e e r p e e s m g g f x i < < 4 4 < 5 < a f v f s g g t t e f m m i f l s 5 5 5 4 w 4 w d D G S j j z z z v v G P m F C s 5 5 7 < < < 4 d R ^ ^ H H H M f v J J H G I L f t < w 4 7 7 4 f R c./ ! P H L Q u._ 9./ / / ^ m t 5 < 4 < < w f ~ x.p.W L I I 8.i.z.u./ / p.p.D i 4 7 7 5 5 5 s P p.i.U 6.u.x.i.z.z.z.v.x.x.n.^ s < 4 7 4 5 4 m P i.p.U / d.i.i.i.b.s.p.p.s.c.I e < < < < a g m Q v.v.8./ f.p.y.y.y.p.s.s.b.9.z t < < 8 4 a s s m / v.p.p.y.p.i.y.y.0.f.8.8.u.f.0.0.y.p.p.f.p.f.p.y.y.p.y.y.s.y.J y q 6.^.%XE.E.+X+X+XR.+XR.+X+XR.@XW.@XW.@X@X+X+X~.+X+X+XR.@X$XR.$X%X8Xt.r.8XW.W.W.W.+XR.+XR.+XE.+X+XR.+XR.R.E.E.~.~.R.h.j.N.z.v , . + # + . @ @ + + O X + + X X X @ X + @ @ + # # + X X X + O O O + ",
"o.+.X.+.o.,.@.+.@.X.X.X.o.o.o.o.+.o.+.o.o.+.+.+.1.1.<.#.O.O.$.+.+.+.+.1.+.o.X.o.o.h h ......o.o.@.h h @.q.g.g.g.t.r.j.h.+XR.R.E.E.R.R.E.E.E.E.R.R.R.R.R.R.R.R.R.E.E.h.N.R.+XE.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.R.R.R.R.+X+X$X+X+XR.R.!.~.^.v.2 t p d v R G V V S S f S z f l f l f f s f f f s f f m f f f m S Y F G V d 7 7 < 4 4 < < < f R _ ^ S f f D v j v F W Y G Y f 4 < 8 7 7 4 , t P c.~ G S S D W W R W 9.^ ^ ~ ^ s 5 < 4 7 5 < d E / ~ Q G I G Q ! U ! / 9.Q c.^ f < < w 7 4 < w l 9.z.Q J I ! ! W ! 9.z.u./ M./ m e 4 4 7 2 2 < x ` M.u.I J I u.b.u.u.c.x.p.p.c.F s 5 4 < 4 5 4 Z ~ x.! U U U ! y.s.v.i.i.v.v.u.J r < 5 4 5 < 5 f ^ x.v.u.U 6.i.b.z.i.b.v.x.i.p.L s t 4 7 < < t g I p./ K B U 8.i.v.v.i.p.f.p.p.Q f < 4 5 5 5 5 r M 8.y.6.U 6.p.i.s.0.s.s.i.y.i.! M w < < < 5 4 r Z / p.f./ p.d.s.i.0.0.y.s.p.p.9.j < , < w p g s H f.i.f.! 6.f.y.w.y.f.i.i.z.z.W g < < 5 i d i 4 u W i.v.p.d.n.i.6.y.0.y.y.y.y.y.0.0.0.p.f.y.y.f.8.8.f.6.0.i.y.i.i.H t y n.*XW.+XE.E.+XE.+X+XR.R.W.R.R.R.@XR.@X+X!.$X+XR.+X+XR.W.$XR.+X8Xj.t.r.E.#X#XW.W.R.+X@XW.+XE.W.R.+XR.R.W.W.~.R.@XN.j.h.n.z.d # . . @ # + ; + + X o O @ X . # + # @ + + # X + + + # + O + O + O ",
"X.X.+.X.+.+.@.o.X.X.X.X.o.o.o.o...+.+.1.+.1.+.1.+.1.1.1.1.O.O.+.+.X.+.o.+.o.+.o.o.o...o.....o.o.o.,.k @.7.k.j.k.t.r.j.E.R.R.+XE.E.R.R.R.R.R.R.+XR.R.R.R.R.R.R.R.E.h.h.E.R.R.R.R.R.~.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.+X+X%X+X+XR.R.R.~.%X}.Q 2 < p f _ z.R H J I I J H I G G J J J J I ! 9./ 9.9.9.u.p.9.9.p.u.i.u.c.M.^ f 5 < < 4 < 2 i D c.n.u.K H J 8.z.x.i.8.~ p.c.c.G p 5 4 7 7 8 < 5 W n.b.Q H M ! b.b.v.z.z.y.p.x.u.u 5 < < 5 5 < e E z.9.I U I 6.i.v.i.i.i.0.9.c.~ z a < 4 4 < < 5 z u.b.Q J U i.v.v.i.i.i.p.8.p.p.G p q < < < < w f ~ c./ U M K 6.0.i.i.i.p.f.u.p.I s < < < a i < g I p.u.U 6.U U s.s.i.6.y.y.8.u.! f < < 5 4 < 4 f I 8.i.6.6.6.0.v.y.y.s.y.y.f.y.! M e < < < a p u M p.p.6.6.6.y.s.y.y.f.f.f.8.p.i.S t < 8 < 7 s r f 6.v.s.y.7.0.s.s.s.0.y.f.y.i.v.~ p < < 5 d p e f U p.f.U U 8.0.y.0.0.y.y.y.i.s.W w 2 < a d d f j Q z.p.y.i.s.s.y.p.s.s.y.i.n.z.V < 2 5 d d g w w M ! i.p.v.v.s.s.i.s.i.s.s.i.i.0.i.i.p.i.s.i.i.p.s.y.y.p.p.d.v.n.x.f t 8.>X$X$XR.R.R.+X+X+X+X+X+XR.+X+X+X+X~.+X+XR.+XE.#X+XR.#X#X+XW.W.E.r.t.h.#X#XW.+X+XR.+X+XR.+XR.+XR.R.+XR.R.@XR.@XE.h.j.h.B.G , . . @ + + : + @ + + @ + # @ @ @ + # @ @ @ # + @ @ + O + O + O + ",
"X.+.X.+.+.@.+.o.X.X.X.+.+.o.+.@.+.O.1.1.1.1.1.1.1.1.1.+.O.1.1.1.1.1.O.+.+.+.o.o.o.o.o.h o.o.o.o.o.h o.<.7.g.j.a.r.j.E.+X+X+XR.R.R.R.R.+XR.E.R.E.R.R.R.R.R.W.R.R.E.h.E.E.R.R.R.R.R.R.R.E.R.R.R.R.R.R.R.R.R.R.~.!.+X!.!.+X!.E.V.+XR.!.>XQ.v > w f v Q 9.Q Q U ! I U U J I I U U 8.Q 8.8.u.8.8.8.8.8.y.8.y.i.i.p.8.p.x.` l 4 4 < < < < a v 9.v.i.8.U q.8.8.y.p.p.6.y.u.8.G s < < < 8 8 < r Q x.z.8.6.! u.i.0.0.0.6.U U p.! f y < < 8 5 5 f 9.z.u.9.0.8.0.y.i.y.0.0.8.8.9.8.G x w < < 4 4 e z 9.z.9.0.i.v.b.i.0.8.y.y.y.! p.! f i < < 7 a a f I p.u.8.i.0.0.0.i.s.0.y.U / y.U j p < < < w r s I x.i.p.p.y.0.p.i.0.0.y.f.6.u.i.J r < < 4 i r f S ! p.0.0.6.7.6.y.f.6.y.w.f.8.8.H s 2 2 4 d f r u U d.y.f.y.s.s.p.f.f.f.s.p.y.v.~ p 2 > 5 d f p p M 8.b.b.i.i.s.i.s.0.y.s.i.v.b.u.f 2 , p l f e g M u.p.p.p.s.n.v.v.v.i.i.i.i.i.W e , 4 a f a p g H ~ p.i.i.i.s.i.s.p.p.p.p.x.9.V < , 4 l x a p w r f M M M H I U Q 8.8.0.0.9.0.0.0.9.p.9.9.i./ f.u.! 8.! U P H G I f < B Q.%X!.R.R.R.+XV.+X+XE.+XR.+XR.R.~.+X+X$X+X$X+X+XW.+X+X+XW.E.W.#Xh.t.r.E.#XW.@XR.R.R.R.+X+X+XR.+X!.+XR.R.@XR.+X+XE.r.h.h.i.f > . + @ @ @ o + @ + @ @ + @ + @ # + + @ + @ + @ @ O O O + O + O ",
"+.X.X.@.X.+.X.o...X.+.X.+...@.O.O.1.O.1.1.1.1.1.1.<.+.1.+.1.+.1.1.1.O.O.+.X.o.o.o.o...h o.o.X.,.o.h k 7.k.g.g.7.e.j.N.R.+XR.R.E.E.R.R.E.E.E.R.R.R.R.R.R.$XR.W.R.E.j.h.+XW.R.R.R.R.R.R.R.R.R.R.R.R.R.R.!.E.!.R.R.!.+X!.+XR.R.!.R.R.T.}.B.d > < x R 9.8.8.y.8.f.p.6.8.6.y.8.y.0.0.y.8.8.8.6.8.8.6.8.8.0.y.y.0.8.i.p.u.I f e i 1 < 2 7 x E c.i.i.i.y.s.0.6.6.f.f.6.! U I P f s 8 , , < 4 f ~ b.v.i.x.v.p.p.y.8.0.6.f.u.y.! M f a < < < t f Q z.v.i.y.y.i.0.0.i.y.6.8.8.9.^ R x 4 > < 7 a p z 8.v.b.v.s.i.s.i.y.f.y.y.8.6.u.! S d , 2 w a a f I u.p.i.s.i.0.0.0.0.s.f.y.y.p.p.I f < > 4 d p f G u.c.p.x.p.p.y.y.s.y.y.y.y.p.i.W g < , 7 d d p f R z.z.i.0.y.0.s.s.0.f.s.y.f.u.W l 2 > w v f r u M p.p.y.i.d.n.s.v.s.i.s.s.8.! ! x 2 > a C z f f f M I 8.9.i.i.z.i.0.u.u.8.I Q ^ x < 2 a p d s r g m P M M J Q Q Q Q ! ! G M I F i < w c a a r p y f f f j j H M H M G M f u V d < 2 a c d d d a a w e e t r r g r r g g s g f f f g s f f f u f r u r t e e 5 r s m 5 t p.1X%X!.R.R.+X+XE.E.R.R.R.R.R.+X+XR.+X+X+X$X+XW.R.W.W.+XR.#X8X#X8Xr.t.h.W.@XR.R.R.!.R.+XR.R.!.+X+XR.R.~.@X@XW.#XE.j.j.h.N.8., # . @ O X + @ + # @ @ # + # + + @ @ : + @ @ @ . + + + + X O X ",
"o.+.@.+.+.+.o.o...X.+.+.+.+.O.O.+.@.1.O.$.+.O.1.1.+.+.1.1.1.1.+.+.+.+.o.+.X.o.o.o.h o.o.o.o.o.o.,.h h q.s.g.e.e.j.h.E.R.R.R.E.E.E.R.+XE.R.R.E.R.R.R.R.R.R.R.@X#Xh.j.E.R.R.R.R.R.!.R.!.E.R.R.R.R.R.R.R.E.R.E.R.R.R.R.E.!.R.!.W.R.R.E.^.n.a > < f Q x.i.p.! 6.6.8.8.0.8.0.0.0.0.0.8.8.6.6.8.8.6.0.0.0.0.0.6.8.0.p.i.u.H s i 7 , > > 4 x ^ H.c.i.0.i.i.i.y.y.p./ ! y.p.U S Z d 8 > > < a f Q c.x.p.i.n.v.p.s.y.y.0.6.8.p.Q H D p 2 , e d f G 0.i.s.n.n.b.s.s.s.s.0.0.0.9.Q G z a > 2 w s p f R 9.0.v.z.i.s.v.n.s.y.i.p.p.p.I G z < > a f p f m I ! u.x.z.z.b.v.H.i.y.u.u.u.I G x 4 > w l d r s S W / ! 8.u.p.p.p.8.! U U I L G f < < c Z d p f z H H K 8.0.0.6.8.8.8.8.P M M G x , 2 a f d e e u M M M H K Q U I Q L B m f m D l < , a l c d r t t t y y y f j j j u u g r p f f < < a d d s e w t t 5 5 t t y r r r r 5 < e f p < 7 a d x a p q w t t t t t t 4 t 5 t t 5 p f 4 , < a c a d d p e 4 e e e t e t t t t t w t < 5 t t 4 4 t 5 e 5 5 5 4 e 5 t 5 r s 4 5 V {.>X!.R.@X+X+X+X+XR.R.R.R.R.~.R.+X!.R.+XR.+X+XE.+XR.W.W.W.W.#X#Xh.t.r.E.@XE.R.+XR.+XR.R.R.+XR.R.~.R.R.W.+XE.#X#XE.j.r.N.b.l > . @ O + + @ # # + # @ # @ + + + + @ . . + + + + X o X + + # ",
"1.@.o.o.X.+.X.....+.O.@.O.O.4.@.+.#.#.#.#.#.#.4.&.O.O.1.#.4.O.O.O.@...+...+.X.......o.o.o...o.k h h k t.g.k.s.e.g.N.E.R.E.E.E.R.E.E.E.+XE.+XE.R.R.R.E.R.R.E.#XR.h.h.E.E.E.R.R.+XR.R.R.!.E.+XR.R.R.R.!.E.E.E.E.E.R.R.R.R.E.E.+XR.E.~.^.x.5 > q v T R R Q U ! u.y.y.y.p.0.0.0.0.i.i.i.z.0.u.0.z.i.i.i.i.i.i.b.z.u.c.~ H d d d , > > a c v R 9.9.9.u.i.i.8.8.p.! I U / I M f c 4 # > a s f f H R Q ^ Q u.9.9.8.8.Q K K G M v D d < < d d p f v v H ! 6.! 8.Q Q U U H H J M z D D < > a z d p f v j H I I J U Q Q H K H K M f f z 4 , w l a a r r f f M M S G R D S j f j f g z D a , w x x a w r f g r f f f f j f u u r u r m z 4 < i a a a i i t t t r g r g d p p y t t t s C i , e d f a s p t t t w w q d a w w w t 5 e s d e < 7 d l d p r r t 5 5 t t t 5 5 t 5 5 5 t p l e < d x p a r r e 5 t 5 i 4 t w 5 4 w e 4 w p a 4 < i l f r < t t 5 t t 5 < t e 4 4 4 5 5 5 i p , > 4 a d a i w 4 w 5 t 5 5 t e e t 5 e 4 4 w < t 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 m s , 5 c.4X^.~.~.%XR.W.@XR.E.W.W.R.R.R.R.+X+X+X$X+X+XE.+XR.+X+XW.E.R.#XE.t.t.8X8X#X#X#XE.R.R.+X+X+XR.+XR.R.R.R.W.E.W.#X#Xj.j.j.8Xt.e # # . . @ # ; > @ > + # @ + + + + + : @ @ + # + + @ + + + O ",
"1.+.+.+.X.@.+.+.+.+.O.#.1.#.#.O.O.1.1.1.#.#.4.#.4.1.O.1.4.#.O.@.+.+.+...+...+.X.....o...o.o.o.k o.h o.e.g.e.7.w.g.E.!.R.E.E.E.R.R.E.+XE.+XE.+XE.E.R.R.E.E.R.R.E.E.h.E.+XE.+XR.R.R.R.R.R.+XE.R.R.R.R.R.E.W.E.R.W.E./.R.R.R.R.E.E.T.E.^.p.< , c v d q t t r u u f f M M j H j H D v G K R R G R R D K K G K v j f f f f d d c < > 7 a a w q p f f j f f j f M u y g f f f f c 6 # , a d r q w w q w e a g g g r r t y g g x T x < < d x a a r t t e g r r t y y r t r r p f A x 7 > a x d w w w t q w t t w y w q t t t t p f x w , a x p a w w t < t t w w q q t w t t r p f z a < a x x p a w < 5 w e t < t 5 5 e t t 5 e s V p < i d d a i i i i t 5 w < w w < < q i w 5 s Z i < 4 d l s 4 e e w w w w a a a q < a w w t p i e 2 t d d w w t 5 5 < < 5 4 t 4 w e 5 4 4 5 p d e < w g g w q 5 5 5 5 5 5 5 4 4 4 7 7 i a i r a q w w p s t t q t t t r t 5 5 4 s s 5 5 5 5 Z m 4 5 i f f s p w t t 4 t 5 5 t 5 t 5 t 5 t 5 5 t w t 5 t t 4 t t 5 t r e e m r m P V < > M {.1X~.W.~.W.W.W.W.~.R.!.R.~.$X!.+X+X+XR.+X+X#XR.W.W.R.#XW.R.#XR.j.t.t.8X#X8XW.#XW.R.E.+X+X+XR.R.R.+X@XW.W.8X#X8X8Xj.j.j.d.B < # , 1 # . 6 c | c 1 # # + @ @ + @ ; ; * @ . + + @ @ O + + ",
"1.+.+.+.O.4.4.#.$.#.4.4.1.1.O.#.#.2.2.2.1.4.#.4.1.O.O.O.#.O.O.+.X.+.X.+.+.X.....X.X.X.X.X.o.@.@.o.h q.a.g.r.7.r.h.E.R.E.+XE.E.+X+XR.R.+X+X+XR.+XR.R.E.+XE.E.+XE.h.j.W.E.R.R.R.R.R.R.R.R.R.+XR.R.R.R.R.R./.R.R.E.W.W.R.R.+XE.E.E.T.T.^.! > > x x w < < < < < < < 5 < < < w w 5 t q w w w w w q < w w < t q < < 5 e e s i p a < > 7 a a w w 5 w < < 5 q < t t 5 t 5 t e f x x 6 # > c c a w w w e w w i < w 4 < t 5 w t w f v x < q d x a a a 4 4 4 4 7 5 < 5 w 4 < q w p f v z < 2 7 x a e w 5 w w w w w w 4 w a e w 4 t p l Z e < w f d w t < t < < w w 4 < a a w t t t e s f 4 , < d a 4 w 5 < t w t 5 t 4 4 4 w 5 5 5 t s f i < 5 p w 5 < 5 5 5 5 < 4 w 7 w w 7 w w < t s f 4 2 5 r r 4 < t 5 w w w w < a a a 7 7 < 7 g s f s < < g g t t t t e p g r 5 < 7 i 4 4 4 i d z v l p g f f f f j f m S V f e 5 w 4 4 4 4 a V ^ 9.R M u j H H K U J J U Q G r 5 < 4 7 5 8 5 m ^ c./ M M P U G H S M H H L P P J I H B G L H K H K J P I U I I ! I I / / Q / / / P p.c.S < < x.1X>X~.~.~.R.~.$XR.R.R.~.+X~.+X+X+X+XR.#XE.E.#XR.W.R.R.R.@X#X#X8Xr.t.h.E.#X#XE.R.+X#X+X+XE.+XE.R.R.+XR.#X8X#XE.8X8Xj.j.h.s.m < 7 7 > . 9 F.F._ 9 @ # + + @ @ @ ; 2 * @ # + # @ @ + @ @ ",
"1.1.O.$.#.4.#.4.2.4.4.#.4.1.#.O.$.1.2.$.#.#.4.#.O.+.O.O.#.O.+.X.X.X.+.X.X.+.X.X...X.X.X.X.@.o.o.h o.7.g.a.w.t.a.h.E.R.R.E.E.E.E.E.R.E.E.E.E.R.E.E.E.R.E.+XE.E.h.h.E.+X+XR.R.R.R.R.R.R.R.R.E.R.R.R.R.R.+XR.E.R.E.E.W.R.R.E.E.E.E.!.!.!.G # < c d a < w w 4 4 5 5 5 4 < 4 w < < 8 4 4 w < w 4 w < w < w 5 4 4 t 4 4 e s d s 7 < < w a a 4 4 e 4 4 4 7 < < 5 < 5 t t w t s l a < > 1 a e < < < w w w 7 a 7 i 4 4 w w q w t g z f q < r q q < < < < 5 7 7 7 7 a 7 < < < w r d x l < > 4 a a w < < < < 4 4 w 4 4 7 w a e < < i f f 5 2 < w w w < t w e 4 4 e 7 4 4 a w w t g s f V s t t s s s g r p s r 5 < 5 i i 5 4 5 s f V m V d 5 r f f r t r f V f s 7 < 7 7 7 7 < a v L L f f f f z S m m j H v D v d 7 < 7 a w 4 w z L ^ W I v v R U J I U J I ^ / m 5 < i 4 4 4 e f ^ c.z.^ R U 8.8.8.i.z.~ p.c./ L f t 5 5 7 4 4 i F b.b.z.9.I p.v.s.i.v.s.i.i.v./ M r 5 5 4 5 5 5 s P c.x./ Q ! 8.8.U Q 8.p.p.d.v.v.s.x.s.p.i.p.s.i.i.i.v.i.i.i.p.x.p.p.p.f.p.p.p.f.p./ p.x.u.f < M ^.1X/.%X$XE.R.~.W.R.R.R.R.R.R.R.R.R.+XE.#X+X+X+XR.R.+X+X+X@X#X8Xr.t.t.h.#XE.#XR.R.+XE.+XR.+X+X+XR.R.R.E.#X#X8X#X8Xj.j.h.h.U t > > # # 2 9 9 7 > # ; @ + # @ @ @ @ @ @ # + + + + + @ + ",
"1.1.$.4.2.#.4.#.3.3.1.1.1.2.$.O.3.$.3.3.2.#.2.#.O.+.+.O.1.O.+.+...+.X.+...+.....X.+.X.X.o.+.o.o.,.<.7.g.e.7.w.g.h.+XE.+XE.E.E.R.E.R.R.R.R.E.R.R.R.E.E.R.R.E.R.E.h.h.@XR.E.R.R.R.R.R.R.R.R.R.+XE.R.!.R.R.~.R.R.R.R.+XE.E.+XV.E.E.!.^.Q.f > 7 c a w < 5 5 5 4 4 5 < 4 4 4 < < 5 < < 5 5 5 < < 5 < 5 < 5 5 < 5 < < < 5 t r p w < 2 < e 5 < 4 5 8 4 < 7 7 7 a < w d f f f f g g e < 4 e e r g g j a w < < 7 4 < < < f D v j j v v y u f u s f V V l 7 5 8 5 7 4 5 < s S L M m S H f u f u f f f V S f p < 4 4 4 4 8 4 V P P L H P M f S H H H J W ^ L Z 4 8 4 4 w 4 < r G 9.9.I H M M I ! I I I I Q u.W f t < a 7 4 4 i V ~ ` I L H H I u.9.U ! ! u.c.c.W f < 4 i 4 5 < s ^ c./ I G K I ! 8.y.u.p.p.z.b./ f r < 4 7 7 < i f ^ i.u.u.8.6.8.y.i.p.i.p.p.p.c.W s 5 w 4 5 4 w s D 9.z.0.Q 6.0.y.0.y.0.8.p./ u./ S t 5 < < w w p f J 0.i.0.0.0.i.i.0.w.0.s.i.i.i.Q m 5 8 5 5 4 r r s J z.v.i.s.p.y.y.i.s.i.s.v.s.i.i.s.p.y.y.i.y.i.i.0.i.p.p.i.y.i.y.p.y.8.y.0.0.p.f.f./ p.i.! u q v.>X$XW.#X#XW.8XW.R.~.!.R.R.R.R.R.+XR.E.E.+XE.R.R.+XE.R.R.+X+X$XE.r.t.j.+X+XR.#XE.+X#XR.+XR.+XE.+X+X+X#XE.8X#X#XE.E.5.j.h.v.f > # # @ @ # # # # + @ @ + + @ @ @ + + # @ @ + + + + & : ",
"1.1.1.2.2.2.#.2.3.1.O.$.1.1.1.$.$.2.$.$.#.#.5.5.$.+.+.O.1.O.+.X.....+.X.+.......o.+.+.+.+.o.o.<.o.<.k.j.e.e.r.d.h.N.+XE.E.R.E.E.R.R.R.E.E.R.E.R.R.+XR.E.R.R.+Xh.h.E.@XR.R.R.@XE.E.R.R.R.R.R.R.R.R.R.R.~.R.R.R.R.R.E.+XE.+X+XR.E.~.}.n.s > a x l z z m s f s s d d f f s d d f f s s e s p p r g p s s s g s g g u f S S H F f f G P H L L Z 4 < 7 7 < 7 4 w a v c.c.R K K R ^ W ^ ^ ! / 9.9.9.v t < < a i < < f 8.b.z.R N R 6.0.0.0.! U u.c.` ^ d 5 5 8 7 7 < 5 f / v.! M U ! W ! p.p.8.u.u.u.u.W s < 4 7 7 4 < 4 F ` M.u.P I U 8.p.p.p.u.u.u.p.u.F s 5 4 4 7 w t p R z.u.H M K I p.p.p.p.p.p.u.x.u.S t < < < 4 4 4 f ^ c./ U P J U p.s.i.s.y.0.i.z.^ f 5 4 i 7 5 5 s H / p.8.Q Q ! 8.y.p.y.y.y.y.i./ H p w 4 < < w i s H p./ 6.0.p.0.8.y.f.f.f.U U p.p.M t < < 5 e e t u J 0.z.0.y.0.f.7.y.0.y.f./ u.b.W f 5 < < a p r r j 0.b.v.0.q.0.i.s.s.z.y.0.i.b.c.D e < 5 7 s s e t f ! x.x.n.s.v.s.s.s.s.v.v.i.s.i.s.i.s.i.v.s.z.0.s.i.i.i.p.p.i.i.s.i.s.y.y.0.p.p.p.p.p.p.x.I t U ^.&XE.@X#XW.E.W.R.W.+X~.R.R.R.+XR.+X#XE.#XE.E.R.R.+XR.R.+XR.R.R.j.t.r.E.#X+XE.+X+XE.+X+X+XE.+XE.+X#X#XE.E.W.8X#X#Xj.e.j.N.6.2 # + # @ # @ * + + @ @ @ @ + + @ @ # + @ @ @ # @ + @ @ ",
"#.1.1.1.1.#.4.4.2.1.$.1.$.1.1.1.$.$.$.2.2.2.2.$.$.O.O.1.4.4.@.X.+.+.+.+.........+.@.O.+.+.o.o.h ,.<.k.g.g.a.w.g.+XE.+XE.R.E.R.R.+XE.R.R.R.E.E.+X@XR.E.E.+X@XE.h.h.E.+XR.R.+XE.R.R.R.E.+X!.E.R.R.R.R.R.E.R.R.R.R.E.+XR.+XR.R.R.E.~.{.z.< > 7 l T ^ ! G M P P M M M M H P Q W ! W U W Q Q Q ^ ! ! ^ / ! ! u.! 6.8.8.y.p.i.0.y.u.i.p.u.u.c.c.^ d 4 4 2 < , 2 < c 9.z.z.8.8.8.8.9.i.p.p.u.6.8.y.8.H g < < 4 < < w v 9.b.0.K U 6.0.i.y.s.p.! ! p.p.W m s 5 8 8 5 5 5 f / s.y.6.U f.f.f.f.y.f.f.! 8.u.! f 5 5 4 < < < p V / / p.U U f.y.y.p.y.f.U u.p.! D f i 6 < < 7 w s S Q u./ U p.p.p.y.8.f.! ! U 8.p.J s t < < 4 i i f L u.p.u.p.f.f.6.y.y.6.f.0.8.0.u.S 4 4 < < e d s f I c.p.i.s.p.y.i.f.y.w.y.p.p.p.u.j e < < w a f w f 6.x.i.y.6.y.p.y.w.w.y.s.p.p.x.E p , < e d s r r M Q i.v.y.0.0.i.s.s.v.p.p.u.u.z.D q < q a g g q f v K q.8.8.8.0.0.i.0.0.0.8.U ! L w 2 8 i i d d i i f S P P I U U Q U 8.0.0.0.u.p.8.p.i.i.9.0.9.9.0.9.p.u.u.u.8.6.U U U ! U U K H P J M m H S t y N.1XW.E.W.W.W.W.W.W.+X~.R.R.~.+X+X+XE.R.+X#XE.#X+XE.R.R.R.R.+X@XR.h.t.j.R.#X+XR.+X+X+X+X+X+XE.+X+X+X8XE.#XE.#X#X#XE.j.r.N.n.v > # # @ : @ @ + # @ + o + + # @ + . # @ # + @ @ + + + ",
"1.$.1.1.1.1.#.4.1.1.1.$.1.3.3.3.2.2.$.$.#.2.2.5.#.O.O.1.O.@.@.X...+.+...+.....%.@.+.+.+.o.o.h o.<.7.g.k.e.7.w.h.h.+XE.+XE.+XE.E.E.R.E.E.+XE.E.+XR.R.E.E.R.+XE.h.h.E.R.R.E.E.R.E.R.+XR.E.+XE.R.E.E.R.R.E.R.E.R.E.E.E.R.R.~.E.E.R.^.>X9.2 > a z W ! U I U U U I I W W W ! ! / / U ! / 8.! 6.6.! 6.6.8.u.6.u.f.8.8.f.8.8.6.0.0.0.6.f.6.8.p.u.Y f w 4 w 7 7 < < x 9.z.i.0.0.0.8.0.0.y.y.f.u.6.y.0.J f p < < < < t z ^ z.z.8.8.0.0.q.0.0.6.6.U / u.I M r 5 < , 5 5 w f ! i.p.y.y.f.f.y.f.8.8.6.f.U u.~ m e 5 < < 4 a s H Q p.y.p.f.p.y.6.6.f.6.6.8.p.9.W D d < < < 4 i p f ~ c.p.i.p.y.p.p.y.p.y.y.y.i.i.! j r < 2 7 a 4 r S Q p.p.p.v.s.s.y.s.s.y.s.y.u.u.H e < > < a d s s M Q f.y.i.v.s.i.d.p.i.0.8.U p.u.D < 2 < a d f r y j P I I U u.y.! p.0.0.f.U W I P i 2 < a d s e r r s j M H K U U 8.U Q I P M F F s , , 7 d f q r a y y f f j u j j j j f j f u f f 5 , i a d d a e e i r e t r t y y u y u u u u g u g u u f u k f f f u f u u u f u g y u u y u r r r e e e r t < U ,X&X~.~.~.W.W.W.W.R.~.~.~.+XR.$XR.#X+XE.E.E.E.E.+XR.R.R.R.R.$XR.h.r.r.h.+XR.+XR.R.+X+XE.E.+X+X+X+XE.#X#XW.E.E.E.#XE.j.e.N.9.a > # @ # # * # . + + @ + # # # > 1 * # + + # : + + + ",
"2.2.#.2.1.3.3.2.4.1.#.1.2.4.3.2.2.$.2.$.2.5.$.%.#.O.O.<.+.+.+.o...X.X.....+...X.X.+.+.X.+.o...o.q.k.e.e.7.t.r.h.+X+XE.+XE.E.E.E.E.E.+XE.E.E.E.E.E.E.E.E.W.W.E.h.E.E.+XE.E.E.R.R.R.R.R.R.E.E.R.R.R.R.E.R.E.E.R.E.V.+X+XE.+XE.h.+X^.}.^ > > a E ~ 8.8.Q Q U ! ! 9.8.! ! U Q U U 8.U 6.6.U Q 6.U 6.U U 6.6.U 6.8.6.6.0.6.0.f.p.y.f.U f.y.p.8.G l e 4 < < 6 < 4 z M.b.z.z.0.x.s.s.f.y.y.0.0.0.8.U H z s < < < 4 a v Q z.b.z.v.z.0.0.i.p.y.y.8./ ! I S f p 2 > < w a f L ^ f.p.p.p.d.p.p.y.y.y.p.6.Q I S p i , < w a s f H I 6.f.0.s.y.p.y.y.f.8.8.6.Q J H p < < < a d w r m H Q ! U 6.8.y.8.8.8.U U I J H v w < < a s 7 e f m M M J U 6.U U 6.K 6.K J K H H m < - 4 a c a g p y f v v M H H H H M M M m M S x < > < c d d p p g g y g f j u u f u u u u e u f e > < a c d p p r e t r g y g y u g g r r r e s w , < d l a a a g a g p r r r r r r r r r r t s s i < 7 a a i i 7 d i 5 e e 5 e e t r r w e e e 4 e 4 e e t w w w e w e e t w t r e r r r w r p w e e s e s d s 5 y n.1X%XR.R.R.R.+XR.~.R.+XR.W.W.R.+XR.R.R.R.E.#XR.+X+XR.R.R.W.+XE.E.j.t.j.8X#XE.#XE.+X+X+X+XE.+X+XE.E.E.#XE.+XE.+X#X#Xj.j.j.n.H 2 # # > c c 1 @ @ # * ; c x c A A 7 # # . + . + O + ",
"2.$.#.2.1.2.2.5.1.1.1.#.4.3.3.2.2.%.2.2.2.$.5.2.1.O.#.1.+.+...+.+.+.+.....+.+.+.+.X.+.+.o.o.h ,.<.g.k.7.7.t.h.E.+XE.E.E.E.+X+XE.R.E.E.E.E.E.E.+XE.E.#XE.E.#Xh.j.E.E.R.+XE.E.E.+XR.R.R.R.+XE.R.R.R.R.R.E.W.E.R.R.E.+XE.+XE.E.E.E.^.{.C # > a Y ^ I Q U Q ! ! 9.9.u.8.u.9.p.9.9.9.u.f.0.8.0.8.8.8.y.y.u.8.u.p.i.y.i.y.i.0.i.i.p.p.u./ / ! H V z f a , 2 2 4 4 f v R K R 8.p.p.p.U U U U U K H S j f f < 2 < a a d v v v v K K U U q.J J J P m M M S z d < > 4 a a p d f m M M H P U I G B H M M f S z f p 2 , w d p e r g u f j j M j j M j j u u u f f d < > 4 d f p p q t y u u f f j u j u u y r y f f w 2 , a d s e e e t y y u u y y y y y y t t r f d 5 > 4 c a a a r w r y y y r y r r r t t t t s l a 2 < c a a a r w p w w t r t t t t e r s 5 i Z s 8 8 i d d a p s p p a t r r r w r w e r e p f c < < 7 d w w a a a a a p p i t e w w r p r r s s a 8 4 a s i i d s i 5 m s s e e e e w p s e e e 4 m i i p a a e a a e 4 4 e e i r r y w w e w w a a 7 i 7 m V e t U ,X:X%XR.W.~.$XR.R.~.+X~.W.E.W.R.R.R.E.R.#XE.R.R.+X+XR.R.R.#XE.R.8Xt.r.h.E.E.R.#XE.+X+XE.E.+X#XV.#X#XE.W.+X+X+X+X+XE.j.j.h.s.M p < a T c 2 q c 9 @ 2 x | x T x 1 # # + + + + O + ",
"$.2.2.2.2.2.2.2.4.1.2.2.2.5.3.3.2.2.2.2.$.5.$.2.#.1.1.1.+.......+.X.X.......+.X.+.o.+.@.o...o.,.k.e.e.e.7.f.h.E.E.+XE.+X+XE.E.E.E.R.+XE.E.E.E.E.+XE.#XE.E.E.j.8XR.E.+XR.R.E.R.+X+XR.R.R.R.R.E.R.W.R.R.R.W.E.R.R.R.E.R.E.E.E.h.E.{.Q.d # , a z f u r g u u f j f f M v H H J v R L J H J Q K J I I I W U I I H H H H S H M M M m m f j f f s c l c < # , 7 c i e g u u u u u m u u u u u g g f f V Z e > 6 d d a a p t r g y y g y g u r r r s s x z l < > a c d 4 4 5 e e e r e r r r r r r r g s f l a , , i c a i w t e r r t t t y t t t t t r f l x a > 7 a d d d a r t t r r r t y t t t w e r s V d , < a c i i s p e e r p y y y t t t r s e s m Z 5 , 5 a d a f f p g s y p r w w r t e t e r f l a , < a a a a w i a p a i p a e e w e e s i d d d 5 , 7 a i i i i a i a w w p t e e e i i e a d d 7 8 7 p p i p a 7 7 7 w i a i i p r e e e e s i i < , i s e s 7 7 4 5 4 7 4 e e s e e 4 i 7 7 7 7 4 4 i w w < 4 < 4 7 i i i 4 4 4 5 w w e e e 4 7 7 5 5 5 4 s e 2 g B.>X-X!.~.!.~.+X$XR.W.~.W.W.W.W.R.W.R.E.E.+XR.R.+X+XR.E.E.#XR.R.8Xj.t.r.h.E.+XE.E.+X+X+X+X+X+X+X+XE.R.R.E.#X+X+X+X+Xh.j.t.g.i.K y w x D v | x 9 2 > q x c v c 2 # # + @ O + o : ",
"$.2.2.2.2.2.5.2.4.1.2.2.2.2.2.$.$.2.2.2.2.2.2.$.1.O.1.1.o.+...+...X.&...+.....X.+.+.@.+.o.o.o.q.q.k.r.r.t.t.h.E.E.E.E.E.E.+XE.+XE.+XE.E.+XE.E.+XE.E.E.E.E.E.j.E.E.E.R.R.R.R.R.R.!.R.R.R.R.E.R.R.R.+XR.W.E.W.R.W.R.R.E.R.E.R.N.E.!.n.a # < x d w < t t t 5 r w w t t w w t t a a e t r y y t r r r t r e r e r r t t w w t t t t t t r r r e s l x , > 1 d d i d a t g r r t t r t r u e r r p f f x i , < a a a a w w t a w w w t e e e e 5 e s f v d , > q c d i e i i 4 7 5 e 5 e e e e e r e p c l d < < a c a a i i e p w r p p r e r r r r p d x x a > a c a w p e r s e r r e r t p r e i i i p f d < < a a i 4 i i p p p p r w p p t r r e i i s Z 5 < 5 a a e a a t w t a w r r r p e w r t r s p l < 2 w a a a i a a a a w 4 i e e e e i s s s 7 i i 8 5 d i e e w i 7 w a a w i e w r e w w e p d i 5 < i d e q 7 w 7 a 7 7 i 7 i w w 4 4 t t e s f < > 5 w e e 5 5 4 7 7 5 4 8 e n 5 4 4 4 5 5 5 5 5 w 4 < 5 w 4 < < 4 w 7 7 4 4 i 7 w t w 4 5 5 < 5 5 5 4 e f z 5 < Q >X&X!.~.~.+X~.R.+X~.R.@XW.R.W.W.E.W.+XR.R.+XR.+X@XR.E.E.#XR.W.#XE.r.t.h.+X#XE.E.E.+XE.E.+X+X+XE.#X+X+XR.+XE.R.#X#XE.j.r.t.h.6.y r v T T T x 2 @ 2 c v x x c 2 # . + + o X o o ",
"2.2.2.3.2.$.2.2.5.2.2.2.2.5.2.2.$.2.2.2.3.1.1.1.1.O.O.1.@.X.X...X.X.....+...X.X.X.o.+.X.o...o.<.g.k.s.w.t.r.E.E.+XE.E.E.E.+Xh.#XE.R.E.E.E.E.E.R.#XE.R.R.E.E.j.h.+XE.R.E.R.E.R.R.E.R.R.R.E.R.R.R.R.R.R.R.E.+XW.E.E.E.E.E.E.E.E.!.>Xz.< > a x d 4 5 t w < 4 w w w a e 4 w < w 7 q < w a w w < w w 4 4 4 5 5 e t 4 w e i w e i e i t e p g s f f l c < # 8 a a d i w e r e 5 m 5 r r e e e w d a a d d 8 < 4 a a 7 7 i i a p e i e w i i e 4 i i s d z f < > a x a i 4 i i 4 e 5 5 t t e e e e e e p f Z d < , i a 7 i 7 w r t w e a a t 4 e e t w e p d l w > 4 l c 7 4 4 t 4 t 5 e e e e e e e e e e e d s < > < a i 4 5 w w w w < q w p w 5 w 5 5 5 5 7 s 5 8 , 5 5 5 5 5 < < t q t t t t w t t 5 t 5 t r f t < w w t w 4 e w 4 4 7 a i t < w 5 5 5 4 5 5 5 i 5 5 5 8 5 8 5 7 4 7 w i i w 4 5 < < 5 < t 5 w w < 5 5 t 5 5 < 4 4 7 a a 4 4 4 p p r t w t w s f w < w g f m 4 5 5 4 7 5 8 5 4 s V C f s u m u s u f u f f f z s 4 < 8 5 < 8 5 s F E W H M m m P M P P H L Q ~ f > y !.1X!.E.~.R.W.+XR.R.W.+XR.R.W.R.R.R.E.#XE.R.+X+X@XR.E.E.#XW.W.@XW.j.7.j.E.#X+XE.+X+XE.E.#X#XE.#XE.#XW.E.#XW.W.#X+XE.h.j.j.g.s.K g g w 2 x x 7 > 7 x x c c c 1 # # @ + + + o + ",
"5.5.5.3.2.2.2.3.2.5.5.2.2.$.2.$.2.2.2.2.3.1.1.1.1.+.+.<.O.+.+.o...X.X.+.....X.@.+...o.+.o.h @.<.k.s.e.7.t.j.E.E.j.E.E.E.E.E.E.+XE.R.E.E.E.E.R.R.W.W.R.R.E.E.h.E.@X@XR.E.E.R.R.E.E.R.R.E.E.R.R.E.R.R.R.R.W.8XE.W.E.E.E.E.E.h.T.!.}.Q , 2 c l s 5 5 e e 5 4 4 4 < 7 i w 7 a a w < w 7 w w w 4 w a p 4 e p e 7 4 e i i i i i i s 4 i w e e p f d d d , > 1 9 d i i p e e e e e 5 e 4 e e e i p i p Z Z 4 , 7 c d i a i i a 4 e w w 4 i 7 4 i 7 4 s s x g , 2 4 d a < 5 5 5 5 5 5 5 5 5 5 5 t 5 t < 5 s s 4 < < 5 4 < 5 < 5 < < < < < t t < t < 5 5 w t r s e < , w p q < w t 5 5 t 5 t 5 t t < 5 t t t e s s < < w d s t t t t t e e r p y y r y y r r u f m m s u f f f f u m j j j f f j j M j H M P M M K H H H H H j e < 5 w 7 8 4 4 w r f f f s s s s p s u e 5 r m m 5 5 5 7 6 4 < 5 i z G G M j f S f f V m V H H L G s < < 7 8 < < w l E ! Q J G S S G ^ Q I ! / u./ m r 8 5 4 8 5 5 5 Z ` c.^ J I / f.! / 8.8.p.z.u.9.Y r < < 8 , 8 5 s F ` c.Q M m U p.f./ f.p.p.u.0.J t < i.>X>X!.W.R.@X@X@X+XR.R.R.R.+XR.R.R.R.E.#X+XE.R.@X@XR.R.E.E.E.W.W.E.j.e.h.R.+X+X+XE.+XE.#XE.W.W.W.#X8X8X#XW.E.+X#XW.E.j.j.a.s.K q < 2 > 1 6 2 + * ; > > , > @ . . : + : o X o ",
"3.5.5.3.2.5.2.2.%.5.2.2.5.$.$.2.2.2.3.5.3.1.1.1.1.1.+.+.+.+.o.+.X.X.....X.+.X.+.X.X.X.o.o.h <.7.k.s.7.7.k.j.E.E.#XE.+XE.E.E.E.E.R.E.E.R.E.R.R.E.E.R.R.R.E.j.h.E.R.@XR.R.R.R.R.E.R.R.R.R.R.R.R.R.R.R.R.R.E.#X#XE.E.E.E.W.E.T.T.R.{.G > > a c i 7 4 i a < 4 i 7 4 4 7 7 < 4 a a 7 7 7 4 7 7 7 4 < 5 5 4 5 4 4 5 4 5 4 4 4 4 4 4 4 4 i e 5 4 d f l a < # < i i i i e i e e e e 4 e e 7 7 r 4 4 i d Z i 5 < w i 7 5 < 8 4 < 5 < 5 5 < 4 7 4 5 5 7 7 p d a t w p v s r g s g s g y r u r g u u u u y u f f f g u u f u f u f u j u j u f j j u m j M j M M J H j M J J S j M M N K M M M G H K J K U U U U 8.! U K 8.9.6.U 8.q.0.0.0.8.0.0.0.0.0.0.0.f.y.y.p.f.p.p.p.y.s.i.s.d.s.v.i.s.v.v.s.b.b.b.b.s.d.s.d.v.d.s.v.n.N.i.j t < < 4 7 4 < 4 f c.c.! M f M P / / u.p./ / p./ P 7 5 8 7 4 < < s L c.n.8.H H I U ! p.x.i.i.n.m.s.G w 4 w < , < i v u.b.n.v.0.U U 6.i.z.z.b.i.v.i.Q m 5 < , , 8 5 4 f W c.u.U j H 6.f.f.f.6.f.y.y.p.Q u 5 < < 5 5 5 i f W u./ P B U / U U / f.8.U / / M < y !.4X~.!.@X@X@X@X+X+X@XR.R.R.R.R.R.R.R.E.#XR.@XR.W.R.R.R.R.R.E.@XR.h.e.j.N.#X#X#XE.+X+X+XE.#XE.#XE.W.W.E.E.E.E.R.@XW.E.j.h.h.0.y > # # # + # + + + + . + . + o + O + o o X ",
"3.3.5.2.2.5.5.2.$.%.2.2.5.5.2.$.2.2.2.3.1.3.1.1.1.+.+.O.+.o.+.o.+...X...o.X.X.+.+.+.+.X.o.o.<.t.g.s.k.e.j.j.E.E.E.E.#Xh.+XE.E.+XE.E.R.E.R.R.R.R.R.R.+XR.E.h.h.E.@XW.R.R.R.R.R.R.E.R.R.R.R.R.E.R.R.R.R.E.E.E.W.+XE.E.E.E.E.E.T.^.{.f # > c a i 4 7 7 4 7 4 7 i 4 4 7 a 7 7 4 7 4 7 7 < 7 4 4 4 7 e e 5 < 5 5 < < 5 < 5 5 5 5 4 5 < e p w e i c d c 2 > 1 7 i 7 i 4 e e 4 e e e e e 7 7 4 4 7 i i i i s s f s r 4 4 5 5 w e e s s s p 4 5 5 5 5 5 w d D R ^ _ Q Q Q u.8.! 6.! u.u.! u.8.8.8.8.0.8.y.y.f.p.p.p.p.y.p.y.y.y.i.i.s.z.s.s.s.i.s.i.y.y.y.s.i.s.s.i.i.s.s.s.s.h.y.s.s.s.s.a.s.s.s.s.s.s.v.s.d.h.v.d.v.h.n.n.s.s.b.v.g.b.d.v.b.g.d.d.n.h.h.d.s.d.s.d.s.s.s.d.a.s.s.a.s.s.s.v.g.H.s.d.g.s.d.d.d.f.g.s.s.e.s.g.d.K r < < < 4 4 < 4 m c.v.Q f t u U u.s.p.p.s.p.x.x.W m 5 8 , < < < p H ~ x.u.U U U p.p.p.p.p.y.y.p.y.! d < < 6 < < w s H 8.0.i.0.8.8.8.0.y.0.s.p.p.p./ L s , > < 5 4 e s S ! i.8.K U f.f.f.f.7.f.6.8.y.8.J w > , < 4 7 i s V / s.p.U U 6.f.f.f.U U B U u.8.f t p.>X:X!.R.+XW.R.R.@XR.+XR.+XR.R.R.+XW.R.R.R.R.@XW.W.+XR.R.E.R.W.$XE.r.r.h.+X#XE.E.E.+XE.E.#X#X8X#XE.+XE.+X#X+XR.W.@XW.h.j.d.n.K 2 . + + + + @ o + + + + + o + + o O % X o o ",
"3.3.5.3.5.5.3.2.$.$.2.2.5.2.2.$.2.2.5.2.2.2.2.2.1.+.<.+.o.o.+.o.o.o.o.X.X.X.@.+.@.o.o.o.o.@.4.e.k.k.s.e.g.N.R.E.E.E.E.E.E.E.E.E.E.E.R.E.E.R.R.R.E.R.+XE.E.h.h.E.+XR.R.R.E.R.E.R.E.+XR.R.E.+XE.R.R.E.E.E.R.R.E.W.R.E.E.E.W.h.E.^.oXs # , d 7 < 4 5 5 8 < 8 < 5 5 < < 5 5 5 8 8 5 8 4 8 6 < 7 d C ^ ^ H v z j f S M M S P F P L s t t w w a a d a a , > , 4 4 4 4 4 i i e e 4 e i i 7 4 4 4 7 5 5 i D ~ c.u.! ! L P W ^ Q Q Q ! / 9.W f < < 7 w < < r F u.v.i.i.z.i.d.v.i.s.s.i.s.s.s.i.s.s.i.d.s.s.s.f.d.d.d.f.p.s.s.s.s.s.a.s.a.d.s.d.s.s.s.s.s.a.w.w.w.s.s.s.s.w.s.s.a.s.7.s.s.s.s.s.s.a.s.s.w.s.s.s.s.s.r.s.s.w.w.i.s.s.a.s.s.a.s.s.a.w.s.w.w.s.w.7.y.7.e.r.s.s.r.r.w.e.s.e.s.g.s.g.v.s.s.g.s.a.a.s.w.e.g.s.s.7.g.d.8.j t > , > 6 4 a f R i.v.p.U U y.y.y.y.y.y.y.0.v.u.v < > 2 1 a g r f v 8.i.i.y.i.i.s.y.i.s.y.8.y.s.i.V , > , 4 a a p f U i.s.p.y.i.s.i.f.6.y.y.6.f.p.` f > # , i l i 5 u K y.p.i.s.y.f.f.7.7.y.6.6.8.i.p.f , > < a a w a f P p.i.y.f.8.6.6.f.6.y.! U u.u.J t u N.1X~.W.@XE.+XE.+X#XE.#XE.R.#XR.+X#XR.R.R.@X@XR.+XR.R.W.R.W.R.#XR.j.r.r.E.+XR.E.E.+XE.+XR.R.E.R.W.E.#XE.#X8X#X8X#X#X8Xj.t.N.d.Z > . . + . + o o . . . + + . + . . . + ",
"3.3.3.2.3.3.2.2.$.2.5.5.5.$.2.%.2.2.%.2.2.2.2.2.1.1.+.+.o.+.o.+.+.o.o.X.+.@.+.+.o.1.+.o.o.<.7.e.s.7.w.w.j.E.+XE.E.E.+XE.E.+XE.E.R.E.E.E.E.E.R.R.E.R.+XE.h.h.E.#XR.R.R.!.R.E.R.R.R.E.E.E.R.E.R.E.R.E.R.E.E.W.W.!.E.E.E.R.E.E.T.~.n.r > 7 a < 4 i e 5 5 5 5 5 5 4 t 5 5 i s s 5 , < 8 6 < < w l ^ c.c.8.R Q 8.8.0.8.u./ p./ p./ P p < < w w a a d a , > 1 8 7 7 4 i 4 7 4 i i 4 4 7 4 7 7 7 4 8 5 s F c.x.p./ U / f.i.x.s.p.y.y.p.x.z.D w , < < , < 5 f p.s.y.s.s.s.s.s.s.s.s.s.s.s.y.s.s.s.d.p.d.f.f.f.d.f.d.s.a.s.s.a.s.s.w.a.s.w.s.w.w.w.w.w.e.w.f.w.t.e.7.g.w.w.e.e.e.7.w.g.e.e.g.e.e.e.a.s.w.7.s.e.s.s.w.w.w.w.s.e.e.y.w.e.e.e.w.w.w.e.w.r.w.e.7.w.w.r.s.r.w.w.w.w.w.e.r.e.w.e.s.k.k.k.k.e.a.w.r.e.w.7.g.g.g.e.a.d.f.M r 2 > 2 7 d a p S p.p.p.y.s.s.s.f.f.f.f.0.0.0.z.R p > > q a d r r j 8.v.s.y.0.0.0.0.0.0.y.y.y.v.c.R 5 # , a a a f p H i.n.p.y.p.s.s.p.y.y.0.0.f.s.x.A < > 7 c Z s e p M P p.v.s.y.s.y.y.s.i.y.0.8.i.x.G w < a c a a w e m I U U u.y.6.y.y.y.i.8.u.z.^ H r t s.>X~.R.W.#XE.#X+XE.#XE.#XR.E.W.R.R.+XR.W.@XW.+XW.R.R.R.+XR.R.W.W.E.j.r.j.E.#XE.+XE.+XE.R.E.+X+XE.+XE.+XE.#X#Xj.8X8X8Xj.t.a.n.U 5 # . # - * @ * & - - , , 1 1 1 1 1 1 6 6 ",
"3.3.3.5.2.2.2.2.2.2.5.5.5.5.$.2.2.2.5.5.3.2.3.3.O.1.<.+.+.+.+.o...o.o.X.o.o.+.+.+.+.o.o.,.<.7.k.7.s.w.a.j.+X+XE.E.E.E.E.E.+XR.R.R.E.R.E.E.E.R.R.E.R.R.E.h.h.E.@XR.+XR.+X+XR.R.R.R.E.R.R.R.E.!.R.R.R.E.E.E.8XE.W.+XR.+XE.W.E.8X!.n.w > , 4 e F ^ E F V F S V m V V m m I / E m 8 , 8 , , < e S ~ u.u.9.8.6.0.0.0.y.8.6.u.u./ / M e 5 < 4 < a a c a , > , 7 8 4 7 5 5 4 7 4 4 5 5 4 5 5 4 4 , < < d F ! p.i.y.y.f.U / p.p.y.y.y.8.u.~ F p < > > < 5 5 u / i.s.s.s.s.s.s.w.s.w.e.w.w.s.e.y.w.s.w.f.a.f.t.f.f.d.f.d.s.w.s.s.f.w.w.y.w.w.w.f.f.t.y.e.a.f.t.f.e.e.w.w.w.e.e.w.7.a.a.e.a.s.e.s.a.g.g.s.e.r.e.e.a.r.s.w.r.r.r.e.w.r.r.e.w.e.w.w.r.r.r.w.7.e.w.w.w.s.w.y.w.w.e.w.w.e.e.r.e.e.e.e.s.7.e.w.e.e.t.w.g.e.g.7.e.t.g.s.K r 2 # > c v a t f 8.y.s.y.y.s.p.s.s.y.w.y.0.s.n.u.f 2 2 w d f p r j Q v.z.0.0.i.s.0.y.i.v.s.p.p.x.` d > < d l l a t y I p.p.8.p.p.p.p.i.i.0.8.U u.u.V 5 , 4 i i s e e r M P P H I U U I U 6.Q I K H G z w q d d a a a e e g u u f M M M M H M f u f f u u q M !.>X~.W.+XE.E.#X#XE.#XE.+X+XR.R.R.#XW.R.@X@X@XR.W.E.+X+XR.R.R.+X#Xh.r.r.h.8X#X#X+XR.R.+XE.E.E.E.E.+X+X+X#XE.#X#X#X#XE.j.t.d.d.U u w a c A c x x x x A A x x T T T A T T ",
"3.3.3.2.2.2.2.2.5.%.5.%.5.%.$.5.2.2.%.2.3.3.2.3.1.O.1.O.o.o.o.o.o.o.o.o.o.1.+.,.+.@.@.o.@.<.e.k.g.e.7.g.N.E.+X+XE.E.E.E.E.E.E.E.E.R.E.E.E.+X+XE.E.+X@XN.j.E.E.R.R.!.R.R.R.R.R.R.R.+XR.E.E.+X+XR.R.E.R.R.E.W.E.E.E.E.+XE.E.h.W.~.z.2 # > , d / ` P L W I P M M m M H P Q / / V i < > , > , g H u.x.0.6.8.0.0.s.0.0.y.8.6.6.p.U m s r 4 < , < 4 i 5 # # - , > , , , < , 8 > , 8 - 8 , # > , , , 8 i L / c.p.i.y.y.f.f.y.f.y.8.8.p.y.I F f e > > 7 i r f ! p.w.s.s.d.w.f.y.s.s.e.r.e.e.s.a.s.w.s.w.f.s.f.r.f.f.w.a.s.s.7.e.w.f.w.w.y.w.f.w.w.f.w.w.w.r.r.s.a.e.a.s.s.a.e.s.e.s.a.e.a.a.s.g.s.s.e.a.s.e.a.s.a.a.e.r.s.w.w.s.a.w.w.t.s.r.w.r.w.w.w.w.w.e.e.r.w.e.w.w.w.w.w.w.w.w.w.w.a.e.e.a.a.s.a.e.a.h.g.a.e.g.g.g.g.N.T.N.i.u < > q a c x w f M K U y.i.i.s.s.y.f.y.8.8.i.z.9.v < 2 a x f r r g j j j K 6.8.8.0.0.8.U I J M S L x < < c d a i a r g u f m m M M P H M M M m u V f 4 < 7 s d s i p r r t r y r y y y y y g r r r r g a < a a a w a i e e 5 t e r y t t t t r t t e r y < t u.1X>X~.#X#XE.E.#X#XE.#X+X+X#X+XW.R.W.W.R.@X+XW.+XE.+XW.#XR.E.+X=XE.r.t.j.E.#XE.E.+X+XE.#X#XE.#XE.+XE.E.#XE.8X8X#X#XE.E.j.r.h.s.M f z D A x A x A v x x x x c c l c a d ",
"$.$.2.2.2.2.2.2.2.2.5.5.5.2.2.2.2.3.$.1.3.2.2.3.1.<.+.+.+...o.o.o.o.o.+.o.+.1.+.o.+.o.,.@.<.r.e.e.e.t.j.E.E.+Xh.E.E.E.E.E.E.E.E.R.E.R.E.E.R.+XE.E.+X+Xh.j.E.E.R.R.R.R.R.R.E.+X+XR.R.R.E.E.R.R.+XR.R.R.R.W.W.8XE.E.E.R.R.E.T.R.Q.R 2 # > < D ~ 9.I M G H M j m m j M K Q / L C f 4 # # , i f P p.0.8.K K q.6.6.0.0.7.0.0.f.8.B M M m e , > < f f f r e s m d m m M m m m m m m s f z l a > # > e f E u.i.p.p.f.s.d.p.s.0.0.0.9.p.u./ I D d < > < s r u y.d.d.s.w.g.d.s.s.r.s.e.r.a.a.a.s.r.r.r.w.e.r.e.s.d.r.s.r.e.s.a.7.e.7.7.w.w.w.w.w.y.e.s.a.d.s.d.a.d.d.s.g.g.d.g.h.g.v.g.n.b.g.g.h.g.b.g.g.d.g.d.h.d.d.g.d.a.d.d.r.a.s.a.s.r.w.a.a.e.r.w.w.s.r.s.a.r.d.r.d.a.a.d.s.r.r.r.r.g.a.s.g.s.g.b.a.s.N.g.b.g.N.h.N.N.!.!.T.v.H w 2 7 d x a 5 e r m f u u M M M M M M u u f j z d q , a x d p r g g g y y u g u u f u u g s s s f i < < 7 d i i s s e e s s r r r u r t r g t t s f e < w p s i e s r e r r r r r r r y r r r r r p p p w w a w a a i e p p r e r e e 4 e e r e 4 e s u 4 t L }.}.^.8XW.#X#X#XE.#X#X+X#XE.#XE.#XW.#XW.R.W.R.@XR.R.R.#XE.E.#X$XE.h.t.t.8X8XE.E.W.+XR.E.#XE.E.#XE.R.R.E.8XE.#X#XE.#XE.h.r.j.d.K q < 2 1 2 2 * > > 2 > 2 ; > @ > # > @ ",
"2.2.2.5.5.$.2.$.2.2.#.5.#.2.2.2.$.$.$.3.3.3.2.1.1.O.+.@.o.o.o.o.o.o.o.o.+.<.o.o.+.o.+.o.<.<.7.t.e.w.r.h.E.R.E.E.E.E.E.E.E.+X+XE.E.E.E.E.E.!.R.E.E.+XE.E.j.E.E.R.R.R.R.R.R.+XR.E.E.E.E.+XR.R.E.E.R.R.W.W.W.E.E.E.R.R.R.R.E.E./.Q.S > # # 7 G ! ! U H B J J U U K B P U 8./ P S Z a 2 > 2 p m G ! 9.9.9.8.i.0.s.i.i.0.i.y.p./ H f m P g , p ` m.Q.m.n.n.m././.c.n.n.n.T.T.T.p.T.d.B.oX}.G.f > < d f V G ! p.p.f.f.y.y.y.i.0.0.6.6.U H M m d 4 < i d r f y.N.T.N.g.b.g.H.g.s.g.g.s.g.s.s.g.s.s.s.a.g.b.s.d.s.s.s.s.s.g.s.s.s.y.s.s.s.s.s.s.s.s.s.s.s.s.a.s.s.s.b.g.v.s.s.s.s.s.a.s.g.s.v.a.s.s.s.s.w.t.y.w.w.s.w.f.y.0.f.f.f.f.w.t.f.f.6.f.f.7.f.f.6.f.f.6.7.6.6.6.8.6.6.6.6.6.6.6.q.U U q.6.q.q.6.K q.6.K K k N M N K B M K S a > < d x a m 5 m r r e t t e t r e t t t r w f x a w a c f s p a g p e r y y r r y p r r r r s l d 5 8 5 i d i 4 e p p e e s r s 5 s g g s g r s f f 5 < e i e e e s 4 5 s t e r r r e r r p e p s p a w i w w 4 a i i s i i e 7 s p s i s s e e e s s e , s Q.}./.E.W.;X#XE.E.#XE.#XE.#XE.W.W.W.E.R.W./.R.R.W.W.E.E.#XE.E.W.E.h.r.t.j.E.#XR.E.E.R.E.E.#XE.E.E.E.#X#XE.#XE.#XE.#XE.h.j.d.d.0.y 2 # 2 * 2 1 2 > > 2 2 2 2 2 > > 2 2 ",
"2.2.2.5.2.2.2.2.2.5.5.5.#.5.4.2.$.$.3.3.3.3.$.$.O.1.O.+.+...o.o.o.o.o.,.+.o.+.X.o.<.,.+.<.7.7.t.w.t.w.h.E.E.E.E.E.E.E.R.E.R.V.R.R.E.E.R.E.R.+XR.R.R.E.h.h.E.W.W.E.R.E.R.E.R.+XE.E.E.R.+XR.E.E.E.R.R.@XE.W.R.8XE.V.R.E.R.E.E.!.n.f # # > d ^ i.u.8.U U ! 6.! u.8.! ! 8.9.9.H f d a a , w f f g u v H H K U Q K q.U U K M M M M u j G f 2 v b.d.f.f.U 6.8.P B B B B U f.U U B B f.N.V.{.B.z 2 w x f g g f m m M m M M K M j j j f M f s f d < < a s g u J f.p.f.f.0.q.8.8.q.8.8.6.6.8.8.6.6.U 6.U 6.6.,.U 6.,.U B K K K B K N B B K N K K B B B U K B K K B K B B N j N M v N N M K j M j j k k j k m u u f j m k j u u k u u u u u u u u y u u u u u u u u u u u u u y y y y u u y y y y y y y y y y y u y y y y t t y y u S f 2 < a d s e e r s r s g s r e r e e r f s p g x d w 2 q a a a a p p p r p p g g p g g s e p s l l 7 8 5 7 d s e s s s i e s s 7 m s s s s g r e s f e < 5 i e e i e s e s p e e r r e p p e e e r p p a w 4 e a a s e s 7 s 7 s 5 4 i i p e e i w e s d < , H }.&XW.W.#XW.8XW.W.#X#X8X8X#XW.R.W.E.W.W.R.R.W.W.E.W.W.W.W.E.E.W.8Xj.t.t.E.+XW.R.+XR.#X#XE.+X#X+XE.+XE.#XE.#XR.W.#X#XE.h.r.h.V.K y 2 q 2 q q q a q a q q q a q a a q ",
"2.4.5.5.2.$.2.2.2.5.%.5.%.#.2.#.$.3.3.3.3.1.$.O.1.1.+.+.o.o.<.o.o.o.+.o.+.,.@.O.+.+.o.,.<.7.e.e.t.t.r.h.E.E.E.E.E.E.E.E.E.E.R.E.R.V.!.E.E.E.R.E.R.R.N.j.j.E.E.E.E.R.E.E.R.E.E.E.E.!.R.R.R.+XE.R.R.R.R.R.R.8XE.W.R.R.R.+XE.N./.n.w # # 6 x ^ W U 8.! 8.u.u.! ! 8.! ! U Q 8.v g s x d < < f d e t r r y r y g g p g u r t r r f f H J f 2 ~ n.p.d.N.N.T.d./.d.d.8Xd.N./././.d./.h.~.Q.!.N.v q w v m s r t t r r 5 e r g g y y t y u u f f f i < a p p g u u u u m u u y u g y y y y y y y y y u y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y r u y y r y y y y r y y t y y y r y y y y y y y r r y y y y y u u y y y y y y y y y y y y y u y y u y u y y y y y y y u y y y y y y y u k u u y y k u u u y f S z < , 7 i e e s r 5 e r s s r s g u e r s s w a a d a < a a a e a d p r e p p p r r p s e e s d s c m 5 8 5 7 7 7 i s i s s e s r e r r e e p e e s l p 5 5 4 s i e i e e e s e s r r s s e r e i e p f p i 5 w a p i e e s e e 7 s i e i i e p i e p s Z i > e T.^.&XW./.E.W.#X#X#XE.W.#XE.W.W.W.W.R.R.W.R.R.+X+XW.E.W.W.#XE.W.W.h.j.j.E.#X+XR.R.+X#XE.#XE.#XE.#XE.#XE.#XE.W.E.W.#X#XE.j.r.h.v.K y q a b a q b q q c b q q b q b q ",
"2.4.5.4.1.2.4.2.2.4.2.2.2.#.#.#.$.3.2.2.1.1.1.O.1.1.o.o.+.o.o.o.o.o.o.o.o.o.o.o.X.o.o.<.7.t.e.t.t.w.j.h.+XE.E.E.+Xh.E.R.R.E.R.E.E.R.R.R.R.R.R.R.W.W.E.j.h.N.R.R.E.+XE.E.R.E.R.E.R.R.R.E.R.R.R.R.R.R.R.!.E.E.R.R.R.!.E.R.E.E.!.x.< # > 7 a x g g u m M m M S m f f f u u f f g g d a q w s s r p r e t t e r e e e e e r r r f v S S g 2 i.B.6.d.#X~././.T./.#X/.8XU.#XU./././.R.!.T.Q.Q.U t q f m s m s s n 5 m p p r r r r t u r r u Z m 4 8 i m 7 s r r r t r y r y p r r y r y r g r r r y r r y g g u r y y g y g y u r y u y y u y r r y t y r y u u r u r u u r r u r r u r r r u r m r r u u r u u s r u u u r u g u g g u u g u s g g g g g r r g g g g r u u e u g g g g g g g g f f y s u u u u u y u y u u r r m C < > 4 d s e s m 5 e s s s r s f f r r r s e s s d i 4 7 d d i p p s p r s s e s e e e 4 e s i 7 d d 7 , 8 4 7 i d s e 4 m s s r s s s s r s s s s d d i < 4 i i s i i s 4 s 4 e r r s s r s 4 e e i s f 5 5 5 5 5 4 5 e e 5 t 4 5 5 5 5 5 5 e e 5 5 5 s e - > M /.;X/.R.W.~.W.W.@XW.W.W.W.W.E.#XR.E.8XE.W.W.#XE.#X#XE.E.#XW.E.h.E.E.E.R.+XR.@X@XW.+X+X+X+X+X+XE.+Xj.#X#X#XW.E.E.#XR.E.h.r.j.j.0.k b q k q b y y q f a b f b g b a ",
"4.5.5.4.#.2.4.2.#.4.2.#.2.1.2.#.2.3.4.1.1.1.1.1.1.X.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o...h ,.7.7.7.t.t.t.j.+X+XE.E.R.+X+XE.R.E.E.E.E.E.E.V.R.E.R.R.E.@XW.h.j.h.R.R.R.E.R.R.E.R.E.E.+XR.E.R.E.E.E.R.R.R.R.R.E.R.E.R./.R.E.E.R.E.~.^.` < # , a l p t t e t t t t t t e y t t t t f j a g a w w s p i p e e e 4 4 s i s e e e s s p f z F v g 2 z.V.U w./.#X/.~./.}.U.6X3X3X3X3X/././.8XT.T.!.B.K t e f s s e e s u 5 m p i p r g r u r t u e m s 5 < 4 s 4 5 r 5 m u r r y r r r r r g r r r r r r g g g g g p g g s g g g r r r r r r g s s g u r r r r r r r r r e u s s u u u s u r g g u r r r e u r r r r s r u e r r e r r r s r r r g g r s e p r g r s g s s r e p e p s r r g p p g g g g s g s u r r p r g g g u r r r f l 4 > < i s 5 t 5 m s s u r t r r g r e r e r s f f e 5 < p p p i e p r r y r r s r r s p u s s s d m i 5 < 5 e e e 4 t 5 5 5 t 5 t t t 5 5 5 e 4 t w e < , < < < 5 5 5 5 5 5 5 5 5 5 5 5 5 5 t 5 5 5 t t 5 8 8 5 5 5 t t t 5 e u r u r r m u s u m m u P m s e B h.~.~.R.+XR.R.R.@X8X#XW.W.W.W.W.W.#X#XW.W.W.E.#XE.W.W.#XE.W.E.E.E.R.R.@XR.R.R.R.R.+X+XE.+XR.+X+X+XE.#XE.#XE.#XE.#X#X+X+Xj.r.j.g.,.k q b k u b k b b b b b f b b b ",
"5.4.4.2.$.2.5.4.#.2.2.2.4.1.#.#.1.1.1.1.O.O.+.1.+.+.+.o.+.o.o.o.o.o.o.h ..o.o.o.h h o.<.k.7.7.t.7.r.N.+XN.+XR.R.E.E.E.V.E.R.R.E.!.E.E.E.E.E.!.E.~.E.h.j.h.#XR.R.E.E.+XR.+XR.+XE.E.R.E.R.+XE.R.E.R.E.R.E.E.E.E.T.!.+XR.!.E.^.!.P 2 # > c c s e t e t t t 4 e e e e e w q w s f s p e w i 4 p e e 5 s e 4 e 4 e i s i s e e r r f S S a 2 b.N.6.d.8X8X8X=X3X6X6X6X6X6X6X6X3X/./.8XT.h./.N.M t r f e e s s r m 7 5 i p s p g r y r r r u f f 4 8 e s s t u r u e e g r r g g g r r r r g g g s g r g g y a r r r r s r r r r r r r r r r r e r r u g s s g r s e r e p e p p i s s s s s s r r r r e s r r e s s u s 7 r g s p r r s r p e s e s s r e r r p r r r s e p p r r s r r r r r r t r t r r r r e e t r r q e t p p d d < > 5 i r 5 e e 4 e t t t t t t t 5 t 5 5 5 i s t 5 , 5 4 e 5 t t q t t t 5 t 5 5 t t t t t t t s e < , 5 t t r r r 5 t r r t r r u e u u m u m M M u r u u f M m m M M P P M P P P P / U U U ! / / p.p.p.p.p.p.p.d.d.d.n.d.n.N.T.T.T./.T.T.T.Q.Q.!./.!.!.!./.E./.~.@XR.+XR.R.R.W.E.#XE.E.W.W.E.E.W.W.E.E.#X#XW.#XW.W.E.E.E.#X#XW.@X@XR.R.R.R.R.+XR.+X+XE.+X+XE.#XE.#XE.E.#XE.#X#X#X#Xj.r.h.j.7.k b b f k y y b b b v b k b b b ",
"4.4.5.2.#.#.2.#.2.4.2.1.2.2.4.4.1.1.1.O.1.+.1.1.+.+.o.+.o.o.o.@.o.o.o...o.X.@.X.o.h o.<.7.e.t.7.t.r.j.+X+Xh.V.E.E.E.E.E.E.V.E.E.R.E.R.E.R.E.E.E.R.E.h.j.N.+XR.R.R.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R./.R.R./.E.E.+XE.~.^.!.H > # < c i i e w e e e 5 e e e e e w r a e d f l p w 7 w e e p e 4 5 s s i i s i i i s s p e r f m f q < B.Q.8.h.W.8X8X8X/./././././././.&X8X/.W.W.T.R.Q.K t t s s s s e 5 e e m e s s s g g r t t u s m f w < w s s r r m 5 r u g r g r g s u g s r r r r t r r r r g g r r r r e g g r r r r t r t e e e e e e r e e e t e r e e e e e t e t t e t 5 t 5 e 5 5 e t 4 5 5 t 5 5 5 5 < 5 < 5 5 5 5 5 5 5 5 5 < 5 < 5 5 5 5 5 5 5 5 5 5 < < 5 5 5 t 5 < < < < < t < < < 5 < 5 < 5 t t t t q t y r < < 4 4 e e r e t t r r r r y u y u u u m u m m m r u m M M M M H B P B P B U U U U / U / / U / p.p.U ! p.n.s.v.d.d.n.d.T.d.n./.T.N.T.d.T.T.Q.Q.Q.Q.!.!.{.{.^.^.!.^.^.!.^.&X~.^.^.~.}.}.&X&X}.&X;X>X&X;X>X&X&X<X&XOX&X>X&X;X&X&X^.^.&XW.&X*X>X&X^.^.^.%X~.%X~.W.~.R.R.R.@X@X@X+X#X#XE.W.#XW.W.#XW.W.W.W.W.W.E.W.E.#XW.#X#X#X#XE.@X@XR.+XW.R.+X+X+X+X+XE.+X+X+X+X#XE.#XE.E.E.#XE.E.W.#XE.j.j.h.j.q.k k b b k b y q a b b y b y y ",
"4.4.5.4.2.#.2.2.4.5.4.4.#.4.#.4.1.O.1.O.1.1.#.O.+.+.+.o.+.o.X.X.o.o.....o.o.@.@.h h N 7.e.t.t.t.f.j.T.R.E.E.+XE.V.R.E.E.E.E.E.E.E.E.R.!.E.E.E.E.R.!.h.h.E.R.R.E.R.R.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.+XR.R.R.R.R.R.R.R.+XR.&XT.m > # 7 l d i r r e e r e e i e e i w e t w a f d i 5 5 4 s d s e e m s r e s p i i p i r p p s s f f t 2 B.V.7.N.#X#XW.#X8X#X8X8X/./.8X8XW.W.8X#X$XE.!.Q.U q t r s m e e 5 m 5 8 e e e t t t t r r t r f d < 2 < t 4 t t t 5 5 t t 5 5 5 t t t < 5 5 < t < < 5 < < t 5 t < < < < < < < < < < < 5 < t t < 5 < < < 5 < < < < < < < < < 5 < 5 5 5 5 5 t 5 5 t 5 5 t t t t t r t r t u r u t r u u r u r u u u u u u u m m m u M u M m m M M M M P M M B M P P U U U 6.U / f.8.6.8./ y.y.y.f.y.s.n.n.p.p.n.T.n.T.T.T.T.T.T.Q.T./.!.Q.!.!.Q.!.E./.!.^././.}.~.^.^.+X=X/.^.&X~.&X/.;X/./.&X&X&X&X&X~.&X<X<X&X&X&X;X&X;X^.&X&X&X;X&X&X;X/.&X;X<X*X&X>X&X%X>X&X>X:X*X>X*X&X&X%X%X~.*X$X&X=X&X=X~.%X$X%X%XW.~.~.~.~.$X$X~./.&X~.~.~.~.~.~./.@X$X+XR.W.$X~.W.W.W.W.W.R.W.E.E.E.#XE.R.R.+X+X#X8X#XW.#XE.#XE.W.W.E.#X#XW.W.R.W.W.W.+X#XW.E.#X@XR.@XW.+XR.$XR.R.+X+XR.#XE.+X+X#XE.#XE.#XE.#XE.E.E.#X+X8Xj.r.j.w.,.k k b u b k k b b b b y y b ",
"4.5.5.&.4.2.$.2.5.5.5.4.2.2.4.4.1.O.+.1.1.1.<.+.+.+.o.o.o.o.o.o.o.....o.o.o.@.o.h h ,.<.k.t.7.7.t.h.E.E.E.E.E.+X+XE.E.E.E.R.E.R.E.E.E.E.E.E.E.E.R.R.N.h.h.E.E.R.E.E.+XR.R.E.R.R.R.R.R.R.R.R.R.R.R.R.R.E.!.E.!.E.!.R.E.R.R.%Xd.u # # , 7 5 5 < t 5 5 < < 5 < < t < < 5 5 < 5 e i < , , < 5 5 5 5 5 8 5 5 5 5 < t < 5 5 < t < 5 t y t 2 t b.b.7.h.8X#X8XE.#X8X#X#X#X/.#X8XW.E.E.E.E.h.h.N.N t < t 5 5 5 5 5 r r 5 t t t t e 5 r r r u r u f t < t t e r r y y y r t y y r y t r y y y g u u u u m u u u f u j M m m j m M M M M H M M M P B P U U U / ! 6.f.U u./ u.u.p.y.u.c.p.i.i.i.p.x.d.n.n.n.n.m.N.B.T.T.T./.T.T.T.T.T.Q.T././.!./.!./.!.^.!.^.^.^.^.}.&X^.^.~.^.&X&X*X&X>X&X>X>X1X>X:X<X1X<X1X*X&X&X&X>X<X<X1X<X:X>X&X:X1X<X>X<X<X<X&X&X&X;X;X;X*X;X;X&X*X*X&X:X*X&X*X&X&X&X&X;X;X&X=X=X=X=X=X$X=X=X&X=X=X&X*X=X/.&X$X$X$X=X$X=X~.#X&X#X&X=X#X&X$X$X$X#X/.#X#X$X*X/.~.$X$X=X$X+X+X+X+X%X=X=X@X@X@X@X$X$X$X$X$X#X$X$X@X@X@XW.#XW.@X@X@X@X$X$XW.#X$X$XW.$X~.W.R.W.+X@XR.W.+X@X$XW.W.W.W.W.W.W.#X#X+X#X+X+XR.+X#XE.E.#X#XW.#X#XW.#XW.E.W.#XR.#X#XW.#XW.#XW.W.W.W.R.R.R.@X@XR.@XR.R.R.R.E.+X+X+XE.#XE.#XE.#X#XE.#XE.#XR.E.h.j.r.g.q.h h h h b h h k h h h h h k ",
"5.5.#.5.4.#.#.#.4.5.4.4.4.2.2.#.1.1.1.1.1.4.1.1.+.o.+.+.o.X.X.X.o.h h o.h o.X.h h h <.e.r.e.7.6.j.N.E.R.V.E.R.R.R.E.E.E.E.E.E.E.E.E.R.R.E.+XE.E.R.R.+XE.V.R.R.E.E.R.E.R.R.R.R.R.R.~.R.R.!.R.R.R.R.R.R.R.R.E.!.!.R.R.R.+X@X!.d.M t 5 s f u m m j u m m f u m m m j f j u j m M M j f j m u m M M M P M M M M P P B P B B M P M B U B j K N.N.r.h.E.j.E.E.8Xj.8Xj.j.8X8X8XE.E.E.V.E.N.E.E.N.f.6.y./ d.p./ f.d.d.d.d.n.n.n.T.d.n.d.d.d.n.n.Q.n.d.n.T.T.n.T.N.N.T.T.T.T.T.Q.T.Q.E.Q.!./.!.!.!.!.!.!.!.!.!.!.!.^.!.^.~.^.^.^.%X&X>X&X%X&X^.^.^.^.%X^.^.<X<X^.&X1X<X&X<X*X<X>X<X&X<X<X<X>X<X<X;X;X;X;X<X<X<X;X>X&X;X&X;X&X;X&X*X&X*X&X$X&X&X&X&X~.^.^.~.&X~.&X;X%X&X&X;X&X^.&X%X&X=X&X*X$X%X$X$X$X%X$X&X$X~.~.+X$X&X$X%X=X%X+X+X$X*X$X~.&X$X#X/.=X=X~.$X=X~.~.@X@X@X@X@X$X#X$X$X$X$X$X$X#X#XW.W.#X=X#X$X$X#X#XW.#XW.W.$X$X$X$X#X~.$X=X$X#X=X#X#XW.#X#X#X#XW.#X#X8X=X/.#X#X=XW.W.@X$X$X=X$X@X+X+X@X@X+X@XW.#X$X$X$XW.#X$XW.W.#X@X$X#X@X#XW.W.W.@X$X@XW.W.W.W.W.W.@X@XW.#X@X$X$X$X$X#X+XW.W.W.W.W.W.W.W.W.E.E.#X#X#X+XE.E.#XE.W.E.8X8XW.8XW.W.W.W.E.R.W.E.W.R.+X#X+XE.#XR.R.R.R.R.$X+XR.R.~.R.R.+XE.E.+X#XE.E.E.E.E.E.E.+XE.W.+X8Xh.j.r.r.t.<.<.,.<.1.<.4.4.<.<.<.3.4.5.",
"5.4.4.5.5.4.$.#.4.4.4.4.4.4.1.1.1.1.1.+.1.4.4.O.+.o.o.o.+...o...o.o.o.h o.o.@.h h o.q.k.e.7.7.7.g.N.E.R.E.N.R.R.E.E.E.E.E.E.E.E.E.E.E.V.E.R.+XN.E.+X+XE.!.R.R.R.E.E.E.R.R.R.+X!.R.+XR.+XR.R.R.R.+XR.+XR.R.R.R.R.!.+X+XR.R.R.!.T.B.oX!.Q.Q.Q./.Q.!.Q./.Q.!.Q./.Q.!./.Q.!.!.!.!.Q./.!.!.!.!.^.!.^.^.^.~.^./.&X^.^.^.}.}.>X&X^.%X&X&X^.>X,X2X:X+X+X#X#X#X#X#X#X#X#X#X#X#X#X@X@X+X+X-X#XW.%X<X^.>X<X&X;X3X;X;X;X&X&X&X&X<X;X>X&X<X<X<X1X>X>X5X3X>X:X2X<X;X*X<X*X*X:X;X&X&X&X&X&X&X&X%X=X&X=X=X=X=X$X$X=X$X@X#X@XW.$X@X$X$X=X$X$X$X~.$X$X%X$X$X$X%X$X$X%X~.%XW.W.W.~.W.W.W.W.W.W.W.$X~.$X=XW.~.W.$XW.W.$XW.$X$X@X#X#XW.#X$XW.@XW.@X@X$X@X=X@X%X=X=X/.$X@X$X=X@X@X$X$X#X~.$X=X@X$X$X$X$X$X$X$X#X$X@X#X#X@X@X=X=X=X-X$X=X=X-X+X+X$X$X+X#X&X#X=X#X#X#X#X$X@X$X=X*X=X=X$X$X=X*X=X@X=X*X=X=X#X#XW.#X=X=X#XW.#X#X#X=X#X#X#X#X#X#X$X&X=X$X#X=X$XW.W.W.#X=X#X8X#XW.#X#X#X#X#X$X#X8X#X@X$X$X+X#X=X=X$X$X$X#X$X#XW.W.W.#X$X$X$X#XW.#X$X$X$X+X=X/.W.W.W.~.W.W.@XW.W.@XW.@X@X$X@X@X@X+X+X#X@X+X+X@X@X@XW.W.W.@XW.W.#X#XE.E.R.W.W.#X8X#XW.8X#XE.#X#XW.W.E.W.W.R.R.R.#X+XR.W.W.R.R.W.W.+XR.R.W.$X+X+X+XR.+XE.E.+X+XE.+X#XE.#X#XE.E.E.R.+XW.#Xh.j.j.r.k.e.k.k.5.5.k.k.k.k.5.5.j.j.5.",
"4.3.4.4.1.$.$.2.3.4.1.5.5.3.$.1.3.1.1.1.1.1.1.+.o...X.X.........h ..h ..h h ..h k ,.7.7.k.w.7.w.d.E.!.E.E.R.!.V.~.R.E.E.+X!.E.E.E.R.E.E.R.R.R.R.R.E.+XR.R.R.R.+XV.+X+XR.E.E.+XR.R.!.E.+X!.+X~.R.R.R.+XR.R.R.W.R.R.~.$XR.W.R.~.~.!.^.^.^.^.^.%X^.~.%X~.^.^.%X^.%X%X^.%X%X%X%X^.~.^.~.^.%X%X%X^.&X&X%X%X&X%X%X%X~.~.~.%X~.%X!.%X-X^.^.%X%X%X$X$X$X$X=X$X=X=X$X$X#X$X@X$X$X$X$X=X$X=X$X$X~.$X~.$X$X+X$X$X$X$X$X~.$X~.$X~.%X%X%X$X=X%X%X$X$X%X$X%X%X$X%X$X$X%X$X$X$X-X+X+X+X-X#X#X+X#X+X+X#X+X+X+X#X+X#X+X+X+X+X@X@X+X+X+X+X+X+X+X+X@X@X+X+X#X+X#X#X=X#X$X=X=X#X$X=X$X$X$X$X@X$X@X$X@X$X=X@X=X$X=X=X@X=X#X=X#X#X=X#X=X=X#X#X=X=X#X#X$X$X=X=X=X#X$X#X=X=X=X$X=X=X$X=X$X$X=X=X-X=X=X#X-X=X-X=X=X=X-X#X=X=X=X#X#X#X#X#X#X#X=X=X=X=X#X=X=X=X=X#X#X#X=X=X#X$X=X$X#X$X=X=X#X=X=X=X=X=X#X#X=X#X#X=X=X=X#X#X=X#X=X=X=X=X=X#X=X@X$X+X=X+X$X#X=X$X$X#X#X=X#X#X#X#X@X#X-X#X+X-X#X@X#X$X#X@X-X@X+X-X@X=X$X$X=X=X$X$X-X$X+X$X-X-X-X+X+X+X-X+X+X+X+X+X+X-X+X+X+X+X@XR.+X#X+X+X+X#X#X+X+X#X#X+X@XR.#X+X+X+XW.#X@X+X#X8XW.W.E.8X#X#XW.W.@XW.W.8XW.W.W.#XE.W.R.R.+XR.W.E.W.+XW.W.+X+XR.R.R.R.E.W.+X+XR.R.R.W.R.R.W.R.+XR.R.E.E.R.E.R.@X@X@XR.E.h.h.r.r.j.5.j.5.r.j.5.j.l.5.j.5.5.l.5.",
"3.4.4.1.$.+.$.1.4.2.2.5.5.3.1.2.3.1.1.1.1.4.1.+.+.X.o.X.......h ..h ..h ....o.h h <.7.k.e.w.t.e.h.E.E.E.E.!.E.R.E.R.E.E.E.E.E.E.E.E.E.!.!.E.+XV.E.+XR.R.R.+XR.!.R.R.V.+XR.R.R.+X+XE.+XR.R.V.R.R.R.R.R.R.R.R.R.R.R.R.R.+XR.!.E.R.W.R.W.R.W.R.~.W.~.R.~.~.~.R.~.~.W.~.R.~.~.W.~.W.W.~.W.W.$X$X~.W.~.~.$X+XW.~.R.+X~.$X~.~.$X$X+X+X$X$X$XW.R.@X$X$X$X$X@X+X$X+X@X$X$X$X=X$X$X$X$X$X$X$X$X$X@X$X$XW.-X+X$X$X=X$X$X=X#X$X@X=X=X=X$X$X$X#X$X=X$X$X$X=X=X=X=X$X=X$X=X$X-X+X-X-X#X+X-X#X#X#X#X+X-X#X#X-X#X+X#X#X#X@X@XJ.+X+X#X#X+X+X+X+X@X+X@X#X+X@X@X+X+X+X#X$X$X$X=X+X$X$X#X$X@X=X=X@X@X=X@X=X#X=X=X=X=X=X=X=X$X#X=X#X#X#X#X#X#X=X=X=X$X#X$X$X$X$X$X=X=X$X$X=X=X=X=X$X&X#X=X$X-X-X#X-X-X=X=X=X=X&X=X-X=X=X#X7X#X#X#X7X#X#X=X#X#X=X=X#X#X#X#X=X#X#X=X=X=X#X$X=X=X=X=X#X#X#X=X=X#X=X#X#X=X=X#X=X=X=X#X=X=X#X#X@X#X@X$X#X@X@X@X#X$X=X=X#X#X#X=X#X=X#X#X=X=X#X-X-X#X-X=X+X=X#X+X$X$X+X+X@X=X+X-X+X$X$X#X$X$X$X+X+X$X$X+X@X#X+X#X#X+X+X+X+X#X@X-X-X#X#X#X#X@X@X@X=X#X=X$X#X@X+X+X@XW.+X+X@XW.W.W.+XE.W.#X+XW.#X#X8X#X#X#X8X@XW.W.W.8X#XW.W.W.E.W.W.R.R.@XW.W.W.+XR.W.R.W.R.+XR.R.+XW.R.R.E.E.+XR.R.R.+XW.~.R.$X$X$X+X$X$X+XR.E.E.h.j.r.t.r.j.j.j.j.t.5.5.5.5.5.5.5.5.5.5.5.",
"3.1.1.1.O.+.+.$.4.2.3.5.2.2.$.3.1.1.1.3.4.4.1.<.+.o.X.o.........h ....h h o.o.h o.q.k.7.7.w.w.a.N.N.!.E.E.R.R.E.E.E.E.R.R.V.E.+XE.R.R.E.E.R.E.+XE.!.V.+XR.!.R.+XR.E.E.E.E.E.V.$XE.+XR.R.R.R.R.R.R.E.R.R.E.R.R.W.R.+XW.R.R.W.R.R.R.R.R.R.R.W.R.~.~.W.W.R.W.W.R.~.W.W.R.W.R.W.$X~.$XW.%X$XW.W.R.@XR.R.~.R.W.@X@X@X@X@X~.@X+X$X+X-XW.W.$X$X@X$X+X$X$X@X+X@X$X@X$X$X$X#X$X$X#X$X+X-X$X$X$X@XW.$X$X$X+X-X-X#X$X$X$X@X=X@X$X=X=X$X=X=X$X$X$X$X$X$X$X=X#X=X=X#X$X$X$X$X#X-X-X+X+X-X#X#XJ.=X+X#X#X+X+X#X+X+X+X#X+X#X+X-X#X#X#X#X#X#X#X#X#X#X@X=X+X+X@X@X+X+X+X+X#X$X+X$X#X@X#X#X$X$X#X$X#X@X=X@X@X#X#X#X=X#X$X$X#X#X#X#X#X#X#X#X#X#X/.#X#X$X=X-X=X@X$X@X$X$X@X=X#X$X=X$X$X$X#X$X-X#X-X-X-X-X#X#X#X-X-X#X#X#X#X=X-X-X-X#X#X#X#X7X=X#X#X=X#X-X=X#X=X=X=X#X#X#X=X#X=X#X#X=X7X#X=X=X=X=X=X7X=X#X=X=X#X#X#X=X#X#X$XW.@X@X@X#X#X@X#X#X#X#X#X#X#X#X+X#X#X#X#X#X#X#X$X@X@X@X@X@X#X#X#X#X@X+X@X@X@X@X+X+X@X+X@X@X@X@X+X@X$X$X$X+X+X-X#X#X-X+X@X+X+X+X+X+X+X+X#X#X+X+X+X+X@X$X+X+X+XE.W.R.E.#XW.@XW.#X@XW.W.+XR.+XE.#XE.#XW.#XW.#X$X@X#X#X#X#X@X@XR.#XE.E.+X+X$X+X#X+X+X@X+X@X@X@X$X+X+X$X$X=X$X=X$X$X#X@X-X@X~.$X~.$X-X+XR.!.R.R.T.h.j.r.j.r.t.r.j.j.j.5.5.j.5.5.5.5.5.5.5.5.5.5.",
"1.1.2.1.$.$.$.2.4.2.3.5.2.$.1.2.1.1.1.4.3.<.1.o.+.X...........h ..h h ..o.h h h @.7.e.k.7.7.w.g.E.!.E.E.R.R.R.E.!.E.R.E.R.!.R.R.R.R.E.R.E.E.E.E.R.R.R.R.+XV.+XE.R.R.+XE.R.R.+X+X+XR.R.R.R.+XR.R.R.R.R.R.E.R.R.R.+XR.R.R.@X+X@XR.W.W.R.+XR.~.+XW.W.W.$X~.W.W.$XR.W.~.W.W.W.~.~.$X$X$XW.~.R.$X+X+X@X$X+X$X$XR.+X@X$XW.+X$X$X+X#X+X$X@X$X@X$X+X$X@X$X$X$X=X#X$X$X#X$X$X$X#X=X$X-X-X$X$X#X=X=X$X@X@X-X#X#X-X=X$X@X$X@X$X$X$X#X=X=X=X$X=X=X#X=X$X$X=X=X#X=X=X$X=X$X=X-X+X#X+X-X#X-X#X#X#X-X#X+X-X+X#X#X-X+X#X#X#X-X#X-X-X#X-X#X-X#X#X=X#X=X+X#X-X@X@X#X#X$X#X+X+X$X@X#X$X#X#X@X$X=X@X#X=X#X@X@X=X#X#X@X=X#X#X#X#X#X#X#X#X#X;X#X;X#X#X=X#X#X-X#X#X#X=X#X#X$X@X$X=X$X=X$X$X#X$X#X-X#X#X#X-X-X-X-X#X-X-X=X#X#X=X#X#X-X-X#X#X#X#X#X#X=X#X-X#X-X#X#X#X=X=X=X#X#X=X#X=X#X#X=X#X-X=X=X#X=X#X=X=X=X=X=X=X=X=X=X#X#X#X@XW.@X@X+X@X@X=X#X#X#X=X=X#X#X#X#X#X#X#X#X=X=X@X-X#X+X-X=X#X#X#X#X=X#X$X=X+X#X-X#X$X$X#X+X$X=X-X#X+X-X-X-X#X-X-X-X-X-X#X+X@X+X-X#X-X#X=X#X#X$X+X#X@X@X#X#X#X=X#X#X#X$X=X#X+X#X#X#X#X$X=X#X#X#X#X#X#X#X#X$X=X=X=X#X#X=X$X#X#X#X#X+X+X$X@X+X+XE.E.R.R.+XE.R.E.R.R.R.R.R.E.E.E.h.E.E.N.h.h.h.h.N.g.g.g.a.a.r.w.r.t.t.r.r.r.j.j.j.j.r.5.t.5.5.5.5.5.l.5.l.5.",
"1.1.3.3.1.1.2.5.4.3.2.4.1.#.2.4.1.1.1.1.1.1.1.1.X.o.....h ..............h h h k <.k.7.7.t.t.t.h.E.R.R.E.E.R.E.R.E.E.E.E.R.E.R.E.R.E.R.E.R.E.R.E.E.+XR.R.R.R.E.+X+XE.R.R.R.E.+X+XR.+X+XR.@XR.+XR.+XW.R.E.R.R.R.W.R.@XW.R.W.W.W.W.W.W.W.W.@XW.@X@X$X@XR.@X+X@XR.@XR.$XW.+X$X@X$X@X~.@XW.~.+X+X$X$X$X$X$X@X+X+X-X+X$X#X+X$X+X-X+X#X+X-X+X-X+X+X$X+X-X#X+X@X#X#X#X#X#X#X#X@X#X@X#X#X#X@X#X=X@X@X@X@X#X#X-X-X=X#X#X=X$X$X=X=X=X#X#X=X-X#X#X#X#X#X$X$X=X#X=X#X=X=X-X#X#X#X-X-X-X-X#X#X=X#X#X=X#X#X#X+X+X#X+X-X#X#X-X-X-X-X#X#X#X-X#X#X=X@X#X=X-X@X=X$X@X@X$X=X$X#X@X#X#X#X#X=X#X=X#X#X#X#X#X#X#X#X#X#X#X@X#X#X#X#X=X=X=X#X#X#X#X#X#X#X#X#X+X#X=X=X#X#X#X=X#X$X$X=X$X#XW.=X=X#X=X$X=X=X=X#X=X#X=X#X=X#X#X=X#X=X=X#X=X=X#X#X#X#X=X=X#X#X#X-X#X=X#X=X#X=X=X#X-X=X=X=X=X=X=X=X=X=X=X-X=X=X=X#X=X=X=X=X=X=X=X=X=X#X#X=X=X#X=X=X=X#X=X=X#X#X#X#X#X=X=X=X=X=X#X=X=X=X=X=X=X=X=X=X=X;X=X=X=X#X=X=X=X=X=X=X=X=X=X=X=X*X-X-X-X-X=X=X=X#X-X#X=X$X=X;X=X=X#X=X=X=X=X#X=X=X#X+X+X@X#X#X=X#X$X@X$XW.R.R.R.R.R.R.R.+XR.E.E.E.E.E.h.E.E.h.N.h.V.h.N.N.h.h.N.h.h.j.h.h.h.g.g.g.j.g.g.a.r.r.r.j.r.r.e.w.t.e.t.w.w.t.w.w.w.w.w.w.w.w.7.w.r.r.r.t.f.t.r.r.r.r.j.j.t.5.5.5.5.5.5.5.5.5.5.5.",
"1.1.3.<.4.4.4.4.4.3.1.1.#.2.4.2.1.1.1.1.1.1.o.+.+.X...o.....h ..h h o...o.o.o.,.<.e.e.7.t.f.t.h.E.R.R.E.E.R.R.E.E.E.W.W.E.R.R.W.R.R.R.R.E.E.E.R.E.E.R.+XR.R.R.+XE.+XR.+XE.+X+X+XR.+XR.+XR.+XR.+XR.R.E.R.R.R.R.+X@XR.W.+X+XW.W.W.W.W.W.W.R.@XW.@X@XW.+XW.W.+X$XR.@XW.W.$XW.@XR.$X@X@X@X$X$X$X$X$X@X@X$X@X+X+X+X+X+X@X=X+X-X+X#X+X+X+X#X#X#X#X+X=X#X#X-X#X#X#X#X#X#X#X#X#X#X=X#X#X=X=X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X=X#X=X=X=X-X-X=X#X=X#X=X#X#X#X#X=X=X#X-X-X+X-X-X#X=X-X-X-X=X#X-X#X+X-X-X#X-X#X-X+X#X-X#X+X#X#X#X-X-X=X-X-X#X=X-X#X#X-X+X=X=X=X=X=X=X$X$X$X#X#X#X#X#X=X=X#X=X#X#X#X#X#X=X#X=X#X=X=X=X=X=X#X#X#X#X#X#X#X#X#X#X#X#X-X=X#X#X#X$X$X#X=X#X$X$X#X$X$X#X#X=X#X=X=X=X=X#X=X=X=X=X=X=X#X=X=X=X=X=X=X=X=X#X#X=X#X=X;X=X-X=X=X=X=X=X=X=X=X-X=X=X=X-X#X=X=X=X=X=X=X=X=X#X7X=X=X7X=X#X=X*X=X=X=X=X=X*X=X=X=X-X=X=X=X=X=X=X=X=X#X;X=X=X=X=X=X=X=X=X=X#X-X=X=X=X#X=X#X#X#X-X+X@X@X+X+XW.W.@XR.@XR.+X+X+X+XE.E.E.E.N.E.N.E.N.h.V.h.E.h.h.E.N.E.h.h.h.j.j.h.j.h.h.j.h.g.a.j.r.r.j.r.r.r.r.r.j.r.r.r.t.t.r.t.e.r.j.e.j.e.e.e.t.j.t.7.e.e.7.w.t.t.w.w.t.w.t.w.t.e.t.t.t.e.t.w.e.t.w.t.f.t.f.w.w.w.e.w.e.e.r.r.a.a.r.w.t.t.t.t.r.j.j.5.3.t.5.5.5.5.5.5.l.5.5.5.",
"1.1.3.4.4.2.2.5.3.2.$.1.1.2.2.2.1.4.1.1.1.1.O.o.o...o...h ....h ....h o.o.o...o.<.e.t.6.6.6.t.t.N.R.E.R.E.E.E.E.W.R.W.E.E.E.E.R.R.E.E.R.E.+XE.E.E.E.+X+XE.R.R.R.+XR.E.E.R.R.E.R.R.+X+X+X+XR.R.R.R.R.W.E.R.W.R.+XR.+X+XR.@XR.+X+XR.@XR.+X+XR.+XR.+X+X@X+X+X#X+X+X+X$X+X@X@X@XR.@X@X@X@X$X+X+X@X@X@X+X@X+X+X+X+X+X+X@X+X+X#X#X#X#X+X#X#X+X@X+X-X@X#X+X-X#X#X#X#X#X$X$X=X+X#X+X#X-X#X-X-X#X#X#X#X#X#X#X=X#X=X#X#X#X#X=X=X#X=X=X#X#X#X=X=X#X#X#X#X=X#X#X=X=X#X#X-X#X#X-X#X-X-X#X+X-X#X+X+X#X@X@X$X=X-X-X#X+X-X#X-X+X+X#X-X+X=X@X#X#X-X=X-X=X-X=X=X-X=X=X-X#X=X=X=X=X=X=X#X=X=X;X=X=X=X#X=X=X=X=X=X=X=X=X#X=X=X=X=X*X&X=X#X=X#X=X;X#X-X*X=X-X-X#X-X-X=X=X*X=X=X=X=X=X=X=X=X=X-X=X=X=X;X=X#X#X=X#X=X;X#X#X#X#X=X=X#X=X7X#X=X#X=X;X=X=X-X=X;X#X#X#X#X=X=X-X;X#X#X=X-X-X=X#X#X=X-X-X#X#X#X#X=X=X#X#X+X@X#X+XR.E.E.+X+X+XE.R.E.R.R.R.E.E.E.E.E.E.E.h.h.h.h.h.h.h.h.h.h.h.j.h.h.j.h.j.h.h.j.j.j.j.j.g.h.j.j.j.g.j.g.g.g.j.r.j.r.r.j.r.r.e.r.t.j.r.t.e.r.r.t.e.j.r.t.r.e.r.r.r.e.r.e.t.r.r.t.t.t.t.w.w.e.s.t.w.t.t.t.t.t.r.r.t.e.t.t.t.7.e.e.t.r.e.e.e.e.e.w.w.w.w.w.w.t.t.w.w.w.e.e.r.a.a.t.w.w.w.t.f.w.w.w.w.y.w.7.w.w.s.w.w.w.r.a.r.t.r.t.t.t.t.3.3.5.5.5.5.5.5.5.5.5.5.",
"1.4.4.1.1.2.4.4.4.1.1.1.1.2.2.2.4.3.1.<.3.1.+.+.o...........h ..o.h o.o.o...h ,.7.t.t.6.t.t.B <.g.T.T.@X#XR.E.E.E.E.W.E.!.E.R.E.R.E.E.R.+XV.E.R.+XE.+XV.+XE.R.E.E.E.R.E.R.R.+XV.E.R.R.+XR.R.R.R.R.E.R.W.R.R.@XR.@X@XR.+XR.R.+X+XR.R.+XR.R.R.@XR.R.R.$XR.$X+X$X@X+XR.+X+XR.+X$X@X+XR.@X+X@X@X@X@XR.+X+X$X-X#X#X+X-X@X=X=X#X#X#X#X+X-X#X+X+X#X+X-X-X+X#X#X-X-X#X#X$X#X#X-X-X#X-X#X#X+X#X#X=X=X=X=X=X#X=X#X#X=X=X=X=X=X=X=X=X=X=X=X=X=X-X=X=X=X=X=X7X=X=X=X=X=X=X=X-X*X-X-X-X-X-X#X-X-X#X-X=X=X=X=X-X*X-X-X-X-X-X-X-X-X-X-X-X=X-X-X-X-X=X=X-X=X-X-X-X=X=X-X=X=X-X-X=X=X;X#X=X=X=X;X*X=X=X=X=X=X=X=X=X=X=X#X=X#X=X#X=X=X;X#X#X#X#X#X#X#X#X+X+X+X+X#X#X@X#XW.+X+X+X+XW.#X@X@X+X+X+X+X+X#XE.+X#X#XV.+XE.E.#XE.E.J.E.h.j.#XJ.E.+Xj.E.h.V.j.h.J.E.h.E.j.j.V.h.h.h.h.h.h.h.h.h.h.h.j.h.h.j.j.j.j.j.j.j.j.j.j.j.r.j.j.j.r.r.j.j.r.g.j.j.r.j.j.r.r.r.r.j.j.r.j.j.r.j.r.j.j.r.r.r.r.r.r.r.r.r.r.r.r.r.e.r.r.r.r.r.r.r.e.r.e.e.e.e.t.e.e.w.e.r.r.r.t.r.e.r.r.r.r.e.t.w.e.e.a.t.t.r.r.r.e.t.t.t.t.e.e.e.e.t.e.w.t.t.r.r.r.r.t.t.t.t.e.e.t.w.w.t.t.e.t.t.e.w.e.r.t.e.e.w.r.t.t.w.w.w.e.w.w.r.w.t.e.e.w.w.w.w.w.s.y.w.w.y.w.w.r.a.w.r.r.r.r.r.t.t.t.t.5.<.5.5.5.5.5.5.5.5.5.5.5.",
"1.1.1.1.4.4.5.4.3.1.1.2.3.2.2.3.3.1.4.<.1.O.+.o.X...............o.X.X.....h h ,.k.e.7.7.t.6.B 6.B t.d.h.8XW.#X8XR.R.W.R./.R.~.~.#XW.W.W.~.R.R.+XR.~.~.W.W.W.W.#X+X+X%X$X#XW.~.~.$X$X-X$X#X#X#X$X#X@X@X@X#X+X$X+XW.@X@X~.+X@X+X+X#X@X#X-X+X-X-X-X$X$X$X-X+X-X+X$X$X$X$X=X+X-X-X-X#X=X=X-X-X=X$X$X$X-X-X-X@X#X#X-X=X=X=X#X#X#X#X=X-X#X#X#X#X#X-X#X#X#X#X#X=X#X=X#X#X#X=X=X=X=X=X=X-X-X#X#X#X=X=X=X=X=X=X;X=X#X=X=X=X=X#X=X-X-X#X#X-X-X#X#X#X#X#X=X=X=X#X#X#X-X+X#X#X+X+X+X+X+X+X+X$XR.+X+X+X+XR.R.+XV.R.R.R.+XR.R.R.E.E.+XE.E.+XE.+XE.+XE.E.E.E.E.N.V.E.E.E.E.E.h.N.E.N.E.j.E.E.j.E.E.h.h.h.E.h.h.E.h.h.h.h.h.h.h.h.E.j.h.h.j.h.j.j.h.j.j.j.h.j.h.h.j.j.j.j.j.h.j.j.j.j.j.j.j.r.r.5.j.j.j.t.j.j.j.j.r.r.r.j.r.j.j.j.r.r.r.r.r.r.r.j.t.r.r.r.t.r.r.j.j.r.j.r.t.j.t.e.t.e.r.r.r.r.r.r.r.e.r.r.r.r.r.e.j.r.t.r.r.r.t.r.r.e.r.r.r.r.r.r.r.a.r.r.a.a.r.j.r.a.r.g.g.r.a.r.r.j.r.r.r.r.r.r.r.g.a.a.r.r.r.r.a.g.r.g.a.a.r.r.e.e.a.r.e.a.e.r.t.r.r.r.a.a.g.a.r.g.a.e.e.a.e.r.t.r.a.e.e.e.7.7.w.w.w.w.w.e.w.w.w.w.r.r.r.s.s.e.r.s.e.w.e.w.w.w.w.w.7.w.w.t.t.w.r.w.w.w.w.r.w.r.t.r.r.w.w.w.w.w.w.w.w.w.f.t.7.w.w.f.w.t.f.r.r.r.a.a.d.r.r.t.t.<.<.,.<.1.1.3.5.5.2.%.2.%.5.5.*.",
"<.1.1.4.4.5.5.5.3.3.3.3.4.3.5.2.1.3.4.4.1.+.+...................@.k ....h o.h <.t.7.7.6.,.t.t.B B B <.t.t.j.h.h.E.T.T.E.E.E.!.R.8X/.W.W.R.!.~.~.$X$X~.W.W.~.~.8X+X!.+X%X#X8XW.~.%X$X-X$XW.W.W.R.+X+XR.R.R.R.R.R.E.E.R.R.R.E.+XE.E.E.E.E.R.E.+XE.R.R.E.R.N.E.E.E.E.E.E.E.E.E.R.V.E.E.E.E.E.E.E.E.E.E.E.E.N.E.E.V.h.E.V.+X#XV.h.E.V.E.V.h.E.N.V.E.N.J.E.R.E.h.V.E.V.+Xh.j.h.V.h.h.h.h.E.j.h.h.V.j.h.h.j.j.h.j.j.j.j.h.h.j.j.j.h.h.j.j.j.j.j.j.j.h.j.j.j.j.j.j.j.h.j.j.j.h.h.j.g.g.g.j.g.g.g.g.g.a.j.j.j.j.r.j.r.r.t.j.r.r.r.r.r.r.e.r.r.r.r.t.e.t.r.j.t.j.5.r.e.r.e.r.j.k.t.j.r.r.t.k.j.e.e.k.j.e.e.k.j.e.j.k.j.e.r.t.t.j.j.j.j.j.e.e.j.j.j.j.j.r.j.r.j.r.j.r.r.7.j.r.j.r.j.r.r.r.j.j.r.r.j.t.r.r.r.e.r.j.j.e.r.r.r.j.r.r.r.t.j.r.r.j.j.r.j.j.r.e.k.j.r.r.r.r.r.j.g.e.g.g.g.g.g.g.r.r.r.r.r.r.r.a.r.r.j.r.r.j.j.j.j.r.a.r.g.r.a.g.g.r.g.a.g.r.g.g.g.r.g.r.r.a.g.r.r.r.r.r.r.j.a.r.r.r.j.r.r.a.a.a.a.a.r.a.e.g.g.r.r.e.r.e.r.r.e.r.r.j.g.a.a.e.e.e.g.a.e.e.e.e.e.a.t.j.r.a.a.s.r.w.w.e.r.r.r.r.w.w.w.w.w.s.s.r.w.r.e.w.w.w.e.e.w.w.w.w.s.r.e.r.r.r.a.w.w.w.a.r.w.w.f.t.f.t.f.a.w.e.r.t.s.s.w.w.w.t.w.f.s.w.t.t.s.w.w.w.w.w.t.<.6.B B <.,.<.<.1.5.5.5.5.5.5.%.5.5.5.",
"3.1.1.1.4.5.5.4.3.3.3.5.5.5.3.2.3.3.1.4.+.+...............@...@...h h ..h h ..,.q.7.7.6.6.6.6.6.t.B <.B ,.6.t.t.t.t.f.t.w.t.w.s.t.r.r.t.e.w.a.w.r.r.a.r.r.a.r.r.r.r.g.g.r.r.r.r.d.h.g.g.t.r.r.r.t.r.r.t.r.r.e.e.r.r.r.t.e.t.e.t.r.e.e.r.e.e.7.g.e.r.t.t.e.t.e.t.e.w.w.w.t.t.e.e.t.t.e.t.e.w.t.t.e.t.r.t.t.t.k.t.e.t.e.r.5.t.t.t.t.t.j.k.t.t.e.7.t.t.t.t.t.e.e.e.5.r.t.t.k.j.7.t.k.t.7.t.5.t.j.k.t.t.e.e.k.t.t.t.k.e.7.7.k.7.t.t.7.k.j.e.7.t.k.e.e.e.k.r.7.e.t.t.k.e.7.w.e.t.e.e.e.t.t.t.w.e.r.e.r.e.e.r.r.t.t.r.t.t.t.e.e.r.r.r.t.e.r.t.e.e.r.r.t.r.t.e.t.r.e.r.r.e.e.e.j.e.k.t.j.t.r.r.j.r.e.r.e.j.j.e.j.j.e.g.r.r.e.r.r.r.j.k.e.g.e.g.k.t.g.r.j.r.j.r.r.j.g.g.r.j.r.j.j.r.j.j.j.r.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.r.j.r.j.j.r.j.g.j.r.r.j.j.r.r.j.j.r.j.r.r.r.j.a.g.a.r.g.r.j.r.a.r.r.r.r.r.a.r.r.r.r.r.r.r.r.r.g.g.g.r.r.j.a.g.g.g.a.g.a.r.r.a.r.r.r.r.g.r.r.r.r.r.r.d.r.a.r.r.g.r.r.a.r.r.r.r.r.a.a.g.a.a.g.g.e.r.a.r.a.r.k.r.e.e.w.a.e.r.s.w.t.w.w.w.r.r.e.r.r.r.s.s.e.e.r.r.r.s.r.w.w.w.w.w.w.s.e.r.r.s.7.e.a.r.r.t.t.e.a.a.r.a.a.r.r.r.w.w.r.w.r.w.w.t.t.t.t.a.r.a.r.e.r.w.w.7.0.7.7.6.7.6.f.6.6.6.,.6.,.6.,.,.B B N ,.,.<.<.<.3.<.5.5.5.5.5.5.*.5.5.",
"1.1.3.1.5.5.5.4.3.3.3.3.3.3.3.2.4.4.1.1.+.+.+...@...h ........@...h ......o.h ,.,.<.6.6.f.6.,.B B B B B ,.B B B B ,.6.6.6.6.6.,.<.6.6.,.6.,.,.6.6.,.,.6.,.6.<.B 6.6.6.q.f.t.B <.6.<.6.q.6.6.t.<.<.7.6.7.6.7.<.7.<.6.7.6.7.6.7.6.6.7.<.6.<.7.6.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.<.7.7.7.7.7.t.t.t.t.t.t.7.7.7.t.t.7.t.7.t.t.t.7.t.7.e.t.t.5.t.t.7.7.t.t.r.t.t.k.t.e.7.e.k.7.t.r.t.e.e.k.7.e.7.j.k.t.t.k.t.t.e.7.e.7.t.e.e.e.e.t.t.t.e.e.e.e.e.t.e.e.e.e.e.e.r.r.e.e.e.t.r.t.t.t.t.t.e.r.r.e.t.e.r.t.t.t.t.r.r.7.e.e.e.e.e.t.r.e.r.r.r.r.t.r.t.e.r.r.r.e.r.e.r.t.r.r.r.r.r.r.t.r.r.g.r.r.e.e.r.j.r.g.e.r.r.r.r.r.r.j.j.g.g.g.e.g.j.r.g.r.j.k.j.r.r.g.g.j.r.j.r.r.j.r.e.t.r.e.j.j.r.r.r.r.e.r.r.t.j.t.r.j.t.r.k.j.r.j.j.r.j.r.j.r.j.j.r.r.j.j.r.r.j.r.j.r.r.r.a.e.r.r.r.r.r.a.g.r.j.a.g.a.j.a.j.a.r.r.r.g.a.r.r.r.r.r.r.r.a.a.r.g.r.a.r.g.r.r.g.a.j.a.r.j.r.r.r.r.r.r.r.e.r.r.r.a.a.r.r.r.g.a.r.e.r.a.a.a.a.e.a.r.w.r.r.r.e.r.e.e.e.e.s.r.e.r.r.e.r.a.a.g.a.s.r.w.w.w.r.a.e.a.t.e.e.a.e.e.r.r.e.r.r.a.r.e.a.g.a.r.r.t.7.w.7.w.7.7.7.t.<.7.7.f.7.6.6.6.f.6.7.,.B 6.B 6.,.6.,.,.6.B ,.B B B N B B N B B N N N N N N B ,.N B ,.,.<.<.<.3.3.2.5.2.5.5.2.5.5.",
"<.1.4.5.5.5.5.4.3.3.5.5.3.3.3.3.4.3.1.1.+.+...+.....h ....@.....o.X...@.o.h o.o.,.7.7.7.6.6.6.6.f.B t.B 6.<.B <.t.B 6.6.6.,.6.6.B 6.t.6.f.f.6.6.6.,.6.6.6.6.6.t.6.6.6.<.6.t.f.6.6.<.<.t.6.t.6.t.<.6.t.6.7.6.t.7.7.f.7.t.7.7.7.7.f.7.7.7.w.7.7.f.t.7.f.f.f.w.w.w.7.w.7.w.t.f.t.t.f.t.7.f.w.7.y.7.w.w.7.w.t.7.7.k.t.t.7.e.e.t.e.e.t.t.t.e.t.e.e.7.t.t.t.7.t.t.e.7.t.t.t.t.e.7.r.e.7.e.e.e.j.j.e.t.7.e.7.e.e.7.r.k.e.t.r.r.e.e.e.j.r.e.7.e.e.e.7.r.e.e.e.e.7.e.e.t.e.e.e.r.r.e.e.w.t.r.e.e.t.e.e.e.e.t.e.e.e.t.e.t.t.t.e.t.e.w.t.r.e.r.r.e.e.t.e.e.t.e.t.r.t.t.e.e.e.e.r.r.t.r.e.e.e.e.j.e.r.r.r.e.r.e.r.j.g.e.g.g.a.e.a.e.r.e.g.g.a.e.g.g.g.r.j.r.r.k.j.r.e.g.e.e.r.r.r.r.r.e.g.r.r.r.r.r.r.r.j.j.r.r.j.r.r.r.r.r.r.r.r.r.r.r.j.t.r.r.r.j.r.r.j.j.g.j.g.g.j.r.r.r.r.j.r.g.r.r.r.a.r.j.e.a.g.a.j.a.a.r.r.r.g.j.a.j.a.r.a.a.j.r.a.j.g.g.g.g.j.r.j.a.a.j.j.j.g.g.r.j.j.r.r.r.j.j.r.r.g.a.g.r.r.r.j.g.g.g.r.r.j.j.g.a.g.g.a.j.a.d.s.a.d.g.j.r.g.s.a.s.r.t.r.t.w.w.w.e.e.r.w.w.s.e.w.w.w.7.0.7.7.7.6.<.6.<.<.6.<.6.,.<.q.<.,.<.6.,.,.,.,.,.B ,.,.N B B N B N N B B B N N N k N N M N N k N N N N N k M N k N k N k N N B N N N N N N B ,.,.,.o.1.1.1.1.2.5.5.5.2.2.5.3.",
"1.4.4.5.5.5.3.1.3.3.3.3.5.3.3.5.5.5.1.1.O.+.+.X.@...@...h h ..........@.@.o.o.,.o.N B 6.6.6.6.B B U f.t.6.B 6.6.B <.6.U 6.6.6.6.6.6.6.6.6.B <.<.6.6.6.6.6.t.t.6.6.7.6.t.f.6.f.t.7.6.6.7.t.7.6.t.t.t.<.t.6.7.7.7.7.t.f.7.f.w.f.f.7.7.0.7.7.f.w.7.6.7.7.7.7.7.7.7.f.7.w.7.t.7.7.7.7.7.7.7.7.w.w.w.7.y.7.7.t.t.7.t.t.7.e.7.7.t.7.7.t.7.t.7.7.7.7.e.t.e.e.7.t.e.t.7.t.t.t.t.7.e.7.e.e.e.7.e.t.t.e.e.e.e.g.7.7.e.t.7.e.t.7.e.e.t.e.k.r.7.e.e.7.e.e.e.r.k.r.t.e.e.t.t.t.t.e.e.e.e.e.t.t.r.e.e.e.e.t.r.r.r.k.e.e.e.e.r.e.t.e.r.e.e.r.w.e.t.t.t.t.t.e.e.e.e.t.t.r.e.e.e.e.e.e.e.e.e.e.e.r.e.j.e.e.r.r.r.r.j.j.r.r.r.e.g.e.e.a.e.e.r.e.e.r.a.g.g.a.e.j.r.r.j.g.r.j.r.g.g.r.r.e.r.g.g.g.g.g.j.r.j.j.r.j.j.j.r.r.j.j.j.d.j.j.j.j.j.j.r.r.j.r.j.r.j.a.j.j.r.g.g.g.g.r.j.j.j.j.h.j.j.g.j.j.g.j.j.g.g.g.j.g.j.j.g.j.j.g.g.j.r.j.g.j.r.j.r.j.j.g.g.h.j.j.j.j.a.g.g.a.r.r.r.r.e.r.t.r.r.t.r.r.t.r.r.r.t.t.7.t.t.w.7.7.7.7.7.7.7.7.7.<.7.6.7.<.<.6.<.6.<.q.,.6.<.,.<.,.6.6.,.,.N N B N ,.N N N N N ,.N N B N N N ,.N N N N N N N k N k N N B N N N k N N B k k N k N N k N k N k N N M N N N k k B k k M B N N N N N N N M N N N N N N N N N N ,.,.o.,.<.<.1.1.1.2.5.2.*.2.2.5.3.",
"1.3.4.5.5.5.5.2.3.3.3.3.3.3.4.5.5.4.1.O.+.+.....X.@.o.....h o.o...o.....o.o.o.k h N N ,.6.6.6.6.B t.B f.,.6.B B B t.B f.6.6.6.f.f.6.t.6.<.B 6.6.6.6.6.6.6.6.6.6.6.6.<.6.B 6.<.t.7.t.6.7.6.t.6.t.t.6.t.6.7.6.6.t.7.7.7.w.7.w.t.7.w.f.f.w.w.f.7.y.w.w.7.w.w.w.w.7.w.w.w.w.t.t.f.7.t.7.w.7.7.7.7.w.w.7.7.w.t.7.t.t.t.e.e.t.e.7.t.t.t.t.t.t.e.w.7.7.t.e.7.e.e.e.7.e.e.t.e.e.e.w.7.w.e.e.7.e.e.r.e.e.e.e.e.e.r.e.e.e.e.e.k.r.r.e.e.e.e.e.e.7.e.t.t.e.t.t.e.7.7.t.t.t.t.t.t.t.7.e.t.t.e.t.7.e.t.t.7.e.t.t.e.e.e.7.t.7.t.t.t.t.t.t.t.t.t.t.t.t.w.t.t.w.t.t.t.t.e.t.e.e.7.e.r.r.r.e.r.j.r.r.e.j.r.r.j.j.r.r.r.r.e.g.j.r.g.g.g.g.g.g.g.g.a.g.g.g.g.j.j.j.r.j.r.r.j.j.g.g.j.j.j.j.g.g.j.g.j.g.j.j.j.j.j.r.r.j.r.r.j.j.j.j.j.j.j.j.r.j.j.j.r.d.r.j.g.g.a.a.a.g.e.e.a.r.r.r.a.r.r.r.g.r.a.r.j.r.g.r.r.r.r.t.e.e.t.r.w.t.t.t.w.t.t.7.7.7.6.<.7.<.7.7.<.t.6.<.7.<.,.<.6.<.<.<.<.6.B <.,.,.,.<.,.,.,.,.,.,.N ,.N N ,.,.,.,.,.,.N o.N N ,.,.,.,.k ,.N B ,.,.N k N N k N N N N N N N N k N N k ,.N k B k N k N N N N k N N N N N N k N N k N N N N M N k B N N N B N N N N N N N N k N N k N k B k M N M N k k k k N k ,.k k N ,.k N N N h ,.,.N o.,.o.<.<.+.1.1.2.5.5.5.2.5.5.5.",
"3.5.5.5.5.5.3.4.3.3.5.3.3.3.4.4.5.4.1.+.+...+...X.@.h ..h @.@.o.o...o.o.h @.k o.k k k k N B U 6.U U U f.6.6.f.<.f.U <.6.6.6.,.6.f.B <.6.6.t.6.6.<.6.7.<.6.<.6.6.6.6.6.6.t.6.t.B 6.t.t.6.<.t.t.<.<.t.<.7.6.6.t.<.f.7.6.7.6.7.6.7.7.7.7.7.7.7.7.7.7.t.0.w.7.7.7.t.7.w.7.t.7.t.7.7.t.6.7.7.7.w.7.w.7.w.7.e.7.7.e.7.e.t.t.t.k.t.t.t.k.t.7.e.e.7.e.e.t.e.e.e.7.e.e.e.7.e.e.7.w.e.e.e.e.7.w.e.e.t.r.t.7.e.e.e.7.e.e.e.e.e.r.e.r.e.k.e.e.e.e.e.k.e.e.r.r.r.r.e.r.r.r.r.r.r.r.r.r.r.r.g.k.e.j.r.r.e.e.j.r.r.r.e.e.e.e.e.t.r.r.r.a.r.r.r.r.r.r.r.r.r.r.r.a.r.j.r.k.j.e.j.g.e.g.k.g.j.r.j.r.j.j.k.j.r.r.r.j.g.e.j.g.j.e.j.e.g.j.r.r.e.g.j.j.r.g.e.j.r.r.r.r.r.k.r.e.j.r.g.r.t.k.e.k.7.e.e.e.7.7.t.t.t.t.t.7.t.t.t.t.t.<.7.7.t.<.7.7.6.7.<.7.<.7.7.<.7.6.<.6.q.6.<.6.<.<.<.,.<.,.6.<.,.<.,.,.,.,.<.,.<.,.,.,.,.,.,.,.,.,.,.,.,.N ,.B ,.,.B B N N N B ,.B B ,.N ,.,.,.N N N ,.,.B ,.,.B B ,.B ,.N N N N ,.N N ,.N ,.N ,.o.N ,.,.,.,.k ,.,.,.,.<.,.,.N N N N B k B B k N k N N N N N N k N N N N N N N N @.k k N N N N k k N N N N k N k k M k N k N k j N N k N j j j N k M v N j j j M N M M N M k N N k k k N k k k ,.o.k h o.h o.,.,.o.o.o.o.o.<.+.<.1.1.2.2.2.*.5.2.3.3.",
"5.5.4.5.3.4.5.4.3.3.3.3.3.3.3.5.4.4.1.O.+.o.o.o.o.X.o.o.h o.o.k X.k o.h o.o.@.o.h u b k k k N M B B U U U 6.q.6.6.6.6.6.6.f.f.6.6.6.6.6.6.6.f.f.7.t.6.t.7.6.7.7.6.t.6.7.7.7.7.7.t.t.t.7.t.7.w.w.t.t.t.t.7.7.6.t.7.7.t.t.t.t.t.t.t.w.e.t.t.t.t.t.t.t.t.t.w.t.t.7.e.t.7.t.t.t.7.t.t.t.t.t.t.t.r.t.s.r.r.e.e.e.r.r.r.r.r.t.t.j.t.r.r.e.r.r.e.e.r.e.r.r.e.t.e.7.e.e.r.j.e.e.e.r.r.t.e.e.e.r.e.r.r.e.r.r.r.e.e.e.t.e.e.e.7.e.r.e.e.t.e.e.g.e.r.r.e.e.r.t.e.t.e.r.k.e.e.7.e.k.e.e.e.e.e.k.a.e.k.s.7.g.7.e.7.7.e.7.e.t.t.w.t.t.w.t.w.t.t.7.t.7.<.t.7.<.7.7.7.7.7.7.7.7.7.7.7.<.7.<.7.<.7.<.7.<.7.6.<.7.<.6.<.7.<.<.6.<.<.6.<.<.<.6.<.,.<.6.<.,.6.<.<.,.<.<.,.<.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.N ,.,.k ,.,.N ,.,.N ,.,.N ,.,.N N ,.N B N N N ,.N ,.N ,.N ,.,.N ,.N ,.N N k ,.,.N ,.,.,.,.,.,.,.,.,.,.,.,.N ,.,.,.,.,.,.,.,.<.,.N ,.,.,.,.,.,.@.,.B ,.,.,.,.,.,.,.,.,.,.,.N ,.,.,.,.,.,.N ,.,.N ,.N N N N k k N N @.<.,.K N @.,.k N @.N N k ,.@.K N K N K q.K K ,.K K k q.N N K v k K v v k ,.v k q.v q.v q.v K v v H v K v v v v j v M H v v z j z v j j f j f f f y a g g q a a a a q g g y b y k k N h h h ........X.X.@.X.@.X.X.X.o.o.<.+.O.1.1.#.#.#.5.2.2.2.2.5.",
"4.5.5.5.4.4.5.5.5.3.5.3.5.3.3.3.4.4.O.@.+.o.o.o.o.X.@.o.o.o.o.o.o.@.o.@.h h o.,.N k k y u y u k M B M B N B K B K K U ,.6.B B 6.6.,.,.6.<.6.,.,.,.6.,.6.6.6.6.6.6.6.<.6.6.6.6.6.6.6.6.7.7.6.7.7.6.6.6.<.7.6.6.7.<.6.6.<.6.7.t.<.f.7.7.7.6.7.t.<.t.6.7.7.7.t.7.7.7.7.7.7.t.7.7.7.7.6.6.<.<.t.6.7.7.7.7.7.6.7.<.<.t.<.<.t.7.7.7.<.<.7.7.<.<.7.7.7.7.<.7.7.7.7.7.7.7.<.<.7.<.7.7.7.<.7.7.<.7.<.7.<.q.7.<.7.7.q.7.q.<.7.q.7.7.7.q.7.6.<.6.<.<.<.<.7.<.<.<.<.<.6.q.6.<.6.,.q.,.<.q.,.,.q.q.,.q.,.q.,.<.,.,.q.,.,.,.,.,.N ,.,.,.,.,.,.,.B B ,.,.B B B N ,.N ,.N N N N B N N ,.,.N ,.B N ,.N ,.,.N k ,.,.N k N B ,.B B ,.N B ,.N N ,.N B N ,.N B N N B ,.,.N ,.,.N o.,.,.,.,.,.,.N N o.,.,.,.N ,.,.N ,.,.,.,.,.k ,.N ,.,.,.N ,.N ,.N ,.,.,.,.,.,.,.6.,.,.N N ,.,.N ,.q.,.,.,.,.,.,.N ,.K ,.,.,.,.,.@.<.,.N ,.@.@.,.,.<.,.N ,.,.B B @.,.,.N ,.,.N q.q.K ,.,.q.q.q.v q.,.q.,.K K K N K K K ,.q.K q.v q.K K I q.q.K K J v K K K K K K G K K K R K v R G K K v v v v v v v v v v v v v v v j j f x g k d f a g a p g q p q a q a q q w w q q < < < < 2 2 , , > > 2 2 > > > > > 2 > > 2 > 2 2 2 2 q q q b v h h ,.o.o.X.+.+.@.O.@.O.+.+.@.X.o.o.o.o.O.#.4.4.2.$.2.5.5.2.5.2.",
"3.3.4.<.4.5.5.5.5.3.5.3.5.3.5.4.1.1.O.+.+.o.o.o.o.o.k o.o.o.h ..o...h o.o.k o.k h k k k u u y y y k k j k M j j j M N B N M M N N M M N B N N N N N B B B N B B B B B B B B B N N N B B N B B N B B B B N N B ,.B B B B N B B B B ,.N ,.N N N B N N B B N N ,.,.,.B ,.N ,.B N N N N N N N N B N N N ,.N N N N N N N B B N N ,.N N B k ,.,.N N N ,.,.,.N ,.,.,.,.,.,.<.,.N ,.,.,.,.,.N ,.N ,.,.N ,.N N N @.,.,.,.,.N ,.N N k ,.k k ,.N N N N ,.k N N N N N N N N N B N N N N N N N ,.,.,.,.,.,.k k ,.N @.N k ,.N N N N ,.N N N @.N N N ,.h ,.,.N N N N ,.N k ,.N N ,.k ,.,.,.,.,.,.,.,.,.,.,.,.N N ,.N ,.,.B ,.N N N ,.N ,.,.,.,.,.,.,.,.,.,.,.N ,.k ,.k N ,.,.,.,.,.o.,.N N N N N ,.k ,.k N ,.,.N ,.N ,.,.,.,.N ,.,.K @.,.N N ,.N N N ,.N q.N K q.N k q.N ,.k k N ,.N K K ,.N q.,.q.K q.,.,.q.v ,.K ,.K K q.,.v K K ,.v K K q.v q.v k N v ,.K v K v q.v K v v G v v v v v H v v v v v v f v v x v f f f x d d c c d a a d a a a w w a 7 4 < < < < < < < , < 2 , > , > > > > > # > # > > # # > # > # > # > # # # # # # # # # # . # . # . . # . . . . . . . . . # . # + # . # # > > > 2 2 2 q q k k o.@.o.X.+...+.&.X.+.O.+.O.@.O.+.+.+.+.+.O.#.#.2.$.5.%.2.2.2.2.",
"5.3.3.3.5.5.5.5.5.3.5.5.<.4.5.3.<.1.O.+.o.o.....h o.o.h h o.o.....h o.o.o.o.h o.h k k u b k u k u u j u j j k k k k u k u k m k j j k k m M u N u M k k N k k k k M k M M k j N M k k N k k k N N k M N B k N k N k k N N k N N k N N k N N N k N M N k N N k v N k N N k N N N N k N N k N N N K N N k k N N N k N N N N N N N N N N N N N N N N N ,.k ,.N ,.,.N ,.,.N N N @.,.N ,.N N k ,.,.k ,.k ,.@.N N k ,.N N ,.N N ,.K ,.,.,.N ,.N N ,.K N N ,.N N N ,.,.N ,.N ,.,.N ,.N ,.N N ,.q.,.,.,.,.N ,.,.,.N ,.,.N ,.,.,.B q.N ,.,.N N h N N N ,.K @.K k ,.,.,.,.,.N ,.,.N N ,.N K @.,.v N N N ,.N N N N N N ,.B N N N N B N B N N N N N K B ,.,.K K q.,.,.N q.K ,.,.K K N N N N K B ,.v K ,.U K K ,.K K N N N N k K K ,.N N N B B N N K K G q.K K K Q v M K J K H M v K K v H S v v v v j v x v j v v v f f f f y f f g f f g g g g g a a w q q w < 4 < w w 2 < < < < , < 2 2 > > > > > > > > > > > # > # > # # # # # # # # . . . # # . . . . . . . . . . . . . . . . . . . o . . . . o . . . . . . . . . . . . . . . + . . . . . . . . . . . o . . . + . . + . # + + + + # # > # > > 2 2 q q b h N X.o...+.+.X.+.+.+.X.+.+.@.O.+.+.O.+.%.#.#.5.2.#.$.5.2.2.2.2.",
"5.3.3.3.3.3.5.3.3.5.5.3.3.3.4.1.O.O.@.X.......h h o.h h o.o.o...o.o.o.o.o.h k N k u h y b u k u k u f k k f k j k u k j M u k M j k j k k j j k k N k N N k k ,.M M N N k K k k N N k M ,.k v k k N k K N N @.v ,.k @.v k k N k k v ,.,.k ,.N k k N N N k N ,.N N B k N N N k B N N N N N N k N k N N N N k N N B N k N N N N N N N N N k N N N N N N N k ,.,.k N N ,.@.N ,.@.K ,.,.q.@.,.,.N ,.@.N N ,.,.K N @.,.,.K ,.,.v @.,.,.q.,.@.q.,.q.,.,.,.k ,.,.k ,.k ,.N ,.,.K @.q.@.K @.v q.k ,.v q.,.,.v q.k q.,.K ,.,.q.N ,.K v ,.@.v K N B v ,.,.v q.N q.v q.K q.v q.,.K N q.v ,.v q.,.,.v q.,.K q.K K K B K K K J K K K K K K H K M v H K v K K v ,.v v K v K H v H K v j v v v z j v v x j x j f f f f f f g p g p g g g y p a a r a w a a w a w 7 w 7 7 < 7 < < 4 < < , , 2 < , 2 , , , , > > > > > > > > # > > # # # # # . # # # # # . # # # # . . # # . . . . . . . . . . . . . . . . . . . . . o . o . . . . . . . . . . . + . . o . o o . . o . . . . . o . + . o o o o o o o . o o . X . . o o o o . o o o o . o . o . o o + . . + + + @ + @ # @ @ @ > > > 2 1 2 q q q y k ,.o.+.+.+.X...%.X.+.+.+.+.+.O.O.O.X.o.O.$.#.5.%.$.$.2.2.2.2.",
"<.3.<.3.3.5.5.5.5.5.3.3.3.3.3.<.O.O.O.@.+.......h o.......o.......o.....o.h @.k N k h u k g y k u k k y y u j v j j j v k N M k v k v v K k v j k M v j N M v j N k N u j k N K k N N k k v v @.k N k v k v v v v K v v N N M N q.v v ,.K v N v j B k v j N k v N j K N K M N K N v H N B B K K K N N K N M N j M N K N K B K k N N B N K k K N N N B N q.v K K K N v v K k ,.v N v K v K ,.q.v q.v K K v K K K K N q.K K q.v q.K v K K v K K v K v K K K v K K M N v v v H v v v q.v v K v v v v v v v K v v j v v v v v v v j z j j f u j f v f f f j v f f f f g f g f g f g g y g g g y p g a q p r t w q r q t w w w w < q < < q q < < 2 q < < q < 2 < 2 2 < 2 > > 2 , > 2 > > > > > > > # > > # # # # # > # # # # # # # # # # # . . # . . . . . . . . . . + . . . . . . . . . . . . . . . . . . . . . . . . + . . . o . . . . . + . . o . . . . + o . . . o o o . . o o o . o o . . o o o o o o . + . o o o o o o o o o . o o o o o o o o o o o o o o o o o o o o o o o o . . o o o o o o o + + . o o . . + . + + . + + + + # + @ @ > @ > > 2 2 2 2 2 q b b o.X.@.X.+.+.+.+.X.+.+.@.@.+.+.+.+.+.+.O.$.$.5.5.$.$.2.2.5.%.",
"5.3.3.4.5.5.5.3.3.5.3.3.1.1.1.1.O.O.+.+.........o.o...h h ......o.o.o...o.h h N k k k u y b b k k k y y y f f x v v v v v v j j f v v v j z z v M j j v j v v v v v j j v v v v v v v v v v j v M v v v K v v v v K v v v v K v v v v v v K v v j v v v v v v v v v v v v v v v v v v v v v v v j z v j v v j v u j v j v j v v v v j v v v v f v f f j f f v f v j f v v z f f f x d f f g f d g f d p f g a p a a p q a w a a p w a a a q q a w q w a q w a w w w w w a w w w 4 4 < < 4 2 2 < < 2 < , 1 2 , 2 , , 2 > 2 > > > > > > > # > > > > > > # > > > # 2 # # > > # > # # # # # > # . # # . . . . # # . . . # . . # . . . # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o o o . + + o + + . . o o o + . o o o + o + o + o . + o X o o o o . o . o o o o o o + o o . o + . o + + o o o o . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o X . o . o o . + . . . + . o . + . + . # + + . . # # # # # # > @ 2 2 2 1 2 2 2 q q q q k @.X...X.+.+.+.+.+.+.+.+.+.O.O.+.1.$.O.+.+.%.5.$.$.%.2.5.2.",
"3.3.4.5.5.5.5.3.3.3.5.4.4.1.1.1.O.+.X.X.o.........h h ..h ..h ..h ......o.o.h h h k k h k k b a y y g q q q q q w < w w q w w q w w q w w w q a 5 5 w w 4 < e w < w w w w 4 q 7 q w < w < 4 q < < w w w w w a w w w q 7 q < w 4 w 2 w < < q q < < < < < < < < < < , < 2 < < < 2 2 < < 2 < , < 2 2 , 2 > , 2 > 2 2 > 2 > > 2 > > > > 2 > > > 2 2 > > > > > > > # > # > # > # > # # > > # > > # > # # > > # # # # # # # # # # # # # # . # # # . # . # # # # . # . # # . # # . . # # # # . # # . . . . . . . . . . . . . . o . . . . . . . . . . + . . . . . . . . . . . . . o . . . . . . + . o . . . . . o o . . . . . o . . . . . o . . o . . o . o o . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o + o o o + + + o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o . o o o o . o o . o o . + + + + + + . + . + . . . + + # . + + # # @ @ > 2 1 1 2 2 7 7 2 2 q q q k k o.....+.+...+.+.+.@.+.@.+.@.@.+.+.+.+.+.2.5.5.$.3.%.2.2.",
"4.4.4.5.5.5.5.5.5.3.4.4.k.4.<.1.+.+...........h ..h ..h h h ..h o.h ....k ..k k k h k k b k k k v b q 2 2 2 2 2 > # > # > > > # # # > # # # # # # # # # # # # # # # # # # . # # . # # # . # # # # . # . # . . # # . . . # . . . . . . . . . . . . . # . . . . X . . . . . . . . . . . . # . . # . . # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . X . . . . . . . . . . . . . o o . . o . + . o . . . . . o o o . o o o . o o o + o o o + X o . o + o o o o o o o o o . o o o o + o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o + + o o o . o o o + o o o + o o o o o o o o o o o o o o o o o o o o . o o . o o o o o o o o o o . o o o o o X o O o o . o o o o . o o . . o o . + + + + + . + + . # + + + + # + + # + + . # # @ @ > @ > * > 2 2 7 2 7 2 < a 2 2 q b k k h @.&.+.+...+.+.+.+.+.+.+.+.+.%.+.+.+.#.4.4.1.$.$.3.$.",
"4.4.5.5.5.5.4.4.3.5.5.4.5.1.O.+.+...........h h h h h ....h h h k ..........h h h h h k k h b k b x q 2 2 > > > > # > @ @ # # # # # + # . # @ @ . . . . . . . . . . + . . . . . . . . . . . o . . . . . . . . + . . . . . . . o o . o . . o o . . o . o . o . o . o . o o . o o . o o . o o . o . . o . o o . o o o o o o o o . o o o o o o o o o o o o . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o : o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o + o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o X o o o o o o + o o + o o o o + o o o X o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o . o o o o o o o o o o o o o o o o o o o + o o o o . o o o o o o o o + + o o o o . o o o o X o o + . o X o o . o o o o o . . o X + . + . . + + . + . . # # + + . . + + # # . # > @ > > 2 2 2 2 2 2 2 2 2 2 2 q 2 q q b @.......+.+.+.+.+.+.+.O.+.+.+.+.+...+.+.#.#.2.1.1.$.$.$.",
"3.5.5.5.5.4.4.4.3.4.4.4.4.1.o.+...+.......h h h h h h h h h h ....h h h ..h h h b h b v h k b b v q q 2 2 1 2 @ > # * @ > @ @ @ @ @ @ @ + # + + . @ + + + + + + + o . o + o o . . o . o o o . o . . . o o o o o o o o o o o o o o o o o . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o + + o o o o o o o o o o o o o o o o o o o o o o : o o o o o o o : o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o . o o o o o . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o . o o o o + o o o o o o o o o o o o o . . o o o o o o o . . o o o o o o . o . . o o o o o o o o o X o o + o o o + . + . + . X X . + + + . . . # + + # + . # + @ . # # @ @ > * @ > @ 2 1 2 1 2 2 7 7 2 7 2 q 2 q q q b v @.@...%.......+...+.@.+.#.+.+.+.+.+.+.+.+.$.5.5.$.$.3.",
"5.5.5.5.5.5.5.4.4.3.4.4.1.+.o.+.........h ........h ..h h h h h ....h ..h h h h ..h ..@.h b k k v a 7 2 2 2 1 2 @ > @ > * @ @ @ @ + + + + + + + + + + + + + o + o + o + + o + o o o o o o . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o . o . o . o o o o o o o o o o o o o o o o o o o o . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o X o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o . o o X o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o X o o o o o o o o . o o o o o o o + o o o o o o o o o o o o o o . . o o o o o o o + + o + o + o o . + . X . X . X . . . . X o + + o O + + + o . . . + . + . X . + # + . . # . + + # # # # > * > > 2 @ 2 1 2 1 2 7 < 2 2 2 2 q < 2 2 q q b k @.......+.+.+.+.%.+.+.O.O.$.+.+.+.$.+.+.+.$.2.2.2.2.$.",
"5.5.5.5.5.5.4.5.5.4.5.1.O.+.+.X...........h ..h h ..h h h h o.@.k o...h h h ..h k ..b b b h k b b q 2 2 2 1 @ > > * @ * * @ @ @ @ + + + + + @ + + + . + + + + + o o o + o o + + . o . . o o . . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o X o o o o o o o o o o o o X o o o o o o o o % o o o o o o X o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o + o o o o o + o o o o o o o o o o O o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o . o o o o . o o o o . . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o X o o o o o o o o . o o o o o o o + o + o o + + + + + : + + o o o o o o o o o o o o + o . o o . + + + + + + + + . + + + + + + + + + . + + . + . . X o . o o + o . o . + + + + + + + + . + . + @ . . + . . + # + . # # @ # + > @ * @ * # @ > > @ 2 > 2 1 2 < 2 2 7 2 2 2 < q q 2 q q q h q...@.+.....+.+.+.+.+.+.+.&.+.O.+.+.+.+.+.%.$.%.2.2.#.",
"3.5.5.5.5.5.5.4.5.5.4.<.O.X.+.O.@.h ..h ......h ..h h ....h h o.X...h h ..h ..h h h h h h k b v q q 2 2 > > > @ * > @ > @ @ @ > # + # + @ @ + + + + . + + + + . . + + + + + + + + . o . X o X o o o o . o o o o o o o o o o o o o o o o o o o X o o o o o o o o o o o o o o o o o o o o o o o o o o o X o o : o o : o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o + o o o o o o o o o o o o + o + : o o + o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o . o o o o o . o X o o X o o o o o o X o o . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o . o + o o o o . X o X X o o o o o o X o o o o o o . . o o + . o + + + + + + + . + + + + o + + + o + + . + + . . o . + . X . + + + + . + + + + . + + + + + + + + + + . + X + o . X o + o . + + + X o o + + + + @ + @ + + # . . . . + + + + . . # . + # @ > @ @ @ * > ; > > @ > 2 1 1 2 2 2 7 2 < 2 2 q < 2 2 2 q q q q k h @.....+.%.....+...+.+.+.+.O.O.+.+.+.+.+.+.$.5.5.#.5.",
"5.3.5.3.5.5.5.5.4.4.4.1.+.o.@.1.@...........h ....h ..h h ..k h ..h h ..h o...h h h h k k b b b q q 2 6 1 > > > * @ @ @ @ @ @ @ # + + @ @ : + @ + + + + + + + + + + + + + o + + + + . + o X + o + + X o + o . o o o o o o o o o o o o o o o : o o o o o o o o o o o o o o o o o o o + + o o o o o o o o o o o o o o o o o o o o : o o o o o o o o o o o o o o o o o o X o o o o o o o o o o o o o o o o o o o + o o o o o o o o o : o + o o o o o o o o o + o : o o o + o + + o + o o + o o o o + o o o + + o o o + o o . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o + o + o o o o o o o o o . o . o + o o X o X o o % o o o + o + o . o o + + o o + . o + o . o o . o o o o o o o o o o o o o o o o o o o o + + o + o o o . + o . o X o o X o o o + + o o o + . o X o + o o + . o o . + + + + + + + + + + . + + + + + + + + + + + . + . + + . . . . . . . + . + + + + + + + + + + + + # + + + + + # + + + + X + + + + + + + + + + + O + + + + + @ + # + # + # + + + @ @ . # + + + # + @ @ * ; * > ; > * 2 2 > 2 2 2 2 2 7 2 6 2 2 7 2 2 q 2 2 2 q q q b k h @.+.....+.+...+.....+.+.+.+.$.+.+.+.+.+.+.%.2.2.2.",
"3.3.5.5.5.5.4.4.4.4.1.1.1.1.@.@.@.&.........@.@...........o.....o...h h ..h o.h h k h b h h v b q q 2 2 2 > > @ 2 @ > @ @ @ > @ @ + # + @ @ + @ + + o + + + + + + + : + + + + . . + o X o o X o + o o o o o o o + o o o o o o o o o o o o o o o O o o X o X o o o o o + o o o + o : + o + o o + o X o : o o o o o o o o o + o o o + o o O o o % o o o o o X o o o X o o o o o o o o o o o o o : + + o o o o : + o o + o o o o o o o o o o o o o o o o o o o o o o + + o o o o o o . o + + + o + o o + o o + + o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o + + o o o o o o o o . o o o o o o o o . o o o o . o o . + . X . . o . . o + o o + + o o o + o o . o o o o o o o o o o o o o o o o o o o o o + + + + + O + + + X o o o o o o o o o o X o . o o o o + o + + o + . . o + + + @ + + @ + # + + + @ + + # + + + + + + . + + + + . . + . + + + X + @ + + # + + + # + + + + + + @ # + . . + + . + + + + + + + X . + # + + X @ + + + @ : + @ . + . + @ . + + . + . . # # # # @ * * ; ; 1 ; 2 * * 2 1 6 2 6 7 2 2 2 7 2 7 2 q 4 2 q 2 q 2 q q q b @.@.........+.....+.%.X.+.X.+.+.+.+.+.+.+.O.$.$.#.2."
};

75
linapple-pie/src/stdafx.h Normal file
View File

@ -0,0 +1,75 @@
//#define WIN32_LEAN_AND_MEAN
// Mouse Wheel is not supported on Win95.
// If we didn't care about supporting Win95 (compile/run-time errors)
// we would just define the minmimum windows version to support.
// #define _WIN32_WINDOWS 0x0401
#ifndef WM_MOUSEWHEEL
#define WM_MOUSEWHEEL 0x020A
#endif
//#include <crtdbg.h>
//#include <dsound.h>
//#include <dshow.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <tchar.h>
#include <time.h>
#ifndef _WIN32
#include "wincompat.h"
#else
#include <windows.h>
#endif
//#include <winuser.h> // WM_MOUSEWHEEL
//#include <commctrl.h>
//#include <ddraw.h> - no need
//#include <htmlhelp.h> - no need
#include <SDL.h>
#include "Common.h"
#include "Structs.h"
#include "AppleWin.h"
#include "AY8910.h"
#include "CPU.h"
#include "Debug.h" //- may be soon...
#include "Disk.h"
#include "DiskChoose.h"
#include "DiskImage.h"
#include "Frame.h"
#include "Harddisk.h"
#include "Joystick.h"
#include "Keyboard.h"
#include "Log.h"
#include "Memory.h"
#include "Mockingboard.h"
#include "ParallelPrinter.h"
//#include "PropertySheetPage.h"
#include "Registry.h"
#include "Riff.h"
#include "SaveState.h"
#include "SerialComms.h"
#include "SoundCore.h" //- will do later
#include "Speaker.h"
//#include "Tfe/Tfe.h"
#include "stretch.h"
#include "Timer.h"
#include "Video.h"
//#include "Util_MemoryTextFile.h"

View File

@ -0,0 +1,684 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2004 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
/* This a stretch blit implementation based on ideas given to me by
Tomasz Cejner - thanks! :)
April 27, 2000 - Sam Lantinga
*/
/* This isn't ready for general consumption yet - it should be folded
into the general blitting mechanism.
*/
//static unsigned char copy_row[4096];
#include "stdafx.h"
#include <SDL_image.h>
#include "font.xpm"
#define DEFINE_COPY_ROW(name, type) \
void name(type *src, int src_w, type *dst, int dst_w) \
{ \
int i; \
int pos, inc; \
type pixel = 0; \
\
pos = 0x10000; \
inc = (src_w << 16) / dst_w; \
for ( i=dst_w; i>0; --i ) { \
while ( pos >= 0x10000L ) { \
pixel = *src++; \
pos -= 0x10000L; \
} \
*dst++ = pixel; \
pos += inc; \
} \
}
// the same as above, but pixels ORed with the destination
#define DEFINE_COPY_ROW_OR(name, type) \
void name(type *src, int src_w, type *dst, int dst_w) \
{ \
int i; \
int pos, inc; \
type pixel = 0; \
\
pos = 0x10000; \
inc = (src_w << 16) / dst_w; \
for ( i=dst_w; i>0; --i ) { \
while ( pos >= 0x10000L ) { \
pixel = *src++; \
pos -= 0x10000L; \
} \
*dst++ |= pixel; \
pos += inc; \
} \
}
DEFINE_COPY_ROW(copy_row1, Uint8)
DEFINE_COPY_ROW(copy_row2, Uint16)
DEFINE_COPY_ROW(copy_row4, Uint32)
DEFINE_COPY_ROW_OR(copy_row_or1, Uint8)
DEFINE_COPY_ROW_OR(copy_row_or2, Uint16)
DEFINE_COPY_ROW_OR(copy_row_or4, Uint32)
/* The ASM code doesn't handle 24-bpp stretch blits */
void copy_row3(Uint8 *src, int src_w, Uint8 *dst, int dst_w)
{
int i;
int pos, inc;
Uint8 pixel[3];
pos = 0x10000;
inc = (src_w << 16) / dst_w;
for ( i=dst_w; i>0; --i ) {
while ( pos >= 0x10000L ) {
pixel[0] = *src++;
pixel[1] = *src++;
pixel[2] = *src++;
pos -= 0x10000L;
}
*dst++ = pixel[0];
*dst++ = pixel[1];
*dst++ = pixel[2];
pos += inc;
}
}
/* Perform a stretch blit between two surfaces of the same format.
NOTE: This function is not safe to call from multiple threads!
*/
int SDL_SoftStretchMy(SDL_Surface *src, SDL_Rect *srcrect,
SDL_Surface *dst, SDL_Rect *dstrect)
{
int src_locked;
int dst_locked;
int pos, inc;
int dst_width;
int dst_maxrow;
int src_row, dst_row;
Uint8 *srcp = NULL;
Uint8 *dstp;
SDL_Rect full_src;
SDL_Rect full_dst;
const int bpp = dst->format->BytesPerPixel;
if ( src->format->BitsPerPixel != dst->format->BitsPerPixel ) {
SDL_SetError("Only works with same format surfaces");
return(-1);
}
/* Verify the blit rectangles */
if ( !srcrect ){
full_src.x = 0;
full_src.y = 0;
full_src.w = src->w;
full_src.h = src->h;
srcrect = &full_src;
}
if ( !dstrect ){
full_dst.x = 0;
full_dst.y = 0;
full_dst.w = dst->w;
full_dst.h = dst->h;
dstrect = &full_dst;
}
/* Lock the destination if it's in hardware */
dst_locked = 0;
if ( SDL_MUSTLOCK(dst) ) {
if(SDL_LockSurface(dst) < 0) return -1;
dst_locked = 1;
}
/* Lock the source if it's in hardware */
src_locked = 0;
if ( SDL_MUSTLOCK(src) ) {
if ( SDL_LockSurface(src) < 0 ) {
if ( dst_locked ) SDL_UnlockSurface(dst);
// SDL_SetError("Unable to lock source surface");
return(-1);
}
src_locked = 1;
}
/* Set up the data... */
pos = 0x10000;
inc = (srcrect->h << 16) / dstrect->h;
src_row = srcrect->y;
dst_row = dstrect->y;
dst_width = dstrect->w*bpp;
/* Perform the stretch blit */
for ( dst_maxrow = dst_row+dstrect->h; dst_row<dst_maxrow; ++dst_row ) {
dstp = (Uint8 *)dst->pixels + (dst_row*dst->pitch)
+ (dstrect->x*bpp);
while ( pos >= 0x10000L ) {
srcp = (Uint8 *)src->pixels + (src_row*src->pitch)
+ (srcrect->x*bpp);
++src_row;
pos -= 0x10000L;
}
switch (bpp) {
case 1:
copy_row1(srcp, srcrect->w, dstp, dstrect->w);
break;
case 2:
copy_row2((Uint16 *)srcp, srcrect->w,
(Uint16 *)dstp, dstrect->w);
break;
case 3:
copy_row3(srcp, srcrect->w, dstp, dstrect->w);
break;
case 4:
copy_row4((Uint32 *)srcp, srcrect->w,
(Uint32 *)dstp, dstrect->w);
break;
}
pos += inc;
}
/* We need to unlock the surfaces if they're locked */
if ( dst_locked ) {
SDL_UnlockSurface(dst);
}
if ( src_locked ) {
SDL_UnlockSurface(src);
}
return(0);
}
////////////////////////////////////////////////////////////////////////////////////////////
// MONO8
////////////////////////////////////////////////////////////////////////////////////////////
/* Perform a monochrome stretch blit between two surfaces of the 8bpp format!
NOTE: This function is not safe to call from multiple threads!
*/
void copy8mono(Uint8 *src, int src_w, Uint8 *dst, int dst_w, Uint8 brush)
{
int i;
int pos, inc;
Uint8 pixel = 0;
pos = 0x10000;
inc = (src_w << 16) / dst_w;
for ( i=dst_w; i>0; --i ) {
while ( pos >= 0x10000L ) {
pixel = *src++;
pos -= 0x10000L;
}
//*dst++ = pixel;
if(pixel) *dst++ = brush;
else *dst++ = 0;
pos += inc;
}
}
int SDL_SoftStretchMono8(SDL_Surface *src, SDL_Rect *srcrect,
SDL_Surface *dst, SDL_Rect *dstrect, Uint8 brush)
{//brush - monochrome color (index from palette)
int src_locked;
int dst_locked;
int pos, inc;
int dst_width;
int dst_maxrow;
int src_row, dst_row;
Uint8 *srcp = NULL;
Uint8 *dstp;
SDL_Rect full_src;
SDL_Rect full_dst;
const int bpp = dst->format->BytesPerPixel;
/* Verify the blit rectangles */
if ( !srcrect ){
full_src.x = 0;
full_src.y = 0;
full_src.w = src->w;
full_src.h = src->h;
srcrect = &full_src;
}
if ( !dstrect ){
full_dst.x = 0;
full_dst.y = 0;
full_dst.w = dst->w;
full_dst.h = dst->h;
dstrect = &full_dst;
}
/* Lock the destination if it's in hardware */
dst_locked = 0;
if ( SDL_MUSTLOCK(dst) ) {
if(SDL_LockSurface(dst) < 0) return -1;
dst_locked = 1;
}
/* Lock the source if it's in hardware */
src_locked = 0;
if ( SDL_MUSTLOCK(src) ) {
if ( SDL_LockSurface(src) < 0 ) {
if ( dst_locked ) SDL_UnlockSurface(dst);
// SDL_SetError("Unable to lock source surface");
return(-1);
}
src_locked = 1;
}
/* Set up the data... */
pos = 0x10000;
inc = (srcrect->h << 16) / dstrect->h;
src_row = srcrect->y;
dst_row = dstrect->y;
dst_width = dstrect->w*bpp;
/* Perform the stretch blit */
for ( dst_maxrow = dst_row+dstrect->h; dst_row<dst_maxrow; ++dst_row ) {
dstp = (Uint8 *)dst->pixels + (dst_row*dst->pitch)
+ (dstrect->x*bpp);
while ( pos >= 0x10000L ) {
srcp = (Uint8 *)src->pixels + (src_row*src->pitch)
+ (srcrect->x*bpp);
++src_row;
pos -= 0x10000L;
}
switch (bpp) {
case 1:
copy8mono(srcp, srcrect->w, dstp, dstrect->w, brush);
break;
default: break;
/* case 2:
copy_row2((Uint16 *)srcp, srcrect->w,
(Uint16 *)dstp, dstrect->w);
break;
case 3:
copy_row3(srcp, srcrect->w, dstp, dstrect->w);
break;
case 4:
copy_row4((Uint32 *)srcp, srcrect->w,
(Uint32 *)dstp, dstrect->w);
break;*/
}
pos += inc;
}
/* We need to unlock the surfaces if they're locked */
if ( dst_locked ) {
SDL_UnlockSurface(dst);
}
if ( src_locked ) {
SDL_UnlockSurface(src);
}
return(0);
}
///////////////////////////////////////////////////////////////////////////////////////////////
/* SDL_SoftStretchOr - the same as SDL_SoftStretch, but ORed with destination
NOTE: 24bpp does not support -- beom beotiger 2007 November
*/
/* Perform a stretch blit between two surfaces of the same format.
NOTE: This function is not safe to call from multiple threads!
*/
int SDL_SoftStretchOr(SDL_Surface *src, SDL_Rect *srcrect,
SDL_Surface *dst, SDL_Rect *dstrect)
{
int src_locked;
int dst_locked;
int pos, inc;
int dst_width;
int dst_maxrow;
int src_row, dst_row;
Uint8 *srcp = NULL;
Uint8 *dstp;
SDL_Rect full_src;
SDL_Rect full_dst;
const int bpp = dst->format->BytesPerPixel;
if ( src->format->BitsPerPixel != dst->format->BitsPerPixel ) {
SDL_SetError("Only works with same format surfaces");
return(-1);
}
/* Verify the blit rectangles */
if ( !srcrect ){
full_src.x = 0;
full_src.y = 0;
full_src.w = src->w;
full_src.h = src->h;
srcrect = &full_src;
}
if ( !dstrect ){
full_dst.x = 0;
full_dst.y = 0;
full_dst.w = dst->w;
full_dst.h = dst->h;
dstrect = &full_dst;
}
/* Lock the destination if it's in hardware */
dst_locked = 0;
if ( SDL_MUSTLOCK(dst) ) {
if(SDL_LockSurface(dst) < 0) return -1;
dst_locked = 1;
}
/* Lock the source if it's in hardware */
src_locked = 0;
if ( SDL_MUSTLOCK(src) ) {
if ( SDL_LockSurface(src) < 0 ) {
if ( dst_locked ) SDL_UnlockSurface(dst);
// SDL_SetError("Unable to lock source surface");
return(-1);
}
src_locked = 1;
}
/* Set up the data... */
pos = 0x10000;
inc = (srcrect->h << 16) / dstrect->h;
src_row = srcrect->y;
dst_row = dstrect->y;
dst_width = dstrect->w*bpp;
/* Perform the stretch blit */
for ( dst_maxrow = dst_row+dstrect->h; dst_row<dst_maxrow; ++dst_row ) {
dstp = (Uint8 *)dst->pixels + (dst_row*dst->pitch)
+ (dstrect->x*bpp);
while ( pos >= 0x10000L ) {
srcp = (Uint8 *)src->pixels + (src_row*src->pitch)
+ (srcrect->x*bpp);
++src_row;
pos -= 0x10000L;
}
switch (bpp) {
case 1:
copy_row_or1(srcp, srcrect->w, dstp, dstrect->w);
break;
case 2:
copy_row_or2((Uint16 *)srcp, srcrect->w,
(Uint16 *)dstp, dstrect->w);
break;
case 3:
copy_row3(srcp, srcrect->w, dstp, dstrect->w);
break;
case 4:
copy_row_or4((Uint32 *)srcp, srcrect->w,
(Uint32 *)dstp, dstrect->w);
break;
}
pos += inc;
}
/* We need to unlock the surfaces if they're locked */
if ( dst_locked ) {
SDL_UnlockSurface(dst);
}
if ( src_locked ) {
SDL_UnlockSurface(src);
}
return(0);
}
/* ----------------------------------------------------------------*/
/* ---------------------- FONT routines ---------------------------*/
/* ----------------------------------------------------------------*/
SDL_Surface *font_sfc = NULL; // used for font
// defined in .h file
//#define FONT_SIZE_X 6
//#define FONT_SIZE_Y 8
// chars in row in font bitmap
//#define CHARS_IN_ROW 45
bool fonts_initialization(void)
{
SDL_Surface *temp_surface;
temp_surface = IMG_ReadXPMFromArray (font_xpm);
font_sfc = SDL_DisplayFormat(temp_surface);
SDL_FreeSurface(temp_surface);
/* Transparant color is BLACK: */
SDL_SetColorKey(font_sfc,SDL_SRCCOLORKEY,SDL_MapRGB(font_sfc->format,0,0,0));
return true;
}/* fonts_initialization */
void fonts_termination(void)
{
SDL_FreeSurface(font_sfc);
font_sfc = NULL;
} /* fonts_termination */
void font_print(int x,int y,const char *text,SDL_Surface *surface, double kx, double ky)
{// kx, ky - stretching koefficients for width and height of destination chars respectively
int i, c;
SDL_Rect s,d;
for(i = 0; text[i] != 0 && x < surface->w; i++) {
int row;
c = int(text[i]);
if(c > 127 || c < 0) c = '?'; // cut-off non-ASCII chars
row = c / CHARS_IN_ROW;
s.x = (c - (row * CHARS_IN_ROW)) * (FONT_SIZE_X + 1) + 1;
s.y = (row) * (FONT_SIZE_Y + 1) + 1;
s.h = FONT_SIZE_Y;
s.w = FONT_SIZE_X;
d.x = x + i * FONT_SIZE_X * kx;
d.y = y;
d.w = s.w * kx;
d.h = s.h * ky;
SDL_SoftStretchOr(font_sfc, &s, surface, &d);
} /* for */
} /* font_print */
void font_print_right(int x,int y,const char *text,SDL_Surface *surface, double kx, double ky)
{// kx, ky - stretching koefficients for width and height of destination chars respectively
int i, c;
SDL_Rect s,d;
x -= strlen(text) * FONT_SIZE_X * kx;
for(i=0;text[i]!=0 && x<surface->w;i++) {
int row;
c = int(text[i]);
if(c > 127 || c < 0) c = '?'; // cut-off non-ASCII chars
row = c / CHARS_IN_ROW;
s.x = (c - (row * CHARS_IN_ROW)) * (FONT_SIZE_X + 1) + 1;
s.y = (row) * (FONT_SIZE_Y + 1) + 1;
s.h = FONT_SIZE_Y;
s.w = FONT_SIZE_X;
d.x = x + i * FONT_SIZE_X * kx;
d.y = y;
d.w = s.w * kx;
d.h = s.h * ky;
SDL_SoftStretchOr(font_sfc, &s, surface, &d);
} /* for */
} /* font_print_right */
void font_print_centered(int x, int y, const char *text, SDL_Surface *surface, double kx, double ky)
{// kx, ky - stretching koefficients for width and height of destination chars respectively
int i, c;
SDL_Rect s,d;
x -= strlen(text) * FONT_SIZE_X * kx / 2; // centered position
if(x < 0) x = 0;
for(i=0; text[i] != 0 && ((x * kx) < surface->w); i++) {
int row;
c = int(text[i]);
if(c > 127 || c < 0) c = '?'; // cut-off non-ASCII chars
row = c / CHARS_IN_ROW;
s.x = (c - (row * CHARS_IN_ROW)) * (FONT_SIZE_X + 1) + 1;
s.y = (row) * (FONT_SIZE_Y + 1) + 1;
s.h = FONT_SIZE_Y;
s.w = FONT_SIZE_X;
d.x = x + i * FONT_SIZE_X * kx;
d.y = y;
d.w = s.w * kx;
d.h = s.h * ky;
SDL_SoftStretchOr(font_sfc, &s, surface, &d);
} /* for */
} /* font_print_centered */
///////////////////////////////////////////////////////////////////////////
////// Some auxiliary functions //////////////
///////////////////////////////////////////////////////////////////////////
void surface_fader(SDL_Surface *surface,float r_factor,float g_factor,float b_factor,float a_factor,SDL_Rect *r)
{
// my rebiuld for 8BPP palettized surfaces! --bb
SDL_Rect r2;
int i/*,x,y,offs*/;
// Uint8 rtable[256],gtable[256],btable[256],atable[256];
SDL_Color mycolors[256]; // faded colors
SDL_Color *colors;
// SDL_Surface *tmp;
if (r==0) {
r2.x=0;
r2.y=0;
r2.w=surface->w;
r2.h=surface->h;
r=&r2;
} /* if */
// fading just for 8BPP surfaces!
if (surface->format->BytesPerPixel != 1) return;
colors = (SDL_Color *) surface->format->palette->colors; // get pointer to origin colors
for(i=0;i<256;i++) {
mycolors[i].r=(Uint8)(colors[i].r * r_factor);
mycolors[i].g=(Uint8)(colors[i].g * g_factor);
mycolors[i].b=(Uint8)(colors[i].b * b_factor);
} /* for */
SDL_SetColors(surface, mycolors, 0 ,256);
// if ((surface->flags&SDL_HWSURFACE)!=0) {
// /* HARDWARE SURFACE!!!: */
// tmp=SDL_CreateRGBSurface(SDL_SWSURFACE,surface->w,surface->h,32,0,0,0,0);
// SDL_BlitSurface(surface,0,tmp,0);
// SDL_LockSurface(tmp);
// pixels = (Uint8 *)(tmp->pixels);
// } else {
// SDL_LockSurface(surface);
// pixels = (Uint8 *)(surface->pixels);
// } /* if */
//
// for(y=r->y;y<r->y+r->h && y<surface->h;y++) {
// for(x=r->x,offs=y*surface->pitch+r->x*4;x<r->x+r->w && x<surface->w;x++,offs+=4) {
// pixels[offs+ROFFSET]=rtable[pixels[offs+ROFFSET]];
// pixels[offs+GOFFSET]=gtable[pixels[offs+GOFFSET]];
// pixels[offs+BOFFSET]=btable[pixels[offs+BOFFSET]];
// pixels[offs+AOFFSET]=atable[pixels[offs+AOFFSET]];
// } /* for */
// } /* for */
//
// if ((surface->flags&SDL_HWSURFACE)!=0) {
// /* HARDWARE SURFACE!!!: */
// SDL_UnlockSurface(tmp);
// SDL_BlitSurface(tmp,0,surface,0);
// SDL_FreeSurface(tmp);
// } else {
// SDL_UnlockSurface(surface);
// } /* if */
} /* surface_fader */
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
SDL_Rect clip;
int bpp = surface->format->BytesPerPixel;
SDL_GetClipRect(surface,&clip);
if (x<clip.x || x>=clip.x+clip.w ||
y<clip.y || y>=clip.y+clip.h) return;
if (x<0 || x>=surface->w ||
y<0 || y>=surface->h) return;
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch(bpp) {
case 1:
*p = pixel;
break;
case 2:
*(Uint16 *)p = pixel;
break;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
} else {
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;
case 4:
*(Uint32 *)p = pixel;
break;
}
} /* putpixel */
void rectangle(SDL_Surface *surface, int x, int y, int w, int h, Uint32 pixel)
{
int i;
for(i=0;i<w;i++) {
putpixel(surface,x+i,y,pixel);
putpixel(surface,x+i,y+h,pixel);
} /* for */
for(i=0;i<=h;i++) {
putpixel(surface,x,y+i,pixel);
putpixel(surface,x+w,y+i,pixel);
} /* for */
} /* rectangle */

105
linapple-pie/src/stretch.h Normal file
View File

@ -0,0 +1,105 @@
#pragma once
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2004 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
/* Auxiallary routines */
/* This a stretch blit implementation based on ideas given to me by
Tomasz Cejner - thanks! :)
April 27, 2000 - Sam Lantinga
*/
/* This isn't ready for general consumption yet - it should be folded
into the general blitting mechanism.
*/
//static unsigned char copy_row[4096];
/* Perform a stretch blit between two surfaces of the same format.
NOTE: This function is not safe to call from multiple threads!
*/
int SDL_SoftStretchMy(SDL_Surface *src, SDL_Rect *srcrect,
SDL_Surface *dst, SDL_Rect *dstrect);
/* SDL_SoftStretchOr - the same as SDL_SoftStretch, but ORed with destination
NOTE: 24bpp does not support -- beom beotiger 2007 November
*/
/* Perform a stretch blit between two surfaces of the same format.
NOTE: This function is not safe to call from multiple threads!
*/
int SDL_SoftStretchOr(SDL_Surface *src, SDL_Rect *srcrect,
SDL_Surface *dst, SDL_Rect *dstrect);
int SDL_SoftStretchMono8(SDL_Surface *src, SDL_Rect *srcrect,
SDL_Surface *dst, SDL_Rect *dstrect, Uint8 brush);
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
// PPC values:
#define AMASK 0xff000000
#define BMASK 0x000000ff
#define GMASK 0x0000ff00
#define RMASK 0x00ff0000
#define AOFFSET 0
#define BOFFSET 3
#define GOFFSET 2
#define ROFFSET 1
#else
// Intel values:
#define AMASK 0xff000000
#define BMASK 0x000000ff
#define GMASK 0x0000ff00
#define RMASK 0x00ff0000
#define AOFFSET 3
#define BOFFSET 0
#define GOFFSET 1
#define ROFFSET 2
#endif
/* ----------------------------------------------------------------*/
/* ---------------------- FONT routines ---------------------------*/
/* ----------------------------------------------------------------*/
#define FONT_SIZE_X 6
#define FONT_SIZE_Y 8
// chars in row in font bitmap
#define CHARS_IN_ROW 45
extern SDL_Surface *font_sfc;
bool fonts_initialization(void);
void fonts_termination(void);
void font_print(int x,int y,const char *text,SDL_Surface *surface, double kx, double ky);
void font_print_right(int x,int y,const char *text,SDL_Surface *surface, double kx, double ky);
void font_print_centered(int x, int y, const char *text, SDL_Surface *surface, double kx, double ky);
///////////////////////////////////////////////////////////////////////////
////// Some auxiliary functions //////////////
///////////////////////////////////////////////////////////////////////////
void surface_fader(SDL_Surface *surface,float r_factor,float g_factor,float b_factor,float a_factor,SDL_Rect *r);
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel);
void rectangle(SDL_Surface *surface, int x, int y, int w, int h, Uint32 pixel);

View File

@ -0,0 +1,253 @@
/****************************************************************************
* *
* wincompat.h -- Basic Windows Type Definitions *
* *
* Copyright (c) 1985-1997, Microsoft Corp. All rights reserved. *
* *
****************************************************************************/
/*
Please note all long types (save for pointers) were replaced by int types
for x64 systems support!
On x32 long type takes 4 bytes, on x64 long type tekes 8 bytes)
-- Krez beotiger
*/
#ifndef _WINDEF_
#define _WINDEF_
#ifdef __cplusplus
extern "C" {
#endif
#ifndef BASETYPES
#define BASETYPES
typedef unsigned /*long*/int ULONG;
typedef ULONG *PULONG;
typedef unsigned short USHORT;
typedef USHORT *PUSHORT;
typedef unsigned char UCHAR;
typedef UCHAR *PUCHAR;
typedef char *PSZ;
#endif /* !BASETYPES */
typedef void *HANDLE;
typedef signed short INT16; // why there was char instead of short? --bb ??????????????????
typedef unsigned short UINT16; // why there was char instead of short? --bb ??????????????????? 0_0
#define __int64 long long
typedef unsigned int UINT32;
typedef unsigned char UINT8;
typedef int INT32;
//#define __stdcall _cdecl
#define MAX_PATH 260
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef IN
#define IN
#endif
#ifndef OUT
#define OUT
#endif
#ifndef OPTIONAL
#define OPTIONAL
#endif
#undef far
#undef near
#undef pascal
#define far
#define near
#if (!defined(_MAC)) && ((_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED))
#define pascal __stdcall
#else
#define pascal
#endif
#undef FAR
#undef NEAR
#define FAR far
#define NEAR near
#ifndef CONST
#define CONST const
#endif
typedef unsigned /*long*/int DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef float FLOAT;
typedef FLOAT *PFLOAT;
typedef BOOL near *PBOOL;
typedef BOOL far *LPBOOL;
typedef BYTE near *PBYTE;
typedef BYTE far *LPBYTE;
typedef int near *PINT;
typedef int far *LPINT;
typedef WORD near *PWORD;
typedef WORD far *LPWORD;
typedef long far *LPLONG;
typedef DWORD near *PDWORD;
typedef DWORD far *LPDWORD;
typedef void far *LPVOID;
typedef CONST void far *LPCVOID;
typedef int INT;
typedef unsigned int UINT;
typedef unsigned int *PUINT;
//#define LPSTR (char*)
#define MAKEWORD(a, b) ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))
#define MAKELONG(a, b) ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))
#define LOWORD(l) ((WORD)(l))
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
#define LOBYTE(w) ((BYTE)(w))
#define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF))
typedef DWORD COLORREF;
typedef DWORD *LPCOLORREF;
////////////////////////// WINNT ///////////////////////////////
#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef /*long*/int LONG;
typedef SHORT *PSHORT;
typedef LONG *PLONG;
#endif
typedef char WCHAR; // wc, 16-bit UNICODE character
typedef WCHAR *PWCHAR;
typedef WCHAR *LPWCH, *PWCH;
typedef CONST WCHAR *LPCWCH, *PCWCH;
typedef WCHAR *NWPSTR;
typedef WCHAR *LPWSTR, *PWSTR;
typedef CONST WCHAR *LPCWSTR, *PCWSTR;
//
// ANSI (Multi-byte Character) types
//
typedef CHAR *PCHAR;
typedef CHAR *LPCH, *PCH;
typedef CONST CHAR *LPCCH, *PCCH;
typedef CHAR *NPSTR;
typedef CHAR *LPSTR, *PSTR;
typedef CONST CHAR *LPCSTR, *PCSTR;
typedef LPWSTR LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR LPCTSTR;
typedef LPWSTR LP;
#ifndef _TCHAR_DEFINED
typedef char TCHAR, *PTCHAR;
typedef unsigned char TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */
////////////////////////////////////////////////////
typedef struct _OVERLAPPED {
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
// TCHAR support
#define __TEXT(quote) quote // r_winnt
#define TEXT(quote) __TEXT(quote) // r_winnt
#define _tcschr strchr
#define _tcscspn strcspn
#define _tcsncat strncat
#define _tcsncpy strncpy
#define _tcspbrk strpbrk
#define _tcsrchr strrchr
#define _tcsspn strspn
#define _tcsstr strstr
#define _tcstok strtok
// not ANSI????
#define _tcsnset strnset
#define _tcsrev strrev
#define _tcsset strset
#define _tcscmp strcmp
#define _tcsicmp stricmp
//#define _tcsnccmp(const char *, const char *, size_t);
#define _tcsncmp strncmp
//#define _tcsncicmp(const char *, const char *, size_t);
#define _tcsnicmp strnicmp
// #define _tcscoll(const char *, const char *);
// #define _tcsicoll(const char *, const char *);
// #define _tcsnccoll(const char *, const char *, size_t);
// #define _tcsncoll(const char *, const char *, size_t);
// #define _tcsncicoll(const char *, const char *, size_t);
// #define _tcsnicoll(const char *, const char *, size_t);
/* Note that _mbscat, _mbscpy and _mbsdup are functionally equivalent to
strcat, strcpy and strdup, respectively. */
#define _tcscat strcat
#define _tcscpy strcpy
#define _tcsdup strdup
#define _tcslen strlen
#define _tcsxfrm strxfrm
#define MoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
#define FillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
#define EqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))
#define CopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
#define ZeroMemory(Destination,Length) memset((Destination),0,(Length))
#define GetTickCount SDL_GetTicks
#define _ASSERT assert
#ifdef __cplusplus
}
#endif
#endif /* _WINDEF_ */

View File

@ -0,0 +1,78 @@
/*
* Wrappers for some common Microsoft file and memory functions used in AppleWin
* by beom beotiger, Nov 2007AD
*/
#include "wwrapper.h"
DWORD SetFilePointer(HANDLE hFile,
LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod) {
/* ummm,fseek in Russian */
fseek((FILE*)hFile, lDistanceToMove, dwMoveMethod);
return ftell((FILE*)hFile);
}
BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) {
/* read something from file */
DWORD bytesread = fread(lpBuffer, 1, nNumberOfBytesToRead, (FILE*)hFile);
*lpNumberOfBytesRead = bytesread;
return (nNumberOfBytesToRead == bytesread);
}
BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) {
/* write something to file */
DWORD byteswritten = fwrite(lpBuffer, 1, nNumberOfBytesToWrite, (FILE*)hFile);
*lpNumberOfBytesWritten = byteswritten;
return (nNumberOfBytesToWrite == byteswritten);
}
/* close handle whatever it has been .... hmmmmm. I just love Microsoft! */
BOOL CloseHandle(HANDLE hObject) {
return(!fclose((FILE*) hObject));
}
BOOL DeleteFile(LPCTSTR lpFileName) {
if(remove(lpFileName) == 0) return TRUE;
else return FALSE;
}
DWORD GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) {
/* what is the size of the specified file??? Hmmm, really I donna. ^_^ */
long lcurset = ftell((FILE*)hFile); // remember current file position
fseek((FILE*)hFile, 0, FILE_END); // go to the end of file
DWORD lfilesize = ftell((FILE*)hFile); // that is the real size of file, isn't it??
fseek((FILE*)hFile, lcurset, FILE_BEGIN); // let the file position be the same as before
return lfilesize;
}
LPVOID VirtualAlloc(LPVOID lpAddress, size_t dwSize,
DWORD flAllocationType, DWORD flProtect) {
/* just malloc and alles? 0_0 */
void* mymemory;
mymemory = malloc(dwSize);
if(flAllocationType & 0x1000) ZeroMemory(mymemory, dwSize); // original VirtualAlloc does this (if..)
return mymemory;
}
BOOL VirtualFree(LPVOID lpAddress, size_t dwSize,
DWORD dwFreeType) {
free(lpAddress);
return TRUE;
}
// make all chars in buffer lowercase
DWORD CharLowerBuff(LPTSTR lpsz, DWORD cchLength)
{
// char *s;
if (lpsz)
for (lpsz; *lpsz; lpsz++)
*lpsz = tolower(*lpsz);
return 1;
}

View File

@ -0,0 +1,51 @@
#include "wincompat.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define FILE_BEGIN SEEK_SET
#define FILE_CURRENT SEEK_CUR
#define FILE_END SEEK_END
#define INVALID_HANDLE_VALUE NULL
#define MEM_COMMIT 0x1000
#define PAGE_READWRITE 0
#define MEM_RELEASE 0
DWORD SetFilePointer(HANDLE hFile,
LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod);
BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
/* close handle whatever it has been .... hmmmmm. I just love Microsoft! */
BOOL CloseHandle(HANDLE hObject);
BOOL DeleteFile(LPCTSTR lpFileName);
DWORD GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
LPVOID VirtualAlloc(LPVOID lpAddress, size_t dwSize,
DWORD flAllocationType, DWORD flProtect);
BOOL VirtualFree(LPVOID lpAddress, size_t dwSize, DWORD dwFreeType);
static inline bool IsCharLower(char ch) {
return isascii(ch) && islower(ch);
}
static inline bool IsCharUpper(char ch) {
return isascii(ch) && isupper(ch);
}
DWORD CharLowerBuff(LPTSTR lpsz, DWORD cchLength);