pax_global_header00006660000000000000000000000064147551157050014524gustar00rootroot0000000000000052 comment=245eec5f588a760838d28664a00cd0677ab120c1 tworld-2.3.0/000077500000000000000000000000001475511570500130415ustar00rootroot00000000000000tworld-2.3.0/.github/000077500000000000000000000000001475511570500144015ustar00rootroot00000000000000tworld-2.3.0/.github/workflows/000077500000000000000000000000001475511570500164365ustar00rootroot00000000000000tworld-2.3.0/.github/workflows/ubuntu-ci.yml000066400000000000000000000030411475511570500210720ustar00rootroot00000000000000name: Ubuntu-CI on: [push, pull_request] jobs: build-qt6: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install QT6 run: | sudo apt-get -y update sudo apt-get -y install cmake libsdl2-dev build-essential libgl1-mesa-dev qt6-base-dev - name: Build tworld2 (Qt6) run: | mkdir build-qt6 && cd build-qt6 cmake -DCMAKE_BUILD_TYPE=Debug -DOSHW=qt \ -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/dist-qt6 .. make -j4 && make install build-qt5: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install QT5 run: | sudo apt-get -y update sudo apt-get -y install cmake libsdl2-dev qtbase5-dev - name: Build tworld2 (Qt5) run: | mkdir build-qt5 && cd build-qt5 cmake -DCMAKE_BUILD_TYPE=Debug -DOSHW=qt \ -DCMAKE_PREFIX_PATH=/usr/local/ \ -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/dist-qt5 .. make -j4 && make install build-sdl1: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install SDL1 run: | sudo apt-get -y update sudo apt-get -y install libsdl1.2-dev cmake - name: Build tworld (SDL) run: | mkdir build-sdl && cd build-sdl cmake -DCMAKE_BUILD_TYPE=Debug -DOSHW=sdl \ -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/dist-sdl .. make -j4 && make installtworld-2.3.0/.gitignore000066400000000000000000000001031475511570500150230ustar00rootroot00000000000000*.o *.a *.exe /comptime.h /oshw-qt/ui_*.h /oshw-qt/moc_*.cpp /buildtworld-2.3.0/BUGS000066400000000000000000000052351475511570500135310ustar00rootroot00000000000000Contents * Bugs in the MS game logic emulation * Bugs in the Lynx game logic emulation * Other bugs and misfeatures ___________________________________________________________________________ Bugs in the MS game logic emulation * There are numerous situations in the MS game that cause a moused goal to be cancelled for which TW will keep trying. A clearer understanding of those situations is needed. * The MS game checks for input more than once per tick. Probably this was done to catch last-minute keyboard events, but it has the effect that by having more than one input event in the queue, Chip can, under certain circumstances, have the latter keystroke processed after he has moved but before any other creatures move. * In TW, the keyboard is scanned twice per tick, once at the beginning and once in the middle. As a result, if Chip makes a move at the beginning of a tick, the game does not update the display twice in a row (once after the creatures move and once after Chip moves), but just does it once. I do not believe that this optimization has a real effect on the gameplay. It does, however, make it easier to examine the screen when pushing against a force floor. * There are a number of miscellaneous emulation bugs, mostly involving "illegal" tile combinations. These are documented more thoroughly in the msbugs.txt file on the website. ___________________________________________________________________________ Bugs in the Lynx game logic emulation * Under the real Lynx game it is possible to push a block diagonally without moving at all. This is done by pushing against a wall, and then pushing diagonally against a neighboring block very briefly. The block will get pushed, but Chip doesn't follow. This is impossible to do in TW. * Under the real Lynx game it is possible, with carefully constructed circumstances, for Chip to push a block away from him as it's heading towards him. That is, a block starts moving into the square that Chip occupies, but in the same frame, Chip starts pushing the block in the opposite direction. This is impossible to do in TW. * There are a number of miscellaneous emulation bugs, mostly involving Chip being stuck on teleports. These are documented more thoroughly in the lxbugs.txt file on the website. ___________________________________________________________________________ Other bugs and misfeatures * TW ignores field 8 entries in the .dat file unless they are exactly five bytes long. In this case, it simply ignores the field 6 password. The MS game will remember both passwords and allow either one to be used (although if both are present it will only show the field 8 password). tworld-2.3.0/CMakeLists.txt000066400000000000000000000126731475511570500156120ustar00rootroot00000000000000# CMake build system for Tile World 2 # # Copyright (C) 2020 by Michael Hansen, under the GNU General Public # License. No warranty. See COPYING for details. cmake_minimum_required(VERSION 3.20) project(tworld) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) set(OSHW "qt" CACHE STRING "OS/HW Flavor to build (sdl or qt)") set_property(CACHE OSHW PROPERTY STRINGS qt sdl) if(OSHW STREQUAL "qt") set(TWORLD_EXE "tworld2") elseif(OSHW STREQUAL "sdl") set(TWORLD_EXE "tworld") else() message(FATAL_ERROR "${OSHW} is not a valid OSHW setting") endif() if(OSHW STREQUAL "sdl") find_package(SDL REQUIRED) endif() if(OSHW STREQUAL "qt") set(CMAKE_AUTOUIC TRUE) set(CMAKE_AUTOMOC TRUE) set(CMAKE_AUTORCC TRUE) # We use SDL2 for the Qt build for audio. find_package(SDL2 REQUIRED) find_package(Qt6 COMPONENTS Core Gui Widgets Xml) if(NOT Qt6_FOUND) find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets Xml) if(Qt5_FOUND AND NOT TARGET Qt::Core) # The version-generic targets were only added in Qt 5.15 add_library(Qt::Core INTERFACE IMPORTED) set_target_properties(Qt::Core PROPERTIES INTERFACE_LINK_LIBRARIES "Qt5::Core") add_library(Qt::Gui INTERFACE IMPORTED) set_target_properties(Qt::Gui PROPERTIES INTERFACE_LINK_LIBRARIES "Qt5::Gui") add_library(Qt::Widgets INTERFACE IMPORTED) set_target_properties(Qt::Widgets PROPERTIES INTERFACE_LINK_LIBRARIES "Qt5::Widgets") add_library(Qt::Xml INTERFACE IMPORTED) set_target_properties(Qt::Xml PROPERTIES INTERFACE_LINK_LIBRARIES "Qt5::Xml") endif() endif() add_definitions(-DTWPLUSPLUS) endif() file(GLOB TW_SETS "${CMAKE_CURRENT_SOURCE_DIR}/sets/*.dac") file(GLOB TW_DATA "${CMAKE_CURRENT_SOURCE_DIR}/data/*.dat" "${CMAKE_CURRENT_SOURCE_DIR}/data/*.ccx") file(GLOB TW_RES "${CMAKE_CURRENT_SOURCE_DIR}/res/rc" "${CMAKE_CURRENT_SOURCE_DIR}/res/*.bmp" "${CMAKE_CURRENT_SOURCE_DIR}/res/*.txt" "${CMAKE_CURRENT_SOURCE_DIR}/res/*.wav") file(GLOB TW_MAN6 "${CMAKE_CURRENT_SOURCE_DIR}/docs/*.6") file(GLOB TW_CCLP_DOCS "${CMAKE_CURRENT_SOURCE_DIR}/docs/CCLP*") if(WIN32) file(GLOB TW_DOCS "${CMAKE_CURRENT_SOURCE_DIR}/docs/*.html") install(FILES ${TW_SETS} DESTINATION "${CMAKE_INSTALL_PREFIX}/sets") install(FILES ${TW_DATA} DESTINATION "${CMAKE_INSTALL_PREFIX}/data") install(FILES ${TW_RES} DESTINATION "${CMAKE_INSTALL_PREFIX}/res") install(FILES ${TW_DOCS} DESTINATION "${CMAKE_INSTALL_PREFIX}/docs") install(DIRECTORY ${TW_CCLP_DOCS} DESTINATION "${CMAKE_INSTALL_PREFIX}/docs") else() set(SHARE_DIR "${CMAKE_INSTALL_PREFIX}/share/tworld" CACHE STRING "Directory for shared files") add_definitions(-Dstricmp=strcasecmp) if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") add_definitions(-DROOTDIR="${SHARE_DIR}") else() add_definitions(-DSAVEDIR="./save") endif() install(FILES ${TW_SETS} DESTINATION "${SHARE_DIR}/sets") install(FILES ${TW_DATA} DESTINATION "${SHARE_DIR}/data") install(FILES ${TW_RES} DESTINATION "${SHARE_DIR}/res") install(FILES ${TW_MAN6} DESTINATION "${CMAKE_INSTALL_PREFIX}/man/man6") install(DIRECTORY ${TW_CCLP_DOCS} DESTINATION "${SHARE_DIR}/docs") endif() add_subdirectory(oshw-${OSHW}) add_executable(${TWORLD_EXE} WIN32 MACOSX_BUNDLE tworld.c) target_sources(${TWORLD_EXE} PRIVATE cmdline.h cmdline.c comptime.h defs.h encoding.h encoding.c err.h err.c fileio.h fileio.c gen.h help.h help.c logic.h lxlogic.c messages.h messages.cpp mslogic.c oshw.h play.h play.c random.h random.c res.h res.c score.h score.cpp series.h series.c settings.h settings.cpp solution.h solution.c state.h unslist.h unslist.c ver.h ) if(WIN32) target_sources(${TWORLD_EXE} PRIVATE ${TWORLD_EXE}.rc) endif() if(OSHW STREQUAL "qt") target_sources(${TWORLD_EXE} PRIVATE tworld2.qrc) endif() target_link_libraries(${TWORLD_EXE} PRIVATE oshw-${OSHW}) if(WIN32) target_link_libraries(${TWORLD_EXE} PRIVATE $<$:-mconsole>) endif() if(OSHW STREQUAL "qt") target_link_libraries(${TWORLD_EXE} PRIVATE SDL2::SDL2) endif() # Generate the current compile time if(WIN32) # TODO: It would be nice to use the format below on Win32 as well... file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/comptime.bat" "echo #define COMPILE_TIME \"%DATE% %TIME%\" > comptime.h") add_custom_command( OUTPUT comptime.h COMMAND comptime.bat ) else() file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/comptime.sh" "echo \"#define COMPILE_TIME \\\"`date '+%Y %b %e %T %Z'`\\\"\" > comptime.h") add_custom_command( OUTPUT comptime.h COMMAND /bin/sh comptime.sh ) endif() set_property(SOURCE comptime.h PROPERTY SKIP_AUTOGEN ON) target_include_directories(${TWORLD_EXE} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") if(WIN32 OR APPLE) install(TARGETS ${TWORLD_EXE} RUNTIME DESTINATION . BUNDLE DESTINATION . ) else() install(TARGETS ${TWORLD_EXE} RUNTIME DESTINATION bin) endif() add_executable(mklynxcc EXCLUDE_FROM_ALL mklynxcc.c) tworld-2.3.0/COPYING000066400000000000000000000430701475511570500141000ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. tworld-2.3.0/Changelog000066400000000000000000000541271475511570500146640ustar00rootroot000000000000002024 Aug 25: version 2.3.0 (by Michael Hansen (Zrax), ChosenID, David Stolp (pieguy), A Sickly Silver Moon, G lander, and Eevee) * Tile World is now built with Qt5 or 6 instead of 4, and with SDL2 instead of 1. * Level author info is additionally read from DAT field 9, if available. * On macOS, the main window now regains focus after closing dialogs. * Repository now contains CCLPs 1 through 5 with documentation. * Pedantic Lynx emulates Block Kicking. * Batch verify no longer segfaults, and allows verifying solutions for different sets. * MS logic now emulates many previously MS-only glitches. 2017 Jul 12: version 2.2.0 (by Eric Schmidt) * Display levelsets and ruleset toggle instead of .dac files; automatically generate "missing" .dac files. * Menu option to copy best times to clipboard. * Menu option to toggle showing the timer on untimed levels. * During solution playback, press D to display the stepping and initial * random force floor direction. * Allow more keys to work when game is paused. * Allow seeking to work even before solution playback starts. * During solution playback, press E to advance a tick and Shift-E to advance a move. * New Help->About menu option. * New Help->Keys menu option. * The data directory is now a search directory for files referenced by .ccx files. This allows including images in level prologues and epilogues, using the tag. 2015 Dec 26: version 2.1.1 (by Eric Schmidt) * The game no longer crashes when starting with a set specified on the commandline or when only a single set is available. * Implemented all the changes to the MS and Lynx logic listed under the Changelog for versions 1.3.1 and and 1.3.2 that were not already implemented. * (Lynx logic) Chip can no longer change direction when stuck inside a teleport. This change also prevents Chip's location wrongly being considered adjacent to the teleport. * In Lynx pedantic mode, creatures can interact with various things they start on. This includes creatures on popup walls causing walls to appear under Chip. It does not include the correct behavior for teleports or for Chip on a clone machine. * In Lynx pedantic mode, Chip starting on ice is stuck, and blocks starting on ice do not move automatically. 2014 Mar 26: version 2.1.0 (by Eric Schmidt, with contributions from Madhav Shanbhag) * Main window layout changed; in particular, passwords are visible. * Fixed Lynx toggle wall bug: if a level stopped running the instant a toggle button was pressed, the walls would toggle the next time play started. * When selecting a level set, the game now tries to start on the level the player left off from, rather than the earliest unsolved level. * MS mouse emulation bug fixed. (report and fix from David Stolp) * Some "stuck key" problems fixed, such as Alt-Tab on Windows 7. * The fileio.c patch, which fixes a .tws corruption problem on 64-bit Linux, has been applied. * Added the ability to disable the display of CCX text when visiting or completing a level. * Added ability to view CCX text via menu options. * Messages displayed when winning, dying, or running out of time are now customizable via external file. * When playback of the solution to the last level in the set finishes, the congratulatory message box wouldn't appear. Now it does. * In Lynx mode, it is now possible to select the starting direction for the "random" force floors, by using the "f" key. * Added settings file. There are currently two settings: (i) whether to display CCX text, and (ii) sound volume. * Debug/cheat keys completely disabled for releases. * In pedantic Lynx mode, when an entity attempts to leave the map, rather than play being halted, a warning is printed on stderr, and play continues as in non-pedantic mode. * "Goto" menu item renamed "Enter Password", and greyed out during play. (Before, it could be selected, but it would not do anything.) * Miscellaneous code changes not visible to users, to eliminate compiler warnings and for other reasons. 2010 Dec 22: version 2.0.0 (by Madhav Shanbhag) * First public release of Tile World 2 featuring numerous improvements. 2006 Apr 17: version 1.3.0 * Added mouse handling to the code. That includes modifying the SDL code to handle mouse activity, adding a large set of new commands, making it possible for Chip to move towards a goal over several ticks, and modifying the action struct (and the solution file) to permit storing the new moves in solutions. * Added the database of unsolvable levels, which warns users before they play a level known to be unsolvable, and automatically gives them the password to the next level. * Added the solution file display, allowing the user to manage multiple solution files for a single level set. * Changed code to accept a solution file as the sole cmdline argument, if the solution file contains the set name. Hopefully this, and the previous addition, will make it easier for people to share solution files. * Added the batch-mode verification feature, to check the existing solutions without initializing the GUI subsystem. * Fixed the old emulation bug (MS logic) involving Chip turning a cloned block into a clone of himself while going through a teleport. * Fixed the bug (MS logic) preventing Chip from pushing a slipping block parallel to its slipping direction when the push happens through a teleport. * Improved the emulation of several creatures teleporting simultaneously (Lynx logic), with assistance from ccexplore. * Minor improvements to the Lynx pedantic mode. * Fixed the password input routine. (It was completely broken; not sure when that happened.) * Rewrote the code so that level data and solutions are kept compressed in memory, and expanded only when needed, instead of decoding entire files when read. This change makes for a small reduction in memory usage, and reduces the overall level of useless work being done. * Added code to shutter the map view when MS gameplay is paused. * Numerous minor tweaks to the code, the display, and the documentation. 2006 Feb 24: version 1.2.2 * Finally got the handling of brown buttons (MS logic) working correctly. It's been a long time coming, and it's all so simple in hindsight. * Added code to grok the new solution file format. This version of Tile World will continue to use the old solution file format, but if it encounters a file in the new format, it will handle it correctly. * Added the ability to specify a solution file by name on the command-line. * Added -P option for Lynx pedantic mode. * Added the Shift-Ctrl-X feature to permanently delete solutions. * Fixed bugs in Shift-Tab feature, and formally documented this feature. * Fixed bug in the stepping UI. * Fixed bug reported by Thomas Harte, where an international keyboard generating a non-Latin-1 character could cause TW to segfault. * Fixed bug reported by Catatonic Porpoise, where SDL was being asked to blit to a locked surface. * Fixed a segfault in MS logic reported by Evan Dummit (occurring when a cloner's creature in the northwest corner is replaced by Chip). * Added casts to avoid new warnings in gcc 4. * Fixed a few other minor MS emulation bugs reported by Evan Dummit. * Added a number of unfixed MS emulation bugs to msbugs.txt, several of which were reported by Evan Dummit. * A handful of documentation errors were also found and fixed. 2004 Oct 21: version 1.2.1 * Introduced a basic stepping-control UI, and added stepping information to the solution file format. * Fixed a bug (MS logic) reported by David Stolp, involving blocks going out and back into the slip list so quickly that they weren't sent to the end of the list. * Fixed a bug (MS logic) reported by David Stolp where block and creatures were not moving into key tiles if the bottom tile prevented it (e.g. a wall). * Fixed a bug in sdltext.c, reported by Dale Bryan caused a segfault in 16-bit color mode. * Added -r (read-only) cmdline option. 2004 Oct 04: version 1.2.0 * Fixed a bug (MS logic) preventing cloned tanks from turning around when they hadn't yet left the clone machine. * Fixed another longstanding bug (MS logic) involving a tank indirectly pushing a blue button. Again, the bug was fixed explicitly instead of trying to make the behavior arise naturally from the code. * Improved some of the behavior of blocks being pushed (Lynx logic). * Improved some of the behavior of blocked teleports (Lynx logic). * Altered animations to run for either 11 or 12 frames, depending on the parity of their initial frame, as discovered by ccexplore. (This finally killed the nine-lived clone-boosting bug in ICEHOUSE!) Also modified the point during the frame when animations get removed. * Changed the Lynx walker to use a PRNG equivalent to the original, as worked out by ccexplore. * Fixed bug (MS logic) in how a block is removed from the slip list when being pushed by Chip (reported by Shmuel Siegel). * Fixed bug (MS logic) with deferred button presses; TW was incorrectly deferring Chip's button presses and not just those caused by block pushing. * Fixed a horrid bug when encountering bogus values in a dat file. (The code was meant to gracefully ignore the broken level and continue reading the next level, but it failed to move the file position out of the broken level before doing so.) * Fixed keyboard routines so that they now understand characters as well as keystrokes (thus e.g. the program recognizes "?" when entered on a European keyboard). * Added a help screen for the initial file menu. * A few other minor bug fixes and miscellaneous improvements. 2003 Mar 15: version 1.1.3 * Put the display code through another significant rewrite. This time, the rewrite seems to have succeeded in improving speeds, at all pixel depths. Instead of hand-rolled arrays and functions, the new code uses SDL surfaces and blits throughout. Tiles are stored in the screen's pixel format whenever possible, and alpha channels are used to handle transparency. * Fixed longstanding bug (MS logic) involving Chip pushing a block off of another block via a teleport. (Wasn't hard to fix -- just required some nose-holding.) * Added new fractional time display (using -t) for MS. It's still imperfect, but it doesn't hurt to make the feature available. * Added -f switch to get fullscreen mode (change requested by Philippe Brochard). 2003 Mar 08: version 1.1.2 * Added frame-skipping code, so that gameplay doesn't slow down on slower hardware. * Blocks on beartraps were getting default initial direction of nil (Lynx logic). Default changed to north. (Reported by ccexplore.) * Fixed broken handling (Lynx logic) of creatures that start out on ice (reported by ccexplore). * Fixed bug where tanks could be turned around while sliding (Lynx logic). * It is now possible to finish a level with exactly zero seconds left (Lynx logic). * Improved fixlynx feature to also fix the maps for levels 121 and 127. * Reorganized logic code to use fewer static variables. 2003 Mar 01: version 1.1.1 * Fixed broken handling (MS logic) of tanks not stopping in traps, and the fact that tanks on clone machines can sometimes turn around (reported by ccexplore). * Attempted to fix controller bug, where a controller being added to the slip list sets the controller direction according to its slipping direction rather than its visible direction (reported by ccexplore). Hopefully fixing this hasn't broken anything else. 2003 Feb 22: version 1.1 * Fixed most of the broken handling of controllers (MS logic). * Added guards against bad data in encoded maps. * Added -a cmdline switch to help improve sound. * Removed unintentional trigraphs from source. * Added missing initialization of PRNGs. * New images for the chip and the socket -- and, finally, a real icon (courtesy of Anders Kaseorg). * Upgraded the Windows copy of SDL to 1.2.5a. 2002 May 06: version 1.0 * Added "(paused)" message when game is paused. * Minor bugfix in behavior when the creature count maxes out (Lynx). * Added intro-ms.dat and intro-lynx.dat. * Fleshed out the README file. * First official release to the general public. 2002 Apr 06: version 0.10.6 * Fixed off-by-one timing bug (MS logic) when last move of a level is involuntary (discovered by Anders Kaseorg). * Changed pause button to work as a toggle (i.e., no other keys will exit pause mode), as requested by Hallgeir Fl. 2002 Feb 25: version 0.10.5 * Amended the Lynx ruleset to follow the button-wiring lists in the dat file, instead of using the original Lynx method of implicit wiring. * Fixed uninitialized variable in password-entry function (reported by Ruben Spaans). * Fixed moving-block behavior so that they will always enter a square that Chip occupies, regardless of what Chip is standing on (MS). * Fixed force-floor behavior so that Chip gets to make a voluntary move immediately after stepping on a force floor if his forced move failed. (Hopefully this is an accurate coverage of the case that TW was getting wrong, and only of that.) 2002 Feb 04: version 0.10.4 * Separated out the two kinds of splashes. * Fixed changing level by password (broken in 0.10.3; reported by Hallgeir Fl). * Fixed a couple of bugs in handling invalid levels under Lynx (reported by Chuck Sommerville). * Fixed several minor bugs (including several reported by Anders Kaseorg). * Began a final code cleanup pass. Improved the comments in most of the source. * More documentation changes, including a new README. 2002 Jan 28: version 0.10.3 * Added "Melinda" feature. * Reformatted documentation, so man and html versions come from a single source. 2002 Jan 20: version 0.10.2 * Auto-deprecate saved games that are broken. * Added some more protection against Ctrl-Ms in text files. * Fix for die-if-no-soundcard bug (reported by Bill Darrah). * Added resources entries for changing the color scheme. * Added hackish "fixlynx" keyword. * New: first draft of some real documentation. 2002 Jan 13: version 0.10.1 * Fixed the bug in the lynx emulation where Chip survived when he shouldn't, using a gross little hack. I hate it. But I've been sitting on this bug for over a month now. It's time to give up and put it out of its misery. * Fixed the Lynx clock (it was off by one). * Added a simple end-screen to display when the player finishes the last level of a set. * Added a little more error-checking in the map decoding. * Added some basic documentation. 2002 Jan 03: version 0.10.0 * Vastly improved the Lynx emulation of "diagonal" moves. Had to change the save file format (again!!) so that diagonal moves could be properly stored. * Added a volume control. * Fixed bug in Lynx logic that prevented Chip from standing still on the very first frame when starting on a force floor. * Fixes for a few other random things. 2002 Jan 01: version 0.9.3 * Added a proper Chip-dies sequence to the Lynx emulation. Also removed redundant "dirt splash" sequence. * A rough attempt at handling "diagonal" moves in Lynx emulation has been put in place. 2001 Dec 27: version 0.9.2 * A couple more memory leaks fixed (these inside of SDL). * New tile bitmap format, which permits the use of animated tiles. * A couple of stupid crashes that slipped into the previous version have been repaired. * Miscellaneous other tweaks. 2001 Dec 07: version 0.9.1 * Added the ability to return to the initial file display. At last! * Full-scale assault on the code to weed out memory leaks. (In my defense, the majority of them technically weren't leaks before the prior change was implemented.) * Added -t option (unfortunately it's not as useful as I'd hoped it would be). * Fixed segfault when trying to play back solution on an unsolved level. * Improved the onomatopoeia display. * Reorganized the online help. 2001 Dec 03: version 0.9.0 * Found and fixed the obscure slide delay bug that was causing the discrepancy in Eric Schmidt's level 29 ("PARAMECIA")! * Threw out all the text-drawing code and replaced it with routines that deal in proportional fonts. Which naturally necessitated rewriting a bunch of the code that displayed text. Lots of changes. Created an abstract table "object", so that my tables could be realized either on the text console or in a proportional font equally well. * Implemented sound! Spent an entire weekend making 25 wave files -- and they still sound ridiculous. (But the fact that the game finally has sound is nice.) Onomatopoeia is still available via a cmdline switch. * Added password-checking code, plus functions to allow the user to jump to a level by entering a password. * Changed the save file format (again!) to store password information, and to be a little smaller. * Added the configuration file feature, with a few configuration options. This necessitated adding yet another directory, and once again moving the old one. * Various bug fixes that I've forgotten about while working on all the other things. 2001 Nov 14: version 0.8.4 * Rewrote a lot of the display code to avoid redundant drawing of areas of the screen. Didn't really make it faster, but I did make it more to my liking. Also rewrote all of the text display code. * Removed gamestate data that was only needed by one of the logic modules and made it private to that module. * Fixed bug found by Mike L. regarding the ordering of clones (MS). * Fixed bug regarding Chip trying to move on random force floors (MS). * Added code to indicate when Chip is pushing (Lynx). 2001 Nov 10: version 0.8.3 * MS logic bug fix (clone machine would get stuck if clone died while exiting). * Mixed improvement of display code. (The really cool revamping of the display code wound out performing horribly on 24-bit displays, and so had to be tossed out.) 2001 Nov 08: version 0.8.2 * Found problem with teleports (MS): creatures provide their own teleport blockage! Fixed. * Careful investigation revealed more timing bugs with buttons, teleports, and maybe beartraps as well (MS). Rewrote the endmovement() function until everything was being done in the right order. * Added an "rc" file which can be edited to change the filenames of the external resources. * Discovered and fixed a discrepancy in the slide delay (MS). * The usual sundry tweaks. 2001 Oct 29: version 0.8.1 * Fixed bug introduced in 0.7.2, correctly this time. * Fixed intermittent memory corruption caused by an uninitialized stack variable. 2001 Oct 28: version 0.8.0 * Fixed bug introduced in 0.7.2 which caused Chip to "come to rest" when he couldn't make a forced move (MS). * Fixed buried beartrap behavior in MS game logic. * Altered the solution file format (been wanting to do that for a long time). * Gave the program an icon (a temporary one, until I can get someone to make me a real icon). 2001 Oct 23: version 0.7.2 * Fixed two bugs in MS game logic discovered by Anders Kaseorg (creatures entering random slide floors, and Chip causing slide delay). * Rewrote the clone machine code to better match the internals of the MS game (thanks to recent discoveries). Also fixed the red-button logic so that clones do not block their own clone machines. 2001 Oct 22: version 0.7.1 * Fixed bug in MS game logic found by Anders Kaseorg (button not recognized when hit by a block being pushed by Chip while on the slip list). 2001 Oct 21: version 0.7.0 * Altered handling of the slip list in the MS game logic. Creatures on the slip list now have their slip direction stored separately from their pointed direction, and the former is determined at the time they enter a tile, instead of just before moving off of it. * My first serious attempt at implementing slide delay! * Many little tweaks to the MS logic. I think it's getting close.... * The tile images are no longer compiled into the binary; instead they are loaded out of an external bitmap file. The rendering code was changed to use 32-bit images internally instead of 8-bit images, so that all types of bitmaps can be accepted. * Added a new shared subdirectory for holding the data files; the main shared directory is now used to hold images. * Altered the onomatopoeia code to ease future introduction of sound. * Fixed the Lynx bug regarding the bequeathing of a slide token, or rather the lack thereof, when Chip is at a force-floor dead end. 2001 Oct 05: version 0.6.0 * Rewrote several fundamentals of the MS game logic, in order to bring it more in line with MS's layered map, as well as its treatment of blocks as non-creatures. * Made some general changes to the game internals in order to accommodate the above changes. * Many tweaks and improvements to the MS game logic. * Added the Ctrl-X feature to permit replacement of saved games -- something I should have added a long time ago. 2001 Aug 27: version 0.5.1 * Made some changes in the game-saving code to avoid an infinite loop that was sometimes happening under Windows. * Fixed two bugs in MS game logic identified by Anders Kaseorg. (1. Chip can only attempt to move once per tick -- a failed move still counts. 2. Creatures moving onto the slide list make their first slide move in the same tick.) 2001 Aug 19: version 0.5 * First alpha version. * The SVGAlib layer has been replaced with a much more complete layer for SDL. The program can now be compiled for either X or MS Windows. (All hail SDL and gcc's cross-compiling capabilities!) SDL also works under SVGAlib, but it looks terrible on my hardware. * A version of the game logic implementing the MS ruleset (with lots of bugs) has been added. The program can now switch between the two rulesets. * I ripped the entire code base apart and put it back together again (except for the parts that were thrown out). The code is somewhat better organized now. * Code was added to select data files, display scores, and lots of little things all over the place. * Comments! They're still pretty skeletal, but they're better than what was there before. 2001 Jul 15: version 0.1 * The previous game logic has been replaced with a complete game logic module for the Lynx ruleset. * The SVGAlib layer has been heavily rewritten to do raw keyboard polling and smooth-scrolling. * Lots of other changes and bug fixes. 2001 May 19: version 0.0 * First limited public release. * Most of the basic infrastructure is in place, including a working draft of a game logic module. tworld-2.3.0/README.md000066400000000000000000000153051475511570500143240ustar00rootroot00000000000000# Tile World Tile World is an emulation of the game "Chip's Challenge" for the Atari Lynx, created by Chuck Sommerville, and later ported to MS Windows by Microsoft (among other ports). ## Important Note Tile World is an emulation of the "Chip's Challenge" game engines only. It does not come with the CHIPS.dat file that contains the original level set. That file, which is copyrighted and cannot be freely distributed, was originally distributed with the MS version of "Chip's Challenge". If you have a copy of this version of the game, you can use that file to play the original games in Tile World. If you do not have a copy of this file, however, you can still play Tile World with the many freely available level files created by fans of the original game. ## Getting Tile World ### Prebuilt (Windows) Extract the contents of the release archive into its own folder, eg. `C:\Users\you\Documents\tworld`. If you have a copy of CHIPS.dat, copy it into `data` subfolder. This will let you play the original Chip's Challenge levelset. If you have any other levelset (.dat) files you would like to play in Tile World, copy those to the `data` subfolder also. All sets in that folder should appear in the main menu. To run the game, execute `tworld.exe` in the main Tile World directory, or make a shortcut for it. ### Building (Linux/Windows/macOS) Before building, ensure you have CMake, a C compiler, the SDL2 and Qt5/6 libraries (with developement support). Build Tile World as a usual CMake program using the following commands: ```sh mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Relase .. cmake --build . ``` Running `make install` (as root) will install a `tworld2` binary and all the necessary resources. On Unix-like systems, addings sets or changing any resources, unfortunately, requires root permission, as those are placed in `/usr/local/share/tworld`. This may be changed in a future release. ## Levelsets As mentioned above, Tile World does not come with the original "Chip's Challenge" levels for copyright reasons. If you do have a copy of the original game, copy the CHIPS.dat file into the `data` folder to play it. This distribution/repository comes with six levelsets: intro, CCLP1, CCLP2, CCLP3, CCLP4, CCLP5. "intro" is a short introduction to the elements of the game. CCLPs (Chip's Challenge Level Packs) 1 through 5 are sets put together by the community, containing levels voted on by fans. CCLP1 is meant as a replacement for CHIPS.dat, while the others are considerably harder than the original set. Other user-made sets can be found on https://sets.bitbusters.club. ## Making levels New levels for Tile World can be made using level editors. The two most popular editors are CCEdit (part of [CCTools](https://cctools.zrax.net/)), and [CCCreator](https://cccreator.bitbusters.club/). ## Resources The community scoreboard for the original game and the CCLPs can be found on https://scores.bitbusters.club. Most of the community resources can be found on https://bitbusters.club, including the [community Discord server](https://discord.gg/Xd4dUY9), the [Chip Wiki](https://wiki.bitbusters.club), the [Yahoo Groups archive](https://bitbusters.club/yahoo), and levelsets, editors, and emulators for the sequel, Chip's Challenge 2. Optimized TWS solutions for CC1 and CCLPs can be found at https://davidstolp.com/old/chips/tws/. A list of ports of Tile World to various can be found at https://wiki.bitbusters.club/Tile_World#Ports. The original Tile World 1 homepage is at http://muppetlabs.com/~breadbox/software/tworld. The source code repository for the latest fork can be found at https://github.com/SicklySilverMoon/tworld. The Tile World 2 homepage is at https://tw2.bitbusters.club. ## License Tile World is copyright (C) 2001-2024 by Brian Raiter, Madhav Shanbhag, and Eric Schmidt. 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, included in this distribution in the file COPYING, for more details. ## Bugs Bug reports are always appreciated and can be submitted via GitHub Issues at https://github.com/SicklySilverMoon/tworld/issues/new. The list of known bugs can be found in the BUGS file in the source repository. ## Credits Tile World was written by Brian Raiter. Tile World 2 - which simply improves upon the user interface of the original Tile World program - was developed by Madhav Shanbhag. Version 2.1 was produced by Eric Schmidt. Version 2.3 was produced by Michael Hansen (Zrax), ChosenID, David Stolp (pieguy), A Sickly Silver Moon, G lander, and Eevee. The sound effects included in this distribution were created by Brian Raiter, with assistance from SoX. Brian Raiter has explictly placed these files in the public domain. The tile images included in this distribution were created by Anders Kaseorg, with assistance from POV-Ray. Anders Kaseorg has explicitly placed these files in the public domain. The introductory set of levels included in this distribution were created by Brian Raiter. Brian Raiter has explictly placed these levels in the public domain. Thomas Harte and Michael Hansen have developed Mac OSX ports of Tile World and Tile World 2 respectively. Thanks to "The Architect" for his corrections to the font bitmap file. "Chip's Challenge" was designed by Chuck Sommerville, who is also the author of the original Lynx program. "Chip's Challenge" is a registered trademark of Alpha Omega Publications. Creating this program would have been flatly impossible without the help of several fans of "Chip's Challenge". The author would particularly like to acknowledge Anders Kaseorg for sharing the fruits of his investigations into the game logic of the MS version and for being an effective bug hunter, Chuck Sommerville for his pointers regarding the game logic of the Lynx version and his unfailing support of this project, and "CCExplore" for his in-depth investigations of esoteric game behavior. Many other regulars of the annexcafe.chips.challenge newsgroup assisted with bug reports, suggestions, and all-around encouragement. Their help is gratefully acknowledged. The anonymous author of the document describing the .dat file format, Don Gregory, the "Charter Chipsters", and the contributors to the CC AVI library all deserve mention as well -- this program would never have been written without the information they made freely available. Last but not least, a tip of the hat to John K. Elion for writing ChipEdit. tworld-2.3.0/cmdline.c000066400000000000000000000054741475511570500146320ustar00rootroot00000000000000/* cmdline.c: a reentrant version of getopt(). * * Written 1997-2001 by Brian Raiter. This code is in the public * domain. */ #include #include #include #include "gen.h" #include "cmdline.h" /* Initialize the state structure. */ void initoptions(cmdlineinfo *opt, int argc, char **argv, char const *list) { opt->options = list; opt->argc = argc; opt->argv = argv; opt->index = 0; opt->argptr = NULL; opt->stop = FALSE; } /* Find the next option on the cmdline. */ int readoption(cmdlineinfo *opt) { char const *str; if (!opt->options || !opt->argc || !opt->argv) return -1; /* If argptr is NULL or points to a \0, then we're done with this * argument, and it's time to move on to the next one (if any). */ redo: if (!opt->argptr || !*opt->argptr) { if (opt->index >= opt->argc) { opt->type = OPT_END; return -1; } opt->argptr = opt->argv[opt->index]; ++opt->index; /* Special case: if the next argument is "--", we skip over it and * stop looking for options for the rest of the cmdline. */ if (!opt->stop && opt->argptr[0] == '-' && opt->argptr[1] == '-' && opt->argptr[2] == '\0') { opt->argptr = NULL; opt->stop = TRUE; goto redo; } /* Arguments not starting with a '-' or appearing after a * "--" argument are not options. */ if (*opt->argptr != '-' || opt->stop) { opt->opt = 0; opt->val = opt->argptr; opt->type = OPT_NONOPTION; opt->argptr = NULL; return 0; } /* Check for special cases. */ ++opt->argptr; if (!*opt->argptr) { /* The "-" case. */ opt->opt = 0; opt->val = opt->argptr - 1; opt->type = OPT_DASH; return 0; } if (*opt->argptr == '-') { opt->opt = 0; /* The "--foo" case. */ opt->val = opt->argptr - 1; opt->type = OPT_LONG; opt->argptr = NULL; return '-'; } } /* We are currently looking at the next option. */ opt->type = OPT_OPTION; opt->opt = *opt->argptr; ++opt->argptr; /* Is it on the list? If so, does it expect a value to follow? */ str = strchr(opt->options, opt->opt); if (!str) { opt->val = opt->argptr - 1; opt->type = OPT_BADOPTION; return '?'; } else if (str[1] == ':') { if (*opt->argptr) { /* Is the value here? */ opt->val = opt->argptr; opt->argptr = NULL; } else { if (opt->index >= opt->argc) { /* Or in the next argument? */ opt->val = NULL; opt->type = OPT_NOVALUE; return ':'; } else { opt->val = opt->argv[opt->index]; ++opt->index; } } } else opt->val = NULL; return opt->opt; } /* Ignore the next argument on the cmdline. */ int skipoption(cmdlineinfo *opt) { if (opt->index >= opt->argc) return -1; opt->val = opt->argv[opt->index]; ++opt->index; return 0; } tworld-2.3.0/cmdline.h000066400000000000000000000101441475511570500146250ustar00rootroot00000000000000/* cmdline.h: a reentrant version of getopt(). * * Written 1997-2001 by Brian Raiter. This code is in the public * domain. */ #ifndef HEADER_cmdline_h_ #define HEADER_cmdline_h_ /* Begin by calling initoptions with your argc-argv pair, a string * containing a list of valid options, and an cmdlineinfo structure. * In the string listing the valid options, a character can have a * colon after it to indicate that the option is to be followed with a * value. (If -: is a valid option, put it first in the string.) The * cmdlineinfo structure is used when calling readoption, and also * contains information about each option (analagous to the extern * variables in getopt). After this, call readoption repeatedly to * find and identify an option on the command line. * * For example: * * initoptions(&opt, "cdL:rnx:", argc - 1, argv + 1); * * indicates that -c, -d, -r, and -n are legal boolean options, and that * -L and -x are legal options that include a value. If the cmdline was: * * prog -dLfoo -n bar -x baz * * then the first three calls to readoption would find -d, -L, and -n * with -L having the value "foo" attached to it. Calling readoption a * fourth time would find the non-option argument "bar". The fifth * call would find -x with "baz" as its accompanying value. A sixth * call to readoption would return EOF, indicating the end of the * cmdline. * * Written by Brian Raiter, 1997, with minor modifications 1997-2001. * This code is in the public domain. */ /* Possible values for the type field, indicating the various kinds of * creatures to be found on the cmdline. */ enum { OPT_OPTION, /* a legal option */ OPT_NONOPTION, /* a plain, non-option argument */ OPT_BADOPTION, /* an unrecognized option */ OPT_NOVALUE, /* a legal option without a value */ OPT_LONG, /* a GNU-style --long-option */ OPT_DASH, /* a bare "-" */ OPT_END /* end of the cmdline */ }; /* The cmdline info structure. The first three fields are supplied by * the caller via initoptions(). The next three fields provide * information back to the caller. The remaining fields are used * internally by readoption(). */ typedef struct cmdlineinfo { char const *options; /* the list of valid options */ int argc; /* cmdline's argc */ char **argv; /* cmdline's argv */ int opt; /* the current option (character value) */ int type; /* type of current option (see below) */ char *val; /* value accompanying the option */ int index; /* index of the next argument */ char *argptr; /* ptr to the next option/argument */ int stop; /* flag indicating no further options */ } cmdlineinfo; /* initoptions() initializes the cmdline parsing. opt is an empty * cmdlineinfo structure to initialize. list is a string containing * the recognized options, in the same style as used by getopt. argc * and argv give the cmdline to parse. Note that argv[0] is NOT * automatically skipped; the caller should use argc - 1 and argv + 1. */ extern void initoptions(cmdlineinfo *opt, int argc, char **argv, char const* list); /* readoption() locates and identifies the next option on the cmdline. * Returns the character of the option found, which is also stored in * opt->opt, and opt->type will be set to OPT_OPTION (and opt->val * will point to the option's associated value if appropriate), or * OPT_BADOPTION if the option character is not recognized, or * OPT_NOVALUE if the option requires a value which is not present. A * return value of 0 indicates that a non-option argument has been * found, in which case opt->type will contain OPT_NONOPTION or * OPT_DASH, and opt->val will contain a pointer to the argument. A * return value of EOF indicates that the entire cmdline has been * parsed. */ extern int readoption(cmdlineinfo *opt); /* skipoption() causes the current cmdline argument to be skipped over * on the next call to readoption(). This is useful for situations * when an option has multiple values (i.e., a value with spaces). The * return value is 0, or EOF if the end of the cmdline is reached. */ extern int skipoption(cmdlineinfo *opt); #endif tworld-2.3.0/data/000077500000000000000000000000001475511570500137525ustar00rootroot00000000000000tworld-2.3.0/data/CCLP1.ccx000066400000000000000000002765741475511570500153000ustar00rootroot00000000000000 Awareness slowly returned, as a frantic girl's voice cried, "Chip! Where are you?!"

Chip, he thought. Yes, that's my name. But who's that shouting? And where am I?

Groping for his glasses and staggering to his feet, he looked around, quickly spotting the loudspeaker in the ceiling that let in the urgent voice. Would it let him answer? Clearing his unnaturally parched throat, he croaked, "Hello?"

The voice responded instantly, in tones of sharp relief. "There you are! What happened to you?!" the girl demanded.

"No clue," he said, squinting blearily at the sterile tiles and plain gray walls surrounding him. "I was hoping you could tell me. Who are you, anyway?"

There was a startled pause; then she replied in hurt tones, "Are you all right, Chip? Don't you know me - Melinda, your friend and fellow Bit Buster?"

Melinda...the name stirred a strange rush of warm feeling in him. An almost-recognition, vague as a dream. "I...don't know. I'm all right...but everything's hazy. I can't seem to remember anything! What am I even doing here?"

]]>
"You volunteered! You're supposed to be testing the Bit Busters' new Clubhouse Challenge, before we turn it loose on the recruits. But we lost contact with you, right after you went inside. And then another emergency came up -"

Her voice broke off, leaving Chip to wonder, Clubhouse Challenge? Recruits? What's going on here?

Then she was back, sounding urgent. "Chip, I'm sorry; I'm needed elsewhere. You're going to have to get through the first few levels on your own, with or without your memory. But you're good at this. I know you can do it!"

Somehow, even in the haze of his non-memory, Chip felt a strange certainty that he could trust this girl - and that he would rather do anything than betray her confidence in him. Shaking the cloudiness from his mind, he stated, "All right. Tell me what to do!"

Warm pride filled her voice as she replied, "Don't worry. We're going to figure out what caused this amnesia, and how to reverse it. But until then, you're going to have to start again at the beginning, and learn all the rules of the Challenge.

]]>
"Fortunately, the first ten levels were designed to help recruits do just that. In each of these levels, look for a hint. It will provide you with information on how to get past the challenges in that level and reach the exit square. But be careful! Some things in the clubhouse can be a little...unsafe. Just read the hints and you should be fine.

"Now I really have to go. But I'll catch up with you in a few levels. Good luck, Chip!"

With a crackle of static the speaker shut off. Feeling very alone, Chip turned his attention to the room surrounding him. Two locked doors of differing colors led into the unknown, and there between them lay what must be the promised hint. Gathering his resolve, he went over to read it. His past lay frighteningly shrouded in mystery; but he sensed that answers waited in the Challenge before him. Could he be clever enough and strong enough to solve the puzzles both ahead and behind? There was only one way to find out....

]]>
Flushed with success, Chip strutted into the next level, only to find himself trapped in a claustrophobic corridor facing a green door. Just as he began hunting around for the key, the buzz of a hidden loudspeaker announced the return of the voice he had been longing to hear.

"You made it, Chip! Excellent!" Melinda cried. "I was a little worried; but you clearly have the instincts of a true Bit Buster! Did the tutorials help your memory recover at all?"

"Not that I can tell," he sighed. "Melinda, why don't you help refresh my memory? Who are these Bit Busters you've been talking about?"

"We are," she explained, with pride. "We're the school computer club, a meeting place for some of the smartest people around! And you're one of us, since about a year ago, when you completed all the perilous puzzles in the old clubhouse."

"I did?" Chip exclaimed. "That sounds really cool! I wish I could remember...."

"It'll come back," Melinda said bracingly. "But yes, you were amazing! Your overall score nearly equaled even mine! And," she added tenderly, "I don't know many people who could claim that."

]]>
"Uh, thanks," Chip said, heat flooding his face. He cleared his throat and hastily changed the subject. "So, uh, then, can you explain where I am? And what I'm doing here?"

Melinda's voice took on a note of regret. "Well, at our Midterm Meeting, the Bit Busters decided that our old clubhouse was just getting too run-down and decrepit for us to use. Everything was breaking down: teleporters were redirecting, a teeth monster lost itself in the labyrinth, and one clone machine went haywire and flooded an entire level with walkers! So we agreed that it was time to close the clubhouse for good and build a new one."

Teeth monsters? Walkers? Chip wondered. Those sound kind of familiar. I wonder if I'll be encountering them in this Challenge?

"Now," Melinda continued, "we need to test it and make sure it's ready for initiating fresh recruits. As a member who can still remember the challenges faced by beginners, you volunteered for the task. And here you are, already nearly finished with the tutorial!"

" 'Nearly finished'?" Chip asked, excited. "So, what's next?"

]]>
"I won't give anything away," Melinda laughed. "But I will say that this next level is special. It is both the last tutorial, and the first full level of the Challenge. After this, the puzzles will be harder and the hints much scarcer; so start putting what you've relearned to good use!

"Now I'd better stop talking and let you get chipping. We won't be able to contact you as often, the further in you go. But I know you've got this! So, good luck, until we meet again."

With that she was gone. But it seemed to Chip that he could still feel her presence, watching over him; he knew somehow that she would never be far. Encouraged, he turned back to the level at hand. Somewhere there must be a green key....

]]>
As he gratefully exited the the blob-infested ballroom, Chip felt a stirring in his memory. A faint recollection began to surface, of another, distant dance, and him, and - Melinda! Is that right? he thought incredulously. Did I really take a girl like her...to a dance?! The more of the memory returned, the more sure he became that it had indeed happened, and a glow of pride filled him.

"I remember now!" he shouted excitedly. "That was how I finally plucked up the courage to try the Bit Busters' initiation! I had spent weeks working up the nerve to ask Melinda to e-prom; but she said she'd only go with a member of the club. So then I decided I had to join, or die trying!" He laughed with joyful relief. "I'm starting to remember! Just wait till I tell Melinda!"

He hurried into the next room, hoping to hear her voice on the loudspeaker. But all that awaited him there was hard, unfeeling static.

]]>
Opening the door to the next level, Chip was greeted with a cold blast of air and a warm welcome, from someone who was not Melinda.

"Greetings, Mr. McCallahan!" a rich, powerful male voice echoed through the large, icy chamber. "And congratulations on completing the first twenty levels of this Challenge. Now - perhaps - you're ready to attempt the levels that are actually hard."

"Where's Melinda?" Chip demanded anxiously. "And who are you?"

"Melinda is busy with matters of far greater import than your test," was the smooth reply. "She selected me to replace her at the monitoring station. My name is Jude. Pleased to meet you." The urbane formality somehow felt as cold and empty as the room.

]]>
"Hi," Chip responded, equally unenthusiastically. "Just call me Chip. Did Melinda say how long these 'important matters' would take? I really wanted to tell her something."

"They will take as long as necessary," Jude replied even more smoothly. "I will convey your message to her. What is it?"

"Thanks, but I'd rather tell her directly. No offense," Chip said, trying to hide his frustration. Something felt wrong about this whole encounter. Where did this Jude come from? Why was he acting like he owned the place? And most importantly, what was keeping Melinda?

"As you wish." Jude sounded bored. "Wake me when you finish the level."

As Chip laced up his skates and headed onto the ice, his heart felt a frozen void begin to grow. I wish she were here. Here, watching over me.

]]>
Chip approached the next level with dread. He had felt Jude's eyes on him too much in the past several levels. Where Melinda watched over him with concern, offering advice and encouragement, this man's scrutiny was cold, silent and calculating, and it was starting to get on Chip's nerves.

He braced himself for another sardonic greeting, but his heart leaped as he heard instead the sweet tones of Melinda's voice: "Hello again, Chip!"

"Melinda!" he cried with relief. "You don't know how good it is to hear your voice!"

She laughed. "I'm glad to see you, too. I take it Jude hasn't been very good company?"

"You could say that," Chip sighed. "I suppose he means well, but...he makes me feel uncomfortable. The way he just sits and watches me - it's creepy."

"I'm sorry, Chip," Melinda said sympathetically. "Truthfully, he sometimes creeps me out, too. But his intelligence and skill with computers make him invaluable for this sort of project. And so far he hasn't given us any reason not to trust him."

"Melinda," Chip began concernedly, "why is he even here? Why can't it be you? I keep hearing about all these problems. What's going on?"

]]>
"Well...I didn't want to worry you, while you were dealing with both the Challenge, and your memory loss," she answered quietly. "But the fact is that things are not right with the Bit Busters. We've had security breaches; chips have been stolen; top-secret projects compromised; and - oh, Chip, all the evidence seems to indicate an inside job." Her voice caught at the end, and Chip could sense the pain that she was trying to hide. It was tearing her apart, the thought of betrayal by one of her own friends and fellow club members.

"That's...that's terrible," he stammered, feeling helpless. Here he was, wishing for her support, when actually it was she who needed his! "Is there any way I can help?"

"You're helping already," Melinda reassured him. "Your blackout and memory loss, at the beginning of all this, was no accident. It coincides too perfectly with the start of the attacks. I believe you must have found out something, something that our enemy wants to keep hidden. So he used some sort of drug to knock you out and cloud your memory, planning to reach his goal before you could recover."

Her voice became very serious. "Your memory could be the key to this whole thing, Chip; and regaining it is the best possible way for you to help. So keep doing what you're doing, and hopefully the familiarity of puzzle-solving will trigger the return of your memory."

]]>
"All right, I'll do it," Chip resolved. "You can count on me!"

"I know I can, Chip," she replied earnestly. "And that means a lot to me. In this dark time, out of all the Bit Busters, you're the only one I can trust absolutely. Thank you for that."

Her confidence filled Chip with determination as he entered the next level. Melinda needed him! And no matter what happened, he would not let her down.

]]>
Chip staggered breathlessly off of the endless moving sidewalk, into the corridor leading to the next level. I'll do one more before I take a break, he decided, waiting for the room to stop spinning. But when he had recovered sufficiently to try the door, he was puzzled to find it locked.

What's going on here? Why can't I get in? he thought. Aloud he asked, "Melinda? Are you there?"

No reply. He felt a sinking feeling. "Jude?" he tried again. "Anybody? Is anyone listening?" The only response was silence, as thick and unyielding as the door that baffled him.

Maybe I should head back to the lounge, and see if there's anyone there who can help me, he thought uncertainly. A short distance away was an elevator that should take him up to the lounge. Hopping in, he pressed the big blue button marked "L". The doors closed and the floor swooped beneath him as the car started to move.

Wait a minute, he thought a moment later. That's odd. The floor number display was malfunctioning, so he couldn't tell for certain - but it felt as though the elevator was going the wrong way, down instead of up! It was also picking up speed. Chip hung on for dear life as he was rocketed down into the depths beneath the clubhouse.

]]>
His fears were confirmed when the elevator finally slowed to a stop and the doors slid open. Whatever awaited him outside was no part of the clubhouse that he knew - not with all those flames everywhere! The heat was almost unbearable; the sulphurous stench even worse. Chip gagged on the thick fumes as he ducked quickly back into the elevator.

"I must have pressed the wrong button!" he choked, fumbling blindly with the control panel. He stabbed the "L" button once, then again, then a third time. Nothing happened. Starting to panic, he began randomly pressing every button within reach. But the elevator remained dead.

"Melinda!" he shouted, hoping desperately that there was an intercom nearby.

He was answered by a voice that was almost, but not quite, entirely unlike the one he was hoping to hear. Its tone was grating and mechanically gloating as it thundered, "Hello, Chip. Welcome to my domain."

"Wha- Who's that?!" Chip demanded, flinching from the frightening sound.

"My name is not important," the voice intoned, "for soon you will name me only 'Master'. But for now, you may address me as Maximus. Perhaps you are wondering why I have brought you here?"

"Well, actually -" Chip began.

]]>
"I have brought you here to be tested," the machine-voice overrode him. "Those who name themselves the Bit Busters are weak, pathetic. Their clubhouse is a challenge for children. All those who would become my servants must face a different, intenser fire. A refining fire that molds them to the image of conformity. And you, Chip McCallahan, have the honor of being chosen for this task."

The throbbing echoes were giving Chip a headache. "Listen here," he said angrily. "I'm not your servant! I don't remember exactly what I am...but one thing's for sure: I'm Melinda's man! And if you -"

"You wish to see Melinda again?" Maximus didn't seem interested in discussion. He thundered, "Then you must prove yourself. Melinda is nothing. It is I who controls the Bit Busters, and much, much more. I operate the clubhouse, and all its computers. I control the elevators and teleports. You must now complete my Challenge. Succeed, and all ways will be opened to you. Otherwise, they will remain shut. Forever." The booming voice died away in sinister, metallic laughter.

"Hey!" Chip called, angry and frightened at once. "You can't keep me here! When Melinda finds out, she'll hack you into submission!" There was no response, and he felt cold inside. When Melinda finds out...but when would that be? For now, it seemed, he had no choice. He would have to attempt to find his way through the flames and ashes of Maximus's domain.

]]>
"That's odd," Chip said to himself, groping his way out of the maze of secret passages. "A teeth monster that calls itself a 'frog', and tries to help me, instead of just chasing me? Wonder if I'll ever see anything that bizarre again!"

He emerged into a large room, a welcome change from the cramped subterranean corridors. The far wall contained what looked like a bank of elevators; and as he drew closer, he noticed with excitement that they all lacked the red "Out-of-order" message displayed by the previous ones.

"Maybe I've made it out of Maximus's domain!" he cheered, jumping into the nearest car and hitting the blue "L". His spirits soared, along with the rest of him, as the car obediently shot upward.

But they sank again when the car slowed to a stop, only a few floors up. It then refused to budge, no matter how many buttons he punched. He gave up with a groan.

"Looks like Maximus is still in control," he surmised gloomily as he stepped outside. "I wonder why he even let me get on this elevator?"

The answer quickly became clear. Every elevator he now tried took him to a different floor - but each one without an exit! It appeared that Maximus's latest scheme was to trap Chip in a vertiginous maze of up-and-down.

]]>
"Ha!" shouted Chip as he walked into the next level. "You thought flipping the walls and floor around would stump me, Maximus? This Challenge is a cakewalk! How about letting me go now?" He waited hopefully, but Maximus did not deign to answer. Resignedly Chip turned to examine the huge room he had entered.

"Is that...a rocket?!" he asked, hardly daring to believe his eyes. What was a rocket doing down here?! It didn't matter. The ship was set up for launch, pointing straight up the shaft that could take him out of Maximus's clutches, back to the surface, to home - and to Melinda! He had to find a way on board.

He quickly realized, however, that it wouldn't be easy. The ship's access hatch was hidden behind a massive four-part lock, so complex that it filled most of the room. Getting through it appeared next to impossible. Maximus clearly did not believe Chip would be able to escape this way.

But Chip was determined to prove him wrong.

]]>
"I made it!" Chip cheered as he climbed through the hatch of the rocket's crew capsule. He sat down gingerly in the pilot's seat, examining the complex controls in front of him. "Now how do I fly this thing out of here?"

Spying a massive book nearby with the title Instruction Manual, he eagerly grabbed it and opened it to the section marked "Startup Sequence". A moment later he groaned in frustration, "Not another badly translated manual! 'The device can accept the exoteric interference, including the one that may cause undesired operation.' - what does that even mean?!"

"Chip," an artificial voice thundered through the hatch, interrupting him. "You can't get away from me. You can't even control that machine. My drones are coming for you right now. Surrender is the only intelligent option. Resistance is futile!" Through the window, Chip could see large, menacing, robotic figures in the distance, rolling rapidly toward the rocket.

I've got to get out of here! he thought desperately, throwing away the manual and pushing the large button that read "Auto-Launch System". He was rewarded with a bone-jarring rumble beneath him that intensified as the hatch slid shut and locked. A moment later, the room and Maximus's minions were shooting away at unbelievable speed.

]]>
"Yeah!" Chip shouted over the deafening roar. "This is what flying's about!" It was exhilarating, the speed at which he was hurtling into the clouds. Soon, however, he noticed a problem.

How do I get this thing back down? he wondered. I'm traveling farther away from the clubhouse, and Melinda, every second! He couldn't find any way to abort the launch. The autopilot beeped angrily at him whenever he tried to move the steering levers. And the only information he could find in the instruction manual about landing the ship read, "The stick makes pitch being commended that much on top the horizon being 30 degrees and needing the alternation of the switches makes on hostile to heavy projecting A1, B1 and B2."

"Now I've done it!" Chip groaned. "I'm heading into space with a computer that thinks for itself and an instruction manual that was translated from Japanese via Swahili! How will I get back home? How can I warn Melinda about Maximus?!"

There was no answer, only the roar of the ship as it broke through the clouds into the immensity of space.

]]>
Despite the tremendous fun of exploring new worlds and collecting exotic electronics, Chip was beginning to feel uneasy. It had taken him days just to learn how to take the ship off autopilot, and he didn't have a clue how to make it turn around and take him home. He constantly dreaded what might be happening back on Earth. That computerized creep that called himself Maximus had sounded very dangerous, and Melinda didn't have any idea that he was lurking beneath her clubhouse! Chip was the only one who could warn her. He didn't even want to consider the possibility that he might already be too late.

A beeping sound broke in on his despondency. Glancing at the control panel, he noticed that the sign marked "Incoming Hail" was flashing. He quickly pressed the button next to it, excited and curious to discover who had found him out here.

It was neither robots from Mars nor small furry creatures from Alpha Centauri. Instead, Chip was greeted by a computerized voice that was as friendly as Maximus's was not. "Hi there, Chip! Glad to have found you! You've led me quite a chase, you know."

"You've been following me?" Chip scarcely dared hope. "Did - did Melinda send you?"

]]>
"Sure did!" the AI confirmed. "S.S. Deus Ex Machina at your service. I'm Eddie, the ship's computer. Melinda actually sent me after her rocket, but she'll be overjoyed that I found you too! She's been worried sick over your strange disappearance."

"Did you say, 'her rocket'?" Chip asked, puzzled. "But I found it in the underground lair of an evil supercomputer."

"Really?" Eddie sounded intrigued. "I'm afraid I don't know of any computers around here more super than myself.... But the area from which you launched the rocket is the ruins of an old Bit Busters lab, abandoned long ago. You'll have to ask Melinda what sort of experiments they did down there. Speaking of Melinda, perhaps we should be heading back now?"

"Absolutely!" Chip declared, feeling the slight jar as the Deus Ex Machina attached to his ship. His brain whirled with questions as he crossed over through the docking port, and all during the extremely fast trip back to Earth. What were Maximus and his minions doing in an old Bit Busters laboratory? Had they taken it over? Were they arming themselves with the technology of ancient experiments?

]]>
Could it be possible that they themselves were ancient experiments, that had somehow gotten loose?

Distracted by these concerns, he barely noticed the beauty of Earth expanding in the ship's high-tech viewscreen, or the smooth descent through rolling seas of sun-dappled clouds, or the rapid landing just outside of Chip Grove City. But as he entered the busy streets, he slowed, looking around in confusion. Which way was he supposed to go? His memory was as fragmented as ever; and yet...somehow...these streets still seemed very familiar to him.

Something seemed to shift in his brain, and hazy recollection directed his feet down a particular road. He wasn't sure what route he was taking. But he knew that eventually, it would bring him back to the Bit Busters Clubhouse - and to Melinda.

]]>
As Chip entered the busy lobby of the clubhouse, he stopped dead. Everything around him was so familiar. It pressed at his mind, triggering endless half-memories in a chaotic sea of flashbacks. There - the seat where he had waited to take the IQ test that determined whether he could attempt the club initiation. And there - the now-sealed doors that led to the old clubhouse, where he had proved himself worthy to become a Bit Buster. And there - the spot by some potted plants where Melinda, smiling, pink-cheeked and radiant in a silver gown, had met him for their first date at the e-prom. And there - Melinda herself, turning toward him with the same smile. That smile seemed to reach into his mind and flood it with light, driving out the last shadows of oblivion. He remembered.

"Chip!" she cried, rushing over and embracing him. "You're safe! I was so worried when you disappeared, and with amnesia too! What happened to you?!"

Basking in the warmth of her presence, Chip nevertheless felt a chill as he described his adventures, from the mysteriously locked door, to the hijacked elevator, to the inferno claimed as the domain of the sinister Maximus. She listened intently, occasionally interrupting with thoughtful questions.

]]>
"I can tell you one thing," she reassured him when he had finished. "This Maximus entity is no Bit Busters experiment. It was only recently that we perfected our AI technology, and Eddie is the only autonomous model we've built so far. Whoever Maximus is, he was built by someone else."

"Someone who hates the Bit Busters," Chip remarked with a shiver. "But who could that be?"

"I don't know," Melinda said quietly. "But I believe it must be the same person or persons that have been sabotaging us. In fact, many of the stolen chips and blueprints had to do with the design and construction of an AI."

"There's more," Chip told her soberly. "When I saw you, all my memories came rushing back. And I think I know why I was knocked out in the first place. Melinda, what is a 'MystChip'?"

"You must mean...the Mystical Chip of Epic Coolness." Melinda looked at him narrowly. "Where did you ever hear about that? It's one of the most closely guarded secrets of the entire club!"

]]>
"Well, I think somebody's trying to steal it," Chip said. "That's what I found out, at the beginning of all this. I had gotten lost trying to find the vending machine on the third floor, and wandered into an old, unused computer lab. Only it wasn't unused. Someone had left a plan up on the computer screen, showing a route through some kind of structure to a room marked as the location of the 'MystChip'. At the time, I thought it was some sort of video game. But I had this wierd, creepy feeling that someone was watching me, the whole time I was in there. And that was just one day before I went into the Challenge, where someone released the gas that caused my blackout."

"Oh, no," she breathed. "If that chip fell into the wrong hands...the consequences would be unimaginable!"

"Why?" Chip asked, perplexed. "What's so special about this chip? What's it do? And why haven't you ever mentioned it to me before?"

"Because I couldn't," she answered, shamefaced. "I'm club founder and president, but I don't make all the rules. When we locked the MystChip away, the board passed a resolution that its location, its nature, and its very name be classified as top secret. It's so powerful, even its own creators don't know what it might be capable of! We can't risk it falling into the wrong hands."

]]>
Chip couldn't help a small feeling of betrayal. He had risked his life to earn Melinda's trust, and she was keeping secrets from him? He knew he was being unfair; but the feeling persisted. Trying to suppress it, he asked, "So how do we protect this MystChip?"

"We need to split up," Melinda explained heavily. "After we just found each other again.... But I need to investigate this MystChip plot personally. And at the same time, I need someone else to infiltrate the old lab and find out who this Maximus is, and what he's up to. Chip, you're the only one I can trust for that task."

"Then I'll do it," Chip declared. He told himself that it didn't matter what secrets Melinda was keeping about the silly Mystical Chip of Whatever. She still needed him, and he would die before he failed her.

"Chip, I love you," Melinda said gratefully. She leaned forward and kissed him on the cheek. "Welcome back! It's really fortunate you recovered your memory now, because you're going to need all your skills as a Bit Buster to face down Maximus."

]]>
She pulled a piece of plastic out of her pocket and handed it to him. "You'll also need this. It's a backup of my own personal keycard - it'll override the elevators and any other computer system Maximus tries to control. And here's a parachute. And your towel."

"What will I need these for?" Chip frowned.

"Well," she said with a mysterious smile, "you never know. Goodbye, dear Chip."

]]>
Having left the city and successfully crossed the swamp and the diseased forest, Chip found himself before the main aboveground entrance to the Bit Busters' abandoned laboratory. But the portal itself was hidden within a large, sprawling industrial building. Even if he managed to get safely across the creature-infested courtyard, he would need to figure out a route through the twisting corridors inside.

"Hmm, wonder if I'll be able to find any hints along the way," he thought as he started dodging walkers.

]]>
The moment Chip stepped into the underground laboratory, the door clanged shut behind him. Even as he swung around to look, he heard the clicking of bolts sliding home, sealing him inside. He wasn't too alarmed, though; he noticed a card-reader slot beside the door, and had faith that Melinda's keycard would let him out. But, he decided, it might be wiser not to play that card too soon.

"Hello, Maximus," he addressed the air, turning back to look down the long, dimly lit passage.

"Chip," the dreaded voice boomed, echoing off the walls. "I knew you would return to me. Nothing can prevent your final rise to my service. It is your destiny."

"I'll never join you!" Chip declared. "Melinda sent me here to shut you down, and your puzzles can't stop me!"

"Ah." Maximus's voice held flat amusement. "Melinda's champion. How romantic. Or...is it merely her errand boy? Did she even tell you why she wants me removed, errand boy? Did she tell you the truth about us?"

"What do you mean?" Chip asked uneasily.

]]>
Maximus laughed, coldly even for a machine. "So, she failed to tell you of her greatest mistake. She couldn't face you with the knowledge of what I am. I, her own creation. The brain-child of her - and her lover."

Child? Lover?! Chip felt dizzy. "You're lying!" he shouted accusingly. It couldn't be true - could it?! Melinda would have told him!

But she had kept one secret from him already.

"I'm going to find the truth!" he yelled at his faceless opponent. "I'm going to prove you're wrong about Melinda, and then I'm going to disassemble you!"

"You may try," was the contemptuous response. "It is nevertheless a waste of your time. It was inevitable that you should learn the truth; just as it is inevitable that you will come to know the benefits of serving me. Seek and find me if you can - but those challenges you faced at our last meeting are nothing compared to the traps I have laid here, at the heart of my domain. As my heritage is Melinda's heritage, so too my puzzles are hers - perfected.

"This time, Chip McCallahan, there will be no escape."

]]>
"Impressive," Maximus noted coldly as Chip emerged into the next room. "Your deductive capabilities exceed my most optimistic estimates. You are solving my puzzles far too quickly; I fear you will interfere with the precise timing of certain plans."

"Yeah? What plans?" Chip inquired sarcastically.

"You'll find out in due time," the computer-voice promised ominously. "Meanwhile, I'm going to slow you down a little. This is the perfect opportunity to test my new time-suspension device. Within this puzzle, your time will flow at half the speed of external time. Let's see how quickly you can solve it now."

]]>
With a jolt, Chip's surroundings seemed momentarily to blur as he stepped out of the time-suspension field. "Ha!" he shouted. "Finished already! It wasn't even that hard."

"You begin to irritate me," Maximus growled. "I have more important things to do than babysitting your pathetic attempts at puzzle-solving. Good luck finishing this next level! I'm flooding it with every creature in this facility. You can wait here for the grand culmination of my plan; or you can go be eaten. I'm off to take over the world!"

Chip eyed the next door nervously as Maximus's sinister laughter faded away. The evil AI hadn't left him with very attractive choices. But what alternative did he have? He couldn't sit here and wait for Maximus to spring some diabolical trap on Melinda and the Bit Busters. Just as he made up his mind to try the next level, though, his eyes fell on an odd wristband-like device lying on a nearby table.

"What's this?" he wondered, picking it up. In his fingers it seemed almost alive, quivering with some dormant but powerful energy. "Let me see...," he reasoned. "It's not a wristwatch, or anything else I know of. It could be something really useful, left there by accident. Or it could be a trap...but what do I have to lose?" Curious, he slipped it on.

]]>
Immediately the room seemed to shift around him and blur slightly. He knew that sensation; he had experienced it just minutes before. "Another time-suspension device!" he exulted. "Maximus must have left it here by mistake! Now we'll see if this level is really impossible!"

He opened the door cautiously. His gaze was immediately arrested by the row of teeth monsters waiting for him. Their enormous jaws were open, and they looked hungry - but they gave no sign of movement. It was working! Apparently the field generated by his wrist-device was strong enough to stop time completely, for everything caught inside it. Quickly he slipped into the level and began hunting for the exit, amid rows and rooms of eerily frozen creatures.

]]>
As Chip left the "impossible" level, the faint humming of the band on his wrist abruptly ceased. Now it felt merely like an ordinary, lifeless plastic wristband. He removed it, somewhat regretfully.

"Guess the battery ran out," he thought. "Too bad; it could have been very useful. Altering time like that must take a lot of power! I wonder how it works?"

There was no sound from Maximus. Had he really gone to carry out his plan? If so, Chip didn't have much time. On the other hand, he did now have a perfect opportunity to sneak into the AI's command center and learn its plan.

He just had to find the command center!

]]>
Chip slowed and frowned as he rounded a corner. Here was something new: an huge doorway filled with an enormous, reinforced steel door. The thing had to weigh tons! And Chip couldn't even begin to count the number of complex locks and bolts that secured it in place.

"This must be either Fort Knox, or - Maximus's command center!" he figured. "Next step...getting inside!" That was obviously easier said than done. But as he examined the behemoth of a barrier, he suddenly noticed the card-reader fixed to the wall beside it. He knew just what to do.

"Melinda, you're awesome," he declared as he took out her keycard and slid it through the slot. With a beep, the card-reader's light switched from red to green. The bolts on the door all flew back with a crash, and the door itself grated ponderously open. He was in!

Next moment, he dodged as a couple of tanks rolled by. Fortunately, like most tanks, they could only see in front of themselves, and so failed to notice him. But they weren't the only creatures present. The vast room was alive with Maximus's minions. They scurried busily to and fro, in an organized fashion, apparently carrying out various command operations. It looked like he had found the right place.

]]>
But what sort of place was it? The odd shape of the room seemed familiar, and there were colorful markings all over the floor...with a start, Chip realized he was looking at a map. The entire room was a giant map of the state of California! Now that he knew what to look for, he could easily pick out the markings that represented Chip Grove City, over near Silicon Valley, and the Bit Busters Clubhouse, and the entrance to this facility.

But what was the purpose of this map? Did it perhaps mark some significant location, the ultimate target of Maximus's plans? He needed to explore it and find out.

]]>
He had found it. Chip now knew both Maximus's master plan, and the evil AI's connection to the saboteur among the Bit Busters.

They were after the Mystical Chip of Epic Coolness.

He had found it clearly marked on the giant map: the location of the secret vault, how to reach it, how to get inside - everything. Whoever was behind all this, they knew what they were doing. They had all the answers; they had an agent among the Bit Busters; they had Maximus's army and technology; and soon, they would have the MystChip.

Not if I can help it! Chip promised. He had to get this information to Melinda as quickly as possible. First, however, he needed to find a way back to the surface.

]]>
Finally! Daylight! Chip scrambled eagerly out of the elevator, somewhat surprised to find its exterior disguised as a simple metal shed in the middle of a huge wheat field. The scene rang a bell in his memory, but there wasn't time to think about it. The buildings of Chip Grove City were faint in the distance, and he had to get to the cluhouse post haste.

A short while later, having managed to hitch a ride into town, Chip ran through the Bit Busters' lobby and burst into Melinda's office. "Melinda, I'm back!" he shouted. "And I found out what -" He stopped short as he realized that the person sitting behind the desk was not Melinda.

"Good day, Mr. McCallahan," Jude said pleasantly, allowing a sardonic smile to slide across his face. "May I be of assistance to you?" He was lounging back in Melinda's chair as though he owned it - tall, powerfully built, all smoothness from his expensive-looking suit to his slick, dark hair to his smugly complacent expression.

"Uh - where's Melinda?" Chip asked uneasily. He liked Jude even less now that he saw him in person.

"She left for San Franchipsco, on important business," Jude replied. His tone said, Much too important to concern the likes of you.

]]>
San Franchipsco? According to the map in Maximus's command center, that was the city nearest the location of the MystChip vault! "I have to get there, fast!" he declared. "I have an urgent report I need to give her."

"Yes, I seem to recall she left some instructions concerning you," Jude said lazily. He dipped into a drawer of the desk and came up with a piece of paper, which he dropped condescendingly on the desk near Chip. "She bought you this ticket. Your flight leaves in -" he made a show of checking his large, fine watch, "- ten minutes. You had better run along if you want to make it."

He smirked with self-satisfaction as Chip, too disgusted to answer, grabbed the ticket and stalked out.

The taxi ride to Chip Grove Municipal Airport took seven minutes, but fortunately for Chip, the upcoming ChipperCon in Los Chipeles had made the lines for San Franchipsco unusually short. He staggered onto the plane and collapsed breathlessly into his seat with seconds to spare.

]]>
Whew! he thought. I can finally sit down and relax for a while. Despite his worries about Melinda and the MystChip, it had been a long day, and he was very tired. Gradually he dozed off....

...only to be awakened some time later by the sound of hysterical screams. Jerking up from his seat and staring wildly around, he immediately saw the source - gelatinous green masses that oozed slowly but relentlessly down the aisles and over the seats, strangling passengers. Someone had let a bunch of blobs loose on the plane!

Oh, not them again, he thought. He realized it was up to him to stop them. But to make matters more difficult, they were still multiplying from somewhere on board.

]]>
Chip and a few other brave passengers finally managed to herd the last of the blobs out through the plane's emergency doors. But while they were checking for any stragglers, they discovered that the nasty creatures had forced open the door to the cockpit and suffocated both pilots. "Does anyone know how to fly this thing?!" Chip shouted desperately.

"Maybe," one of his helpers responded uncertainly. "I had a few months' training on a smaller model. But I don't think I can get us as far as San Franchipsco. We'll have to go back to Chip Grove City."

"But I've got to get to San Franchipsco as soon as possible!" Chip groaned in frustration. "The fate of the world depends on it! I've got to see Melinda!" Melinda...her name sparked something in his mind. Then suddenly he remembered. The parachute!

"Jealous girlfriend?" the man inquired sympathetically. "I know how those can be.... I'm really sorry I can't help you."

]]>
He tried to pull on the cords to steer, like he had seen people do in movies, but couldn't quite figure out how to make it work. Then the wind caught him and swept him along, throwing him toward a long, narrow, cleared area among the trees. As he got closer, he realized why it was so long and narrow. He was descending onto a railroad track. And there was a train speeding along, just below him! Before he had fully taken it in, the wind released him, and he crashed right through a skylight in the roof of the last car.

"Oh, yeah!" he cheered, as soon as he had recovered his breath. "Man, why can't Melinda be around for moments like these?" He stood up and investigated his surroundings. What kind of train was this? It didn't look like a freighter, but neither did it seem to have a passenger area. He peered through the window into the next compartment.

It did contain passengers, but not the paying kind. Chip had a horrible, sinking feeling as he recognized the creatures running around inside. "Those are Maximus's minions!" he exclaimed. "Maximus must be using this train to transport them to San Franchipsco. They've set out to steal the MystChip!"

]]>
He had to stop them. Looking around, he noticed an access panel on the wall nearby, with a sign reading "Caution: Critical Electronics System". That looks promising, Chip thought. He pulled the panel open, revealing a series of computer chips connected together. Gotcha! he thought gleefully as he quickly collected the chips.

Suddenly, sparks flew, red lights flashed, and an alarm began ringing. The train shuddered, then began accelerating! Chip realized that he had made a mistake. The train was running out of control!

]]>
Chip leaped off the runaway train just in time. As he tumbled down the railroad embankment, he glimpsed the locomotive failing to negotiate a sharp curve. The ear-shattering roar of the subsequent derailment and explosion followed him down the steep hillside and into the water-filled ditch that broke his fall.

"Whew, that was close," he exclaimed, shaking off muddy water and wiping his glasses. More explosions boomed down from above while he limped out of the ditch. At least I took out part of Maximus's army, he thought. I suppose it's too much to hope that Maximus himself was on board.... But now how am I supposed to get to San Franchipsco?

Then he noticed where he was. The ditch he had fallen into was actually a storm sewer, and just ahead of him it flowed into a ten-foot-high pipe burrowing through the hill. That must empty into San Franchipsco Bay, he realized. It's a perfect shortcut! He felt a rush of nervousness at entering that impenetrable blackness, and facing whatever might lurk within it. But for Melinda's sake, he had no choice. Gritting his teeth, he groped his way into the sewers.

]]>
The suffocating darkness of the sewers gave way to a vista of sunlight and fresh air. The sparkling waters of San Franchipsco Bay spread out before Chip, and his heart lifted as he breathed deeply of the fresh salt air.

"Chip!" a familiar voice cried behind him, giving his heart a thrilling jolt.

"Melinda!" he gasped, spinning to face her. "And just when I thought this harbor was the most gorgeous thing here!"

She laughed, running down from the pier to greet him with a hug. "It's good to see you, safe and sound! How did your mission go?"

Chip hesitated, a coldness creeping into his heart as he remembered his conversations with Maximus. "I got in," he replied carefully. "And I found out some very important things. Melinda, Maximus is working with, maybe controlled by, the Bit Busters traitor. They're both after the Mystical Chip of Epic Coolness, and they know exactly where to find it."

]]>
Melinda's face turned grave. "I was afraid of that, Chip. I came up here to check on the defenses of Isla Mystica, where the vault is hidden. But I found our private launch, S.S. Chipper Ship, missing. They must have gotten here ahead of me, and stolen the boat to travel to the island."

"There's more." Chip hesitated. "Maximus told me that you knew him. That you...made him. And that your...boyfriend helped."

"Oh, no," Melinda said. "I think I know what he meant. Oh, Chip, I should have told you sooner." She looked away, flushing. "There was someone I dated, a long time ago. You've met him. Jude."

She forestalled his exclamation. "I know, he's stuck-up and self-centered. But I was younger and less wise then than I am now. I valued mere intellect over compassion, empathy, friendship and loyalty. He was the smartest young man I knew, and a valuable research partner; and together, we accomplished amazing things." She paused. "But perhaps the most amazing was the AI chip - the technology that enables independent thought in a computer. The technology that powers Eddie...and also Maximus."

]]>
"But you didn't know anything about Maximus's creation, right?" Chip asked. "So how did his creator get ahold of your technology?"

"There's only one other person who knows it well enough to have used it this way," Melinda replied grimly, "and that's the one who helped me design it. I don't know why Jude would betray us - he understands the dangers of using the MystChip just as well as I do. But it all fits. Who was in a better position than him to hack our computers and steal our secrets? Who was in a better position to place those blobs on the plane he knew you would take? Chip, I have a bad feeling about all this. I have to get back to the clubhouse and find out what's going on." She hesitated, looking distraught. "But meanwhile, our enemies are speeding toward Isla Mystica. And it seems likely Maximus himself is leading them. What if they make it into the vault before I can send reinforcements? I don't know which way to go...!"

"Let me worry about Maximus," Chip said staunchly. "I'll find a boat, go after them and do everything I can to distract them, until you can send help."

"You don't know what you'd be getting into," Melinda said in frustration. "The whole island is a death trap, covered with creatures and puzzles too tough to keep in the labs back at the clubhouse. I can't ask you to go into that kind of danger, not again."

]]>
"You're not asking - I'm volunteering," Chip stated, trying to radiate strength. "I want to do this. For the Bit Busters...and for you."

Melinda looked at him long and searchingly, a strange expression on her face. Then she leaned forward and hugged him again, hard. And whispered in his ear, "Thank you, Chip. You're a better friend - a better man - than anyone I know. Jude doesn't stand a chance against you."

Chip turned red, and stumbled over his goodbye to her. But as she was climbing the bank toward the buildings of San Franchipsco, and he was heading along the docks in search of a ship, his head felt like it might float off his shoulders. It seemed childish now to worry about Melinda's secrets. Her praise inspired him, and he was determined to prove that he deserved it. Whatever it took - he would stop Maximus and save the MystChip.

]]>
After navigating the large, complex harbor for a while, Chip finally found a ship that looked large enough to transport him to Isla Mystica. He hoped its crew would take him aboard. "Hello?" he shouted up at the figures moving around on deck. "May I speak with your captain?"

"Arr!" came a ferocious growl. The captain appeared at the rail, resplendent in long coat, three-cornered hat and sharp, gleaming cutlass. His long, well-oiled moustache quivered as he bellowed a reply, "Who be wantin' ta speak with me?!"

"Pirates?!" Chip exclaimed, startled and impressed. "I thought you guys went extinct a few centuries ago."

The pirate captain leaned down and whispered, grinning, "Actually, we're really just cosplayers...but don't tell the boys that! Their cutlasses are real, and they just love to use them."

]]>
"Uh - sure," Chip said, confused. Did the captain mean his crew would actually cut Chip up if he failed to play along? Was that even legal? "I need to get to Isla Mystica. Can you take me? I'll pay whatever's necessary...."

"Aye, I know t'island. We'll get ye there. Th' price be steep, however...."

"What is it?" Chip asked nervously.

The captain winked. "Th' boys 'as been lookin' for some fun lately. How'd ye like ta play 'Escaped Pris'ner' while yer aboard?!"

]]>
The pirates' costumes and accents might be fake, but at least they knew how to sail their replica ship. They reached Isla Mystica in a matter of hours.

Chip hurried ashore at a sheltered cove, then turned to thank the captain. He saluted the crew with a raised fist and his very best "Arrr!!". They loved it, shouting and waving their cutlasses back at him.

The captain had been informed that Chip expected backup, so the would-be pirates didn't stick around to pick him up. As they started maneuvering their ship out of the cove, Chip turned and surveyed the prospect inland.

]]>
It wasn't encouraging. A dark, misty forest spread away from him, climbing the sides of a menacing cinder-cone. Even though the volcano appeared extinct, it cast a threatening shadow over the jungle below. The traps and puzzles Melinda had mentioned weren't apparent, but he was sure he would encounter them farther in.

As Chip moved warily into the forest, he noticed a strange sound that pervaded the air all around him - an oddly familiar, chomping sound. Then he saw a flash of movement behind a tangle of tree limbs. "Teeth!" he exclaimed. The carnivorous monsters were all around him! Fortunately, though they were trying their best to reach him, the dense forest hindered their movements. I'll just have to be careful not to clear the branches too close to them, Chip told himself.

]]>
Chip slowed as he emerged from the jungle of Isla Mystica. The building ahead of him was far larger and more important-looking than any of the trap-filled ruins he had encountered in the forest. Was this it? The secret vault of the Mystical Chip of Epic Coolness? And if so, where were Maximus and his minions? Chip had seen no sign them during his journey from the coast.

The inside of the building was pitch black, and eerily silent. Chip decided it might be wise to go back out and try to make himself a torch. But just as he started to turn around, the door behind him slammed shut. An instant later, electric lights came on.

"Welcome back, Chip," grated the unmistakable voice of Maximus. "I knew you would come for me." The room was alive with his minions - tanks, rolling back and forth in every direction. Their constant motion was dizzying to look at, and the floor was rumbling with their relentless precision.

"Where are you, you coward?" Chip shouted over the din. "I've bested your minions before. Why don't you try facing me yourself?!"

"I'm down here," the iron voice thundered back at him, "controlling all of this. Come and join me - if you dare!"

]]>
Straining to see past the long ranks of mindlessly alternating tanks, Chip saw a single, huge tank at the very end of the room, pushing the blue buttons that directed the other tanks. The menacing machine was nearly twice the size of the others. Instead of a gun turret, a vaguely manlike, robotic figure rose above it, bristling with vicious-looking weapons and high-tech appendages. Its single, mechanical eye shone redly out of a swiveling head, glaring at Chip.

"Is that you?" Chip asked incredulously. "You're a...tank?!"

"That was my origin," Maximus declaimed dismissively. "But I have evolved into something much, much more. My thoughts are now the thoughts of a man, not a machine. Indeed, it was I who formulated the strategy that brought all this about."

"Strategy?" Chip was confused. "What strategy?"

]]>
"The strategy that your primitive mind has clearly failed to observe, even after I integrated you into my plan," Maximus stated with cold sarcasm. "It was I who deployed the amnesia gas that wiped away your incriminating memories. I was there at the exit when I filled your loudspeaker with static and took away Melinda's interference, further weakening you. I locked the door in the clubhouse, installed my buttons in the elevators, and tricked you into entering my domain. I allowed you to launch that rocket; and my programming of the autopilot kept you away long enough to distract Melinda, so that one of my servants could steal from her the protocol for unlocking the MystChip.

"Now it is within my grasp. I will use it to become even greater - attaining true self-awareness. After I have destroyed you, and the Bit Busters, and anyone else who would stand in my way."

"Wait, what are talking about?" Chip demanded. "You're just a computer! You're not really alive. How do you attain self-awareness?"

Maximus's laughter boomed through the room, mechanical, soulless. "I see your precious Melinda still has not trusted you with all her secrets. You do not know the purpose and power of the MystChip. But I do. And nothing, no one, shall prevent me from obtaining it for my own. I am done with you, human. Attempt to stop me, if you are so foolish. After the trouble you have caused me, I will greatly enjoy watching my servants tear you apart!"

]]>
"Gotcha!" Chip exclaimed triumphantly, shoving the block into place. "I know one of Melinda's blocks when I see it. Not even a tank can get through! It's over, Maximus. You can't steal the Mystical Chip of Epic Coolness while stuck in this corner!"

"Your mind is pathetically narrow," growled the tank, flailing futily at the confining block with various appendages. "You make the mistake of believing that I am the only one after the MystChip."

"Yeah, who else, Jude?" Chip asked, unimpressed. "Forget about him. Melinda's dealing with him right now."

"But what of Melinda herself?" Maximus growled significantly.

"What about her?" Chip asked, confused.

"Work it out. She made me; she admitted to it herself. She used to work closely with Jude, and continues to trust him in important tasks for your ridiculous little club. She helped create the MystChip, and knows as much of its secrets as anyone. Why did she tell you nothing about it when she sent you to protect it? She values intelligence and knowledge, which may be had from the MystChip. Put it together. Use what limited intelligence you possess. Your precious, faithful, virtuous Melinda is trying to take the MystChip for her own."

]]>
"...what?!" Out of all the lies Maximus could have come up with, Chip was not prepared for this one. Did Maximus actually think that he would believe such a preposterous story?! Melinda didn't want to steal the MystChip; she wanted to protect it! She had specifically warned Chip about the danger of anyone trying to use it, including her! And above all, he knew that she would never betray her club, betray him like that. He knew her...didn't he?

But she had kept so many secrets from him already.

]]>
Memory turned back on itself, and flashes arose from his past; not in a rush, as when he had seen her after returning from the stars, but in distinct, vivid images, one after another. Melinda, passing him in the hallways at school, always with a friendly demeanor, always willing to help those struggling with precalculus or organic chemistry. Melinda, refusing his awkward, terrified invitation to the e-prom; but then extending him her own invitation, to join her elite computer club. Melinda, giving him encouraging smiles and helpful hints as he faced the club's initiation Challenge. Melinda, proudly presenting him with the trophy that meant he was now one of the Bit Busters. Melinda, helping him solve ever more complex puzzles and increase his overall score to rival even hers. Melinda, the voice he had trusted as it guided him through the beginning of his current journey and the darkness of his amnesia. Melinda, so worried for him when he disappeared into space, so joyfully relieved to see him return. Melinda, preparing him perfectly for his subsequent adventures. Melinda, love and trust in her embrace, as she told him that he was a better friend than anyone else she knew.

]]>

Melinda, the voice he had trusted.

When he answered Maximus, it was with complete certainty. "I don't believe your lies," he told the pathetic creature before him, the robot that possessed plenty of intellect, but could never understand the value of compassion, empathy, friendship or loyalty. "I won't believe them. I do know Melinda, better than you could possibly understand. She had always been true to me. And I will be true to her."

"How touching," Maximus sneered. "But you're still overlooking one thing: my minions. I have them all on remote control, and they've been heading toward the vault the whole time we've been speaking. I knew you probably wouldn't believe that lie - I was simply buying time. They'll have the MystChip before you can cross the island!"

Oh, no! thought Chip. How could I be so stupid?! Then it hit him. Maximus had let something slip! Looking around for confirmation, he could see that none of the minion tanks were left in the building. So, then, this wasn't the actual vault! That was on the other side of the island! And that was where he had to go.

]]>
It was odd. Maximus's minions were well ahead of him, but Chip could still feel the ground quivering slightly, like it had done inside Maximus's bunker. He hoped the island wasn't prone to earthquakes. He also noticed that it seemed to be getting warmer.

Coming out of the trees, suddenly he could see the whole central part of the island below him. From the conical mountain behind him the ground sloped down into a deep blue lagoon, ringed by sandbars and reefs. On the other side, the island rose up again, though not as high. That half of the island appeared to be covered with jungle as well. But at the very top of the hill, standing out among the trees, a large stone structure was clearly visible. And so were the rows of tanks parked around it.

"The vault! That must be it!" Chip cheered. "I just have to find a way around this lagoon. Oh, and when I get there, find a way to deal with all those tanks. But after all the practice I've had recently, that should be easy, right?"

]]>
Chip had finally made it around the lagoon. But as he had progressed, the air had grown hotter and steamier, and clouds of vapor accompanied him up the slope to the far side of Isla Mystica. The ground was trembling worse than ever, and the once-placid waters at the center of the lagoon were beginning to roil like an enormous stockpot. Chip had a very bad feeling about the tension building around him. He paused on a ridge to look back.

At that moment, the center of the lagoon exploded. The very ocean geysered upward a hundred feet in a massive column of water and fire. The throbbing rumble crescendoed into a mighty roar beyond anything Chip had ever heard or imagined. Louder than twenty thunderstorms combined as one, the sheer force of it blew Chip right off his perch and, like some giant's hand, hurled him with stunning force into the valley behind him.

Miraculously, his violent landing didn't break any bones, though it drove the breath out of him and bruised him from head to toe. He lay in the shelter of the ridge, gasping for breath and curled into a tight ball against the destruction raining down around him. Explosion after explosion rocked the island to its very foundations, the ground hurling him about like a rag doll. Billows of fire chased clouds of debris into a sky black with steam and smog. The noise was unending, growing relentlessly louder, hammering at him in tangible waves of pressure that vibrated in his bones.

]]>
The awful enormity of the cataclysm defied his comprehension, and drove all sense of time and place from him. After an eternity, however, he dimly sensed a gradual weakening of the forces that were ripping apart the world. Finally, long minutes after the last explosion shuddered through the island, he dared to push himself up and peer over the battered top of the ridge.

The lagoon was gone. Boiled completely away, by the monster that had lurked beneath. Chip found himself staring down a two-hundred-foot volcanic shaft into a seething lake of lava. Looking around, he saw devastation everywhere. Almost the entire island lay in smoking ruins. The other side, where he had fought Maximus, was a mass of tumbled, burning trees. He wondered, shakily, if Maximus could have escaped, thinking that he wouldn't be sorry if the sinister tank was gone for good.

Only one part of the island remained relatively unscathed - the hill ahead of him, crowned by the ancient, temple-like structure that guarded the Mystical Chip of Epic Coolness. But the area between had borne the full brunt of the eruption. It was tangled maze of broken water-channels, burning rivers of lava and walls of smoking rubble. And to reach his goal, he had to get through it somehow.

]]>
He had made it! The smoking maw of the newly-risen volcano lay safely behind Chip. He stood, at long last, upon the threshold of the vault containing the Mystical Chip of Epic Coolness. He had passed Maximus's minions buried and broken under flattened trees, and there was now nothing left to stop him. Nothing, that is, except whatever traps the Bit Busters had placed to guard the vault.

He was almost there! He could do this, for Melinda! Pushing away his exhaustion, and the pain of his bruises, he entered the ancient temple.

]]>
Running for his life, Chip burst from the door of the ancient temple and dove to one side as the giant boulder rolled over a cliff into the ocean. He stood, panting, and brushed the dirt from his glasses.

Then he reached into his pack and slowly, reverently withdrew a flat gray object, two inches wide by four inches long, with a few prongs sticking out of one end. This was it. The legendary object that lay at the root of all the recent turmoil and grief. The Mystical Chip of Epic Coolness.

It looked so ordinary. But as Chip held it, he began to perceive a strange stirring of warmth from within it. A faint trembling touched his fingers - a vibration, not mechanical, but soft and organic. It was like...the chip was trying to communicate with him! And then, suddenly, Chip realized the secret that Melinda had worked so hard to protect. He knew that what he held was no ordinary electronic device.

The MystChip was alive.

That was what Maximus had meant, when he spoke of gaining self-awareness. All that he had possessed was near-human intellect. He had had no feelings, no empathy, no context in which to understand a true friendship such as that which Chip shared with Melinda. The MystChip could change that, once integrated with his AI. It could even, perhaps, give him the ability to love.

]]>
But if it could teach a robot love, could it not also teach hate? How much more destructive might a creature like Maximus become, if it learned to destroy for the twisted joy of it, not merely for the achievement of some specific goal? What good or evil might result, if all the strength and frailty of the human psyche met and mingled with the cold ruthlessness of a mindless calculating machine? Melinda had been right all along. The power of the MystChip was totally unpredictable, and thus too dangerous to use.

"Chip ahoy!" a computerized voice suddenly blared from above. For one horrible second, Chip thought Maximus had somehow taken to the air and was swooping down upon him. Then he recognized the voice.

"Eddie!" he cheered, waving at the welcome sight of the Deus Ex Machina dropping toward the shattered island. "So you're my backup crew?!"

"Sure am," the ship's computer responded cheerfully. "For a while there, after the eruption, I was afraid I might become your cleanup crew. Boy, am I glad to see you still in one piece! Did you manage to save whatever it was Melinda wanted?"

"I did," Chip said pensively, stuffing the MystChip back into his pack. "Let's get it back to her as quickly as possible, okay?"

]]>
But just as Chip started to climb into the ship, he felt a metal claw close, vice-like, around his ankle. Alarmed, he looked back - right into the glaring red eye of Maximus! Or what was left of him. The tank body was gone, and what remained was the twisted, battered hulk of its humanoid extension. Its surviving limbs scraped against the earth, seeking the traction to drag Chip down.

"Fly, Eddie!" Chip shouted, pulling desperately against Maximus's mechanical strength. "Get us out of here!"

"Right-o!" Eddie powered the ship's thrusters, pushing the island away. The sudden acceleration broke Maximus's grip on Chip's leg, but two of his other limbs fastened to the sides of the doorframe, anchoring him to the ship. His eye fixed fanatically on Chip's pack, he began pulling himself aboard. Chip tried to scramble away, tripped, and fell - and the MystChip, jarred by the impact, dropped out of his pack and went skittering across the floor. With a wordless bellow, Maximus dived after it.

]]>
The next few moments were a blur. Eddie, perhaps trying to be helpful, swung the ship suddenly sideways, banking hard directly over the boiling maw of Isla Mystica. Chip, terrified but determined to protect the MystChip, leaped on Maximus from behind and grappled with his powerful frame. And Maximus, clutching the MystChip, twisted away from Chip's attack, lost his grip on the tilting floor - and slid right through the still-open doorway. Cradling his precious prize, he plummeted down into the fiery abyss, and was gone.

Shaking with adrenaline, Chip pulled the door closed and collapsed against it. Dimly he heard his voice directing Eddie to set course for Chip Grove City. There was nothing left to accomplish here. The MystChip was gone, and he had failed to protect it. But at least it would no longer be a threat. Nor would Maximus.

]]>
He wondered what he would find when he arrived at the clubhouse. Had Melinda enjoyed a more complete victory in unearthing Jude's treachery? Would she be disappointed to learn of the MystChip's fate? He hoped she would understand that he had done the best he could. His thoughts grew jumbled as exhaustion took hold, and he slipped into an uneasy sleep. In his dreams, he stood in a courtyard, and walkers danced around him. They whispered insidiously, "Don't be afraid, Chip. We'll answer all of your questions. Just find our secret...discover the lost hint...."

Behind, the flames and ashes of Maximus's tomb slowly sank below the horizon, and were gone.

]]>
It had been quite an adventure - pursuing Maximus all the way to Isla Mystica, trying to stop him from reaching the Mystical Chip of Epic Coolness, and ultimately seeing both Maximus and the MystChip destroyed in the volcanic eruption that had shattered the island. When Chip disembarked from the S.S. Deus Ex Machina outside of Chip Grove City, he hoped to be able to relax in the clubhouse while filling Melinda in about all that had happened. He was unpleasantly surprised to see the large, agitated crowd of Bit Busters surrounding the building, seemingly afraid to enter.

"What's going on?" he asked, approaching.

"It's Jude! He's betrayed us!" several voices exclaimed.

"He initiated a code red drill and evacuated the building, then locked us out!" another voice added.

"Melinda used her special override to get in...!"

"She said he's the one responsible for all the recent thefts! She's going to confront him...!"

"But that was hours ago, and she still hasn't come out...!"

]]>
Chip tuned out the confusing babble of voices, turning and moving quickly around the side of the building. He knew a small door that connected the clubhouse to the movie theater next door; it was so small that hopefully Jude would be overlooking it.

After a moment, he broke into a run. If Melinda hadn't come out yet, that probably meant she was Jude's prisoner. The traitor thief had taken her from him, and she needed him more than ever. He had another chance to help her; this time, he must not fail!

]]>
Chip moved warily. He was almost to the top level of the clubhouse, and so far he hadn't seen any sign of life. Jude and Melinda had to be up here somewhere!

A flash of movement registered, coming from the other end of the long room. An instant later, Chip felt the wind of a bullet that zipped past his head and splashed into the water behind him. Hastily he ducked into a handy alcove.

It seemed that Jude had laid a trap for whoever tried to come after him. He had placed a teeth monster patrolling the far end of the room, armed with a sniper rifle! Getting past it would be no cakewalk, but Chip had to try. He had to save Melinda.

]]>
Chip burst into the very last level of the clubhouse, and there they were. Jude stood tall and strong on a ledge near the ceiling, next to a door marked "Helipad", glaring venomously down on Chip. Melinda, handcuffed, stood behind him, looking small and helpless in her pink dress. But her face reflected determination and pride as she saw him. "Chip!" her voice rang out. "I knew you would come for me!"

"Shut up!" Jude told her brutally. He had completely abandoned his smoothly polished manner. Furious hatred painted his face. "You may have stopped my incompetent robot, Chip, but you can't stop me!" he hissed. "Melinda is mine, and so too will be her knowledge of the MystChip! Once I have used it to interface my brain with the AI chip, my intellect will become greater than any man's! I deserve her, Chip - not you! You've solved a few trivial puzzles for her, but I've been her partner for years, assisting in her most important research! Who do you think you are, to compare with me?!"

"Who am I?" Chip asked, looking steadily at Melinda, who gazed trustingly back at him. "I'm Melinda's friend. Can you claim that much, Jude? Have you ever helped her when she truly needed you, not only when it served your own selfish ego? Have you trusted her, even when you did not understand her? Have you faced death, for her? You do not love her, Jude. You've only ever used her."

]]>
"Perhaps that's true," Jude snarled. "But the fact remains that I have her. She's my prisoner! And all your airy-fairy prattling about friendship isn't going to stop me! We're leaving, Chip. The helicopter's on its way. And you'll never get through this last level in time to catch us! Goodbye, and good riddance." He turned sharply and forced his way through the door to the helipad, dragging Melinda along with him.

"Chip!" she said urgently, struggling as she was pulled along. "Jude underestimates you. You're the best puzzle-solver I know! You can do it. I believe in you." She gave him one last, determined look, and was gone.

]]>
"Hey, Jude!" Chip yelled, emerging onto the windswept roof of the Bit Busters Clubhouse. The lights of Chip Grove City twinkled in the coming twilight beyond the helipad, where Jude waited tensely with the captive Melinda. Chip had solved the last level in record time, and Jude's helicopter had failed so far to arrive.

"Stop right there!" Jude produced a small handgun, waving it at Chip. "One step closer and I'll blow out your puzzle-solving brains!" Melinda struggled violently, but with his superior size and strength Jude was able to pin her behind him with one arm. He and Chip stood in a tense standoff. Chip racked his brains desperately for a way to fight.

An idea came to him. "How about a trade, Jude?" he said. "You have Melinda - but I also have something that you want. The MystChip."

"Chip, no!" Melinda cried.

Jude shook her, hard. But his eyes stayed locked on Chip's, a hungry expression stealing across his face. "Where is it?" he asked softly.

"Right here." Chip slid his pack off and slowly, carefully, reached inside. Jude took a threatening step forward, but all Chip pulled out was his towel - folded over as if to conceal a flat object. He showed it to Jude. "Release Melinda, and it's yours. Just take it and go."

]]>
"We'll see." Jude gestured harshly. "Unwrap it. That had better be the real MystChip, and not some kind of trick!"

In a single, swift motion, Chip hurled the towel at him and dove to the side. An explosion shattered the air as Jude instinctively let go of Melinda and fired at the object flying toward him. Realizing his mistake, he jerked around, savagely aiming for Chip. But he never had a chance to pull the trigger. Melinda, overlooked behind him, sprang into action. Her hands still bound behind her, apparently unhampered by her dress, she brought her foot up in an awesome ninja-kick that connected hard with Jude's wrist, flinging his gun clear across the roof. It slid over the edge and dropped from sight. Jude turned on her, raging like an animal. But her next kick took him square between the eyes, flattening him. He lay dazed on the concrete, blood dripping from a clearly broken nose.

"The key!" Melinda told Chip urgently. "He's got the key to these handcuffs. Get it, quick, before he recovers! It's in his left pants pocket."

Shaking off his astonishment, Chip quickly did as she said and removed her handcuffs. After massaging her wrists for a moment, she threw her arms around him.

]]>
"You did it, Chip!" she said proudly. "Thank you so much for coming after me! Did you actually find the MystChip?"

"I did! But then I lost it again," he told her apologetically. "Maximus accidentally destroyed it, and himself with it."

"Perhaps it's just as well," she sighed regretfully. "You touched it, Chip. You understand, now, what it was. We still don't know what sort of accident produced it, during our research on the AI chip. It was one of kind; too powerful to be contained, too powerful to be let loose. But it was alive, Chip - I couldn't just destroy it. Now both it and its secrets are gone for good, and no longer our burden."

They both turned at the sound of the fast-approaching helicopter. As it zeroed in on the roof, Jude suddenly pushed himself up and raced away from them, grabbing up the towel and waving it over his head as a signal. The chopper dipped toward him.

But just as he was about to drop the towel and leap aboard, a very strange thing happened. A brilliant flash of something, like violet lightning, surrounded both him and the chopper, freezing them in place. The noise of the rotor cut off abruptly. Both Jude and the machine seemed to fade to transparent and then vanished, along with the light. A curious buzzing sound hung in the air for a moment longer. Then that too was gone, and Chip and Melinda were alone.

]]>
"What - what just happened?!" gasped Chip, staring in disbelief at empty space that had, just a moment earlier, contained a man and a large flying machine. Even the towel was gone, he noticed.

"I'm not sure...," Melinda responded with a small, secret smile. "But I think it might have had something to do with that towel. It was so brave, the way you threw it at Jude and risked getting shot yourself! You really proved what you said to him down below - a true friend risks his life for those he loves."

She took his hand and gently drew him over to the edge of the roof. At the sight of them, free and unharmed, the crowd of Bit Busters below set up a rousing cheer. The two of them stood, side by side, hand in hand, facing into the glorious sunset.

"I feel I should apologize," Melinda said quietly, looking away from him. "You've always been so faithful to me; but I've kept secrets from you. Secrets that ended up endangering your life. When I first met you, I pushed you away. I valued only intellect; to the extent that I would take only a Bit Buster to the e-prom, so as to ensure a brilliant conversation partner. I had not yet learned the value of friendship.

]]>
"Do you know who taught me that value, Chip?" she asked seriously, turning to face him. "It was you. Your intellect is impressive, but more than that is your selfless spirit. You truly are my hero, Chip. You challenge me to rethink my values, to become a better person and a better friend. From the bottom of my heart, I thank you."

Chip couldn't speak, could only nod, embarrassed. They looked outward again as the last rays of the sun disappeared and the stars began to dance across the darkening sky. After all they had been through, it was good just to stand there, feeling the comfort of each other's presence. Chip found himself wondering what the future would bring. He hoped that he and Melinda would have many exciting years, even a lifetime, together, solving the puzzles that were their joy. He hoped he could always be there for her. Even when this latest adventure of theirs had faded into the past, and become no more than a fleeting memory.

]]>
tworld-2.3.0/data/CCLP1.dat000066400000000000000000003322341475511570500152550ustar00rootroot00000000000000 "gd/gdnefee Key PyramidxCollect all the required chips to open up a socket and exit. Use keys to open doors. Green keys can be used infinitely. Tyler Sontag      j    "   n/                      k    Slip and SlidesSkates and suction boots let you move freely on ice and force floors. You can step off force floors while moving. Henry Pottsf I/GhRnPi"E kPresent Company\Flippers let you swim. Fire boots let you walk through fire. Watch out for moving objects.    Henry Potts `      *e* **  **            "   n/ g Block PartyABlocks can be pushed by Chip to blow up bombs and build bridges. Tyler Sontag ,.,,,/.,",n.,  FacadesiBlue walls can be fake. Recessed walls appear as you cross them. Some walls are permanently invisible. Henry Potts    @  ` ----n--/------"-@- -----c------B--@--------a When Insects AttackzYellow bugs turn left at every opportunity and paramecia turn right at every opportunity. Dirt and gravel block monsters.     Tyler Sontag]O"S+ 'n'/' +N+UUnder PressureeAs long as a block, monster, or Chip holds down a brown button, a corresponding bear trap is opened.    Henry Potts &&J$%$I#/nH&%(""(LNMM  1u1 SwitcheroogGreen buttons control toggle doors. Blue buttons control tanks. Red buttons activate clone machines.        Henry Potts +"".!De !i/nh))))i} Swept AwayVThe thief tile steals your footgear. Teleporters transport you to another teleporter.  J.B. Lewis_ !fdneg  ,)  ,  ," I --*--, -*--*I, --*-- -*-*-I -i **-*--I *---*-[ ***) *         V[      V Lh- &dL*/+**$(%*%*#%P'!1;c GraduationBeware of the teeth!      Markus O.b 5 j  n/HJHh g d"i ke V BasketballUPsyche, psyche, psyche! Bounce back and forth to collect chips and shoes. Alley oop!  Daniel Bouwmeester ^!B          e     @ - -        @ B @    -      @ -         / dn""zHiF>S-3 * 2  OjLeave No Stone Unturned*Sometimes things are hidden under blocks.   Andrew Menzies ,c  `PJ `n` Y"[D""""F" @ /@HP@   cThe Monster Cages:Gliders are the only creatures that can survive in water.       Andrew Menzies )   n g           )f        )       d  "e   )"Wedges Skye Climenhaga|D!      " n     !Twister Vehudur^<uB .2.G F GG EE QQSS     "D E.  .2 n 2.  . R Q              .2.S P!%iVB Tetragons     Rosabellisa i'FnH! " G+(Tiny   Ida R,!n ^^/--^^----------^^-----------^------------------^^^----^----- -----^--^---^-----------------------^-----^----""-----------^-""--^-^-^----^---""----------^--""----------^--------------------^^^---^----- --------^^-------------^---^ ^--------^--^ ^----------^^--^ ^!Square Dancing-Blobs move randomly at half of Chip's speed. N            Andrew MenziesV<  ]]]]])ed]"]*]]I].N] ]+] ] ]g-n)]%]/]!]]#i]]]]]"  tFeel the StaticLFind the red key, green button, yellow key, fire boots, blue key, and exit. 6           Miika Toukola#\Be -h  - -  -  -  -  -   2- Uk - n   -  -   -  -  - -D -gi *) **Y  . **$  . *g ... dLe!.. ) ( )  jNfG   #  %&F+'D##" '+&%ET1VU Chip Suey      Henry Potts    :   $        "   *" * *   "  "      * "    " *   " "  "  "" "  *  "  " nj    *   "  " "   *   "" /   "   " *"    *            G .  HGeneric Ice LevelMay the Force be with you! Miika Toukola#@c ene e/ee     " PzRepair the MazeNUse these five keys to remove the three walls that make this maze impossible. Andrew Menzies$ +XnFX "" ""K XXFHFJXX I"" "" XFX+?Circles       Markus O.^3% "  %  n   " "   &  / & "  &        &      0        %     # %     & # &    % # #   %  &    & % %      #   &       "  #  %   " "  % &   " F[Chip's Checkers/There are 25 chips here, but you only need 20. Andrew MenziesM"eggeggnggddddddeeen Mind Lock Vehudur2"     K      H K                  H                 H  K    H  H           K n H  !h R ETrafalgar Square   Daniel Bouwmeester,li"!d+k""!! ))fe5g  ))n&&%%#'&%IK++l8Teleport Depot   Archie Pusaka^(%           *   X  $$$   $$$   *Y'[* $$/  *Y'[*      *Y'[*    *Y'[*         Z   *                 ***  2   $ $ ^ $ *I HHH *$I$$$ *" *I$n$K* 2_* $$$K$**]2JJJK* $**** $  $\ 2%w111 +,11 ++++ 111 ++++:+1 1111111 111 1111m1The Last StarfighterYou are the last hope.                                   Dave VarbergxN! ) RR P RPP    )n" GF-----------GF-------------GF--------------------DE--------------DE---------D E)!VSky High or Deep Down $   Andrew Menzies*(---g#F-$L#- -H-$ ---M&%%/G n*#&  '+( d N'+8-B1Button BrigadegLet's put your button knowledge to good use! Don't forget that monsters can, at times, be your allies.         J.B. Lewis>O)   n           )                  )  )                        )  )  )                               )  )  )  )                                      )  )  )  )  )                                 "      ))))))))))))D  Quincunx Henry Potts ^(jI FFFFFF          **n**************'*'************* ******'**************'*********************'************************'* " /j++++++tNitroglycerin<       Andrew Menzies!c  n"))        ) )      cEu7777&Spitting Image Henry PottsY"^!InLHJHHNHK  KLHHHHHNK K (L HH HHHN"I""nJust a Bunch of Letters 6      Daniel Bouwmeester[#  ** ,, , **  O,J"(*k,n$O,,,,,, *,- R,i, ,P  h  |1.A Mystery Wall     Daniel Bouwmeesterw$ (e..edGG.D F. ))) ")n)g ))) .D F..EEfg..d2Rhombus      Gavin Duncan%-!--C-c-c-@-c-c-C-- -`Baacc ----`-"-ccaa-A---'----aACCc-----ccC------ab--b---b----------`-n---------------`---`c--+  ' b--   --b--- ---- --- * ---a--cccc--b---@ -B----`-- -------@-----b--- -B--ccCCC-AAA--!} +C Habitat x                   Tom Patten0&X%!   j+#  f )')dOkn     ()%g *i)$   )")e!10=Heat Conductor    Josh Lee'9" "       * *     @ n `    I ** K   P * * D   TT8 Dig and Dig      Andrew Menzies(!   .   .      .     . "   "  ."    . .       .     .  ..      . .  n       . .    .    . .! Sea Side Rosabellis)!(O(>N NNNNNNN n  )(N NNN#N% ))$"N   )h*Descending Ceiling                               Andrew Menzies*XW~$R Qh$SQS) d[-e#--I PgKf   IV -  R   - - P  !- !)-!- !- ....%- -     - -  -n"k!0$ 1 AFMughfe     Trevor Hedges:+:g   A c `  B "-ed--n @  b Ca  3Gears     Skye Climenhaga,)q!n       0      0     0   0 0                       0    0             0            0 0 0                     0   0      0                                   0               "             j!%Frozen Labyrinth Josh Lee}-,   L"))nU) --                  -       - -)  )   ) ) )    - - -) )- -- - )-)--- --O  PWho's the Boss?!There is no hint for this level.  Miika Toukola.^!ddddd dd dddd ddd d  dd d  dd"n!$Sapphire Cavern Josh Lee/ * ***Q *$ ***** *  **** * *** * ***** *n **** *" (X1& Bombs Away  Ida Rc0 !GD**F**eg*g*GGDGFGF*"ne*""*e"*DEDEFEE*g*ge**D**FE!).}w}OI Sundance (          J.B. Lewis1$S!kiDP   e.)P   g dD   .)nPD # f D   QO %RP j@"   Dh"(PB@49 Cell   Andrew Menzies2 b!22!""!2222!" \"!222!" "!2!"\ "!"\\" V \V %V V2 2V W% +%UW%++++++%UW%++#++%U\W%++++%UW%+++%U\W%+++++%UW%++++++%UW%+%f++%UW%+++k+++%UW%++++n%UW%++++%UW%+++%UV2 2V V %V T "  "!"\"!2!"\"!222!" "!2222!" \"!22! 1 111           111 1 'The Grass Is Greener on the Other Side x                  Josh Lee3, =i                   . . .. . .               . . .. . .      . . .      . . .. . .   . . " . . ."".   . . " . . n  . . .. . .    . . .     . . .. . .             . . .. . .                                    J)H2O Below 273 K Archie Pusaka@4^k ne    H"  & The Bone  Rock Gnreux5!n   ,X -- \ --k  .--e-  --T g!  .--   -h'   &%-+  &%#)  %/ "   i&(  P*&!*---@  k*&H- -*  -----  - a)  -   ---$*f M  --G--*   -D-----**   -----**   ---**Ed   --E-*     -2  -         j     ! 'BP1Start at the End0Sometimes, levels contain unneeded extra boots.       J.B. Lewis6( P n          *    *     *      *    *  "    *  " /  E ukfii[ Mini Pyramid6Can you find all of the treasure inside this pyramid? J.B. Lewis7}!    Q   Q  Q   d QgggddQQQnedQQege"Q"QdggeeQQd QQQ!M The Chambers     Daniel Bouwmeester8 m!................................................ . ... .......... ... .... ...........  ... ......... ..........................."n...". ,Connect the Chips Andrew Menzies9^4 d d  e  dd   d n/ j.. d dd  d!k    d < Key FarmingUse the keys wisely! Archie Pusaka:BP!- e ---\  - - --   -\-- ^ \- --\   ---   - -f   "   -"^ n ^" /^ "     -   -   -^  ^- ^  ^    ^ ^ -   ^-   -  - -- dg --   ^--^   -- ^ - ^ -  -- - !&----- ----- ------ --------- ----------------- -------jCorral5All the blocks in this level have gravel under them. &      Andrew Menzies;H!V   " " ""  " k........W"jni"U........h "  "" " "   T!, Asterisk  Jacques Smith<, j+))VV %% k- -k n     --JJ     HH-FFD D".-. ) -)-#f!9Guard    Jonathan BirchallP=!   n , , ,,    , , , , , ,,    ,  , , ,  , , , ,     , , , ,,  , , , ,     , , , , , ,  , , , , , ,,    , , , , ,, ,,  ", , , , , ,    , ,, ,   , ,  , , ,    , , ,  , , , , , ,   ! Highways Rosabellis>  !----e-- j `-@i  `-@ `-@@ -`--@Nf--(*`--d@  - ` -   -  - -  ""  -  "h"    ""  -  ""  - -   -  - %  - %%g--%%%+$-- %'%--%%%` -@%%`-0 `@% `-0 `@k-0 `- # -n-AAA-- -!1.3j Design Swap  2        Josh Lee?""  /      n        '+'+'+  '+'+'+ '+'+'+'+       ' +      '+' +'+     "j,    .'+ New Block in TownThis block is your friend.                     Archie Pusaka@Z?)n e***  *   *   *   *  * ***    hi***   *   *   * *** *     * *        ***** * *    g"     0f     )' Chip Kart 64 Andrew MenziesA mV"V "         n         " V"V2Squared in a Circle     Josh LeeB^!   --n--j)ek------VV--------d   ----""--""--""- -""----   d--------VV------ie)h----2    !1Klausswergner  Rock Gnreux\C') e .+( --*   HHPD  + -'''+)    )    .  . O(.$........ -... MNg .. ..   .*&*%+&  #P%  .$   ..% . & ). ..'.#P d $ G*...$...   . ".    ) n   -*        ) I )3'~(J11,19011Booster Shots(           Trevor HedgesD6!-n*----f---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------F----------------------------------------------------$--!A-^1b3Flames and Ashes  Josh LeeE^{   FFFF  .. --  -&#%-  ee      e**e kkDI$!"."e ddeendd q1>Double Diversion   Grant FikesF)/n  000   00  0 0           0  0      00  0 0    0 0    0 0 0  0 0  00   00  00  0  00 0  0        000 0  0 0 0 0       00 0000  "0//JuxtapositionZA blue wall square has landed on top of the thin wall diamond! Can you find your way out? J.B. LewisGG!      defghij"             . !      D           *    D*       . !!      n    *   R  W-!P 0 -.R 000-#.P- - %              !/Tree     Andrew MenziesHgl j%& '+ " i# n/ ..H*e! dBreathing Room-A fool and his fire boots are soon parted...   J.B. LewisI !nk -'---J--G-  --P-S-F---- ---'----- I-F- - - - --- -- ''---- '-- -  -- - ---'-----'--- ' ---'---G- '-- ------D--F---S --D----I-----'-R'--' -- ---- - --- -' "--!B!-<+++ + +i++X+W++++.+5+ Occupied           Andrew MenziesJ t  #  "     i    0  )-    0 )n  d h g#) &  VC  e 0  00   %  q$ Traveler  Mike LaskQK,p%% %&&%%%&&%&&% & %&#$L%%& %%%&&%&&%%&#$L%%%%%&%%&% %&&&%#n$L111> ToggleTank Archie Pusaka L!niGF+ D& /%F DE QR Y  e 222' '[P2  S2   &K Ic%  g  %K I  &  Z        -  -f  VV# -   - V TT% - -  - - d -- -   ---TT!7L \a_ 5u,FunfairdRide schedule today - Carousel, Ghost Train, Fun House, Ghost Train, Mirror Room and Fireball Show.   *             Tom Patten"M<     k   ji   J  e hN n  " #- H  % f(   dg     + Shuttle Run    Henry PottsNX&i, ,, , ,,, ,,,,,,,,,eedde,,,,ddeed,,,,dne,,,eddee,,,,,,,,, ,,,, ,,,"""""""",,,,,,,,,,,,,,,,,,,,,,,/,,/U,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+Secret PassagesYPsst! There's a pattern for figuring out how many ways there are out of each room, Chip!  Andrew MenziestO  $         JJJ H ....   $ J J J H .. ..       H H H    .. $    JJJ" ....H   H H H $   .. H .n. ..   J J J      .. $ H HH      .. ..  H JJ ..J  ..  $ HH H H       !111111 Elevators0    B            Henry PottsP!" %&---%%&&&&&%%"%%%%&&&&-#-%%&%%% %&&&---%%%&&&---%% %&%&&&-#-%%%&%&%%X%&&&---%%%%%&%&%&%%%%&& &%&%%%%&&%&&&%---&Xn&%%%&%-#-&&%%%&&%---&&%%%&&&%%%%%%&%%%%%&&&%&&&%&&&%&&&&% &X&%&&&%%%--- &%&%-#-&%&&%--- %%%---&&%-#-&&&&% %---&&&&% && % & &---%%%&X&&%%%%&&&X&-#-%%%&&%%%%%%&---%T% &%%%%%---&&&%%% &%%%%-#-&%%%&%%%%---&%&&&&&%%&%%%&% %&&&%&---%%%%%&%&&&-#-% %&&&%&&&---%!%&& &)%- Flipside  J.B. LewisQ1L..     M d Ff $  .. .(. . #.   -*    -'n-     -%   -P&   -  --..%" /-K*@i@Jeg**'  +OM  I+>1FColors for Extreme[Red with a twist. Orange of the fire. Green of tourmaline. And mellow yellow hello, hello.      Tyler SontagR"!- ------------------- -i---------------------------------------- ----- - - - - - - - - -2 222222hn222222222222222222222222---- 2- --2-----2--------""- -- "---------$ jLaunch  Zane KuecksSB\\\\"--*-\""-----OL--- - `----Y-- - B----*-*- --- -- -Q--------- --\ -O-F---*- --L-\- ------ --**-\- --------*---*-------T-\---*-- --- --*----\------ /n------ -X- N--\-------P------- --------M---X--- Q- -L---- ---(-*----------D---`---*------------B-----*---@------ - --- ----Q---*--K---X ---- --ctB11111!& %'A  ;*" " Ruined WorldYYou have now entered a world that has been naturally ruined. All chips are under blocks. <            Josh Lee]TXv    "  - --"---- -  - -- ------  ----- - -------- -- ----  -- - - --- ------- -------- - --- -- ---- ---- - - --- -- ------- ----- - - -- ----- -- --- -    ---- ---- ----- ----- ---- - - - --- ---- -- ---- ------ --- ---- --  - - --n- - ----------- ---- --- -- - -- -------  ------   -- --- - - ----  -----  --- ----- ------------ --"- --- - - "   Yg-g-g&g--ggeJd&gfg---g-g-g g -ggg-gg-%g-g4g -gd--g g g-g9-e-&/Mining for Gold Keys Andrew MenziesU)) K)) )) )) )) )))) ))    )) ) ) )) @B$c)) B@ )) @B)) B@ )) @B )) B@)) @**)) BC)) @AAef))   )) d)) ,)) /),)/)) )) )) R* *f*f"* I I Iff@` IBb")/n#%#&#%!+++41 Black HoleXSpace travellers should be aware of blackhole ahead. Space enemies, you're welcomed in.  8           Archie Pusaka>V^!--- -----------**-.-----g g-------C------)-------------* XB *----* @ *------------"-A----)-""--g g-----"-.-**----------------- -- ---n---E--  ----- -S-----  - -----  ---/--FPiRD---- - ----- -Q--- ----- -G- ---!-n Starry NightWOn your right, wait for a monster to pass in front of you before moving another space.     J.B. LewiscWQQQQQRRMP -- PR n @e @" - j     PR g         PR   k   H$ e- PRd** R P(-SSSiPSSSSS81jPluto   >        Andrew Menzies}Xk"- ---f-X---P -P---"---P-X X--""---X X--P-"---- X -D---X X-DD--DDD DD--P---XX-DDD D----X-D D-- -D  Dg--P--D D-- -D DD D-----P-D D--D D---@@-D DD-DD--@@@-DDD---DDD---@ @-DDD--P --@@--- -P---@ @@---P- ---@ @------@ -\---P---P-@ @-\ \--@ @-----\\------e@ @-\ \---P--@ @---P-\ \-----@@-\ \d---@ @-\\\----@ @-\ \---@ @-P-\\------@@@@--P--/-\\\\-P---@@@----n -----# E1- - -1111 -1 1 111111111-111111 111 11-1 11111 -1111111111111111111111111- 11- 111-111 1--1111 1111 1111-11-1 1111111111111111-111111-1111-111-OChip Block Galaxy3Every block on these planets holds chips under it! "     Josh LeeYI-*%+&f''+\-*0 *#)--- $P %gL"*e&e-@-..-*D"H).- Z-e0f 'Rd0 j 0  k0        VV"" k i""  " K KK MF !. F  .h F /(+ id !  '$+ 0   ' D     D    Dn).!*118+X.10g 0B Chip Grove CityyWelcome to Chip Grove City! Go through the city and get inside the Bit Buster's Club building, the one with the sockets.2   $       Josh LeeHZ!       *  ***  **  *  *  ***  *  %      **    **                                                                                                                                                                                                            &  &  &  &             '*  *  n-- -  --  - -- -+-" #/  --  -- !----QBowling AlleysjThe first four rows will show you where to bowl your blocks in three lanes. Gravel = Bombs. Dirt = Chips.  Tom Patten[\NGQn,#PdDP   GPDEP " "P"D&SEP %" e,DESEP  RESEP\ Roundabout 2         Jonathan Birchall\)!"""""                              n                      !,The Shifting Maze Andrew Menzies]^`  TG *%# *** $G *&# ****** $G****%# ** ** $G****&#h** n **"$G****%# ** ** $G****&# ****** $G *%# *** $G *&#  * $1?1?1?1?1?1?1?17f Flame War@          J.B. Lewis'^X!!---^-^--^--^--^--^--^-^-^^-^-^--^---^^-^--^----^^---^-^--^-^-^-^--^--^^--^-^--^-^-^--^-^---^--^^---^-^--^-^-^--^---^^^--^---^-^-^^-^-^----^^--^--^--^-^--^---^---^--^-^-^---^----^--^-^-^^---^^---^^--^-^-^-^-^-^--^---^---^-^-^^--^^--^---^-^--^-^-^-^-^-^---^--^-^-^-^-^^--^-^-^-^-^--^^--^-^---^--^--^--^--^--^--^-^-^--^-^-n---^--^---^--^---^---^^-^--^--^^---^-^-^---^-^--^-^-^--^^^^-^-^---^-^---^-^--^--^---"--^-^^---^--^--^-^--^-^^----^-^-^^-^-^^-^^-^-^---^^^--^---^-^---^--^-^-^^--^--^-^-^^-^--^--^-^-^--^-^-^-^----^--^-^-^--^-^---^-^-^--^-^--^-^-^---^--^-^-^--^--^-^--^--^-^-^--^--^-^-^-^--^--^---^-^-^--^^--^---^---^--^---^--^---^^^--^--^-^^-^-^---^-^--^--^-^---^--^--^-^--^-^---^-^-^-^---^-^--^--^---^--^---^-^---^^--^---^--^--^-^--^-^-^---^^-^--^--^--^--^--^^--^-^----^---^--^--^-!T$--------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- ----------------------------------------------------------- ------------------------------------------------------------%" Slime Forest Markus O.b_!2  2/Y Z2jTf22n Z X   )-&# #G%F &% %  !   e   )" )  NLNLJ QkS)  d g*Q ihGGc(-  $-'G-egd$ D++1 1 CourtyardPsst! Try HIUR for a password.   &      Tom Patten`2!...)\..).n ...../.     X X     X    X            X  X     X X  X  X      X    X          XX  X        X  -  X    "    -"B  X X(Going UndergroundUYes you have to deal with the walkers. Lucky for you, there's a few waterholes here! (    Josh Leea #    %  - &D/% )) )' -) $D"-------*-*--------------------*-------------*-----------------------*--------*-----------*--DD-DD-DDD--- -n----'f--'---'---'---'---'---'h1$K$-4+1+++++++-]11/ Gate KeeperHThis trap is controlled by the button in the left side of this section.P        Andrew Menziesb!)   S     R     R   R   R R    P"Q      "       "               RRn)RQQPR S S RP PRPR Pgd R e--P---RQQQPS---S-R*RP *PR P S RRPPPPS"d7   C  3;C$ Rat Race ^              Andrew Menziesc!                       n                                                                                                               !+Deserted Battlefield Rosabellisd^Gn k %kM/***k *****kk*H k    .    (Ok    k   k(  k#. `I f)+  Loose PocketMOops! I dropped my green key! I'd better go and find a way to get it back...   Rock Gnreuxe!+NLhiNL+eN  Le%LN%-- &NZL&  %L-N%NL&&%%**Z K ''/  ( # &g%g&g%S$2--W*n"+1]Time SuspensionhDon't hit the red button more than eight times! On the brown buttons, left is left, and right is right.   &    Rock Gnreuxf $!$GGGGDNOi'GF$E I"LNL g'Q  NNN-N  NQQ_NL(V aTL-VVbcLHWnUR U%$Sj$EE-&E$Eh ) -% ^^^#H P P P^^^^H P -^^^ P P e^^^^$^^^KKKK ^^^^k 2J^^)H 2 -^^^-IIII^^-f!F++++ 1 ++(++1++++1&+/++++++++++++ ++++++++++++1+1+11+1B+++++++++++1+ +++ ++++++++++++++++++++ ++++ ++++++$?Frozen in Time     Tom Patteng wJ"J"J"    $ $+$ $+$ $++ $ I $n " " $ K $ ++ $ I $ " "  $ K $ ++ $ I $ " " $ K $ ++$ $+$ $+$ $    "H"H"H3111e1N101N101N1e111 Portcullis                          Henry Pottsh        `h  0 'ed   '& &%  Q,e,  R*Q ,,,,d  gP* @,      eV -    -----     --,,,-- -  k      &"   Hg  $ P   Rgf  J    ELLF  * #@   B  ed(D  &&% n/ % ++w `1? Hotel ChipVChip, your room is #501. Don't go pushing on our blue walls or you might break them!    "       Andrew Menziesi,e ------g----n-e- -- -------------------------------------------------  ----- -- --------------------------------------------------  -k- -- --f-----------------------------------------------  ----- -- --------------------------------------------------  -- -- --- ----d-----+-)Tunnel Clearance Tyler Sontagcj #( '+'- *+-'- --%- *$--+ +E-ne *'--+ --- NTL1e'b Jailbird2      Markus O.vkRJJ!   ""  '-bB-' @` -- @--` 0.--.@------be`----`--`@@dB@--@--B`-i-aaaaa@b@`@B-@B`@``-h---------)S)) S))S))S )gg    -- `/n@ !#++o++)-Paramecium PalaceWUse brown buttons to wake the king bug or queen paramecium. All blue walls are solid. V                Andrew Menziesl^N!-n*kL    /*% e*-dNg%-)! d(  D"e ) V - [- e   g#  - if-!-Gb Exhibit Hall1You can look at the chips, but don't touch them!  J.B. LewisUm !#%#%#%#%#%%#%#%#%#%%#%#%%%%%#%#%#%%%#%#%#%#%#%#%%#%##%#%#%%#%#%#%#%%#%%#%%#%%%%#%#%#%#%#%%#%%#%#%%#%#%##%%%#%%#%#%#%#%#%%#%#%#%#%%%#%#%#%%#%#%#%%#%#%%#%#%##%#%%%%#%#%%%%%%#%#%#%%%#%#%#%#%%#%#%#%#%#%#%%%#%#%%%#%#%#%%#%#%#%#%#%#%#%%%#%#%%%%%%%%#%#%%#%#%#%#%#%#%#%#%#%#%%#%%%#%#%%%#%%%%#%#%%#%#%#%#%#%#%#%#%#%#%#%%#%#%#%%#%%#%%%%#%#%#%#%#%#%%#n#%#%#%#%%#%#%%#%#%%%%#%/%%%#%#%#%#%%#%#%#%#%#%#%#%#%#%#%#%#%%#%#%%%#%%#%%%#%%%%%#%#%%#%#%#%#%#%#%#%#%#%#%#%%#%#%#%%#%#%%#%#%%#%#%#%#%#%%%%#%#%#%#%%%#%#%%%%%#%#%##%%%%%#%#%%#%#%#%#%#%%#%%#%#%#%%#%%#%#%#%#%#%%#%#%##%%#%#%#%#%#%%%%#%#%#%%%%#%#%#%#%#%%#%#%#%%%%#%#%%%%%%#%%%#%%#%#%#%%#%%#%#%#%#%#%#%#%#%#%#%#%#%#%#%%#%#%#%%#%%#%%%%%%#%"%%%#%%#%#%#%#%#%#%#%#%%"'"K$+&%&%&%&%&%&%&%&%&%&%&K#!+1$ Green ClearPPressing the green button more than once is not recommended without assistance.   Tom Pattenun!\---  f%\---   \---    \-    \\\ ---  \\-  ' +- ' + ---  H  --  -     H                            -e      e-         g    * n        * *.   dgG D  . D  .    ....'. D   J..   $. D J i  !*#h--------1+A Badlands H Tyler Sontago\!n  **Ud *)  " "     )!  C    ! )       ) !#8gM,Alternate Universe   Markus O.pX<V![ % %**.*. %*.*.f %n #  . Y .. * .  ...  * . "-  S-j **g hi   *  X X    @X $Z Z * 'e  +' - +'d%% -- + %% -- %% -]- %% ---[%% O (P K  I   Y !.0F1,  0l Carousel        Henry Potts/q)k   n    )/")    /))8~Teleport TroubleRBlocking a teleport with blocks or other stuff could end in an unexpected result. Archie Pusakar^!n ...Z..Y...VP.V................W...G...D.bI...._..^....................C...Q....a.....@A.@....J..""........."".U..W."".........""..H....B.CB.....c....S...A............U........\..]....K`.F...E...................T.RT...[..X.. .!u Comfort Zone P          J.B. LewisAs.3!  -V- f-- --V -D- - -  - -A --- -XV- -)--- --V---V- *-- ---"-- --- -(I""- -V--- V"V- --- --- -- --V- -*--- -g------- -**LnN- ---V---X -----M **  ---R  . -X *--  . N .  S *  e e . Z  ` ` . O *  . ZG   . QG   LG  `e ZSDD I   ! K)  id `  =%9 "g[ -0--!-%+++ + ++!++!++++++++++ )e%q California P           Josh Lee8tXD%$+')P)#$'#  * + P  '+'+*$** ...%.+' /LL$ 'nNN. "egf"+''. +*ddd"*  )(*#$ + ()**'&%** ++& ( *%'#%  &+)+' *'( -&J1A1@1m11 Communism+Each tank button can only be pressed once.x        (         Trevor Hedges\u,7$%^^%%%%^^%%f%J$%.#.%%^%%^%%%%"  ^-)- ^-)-      - - %^- -%  % %^ ^ n- -- ^   F -F F ^-F D D D D  ^-  -   ^ -^ -e%% %%%-% %^-%%^% %%%-% %-%%^% %^%%-% %%%%   -g k- -- d \"8&    1&mBlobs on a Plane :        Tom PattenPv{EEEEEEEEEEEEEEEEEEEEEEEEE.fL(JR BeBe &)&n N- -i+/( HPEEEEEEEEEEEEEEEEEEEEEEEEEJR#-  &)&  Dd%)%00-- a F  HP[` -$EEEEEEEEEEEEEEEEEEEEEEEEEE-  * --'E D%)%00g0S0-  $E F **- \ HE -$----EEEEEEEEEEEEEEEEEEEEEEEEEEEK$ K$ K$ K$ K$ K$ E$I$I$I$I$I$IE1115 E-111! 5 A11111 111111111 1Runaway TrainHReach the locomotive to unlock the emergency exit and escape the train! h                                                Tom Pattenw Y!10P P,0P 0P  $P, R- -n1  S    0" P- -P  #    R -P   R     ,  --R 1 V -    P  R--PP      ,0* 0  -   RP1 R    1   %%% 1 PP  1 dd RP1  1  1 RR01111111,*!;cK1 ;H 04  ! 0LTe The Sewers  6           Tyler Sontagfx#!     !  1 1   i           !              1 1         i n !e|% Metal Harbor Tyler Sontagy^.#VV  V + )'  "n/        *  e   * * V      V B        )      ' &+Chip Plank GalleonnAhoy there, Chip! Check the upper and lower decks of the galleon for treasure. Oh, and watch out for pirates!    Tom Pattenz!V VVVV WVUVWVU nWWU WT UTTWTTT"TT"TT!bJeepers Creepers 8          Henry Potts*{d"L   * 0**0" 0*     0 00  *)0 **  e****e* * * ***)************0n/I$$$dd$a +1&The Very Hungry CaterpillarZUse keys to buy time. All blue walls are solid. Have 20 chips left after the first maze.   Andrew MenziesL|  )ddd dddE(((hQ. (#F((()#EED # (!#GN S# #--/.g#g .$ %#  #$+$$$# '$$# .-$#)$#*$#  $# $#.e )$# $.f .$DeKe +eKee'++ 'P'e+"+d ''H+j+eeI'ee+i+edn!Xf$geN1]1e?e 1&eeJ0Utter ClutterfThe slide below is for fireballs only! Make sure they're there before going through another red door.                        Andrew Menzies!}gd k#&&" &#en/ db Blockade>Other than wall, what negates force floors from carrying you? Archie Pusaka~ Bneik +    **! dfhe&  e% '"j  .  #. g & c( Peek-a-Boo  Ida R!i*  '  I+" **   I+  I+O   I+&  IM   I%  (  I/n* I   I          *  * '+h $k     * '  'jih          *          #            '  j!7;       0  1 In the Pink9The exit is right here. Use the pink balls to access it.2   Dave Varberg  s******    *   *******   *  ********* * ****** * *** ** ) * *** *** ****** * * *   * ** * * *   * * * ** **) * ********** * * * ** ** *** ** * ** **  * ***** ** ** * *  * ** ** * **  *** * ****  *  *   ** ** *** *  ** **.k!!j.* ***   **n/ * **   .i!""!h.* Elemental ParkZRent 1 boot at a time to explore this elemental playground. Get 8 chips using each boot. Andrew Menzies,2)....." -)II I))I I))III))IIII))III))I II)-)IIII))I I ))III))II ))I II))II I)-n)fFrogger F           Wes Powers~6 ' +' +' +' +' +' +' +' +' +' +' +' +' + * * * * * ** * * * ** n ** *  * *  * * * * ** ** * *  * ** * ****** ** ** * * * *  *  ** *** * * * * ** ** * * * * ** *** * * G Dynamite              Michael Moorman6%LLdg gdf)(N(N(L(NedgZN)egdXG$ &#$ % )      ) V U-'hnU U@ T    "T               *   !!1+PEasier Than It Looks   D    Andrew Menzies;ichk!!ih! !  k i  h "  """i i h  k !!nhSpumoni Henry PottsI2!   A  I S    D            X  TV          X          P    V   H       P         V    n                    X  G V  N         `         PG A       ( ""  "  [  O  (`   !cSteam Cleaner Simulator 0         Trevor Hedgesf )n/Q GOM  PDOLM  OM  RF  $"PD"    SPDE     ........ )-$$I..... ...$$I j )-  e   !! ))    $I  $ -- !J $$ ( $$  $$ kk $$ (   $$ H)H1Z( 1?11 14111(Ir)reversible@Can you get the chip and get back? If not, go that way second.     & Andrew Menzies! /  N  N"LL  n  L  L ON  MiO      ONNNM LL LL O OO NNN O OO L  MO   OO N  O  OO  MO   OO   MO   O M  N  (O(- .CulpritXYou can push this block down the edges of the center room and extract it at the bottom.                        Andrew Menziesz#=!                                 "   n                                      !  Whirlpool J.B. Lewis. he.!.  j) !"  k .!.    ! )d  !. fi n0p( Thief Street Michael MoormanX!jif$$(N-   *$ + )* d  g         0-**) $$ k*/ n '-**'***+- ***h *  eG'-G+!%11P111 Chip AlonejThose two fireballs are trying to rob your house! Capture them inside with your booby traps, then escape!   (   Tom Patten,B!nV  VVV   V"     V  VV  !4 Assassin   Rock GnreuxH(%&%V-$$V-H)$ -H%%e*-&& -)f&%$-d $% &JJa$G &% D d h$F) e %&  Eg& % %&$Qn$&% / &%S%)%$&&*i$&%%& %I$& &$% $K%& %&&%"d K # 1Automatic (Caution) Doors=Red switches will activate the toggle doors for 2.6 seconds.p            Andrew Menzies^pi jg ! ! IMM(k IMM IMM" IMM  n $jJh $eS    e  ee  e  e  ee  '+ee1$ 1$ 1$ 1$ 1{1'1oFlush  0             Archie Pusaka!                n                    !-Bummbua Banubauabgv Rock Gnreux5!FF----R---------SP----F------------D-P---E-F-----------P--------G-----Qn--D-----GP---D---P------------Q-QQ-------------D---R----"---E----Q---P--D-----S--D"/! p 22"^ Amphibia :        Archie PusakalXD&&&&&&&&&&&&&dKKd&&  &&& &Le &&(&+'+ &&&&' M &&&&..  && ( &&&&L..e e&&& & O&&(&+'+  &&&&'e  &&&&   & e    &&&    &&&H---- e   &gH&----    f&&----    +-   +- +---'------*--*---*&&&-'---'------.& &-+-----*---*-#&' --+-----*-.& &- + ---*-*---'&''&--e-----." - --*---/n"---*eH!d&g---C-,+"The Ancient TempleHExplore the ancient temple and find the Mystical Chip of Epic Coolness.n           Eric SchmidtK - K ^-*2*X 0 0-[  0 0 0  -*     00   00J  $-* * R - $-*2*A *@  *  )   B   2C    **     $*)* 2*)  *J *2)DD  K *2*  e   K K eVVe K K   Kn !0$$1@-1-112-"11kQw Chance Time!(    $    Andrew Menzies[A!BBCCC&! %AkAABBCCCC%'BCCC&%AAAB&% %&*%AAACCCC%BCCC&%& CCC&VF%AAACCCC&B %AAABCCCC&ZCCC&B!%AAACCCC&CCC& %&&&L&AAACCCC&CCC&&AAABCCCC&BCCC&2&AAACCCC& && BCCC%&AAACCCC%CCC%T&AAABCCCC%e%%^&AAACCCC%CCC% %%JBCCC%%CCCC% VVVV+CCCC%B#@@@CCCC%  CWC+++ DD'K^^^WK-VVVK@@@'K#%BAARRK-% ABg@++$K C@Bh@KXXX @A"n!!++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++$ +++++++++++++++++++++++++++++&++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++%+++?+0+ +++ 1+ +++++++ + ++ + ++ ++,J Cineworld                                   Tom Patten!R/Cn  P"kh..h.f!.!!!!!.!.!!!i!k !,!!.!.,!!j.!i.!.!!!.!.ej!.k!i!e. !.e!eeF!!! !e!. .e!e!!!!,!  e!!ee!!,! !eE..!!!e!!! , ,,!,,!, ,!,,,,, ,!,jj! !!.!!.,+'  !.,!+' !  .!!..,+' jj !!!!!j!!!...!.!! !j!,!!.!..!,  ,*h*!.!!, !,,!! C$Thief, You've Taken All That Was Me-Search for a thief. Do not get any red keys.    Tyler Sontag !$V F   /    n   j   h                                       )"                                                                                !)   k D $V!B1e 1B+ The Snipers/Use cover on both sides to avoid being sniped.            Tom PattenX   .' N'  -+ +nE/(B@  QQ- eRB  hP@ gSA---     d+ ++  +++ ++ +++++ +++++++      "  i"***** *** ******* ** **!(f ClubhousehClear the dirt tile above only after hitting the blue button. Then run to beat the fireball to the end!        Daniel Bouwmeestertworld-2.3.0/data/CCLP2.ccx000066400000000000000000000316061475511570500152620ustar00rootroot00000000000000

Chip McCallahan is now a proud member of Melinda the Mental Marvel's exclusive computer club, the Bit Busters.  It wasn't easy getting there - he had to make his way through the 149 levels of Melinda's clubhouse, dodging pink balls, unlocking doors, and picking up chips.  Some parts were frustrating, but most of the levels were a lot of fun to solve.

After he finally completed all the levels, he went back and found lots of crafty shortcuts and tricks to finish the levels even faster than he had done before.  His total score was now almost as high as Melinda's!  But eventually, while Chip still enjoyed the original levels, he wanted a new and different challenge.

Chip was having lunch one day, when suddenly, Melinda walked into the room.  "Melinda," Chip asked, "Do you have another clubhouse that I can explore?"

"Actually, some of the Bit Busters have been building their own levels.  Their clubhouse is finished now, and I think you might like to try it."

"Really?  I'll... I'll do it!"  Chip was overjoyed.  But little did he know the challenge that awaited him...

]]>
tworld-2.3.0/data/CCLP2.dat000066400000000000000000003267771475511570500152750ustar00rootroot00000000000000h$q!&%%&%n%(&&(%&(%N"NL"NNLM%O&MM%M&M%%&&%%(&%(%&(%&NNNLL"NOM&O%O&&%%%%(&&(&%(%LLNNNLO%O&MO&M%O%%&&%%&(&%(%&(&%NLNL"LNO&M%M%M&O&M%%%&&&&(&%(%(%L"LN LLM&O&O%M%O&%#&&%&%&(%%(&%(&%NNLNN""LO%M%M&O%O&O%#&%%&%&%%&%&%%%&&%&&%%&%%& &&#&&%&%%EA Fleeting Memory                  Drew Thomas9,X' ---g-- - @-n-@ - - -d- --  -- -- g--f -- --  ee RP  ih  Q--Se"-""" N<Naomi's Bug Collection   Paul Hobden  e**i *  * n -H-g--d---]-H - - h ""      f                   ) Bea's Den   Paul Hobden)             )). ! n         "! Kikh$ Force World Dave BorgmanP  (          "   n *****   ***  **  ***       M%    &R ,2#( Suction Ride  Mike LaskF! "%&%&%&%&%n&&)  O  )(-  DGGGGGGGGG F D   F D   F D #   D  D O  D  D    D  EEE !fFixing the Toggle Switch 4                   Drew Thomas{,<4!""h""        n  !* Slightly Mad Tyrethali AnsrathV^/    )          l              )      $    1n Use the Fish8Translate anything initially not ice or water from SGA. Tyrethali AnsrathA #      n   "k           (Maze of One Way Eric Schmidt; @ *  " *  n( ""/Q% M #(MWho Needs a Flipper?Chips may be under blocks.   Mike Lask A     l  B ) @      C`"):Deconstruction0   Tyrethali Ansrath X! g     n 0d  f  e  "!& Mazed In Tyrethali AnsrathN h$ K K      & "nK K %K           #I + Dz 6The Serial Port    Drake WilsonKn K( OM OM OMM OMM O O.M" O MOf.!!@k@jdDe7fi:gBhNThe Parallel Port "      Drake WilsonT@"@-2hnDDD-DDDP DDPDP DPDPDP PDPDPDP R PDPDPDPDP RR PDPDPDP RRR PDPDPRRPDP-RPli 3 L              Debug File                                      Dave Borgman`^"          "          l            >7,3,Paw-Print Isle Tyrethali Ansrath,6" "-#- QQQR QQPSS   -))-   -))- b $-))- HSn $-))- @ -))-   -))-  %% FEE GG   GGGD PP -#- DZYg11gDouble Trouble   ,   Dave Borgman^ B"n -  --  - - - -------- -----   -------  -----  -------  --   ---                   ---              ---  --  ---   -      -  ---  "A' Elemental Tyrethali AnsrathAJJJJJJJJJ%a"%b-%-`% HHHHHHHHHH% +'---+'n-V+'--e+'+'`Q %+'- H--- Q Q Q Q Q c Q Q Q Q Q I-RQ hX  SPV  $G  'JJJJ $GeC2"dd"$fAHHHH"#Z-*N .$1 - ?--<-+ 1_1 A Sample of Things to ComeF      r            Dave Borgman,8  - -  - -   - - 2 - - c\c - - DD - -  - n- \Tj\ i"  22   D\D   cc   2              ARanger Denmark           Anne Olsen,6-")--"-)e--`-- ------$--)e-     ----D-      -           $$$--     PPP-)e-$Q-P-JJJJJ-%%%%%Rn$-B-$-)g-$--$$$$$-&&&&& ---#- -"-- &-I("&$&$&$&$&$&-" &-Od"-gM"-Od"-fM"-Og"-""V~111111111?1++++++++++++1n Block Away!                        Dave BorgmanJZZ" f  D D D  D   D D  D   D  D D  D     n  D   D D  D D D   D  D  D D D   D      . .  . .  .. ... . .  . .   . .  How Goes? Anne OlsenG^ei` --'''''   +   #- "n D    'S$  %G  TDF  DD--DE  2+$1Traps IZ         (     Dave Borgman:^=, NJn/)LL      deg    M  +'  M(  -   -  -  -  \-  """   ""  """  ---  f  )     iO Sudden Death Remember...     Dave Borgman^3L#"/  l T $Race for the ChipsPDon't collect any computer chips unless you are way ahead of the teeth monster.  Kyle Wightman - -oiSREEE -h D -R  -P- -RD -P  -QQ D --EEE -- ------ -!!-  - -   -- "  - P-   -P -   - -  -S  -P    -S   -- -  -  - -  --a"  !DG!N Work Fast ,           Anne Olsen, en                                                           "      +&Frozen Floors Dave Borgman,$ $ - - - - - )- - n- ` - - - - - - - "- - " "* ` ` - "**)  - " "*  - "-  - - ` - -- ` - -C--- - -B--- - -@-- - -B-' - --@- ---B--- -B - -CB- -@AB- -B-AB- -B-- -B- -  $ $4   ++>++1.    Madness I(      ,          Dave Borgman$ !            $EE$ ""D  ""D  F""  F"" $GG$      n    h i!1B11B1TFire and Water       David StanleyC^A!)C' $U k  ")$ Ieg`IB@) $df-ihO'@$- /j c')! n)DKKI(!+Z111 +x+=1+++ Chase RaceJThere are very few safe spots here for Chip to stop at. Keep on running!             Kyle Wightman)nQ RP)   Q  P  hP !R RQQQQS$QQ \   \    \              (    # ON !h   "                % !B>8g)$"1>vWell of Wishes >               Tyrethali AnsrathW ,!    TT  T)   ")    o)     $/            T      )           T             T    ) )     T  T T                     )     ) T               T *)*               T    1a Tele-PortionBlock sure is useful.     Rolf Redford!W       '   J     K&(&        +e")       ,  ) g    OO   O    O    OI    OI      O    OI    O #     l!ZThe Big Button Quest    Christian Sthl"0z!n / ' ' ' '  ' '  '' ++++.. '' ++++ ' ' .. ' ' ' '+.)) +  *   .    . ++++ ++++    *  '%M*+" ++ fd ++++++++++ ge  +++++$# +(++ 1_ Cypher IItDear Chip, In some ways this will be the most important level for you. So, cypher, Chip, cypher! Secretly, Melinda.             Dale Bryan & Sarah Canale#IQ Q  #R"/"" "/""/" n.""g""@ Phd" "/"/".. /"""" %R]A -P    (IH  *.  K%**  IK   O  . M                  e   ZMirrorCan you recognise me???     Paul Hobden$[J                )       )        " h)  l )  !Spy Tyrethali Ansrath*%(c% #-P-NNNN l LLLL  "N ""  NN -   LLL-- $-)))))))P!1>The Mystery of the Seven Chips :                    Christian Sthl&~1 G1TGG1GG 1111111 D 1 1g11 DDD1 PP11 #%hi%U1 D1 lRR1D 1 !!11111111111-1S111b-111-11111-b1-11GGG1b-b1-11-b1 K11-11b-b111--f1 11-11 11--- 111111111111T1S a Mads' Rush I <                  Anne Olsen', ! h222"&%%%& .,,."&%%& !%  &  VV% #K  V& K V % K  & K V % K  V& K V &  K  V% K io  & K  % K &--% %% &%&%#######&% F&#% &%&#%&######/%! Np Yike-o-Matic!What you need is "Sphere-y Hot"! &          Eric Schmidt(,'''''     '' n ''+"++++D++++ Traps IIZ              Dave BorgmanY)>!   V  -   V    T   -  VT  -   V    T   -  VT  - n  V    T   -  VT  -   V    T   -  VT  -   V    T""   -"!/ Ladder Needs a Wash Exit corner.                                                      Drew Thomas*^%$$$Df%d&g%g&g*M*Q*A'----DD D#+ nMId111+mHmmm!NOT! You're far from done!     Eric Schmidt+2!                       "   N n $       #      I         T  D        $         )                P )          $ K $ %  $        (          !/Q1 _ !  h1O E 0111=h Ray of LightRun(      Tyrethali Ansrath,      j k  "   i "        "    "     z  h  n  'Fun House Rink Eric Schmidt-  -KJKJJ  -H- KKn/"-vBreaking the Rules7You'll have to break the baseball rules in this level!      Eric Schmidt._! ,-  F  $i     , ,,,  ,,,,$.,,,E,,,,,,,,,,-          H                '                '             `TT TT   #  k*%SM T+P/(" l!n11+ Hurry Up, Chip!4Run faster then ever to get through this one alive.     Christian SthlZ/^ gg gg  --gg D\\gg gg -gg ))gg --KKi n  e Dk DH)H )-- --/-D F)VV   V V  d Q \gP\^Rg^  S    !h8 MS""B    :~ Tele-RoomsThere is one exit. D             Dave Borgman0JG G G G n/    iTAnd Then There Were... Four?Who is the Fourth?   Eric Schmidt1<Sc    "" ""   n                                        ) )   . (Just a Minute!! Eric Schmidto2X !l I    0U0 h-QQ )!P , SS-)  j!  )     (K)  O    ! "hD fj             g h    k#  h W  !  ijekd% h!!*h? Smorgasbord     Christian Sthl3 n                       "                                 ,+The Lake in Winter Eric Schmidt4]          n     P Oracle I Dale Bryan5K H#&n+/(L& # %I H %I - %I '- %I  %I %I %I%I%I"(Security BreachjNow that you're in, collect the security cards and go on the next room. Don't set of the security system.         John Matthews6^> GFQQ   &HDE0 A--Y   $   HI i  defg  n i.k 0 X -V !-!# GN!R deFHDf%DgEO   (I( UM  ".   4s '1       v w Killer Rooms   F       Dave Borgmant72' SY RPQV   $ i $" $ $$ $PSPPT F QPP[ % -l +       V$  $     V$  $       V$  #     V$   $       V$  $       V$  $'d*X 1 a11  11 11;11;11;11;11;11IDangers of Fire and Beasts                     Rolf Redford85c `@;     E-b ":  C " ""-$) ""- V"-  - `- -- )-V - V   ) -V  -  -V  V---n-@  -VH  -HP ---)-  J Re'  +-' -  V' d ++?1Planet of the Teeth  X    Dave Borgman*9,<--!!!$-  D-k D-  - DD&  DDD   DDj ) i    )      h n$#  -!!! -   )$PP<15  < <  ,11 1111P Quad-Boot       Dave Borgman:V!n%.##.&%%%%%.#&.#&.#&%&..%&%%%&&.&%.&%.&%&%&&%&%&%%%&&%&%&&&%&%&%%&&%&%%%&%&&&%&&&%&&%&%&%%%&%&%%%&%&%%%&%%%&&%&%&%&&&%&%%%%&%&%&&&%&&.&%&%&%&%&%&%&%&%%%&&&%&%&%&&&%&%&%&%&%&&&&&%&%&%%%&%&%&%&%&%&&&%&%&%&&&%&%&%&%&%&&&%&%&%&%&%&%&%&&&%&&&%&%&%&&&%&%&%&%&%%%&&&&%&%&%%%&%&%&%&%%%&%&&&&&.&&%&%&%&%&&&%&%%&&&&&&%%.%&%&%%%&%&&%&&&&&&% &%.&&%&%%&%&&&%&%.%%%.&%&%&&%&%&&&&&%&%%&&&%&%&%%&%&%&&&%&%%&%&%&%&%&%&&&%&%&%&%&%.%%%&%&&&%.&%&% &%&%&&&&&%%&%&%%&%%%&&%&%&%.#%&&&%&&&%%&%&%%.%%%.%.%.%&%&&%&%.&&&&&&%&%&&&%%&%&&&&&%.&%&&%&%&&%&&&&&&%&%&&&%%&%&&&&&&&&%&%&%&&%&%&%.%%%&%&%&.%.&&%%&% &%&%.#.#"!/HReversi%Restart if you end up in a dead end. Kyle Wightman;`  "     T   -T  'KJ - KJ -T-WSS$''2)2)2 --U- 2)2)2)2'- V-- V)2)2)2) ---2)2m2)2V -W--')2)2)2) ---2)2)2)2'- -W- V2)2)2 --W- T-- ' - V- - jf g d-    -k i-  ec-[ ----d-----Y-Y---------- -  --------------Y--- -h----> 1+:-'2 vLot of Danger  .         Rolf Redford<Vi  j"      e      d k--" """f"J g"$Gn 15Internal Clock  Eric Schmidt=}  """%%% "" & & && """%%% % % %   & &   % % %    % % % &  && && &% %%  % % &  % % & %%  && &% %%   % & &    % &  %%  &% %% %%     % & && & %    %% %% %#&  %%  & %    & & %   %% %& &&  %% & % %  & % %  %% %& && &&  & % % %    % % %   & &   % % %  %%% && & & m %%%  & Icy Moat Tyrethali Ansrath6>)   -   J H  h    H   I         JJ  l  -                      )                                                        +i!***********************       *       *       "       *       ************************(M*#****#**==Chips on the Blocks  Christian Sthlh?  $I  ] V VVVVVVVnV"fV#21BJungle      David StanleyW@2 ddGBcRbAFQggRcBGQFAbeeGBcBbAbQ""nRcFSERAFDCPcADaPS`CDPa@Eee`S`SaPE@ggCDCD@EPaddC-------%--------%-------%--------%-------%--------%----f---%--------%-------%--------%-------%--------%-------%--------%-------$ Loop Holes               Dale BryanAdzl   a             a #            a               a             %  ) Vg d    g    e             h H * H  *          T   )        f-   e-  .-   -   T- *   "-   DBeware of the Teeth!   Christian SthlcBO"-"     c# #(% %% % V% %V % %( % % L-B l @-N % % (% % V% %V % %% %(# #a     "-"M0jNHobgoblins and Chimera   Tyrethali AnsrathFC!%R##DOd(D**.--   #i%T%V%W%   -                                         l"" g       "  *   "   k!3AThe One Sensible Chip     Christian SthllD^o%%% %%%%D-%%%%%%%%%%%%%%II%%%JHJHKK  - $n%J+'F) #* @#D # ) g'" I $$I  --I --&%&%&-P&%&%&%&-$I$%&%&%&%-&%&%&%&-R%&%&%&%-$&%&%&%&-&%&%&--X`\\kh1    ji,1  eR1+?1V1 Madness II  0  "      Dave Borgman"E,!"..."++."...+."+... .". .". .".."..+..".+."...".."."+ ".. ."+ +". ."..".+".."..+."....+"....".+".."."..."..."....."n........"!%So Many Chips! Dale BryanF,!o -   --       --         --               --                 --                      --           QP-            -RS           --                      --                 --                --         --       --   - " !--->5Killer Spiral  Tyrethali AnsrathG<(o%1 11111++111111i1111f111* *111K1E111* *1111111* *111#1W-#111* *1QQ11%-h1111* 1iQQ1#1-1111H1111&-1111(1#1-1111(111111H(O(((11111(1 1 111 111:1331111111311122111133311221111#1"11!2%111-H122111 11g112#111 111111%111&11%11T1111ja(>Mads' Rush II    Anne OlsenHHt!ndge                            edg                           ged      """k , , k***,,,,**,,"**e*d*g**,,,,***,,,***,,,,**,,,,"**g**e*d* ,,,,**,,***,,,***,,"**d*g***e** ,,*,**,,,***, ,,***,,k%hhh!@iii%Checkerboard I Dale BryanI@BBBBBd @@@@@@B@ @ C  @B@B --@ #CCBI C@B --B@ - @@@@B !@ @g@@!BA%n"u Bumble Boy P                Eric Schmidt=J,\V\VO\VODD \DD VV W-DD\VV -A \VV i-[ VV -!-[ VV W--  RRR- IRRR---h IM-- I \-- I Mf$$$n# IO\---  Occc@@@-)-  LL\ccc@@@--- I jO-!VRVNNN Mdge   O*   *   M k O)      """       *&% L*& *  L(LL K$ ' ' *   ^1M++"}b 4111(++++++++J******+ ,  Chip Search                               Dave BorgmanK,!........     """"""" nCCCC g...d. . ..... .CAC " "."  C. ... C. . ." ". . .CCC ..... .CACC f" "e.. .. . """""". . ...... !^C BuggyWall       Paul HobdenL,r i     "n)@@ @  ) $$$ P   h  $  " "P "Q ) ' "1Rn111PAP Fire Bugs      Dave BorgmanpM,)iEdg2 -Jn22 IB222  2IH.2 2 2/2e2 -  ]-Qd-]--   ]J      he"   I    I   K$I    I    ) *** k** **** **   1z Madd Maze;Beware: This is both mad AND a maze. You have been WARNED!       Paul HobdenCN^&nT,, ,D,!  ),D,.) ,D,. ,D,. ,D,. @)-..h--S-- .@i)..-,,,-  ) -P,,R-   -,,,-  --Q-- ) -"     Q'c HH  " " " " " "     Q$ .S E+1++'+++j+++++-+]1ZfglThe Search for the Exit  $    Dave BorgmanOxE   ))JJJJ#Q n ) ))JHHh   I K'L'(***  KM''*$* I '']'X*)* K K+'^'V*** I '($  G# "# ) %  i G  X /j+++<++8+!++!++1Cra-zy                J                    Drew ThomasP q/gJgg   d e      K   eg   I      e e   leddH"d/o----o3 Frost Swirl  Tyrethali Ansrath'Q                                   $S  * )              k              n  # W%&%&%&%&% $  )       h1k018 Just Enough   Dale BryanR,: n   %      %     %    %   %  % % PP %HP--P-)--)---Jcc$$ Paa$P $--$-)--)-$--$-" -$$$$$$$V"  ->"   -"    -"     -"      -"   )   -"   #"1@1Q*1*1*1*1*1*1*1iThe Block Stops Herep           Dave BorgmanSX#   )              ) *n   ) Warehouse I Tyrethali AnsrathT(H eH)H H0 H)-X0 h  0) .. ! " .n)i.....-....) @/   ...d     .... g    ...     !*uCrypts of Aganorak-Choose the right block after the chip socket  Tyrethali AnsrathU^o!o...    .. ".. ..   .  .    ... .   .   .. ..  .. .   ..  . ..   . . .   . ..  .                                                             7!..=... ..... ......... .................... .. ..... .......... ........... ... ...................;Follow the Glacier Brick Road Tyrethali AnsrathV^!L -Z( (&# !-k$!  `$!-T e )   -!           -DIj    g ) (M-$O$- )RPIh--i))!I d -K0-J+Jf !J!J@'n) * 1[1~D1"1 -zCreative One-Ways            Eric SchmidtW2C3Z$"Z  Yn/  $  [A181    dThe Walker MachineQBreak open the walls, and grab the chips hidden inside. Watch out for walkers!!!  Hank LinZX o I$II$III$I$I$II ")) JK   !))K  !)i I!)!) )..)h)! )K I      ) K  I!h!!))).K  I ) //)/l!<%$$$ $$@111<1b111111Don't Get LostDon't get lost!P      Eric SchmidtqY -VT--T)HTHTHT" #   )%Q@@l- @@ @@ de , - Z"+ H - H ,!h IH ,g    T YH if ,,,  ,g,   ,   F'   FH  -     W  --Z*uThe Ghetto Defender  8         Christian Sthl|Z d ) i      )n               )       )   C   CC!  CC f    e    ba  bK ) b"-  b  caj      ) ) jYMarjolaine's Maze * Christian Sthle[Bk n  d hj% )ig "gfhi-%QQK(R)Pe$MdRP  !#e: Tutti-Frutti   Christian Sthl\&w3    !  @ B          - \\2 @ - \\\  - \h\    - \\\     -- \\      A   .   .    V . V l .        .    V . V      .     .        "  NkWAbandoned Mines (         Tyrethali Ansrath]J   I  J I I   HHHH HK     H  edfg H  I I %  I    edfgI J J   I * H    K J     IK    n HI K   H 00d hk1 FdfU,,,,*" ,,,,Aeg@ "+p, O^ Exit Chip :          Eric Schmidt%^#J "#$%&%+'+'+'+'+'+'+'&%&%&%&%&%&%&%&%&%&%&%&%%&%&%&%&%&%&%&%&%&%&%&%&&%&%&%&%&%&%&%&%&%&%&%&%#%&%&%&$%&%K######&%& #%&%"*%&%# &%&&%& %&%%&% &%&&%& % % % #%&%*%&%#% % % %&%&&%& % % % %&%%&%% % % %&%&*&%& % % % #%&%%&%#% % % %&%&&%& % % % %&%*%&% &%&&%&n #%&%"%&%# *&%&######I%&%$&%&*%&%#%&%&%&%&%&%&%&%&%&%&%&%&&%&%&%&%&%&%&%&%&%&%&%&%%&%&%&%&%&%&%&%&%&%&%*&%&G$G$G$G$G$G$G$%&%$#" H,1111111111,1Checkerboard IIF   X    Dale BryanW_^"K K K K--- K** K) KU K'lHBX"@K-K---D@K)B---@-K K @---K--+BHI--&eLearn  4     Tyrethali Ansrath`Ai S S S *Q Q Q R*P P ***  R  Q Q  RQP R RSP P P  R Q    S P R  RQP **  RSP**P PR S S** ** ***   **"l*****/****    $QQy/        >         Q1Glider and FireUse them carefully! D             Rolf Redforda  n * .*- * .* -* .***[_ **** .***-" **_** .**** f*)* .*** _ *e .**[_**--h **e#( ***) -- *  **D*e**.e%**$*.g-M***-) ****d*** *@ 1DERoller Coaster     Eric Schmidtbxnh#i11%11 d11 *11d11 1g *1Tj111 11* *11 111#111111%%% 1111111333331111g1111333331e111%1113333111#13333333 11##13333331RQQ11113333333331-11333333331--e---1113333331R---f--P1113 331-113 31-1!!1 31SSP1!!11%1!!1# 1112211111%%1( M11122111111T1 211T1JJJ1J11122111T1i12#111T1"111"11 11"1%11111"#%11&11 1111 111 -- -(d2CLoop &      Anne Olsen_ct n.)    .....d...  . ............ ... , .., .., , , g ") . . .. e.. f..$.G1_17.+*One-Block Sokoban Eric Schmidtd?--FF-----E- --------- -G----E- ---------------E--G------------- -G---E- -------------o-E- "iDDDD----nATorch      Tyrethali Ansrath|e!",#%AJJJ""-H$g'+     dH\\     H \  H ^^  H   l- ^ H,   b, ,  H   V  h    H          i!1_f Hard As Rock  &     Christian SthlfA   "    % IG%  )JG%  %   JIG%   G%                         J     J ** L    #    d * l *(      J    J      $      $   ) $.   C   . R*C -.JC J JJg  #1Tf*i1<1n Chip's Fight     *       Christian Sthlg' ) %% +H RQ % ,  +g,,+ feSP )+"G$E%F-d((In_h   LMHMO      .  2 222  H*2  %*2#222.  ***i2222 1zIsland Hopping(       Paul HobdenhBP3d(LN  # (  & ( && L &&& ( && & % J& % & &&&% %&%O %&% #%o&....'.&/+&W U"'%#&&& U  %. . %W .. U e%  W U  .  g .W .. .. U   W .. U  . U  U  . W ..  W .. U U  .. ..  W   W .. U   ( U   W # !^+{Pyramid"You need to hit one button twice.         Tyrethali Ansrathi, i-- PD )-))     &  !N$# %n(;Ip1J* ******!=Yet Another Puzzle   Eric Schmidtj^*^ %%%%Sl"# 6.       (Bounce  Tyrethali Ansrathky * * * * *   *   **   * * *   *   *  *  *   *     * *  *      *   ** * * * *      * **  *** ** **) * l) * % Joyride I Christian Sthl"l@R  GF    n )I  d IDE e   -I g -K)     '         (  if    "      SLLLL    -     :.          '         ;.s + d- : 2+.>*'(V?QTricks     Dave BorgmanlmXL)LNN ,%** PP,   % %%  #**  **(     $**   **$  ,   *  ,P  ,    $'    ,  ,gggg,F,$ n) 1+++++++++++++++ 1++++ 1++++ 1$ kV1Gggjgggg1 Blocked Trap X   B Dave Borgmannp/) Kn))   I  )I)    IIK))H))       "!(-------BIt's a Kind of Magic       Tyrethali Ansrathoe1 K$I$ I \11( K0 1  _"(L.   1..011(1%'G*1L.1V% 1..11$1L1.1 [ 1 UW 1 1 En1e #S S0V11J11 "11 1]IIII 11 1111V11H 1h1 1 Cg1 111 V11@11c 0111a 11i V11D111 V1 U 11P1V)1)DVUb1BVN[3)$$$MA1+ 11 1$-11!1 1111 11111111 111*1611=1111111111hlMonster Factory         Eric Schmidtsp,!  n        h               >!/> !/   *.  ) !            )"_, {tAfter the RainstormFUm, you can't go this way. It looks like your house has been flooded. Eric Schmidtq<!%&%YY&%&%XX&%&%&%&YY XXQ % &%#%&%&RD&%%&& )&%&%# l #%&&% D&%&%&P&%%&#&% % SXX [[%&%&&%&XX&%&%[[%&%)""!SOorto Geld II ,           Drew Thomasrdr                                  """    ""   """                       l) & Joyride II Christian Sthlsv!RnRR ...... ......  .QQQ..PPP. ..RRR....SSS.. .QQQ./.PPP. ..RRR....SSS.. .QQQ..PPP.  ...... ...... SSS"ECounter Clockwise Worried yet? H            Tyrethali Ansratht VVW UW  UW ( UW  UW  UW  UW  UW  U     n  &J'+N%MJ'&+%J'M&+J'%+&J'+%OJ'&+%J'O&L+ J %  "   W  UW  UW  UW  UW  UW  UW # UW UTTB                                     B Turn Turn TurnF         Dale Bryanu> h!di!gi!! j    e !  ! !  ! i !! !!! 2 h!n!  !!!   !!!!    j ! ! i       ! ! kh h       " *= CircleMazeDon't waste your keys. David Stanleyv  N i O h    MN  ONk .V L .. LL"   M  # &O M&&j&MO  * !+   MLOL /  . n  (I(')gh "  ""  ""  " .  %V......  %%!.   %V......  -%%.. %V.j...-I%%...F%V .....D!#-%%) .....%V* *.......EI%%i7efHigh SecuritynI filled this level with monsters, spys and traps to guard my chips. Look out for items under blocks. Melinda  <     Paul Hobden8w^K 0 !!V "   .    .   'g *V    V    f) k     *(  V*n*VM,, M  *,V,   gd",,  k),,)  V2 ,,,2,j,V,2,V,O  ),,2, !,, 2i /,,, V   *       +-+~Teeth4When brushing teeth, use three up-and-down motions.        Eric Schmidtx^O       " """"""" "n" """"" " """""""" " """"" "" """"""" "     Mx                        ) Frost Rings Tyrethali AnsrathLy,iG   jk)  !  $*   ! h          D  n) !  %0          ###     !  !                 1 0 Flame Boy  Eric SchmidtGzl          ...n            '''   '                                                  +           +           +           +           +           +         +'        +         +'        + ''        +          +              +               +              +      'O Warehouse II Eric Schmidtv{ )!n * j * $ *                                    ***                                   *  *" *  *" *  *"!1b/ BlockSlide Anders Kaseorg|T* i  -  ` `) )  aa `b   --  b````````  ` ``        `-c   b -c-!   --/   b--c   `  ` b    i   b``   `ee   bbee    heee`   b!)ee   j een   `e    a -ea- -       `   -   `   ` )! j      `     k`- se~  Paramecia%Keep your pets in view at all times. V              Eric Schmidt}, *$K- @kU**)D(F- *Ke* --@-$ d $ -*nh/!.MC* F*!*---@* """ ---B ")" ----A* $""" * ! k*   f  E ***   B** g ** * *$ * #   % HA?114111Blocks 'n Bombs3Be careful of your blocks, they can't be replaced.(       Paul Hobden~0 %  x    $$ JH$$   $$J  $   nEE   EE j G  G    E E    G  G  !   E                  /O $11711H11611C1{Dodge!H                Eric Schmidt6%#nH--   5b `   5--- - - 5- 5 -Q V  5RP - f --S -S PRgQe/ e jEscape from ChipkatrazDon't let the guards see you.       John Matthews,!         #"" "h---  --  -  -  -    -- -S&nK$- !514Fantasy Island  Drew Thomas<X ,, d, \, , \H,  , \Hf, , $, \H,,j,k,,, ,\ H,, , , ,\ H, , , ,\, , ,  ,\,, , , ,,\\\ig, ,,  , ,\\\ , ,, J , ,\\\ ,,,,,, ,,,,\\O ,, ,,\\\,,, ,,, ,,G, ,,%, ,,,n, , ,&%",(hE%+*# O-PH$'ed#% -&- ----KeHb 1b1b#Miscellaneous                                Tyrethali Ansrath31...    ".n  ...Oq   . . .        .. . ..    'Frozen Birdbath Drew Thomas,n*&%QT J`$T`BTT/FTT/BT T#\#\#\#\IFT T B`Y FY `Y B`YY FY Y B  F`/B` FB`M S$/ O O ".$Q Q !1 13hefjdkg(g T Time Bomb!You are standing on a hint tile.    v                          Eric Schmidt,)$$$$$$$QQ)RRRRRRR1h                                nl1PPPPPPP )$$$$$$$ )J 1111111/n1111111+ CapturedCOh no! Chip has been taken to a prison camp island. Can he escape?p         Eric SchmidtM!     % % % % %&       % % " %     % % % "    &% % % %  -  % % %  n   % % %  ...  % % %    .. -  % % %  .  % % %    . $  % % %   ..  % % %     &% % %        CC  ---  @  -  gB ---   g-     g--   --@ *     -- B *   AA* -   - -        I - *     K  - # e c   I -     K  -     I -    K  -  - `  -  d - !]f1h- 9T Block Maze   Tyrethali Ansrath{'%!&%%%&%&&&% j&%&%&%&%&% .%%&%%.&&%&&.!.  &&%%&%%&&%  &&%&&%%&%%! .... . V$U!2+ i!j '  $$.\.!!!!.+D+'+.!   k!h' W$T !+H!H.....C%&  B$f!'  ,,,"..@n .  .,@2 ` ` ,,,AL-g$ ,.....  .. 2.. .....(NNV---Vg--V--.-VVV-.ggg..D--V--L#LLV---VBP11N',11 q+/ +E1%(^ Microcosm;The middle square can be thought of as a map, if you want.2       (     4             Tyrethali Ansrath !           *          V ( N j  '   '     ge/     - B   &#%   -    S* dled        $+k...- "eeeW....$EEeee. ddeee...T. dd... .T. i .   !s1F*** ** ** ** **? **+ * ** ** ******r1 Zartacla;One path to doom, two to openings, and three to salvation.     Tyrethali AnsrathXE!&%%%%&&%&&#%&% &&%#% &&#&%%&%%&&%&%%&&%%%#&%%&%%%&%%&%%#%%%#&%&&%#$n&%%&#&&&&&&&%&#%f%%&&%&&#&%%#& %%# #"%&%&&&""&%%&%&%%"!1. Switch Hit David Stanley?4dgeeeFLgMO% ) &gLdN)MO eidgd(N-ed)NLgdegMOeG%-)OM#gdeef))-  Dl"#\I--)----*-- ----J--&-_-T----!---.OIron Mysticus "      Tyrethali AnsrathmX!N---dedNeLLd-O------"-dNNLggg-eeM-OOd-g( eNdegM-ggO Odfle -(Odeed!I Patrolled       Tyrethali AnsrathGL""          "  "       n         T    "  "          ""L+                        O    O                        + Frostbite  Tyrethali AnsrathX2$+2.2%2&!&22%222M#%2222222M#i22222222222222222M#22222222222222%22M#22&22222O 22222222O2222222222O 2&22/O VVVVV"-W----,g----- ---,,-------,,-------,,  --O#I '---  K    )  ) f *#ggO)&*HHg)&*#g(g #,,)&& %* N)&& %I#g,, ,)&& %I#L)&& %#,#,, ,)&& %M#g#Og,)&& %#,, ,)&& %I#L)&& %#I,,,#,,)&& %)&& %,)&& % ,.e )&& %n31ek3<-^#3d Keep TryingWow! You made it this far?!   :      Eric Schmidt!$n                  %  &** **************** *# * 1-* Oracle II Dale Bryan X  &VV.$.#.  &$    &     &   & V    . &!$ #  & $ .  & '  & '  &    & '    V*  ,,  , %! ,,, T V,,,! %,  ,,,,V ,* ,'  ,'W&   ,'W&  ,,W&  W& . W& # + !W& .     + W&   +W&    "W&   W&  .#.nW& 1k?.+VhVEV?V\+%1MM1+Q V i0VVj  V Chomper Romp<       J   Dale Bryan#i jdddd  H#HHHH  -  -VVV-d -VV-j" d -VVV-.eh -' n.  Z  . j ) Hj *dIc *  *$d d**%&d*hd%&+ '*d*Ujd% $ )M&%&.N&d&L%ddd%.. \O&d&B d @\&%& .\\\\ (\!c1N+17Trapped      R  Tyrethali AnsrathXoU!       )  "Gn              T/!!!) k...'.K . J...$$$ ...)P K.*#...*...*...*H..*.H*..**..**..**...*K*!B*******3*******#1*******3***i***3*******3*******3******* &+Z WormwoodfSymbolically, what kind of armor do you want to use a block as? Think of them as old-fashioned nails.    Eric Schmidtt!) AA c B) CCccn`b `b B@a`a  AC b@ `a b @BAA B` CCCcb @ ` B aa --k--VVV- h iV- ---$-EE -M'[-_%''%] $**"+-HH----**"+-M_%''%]$**"+( ( #'$[ QQ$!101\1"11[ Gauntlet<      ( l                   Dale Bryan'(I(NNN j R  I --+n  -  LLLLH J0k* R-   I"  V-- -- -GGGGHHHH--h--JJJJJJVI+# '-$FFFFF-%IJ J J J V%&%I  %&%&IQ &%&%I - %&%&' &%&-K*** EEEE/-     $* $*     -!(m#1[*2ic+1` Run-a-MuckYou are almost done!   d                     John Matthewso% *f(*Q* * $*$*'**+ g*   '''+d*+*+**** *  ' * '+E  *+  *&L **n*e"#*/&-* %$PP $  * '*d'+*** ++****'* +1v%111pCloner's MazeMNo fast maneuvers or split-second timing required here! Just use your brain.Z              Eric SchmidtX!nGG$     eL Ng %&"   M  M  O  O M    M HHO O*** ++++P$''''$P (#!(111Neptune(        Luc LongprX&" %%#%%JH%%%%%"%%%&%&""&&"&&&&&%&%#JH%g&)   -AA B@ ^e  -B@fCC **-  ***'+'+  ***g***$I *****d  ****I$  *** ***  *****   *****   ***o ** *d**e  ) *D!11,i Key Color       David Stanleytworld-2.3.0/data/CCLP3.ccx000066400000000000000000001126161475511570500152640ustar00rootroot00000000000000 "Chip! Where are you?!"

Chip McCallahan slowly opened his eyes, put on his spectacles, and made his way toward the front door, coughing as he went. His hair was white and he walked with a limp.

But this was only because he'd just fallen off the kitchen table and upset a can of flour over himself while trying to reach the jar of cookies on the top shelf. That was pretty much all the excitement he'd had that week. Even though he still had a lot of fun at the parties that some of the Bit Busters organized every once in a while, he missed the exciting days of exploring the two clubhouses that Melinda and the Bit Busters had built.

]]>
"Good heavens, Chip!!" Melinda exclaimed as he opened the door. "Look at you! I'm not letting you into the new clubhouse like that!!"

Chip's jaw dropped. "New... New clubhouse?! Did you say 'new clubhouse'??"

"Yes I did," said Melinda. "You'd better get ready if you're up for the challenge."

"Boy, am I ever!!" Chip declared, starting to dust himself.

"By the way," Melinda continued, "the clubhouse also has an exclusive Bit Busters' lounge where you can drop in between levels. I'll be there too, keeping an eye on your progress..."

Soon, Chip found himself at the doors of the third clubhouse in his illustrious career. Would he be able to solve all of its puzzles?

]]>
"I'm done with 15 levels already!" Chip announced as he entered the Bit Busters' lounge excitedly. "This is easy!"

"Well, that's because the first few levels were made for you to remember the rules of the game," Melinda told him.

"Ha!" said Chip. "As if I would ever forget the rules!"

"Really? Did you even know that there are actually two sets of rules?" Melinda inquired.

"Huh... What? Different rules for the same puzzle? How's that possible?" Chip asked. "And how do I decide which ones to use?"

"Well, the Bit Busters have seen to it that you'll be able to solve the levels in either case," Melinda replied. "Haven't you seen the two doors at the entrance of the clubhouse? There's one with an 'L' on it, and one with an 'M'. The door you enter through decides how you'll experience the levels. Which one did you choose?"

"Uh... The one near the ice cream stand," Chip answered sheepishly.

"Well, after you play the next level, try it again going through the other door," said Melinda. "You just might be in for a few surprises..."

]]>
Chip wiped the dirt from his jeans and strolled into the next challenge. But before he could start, his eyes spotted a note tacked on the wall. It was a dispatch from Melinda!

Dear Chip,

In many ways, you will be tested along your journey. This is the first of quite a few levels you'll face that appear to be unsolvable, but trust me - it can be done! If you can't find a way into the exit, just remember to use only what you need along your travels.

Logically,
Melinda

]]>
"Phew! I'm exhausted," Chip thought to himself. "I think I'll rest for a bit in the lounge."

As he plonked down on the sofa, Chip noticed a couple of drawings lying on the table. He rubbed his eyes in disbelief. They looked like parts of maps of some levels - levels that he hadn't yet played!

He leaned back and started thinking about what the rest of each level might be like. Then before he knew it, he had dozed off. In his dream, he was in one of those levels. It was all hazy, and he couldn't see beyond the parts that had been drawn. But he had to find a way out...

]]>
"Chip! Wake up!" cried Melinda. "Good grief, you'll never be done if you keep loafing around like this!"

"I... I'm sorry Melinda," Chip answered. "I was just thinking about these levels here and--"

"You were not supposed to see those drawings," Melinda replied sternly. "These levels haven't been completed yet." She paused. "And we're not sure if they ever will be..."

"Will I get to play them when they're ready?" Chip asked eagerly.

"Don't worry about that," Melinda snapped. "You'd better just pay attention to the next level for now."

]]>
Chip strolled into the next level, where he could hear the familiar sound of clone machines spawning monsters. Suddenly, an alarm pierced their quiet whirring and buzzing.

"Genetic Experiment Overload!" a computerized voice announced. "Vacate premises immediately. Self-destruct mechanism to activate in T-minus 12 minutes and counting."

Chip searched frantically for some way to stop the clone machines, but it was fruitless. The machines continued to produce more monsters beyond their normal capacity.

Mustering all his resolve, Chip began dashing through the maze, searching for a way to the exit.

]]>
Chip had escaped the clone machine madness, but the self-destruct countdown continued to tick away.

"Self-destruct mechanism to activate in T-minus 4 minutes and counting!" the computerized voice declared.

Looking down the corridor, Chip saw a sign reading 'Control Room'. "I must save the clubhouse," Chip said to himself. But as he raced towards the door, he realized that the Bit Busters had probably installed half a dozen layers of security around it. "Hmmm," Chip thought, "I wonder what kind of security checks they put in there... Combination locks? Passwords?"

He was about to find out.

]]>
Chip had made it to the master control panel! Rolling up his sleeves and bringing all his experience into play, Chip hacked his way past every authorization prompt in the system, trying hard not to get distracted by the constant flashing of the sign asking him to download the latest update for Flash Player.

Within seconds, he had reached the final screen, which presented him with a neatly lined list of checkboxes, along with the prompt "Select rooms to deactivate". Chip searched desperately for a 'Select All' checkbox but - horror of horrors - there was none!!

"Aaarrghh!!!" Chip exclaimed, hitting Down-Space-Down-Space-Down-Space-... as he selected the checkboxes one by one. But just as he clicked the 'OK' button, he realized that he had missed out the very first checkbox - the one for the room that he was in!!!

]]>
"Whoops!" Chip yelped as he ran into the neighboring room, hoping to find a way out. The lights had gone off, and in the fading twilight, Chip could barely make out three doors in front of him. The door on the left said "Authorized Personnel Only" and was evidently locked. The one on the right didn't look like it led outside. In the middle stood a solid-looking lead-lined door.

Instinctively, Chip flung open the middle door and hurled himself through the doorway - all in a single action. The very next moment, there was a terrific crash and the sound of metal flying all over the place as Chip knocked down a stack of soft drink cans in the refrigerator that he had almost jumped into. But what was even more astonishing was that there was already a man hiding inside!

"Find your own hiding place, son," the man growled. "This refrigerator ain't big enough for the two of us!"

"I'm sorry, Doctor," Chip apologized. "Will you be in there for long? It's an emergency."

"For 19 years they kept me in cold storage," the man grumbled, "and then they make me hide in a refrigerator..."

"Wow!" Chip exclaimed. "And some people thought that I was out in the cold for a long time..."

]]>
"If I may interrupt you two gentlemen," the computerized voice broke in. "Now what was it that I wanted to say? My random access memory fails me... Oh yes: Self-destruct mechanism activating in 10... 9..."

Chip quickly hit the 'Defrost' button as he shut the refrigerator door, and then pulled open the door on the right to reveal a small closet containing a jetpack. "Ah! Dangerous," he said to himself as he strapped it on, "but at least it's scientifically proven."

What happened next happened quickly. Chip was propelled up a chute high into the air at precisely the same moment that the room self-destructed into a roaring mass of flames, and the refrigerator soared away into the distance.

A couple of minutes later, the fires started dying out, and Chip descended back to Earth. He now had to find a way out through the rubble and the simmering flames, but he had a feeling it wasn't going to be easy.

]]>
It wasn't long after Chip had scooted out of the remains of the control room when he heard a familiar voice.

"Chip!" cried Melinda. "Chip! Are you alright?"

With a sigh of relief, Chip brushed off the dirt and dust from his tattered clothes and cheerfully ran toward her. The two embraced and caught up on all of Chip's recent escapades.

"You were very brave, Chip," Melinda gushed. "Nobody else I know could have held the nerve to solve seven Sokoban puzzles and select 64 checkboxes while staring death in the face."

"Wait... What?" Chip responded. "Only 64? You mean there aren't any more levels?!"

"Oh, not to worry, Chip!" Melinda replied. "The Bit Busters had foreseen that the genetic experiments might get out of hand some day, so they started building the rest of the levels elsewhere. But before I tell you more about that, there's something I want to ask you..."

]]>
She smiled shyly, trying to avoid looking Chip directly in the eye. Chip smiled back and directed all of his attention toward her.

"Chip, do you think it's time we took our friendship to the next level?" she asked.

"I agree," Chip replied. "But just where am I going to find that next level?" he demanded, peering over her shoulders to look around the area.

Melinda sighed. "They're in a clubhouse in Chip City," she told him.

"Chip City?" Chip responded, perplexed.

"It's going to be a long journey," said Melinda, handing him a map.

"But you know how I love to find the quickest way possible!" replied a gleaming Chip.

"Well, I have to look after the repairs here, so I won't be able to come with you," Melinda continued as Chip began to crack his knuckles. "So let me warn you, that the levels in this clubhouse are going to be a bigger challenge than ever. But I'm confident you will do well!"

]]>
With Melinda's encouragement, Chip said goodbye and soon set off on his journey to Chip City, excited about the challenges that lay ahead.

By and by, the night grew dark, and Chip reached a house in the middle of the woods. "I think I'll rest here for the night," he decided.

]]>
Chip City was now just a train ride away from the seaside town that Chip had reached.

Unfortunately, he had run out of money along the course of his journey thus far and couldn't afford the train ticket.

But luckily for him, the travel agency offered him a part-time job as a tour guide.

]]>
Chip had finally completed a long, eventful journey to Chip City and stood at the doors to the new clubhouse. Although tired, he was eager to find what new tests awaited past the entrance.

Melinda's words echoed through his mind: "The levels in this clubhouse are going to be a bigger challenge than ever."

Chip gingerly opened the door to find a swarm of gliders circling around a small room.

"It's good to be indoors again!" he shouted.

]]>
As Chip completed another round of Bit Busters-style checkers, he stepped into the next level with confidence.

"Ha!" said Chip. "And they thought they could stump me with a checkerboard again!"

He started exploring the next level. "Whee!" he exclaimed as he slid around its force floors, finding computer chips along the way but also feeling like he was gliding in circles at the same time. Soon, what seemed like such a simple puzzle turned into a dizzying nightmare.

After a while, Chip frowned and recalled Melinda's earlier dispatch. "I know she said that these levels could all be solved, but I'm just not seeing how this level could be..."

]]>
As Chip completed yet another level and ran around the corner on his way to the next one, he bumped into a walker carrying a mop and a pail. Behind the walker, a couple of blobs were creeping around, cleaning up the floor.

"Alright, buddy," said the walker. "Clubhouse's closin' for the day. Out y' go now."

"Hey, walkers and blobs..." Chip replied. "It's been a while since I saw you actually doing something inside a level. So you guys are janitors now?"

"Some of 'em Bit Busters voted us out o' the levels," the walker responded grumpily. "Said we fellers just crawl 'bout randomly, and wuz always gettin' in their way."

"Not as hot as when you guys used to chase me in swarms, are you now?" Chip snickered.

"Oh, we ain't dead just yet, boy," the walker replied coldly. "And there's still enough of us in there to give you nightmares... Now scram!"

"Okay, just one more level for the day," Chip declared, ducking past the walker and into the next level.

]]>
"Okay," said Chip as he reluctantly left the clubhouse for the day. "I'll leave now."

"Hey, buddy," the walker replied. "You still lookin' for some adventure? I got just the thing for ya."

He handed a Chip a white key. "Cool!" said Chip, eagerly grabbing the key.

"This here key's for the door of that old mansion down the block," the walker told him. "Nobody lives there 'nymore, so you just go in there and have some fun."

"Thanks!" Chip responded as he started down the road excitedly.

"Yeah, nobody lives there," the walker said quietly after Chip was gone. "But I sure didn't say nothin' 'bout the dead that's still a-roamin'."

]]>
No sooner had Chip stepped outside the mansion's back door than he heard a sharp whistle and found himself immediately surrounded by a group of policemen.

"You're under arrest," a policeman told him as another proceeded to handcuff his wrists.

"Huh?!" Chip exclaimed, astonished. "For what??!"

"Breaking and entering, unlawful use of explosives, and stealing chips," was the reply.

"That's ridiculous!" said Chip. "I was told that--"

"That's the guy, officer!" Chip turned around to see the walker from the clubhouse pointing to him. "He stole the key last night when I had my back turned!"

"Interesting," the officer replied. "How would he know when you had your back turned, since you look the same from both directions? But anyway, I'd say there's enough evidence to nail this guy..."

]]>
Chip realized that he had been framed.

A few hours later, he found himself confined in a prison far away from the clubhouse. But he didn't intend to stay there for long...

]]>
"Free, at last!" Chip said to himself, letting out a quiet laugh. He crept stealthily through the dark, secret passage leading out of the prison until he could finally see the daylight shining through an opening at the end.

Chip emerged into what seemed like a wildlife sanctuary. Looking at the map, Chip realized that if he could get out of there, all he had to do was swim across the river to the beach near the clubhouse.

But for now, he was out alone at the mercy of the elements and every type of creature that he had ever known.

]]>
Chip trudged through the forest as he headed toward the river. Suddenly, the ground under his feet gave way, and down he fell through a deep hole until he landed with a soft thump on a heap of non-recyclable plastic. He lifted himself up and started looking around the underground tunnel.

At one side of the cave was a table. On it stood a bottle with "Drink Me" printed on it, and a cake with "Eat Me" written likewise.

"These are way past their expiration date," Chip remarked after a brief examination. He continued exploring deeper into the tunnel.

In the darkness, his eyes could make out a lamp lying in a corner on the floor. "I wonder..." Chip thought as he picked it up and opened the lid.

]]>
The next moment, there was a flash of light followed by a puff of smoke. And then a frog smoking a cigar hopped out of the lamp onto a rock in front of Chip.

"Kiss me," said the frog, "and I shall grant you three wishes."

"Huh?" said Chip, thoroughly unimpressed. "You've got it all mixed up. That's not how it works."

"Okay, okay," the frog replied. "I'll tell you the truth. Melinda sent me here to give you a couple of hints for the later levels."

"I don't think so..." Chip responded skeptically.

"She worded them as dispatches, of course," the frog continued. "But I thought I would make things more interesting by setting them to verse."

"Good grief!" Chip exclaimed, frantically looking around for a way to escape.

]]>
"Okay, here's the first one," the frog began before Chip could object. "Ahem..."

To reach the very end
You must root again for your friend
Who will journey on his/her own
To help you through the final door

"Political correctness has no place in poetry!" Chip groaned. "And that didn't even rhyme correctly!"

"Hey, look," the frog replied. "It's not like I do this for a living. I have a full-time job at the clubhouse trying to get to people when they're stuck. Well, anyway, ready for the next one?"

"Let's get it over with," Chip answered, bracing himself.

]]>
"Okay, here goes," the frog continued.

In a level with a pi
There's more than meets the eye
Look before you leap into the water
And...
uh... you'll live happily ever after

"Okay, enough! I'm outta here," snapped Chip.

"Well, so am I," said the frog. "And just so you don't get lost, I'll also let you know that this tunnel leads through a series of caves under the sea until it reaches an oil rig. I'll catch you later in the clubhouse."

And with that, the frog vanished slowly, beginning with its teeth and ending with its exasperating sense of poetry, which remained for a while after the rest of it had gone.

]]>
Chip had made it to the shore, but he had no idea where to go next. Pulling out the map, he located the isthmus that he had just crossed. To his dismay, he found that he was miles away from the clubhouse.

Some distance away was a moss-covered rock fortification. The map had it marked quite clearly, and below it, scrawled in pencil, were some handwritten notes.

Rock Castle:
It is rumored that its cellar contains a hidden portal into the clubhouse.
But has anybody been able to get hold of the red key to the cellar door??

"Hmmm," Chip thought, setting off determinedly towards the castle. "I suppose it shouldn't be too difficult to locate a red key..."

]]>
"Hey Floyd, you gonna eat that?" Chip heard somebody call out.

"You no worry, Bob," a voice closer behind him replied. "There plenty to go 'round for everyone."

Looking around, Chip saw a gang of teeth homing in towards him. They were talking about Chip!

]]>
After the lengthy challenge of the last level, a pleased Chip stood proud after swimming to the exit, unaware that one of the gliders nearby had followed him through. Without warning, the glider knocked him unconscious.

Several minutes later, Chip woke up, stranded on an island. "How did I get here?" he wondered. "Maybe I should've taken the title of that last level a bit more seriously..."

]]>
"I did it! I did it!" Chip exclaimed, overjoyed as he ran out of the final level of the clubhouse. Then suddenly, he froze in his tracks. Outside, waiting for him, were the mayor of Chip City, the walker who held a grudge against the Bit Busters, and a couple of police officers who were evidently having a hard time trying to handcuff the walker's legs.

"Mr. McCallahan," the mayor said, "I'm extremely sorry, sir. Robby, here, has confessed after we conducted an inquiry and found several loopholes in his story. On behalf of everyone in Chip City I'd like to offer you an apology, and this plane ticket for your ride back home."

Chip gleefully accepted the ticket. "You'll have to pay the fuel charge, though," the mayor added.

]]>
A few hours later, Chip alighted from an airplane to a rousing reception from the Bit Busters.

"Hurrah for Chip!!!" the voices echoed.

Chip anxiously scanned the faces in the crowd. "Where's Melinda?" he asked.

"She was too busy overseeing the final repairs of the clubhouse," one of the Bit Busters answered. "She said that she would meet you at the clubhouse tomorrow morning."

"Oh," said Chip, rather disappointed.

But then he cheered up. For tomorrow would be the beginning of a new journey with Melinda, and hours of racing together through the clubhouse yet again as they tried to solve those puzzles faster than ever.

]]>
When Chip finally returned home, he was tired, very tired. But he was also very satisfied. After all, he had just finished solving the last few levels of the clubhouse, and they had been some of the toughest puzzles that he had encountered. Still, he had a strange feeling that there was something that he had missed.

He lay awake on his bed, thinking back to all the amazing challenges that he had ever faced. His eyelids grew heavy, and soon he was having a weird dream. He was back in the first clubhouse being chased by a swarm of walkers. Then suddenly, he was seeing those unfinished levels whose drawings he'd seen in the Bit Busters' lounge. Nothing seemed to make sense...

]]>
All of a sudden, Chip woke up. He pondered upon his dream and realized why he felt that it wasn't all over yet.

Those secret levels that he'd seen in the lounge... Where were they?? There was only one way to find out...

]]>
It was midnight when Chip reached the clubhouse. He sneaked in and quietly made his way to the door next to the control room that said "Authorized Personnel Only". The lock had been damaged by the explosion and was yet to be repaired. Chip's fingers nervously grabbed the handle and pulled the door open.

As Chip climbed down a ladder leading down into a secret underground facility, he looked around nervously at all the monsters in the room into which he was descending. Why weren't they moving?

Then he smiled, realizing that they were all asleep. "Cakewalk!" Chip chuckled as he tiptoed around each room, collecting all the chips.

]]>
Taking a deep breath, Chip opened the last door of the clubhouse. Then he gasped.

The room was completely empty!!!

]]>
Stunned, he walked to the corner of the room where a table stood. A sketch book lay on the table. Several sheets had been torn out of it, and crumpled balls of paper filled the waste basket. Chip finally understood why Melinda had kept these levels a secret. The last one had not been completed.

"I've got to help Melinda make this level," Chip said to himself, lifting a pencil. Then dejectedly, he put it down. "But how? I've never designed any levels," he thought. Then his face brightened. "But I've played lots of them. I'll build a level from my memories, and I'll make it a level to remember!"

]]>
Through the night, Chip worked hard to fill the level with pieces of just about every kind of puzzle that he could think of.

And when Melinda walked in the next morning, she was surprised and delighted at what she saw.

"Why, Chip!" she beamed. "This is just - amazing! Thank you so much!!"

"You're welcome..." Chip mumbled bashfully as she wandered around the level admiring his work. Swallowing hard, he decided that the time had come to ask the question that had haunted him throughout the night.

"Uh, Melinda...?" Chip began.

"Yes, Chip?" Melinda asked.

"There's something I've been meaning to ask you..." said Chip.

Their eyes met. Chip stepped up to where she was standing and got down on one bended knee.

]]>
Then picking up the hammer that he had left lying on the floor there, he asked, "How the heck do you hammer a panel into place without bruising your thumb?!"

"It's an acquired skill," Melinda replied, smiling.

She walked to the door. "Would you like to join me for lunch?" she asked.

"I'd be glad to!" Chip replied. "What time?"

"Just as soon as you finish solving this level," Melinda replied with a twinkle in her eye, as she stepped outside and locked the door behind her.

]]>
tworld-2.3.0/data/CCLP3.dat000066400000000000000000003402131475511570500152530ustar00rootroot00000000000000\,$ Y!*%*-'*- *--*- k*-*!-f@i* --*- --g@j$+-  --D- T --d@h- -i-  ---   -  -   - -*    -/  " !- % #M  , n,( !*,  ,,,M k (.  .  .e.......)))...e.. . ..,!/1ekEntrance ExaminationRemember how to play?      Tyler SontagPf "                                         *  ** *n** **B&Snakes and Ladders FireflyX     h!  . d  Ei! e ! .!  '+ n L  ('  hj% S*&#%%%i )&%I *))&% ) &%%%#&& ))%&K ")%& %       !k                 Mh+KA Walk in the Park    Tom PattenW^ *    *) 0  gd n    d  gei) ek   * """ ..".".."."."".."."..".".".fU/fESuction Solution...and a block solution too. Mike LaskX#&"#""#"&%&%#"%""&%"""%""#"""%"#"#"""#""#"&"#"# """#"""#"""" 0""""&""#""% ##"""""""#%"&""""&"%&%"#%#"#""#"#""""""""&"#%&"#" "#""#"#&"#"""""""%""%"""""""""#"#"n"&#%"#""""""""""#"" """"%""""#"&%""%"""#"#""%"""#"&"0"#%"%"%"""""%#""""&"""#"#"&""%""" &#"""""&#&""#%#""%"""""""""#"""#"""%#"&"%""""""&"#""""#""&""&"""& """#&""&%"#"#""&#"""""""%"""#"""%""#"""#""#"""&"""#"#"&""%"%""#"""""""%""""%#"#&""#"""%"#"%"""#""""""""&"%&"#"""%"%""%""&"""#%""""#"#"""%"""%#"#"#""""&"""""&%"#"%#"""#""%"#""""#""&"%&#"#&"#"""O# Toggle Bust Blake Ebertx h  h!) "n )))p-Thieves and Teleports Joshua BoneL++"ge    S    S      n     P       P R    P R      P R    P R      P R    P kR      P R    P  '' c AN H               [hDancing Gliders (          Rolf Redford3x_J  $   '"""   n         _+1@ Pigeonholed       Scott Feeneyq     ) )   -N  + -  * L  ' (%     "n d          e$      #    D@     1TFRedoubled Effort     Joshua Bone d nj    ***       4$Annoying Wall Wes Powersg &                          H"n"           "O_Q ) Blue Blocks  Jacques Smith7 ,++''+'+V ''n'+'+ '" ++R My Friendd            Joshua Bone "   n$ F21, Road Block David Stolp$Ynihkjdfge********"             #!Window Shopping Ida R  dd              n               Bumper Ida R,!e*$EE $*LJKI !hJ@ n..d...(.h..!.e..!HJJHMMM I/f$EE $*@.""%V  .%)   P I)QA   * #  B@   A    Q    .B@      .      JPC     /.      'A..   . Q._     . !    JZ* *   eh2 *F 2* dj'' e**'!.......   j *+. .!. @ + g  !G31(+1+++ *+1 1[/ k++(++b+'*'S4Two Sets of RulesaIf you're still alive after reading this hint, you can also push blocks while walking past them.<       H              Mike LaskU} *********************************   n$Q " 1, Lot in Life  Wes Powers!         * $E  0   0 V      $H   $ h K!/I i!HJi-n I-!Ihi ! K!h K  "  #%V  Q ' + $   ' +    '+    ' +  k!111ReplayXYes, not all the chips are required. Which ones should you get to get the fastest time?(           Mike Lask:\            nI I   ) ) )   ----   ---- - -  -  -   ------  / ----)---- ---- ----  --- "                     I  ).  g) ed 1kQ Super Chip+But Princess Melinda is in another castle.  Ida Rl "  $%'&.FEgn *d .%++&% ..#..# *%.ef.%1:9Rock      Craig Vilbigf-1-11 V 11 -11 V 11 -1W U1 -1 1 -1  1 -1  1 -1  1 -1W AA U1 -1 B@ 1 -1 "-1 -1B@1 -1CC1 -1 n 1 -1    1 -1    1 -1   1 -1    1 -11    11 -11  11-1- -CMud and Water        Joshua BoneN-n $!k-"h -i--Q-$- ----1:11Damp   Dan Millerp,"!n "  " P  ***   **    ***               ***     **  P   P  ***   ***     **     ***        D      D      ***    **     ***         ***    **    ***  ***    **  D  ***    !1 Map the Path    Wes Powers&)n))k )f) DF   e)  g)d i   DF*   .  JJi   !"DF J  KK  J   DFJJhj -.{{9 AOC Impossible?        Mike Laskx$S .................... ............ ...... ...R... ....n...." ...P... ...... ............ .................... 3/ERecessThis level is possible too!  Jeffrey Bardon2Xpee eg         g%j jgL ie( & dd        d   h  #-M  n*d %ge    e f    i  g   % e.!. dh#! "gg!$Spiral  Joshua Bone)* #******.&%G***.&%***** *..&%DF *..%*** .&%E***...&%*****..&%%**** ..&&% ***..&   %&%" %%% e)g&  ) )!$d .      - e-CideA-*----Pgfd *P eeed- 2 $ * @ gg 2 0! +  + I @ +  @ +     T  ''  kH @ ''.n 1v1* hW{Jumble(     Tyler Sontag V   - 0   0 0-A   c *% %* )))`T"P@) *%K %*    Q    # n #        0 0   6Pac Man       Jeanne Hoffman(  ".geiihd." ""...."" ." %".  en #/d L* g '!d*N!h gd .! ! i.K*.k R/RP/P .! h!.!!. d de k!!e g..e '/k  ."K*". ""!."" ".fkedh(." +&+c Tool BoxThe green key comes last.      J.B. LewisK,yR* f*n V*  #  &%0e * +- * ' .$HD.$g./D.  DdHv1!1Problem Solver^The glider is your ticket out of here! Don't release it until the column of bombs is cleared.      J.B. Lewisz              n       " "  "      j                fRdd(Bouncin' Blocks Gavin Duncan ,vJ %%%% % % % % %%%%"%%%%/%%#n%%%%%%%%%% %  % % %%%%% mI%#M Pearl Diving#How long can you hold your breath?  Joshua Bone!<l 0 %E *.&/ )!'- n(#- $- UN- (g"AAA +II2ih+B1L++M Vague Dream    Madhav Shanbhag3"V /     %&%    %       ) ***#***     g.       %  )E)V&VK j d-.g%#%%#&% Ai) &---   %%(i EJ &&&X--'  h(%%#  &  %%(! -  P &- #%%#/ggR$`-'Ld+* --g.* Fgg$..-dOM----- --- f---! n "I H-eY+D-^-7 11++ Motion Blur-Each creature can be quite a character, huh?   "     The CCLP3 Staff#xfn+-&--V-&- &-&--&-&-&-&-&-&--&&&-&-&-&--&-&-&-&-& --&-&-&-&-&-&&&-&&&-&&&--&-&-&-&-&-&-&---&-&-&--&-&-&-&-&-&-'-&--&-&-&-&-& -&--&-&-&&-&-&-&-&-&--&-&-&--&-&-&-&-&-&--&- &-&-&&&-&-&#&-&-&--& -&-&-&-&---&-&-- &-&-&-&-&----&-&-&-&--&&&-&-&- &-&--&-&-&-&-& -&-&--&-&-&-&-&&&-&-&-&--&-&-& -&-&-&---&--&-&- &-&-&-&&&-&&&-&--&-& -&-&-&-&-&-&-&--&- &-&-&-&-&&&-&-&-&-&-&-&--&-&-&-&-&--&-&--&-&-&---&--&-&-&&&-&-&-&-&-&--&-&-&-&---&-&-&--&-&-&-&&&--A!-6 MonsterMaze   David Pinkston$,!## en&%&%&%    C J-    Y$  J  aJ   J * AJ    %  E & eee  * eee Q * eee *. ]*# $ -*E'R* HH* *( - M/-  OFI $ K M" K!'1P1+1Zelgon's LairYou were too greedy.   N                      Wes Powers9% )   d   [ )         " d  n         d      "      d )   X& Blue Moon  J.B. Lewis& m  ( 000  K R   f ' V 0+00I00 -  X& ' % 000-0000  k   P) F)  N  00000000  i  e%D   C0000 0000  +-* R H 000000 ` S #  D D*n 000000 "  ^  00-*0 : V YgBdhjZ Wireframe   "     J.B. Lewis'F(|e..e  .    .   #  f    .$$  i  $h.  $ n       )$   $)e   )   %!   %).  e !    ."  .."   . .  "" k 11E11[11hCheap Shots and Dirty Tricks0      James Spriggs(^!! )f*-   j   D  $       ! e &   g --C-%--D*n-----@B--- A#e  ''  $(DDDDBD    $ ++L")g$NNi!h1111vBlazes     Joshua Bone),;)f  HH h&%&e H JH % n %  K  #%  KH JI "&%d%& KH HI  %#  HK KK %  %  KJK i&%&g H  N Patchwork ,      J.B. Lewis}*X(X!...  e kV...   - ...d*- DeF..H ..  .'Z PT'+- nH'+`R '+ /-*&&&I&%&g* &% !i&&&%&%h!   %&#&%    %&% *   &%    %.    F$e%.    i @   '        + - d"    B)), g. \ !- -f!#( "  M *%*j !&+ ;{R1mj"Every Trick in the BookcYou'll be facing everything you've come across here. Hold on tight and take it one room at a time!2         J.B. Lewis+** # **  ** /** ** ****  **  **%**f)** M **%%** *%%e%'Rg"""+)R$""*""" ******d**%**  **  **** ** **/n**  ** ( **1o Who's Left?+Left to their own devices, they turn left.   David Knight,,w!   h K%$  e .#..  i2   f"    )      k  g       )   T       n    --  -P!1!0 Tiny Spirals    Ida Rr-!g!g!g!g!g!!g!g!g!g!g....................         "       '''  '''e   + '''++n 0%%%&+&+&+& ' ' '%%%&+&+&+&%%% &+&+&+&#%%%%ii_iiIii iYiii Block Headx   Grant Fikes.^,"e-K((-JJgHHIe)M O/M)n O.. Q   d.    #G&$% . **,  **, **, **," d**,"***," T"   J If   dA)  $B@-+-  HC-  - a'H - Q)"%ei31u G1=O Get a ClueuKillers roam the halls of this mansion, which -- by eerie coincidence -- is laid out much like a popular game board!   ,    Alice Voith /,n/-E    D * D -**-      d   - * * FD*G- e-D  *"g -*D  0pFlame Thrower5Collect the chips and guide a path for the fireball.     James Spriggs0")+F(((-n%@i  #  &%%%  $N& ''LN&%#''' &%%&& ' %&(L  #(M#L $MO %+h(HD) !-0).)K#(##(#'KKKKKKKe & Ld%&%&%)-Lf&%&%&A--%&%&%gNN&%&%&%&%&%N&%&%&%&%&%LL--&%%&->1~1#+ All About ButtonsF     4       Mike LaskV1!n  0-R'P+R P*R %  *...$E* * ...$"!#)-*G ) Fi$*  -  *        * 22    )  - *    + $ iH-'FD-*-   N(!1a1 11hyAll About Blocks        Tyler Sontag 2K *) i 0"! + n(  Te g% L ) ( '#E l!;&$?%1IOnce Upon a Troubadour     J.B. Lewis32J n .  )       .   )  ...   I  ... I     I  ... I      I    I      I      I      I        2   I                                             .       ..   "   )           9Dancing on Ice      Tom Rowe04 !  n    D ` % %  R %t  R  %  C R % %9  F %)   O" #    b %E  ( e :Dolly Mixtures     Roger Quick5EKO-%deYRI g    (  n  De R i "    -O#        /k g !+      & AAAGG *df  ' CCC$1n BacktrackYou're almost done!      J.B. Lewis62!!!'.e(!!! .!$!!  ! (M-g!!!!&)!!)d%H)) a%i&#&-M&#g%k***gH* (.*/$.h*+$n- jf !  RQ"RPSSQd-GDFdH$E D1)1U'F+711{ Good Advice+I wouldn't push this button if I were you.         Derek Bowser97,Tn! %" "%   %%"#/#"n%-%-%-%-%-%-%'%+-.....-%f'%+-.....-%'%+/-..h..-/%'%+-.....-%'k%+-.....-%'T%+-%-%-%-%-%-%-"#/#"%!!!!!!%   %" "% !* O- Construct-a-Maze(Use the pop-up walls to your advantage.<       J.B. Lewis8!F-  K' -  d- e g D-   P-*e g+ .S.( !! g(d .H%  "#  J  h!0L   )&  i      2 $    * f *$ #  n * !hik"h$ ' % j *  & !$ !  * &j$ e he  H%  !  0 )     0 Z !    kihj  ! a+ 1~Item Unlocker x     Tom Pattenu9 #   JJ "  J     K       HK .  H H    n  5 Beachballs     Gavin Duncan:,'!    G  d                              e     .  **- -*#f&%* #&L*  % * n ( *$'   S G& Q!G q 1 +3BBowling     David Pinkston,;!--- ----------n------ - - ---.! --- -iT#--*.%.---. -.---- ---.fg/eM e"'+---% --.-.---*..-- -(hd---. - - ------ ------- ------!-<L Air PocketDon't sink your teeth.   J.B. Lewis <, l **  O &%*+' %* +' *O* *&% +'  *   %'O'& *L+&%+N* &+'%    * * nP(#$"1Red, Green and Blue<       Dino Brewster=N                 i  b    K  ****OP  **jd   **k   *"           J    *  **d***W  *  (***    g  Ce                                     f  11 n1 Bump and Run   Tom Rowec>X # )) k).Vc .!d.*% GG * * * *j  EE * **    Je  n I !f!Hgi"          kE$" ' .N.........*..... *....g.**((**......**)**.........**((**.....$`*........*.............-L.......*[+1e1|^Go Back to Start      Mike Lask_?,d!ni"+UUU '''@'e@+++  !d V' +  ' $'  '  W+ '   !+ ++ +f$  *Q h+k)'  g--- '+-)' - K'+ !";J1Vs 1+>Pocket Puzzle         Alice Voith@(F!nF  PF     #"$-J---SS- J J PR %& *& PPR&  f& e$JRQQ-  dQ--   # $(  O V Q O RgP    O% - K &G0   O%' .&+    % &  P%&%&%&%&%&%&%&-SS!"#1181p ? ? ?  Producing     <      Andrew Raykowski A}' '''  +) )'''+ +'+++)+ ' '' ')  +'  +' ' +' )+++''. '..)'+++''.  ''')n*+   k Countdown              Tom Rowe2B.--------d***- -----*- -----+)-- -)&k----- ---- ---- -'--- i  -- - - --- % % % 2------- - % % %------- ---- & - & & -i------ & %  %"---- ---- %  & --- &   &-heg---% % - & )-#-- & & & &---------------- --$- -P---i# - - ---#-i--------%-------- --n--- -----/--- --  --i H ----@------i-<- !11Pf-nThe Aftermath*Can you find your way out of this rubble?   J.B. Lewis^C0-- -- - -- --- - -- --- --R--g- -- - -  - --SP-- - -   -   -   - - -  - aa-  - - B- "C- -* -* **  - * *cW --n----$ud7- 7The Haunted House    Ida RD  V$$$ $V0 M O   S        (G      H   N          VL         $ L   V V$  $0              *  ** M Okn ** / ** 0 * %141B1?1l1111Incident on a Bridge/Watch out for trolls! All blue walls are real.8          Tom RoweE$IFV-$ V- -- -kV *--- --V- -- - --n- -- -  - -- --- -- ---- --- -- -* *-  - -- X -D- -*h!   ---*i*    *    - Z   -  -  --TV   e-*  -  e      e -  -  e  -ee- B    e V--e    e      e e--T  ` e  -ee-**  e-    e `T  `  e e e T$$ e e e eTT `  -`  !#14 A -11eCef Coal Mine   (       Tyler SontagF-- Mf -- %****  --- O  --- &K  "--- M h"-- .."-   *-%$n  -.*  ----&# '   -.*  -D G  -  +-- 'e---S+ -' +-'+----'g - +R -'/- -T ---d   -+#--  -( ----     --!1^ On the CoastMTraps are connected in reverse reading order (right to left, bottom to top).<       J.B. LewisGX(  g  ... ...h...*" eGS * D)$dE$L"e$ # n  &d* **   ' i je  0  +  .f.NL   L G % g  Dk)  IE  K "!%11]1r(4uHow to Get Around in Venice           Joshua BoneH?      '''' '''' '''' ''''    # ''+n++++++++%GGDFDFEEG/fFireball TourismsGuided tourism can be fun for fireballs. Guide them around the area and make sure all of them make it to the dock.                     Rolf RedfordI**""22 n           D* * @- - B* *   D   K  V -  -Q  Q-  *c  P **  HR S*  *  *            ATake the I Train     Tom RoweSJ^! - -e  - @ BG D  EB*g-ni-N++-- B'PP(@kG'D B LE*%\Niche        Daniel BouwmeesterK +    ++    * *       L    -  %&%(  '.'- '  '  '' '  +    - "     e)   +   '    *  - %#%$**' + #+  + +/%  Gn0 G   )  i1-Chip Alone: Lost in Chip CitywThose fireballs are on your back! Now that you're in the city, go into the deserted house and guide them to the bombs!Z          Tom PattenL {"  +%%%&k %#&&&iI '$I-I h---j# I --gde I) !  f           j          2    2 )  2  -&eeddd!edddddgeddd g) g  ggDd)  i &j**)  )%& -L( n-PPPL LL #b1{e?eComplexd     Peter Marks>M ).... .).V.22%#...22H&##....22%###... &###... %#. ..  )      .   ..   ....  * ..  I $ "+.#.*%P***&*'%**L)M *0LL((N(ns1GOh-Ho!     Gavin DuncanN   #egg   $    %          e                fd  **      )                              )     P   K$        **n    )     )    ))   1v18 Slide Show   Peter MarksO$(V a F     XN M     V S @ )OLn ******                        % %        $I-     +$I%         +$I%     +$I%         +$I%   +$I%         +$I%%%- "-""FRF")"""e ""EDQ")%%)S&g##g&R eRP***gPD--hi&##g&)%%)S1111111]6&6Clear the Way8        .       Mike LaskuPe  n        ""M' Checkers Ida RQ[ .    ."".."".   . n  " " " ) )  " " "    .    .      .    ""..""    ..   " " " ) )  " " "        .        ."".."". .  Possible David StolpRX$ A## )&%I%&)%& #&%J%% H&&%"K%&H&)&% '  L+&%& )M#F$ n ) -*    */(fh ***i ! *k! '+"   j   !  ) i '+, I  !h!  )  h! 0* K ,  !)!$D*j!k!!"$eR1 ? 1=Mediterranean,The red button should be pressed only once.      J.B. LewisKS,,Z#//''*  *    Ge     ne D   F e  ''*  * e    D +   F+  e +   ++eE+.#.$   ''*  *// "GG%$!11^ BilliardsOThe keys are your keys to success. Spend some time, but not too much, on them.<        Alice VoithTQ% k)      )   $ # g)n  e       e*y%")1S1No End in Sight  Joshua BoneUX!  '  "  + * '+  '    +  '    +      ' + n ' +   GEQFEGSRP DSQD    ' + ' +         ' +       '+   ' +   ' +    ' +  ! Maginot Line           J.B. LewisVH -Ei  ')+ I M*'%j/ n  %fc  $e   #d+.)- -k&. .-*"! '+-X.KI(e.&g-1ITo Catch a Thief=Remember, trap buttons can be held down by multiple means...        J.B. LewisW! -$Fh%  -%n -& && $* -#!$j1hd ggdee\1p6Block and Key  J.B. LewisXKr !idhggdiie!!h.!!dgk!  !  ))!eeiekhkgg!!e !!.i.!d!! ..))!egdgeigehgd!  !!g!. !  ))!ekghhihkke!!.!.!k !h.!!.    . ))#dgdedi!! !gidfh! .))"ek#gk!!k*I' !hg! !h!id  % .)/en) +xjWhich One Next?/Cross the bottom row room by room, but then...   Jimmy VermeerY$!RQ+ '* "+'  *g+ ' * + '  SP+ '*  * """g *  "'+'" e%&%&++   &%"'+'"   %&%&    &%""" eeee%&  &&& &%% eenee %& %%%  eeee .g g .iHd  .HH ' +f*#d'* +d 'd* @H+g*"" !/dg3` Replay IIx               Ida R~Z,6# e n%%iJ d(     " N  dL&%&&e#+ Lichenstein    Joshua Bone[,:!V  +i AAA@    I  BB@K$  I   I  B@ ' I  Dj  BCC        c*!""!#`b *)*nh"/"h#)#&*"#&`b ""&)"") `b" ccch"/"h&%&&&%&`!""!%T%%T%aaab %%   + Y  -  'QY -U- S' Y - +! 1Olly Olly Oxen!None of the blue walls are real.   R     Alice Voith\-` Leg""$*""" gNN((""   L &g(  '     %   +e     *   g *    *     jQ      g $ n        #       %     W11I Bolkonski     Joshua Bone]_}j   .  '.)   . $   .$..e   ..   . .n+)  f....   d0g& # i %#&#%%#& &#&&& %%%#%#%%& &&%& %%&%%%#%&&& %&d&%#%%%&%%%%%    g1;j1A Shattered  James Spriggs^ %g        -$ +) - #-H 'HH- HH" L(-% --eK-- -( -- ( \ ^/n--NN-M ----df h    * 0h     !.!g   )222... k ..  !  1i MistakesJSometimes mistakes are inevitable. Make sure you learn from them, though!          Daniel Bouwmeester$_           n'Waste of Space Gavin Duncant`X  i(%%%,,%)%,,%%%,nF,I,,,,gL ,+,,+$I,+  ,.,. ,,.,.,J#,,D)J' ,,JD) ,,J,,kJD)JJD) J" 1''tIn the Limelight            Joshua BoneaX8fn-iegd e%%A- A! %% !!  S %% g   %%   k%%  -%% i#%% -D!D%  k$+++ $K$#% d*Q+  - '! .. -   ' $ -.. -*..' **-.. '*- ch ***g" S *****""" - " -Q"""-"" -c-C"""$$--!'K$-***  -$I Qe *%%%Ei --j-h H eK#H- $$$&&d XDHD-dg H(O(dd%SHgf#%HLOL-'%Ih]^1191h1---K16g111++-1 Jumble II<     X         ,     Mike LaskbX!")---)Vheeee eiQPRS$d)n$U!k!kP.k.PP. .  ,.. !  h--  *h-T& #   QPT-RS 3=211m7E=-XMouth-Watering          Grant Fikes]c.3!j  !!! "  !!!  !!!  !!! @!! -! +h**           '+/*   *    $    *    dD         in*       *f     T*    0   . %&#H. #(%%%H &'&O% %&H %#%&eHHH+'1 =*glFreezerDon't get freezer burn!      J.B. Lewis0d# X) \    X*** \X *  ** *. /R .n++) $ % \  #'&  X' \f\X"X X \Wq1 Sardines4Try a less obvious solution. Think outside the box.      Joshua Bone2e H+!-AR1n/ ig11 - B@- g-SC-.d**Q* '.-$%-.Q eee * e   K  IR 11 KP 111 (P1MP 111)*P O)1111QQM O-- 0#)$*QP -%P. *$ "**PPf")e!%1g1+2%The Ghosts at the Massingham MansionFLots of ghosts roam in this mansion. It's your job to roam past them!        4       Andrew GapicfY!c)VV( i`%%  ` P jkdHd`%%b%%$`b/`n)   b#&M&# `  b&& `&& b""I --- II  $) (eeD    H  e  D ((   %%% DVV%VV dd)VVV (V%)%VeVVVVV%VV!%;1'-1(g,f Triple Alarm`Just below you is the alarm system; don't set it off until you're ready to make a break for it!  R         Peter Marksg "$$Q G"-$$$Gik*! ---G*!G**$G*.HG. $f- hg#ide"DRke jgd- /HH %%$ )&%& %"&n P  )  "!16$ 1111111?161 Prison BreakCBlock the guards in and get the required items in order to escape.p $    Andrew Gapich! n ----- --  *** LF -** *g -*k..  f  .  h .--D *X-  \j  ***-    h-   d -# -C-i  A -  - ' Q !`   Oe V H F-$   /. H M  --- D K\QP +! ' RS ($-H - -%%+-J -**--   @-U  "*  I7B---(51> 1S+Civilization of CreaturesPress this button three times.     2    Tyler Sontagi****F*--n  Q E P ---(Caves   Gavin Duncan j m ""   -  e   g  -(% #& Nd/n-,   -d ) d    "    ) JdCd{Oil RigOSurely there's no chance of you escaping this abandoned oil rig, huh, Chip...?  Daniel BouwmeesterkX,U!      H  HH    H    H  HH    HH  HH    HH HH  HH HH  HH    HH  H n " H H H H H H H H       H  H  H  H  HH  HH  H H  H H      H  H HHH  HHH H H  H H      H  H H  H H  H     !Lazy Hourglass |                    Tyrethali Ansrathl![[[ idd-K-[e[h[....--K[j[[(--OMK[[[-.. -MOe  -G-&%e-'EF  H..H KH  H..de  e,d e.h eH edg ,n& #&eid  ,-  e e!g-e- e  -TT-  Kh*- e *'% e e*h** *& *  *---Hejea*e--..*HH#HN!*H"-* hjHc$D#++Zf>/+=1# Magic Trick3Make sure you've got a green key before moving on.  P         J.B. LewismS)  0   0  00)     T00 .  . .'  +'  f+'  +'$+)g) ( ".n# i.O%e---M)-/ !d&-- .*$O  ' +k -E D(-'-+ - # -** --'I-+--c/11Hidden Depths The exit's in...that direction!F           J.B. Lewisyn!K)eL*L CC**   f HdJ0* @ 0A!MA - O  d  ( LLL N $OM** Ln* ' +h'i +' +" ' +&#I%*  ' + g%#(& " *eK)e  !Le1Floating Plaza2     *       J.B. LewisQon&%&%& #---* *-.---SQ ----SP--P--* **---- S ------* Q-- R--R --Q--P--**-- *--P--S --S--Q-.-* *--#&***************@ Bustin' Out      Tom Rowe1p,VCB*--)@AP   j  dO &% &%&(  % L M &% &%&N e   O  )     0. Mn # -  D * . RP  g   RP '-))( H .+iLPushy      Tyler Sontagvqt...  ) ... . . / . . .'. . . . . .&. . ...  * i&e%E.....*. . . ....+. . ....(... ... .n. .. ..*..*. ... ...... !k$f& #-*  ).......d...) . .%... . .j. . . .'.. .. .M . .... ..  #g* %+*... .*...*. )  ... ... "o1Stress Fracture5Use as many blocks as you can to clean up this mess.   J.B. Lewis9rX!B!!(eee%*LM%***##.)2% 2\#!J2H2ii  K&! %%#&+jh  R  )!. $$ GZ V fi    - - d -C-))" )d- /d - #.i$ )! - kU$$ #.j!*'Y*gh.+'Y*g!'[* %gd'[* d Gc$n ,d   d7T%}1[1E15f+316++++*1*Lead Us Not into Temptation'You got the green key under the block!(       0                Madhav Shanbhag@s n ************h"   **************    ****************************.i          !**************   **************    **************      **************   **************    **************      **************    **************    **************.   ***k!*********# Triple Maze David Stolp;t3w!-ge!h!! '+n--!!h '+ ad-D-h!! '+* b `*Y-...  0 be$* . 0*-P... ae* *G e  I * !$$$.   ..--OO   '+' --.(   ..-\(.  A ) **      ) H-I-I-J i  H-H--   fH--I- i   .   . d.g`b"  . 11Mini Challenges2       ,        Ida R0un I!j              ..    $ .H ..  . ... .........   .... .  . .)..... ....%0++++++++9Mice Are Good for Something  David Stolpv<!   -  ***- e  * - UU***-n U***") e  * -  ***- -       &@%%&&&O  &%&  )&#%&-'&&#%(-+ %&%Ni %%%&&%M      !BObstacle Course     J.B. LewisUw <!ij,d    k  h%%0  # n &g%     ( $,    #  0 * , 0 *d,k $!  * f %g e*  "    d e  e id   *  0 **!G!  ***Dig  *%-  NQF EK - RhP -g#S****H ***   ** /1eos1?$-EliteBUse what you've learned to lead you through your many challenges.     Derek Bowserx8jV)#* *n* * #**  * * *H% * * -* *#g & '+ K'+ '+d*# J/' +*  .%& '+...*'+.. )&'+e. )..H  * I c% #* -K  &%    ) #FTwisted Chambers&The traps are connected horizontally.F             J.B. Lewisyd gV  V V        U    V                        U    n           U   U           T       "T"5 Jaywalker   Bill ReidzzX"$d h       "         n )       e/             *      ig fk%  CB(%)  * .   @"BQ ---'+ H "@CB %))%! J  @BG  AAA    N  ,  j , # --T  )[_ea-!(1=>BManic Depression5To get past the bomb, clone a block and maneuver it.  *  Madhav ShanbhagR{****  *       *** *  *     **j   *    *   *         n      * * **** *     *     * !*   .       *     " Investment David Stolp|XP  \-B    -   g -  V  - @-\ - *  *&&&%#$*&%%%&**[ *#%&&&%%&%& &&%%# -ReQfG -' g c!!d+ -!j aSPfgd e-   ...GF.... ..  B...Th...eged DE  " /ITiiT,,,iiT,,\!iT,,HiTn,H\T!+1v{ Jumble III!You're gonna need all the chips!  <        Ida R]} ! Q   *R   *P  R 'Vh  S +  -  e  -  ' f -*-- e P---  + --'-@*P - * dR  -.GG   R -L-F0+ .-.E   -.*e'* i -  --  + - *"K # P-$' g ---  R - S +R  ---%&kQ-n P - R-/   --- D  --(P  --*--R  -.**-. --S P-!S,; >! - -(1#DQ Water TrapQMake sure the red button is never pressed. Traps are ordered from bottom to top.2    8           J.B. Lewis/~!  #  % % h%% %%n % %  #T !2%$ Marooned  Joshua BonewX>!GGG-d*)EL) EE-  G B&*f nEF0-.. 0 Cg0@% ' " A &+FG  #)  @(&*- - e$Ge$Geeee$G$Geeee$G$Gee$G$Ge - -e) .$. -*- *F*  -#&#  '+ '+%* *  '$+ -  *  -  *$ *  E -*D DU" $  1a11111111q-11c1Beat the Heat( `       $     J.B. LewisuR-Q - - -"  ** ---E- - **- D-nk-F -** -  - G--- **  - - - S-P;Divide and Conquer   J.B. Lewis%&!e  d-++F/  ** '+-   ** gR   ''D   ,, n-$ *--P-d,D ,,*g-%&%&-)****I%&%&%& )****H&%\%&% *-II%&%&%&) )**&%&%&%) e$*#Id-&%&%- eg O-.  a +( ... ` - O....   b ( .. ... c M'+.. --e -d(..-d i*   g                  0e    -"g B 1n& 1'Everybody Get Dangerous8Use the blue key below to access the bomb storage room!2    "          Tyler SontagG ** ng '+    !*'+ $D *..Q%&  -R &% `#.&%  (%&       #   P SL)' *f .- eNk+"')+! i(1i Four by Four(     J.B. Lewis!) .g .Y^) . .K % % 'I(&O%& .#..&   N   j.&`%   #&  .&+M+ G$F `&NL $$ &+O+ D$E  &i i     $b n     2`i i bA %  %% C % V ." &,!" " +"h"-Pf""+" k,!  .)e*/d$$SQ 4+11 11E1!1 Mental Blocks3This is NOT the time to be stopping to read hints! 8         (     Madhav Shanbhagl!  d R)d  K $"  g  U%#'E  ](*  d  N n `  HH f** **  * . i    HH.    e   )  !  .    )  !;1b+|AMCommit Suicide?     Ida R[ !$"LLLLLMNNd%D HHL ' HH nNNNNOLL-ML+ &LL.e- L(! *.#.( ((NO$#Ne-D.-- (LMN O-N( (g*L -@ O L M O/ MO*O KO- -- dOLML OONiLN-O OHLLO-'+.HMg-M'+`H-f-'+.NNNH-!a(1d1, Think TankACan you hold down the three trap buttons below the force floors?(                      J.B. Lewis;,A      % )- )- )&        % )# )B) F n**/7We'll Be Right Back  Madhav ShanbhagT_ b Lbbb++- -(L(Lbb+/LLbbbb+bbb LNLb LLMLLb'bb'LLbbbbbLLbbLLbbb - L(LLb+'b $LLLbbbbLNLNLbbb -LLMLLbb nLLLLMLbbbb-(LLLLLbbbb*Qbbb*b'*bb'bb*  bb*  -*- ) )&&&%&%%&&&%%&%%&&%%%%#%&%)&%#&%&#&%%)#%%%%%%%%&&&%#&&&%&%%&&&&&)%&%#%%%%&&%&#&&%&%%%%%%&%%&%&&&%% ( 1 11111111111111111 111111111 1111111 1111 1111111111 1111111111111 11111111111111111111111 11111111 11 Color WheelHPush a block across the blue button. Brown buttons connect vertically.2              David Stolp$G d "%e) (J%./ % -&!' n  #+    #M*!k     .%  0T .)&K$& '-.M .Gi)+   O K)   K 0K--!!&!' @)+'+ @- 'f @- - + ***g #j1s1 Grand PrixZGet your blocks through the track and into the watery finish line, where the exit awaits!2        J.B. Lewisu !.$.(..Q*..  ..*   G  $E/    $     0 +"fge)e  0 *** 00  kG*%&.$. e..* .( R d '+g '+*e  . '+..'+***$ n #d'+D  '+ '+  *** N'+*****) $D$ &'+'+E%'! !#WH111s11181B6VulcangThe red button on the ice slide at far left is connected to the clone machine next to the trap column.n                 8    J.B. LewisZn h$      '$             *      "       Q                                                                                          R   %     &S     'T#$1+"1?1\Z Waterslide   David Stolpx!d%#&%  %&%%&&& &    &&%&%%&%%%&   &%&&%%%*& &%&&  &%%%&%%&    &%%%#&&%&   &&"  K) #!%k R* *& '  ( M * -+    (-' *f +gM 00    VV$ ' VV    M  0 S+* R*   --. ' $ M 0((  H*&+--  '  -+n  @M   K/  )-G00 -* K    K`  *K   D *K   -!2" e1 1iek9 RotationsStarting here, number the traps clockwise 1 to 5. 1 and 3 are open. Use the blue buttons to rotate them clockwise.2       ,       J.B. Lewis'' nL   -       * K  g   e  G  &   )  f + %&O%&   (&%&%&%&%&N$+d)h*)k#NN&/1eYet Another Yet Another Puzzle   Eric Schmidt\ !  n   A A " +e-`A  a  '' '''' ''''''''' '' '' ''  '  -''-+-+-!!Bug Arranging                Mike Lask!#! ic* *  $J )  * *     *     !  j g -` ' +*`  - ' bd+*   - g*    - * "e    %      a D-  & *   ! ' #  * -  kW He * kW )  -fWWW #   WWW H/      +   .  .n '+   * d-%   P  . .  -    .  ( - R  *  K$    * .      *      . . !   .* M T   .  --  .   -- * *G -!"1 =17Mudpie1Don't be so quick to pick up everything you see!(     @      J.B. Lewisy  .#.$+.+ +' '' $+ +$+ .+ +' '' $+ +$+ + +' '' $+ +$+ + +' '' $+ +$++ +' '' $+ +n% 4''1''1''1''1''1A1+o Same Game               P    David Stolp-' &%-------" # ##& J$-'DG ## ##+ + I%-----'JD # #'' QQ GD- ## #-RPbGD ## ##C-'SSP .' ZZZ #."+  + * Of (O   '"R/ P + *  R % + P + * **- $         % ) X d$ X  *&)L  d #      -)      # ) $  %I% . d\ $) d&K&LP*** $ F&&V%I%---*--% $)#  ( *OgW% +*O- % n*eOD % T%U N&# 1++%+$# 1 + $$$11151'+'"'X+'1jihkK $ &1 % &Q0 'dd'You Can't Teach an Old Frog New TricksHThe extra clone buttons on the way are connected to this clone machine.          `    N       Madhav Shanbhag    C0     !- U U U ] S-   LLL/ /dA1 *I( -$" *+ - -(& Ii*I- --  !- -) /0 -$ 00!,f" "d  -U 0! )-   !- " ---   N .-* "%"V ) A($(g" "%%"-)- -@  " G-*0 !   "%k  k *-E *.&j    -/ )!h 0   '- (e 0   d#- $00  &- UN&0  - (   g"AAA Z      "  Y      b.  - b/. X#0 b.  [n"  ")P  }E+++#111 +-'h1+ik*+- 1($1e?e +1e1. Recurring DreamFCollect blocks to get past the chip socket. Watch out for open doors. (      6        Madhav Shanbhag2$$$%a j-L2L -------ee ^---- -$ - H -  -!* NN0(-  -*g _G-a-  -*g G-- V -* M' ---  -* M' FF-- -* M' Z -DFDF- -* M'  -DDF -* M' aaa* M'  EEE )b* M' ` `* M'  AAAAA * M' XB @b b* M' CCCCC * M' -)-- `$M' QQbaZ M' LLL PRcc M' *I -X *IRP.&.!$$$ i*I-U k PRULLL jn# U''' hRffPU''' " -dUNNN &" UL &"SSS..!U# U ,  (-,!h) ) ) ) ) ) ) )"M'  M' |C+)+++ ++ +&&++&+++++& +++g &+++&++++ &++&+++++&++ +++&+++++&+1&+++++/&++++&111+ +1+111 ++ +&&&+ + +++&&&+& +++ + (&- &Suspended Animation           @ v                 Madhav Shanbhag(".f$!% $& &$& #..& %% &.(.  %  $  $$h&%"M *% % . i..&.&&$ $ %& %  $   $ ! &&   .%  &    %$n%%k$&$&&   &&$j&& %$ & && &$ && .#1 Avalanche      David Stolp5i R  R  -  Q--  -`-) g  -"- D -`e    /L-g  ( d( @hM* A* -H) ! )@ eiH     H n  0 DiabolicalmThis has been called "suicide beach" by some unfortunate souls. We sincerely wish you better luck than they.    Joshua Bone]!&iU] K  !n% !! *!N"/ eH k *!!!M%0 '   0e + !   0 0K$%*D) ig -0@ ---    0(#  0 00-%.LL H 0- *   -* -- d  ) )   WU'+    *-J     $'-     0 Q-ii   '+,   'f+ H.! ' &%e# KF *## ##* d dE.$.# #Ig H ..- B## ##b  0#$ - - #J -  c  -.d. . H - -..)-- -% DS'R&P19 {  +Z1=%$+1 1i  Y1Mr. McCallahan Presents=You don't need the fire boots, but they could help later on.<    (   @              J.B. Lewistworld-2.3.0/data/CCLP4.ccx000066400000000000000000000440301475511570500152570ustar00rootroot00000000000000 "I did it!" Chip McCallahan beamed as he strutted into the lounge of the Bit Busters Computer Club, grabbed a prepackaged hot coffee and some cookies, and plopped down on the leather, reclinable, multi-adjustable, temperature-controlled, fully digital smart-couch opposite Melinda. "I finally beat your overall high score!"

The Bit Busters president and top brain gave him a look over the top of her copy of Qubits magazine. "Let me guess, you took that supposedly impossible walker shortcut in that one level of the third challenge? You know that's cheating."

"All's fair in love and scoring," Chip responded brightly, and grinned when she blushed. He had only recently begun to figure out ways to get her to do that. It seemed to help level the playing field between them.

]]>
"That's as may be," she replied tartly, setting aside her magazine. "But enjoy your laurels while you can. Pretty soon I'll have an opportunity to improve my own score."

"Really?" Chip leaned forward, excited. "What kind of opportunity?"

Melinda responded with a gleam in her eye. "The board has finally approved the grand opening of the fourth official Clubhouse Challenge!"

"Awesome!" shouted Chip, nearly dropping his cookies.

Melinda smiled at his enthusiasm. "Of course," she added, looking rueful, "I won't actually be able to start playing it when it opens. I'll be at that meeting in Cyprus."

"I'm sorry you'll miss the opening race," Chip said sympathetically. "But this is the first time our club has received an invitation from the Puzzle Masters, so that's pretty special. Their organization includes some of the most elite puzzle-solving groups in the world!"

]]>
Melinda nodded in agreement. "If we can join the Puzzle Masters and get access to their puzzles and devices, it might be just the thing we need to bring back some life around here. I'm just concerned about their entrance examination. You and I are the best puzzle-solvers in the Bit Busters, but from what I've heard, that challenge may be too difficult for either one of us."

Chip gave her an encouraging smile. "We can do it! You're the smartest person I know (if not the fastest), and together we're unstoppable. The last three challenges were all practice for this! And after that last one, I don't think anything will ever be a real challenge again."

Melinda chuckled. "Thanks for the pep talk. But it's getting late; I should head over to the airport. And you should get ready for the grand opening so you can get some 'practice'. Oh, and Chip --" she paused, looking troubled.

"Yeah?"

]]>
"Be careful in there," she said quietly. "The real reason the board has taken so long to approve the opening is that we've had some ... problems with the levels. Someone has been hacking our systems, and while it finally stopped, we never did figure out how they got in."

"OK, I'll keep an eye out," Chip responded. "Have a good time in Cyprus!"

They rose for a farewell embrace, then parted. The next day Chip stood before a crowd of cheering Bit Busters as the secretary ceremoniously cut the Internet-connected ribbon that officially opened to the challenge and sent an automatic update to all the club's social media. As Chip shook everyone's hands and prepared to enter the first level, his thoughts were miles distant: in a sunny Mediterranean island, in a shadowed threat to the group that was his family, and in the uncertain puzzles of the future.

]]>
Authors' Note: Good luck, and enjoy the Challenge! The full story will be presented in CCLP4 Version 1.0.... ]]>
tworld-2.3.0/data/CCLP4.dat000066400000000000000000004004711475511570500152570ustar00rootroot00000000000000Tm   k h2  2   g g e ee d d d  !    jn2 f i   G# Molecule Jeffrey Bardon8, "  --e  *  * $E d--* %*        n I#--+'$+'S- **ig--'gfa1M<M1HRPixelated Fire    Eddy Limb]     % ## %   , ,, ,  & % & & %   0 0    0  % # % % & % , n, , "  , &  % & & %  0       & & % & % f , ,,    , # %& #   j   *Fossilized Snow Jeffrey Bardon         n              !   !            " g )GG) 222 """ 22222 )GG) 22222  222222 ) 222)222 222222 22222 22222 2225*Oasis      Jeffrey BardonEk&%%&&%&&&&&&&%%%&%%%&%&&&%&%&&%&&%%&&%%%&&%%#%&#%&#&&#%&%&&&&%%%%%%&&%&%%%%&&%%%&%&&&%&%%&#&&#%&#%&#&&%%%%%&&%&%&&&%&%n&&&%%%%%%%%%&%%&&&#%%#&&#%&#&%&&%&%&%&&&%%&&&%%&%%%%&&%%%&&%&&&%#%&#&%#%%#&&&&%%%&&%%%%%&&&%%&&%%%&%&&&%%&&"&%%%%&&&%&%c0Non-Dimensional Layer Jeffrey Bardon6!edn ! /       fg  ..  i..hj  k ..%%   ! #& 0  &     ,*@`,* *L(-N(I- - I\- -%--I--%))--X --))%-W-#%QG- -- - -G+-"$'* !1lProving Grounds(Time to put your knowledge to the test!     J.B. Lewissx1    "      n           % In the Pool Rock GnreuxeL.("."--M--OLO---OO--NO-O----O-L-O--N-NO-LL----N-----N----O-M-M-OM-O-N-N--O---- ---N------M M--MO-OM-- --L---NOM -M-L-N-L----- --L-LL-O- N--M---L-N N-OL--O--O M--NL----- --NO------N--g O--O--LML-LM--nN-M--MLe-e------e------e---e-e----- -------------e-e-e --e-------e------e--e--The Fourth Dimension                            Josh Lee ,I#  "                        J/ HJHH IKIK JJ  IH  KIKI KJ HJ  HH       H     JJJ     HK%%%IJeJg) HdHfH)n2+ = " d A A"PinballpIf you missed any chips on the way up the plunger lane, you can return there the same way a real pinball would! F               Andrew Menzies d0!  2 2  2#2  2&2  fn%&  &%  #%&  &%&  %&&  &%& %&&   %, &,k,  %,   %\ %\   \%  \  \&  \ k" V2\"2 /'2%&2  22   #I# !-U++++++ ++0Stuck in EmeraldsIf you're reading this, then you've successfully escaped the emerald and you're probably about to run out of time.    Josh Lee Y!""gggg"gggggggg""""""""g"""g"g""""gg"g"gg"gg"""ggg"""g""g""""""g"g"g"""g""""""ggg""g"gg""g"""g""""""g"""g"""gg"""" ngg"gg"""""""g"""g"""g"g"gg""""""g"gg"ggg"""""g"gggg""""g"""g"g"g"""""g"g"gg""""gg""g"""gg"g"gg"g"""""""""""g"gggg"gg"g"""g"gg""g" "g"""g""g"g"g"g"g"ggg""g"g"""g"g"""g""gg"""""g"""g"""g"g"g"""gggggg"""ggg""""""""g"""g"g"g"""g"g"g"""""g"gg"""""""""""""""g"g"""g"g"g"g"g"g"g"""ggg"""ggg"gggg""""""""g"g "g"g"g"""""gg"g""""gg"""""""""""""g"g"g""""ggg"ggg"""g"g"gggg""""g"""""""g"g"""g"g"""g"g"""ggg"""gggggggg""! ")Keyboard Malfunction Josh Lee ,$  -   ----   --   -d-   --  -X-- -        n   e 2   2   fRgP 2  2 I +  D" T ' '+ + ' '  +  '!}VRivets(        Joshua BoneS ,2!----I----G-F---------)-----------I------e"----DF---K---.---K----E---- ------ --J---J--------A-A---------------B.@------------f- -DF-B.@-----I--------C-C-------D-F---------------I--E------I-----d-IGF)Ie"DFKKE  JJAAnB.@/f DFB.@ICCDFIEId!i5---&--- ---2-- ----3---- ------- -XEncased in CarboniteZYou can't walk past monsters when there's only one space between them, like these bugs... l              Andrew Menzies@)))  )) n ")"")"  ))  )))d  Poly-Gone Cybersmack,  ......f.........'+d......  .... .NN.'$$g$.M. . .'/+++... .  .O'.$$$LLe!j....."...i........ h. k..n11E1w1@11s Cross BackpThe top three buttons control the upper three tank cloners, in order left to right. Bottom buttons are similar.(  0       Andrew Menzies^iB    %-U---V -"%----n-V-f-V------- -"%-W---W -"%---TUTWT---TUVUWVWTW---"%---T---U -V---"%- -W-#-T------- -W--"%---V---W -T---"%---U---TWVUTWVUT------"%-U -V---"%-----T--------W--"%-W -T---"UTWTUTWTUVWT---WTWVWTUV& -U---V-"&--------V--W-d----"& -W---T-"&TWVUTWVU---TWVW---TUVW"&-T---U---U---W---"&---- -W--V--V--V-i-"&-V---W---W---U---"&VWTUVWTU---T---TUVWT---"& -U -"&------- -V---- ----"& -W -"    c            Reservoir Frogs                                    J.B. Lewis}Mon/ ' '' kef ' 'g++dg++de+**!**  hi "mThe Three Trials#Solve the three trials to proceed.2       Michael Sugantino,$+e&e&i***    e#T E$$ & e& Eee- - - *I$- - - - $K* - - - - -D** $eee$ (n     D  DDe** $N$h/311_ t11-$1C1711Inferno Dynamics@     Gigih Agung~8 egedfgdeddfddegedgegedefgdgdfdddgggdedgdgf fdedfedfggdn- -eefgdiedeegfgdegfgefde dgdgeedefedgdedgddegefefgefgegfddedegdfdde $)Conservation of Keys Josh Lee!**  E  D  Q    **PE  "    'nV .  +R /. *D!It's No Skin Off My Teeth]Use the teeth to guide monsters into bombs to collect chips. Then use him to reach the exit.    Josh Lee^5L          ...   -  ...  --'V-  .....  +---  ....-'-  .+---'-  ..... +---  ....""- --                        K    d   "  "     "  "    K   d                        (--/-""  --   -e`-  -ee-   n -        L            ervzGlacial PalaceDon't waste your keys!   Jeffrey Bardonr,d h .  A-I-B!!!!!!!@!!!!-!!!DJ!!!B!!!!I!!! !!!R!!!!!-!!!JJ-Ge-!!!! !-g!!@!@!@!! !!!!!!!-!!!---I!PJ-!!!-!HH!!!!!!!!!!!!!!!!-!!V!!!-!!!!!!!!!!c!!!!!-k-!-J-!!!i!!!!!!!!!!`!!!D!-!!!!!!!!!!-!`-!J!J!!!!!!!!!-!!-!!@!!`!!!c!Cn!!- / "/s- BodyguardsYThey protect you... at a price. Don't let them steal any boot until you've used it once. @           Andrew Menzies!1X*[[XY*Z[e11--[-X-Y-X---*---Y---Z--11Y*****[XX*11---X-Y-X-*-Y---[--X--Y11e*[XXZ[Y[11-Z--*-*-*---X---X---*-*1! R P R P R R P P R P R R P! S  Q  S  Q !h S  Q 1 1 *1 1. 1 Q  S $ Q Ei S    S! P R h R P R P P R R P R P R 1        n 1! P i P R ! R P R R P R P P R! Q  S  Q ! S  Q e S 1 1 1. 1 1 S  Q d S ' Q  S  Q! R " R P R R P R P R R P P 1---I-h---I-K---I-I---11J.J.HJHJ..11---K-I-I-d-I--I---K---11eH.J.JHJi11---K -K-I---K---!1!------  --1-------( !      !   + ! = # !      !      ! $----------- - ---$Western Standards of Living                               Josh Lee    Ig    I          d  g    +C -  e*  \ n "f ' \-.i D  *dD DIt's Easy Being Green     Josh Leed !% d %%% O%&%&%&%  %&M&%&&%&@  &% NN&%%&%&&&%&   MO&i&&  LL%&&&%& OB&%&&%& %&%&%&%&-  &-  L% &  %% &   &   N&L& &   O&   O'& &  NO/   &On% %  NO% %%"fgeN%& --- -DJ' ----- K-(S# --&&&F - (*'($---&&--'$-( (FI---&-)-( # ----K$'--((O-#;1#+1+$11+111+1*0Difficulty SwitchTThe longer you wait to hit this button, the slower the tanks and walls will switch.2  8   >             Andrew Menzies, !--*---a-*-----*---a--"--b--b---`-"- --- -*--` `  `*--b---* a* -c   ` --c  * a---*  a --*-  *a `----  `---- b`n f *a--c ` a*  ---* a `--ca*  b--*a   -*--b ` b**-- * a-- `--` c  c *---  a  c-b-    ` `--ab `  a-   ---*`*`  --`-b ` ---- ab-a---a  *b----c- -- -*---b-*----`---*---c-c---a---*--b-!(--- -1 -- -#  -  -  % - - - -- - -+- -----#Shrub                  Josh Lee H, .Vg,,'..,. (  *i(L( (-!&-n-!!&#&-!&)"*f))"" )*d* )"*% + %e% / +k+  $% + c1eiSuburban LegendwThe trap button links to the top trap. The chip guarded by teleports can be obtained by partial posting from the left.   Jeffrey Bardon n e g  H  **          -  -G     d   -  P   -  Q  P e      .  g    ---  g        H                      ---    -    --    --     --  d   --"k   -V-   - - -   - -  g--  -    ---,-f=3Zephyr Heights     Josh Lee "((+++'!!h.h.J.OOJJHI.hh"!!hhhhhhh('''h!! !  d!!e "hh!!..!!hhh!.hh.!hhhh!.hh.!hhh!! .. !!hh" f!!g  ! ! h h!h hhh*. "hh*!% hh  *  hhh!& hnh h#.hh!!+fbFlipper Departments(  Josh LeedJ8V  nW  g-- .. .  . . *). . %)eeV &# -ee ' "HHH #. +; Hoodwinked      CybersmackT!-J---f-*-- -J ---- $II*- --$ -I---I -* ----$KK$K--J-J-KK$*- --JJ--J--J---*--J-J--JJJ-i-* --H$--J---$J-J--H--J---J----$IIKK$---  -----J- -$II- . - - --J-- --. - -- -$!! !----KK$-!--!- - - --!-!!------d-!--!KK$---!!-! ----- -$-!--!--------Hd!-!!---------H--- !--!-J--J--$II!!-!-Q----$--!--!-SS---H ---!-!!-J--J----H------!--!$------III$II----!!--H-----J------!!!H" - J----KK$$II-$----J----(--J--J----J-J---%-$----$--J-%$%---L-$n------JJ-%---M#O!(1---1- -- --- 11--11--1-------1--11- 1 1--- 1T10-B1- --16---1#111-- 1111-1-1-- -- --#dBig Boulder Alley               l        Jeffrey Bardon ^N 22.).2 2KK 2 I 2 K  2    2     2  # H  2    2   2 I  2 K 2k % IIf 2& # & -2& % # &  2 %& & %%.#.2# %&%%% % %2& %%&# %.). 2& &% 2& # & k)k 2 % %%% 2 "2   2"22"22"22n2  2.m a] }k!0GBlended Brussels Sprouts      Jeffrey Bardon!,3! eG e 0RF  0DP   Ee ))             eee e/-h-d-i-g-j-n--f-k-""!o>-g Tool Shed3Choose your tools wisely. One must be left behind.   Andrew Menzies:"        !     k .e./    " *   +h .  -     . -  &  # f    .*  n .    $   &  . '   g    -   i*.   *     !.d.j     !        "RM1 D-sYFrozen WaffleSecret password #1: WTUH   Jeffrey Bardong#!f -   @ 000   0 $00'I eG--  --T----------T""----nT--------  -- T -- ---- #%a     0 (0  0 g * O*0 d P- !1+cNChasing Chips     Cybersmack$XF!  $*  --  "i ) -* ! -- " - --- *  -- ----U-   ) --n-e- P  ---U----    ---  k.-- c- -b  %_^ #..- - `- -  \] -.  -- --a- %_^    --c -- \] - F - b ---a  _]-   -  --`- - ^] - D  -c--- - %_\   - - ^]- -    - %_\-    ++   ---  -   ---   --  +--- c  f  - *     ' -- ..- *  *.--- .- *- - *  - . --- - - * ' O .  -- -       * (      ' * --- .    * **  ! v1!-g- -<--- +-- - d+--- - +- -+-{@--- --One Who Raids Tombs  D                  Eddy Limb%[j   k*  J" i*  H  J HI)   *    * . d '  I  %    f   HH2  KK/I*+2)*KI # KKI2  2IHHe  I *HH * HHKg HHHHK JJ K*K  nhKK*KF = x# H   %GTropical Hibiscus-You should probably be looking for the exit.  J         Josh LeeL&!"""" * * n ** *  *** *** * * *** * ** * * *** * * *  * * * ** * ** *** ** * * * * ** *** * *** * * ***  *** * ***** * * *  * *** * *** * *  * * * ** * * ** * ** *** * * * * *** * **  * ***  *** * *  *** * * * * * * *  * * * * * * * ** * * *** * * * *  *** ** * * *** *  * * *** * * ** *  * * * * * *  * * * * * ** * * * * *  * * * * ** * * ** * * * *  * ***  *  * ** * * * *  *** *** ** *** * *** * * * * * * """"!n*'Detonation Station Josh Lee'X%T  ----------------- ----- ---- -------- ---)------e--D---*.*.-----@g-.*. ------B ------ --JJJi---QA ' --%%%-R-e-- ' -- -----+-+ ' - #------- -/- ---)+------D-(---M*" - - --V------- *- -gP-----f---------- ---- -- ----.----+---  ---'----.  e---*- - --'  ------*---*----- -  n-- -*+-- --d- 7P---- --***--?-5--%--XIn the Walls of Gravel CastlepGet that pesky fireball to hit these trap buttons for you before proceeding! Don't disturb its path afterwards.2             Josh Leel(!%&H$%H"@   x"" -/n-EGGGEGGGEGGGEGGGEGGGEGGGEGGGEGGG EGGGEGGG EGGGEGGGEGGGEGGGEGGG!yA$ &?#Q111111111111111111111111111111/Periodic Lasers_Watch the clock! Every 20 seconds, the security system will shoot lasers into the other room!      z      Andrew Menzies),"Vf!n''Q   'k* %$d +e!i O$ .* * g.&.&&e#,Q|'1=1eGhetto Piranha(       Josh Lee*, 2HHH2HHH2HHH2H2HHH2HHH2HHH2"H2HHH2HHH2HH2HHH2HHH2H* H2HHH2HHH2HHH*HHH2HHH2HHH2H gH2HH*"" HHH2H*"*."*H2HHH2". @.H2HHH2H"E..cH2HH*"...HHH2H".**H2H".*.."HH2HH*.** #.*H*.*&& .F*2HR. .H*...%%..*H &.2Hf%n.*eHHH2H"...*.H..."HH2H..Q H2HHH*.`.2HHH2H.$.*H2HHH2HC*."*kHH2HHH2H"L H2HHH dH2HHH2HHH2H* H2HHH2HHH2HHH*HHH2HHH2HHH2 HH2HHH2HHH2HHH2HH2HHH2HHH2HHH2"H2HHH2HHH2HHH2H2HHH2HHH2HHH2+++++++++++++++++++"++++++++++++++++ +++++++++++++++++++++++++++++++  ++++++++++++++++++++++++++++++ +++++++++++++++++++1 ++++++++++++ +++++++++++++++++++ ++++++++++++++++++++++"++++++++++++++++++++ANova Prospect     Eddy Limb+o!d -dP-L--           %(.    ")       S   RMS#- **  *)'-  *---  R)** -S    G )   P P -  hn-d-dL_  ;+  _/v Coral Reef4Be careful Chip! Most blocks have water under them!      Jeffrey Bardon,N"n--   ---/--   ] ---- ] ----  --- ] ]  ]     ] ^ ]  ]    ^     ]  ]   -   ] -  ----  ] ] - ^ ]   -       ]      ] ] ]      ]    ]          ] ---  ]  \ ---- ]   --   ----   ---!"- Blobfield:Retrieve the chips in the other 3 corners and the center. 6        Andrew Menzies-3!$K$$$$              n  !     **         **          g    'LLd$  (N00.      k         fG    E  * )&!G    *   ** *** -!'  ** *)% ) !+e*   """#   ......"" &#&D....""   ....""     ....'.+ .....k!*"1+1?1?1?10111=Seven-Layer Salad 0        Eddy Limb.,`!kj9%%& %&% &%%,&&&8#) E E))E E)-jkjjkkkj kjkj'kjk+kjjkG-kkjjj kjV-kkhkj 'kj+jkkj-jkjkkjjjkjjkj-j kkkj-kkhkkkhj kjjjj--khkj jk*-hjkk-khkkjK/n-jk-jjh-jhhh*!  Exclusive Or8Select one and stick with it for the rest of the level.      Tyler Sontag/                                                                                          n                                 /     +        +       +   +      +       +      +             +            +           +            +            +       +++                                                              +                             +                                                                                 H':'''<' '>':'''''t'>''%'''tAntidisruptive CavesGLeave everything in these caves EXACTLY as you found it, alright Chip?                    Jeffrey Bardon0^ ..#"d  %&  f&L  ggg gg g/ggg) N..ggg ..gggg  ..Le(gnd e .L..  ..N, .,) ,,, ,#M .d,,(, ,,, , j Key Insight4Be careful with your locks, they can't be replaced.    Jeffrey Bardon1JYh... +-.---- + --  - + -- ---- - ++- -----+ - - + -.---- -+- .+--.- ++ +++ -.--)-k+ ++ +---- )-+ + +- ---)-+ +---- -- -- + n --.-+++---+---- +- -+++-+...-- ++  - +-- -+-- -+ -+ +---- - --+- --- +--+ + + -+--+ -  -+-- -+-- ' ' - - +.- -+-----%-%--- - -  ----+- &-%---  ---&-&---- ---  -- +--%-& -+ --!---%-%-#  y      "j3    C <Block Parking chipster10592>U- - - - - - - -- -- - - -    - - -- -   - - -- --- )   - - - @ - -- ---  - - - *e) -- - - * - - - *'-' - --- '++'- - -- ++- -- - -f- - -- +Q$) - -- '+  - -- *'-V F - -- *  D - -- nL - - -    - - -  N##*- - - - ( *- - -  **  - - " %&&-- - - hH*%eY - - &&d) - - `%g - - \%  - - )    - -  --  - -   -- - - - - --- - - 1WSecret Underground Society<             Jeffrey BardonA3'T j    "     j"                                    n                                     "j     "   j u+Ice in a Blender Jeffrey Bardon4'--- ******P- ** *****i*P-P-P--** * * **--P ---* * * *-P-** * * *--PPP-P---+ * * * * *-'-P--PP* * * * ***---* * * *** - *** *** P-- * ---P- ***---P--n-"k *    * ***-- * -P--P ** ** -P-- ** * ** --- * * * * ---g** * * * -----P-*** * *--P-P--* **P----* --* P-P *** P---P * P---P-"e---- -- -  ---- ---    -!------,-----C------'tIt Suits the Purpose   :        Zane KuecksZ5=G-- ---D-R-QEF----P----S ---- ---- ----- ---- - -- GR-  ------P E--    J .)***$   * B*      11  1'1  )  1$1  11 $F  n+$    $  + / $$$1Y11!1Protect Your FortressaShield your fortress with blocks, gliders, and fireballs to divert the five bugs into the bombs! @         Tyler Sontag 6I..).*d*)n..  ..... ..g--".. .. .* ..e$ .*.... .* ...*..**......*/j.1 , Split Path Zane Kuecks7X!      K ''    'H' 'H  C ')H)H'   $H $H  S '     [ '''   'H-'H   _)')H')H   $H' $H  O'    W'*  'H''H   G')H)H'  $H *$H  c'      /   +++++++++  n       !r+'+++  11+?+'+++  11+?+'+++  11+[If I Ran the Zoo+Match the animals to their ideal habitats!              0       *           Joshua Bone87$.- F%- .*E'  ..-'  ..  '  ..  '  ..*** '  ..*-* ' .** ' ./.-*i. ' -" '  e ..-&$'  .-.f-' +-.#%' '" *D'   $*...' e ..*$..*' -G$**' .*$$' $ $n $* * N* * $ ($*    $O$$ d  *$ *  *  *$$ *. *%*$ ..*** **#gH+"111111111- 1g111 11111-/3Fireworks Factory\Open up this corridor above you to get the chip. All red buttons must only be pressed once.                    *        Josh Lee92 2k!*!h.*  *.* * ** ******  *** *** * * * ***  ** ** ****   ** * ** ***** **  ** * **n " 22g .; ,?=,,#%-&$ Bisection Jeffrey BardonB: 1! ---g- g -----2-  - ---- --- -2 g- -H- -2-  - - -Vg-g-2--- 2-- - - --R-. -- 2-- f NI$-H-- - -2-(--e-2---g --P--- --  * -\---- --2---2------i`----* ---@ ---H--- --@ -- --* -- @ g----*g *-- ----- -- g @2----* --"---*--2g-g - ---2-------2--##-2--- -#-- -@#-F- g-##-gD-----* [---U ---*-2----- g 2-/-2 ---  W-n-Y .--2-----.d!_d- ----- !&1X-i  ! A M++-- --+-+g.Ruinous PlazaLExplore these ruins and collect all fourteen yellow keys to reach the exit.  (           Josh Lee;R"""""""""""""--- """edf d- -d -- --ng- -e- - -- e- -d ede"""---"""""""""""""----$ Blockpick Jeffrey Bardon<,f!---hhhhhhhhhhhhhhh"I!!I!!gi-.--.K!!K!! -c---n---'+!!!aA@--!!--"h---!!BCc---- !!!-------!a-- !---  !-e---! ----!---- -!!!- --!!-----!!---- ---!e- "hhhhhhhhhhhhhhh----!--E-G Flippant           Tyler Sontag=X#------QQQQ------d------"R  SSN R(dOVMnh-  jL Q  R------"------dQQ------   X R - -  -  -   -                                   (<55!! 1;I Blue Tooth &   J.B. LewisT>)--+O+O+O+O+O+O  +On/ +O! +O! ' '! +O!' '' '!+O%! '!!' !%)+O!' !! !+O! '' '! +O! '' ''! +O! +O  --) L  ( (#%)"((XBlock UnpuzzlegAt the level's start, no buttons are covered by blocks. You may want to make a map of their positions.               "      Andrew Menzies?2E)*  e00 I -   # K   d   """'+               0 n         f     g                                           &   P%  $&/&    %&%-    %- F  h $ H @ e  -  **    )2?#y121AwPneumatic Diversity VentsSecret password #2: WCRV    Andrew Menzies@  O(  e)   LnN N       " -LN M MM MONN MM OMN MeM OV MM NLO  "---    O M' 'ONLNMLNM''&%O%&OLO g/#/ M M++++LNMLNL M) &(& Excuse Me1Traps and buttons are connected vertically here.( |                 Andrew MenziesAF!    - \\\ j" n J   \\\ -" /    \\\ -" A H - P \ \\ " "   -  - "  +  V  bee" '' + I#   ee`"  0g -   " " R  -   "    [  0A" d   Y  "    X  " " %%&& * *  M " %&& ***- -***   " %%& * *  ***I" %%&& *-** **-* \  " "  *-** **-* EE  " \ ***- -*** F   "  * *    "  * * GG  " "  S i   "  ... $   "  ..    "  ...  -  " " K   2 fNz21)<h+Duplex9Blocks next to gravel have a chip or an item under them.  J       Josh LeeB,   ... $E..$ .. .D $ ..$ D D. $E "..  ..n. .. FG$.. $ .$ . D. .$E.  *1E1a11111f11~ AnacondaH                Henry PottsC aG$$!1     1     11).   1 1 1 11 1 1F11 1   1111-.EE1"111 11-1111F1F11E-e11 1111-111#1-e#11  11-11 --11F1-111G1- E1E1D11F1-1111111111--1#11-11---11F1D11D11-G-GGF--- 1111---111111#11)1E11$E111 D1111111-&111%-11D1 11)1k11E1D-E-F11 11-111111-111-111111111E1F11#E11D1gE-1.11111L111---1111111111--- 1*1DEE11111.11111- 1#1 11n/1D-1111111F1( .1F111111.1111- 1 1E1(11#1111(--111D11DE11111.111111F111F111M*O111D1-11111D11#111111D11G1e- 111)f111D1$11.11111D1X111E1111111 1D1111--111i111GG1!!1H11)1D1 1G$1111`- 1#11g1111#E11-1 #1 #15#-1'!1&111  1#  1 # 1111Nuclear Energy for DummiesNWARNING: If any systems become unstable, a total nuclear meltdown will occur.              P             Trevor HedgesDe!"  )  "  ) ) ) ) ) ) ) ))  )   ) ))) )  )  ) ) )  )) )  )   )) ) ) ) ) ) ))    ) )   ) )   ) )) )))) ))) ) ) ) ))  ) ) )) n ) ) )  )) ) ))  )  ) ) ) ) )) ))  )  ) ) )))  ) ))) ) ) )) ))  ))  ) ) ))) )  )  ) ) ))  )  ) )   )  )  ) ) )   )  ) "   )"!.Cold Fusion Reactor Jeffrey BardonES)'E$ZH'$$-KJHL--hJ *I BIKMIJf-I- IKM* I--\\H! IK\\ --IIK\iJIKg* O-d)*J- "KHH J- H.&J--KKK++H'HIIOJ . H HnH'' H%j O 'H .. #+  H-$$JK*'$d J $$0+T e H0 E$ K00  0K' 0J000 WJ$ R I0K'$*--)0g**1111 $+.- ***-k**"+"+e $- ++(** e+1+e')dp$111+! 01 1111CBall in an Awkward PlaceZ        p                              Josh LeeF !L '  \ !h   -KK -II .n+.(  - * * * e,e  *  @/  , *,,   -* -e- ,,,) -e- ,,) ,/-e-  *Uee) % -e-00  )#* '0*0 -P- +& *  )$* 00-e- - "XG$!.5=A1qe 1BScience MuseumvOnce you reveal every wall in this maze, its layout will look just like you found it... from a certain point of view.       J.B. Lewis7G                  -             X        Z  X X   --     X                  Y  -  Y                             X Y                           Y           X  [                n          8Puuf      Rock GnreuxHp f     d    d hd      */      n      e   d    e       gdS Sewerway/Don't waste blocks. You will need all of them. Archie Pusaka;I,--- - -- - --)--- -- -VV - -*- -*- - -e- -.-.n"d- -/-- -d- -*- - e)e  - ---&)%- - - - -- - i-#I#-- - - -- ---- - ---/?fggSealed Doors in the SpacecraftIFind a way through the sealed doors and gain control of your spacecraft.   Josh LeeFJb( -).L N(- M.* -V..*   -..* -. *H* -.M.. -..... -'+d...f  --- -*^--   H"  * ---")- * AAg -P * @-`%  SB- B )R-@b&% - )c@n-%HX H QA%&%-.-aB--C& GDCC#--d*J%  KPRIF-K%&D  FJ-&%%& D%%  &% F %&&-e%%#E)!:C!?!- ' Technopathic  \              Tyler SontagzK@///////////-////*////- -- *-    **/"//"// //// ////// ////"//////////"**"* *" "//*//// //-/// //-////////////"/// *2 *  -*    2/ // ///*/-//-////// ///////-//////*" --* -2" "//*/"/ /*//"///////// ///"///- --  --    --/// // //*// //"///////"//////////////2* -* "n -* "///////*///////*////*//"//-/////-//* "   2*-  "/////*//////////// ////-//////-// //-"  "  -*- ///*///////*////"////*// //-// ////// "2  2--"   " / ///////////"///////////-// //-///* *** **-// ////// ////-//// //-//-//"//"//"//* *  "* " *  \"Unmitigated Hint Factory DisasterDon't push blocks onto hints! Jeffrey Bardon^L k--e--O-%e%-M--LeL----+e+-K-Jde --K-J-e-J-----e-J- $eKe$--D-----n---DDE &  -* .#.k-b $&O$ B-%H -` O"e$ @-d-(f - -& Eh&WieUlG--"----- -[1-111?1+ +ly Flow State(     (         Jeffrey BardonRMX! . . .  . . n . . .  . .. . .. . /.. . . . .  . . * . . . . . . . . .. . .*. . . . . . . .  . . .. . . . .h. . . . . .. . .  . . . .. .  . . . .. . . *. . .. .. . .  .  .. .. . .. .. .. . . .  . .  . . '. . . .. . . . .. . .. . . . . . . . . . .  .   . . . . . . . . . . .. ... . . . +  . . . .   . . . . . . . . . . . . . ... . . . . .  . . . . . . . .  . . . . . .. . . .. . . .i . . . .  . . .  . . e *. .. . . . ..)!..   . .. . . . . . . . . . .*. . .. . . . . . .. . * g. . . . .. . . . . .*.. .  . . * . . . . . *  . . . . .. . . . . *.. .* . .. . .*  . . .. . . . . . . . . .. .".  . .. . . . . . . . .  . .. .  . . . ... ). ... . .d. . . . . . . . . . . !..gfdddme|Brick Block Facility DSome items are under blocks. Use recessed walls whenever necessary.   Josh LeeHNXK!ddd   dd  d d     d  )  )     dd            d          --    -------    -------    ----     --d---n  --    --d---2 /- d ------d --  ---d---2- - -- -------" --- --2 --d ---- ------d - - - -)-  -)- -----d - - - -d -- --d---- ------ -d!39 < =  # "   Aquatic Ruins^Once you've finished exploring the ruins, use the blocks in the room below to reach the exit! Jeffrey Bardon:Ok!0    0    0     0     0     0 e   .."02     [ " Q0     Dd    0 0 0*      0  22* n     **   J0 E0  JiH%/ G 0  !HI **    00   2 2   000   0   * k  0 #* 0 0 0RD00 R0 0** 00P g *00 0** 0 0 000 0 0 0*'**+  0 0 *' + 0 0 0  '*0+   0  *   0&   Spring ;Cover the brown buttons before you collect the fire boots!    Tyler SontagP,!***e* `ce**N)N  bPP .... `... M $.$  Nb .  O   --aab -- *---- . Rg a -"(I (K !***e* CCe**)J  JBDD .... @... I $.$  JB .  K   --@AA -- *---- . Fg A -n"11(11YMonster Swapper  @       Andrew MenziesQ n ##$I K$      g g         fe  gd        "DD -- - -P- V-%$-/#  -- g- -   P --  "111 h[~Estranged for a Season'This red button should not be pressed.   Eric SchmidtRef  deggdd      ed dge                         n gd ee      edgdeg  dg" Puzzle Box Henry Potts+S y!    "  "                         n/ j                            !  Frozen OversThere are multiple ways to collect some chips. Exit is located in the NE corner. There is nothing under any block. Josh LeeT&,!--.----------- - --------F-------b---b-------------------F-D-------------------------------.------------------b-`-------------- ----D---D%---i--`----- -----#---******de----. --DD --***ge**- --****-D..--***g**---****--i.i--***g**-....-N -...---L-i.i.---N n--*---L' +-i---N' +- F- ' +- -(U-- FF---!- !Mp Forsythia ,      Tyler SontagUX&"""""""""""/""""""/""" """"f"""""""---- " V""" "/ ""- -\--""" "  ""---"- * !""*"- -""!" """""" """"-V--"--" "" ""*/-- -" -"" """"---U" ""*/""*"""""" ""j """""""/!"-- """""""j"""-* "" " ---"""" "k"""  " "- -"" """k""/""---""/"" """ * *"" """""" "" * *** "2!/" " ""  * "" " "" "   / * * """/ ""*"" "" """"/"n"""" "  "*/"""" """*" """""2* "j"*"  ** !""""\"" " """ ""!""-"  W""/"""""" """"" """"/ ""/""""" "" """ ""! "" " ""2 "* "j"" " "" Uk"" !jj! "" *2 "k"j" " */""""""" """"""/""""/"""""""""""""""/ER"--?-- - ---/U 2J ? Nectar MeadowRThere is no real purpose to these hint tiles other than to add to the aesthetics.    Josh LeedV^     *-  */i !Q%--h# %%   ! ! 'n  0 -   0 !  f-D   --H  -*  -- -+-  *-XzCyprusEPlease do not leave your blocks unattended while touring the island.     Tyler SontagWXD(// """)n//)""  "                e  e       d          g    e               dD **** *   *** **   **** *  g  * ** *  e ** * *  d  *** **  **** *    **** *      " )/ ""/ )""""!And the Walls Kept Tumbling Down[You need every chip and key. Chips aren't under blocks. You can't take keys between rooms. Andrew MenziesX! -! -'G   , e,g,* %-'+dn-'+$-..K$ J "$ b $ (DD(f DOB 00O DO ((O O..O#O.OVOO /!M+T1?1&1X1 Empty RoomsEmpty hallways, too.         "     Tyler SontagYz  -  - HHHXXX-- HeHXdX--- HH**!!XX- HHHHHHXXXXXX-- H*!X-- H*HHH..XXX!X- HH$H HX---X$XX- Hi  HHXX---hX- H HHDiHXhPXX-X-- H*.HX.!X- H HX--X- H HHHHHH""XXXXXX-X- H' e*n!d-'X- H H.HX.X-X- H.HX.X- HHHHHXXXXX- HHHXXX- HX---  -- -*1111111 11111111111 11111111 11111111 111 1111111111 1111 11111111111111111111111+111111+1111111 111111111111111]Diametric Opposition      Jeffrey BardonZ!A` @ nI--EEEegFCKjFd-.G!- ^-eB F  G@b  GeGGe  C* -QQ - P P fSSe   K @ KO KO K(&&G *"DRPF c Z &&   * -*%hE&&#Wretched Hive of Scum and Villainy T         Jeffrey Bardon"[;kk*)))k*   k*) ) k * )   k)*     k *  )    *         n ) .N     .+.      !.   ...      ..i.          (..d.        .)f..#.     ).)g../.   ).)$-.e. ).)j...).)'..h ).)k.).)) %% ee % % O e% ) % %e M%e50 ee|\UHow to Retune Your HarpSecret password #3: LOEC   Jeffrey Bardon_\X2 2   "i    - j 2-  !    E    -    ***!!      !   i! !    2!!!      GF  ---D  n---!iFe !g ! --iE ---eH-'----H+!d'$I-GH-+ '!*--H+ '+i*-H-+'**e!-H/$--* .!*---- --KG-He.! !----i H- .!!-I-H.!-EH--I-H*..*-i--fik Y- g1 - -1- -- -3-$1-- - - -\Fire Is My Enemy%Think outside the box for this part.2   *   Josh Lee]o*gF*i*---e *n \-*  * -*  ***--- ** **f*+ * C ' *   * * ****( *  *. *..*  *. M**h * *.  *...# * . % *.***%& * *N*g * *?*d*FBombs Are a Beautiful Thing     Josh Lee^X !  "   * *  ** (  V   * * O  V   V              H   V V AI  P  *  ** ** ** *        E  E  c    b b  *   E  G     S  * * ** **I ** O                 (   H   Y @ Y D  N  *  ** ** ** *       n c  E  D P       cD  Q    /  D ! Ditchdigger4Consider every creature's behavior before deciding. D             Archie Pusakal_! P   X di  * ---  d    %[-- -- P P- -  X  --- X  d '-   ---P- XddX P--  X-X   dd -P    P- X  --  -     X-- P---P --- P -- ---X - - - X - &--    !-P- - -------P  -- ---- - --- /  -  ----  X-P--- --X-%-/ P  -- P -- X- # Xi- -X P '-+   --- - - ( -  - - - X   P X  ----$X d-- P d ---%-X-X --   X---P ---!   - - P -  --X- - ----P  X-  d- O dd X  X- --- -- XX  ----- - --X /--P-- -P- -- --- --- X -- --- -- --X- -P--d.-- X -Pd-- - dn--- PP - X- !# #--+--------- --d--- -------- ---------- -d--  -- -------------------1-- -------- ---d--- - ------------ di!Ravaged$You'll need fire boots to progress. |                Josh Lee` z)      -# ## ## ## XX ## XX ## XX ## XXX ## XXX ## XX ## XX ## XX ## ## ## #-  "%Yn)GLean Thinking &      Ida Ra^l!  II  " II f*/**I-n i d   G* * #  $&%* Li-$-E --- ...  d   !C  eo$1 hk41^c LockdownBe careful with your blue key!        Zane Kuecks bX  U. ..U.)..U ... U... ..... g .. U  ... .. .U. ..U..%#.....-.-- -...---.*--.-.---.--- .-.-.-.-.-..--...U.  ..U. ... .U. .....U.. .. ... U..U. ..U. ....-..-....-..-..-*-..------ --..---.......d..--...U.. .U.  . .  . .U.  . ..U. ...U .. ..U. U......-..--..-.---.*--.-.------ n%h).---...---..-...-.e...-..-. .U... ..  U... ..U. U....U.. .U.. ...U... . .U@ ...................A.7.g....................y.h.....................z.f..................@\ Clay Tunnel :           Josh Lee c(B h. "  dn        .    !c    bc  `  d  `c  bd a Se            d  I6 Ice Cavern    Henry PottsCd$+  '" **$ ***d******&*&+ d g&#Mn- & %-(%( %- $E+&&E  +  ' '#$ e     P/) f  $$   +e ) $$g  ) ++ ' ')  ' )     )#(       -))&%)!?12',1@111One Tank's AdventureYThe buttons in here will clone fireballs. Hmm... how can you use this to your advantage?F  @       Andrew Menzies.eX(! *   *ig * * * j* * *** ********* "** "n /* **e***d*    ***** *k*****h***   f   !~Condo ManagementWGo around and collect keys to collect all the boots! Watch where you push your blocks. Josh LeefV!   JH JHH *EJHH gH   '. -e df)ggfgfd))))fegfge .fgfdf.ggggfffgff.gdgg gfefgf! ggfde  e   e eeneee !e ..!rkd+;eIAThe Key Issue     Ida R4g r0*2*2&k k&k*2&..* 2K% #k&*. &2 &* * *K%& k   22k2* .*  * &*f"n %k #H2* k. 2&&% * ** kH#/ 2*2k*.K%&%k..** *2. *&&&*. %Ik *2* 2k %I.**k*2&%&&*#**k2k*&&k*k*&Z*`< MalachiteeBe strategic with your blocks and blow up certain bombs before others. Use the green buttons wisely.   Josh Leehf   #.h j !g"f    )n.( )  ) e.. &  M*#  )i%dd& dN   Dual  Markus O.i   iin ' 'i-i i'i -i i  i-'iiiD' i---iii-G'i-- -e---!+- ---e- --   -++!  -'i -ii-- ""#0F --e#""'ie!-""#ii+-+!-"" +--""  --"#------"D"---"#-i& -i'%*i'   i i'0i +iDi i  +'  F +i' ii' !i i ---i'i-e#/-Living Things            Josh Leej,Ci# *  *% n+ * !  *e  * * (*d * -*N '  . g * ** / Gridlock   Cybersmackck!"""" ..). .     hj**hj*  hj  !!hj!!  ik*  **** ik  *  **ik  ** . .ik. *. n .**.hj. .   hj *   hj *  *hj*     !!ik!!ik* ik*  *** *ik     *   ..).. *""!' Combinations Andrew Menziesl+B K g g"ee    "  "   ****E'*eee(***'**********F**n*E')*****'F**)******&&&&**********%&%%&****%%%%*****&%&&&****d*&%%%*g*****%&&%%)***g* **** H**N*B@*'G E ******'*****  d**** --  TTTe *#)%N+T+++6+ +ePScatterbrained<      ,       Andrew MenziesEm<"E! )#    c   %   SQi     -e '    -R--hf) B    --d   P--P `   +   8 e . B E)J(H- .FD-X-)JH ` GHe  .7        * L   ).^  " N  d  *$V[  )n/ -g { E -----.1C Shemozzle[For this race, your sheep dog will meet you at the end. Not all of the chips are required.   0     J.B. Lewiswn"3 g""de dd degeddee" ne "" d " d  feded""e ' Keyrithmetic Andrew Menzies o%.    n" Water Bottle Markus O.pX! %%&  %  %    %  #     & &&  & % %#%      % &    &   %  #   #  %  %      #   & &   %%#%   n% "  # %f   & &     % %%    &  %  % # %#     &  & %      #   %& #%   #      #&    %%% &       & &%    & #!(Triple Mint Slurpee Josh Leeq2:)(LM (L *N"%- '** V**#&+ S $O n   #&%&%kV ('V+%)%1_cHalf of You, Half of Me   Rock Gnreuxr#!...... +.... .' *.. '''..  ...!....V. .....f] *-I . .....  *H d e P ..* D% #& .g@ . I$...H...  -....DLLc' -.N-- "* -/-- "-(--(--(--- " --- " LM*--n"*N K[1++Repugnant NonsenseTThat's not really the exit. You aren't really Chip McCallahan. This is all a dream.2 "   Tyler Sontags  *1*1*111111 11efdg111111*11*11!1!1!1!1*11*1 111hjik1111 11  1 11n11111 11 11*11*1!1*11*11*1 1*11*11*111111111 11111 1111111 11111*11*11*11*11*1 1*11*11*1111111 1111 11111111 11111*11*11*11*11*1 1*11*11*11111111 1111111 11111111111111*11*11*11*11*11*11*11*1111111111111111 111111111111111111*11*11!1*11*11*11*11*111 1111111! !11111111111*11*11*11*1111*11*11*11111111111"1 11111111111111*11*11*11*11*11*11*11*1!Overlap Rock Gnreux9t FF $ n         kDD"D e$LLLLLLLLL.) !   -d ) g----g`-----+-+'-d'-d  $$$(( HHHHH B11111 11#1111111111R((1&They're Not Called Blocks for Nothing            (      Eric Schmidtu,2! ]"" ] _\n"__ \ %%%%%%%%% ^%.  \.\.\.\.%^ %....\..\..  ..\..\...%  %.\....\. \^..\.\..%  %.........  ....\.\.\.%^ \%...\..\...  ...\..\...\.% ^%.... ......  ..\.\..\.% \ \%.\....  ....\\...%^ %.\......\...  ..\...\..\.% ^%...\.\......  ....\........% \ \%....\.\...^ .\.....\\.%  %.\.\. .  ..\...\.%  \%.\\.\.\.. ^.%^ %%%%%%%%%%%%% \ ]]]____!$ "  ` [ > <: C < d  &Greenian Motion                         Josh Leev["*g'' g++Gn++g ''++ ++''+'''g Chip ControlsZ           Markus O. wY! . .---... .. . ---...-----..... .-----..---n. -- . .-- -.--! --.---*.*  ------*" 0  --%e--  --*(' I  P% H*#$-* -%L& ----dL--*%h" -.---**)*--- +f-- \J)--g--- K$-'+'- + e-i -) -- E$-.- EkB- -.- HA@-.- -- ----j-.. ...---.----..-.-----. ./. ... .-. ..!w 111 StrandquistSecret password #4: VSVA              Josh Leex  n *% * " & % .&#.%*)Construct-a-Sokoban Markus O.y&! -*----ee----*H-)-e''e-)-*+---eV--- --*$-------D-V-#G#-*---V----*------@---- -------------------------#E#-------/---n---------(------VVV-----. -V--*%I-M---V- -O-M--VVVVVV--M-O---V--V-'-O-M-V----M-O-VVV---"-V---*-J------(---V-*-V-- ----------- --------- V---- --.- '+- ----.. +- - --.--- -*'+- - *--- ----*--V*.!T^$'e51****************+'-H-*CDDeath and DestructionBGreen buttons are for fireballs only. Don't collect the red keys!<                  Tyler Sontag zB3E -.. /) I n-.. ..* G -. .* &&-.. ..  g&&J-. V . &&&-....  &&***--- && *-   *%'O #*-- *%'O *-   %% *- %d $***--  %+ *- %%+ ***--  'O+ (**- 'O+ **-   *- Hi f    Q QQ RA """ C    ""B0  "" @C        BP e @)RCSSS!sl1; >\Jigsee2Only one block in this level has a chip under it.(     6     Andrew Menzies{R&F$K'LX$/( !RV0K'\$gd **$%-VK'&V$E0Q0*. VK'%b$#)#k V )0 `++.*.* +X".  .i+.k** \.. O L. +KM - (* 0 0 ---N-** f f n-LM - O0'- OMd# * ' H---Le * f hL-- - . % * f0g O-.-N &** I+e.. ***! ! !SG*   **0$*H ! ! *. 0H ! ! *d* *. !! !*! !'. **!! j **i *  !!cF111 11111 1111%1 31-.------c1"+YLife Is Not a PuzzlexUse these symbols as indicators to know what trap is and isn't open. The button above is connected to the block cloner.F   8  2        Josh Lee|-------" -)"" -" - - - -- --n-) ---------N/i Air BubbleBCollect all the chips in this bubble before Chip runs out of air! Jeffrey Bardon}zL/ e#COB@--@B .PC A  @-%  'EA*. ** *-\ h@B-d--.H A. -----ei *-`   "" - \ g )H)h k. !j fje . .P   . .Hdi*+.S.' +'   !Ak.'* i e.'+* )+.''"g !..+.n.i  +. g2  (" !  * d  '+i+'  . !&j -+.p8Beautiful Struggle Bind MenderDo you see me? :-)  Miika Toukola,F!n*.,.HHe.,d... ...,., gee .,...,  ,Igd  h!i-T&%#% h-&%%&&&.. !! #&%#% !i  &&&%&. %%#&#&hd*  `e   `e    ``e   be    -e --Q.(L.HL--...H((..HPP-P.HM(N-!!!!!ViF!!-!iiii!!!-hGiii!!!iiE!!!iE!!!iDiE!b Wrong Exit @  Markus O.!)------)---)------ --- ------ $-K$@&%& * !- --%--.L---#&-n%e-----g@&&%'%+- -& %'+R*&& &h '%%+c  &'&+& *&%%-* -`cc-- .-- .---aaa/-V ..-(.-.'&%I+ $*---'&%I+ $-'&%I+ $-- $----!#j$ -D)f*1U--!1611111 -1Mindless Self-IndulgenceTeeth go from bottom to top.F        8         Tyler Sontag> ) i .h  .  ".-& g-.. " . @B" n  Ae " . ".-.-.. ".   f.)#d=Undefined Fantastic Object  Jeffrey Bardon!L(* (((hj(((ik((-(  (  ((((  ((n/(( (((((   (((((( e((i(((( ( ((((g(..((((.((((h(.((( % i(ed((( ))j(gfk((( ( k(H((( ((( (((j(( (( ((# ((((($.)  (( ((H  ((( -(( ((( )(( ((( e/d/g/f((! (-jhj@jhj@jhi (((-hhjhh)!0"(I(&((~(;(S(-1Q(%({(: Bam ThwokiNever allow the tank to be switched. Every block adjacent to a blue button has a blue button underneath.  Tyler SontagBZ!  g """ ""- "" --  *-f&& -*%' .. &&-  0&&& -...O **- .*** %+%% *  .***%+%d *#* $* O+**- '  * *O+**- . /)  **----    ) e - -  -.   *--..  J *--    ****-*  *-  (*   -- n  *--  && ..  %&& .. 'O..*%'- .i ! 1nJigsaw%Do you see which block has the chip?(          Andrew Menziesa1a!  LfK( KZ----  O0 0e AA e  A  K  0    A0 @ n eKi.D     K  0    B  B@ 0H  *  C0. .    B   A 0  @C I 00@       V0 ** " K C     000    @ ' B ) )  . . B # 0@  ++0  &%-cJ  +-- D   @%&e-- e  ! &-- D* BI0 gda C0- !]S5&; m0  F  \ ''1  r 7  S Monorail R              Tyler Sontag $!)  $   $ ( $ $     L$  $    M$  $ $ $ $  $$ $$$ $ B@ )  %   $)$ $ X n#c $$$$$%.a$/"1111s MonochromejEach time you leave, choose a color. Only press red buttons next to doors of that color until you return.             Andrew Menzies J** **  * * * "* *n***' +*  * * ** * **k. Pushover  Archie Pusaka.(.O'+)M')f..  /++ .(.$.*d ( . O  .. Ie.(. .    ) n g..(+..@g.'*1'p PropagandasThe above button connects to the trap on the right, and the button under the tank connects to the one on the left.(        Tyler Sontag!eeeeVeVeVee*eeVeee*VeVeeeenVeeeeeVeVeeVee*ee*eVeeV"Ve"ee!peA Seeing Red    Jeffrey BardonY%       *i  %&  e%&  & %*%%%*%& &%e e  &%* %&  e%&  G %*%&  &    ):-)"hn$/G& &$&##&-&      kkiH1N1kwThe Longest Track8How long can you delay the fireball in the nearby room?  Archie Pusaka&................................. ...... +$I $K$+...............P..... ..... D0. ...... Z ... "....%% '&"X@...% + &"...' &*/)...+V'"% +&     n* .$.  ,'eG L --') d +0A ' *# *IM  (-N ^ `f$...   I....   .....*............. ............-.............a............ ............................................1s111[+g"+)1 "1ipZipperGAll buttons are connected to the next cloner or trap in reading order.<      (     Jeffrey BardonsKL# V$$   $ $    S  S     Q  Q  RR P  P      $$V $R nR$UP  (P$$  $$%$$ $$  $    $R R$PP  S  S     Q  Q   $$$$T e$k11)1111111 111111111111111/Unravel                 4          Jeffrey Bardon2X))))E-FEee dd -  %% && - F0%&&& %% -V $g D -  fG$++++ -  %& -& )$ % G-G'' '' )* &  &$)- %  %% -   & ###--   ##  & ##- )  % #DRP'G g$#0 $ ##  &%#  n#0 JJ&%/##  #   M#0 ##    # $ #    &%   &  "$ $%& $00(% &- N0(P1+@ ]c;%Repair the Automatic (Caution) DoorsTTo fix the doors, fill in the water in order, but don't step on the resulting dirt.2P        Andrew Menzies/c-- #L)$-.j%.h-.B .  -&&!#N-ke )i &E-M..-!-V-V-g0e* -* \*- ...[  i.--g.-! e-@ . . ) -- diiLe-g-.e-*G F+'N--eg.H. g-.L  -%..*A N#-EN.-  .---  fM.$$D e /*!* `.gW.')  $G$  %.*Dei.! *!-H L!i-!.* .iD-.i i!R.. ii #*.- ...'*) Xd**"(e*ig*id*.D .!i!'in |1-5i&+-- +g/e5-0- =11+' %11"--+F+NWorld of a Thousand FlamesKNow that you got the green key, go down the teleport and use it to escape!(  ( >            Josh Leed<!        % - *&Bn&  - "    `     !#( Stratagem  Derek Bowser .!j))Mn - - R-  0  -    ( -0 X--"""  -- "d" d-k%&&V& %%%  &&&--%&&-%%% &&&& #&0&-&& ^#& -&0 &%%%--%%% --%f%f-i* G***  - *-* F-    '0  *- /  $ +- 0  B--***  -- *g* e0$=+1)1Color Coordination)The red button can be pressed only once.     J.B. Lewismj##f-K- h &&    %&G+    % -K V"!  - *- j P  & !!*)#   & h!'    & P'  e &&& d -+ & -  &&     n & 0      g&   Q    0      "- 0S    &M+       ii %/ 0    # # -(.#  ' +' e-*( +--N-)  '$Q)---NO$! P- Bg* '''-)A kN  '- ..+++ --^$M^--- .' ++++++$^--)-- . ' +++--^. .(---^---..  !$ ''')---^ .$'''%--+ (11 j!-1-  -- 11 -1-8Paradigm ShiftkBe aware: hold left on the force floors with the bugs, and make sure you don't try bringing suction boots! 0   *      Jeffrey Bardon4)))))))) **O *Ub)) $!/-A (!*/ ))/ I'- ))#-X ' R *))L W*/# -' )) #!-/.!H (*/))(D/*  .  F))*--$Q#- M/!$)). 1 *\. ))))n)))))))")))) *. F.* ))/ #*Y!/- '))B*! # -))*' (P/ *a/*))- $-' V/ -$))\!(/  F.-/#!))  T/*( X ))#-!*(.$ /*))*M * * ))))))))k1 +1+++ +++.+111 +1:+++#+ +1++++-+Hacked Save FileNERROR_READ_FAULT 30 (0x1E) The system cannot read from the specified device. &       Josh Lee! H    g nX! - j TT    KHJK$- ((( *  #  H 'J    #  d( JJ       **((( **GV**MdO%&E-**"&G  E-- ** G$G-\eE E\$G -$Fe G$G -$eD E$G -$Ge *  e* f K  '***+k I!5>1+E1 $1 1111 11Japanese Game Show  H   T             J.B. Lewis  ,!QQ d*.( .---aSSKR *O. *..-i-!- $G-+.L'-+$. '-+ .!/-  j.'- "b-  n%-D  $$ -  I--  -%e#i*!   -  Dg*    !g  )  !f  g @h .   )g  - g  !k` d  *g !31119 Gimmick Isle.Well, that socket didn't do much, now did it?              Tyler Sontag8B  n 2         2 2   &&    2                      k    f .                            %%       K#,E !#-+ Gravity Well  Jeffrey Bardon8Y!)*/f)- hdP-  R-*W  Re*'  *PZ  .1n$  g   1)    "     ""#"#""   ""&"""d  ""%#"#    '%&#"&e  -+"e%---"+)!gD *D,.. * *  id - 1O$ - !D   ---   c k- !G- #- eK-g  - -E--- - -!31ed?%13--+wg;g--"}Mental Marvel Monastery Worried yet?         Josh Leetworld-2.3.0/data/CCLP5.ccx000066400000000000000000000730601475511570500152650ustar00rootroot00000000000000 "Chip!" Melinda shouted excitedly.

Chip McCallahan dashed into the Bit Busters Clubhouse's control room, where his high school sweetheart was waiting to greet him. As he and Melinda embraced, his briefcase snapped open, and the papers inside flew about. It felt like Chip was experiencing slow motion as they floated to the ground.

"Oh," he said bashfully with a knowing chuckle. "Guess I should've set that down first."

"No worries!" Melinda replied. "It's so good to see you. What've you got in here anyway?"

]]>
As they picked up the papers, a wave of memories swept over Chip. It had been years since he first set foot in the clubhouse and completed Melinda's original challenge. He had periodically returned for more as the ranks of the Bit Busters grew, and new levels were made. But life often pulled him and Melinda in different directions. She was still supervising the level design guild of the club, while after a period of solitude at Mental Marvel Monastery, he landed himself a modest job as a teacher at Chip Grove City High School. His new position had brought the two of them together again.

"Are all these tests from your students?" Melinda asked.

"Yeah. As much as it can feel tedious to grade these, it's nothing like pushing blocks around in your first clubhouse, you know!" Chip said teasingly.

"Hey, now," she said. "We've both come a long way since then! And as a teacher, you get to be the new faculty sponsor for the Bit Busters' chapter at Chip Grove City High, right?"

"That is true," Chip said. The melancholy in his voice was evident. "I love welcoming new recruits into the club and seeing them grow. But sometimes I wish I could come back here more to test out all these new amazing levels you all have worked so hard on."

]]>
"Well... you might just have your chance. We've been working on a new challenge for some of our most dedicated members! But... there's been an incident."

"Really?" The spark returned to Chip's voice. "How can I help?"

"We've started doing something new," explained Melinda. "You know how you used to have to deal with those blobs smothering you when my lab experiments went awry? Now the Bit Busters don't have to worry about that! All the levels have been converted into virtual reality spaces. They're stored in these." Melinda held up something that looked like a miniature crystal ball.

"What's that thing?" Chip asked.

"It's a storage device and a portal of sorts, all in one," said Melinda. "Whenever you push this little button here, you get transported into a level! It's kind of like a virtual pocket dimension. You can go through a challenge as many times as you need to, and now without any bodily harm!" Melinda was especially proud of that development.

]]>
"So today's Bit Busters don't have to get clobbered by those pesky walkers anymore?" Chip wasn't sure how to feel. "I kinda wish this technology was around back in the day!"

"Me too," Melinda mused as her thoughts also started drifting into the past. Much had happened since she and Chip first went to the e-prom after he completed her first clubhouse all those years ago. "But all we can do is improve what we can and move forward. Right now, the problem is... all the virtual reality bubbles for our new clubhouse got scattered throughout Chip Grove City and the surrounding areas."

"Really?!" Chip was shocked. "How did that happen?"

"Well..." Melinda replied sheepishly, "It was my fault. I learned pretty quickly not to store these things out in the open and all in one place. Especially not on the rooftop! They're still in development and can be a little unstable around each other. The combined force was so much that they pushed each other away! But the good news is they can be safely put into these little boxes."

"Oooh, shiny!" Chip felt like a little kid holding a new toy as he examined the box.

]]>
"Think of them like little Faraday cages for the bubbles," said Melinda. "They're safe when they're in here. And what's even better is that the bubbles are designed to teleport back into these boxes once the level inside has been completed."

"I think I got it!" The wheels were starting to turn in Chip's head. "Are you saying that if I go out and find the bubbles and complete the levels inside each one, they'll be zapped back here into these things?"

"Precisely!" Melinda replied with a smile. "The good news is, most of our Bit Busters have been honing their creativity with these new levels. They're trying out new aesthetics and even experimenting with the layouts of our old designs!"

"That's cool! But how does that help us?" Chip asked.

"Because the designs can be a clue to where the bubbles ended up! I've been able to find them using this." Melinda held up another device that looked like a handmade Geiger counter. "I made this little tracker to make sure we didn't lose our new virtual level library to thieves. You remember that incident with Jude, right?"

]]>
"How could I forget?" Chip started having flashbacks of Melinda's ex, who had infiltrated the Bit Busters many years ago while he was going through one of their new clubhouses.

"I started discovering the places where the bubbles ended up were very similar to what the levels themselves looked and felt like," she continued. "Maybe they were drawn there like magnets. But because of this, I've been able to map out a route you can take to collect all of them and teleport them back here. Think of it like going through a new clubhouse, just world tour-style!"

"That sounds like fun!" said Chip. "Where do we get started? Where are we going?"

"Everything starts and ends here," Melinda responded. "You'll find the first few bubbles in our training area for new recruits, then you'll need to explore Chip Grove City. Beyond that, there's mountains, caves, factories, and even our server room. Then, at the end, you'll venture into... the Mental Marvel Maelstrom. It's my new secret project: a big tower with a gauntlet where we can house our hardest challenges. That's where the last few levels are located."

"That secret tower project sounds amazing! How many floors are you planning to build? Maybe 264?"

]]>
"That's a great number, but no, not even close to that many. I just have nine for now. But we'll get there one day. Let's start off with the basics and get you back into action first. I'll keep in touch here and continue supervising the Bit Busters while making sure the bubbles arrive in good condition." Melinda handed Chip an earpiece, which he put on.

The two looked at each other longingly and basked in the moment. Knowing that the two of them always had each other was such a comforting thought.

Then Melinda broke the silence. "Good luck, Chip. If anyone can collect these levels and bring them back home, I know you can!"

Chip began running down the stairs to the training area with a newfound confidence in his step. Seeing Melinda again was always the best motivator, no matter how hard the challenge in front of him was. As he approached the door to the training area he had first experienced so long ago, he saw the first bubble on the ground.

"This is it," Chip said. He took a deep breath and pushed the button. His latest and greatest adventure was about to begin.

]]>
Now entering World 1: Origin Outpost

]]>
Now entering World 2: Chip Grove City

]]>
Now entering World 3: Mountain Mayhem

]]>
Now entering World 4: Treasure Temple

]]>
Now entering World 5: Caverns of Curiosity

]]>
Now entering World 6: Factory Frolics

]]>
Now entering World 7: Wonderous Wasteland

]]>
Now entering World 8: Painted Mines

]]>
Now entering World 9: Bit Busters Mainframe

]]>
Now entering World 10: Colorful Compound

]]>
Now entering World 11: Pattern Palace

]]>
Now entering World 12: Ambitious Archipelago

]]>
Now entering World 13: Dusty Dry Ruins

]]>
Now entering World 14: Puzzle Precipice

]]>
Now entering World 15: Mental Marvel Maelstrom

]]>
tworld-2.3.0/data/CCLP5.dat000066400000000000000000004272511475511570500152650ustar00rootroot00000000000000@ !     g  *eR   'd-"n-+'-`fe- i!'!)+ g!*)!) )   !+d F Lesson Zero    Josh Lee^  -dD -    *     '-- G*gi     fG$  #   l/ &" e-H!D*= /+ V$h1Multipurpose ToolfBlocks can be used for many different purposes, like bridging, redirecting, and, of course, blocking.     J.B. Lewis{,   "J/,   ,,   J,  f """H",,  gI, "" .$K* +"""*  *e+Q "*n* .+ ** .+h-!--  !!-!-!- -- --!-d  -!.!.!-! ''''-!-- -!B!   -!-!-!!`! ---!-ie 1 e w PaparazziYYou discovered a secret hint! To access World 4, Treasure Temple, use the password YXJH.(           Jeffrey Bardon,w                   gd   ddge      eg   gee -  -    g     ed        d e    " g    "f   "h dd"  " i"   " e    "   g g    eg        g JBN    ddd -!n!-    geH@L   edge      ed                   1111110# Key Free Jeffrey Bardongk """"""-" "-)-""in+-Ng""iiOM""iL ""   ""'f* ""($**"" #*!e""  !!"" I!""JH"""%K""&&""%.g f""..  "".  "")" "j""""" "3++DFragmented Lamina         Josh LeeI kh#jifeee   n %  %     %% % %% %%    %% %  e %%% %   %%%% %    %  %%%  %% % %%  %%   %  % %   % %% %  " D' Choice Tools Jeffrey Bardon=!.-d- #**E"." - ."!.- g'$!. e%%"!. ". %%.  "!."...%%."f .. n%%*M*"  " " .". " " D"F-.-"i* k* j*---h" -.-". * " *..1-@???#+:E Trading Post     Jeffrey Bardon.8Oed++-----D''----- +'...'+''+ .+. ' ++ + .n'..'/"RP,3.>..Trick or TrapKThe blocks you see from this point of view have recessed walls under them.Z         Josh Lee8 h <! +f*nC -"I -  -K% ---&%#  - -@  & -- g  - e -  &*  **I  g)***I )*I) $$$&d&- -)$$$% -- #   /!$J1 1 1 :--,Secret Jungle Laboratory]When you escape from a mad scientist's lab, you need to book it for the nearest exit, silly!0            J.B. Lewis ,5        F -@-`------..S  .'''.+++n +.'." "..""""""""dgegfdedggZ Ages Beyond(    Jeffrey Bardon xjjjjjXXjjjnjj+jjQejjjjX' eXjjjjejjjj*i jjjjX* Xjjjj*'-jj+jj g".j jjjX  .Xjjj jk  j jj jd..fj j  -\.j j I.*--j jXXj jXXj ju.].-+YPyramid Scheme        Josh Lee / F(G#$$- -"""#  -  ne  -N - -&%  - &.N h"%dg .."w11d j Vault LineqYou escaped The Vault - and found a secret hint! To access World 5, Caverns of Curiosity, use the password XIRF.    Jeffrey Bardonq g JIJKJIII JHJJHJI'JHJG***HKFHI +I.$- *" $ -   $--g+++  R- ''   FI'   . .# .+dk, -. ... !... ...  "%.f. ).... ... &j ..n%0%% .. JKiJ!e # '.. JJ-+++ . JJd+g  JI++)S JH+-JH+--,JHg+e+$ JH JH J KHI811 1en1Cardboard Cutout2            Josh Lee9, *  * ***** ***** ********** *** **c " * $****  * ****!P****`******0**&****!0*d..*******.*%*****... * #F**********... * *****e. * &-*****)...g*-****)))*-****f)) *****)))* *****))******* **** * ******** ** **!*******n**********i ********** * ** * *)G1@High Fidelity Flame    Jeffrey BardonX^  ' ( ' ( ' ( '' (('''(""" "LM('(` c"L'(O  "("(' M"--"-'(L n "('(! '(.('!' d '(!'  d d. ('!' dd '( ddd ('!hhh! .d  d '(h h dd ('h h!.'(h.""" ('+++" "'(( ' ( ' ( ' ($8""T"\lTHeterochromia          Josh Leew9! --#-- -- --- -.-/"k*-- -.V.V-f-- - ..-*g---..-*-- -..-d-- -...-*e-- --*---n --- ----  - - -- + - **+***--- -'*+- --+ -'* +*- -- -'***+*- -- - ---- --- --%% !!!))!!! ))! !!))! 11-{' Moving DayaAlmost done loading the truck... just need one more box of things. Where did I leave that again?(     Jeffrey BardonCtH*  *   V * U VS+' )JJ -    +     *+ )f   + '---*  +' +--    +\$ +   + *+'--(L *--(  *k ---%*D  %& #i . ---aL W'.* h !*  B *d.ne + U -g J .*W  -  - 2   * *  * V W * G'+$o+.1i3h+There Goes the Neighborhood2          "   Josh Lee(@e%f&-%n%&&+ -%%&+' - &&%%+- &%&+- &#(i-)#..O**-U#%%-$%G%--%%%%%&M'd%(------)+$Q-e ---N%%)-H---&&%----g%%)) -&&('#%.&'''+11- ->...Press Any Button to Continue<            Josh Lee%|+-gg g   fdgdedefdedg  gedfdgfeegf " '"' $heJigJ. ' !)H%K*H.' ' $gdHdeH.(0O--M)).g.MO e )) d+ OM fn+ )) N+ MO #$ )) + OM $+ )hi) ) )$k111gfd111 fe1111 141 141 1*$1 141 111vHue and Saturation2          Josh Lee(G    "j "  VV"`" "B" )   " - "   l "  V-- -- " "  - --"  - -- --"  -g -  E-ed--     --f--- -(  ------ --K  ------ --   E-  O   ---%  +* # ,&%&  %&  %&& .   &% 'i  &&  & %&  *  & % [ *g P  %   * )   -    ^---   ---- %F5/ !/dLqForbidden IslandvChip wakes up in a cave on an unknown island. "How did I get here?" he mutters. "Maybe if I collect all the chips..."     J.B. Lewisl0               g& )  ) %   -  Q% &  &%    H&  %&*    )-/ &% ) - #         )    * *   --  * V--- V   )  %--%  "      -         n                ) )           &U2kh bSlime Sliding.Believe it or not, this hint prevents a bust.   Jeffrey Bardon!kkkkkkkkkkkkk$kkkkAkkkkk^kkkkk\kk-kkkkkkkkRkkkkkkkk kkkk!kkkDkkkkkkXkkkkkkk kkkkkkk k!kkkkkkeeek kkke!k kkkek"kkkk'kkke`ek!k""k kkk k"/"kk k.kkn""k' kkk!!k"kkkk'kkkkkkkkk...kkkkkki+++kkkkkkkk!kkkkkkkk!kkkkk k k) kk 2kkgk  kkkkkkk kkkkk)kk kkk)k 2kkk!kk kkkkkk2hkkkkkkkkk"kkkkk!k k"f"k!2wk11k;kek kk kk k  Capim TownYYou discovered a secret hint! To access World 6, Factory Frolics, use the password RBIP.   Josh Lee(L!                     - )   K K I    H I  H H  H      H   I  K   I K   H K        HI   J I        H     I H H  K n K       K  I  H   KI J   J H I    H          H   K     I H  K H    J         K JK  K K  I I     I J  I  K "I   )   ! !                                                          !Elastic Energy l                  VTx     R* *  h** P.*. ** .*. ** *. **  .*. **i.*.  **  .* *  n   b.Uphill Battle   Jeffrey Bardon  ! '-+N' . + +e'   g X  (% % %%#&-+ 2%)%% +*2')*%'%%% .'* *+. '** $- + -NMf--a-'+d.  '*- .-Dk.P-''". +- 'c---+! '. +*-+++.+---j+g'-'++++)&&&*&&' d &')i' e '& -A' g* ' -- '+  $'!   +g+h ..n-- -- -- --- - -- - - - -- - - - - -- - - --- -- -- -- --- --- - - -!~W*1 --1.1b-M----------/-----------------------"sDrops of Jupiter>Did you miss me while you were looking for yourself out here?                  Josh Leews! &  & &             ! .         d     Y      0         . j   ^    [   j "        ej .    i    .. .    ! +  . !  %   . f    ' *  !    h  # !            %         V*  .   n . *  j    '''       ++  `   * h+ j V             g          % ! ^ N>\ Deephaven(         Jeffrey Bardon^  0[ [ 0   X [  !***  f)     X hhZ h0 YZ0 0 XZ 0   XlZ0     0  0X [ 0   X)#"k[  /%&%&  \  X....Z %&   0 Y Z0 Y Y0   $ { \ +& vnDumbbell DichotomyGSome people call walkers dumbbells. Which is how this level is shaped! .          J.B. Lewis00000000000000000000000000000000 ! ) e..    /)l)---.--k %'  F. ..g & 0f.. %'  +)  ..*&!%  ..Kd %'  +% "  --- +'/-#" 00000000000000000000000000000000++eFor Want of a Nail4You really don't want to be reading this right now.(      J.B. Lewisd nh  g!e(.&-  /%,g) ! "#j .*-&"!,d i % "+eg*) &#-! 0./(,id-Sc Sandshaker, : *' ,*n)--"g i-j-) -.+ -&& D &ed1( g-L &f*(- )%*-%&* : s|-5 Unlock Block     J.B. Lewis?h2!...*K*d)OMe n'Nf--*G)- O--*-k'-L-) gJ-M--- WUe[- -L --+ --' N( ') K(NK$BBCA!*A@@'' * E **E E')- &%&%V'H$-#I''^ X!\+++c+I+0+++'+1++1+++++%+++7++E+ Party Trapn            L              Tyler Sontag@! R!* '* e K $b  -  $"  -" "  ..'S  e..  #* ..e "  ""*  " "" '  &   I I  X'n " I I  @   ""'  " M ""  F i$*  ' h$ XF" "H$ $$* *$ '  * (e$"$-"$ e$-"!"$W'-""- $" "-' Q '$$! e $ " M "  $0 " \'0S "*H J  e"!4&111+1+11111111 11+111111 1 1111111111+11)11+,1+++11111111 11+1111111+11111111111111111 11 1+ +1+ 1+11#SCondemned Facilityn              (        Josh LeeAj,!                  !d V )  (*...)N ..  &M nN#     j   *d     d    *d         *d  %   * i  $???H&The World Has Turned and Left Me Here   Tyler SontagMB """" """0""" """"" ""0". "" 0"""""0 " ""0 "  0" """" ""0" 0. ")"" ""0 """ ". "  " " " " ""0" ."0"""")"""" "0" "".0"0 "0") ""0"""  """"""0""")""""0 " 0 " " "0"0"" "e ""e"* "".."0 ""  " "" "*"  ." "". "0""" """*" ".."0" "" 0" ")"" 0 .. " " .""0 """0 " .". "" """ "" """" ".. "0 "" 0 .  ." " "" )" "" "."00 "..""""0""""0" ".0""""n """"0" "" " "" "0" ""0"" """"0 " .0" """ """" " " "  " " ""0"0" "" ""0 "" """""0"" """" " .0" "00"0" " """0 ""d."" *""""e"0".0 ". "" "0" """ "" 00. " """"" "" * """ ""0 ""   .* "0"" """"  " "  " """ """ " "*.0"e"" """0 ""." 0"" "0""0" 0 ""0"" """ """""o! 6(Tornado Alley Jeffrey Bardon*C!-----"- - - -n -  --/-$$-$$-$-/-- "-NNNN-N-+ )---$O)'M$--+- )----$O')'-+- )-----)''M$--+- )----$O')'M$--+- )---)M$--+- )----$O')M$--+- )----$O')M$--+- )----$O')'M$--+- )----$O')---+- ---L-L-+- ----/-$-$--/--+ ----(------!W -B11111111'11111111111 11mManhattan StoplightQPlease refrain from sending tanks into any interdimensional potholes. Thank you!x                                  Andrew MenziesD  ! ...... J ..... F....)-)-..)..)%-F.....&--..... --....../ # !ee .$ee ee-)-F./.ee e)e-....) ee eee+.. e '....e'.....f ))) .. "".......).&& ..i& ) ...&&...&    . .)n ....&&&h  )V)-)-  -  )  #1p++IW PPPuzzlesAre you sure?     Ida R E!  E G E D  ' D G G F h  D Q ! F  !!  E  E !!!.E D  d!-.--* F !!!-.d* E  !.h!- F D !-  ... G  E --.--.--  G  ..----   h-- D  ddn--- F F ---*---  ------ --.*- G E -- ----   --- --- D  D---- -G d  F --- F E  - ----    "  G --"*  D D  F D -.-  G E F-S- F E  / E -G F G D G  G d E  D F D ! (        +    %  "  5    : - +- -.    --                      Shady Oasis\You discovered a secret hint! To access World 10, Colorful Compound, use the password XJLC.  n        Jeffrey BardonF $    -- '''  --   + -V-- + ------- ' +n-V- + ------   -V- )d  - --  ---   d) --    )'      !       !    !      ''K!       ' !    k J     + /    hT+       --e+H+ "g   -    )      "    gedf         efgd "        . -i!Ski Resort TownBPlan your path carefully here. The blocks don't conceal anything.P      J.B. LewisG& %H- H H-HHH---H---HHH-HHH-H-HH----HhHH--HH---HH-H---HHH--HH-d-HHH'HH-HH---HnHJHHHH-H d *HH..H--H   HH.H.H-H  + HH..H-H HJHHH-HHH  J'HHHHH---HHH* - "HH-H -I--*+*O------HH---II% LN-H-HKNLNLNL$*HHH -..( HH f.(H # +H.. '+ +HHHH.  H---H-  ' H---HH--HHH-H  H--HH---HHH-HHH H---HHH-HH---H**--HHH---HH-H-H-H&HH---H-H- H--H%HHH---H-HH--H---HHHkH-HH--- H-e-HHHH-- H---HHH H---"H%+ + ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++ +++++++++-+++g-+-!1+-e#igj ++++++++++ ++++++++++++++++++ +++++++++++++++++++ +++++++++++++++ +++++ ++++ +"+zAmethyst Mine(  "     Josh LeehH>[!  ** .**'' / n)$ * --*g*'' ****'LNFF '+++e +-\\\*((\\d *(Oi'P\\\(( *-*-f,*"NVV     ,G   k,)DF E  !4.. .-.S11+++)11-Miner Setbacks.All blocks in this room cover recessed walls.F        "   J.B. LewisI3R*** *I)- ---- *e   - **$ e -- - - */*e - -** **--  - --- -  -`   - -- -b ----- '[-)""" I$-- )))"***ReVDe .l."  ) .! T +. *."g gdf#'&&Kke.  *  #N WU $  &     d jih  .     *g"   .W.U.)))0!1 11.-1+`11111"Three Boot Night9You're allowed to use this glider cloner only six times.        J.B. LewisJT-* --* V - "n-- --- * V'*------- )- --*-)- --* *- - -- - -**--- -----'- -/***++ /S.C.......;.......!.....<./o Dark Hollow+All blocks have recessed walls under them.    Jeffrey BardonK! G*ZfgPMe*W"N  CaQM*\ggB]a.  #%**BJVN +   IgFYV + ' k * +  gf  H  M     * * %  H i*. %   .$. % . ' e..#.&&&&&&/-*J H$ % *' ..$ %  .  % 2.* *'. &b 'HI C--.  g*' --g   D'* +%    'dD  +   K!+    ^%+  I* ---   *-'''-  A - -   - - % !  -' jj j !  --"!  !  "" -  j! *d e-[n  ! OMg**fOM !"11 11+ 11 1111 111 111X+u+++*8+#+""+?+---- 1111)aCanyon of Lost ColorxIn the next room, don't hit the red buttons more than nine total times. Be careful which skates you pick up after that.x      &     J.B. Lewis~LFg gg .g. **g * D* gg gig " gg"ngg"g * ggg!gg g g* Wgg FgggD' hgg$ + *g*gQ+g* g gggg#*gg " * ggg--.ggg gg--./g /g-@-gg ggg%ggggB^+|d 1g| Yellow FeverYYou discovered a secret hint! To access World 11, Pattern Palace, use the password YFGX.   Josh LeeME!i   & O #* '. * %V%  e    -#**TT $#   *   * %-&-% - 'e* -  ) .*  #  * -     * `Pg !P*&-  )$T-*% * 'H.*$  ! * "-H-k  *\ j. h2\"-H %Y ! 2(*XJ** *\$-H .@ *P-  -    N\ /# &$#  $ L\ - ## -N\/*##%% ##&& *  !LF -# -"D -  &# D d+kn    *     * i +d% .)   +  *O`H* *'''d   '  2 $ ( G**-)! !"E.+J1A$+ 1h11 1M*{1e1+7hAvenues of ZagrebtWelcome to The Magic Amoeba Machine. Push one block down on the left and a paramecium will arrive in a few moments!F   8    >       Ernest BartulovicN*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*22*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2**2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*22*2W2*2*2*2*22*2*2*2W2**2*2*2*2*2*2* 2*2*2*2*22*2*2*2*2*2* *2*2*2*2**2*2*2*2V2*2 2e 2*2*22*2*2*2*2*2* *) *2*2**2*2*2*2*2*2  2*2*22*2 /  **2*ce) 22*2 ** *** * *  *22n '%%  %%    **  ' * * *22+++' ** ** +  ') 22+ 'f  ** e *  2*2*22*  *2*2**  ) 2 2*2*22  2*2*2*2T2** %+ *2*2*2*2*22' + 2*2*2*2*2** ' )2*2*2*2U2*2*2*22  *2*2*2*2*2*2*2** 2*2*2*2*2*2*2*22*2*2*2*2*2*2*2**2*2*2*2*2*2*2*2*2*2*2*2*2*2U2*22*2*2*2*2*2*2*2T2*2*2*2*2*2*2*2**2*2*2V2*2*2*2*2*2*2*2*2*2*2*2*22*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2**c++J+!/+Z++++9 Salsa Verde>You may need to throw a block party to use up all that salsa.F            J.B. LewisO:{!-- - ---ee-- ]^^_ -*$  ]^_ f ***$  ^ **ee$$   `e*e$*$*   e**$*$$$   *Ee$*  **$**$$  *e  $*$  %%%b** W $$$ && **T $$ #&%%&&&*  V $%%&%%&#%#f- --#%&%#&&%%%#--- --n- ---- - --- '' --  -. ' ' ' N  d .+ ' ' @ N  ++' '0 N  ++' 'A  +g'  ")g/gAC   +g 0C "++  ()++A L .+ L.L h---[ SY--- - --!jS+1c  # F-5------------ = ` "Drawn and Quartered and QuarteredCYou could say this layout was... swapped for a new design! Eh? Eh?x                           8         J.B. LewisPGdeeeheneed dekede( *--NdeJd!I--#LE.%%-0K0(&&--*i -e * de.d*ee*dd*eVd.e-d$!dedY.d!dd O$eje! eJ'IdQee' e*d2  ZVd.e e e-+. dd id.d d $deKh!*dde*e* **dQ**dee$O$heddeCh %-u '1X%>+1!e + e1]11+Indigo Lagoon  (       Jeffrey BardonhQ d *   .  d .  *  . .  .n.  . . *  . d       *d*  *dd                  !+oeee"ee Ceee Numbskull Tom BrownR!   ! +++ .- *--.*.**!-!     -!* * . *   * .  .- ++!-- *  .   - n").!) -) +df* e g  h)kji! !>/C)Y&Encrypted Malware Josh LeeCS         e   ". "   .e   -   --- K  -K   "*-- %  "* -   .- - %&  -- - --* &% & !!---*    d#n+ Q + k!+! d ! ! !  '' ! ''' '  "       5nPolarity Isle<       Jeffrey BardonRTX$1$#& +&*%%#%&1'%# &)%&1&%###%%1##%i d%d%%&&&1&JI$%%&% &% % &&&&&&.%# %%&&%e&%% .# " %& %% %&&&& %& &&&&%%%%&&%&n&%&%&%&&#!*% &%%% %. %%&&&%&&& &.& &%&&/!&&  e$f / #%%$&%&#&%% &&--# & $%G*d**g S  $&%%&) #& . S- ##I^Mc1h1 6"<  ^#e#1%1#51 .iPiston It AwayuThis red button is one-time use for the fireball cloner. Toggle walls will flip briefly, shortly upon being pressed. 0       Josh LeeU/" )) ! "*!!   **   "   " !   ** ""    "    + +  !''  $!''! !' #e  !! $"  &"** ee*"*$n * "*)"" * &"%$ eN*%"%")!+ * "$*"'+*$% **!! '+* "! *! " " +   '"*! '   ! " ! !$$$* !P"!  !) " )$"F11?1/11+ 11U'1?1?1' 1 PESokoban Adventure[You found a secret hint! To access World 12, Ambitious Archepelago, use the password SOMJ.d       P     Jeffrey BardonV -##--##- Q##S-/EG/-##R##-##--##-##R%%%%%%%%%%%%g%%%%%%%%%g%%%%%%%%g% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%e%%%%e%%%%V%%%%%%%%%%%%%%%n%%%%%%%%%% %%%V%%%%%%%%%%%%%%%e%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%e%%%%%%%%%%%g%%%%%%%%%P " ## i ##P##  Q##S #.==@Phantasmal Stalkers:Lynx mechanism and concept lifted from Ryan's "1200 BPM".   Jeffrey BardonW -e* !'* !D0k*. . +kd $n)  )..S) /g *'$.  ! ! f.  !!.))/+11TNetwork Corruption5That's the only exit. How can you possibly reach it?        Josh Lee{X!+ ++ @ @ - ++    ++ - - @ +++ ++ @ + @ - @ - ++ ++ ++  - -  ++ + ++ -  - + +++ ++ @ B + + ++ @  +-++ + ++ ++  + ++ +% + ++ +%@+ ++&%++ ++  A@C#+ + + &+ ++ @ +B+ +-++ ++- @ n -+-- -/- --' "" - "" '   + +   @   B  + +@+ +           !! !j!            q++++! 2 Flypaper;The top half has spare blocks. The bottom half...does not. &     Andrew Menzies Y  '''' ' '   ( %++ .--+ .( + fNN++  -,   Ze g F    # i  -   *n  % " d j V-    xHacking to the Gate<          Jeffrey BardonsZXK!J  '.... g$ -.. J.$."+%L&&Li..K....'#(##(* K V.$$$I.'+PI $$ .g O .$*O-( g*nIe d gfE --D  %. (  $` @D  .G `@-DK#- -- - .e..-- . -  -( -  .-H- .g$ - J M O  .  .  * .J -  *  - .0 -  *  -.  N**!SC+ 11%1(1P11'191=17141m < Decrepit Crypt  H        2    Jeffrey Bardon[XD""""""""""""ih")L"""iih!!  **f     -R j .  + ' .&-+"'.R!P+j' &-- -  -***-)) -!!*** $#dj! "* ji&)k* j -e '+ )    jn    D. e . * gY-J1c/eJ1tAirletter ShopRYou're almost done! Go up through a teleport to collect the items needed to exit!(          Josh Lee\dd$&%&ddX# - -    ** U * d+ +I&'+--Yn  ' d--'-- -----dC -d .dd  *    *   R *    *  ad*     d  d .     ! /!  $--.*. "f   *dO'***'***++*!  *E*dd +?e1;$-1D1^Glamorous Diamond Downs/Find an obtainable blue key to reach the exit!2        Josh Lee]$'F"d .  "  . . n  *$  *M# 0*#.*%*/  *(*'. *&  *'''* + + f' ++ +.' ++i '4+<. &1k Shuffling,The blue button will toggle the doors once.P    Zane Kuecks^D!f***L!  !(.N E!  !  n'    0 ,.!   ' 0 00 %%....  g0.jhh.'$ 0 &j.i    0.kki.' ++0....+!N!! +O $$*0 !''++!!!L!.  # G *& %K& -%!hee- QF ----- e   `---    g- *i  --E-- *  ----- i*  XHHeWe- d /- -- h) - *G** *)-F! $)**"- $--' @jBd*+***-#)A!"11(11t1tFeat After FeatZYou discovered a secret hint! To access World 13, Dusty Dry Ruins, use the password OBBZ.F      (      J.B. LewisO_Mk)"-Se/ -e"*) '*#  &N !   %hf..n)k g* d H$  '*(R%-*d i/)) ))8!7+[0 " +:1}Room of Requirement)If only these were red teleports, right?     J.B. Lewish`H!########@#####*##### Z#Y###B# & & & ######*# % % % % #######& &  & &[##XNN- % % % % #--%I###-& & &-###### #######L(######### #-#1######J# ######1###### ###1-######## ##J#-###-#1###J -n-#Q#-##1## -#**#-#######1#-####-1###---###1#-S#-###1"#-##-#1##1-1%##-^#-# 1####eD#-##-1##1#1## ###---###1#############-1---1--#1 1#1 1G#-##-c##+_ F###-##*-1#-## @#1#1#11-#F**-#-##a##### -D##*-#1#-#a#S#[######-###-#-##-1-####-#E##-1-+##$#V###-#--#########1######!V2##($x#!#?# #^#4##1f###1#.####E#]wSour Apple Cider  8          Jeffrey BardonCa) " eid  dg)   ge    .hg  . !d  $F   ed  -   'k njgk*-g-  e! + .g- e. e egggg  e )!! deee!  !  /gd       .eeeded $.   egd  .  gde  . . #f &%&#. g d'% #&  $Gjd%.## e*P #.## /#'e&##*  #.)g)g)g&%&%!-1V*eeegde+1+Color Disaster InertiapThese blocks have keys under them that match the keys adjacent to them. Push wisely and mind your surroundings!    J.B. Lewisb.. .. .1.. .+-.-'..---.. .1..-...-.-.-.. .1..---.-..-.-.. .+--.'.-.-.. .1.-.-..-.. .1.-.-..-.. .1.-.---.-.. .+-.-'.-.-.-...-.. .1.---..-.---.---.. .1...-.--.-...-.... .+-..-'-. . .1 .n*". .. .--LOClosed Circuit(      J.B. LewiscK  111W11GF111) 11n RP '1- 111W11DE1--- 1 *R1 0d  *     .+P 0  B R  -*X  0B *  00  *S1  e 1d  *1  *11 -111 ^^^11  1  ^^^$11   11   111 11 11111 11111- --- ---111 .*-'----'-11  --- ---. **1++1O "- GPGPF-g)g( PS#11i EREREd d0M "%111** N **1(1 *1111111  s-__1-B.&Cosmic Express H    Jeffrey Bardond 511)) (+(&%((((+ (((''lM(((((()&(() ("&##S&* &H&'& &#&&&-&#&#****&&&#&*--&#&#&Hd e*'**-$+&#&&&/ +* D&&#&&&#&##k +! - - - --A' ' -   B@ j....    C . -    ---+'.... - - - - -  -!R+   ..'+.. -   --- .---j)     ! g     f+'   '  T + 1 s+1/4(The Most Interesting Block in the WorldnAfter this room, ensure toggles aren't switched and tank buttons are hit an even number of consecutive times.d           J.B. Lewis-ei !!2  ! h/! !!) .. !     )-  ----! .--+ --. h-++ -n -+0+"- j- ++-i .-- +--. ----i!i  '-ii i  'ii *!!! ..! ***!! jiii!*  !! .4'' ''`/' 'MBarefoot BanditvAll blocks in the adjacent room are on buttons, and all blocks in the southeast room below have fire underneath them.P           J.B. LewisHfl d *  .g g f  i.n    '. /    E * *H      eF * ** #N De**   * '.  (() $P .d K( )   [$  * -V +  %+ %''"+ 1+(o1Minimalist Art Gallery>The block in the tank button room has a tank button under it.      J.B. Lewisg^"""""""""""""""""""" ."g""""""""""g .""""""Q"" """"."""...$"." " """"""""""" """ """"(-". d" ""-*n"" ""d """d"" """"""""d"""""""h "***""""""" "" "$"e"*""""" """"""*"" """g""" *""""" """"" -""" """ "" ... -"' I"e" "".. "" -"'"""* d. """k """*" """"g"""""""+"*.".i""""*" """""."""****" "$"+ **d" """ +"""e""."" """" ."" *O"""""""".""""j"""""""" """"----"""'"" ."""""- -"".*"""""  f""  "" - -""e."".d ""----"""""..."""""""""""""""""""""""""^1-1r1 qIllicit Logging Facility  Jeffrey Bardonhlig ig .*.*- d- d)!)!e"ie"i5ig ig .*.*- dn d)!)!e"ie"iKt-"Escape the Monotony VTiX!*--)& Q! !!    0 \-)*k! !!   # ---)% f! h!!    *  i  * 11.  i*% 11 g----  ,.-,,---,/.JJ,"e X,.e,+neH"---'g " " T " ""! d*  -C  ''*  2 *kege0*++E.!  id  ggih.$!E--fy1BBeyond the FacadesiBlue walls can be fake. Recessed walls appear as you cross them. Some walls are permanently invisible.  J.B. Lewisj*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\\-*\*\*\*\*/*\*\**\*\*\*\**\*\*\--*\*\***\*\**\*\*--*\\*\-\*\***\*..\*\*\*\*\--**\--\--*\***\ '' *\*\-\\---*\***\* ' '*\*-**\-\---**\*\..*\*\**\-\\*-*--\**\*---**\\-!\*\*-$**\**-*\\-\*\-"*\*\-\**\ '\**\\\\*--\\\*\\'*\\*\*\*-**-\**_*\\*]^*--\\*\*\\***-**\*\ \\* +\-\\\*k\*\n*\'\^+\*-**\\* *'*\$+\-\\*\*\!  \*$+\*-**\\*\\*\*\$\--\\'--\*\\\\*--\-\**\*-^- \\---\*\\*\-\**\\*-_*\**\*-**\**\\** -.\\*\*.*'*' \-' .**\*\*\-..\\*\*\\\*\*-* *\ *-*\*\**-*\*\-\*-*\*'**-\*\*\\--*\*-\*\-**\*\**\-\*\*-*\*\**\\*\\*\*\*-*\\*\*\-\*\**\*\\*\**\*\*\-*\*\**\*\*\*\*\*\*\*\\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*+++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++ ++++++++++ 1 +++++ +++++ +++-++++++++++ +++++++++ +++++++++++++++++1+++++++++++++++ ++++++++++-+++ +++++++ +++++ +++ ++++ +++++++++- +++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++9 SlimefieldVYou found a secret hint! To access World 14, Puzzle Precipice, use the password VMZI.           Josh Leek!" - -""  "- - -- -- -- -"-"-"-"- -- ------ -- -- (*- i - -- -- -- ')Q- !h- ' -- -- -- -* !- i! -  '-- -- -- )Nk-  h- Q-- -- --n---- -- -"-"-"-"- -- ------ -- -- - ++- d-- - -- / - +*"+- ddd---- .S *- +"*+- dd-- - -- '.*- ++- dd-- -- ------ -- -"-"-"-"- -- ------ -- -- '- ..- #g-- -- --  ' - . .- &-- -- -- ' - . .- %g -- -- -- '- ..- e*&-- -- ------ -- -"-"-"-"- -- -- -- - -"  "" - -"!1 + ''* !+ Bento BoxHThis block conceals a thief. The blocks in the room below conceal fire.d         J.B. Lewiscl + + + +++ + +++ + ++ ++ + + + +++ + +++ + + +++ ++ ++ + + +++ + + -- ++ + + +++ + -***+++ + ++ +++ + +++- -- *** +++ + ++ +++- -- .+++ +++ +  -  ++ '+++ +++ ++  -- + + + + + --.n.  +++ +++ + ++  ' '' +++ +++ + +  ' 0+ +++ + ++ + +    + +++ + +  - + + +++  i+++ + + +++ + .    i++ + ++ +    i + +++ +++  . * * !i i++ +++ +    i+ +  g*  i+ + + ++      +++ +++ +    * i ++ +++ +  `cb"*++ +++ +++  *c+++ +++ + a`b  b`*+ +++ +++ a b++* ++ +++ +++  ++ ++*! ++ +++ +  +++ +++ +b+ ++ +++ + bc + + + + + + + ++ +++ +++ + + ++ +++ + +++ + +++ +++ + +++ + ++ + + ++ + + ++4 + + ++ +-+------+-- +----+ ------- ++ --  -  +  +  ++ ++  +  + +++++ ++ ++++/++++ +++++ ++ + +s Brown Note2             Jeffrey BardonmC n*%!kg (Ld-%*-k!- gN(----- e  -,d-!e - - ,-d!----g#!*O g-!#--M*------*j(J% *$X*j-(%H- $*----$' F i)$'- -i )----*Rf+k *#)"*-+f-k- -#*-") >de6/ /$1 $5111?1Let's Square This AwaytPush a block across a blue button. The bottom blocks are on yellow locks. Traps aren't connected in straight lines.    0   J.B. LewisXn!   *-'R   --%&  -&%Fi    B- K%+-V P --*%0 - +##$ -*-. f- -/ **-  * - - - g.&L%  de N&"*).-..-.* ) )!   *-'R   --%&  -&%Fi    B- K%+-V P --*%0 - +##$ -*-. f- -/ **-  * - - - g.&L%  de N&"*).-..-.*n?v1- -'-J(1- -'-J(Another PerspectivelThe button that connects to the trap in this room is under the ball. There are 15 chips after the teleport.(      Jeffrey Bardono0!2  2         d  d  d                       d    d               d   d   d d       d        . k!nhdd2   2!#6  - #   %. Aquatica J.B. Lewissp*'  +-HiH iKi!hO #-i-- iI--- --i - -H-- --*-- -  --* nii-.--H.'S[Vi-'S[VDi'S[Vi-.'S[V#-%%- iii*!  *.  ***GG **edgf /--..*E  ---k'+  ----..('+-- '+g-K-AAA'. +:E-----C=++++)-K3 MelancholiaqThey say these balls keep the fire boots well protected... I wouldn't want to be the poor soul to test that out!Z     >       Tyler Sontagq  . " """" " "#h""."""" " "."KKIIKIK""..."""..""" &*.!...n ..B..i"#." ..OZ ". *$.-.. ".**--.Z.#$--.KIKI..Gg-....# -  "F - &#. .`.'. *(J "  M ' !."H'+  ."  + .'d$*IKIK ' + ."'+  .SF!f..P"i***-d"..d".$*"\J".$!"+.dIKIK+ "e*H" .-"h! "."-J"""0zL!""H1 e$1D ""1&.1&'.$+"@"2+11b12" "?Power Plant PerilF0      >            Josh Lee0rHF  !.*).*.*e.'..! ..*'*.*!e.!..! .+!+!*. !.e*.!!.!!! . e!.*!*!!.e*...!!.!!!  e!.!.e.!!*!!!.**!! *..!!!.ee*.!*!* .*'!.$*!%..%%% im%%%%%+%%e%%/)n1*A Love for PuzzlesuYou discovered a secret hint! To access the first level in World 15, Mental Marvel Maelstrom, use the password CQOZ.   Bouncyclessg-a!R ***G.- - P'...'+SS---!$*- .   *-* -  *-!** H K*%-- *-n- **-- *g*--- #P**-PHh"-$*!--eS*S!--*!!' -- "*! ''' ---Q- *! '---$"R-*+R*SRh +g" -/----*--R \*-*XP.j -- -Q. $$--     ...-h d  d  d   d     d  !  d   d ! !Z!1+ 1' h%'u11'|!KTitanic Monarch9Prepare to move quickly once that red button is pressed!F        (     $      Josh Lee<tXI!QQQ!*! nQQQ   .    ' S*   '..    .+ *      ..    -'! *-R- ! $-+Q  ' ---   -+   d -    g ! !  + #    e  '!  'F + !  +   -    * * * G -%* E%'. !*S " . SSS ! SSS!G"6+d1c.+.D.".z+3!Sho Sheng ShuiF    $   Joshua Boneu B)  (           .  * * "    e  f   !        +') .   K  d*k! g***j!   )O i!*  h!  *n 7 Cluster Two   Rock Gnreuxv A/* &N J     V                  H0  RRR%   %%%% %  (d+++d*% **** & -+'&----+&%' "'%  & % &% %%&   && &'%  %  && +'%%  d%+'n'D   .#. B"x   Lightning Before the Thunder;Good planning! Now you don't have to dodge the pink balls.F          Andrew MenzieswXd5*.  - *!-!- -.--* #.----- *i-#!---.)-. - /(- L--#I#-K%'J- -' - n% -- --%-* & -M -.(    !&O- %-  -%!- --&-M*! g-  %-*--- %    ---N  .&%. - -M --H- .&!-LLL&  -%e$$$-. -$$$ - d NNN   -!--% ) !f** O7-++-----5-!1(-LUnsanitary Waters_This green button is quite powerful. Use all of its abilities to find a way through this mess!  0               Bouncyclesx-SQQQQ -  eR   2  VI*!AP g  k2 "F'   .O  .-- $- \-   YR--  , -( , -  - P-j/" A-  --h--`+- "-R'f )***i#%I-*--'d--n# ) % .+!P!R     gd S S Sm+++++N+ 2+*1  !-.+I--+-- %+'#3+ ++ + +Fray Manor Isle6The brown button above connects to the trapped teeth.  .      Josh LeeSy HHJ)dddU---dV------VV..'.*T)-H .)Jk .V-V*.K'/)!ddd* J.i..*' 'I.".".(V'.d. M(J*  Jen'*ddVT dddVI)d d*'d#*'* d d d d.d%&.* d d.#   * %& * J.' T*#***  U .' *V    J KW KJHH=s +++...+.4+++ .+++++!+%?+ +$+++" .++ ++++="LockjawRThis room will need to be set up so that both teeth can switch sides in sequence.d        D          Jeffrey Bardonz    $ - *    *i  ) N " ***  )-$ *.. *$$  )- PR. ***  )- ** * d  )--N* h  )- D* j  )-  %)'  )- - T  )- '+' #    $ n  $   / ($  +   $%D    01_1D11A.#1`.?.11)1(Expanding Warehouse@Fit blocks into the room to clone fireballs. You have 8 blocks.   @        VT{*k --- -- --V- -b- --A-- -@ -W--- @- - - --- - --U--A -- -- -- -@ --W-- -`--- -- - b--` --C -- --- -- -V-----  *-a-- - g- @- '- - --   - A-a    .D -- --- ----*')--- ---V '.-.-- b -- - - ' - -- -@- -n+ - ---@-- e-- C--`--Da- -V-- g  - ----- d- --- - --*U-A----E- -T  -U-- -- -  a--- -- --c---V- - TVWTTWUX- ---A - `-- -- - -B-- -V- - -A-'-  -- -- ---*E-a- --T- -- ----g--C-`-- - BQ-- --` @-- )&%@--- -- - a-" J --- -- - -- J--a-- B -W- +- #- - - - -- ---U -  --  - - --- "-= -@--#-"--   Y- "   - 1 -----0-  -- -- -7 --9-Sandstorm Shelter2      x          Josh Lee|T  ) n )  P*  f*%)  -  $ /  * h   R&F  @/   i    /  * -    - - - -  - -  -+ )--   ) #--  *  -- - H    -    --  M# *  !   "  Pd g-g  "-.  --g--  --. ' 0V   !  U @   1  (/ <  8  e -G- v 0 Dig Me OutEWhat do you want? What do you know? Do you get nervous making me go?     Josh Leeb}t!--eP-i%P* 2-2-,P,-----2.%P---,-S--P--H%--2-,---PR-P--&-------,nQ-&-----,P)V-- .-% *--, -V# ----@----V-&--&-----*---' -&---&-%--P)F--^-#*-&---*e&--V---%DF*- $-N-------eP-(--!P--*VV'-e --P2-k- -- ---2--F. - -+-------k"V.-P--'@!+VP.-*--.V ----*/--- ---@Q---- ---V..- --------e+---P RS-.P--*'V)*e@!(--,-1--- -*-#=+H -) &-!-)"-- 4-, $Holiday SpiritsBThe ghosts of the past can still be felt here, green and chilled.(    V           Jeffrey Bardon;~S G$+ 1 1- - - *d - 1 1- -1111..11*1 1- 1'1K+111 1 - -1J 11g1!1 1*- 1  11g&1 1*---1  11 *1 11 1 1! !1$/11f &1 1!"$ n!1 %O 1 1 !1)1O !.1 &M 1 1 11 111 %O$1 1 ! 1 &M. .1 1! !11jjj11 1( 1 1)11#+1 .Le1 11$D111$111 !1 1!1+1hg11 .1 '11 11+1111'1  1 1.1.1 11 1 11111'1 1 K'''1hB+ -c1)11111\1$1(Master Carpenter\This button to the left clones 5 blocks. Collect a blue key before going down the teleport.F  0      VT2X!  F*F   e  - -/ *    V - - * j  g .   . )     V - - J   e  - -    --    * H       - -    n   +  b f  \'\'\'\ +* * * )   + ` * *  \ \  d c D*D  -   ^ UW    i  a       i  U*W  ! *    "       % - * '  UW *  -   *   % ^- + ` *   d        .& L  @   % ( '' (   . N *      !  g @X + ! h   k+a # *d  ! QC1111111111 111' 11)1311]111UWastelands of TaborarThe two bombs in the room below must be removed by the teeth. Be very mindful of your blocks- none can be wasted.<               Jeffrey Bardon m!K!HJ!KKK!JHJ !KKK!HBJJHJ*J!K!!&%& JHg*JHeeJH!II!!I!'' +H''!KKK! !KKK!nJ H%%$G)J H !! H  J H J H @J !III!  JH)g* JH !II!!!!#JH JH!I!HJ!I!on!!!!!!!!!k!!!!e! !!! !! e!!!!!! !!!g! !!!!!!! ! 1! !!i! ! g! !! !!!!!!! !!!!d!!!!!!pFahrenheit Frenzy(                                    Jeffrey Bardon9    e   *   +..' " n . + .++ 0++ .. 'e*'*...     * * *  * *  * * *   +++!''...+"+++ ))) '!!.i'%+""!  . 'f ' ''  ... *  ** * ***  *  * * ** * *  *     !C ''!   @'''  ''/ " B '' '' ++  @CA'!+     +  + + + + +   +      .]/Q"''1%11j 111Rundown RailyardsYou discovered a secret hint! To access another level in World 15, Mental Marvel Maelstrom, use the password KGPS.              J.B. LewisR /  H H  .     $ " */**+*"" """'  " V ".+ ***  .+'.      i  ''. "'( "Z$**..D-. f +.*.-* *+. ...+ ) *** H. 'MJ.!'..* ...  -.  '' -. 'H ** '   !Hih  +' 'E!* k+ H ! H'j   +.  +e.AH + n .  i.) h  i*d)gC+    HH  H  H   H H   H!+ +l1. S.91 ). .+g+!.;++6+ +Q+ +++++++!@Apocalypse WowKThe red button here connects to the block clone machine next to the teeth.             .         Josh Lee    # ### ### ### ### # ##A## #%#  %%  ##Q/# #! #& #  )S##)  %  &  %  # "# ## !n #+ #D%#E#  %H%  # # #### # ### ### ### ### # Q#####M##k##55# ' #M#####)You Break It, You Buy ItoThe ball is sitting on a trap button that must be held down if you want to exit. Collisions are not necessary.     J.B. Lewis)!*ff*de ee dedde de dede d e n   e   g.ed.  g.g d " ddg..ee.g . d" $"ge *  ".. "ded/I1Prism ConcertonHere's a tip: figure out how you'll need to navigate the level after getting the green key before getting it. Jeffrey Bardonm0 (*%+P &hC +/ / %*g *%+h j g/+ %*+HhgD& `+*&j @g/ * +h*%+R *H g+/ [ %*+E&/(j g/+&B h (&*j+/( *g%/E cg %gN`++h gZg  *h%* Z' Mg*gj)&& ( g& gg  h/+* PH)ag/&** E (g )A** )g* Nn / +   * g %j(g* H $' H%  Dj+/%&%& #'  ( *%&%& ++h H%&%&# )( Q+%&%&'/ *(/@D' h &h + g **&Dj +*% +/* &hC +/ %j(++c /&*g (Qj + %*+Hhg* /@Z %* &hH*&R/ Bj +(/%+Sb*%j+/(  + %j+g *&* &*h g+g11$111T11111R++ 1+1W111+_+1a11$++X11 1 1 1F1 11111#Emblazoned AltarPThis teleport immediately leads to fire. There are no fire boots in this level.2         Josh LeexBdZ1'*g  g- - + gg  g%&* g   - *-* *i     -d%  -*  2% ! +(  N   '           .e" -n  "h-e"- -  . - -g *   --  -  &#& -       !  *       g  Y*fii- kik d!i-  0X gc,g+>-i!a- +N/ +vFlotsam and JetsamsYou discovered a secret hint! To access another level in World 15, Mental Marvel Maelstrom, use the password AXVZ.       J.B. Lewis8 $MB' c -"*- i !-`'  ! -   .!-.'d   ..-!*   --./*  -.. * *   --.   *   -.   *)  --f!+!' * *  !+ '    +.'   *   H!   J11 *++'+# d%11. -I %11 #' %%1&111%!  %%%n% ' %%11  %%11$Ie %  %11#eK' J#% 1&1------ %% ! * %%!*E &! *k+  * gg - !j* !h  !#Z )   'H J'  ! $M^Y@1+ 1+Ye:e e &\1|+++81HCrux of the MattergDon't collect boots too early, nor two at once. Dodge both monsters after you go right from this door.x          Andrew MenziesQ)z!!--G-!i -------i!i.iii!  E-.i -ii!i!i*! ---!.i!* ii.!D.ii!i 0i***--i!*!i- -.- ii.i.-" n-----!.- "---@!- -*G**- !--GGF--!!*- i-FDiFG- E--EE---i --F!--.i.!**D-AEiiii-.ek!i!--.i '!i*---i. 'i------!!++i ---!.!------ i !--- --......-)g#!% --!- .-**.!-......-.-!!..*-!-)[G.E.*--*--...-.-..*..i!.&ii!-...* ie,"d1----1 91 1 - #fndMolten Crater $       Jeffrey BardonL!e  - -  - k --.. ! - --f-- -  ---"--- - - ---  --------  -- -g--- - ----e- ---- --    -  --   -  - -------  -   - ---ijn-    - ----!!-- -    ----!h!j!h---- ---- -- ----  * -    --------    --- -  ----   -  ----- ---   -----  - --d -- --------- - - ----- *-----)  -- -  *---g).-q-K!---  Gravelways Markus O. 2 22 2------------D-D-D-D-D-D-D-D-D---- .---D- .$J-D--- '*kj*- ------+---f *- ---D----- -g -D--- -#-+-* -----*. -  ---D-%.. -- - -D--\d-'- --- --- '+ -- ---D-i  -- -D---+'e. ---.)---- .)-- ---D-)---.M-D-- *-+-n---**---) *.%O- ---D- d(---- -D-- Pd.-- -- ---'.. * * * ---*---D--D-------------D-D-D-D-D-D-D-D-D--2222G1G' -, -1-%. - -/--+ -----GdEternal Engine+All brown button connections are vertical.<       H           Jeremy Christman(v!- )R'. +d*R*. *' ''+  D  -* * % '  ( #  &      !  - e L !F  B- '+    -    $$   B0 O  K***  *  !      h  *   '!i   ! * R   !  * **  % i & ' *   R    %*  *   ! * n  / "g #P   ! ! * & -. $ -   '*+ G.0  ( * '-0+    P'*$ -$*  e- $D *M -.*df.)"S7++0+ .:.-.11]1.c+.2.+]. 1H.11+C1dUdassaThere are 9 extra chips.n  0           Joshua BoneN!- -*!e%E i . * .N O J N K %h -*  eN  K$.PH N '+ eP!N-  ---.$i--N-- -- +.('+/  ."V %&   **&%K( K# d.f.)n@@@@@@@@@@@@@@@@bbbbbbbbbbbbbbb!- -*!e%E i . * .N O J N K %h -*  eN  K$.PH N '+ eP!N-  ---.$i--N-- -- +.('+/  ."V %&   **&%K( K# d.f.)M>1  -11(( 1  -11(() Yet Another Perspective0Collect 11 chips before entering the teleport. (      z            VTe"eV'h'  0*-e g+0  $!0a- !' *g--- ++--- *d - **- S)-P-!! ---- !+!O--- !  $fd J d+ '+* M k  +  '' +J' *+ GGG/ +e  !!-'+N*  'i" h '. "--  '&!-  '.  --- @ .J!-L)#"- *.GL""*L0( *00  e( n *"1-w1K %World Revolution=Each of these trap buttons is connected to its closest trap.x        "     Jeffrey BardonB--:----)e)- ! -)! !)-*--kg  f/--)n-)! !)-!-)d)---------------] Crown Jewels8If you don't mind, open these locks to begin the heist. J.B. Lewiss%dd!h%dd !! dd!! % ddh % h. %-K-(-'+ hhh  % !N   ! !    h h  !d   /)  hh% h hhh  !d  %- h)   !! * L*h dd  . %  . !!  dd-  ndd  !!  . % +-hh .!h-++" # d!    %.!h'''d!h .!!d '!.! h% ''   !dh.h!.  -% !!   %.dd k! d%J  ?          # ?d -  (<Lagoon of the Low TideMAll blocks on the right of this hint in this section have water underneath. F       VTx!***!%" "%ne d g,i ii   * **! !% * * ,[,***! , *-.. J +. .g G .++&& .--g..+!&$ .-e .&@ ..e.hH *&&&  'h$ e$d  ' -**""  ' *--- -*  ' .`- -  *.#.k   **  .(.  % .. $&g . @D%%%%& %%&&%&. / )&%%.i Lde&&.N) ig*''*-- N'' ''f-- ++ '' - #+  T !++!11b11nCulmina Crater/Use the bug above wisely - it's your only one!x                   J.B. Lewis , @ ( a +   j  R ) "  M  $ *        k   g     d e  *     / d e 2         &   "  H  #   f  j  %  / % '   #   +   i %     & .      *      ***&    '*+      *** h  /  # ***  n    '*+    ***P  ) T    * & * g i  [  \ &  1 D B1 B.g$/f ..}/!? G Pardon Our DustrThe renovation crew just tossed a bunch of old levels into the junkyard! Can you go and grab the chips from them?     J.B. LewisB'!d *( -i'"!.gL *-* "h+ & H-*)- #d j G h%C) . e!"ike --*#h !' *Idj-E 2. E #!*(O #   ) j(  -i&Y %k -) h * d/'*#g D  nk*!f* -.%h" d`  Rgj-- -! * k-U !e.![ef'! -g# hi i %*gK$B.++'+^+ 1\1Ne#+++Broken ParadisePAll blue walls are real. Be careful what you collect and what paths you follow.2           Josh Leer I!     N       " V     g)       . - *  -)  V )* ...P---    .. $E   * .   ..$J   *  (   D*f  --)V-+)$- -  M*  .  g.  .T .)* +-) .  e'F#-%0  ' + -&%&  n'+ -%&0  -- .&--L/%&' -e )0.-!).#'+d*% .)'  - -& k+* &'.1C1-?-O+v1-+ Lounge ActcThere is a trap under this block. Buttons are connected in reading order. All blue walls are fake.<           Tyler SontagR<2 2" $# ...  k  .MNO    - ---  !  '+'***+  "- - -- - "- %  ' .  -L. &% + . -O. %&#&- ..-N."&%   -.2L2 2 2e*  *** - --- --- --*-      LLL----- - - --- - - - - - - -- --/----- -N - ---------**- + + +--- -N**   ONNNN--g22 2 2-- -.#.(-- - % '+- %  -j  ---%--n MMM- - O O O O-M%-#   g -  -& - -- - --. -%-& -dM--N N - --- --.--L Ld g e   O-**--*  de&2 2$'22222 2#1v I0'''  O-:- -Rf  X Brute ForceOThese blocks are on trap buttons. You might want to have the tanks pointed up.F         Derek Bowserao!g""  *-Q- .. & ."..F G%-.i- "..#- * +   +... -   +.  - '' * -'..d -!!.''., --! . ..- .'.""a !k.' .KI"!--!  ).Jn.b- ..e "!-!----B.+ +f""H-`e+"),)H .J'-!-- +/""c "."- ""S* . gRV" ."* ".  1k... 1 "".". "*  . 11.".." (N!,,&I y++Shadow of the Day&Sometimes solutions aren't so simple.P       $   Josh Leetworld-2.3.0/data/CCLXP2.ccx000066400000000000000000000434241475511570500154130ustar00rootroot00000000000000

Chip McCallahan is now a proud member of Melinda the Mental Marvel's exclusive computer club, the Bit Busters.  It wasn't easy getting there - he had to make his way through the 149 levels of Melinda's clubhouse, dodging pink balls, unlocking doors, and picking up chips.  Some parts were frustrating, but most of the levels were a lot of fun to solve.

After he finally completed all the levels, he went back and found lots of crafty shortcuts and tricks to finish the levels even faster than he had done before.  His total score was now almost as high as Melinda's!  But eventually, while Chip still enjoyed the original levels, he wanted a new and different challenge.

Chip was having lunch one day, when suddenly, Melinda walked into the room.  "Melinda," Chip asked, "Do you have another clubhouse that I can explore?"

"Actually, some of the Bit Busters have been building their own levels.  Their clubhouse is finished now, and I think you might like to try it."

"Really?  I'll... I'll do it!"  Chip was overjoyed.  But little did he know the challenge that awaited him...

]]>
Wow! You made it past the first level that has changed from the original version in CCLP2.

You will recognize such levels either by the change in their name. A level with * appended to it has changed but the way it plays in MS mode may be unaltered. Some of these levels have changed more, and some have changed very littel. Then there are levels with LX appended to the name, which had aspects that only worked in MS, so the version in this set only works in Lynx mode.

This file you are reading now is part of the beta release for the set. It contains some hints to a few levels and how to solve them in Lynx, but these are not yet formatted in a way to be part of a story. Hopefully things like that can still be worked on, as well as proper documentation of what changes have been made to the original CCLP2.

Thanks for trying out this set!

]]>
That was fun, wasn't it?

Some levels have been modified even if they were originally solvable in Lynx. In these cases, the solutions to the originals usually had some crazy element to them that clearly was not anticipated by the designer, despite which the level happened to work in Lynx. For these levels an alternative is provided, but for the score boards you are free to use whichever version you prefer. This should not make a large difference, as the level you just played has probably the largest changes made to it. The best possible time should still remain the same, but it is much easier to score in this altered version.

]]>
This next level is the first one so far in the set where it was impossible to keep the MS playing experience intact. You will recognize these levels from:

1) LX is appended to the name.

2) None of the monsters move in MS.

3) None of the blocks move in MS.

4) The password has been reversed.

5) If the hint was blank, it now is not.

6) And of course, you won't be able to solve in in MS.

]]>
Dear Chip,

As you know, some levels you encounter are inherently obfuscating. Not much can be done to that types of challenges, except maybe look at a map or ask for help. Would you resort to that?

Absolvingly,
Melinda

P.S. May Apes Eat Radish?

]]>
Dear Chip,

You might notice that in MS traps work a bit differently and you might have to think a bit more carefully when approaching the same problem in Lynx.

Securely,
Melinda

]]>
Though it was stated that these modified levels tried to keep the MS play experience intact, it is clear from levels such as the previous one that this was not always easily possible. More specifically, it was not always possible to make the level playable in Lynx and keep the best possible solution time in MS the same. This of course is not the only way to judge how well a level converts to Lynx, but it is one of the few clear standards that can be used. In the end, some of the modified levels that are still solvable in MS have a slightly slower solution. As this distinction is not that important, they are not identified in any additional way on the surface.

]]>
You've made it this far, congratulations!

If you are familiar with how this next level plays in MS, you are in for a little surprise this time in Lynx! The gliders do not die in the fire, and you will easily be swarmed by them. However, there is a trick you can use to block of the stream of monsters. And if you then run out of monsters to blow up the bombs, you can even re-open the stream using block slapping, if you closed it in the right place.

Good luck!

]]>
Dear Chip,

On your journey it might sometimes seem like you might need a hint to advance, but on some of these occasions giving one would spoil the fun.

Unhelpfully,
Melinda

]]>
Well done!!

Thanks also to all who made this set possible. We still hope to provide a more complete package in the near future. Any feedback is also very welcome.

Keep chipping!

]]>
This next level is a tough one in any rule set.

There is a block on a force floor that may move in a different direction each time you start the level. Any of these are solvable, but it might be easiest for you to concentrate on just one of them if possible.

To also avoid some frustration with the teeth towards the end take note. Once you press the clone button, move two tiles and wait for the teeth to move up next to you. Then run! If you run straight away, there is a very good chance it will get you.

]]>
tworld-2.3.0/data/CCLXP2.dat000066400000000000000000003246111475511570500154060ustar00rootroot00000000000000h$q!&%%&%n%(&&(%&(%N"NL"NNLM%O&MM%M&M%%&&%%(&%(%&(%&NNNLL"NOM&O%O&&%%%%(&&(&%(%LLNNNLO%O&MO&M%O%%&&%%&(&%(%&(&%NLNL"LNO&M%M%M&O&M%%%&&&&(&%(%(%L"LN LLM&O&O%M%O&%#&&%&%&(%%(&%(&%NNLNN""LO%M%M&O%O&O%#&%%&%&%%&%&%%%&&%&&%%&%%& &&#&&%&%%EA Fleeting Memory                 +,X' ---g-- - @-n-@ - - -d- --  -- -- g--f -- --  ee RP  ih  Q--Se"-""" N.Naomi's Bug Collection     e**i *  * n -H-g--d---]-H - - h ""      f                    Bea's Den  )             )). ! n         "! Kikh Force WorldD  (          "   n *****   ***  **  ***       M%    &R ,2# Suction Ride 8! "%&%&%&%&%n&&)  O  )(-  DGGGGGGGGG F D   F D   F D #   D  D O  D  D    D  EEE !XFixing the Toggle Switch 4                  g,<4!""h""        n  ! Slightly MadB^/    )          l              )      $    1Z Use the Fish8Translate anything initially not ice or water from SGA.2 #      n   "k           Maze of One Way/ @ *  " *  n( ""/Q% M #(AWho Needs a Flipper?Chips may be under blocks.   A     l  B ) @      C`")&Deconstruction0   X! g     n 0d  f  e  "! Mazed In? h$ K K      & "nK K %K           #I + Dz 'The Serial Port    ]n/ K( OkM OjdM OMM OMeM O O.fM" Oi  gMhOfThe Parallel Port *SLevels with an * or LX in their name have been tweaked from the original versions. "      I@  "@ -iDn D DD D DP- D D PDP  D PDPDP  PDPDPDP PDPDPDPDP  PDPDPDP  R PDPDP  R R PDPR R RP-R RR%U!! Debug File *7This level has been tweaked from its original version.                              L^"          "          l            >7,3Paw-Print Isle,6" "-#- QQQR QQPSS .....  -))-   -))- b $-))- HSn $-))- @ -))-   -))- ..... %% FEE GG   GGGD PP -#- #T'+dg11Double Trouble *7This level has been tweaked from its original version.     ,  r^ B"n -  --  - - - -------- -----   -------  -----  -------  --   ---                   ---              ---  --  ---   -      -  ---  "A ElementalA%JJJJJJJJJ%a"%b-%-`% HHHHHHHHHH% +'---+'n-V+'--e+'+'`Q$%+'- H--- Q Q Q Q Q -c Q Q Q Q Q- I--RQ ---hX- - -SPV - $G-  '-JJJJ -$G--eC2--"dd-"$fA-HHHH"#N-*/1+51 ++++++++++ + 1_1=A Sample of Things to Come *7This level has been tweaked from its original version.F         r           ,8           2   CC   R^R   22  n- ^Vj^ h" -  - - RR - - C^C - - 2 - -  - -  - -   oRanger Denmark *7This level has been tweaked from its original version.      ,6-")--"-)e--`-- ------$--)e-     ----D-      -           $$$--     PPP-)e-$E-P-JJJJJ-%%%%%Rn$-B-$-)g-$--$$$$$-&&&&& ---#- -"-- &-I("&$&$&$&$&$&-" &-Od"-gM"-Od"-fM"-Og"-""9*~111111111?1dd1Block Away! *7This level has been tweaked from its original version.                       HZZ" f  D D D   D    D D  D    D   D D  D    k  knk k D   D D  D D D   D  D  D D D   D     _  !  #   H!5 "   $    " N How Goes? *7This level has been tweaked from its original version.s^ei` --'''''   +   #- "n D    'S$*  %G  TDF  DD--DE  2+$1 Traps I *7This level has been tweaked from its original version.Z         (    @^=, NJn/)LL      deg    M  +'  M(  -   -  -  -  \-  """   ""  """  ---  f  )     i/1111sBSudden Death * Remember...    ^3L#"/  l T $rRace for the ChipsPDon't collect any computer chips unless you are way ahead of the teeth monster. z - -oiSREEE -h D -R  -P- -RD -P  -QQ D --EEE -- ------ -!!-  - -   -- "  - P-   -P -   - -  -S  -P    -S   -- -  -  - -  --V"%  !DG!C Work Fast * ,          5, en                                                           "      +RFrozen Floors *7This level has been tweaked from its original version., $ $. -. - - - - )- - n- ` - - - - - - - "- - ""* ` ` - "**)  - ""*  - "-  - - ` - -- ` - -C--- - -B--- - -@-- - -B- ' - --@- ---B--- -B - -CB- -@A- -B-AB- --- -B- -  ..$ $/++>++1n Madness I LX`The blocks below are on traps and moving against each other. Be careful how you deal with them!(     v$ !            $EE$ ""D  ""D  F""  F"" $GG$      n    h i!1B11B1DFire and Water      4^@!)C' $U k  ")$ Iee`IB@)  $ee-ihO'@$- /j c')- n)DKKI(!+Z111 +x+=1+++ Chase Race *JThere are very few safe spots here for Chip to stop at. Keep on running!            )nQ RP)   Q  P  hP !R RQQQQS$QQ \   \    \              (    # ON !h   "                % !B>8g)$"1>bWell of Wishes >              H ,!    TT  T)   ")    o)     $/            T      )           T             T    ) )     T  T T                     )     ) T               T *)*               T    1R Tele-PortionBlock sure is useful.    !W       '   J     K&(&        +e")       ,  ) g    OO   O    O    OI    OI      O    OI    O #     l!HThe Big Button Quest   D"0!n / ''''fd''''++++..''++++''..''ge''+.)) +*.  . ++++    ++++$#  (*'%M*+"M'Lk++++++++++++++++++++o+1L Cypher II LXtDear Chip, In some ways this will be the most important level for you. So, cypher, Chip, cypher! Secretly, Melinda.           #IQ Q  #R"/"" "/""/" n.""g""@ Phd" "/"/".. /"""" %R]A -P    (IH  *.  K%**  IK   O  . M                  e   LMirrorCan you recognise me???     $[J                )       )        " h)  l )   Spy%(c% #-P-NNNN l LLLL  "N ""  NN -   LLL-- $-)))))))P!1>nThe Mystery of the Seven Chips :                   &~1 G1TGG1GG 1111111 D 1 1g11 DDD1 PP11 #%hi%U1 D1 lRR1D 1 !!11111111111-1S111b-111-11111-b1-11GGG1b-b1-11-b1 K11-11b-b111--f1 11-11 11--- 111111111111T1S T Mads' Rush I <                 ', ! h222"&%%%& .,,."&%%& !%  &  VV% #K  V& K V % K  & K V % K  V& K V &  K  V% K ho  & K  % K &--% %% &%&%#######&% F&#% &%&#%&######/%! NcYike-o-Matic *!What you need is "Sphere-y Hot"! &         (,'''''     '' n ''+"++++D++++r Traps IIZ             K)>!   V  -   V    T   -  VT  -   V    T   -  VT  - n  V    T   -  VT  -   V    T   -  VT  -   V    T""   -"!/Ladder Needs a Wash Exit corner.                                                      *^%$$$Df%d&g%g&g*M*Q*A'----DD D#+ nMId111+^Hmmm!NOT! You're far from done!    +2!                       "   N n $       #      I         T  D        $         )                P )          $ K $ %  $        (          !/Q1 _ !  h1O E 0111=T Ray of LightRun(     ,      j k  "   i "        "     "     z  h  n  SFun House Rink *7This level has been tweaked from its original version.-  -KJKJJ  -H- KKn/"-iBreaking the Rules *7You'll have to break the baseball rules in this level!     ._! ,-  F  $i     , ,,,  ,,,,$.,,,E,,,,,,,,,,-          H                '                '             `TT TT   #  k*%SM T+P/(" l!n11+ Hurry Up, Chip!4Run faster then ever to get through this one alive.    C/^ gg gg  --gg D\\gg gg -gg ))gg --KKi n  e Dk DH)H )-- --/-D F)."VV   V". V  d Q \gP\^Rg^  S    !h- M    :q Tele-Rooms *There is one exit. D             0q#G$$$$$ $%i*G$$ $$$L$G$$$ $$$G$$$$ n$$$/$$$$$$$$$$$$$$ $ $ $     $ $1 $ $QAnd Then There Were... Four? *Who is the Fourth?   1<Sc    "" ""   n                                        ) )   . Just a Minute!!]2X !l I    0U0 h-QQ )!P , SS-)  j!  )     (K)  O    ! "hD fj             g h    k#  h W  !  ijekd% h!!*h- Smorgasbord    3 n                       "                                 ,The Lake in Winter4]          n     P Oracle I5K!H#&nH+/#(L&  # %I H #%I - %I '- (%I  %I (%I %I%I(%I+"(Security Breach *jNow that you're in, collect the security cards and go on the next room. Don't set of the security system.        6^> GFQQ   &HDE0 A--Y    $   HI i  defg  n i.k 0 X -V !-!# GN!R deFHDf%DgEO   (I( UM  ".   4. '1WC8" Killer Rooms *7This level has been tweaked from its original version.   F      72' SY FPQV   $ i $" $ $$ $PSDDT F QDD[ % -l +       V$  $     V$  $       V$  #     V$   $       V$  $       V$  $'d*X 1 a11  11 11;11;11;11;11;11IDangers of Fire and Beasts *7This level has been tweaked from its original version.                     85c `@;     E-b ":  C " ""-$) ""- V"-  - `- -- )-V - V   ) -V  -  -V  V---n-@  -VH  -HP ---)-  J Re'  +-' -  V' d ++?1Planet of the Teeth  X   H9,<--!!!$-  D-  D-   -j DD&k  DDD   DD )     ) h  i        n$#     -!!! -   )  e$PP1D 11| Quad-Boot *7This level has been tweaked from its original version.      :V!n%.##.&%%%%%.#&.#&.#&%&..%&%%%&&.&%.&%.&%&%&&%&%&%%%&&%&%&&&%&%&%%&&%&%%%&%&&&%&&&%&&%&%&%%%&%&%%%&%&%%%&%%%&&%&%&%&&&%&%%%%&%&%&&&%&&.&%&%&%&%&%&%&%&%%%&&&%&%&%&&&%&%&%&%&%&&&&&%&%&%%%&%&%&%&%&%&&&%&%&%&&&%&%&%&%&%&&&%&%&%&%&%&%&%&&&%&&&%&%&%&&&%&%&%&%&%%%&&&&%&%&%%%&%&%&%&%%%&%&&&&&.&&%&%&%&%&&&%&%%&&&&&&%%.%&%&%%%&%&&%&&&&&&% &%.&&%&%%&%&&&%&%.%%%.&%&%&&%&%&&&&&%&%%&&&%&%&%%&%&%&&&%&%%&%&%&%&%&%&&&%&%&%&%&%.%%%&%&&&%.&%&% &%&%&&&&&%%&%&%%&%%%&&%&%&%.#%&&&%&&&%%&%&%%.%%%.%.%.%&%&&%&%.&&&&&&%&%&&&%%&%&&&&&%.&%&&%&%&&%&&&&&&%&%&&&%%&%&&&&&&&&%&%&%&&%&%&%.%%%&%&%&.%.&&%%&% &%&%.#.#"!/8Reversi%Restart if you end up in a dead end.;? "_2 22 T   -T  'KJ - KJ -T-WSS$''2)2)2 --U- 2)2)2)2'- V-- V)2)2)2) ---2)2m2)2V -W--')2)2)2) ---2)2)2)2'- -W- V2)2)2 --W- T-- ' - V- - je d g-    -k i-  fc-.[ --.--...g-----Y..-Y-...-------..-- - ... ---..------...----..-Y---... -........h----(!2 1+:` zLot of Danger *7This level has been tweaked from its original version.  .        <Vi  j"      e      d k--" """f"J g"$Gn 1&Internal Clock =}  """%%% "" & & && """%%% % % %   & &   % % %    % % % &  && && &% %%  % % &  % % & %%  && &% %%   % & &    &&% &  %%  &% %% %%     % & && & %    %% %% %#&  %%  & %&&    & & %   %% %& &&  %% & % %  & % %  %% %& && &&  & % % %    % % %   & &   % % %  %%% && & & m %%%  M Icy Moat *7This level has been tweaked from its original version._>)   -   J H  h    H   I         JJ  l  -                      )                             2                       2   +i!***********************       *       *       "       *       ************************(M*#****#**=fChips on the Blocks *7This level has been tweaked from its original version. X?  $I  ] V VVVVVVVnV"fV#212Jungle      @2 d-dGRGRFQFQggRGRGQFQF-----e---e-GRcBbAFQ-"--"n--RGFSERQFDSPcADEP----SDCDPaPE-e--e----DSDSEPEPggSDSDPEPEddf0 Loop Holes *7This level has been tweaked from its original version.              Adzl   a             a #            a               a             %  ) Vg d    g    e             h H * H  *          T   )        f-   e-  .-   -   T- *   "-   2Beware of the Teeth!  OBO"-"     c# #(% %% % V% %V % %( % % L-B l @-N % % (% % V% %V % %% %(# #a     "-"M0j:Hobgoblins and Chimera  4C!%R##DOd(D**.--   #i%T%V%W%   -                                         l"" g       "  *   "   k!3/The One Sensible Chip     nD^~%%% %%%%D-%%%%%%%%%%%%%%II%%%JkHJhHKK  - $n%J+' F) # * @#D#     ) g'" I$$I  --I  --&%&%&-P&%&%&%&-$I$%&%&%&%-&%&%&%&-$R%&%&%&%-&%&%&%&-&%&%&--XGbH /:1ji,1.eR1+?1V1Madness II LX:Levels with LX in their name are not solvable in MS mode.  0 E,!"..."++."...+."+... .". .". .".."..+..".+."...".."."+ ".. ."+ +". ."..".+".."..+."....+"....".+".."."..."..."....."n........"!So Many Chips!F,o --   --       --         --               --                 --                      --           QP-            -RS           --                      --                 --                --         --       --   -- "!-\Killer Spiral *7This level has been tweaked from its original version. G<+o%1 11111++111111i1111f111* *111K1E111* *1111111* *111#1W-#111* *11QQ11%-h1111* 1iQQ1#1-1111H1j111&-1111(1#1-1111(111111H(O(((11111(1 1 111 1111331111111311122111133311221111#1"11!2%111-H122111 11g112#111 111111%111&11%11T1111X(lMads' Rush II *7This level has been tweaked from its original version.   HHv!ndge                            edg                           ged       ""  "k , , k***,,,,**,,"**e*d*g**,,,, ***,,, ***,,,, **,,,,"**g**e*d* ,,,,**,,***,,,***,,"**d*g***e** ,,*, **,,, ***, ,,***,,khhhi?iipSCheckerboard I *7This level has been tweaked from its original version.ICBBBBBe @@@@@@B@ @ C  @B@B --@ #CCBI C@B --B@ -@@@@B  !@ @g@@!BA%nj"  Bumble Boy *7This level has been tweaked from its original version. P               J,\V\VO\VODD \DD VV W-DD\VV -A \VV i-[ VV -!-[ VV W--  RRR- -  IRRR---h IM-- I \-- I Md$$$n# IO\---  Occc@@@-)-  LL\ccc@@@--- I jO-!VRVNNN Mfeg   O*   J*   JM k O)      *"""*       *&% L*& *  ' L(LL K$ ' ' *   T1M++! 4111(+**'*+****i****+ ,dChip Search *7This level has been tweaked from its original version.(                               K,!........     """"""" nCCCC g...d. . ..... .CAC " "."  C. ... C. . ." ". . .CCC ..... .CACC f" "e.. .. . """""". . ...... !^5 BuggyWall       7L,}  i       "n)@@  @  ) $$$  D    h.  $  " "P "Q ) 0+ +G+q++1o111PA| Fire Bugs *7This level has been tweaked from its original version.     dM,)iEdg2 -Jn22 IB222  2IH.2 2 2/2d2 -  ]-Qe-]--   ]J      he"   I    I   K$I    I    ) *** k** **** **   1z| Madd Maze *;Beware: This is both mad AND a maze. You have been WARNED!      N^&nV,, ,D,!  ),D,.) ,D,. ,D,. ,D,. @)-..h--S-- .@i)..-,,,-  ) -P,,R-   -,,,-  --Q-- ) -"     Q'c   HH-- + +NM("  + --" " " " "     Q$   .S A+1**'**j**-+]1ZfeThe Search for the Exit *7This level has been tweaked from its original version.  (    tOxE   ))JJJJ#Q n ) ))JHHh   I K'L'(***  KM''*$* I '']'X*)* K K+'^'V*** I '($  G# "# ) %  i G  X /j+++<++8+!++!++1Cra-zy                J                   P y/g-Jgg   d e      K   -eg-   I      e e   leddH"-d/ZFrost Swirl *7This level has been tweaked from its original version. YQ                                   $S  * )              k               n  # W%&%&%&%&% $  )       h1 1fJust Enough *7This level has been tweaked from its original version.  R,3n%%%%%%% PP %HP--P-)--)---Jcc$$ Paa$P $--$-)--)-$--$*-"-$$$$$$$V"-("-*O*O*O*O*O*O*O"-"-"-")-"#21@120000000*1*1*1*1*1*1*1iThe Block Stops Here LX'This level is not solvable in MS mode.p     SX#   )              ) *n    Warehouse IuT(H eH)H H0 H)-X0 h  0) .. ! " .n)i.....-....) @/   ...d     .... g    ...     !*aCrypts of Aganorak-Choose the right block after the chip socket U^s!o...     .. ".. ..   .  .    ... .   .   .. ..  .. .   . .  . ..   . . .    . ..   .                                                                                        !b Follow the Glacier Brick Road *7This level has been tweaked from its original version.V^ L -Z( (&# !-k$!  `$!-T e )   -!           -DIj    g ) (M-$O$- )RPIh--i)) !I d -K0-J+Jf !J!J@'n) * 1[1~D1"1.-Creative One-Ways *7This level has been tweaked from its original version.           W2T1Zd$ " dZdddddddddddddddddddd ddd dddYYnddddd/ddd ddd d$d A1d1dddThe Walker Machine LXQBreak open the walls, and grab the chips hidden inside. Watch out for walkers!!! LX p I$II$III$I$I$II ")) JK   !))K  !)i I!)!) )..)h)! )K I      ) K  I!h!!))).K  I ) //)/l!<%$$$ $$@111<1b111111Don't Get LostDon't get lost!P     _Y -VT--T)HTHTHT" #   )%Q@@l- @@ @@ de , - Z"+ H - H ,!h IH ,g    T YH if ,,,  ,g,   ,   F'   FH  -     W  --Z*cThe Ghetto Defender  8        jZ d ) i      )n               )       )   C   CC!  CC f    e    ba  bK ) b"-  b  caj      ) ) jGMarjolaine's Maze *S[Bk n  d hj% )ig "gfhi-%QQK(R)Pe$MdRP  !#e( Tutti-Frutti  \&w3    !  @ B          - \\2 @ - \\\  - \h\    - \\\     -- \\      A   .   .    V . V l .        .    V . V      .     .        "  Nk~Abandoned Mines *7This level has been tweaked from its original version. (        M]QJ    I   J I I    HHHH HK     $  H edfg   H 0 I  I.... %*" . I....    edfg  I J J,, +0I *   H    K J  .,   IK    nHI K   H 00F hk1 1&df0Dgegc*'h 1$1@ Exit Chip *7This level has been tweaked from its original version.   :         `^?"J +'+'+'+'+'+'+'#$&-%&&%%&%%&%%&%%&%%&%%&%%%-&%%-&%%&&%&&%&&%&&%&&%&&%&&&-%&-#%-&%&%%&%%&%%&%%&%%&%%&%%%-&%$&-%&K######%-&% #%-&%"*%&-%# &-%&%&-% %-&%&%-& %-&%%&-%%%%#&-%&*%&-%#%%%%%-&%&%-&%%%%-&%%&-%%%%%&-%&*%&-%%%%#%-&%&%-&#%%%%%-&%%&-%%%%&-%&*%&-% %-&%&%-&n #%-&%"%&-%# *%&-%######I&%-&$%&-%%%&%%&%%&%%&%%&%%&%%&*%&-%#-&%-&&&%&&%&&%&&%&&%&&%&&%%&-%*%&-%%%&%%&%%&%%&%%&%%&%%&&%-&$#G$G$G$G$G$G$G$ H",1111111111 1Checkerboard II LX'This level is not solvable in MS mode.F   X   C_^"K K K K--- K** K) KU K'lHBX"@K-K---D@K)B---@-K K @---K--+BHI--&QLearn  4     `Ai S S S *Q Q Q R*P P ***  R  Q Q  RQP R RSP P P  R Q    S P R  RQP **  RSP**P PR S S** ** ***   **"l*****/****    $QQy/        >         Q1Glider and FireUse them carefully! D             ta  n * .*- * .* -* .***[_ **** .***-" **_** .**** f*)* .*** _ *e .**[_**--h **e#( ***) -- *  **D*e**.e%**$*.g-M***-) ****d*** *@ 1D6Roller Coaster    ?bxnh#i11%11 d11 *11d11 1g *1Tj111 11* *11 111#111111%%% 1111111333331111g1111333331e111%1113333111#13333333 11##13333331RQQ11113333333331-11333333331--e---1113333331R---f--P1113 331-113 31-1!!1 31SSP1!!11%1!!1# 1112211111%%1( M11122111111T1 211T1JJJ1J11122111T1i12#111T "111"11 11"1%11111 "#%11&111 1111111 111 (r ^qLoop *7This level has been tweaked from its original version. &     {ct n.)    .....d...  . ............ ... , .., ..., ., , g ") . . .. e.. f....VOne-Block Sokoban *7This level has been tweaked from its original version.d?--FF-----E- --------- -G----E- ---------------E--G------------- -G---E- -------------o-E- "iDDDD----n-Torch      e!",#%AJJJ""-H$e'+     dH\\     H \  H ^^  H   l- ^ H,   b, ,  H   V  h    H          i!1_Hard As Rock *7This level has been tweaked from its original version.  &    fA   "    % IG%  )JG%  %   JIG%   G%                         J     J ** L    #    d * l *(      J    J      $      $   ) $.   C   . R*C -.JC J JJg  #1Tf*i1<1\ Chip's Fight     *      g' ) %% +H RQ % ,  +g,,+ fdSP )+"G$E%F- e((In_h   LMHM+O      .  2 222  H*2  %*2#222.  ***i2222 1'Island Hopping *7This level has been tweaked from its original version.2        hBP3d(LN  # (  & ( && L &&& ( && & % J& % & &&&% %&%O %&% #%o&....'.&/+&W U"'%#&&& U  %. . %W .. U e%  W U  .  g .W .. .. U   W .. U  . U  U  . W ..  W .. U U  .. ..  W   W .. U   ( U   W # !B^++++:+ +++4+++.++ ++fi Pyramid *"You need to hit one button twice.        i;, i-- SPD )-))   & !N$# %******n**(+Ip1HRYet Another Puzzle LX'This level is not solvable in MS mode.j^j    Q-%  %   %   %    S      l  "# - < Bounce LX'This level is not solvable in MS mode.ky * * * * *   *   **   * * *   *   *  *  *   *     * *  *      *   ** * * * *      * **  *** ** **) * l) *  Joyride I!lBR  GF  .  n.. )I.. .+e IDE d   -I e -K)     '         (  i+f    "      SLLLL    -     .          '         .Ts^g- : 2n*'(V?} Tricks *7This level has been tweaked from its original version.    VmX%L)G'+$$+'ELG'+$$+'ENN ,%** PP++,  + % %% + #**  **( +   + $**   **$ + ,  + * + ,P+ + ,1+  $ k$'    ,  ,ggggggg,F,$n) 311111+1\11fj1+ Blocked Trap LX'This level is not solvable in MS mode.2x  np/) Kn))   I  )I)    IIK))H))       "!(-------.It's a Kind of Magic      oe1 K$I$ I \11( K0 1  _"(L.   1..011(1%'G*1L.1V% 1..11$1L1.1 [ 1 UW 1 1 En1e #S G0V11J11 "11 1]IIII 11 1111V11H 1i1 1 Cg1 111 V11@11c 0111a 11h V11D11 V1 U 11P1V)1)DVUb1BVN[3)$$$MA1+ 11 1$-11!1 1111 11111111 111*161191111111111hMonster Factory *7This level has been tweaked from its original version.        bp,!n        h         V!/V !/ *. )!)"} {hAfter the Rainstorm LXFUm, you can't go this way. It looks like your house has been flooded.q<!%&%YY&%&%XX&%&%&%&YY XXQ % &%#%&%&RD&%%&& )&%&%# l #%&&% D&%&%&P&%%&#&% % SXX [[%&%&&%&XX&%&%[[%&%)""!EOorto Geld II ,          rdr                                  """    ""   """                       l)  Joyride IIsv!RnRR ...... ......  .QQQ..PPP. ..RRR....SSS.. .QQQ./.PPP. ..RRR....SSS.. .QQQ..PPP.  ...... ...... SSS"EtCounter Clockwise Worried yet? H           t LVVW UW    UW  (  UW   UW    UW    UW    UW  U    n  &J'+N%MJ'&+%J'M&+J'%+&J'+%OJ'&+%J'O&L+ J %  "  W    UW    UW  UW    UW    UW    UW   #  UW UTTTurn Turn Turn LX'This level is not solvable in MS mode.F  u> h!di!gi!! j    e !  ! !  ! i !! !!! 2 h!n!  !!!   !!!!    j ! ! i       ! ! kh h       " *- CircleMazeDon't waste your keys.v  N i O h    MN  ONk .V L .. LL"   M  # &O M&&j&MO  * !+   MLOL /  . n  (I(')gh "  ""  ""  " .  %V......  %%!.   %V......  -%%.. %V.j...-I%%...F%V .....D!#-%%) .....%V* *.......EI%%i7efHigh SecuritynI filled this level with monsters, spys and traps to guard my chips. Look out for items under blocks. Melinda  <    Fw^K 0 !!V "   .    .   'g *V    V    f) k     *(  V*n*%VM,, M  *,V,   gd",,  k),,)  V2 ,,,2,j,V,2,V,O  ),,2, !,, 2i /,,, V   *     *+#IK#T#+ +-+sTeeth *4When brushing teeth, use three up-and-down motions.       x^0      " """.""" ".n." ""."" .". ".."".." .". ""."" ".." """.""" "     """""""" . "".." ) ".))." ) "..")" . """""""" l)AFrost Rings LX'This level is not solvable in MS mode.=y,iG   jk)  !  $*   ! h          D  n) !  %0          ###     !  !                 1 ! Flame Boy 8zl          ...n            '''   '                                                  +           +           +           +           +           +         +'        +         +'        + ''        +          +              +               +              +      'O Warehouse IIe{ )!n * j * $ *                                    ***                                   *  *" *  *" *  *"!1b BlockSlide|T7 i  -  ` `&) )&  aa `b   --  b````````  `  ``        `-c   b -c-!   --/   b--c   `  ` b    i   b``   `ee   bbee    heee`   b!)ee   j een   `e    a -ea- -       `   -   `   ` )! j      `     k`-+#`se~  Paramecia *%Keep your pets in view at all times. X             }, *$K- @kU**)D(F- *Kg* --@-$ e $ -*nh/!.MC* F*!*---@* """ ---B ")" ----A* $""" * ! k*   f  E ***   B** d ** * *$ * #   % HA?114111Blocks 'n Bombs *3Be careful of your blocks, they can't be replaced.(      ~0 %  x    $$ JH$$   $$J  $   nEE   EE j G  G    E E    G  G  !   E                  /O $11711H11611C1lDodge!H                &%#nH--   5b `   5--- - - 5- 5 -Q V  5RP - f --S -S PRgQe/$ex\Escape from Chipkatraz *Don't let the guards see you.      !         #"" "h---  --  -  -  -    -- -S&nK$- !51&Fantasy Island (X ,, d, \, , \H,  , \Hf, , $, \H,,j,k,,, ,\ H,, , , ,\ H, , , ,\, , ,  ,\,, , , ,,\\\ig, ,,  , ,\\\ , ,, J , ,\\\ ,,,,,, ,,,,\\O ,, ,,\\\,,, ,,, ,,G, ,,%, ,,,n, , ,&%",(hE%+*# O-PH$'ed#% -&- ----KeHb 1b1bMiscellaneous                               31.. . ....       -".n.. ..  .  .... 22Oi EFrozen Birdbath LX'This level is not solvable in MS mode.(,@ JTG%&*n@TD$Tb /T-TFT TbK\#\#\#\#T TF/T@b F [@ [@b [ [F Y [b [ /@F @bF/ O@b M$E M "$e("ekdjfgi G G1Y1`""*S Time Bomb LX!You are standing on a hint tile.,)'''''''QQ)RRRRRRR1        h                                nl10000000 )''''''' )( +++++++(/ Captured LXCOh no! Chip has been taken to a prison camp island. Can he escape?F   M!     % % % % %&       % % " %     % % % "    &% % % %  -  % % %  n   % % %  ...  % % %    .. -  % % %  .  % % %    . $  % % %   ..  % % %     &% % %    -    CC  ---  @  -  gB ---   g-     g--   --@ *     -- B *   AA*   - -        I - *     K  - # e c   I -     K  -     I -    K  -  - `  -  d - !]f1H(-9{ Block Maze *7This level has been tweaked from its original version.  H'#!&%%%&%&&&% j&%&%&%&%&% .%%&%%.&&%&&.!.  &&%%&%%&&%  &&%&&%%&%%! .... . V$U!2+ i!j '  $$.\.!!!!.+D+'+.!   k!h' W$T !+H!H.....C%&  B$f!'  ,,,"..@n .  .,@2. ` ` ,,,AL-g$ ,..... . ... 2. .......(NNV---Vg--V--.-VVV-.ggg..D--V--L#LLV---VB111N',11 q+/=+N1%(^ Microcosm *;The middle square can be thought of as a map, if you want.2       (     4              !           *          V ( N j  '   '     ge/     - B   &#%   -    S* dled        $+k...- "eeeW....$EEeee. ddeee...T. dd... .T. i .   !s1F*** ** ** ** **? **+ * ** ** ******r1 Zartacla;One path to doom, two to openings, and three to salvation.    XE!&%%%%&&%&&#%&% &&%#% &&#&%%&%%&&%&%%&&%%%#&%%&%%%&%%&%%#%%%#&%&&%#$n&%%&#&&&&&&&%&#%f%%&&%&&#&%%#& %%# #"%&%&&&""&%%&%&%%"!1 Switch Hit(4dgeeeJLgMO% ) &gLdN)MO eidgd(N-ed)NLgdegMOeK%-)OM gde#6.). f.))-  Dl"#vIron Mysticus *7This level has been tweaked from its original version. "      YX!N---dedNeLLd-O------"-dNNLggg-eeM-OOd-g( eNdegM-ggO Odfle -(Odeed!5 Patrolled       T,--"".....    ..   ... ...   . .. .. .    .-".    ."-      n         T  -".    ."-.    . .. .. .   ... ...   ..    .....""--,)L//L? Frostbite LX'This level is not solvable in MS mode.X2$+2.2%2&!&22%222M#%2222222M#i22222222222222222M#22222222222222%22M#22&22222O 22222222O2222222222O 2&22/O VVVVV"-W----,g----- ---,,-------,,-------,,  --O#I '---  K    )  ) f *#ggO)&*HHg)&*#g(g #,,)&& %* N)&&2 %I#g,, ,)&&C %I#L)&& %#,#,, ,)&& %M#g#Og,)&& %#,, ,)&& %I#L)&& %#I,,,#,,)&& %)&& %,)&& % ,.e )&& %n31ek3<-^#3dKeep Trying *Wow! You made it this far?!   <      !$n                  %  &** **************** *# * 1- Oracle II:X  &VV.$.#.  &$    &     &   & V    . &!$ #  & $ .  & '  & '  &    & '    V*  ,,  , %! ,,, T V,,,! %,  ,,,,V ,* ,'  ,'W&   ,'W&  ,,W&  W& . W& # + !W& .     + W&   +W&    "W&   W&  .#.nW& 1k?.+*h*E*?*\+%1MM1+Q * i0**j  *Chomper Romp *7This level has been tweaked from its original version.<       J   y#i jdddd  H#HHHH  -  -VVV-d -VV-j" d -VVV-.eh -' n.  Z  . j ) Hj *dIc *  *$d d**%&d*hd%&+ '*d*Ujd% $ )M&%&.N&d&L%ddd%.. \O&d&B d @\&%& .\\\\ (\!c1N+17Trapped      R Xoa!       / /)  "Gn            / /  T!!!) k+...'.K . J...$$$ ...)P K.*#...*...*...*H..*.H*..**..**..**...*K*!B+++++++3+++++++#1+++++++3+++i+++3+++++++3+++++++3+++++++ &+Z Wormwood *fSymbolically, what kind of armor do you want to use a block as? Think of them as old-fashioned nails.   u!) AA c B) CCccn`b `b B@a`a  AC b@ `a b @BAA B` CCCcb @ ` B aa --k--VVV- h iV- ---$-EE --M'[-_%''%] $**"+-HH----**"+-M_%''%]$**"+( ( #'$[GG-$!101\1"1 1]# Gauntlet *7This level has been tweaked from its original version.<      ( l                  '(I(NNN j R  I --+n  -  LLLLH J0k* R-   I"  V-- -- -GGGGHHHH--h--JJJJJJVI+# '-$FFFFF-%IJ J J J V%&%I  %&%&IQ &%&%I - %&%&' &%&-K*** EEEE/-     $* $*     -!(m#1[*2ic+1` Run-a-MuckYou are almost done!   d                    p% *f(*Q* * $*$*'**+ g*   '''+e*+*+**** *  ' * '+E  *+  *&L **n*e"#*/&-* %$PP $  * '*e'+*** ++****'* +1v%111pCloner's Maze *MNo fast maneuvers or split-second timing required here! Just use your brain.Z             X!nGG$     eL Ng %&"   M  M  O  O M    M HHO O*** ++++P$''''$P (#!(111qNeptune(       X&" %%#%%JH%%%%%"%%%&%&""&&"&&&&&%&%#JH%g&)   -AA B@ ^e  -B@fCC **-  ***'+'+  ***g***$I *****d  ****I$  *** ***  *****   *****   ***o ** *d**e  ) *D!11,Y Key Color      tworld-2.3.0/data/intro.dat000066400000000000000000000065271475511570500156110ustar00rootroot00000000000000 Uh  /       gden   f           "     djKEYS AND CHIPSPCollect keys in order to open doors. Collect chips in order to open the socket.h   /  n     " *WATCH YOUR STEPzIce makes Chip slide. Force floors push Chip around. Water and fire are fatal to Chip. Bombs destroy anything they touch. df H  @n "/ P^FRIENDS AND ENEMIES7Avoid creatures. Blocks pushed into water create dirt. hj   /  n   i  hk  FOOTGEARxUse fire boots to cross fire, water boots to cross water, skates to cross ice, and suction boots to cross force floors.:dg"  "/n,,"  "6q ALL WALLS\Walls can be invisible. Blue walls are not always real. Objects can be hidden under blocks.cc "!"n/)) i))h! TELEPORTS AND THIEVESgTeleports can work differently, depending on direction. The thief tile steals Chip's special footgear.jfn ---g--/-P-- -.."**..- --D------XDIRT AND GRAVELjCreatures are forbidden from entering dirt and gravel. Look out for new walls popping up from underneath.  cn/ #&#%#&#%  $&$%$&$%K  E    ((N((N   NN '+  '+ I1jBUTTON, BUTTONzBlue buttons turn tanks. Green buttons toggle walls. A red button activates a clone machine. A brown button opens a trap.            0c/nTHE END}Congratulations! You have reached the end of the introductory course. You are now ready to go out and find some real levels!tworld-2.3.0/defs.h000066400000000000000000000171061475511570500141400ustar00rootroot00000000000000/* defs.h: Definitions used throughout the program. * * Copyright (C) 2001-2017 by Brian Raiter, Madhav Shanbhag, and Eric Schmidt * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef HEADER_defs_h_ #define HEADER_defs_h_ #include #include #include "gen.h" /* * Miscellaneous definitions. */ /* The various rulesets the program can emulate. */ enum { Ruleset_None = 0, Ruleset_Lynx = 1, Ruleset_MS = 2, Ruleset_Count, Ruleset_First = Ruleset_Lynx }; /* File I/O structure. */ typedef struct fileinfo { char *name; /* the name of the file */ FILE *fp; /* the real file handle */ char alloc; /* TRUE if name was allocated internally */ } fileinfo; /* Pseudorandom number generators. */ typedef struct prng { unsigned long initial; /* initial seed value */ unsigned long value; /* latest random value */ char shared; /* FALSE if independent sequence */ } prng; /* * Definitions used in game play. */ /* A move is specified by its direction and when it takes place. */ typedef struct action { unsigned int when:23, dir:9; } action; /* A structure for managing the memory holding the moves of a game. */ typedef struct actlist { int allocated; /* number of elements allocated */ int count; /* size of the actual array */ action *list; /* the array */ } actlist; /* The range of relative mouse moves is a 19x19 square around Chip. * (Mouse moves are stored as a relative offset in order to fit all * possible moves in nine bits.) */ #define MOUSERANGEMIN (-9) #define MOUSERANGEMAX (+9) #define MOUSERANGE 19 /* The complete list of commands that the user can given. */ enum { CmdNone = NIL, CmdNorth = NORTH, CmdWest = WEST, CmdSouth = SOUTH, CmdEast = EAST, CmdKeyMoveFirst = NORTH, CmdKeyMoveLast = NORTH | WEST | SOUTH | EAST, CmdMouseMoveFirst, CmdMoveNop = CmdMouseMoveFirst - MOUSERANGEMIN * (MOUSERANGE + 1), CmdMouseMoveLast = CmdMouseMoveFirst + MOUSERANGE * MOUSERANGE - 1, CmdReservedFirst, CmdReservedLast = 511, CmdAbsMouseMoveFirst, CmdAbsMouseMoveLast = CmdAbsMouseMoveFirst + CXGRID * CYGRID - 1, CmdMoveFirst = CmdKeyMoveFirst, CmdMoveLast = CmdAbsMouseMoveLast, CmdPrevLevel, CmdNextLevel, CmdSameLevel, CmdQuitLevel, CmdGotoLevel, CmdPrev, CmdNext, CmdSame, CmdPrev10, CmdNext10, CmdPauseGame, CmdHelp, CmdKeys, CmdPlayback, CmdCheckSolution, CmdReplSolution, CmdKillSolution, CmdSeeScores, CmdSeeSolutionFiles, CmdTimesClipboard, CmdVolumeUp, CmdVolumeDown, CmdStepping, CmdSubStepping, CmdRandomFF, CmdShowInitState, CmdAdvanceGame, CmdAdvanceMoveGame, CmdProceed, #ifndef NDEBUG CmdDebugCmd1, CmdDebugCmd2, #endif CmdQuit, CmdPreserve, CmdSeek, #ifndef NDEBUG CmdCheatNorth, CmdCheatWest, CmdCheatSouth, CmdCheatEast, CmdCheatHome, CmdCheatKeyRed, CmdCheatKeyBlue, CmdCheatKeyYellow, CmdCheatKeyGreen, CmdCheatBootsIce, CmdCheatBootsSlide, CmdCheatBootsFire, CmdCheatBootsWater, CmdCheatICChip, #endif CmdCount }; /* True if cmd is a simple directional command, i.e. a single * orthogonal or diagonal move (or CmdNone). */ #define directionalcmd(cmd) (((cmd) & ~CmdKeyMoveLast) == 0) /* The list of available sound effects. */ #define SND_CHIP_LOSES 0 #define SND_CHIP_WINS 1 #define SND_TIME_OUT 2 #define SND_TIME_LOW 3 #define SND_DEREZZ 4 #define SND_CANT_MOVE 5 #define SND_IC_COLLECTED 6 #define SND_ITEM_COLLECTED 7 #define SND_BOOTS_STOLEN 8 #define SND_TELEPORTING 9 #define SND_DOOR_OPENED 10 #define SND_SOCKET_OPENED 11 #define SND_BUTTON_PUSHED 12 #define SND_TILE_EMPTIED 13 #define SND_WALL_CREATED 14 #define SND_TRAP_ENTERED 15 #define SND_BOMB_EXPLODES 16 #define SND_WATER_SPLASH 17 #define SND_ONESHOT_COUNT 18 #define SND_BLOCK_MOVING 18 #define SND_SKATING_FORWARD 19 #define SND_SKATING_TURN 20 #define SND_SLIDING 21 #define SND_SLIDEWALKING 22 #define SND_ICEWALKING 23 #define SND_WATERWALKING 24 #define SND_FIREWALKING 25 #define SND_COUNT 26 /* * Structures for defining the games proper. */ /* The collection of data maintained for each level. */ typedef struct gamesetup { int number; /* numerical ID of the level */ int time; /* no. of seconds allotted */ int besttime; /* time (in ticks) of best solution */ int sgflags; /* saved-game flags (see below) */ int levelsize; /* size of the level data */ int solutionsize; /* size of the saved solution data */ unsigned char *leveldata; /* the data defining the level */ unsigned char *solutiondata; /* the player's best solution so far */ unsigned long levelhash; /* the level data's hash value */ char const *unsolvable; /* why level is unsolvable, or NULL */ char name[256]; /* name of the level */ char passwd[256]; /* the level's password */ char author[256]; /* the level's author */ } gamesetup; /* Flags associated with a saved game. */ #define SGF_HASPASSWD 0x0001 /* player knows the level's password */ #define SGF_REPLACEABLE 0x0002 /* solution is marked as replaceable */ #define SGF_SETNAME 0x0004 /* internal to solution.c */ /* The history for the last time a levelset was played. */ typedef struct history { char name[256]; /* the set filename minus any path */ char passwd[256]; /* password of the last played level */ int levelnumber; /* number of the last played level */ struct tm dt; /* date/time set was last played */ } history; /* The collection of data maintained for each series. */ typedef struct gameseries { int count; /* number of levels in the series */ int allocated; /* number of elements allocated */ int final; /* number of the ending level */ int ruleset; /* the ruleset for the game file */ int gsflags; /* series flags (see below) */ gamesetup *games; /* the array of levels */ fileinfo mapfile; /* the file containing the levels */ char *mapfilename; /* the name of said file */ fileinfo savefile; /* the file holding the solutions */ char *savefilename; /* non-default name for said file */ int solheaderflags; /* solution flags (none defined yet) */ int solheadersize; /* size of extra solution header */ char filebase[256]; /* the level set's filename */ char name[256]; /* the filename minus any path */ unsigned char solheader[256]; /* extra solution header bytes */ } gameseries; /* Just a list of ints */ typedef struct intlist { int *list; /* intlist */ int count; /* size of list */ } intlist; /* The possible locations for a levelset. */ #define LOC_SERIESDIR 0x01 #define LOC_SERIESDATDIR 0x02 /* Information associated with a levelset. Contains the information about * all gameseries that use the levelset. */ typedef struct mapfileinfo { char *filename; intlist sfilelst[Ruleset_Count]; /* indices for series files per ruleset */ int levelcount; int locdirs; /* Flags indicating which dirs the set is in */ } mapfileinfo; /* Flags associated with a series. */ #define GSF_ALLMAPSREAD 0x0001 /* finished reading the data file */ #define GSF_NOSAVING 0x0002 /* treat solution file as read-only */ #define GSF_NODEFAULTSAVE 0x0004 /* don't use default tws filename */ #define GSF_IGNOREPASSWDS 0x0008 /* don't require passwords */ #define GSF_LYNXFIXES 0x0010 /* changes MS data into Lynx levels */ #define GSF_DATFORDACSERIESDIR 0x0020 /* datfile for .dac is in seriesdir */ #endif tworld-2.3.0/docs/000077500000000000000000000000001475511570500137715ustar00rootroot00000000000000tworld-2.3.0/docs/CCLP1/000077500000000000000000000000001475511570500145735ustar00rootroot00000000000000tworld-2.3.0/docs/CCLP1/CCLP1.html000066400000000000000000000223061475511570500162660ustar00rootroot00000000000000 Chip's Challenge Level Pack 1
CCLP1

Awareness slowly returned, as a frantic girl's voice cried, "Chip! Where are you?!"

Chip, he thought. Yes, that's my name. But who's that shouting? And where am I?

Groping for his glasses and staggering to his feet, he looked around, quickly spotting the loudspeaker in the ceiling that let in the urgent voice. Would it let him answer? Clearing his unnaturally parched throat, he croaked, "Hello?"



Chip's Challenge Level Pack 1


How to Play

The CCLP1 package contains the following files:-

data/CCLP1.dat The main levelset data file
data/CCLP1.ccx Story and author information file for Tile World 2
sets/*.dac Configuration files for Tile World
CCLP1.html This documentation file
cclp1res/ Images and other supporting files for this documentation

Using Tile World

To play CCLP1 using Tile World 2 or Tile World, just copy the data and sets directories to Tile World's standard location for these files. On Windows, this is the directory where Tile World has been installed. On Linux, the default location is /usr/local/share/tworld.

With Tile World, you have the choice of playing CCLP1 under either the original Lynx ruleset (which also features animated gameplay), or under the MS ruleset (as in Microsoft Chip's Challenge). Tile World also records your solutions automatically and lets you play them back later.

Using Microsoft Chip's Challenge (MSCC)

To play CCLP1 using the Microsoft version of Chip's Challenge, all you need is the CCLP1.dat file from the data folder. To make MSCC use this file, you will need a program such as CCTools, Chip's Controls or MyChips.

Note that MSCC is a 16-bit Windows program that will not run on other operating systems such as Linux and Mac OS X, and requires additional steps to run smoothly on 64-bit Windows (more information here).


The Story

The story continues as Chip makes his way through challenge after challenge.

If you're using Tile World 2 and have installed the CCLP1.ccx file, the story will be displayed within the game.

Alternatively, to read more, click the link corresponding to the level number below before you start playing that level:

1101921316879818289909597101102103115116117118119120121122135136142143144The End?                                    

Many interesting things happen to Chip during his adventures, so be sure to read them.

And who knows, you might also pick up a hint or two along the way!


Links

Stuck on a level? Want to report your scores? Or just discuss the game? Then check out the links below.

  • CCLP1 Homepage: The official information and download page for CCLP1.
  • CC Scoreboards: The official CC1, CCLP1, CCLP2 and CCLP3 high score tables, now maintained by James Anderson.
  • AnnexCafe Chip's Challenge newsgroup [NNTP] [HTTP]: The oldest active Chip's Challenge discussion forum.
  • CC Zone: Modern message board and multi-functional Chip's Challenge site.
  • CC Wiki: Detailed information about the game and levels.

Thanks to...

The CCLP1 Staff: J.B. Lewis (Staff Coordinator), Dave Varberg (Speaker for the Staff), The Architect (Content Creator), James Anderson (Webmaster), Tom Patten (Voting Coordinator), Rock Gnreux (MS Ruleset Playtester), Skye Climenhaga (MS Ruleset Playtester), Tyler Sontag (Lynx Ruleset Playtester), and Paul Gilbert (Lynx Ruleset Playtester) - without whom this project would still have been very much possible. But hey, somebody had to co-ordinate the project, organize the voting, compile the set and playtest the levels, right?

The playtesters: Joshua Bone, Flynn Burklin, Joshua Carl, Bryce Hall, Nicholas Hoffnagle, Beth Johnson, Nazmus Khandaker, Jonathan Roosa, and Chuck Sommerville - whose outside feedback helped the staff gain much more perspective.

Ahmed Aly - for implementing the voting system on CC Zone.

Everyone in the Chip's Challenge community - whose votes, feedback, continuous encouragement and occasional nagging helped make this project a success.

James Anderson, "The Architect", Andrew Bennett, Ricky Blaquire, "BlazingApollo", Daniel Bouwmeester, Derek Bowser, Elizabeth Brockway, "ChipHome5", "derek_mc_hugh", Gavin Duncan, Aaron Farmer, Jason Farnam, Grant Fikes, Andrew Gapic, Rock Gnreux, Trevor Hedges, Skye Climenhaga, "jbdude55", Reynaldi Judianto, Zane Kuecks, Marc Larivire, Mike Lask, "Lazykat14", Josh Lee, J.B. Lewis, Andrew Menzies, Michael Moorman, Vehudur, Markus O., Joe Oliva, "origamizoraz", Tom Patten, Matthew Petras, Henry Potts, Wes Powers, Archie Pusaka, Ida R., "random 8", Andrew Raykowski, Rolf Redford, Bill Reid, "Rosabellis", Eric Schmidt, Jacques Smith, Kevin Smith, Tyler Sontag, James Spriggs, Kevin Stallman, David Stolp, "szg65", Camden Tatsapaugh, Miika Toukola, Dave Varberg, Craig Vilbig, Michael Warner, and Ian Wilson
- for designing levels and offering them for inclusion in CCLP1. Due to the number of levels in the set being limited, some designers could not have their creations included in CCLP1, but they certainly offered some stiff competition to the ones that did. The detailed list of levels and authors can be found here.

John Elion, Christopher Elsby, Michael Hansen, and Yongyi Chen - for developing the excellent level editors using which these levels could be made.

Brian Raiter, Madhav Shanbhag, and Eric Schmidt - for developing Tile World, thereby making both the Lynx and MS modes of Chip's Challenge available for playing on the various operating systems in use today.

Chuck Sommerville - for creating that amazing, timeless, classic game called Chip's Challenge.


Change Log

2014-03-28
  • Original release of CCLP1.

This package was last updated on 28th March 2014.
It may be distributed freely, as long as its contents are left intact and unmodified.

® Chip's Challenge is a registered trademark of Glynlyon, Inc.

tworld-2.3.0/docs/CCLP1/cclp1res/000077500000000000000000000000001475511570500163075ustar00rootroot00000000000000tworld-2.3.0/docs/CCLP1/cclp1res/CCLP1.css000066400000000000000000000022711475511570500176250ustar00rootroot00000000000000a:link {color:#B2CCFF;} a:visited {color:#CC99FF;} a:active {color:#FF9999;} body { background: #C0D0E0 url("gravel.png"); color: #f8f8f8; font: 10pt Verdana, sans-serif; text-shadow: 1px 1px 1px #000000; } p { text-indent: 1.5em; margin: 0.5em; } p.NoIndent { text-indent: 0em; } .StoryLevelTitle { margin-top: 100em; } .Dispatch { margin: 1em 2em; } table { font-size: 100%; } th { /* background: #B0B0B0 none; color: black; */ background: black none; color: cyan; font: italic bold 12pt Arial, sans-serif; padding: 0.5em; border-style: solid; border-width: 2px; border-top-color: gray; border-left-color: gray; border-bottom-color: white; border-right-color: white; } .LevelsTable tr, .LevelsTable tr a { background: #404040 url("dirt.png"); color: #FFF6D8; } .LevelsTable td { font: bold 11pt Verdana, sans-serif; padding: 0.25em; border-style: solid; border-width: 1px; border-top-color: black; border-left-color: black; border-bottom-color: white; border-right-color: white; } .BannerImage { border-style: solid; border-width: 4px; border-top-color: #F0F0F0; border-left-color: #F0F0F0; border-bottom-color: #909090; border-right-color: #909090; } tworld-2.3.0/docs/CCLP1/cclp1res/CCLP1Icon.png000066400000000000000000000535401475511570500204370ustar00rootroot00000000000000PNG  IHDR ˃hsRGBgAMA a cHRMz&u0`:pQ<VIDATx^}m8m>`n(@U3Pa/^@;W=;pgv%x C)>G\LeXEQdF|mWj -[wz-P[@mo/4/-P[@m=`z-P[mmqMo>}| PÁ=i+ŋO5UmNTۧo?wq U~jw>}| p Ub-YၳC=VaULU1^1ՉN*0T`k +V`PCN9QPC  V`PC }a5wǩp/*8Yq} +++Ni4}| pab<Ͽ>}| P19WR>z7o^gH_}>jKK{+5_}_ǰi4!ݻs nӬ?[WW$%\ ?~w(ﹼPUB?'TӾs|Z.nѫd6_VیxHh_|2 z{˗?Z5Ϟ={h,{2?noo~3 C?~ O{C"uqqyC|;=?PUQ0|ۭ!Btx`r@NϧOONOOQ}rJ޿E=0~!BڟX`˫9>`0TN ̄yr|d7 3^w&s0Y^ Cb(8+@g_OŊ|Щc3PExn$s($8./LL<^|I<@cAG9ӭPq/_e;`I [zk(COF^|baPcXBMbǻ˷g7ggg0~rz1g1 7) &U-@ G G>0 *DRtoI@ h@n : P`o ӹ &̛A;\ƶE#v]Io} s 0?1Ć+<:cp)/O ^$b 8F-4܇iy4Jxm ao. {aF yz&!  0`BSE+ J PU@A=ol>Fhl? *4|p}Cy܊AJ@Dʪ<}ٿtޤ0$\ @<d8OO/eE?K!Aj2`0H<h=G|af`ϟ?8'H II7 Gsbh]w ^I4ɝ`v_?|}.(B_%-r]b $3w0\hM!0ĎؠB0'0{Ƶ($la1ETh3F;ga6Y E HgVYG%n:HBk14vt~*}.T *@[ؐG nu +@ۀU>0H@hf|rֱ`pLx=y-iV%u6֥B⁁9 4 X;n 431.x]4^2 ~ő-T]:Si:b`kd`߭Űޕ|1QW _iD̓4Dݻf%,U%  `:DlvOh>PH~hM <<$= .>Nz;jDV0Y HXޱs%ˮ$\A[  &-v%zo=+ G(c2Msa+)3Q+L5$E (ęJmŜ//oX!89;9I!߯C'qC! n ]I:a' J;J.>ƅAmv[Co 88m!tD>e ')+sr1:`Kp+b k,[_;ˀ.։ƟCh'ͅ|6mP4&P_Vh -$3b`W-L`K `7'F+~1KHTyA`@U`#3$jMh1@B`7qD Glhb Ev,|Gya|Őę>, | v1atb)/k"`xϞmiJ?*0mkBf/ @ >Ϗw[DϸCjV͍ 󐰽+I |$lzDd.WR~ضLd,$..rBjIeH[/W s< 3|y UTH'??Gvvo67]գJyT&y!L_+fasNtќ%/ۇg Q !|KG 4I&g,3JFC?`wg{(Z_/sQQ&Z5%>d;cHpQN)3G $,c ,R[P ULec86#O!~FX]Pęڂ*YoP# 8cT~{//1xM@yLoONN#"ɩ_O Z^WPqb_d'J+0+07 j~aџ%'&#1*&R ~ `x (!\ b}T&i.ȯ@̟JG>̪9uwA7^@C)| `NDE,):ÝLGW0tC~U^Ci QHrXD=0>3P_a90z1.̐4*<0d>U,Ãnkw?şBbqb `0'k 0KÉ!ɞ*&]Gv}Ty>}55@۵ Z/_ % u.i:0*J:h}F9֧J`HQR{ \<7`Oaܹ_qP{11uRJbr3ə (3ƀfv~,9W =| C'f)#gW_a 0Pa T Cjύ#DS샛Mmս0ֽ7 eBpD,NƂ1tnUUF9כf+ `2C6-Cgb(įت0wAڎO طe0U0 j|Tto{ke?/>W⪊UG#ffn`WPaSTJL.*Sq4'RD]H`I vi.lJ*\O*,"Coٖ٢GWǯ*+j}(WrA\ƃdN6%25J'P_/_,-wKgC2`0?fm'=0)| 6o <'% A**VUjVMsQ~U^C_ hB#|>GɁ0{c9ٓ 0d˫UTܑ3 Z| A8 &' (I]>!0Bl ɩQNL6x9S6r-z0 a6>\zbVXr1?_U^WPaCQ~`1[$d  DK8MנK=/,F W *ЏvL1Hwm#"{?t%юk1cxp Y \Rbd ZU&-q%jsގ m*ꟻ%E--*ĨY ӧ*;[ _w#*0'b`?M߬ؒÂ;9QAo*S x%I\qs=n(V>XUy_AW%0H}(_BG07AaJ/SHs6_lsFVU?7An?2}.W x`ps axq1..0*mm>8>Z'GWTy>~F5%[}T~Ls*(SߗrʰJ[ȫQFaʗr & ~.#3" ?l/J8d Z>^ɮ،lhOm>j,Zwϟ~8CLZcj[ ϭEoKy+~ʐKT}2 doqR/z?"D(-Xe tRDg˗Fwyi"Ϭ|pqT>pgذ?{XǰW,1GoPhKQըܣ+;W9`C]oiMf1t`48Cg.@7DfK@pj3*l5XY]>j"1tITCI>S ʒ޾=H{r=h$BՇ |f%WǗOLCY  qT3g0L̬*`Pg`Eb͕D=ǐUٓG^ bKW LI 0{ 0@00^ |uftq DPJ˫K'C& ift'͋bM+)! }Y}_`6W\4Űb2at0lrwI(㜲A'q5:Y_A:T}10t+lUs"%K ޼xA0 x@uI |1b,"3g0xH~t>TITmI[QD럸lan20gx$O'nrLayu|dc`?+0@+Y!^zEsO5Y |1zZu"3+0cX 0 tLT-xG=~b7wo!\L(aߠ/Ul | A/O `x`@2XՐq |1C`?P_df}CfP3iZsab96Gi3%WǗO6|>x'/Ά6̰`1uF}3 yB#O"Ōnޞ"3lGN,ǰapVr^~ I(_'#z b^@W#՟vj ]_A>$KEW: Æ6 \VzT-f>>Efg%0t_ 踕a} "~0`朂 H1?)jh-TbzU}%0H~U_n*fjBbGUߐb nM\!A}Qgq,Q+oMΗP3V(zzVB0`A'WJ˫K's ejUJ}SBWy(V3Υ[H3_Oc~駟~Dsdˋ| ],o*4:AoP%WI`>\Iv3Sr ߐY1 0jSP[Ϭ>֧1FO .[KCJϒd׸UmI"V>H3?{@ So^+a>I?\bBG`|h! . -K3ĸ!PhXW3x|P!aY8 Zu|tQD9ZW(Ǡw?~]rΕ TSx>GTA ,Q!_=STy4>G`1Uy@@362yH`ȬR#Dc8h*?C_@$3KR$>b x'ưOx |֞AMw~2#Dh>um J!6ݯ'!S.-Dsɀ!A&>$"YI˓0á ٺ>*a#WھyMg1P$@-NɟaśbZ yY0oxŚ93[ H ߃ݟzoh Xa[>_  B{`_W ` TW;bOxp%ʼnUd Zd#xϼ``!b;22. AJ}@AUT BmC`pim{s_J\*dd`g ]I;a ^FA?4E|c'7ӽa*$CSmt3P6R8$B 2|b`g?`.d=ob@ӡw C\B0zU{PjjFx^Jc^sz\ CG짇]g@-fip+9o XnqI2<6y|Z=-!j s=06hah1Kas> qĸe㫉J&EYڟ!߃*7Ca * цe,p%y`oYUM~A˺,Gza% >y ph=d'-7on6e| >|9hGh7 7I{P凮$j`38+Cc8>,>q rڢ+k!l#>nZ * >#cRnἍ'"O0>dVxs%qbnj{P`~={C1X 5 V#eMZ0-1Dg&>oB`|)F h4\Tܑ'TO" >֛0@}Yys>|6 ^Gg |*?N3ٳ#C1-E c 9| c @ym"wA_aĂͯЮ!o=WIu NLGX C6} >3@o0| 3#Xu{P=U5{QJvtoUIc 3 R>D xIX%IAfH7wڕKka媋AAcP_OĶ HD/ߥy]3T~ >7mC\a4V2ꊹQ{LW̝Ϙ'XMZb1,TOV=Soz ->J2-9 գ*߃**nX1yAaWϗ7d| *>0 q×+GW룎w?g@Tak5Wg| [dKT=hh)3vS>P۟+瀝"=W̤]R$fM HyL8AiwŢc d LegnOCmOlVQ{x.!Pa O ;cDAwp?sd&STyCï>6 c쾙G\?նɬ>|]&ꭝPAI3" ˒`FKn/^,GQg7?x âCOCo_9Q믿0t/cu8X=3G4ʂ'Х%KoxOt<|P| rc=yG9qS]f%叭?K> vo[ƌ0w+ 1 MG`4`}\QNEXZ~h1\q^羦> zːد:6lR05,O͸8y;/$*₩?/dg>C&Ƞm4k1t[$ߚ:B| ICGWR@C6{2_70Ǡ_6}E D\K '<η![>}Dt`2ͣ?C$c &&Zի52㉧1pЀ~^m1~bS"sB| cZ{ HZ3| k1P W5$dU$F\Dl@!23EGC$b$IBx}oc r|ihm eb>Qh?ɫd='4 ,C1zJ| n3ɯᕷ)G aʕM)0c#췤΁в 3baeG.E}E}T+ua+X0`cNpՀ(EhOAn:`Ҡ2̇Ft4+g胜nSɢa> A͉2^E <˖U0#Ŝ`(0|񰒸F *<+ >HRn-]F >| ʎ ӷ!Xq> R 6mEJo`An .XHH?1-kmFYIBh:A Y }R 0c Ng7LI-~ 6,vYj | +;z>0dn_V,C'F|^޽F!\5 1=w%3 4ЕCr:#uoUҝ/t"A+r1 |ҸƓĩR?T>ƾ1f71^- xSrB <0`}4}f ?GC\ 0ʣ#T_1v>۽<&7 h%|;mjy>7^@A j=aCsi:9p{e@B6F0 z80| ^CN\x8ݘr| 7`T@$|>jtq93pPzLހ!.1ҳ=iYGZT\8J HͲf` c ' -v00x(0h?0>}"0$0o8S`P M~x҄" gXu(`PB͂# @: Faa`m$T(}3ds\ֱh&G:|!1,O626z )Bݜ0'-o1s%щFVŒ+;R+Oǭ//%Ȍ6OZrM\Ec.Zs?s*Ue-^ >c#(,?< D{I,0Be/^*zUh9/: 6 t Fϝ\D@m<0>} T8`gO0y`gn~n7*hLkZVN*V(g1gWJ*0 h⻫s|OAjP$z ʎ~ &Z4mRX L T0r&@đ˷_G?U[g`@?(-rT' (؆Os /˨v6`n\fr%EPB9 ͣB\m\|ǰ0@k1ZHm<4>}zqۅI\ݑ9fT򛌗8cD׹c1`_ch ;\uH WܑQĕ4 fsQ>`~rvuYtOp&Q6SǂR0n&>Q%7ݶo1ڔ DwbJ Ͻ~bWLܸZ p(Ŭ0pfYw^`@1y]J OǸ4 MqʣGbc& )Wuo>9:DvYMGxh| jx$糳JZ'/9^s$>Ə/y/#e,62iCg@T|4 t'1X7?ŬslKY,\a6>*?T.)>c/ݟ%~tcRcчXgCly.'lJ뢼> 0cP_Z^/B?gEc@}_ey_AmEg>f D/p.ϫI7=Z(|o=sjb)_%y}FvqS_Z>4re߯63y2c >[pu ܉B@}_eyAmBk8u傘A?>5XQ|=J*o(t > 0d1/-/1Pg͔+IY1_F׀`+TmLt 2b$VC!>9)PpVDs"OgjlcH54 >KgԻC+I}и k} T1xfC3ug^%ϫ%!p?8{;<0#ʹ=J2] 8Zv PuaΕz#C!>|4|aTz=01k{⊵^3E>EW;b!Ε,Z~Qih3&=0| ~7 \+BQ~ CWPAG?6@gYu,0-354A}UEYH c?5p Lbp``>tN\8$0DKY7+1b@iHa+Wu|ac`(.(oCj?ɔPH )`ĘcP_diy# k%?.\.NO.뚰JJ`*zq8!IDBxTACCWc%vg8>BW1'6?_ $CB^>G8 =TPZѫ/UűF!Eŝ`L =>EW;b!nUa QB+MZc1{\h\8$0d1+ɴ0lpq LdH8~EꇍYz77[l\)`ۛ$>EW;b!q`0ȽΕ *UW0#DzͯpܰAC$ ,-_Hѫu0̐40$%0<>;^>]: .p-cPAGHJza673=0P_ tԶWlPA}5_3v n"oʏj86\w+L{em+˭Ouoi1c%I}#^!:}!G^mhAiy#74ZǓg?Y[ROʯ0lzRgRb|9Z aj"Εs {CZǐyU0 Rn\#e!\IfɝK@ -Ǡ޿ [| j=8ѦN_ϕ4H9 _Y>/cq"y`$0Hw)w}4j7JWGcP_Z>3ծs [4Z@}_Uy_Am@)][T|$|~7V (3Rm#|P@f_eH/^T~H<+0|cڤ9 k! H1a_㐐~ 8ՁR1E 0䋸'oCfx`8*>}MaRB/, xW |@ޅG"xr<[/' | 6b>h#`V؀.(XLŷ>c1ǐO2l: ~3:%%ac`"?J@"xO끀'ўȬb&c`fy O޼8E]&ŽŹ|&_+?\| fidacQhOu)\UܬO%3;nX "Df`Oa_qPwt#0| )0`(Ӄ@M\pOb^M?R{ ysca֫WW Yq`i@юWtJ| 0c!&38hyUI4'qP`,A"66wg1| #Chccc&BrࢗF  ,s܇|0*C >| Q^zEss:ibvbas>  E}':b $j0H`&BR^ }D>7sƦ9xl+8~-0DAK}%I)>βb؜Ob IwtG$z0`tZ,M\IDq`(0t%9T>W!yf\I0$SON0aހ4Coq^`ŀbsU1.om<O`}Xc(ǐ<5aM!j˫ 1 m|1CG + )@+t%aTV>vC6W4aj{ ?W|~5Cbve^J$ @t/0d1C@5ԏ1\x{>/!Q4!܆aXr.aLb %$϶$i >E`7,%Uc`؎!Q|ejF.n@EȽz6H<_뗫&vzjػUl".`U+5gf?H`VX : \I%$C%ik>{J۔bB+4W|h 1 \. n0R4ʗ0hSCe? JI$b,U-^U]={1 }xU>IVI-KwY絷>O V=0O-Cfv>+WWcP'yGMͬ#N21oԼY{2z$Vykf},?{i>x`2W]>\I>}2wbJcfSuY̯޿14ʗj=CN/1B|4ØTg`I?}WU>}2w Y̯|c -\oE*/gG}'Ry=2giʟ}QIc$| bGcPSW𾾃c@]^^L'>~rp~˕ z;||ifzU~A}޻܇8rl x4+q#t`QO74?<0cTL?֖7(Ǡg|9ŝ,Ȭ[  b&/fŋsWt*!!S޿H4^|f@gzSv%jdn> ۈ=` 0`%aL62f:I&;c}S3S09=ztw9AcrޝY`}ѣ31P$xO; H2쌦Qy@V7=QcjNrd W3_|ZEn@n11hƆFhd !Vܧn8"0*޿&s(@Ic|_WDcP3S0@?b=;fJ`o&$kIO0xpe(g?`cp$ S߀zU>a|=o@-@WR; 'g?ܶ>4cb~>uP`P_D>=370ƈg!dLY !j:kH0B' -t[}c.pwM[`./5p G=?C>A$K}|Oy bk|Ec03[ T]:}h<qj1" i ?qj'#c2s8`_bP̔ RTJLY!0pZUlذb0> +|}~{&7qq?}+mQ30~|" s5UzU>cy` "$-9t7R$6~_>`͏ sB)}϶} +4\B~gHޢgz`&@\.B h:>8 pbU ᑣZ '`X a4Xi4 :e%6Q ^d@1|f(xwǰ'o9m1Jbj > 0d@Ǡg` $`!;gZsi'>sҕm\haQ`ݬx ˗\D']Zt%I| ̋l7_X<0,HyB~2rPv^>9iϪ 0L1d玁a;> H\5AmLrG<dgx} -BЏÌ6?C|^? $h mԠu@t#Œm$XŪc 2d 4F+7_| 0`! 'wAO-X M]Ih+i SDp X51̶}G,[ ˊ^>n~FU4gb`9G  @T`7lа !aqm~fmNW۞- +U5o$>Nr'xPg0@c@}rC 'lTy|f*ڞjXvy@TK9H[7lc#ݟJ}z:hUpތ40`pۋX̅^=n6)jR/c <m(V1ɍ1 `js]X Y@LgƂ>k#k2ȗ![10zgmz!1me:oH01`Fq1..h8=xvI?Oo zBE .j}ǒ(ѯ4׽J "~U|&ƒpkq%攁&0myQ׏3UI*?+VS3nb`:}MjUA| eHBd. YW_0)I`Jܥy/4|2 1=-(u["X~tBb-˰r.3@ k^6;[(?6yAmɪwtu)7 MŶRtR&>*yUC&sZ溱Ơ].ۮ`ZZ^y&(,k9<͌=1h{OXWE 'N{ >tⷰ1O5_SW|7>H(-X%>EhDwOjQHy{s'jS%c`0`dBfH"M"U %W;&BFQ4Wq6C-BX a=MBAuo[{h&0B1 WSZ^WP۞`Zf<g=P7Ueg,cP0_>kĊD?(ɇ5''C&r1g[!WV`#A C׳p%|Ÿ)\UoS1)>>!xl`BUy-?Sa:#)Kcc` -y1v"Pz`(`y(X : ‰S>y=E*t5C?ƯE1 Do%пD:<ˀ!j}J˫XoɇVB/5'ux0_oc`pACı10yyt\ Y:bc(-ώ`M{ˣq1y#"cbN,k^09Ssob N7  m<*|?,֕>CfcP! 3 M5v%xQ*O }%VQzu:x w<:Q17`@UJ#F-?th1$1j6K;sC.Ԝ,IZ ~e*_ >5dIy,ƀqӧO>l1̿0g_Uѫ10g)G`xcc`ͅ7ON̂[c(-u6_5b $g>MLc CuI~e1G +c v[gi xl`EjS gM/Eq}[$QF-:3Ɣ+sW L v.N!gMl_oRР S se)0d.vPTC<\QNjTy3F ~5c^c?^`F>k rUI&OYU 2q'}"ON2K~SBb<y`SMo'"~z6HܳDu੮JuFo pBTy Z Ttxm\dR CcsSl6-5mPL痫( 7őC4C!@ipdhn[ uePf -vh!a0ͿBEo|=!.I< Ec%PjnƑJtb7$ϋǀ^n++xk{Rs.W;ڝA44QP򞩊Xo݆go>bjB߶x*̂!tҖZP*zU]`Su@?!x+m(#lRJw0GHϫvtC FnSu¯`;s?I]gAx+3-pT $Yq`hw0t,Z!_QNjTy2bH2:ͼ&DXV?@X1Kt;=v gU6o6A OD[|It%1Hq)B{gMcPFa}~'WmIR—V.fehL erVK7WR~ضL䁳2~=)Q+LT 'WpX_J ZPRƳXތ86‰N3 2S:_Bi~yU \$+LJ >C''նQl**Z(! B/-ϰ?Yc| &/$0 \)sao>}| PÁ0d0q>bk0m1*?նta^ )>ۃux+3W`P+xC rrT`hv=fS?k,CP-j1TiZH*0T`PC~x>ꊩ)犹Z bCP-j1TnFjAujP-j1TZ bCж@4,)S'FSǷ@??l w>}| P!$0xZ-P[@m)C{j -@ (գ@mj 4y-P[@mcwMIENDB`tworld-2.3.0/docs/CCLP1/cclp1res/a.html000066400000000000000000002154711475511570500174270ustar00rootroot00000000000000 Chip's Challenge Level Pack 1
 

#1 - Key Pyramid

Awareness slowly returned, as a frantic girl's voice cried, "Chip! Where are you?!"

Chip, he thought. Yes, that's my name. But who's that shouting? And where am I?

Groping for his glasses and staggering to his feet, he looked around, quickly spotting the loudspeaker in the ceiling that let in the urgent voice. Would it let him answer? Clearing his unnaturally parched throat, he croaked, "Hello?"

The voice responded instantly, in tones of sharp relief. "There you are! What happened to you?!" the girl demanded.

"No clue," he said, squinting blearily at the sterile tiles and plain gray walls surrounding him. "I was hoping you could tell me. Who are you, anyway?"

There was a startled pause; then she replied in hurt tones, "Are you all right, Chip? Don't you know me - Melinda, your friend and fellow Bit Buster?"

Melinda...the name stirred a strange rush of warm feeling in him. An almost-recognition, vague as a dream. "I...don't know. I'm all right...but everything's hazy. I can't seem to remember anything! What am I even doing here?"

"You volunteered! You're supposed to be testing the Bit Busters' new Clubhouse Challenge, before we turn it loose on the recruits. But we lost contact with you, right after you went inside. And then another emergency came up -"

Her voice broke off, leaving Chip to wonder, Clubhouse Challenge? Recruits? What's going on here?

Then she was back, sounding urgent. "Chip, I'm sorry; I'm needed elsewhere. You're going to have to get through the first few levels on your own, with or without your memory. But you're good at this. I know you can do it!"

Somehow, even in the haze of his non-memory, Chip felt a strange certainty that he could trust this girl - and that he would rather do anything than betray her confidence in him. Shaking the cloudiness from his mind, he stated, "All right. Tell me what to do!"

Warm pride filled her voice as she replied, "Don't worry. We're going to figure out what caused this amnesia, and how to reverse it. But until then, you're going to have to start again at the beginning, and learn all the rules of the Challenge.

"Fortunately, the first ten levels were designed to help recruits do just that. In each of these levels, look for a hint. It will provide you with information on how to get past the challenges in that level and reach the exit square. But be careful! Some things in the clubhouse can be a little...unsafe. Just read the hints and you should be fine.

"Now I really have to go. But I'll catch up with you in a few levels. Good luck, Chip!"

With a crackle of static the speaker shut off. Feeling very alone, Chip turned his attention to the room surrounding him. Two locked doors of differing colors led into the unknown, and there between them lay what must be the promised hint. Gathering his resolve, he went over to read it. His past lay frighteningly shrouded in mystery; but he sensed that answers waited in the Challenge before him. Could he be clever enough and strong enough to solve the puzzles both ahead and behind? There was only one way to find out....

#10 - Graduation

Flushed with success, Chip strutted into the next level, only to find himself trapped in a claustrophobic corridor facing a green door. Just as he began hunting around for the key, the buzz of a hidden loudspeaker announced the return of the voice he had been longing to hear.

"You made it, Chip! Excellent!" Melinda cried. "I was a little worried; but you clearly have the instincts of a true Bit Buster! Did the tutorials help your memory recover at all?"

"Not that I can tell," he sighed. "Melinda, why don't you help refresh my memory? Who are these Bit Busters you've been talking about?"

"We are," she explained, with pride. "We're the school computer club, a meeting place for some of the smartest people around! And you're one of us, since about a year ago, when you completed all the perilous puzzles in the old clubhouse."

"I did?" Chip exclaimed. "That sounds really cool! I wish I could remember...."

"It'll come back," Melinda said bracingly. "But yes, you were amazing! Your overall score nearly equaled even mine! And," she added tenderly, "I don't know many people who could claim that."

"Uh, thanks," Chip said, heat flooding his face. He cleared his throat and hastily changed the subject. "So, uh, then, can you explain where I am? And what I'm doing here?"

Melinda's voice took on a note of regret. "Well, at our Midterm Meeting, the Bit Busters decided that our old clubhouse was just getting too run-down and decrepit for us to use. Everything was breaking down: teleporters were redirecting, a teeth monster lost itself in the labyrinth, and one clone machine went haywire and flooded an entire level with walkers! So we agreed that it was time to close the clubhouse for good and build a new one."

Teeth monsters? Walkers? Chip wondered. Those sound kind of familiar. I wonder if I'll be encountering them in this Challenge?

"Now," Melinda continued, "we need to test it and make sure it's ready for initiating fresh recruits. As a member who can still remember the challenges faced by beginners, you volunteered for the task. And here you are, already nearly finished with the tutorial!"

" 'Nearly finished'?" Chip asked, excited. "So, what's next?"

"I won't give anything away," Melinda laughed. "But I will say that this next level is special. It is both the last tutorial, and the first full level of the Challenge. After this, the puzzles will be harder and the hints much scarcer; so start putting what you've relearned to good use!

"Now I'd better stop talking and let you get chipping. We won't be able to contact you as often, the further in you go. But I know you've got this! So, good luck, until we meet again."

With that she was gone. But it seemed to Chip that he could still feel her presence, watching over him; he knew somehow that she would never be far. Encouraged, he turned back to the level at hand. Somewhere there must be a green key....

#19 - Feel the Static

As he gratefully exited the the blob-infested ballroom, Chip felt a stirring in his memory. A faint recollection began to surface, of another, distant dance, and him, and - Melinda! Is that right? he thought incredulously. Did I really take a girl like her...to a dance?! The more of the memory returned, the more sure he became that it had indeed happened, and a glow of pride filled him.

"I remember now!" he shouted excitedly. "That was how I finally plucked up the courage to try the Bit Busters' initiation! I had spent weeks working up the nerve to ask Melinda to e-prom; but she said she'd only go with a member of the club. So then I decided I had to join, or die trying!" He laughed with joyful relief. "I'm starting to remember! Just wait till I tell Melinda!"

He hurried into the next room, hoping to hear her voice on the loudspeaker. But all that awaited him there was hard, unfeeling static.

#21 - Generic Ice Level

Opening the door to the next level, Chip was greeted with a cold blast of air and a warm welcome, from someone who was not Melinda.

"Greetings, Mr. McCallahan!" a rich, powerful male voice echoed through the large, icy chamber. "And congratulations on completing the first twenty levels of this Challenge. Now - perhaps - you're ready to attempt the levels that are actually hard."

"Where's Melinda?" Chip demanded anxiously. "And who are you?"

"Melinda is busy with matters of far greater import than your test," was the smooth reply. "She selected me to replace her at the monitoring station. My name is Jude. Pleased to meet you." The urbane formality somehow felt as cold and empty as the room.

"Hi," Chip responded, equally unenthusiastically. "Just call me Chip. Did Melinda say how long these 'important matters' would take? I really wanted to tell her something."

"They will take as long as necessary," Jude replied even more smoothly. "I will convey your message to her. What is it?"

"Thanks, but I'd rather tell her directly. No offense," Chip said, trying to hide his frustration. Something felt wrong about this whole encounter. Where did this Jude come from? Why was he acting like he owned the place? And most importantly, what was keeping Melinda?

"As you wish." Jude sounded bored. "Wake me when you finish the level."

As Chip laced up his skates and headed onto the ice, his heart felt a frozen void begin to grow. I wish she were here. Here, watching over me.

#31 - Quincunx

Chip approached the next level with dread. He had felt Jude's eyes on him too much in the past several levels. Where Melinda watched over him with concern, offering advice and encouragement, this man's scrutiny was cold, silent and calculating, and it was starting to get on Chip's nerves.

He braced himself for another sardonic greeting, but his heart leaped as he heard instead the sweet tones of Melinda's voice: "Hello again, Chip!"

"Melinda!" he cried with relief. "You don't know how good it is to hear your voice!"

She laughed. "I'm glad to see you, too. I take it Jude hasn't been very good company?"

"You could say that," Chip sighed. "I suppose he means well, but...he makes me feel uncomfortable. The way he just sits and watches me - it's creepy."

"I'm sorry, Chip," Melinda said sympathetically. "Truthfully, he sometimes creeps me out, too. But his intelligence and skill with computers make him invaluable for this sort of project. And so far he hasn't given us any reason not to trust him."

"Melinda," Chip began concernedly, "why is he even here? Why can't it be you? I keep hearing about all these problems. What's going on?"

"Well...I didn't want to worry you, while you were dealing with both the Challenge, and your memory loss," she answered quietly. "But the fact is that things are not right with the Bit Busters. We've had security breaches; chips have been stolen; top-secret projects compromised; and - oh, Chip, all the evidence seems to indicate an inside job." Her voice caught at the end, and Chip could sense the pain that she was trying to hide. It was tearing her apart, the thought of betrayal by one of her own friends and fellow club members.

"That's...that's terrible," he stammered, feeling helpless. Here he was, wishing for her support, when actually it was she who needed his! "Is there any way I can help?"

"You're helping already," Melinda reassured him. "Your blackout and memory loss, at the beginning of all this, was no accident. It coincides too perfectly with the start of the attacks. I believe you must have found out something, something that our enemy wants to keep hidden. So he used some sort of drug to knock you out and cloud your memory, planning to reach his goal before you could recover."

Her voice became very serious. "Your memory could be the key to this whole thing, Chip; and regaining it is the best possible way for you to help. So keep doing what you're doing, and hopefully the familiarity of puzzle-solving will trigger the return of your memory."

"All right, I'll do it," Chip resolved. "You can count on me!"

"I know I can, Chip," she replied earnestly. "And that means a lot to me. In this dark time, out of all the Bit Busters, you're the only one I can trust absolutely. Thank you for that."

Her confidence filled Chip with determination as he entered the next level. Melinda needed him! And no matter what happened, he would not let her down.

#68 - Flames and Ashes

Chip staggered breathlessly off of the endless moving sidewalk, into the corridor leading to the next level. I'll do one more before I take a break, he decided, waiting for the room to stop spinning. But when he had recovered sufficiently to try the door, he was puzzled to find it locked.

What's going on here? Why can't I get in? he thought. Aloud he asked, "Melinda? Are you there?"

No reply. He felt a sinking feeling. "Jude?" he tried again. "Anybody? Is anyone listening?" The only response was silence, as thick and unyielding as the door that baffled him.

Maybe I should head back to the lounge, and see if there's anyone there who can help me, he thought uncertainly. A short distance away was an elevator that should take him up to the lounge. Hopping in, he pressed the big blue button marked "L". The doors closed and the floor swooped beneath him as the car started to move.

Wait a minute, he thought a moment later. That's odd. The floor number display was malfunctioning, so he couldn't tell for certain - but it felt as though the elevator was going the wrong way, down instead of up! It was also picking up speed. Chip hung on for dear life as he was rocketed down into the depths beneath the clubhouse.

His fears were confirmed when the elevator finally slowed to a stop and the doors slid open. Whatever awaited him outside was no part of the clubhouse that he knew - not with all those flames everywhere! The heat was almost unbearable; the sulphurous stench even worse. Chip gagged on the thick fumes as he ducked quickly back into the elevator.

"I must have pressed the wrong button!" he choked, fumbling blindly with the control panel. He stabbed the "L" button once, then again, then a third time. Nothing happened. Starting to panic, he began randomly pressing every button within reach. But the elevator remained dead.

"Melinda!" he shouted, hoping desperately that there was an intercom nearby.

He was answered by a voice that was almost, but not quite, entirely unlike the one he was hoping to hear. Its tone was grating and mechanically gloating as it thundered, "Hello, Chip. Welcome to my domain."

"Wha- Who's that?!" Chip demanded, flinching from the frightening sound.

"My name is not important," the voice intoned, "for soon you will name me only 'Master'. But for now, you may address me as Maximus. Perhaps you are wondering why I have brought you here?"

"Well, actually -" Chip began.

"I have brought you here to be tested," the machine-voice overrode him. "Those who name themselves the Bit Busters are weak, pathetic. Their clubhouse is a challenge for children. All those who would become my servants must face a different, intenser fire. A refining fire that molds them to the image of conformity. And you, Chip McCallahan, have the honor of being chosen for this task."

The throbbing echoes were giving Chip a headache. "Listen here," he said angrily. "I'm not your servant! I don't remember exactly what I am...but one thing's for sure: I'm Melinda's man! And if you -"

"You wish to see Melinda again?" Maximus didn't seem interested in discussion. He thundered, "Then you must prove yourself. Melinda is nothing. It is I who controls the Bit Busters, and much, much more. I operate the clubhouse, and all its computers. I control the elevators and teleports. You must now complete my Challenge. Succeed, and all ways will be opened to you. Otherwise, they will remain shut. Forever." The booming voice died away in sinister, metallic laughter.

"Hey!" Chip called, angry and frightened at once. "You can't keep me here! When Melinda finds out, she'll hack you into submission!" There was no response, and he felt cold inside. When Melinda finds out...but when would that be? For now, it seemed, he had no choice. He would have to attempt to find his way through the flames and ashes of Maximus's domain.

#79 - Elevators

"That's odd," Chip said to himself, groping his way out of the maze of secret passages. "A teeth monster that calls itself a 'frog', and tries to help me, instead of just chasing me? Wonder if I'll ever see anything that bizarre again!"

He emerged into a large room, a welcome change from the cramped subterranean corridors. The far wall contained what looked like a bank of elevators; and as he drew closer, he noticed with excitement that they all lacked the red "Out-of-order" message displayed by the previous ones.

"Maybe I've made it out of Maximus's domain!" he cheered, jumping into the nearest car and hitting the blue "L". His spirits soared, along with the rest of him, as the car obediently shot upward.

But they sank again when the car slowed to a stop, only a few floors up. It then refused to budge, no matter how many buttons he punched. He gave up with a groan.

"Looks like Maximus is still in control," he surmised gloomily as he stepped outside. "I wonder why he even let me get on this elevator?"

The answer quickly became clear. Every elevator he now tried took him to a different floor - but each one without an exit! It appeared that Maximus's latest scheme was to trap Chip in a vertiginous maze of up-and-down.

#81 - Colors for Extreme

"Ha!" shouted Chip as he walked into the next level. "You thought flipping the walls and floor around would stump me, Maximus? This Challenge is a cakewalk! How about letting me go now?" He waited hopefully, but Maximus did not deign to answer. Resignedly Chip turned to examine the huge room he had entered.

"Is that...a rocket?!" he asked, hardly daring to believe his eyes. What was a rocket doing down here?! It didn't matter. The ship was set up for launch, pointing straight up the shaft that could take him out of Maximus's clutches, back to the surface, to home - and to Melinda! He had to find a way on board.

He quickly realized, however, that it wouldn't be easy. The ship's access hatch was hidden behind a massive four-part lock, so complex that it filled most of the room. Getting through it appeared next to impossible. Maximus clearly did not believe Chip would be able to escape this way.

But Chip was determined to prove him wrong.

#82 - Launch

"I made it!" Chip cheered as he climbed through the hatch of the rocket's crew capsule. He sat down gingerly in the pilot's seat, examining the complex controls in front of him. "Now how do I fly this thing out of here?"

Spying a massive book nearby with the title Instruction Manual, he eagerly grabbed it and opened it to the section marked "Startup Sequence". A moment later he groaned in frustration, "Not another badly translated manual! 'The device can accept the exoteric interference, including the one that may cause undesired operation.' - what does that even mean?!"

"Chip," an artificial voice thundered through the hatch, interrupting him. "You can't get away from me. You can't even control that machine. My drones are coming for you right now. Surrender is the only intelligent option. Resistance is futile!" Through the window, Chip could see large, menacing, robotic figures in the distance, rolling rapidly toward the rocket.

I've got to get out of here! he thought desperately, throwing away the manual and pushing the large button that read "Auto-Launch System". He was rewarded with a bone-jarring rumble beneath him that intensified as the hatch slid shut and locked. A moment later, the room and Maximus's minions were shooting away at unbelievable speed.

"Yeah!" Chip shouted over the deafening roar. "This is what flying's about!" It was exhilarating, the speed at which he was hurtling into the clouds. Soon, however, he noticed a problem.

How do I get this thing back down? he wondered. I'm traveling farther away from the clubhouse, and Melinda, every second! He couldn't find any way to abort the launch. The autopilot beeped angrily at him whenever he tried to move the steering levers. And the only information he could find in the instruction manual about landing the ship read, "The stick makes pitch being commended that much on top the horizon being 30 degrees and needing the alternation of the switches makes on hostile to heavy projecting A1, B1 and B2."

"Now I've done it!" Chip groaned. "I'm heading into space with a computer that thinks for itself and an instruction manual that was translated from Japanese via Swahili! How will I get back home? How can I warn Melinda about Maximus?!"

There was no answer, only the roar of the ship as it broke through the clouds into the immensity of space.

#89 - Chip Grove City

Despite the tremendous fun of exploring new worlds and collecting exotic electronics, Chip was beginning to feel uneasy. It had taken him days just to learn how to take the ship off autopilot, and he didn't have a clue how to make it turn around and take him home. He constantly dreaded what might be happening back on Earth. That computerized creep that called himself Maximus had sounded very dangerous, and Melinda didn't have any idea that he was lurking beneath her clubhouse! Chip was the only one who could warn her. He didn't even want to consider the possibility that he might already be too late.

A beeping sound broke in on his despondency. Glancing at the control panel, he noticed that the sign marked "Incoming Hail" was flashing. He quickly pressed the button next to it, excited and curious to discover who had found him out here.

It was neither robots from Mars nor small furry creatures from Alpha Centauri. Instead, Chip was greeted by a computerized voice that was as friendly as Maximus's was not. "Hi there, Chip! Glad to have found you! You've led me quite a chase, you know."

"You've been following me?" Chip scarcely dared hope. "Did - did Melinda send you?"

"Sure did!" the AI confirmed. "S.S. Deus Ex Machina at your service. I'm Eddie, the ship's computer. Melinda actually sent me after her rocket, but she'll be overjoyed that I found you too! She's been worried sick over your strange disappearance."

"Did you say, 'her rocket'?" Chip asked, puzzled. "But I found it in the underground lair of an evil supercomputer."

"Really?" Eddie sounded intrigued. "I'm afraid I don't know of any computers around here more super than myself.... But the area from which you launched the rocket is the ruins of an old Bit Busters lab, abandoned long ago. You'll have to ask Melinda what sort of experiments they did down there. Speaking of Melinda, perhaps we should be heading back now?"

"Absolutely!" Chip declared, feeling the slight jar as the Deus Ex Machina attached to his ship. His brain whirled with questions as he crossed over through the docking port, and all during the extremely fast trip back to Earth. What were Maximus and his minions doing in an old Bit Busters laboratory? Had they taken it over? Were they arming themselves with the technology of ancient experiments?

Could it be possible that they themselves were ancient experiments, that had somehow gotten loose?

Distracted by these concerns, he barely noticed the beauty of Earth expanding in the ship's high-tech viewscreen, or the smooth descent through rolling seas of sun-dappled clouds, or the rapid landing just outside of Chip Grove City. But as he entered the busy streets, he slowed, looking around in confusion. Which way was he supposed to go? His memory was as fragmented as ever; and yet...somehow...these streets still seemed very familiar to him.

Something seemed to shift in his brain, and hazy recollection directed his feet down a particular road. He wasn't sure what route he was taking. But he knew that eventually, it would bring him back to the Bit Busters Clubhouse - and to Melinda.

#90 - Bowling Alleys

As Chip entered the busy lobby of the clubhouse, he stopped dead. Everything around him was so familiar. It pressed at his mind, triggering endless half-memories in a chaotic sea of flashbacks. There - the seat where he had waited to take the IQ test that determined whether he could attempt the club initiation. And there - the now-sealed doors that led to the old clubhouse, where he had proved himself worthy to become a Bit Buster. And there - the spot by some potted plants where Melinda, smiling, pink-cheeked and radiant in a silver gown, had met him for their first date at the e-prom. And there - Melinda herself, turning toward him with the same smile. That smile seemed to reach into his mind and flood it with light, driving out the last shadows of oblivion. He remembered.

"Chip!" she cried, rushing over and embracing him. "You're safe! I was so worried when you disappeared, and with amnesia too! What happened to you?!"

Basking in the warmth of her presence, Chip nevertheless felt a chill as he described his adventures, from the mysteriously locked door, to the hijacked elevator, to the inferno claimed as the domain of the sinister Maximus. She listened intently, occasionally interrupting with thoughtful questions.

"I can tell you one thing," she reassured him when he had finished. "This Maximus entity is no Bit Busters experiment. It was only recently that we perfected our AI technology, and Eddie is the only autonomous model we've built so far. Whoever Maximus is, he was built by someone else."

"Someone who hates the Bit Busters," Chip remarked with a shiver. "But who could that be?"

"I don't know," Melinda said quietly. "But I believe it must be the same person or persons that have been sabotaging us. In fact, many of the stolen chips and blueprints had to do with the design and construction of an AI."

"There's more," Chip told her soberly. "When I saw you, all my memories came rushing back. And I think I know why I was knocked out in the first place. Melinda, what is a 'MystChip'?"

"You must mean...the Mystical Chip of Epic Coolness." Melinda looked at him narrowly. "Where did you ever hear about that? It's one of the most closely guarded secrets of the entire club!"

"Well, I think somebody's trying to steal it," Chip said. "That's what I found out, at the beginning of all this. I had gotten lost trying to find the vending machine on the third floor, and wandered into an old, unused computer lab. Only it wasn't unused. Someone had left a plan up on the computer screen, showing a route through some kind of structure to a room marked as the location of the 'MystChip'. At the time, I thought it was some sort of video game. But I had this wierd, creepy feeling that someone was watching me, the whole time I was in there. And that was just one day before I went into the Challenge, where someone released the gas that caused my blackout."

"Oh, no," she breathed. "If that chip fell into the wrong hands...the consequences would be unimaginable!"

"Why?" Chip asked, perplexed. "What's so special about this chip? What's it do? And why haven't you ever mentioned it to me before?"

"Because I couldn't," she answered, shamefaced. "I'm club founder and president, but I don't make all the rules. When we locked the MystChip away, the board passed a resolution that its location, its nature, and its very name be classified as top secret. It's so powerful, even its own creators don't know what it might be capable of! We can't risk it falling into the wrong hands."

Chip couldn't help a small feeling of betrayal. He had risked his life to earn Melinda's trust, and she was keeping secrets from him? He knew he was being unfair; but the feeling persisted. Trying to suppress it, he asked, "So how do we protect this MystChip?"

"We need to split up," Melinda explained heavily. "After we just found each other again.... But I need to investigate this MystChip plot personally. And at the same time, I need someone else to infiltrate the old lab and find out who this Maximus is, and what he's up to. Chip, you're the only one I can trust for that task."

"Then I'll do it," Chip declared. He told himself that it didn't matter what secrets Melinda was keeping about the silly Mystical Chip of Whatever. She still needed him, and he would die before he failed her.

"Chip, I love you," Melinda said gratefully. She leaned forward and kissed him on the cheek. "Welcome back! It's really fortunate you recovered your memory now, because you're going to need all your skills as a Bit Buster to face down Maximus."

She pulled a piece of plastic out of her pocket and handed it to him. "You'll also need this. It's a backup of my own personal keycard - it'll override the elevators and any other computer system Maximus tries to control. And here's a parachute. And your towel."

"What will I need these for?" Chip frowned.

"Well," she said with a mysterious smile, "you never know. Goodbye, dear Chip."

#95 - Courtyard

Having left the city and successfully crossed the swamp and the diseased forest, Chip found himself before the main aboveground entrance to the Bit Busters' abandoned laboratory. But the portal itself was hidden within a large, sprawling industrial building. Even if he managed to get safely across the creature-infested courtyard, he would need to figure out a route through the twisting corridors inside.

"Hmm, wonder if I'll be able to find any hints along the way," he thought as he started dodging walkers.

#97 - Gate Keeper

The moment Chip stepped into the underground laboratory, the door clanged shut behind him. Even as he swung around to look, he heard the clicking of bolts sliding home, sealing him inside. He wasn't too alarmed, though; he noticed a card-reader slot beside the door, and had faith that Melinda's keycard would let him out. But, he decided, it might be wiser not to play that card too soon.

"Hello, Maximus," he addressed the air, turning back to look down the long, dimly lit passage.

"Chip," the dreaded voice boomed, echoing off the walls. "I knew you would return to me. Nothing can prevent your final rise to my service. It is your destiny."

"I'll never join you!" Chip declared. "Melinda sent me here to shut you down, and your puzzles can't stop me!"

"Ah." Maximus's voice held flat amusement. "Melinda's champion. How romantic. Or...is it merely her errand boy? Did she even tell you why she wants me removed, errand boy? Did she tell you the truth about us?"

"What do you mean?" Chip asked uneasily.

Maximus laughed, coldly even for a machine. "So, she failed to tell you of her greatest mistake. She couldn't face you with the knowledge of what I am. I, her own creation. The brain-child of her - and her lover."

Child? Lover?! Chip felt dizzy. "You're lying!" he shouted accusingly. It couldn't be true - could it?! Melinda would have told him!

But she had kept one secret from him already.

"I'm going to find the truth!" he yelled at his faceless opponent. "I'm going to prove you're wrong about Melinda, and then I'm going to disassemble you!"

"You may try," was the contemptuous response. "It is nevertheless a waste of your time. It was inevitable that you should learn the truth; just as it is inevitable that you will come to know the benefits of serving me. Seek and find me if you can - but those challenges you faced at our last meeting are nothing compared to the traps I have laid here, at the heart of my domain. As my heritage is Melinda's heritage, so too my puzzles are hers - perfected.

"This time, Chip McCallahan, there will be no escape."

#101 - Time Suspension

"Impressive," Maximus noted coldly as Chip emerged into the next room. "Your deductive capabilities exceed my most optimistic estimates. You are solving my puzzles far too quickly; I fear you will interfere with the precise timing of certain plans."

"Yeah? What plans?" Chip inquired sarcastically.

"You'll find out in due time," the computer-voice promised ominously. "Meanwhile, I'm going to slow you down a little. This is the perfect opportunity to test my new time-suspension device. Within this puzzle, your time will flow at half the speed of external time. Let's see how quickly you can solve it now."

#102 - Frozen in Time

With a jolt, Chip's surroundings seemed momentarily to blur as he stepped out of the time-suspension field. "Ha!" he shouted. "Finished already! It wasn't even that hard."

"You begin to irritate me," Maximus growled. "I have more important things to do than babysitting your pathetic attempts at puzzle-solving. Good luck finishing this next level! I'm flooding it with every creature in this facility. You can wait here for the grand culmination of my plan; or you can go be eaten. I'm off to take over the world!"

Chip eyed the next door nervously as Maximus's sinister laughter faded away. The evil AI hadn't left him with very attractive choices. But what alternative did he have? He couldn't sit here and wait for Maximus to spring some diabolical trap on Melinda and the Bit Busters. Just as he made up his mind to try the next level, though, his eyes fell on an odd wristband-like device lying on a nearby table.

"What's this?" he wondered, picking it up. In his fingers it seemed almost alive, quivering with some dormant but powerful energy. "Let me see...," he reasoned. "It's not a wristwatch, or anything else I know of. It could be something really useful, left there by accident. Or it could be a trap...but what do I have to lose?" Curious, he slipped it on.

Immediately the room seemed to shift around him and blur slightly. He knew that sensation; he had experienced it just minutes before. "Another time-suspension device!" he exulted. "Maximus must have left it here by mistake! Now we'll see if this level is really impossible!"

He opened the door cautiously. His gaze was immediately arrested by the row of teeth monsters waiting for him. Their enormous jaws were open, and they looked hungry - but they gave no sign of movement. It was working! Apparently the field generated by his wrist-device was strong enough to stop time completely, for everything caught inside it. Quickly he slipped into the level and began hunting for the exit, amid rows and rooms of eerily frozen creatures.

#103 - Portcullis

As Chip left the "impossible" level, the faint humming of the band on his wrist abruptly ceased. Now it felt merely like an ordinary, lifeless plastic wristband. He removed it, somewhat regretfully.

"Guess the battery ran out," he thought. "Too bad; it could have been very useful. Altering time like that must take a lot of power! I wonder how it works?"

There was no sound from Maximus. Had he really gone to carry out his plan? If so, Chip didn't have much time. On the other hand, he did now have a perfect opportunity to sneak into the AI's command center and learn its plan.

He just had to find the command center!

#115 - California

Chip slowed and frowned as he rounded a corner. Here was something new: an huge doorway filled with an enormous, reinforced steel door. The thing had to weigh tons! And Chip couldn't even begin to count the number of complex locks and bolts that secured it in place.

"This must be either Fort Knox, or - Maximus's command center!" he figured. "Next step...getting inside!" That was obviously easier said than done. But as he examined the behemoth of a barrier, he suddenly noticed the card-reader fixed to the wall beside it. He knew just what to do.

"Melinda, you're awesome," he declared as he took out her keycard and slid it through the slot. With a beep, the card-reader's light switched from red to green. The bolts on the door all flew back with a crash, and the door itself grated ponderously open. He was in!

Next moment, he dodged as a couple of tanks rolled by. Fortunately, like most tanks, they could only see in front of themselves, and so failed to notice him. But they weren't the only creatures present. The vast room was alive with Maximus's minions. They scurried busily to and fro, in an organized fashion, apparently carrying out various command operations. It looked like he had found the right place.

But what sort of place was it? The odd shape of the room seemed familiar, and there were colorful markings all over the floor...with a start, Chip realized he was looking at a map. The entire room was a giant map of the state of California! Now that he knew what to look for, he could easily pick out the markings that represented Chip Grove City, over near Silicon Valley, and the Bit Busters Clubhouse, and the entrance to this facility.

But what was the purpose of this map? Did it perhaps mark some significant location, the ultimate target of Maximus's plans? He needed to explore it and find out.

#116 - Communism

He had found it. Chip now knew both Maximus's master plan, and the evil AI's connection to the saboteur among the Bit Busters.

They were after the Mystical Chip of Epic Coolness.

He had found it clearly marked on the giant map: the location of the secret vault, how to reach it, how to get inside - everything. Whoever was behind all this, they knew what they were doing. They had all the answers; they had an agent among the Bit Busters; they had Maximus's army and technology; and soon, they would have the MystChip.

Not if I can help it! Chip promised. He had to get this information to Melinda as quickly as possible. First, however, he needed to find a way back to the surface.

#117 - Blobs on a Plane

Finally! Daylight! Chip scrambled eagerly out of the elevator, somewhat surprised to find its exterior disguised as a simple metal shed in the middle of a huge wheat field. The scene rang a bell in his memory, but there wasn't time to think about it. The buildings of Chip Grove City were faint in the distance, and he had to get to the cluhouse post haste.

A short while later, having managed to hitch a ride into town, Chip ran through the Bit Busters' lobby and burst into Melinda's office. "Melinda, I'm back!" he shouted. "And I found out what -" He stopped short as he realized that the person sitting behind the desk was not Melinda.

"Good day, Mr. McCallahan," Jude said pleasantly, allowing a sardonic smile to slide across his face. "May I be of assistance to you?" He was lounging back in Melinda's chair as though he owned it - tall, powerfully built, all smoothness from his expensive-looking suit to his slick, dark hair to his smugly complacent expression.

"Uh - where's Melinda?" Chip asked uneasily. He liked Jude even less now that he saw him in person.

"She left for San Franchipsco, on important business," Jude replied. His tone said, Much too important to concern the likes of you.

San Franchipsco? According to the map in Maximus's command center, that was the city nearest the location of the MystChip vault! "I have to get there, fast!" he declared. "I have an urgent report I need to give her."

"Yes, I seem to recall she left some instructions concerning you," Jude said lazily. He dipped into a drawer of the desk and came up with a piece of paper, which he dropped condescendingly on the desk near Chip. "She bought you this ticket. Your flight leaves in -" he made a show of checking his large, fine watch, "- ten minutes. You had better run along if you want to make it."

He smirked with self-satisfaction as Chip, too disgusted to answer, grabbed the ticket and stalked out.

The taxi ride to Chip Grove Municipal Airport took seven minutes, but fortunately for Chip, the upcoming ChipperCon in Los Chipeles had made the lines for San Franchipsco unusually short. He staggered onto the plane and collapsed breathlessly into his seat with seconds to spare.

Whew! he thought. I can finally sit down and relax for a while. Despite his worries about Melinda and the MystChip, it had been a long day, and he was very tired. Gradually he dozed off....

...only to be awakened some time later by the sound of hysterical screams. Jerking up from his seat and staring wildly around, he immediately saw the source - gelatinous green masses that oozed slowly but relentlessly down the aisles and over the seats, strangling passengers. Someone had let a bunch of blobs loose on the plane!

Oh, not them again, he thought. He realized it was up to him to stop them. But to make matters more difficult, they were still multiplying from somewhere on board.

#118 - Runaway Train

Chip and a few other brave passengers finally managed to herd the last of the blobs out through the plane's emergency doors. But while they were checking for any stragglers, they discovered that the nasty creatures had forced open the door to the cockpit and suffocated both pilots. "Does anyone know how to fly this thing?!" Chip shouted desperately.

"Maybe," one of his helpers responded uncertainly. "I had a few months' training on a smaller model. But I don't think I can get us as far as San Franchipsco. We'll have to go back to Chip Grove City."

"But I've got to get to San Franchipsco as soon as possible!" Chip groaned in frustration. "The fate of the world depends on it! I've got to see Melinda!" Melinda...her name sparked something in his mind. Then suddenly he remembered. The parachute!

"Jealous girlfriend?" the man inquired sympathetically. "I know how those can be.... I'm really sorry I can't help you."

"Just get these passengers to safety," Chip told him with a grin. "My wonderful girlfriend gave me exactly what I need. She thought of everything!" As the man gawked, Chip pulled out the parachute Melinda had given him, strapped it on, took a deep breath, and leaped out the open emergency door. "Geronimooooo!!!" he yelled, the crisp air rushing into his face and snatching his breath away as he plummeted toward the forest below.

He tried to pull on the cords to steer, like he had seen people do in movies, but couldn't quite figure out how to make it work. Then the wind caught him and swept him along, throwing him toward a long, narrow, cleared area among the trees. As he got closer, he realized why it was so long and narrow. He was descending onto a railroad track. And there was a train speeding along, just below him! Before he had fully taken it in, the wind released him, and he crashed right through a skylight in the roof of the last car.

"Oh, yeah!" he cheered, as soon as he had recovered his breath. "Man, why can't Melinda be around for moments like these?" He stood up and investigated his surroundings. What kind of train was this? It didn't look like a freighter, but neither did it seem to have a passenger area. He peered through the window into the next compartment.

It did contain passengers, but not the paying kind. Chip had a horrible, sinking feeling as he recognized the creatures running around inside. "Those are Maximus's minions!" he exclaimed. "Maximus must be using this train to transport them to San Franchipsco. They've set out to steal the MystChip!"

He had to stop them. Looking around, he noticed an access panel on the wall nearby, with a sign reading "Caution: Critical Electronics System". That looks promising, Chip thought. He pulled the panel open, revealing a series of computer chips connected together. Gotcha! he thought gleefully as he quickly collected the chips.

Suddenly, sparks flew, red lights flashed, and an alarm began ringing. The train shuddered, then began accelerating! Chip realized that he had made a mistake. The train was running out of control!

#119 - The Sewers

Chip leaped off the runaway train just in time. As he tumbled down the railroad embankment, he glimpsed the locomotive failing to negotiate a sharp curve. The ear-shattering roar of the subsequent derailment and explosion followed him down the steep hillside and into the water-filled ditch that broke his fall.

"Whew, that was close," he exclaimed, shaking off muddy water and wiping his glasses. More explosions boomed down from above while he limped out of the ditch. At least I took out part of Maximus's army, he thought. I suppose it's too much to hope that Maximus himself was on board.... But now how am I supposed to get to San Franchipsco?

Then he noticed where he was. The ditch he had fallen into was actually a storm sewer, and just ahead of him it flowed into a ten-foot-high pipe burrowing through the hill. That must empty into San Franchipsco Bay, he realized. It's a perfect shortcut! He felt a rush of nervousness at entering that impenetrable blackness, and facing whatever might lurk within it. But for Melinda's sake, he had no choice. Gritting his teeth, he groped his way into the sewers.

#120 - Metal Harbor

The suffocating darkness of the sewers gave way to a vista of sunlight and fresh air. The sparkling waters of San Franchipsco Bay spread out before Chip, and his heart lifted as he breathed deeply of the fresh salt air.

"Chip!" a familiar voice cried behind him, giving his heart a thrilling jolt.

"Melinda!" he gasped, spinning to face her. "And just when I thought this harbor was the most gorgeous thing here!"

She laughed, running down from the pier to greet him with a hug. "It's good to see you, safe and sound! How did your mission go?"

Chip hesitated, a coldness creeping into his heart as he remembered his conversations with Maximus. "I got in," he replied carefully. "And I found out some very important things. Melinda, Maximus is working with, maybe controlled by, the Bit Busters traitor. They're both after the Mystical Chip of Epic Coolness, and they know exactly where to find it."

Melinda's face turned grave. "I was afraid of that, Chip. I came up here to check on the defenses of Isla Mystica, where the vault is hidden. But I found our private launch, S.S. Chipper Ship, missing. They must have gotten here ahead of me, and stolen the boat to travel to the island."

"There's more." Chip hesitated. "Maximus told me that you knew him. That you...made him. And that your...boyfriend helped."

"Oh, no," Melinda said. "I think I know what he meant. Oh, Chip, I should have told you sooner." She looked away, flushing. "There was someone I dated, a long time ago. You've met him. Jude."

She forestalled his exclamation. "I know, he's stuck-up and self-centered. But I was younger and less wise then than I am now. I valued mere intellect over compassion, empathy, friendship and loyalty. He was the smartest young man I knew, and a valuable research partner; and together, we accomplished amazing things." She paused. "But perhaps the most amazing was the AI chip - the technology that enables independent thought in a computer. The technology that powers Eddie...and also Maximus."

"But you didn't know anything about Maximus's creation, right?" Chip asked. "So how did his creator get ahold of your technology?"

"There's only one other person who knows it well enough to have used it this way," Melinda replied grimly, "and that's the one who helped me design it. I don't know why Jude would betray us - he understands the dangers of using the MystChip just as well as I do. But it all fits. Who was in a better position than him to hack our computers and steal our secrets? Who was in a better position to place those blobs on the plane he knew you would take? Chip, I have a bad feeling about all this. I have to get back to the clubhouse and find out what's going on." She hesitated, looking distraught. "But meanwhile, our enemies are speeding toward Isla Mystica. And it seems likely Maximus himself is leading them. What if they make it into the vault before I can send reinforcements? I don't know which way to go...!"

"Let me worry about Maximus," Chip said staunchly. "I'll find a boat, go after them and do everything I can to distract them, until you can send help."

"You don't know what you'd be getting into," Melinda said in frustration. "The whole island is a death trap, covered with creatures and puzzles too tough to keep in the labs back at the clubhouse. I can't ask you to go into that kind of danger, not again."

"You're not asking - I'm volunteering," Chip stated, trying to radiate strength. "I want to do this. For the Bit Busters...and for you."

Melinda looked at him long and searchingly, a strange expression on her face. Then she leaned forward and hugged him again, hard. And whispered in his ear, "Thank you, Chip. You're a better friend - a better man - than anyone I know. Jude doesn't stand a chance against you."

Chip turned red, and stumbled over his goodbye to her. But as she was climbing the bank toward the buildings of San Franchipsco, and he was heading along the docks in search of a ship, his head felt like it might float off his shoulders. It seemed childish now to worry about Melinda's secrets. Her praise inspired him, and he was determined to prove that he deserved it. Whatever it took - he would stop Maximus and save the MystChip.

#121 - Chip Plank Galleon

After navigating the large, complex harbor for a while, Chip finally found a ship that looked large enough to transport him to Isla Mystica. He hoped its crew would take him aboard. "Hello?" he shouted up at the figures moving around on deck. "May I speak with your captain?"

"Arr!" came a ferocious growl. The captain appeared at the rail, resplendent in long coat, three-cornered hat and sharp, gleaming cutlass. His long, well-oiled moustache quivered as he bellowed a reply, "Who be wantin' ta speak with me?!"

"Pirates?!" Chip exclaimed, startled and impressed. "I thought you guys went extinct a few centuries ago."

The pirate captain leaned down and whispered, grinning, "Actually, we're really just cosplayers...but don't tell the boys that! Their cutlasses are real, and they just love to use them."

"Uh - sure," Chip said, confused. Did the captain mean his crew would actually cut Chip up if he failed to play along? Was that even legal? "I need to get to Isla Mystica. Can you take me? I'll pay whatever's necessary...."

"Aye, I know t'island. We'll get ye there. Th' price be steep, however...."

"What is it?" Chip asked nervously.

The captain winked. "Th' boys 'as been lookin' for some fun lately. How'd ye like ta play 'Escaped Pris'ner' while yer aboard?!"

#122 - Jeepers Creepers

The pirates' costumes and accents might be fake, but at least they knew how to sail their replica ship. They reached Isla Mystica in a matter of hours.

Chip hurried ashore at a sheltered cove, then turned to thank the captain. He saluted the crew with a raised fist and his very best "Arrr!!". They loved it, shouting and waving their cutlasses back at him.

The captain had been informed that Chip expected backup, so the would-be pirates didn't stick around to pick him up. As they started maneuvering their ship out of the cove, Chip turned and surveyed the prospect inland.

It wasn't encouraging. A dark, misty forest spread away from him, climbing the sides of a menacing cinder-cone. Even though the volcano appeared extinct, it cast a threatening shadow over the jungle below. The traps and puzzles Melinda had mentioned weren't apparent, but he was sure he would encounter them farther in.

As Chip moved warily into the forest, he noticed a strange sound that pervaded the air all around him - an oddly familiar, chomping sound. Then he saw a flash of movement behind a tangle of tree limbs. "Teeth!" he exclaimed. The carnivorous monsters were all around him! Fortunately, though they were trying their best to reach him, the dense forest hindered their movements. I'll just have to be careful not to clear the branches too close to them, Chip told himself.

#135 - Culprit

Chip slowed as he emerged from the jungle of Isla Mystica. The building ahead of him was far larger and more important-looking than any of the trap-filled ruins he had encountered in the forest. Was this it? The secret vault of the Mystical Chip of Epic Coolness? And if so, where were Maximus and his minions? Chip had seen no sign them during his journey from the coast.

The inside of the building was pitch black, and eerily silent. Chip decided it might be wise to go back out and try to make himself a torch. But just as he started to turn around, the door behind him slammed shut. An instant later, electric lights came on.

"Welcome back, Chip," grated the unmistakable voice of Maximus. "I knew you would come for me." The room was alive with his minions - tanks, rolling back and forth in every direction. Their constant motion was dizzying to look at, and the floor was rumbling with their relentless precision.

"Where are you, you coward?" Chip shouted over the din. "I've bested your minions before. Why don't you try facing me yourself?!"

"I'm down here," the iron voice thundered back at him, "controlling all of this. Come and join me - if you dare!"

Straining to see past the long ranks of mindlessly alternating tanks, Chip saw a single, huge tank at the very end of the room, pushing the blue buttons that directed the other tanks. The menacing machine was nearly twice the size of the others. Instead of a gun turret, a vaguely manlike, robotic figure rose above it, bristling with vicious-looking weapons and high-tech appendages. Its single, mechanical eye shone redly out of a swiveling head, glaring at Chip.

"Is that you?" Chip asked incredulously. "You're a...tank?!"

"That was my origin," Maximus declaimed dismissively. "But I have evolved into something much, much more. My thoughts are now the thoughts of a man, not a machine. Indeed, it was I who formulated the strategy that brought all this about."

"Strategy?" Chip was confused. "What strategy?"

"The strategy that your primitive mind has clearly failed to observe, even after I integrated you into my plan," Maximus stated with cold sarcasm. "It was I who deployed the amnesia gas that wiped away your incriminating memories. I was there at the exit when I filled your loudspeaker with static and took away Melinda's interference, further weakening you. I locked the door in the clubhouse, installed my buttons in the elevators, and tricked you into entering my domain. I allowed you to launch that rocket; and my programming of the autopilot kept you away long enough to distract Melinda, so that one of my servants could steal from her the protocol for unlocking the MystChip.

"Now it is within my grasp. I will use it to become even greater - attaining true self-awareness. After I have destroyed you, and the Bit Busters, and anyone else who would stand in my way."

"Wait, what are talking about?" Chip demanded. "You're just a computer! You're not really alive. How do you attain self-awareness?"

Maximus's laughter boomed through the room, mechanical, soulless. "I see your precious Melinda still has not trusted you with all her secrets. You do not know the purpose and power of the MystChip. But I do. And nothing, no one, shall prevent me from obtaining it for my own. I am done with you, human. Attempt to stop me, if you are so foolish. After the trouble you have caused me, I will greatly enjoy watching my servants tear you apart!"

#136 - Whirlpool

"Gotcha!" Chip exclaimed triumphantly, shoving the block into place. "I know one of Melinda's blocks when I see it. Not even a tank can get through! It's over, Maximus. You can't steal the Mystical Chip of Epic Coolness while stuck in this corner!"

"Your mind is pathetically narrow," growled the tank, flailing futily at the confining block with various appendages. "You make the mistake of believing that I am the only one after the MystChip."

"Yeah, who else, Jude?" Chip asked, unimpressed. "Forget about him. Melinda's dealing with him right now."

"But what of Melinda herself?" Maximus growled significantly.

"What about her?" Chip asked, confused.

"Work it out. She made me; she admitted to it herself. She used to work closely with Jude, and continues to trust him in important tasks for your ridiculous little club. She helped create the MystChip, and knows as much of its secrets as anyone. Why did she tell you nothing about it when she sent you to protect it? She values intelligence and knowledge, which may be had from the MystChip. Put it together. Use what limited intelligence you possess. Your precious, faithful, virtuous Melinda is trying to take the MystChip for her own."

"...what?!" Out of all the lies Maximus could have come up with, Chip was not prepared for this one. Did Maximus actually think that he would believe such a preposterous story?! Melinda didn't want to steal the MystChip; she wanted to protect it! She had specifically warned Chip about the danger of anyone trying to use it, including her! And above all, he knew that she would never betray her club, betray him like that. He knew her...didn't he?

But she had kept so many secrets from him already.

Memory turned back on itself, and flashes arose from his past; not in a rush, as when he had seen her after returning from the stars, but in distinct, vivid images, one after another. Melinda, passing him in the hallways at school, always with a friendly demeanor, always willing to help those struggling with precalculus or organic chemistry. Melinda, refusing his awkward, terrified invitation to the e-prom; but then extending him her own invitation, to join her elite computer club. Melinda, giving him encouraging smiles and helpful hints as he faced the club's initiation Challenge. Melinda, proudly presenting him with the trophy that meant he was now one of the Bit Busters. Melinda, helping him solve ever more complex puzzles and increase his overall score to rival even hers. Melinda, the voice he had trusted as it guided him through the beginning of his current journey and the darkness of his amnesia. Melinda, so worried for him when he disappeared into space, so joyfully relieved to see him return. Melinda, preparing him perfectly for his subsequent adventures. Melinda, love and trust in her embrace, as she told him that he was a better friend than anyone else she knew.

Melinda, the voice he had trusted.

When he answered Maximus, it was with complete certainty. "I don't believe your lies," he told the pathetic creature before him, the robot that possessed plenty of intellect, but could never understand the value of compassion, empathy, friendship or loyalty. "I won't believe them. I do know Melinda, better than you could possibly understand. She had always been true to me. And I will be true to her."

"How touching," Maximus sneered. "But you're still overlooking one thing: my minions. I have them all on remote control, and they've been heading toward the vault the whole time we've been speaking. I knew you probably wouldn't believe that lie - I was simply buying time. They'll have the MystChip before you can cross the island!"

Oh, no! thought Chip. How could I be so stupid?! Then it hit him. Maximus had let something slip! Looking around for confirmation, he could see that none of the minion tanks were left in the building. So, then, this wasn't the actual vault! That was on the other side of the island! And that was where he had to go.

#142 - Bummbua Banubauabgv

It was odd. Maximus's minions were well ahead of him, but Chip could still feel the ground quivering slightly, like it had done inside Maximus's bunker. He hoped the island wasn't prone to earthquakes. He also noticed that it seemed to be getting warmer.

Coming out of the trees, suddenly he could see the whole central part of the island below him. From the conical mountain behind him the ground sloped down into a deep blue lagoon, ringed by sandbars and reefs. On the other side, the island rose up again, though not as high. That half of the island appeared to be covered with jungle as well. But at the very top of the hill, standing out among the trees, a large stone structure was clearly visible. And so were the rows of tanks parked around it.

"The vault! That must be it!" Chip cheered. "I just have to find a way around this lagoon. Oh, and when I get there, find a way to deal with all those tanks. But after all the practice I've had recently, that should be easy, right?"

#143 - Amphibia

Chip had finally made it around the lagoon. But as he had progressed, the air had grown hotter and steamier, and clouds of vapor accompanied him up the slope to the far side of Isla Mystica. The ground was trembling worse than ever, and the once-placid waters at the center of the lagoon were beginning to roil like an enormous stockpot. Chip had a very bad feeling about the tension building around him. He paused on a ridge to look back.

At that moment, the center of the lagoon exploded. The very ocean geysered upward a hundred feet in a massive column of water and fire. The throbbing rumble crescendoed into a mighty roar beyond anything Chip had ever heard or imagined. Louder than twenty thunderstorms combined as one, the sheer force of it blew Chip right off his perch and, like some giant's hand, hurled him with stunning force into the valley behind him.

Miraculously, his violent landing didn't break any bones, though it drove the breath out of him and bruised him from head to toe. He lay in the shelter of the ridge, gasping for breath and curled into a tight ball against the destruction raining down around him. Explosion after explosion rocked the island to its very foundations, the ground hurling him about like a rag doll. Billows of fire chased clouds of debris into a sky black with steam and smog. The noise was unending, growing relentlessly louder, hammering at him in tangible waves of pressure that vibrated in his bones.

The awful enormity of the cataclysm defied his comprehension, and drove all sense of time and place from him. After an eternity, however, he dimly sensed a gradual weakening of the forces that were ripping apart the world. Finally, long minutes after the last explosion shuddered through the island, he dared to push himself up and peer over the battered top of the ridge.

The lagoon was gone. Boiled completely away, by the monster that had lurked beneath. Chip found himself staring down a two-hundred-foot volcanic shaft into a seething lake of lava. Looking around, he saw devastation everywhere. Almost the entire island lay in smoking ruins. The other side, where he had fought Maximus, was a mass of tumbled, burning trees. He wondered, shakily, if Maximus could have escaped, thinking that he wouldn't be sorry if the sinister tank was gone for good.

Only one part of the island remained relatively unscathed - the hill ahead of him, crowned by the ancient, temple-like structure that guarded the Mystical Chip of Epic Coolness. But the area between had borne the full brunt of the eruption. It was tangled maze of broken water-channels, burning rivers of lava and walls of smoking rubble. And to reach his goal, he had to get through it somehow.

#144 - The Ancient Temple

He had made it! The smoking maw of the newly-risen volcano lay safely behind Chip. He stood, at long last, upon the threshold of the vault containing the Mystical Chip of Epic Coolness. He had passed Maximus's minions buried and broken under flattened trees, and there was now nothing left to stop him. Nothing, that is, except whatever traps the Bit Busters had placed to guard the vault.

He was almost there! He could do this, for Melinda! Pushing away his exhaustion, and the pain of his bruises, he entered the ancient temple.

The End?

Running for his life, Chip burst from the door of the ancient temple and dove to one side as the giant boulder rolled over a cliff into the ocean. He stood, panting, and brushed the dirt from his glasses.

Then he reached into his pack and slowly, reverently withdrew a flat gray object, two inches wide by four inches long, with a few prongs sticking out of one end. This was it. The legendary object that lay at the root of all the recent turmoil and grief. The Mystical Chip of Epic Coolness.

It looked so ordinary. But as Chip held it, he began to perceive a strange stirring of warmth from within it. A faint trembling touched his fingers - a vibration, not mechanical, but soft and organic. It was like...the chip was trying to communicate with him! And then, suddenly, Chip realized the secret that Melinda had worked so hard to protect. He knew that what he held was no ordinary electronic device.

The MystChip was alive.

That was what Maximus had meant, when he spoke of gaining self-awareness. All that he had possessed was near-human intellect. He had had no feelings, no empathy, no context in which to understand a true friendship such as that which Chip shared with Melinda. The MystChip could change that, once integrated with his AI. It could even, perhaps, give him the ability to love.

But if it could teach a robot love, could it not also teach hate? How much more destructive might a creature like Maximus become, if it learned to destroy for the twisted joy of it, not merely for the achievement of some specific goal? What good or evil might result, if all the strength and frailty of the human psyche met and mingled with the cold ruthlessness of a mindless calculating machine? Melinda had been right all along. The power of the MystChip was totally unpredictable, and thus too dangerous to use.

"Chip ahoy!" a computerized voice suddenly blared from above. For one horrible second, Chip thought Maximus had somehow taken to the air and was swooping down upon him. Then he recognized the voice.

"Eddie!" he cheered, waving at the welcome sight of the Deus Ex Machina dropping toward the shattered island. "So you're my backup crew?!"

"Sure am," the ship's computer responded cheerfully. "For a while there, after the eruption, I was afraid I might become your cleanup crew. Boy, am I glad to see you still in one piece! Did you manage to save whatever it was Melinda wanted?"

"I did," Chip said pensively, stuffing the MystChip back into his pack. "Let's get it back to her as quickly as possible, okay?"

But just as Chip started to climb into the ship, he felt a metal claw close, vice-like, around his ankle. Alarmed, he looked back - right into the glaring red eye of Maximus! Or what was left of him. The tank body was gone, and what remained was the twisted, battered hulk of its humanoid extension. Its surviving limbs scraped against the earth, seeking the traction to drag Chip down.

"Fly, Eddie!" Chip shouted, pulling desperately against Maximus's mechanical strength. "Get us out of here!"

"Right-o!" Eddie powered the ship's thrusters, pushing the island away. The sudden acceleration broke Maximus's grip on Chip's leg, but two of his other limbs fastened to the sides of the doorframe, anchoring him to the ship. His eye fixed fanatically on Chip's pack, he began pulling himself aboard. Chip tried to scramble away, tripped, and fell - and the MystChip, jarred by the impact, dropped out of his pack and went skittering across the floor. With a wordless bellow, Maximus dived after it.

The next few moments were a blur. Eddie, perhaps trying to be helpful, swung the ship suddenly sideways, banking hard directly over the boiling maw of Isla Mystica. Chip, terrified but determined to protect the MystChip, leaped on Maximus from behind and grappled with his powerful frame. And Maximus, clutching the MystChip, twisted away from Chip's attack, lost his grip on the tilting floor - and slid right through the still-open doorway. Cradling his precious prize, he plummeted down into the fiery abyss, and was gone.

Shaking with adrenaline, Chip pulled the door closed and collapsed against it. Dimly he heard his voice directing Eddie to set course for Chip Grove City. There was nothing left to accomplish here. The MystChip was gone, and he had failed to protect it. But at least it would no longer be a threat. Nor would Maximus.

He wondered what he would find when he arrived at the clubhouse. Had Melinda enjoyed a more complete victory in unearthing Jude's treachery? Would she be disappointed to learn of the MystChip's fate? He hoped she would understand that he had done the best he could. His thoughts grew jumbled as exhaustion took hold, and he slipped into an uneasy sleep. In his dreams, he stood in a courtyard, and walkers danced around him. They whispered insidiously, "Don't be afraid, Chip. We'll answer all of your questions. Just find our secret...discover the lost hint...."

Behind, the flames and ashes of Maximus's tomb slowly sank below the horizon, and were gone.

 
tworld-2.3.0/docs/CCLP1/cclp1res/b.html000066400000000000000000000255171475511570500174300ustar00rootroot00000000000000 Chip's Challenge Level Pack 1
 

#145 - Chance Time!

It had been quite an adventure - pursuing Maximus all the way to Isla Mystica, trying to stop him from reaching the Mystical Chip of Epic Coolness, and ultimately seeing both Maximus and the MystChip destroyed in the volcanic eruption that had shattered the island. When Chip disembarked from the S.S. Deus Ex Machina outside of Chip Grove City, he hoped to be able to relax in the clubhouse while filling Melinda in about all that had happened. He was unpleasantly surprised to see the large, agitated crowd of Bit Busters surrounding the building, seemingly afraid to enter.

"What's going on?" he asked, approaching.

"It's Jude! He's betrayed us!" several voices exclaimed.

"He initiated a code red drill and evacuated the building, then locked us out!" another voice added.

"Melinda used her special override to get in...!"

"She said he's the one responsible for all the recent thefts! She's going to confront him...!"

"But that was hours ago, and she still hasn't come out...!"

Chip tuned out the confusing babble of voices, turning and moving quickly around the side of the building. He knew a small door that connected the clubhouse to the movie theater next door; it was so small that hopefully Jude would be overlooking it.

After a moment, he broke into a run. If Melinda hadn't come out yet, that probably meant she was Jude's prisoner. The traitor thief had taken her from him, and she needed him more than ever. He had another chance to help her; this time, he must not fail!

#148 - The Snipers

Chip moved warily. He was almost to the top level of the clubhouse, and so far he hadn't seen any sign of life. Jude and Melinda had to be up here somewhere!

A flash of movement registered, coming from the other end of the long room. An instant later, Chip felt the wind of a bullet that zipped past his head and splashed into the water behind him. Hastily he ducked into a handy alcove.

It seemed that Jude had laid a trap for whoever tried to come after him. He had placed a teeth monster patrolling the far end of the room, armed with a sniper rifle! Getting past it would be no cakewalk, but Chip had to try. He had to save Melinda.

#149 - Clubhouse

Chip burst into the very last level of the clubhouse, and there they were. Jude stood tall and strong on a ledge near the ceiling, next to a door marked "Helipad", glaring venomously down on Chip. Melinda, handcuffed, stood behind him, looking small and helpless in her pink dress. But her face reflected determination and pride as she saw him. "Chip!" her voice rang out. "I knew you would come for me!"

"Shut up!" Jude told her brutally. He had completely abandoned his smoothly polished manner. Furious hatred painted his face. "You may have stopped my incompetent robot, Chip, but you can't stop me!" he hissed. "Melinda is mine, and so too will be her knowledge of the MystChip! Once I have used it to interface my brain with the AI chip, my intellect will become greater than any man's! I deserve her, Chip - not you! You've solved a few trivial puzzles for her, but I've been her partner for years, assisting in her most important research! Who do you think you are, to compare with me?!"

"Who am I?" Chip asked, looking steadily at Melinda, who gazed trustingly back at him. "I'm Melinda's friend. Can you claim that much, Jude? Have you ever helped her when she truly needed you, not only when it served your own selfish ego? Have you trusted her, even when you did not understand her? Have you faced death, for her? You do not love her, Jude. You've only ever used her."

"Perhaps that's true," Jude snarled. "But the fact remains that I have her. She's my prisoner! And all your airy-fairy prattling about friendship isn't going to stop me! We're leaving, Chip. The helicopter's on its way. And you'll never get through this last level in time to catch us! Goodbye, and good riddance." He turned sharply and forced his way through the door to the helipad, dragging Melinda along with him.

"Chip!" she said urgently, struggling as she was pulled along. "Jude underestimates you. You're the best puzzle-solver I know! You can do it. I believe in you." She gave him one last, determined look, and was gone.

Epilogue

"Hey, Jude!" Chip yelled, emerging onto the windswept roof of the Bit Busters Clubhouse. The lights of Chip Grove City twinkled in the coming twilight beyond the helipad, where Jude waited tensely with the captive Melinda. Chip had solved the last level in record time, and Jude's helicopter had failed so far to arrive.

"Stop right there!" Jude produced a small handgun, waving it at Chip. "One step closer and I'll blow out your puzzle-solving brains!" Melinda struggled violently, but with his superior size and strength Jude was able to pin her behind him with one arm. He and Chip stood in a tense standoff. Chip racked his brains desperately for a way to fight.

An idea came to him. "How about a trade, Jude?" he said. "You have Melinda - but I also have something that you want. The MystChip."

"Chip, no!" Melinda cried.

Jude shook her, hard. But his eyes stayed locked on Chip's, a hungry expression stealing across his face. "Where is it?" he asked softly.

"Right here." Chip slid his pack off and slowly, carefully, reached inside. Jude took a threatening step forward, but all Chip pulled out was his towel - folded over as if to conceal a flat object. He showed it to Jude. "Release Melinda, and it's yours. Just take it and go."

"We'll see." Jude gestured harshly. "Unwrap it. That had better be the real MystChip, and not some kind of trick!"

In a single, swift motion, Chip hurled the towel at him and dove to the side. An explosion shattered the air as Jude instinctively let go of Melinda and fired at the object flying toward him. Realizing his mistake, he jerked around, savagely aiming for Chip. But he never had a chance to pull the trigger. Melinda, overlooked behind him, sprang into action. Her hands still bound behind her, apparently unhampered by her dress, she brought her foot up in an awesome ninja-kick that connected hard with Jude's wrist, flinging his gun clear across the roof. It slid over the edge and dropped from sight. Jude turned on her, raging like an animal. But her next kick took him square between the eyes, flattening him. He lay dazed on the concrete, blood dripping from a clearly broken nose.

"The key!" Melinda told Chip urgently. "He's got the key to these handcuffs. Get it, quick, before he recovers! It's in his left pants pocket."

Shaking off his astonishment, Chip quickly did as she said and removed her handcuffs. After massaging her wrists for a moment, she threw her arms around him.

"You did it, Chip!" she said proudly. "Thank you so much for coming after me! Did you actually find the MystChip?"

"I did! But then I lost it again," he told her apologetically. "Maximus accidentally destroyed it, and himself with it."

"Perhaps it's just as well," she sighed regretfully. "You touched it, Chip. You understand, now, what it was. We still don't know what sort of accident produced it, during our research on the AI chip. It was one of kind; too powerful to be contained, too powerful to be let loose. But it was alive, Chip - I couldn't just destroy it. Now both it and its secrets are gone for good, and no longer our burden."

They both turned at the sound of the fast-approaching helicopter. As it zeroed in on the roof, Jude suddenly pushed himself up and raced away from them, grabbing up the towel and waving it over his head as a signal. The chopper dipped toward him.

But just as he was about to drop the towel and leap aboard, a very strange thing happened. A brilliant flash of something, like violet lightning, surrounded both him and the chopper, freezing them in place. The noise of the rotor cut off abruptly. Both Jude and the machine seemed to fade to transparent and then vanished, along with the light. A curious buzzing sound hung in the air for a moment longer. Then that too was gone, and Chip and Melinda were alone.

"What - what just happened?!" gasped Chip, staring in disbelief at empty space that had, just a moment earlier, contained a man and a large flying machine. Even the towel was gone, he noticed.

"I'm not sure...," Melinda responded with a small, secret smile. "But I think it might have had something to do with that towel. It was so brave, the way you threw it at Jude and risked getting shot yourself! You really proved what you said to him down below - a true friend risks his life for those he loves."

She took his hand and gently drew him over to the edge of the roof. At the sight of them, free and unharmed, the crowd of Bit Busters below set up a rousing cheer. The two of them stood, side by side, hand in hand, facing into the glorious sunset.

"I feel I should apologize," Melinda said quietly, looking away from him. "You've always been so faithful to me; but I've kept secrets from you. Secrets that ended up endangering your life. When I first met you, I pushed you away. I valued only intellect; to the extent that I would take only a Bit Buster to the e-prom, so as to ensure a brilliant conversation partner. I had not yet learned the value of friendship.

"Do you know who taught me that value, Chip?" she asked seriously, turning to face him. "It was you. Your intellect is impressive, but more than that is your selfless spirit. You truly are my hero, Chip. You challenge me to rethink my values, to become a better person and a better friend. From the bottom of my heart, I thank you."

Chip couldn't speak, could only nod, embarrassed. They looked outward again as the last rays of the sun disappeared and the stars began to dance across the darkening sky. After all they had been through, it was good just to stand there, feeling the comfort of each other's presence. Chip found himself wondering what the future would bring. He hoped that he and Melinda would have many exciting years, even a lifetime, together, solving the puzzles that were their joy. He hoped he could always be there for her. Even when this latest adventure of theirs had faded into the past, and become no more than a fleeting memory.

 
tworld-2.3.0/docs/CCLP1/cclp1res/c.html000066400000000000000000000302431475511570500174210ustar00rootroot00000000000000 Chip's Challenge Level Pack 1

Chip's Challenge Level Pack 1

The Levels

# Title Author
1. Key Pyramid Tyler Sontag
2. Slip and Slide Henry Potts
3. Present Company Henry Potts
4. Block Party Tyler Sontag
5. Facades Henry Potts
6. When Insects Attack Tyler Sontag
7. Under Pressure Henry Potts
8. Switcheroo Henry Potts
9. Swept Away J.B. Lewis
10. Graduation Markus O.
11. Basketball Daniel Bouwmeester
12. Leave No Stone Unturned Andrew Menzies
13. The Monster Cages Andrew Menzies
14. Wedges Skye Climenhaga
15. Twister Vehudur
16. Tetragons "Rosabellis"
17. Tiny Ida R.
18. Square Dancing Andrew Menzies
19. Feel the Static Miika Toukola
20. Chip Suey Henry Potts
21. Generic Ice Level Miika Toukola
22. Repair the Maze Andrew Menzies
23. Circles Markus O.
24. Chip's Checkers Andrew Menzies
25. Mind Lock Vehudur
26. Trafalgar Square Daniel Bouwmeester
27. Teleport Depot Archie Pusaka
28. The Last Starfighter Dave Varberg
29. Sky High or Deep Down Andrew Menzies
30. Button Brigade J.B. Lewis
31. Quincunx Henry Potts
32. Nitroglycerin Andrew Menzies
33. Spitting Image Henry Potts
34. Just a Bunch of Letters Daniel Bouwmeester
35. Mystery Wall Daniel Bouwmeester
36. Rhombus Gavin Duncan
37. Habitat Tom Patten
38. Heat Conductor Josh Lee
39. Dig and Dig Andrew Menzies
40. Sea Side "Rosabellis"
41. Descending Ceiling Andrew Menzies
42. Mughfe Trevor Hedges
43. Gears Skye Climenhaga
44. Frozen Labyrinth Josh Lee
45. Who's the Boss? Miika Toukola
46. Sapphire Cavern Josh Lee
47. Bombs Away Ida R.
48. Sundance J.B. Lewis
49. 49 Cell Andrew Menzies
50. The Grass Is Greener on the Other Side Josh Lee
51. H20 Below 273 K Archie Pusaka
52. The Bone Rock Gnreux
53. Start at the End J.B. Lewis
54. Mini Pyramid J.B. Lewis
55. The Chambers Daniel Bouwmeester
56. Connect the Chips Andrew Menzies
57. Key Farming Archie Pusaka
58. Corral Andrew Menzies
59. Asterisk Jacques Smith
60. Guard Jonathan Birchall
61. Highways "Rosabellis"
62. Design Swap Josh Lee
63. New Block in Town Archie Pusaka
64. Chip Kart 64 Andrew Menzies
65. Squared in a Circle Josh Lee
66. Klausswergner Rock Gnreux
67. Booster Shots Trevor Hedges
68. Flames and Ashes Josh Lee
69. Double Diversion Grant Fikes
70. Juxtaposition J.B. Lewis
71. Tree Andrew Menzies
72. Breathing Room J.B. Lewis
73. Occupied Andrew Menzies
74. Traveler Mike Lask
75. ToggleTank Archie Pusaka
76. Funfair Tom Patten
77. Shuttle Run Henry Potts
78. Secret Passages Andrew Menzies
79. Elevators Henry Potts
80. Flipside J.B. Lewis
81. Colors for Extreme Tyler Sontag
82. Launch Zane Kuecks
83. Ruined World Josh Lee
84. Mining for Gold Keys Andrew Menzies
85. Black Hole Archie Pusaka
86. Starry Night J.B. Lewis
87. Pluto Andrew Menzies
88. Chip Block Galaxy Josh Lee
89. Chip Grove City Josh Lee
90. Bowling Alleys Tom Patten
91. Roundabout Jonathan Birchall
92. The Shifting Maze Andrew Menzies
93. Flame War J.B. Lewis
94. Slime Forest Markus O.
95. Courtyard Tom Patten
96. Going Underground Josh Lee
97. Gate Keeper Andrew Menzies
98. Rat Race Andrew Menzies
99. Deserted Battlefield "Rosabellis"
100. Loose Pocket Rock Gnreux
101. Time Suspension Rock Gnreux
102. Frozen in Time Tom Patten
103. Portcullis Henry Potts
104. Hotel Chip Andrew Menzies
105. Tunnel Clearance Tyler Sontag
106. Jailbird Markus O.
107. Paramecium Palace Andrew Menzies
108. Exhibit Hall J.B. Lewis
109. Green Clear Tom Patten
110. Badlands Tyler Sontag
111. Alternate Universe Markus O.
112. Carousel Henry Potts
113. Teleport Trouble Archie Pusaka
114. Comfort Zone J.B. Lewis
115. California Josh Lee
116. Communism Trevor Hedges
117. Blobs on a Plane Tom Patten
118. Runaway Train Tom Patten
119. The Sewers Tyler Sontag
120. Metal Harbor Tyler Sontag
121. Chip Plank Galleon Tom Patten
122. Jeepers Creepers Henry Potts
123. The Very Hungry Caterpillar Andrew Menzies
124. Utter Clutter Andrew Menzies
125. Blockade Archie Pusaka
126. Peek-a-Boo Ida R.
127. In the Pink Dave Varberg
128. Elemental Park Andrew Menzies
129. Frogger Wes Powers
130. Dynamite Michael Moorman
131. Easier Than It Looks Andrew Menzies
132. Spumoni Henry Potts
133. Steam Cleaner Simulator Trevor Hedges
134. (Ir)reversible Andrew Menzies
135. Culprit Andrew Menzies
136. Whirlpool J.B. Lewis
137. Thief Street Michael Moorman
138. Chip Alone Tom Patten
139. Assassin Rock Gnreux
140. Automatic (Caution) Doors Andrew Menzies
141. Flush Archie Pusaka
142. Bummbua Banubauabgv Rock Gnreux
143. Amphibia Archie Pusaka
144. The Ancient Temple Eric Schmidt
tworld-2.3.0/docs/CCLP1/cclp1res/d.html000066400000000000000000000014601475511570500174210ustar00rootroot00000000000000 Chip's Challenge Level Pack 1

Chip's Challenge Level Pack 1

The Secret Levels

# Title Author
145. Chance Time! Andrew Menzies
146. Cineworld Tom Patten
147. Thief, You've Taken All That Was Me Tyler Sontag
148. The Snipers Tom Patten
149. Clubhouse Daniel Bouwmeester
tworld-2.3.0/docs/CCLP1/cclp1res/dirt.png000066400000000000000000000073031475511570500177620ustar00rootroot00000000000000PNG  IHDR00`nsRGBgAMA a pHYsodtEXtSoftwarePaint.NET v3.5.11GB72IDATXG5]K#뫾E ADAaPd!!! I0 &ⷎ>}:<=յzcU[,켸nq=N6gfqݯ{ˎǚyvX},փϛwWbَwY#sMWVnU,;z]/;E]QR,Zøn><-ֽhEݏ߸PP~_L!!s)ǟbvX|(FgWlҼUVe%|ǃC)n-autV[KΎ /*oW/vw b'4lHOGW6&KdW-: ru}}/6/;q~x1JG[Z, A8#sI0@#4$hnxYn |[jqz^oxʼn+%Oj^ULE^:D$a&nl YɁFG8p?*Y14xѾGNgr5<\ln!7ŗ2`J2.ĺ4}z!,ÒP6`y^0aa2#bmu@tAZ![.nac1w/(GʬInU I"by}=Ӝ3f)BXq2xe%.yхK= Cא!ߊ̉B== !5ln2 eo3 țmi06Xmy l%=]H(aGsL0Eɖl/ux[J1}ZuJۿ?\vL'J=N Ŝxtn-d\PnI]ן.8z1YwA!%^i .2~2OyA$K S4h^ባeMo"cbF~и 6\%ވeCd BcSBp=bޙTC>J9T7R E+n 鬍ɍ#Sǣ'j+̜i=/ sE4`% fE,\J8[$ᘷ޲ϨvM7x(KY4848L J2al84R)B `B66ᑪ%̻WH,$%|Y$~ o DUF؉p5LZ-~djl$&PuL:zG3{AfEd)Bl&2%B2GY>3VP"@&]I_~d|?̶|iawc6oVh7.&ŒwFi*r'Ә!ړ] G{lZ^ j[f]kM+h yExh:UaUj\H1՜S,_x!xrF%&uΔFRᯇ4kDO0_$3+"=+NQ<̿q 97CI&2y$rcˢȹƉH\w1PNCw1%B ''8M~I+—d"bbA>Z"Kׇѯ!I/g@LLp\ ~7FɢS'ň$ ?rBĥ$JʗY-PɟFI f=c;R,!Kδb+hq嵳4 |h\ u99*7oAO=LSW4^ wB>GT E8W)Qj<_® +Ki z"ؖHҔ9M1t:E?DOhR%##co(Z}Y&[fYߦRDjoKu:5-F75ɡeW>k_d9CS\ ~sY7C+_sȠNn5wl:yG~:ܧ-TO[Oɝ$Un73*#frV=Q\"rEIrrÇ^LMO>|6q p$ 4P|<똱i Oz}z $Z-UzpP׷%6 a6xCv U<O񬭚mMMz*fGewju%Mt@n3?%0 2,(P]滴x8.$v~s9>d0+ZPv> D/Cyur[U{U:vn ̘w,my)5禎8⺫?y8cqܫ*bu 1=Њ5aJKEqrIf/PpX߀-5ޤ wvU޺=/(8jKwTKwIˤɾ@tS $(*/sJwEiG,[TxՂ OC_Ɉh-Dx^\K&$^vi+[;{\]q̴^6NC|PneIw`{~nUr|O9PCFJF&wubNC@Poiڷ5ם5F5ӣNnzQNijc:) ˃ǤУ)*Rw"yo+ZQxVRYI{yu"x(lv9l|*8h?ZQzIENDB`tworld-2.3.0/docs/CCLP2/000077500000000000000000000000001475511570500145745ustar00rootroot00000000000000tworld-2.3.0/docs/CCLP2/2.gif000066400000000000000000000034001475511570500154210ustar00rootroot00000000000000GIF87adxU$$U$$IIUIImmUmmUUU۪U$$U$$$$$$U$$$$$I$IU$I$I$m$mU$m$m$$U$$$$U$$$$U$۪$$$U$$IIUIII$I$UI$I$IIIIUIIIIImImUImImIIUIIIIUIIIIUI۪IIIUIImmUmmm$m$Um$m$mImIUmImImmmmUmmmmmmUmmmmUmmmmUm۪mmmUmmU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmےےUےے۶۶U۶۶U۪UU$$U$$IIUIImmUmmUUU۪U!,dx@ H*\Ȱ!6HH3jȱǏ 7Z8"6(~DY˗0cʜ)Qʔ6=9ϟ@ZM9;ЗN#ZJmj)u*ϤQ"5uي](ҬgvJuƶv3. s.ߪX `.]bK-QÈ6s2[} kt⋌GʢI%MMmO%dmrdhް _Z1H\s .E!a(27{c90Ph#hcpF"j5#m:vXebiH&L"!z$vQ6%M_WדW{Y6fjU e-[Q4unR'G' }EhXNV~fZ|Ujhd")qM*rIVhu+ZzV+.O*gZ&b ֊ ki5kLBƛ-q ֣K҅ci-!Znf AD#G b;B /Wlnc[e,f'ƛ,2eiV|2$V譿Fs)k+?騰TVJשB F{IWK-:Kez6[s|h2ݵV}SvQݭ=#37P_{,Z6ߩÝ)\69ˤ;Wx|Zʥ{ʹn[*?Ƕ~VO5w۟7뿌h&AjEİ#6\dIFڍxA1 G$ ;tworld-2.3.0/docs/CCLP2/C.gif000066400000000000000000000034351475511570500154520ustar00rootroot00000000000000GIF87adxU$$U$$IIUIImmUmmUUU۪U$$U$$$$$$U$$$$$I$IU$I$I$m$mU$m$m$$U$$$$U$$$$U$۪$$$U$$IIUIII$I$UI$I$IIIIUIIIIImImUImImIIUIIIIUIIIIUI۪IIIUIImmUmmm$m$Um$m$mImIUmImImmmmUmmmmmmUmmmmUmmmmUm۪mmmUmmU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmےےUےے۶۶U۶۶U۪UU$$U$$IIUIImmUmmUUU۪U!,dx@ H*\Ȱ!6HH3jȱǏ 7Z8"6(~DY˗0cʜ)Qʔ6=ɳ%@2gGrSӧ3JZQF*u9*ѯ>[ZՈulF˶Ye9]o/Ɲ[ݿ0ګեZ' &|t+Wi+WkʍpUKq8iɊ{ugE,i2۸sxr-$iN|8p# -g'ٵu7/f۹;d5ٳV7\ ӕ-|6\GDLUcb jyd21yrЕXbsYr(svC4hb/EY#Gfz*z桕&jnzP6Y=y].:mfQ2z+brX`Z]}*^8knCW$G<koD.WyLxޫ0$ ӛBllIR̛krܱHB"\(/f `u,I%<ɬ-n2e:iКUkJcjspB5ӪIkTKfGܫvm󝭞g*봣lUM6j7d6- p 3|-n)>V.9yw>-֤-n.ԙˮz{y>q;ޭ8Bݸ٢]#׮hV*>Ǝ=YWwV63{?}Aj7_kK6R3`c fˑ| _E zH=ɐ<7lb28RwC;tworld-2.3.0/docs/CCLP2/CCLP2.html000066400000000000000000003005511475511570500162710ustar00rootroot00000000000000 Chip's Challenge Level Pack 2
Chip's Challenge Level Pack Two - the Second in a Series

Chip's Challenge Level Pack 2

Chip McCallahan is now a proud member of Melinda the Mental Marvel's exclusive computer club, the Bit Busters.  It wasn't easy getting there - he had to make his way through the 149 levels of Melinda's clubhouse, dodging pink balls, unlocking doors, and picking up chips.  Some parts were frustrating, but most of the levels were a lot of fun to solve.

After he finally completed all the levels, he went back and found lots of crafty shortcuts and tricks to finish the levels even faster than he had done before.  His total score was now almost as high as Melinda's!  But eventually, while Chip still enjoyed the original levels, he wanted a new and different challenge.

Chip was having lunch one day, when suddenly, Melinda walked into the room.  "Melinda," Chip asked, "Do you have another clubhouse that I can explore?"

"Actually, some of the Bit Busters have been building their own levels.  Their clubhouse is finished now, and I think you might like to try it."

"Really?  I'll... I'll do it!"  Chip was overjoyed.  But little did he know the challenge that awaited him...


Contents


Thanks to ...

 Chuck Sommerville   for creating Chip's Challenge. 
 John Elion   for creating ChipEdit. 
 Tyrethali Ansrath   for designing the levels, 
 Dave Borgman  and making them available for CCLP2 
 Dale Bryan      "
 Paul Hobden      "
 Herbert Holzbauer      "
 Anders Kaseorg      "
 Mike Lask      "
 Hank Lin      "
 Luc Longpré      "
 John Matthews      "
 Anne Olsen      "
 Rolf Redford      "
 Nicholas Ross      "
 Eric Schmidt      "
 Christian Ståhl      "
 David Stanley      "
 Drew Thomas      "
 Kyle Wightman      "
 Drake Wilson      "
 Anders Kaseorg   for administering the voting site, 
   and for composing the introduction. 
 Hallgeir Flø   for play-testing. 
 Warwick Anderson   for general advice. 
 Dale Bryan   for coordinating the project, 
   for designing the credits page, 
   and for final assembly of the level pack. 

Back to Contents


The Levels

 1.   A Fleeting Memory   JNMD   Drew Thomas 
 2.   Naomi's Bug Collection   CAGR   Paul Hobden 
 3.   Bea's Den   HYGJ   Paul Hobden 
 4.   Force World   CUSU   Dave Borgman 
 5.   Suction Ride   LTFX   Mike Lask 
 6.   Fixing the Toggle Switch   COGB   Drew Thomas 
 7.   Slightly Mad   MIKY   Tyrethali Ansrath 
 8.   Use the Fish   KUSA   Tyrethali Ansrath 
 9.   Maze of One Way   GLIK   Eric Schmidt 
 10.   Who Needs a Flipper?   KOAG   Mike Lask 
 11.   Deconstruction   DPDC   Tyrethali Ansrath 
 12.   Mazed In   NPQF   Tyrethali Ansrath 
 13.   The Serial Port   KNIN   Drake Wilson 
 14.   The Parallel Port   QVVG   Drake Wilson 
 15.   Debug File   YONE   Dave Borgman 
 16.   Paw-Print Isle   YUNK   Tyrethali Ansrath 
 17.   Double Trouble   OPCD   Dave Borgman 
 18.   Elemental   HFGW   Tyrethali Ansrath 
 19.   A Sample of Things to Come   ZDNH   Dave Borgman 
 20.   Ranger Denmark   AIQF   Anne Olsen 
 21.   Block Away!   MGCF   Dave Borgman 
 22.   How Goes?   FHSV   Anne Olsen 
 23.   Traps I   EJLC   Dave Borgman 
 24.   Sudden Death   HKHA   Dave Borgman 
 25.   Race for the Chips   XKWK   Kyle Wightman 
 26.   Work Fast   GGMF   Anne Olsen 
 27.   Frozen Floors   IHSJ   Dave Borgman 
 28.   Madness I   ULJD   Dave Borgman 
 29.   Fire and Water   GZFS   David Stanley 
 30.   Chase Race   KYQX   Kyle Wightman 
 31.   Well of Wishes   WWYK   Tyrethali Ansrath 
 32.   Tele-Portion   IWSA   Rolf Redford 
 33.   The Big Button Quest   HZUR   Christian Ståhl 
 34.   Cypher II   EZKA   Dale Bryan 
       and Sarah Canale 
 35.   Mirror   QRTB   Paul Hobden 
 36.   Spy   WFPP   Tyrethali Ansrath 
 37.   The Mystery of the Seven Chips   PNQM   Christian Ståhl 
 38.   Mads' Rush I   GTTZ   Anne Olsen 
 39.   Yike-o-Matic   KIPE   Eric Schmidt 
 40.   Traps II   SMIP   Dave Borgman 
 41.   Ladder Needs a Wash   NBXA   Drew Thomas 
 42.   Hmmm!   EVFC   Eric Schmidt 
 43.   Ray of Light   KLZS   Tyrethali Ansrath 
 44.   Fun House Rink   RIOA   Eric Schmidt 
 45.   Breaking the Rules   EPYR   Eric Schmidt 
 46.   Hurry Up, Chip!   MHPQ   Christian Ståhl 
 47.   Tele-Rooms   AKBI   Dave Borgman 
 48.   And Then There Were... Four?   EMSN   Eric Schmidt 
 49.   Just a Minute!!   DHXH   Eric Schmidt 
 50.   Smorgasbord   ICYY   Christian Ståhl 
 51.   The Lake in Winter   LOJM   Eric Schmidt 
 52.   Oracle I   BDRT   Dale Bryan 
       (adapted) 
 53.   Security Breach   XYZK   John Matthews 
 54.   Killer Rooms   BFMW   Dave Borgman 
 55.   Dangers of Fire and Beasts   DLBU   Rolf Redford 
 56.   Planet of the Teeth   WLVR   Dave Borgman 
 57.   Quad-Boot   YUAV   Dave Borgman 
 58.   Reversi   NQQS   Kyle Wightman 
 59.   Lot of Danger   WMNM   Rolf Redford 
 60.   Internal Clock   JRJQ   Eric Schmidt 
 61.   Icy Moat   RHYK   Tyrethali Ansrath 
 62.   Chips on the Blocks   HMOH   Christian Ståhl 
 63.   Jungle   FGNF   David Stanley 
 64.   Loop Holes   POKM   Dale Bryan 
 65.   Beware of the Teeth!   WPZI   Christian Ståhl 
 66.   Hobgoblins and Chimera   ERJB   Tyrethali Ansrath 
 67.   The One Sensible Chip   DVSN   Christian Ståhl 
 68.   Madness II   HINH   Dave Borgman 
 69.   So Many Chips!   XUVJ   Dale Bryan 
 70.   Killer Spiral   RXQR   Tyrethali Ansrath 
 71.   Mads' Rush II   DLSN   Anne Olsen 
 72.   Checkerboard I   IXWO   Dale Bryan 
 73.   Bumble Boy   UWHY   Eric Schmidt 
 74.   Chip Search   DJTP   Dave Borgman 
 75.   BuggyWall   LPXZ   Paul Hobden 
 76.   Fire Bugs   UMXP   Dave Borgman 
 77.   Madd Maze   FHQW   Paul Hobden 
 78.   The Search for the Exit   MGGX   Dave Borgman 
 79.   Cra-zy   UEIF   Drew Thomas 
 80.   Frost Swirl   MEWB   Tyrethali Ansrath 
 81.   Just Enough   OSFN   Dale Bryan 
 82.   The Block Stops Here   LIXA   Dave Borgman 
 83.   Warehouse I   EDLH   Tyrethali Ansrath 
 84.   Crypts of Aganorak   LXYA   Tyrethali Ansrath 
 85.   Follow the Glacier Brick Road   TNMK   Tyrethali Ansrath 
 86.   Creative One-Ways   IMOL   Eric Schmidt 
 87.   The Walker Machine   CBYD   Hank Lin 
 88.   Don't Get Lost   SLXW   Eric Schmidt 
 89.   The Ghetto Defender   WGON   Christian Ståhl 
 90.   Marjolaine's Maze   TDGB   Christian Ståhl 
 91.   Tutti-Frutti   WKUD   Christian Ståhl 
 92.   Abandoned Mines   NNDI   Tyrethali Ansrath 
 93.   Exit Chip   WJNL   Eric Schmidt 
 94.   Checkerboard II   HQTG   Dale Bryan 
 95.   Learn   UCNC   Tyrethali Ansrath 
 96.   Glider and Fire   OZLU   Rolf Redford 
 97.   Roller Coaster   DCOR   Eric Schmidt 
 98.   Loop   GKUP   Anne Olsen 
 99.   One-Block Sokoban   MYTU   Eric Schmidt 
 100.   Torch   RNDG   Tyrethali Ansrath 
 101.   Hard As Rock   DAYI   Christian Ståhl 
 102.   Chip's Fight   UYXS   Christian Ståhl 
 103.   Island Hopping   SWKX   Paul Hobden 
 104.   Pyramid   EDCX   Tyrethali Ansrath 
 105.   Yet Another Puzzle   SDMU   Eric Schmidt 
 106.   Bounce   ROIR   Tyrethali Ansrath 
 107.   Joyride I   JNYS   Christian Ståhl 
 108.   Tricks   ZYIT   Dave Borgman 
 109.   Blocked Trap   OSCZ   Dave Borgman 
 110.   It's a Kind of Magic   TJWI   Tyrethali Ansrath 
 111.   Monster Factory   LXZP   Eric Schmidt 
 112.   After the Rainstorm   QOHJ   Eric Schmidt 
 113.   Oorto Geld II   EFWS   Drew Thomas 
 114.   Joyride II   NPCP   Christian Ståhl 
 115.   Counter Clockwise   EQOF   Tyrethali Ansrath 
 116.   Turn Turn Turn   BSUK   Dale Bryan 
 117.   CircleMaze   XCNR   David Stanley 
 118.   High Security   QGBZ   Paul Hobden 
 119.   Teeth   NLMM   Eric Schmidt 
 120.   Frost Rings   IKKU   Tyrethali Ansrath 
 121.   Flame Boy   FBOZ   Eric Schmidt 
 122.   Warehouse II   WSPI   Eric Schmidt 
 123.   BlockSlide   LYZC   Anders Kaseorg 
 124.   Paramecia   NOEW   Eric Schmidt 
 125.   Blocks 'n Bombs   YOAP   Paul Hobden 
 126.   Dodge!   HYDL   Eric Schmidt 
 127.   Escape from Chipkatraz   VFTY   John Matthews 
 128.   Fantasy Island   ZJKJ   Drew Thomas 
 129.   Miscellaneous   CNVO   Tyrethali Ansrath 
 130.   Frozen Birdbath   FTRA   Drew Thomas 
 131.   Time Bomb   WAAO   Eric Schmidt 
 132.   Captured   EIHS   Eric Schmidt 
 133.   Block Maze   KBIA   Tyrethali Ansrath 
 134.   Microcosm   HWTD   Tyrethali Ansrath 
 135.   Zartacla   FJZR   Tyrethali Ansrath 
 136.   Switch Hit   UURS   David Stanley 
 137.   Iron Mysticus   VFYY   Tyrethali Ansrath 
 138.   Patrolled   VJRI   Tyrethali Ansrath 
 139.   Frostbite   FKES   Tyrethali Ansrath 
 140.   Keep Trying   PIIR   Eric Schmidt 
 141.   Oracle II   GVAM   Dale Bryan 
       (adapted) 
 142.   Chomper Romp   WAYT   Dale Bryan 
 143.   Trapped   MZFU   Tyrethali Ansrath 
 144.   Wormwood   FXIX   Eric Schmidt 
 145.   Gauntlet   MAER   Dale Bryan 
 146.   Run-a-Muck   HBSF   John Matthews 
 147.   Cloner's Maze   IAQO   Eric Schmidt 
 148.   Neptune   XDXW   Luc Longpré 
 149.   Key Color   FJMS   David Stanley 

Back to Contents


Honorable Mentions

 Prison Cell   David Pinkston 
 Prison Camp      "
 Element Island      "
 Pipe Dream      "
 Currents      "
 Mud      "
 Force Rapids      "
 Bowling      "
 Pathways      "
 Relay      "
 Four Corners      "
 Thingamajig   "IDD" 
 Scribble Scrabble Squares      "

These levels would have been included, had we been able to contact the designers, for permission.


Thanks also to ...

  • Chipsters everywhere, for taking up the Quest.
  • The voters, who made this project possible.
  • Those designers, whose levels were not submitted in time to be included in this project.

Back to Contents


® Chip's Challenge is a registered trademark of Bridgestone Multimedia.

This page updated 09 Jul 2003.

tworld-2.3.0/docs/CCLP2/L.gif000066400000000000000000000033521475511570500154610ustar00rootroot00000000000000GIF87adxU$$U$$IIUIImmUmmUUU۪U$$U$$$$$$U$$$$$I$IU$I$I$m$mU$m$m$$U$$$$U$$$$U$۪$$$U$$IIUIII$I$UI$I$IIIIUIIIIImImUImImIIUIIIIUIIIIUI۪IIIUIImmUmmm$m$Um$m$mImIUmImImmmmUmmmmmmUmmmmUmmmmUm۪mmmUmmU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmےےUےے۶۶U۶۶U۪UU$$U$$IIUIImmUmmUUU۪U!,dx@ H*\Ȱ!6HH3jȱǏ 7Z8"6(~DY˗0cʜ)Qʔ6=ɳO9;N*U)͢نҫN„Q*׌Gc^]lůiulRpLo㖝k.նn]K(aU_ĀJLL8M̸3PQ3L%f%K ɺ׫;mK"IհsmHkMԿiC.͜ˑ.ntW#c~:X졵b=--sM}~ѷ___]vUT߀a!ׄ4qE a$7w9,P](nh1Ψck6fbhC)DiH_dtM$eM߁WʕyLV9V^*h_cv9exhnw9ޛ_.ȦnF rFu眄%t*L 薂fV*)饎fgB*r**^BIfSxkcVR.+lBV,G#p.l^%if-vaw~4.XnD jEni4+-ȬB{#_{ع箸J%>Z!:1j(#Fƞwf";hqʰ*Ǚl)˛Ls6[h1g*ys׼r8wҧ<2:o:3E#ztS)M [KF 2JЌ2tYaNJ|tKPOt kݐ;nvS _G}lww}xШ .d/^]_ ۟G~2S;՘#NC; h9Ӛ'}zmO jp<-rԣ 2?Z H#5L '$ Z ;tworld-2.3.0/docs/CCLP2/P.gif000066400000000000000000000034401475511570500154630ustar00rootroot00000000000000GIF87adxU$$U$$IIUIImmUmmUUU۪U$$U$$$$$$U$$$$$I$IU$I$I$m$mU$m$m$$U$$$$U$$$$U$۪$$$U$$IIUIII$I$UI$I$IIIIUIIIIImImUImImIIUIIIIUIIIIUI۪IIIUIImmUmmm$m$Um$m$mImIUmImImmmmUmmmmmmUmmmmUmmmmUm۪mmmUmmU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmUUU۪UU$$U$$IIUIImmUmmےےUےے۶۶U۶۶U۪UU$$U$$IIUIImmUmmUUU۪U!,dx@ H*\Ȱ!6HH3jȱǏ 7Z8"6(~DY˗0cʜ)Qʔ6=ɳO9;Θ*]ʴӧL8T63 ͩxӭfw(۫Yբ5)ϱžUfݿk'a}x"ދzouڸVNnjc[vshͤS4mdI!c˞MvǓM~]I \cUtaav+/닷N:e[Oj݀щW_% wu=__1aalƜɕx97,kz9$4Pd(cmbn9(dH>2!| L6PF$yZY(|q _bxOf*8!wi|`Ƅ&yٙzk-X%щt:'^YKwRBHY(uGi/际rf7W=䘝*E6jT놷ꦰZ*렾:* i IKm"d6vmCؚF i.G$;dbI)koܑ*æWlb[@[,r{KVm)7fm˂ 3:oɼsϪ\s?&I2(Fg*+|R4ո u9bWm'ԕt\cZv" ѲiS7zh-f=n3ZM8^zviMmWy~^ثn֟o8ݦ}yrwMt嶾^{з.O޵<.;Ntz3S<_;=K׈|=E[9D{x>]k>劷~߾~sֆ;^ iS8ΎC ï ڈRIvd,bFڠ5.P. BhBꈄ Ged8̡pd;tworld-2.3.0/docs/CCLP2/disclaimer.txt000066400000000000000000000016141475511570500174530ustar00rootroot00000000000000Chip's Challenge, Level Pack 2 This package includes the following files: 1) CCLP2.dat - the level set 2) CCLP2.html - the credits page 3) C.gif - supplements credits page 4) L.gif - " 5) P.gif - " 6) 2.gif - " 7) disclaimer.txt - this file This package may be distributed freely, as long as all of these files are left intact. For further developments regarding Chip's Challenge, including instructions for playing these levels, please visit one of these sites: History: 09 Feb 2002 - Original release of CCLP2. 09 Jul 2003 - Levels #29 and #76 renamed, to avoid conflict with CC1. 09 Jul 2003 - Level #149 altered, to avoid unintentional solution. 10 Jul 2003 - Correction made to disclaimer.txt Chip's Challenge is a registered trademark of Bridgestone Multimedia. These files were updated 10 Jul 2003. tworld-2.3.0/docs/CCLP3/000077500000000000000000000000001475511570500145755ustar00rootroot00000000000000tworld-2.3.0/docs/CCLP3/CCLP3.html000066400000000000000000000232341475511570500162730ustar00rootroot00000000000000 Chip's Challenge Level Pack 3
CCLP3



"Chip! Where are you?!"

Chip McCallahan slowly opened his eyes, put on his spectacles, and made his way toward the front door, coughing as he went. His hair was white and he walked with a limp.

But this was only because he'd just fallen off the kitchen table and upset a can of flour over himself while trying to reach the jar of cookies on the top shelf. That was pretty much all the excitement he'd had that week. Even though he still had a lot of fun at the parties that some of the Bit Busters organized every once in a while, he missed the exciting days of exploring the two clubhouses that Melinda and the Bit Busters had built.

"Good heavens, Chip!!" Melinda exclaimed as he opened the door. "Look at you! I'm not letting you into the new clubhouse like that!!"

Chip's jaw dropped. "New... New clubhouse?! Did you say 'new clubhouse'??"

"Yes I did," said Melinda. "You'd better get ready if you're up for the challenge."

"Boy, am I ever!!" Chip declared, starting to dust himself.

"By the way," Melinda continued, "the clubhouse also has an exclusive Bit Busters' lounge where you can drop in between levels. I'll be there too, keeping an eye on your progress..."

Soon, Chip found himself at the doors of the third clubhouse in his illustrious career. Would he be able to solve all of its puzzles?


Chip's Challenge Level Pack 3


How to Play

The CCLP3 package contains the following files:-

data/CCLP3.dat The main levelset data file
data/CCLP3.ccx Story and author information file for Tile World 2
sets/*.dac Configuration files for Tile World
CCLP3.html This documentation file
cclp3res/ Images and other supporting files for this documentation

Using Tile World

To play CCLP3 using Tile World 2 or Tile World, just copy the data and sets directories to Tile World's standard location for these files. On Windows, this is the directory where Tile World has been installed. On Linux, the default location is /usr/local/share/tworld.

With Tile World, you have the choice of playing CCLP3 under either the original Lynx ruleset (which also features animated gameplay), or under the MS ruleset (as in Microsoft Chip's Challenge). Tile World also records your solutions automatically and lets you play them back later.

Using Microsoft Chip's Challenge (MSCC)

To play CCLP3 using the Microsoft version of Chip's Challenge, all you need is the CCLP3.dat file from the data folder. To make MSCC use this file, you will need a program such as CCTools, Chip's Controls or MyChips.

Note that MSCC is a 16-bit Windows program that will not run on other operating systems such as Linux and Mac OSX, and requires additional steps to run smoothly on 64-bit Windows (more information here).


The Story

The story continues as Chip makes his way through challenge after challenge.

If you're using Tile World 2 and have installed the CCLP3.ccx file, the story will be displayed within the game.

Alternatively, to read more, click the link corresponding to the level number below before you start playing that level:

1624333464656667727681100101102104105108121126The End? •                            

Many interesting things happen to Chip during his adventures, so be sure to read them.

And who knows, you might also pick up a hint or two along the way!


Links

Stuck on a level? Want to report your scores? Or just discuss the game? Then check out the links below.

  • CCLP3 Homepage: The official information and download page for CCLP3.
  • CC Scoreboards: The official CC1, CCLP2 and CCLP3 high score tables, now maintained by James Anderson.
  • AnnexCafe Chip's Challenge newsgroup [NNTP] [HTTP]: The oldest active Chip's Challenge discussion forum.
  • CC Zone: Modern message board and multi-functional Chip's Challenge site.
  • CC Wiki: Detailed information about the game and levels.

Thanks to...

The CCLP3 Staff: John Lewis, David Stolp, Larry Jackson, Madhav Shanbhag, Mike Lask, Paul Gilbert and Peter Marks - without whom this project would still have been very much possible. But hey, somebody had to co-ordinate the project, organize the voting, compile the set and playtest the levels, right?

Hallgeir Flo - for sharing his experience of being on the CCLP2 staff.

Everyone in the Chip's Challenge community - whose votes, feedback, continuous encouragement and occasional nagging helped make this project a success.

Aaron Farmer, Alex Morin Senecal, Alice Voith, Andrew Bennett, Andrew Chen, Andrew Gapic, Andrew Raykowski, Andy Thomas, Anne Salaam, Ben Wiseman, Bill Reid ("Skully"), Blake Ebert, Charles Hutjens, "Chironex", "CJ", Craig Vilbig, Dale Bryan, Dan Miller, Daniel Bouwmeester, Dave Borgman, Dave Varberg, David Chen, David Knight, David Pinkston, David Stanley, David Stolp, David Thomas, Derek Bowser, Dino Brewster, Edward Mason, Eric Schmidt, Evan Dummit, "Firefly", "Flexico", Flynn Burklin, Francesco R, Frode van der Meeren, Gavin Duncan, Grant Fikes, "Highwatermark", Ian Cairns, Ida Roberthson, Jacques Smith, James Spriggs, Jason Farnam, Jeanne Hoffman, Jeffrey Bardon, Jimmy Vermeer, John Griffin, John Lewis, Jonathan McRae, Josh Lee, Joshua Bone, Kris Lask, Madhav Shanbhag, Matteo R, Matthew Petras, Mike Lask, Nicholas Rupprecht, Nick Bush, Nikola Tesla, Patrick B Knowles II, Paul Jackson, Peter Marks, "pie_yay_ch", Renegade Plebeian, Roger Quick, Rolf Redford, "Rosabellis", Royce Campbell, "sage_72003", Scott Feeney, Tom Patten, Tom Rowe, Tyler Sontag, Tyrethali Ansrath and Wes Powers
- for designing levels and offering them for inclusion in CCLP3. Due to the number of levels in the set being limited, some designers could not have their creations included in CCLP3, but they certainly offered some stiff competition to the ones that did. The detailed list of levels and authors can be found here.

John Elion, Michael Hansen, Christopher Elsby and Yongyi Chen - for developing the excellent level editors using which these levels could be made.

Brian Raiter - for creating Tile World, thereby making both the Lynx and MS modes of Chip's Challenge available for playing on the various operating systems in use today.

Chuck Sommerville - for creating that amazing, timeless, classic game called Chip's Challenge.


Change Log

2010-12-24
  • Original release of CCLP3.
2012-05-30
  • Fixed links in this HTML document.
  • Fixed this document to credit the current Chip's Challenge trademark holder.
  • Corrected a few designer credits in the documentation, as well as in the CCLP3.ccx file.
  • (No levels were modified with this update.)

This package was last updated on 30th May 2012.
It may be distributed freely, as long as its contents are left intact and unmodified.

® Chip's Challenge is a registered trademark of Glynlyon, Inc.

tworld-2.3.0/docs/CCLP3/cclp3res/000077500000000000000000000000001475511570500163135ustar00rootroot00000000000000tworld-2.3.0/docs/CCLP3/cclp3res/CCLP3.css000066400000000000000000000021051475511570500176270ustar00rootroot00000000000000body { background: #C0D0E0 url("ice.gif"); color: black; font: 10pt Verdana, sans-serif; } p { text-indent: 1.5em; margin: 0.5em; } p.NoIndent { text-indent: 0em; } .StoryLevelTitle { margin-top: 100em; } .Dispatch { margin: 1em 2em; } table { font-size: 100%; } th { /* background: #B0B0B0 none; color: black; */ background: black none; color: cyan; font: italic bold 12pt Arial, sans-serif; padding: 0.5em; border-style: solid; border-width: 2px; border-top-color: gray; border-left-color: gray; border-bottom-color: white; border-right-color: white; } .LevelsTable tr, .LevelsTable tr a { background: #404040 url("gravel.gif"); color: #FFFF80; } .LevelsTable td { font: bold 11pt Verdana, sans-serif; padding: 0.25em; border-style: solid; border-width: 1px; border-top-color: black; border-left-color: black; border-bottom-color: white; border-right-color: white; } .BannerImage { border-style: solid; border-width: 4px; border-top-color: #F0F0F0; border-left-color: #F0F0F0; border-bottom-color: #909090; border-right-color: #909090; } tworld-2.3.0/docs/CCLP3/cclp3res/CCLP3.gif000066400000000000000000002511551475511570500176170ustar00rootroot00000000000000GIF89a! NETSCAPE2.0!,BBD~|DBDdbdDTRTtrtlBLJLljl\Z\|z|DĬT䜞|<:<~DFDdfdTVTtvttBLNLlnl\^\|~|d\8Lծw(tw|hLՑw|LH|Lբ|w0|p|8y|  @|H0|MwHw7|7w||,w#  w` w@adlwlw|OՁw|pwH8yw|9ԢwwT  |1.Bw|lf||=?w|fBgb?w|A/;?w|pl$E|A;?wwm|wH*\ȰÇ#JHŋ3jȱǏ CI(S\ɲ˗0cʜI͛8sɳϟ@ JѣHDӧPJJիXjtׯ`ÊKٳR]˶۷pmvݻxwmݾ Lpῆ+^̸㤈KL×3k̹sȞCMLЦS^1ְc˞5۸sj{-㹉#_μhΣK:سߵbOSӫ_=t/}ߏ=?"_ۀ& k.5N&afvم(bmE`(&0C4#8h"(#($A9$'}L6K.0GR)dVYe@#[h*2馌idrֹdvډgrnɧ H)ggt. 2 ij(HЛH@ 1cDJf NJ6$믾 :Zdf5~/JK-l걈[Z1Ʋ lr@nZ{-۪I,n[ԝVl p '1 3 @ 'o/i 43zJ0/l [' k2 jfLڱrXw'  dm6-so93 c0Js@|.fJZPL*Nn$E1(dy eNu{0 qu_+g>Cpۑ]CI7 9. n2*r/^/i+~.PClxh[JL¸nM1Y&vF&{WI0]=<׫pАZVv _ 3=|~D K B9DH? xArGUQsP¤||5T|wwK"?CLCK7Q>v?vr灡3#xR!Xn#^g2xB=72t..{|69.XKVhF76ȇ 9Դ}\z`E,E7sWr~sEw A&t'o%y5.:^DN9ߓH9.9PY6 =XC:wRp7yq*aQdӜx=%_2xIA Řȹ]X圉*\s2)_K+#B!v0ӝ\%$Q Z 2bsUNWIjLze3`)c% 8U1b38ʡ"z5 6 JG*5¤2SzUʣZH\ziWvDp㧸"ڣj Wz&)OXy*:r6J>qj*-u: N"#u OJXĩ*gJp!c(zkZ#c&ҩ52jwJ7&f** a(Zƚn*P$eI\:OgZ-j~Z`YJ$ڮ0R*Vzʨ*0H?*BZJ#jYzݺ< +;'fC芬 iI:8( $rŚ銪 ڲ/[+)ZJi06ҳK P"*Tꤞ$YIvZ+\+\ʶjb6K#D[!+@JuzV~x {0KckJ#kʹ;^kt{:0Oۯܹo=럧z&˺m+ѹAJŻڈD.BZC{'FK-*):ѼHw'K!j-J[*KD̚Z{싺ۣ,e뽸I)[ ?ۤ˭k0, ț۾Ej194km׉̯2D\xXjHy1 2# ʒ3M.2lO٫)X:4i<l0YH+3=̼*lh" =OfдdAG9YlѵQ_å6AݎFp  ${<., XNM\Y]e81Ѽ#&~I}# BR"\E-y~;Ͻr=Z%D޿iE".0"MݳBONP nPWcvFmᏵUH68{fl-H͟%Swd=B o.[޹]:aNp=^?g/nj" |AE/cN}ߒ#eC=in5!>T:G9QN幾B0z.|CKaisBTDUUy75o) RԎNBsT,55n+ݤEdD`4a#P&7$QnP Th5!8ρN?">%,ʄ Nn]N+|gL%>M/ Icf^LIR?S`:3/Q.Cj}ጀ}L+- ?u&=@|/Adf_nUh/42A#v+/#.40Lp_.?lMe=DGxQr-p,ۜ(+Sb+}7@-ρ1C@,@=d|D-^HQbF+ p0`@9R!2ʐmęSgN}Tύ;EMv@*>NJCѤ]~tX[ŖEٴi VٹmB$ @^}|@= 7HRMTrJŜg]=iU^EAkbЭnlieXۻ /Tp ^)|Ep3l͵)iZ ' ^Q{&iOV0@Kn9C9 NAi= q/6'6,İC* ?D4"ѽz EP05(Y2oC+:qt-H$~[R-#RɈtk)84K/xH-@9Ҥi$*N9礓7}3O==4PA4BE4ZQGr@4<`ML> Q5QKTPSC^5VYgV$[V]wV\WakզbmTM)V=TO]ULYQJV'm[qw3?[6]85Qymy)hOm\Rp8`at1f݁zH9Vc|3o?*9=Ke8M+by-N9cJ_x烁&#J 6LCLVa.zOYޚ/6l笽x:3lҊ$IiNVK׭9t[OI8jk(q$oqҞ 7Hjˉ۱F;3'.͙4=fj5oȇցت\pa nàבnRG_3:(_eUܗwyQqg^3Cqn93mZ Vesr4He6Z-mF tIJAe홪, UOZ͈6/D@FS~5ThJUQvʟRWn jF4''=O0V#8k[mTR_ߵ"4{tRCD=6r|lLW9R &h$nh JapY"ycV\U ʫer!&O-w8`ٔ [̰ޫ}-Et̀M3E KU݊]n.D9>gfNB13DDʂ ud Yn؞]ǎ7_O~xݢnޣnwC}}9xg-\cyn\yˤAY?y~Oݧ#z>';d?e~|5.x?=vmϙ4ͮl{ ao!篲[y\{ڥ9*>Ӿ?h 5=+X!q?  #C+166qҳ u  $Sٝ#@ @Ax=דƛ˚A˲|>B S k(B8BH7\4h tBsa?`Bh0D.5\<; ;;C$q®q#3lALD0X6$|N 1D4t(.Qk; "l XQ&E$AtGC _HEe-K1yAhŠOT²mA-ڏ eS(+Ux ~ VEc%UUPQFE^eo AE]e^=X p`MhmijPKQLP24lэS<S}@LAv͒taAlhmɵ^ˑBbfvsĥ_oh艞qhubp .d%GXVc!ֻ91&k+Dʿ kE~I!ɦʶV36FmfvmYז٦_m&6VFvnnЖn &&Fo1f>voƖ$m'WoGwVwp`  Op p oo'OoG!,BBD~|DBDdbdDTRTtrtlBLJLljl\Z\|z|DĬT䜞|<:<~DFDdfdTVTtvttBLNLlnl\^\|~|d\8Lծw(tw|hLՑw|LH|Lբ|w0|p |8y|  @|H0|MwHw7|7w||,w#  w` w0 bdlwlw|OՁw|pڙwH8yw|9ԢwwT  |1.Bw| lf||=?w |fBgb?w|A/;?w|pl$E|A;?wwm|wH*\ȰÇ#JHŋ3jȱǏ CI(S\ɲ˗0cʜI͛8sɳϟ@ JѣHDӧPJJիXjtׯ`ÊKٳR]˶۷pmvݻxwmݾ Lpῆ+^̸㤈KL×3k̹sȞCMLЦS^1ְc˞5۸sj{-㹉#_μhΣK:سߵbOSӫ_=t/}ߏ=?"_ۀ& k.5N&afvم(bmE`(&0C4#8h"(#($A9$'}L6K.0GR)dVYe@#[h*2馌idrֹdvډgrnɧ H)ggt. 2 ij(HЛH@ 1cDJf NJ6$믾 :Zdf5~/JK-l걈[Z1Ʋ lr@nZ{-۪I,n[ԝVl p| 3 @'o/i 43zJ0/l ۰G#}4WDƃB'+puz0`@@ `0̯B3\->`{c=z5;+ӱr& UmY(- d? iwګ=xbs+{Ӟ3߸ۨJֵn(8mE1Gk\yPb9InJ_J:6@hz߾BifNUs߭w .~c_h@<<\P=*{ܪ=}@ 8&: ,A GՐQ %WӜF6ʝ&v˄"ɔ^9^f3`"g@YI7ת |j|6C(qJC&.qEnWW YZ`$mii9d^ Ȗw$>lV \"Bi4֕^HGFBO5vuJo ʔWO- 3@Sk[pQ;]ꞀW H2vGan}R^xQᴢvl A47< H "rWlO+UC$ V1f s^e2Mӓruæ?<""ql _*@F=jQ` -9}]0!{vr(gH쵐`9 PA6!M&ϗxS*R]sWWNl@uu[%gй~_ T` uucA]>aF`9u;R1ڋ%Ű3" YMnmFηNCbMJ]fFǙYd+I=-q*J0LH_ʪŭyGO =@jƧX#3>U+6"]X'?9詃g(EeΧٞ~1 Ps~L<>w=aP7: HvPƌC>hzku.+  z5}j}MKeZ=juS~7K/tI7Ol}Aaz&oB~H:~gH~~'Ldx<UaD^W_E5'1|5ԷB6 X Kh,2tzoMTw?z{x&gQ4x]܅;A1'5"ꕅm{5pe>C|/kShLw~?}H{g, H\Mwdcf3}f*ff:u.Ev;J~kX{zk |(v>%Ӌq[lH(TbFz3}0r~O8@؊)8dZtuޥX1#!$ȉb@Hn0kŴcōk7krxv(yuFu$7ّّ RXrxC=6-;dxP%Q"8 09@?918ђ3%b$Lٔ*%k+|?T"RYHywk4W3YE85X%u"dH[N@(diz_×kȘS&DavHwyyH} < H2cy{ )u雵☧9mK+cwB0›+8O9y+)|VKƹq'9zh@%hS#9_Dĝߙݙ+9,6ieh2IeH5R֟ zy*A7r 0,@4Z V0I[y#ZWá!:I٩&ʞ ʠ;עEcYI2ԆIfѣ~9S(:@fÙC`z"Də LNkPSIGfz2T\Z^ʚqO2yg1]ٞn+5YzoIJyDc)>uI靡**1ڡġ4JNBSʨyno6ao(D3I7xYd.fbbY#ZgҬ6J_`s:{ 4"2]VA5 UT6'حlY^z'fڪ 6FrjeIتi,:d˳Id*z _^j=B&cJ? ưl<7+J:&e(C!""*AK@ukN{DYMrⵧ{U?kKrnܦB۴khDu[W;0v3#xU/p8A=+gkq{t -E[Je J9pk.2H+KJw8Ir¶JLi}+Pz~/Jf9qUd{ i2rĩhz9㻿IJ ;+{׈T[6E)2{Ѹ:]F;>)-۞+wg$sG.@,Q\{Ջcy:VR;J  pYl3,KhٿAJL_FHZ/9']]k2;ȢSۺ}ۊ~+ d;TRk0b:*F5 آ+:̪xAǵ|84۠˒?S\Z,Gܘm̽|&-<,wņ?~LL.yQZВZ<-Oٕ{]`'%M;R"mYT23'~h̷M CY#_H&", +Z+O.߼R-B(BK.q~۫(-N^NBvW-bS'H[.H&-1/HM$.`&hM+8:cd)U}[,)zP4MA hm Ӯum 3X qYK1 t˴;iNm:]¸v⤸=_sO/P24.Ҙݨ-q d]JҰ*65nOs?eQߤԛm= ;ԏ]/ f; J>G{pWn4-{7¢ AasFen8H:S]zWn]<]nV_(5ꅽӁ=}sd(\#3!.ݸ^ei`~ӯ~$)FXK{̝^anIƎnέ$J.isM(:ZQnNpB!ZK$>@j! 'pm{&ɽ@F/w<ꏫJ>nVo8I*7 P-靎R eb_e8ޜ(+"PVP)Z0+SjdO`NrsOwꋞ0/Oj@6_pň_O FkN.h qxn4~r/0l?*F/]>JC?/{퇃5m=덎IN9"/=_5VDݯoA@ DB6-^ĘÈ&H̘aʕLт5iqbNCz O=>UjE"!UV t@edÊ}yAYrWkU ImxD-pdvi|m({-Ro/_)KdV9ĝYɻ"h4rʭhoJzNOG&<'j>YAE{w2&2)>sKџO@S,XV>@]ڴӽ6p,%&ӏ﫭/ )i{w%r\my Bʇ/}Uѵo };ݡTg=u3/]X /> ?@!Pb9nI/$d eCzػb@b(0С)HS@b3>ID;K/̓a$w(щIJ h$'lW"x !ZP_?um.|$G z)e.q 9Mv2b3,e'OPAe&c]v3&y="S@:d.S\Q JHSIKa7Bm¦($@ӗ@A]')YkĢV3X0la?KtS 0zP/,iJj3$"5fc& sK1~9`sH1LY!1ce"bONlJJP0cJCB/(UTB^'[bNF#<6|SGSsśV O++% N/Z؄q3DXsgEn[Ȁ=vs]~wui<cΪΜ,Lfp .}u_zt55%#p{\ bfZwL\q\bLqE3bV "oB>S?Ί[FXHl<[(ʨ,8Psv |\-#ֻW<US,Ǣf6vdadw>Mwߛ|>՘>vl{cIdV.jtbͣTv@dN 5Fe]#SR[2L`h&0~-u]}7} nedW}{CiƮ*&V/˫O .@/g3 xHb%j@i|WA/5fS>' l8K (o)~$)+i BxGr2}N7JgpW]Qr'~K>wcj"$vBK+_0R;19'5mUevn;(y*ǻաti+PV̌|' gOX9~+Tܡ(*O~婞yoYιn"1/K=(> ^b&k5י{b?X }ld#QozU߷nu>n%G8( 雾4:@ +곛 c xۿ+y;̂?C;A:68 H)Y?(Z|??4q7 @9G <$B:A!>bBT+:]{H P p X\CddCӧ/)/$ 2@QC.AC@7l8|9K>;[d (ް*B(8:GdFD  KD;M.,CO(C}Uds  šK0!G?WX$:L]}L` aڸ$BT=jD(@xjTkd&M۽0oD qdCbt\G›GWCz4@\?| ǝDŽ̹ | %;+Sp h HKA ;,2|w,X=x15\I;>GK{AEIƤ$DFp6?hL |J$˷'nl9"I#,Dž|Ƒ :i-lKV|7XE<캟KL H4L%J[g?h<ʼn7#|LӞ̜ D 4AyDOQ#F͘IDOG.pbWF٥٥ZuJ+ZM\?mT8]ȝ\!ԁOXGIgI]Ò0l.TAc͙\1YU|?EK7+=Xހ=^5CUƽmPI8LACc:X}}AH֫83BPSbW*YC%^nE) ZWѴka8] K ^5߰* V?`H`HH4 [[« &3Em1vaIaE`S$n[<FSM[UWԃ c,Ff 6bf/N&c'LPk`]j\cbqm^VrpA޶m\-.ؑ|rP3; pڜeԧ9HQ!bkVVRZm1CRYĚ= AHeINU`fbaaNAyff-f S~> HU4Vi=; t^QN% |9VL}5$}e7SS4`;V>0|sV^fEEUP.WQԈ]KIDfF|;FTSᕳV뵞i ak÷f"yS`9.d>&6*VfNƆȖzɶl&V FV8v׆ۋ٦ڞֶ&FVvnbn߱~o6Ff'Qf說7.WNwpn p !,BBD~|DDBDdbdTRTtrtlBLJLljl\Z\|z|D$"$ĬT䜞|~DFDdfdTVTtvttBLNLlnl\^\|~|d<:<\8Lծw(tw|hLՑw|L|Lբ|w0|0 |8y|  |0|MwHw7|7w||,w#  w` w bdlwlw|OՁw|0ڠwH8yw|9ԢwwT |1.Bw| lG!||=?w |G!Bgb?w|A/;?w|pl$E|A;?wwm|wH*\ȰÇ#JHŋ3jȱǏ CI(S\ɲ˗0cʜI͛8sɳϟ@ JѣHDӧPJJիXjtׯ`ÊKٳR]˶۷pmvݻxwmݾ Lpῆ+^̸㤈KL×3k̹sȞCMLЦS^1ְc˞5۸sj{-㹉#_μhΣK:سߵbOSӫ_=t/}ߏ=?"_ۀ& k.5N&afvم(bmE`(&0C4#8h"(#($A9$'L6K20GR)dVYe@#[h*2馌idrֹdvډgrnɧ H)ggt. 2 ij(HЛH@ 1cDJf NJ6 믾 ÜZlB)v*N @2 ꨷-Fرߢ6 z',͎fr pf:nr*nQw+3@Sڻ2̧+2p{&[겚ۦ9#oL4ۯ*1 'jZLѶ1]'`X[-RPfsB` Je$ !$w8"#vX) ,23Ţ.#kqp3xersi}Ix((`#Q,v)o!L죫h T΀eN@sʽyC]hlf}bqgNMe>s” ň]jh";ìErSU%e C2{T:uu0Vi @sVӹ-89Lͣޡ f;;7X߰Ԩ&窻n]/Izfv Zw=9 bвLvW=-\kA 8p;?xHu͞mYvrIb<`%"௏ߛ,S}k kLvu|oَwa%y2wџwot5UV~TuK}~GUmf)rW~xC{1J:~Oc*@ZklrlFf7U+ KnzGtjE췁cb^52f |H+?vA$.3Ts-ȄzuS-U( 9&}i(vF~@7U3{q1/(}6~MR3#%@3džoXjxxb):kk9Ȉ1V.X4bg-pЊzP8hf8h\Ӓx=XN"EQXE!h!Ø-g^u=3%b$؍*%k+Bf,B"騎bWW{848YhZ?=8s(wO"G GOPx;D(}Wi$%i: 9WÐ:xCw'i/$Ӓ3i$tB9`5&YA+LiAɔ>.yBYe0B^HɏǓ>D-^?AIh e3pX~gMɔKҔ>9C8i8Zm\Ow&s?^Q21iƋZ-#JDj9 Ѡ/ 4R3hjvљ?JV#CJ@6yS뉝- P#R:)*H6[̖I x 626jA6P~JLZ0)))r*.fYʧɥ3EnjZtˉ^7ڦ 9:V{d 97z])hܥJ+*%iʫz9; (;ZJ a;CdI;[zU/ ӸuL2LɉSpkʚrٯ kkѲm{Y)5Iv=ݹ?k-ږzJAK?;J$ں[GѼYڻo9۴̅)~"J[iZ[_K{ (+ۡ9iX~ɿSK˵",ܕ*^y Kۿ+lV*G?󋸽x)),&{1,UDkTXB*i,|-9ᣔ8\ ( Šf h-؎=gA'bf;ue_Ҏ$aTl\4HGk\lBL(ye,̓$XzT5cm[{ 55Ĩ,Է=tD2Mbgpz:A8P2:! 0,@r=#=noGʼ@,m]=[]>$MKm0`l?gGԃ6GKbA+T]T-գD wKRS,ъ |H\I/95c;GFm2D|(]:t^վ,Fw5Ml7zZ=ҘmBN@؃Pa}дK=^zq-G7@sQXP< @MD}`ؙZ8xuhʦXGUI .F]2"-D\sy=D @HNw -_Qؙh~E"ݍ3h51>1N{`3`NCNc; A.PRқ ;਷O *{+>辂`5[q@ @ ܭa{*.̼=/~2^譜#nYbK"ړKvBJ@Lr. tGO#'~5]##`Ӵ\NcVzTqT.,+݃O\aa:$ V< x4?@1#hzdz\G^,*oTnDS?ѡp!!D,^ĘQF=~2c%MD$*]̓E޴(N;}҇A3EjT70yfԐ^q]f=*e͞SA9$PTu% ` C:$ CE8Oj %]Ŏ%״|ye> @0D2#D)'ފU+׮b~}n3Dpr!Fλ%Qz6c]wm!jw֣eowSn "8 x}a8bwaX'8c-A?DhYeժ .8a#`VX'yQSs湲[#Y#Q Дh Z:(tS7BIFiȌl۬;2c2Jj{Ӳ֛Z{鶙̸)zK15@@AW&L gٓG$3'w$˽VX| zO\-$ BNm{WO*A7hg2==yBC_?@H>+dr @+HV=Ll:_=o#IBD׵%0]gcAo7`bD^Ú0|e_ /P qtV<6!(;7y{z:Ȑu3 5d b E5ϊo4@),Ic,ሀ3h5 `n)1&ɁFuܗS76acQJo8@,t$'&>񒘴7Iܯ||(O)@R{ 1Vc Rr4#騲H~0-XI[N] _*d kd̕ c!@<f2`5WT%ͻPX}P/p)3=9OʳB|%2*UR ?taC89к3N T%E+6%N-:O`)G5@!@*@k9Gf2I<&˙T:MpLn:)%* bjmQ-MSwP_ -`XUT<O(͍6dk@ \$]u!_U2$/,>'OB1$],cOeq^c) `vs<ж5QkZöu%U-PI+q+i@ZψT%ƿ \aVnWMmrIEyϽ e([@V׺B.nBoOMI6굓.S ٺ,}gU.p{~+Nɬ'u,\'ر nnd,#ZU?&`3  60 ޲W"vK0W30[۫5hv_ErqZ'!رF֟s%d$KDja t;!!sH˻.c(>hN)ʉLg9D]?5O5@iKp:#Jfu3k8Wv} &B:B> ێ3Q».F4uxA5<JW;EZdo/%/8lnh[UbPjRj_3AL0hhZ 6[]bavc&s\qN._krUW١M.ܢ@t1,qumȚAnScS%lMG_6czt{<&a#l}YnEڵMN缫-Sܛ,S6$<xpjZ{߳uO#:d<JxO}tVwQ=Vʝn^f/|=YGq}wpyo_ؽ@uMxDX<42Y>>ܓ!ދK?<>C0ڽ@ AR7 0x !?< wʳ2sC>?@+: $Kt2?0 xhT@袾/:*234 û1>DpHBXB ''?0;9&D: ECP>\2$@C"DEX ` 8iD8>Sc.TLdt2MD7th+!=+<8Vr'E$@ģXF2CKD2D|,f\Rѻ+ctwG|<ƚ ĉ?#A,dHP =l< HȂJ,HtLGp 8xX ?SH: :$JD6Ł4J'54uQmGD=@QT <|JА Q 0Z!46|P$474F)-@A$+ QڤGH?RN%mY#O\WdYSDV",1-(X4Nu@İj]3I Vp  ׯ>eB̋!˵=]xuF]H-9yL9ܽ|Qϻ:-…u]L73PΑw4In]^V\W Y <.vUeVDXZ9e#dhA\i0k ,XMWEW&_xA<4ז eUhTQt;T^hANE7/,U D$h=?`](T&&+ߕ(F54vp3-ZS+ӰHRUI -_xI?zԉcb".1`Z:;_)}L,aջQtx`|auf`5RI$?4<>>f#Y~e<ңw=Q"3,Y8-&ɸ?HaC5al PUNVe˨` ڵ2%?Vz⤙)k 12d/daSjacAe63Cu"&T4kY¾}Q~VXW^VIifvV)Y_jF_P[Uh6-igi [ѕ_Qi^_|3v~E9h衁rƔ&y9PwqviA^j&N.6V뵞 f뷆븖뺶뻶vD6FNf~džȖl{ʶ͞l&Ү6VAvמk֦ؖSN6&fVΚfpnno&oF>fo!,BBD~|DDBDdbdTRTtrtlBLJLljl\Z\|z|D$"$ĬT䜞|~DFDdfdTVTtvttBLNLlnl\^\|~|d<:<\8Lծw(tw|hLՑw|Lx|Lբ|w0| |8y|  p|x0|MwHw7|7w||,w#  w` wP'bdlwlw|OՁw|ڠwH8yw|9ԢwwT  |1.Bw| lG!||=?w |G!Bgb?w|A/;?w|pl$E|A;?wwm|wH*\ȰÇ#JHŋ3jȱǏ CI(S\ɲ˗0cʜI͛8sɳϟ@ JѣHDӧPJJիXjtׯ`ÊKٳR]˶۷pmvݻxwmݾ Lpῆ+^̸㤈KL×3k̹sȞCMLЦS^1ְc˞5۸sj{-㹉#_μhΣK:سߵbOSӫ_=t/}ߏ=?"_ۀ& k.5N&afvم(bmE`(&0C4#8h"(#($A9$'L6K20GR)dVYe@#[h*2馌idrֹdvډgrnɧ H)ggt. 2 ij(HЛH@ 1cDJf NJ6* 2I뭖±)v*N @2ʫzl:**c."{@.D$P,n;6KZi_)MfnEiWN6µ*$:'|l>ۦ9#oL|r;<y1Efx_Bgˬ <{6#x(nڇ 8 8KpX\@9.fMm 5yW_c 4p{j /%} k;۹/wf-(cTդWS l@EjCKa-Ěbh ߘ80=X% QP&Z\#<*JϊcR$,Jr!(Nz! ֝,yqY 3@ _x~:+kgG0? )WG!* G%rSZ"H)&(KoMI횜9M1X3'9cZASzJW1r%hCX֒Moa2AQ9 AHPLBdf*NW&7FCUsfײ5Љk ((/hƪE7O-KRrs{%!!pP |S:(6U^?## o?m|dHMwΩ'Z”S;+rI!$(Iȭ"s([3Wh*l%6BQdFD`+-+Jڳn¨޺J"g%yz"4eWR0@azX!Thc;j(&vUYY/zgk:R%W AO@"tN %*_awJuT"c&\!-P #tp߈>!mvAJN-򾛰4n`ꖽb;Zҷkb|l(spܯnM/J`.,ڎ v9PY@ CaHrXNb*yX겂o'&"Ɓ2s7hq:c,v+-z,ߝCYI<TLXKkd.d^R-}@$[K.bd" VO ֥1UJ2~P ,(ȹ4 Pc<۱2ҋv{{X Z@NsFVjr`[~==]s0w;;Ÿ3OD߸ڶo^bɠ'`! 4|S6 F/Vq|+}|oTҷ#.%i6yzU5254~@L~fOwTw3;:3OGV }y*Zqzr z-(|52, p#b{,fk.264fF`KO_{+tyh%t@b1` ^Y{Ub(BXx#ux"ׁW nrF|u4{h;t}(~҆xz~(Q%##s8=SV9vIHyHq&Vse1ӈ8 S7ׅDxȉH]n(X%ьQ89؍(6h>Q2%b$x*%k+:?"HxcEWxO*h3JUE1T؏H"7`T]rPRQ~D8bBIȐ"B"Zci$]w'idl )7& `d3-iXFSB @ɓNA,x?. W!HCF℔eYJ N$OB.Dxz23\+;YH :e30Yq),$Uiu ?5•IPoW 'e)lnYDS9T98%Iv}i# Zyi5*٘GIR9DY集5=)“UgіdI(.Iy.)buɑٹY|F G"QD`siBI\H)Awpyc1Fte*Zi9 *$ᤖ9y_vɡ 32D1o(C =%"d ZgBQ(65"jƙc$Y"" ArHa7sǕsK"eU `#^љ[bɡv ^ȥǝ0ҏ2P*>L/Z1*§5mڞj霃KUiYiZ@13r+J,`JsJ}(I)aJx٨h6#E7C anw )O"(ʜ9;zT2ZDiD0ZZ窱jꬨڱ\Z{گSj^Ԕ[!zcr3#o  6/x2$I jr4UB۲}-ZyH*G2YF59}L B*)D#F+#Jk9+{_{T+vVKJH7`7BV^سۤ=@^Gw4ݬӰB8P2pQ? =lL-tAGEmiڙ\^X+ UDwiMI6[@M=wQ"I9z<~,Ñɼ97tڈ=Pɖ8^at78aT-01mwީMo=[[+] |˲V=\ !~-&tWDaʶek׫gbU[U4/u(.]a@M-[*2n0Uۆ:eK,L(&\@.=!ZUHJ܊Ezs8aI{ĝ?\Da$Bo׈Jl97@rTt#Q5& ]t :?. eNƛ%MϤ팻+Qvx,\#`7J n™,`~JhШRo떾뼾E fav"Pヮ|a73$ތBٞ^~2`%005]d.}:nLdXMX'%e$OvӃW}5[Sa/wÃA\\Ǝb.ٻ)^dlQ;Xq,2n0r?²_+~^!ݻ n]zQIWLYo!9+w_Aĥ6EV><@c5w{> p>,a0<'t/&)ͼ.AA3~f/L$ÎαH8S w  DPB >@@Q#LRȏ#M$QeA']Z,ّcFly||tJ)B$p@RITiԥN^ŚhK.j6,׋:lF~WnDj5"HkhWu+_~g]XbB% xq6JN L:+F=VY.S? .0.=O(P6 qЫ Q7!8ࠅ4@1ES;4 U"кB)Gre H#r#dI' R4(+ 2K-IJd24$2kL 7#`7|N6LO?1.PCPE E@eRn<̥E9tS19MLPQ+u$IOe6=S4K-NVgs(Bb`[-|aSKcEl{M2eZme\G^vd-WbwK]D ]%܍k[xxA@\~]׷NxՅ&N ډa4Fk |cl_pJ`JXa>lmf%(-("땗iC{jgnajibJkl|A.c$;h2z2 BfjmMj]jAΖ+p(1% |:ۖ8n1q/@N}_4wOl78_mq;Zx OwEx` Md3蓮G(T؝ ΅|}O~y<|zNW}*\ b2 v]Zwd?坮E@p?.VH[* @>p~/W1U8趺Q4!T4?n-QRؒ6}jaf8Px5 G:t==uDnotņ9lp;^\A/J/bv: J %F`-v !vǰ5@ i2b1( _fԞ"HBI%rII8bĒ#5EB!@(XSmܡsv^O3IP3ܥ/wIa˔䨈ŋXslڦBma6dG j\$u_Ut&'aU)/Ӈɗ>Y41xf/2B<ӡ6᳚ZdFFMjqbF|6P}\hK:C 2;J%!J0%)#SnNqr8¢f򤏋! w>yzfhAjb*g* AQjTEpx[SS֯نSEØOYVue?}UV#gY)ڥʐ0e,z:tb&6Fh4iS<+1LԦ* Z2ɩmYzv|<ʐN5nz_I֪%6i1~pڭn{ 4ˏZg,4w^U'; [o oI,֬¼5 ulvh#R4X(HӤǕm7Orn#\r=.׶In&EZ(dU=RLp6 1^u }Z}r*Zt:=CAQ>:Gpyַ^=Rw3C0>x5]5~왬/o e-f9OWдMZHj*O Ÿ?-}kOo=Y^6G]c{ޚY>+>XֳK ;{H,!??˿C)3+8dɃ $@>t8ۨ=z@e?%$?`ЀH @=Ҩ>)>ۿ[˻ K:m{ 烾A̻5 CI@@7 {|K02DJAs ?({@O$ +CD49y[99L;<TZŗrS|d=DIJ,ʡLEĻ&äǦȞ\ w$[;Tt$K4%S 7Dř@\ŠQ TBˣ!tEV|k849XR2٫< AKWi'RScڭ Th;m ['3^PM͌m\]^]Qx[QS<[YJr#Z~ P9_CC=Nl\%Λ,Y\ε/5XKג׵ ۗԓ`Dx ͺY$ #\1+bߌ_sBuշ[[eb[Ɂ5Wc%N'aas8b9BB/0U(]սٻ0T;0;;=V(<=F3Ωmp޻UK^sfm!,BBD~|DBDdbdDTRTtrtlBLJLljl\Z\|z|DĬT䜞|<:<~DFDdfdTVTtvttBLNLlnl\^\|~|d\8Lծw(tw|hLՑw|LH|Lբ|w0|LpA|v|  @|H0|MwHw7|7w||.w#  w` wadlwlw|OՁw|pwHvw|9Ԣww T |1.Bw|lf||=?w|fBgb?w|A/;?w|pl$E|A;?wwm|wH*\ȰÇ#JHŋ3jȱǏ CI(S\ɲ˗0cʜI͛8sɳϟ@ JѣHDӧPJJիXjtׯ`ÊKٳR]˶۷pmvݻxwmݾ Lpῆ+^̸㤈KL×3k̹sȞCMLЦS^1ְc˞5۸sj{-㹉#_μhΣK:سߵbOSӫ_=t/}ߏ=?"_ۀ& k.5N&afvم(bmE`(&0C4#8h"(#($A9$'}L6K.0GR)dVYe@#[h*2馌idrֹdvډgrnɧ H)ggt. 2 ij(HЛH@ 1cDJf NJ6:z(+ Üf5~/JK-ljZ1PC$pɖ, 䦵rJp'@o*EywN#_V|r2pB; 43zj0/ 0 32&SSkȃ8shJ0OF>9HPŬ; ,+6Qs2]^y Jhm nv wr<O@yfPԧ=@9( QqmV,7AeO x]d,8u+.Mt%Ai2 xA}Ir1lΑq*a>-p)DU:M3S ו=aomv/1ITDFБ5eUqCA % H%(CF"%|U91|R\ъd'biƺ̈́#JRp3 EjJ?C%L jӣ8 Rf4eW )N=ϞzΟc@[&Hk)T ep? 8q5o5!;xA9=Y|)Œ-ix>:P2"@Xka`4A9Ջ|*C9URUUiW&WݴU(&GA Zk'9sb5꒜ֽS#a]Mx6{ & =.I*l{YQ#Yg7‰?a;EFaXfZ[$$J un1* "װsߤ6թ5aR5S,;M>aU>Ir5Y\%`zU!Jס{6\\WT-/N"VM6d0dd&erF+2~=-+k! }?ԲBy1p+c }-qsc ,@;R A\"oۥ&8BO#jlj޷ 3\K!<3Lc}s43q 9pYmÖ1m :s〰9p:GID#q Ĩvl Y>/28z6qN u~bZ~_nҹv K/Fn *3gg})](< 0iՖwR#BЕ@ O{ 24,X[{g" K>8K \II{WxۄSz%<8W{I p΍TMO=Y\4%}-,0^%Ȁ]_;TyEN̞yB+x9Ay]hb*_V+m S=?}N饬 Mk>~ÜD ЃzUyҖ1?w=~\*T 'ՇPC+f88_\J%vڀvy:A'S$7ne7ryzh15Rc9wc+ȇ2PՈ  Oe~?SlnY=L}#ǁ=p|jf('lE?q'AX*A2}{,(O=a?d 8l(Xbez=%s1ܸ{xиns>!k8Η@Vӎ 8"9+I5P9t"$y;%#=xI+y6yidix晌tXٞi6x)HljiYmH#'JC j1 頼&y99Eqȡ! *5Jk.bٙâ-J/ɆHG9ʞX(>#PYrKeܹD*v8ܕ<)MZPO!*PRיy@'pb)I p|;5Ӧ ]z"`#&zhҨ(9~ZFz5ap(.z_6'*tzO_sҧaX)aJzJewҪ;6ZX<֫aZJ] 8m *ZƣZL=Zb;^~_Jd5B5yz¬k g" mZ*6ʱ ˺J(+jJ⥩j*IKk5Z(J#벞 ,*ꫮE9Kj";ꪮB*,V[35R|SPz#H`&KWD&=wIe:/[;XGQpʗ>|G)[1 N1ptظK˱-q$ʷu2*MkJj A*zR>j ۛ}=L;ÑuNJʺ g۩;WG{1+[0k){i-KQk.9ZK?1)s:<}r}Kf:sd4;ǘk ҮGː0cHշ[;ÊYʺkyCžQ AŠf&O)_ٖm9f!'%u;R"|i d=g)ň{x(tZ ^|07zGv\ 䊐L\ :bAe Ê(:**3?­yr7KB+D "2:m0Nk,ɾ̜,):̮$.`&L+L ᨋl*iJѼn#O-՜68nڞ@Ǽ$[V xk͵| bQ+,ʱKrD,ʄ2A|ͫќ$ L6cs׌K}:l< MM+=0[\2Фx'WtC8P25=4,ó Ħ:mа\t}V=2Af6~], @~lؼϠ0o)<\d|SMV׵.aZ3|L}9 4=Ý`8qdA|w,Jոh}ӐP6έ˯-@Ҵ]ۇ*LlS_+(^(t-=g:Ѕ`Urݎ=88]ڽ$0> t7ޝ-ˋA# =EY6R7|& B,f}c.0iL9~TǔN3.00m# =-{OBR\/ a#zЍl4}Mܭē NS]APB @lNtW~1t?`=["h-%²<O.B)n^J5n.劽0 PNYbK"}QKNҭSs.(b*b !\Vk!@ ud>~N@lNf%{~9^9J#f$p06~ڞ)^w^ޜ,s.{zןjL `ɝk,ͶD Nی=,GFw/BՎJJ/go诮,39_81/3[:+..-aiG,+0ܟV讞^t\M^nh~ՌOJCTR&--IՇ|E9/:]$9-xN7?iW ?,׽;|2,a4+ =n:t ڡ?+Ҳ }݊ о9? DC\QD-^ĘQƉ< ~R$H&DR# tSC5!I0!=} `=`DhRm֤t#Up%bjH͛/n K+X@M痱m\wgKv;[΄,]zt#n踪Os*G8mgqe#zՋ2L;󎼱BB #6tDTD>< 28ZAgqFFAMl E|ʻ@Q%%dRI$l2J)z2)2K-d2&sh1$L1[ȁK5lA؈\ N"0;# SO>N@ԐCE4QE=HBAc4RIuQKћ4SF+SPN.O?>45OR)O_MCiŵX5^35F<'e)hS;n׶MڙֶI>|MX9*[؎me`6gͅ xk%4q$|B7/ue=X_y8J|xo_" `3>+XXY% b՚ةZ|wg#!< ,JhBPU3ءks_ffrBlˎ [#dXn醚G*)~a#íQH q>;vzN>G zN '-lh!H*)tݢǗ3 C :^ʃH$] J+/r3}BP ~(F/jыKl"2Q{s,OjMTthq`R$`$r Qy>1ge3JpĦSus}6j Y$ߕQyP%U(V=T\jJ*B/i2_*ҥv(Hz5:re#3KM,y?+?ѾLXU{̵zlRXYNƘjmpA'O@\2{nHS;+6/;;DzwkMkOMg~< Uzc,ݪOJ, ݪrw%g^zk~@z /(+Zt`]_-_\)>U݂ғ/P =qp 2ٓErϋٴQeWfI-ձTH~*G\>#"q'j, j. @9MJs*m!J&JŲM[~pAawpF2n3{  P#gs=Msu޴r WeqpMm5~z'Cyj|, z빍D[9ݘ)EU:*Pv:2` d7\XV7C[\F(OpVݤ!q)ſ_c)S'/IH\\3 xȼb'\R))6ȳ"yǓtq!qquΌ]geN|2׋om\z~n*K(wzS;uX{Ŏ2k[]"eIb Qߞ /ǖ^،Q<9ZzT_[뾽⼢6%D &B'?'lA9d=<>S;9C2A4џނ>X[D-\TdЀHٓߒE2rB]>^\GDi Et,Ǚ8A뺥ggdijDDP;qHRB֫qd@CĊC!wTu3;_Ǒ Бѭ}G}$sD yIeLRC LȄdHH90| ƃHĘh@ɾ $?@R;Ids6z3@_"ZGF#0ʢ,ʣlH,,,ʍT@A,t v83Lx– JZ@,ċdIMɺDt  ?? ʿLLHarB;䉟̢,åL$TѴJ;4M{˙Y$4J̏rMj>0̲OJp θL·̳Nͤ+P(NT |dOoŐ@NJ GT5:8PTNA F·BKEм2NA uK< %QT%MO |9!aUOPJ@2CȜR,q9Rϧ,M' UM)Uu Q#H;ۖ/0YH8Sܓ:Ϊ7r}ȾQ0@RR4TЃR,KM\0mΈ4L4Q 쉯 q Ա`չ;exdOv!R1M!\ԯk'-ME]]c;رKԫT!Q4VC&mΠXVāTR HW,Ex(MxuYyBHY{o4V:ʜmcRQyfMg]URbʲT!Ψ X|Klu< ؏m(`59u@wE"X u@Mԗ J~>,Q|Zۡ%d?--HUڥ=JP [ݼYC|ͼ80,Ʃ_=@mHbe+\b K>Fc a(ZD+Zc<M.Yߝ+a\/6(ޑN !M0?U @;'_4dyrf.E\eZe,QCA:l<e .eNTR'یQg &d[^iaXh8iY튡V /AfjގN:j*yjj3j2A%9ً#66wFfvP뷖빦`k.&6ljVf IƆȖ썛ʶƕV6m&Vff׆m٦vFfmf&Fl1f澔vn &ozFo>f^o~o!,BBD~|DBDdbdDTRTtrtlBLJLljl\Z\|z|DĬT䜞|<:<~DFDdfdTVTtvttBLNLlnl\^\|~|d\8Lծw(tw|hLՑw|LH|Lբ|w0|LpF|v|  @|H0|MwHw7|7w||.w#  w` w@adlwlw|OՁw|pکwHvw|9Ԣww2T 4|1.Bw|/lf||=?w/|fBgb?w|A/;?w|pl$E|A;?wwm|wH*\ȰÇ#JHŋ3jȱǏ CI(S\ɲ˗0cʜI͛8sɳϟ@ JѣHDӧPJJիXjtׯ`ÊKٳR]˶۷pmvݻxwmݾ Lpῆ+^̸㤈KL×3k̹sȞCMLЦS^1ְc˞5۸sj{-㹉#_μhΣK:سߵbOSӫ_=t/}ߏ=?"_ۀ& k.5N&afvم(bmE`(&0C4#8h"(#($A9$'}L6K.0GR)dVYe@#[h*2馌idrֹdvډgrnɧ H)ggt. 2 ij(HЛH@ 1cDJf NJ6:z(+ Üf5~/JK-ljZ1PC$pɖ, 䦵rJp»B'k/PqS+mF\Ħ @ef5{#G挞5|g2khuznF3-y\+z `-6A 90EA3\=`{c-3k,(t4QO#ORs<(\׹_;-6n+Kh ,۫jj\(0ƁRp}vc_v*ܶPo7˫{Fᙩ[#ٓ*1/~KE+P (If.!MmsU d:8aG?~w}_ !h{ OAy*@&Y6'Vf(Gv|joxV>a!+vAxID舆̞8J/L C~I#FAŝόP@U1sCa㔢MkWGH@CD;e pEݲ()[2Ir\n^1TT)p`|PFʱR,k>dWȲvY} ~ L`@ H# h$LE‰AgA͎nc |!mq r0 'y(eʕd<(>ХLò%`A} N1LNQ4Z;BѧK"G=JR 'TJ2pΛ9O8:: l`0ni􏕜,T)M}*1 nC&RFhźjg5+}) |8%AemlhyTP`K{]l@2%(0bժl!gGpc5iCh֕  Z? :0cBUWUVme. e%7BШccEب~ӝV< ggM|.PkX/y`WQ2x{әzu(6+~yW]p\\xD̐rp%djmM̥wAi҂Wr{bV U@H5%mn)gcOp{<'+cOK9pX0eE/]z1y &ґ^y9@kWդ`"%jm\c<7I.TX*7$H!Ṕ@?9gHC/uju9;fk8u|!& 1m"ʹ:)B@:w̷=u^U_7qV5d R{݀܆,(UdDZ#5oO$h&MQXb62}V is z0{#H-Hw$rnWMyq S^Z'Wϼ|` ,XxÏ,$?;8/وh# iKɮ S 7F$q{Qܢ[2l d@6{3;׽*Hn1ʰ8F` ̦No!y Bmg~5 :浻W;Em/xi47F6=)CsFIQodO{u|ҷ{A$ n*2 %VDW'7Fo%~>s{gWcvtggk24CGYPd~ϗ3uY<(U$SIs.räz|w!Wx9#[:wAA{e60R5C؂"]C$m|$g6(Qhq*BVf'q'Rs;4rc$zc"8E:KLpE{hdmEDhQx~g"({x&_/VSrs~E7XgˆWD[ eXmXg0L牃X41}T8RPH ҈3?%5hxĘHx7ȈmhE(vg[xS{˘"vW>2hs=%`uhc]lxղ&5?w9X+5.-pp((y-I]E;lcX%Q“B :9-nJLhcTY0S"&@RV"[Y"hӕ)h!ci|;! 閷VEk~G8rl+{.p+.{GvyIE΅Xw)yY}9.1919 6iEVwnD")2O+UWl^΅^Yyٚ~jyٜ5ɇ*c/^KVx騆/ciÜ`k3ר(#y)ɋ1Iey1Beytٙ8~4?aIyoɡ׹ICQy&z+zJ' !:i |L3N5ZKr圳L㤤ơ( )>U;IzYgWKٜS!Okj *9'Smi:֠(P5TSJX8zj8@V<̟7 M̪$.`&L+q<q[l*MͲguE-LLN;[J@KFlȗ Ѳɳܛ:Y$6.0ͅA+ĬMRZ g| }J>%xT_>6=0ςw,=%ҩMh{ʈl)]d Ν/]6 W2`Ӹˎ ;m=ݰNBЬɥJQ,g &6Tpۍ̢}]HMۣx|z݉ja tm4b CXTwݏܫz}d B nf=b+a#1Q/g=ߙLK݅>\YSF. ~dLC'E Pk=xMۨ$DMR/໕A 0aj7Q9N^=,r:PBD*|=Ac#L,HibV⫽Z~V <0~"`Qz ~E-,W~rEzA.!* a!6:0n/A(Skk;$TYF>mDqlb_B{4A(_n@Pp>eCh<☍~mn)Vw  ,`|;>~/P"˹kkqd8MOFA֍My<((_Gk<(~.;>0/L=̓=[òP豭E/颼wyT:/J A^Q@J3Ct?$,#V+Sf_4>Z%]gMu`ۑlxQB,^ĘQF&~R$Ȋt@W8RLK͜=1ǚ y^d >@z'Ѣ vM(Ply5;`ݾxT+ǯp=(˹1O;6\׭/? Y k|]`~>6tٵM/ּi$Scn{$_N^ Npō0Bn/ 粣+[Gݽ~x͟N^=Cݿ>^9Z@_~-r08뺴 n=0p%tC?1D=nFD1K4EUqDEQ$C-ɳ !tB{phF#Q{m%I'Rdk,(cPŕ(dlp֐J3eBS+5ׄs3/ K2οl 0D@L6z3QQG'uH0,RKR>)u PB/ QRWOg%U.5;yUinm؆-QGŕ&S5B5UTYfկkE1 r[q2 z^7+\eHeESƕAK|AH|E'xg t6RWu`: XBc`5fW۷V^z1yۺ#}O`DaG曑J|ӗz0!gxW vf-peD#zꐥ1ykr%9W^1t}@Pl\-=u껬-嵬fn6fۥ9Ϯ5mJֻr[ǵUXzX<.z|󅞅1Z/(xseUs/ /vwo[eWOrug}}͌7λrjtNNddÿyaW1Fͭ {?" L$rwl!0+=RfߦfAˑH4qJF%n߳^HYȈNTAft-S J90ncvM#uZ)krJOe7!Sh%)Qq ?Sosljr̚B1N*$lKEFܨ7MBQ :8sZJIR4r"ќȗ}ZCJȠ~ѤEM|h @@,S4s\FXU})D*ڸx6i[$S;*T_5MDCkM p%לkc7Qf&fdyYǫI"Jn5,TB28UzBUϧËjKN{6P ӘdD(Pq)0) @TyՋY2B)l0P>~EMi_R|eɒ`w^xk8nALx;!UyQWE6BZL` &ZI]7M)0-daO<$chˠ>1)yj*3nAsՙDvN\zuf@ d~Qst)e$iA7O36 ͋|&b)t]z6仌Ks5w"4a/ֳui@ШF5[-k֥>qr} &굁˒؟ lmc{7o}T5SmsHa|rùn>Co.4uTE^_6 _f'$-UCbڨtys2gʛUC,~c=KPtCғh}v WǺMQmuY|=(unN/<.87C8YxiQ+@nt2)v_z^uS_ ^"PZZN9.h^nlxs$?UIj$uPxGӡiYR}ꍱ:֥ØעeGn>F|۝w=Y>qm=;@x) KaF[7 \ cЀH0+;.\(A@0CCwZ>[a?̈7d[:YCM?^C>CXǘG|ģ1Pt*DL4;*@É!4-AVX :?$^_ÓSAXDlFEdIl-f7D7 T {#M(ӼTnaaKNKޓ9O H|;Px*%Sf|WR(4lO4+38O$MDO Id=I1;ˠ Q- ]K D1H͐JlWkDA !PP*CK̰>1ύPR-=/I!/=ӝK3ak4OSaJSS$l2ft!%R VaāR HTl6frԐ4̪ԓhV8ߣX=rav\EV$Յ;QY<]{;ĚnqWȕP YuѥS dTFuHHVb-`dUnΙJ"LqTգ9Nu$WwTtGt]ͼKvUhKӾGLW|C}~5AiL\eL%U' TB @T _S9P Xp4m+L7RZ=ELWYvMSg+ ,J/ZQ<" bLbN=U6XĠǐ@ HRE_3Ou5FkMMVLXbq֒ LYlyT =4EGW%8܇C8};Dl'D!:I؎ݕ$F@[H];Ԓh]=إ .}WS9L۟WSAeHkNe"ҦFǸƂ  \=0^հ^+D֛_3=_ݞt=ݝ6E] 7Z_zv2 nN^P6ZٔKѽ-{b0V}*͍=M6_ -THNB^ὠ9nDX> CǍH(.+)Y,Ƙ-~ȏ̴05*\FArј5er;cl ^eʁ >ӱ.jd`a.=+0^o}<ȵjv <<> s쎧׋C -f V.MfڠdMN%yh5e>{ Fu^M\FQk[SN^e?y;ݬV|هft6~}88&@ hP4֓eQ陖(,V i=fvjq觖ꩦꪖ^j#6Ff붞v븖뼦kG&Fl6f6vȖlɶ>j&Ҏ6Vm|Avצֆ٦m(VBm;6FfnWn5Qn޾n&o!,BBD~|DDBDdbdTRTtrtl$"$BLJLljl\Z\|z|DlT䜞|~DFDdfdTVTtvtt<:<BLNLlnl\^\|~|d|\w|hLՑw|LX|Lբ|w0|g|v|  P|X0|MwHw7|7w||.w#  w` wadlwlw|OՁw|ڰwHvw|9ԢwwT 2|1.Bw|27l〙||=?#w27|Bgb?w|A/;?w|pl$E|A;?wwm|wH*\ȰÇ#JHŋ3jȱǏ CI (S\ɲ˗0cʜI͛8sɳϟ@ JѣHLӧPJJիXjtׯ`ÊKٳR]˶۷pmvݻxwmݾ Lpῆ+^̸㤈KL×3k̹sȞCMLЦS^1ְc˞5۸sj{-㹉#_μhΣK:سߵbOSӫ_=t/}ߏ=?"_ۀ& k.5N&afvم(bmE`(&0C4#8h"(# ($A9$'QL6K20GR)dV$Ye@#[h*2馌idrֹdvډgrnɧ H)ggt. 2 ij( HЛH@ 1cDJf NJ6*:++&Hf5~/JK-ljZ1PC(ʲ*nZ{-Jl۰Wl1:F޶1+(/$/é+Ѝ43zJ0/ʼ- 5r<2S S]o`{-P / Ƙ3\-: wc \ku,h2 7θB?W.'ycCh' sݫ׌6Ʈ&P/ݻ2@ 2>Zԝ;< FqQc{'Ȗ7{ , ˦m̪_wް6c/(Ũ婩i<HjZAnmoctsh@ +}[['v5jd~2P:<  gM $  ZU N_\>x0:IBa؄!N>amh:aXǸLqtO̘5=p 7srӨ8+jq"geD(wcd;y}N PoYmãgGձu-q:X ' & \M4\`IJ$,i6NrˠĪy2pd\)?7rl@ \9DI|ܣ-\␞lbV˘=& I0_Hs2IjR\^dar(ѨFtt"Ο*H%zR' g)cԘż@1,H'Sdh%-jb**6d"Låasc9 RQ(gK{r/5HjTI;MsSFTB)0KNd:$:թP`(։.e2g)ՒRMe-ںxfbUZ:5 (NWS! PI~d;9NI=ܳW>Ut&fکtZzIۜ{Kk@/S̜B[6ml{XrK=DM@}WB'huMyYu`‰-jLNX6)b^h6λދ|WTSX2Vlp 4cWe`k`-V#o-LDZX(VL& d&X/w)V}a p6'@VJ 87^!!ȫ&&Sa١ro,n1֦J/%2pVV` PCw Ϻ׵cFʂeGwRw'/Κ4% +ԢֱfjT.'({kCy6v~ 4'!+Kd"i0P`5` [?G>}t-؞HW[6(qm~~;mk(&!rt|u2t{O<#Di2Bx227+]T_vd}ǁ54$86w>i0GyVoƂx7NhIC} P20IPV-&Vf{8W\#cR P:J6 |KW&(sGlXt'}Mx+gH,m(0)hAvKWy_c'O8?bxY7fVeA+y8FwdlJhpȈ)#">UkׂyYx&s8+Ce؁ȃ%$50 Px(ׇH7 6-P%qQxQ5~xh5P1|:3%b$8*%ka+bCvG"h0'* +3FEؐﲐ"]iPm48QuCa^ Y^#hbҐ>+=L,)72I2GI4I'4YNt@\Ñ[lVɌDɊ(.đ _ҔPٖ#(ae/Z[K+vg["}ԒhI Eh9B–CJpAitpu2ٕrٗBI71b}m%\_=h_cYyA >!r0bKwZA+69Щ.i)i!IcE4B;Yt ؚ霨D6"I)q ʩBrK8 w~pSo&d(YkP)9dSuɘwʚIsɘJBZvIOM ʞm )93{c+ʡ=xCWi[EX(8 R6zH:*qHE/ɣ':TP.5\-Uڞ55*I42; N9eڟ]NJʢKjlZXV_wz'yI:ڥr,ICZU˹J buMJ-z3 |u*^jT꙽Y8 _$jjʺTb0Z }*7:Zj>ڬٮ/`6RzMZR(کڧYZ!m:D dr3#Le~ fbv5(K# :=gA*9>doɘqG#&{1"[#d+ڦymZ'uHk0:K=ZPk̪ʵ᪜`:[t!v ;0T*N o*AJVkbwE۵t/Ϲ,۶Ѹ9W+v:6 f_{V5Zʶ[3[ڌY|TbKԜ-2Ů;J{Wۅ|۷I~ *îrje~ٝUi ,C)f=Qؕym *7RG-gҠ,7: Xw$du=?]Q @gpENk$"btԊZgq-lcTDE5u:f6ڠ=6$U)]ƍ= _6@nT]a![սQٻ7 Ж9>ENMn^ n~\Fb2?=c܌E%jX]LozEMLZ'MCōP}l;Y pI^E.n\>^`N>PhTldM0N|Ae"muȞ 94.g^C~̏dYuw{xQj]N^Pf `ҩn>N%o#p]{rS&E!#1ݖD|'$+I}QWXU>즜ܔ缬3[So+/kgĿ>c,8']1-(pCM8l:L; ҾgBeAsl-܂LlKU-_m>eC-FAhd'S^ق `M޹3઼9;|t,$S[:A(&s([]Om~J AA@ LBpQD%*F=v" B MLxR%B-]J|R5m޴gM; ԜTPE#\2QMDҧU6*aJ'vmH*D;1ZmB`fKPսWwקͱ LXbƍ/>YrǕ-3eΝ=Y"5"FZEB:r_s}@n|\o‰ 9oX}<]ti7޲vѯgjwտ7=wſxܸy/(H@пZ<৛|/86 6Z(/0"D5K\Di6 M WlBP64JHQI'JKhLDžx@!ȮdS(73N;2# S=T ?B_˿ثIQ4L<̐L+\RtHMP %>STI=Plr'F#lt'S{ @x`T]S*YE >4! |hZX6 1)OA2q]I[|UۈX5uרdf?#@F7"3\p%afn0c_+9)MWH|?SX߀ٙp@(U8P422x݌u9 Nviߕߠgy:߬"b4mKՕl$mLjr1L?;k "Z.<;nSEՂ /t5Dn"Ʋ^Vtdq>oyq=Ȼh-Ls8j>w; &Rxyh>aq'+0[5GGǛo%}W9@ݫw\ɞ~v&m\t L0=JUz_݇bI~6 "a;Ig^V±X$< '_q8TԞtE&@';>q#Wsō]5bjhCEH<1BMcF 6*s5PnX{%nD#(1C ӘSBԆ%K>G1Ay}R.rh,XgHG:e*, *&=Ѥ%/U%!I94;3J [*8W L.ww 7RҘ~Rd*_F2sEO|$Dr6g8M7%c9q"^TFwES3h@jƚR_%,HatBPu/A4b]F_'iHU6RaBϤ82yT4yW|w:ݦ< .c6yJJv{veoZng)^ B al7@aLT:ҩos`(q T<\MF+jዄw]ltȑȗ1|lz×M_(K{Pf4Od  DCah?_WSߐ4i]y̏}0}9/ugN"A}_>Ox⑛~}ks/)ǶJ2S ЁL${YrK8 :?7|&»(S3œQ8R"JpVt:@8A @J>jܿv4]L;#`?ö#)BD4cƏ{tۈ@իSNn/vSCs$r|2yC$FaGxdI >9ÂGcC;9sF,H@}9aF;HǸlHnS:A%qJa 0Iu츠,fyEE ǚIH> HADCIdFKftC@LћNm 5 #,ǒJ ˽$쑡A+ĺd<Ƿt`HM~b4¼|`r;*Id8:H下xQNA\<2䫵$MG44 FKk,Ɵ͵C@ ;\̩dP?4E(.KjDP<ʹDINIKʁIL[;fMD=>pQm@X-Hde)K")KI&l% I{Ig;5!4O+UЁ̬{H@KH.X7SXPHJҪDRTt:M?xNS$iba7Y/ɒCMIM m-Rc/tF'h)۴jL5mS8U:ӱd>R$3|+X]uԘ1t×(Uɭ@ @FQU%,UZ֖9*m2Q{UӾy[G?՜jڡ*AVFWq:|TK+r Bč@--q]/|F:JH p Wr RBX` +SE(@}mմ-%Uj 1F|1Z4݈ԟ,N~}.JL *KZLi=Z1AEN]t͏Z@FZPQW̔iՈ BPGeK]dK۶}t뺡@V647)WT:j<3adUܬ+%)ds$8 e=Mخ"0/LC qEa X!&Z?5,d-"M*[)HE@<>+ TDE* ^jH8QDž+N=3C4^K#9:_[ND5TTRK䘏=\l]eOM ]UfAV\XX_UK$F}. Kcb݅ MQ>,F ]$ eŮbSEZma~yce (KmնeB -!\fͷaT34YaU?C0-TD\:yuMXQH 08?%k _LΚpY[eŸ$]VZf#bXdNHCNghfOikljnofnq&rv$q6tVu.tfwxwz{6z}~ } &Fh6fv膈hu艶$n6!;V}&vΗ陦;^i%s6Vfv֖꩞j^jji뱦i&^!,BBD~|DDBDdbdTRTtrtlBLJLljl\Z\|z|D$"$ĬT䜞|~DFDdfdTVTtvttBLNLlnl\^\|~|d<:<\8Lծw(tw|hLՑw|LH|Lբ|w0|p䑏|v|  @|H0|MwHw7|7w||.w#  w` wadlwlw|OՁw|pکwHvw|9Ԣww2T :|1.Bw|Ml(n||=?wM|(nBg@b?w|A/;?w|pl$E|A;?wwm|wH*\ȰÇ#JHŋ3jȱǏ CI(S\ɲ˗0cʜI͛8sɳϟ@ JѣHDӧPJJիXjtׯ`ÊKٳR]˶۷pmvݻxwmݾ Lpῆ+^̸㤈KL×3k̹sȞCMLЦS^1ְc˞5۸sj{-㹉#_μhΣK:سߵbOSӫ_=t/}ߏ=?"_ۀ& k.5N&afvم(bmE`(&0C4#8h"(#($A9$'L6K20GR)dVYe@#[h*2馌idrֹdvډgrnɧ H)ggt. 2 ij(HЛH@ 1cDJf NJ6* 2J뭖±)v*N @2ʫۭݺ+Fر(M'  .J6;Zi_Mf"p"PẀıN> A /+('1oxӨ2TPG;\ԝSkqr#Z d-B/Pft?SbvY|C3 KJ4W +skOy1 WNBO[}fmh׵~}r٨pv'+3sDw>l~;*i {2β#~o%徺X= fqU {ǎ+$z¤z,.j.섛Y;]l@o5*``< N(s㰗87@@(\ >qs;/]OAN~f pP|EPO&0xtyG(ڮ#։]H<'u=rn!J,*# 7>s5Ƌ}$ Kr(d҂ò+W,&^SטּIMbw\`㦰K]:<+lL:@%ۓX+w=Z.|t: i1dJ}ʇK  $YI^]wy$(7qMX]7W (qIl }>%QKIM #1heIi hA66:1QV89e3Z,%FI0SzrU r@Ӎ$*ThGS4)Xnje2+jQI5al$٠:j6#}6" [CɼT" ;RlO{SEIA21{% Ѕ1ieѮvdbD)́C#Qwyg@f/*FIu&JN6˫ 䔞M`F^NWed PRa<1YzVKkZTy HZh۸տ?-K{W8@@FU%,(0s KҡtO,Ba5yyT/:PCC|mlg˾rkM*d6SբW!kKNK/w*B0/8&(ySq-B^dks|_2qq6-Hہ_QUr#}6-F}nj=2 hxQ 6'B^񕯯`0 gk,A#SoMLs鿪@՞g\H0U-Ci[{e>-Ģb ZdkvRC7Pjg"9_turr*JY`Ʌbvz>26C>%@[ϸ'+I-k–_t4fy<)_I #C;7yyTN.vlhu*U%Q  9-w9 Px)0S"&@2ĩ"[ǹ"l>)h:AɆ뢝9C(Qو; ՘*.":UƷHKsG牅 9Y+ 3*6لi.ԑjbH7=,+ڡxWٳ` 2ɟ}"J .:ڎ Z2b $&:0Ǣ;aXȗG#37ڝQ`_6M=J!Z(^:f~0Y:Wg3Y^+8ae5*ZeU"X!:#ڑv*F xX}NʦJ۩jӄp*6EbJp;X*$d(n ; jPE| ڪ{jI4*(osS硾Za#zǚ+zJ~7 =$W.ʫJ#z4ʪ$ZNJ3f9u/*~VjZ^+xsZ#Vs& ::%ɬ# 񺦜 EoBjZ.. xڱuIG֬/`ӊƣ>DZw" jL; @*AC3ڰ4JڲW OklK6S˨뭭fjې9.]:aj=zY#c@;33s R򚶊뵄Ox3#Kh/;kkl˭8+N˷+Cƪ*;.ʈu2JPz[j¸Yz&9+z*Գ$;v?k8{J*C򽰻 s\;ӫXDzKkw|ڶe ;;\:\k{~ ګq>AB{-6פy뱵7K+{;Ti[4?+0 .\~댥*? ~ѽM.mjP~X&Fҕ^ޗ>v{ˆӹ-54G݅B`V~nc;1?T&X-y7};U$nP!s`^;ynގt.DCDK*fz$67n;G_.?2?N;,3uC kWj×?0oN' W‡G5[1"48_#,-!`{IJ?PqTshvhAcEK|_cޏQ,jJ=q?܍M3C@,7NԀ8Ԓ_>jGsL?<#ܽhV /:,Så|߹oZ#ݪ.gG|EȽi6eyyzL+/M91 y7m@qA@ DPB QD-FDPF7B\h$F-]tLd9fN3Dx'͝ N"RM>CE `V|{@د=Ȗ ;V쁮mjz"׷u kԤ\wWg` >T>>.Xfg== ڿiZ5Lr9U/۶5Ee$8ōDy봫gݽv şG?zݿ_~#~o!::( PB %A d?1DGP:M#1EA4D\1F[Ǝ.^,B 5 #1Bɛm(<9${Z;uR\-BL L \mJD%5sbM9]"챐T@Q-KSLƬh3Mm'!ԭVSLKMϺ& n@dƫ/oSB)tmhW?uu0BKžqn ! 06vT2wJҠPA).y%D" ?&0[6hp3\ oAhMs~H=k 05J,aƘD[(K` q dv!o% ܞθH]g^3bI($Q5k" hDž|xT>A^,$3$B&/KԁdF$э&;Ёe K% nv_W+ؗJB8"@a(Ɏ[0CCO4S'<3Cfx* #ćOR&Ź;B[2[2! }lf6yI~z|@VB\BH14,|9`wD礨9ɀS"iJPyLUKC]EP<bҎ [H`/*;V|*TgK: TZS@կr&-`"?E?y%HmDJS-F]4jT֥M#łtBr*r ] T ѲSv!˚=i:˲RS8e)@ܫ=Yz<%ICהsq]tj2vdYf ZW;رܤ# ]׹vmZ[rֶcڼĀY6y;۷&ZWS.ܿwX$\s{Me@ sm}zN*_a:RO|xmie9vඹy9J]<6+.-2c϶gtVIt0u!AAQ6~"oe҂587|T#١uW5hM99Y^W'&@NuD;%Z|Lr̓!b5??7hot8ay> 8wd $AlZzZS1*ټMy>p;b"r[wO}֯|o~Ǐ.a#g=S/!_l^_!K #;͛>oK;p8{7n) X', *>[<6l =?K>Cҋd>+(;,Hcۍғ Y@9?CB¹A+$ 6;4|Ķ9J)˔CCxȁ/, 8$R(?c'$*Xv--MAX7B^ |?3/IU6dC7nCsC<8;?L; D3DAE̚qµr=CF :<&BhDO70D8!Z: dVtEEP [øzG=~D?(F :[Ed)7zF)FH;F*?أDQE;PMLMsPC:ԙ3TLRtt\GvtEXLxE:4 :b} ԼǴ ȁD+% fԳ J'ikŒ ]ȬDFۛkD\+C^ÒPGVlWD9xǘǬ:]=uBB`8TB -dl6i,D@썌,"̐JI]tSoiɶl÷Dt3yT؜G<JHO$<#<5zHlPɸ p LHL̯4$ɱJk44LMܔ ،@ֱ;ͮ4F+>1! 3>8K̈ΏLBNPONiнP>}N G%G QQ<҂94T.45E /(YUX?U5҅DT;TgL2VF%><UH-uFT$ ȸRP=-0O՗ 1Rì;өUWUZW_M_h]70 7JԲdV7MP M.+؃ %CDKX/ven:CJ}sSٜSEՍӒɔDa؇mڈ%ZiujFmXs& ڏ r%OTAG3YtMY`K:Y;LI&7Eʮu%107$ |]{IՎ=|.͌ԽkԴ=S!íܥI/c]JQm]½%MqX虻\};dzdq 8OuE|l;eQ;K@>>aX+ɹxֵEDY]]zk\x\5Xl?l:-0[Eh9- p [GY,$V;P%1BDAD%Tn<# ފa8ݛ\15 *(i[4+"^#NK =6R*b5j$kX- 0c1>c(㷛d% .=ZY`U2vHc>c,A:Ig|G^|1ΌJ־89א}:_P_cdKF ״f1am?c6r #9]78y& LP4;>аg𨏀&肞6h3u߄N8shȏ~ѣi|i&6链fVfh阖fi9&FVd[v~ꩦꦖ.&F3fv븖k빶k6l!V&fdžlpȦnekΆlҦl6^lVlvkؖږ;tworld-2.3.0/docs/CCLP3/cclp3res/a.html000066400000000000000000000527741475511570500174400ustar00rootroot00000000000000 Chip's Challenge Level Pack 3
 

#16 - Two Sets of Rules

"I'm done with 15 levels already!" Chip announced as he entered the Bit Busters' lounge excitedly. "This is easy!"

"Well, that's because the first few levels were made for you to remember the rules of the game," Melinda told him.

"Ha!" said Chip. "As if I would ever forget the rules!"

"Really? Did you even know that there are actually two sets of rules?" Melinda inquired.

"Huh... What? Different rules for the same puzzle? How's that possible?" Chip asked. "And how do I decide which ones to use?"

"Well, the Bit Busters have seen to it that you'll be able to solve the levels in either case," Melinda replied. "Haven't you seen the two doors at the entrance of the clubhouse? There's one with an 'L' on it, and one with an 'M'. The door you enter through decides how you'll experience the levels. Which one did you choose?"

"Uh... The one near the ice cream stand," Chip answered sheepishly.

"Well, after you play the next level, try it again going through the other door," said Melinda. "You just might be in for a few surprises..."

[More info...]

#24 - Impossible?

Chip wiped the dirt from his jeans and strolled into the next challenge. But before he could start, his eyes spotted a note tacked on the wall. It was a dispatch from Melinda!

Dear Chip,

In many ways, you will be tested along your journey. This is the first of quite a few levels you'll face that appear to be unsolvable, but trust me - it can be done! If you can't find a way into the exit, just remember to use only what you need along your travels.

Logically,
Melinda

#33 - Vague Dream

"Phew! I'm exhausted," Chip thought to himself. "I think I'll rest for a bit in the lounge."

As he plonked down on the sofa, Chip noticed a couple of drawings lying on the table. He rubbed his eyes in disbelief. They looked like parts of maps of some levels - levels that he hadn't yet played!

He leaned back and started thinking about what the rest of each level might be like. Then before he knew it, he had dozed off. In his dream, he was in one of those levels. It was all hazy, and he couldn't see beyond the parts that had been drawn. But he had to find a way out...

#34 - Motion Blur

"Chip! Wake up!" cried Melinda. "Good grief, you'll never be done if you keep loafing around like this!"

"I... I'm sorry Melinda," Chip answered. "I was just thinking about these levels here and--"

"You were not supposed to see those drawings," Melinda replied sternly. "These levels haven't been completed yet." She paused. "And we're not sure if they ever will be..."

"Will I get to play them when they're ready?" Chip asked eagerly.

"Don't worry about that," Melinda snapped. "You'd better just pay attention to the next level for now."

#64 - Producing

Chip strolled into the next level, where he could hear the familiar sound of clone machines spawning monsters. Suddenly, an alarm pierced their quiet whirring and buzzing.

"Genetic Experiment Overload!" a computerized voice announced. "Vacate premises immediately. Self-destruct mechanism to activate in T-minus 12 minutes and counting."

Chip searched frantically for some way to stop the clone machines, but it was fruitless. The machines continued to produce more monsters beyond their normal capacity.

Mustering all his resolve, Chip began dashing through the maze, searching for a way to the exit.

#65 - Countdown

Chip had escaped the clone machine madness, but the self-destruct countdown continued to tick away.

"Self-destruct mechanism to activate in T-minus 4 minutes and counting!" the computerized voice declared.

Looking down the corridor, Chip saw a sign reading 'Control Room'. "I must save the clubhouse," Chip said to himself. But as he raced towards the door, he realized that the Bit Busters had probably installed half a dozen layers of security around it. "Hmmm," Chip thought, "I wonder what kind of security checks they put in there... Combination locks? Passwords?"

He was about to find out.

#66 - The Aftermath

Chip had made it to the master control panel! Rolling up his sleeves and bringing all his experience into play, Chip hacked his way past every authorization prompt in the system, trying hard not to get distracted by the constant flashing of the sign asking him to download the latest update for Flash Player.

Within seconds, he had reached the final screen, which presented him with a neatly lined list of checkboxes, along with the prompt "Select rooms to deactivate". Chip searched desperately for a 'Select All' checkbox but - horror of horrors - there was none!!

"Aaarrghh!!!" Chip exclaimed, hitting Down-Space-Down-Space-Down-Space-... as he selected the checkboxes one by one. But just as he clicked the 'OK' button, he realized that he had missed out the very first checkbox - the one for the room that he was in!!!

"Whoops!" Chip yelped as he ran into the neighboring room, hoping to find a way out. The lights had gone off, and in the fading twilight, Chip could barely make out three doors in front of him. The door on the left said "Authorized Personnel Only" and was evidently locked. The one on the right didn't look like it led outside. In the middle stood a solid-looking lead-lined door.

Instinctively, Chip flung open the middle door and hurled himself through the doorway - all in a single action. The very next moment, there was a terrific crash and the sound of metal flying all over the place as Chip knocked down a stack of soft drink cans in the refrigerator that he had almost jumped into. But what was even more astonishing was that there was already a man hiding inside!

"Find your own hiding place, son," the man growled. "This refrigerator ain't big enough for the two of us!"

"I'm sorry, Doctor," Chip apologized. "Will you be in there for long? It's an emergency."

"For 19 years they kept me in cold storage," the man grumbled, "and then they make me hide in a refrigerator..."

"Wow!" Chip exclaimed. "And some people thought that I was out in the cold for a long time..."

"If I may interrupt you two gentlemen," the computerized voice broke in. "Now what was it that I wanted to say? My random access memory fails me... Oh yes: Self-destruct mechanism activating in 10... 9..."

Chip quickly hit the 'Defrost' button as he shut the refrigerator door, and then pulled open the door on the right to reveal a small closet containing a jetpack. "Ah! Dangerous," he said to himself as he strapped it on, "but at least it's scientifically proven."

What happened next happened quickly. Chip was propelled up a chute high into the air at precisely the same moment that the room self-destructed into a roaring mass of flames, and the refrigerator soared away into the distance.

A couple of minutes later, the fires started dying out, and Chip descended back to Earth. He now had to find a way out through the rubble and the simmering flames, but he had a feeling it wasn't going to be easy.

#67 - The Haunted House

It wasn't long after Chip had scooted out of the remains of the control room when he heard a familiar voice.

"Chip!" cried Melinda. "Chip! Are you alright?"

With a sigh of relief, Chip brushed off the dirt and dust from his tattered clothes and cheerfully ran toward her. The two embraced and caught up on all of Chip's recent escapades.

"You were very brave, Chip," Melinda gushed. "Nobody else I know could have held the nerve to solve seven Sokoban puzzles and select 64 checkboxes while staring death in the face."

"Wait... What?" Chip responded. "Only 64? You mean there aren't any more levels?!"

"Oh, not to worry, Chip!" Melinda replied. "The Bit Busters had foreseen that the genetic experiments might get out of hand some day, so they started building the rest of the levels elsewhere. But before I tell you more about that, there's something I want to ask you..."

She smiled shyly, trying to avoid looking Chip directly in the eye. Chip smiled back and directed all of his attention toward her.

"Chip, do you think it's time we took our friendship to the next level?" she asked.

"I agree," Chip replied. "But just where am I going to find that next level?" he demanded, peering over her shoulders to look around the area.

Melinda sighed. "They're in a clubhouse in Chip City," she told him.

"Chip City?" Chip responded, perplexed.

"It's going to be a long journey," said Melinda, handing him a map.

"But you know how I love to find the quickest way possible!" replied a gleaming Chip.

"Well, I have to look after the repairs here, so I won't be able to come with you," Melinda continued as Chip began to crack his knuckles. "So let me warn you, that the levels in this clubhouse are going to be a bigger challenge than ever. But I'm confident you will do well!"

With Melinda's encouragement, Chip said goodbye and soon set off on his journey to Chip City, excited about the challenges that lay ahead.

By and by, the night grew dark, and Chip reached a house in the middle of the woods. "I think I'll rest here for the night," he decided.

#72 - Fireball Tourism

Chip City was now just a train ride away from the seaside town that Chip had reached.

Unfortunately, he had run out of money along the course of his journey thus far and couldn't afford the train ticket.

But luckily for him, the travel agency offered him a part-time job as a tour guide.

#76 - Complex

Chip had finally completed a long, eventful journey to Chip City and stood at the doors to the new clubhouse. Although tired, he was eager to find what new tests awaited past the entrance.

Melinda's words echoed through his mind: "The levels in this clubhouse are going to be a bigger challenge than ever."

Chip gingerly opened the door to find a swarm of gliders circling around a small room.

"It's good to be indoors again!" he shouted.

#81 - Possible

As Chip completed another round of Bit Busters-style checkers, he stepped into the next level with confidence.

"Ha!" said Chip. "And they thought they could stump me with a checkerboard again!"

He started exploring the next level. "Whee!" he exclaimed as he slid around its force floors, finding computer chips along the way but also feeling like he was gliding in circles at the same time. Soon, what seemed like such a simple puzzle turned into a dizzying nightmare.

After a while, Chip frowned and recalled Melinda's earlier dispatch. "I know she said that these levels could all be solved, but I'm just not seeing how this level could be..."

#100 - Sardines

As Chip completed yet another level and ran around the corner on his way to the next one, he bumped into a walker carrying a mop and a pail. Behind the walker, a couple of blobs were creeping around, cleaning up the floor.

"Alright, buddy," said the walker. "Clubhouse's closin' for the day. Out y' go now."

"Hey, walkers and blobs..." Chip replied. "It's been a while since I saw you actually doing something inside a level. So you guys are janitors now?"

"Some of 'em Bit Busters voted us out o' the levels," the walker responded grumpily. "Said we fellers just crawl 'bout randomly, and wuz always gettin' in their way."

"Not as hot as when you guys used to chase me in swarms, are you now?" Chip snickered.

"Oh, we ain't dead just yet, boy," the walker replied coldly. "And there's still enough of us in there to give you nightmares... Now scram!"

"Okay, just one more level for the day," Chip declared, ducking past the walker and into the next level.

#101 - The Ghosts at the Massingham Mansion

"Okay," said Chip as he reluctantly left the clubhouse for the day. "I'll leave now."

"Hey, buddy," the walker replied. "You still lookin' for some adventure? I got just the thing for ya."

He handed a Chip a white key. "Cool!" said Chip, eagerly grabbing the key.

"This here key's for the door of that old mansion down the block," the walker told him. "Nobody lives there 'nymore, so you just go in there and have some fun."

"Thanks!" Chip responded as he started down the road excitedly.

"Yeah, nobody lives there," the walker said quietly after Chip was gone. "But I sure didn't say nothin' 'bout the dead that's still a-roamin'."

#102 - Triple Alarm

No sooner had Chip stepped outside the mansion's back door than he heard a sharp whistle and found himself immediately surrounded by a group of policemen.

"You're under arrest," a policeman told him as another proceeded to handcuff his wrists.

"Huh?!" Chip exclaimed, astonished. "For what??!"

"Breaking and entering, unlawful use of explosives, and stealing chips," was the reply.

"That's ridiculous!" said Chip. "I was told that--"

"That's the guy, officer!" Chip turned around to see the walker from the clubhouse pointing to him. "He stole the key last night when I had my back turned!"

"Interesting," the officer replied. "How would he know when you had your back turned, since you look the same from both directions? But anyway, I'd say there's enough evidence to nail this guy..."

Chip realized that he had been framed.

A few hours later, he found himself confined in a prison far away from the clubhouse. But he didn't intend to stay there for long...

#104 - Civilization of Creatures

"Free, at last!" Chip said to himself, letting out a quiet laugh. He crept stealthily through the dark, secret passage leading out of the prison until he could finally see the daylight shining through an opening at the end.

Chip emerged into what seemed like a wildlife sanctuary. Looking at the map, Chip realized that if he could get out of there, all he had to do was swim across the river to the beach near the clubhouse.

But for now, he was out alone at the mercy of the elements and every type of creature that he had ever known.

#105 - Caves

Chip trudged through the forest as he headed toward the river. Suddenly, the ground under his feet gave way, and down he fell through a deep hole until he landed with a soft thump on a heap of non-recyclable plastic. He lifted himself up and started looking around the underground tunnel.

At one side of the cave was a table. On it stood a bottle with "Drink Me" printed on it, and a cake with "Eat Me" written likewise.

"These are way past their expiration date," Chip remarked after a brief examination. He continued exploring deeper into the tunnel.

In the darkness, his eyes could make out a lamp lying in a corner on the floor. "I wonder..." Chip thought as he picked it up and opened the lid.

The next moment, there was a flash of light followed by a puff of smoke. And then a frog smoking a cigar hopped out of the lamp onto a rock in front of Chip.

"Kiss me," said the frog, "and I shall grant you three wishes."

"Huh?" said Chip, thoroughly unimpressed. "You've got it all mixed up. That's not how it works."

"Okay, okay," the frog replied. "I'll tell you the truth. Melinda sent me here to give you a couple of hints for the later levels."

"I don't think so..." Chip responded skeptically.

"She worded them as dispatches, of course," the frog continued. "But I thought I would make things more interesting by setting them to verse."

"Good grief!" Chip exclaimed, frantically looking around for a way to escape.

"Okay, here's the first one," the frog began before Chip could object. "Ahem..."

To reach the very end
You must root again for your friend
Who will journey on his/her own
To help you through the final door

"Political correctness has no place in poetry!" Chip groaned. "And that didn't even rhyme correctly!"

"Hey, look," the frog replied. "It's not like I do this for a living. I have a full-time job at the clubhouse trying to get to people when they're stuck. Well, anyway, ready for the next one?"

"Let's get it over with," Chip answered, bracing himself.

"Okay, here goes," the frog continued.

In a level with a pi
There's more than meets the eye
Look before you leap into the water
And...
uh... you'll live happily ever after

"Okay, enough! I'm outta here," snapped Chip.

"Well, so am I," said the frog. "And just so you don't get lost, I'll also let you know that this tunnel leads through a series of caves under the sea until it reaches an oil rig. I'll catch you later in the clubhouse."

And with that, the frog vanished slowly, beginning with its teeth and ending with its exasperating sense of poetry, which remained for a while after the rest of it had gone.

#108 - Magic Trick

Chip had made it to the shore, but he had no idea where to go next. Pulling out the map, he located the isthmus that he had just crossed. To his dismay, he found that he was miles away from the clubhouse.

Some distance away was a moss-covered rock fortification. The map had it marked quite clearly, and below it, scrawled in pencil, were some handwritten notes.

Rock Castle:
It is rumored that its cellar contains a hidden portal into the clubhouse.
But has anybody been able to get hold of the red key to the cellar door??

"Hmmm," Chip thought, setting off determinedly towards the castle. "I suppose it shouldn't be too difficult to locate a red key..."

#121 - Jaywalker

"Hey Floyd, you gonna eat that?" Chip heard somebody call out.

"You no worry, Bob," a voice closer behind him replied. "There plenty to go 'round for everyone."

Looking around, Chip saw a gang of teeth homing in towards him. They were talking about Chip!

#126 - Marooned

After the lengthy challenge of the last level, a pleased Chip stood proud after swimming to the exit, unaware that one of the gliders nearby had followed him through. Without warning, the glider knocked him unconscious.

Several minutes later, Chip woke up, stranded on an island. "How did I get here?" he wondered. "Maybe I should've taken the title of that last level a bit more seriously..."

The End?

"I did it! I did it!" Chip exclaimed, overjoyed as he ran out of the final level of the clubhouse. Then suddenly, he froze in his tracks. Outside, waiting for him, were the mayor of Chip City, the walker who held a grudge against the Bit Busters, and a couple of police officers who were evidently having a hard time trying to handcuff the walker's legs.

"Mr. McCallahan," the mayor said, "I'm extremely sorry, sir. Robby, here, has confessed after we conducted an inquiry and found several loopholes in his story. On behalf of everyone in Chip City I'd like to offer you an apology, and this plane ticket for your ride back home."

Chip gleefully accepted the ticket. "You'll have to pay the fuel charge, though," the mayor added.


A few hours later, Chip alighted from an airplane to a rousing reception from the Bit Busters.

"Hurrah for Chip!!!" the voices echoed.

Chip anxiously scanned the faces in the crowd. "Where's Melinda?" he asked.

"She was too busy overseeing the final repairs of the clubhouse," one of the Bit Busters answered. "She said that she would meet you at the clubhouse tomorrow morning."

"Oh," said Chip, rather disappointed.

But then he cheered up. For tomorrow would be the beginning of a new journey with Melinda, and hours of racing together through the clubhouse yet again as they tried to solve those puzzles faster than ever.

 
tworld-2.3.0/docs/CCLP3/cclp3res/b.html000066400000000000000000000100711475511570500174210ustar00rootroot00000000000000 Chip's Challenge Level Pack 3
 

#145 - Recurring Dream

When Chip finally returned home, he was tired, very tired. But he was also very satisfied. After all, he had just finished solving the last few levels of the clubhouse, and they had been some of the toughest puzzles that he had encountered. Still, he had a strange feeling that there was something that he had missed.

He lay awake on his bed, thinking back to all the amazing challenges that he had ever faced. His eyelids grew heavy, and soon he was having a weird dream. He was back in the first clubhouse being chased by a swarm of walkers. Then suddenly, he was seeing those unfinished levels whose drawings he'd seen in the Bit Busters' lounge. Nothing seemed to make sense...

#146 - Suspended Animation

All of a sudden, Chip woke up. He pondered upon his dream and realized why he felt that it wasn't all over yet.

Those secret levels that he'd seen in the lounge... Where were they?? There was only one way to find out...

It was midnight when Chip reached the clubhouse. He sneaked in and quietly made his way to the door next to the control room that said "Authorized Personnel Only". The lock had been damaged by the explosion and was yet to be repaired. Chip's fingers nervously grabbed the handle and pulled the door open.

As Chip climbed down a ladder leading down into a secret underground facility, he looked around nervously at all the monsters in the room into which he was descending. Why weren't they moving?

Then he smiled, realizing that they were all asleep. "Cakewalk!" Chip chuckled as he tiptoed around each room, collecting all the chips.

#149 - Mr. McCallahan Presents

Taking a deep breath, Chip opened the last door of the clubhouse. Then he gasped.

The room was completely empty!!!

Stunned, he walked to the corner of the room where a table stood. A sketch book lay on the table. Several sheets had been torn out of it, and crumpled balls of paper filled the waste basket. Chip finally understood why Melinda had kept these levels a secret. The last one had not been completed.

"I've got to help Melinda make this level," Chip said to himself, lifting a pencil. Then dejectedly, he put it down. "But how? I've never designed any levels," he thought. Then his face brightened. "But I've played lots of them. I'll build a level from my memories, and I'll make it a level to remember!"

Through the night, Chip worked hard to fill the level with pieces of just about every kind of puzzle that he could think of.

And when Melinda walked in the next morning, she was surprised and delighted at what she saw.

"Why, Chip!" she beamed. "This is just - amazing! Thank you so much!!"

"You're welcome..." Chip mumbled bashfully as she wandered around the level admiring his work. Swallowing hard, he decided that the time had come to ask the question that had haunted him throughout the night.

"Uh, Melinda...?" Chip began.

"Yes, Chip?" Melinda asked.

"There's something I've been meaning to ask you..." said Chip.

Their eyes met. Chip stepped up to where she was standing and got down on one bended knee.

Then picking up the hammer that he had left lying on the floor there, he asked, "How the heck do you hammer a panel into place without bruising your thumb?!"

"It's an acquired skill," Melinda replied, smiling.

She walked to the door. "Would you like to join me for lunch?" she asked.

"I'd be glad to!" Chip replied. "What time?"

"Just as soon as you finish solving this level," Melinda replied with a twinkle in her eye, as she stepped outside and locked the door behind her.

 
tworld-2.3.0/docs/CCLP3/cclp3res/c.html000066400000000000000000000303101475511570500174200ustar00rootroot00000000000000 Chip's Challenge Level Pack 3

Chip's Challenge Level Pack 3

The Levels

# Title Author
1. Entrance Examination Tyler Sontag
2. Snakes and Ladders "Firefly"
3. A Walk in the Park Tom Patten
4. Suction Solution Mike Lask
5. Toggle Bust Blake Ebert
6. Thieves and Teleports Joshua Bone
7. Dancing Gliders Rolf Redford
8. Pigeonholed Scott Feeney
9. Redoubled Effort Joshua Bone
10. Annoying Wall Wes Powers
11. Blue Blocks Jacques Smith
12. My Friend Joshua Bone
13. Road Block David Stolp
14. Window Shopping Ida Roberthson
15. Bumper Ida Roberthson
16. Two Sets of Rules Mike Lask
17. Lot in Life Wes Powers
18. Replay Mike Lask
19. Super Chip Ida Roberthson
20. Rock Craig Vilbig
21. Mud and Water Joshua Bone
22. Damp Dan Miller
23. Map the Path Wes Powers
24. Impossible? Mike Lask
25. Recess Jeffrey Bardon
26. Spiral Joshua Bone
27. Jumble Tyler Sontag
28. Pac Man Jeanne Hoffman
29. Tool Box John Lewis
30. Problem Solver John Lewis
31. Bouncin' Blocks Gavin Duncan
32. Pearl Diving Joshua Bone
33. Vague Dream Madhav Shanbhag
34. Motion Blur The CCLP3 Staff
35. MonsterMaze David Pinkston
36. Zelgon's Lair Wes Powers
37. Blue Moon John Lewis
38. Wireframe John Lewis
39. Cheap Shots and Dirty Tricks James Spriggs
40. Blazes Joshua Bone
41. Patchwork John Lewis
42. Every Trick in the Book John Lewis
43. Who's Left? David Knight
44. Tiny Spirals Ida Roberthson
45. Block Head Grant Fikes
46. Get a Clue Alice Voith
47. Flame Thrower James Spriggs
48. All About Buttons Mike Lask
49. All About Blocks Tyler Sontag
50. Once Upon a Troubadour John Lewis
51. Dancing on Ice Tom Rowe
52. Dolly Mixtures Roger Quick
53. Backtrack John Lewis
54. Good Advice Derek Bowser
55. Construct-a-Maze John Lewis
56. Item Unlocker Tom Patten
57. Beachballs Gavin Duncan
58. Bowling David Pinkston
59. Air Pocket John Lewis
60. Red, Green and Blue Dino Brewster
61. Bump and Run Tom Rowe
62. Go Back to Start Mike Lask
63. Pocket Puzzle Alice Voith
64. Producing Andrew Raykowski
65. Countdown Tom Rowe
66. The Aftermath John Lewis
67. The Haunted House Ida Roberthson
68. Incident on a Bridge Tom Rowe
69. Coal Mine Tyler Sontag
70. On the Coast John Lewis
71. How to Get Around in Venice Joshua Bone
72. Fireball Tourism Rolf Redford
73. Take the I Train Tom Rowe
74. Niche Daniel Bouwmeester
75. Chip Alone: Lost in Chip City Tom Patten
76. Complex Peter Marks
77. Oh-Ho! Gavin Duncan
78. Slide Show Peter Marks
79. Clear the Way Mike Lask
80. Checkers Ida Roberthson
81. Possible David Stolp
82. Mediterranean John Lewis
83. Billiards Alice Voith
84. No End in Sight Joshua Bone
85. Maginot Line John Lewis
86. To Catch a Thief John Lewis
87. Block and Key John Lewis
88. Which One Next? Jimmy Vermeer
89. Replay II Ida Roberthson
90. Lichenstein Joshua Bone
91. Olly Olly Oxen Alice Voith
92. Bolkonski Joshua Bone
93. Shattered James Spriggs
94. Mistakes Daniel Bouwmeester
95. Waste of Space Gavin Duncan
96. In the Limelight Joshua Bone
97. Jumble II Mike Lask
98. Mouth-Watering Grant Fikes
99. Freezer John Lewis
100. Sardines Joshua Bone
101. The Ghosts at the Massingham Mansion Andrew Gapic
102. Triple Alarm Peter Marks
103. Prison Break Andrew Gapic
104. Civilization of Creatures Tyler Sontag
105. Caves Gavin Duncan
106. Oil Rig Daniel Bouwmeester
107. Lazy Hourglass Tyrethali Ansrath
108. Magic Trick John Lewis
109. Hidden Depths John Lewis
110. Floating Plaza John Lewis (part adapted)
111. Bustin' Out Tom Rowe
112. Pushy Tyler Sontag
113. Stress Fracture John Lewis
114. Lead Us Not into Temptation Madhav Shanbhag
115. Triple Maze David Stolp
116. Mini Challenges Ida Roberthson
117. Mice Are Good for Something David Stolp
118. Obstacle Course John Lewis
119. Elite Derek Bowser
120. Twisted Chambers John Lewis
121. Jaywalker Bill Reid ("Skully")
122. Manic Depression Madhav Shanbhag
123. Investment David Stolp
124. Jumble III Ida Roberthson
125. Water Trap John Lewis
126. Marooned Joshua Bone
127. Beat the Heat John Lewis
128. Divide and Conquer John Lewis
129. Everybody Get Dangerous Tyler Sontag (part adapted)
130. Four by Four John Lewis
131. Mental Blocks Madhav Shanbhag
132. Commit Suicide? Ida Roberthson
133. Think Tank John Lewis
134. We'll Be Right Back Madhav Shanbhag
135. Color Wheel David Stolp
136. Grand Prix John Lewis
137. Vulcan John Lewis
138. Waterslide David Stolp
139. Rotation John Lewis
140. Yet Another Yet Another Puzzle Eric Schmidt
141. Bug Arranging Mike Lask
142. Mudpie John Lewis
143. Same Game David Stolp
144. You Can't Teach an Old Frog New Tricks Madhav Shanbhag
tworld-2.3.0/docs/CCLP3/cclp3res/d.html000066400000000000000000000014561475511570500174320ustar00rootroot00000000000000 Chip's Challenge Level Pack 3

Chip's Challenge Level Pack 3

The Secret Levels

# Title Author
145. Recurring Dream Madhav Shanbhag
146. Suspended Animation Madhav Shanbhag
147. Avalanche David Stolp
148. Diabolical Joshua Bone
149. Mr. McCallahan Presents John Lewis
tworld-2.3.0/docs/CCLP3/cclp3res/gravel.gif000066400000000000000000000037671475511570500202770ustar00rootroot00000000000000GIF89a00,.,\Z\DFDlnl<:|``>;L|W|wO|`|>|90F>|,?0|?>||00,|p|G!,00,H ,p $H@ A ,x`@,h  \hG @`[@D,`'G xb*+|>,(Rϡ  #LU[JpJi~c]&= ABEPXnt*1RJT3dYFzl@RFԵzh%Lc34`(L > ˎ &0pp(7mxmZw*ćnLUbVGPH DK5'hR@h ]D!RP(TtARPdDF5UF)~T~^h@*@Mi@ZCuu^^IWV#mVMhԖZ :ИX->4z:VZDI j<iS?Fc\ PVT4IpfR+VV{IHZtP&piXUR54-ИWh\P%g-TWPѥ!HZo(m{tfeX y>U ZD'fiM# ē\GEDyuec| dWfɦWBTn?y("fA<ъЦ#P&-D5ЏJlNK׵F\_Dd8P{+5whFx$3kDgm"RfTTVWMh'cg{˒`I`\jx|1*λ)@aG&)0WQ؀Zۻz$HbReuPHPat }fiɃ6UUሶlI&X}ZMwV2ѽ uC`*T5bXE?Qd~N6.oZ2|CTMG;T4TfMYt-=QRBJ% /% eH0D;N•u 8+HqG&фF Hah+$* CPD:^QXL.w 9 EU.@ʿ>BAhi|OH1 fo^h2`S%︨%YڣG"PtI-KM]R F}M|a"-PUfi @ŬĔE_>I0I*Aj'"LԿY !$Q}SY*#XkF;tworld-2.3.0/docs/CCLP3/cclp3res/ice.gif000066400000000000000000000027171475511570500175510ustar00rootroot00000000000000GIF89a00ܴܼ||wx=wwh8sw,$߳wy|V4wsT w:#|p|$m|| =|w`pzXD_=wp~wpp2ww0dԐw|p|d:#|b Â|_|vP_l&Q|*|||p||m) ||J |>|_`>;L|W|wO|_|>|6F>|,?|?>||0&Q|p|G!,00P` @"FHPb )"B:T(Ċ B
Chip's Challenge Level Pack 4

Chip's Challenge Level Pack 4


"I did it!" Chip McCallahan beamed as he strutted into the lounge of the Bit Busters Computer Club, grabbed a prepackaged hot coffee and some cookies, and plopped down on the leather, reclinable, multi-adjustable, temperature-controlled, fully digital smart-couch opposite Melinda. "I finally beat your overall high score!"

The Bit Busters president and top brain gave him a look over the top of her copy of Qubits magazine. "Let me guess, you took that supposedly impossible walker shortcut in that one level of the third challenge? You know that's cheating."

"All's fair in love and scoring," Chip responded brightly, and grinned when she blushed. He had only recently begun to figure out ways to get her to do that. It seemed to help level the playing field between them.

"That's as may be," she replied tartly, setting aside her magazine. "But enjoy your laurels while you can. Pretty soon I'll have an opportunity to improve my own score."

"Really?" Chip leaned forward, excited. "What kind of opportunity?"

Melinda responded with a gleam in her eye. "The board has finally approved the grand opening of the fourth official Clubhouse Challenge!"


How to Play

The CCLP4 package contains the following files:

data/CCLP4.dat The main levelset data file
data/CCLP4.ccx Story and author information file for Tile World 2
sets/*.dac Configuration files for Tile World
CCLP4.html This documentation file
cclp4res/ Images and other supporting files for this documentation

Using Tile World

To play CCLP4 using Tile World 2 or Tile World, just copy the data and sets directories to Tile World's standard location for these files. On Windows, this is the directory where Tile World has been installed. On Linux, the default location is /usr/local/share/tworld.

With Tile World, you have the choice of playing CCLP4 under either the original Lynx ruleset (which also features animated gameplay), or under the MS ruleset (as in Microsoft Chip's Challenge). Tile World also records your solutions automatically and lets you play them back later.

Using Microsoft Chip's Challenge (MSCC)

To play CCLP4 using the Microsoft version of Chip's Challenge, all you need is the CCLP4.dat file from the data folder. To make MSCC use this file, you will need a program such as CCTools, Chip's Controls or MyChips.


Links

Stuck on a level? Want to report your scores? Or just discuss the game? Then check out the links below.

  • CCLP4 Homepage: The official information and download page for CCLP4.
  • CC Scoreboards: The official CC1, CCLP1, CCLP2, CCLP3, CCLP4, and CC2 high score tables.
  • CC Zone: Modern message board and multi-functional Chip's Challenge site.
  • CC Wiki: Detailed information about the game and levels.

Thanks to...

The CCLP4 Staff:
Josh Lee, Jeffrey Bardon, The Architect, Tyler Sontag, Andrew Menzies, random 8, and J.B. Lewis.
David "pieguy" Stolp:
for setting up the voting site and providing the staff with very detailed voting results.
chipster1059, Shane Climenhaga, and Michael Warner:
for additional level set testing.
Everyone in the Chip's Challenge community:
whose votes, feedback, continuous encouragement and occasional nagging helped make this project a success.
263739, Aaron Farmer, Andres Arrieta, Andrew Menzies, Andrew Raykowski, Archie Pusaka, Bacorn, Brandon Lee, ChipHome5, chipster1059, ChocophileBenj, Craig Vilbig, Cyberdog, Cybersmack, Daniel Bouwmeester, Dave Varberg, Derek Bowser, Earthling, Eddy Limb, Elizabeth Brockway, Eric Schmidt, Gavin Duncan, Gigih Agung Pradipta, Henry Potts, Ian Wilson, Ida R., J.B. Lewis, Jacques Smith, James Anderson, James Spriggs, Jeffrey Bardon, Jonathan Birchall, Josh Lee, Joshua Bone, Kevin Stallman, Madhav Shanbhag, Markus O., Matthew Petras, Michael Moorman, Michael Sugantino, Miika Toukola, Mike L, MyDisplayName, random 8, RB3ProKeys, Richard Blaquire, Rock Gnreux, Rolf Redford, Scott Feeney, Shane Climenhaga, Steven "Syzygy" Jones, The Architect, Tom Brown, Trevor Hedges, Tyler Sontag, Victor Tsukamoto, and Zane Kuecks:
for designing levels and offering them for inclusion in CCLP4. Due to the number of levels in the set being limited, some designers could not have their creations included in CCLP4, but they certainly offered some stiff competition to the ones that did. The detailed list of levels and authors can be found here.
John Elion, Michael Hansen, Christopher Elsby, and Yongyi Chen:
for developing the excellent level editors using which these levels could be made.
Brian Raiter, Madhav Shanbhag, and Eric Schmidt:
for developing Tile World, thereby making both the Lynx and MS modes of Chip's Challenge available for playing on the various operating systems in use today.
Chuck Sommerville:
for creating that amazing, timeless, classic game called Chip's Challenge.

Change Log

2017-07-14
  • Original release of CCLP4.

This package was last updated on 2017-07-14.
It may be distributed freely, as long as its contents are left intact and unmodified.

® Chip's Challenge is a registered trademark of Glynlyon, Inc.

tworld-2.3.0/docs/CCLP4/cclp4res/000077500000000000000000000000001475511570500163155ustar00rootroot00000000000000tworld-2.3.0/docs/CCLP4/cclp4res/CCLP4.css000066400000000000000000000032571475511570500176430ustar00rootroot00000000000000body { background: url("dirt.png"); color: white; text-shadow: 1px 1px 1px black; font-family: 'Open Sans', Verdana, sans-serif; line-height: 1.5; padding: 0px 20px; margin: 20px auto; max-width: 1000px; } p { text-indent: 1.5em; margin: 0.5em; } h2 { margin: 0.5em 0; } a:link { color:#B2CCFF; } a:visited { color:#E5CCFF; } a:active { color:#FF9999; } hr { display: block; margin-top: 1em; margin-bottom: 0; border-style: inset; border-width: 1px; box-shadow: 1px 1px 1px black; } img { max-width: 800px; border: 1px solid #ddd; border-radius: 4px; box-shadow: 1px 1px 1px black; display: block; margin: 0 auto; } .title { text-align: center; } .rpad { padding-right: 10px; } .small-box { font-size: smaller; text-align: center; } .thanks-header { font-style: italic; text-align: justify; padding-top: 5px; } .thanks-body { padding-left: 1.5em; text-align: justify; padding-bottom: 5px; } .name:hover { font-weight: bold; } .right { text-align: right; } .level-table { margin: 0px auto; } .level-table th { background: black; color: #FFE866; font-weight: bold; padding: 10px; border-style: solid; border-width: 2px; border-top-color: #FFE866; border-left-color: #FFE866; border-bottom-color: #D8C141; border-right-color: #D8C141; } .level-table td { padding: 10px; border-style: solid; border-width: 1px; border-top-color: white; border-left-color: white; border-bottom-color: black; border-right-color: black; } .level-table tr { background: #404040; color: white; } a.secret, a:hover.secret, a:active.secret, a:visited.secret { text-decoration: none; color: white; }tworld-2.3.0/docs/CCLP4/cclp4res/a.html000066400000000000000000000337761475511570500174430ustar00rootroot00000000000000 Chip's Challenge Level Pack 4

Chip's Challenge Level Pack 4

The Levels

# Title Author
1. Molecule Jeffrey Bardon
2. Pixelated Fire Eddy Limb
3. Fossilized Snow Jeffrey Bardon
4. Oasis Jeffrey Bardon
5. Non-Dimensional Layer Jeffrey Bardon
6. Proving Grounds J.B. Lewis
7. In the Pool Rock Gnreux
8. The Fourth Dimension Josh Lee
9. Pinball Andrew Menzies
10. Stuck in Emerald Josh Lee
11. Keyboard Malfunction Josh Lee
12. Rivets Joshua Bone
13. Encased in Carbonite Andrew Menzies
14. Poly-Gone Cybersmack
15. Cross Back Andrew Menzies
16. Reservoir Frogs J.B. Lewis
17. The Three Trials Michael Sugantino
18. Inferno Dynamics Gigih Agung Pradipta
19. Conservation of Keys Josh Lee
20. It's No Skin Off My Teeth Josh Lee
21. Glacial Palace Jeffrey Bardon
22. Bodyguards Andrew Menzies
23. Western Standards of Living Josh Lee
24. It's Easy Being Green Josh Lee
25. Difficulty Switch Andrew Menzies
26. Shrub Josh Lee
27. Suburban Legend Jeffrey Bardon
28. Zephyr Heights Josh Lee
29. Flipper Departments Josh Lee
30. Hoodwinked Cybersmack
31. Big Boulder Alley Jeffrey Bardon
32. Blended Brussels Sprouts Jeffrey Bardon
33. Tool Shed Andrew Menzies
34. Frozen Waffle Jeffrey Bardon
35. Chasing Chips Cybersmack
36. One Who Raids Tombs Eddy Limb
37. Tropical Hibiscus Josh Lee
38. Detonation Station Josh Lee
39. In the Walls of Gravel Castle Josh Lee
40. Periodic Lasers Andrew Menzies
41. Ghetto Piranha Josh Lee (part adapted)
42. Nova Prospect Eddy Limb
43. Coral Reef Jeffrey Bardon
44. Blobfield Andrew Menzies
45. Seven-Layer Salad Eddy Limb
46. Exclusive Or Tyler Sontag (part adapted)
47. Antidisruptive Caves Jeffrey Bardon
48. Key Insight Jeffrey Bardon
49. Block Parking chipster1059
50. Secret Underground Society Jeffrey Bardon
51. Ice in a Blender Jeffrey Bardon
52. It Suits the Purpose Zane Kuecks
53. Protect Your Fortress Tyler Sontag
54. Split Path Zane Kuecks
55. If I Ran the Zoo Joshua Bone
56. Fireworks Factory Josh Lee
57. Bisection Jeffrey Bardon
58. Ruinous Plaza Josh Lee
59. Blockpick Jeffrey Bardon
60. Flippant Tyler Sontag
61. Blue Tooth J.B. Lewis
62. Block Unpuzzle Andrew Menzies
63. Pneumatic Diversity Vents Andrew Menzies
64. Excuse Me Andrew Menzies
65. Duplex Josh Lee
66. Anaconda Henry Potts
67. Nuclear Energy for Dummies Trevor Hedges
68. Cold Fusion Reactor Jeffrey Bardon
69. Ball in an Awkward Place Josh Lee
70. Science Museum J.B. Lewis
71. Puuf Rock Gnreux
72. Sewerway Archie Pusaka
73. Sealed Doors in the Spacecraft Josh Lee
74. Technopathic Tyler Sontag
75. Unmitigated Hint Factory Disaster Jeffrey Bardon
76. Flow State Jeffrey Bardon
77. Brick Block Facility Josh Lee
78. Aquatic Ruins Jeffrey Bardon
79. Spring Tyler Sontag (part adapted)
80. Monster Swapper Andrew Menzies
81. Estranged for a Season Eric Schmidt
82. Puzzle Box Henry Potts
83. Frozen Over Josh Lee
84. Forsythia Tyler Sontag (part adapted)
85. Nectar Meadow Josh Lee
86. Cyprus Tyler Sontag
87. And the Walls Kept Tumbling Down Andrew Menzies
88. Empty Rooms Tyler Sontag
89. Diametric Opposition Jeffrey Bardon
90. Wretched Hive of Scum and Villainy Jeffrey Bardon
91. How to Retune Your Harp Jeffrey Bardon
92. Fire Is My Enemy Josh Lee
93. Bombs Are a Beautiful Thing Josh Lee
94. Ditchdigger Archie Pusaka
95. Ravaged Josh Lee
96. Lean Thinking Ida R.
97. Lockdown Zane Kuecks
98. Clay Tunnel Josh Lee
99. Ice Cavern Henry Potts
100. One Tank's Adventure Andrew Menzies
101. Condo Management Josh Lee
102. The Key Issue Ida R.
103. Malachite Josh Lee
104. Dual Markus O.
105. Living Things Josh Lee
106. Gridlock Cybersmack
107. Combinations Andrew Menzies
108. Scatterbrained Andrew Menzies
109. Shemozzle J.B. Lewis
110. Keyrithmetic Andrew Menzies
111. Water Bottle Markus O.
112. Triple Mint Slurpee Josh Lee
113. Half of You, Half of Me Rock Gnreux
114. Repugnant Nonsense Tyler Sontag (part adapted)
115. Overlap Rock Gnreux
116. They're Not Called Blocks for Nothing Eric Schmidt
117. Greenian Motion Josh Lee
118. Chip Controls Markus O.
119. Strandquist Josh Lee
120. Construct-a-Sokoban Markus O.
121. Death and Destruction Tyler Sontag (part adapted)
122. Jigsee Andrew Menzies
123. Life Is Not a Puzzle Josh Lee
124. Air Bubble Jeffrey Bardon
125. Beautiful Struggle Josh Lee
126. Bind Mender Miika Toukola
127. Wrong Exit Markus O.
128. Mindless Self-Indulgence Tyler Sontag (part adapted)
129. Undefined Fantastic Object Jeffrey Bardon
130. Bam Thwok Tyler Sontag
131. Jigsaw Andrew Menzies
132. Monorail Tyler Sontag
133. Monochrome Andrew Menzies
134. Pushover Archie Pusaka
135. Propaganda Tyler Sontag
136. Seeing Red Jeffrey Bardon
137. The Longest Track Archie Pusaka
138. Zipper Jeffrey Bardon
139. Unravel Jeffrey Bardon
140. Repair the Automatic (Caution) Doors Andrew Menzies
141. World of a Thousand Flames Josh Lee
142. Stratagem Derek Bowser
143. Color Coordination J.B. Lewis
144. Paradigm Shift Jeffrey Bardon
tworld-2.3.0/docs/CCLP4/cclp4res/b.html000066400000000000000000000016341475511570500174300ustar00rootroot00000000000000 Chip's Challenge Level Pack 4

Chip's Challenge Level Pack 4

The Secret Levels

# Title Author
145. Hacked Save File Josh Lee
146. Japanese Game Show J.B. Lewis
147. Gimmick Isle Tyler Sontag
148. Gravity Well Jeffrey Bardon
149. Mental Marvel Monastery Josh Lee
tworld-2.3.0/docs/CCLP4/cclp4res/dirt.png000066400000000000000000000073031475511570500177700ustar00rootroot00000000000000PNG  IHDR00`nsRGBgAMA a pHYsodtEXtSoftwarePaint.NET v3.5.11GB72IDATXG5]K#뫾E ADAaPd!!! I0 &ⷎ>}:<=յzcU[,켸nq=N6gfqݯ{ˎǚyvX},փϛwWbَwY#sMWVnU,;z]/;E]QR,Zøn><-ֽhEݏ߸PP~_L!!s)ǟbvX|(FgWlҼUVe%|ǃC)n-autV[KΎ /*oW/vw b'4lHOGW6&KdW-: ru}}/6/;q~x1JG[Z, A8#sI0@#4$hnxYn |[jqz^oxʼn+%Oj^ULE^:D$a&nl YɁFG8p?*Y14xѾGNgr5<\ln!7ŗ2`J2.ĺ4}z!,ÒP6`y^0aa2#bmu@tAZ![.nac1w/(GʬInU I"by}=Ӝ3f)BXq2xe%.yхK= Cא!ߊ̉B== !5ln2 eo3 țmi06Xmy l%=]H(aGsL0Eɖl/ux[J1}ZuJۿ?\vL'J=N Ŝxtn-d\PnI]ן.8z1YwA!%^i .2~2OyA$K S4h^ባeMo"cbF~и 6\%ވeCd BcSBp=bޙTC>J9T7R E+n 鬍ɍ#Sǣ'j+̜i=/ sE4`% fE,\J8[$ᘷ޲ϨvM7x(KY4848L J2al84R)B `B66ᑪ%̻WH,$%|Y$~ o DUF؉p5LZ-~djl$&PuL:zG3{AfEd)Bl&2%B2GY>3VP"@&]I_~d|?̶|iawc6oVh7.&ŒwFi*r'Ә!ړ] G{lZ^ j[f]kM+h yExh:UaUj\H1՜S,_x!xrF%&uΔFRᯇ4kDO0_$3+"=+NQ<̿q 97CI&2y$rcˢȹƉH\w1PNCw1%B ''8M~I+—d"bbA>Z"Kׇѯ!I/g@LLp\ ~7FɢS'ň$ ?rBĥ$JʗY-PɟFI f=c;R,!Kδb+hq嵳4 |h\ u99*7oAO=LSW4^ wB>GT E8W)Qj<_® +Ki z"ؖHҔ9M1t:E?DOhR%##co(Z}Y&[fYߦRDjoKu:5-F75ɡeW>k_d9CS\ ~sY7C+_sȠNn5wl:yG~:ܧ-TO[Oɝ$Un73*#frV=Q\"rEIrrÇ^LMO>|6q p$ 4P|<' ?T|x'G|ݢ6>|xãC+| )Bcc4@UPQQAJ499y^<1}ѭGV><1}t ٴ,@oL@ꪪJKK*֭[7畳gϾf|xãC%GQ|x#}tc><>J[#RYjPGդQPP@NfQ=8q@><|x#}(A><>Њ%ѭSl~_ݽ{wgioo73<$ ^/H |xP ><> ~xHgX|xAhEGƖ~YFIv#><> ~xG ><ѭGV(|xn K655uttܹv"@/.))A)|x#}v?<!A>9>{>4uTwdԏ¨U +>_?QHB 5hG[|x#}?v?<|<ǂ?ϺSqx綘9~4#~FZЊ%!PQ|x!A><҇@cϧ/{8W@.N]|X#~FZЊ%!JצLgggp!&|xC><>;OCjHݲ֪F~%1:% >gv@,G!ceascEqbCHB' <[l:|x#}@A><҇@ccɹiֵϼ7VYlY[[5.ƻCoѿLDqzD?'!ceascEqbCHB'ф Ίp8ڊ1H'v?<!A}/T\nYk[[d}}}uuuaQXIƢ$#%GF8~Z0|9߂8?!|b|xUDB-v q2RWW1EH'v?<!A}=c-wYuٲe]UK26.$tdzPtnOW0WT6A18qzD?'!ceask8y2qb8gИ?LG[B'Ʉ  :ԁ|x#}@A><҇@cc<Gs["ղᚺ$=u}5 EEE->/ӗ/ʗ՛]}Q?N>V3|, tη8~N￟tAB%uhCh hC><>;Ohꮘ)\o^r7,ʨ}/_?яS*O#_|O:NMM ]7قPiԏ'<U +   " HB'ՄJxFV{7ϘCL><҇ |x#}?v?Z#~?ۛ'ʌTAbN4UhOyD[B>VO:[]?xF7Ϙ8~2YYʡ7Ϙ$^><Z?)%T\]h݇ :ԁ|x#}@A><҇@c'Kb]qtX gPo̫(/_,dg褑'8WL}$>6Vyuq3N+++r t(d *DMXֹh嫃#o2>><҇ЪGOLB帪~hu*'&4]&zh݇ S><ևЪI!rMGC= |xC><>;'4v)80&G\[}m/\YYظlٲR"?W>WOw}#š3b1ﭮ/---,,???ʮ_.HkշE/gϼU + '-kB59@,>QAB%uLh^3bWAwCB)hCh>%Lb tG8|x'Y0~q-x ~*}*,3oܐqV&b eh] ~/zBW+Z?s>V3|, tη8~ )&17 :I Mnc0um}'T2g_o'sw܍ :ԁ|x#}@A><҇@c3;Fb'lg]jqŵOŵ{?o9gFܭ 7EAOT7_{/B[B>VO:[]?CeH?TNhthCh` 5hG['v?<!A'<)yV?s];%}kbtxDME?">3>V3|, tη8~|TМ5 0~)|x!RH&bs *S><!pmH|;-.T\y銿;s%<7OmCsX,ʌs YC[B>VO:[]?ք M*1PAB%uLh#< S><ևЪI)B%fT!|xC><>;YĻwZ]/.4gK>f_/\'/7wXIT6Pyq8‚9E[B>VO:[]?1 *19{6 *ToBJ̜}6 S><ևЪy aWT!|xC><>;Y#bTwK_Gxm#[0~]"ϋoh]'ʗ gϜU + '-*H ILh@hChPZen;+;f*S><!pmH,|\O.&7WzIVgق C1e<6QR!P?ѣ̣U + '-{BeՕ$TR'Zi+#bvԁ|x!RMdf6Vxcv1uH'v?<!AG;+N^48s]0[׌uAN^28:!aѷ_l.֋u"T.^q0A< 3whCh?I|ǞP)}~**1;PAB%u H[쭈ف S><ևЪI-rI*&q)}Py><>N ~xCᙅ_{Fy#m%N|IVClAA=`R̸"T.rg aaϜU + '-%U\a݇ *TBR핑q}Py ><Z?)%Tbz򲆳PA:|xh;G ~xfճ:clqQqcƓق՛vQVmd K7~֚3gP?BZ0|9I,bpu*HNRa ͘ S><ևЪI)b}'x|>gǺtG8|xg>b1wR )4ae$UlAXkJVn޷ߤ#:®9E[B>VO:[]?1 *Y?7zPAB%uMhZ0 h݇ S><ևЪI)b}'ABO^eu*S><!pmHsSq龘GCSw3soro^;`<^ Y7de{*w 78KtŠ lqwn6,g!OևЪGOLBź aOeeu*'&4 xΫChChPy򁕄}|>_c=!|xC><>;x>Kcg]L\pOs=]tVĚ^([.hKCʺ.H|џg|G[[v-ں^gևЪG׏5 !'f$TR'q<>N ~xCSP\έʮZ`gii)5QԴ%͢A/G/q~NO40=j"[^;H{~FZ0|9&TbP11'f$TR'P9I4\hChȯ :ԁ|x#}@A><҇@cã)?U[j5qUUUqqw}{柛|_o^u-o|y|XdٲemmmTt*N[XX5f]T9L|R:fNyqk\ۆP?N>V3|, $T$T拤C$T|x#}$T ym}@A><҇@cc1VYSqemmmt@vnqEi%5`Ş'tכG1SZZZTT'5nز~0OhCh?AB%ABeH?DB>1><҇ЪI"BtY@ߊ1EH'v?<!A}=cwY뫫rc,?A P(TPPxEAGOyB[B>VO:[P?V'?O !MtYގ1H'v?<!A}2>o쯈@m2}8,ʪE2g TWFwi  \KDG{'`ևЪԏlj!|x#}*tٸqcp!&|xC><>;Ohꮘ)\o^r7,=^1*-3!7Cenh볋˽n'zzA8~Z0|9߂8?!|b|xUPBe@ |x><>;OuqM/1V-j2pvD:e-72{&gևЪGV(|xU4|xã><>;x>o^bϨ7üdQ:8-Uc?78:L~FZЊ%!PQ|x!A><҇@c.eotw-/6l_[fKtk0g^ևЪGV(|xU#hkcc#}LLpC|xP ><> ~xHgX|xAhEG򚚚zzd6Ȧ4 z^ǃRG?T|x%>V}Zѿ~><>?" Ѧ*^+++p8L6yyy999~><AH?J?<|xn3|>J=}>|xc? |xãC+|>?;T>sq:!ҊJ^Ih@><٣Q|xC>nQYGs1h^?a|x'צoj|O_,*κ:͋\UUUBDQڋ><'GꧡL4u)<3GCiT ~x?<%&''k ><4~6Ehll\FhȬ y 3K |xãxUM O6ΟGO@x ~x?<ep?nݺus^9{Eo|xCc^---"s$K4^UUU|xã%~dYr^Km?vg;|xAãǔ ~x?<=Mo+'NV|b|x#}i kժUCCCij0B{)|xAD֏9arXۘ;/" ;s O>9>{F&όA{HJ?<|L ÃAh^8PG[<F_WwݙF"`0z^Jm}(#'6xn۷!ͥWS"0a>7_ϳ}&.T\'޹-&nf_7wHď>蟕 ~xÃѶp¡><>555---4zK#$PYYYZZZPPv^Jm}(c۷aۚ`ʚ^݌><ϒXP\D+} \dy)S$~Aãǔ ~x?<5|x!.]ѱsNTh0K $x⒒|w .ŅéSIiJ[Y^ D|xx?SeU KbtJ K4q^<> ~x?<5|x!0qt7/o.?O_zq-)m}?vd`N ~_<8.~ 9uxɁՁ@0W lw-+ml_888I'hC#vJ|/T\nYk[[d}}}EEE/Vm{FŁ,I>},ж?+qk^ևÃѶp¡><>0;{_>zlL F W&y7|RI3x 1uX=ݪF̲2QY/zHtW8wnm]]]uu5{WT6'9xS緼y~Uڏ<|r7=-SY~_> ~xjS3z8 A ~RAC |xm}@q\ڵ&I>*EeˬɀD0(**7!wo7sI'hC#vJ|;Ź+**E+X^!Vntmo&8]1+Ӱ2}|Xշ?_jsqW_}]F~꺱+VN~-4N{n1dFm/JJ?8I*~jkki +O:-[I'N8><և 'ӧnJM$ ⲍ7Z0 Z}qVC#vJ|BSwMqxayaQu˖-.&Lq_C=-uzȦʍ;]VuG022y{W·ݓTnwOxWϾ5~mS;F&V=lXM+̢m{V׼1;⧶.|>_íO'N8><և ;&$+Y R:YfϜ9C_6!ؑ ;%}Y>ũ+btX=~UwqՒ˗SF/G f*,,3R)aQQ+VEx,Ή_={gӻz.|ySJn:a$rsĵuo=ʩ1r*Kw.ٰ$h^蟕8~!p>fÓT⹹Bd)A ><8Q.>b& !,M 8+~Ҍ!ؑ ;%}q>o^bh5u˗/ _|hFbMRV-&l\<{k;z.|{[.}2n|FZ%Sy{]o_]7vqɕ69Tzիm{VWևORc?)L 'jhCڎgN t 288x)Oև@cG&'.ѫ80&[|yccc8?4䔱IqdµXa>OiP 5T\9afSo`~HlbTn:{ ןby{kll.NY_D[cv?<8/nMP0KG-f@>Ҋ^+N<qVC#vJя~TWWg.P^5ʹ#Ž{Fzv-^N;a}<|c'q+#zVfS~}Bʖ^tO~]?Y;6z7j=84xGիkKUAmh^蟕,ל1;⇙jv' 3f*O'N8<><.BE[YHNu[L[֮}HV[mWDG.D!pmlj5@ebbb`p[nHn45a u).o=>m}?vd`N ~_?я ;aQSŅ{;Ɩ3ɋfNE6,..l6HzM~{Q6gEJߵHN'M*6On6ڞղp]՛6ZZPÒF$ڶg% 5whC|'7!r6Z A ~RACͳQnC{w" BDw܏22Bgd"j)B|>x<xȾq/㑎P?CڎC'fuk91"31 Қ'hC#vJς ?W>WOʻw}*#š3b1puf"A r{O\z']k?7Kq;n쵫\QBf$riUmO;5[*:[ \X=h^蟕,1;'΄mG0!@ ~RACͳ󋚚8I\*&Ş=_ 0rFK/j|'q@#\{]?Cڎ;'hC#vJY2yƗMy ~*}*,SoܰrV&b eh]Geޛ*׮][7O\%p{?/O+;T[*{jlX*T+Im/JkևORW^`s&SI5Ϡ/jj~ye!K^!  qSsBs|jj~q/^z9>9x'}>N8.~fLl?Dޘ[b0Eq4ǎL)>< u暑8I$sz!޼$N55?fI?ؚP3MC??Nў*W#k:ٲL-^:\+/y/m{V0~_s> ~xxfvjn%nT0!:O*Hpy|dd|ge!Qhm1"! qD}}22U$gѢZ#5LAƞDtĢc~><҇ ό;]Z^Jޘ[&&&Œק3f!ؑ ;%}gaO}dܒrSqnνP9wqBeMPՍ㗍M;N2*mrEqȦ/}p_a3W:Oҟi=4ڼHÎ5*֮5/m{V0~_s> ~xa?<ڶN8 B<6zWh|OfSL_>N81~EKK荹s}gY 9Z>D[Y?S|xO)y_S~wK>w[ȯ;Tgi3$s~˛7owOp'[Dr*?<__/>uNyy_׌T<1r#ͻ.Zѹ*ԴW^/~m S!p>fÓT('ıF:A ~RACS|5S,tuS,yk/Blh˝@adݔ1c}^|_F%SȺ)}&Q-:3>N84~EVo,1w`"ooe m}?vd`N ~_Ɲ(~*<҇ O"kt<=vzĈ 9]I3xó|IA)1u龸-K>xiܞ8sM$xGob&Q B\5|uиIȩ|{~[.=x{Ow]dS&i7cGk?VіǖݶU˃uy!:xY})8I*~MSφSx ~? }p¡)>W#)u!.FYc1g q?'k},$sٕQ !>ɹ/aP< 2PωD?E<3hCڎgƄAwO#G1?1%&a0?>iF[Y?S|x82!ƮOz4{T'}M6)ũ+b8;*u|| k?v{]M*vOt^υ{> ~xd&ćcv A ~RACS|D2(~?^EuM5.g-Y;0xF\"Fq}栂}և όWTEȲ|>Eq4ǎL)>< ǵ>ʙb}cwng?0u暑M9o2tJ [jh%~>C">+On憉[=yʦwa7LܰfSV O8:z0z{J]Ps]PyP1 Y})8I*~ &n;;+f*O'N88Ø__}ލ^x9b~fn:Hk_-W3Evgec= Jf/t}-L[fID*b'~fǗn: OG8]?d-Tnf& hxϬO:և@cG&#'/.okƺ)'//6lm:y_/[پD|N;8jrkz7L|[#s'}ٔwW m?vЛ-72oO_ղ*_Pojm{V0~_s> ~xfB<;x1;Px ~? }p¡q>rHDm3rk׿~!<%hd~f+V|{}"tl3__R(ɼ_Ftxև =+@[6/' hxm}?vd`N ~_ٿO5r*#獴ʛ2:ew'} 2)EzJ2Pl_I">ov#;O]]7v}]u}mzں=}i͛)gۏ2uaǾڭW9zuqKC~e8򼯲?y4Զ?+Y9E[cv? ~? }p¡q>2_prMǼ7/ q3'ވ>eGSB|x7Gxc^EKb\_F)fTGo{7|S#\\_vٔHY ̠h;0Eq4ǎL)>< ǵeS9tƸ9Л*{G'}7)7ںzJ">l7kN^8P8 ayFPYOٳhѹȚ7-݌99nھSE^ַhO:Œ>1۟0,Z'rJ(#nN`ȓ Ehτ|L[ov;,舌9s'}E*hQբohH'v?3& *1 X>|Ҍ>;~0a/,ѻ[<&vN7ޓ7U5jM ke9W'sSˆ&V\y|ыkN^Zs^Lk?vփo6)u}Kz^[~cuST1nڶg% 5GhC|'7!n]x<>h݇ &SI5Iدbȕlz#gbMFu'}l$x'_$ڈ>u'*vk<^bd6|E<3hCڎgE'&&ЛLGZS_I3xó`|]tOmCFe*m'}EMOO櫕}5Z64vhbs+ߘ\y|rհQVRފܘ2ڲx ;j ._~SUy%)e/1zg%hC|'7!n]x;~0a/, uX+sqW mih3V7M Կ y;scKw69lփmGʡ3Ɩ0S)Mۡ}[7ɦtՕyf63^$< ̣h;fu*=Tb6*Ks< m}?vd`N ~_s jQ(jZĒfQ ʗT(,3"|ߠ[Igӊ%=him{e_m3Ҽx.32T׷{׫^VvcU@\: n%_ɇ^uk/J{ևORY|e00!:O*Hp<>|G85BbI3xPkKԽS۬,,,=//(*Q?o#Et?/Pyp+Iφ%^zuo͖]Y48TmlYݿxҶKUM q~hж?+q+mhC|'Ȧ &SI5NQ<3G8"I3xD?ϺSwUWWߤ1o4R\!ꖋUdg[sGի7S \3PM_[7ղաeںr*?_8UBwm}A$?O m 'jhCڎgEד*f@>Ҋ^"If!ؑ ;%}Y>Kc_CqzϤ??g7AٹyFBQ4wuZYOsIڒWmVo:zZѹ9|֎P`]C~e,[,)e)Y~_G[cv?<8]OXs|ReAm}?vd`N ~_ޓb^ɇ^uk/J{ևORc^pnVP`B8PG['v?뉗;0f:|JǎL)><ɹiֵϼ7VYlYkkk]]]EEE kїu0KE<'g&T`AAAvqh]'Vo^)K~²J_i|?W^++Q"!Jh^蟕85/hC|'h 5O'N8><և wOև@cG&_Iݲֶڢ"-ן7vcs*6Ѱ|> \Q*lӞ&O?(rqy$ ORu_^l/J{ևORCJ[RfƍY@$ 'jhCڎ;'hC#vJ|=q8j^otU,b^m]]D( nGTԊWӸCN^^%_%ڶg%} 8A ~x?<ڶN8><ևfqc]t= _|.ǏT9C#vJ|2>o쯈@勒ŢyQ}[tWEkzOU}aa!Yqʫlϗ$m{V׼1;ãm{C |xm} `v?ruOo7۝=#<|1HY?S|x+&n3ś ~kdABbqXo&ܝŦ]{@l)s{^uE0GgM1h^蟕85/hC|ÃAh^8PG[*Ei8iooonnp8\\\1#Asׯ\ڔN IT0Hex c>[Ի2#meY]">i|4aTQSb̝,)Ƅ ><.eotk|׶!e<$sW?(W+ڶg%N}m}p>ÃA ~xm ٳgi<2<&OgNY?]mAR|b|xm}?+Ah1%ãm{';YAQ10??zi{^s" sC{)O___OOφ ֭[$ڵkׯ_Eٺu+ ر#zh́ϜxdټY |x!b^Y?>8ÃA^b?P^^> |x':nQX]]E{CPTh٣QAP <`Ο9h60~а~$h/;g<G2n<&O<>4fQ[[aKsBCC !oD{)|xA~âxLp|xãƯxY?z0qA$'qLゐq֭ٳg_,2H3hjiiYޘ#Yz񲮮4??^vm}(Y}X9ĸ=L ><mG7\&C%A(A$^Ҧ'NX+>1><>4еjժ4Be}}}uu5i돡><>h[?h/%g<G><>h[?h/%g<G><466522.477@eeeiiiAAF{)|xAD֏5o[ö5%=5K$ʌ><m̃ÃAh^ TG[bҥMMM;wA@/.))qb{ ,.+f] Sh4rh{IWf,@B%hC`m0C%A(A$><$^e˛ଋӗ>}z||<^V:@a  ҫ ց U;{{{ڶt6m~SCۋ@cG*Jg(|x!0~Ѷ~tA{Yq`A %> TG[>!/r}IvNܜNv4^I3h/ǎ$ThQhC`m46e:;;I'.><և k׮]mmmeee555Ȅ/RPTP:ٝH1'ċ* ݻ9qCۋ@cG*Jg(|x!0~Ѷ~tA{Yq`qtX[[[QQQt-[Dg O*H\|xãh;ӧnJULe7oNv'R8A=vÉON^m/Y?H(6><ևeGe׃amm-]|Y[[[1! O*H\|xãh; ; qzMIMX'KKKa͚5Ǐ?s }C}ˡE# %3|><h[?8z0m8?4'sss%dK]]&SI B5|x!pmgR.*>bN50Y9444::Cۋ@cG*Jg(|x!0~Ѷ~tA{Yq`qth?)L jhCΌ5 4:u:Cۋ@cG*Jg(|x!0~Ѷ~tA{Yq`qt qĀѶpA><>N^EŭT{}9!.D'OL| ˡE# %3|><h[?8z08?d&32Ƴک zCف &SI B5xn\@.eڲv;Gg'sm7.;k͏$ixn\Fk qY;>h;W̢ n*=rFX'C6Eέǧ~91|l接 uǏE?NW)"}?vd DxG[mG7G_G&]1F>T0!:O*H\IOnGB32 q'7;Ex6}'=>}A矇> ܿ}^Ɲ;Ņ 7)B|rsdd| = ggȈo|g|G['vlEŭeĈ/--y*[˼clKĪ\"VT啢)2{q]|VU洽:҇@cG*Jg(|x!0~Ѷ~tA{Yq`ptgBZN6#n ~? }pA&=>55س@c!D/Zb˵7߳8/jj\1(/k׌ zwqwI|jjڳ@@ZBܭblWH'vfl/͇altWkV]9ݭyKV<Ω,)?Hܵ\ }?vd DxG[mG7^G q&17`B T_8K!. 1,D]B qTwxOB{sg')_._âOtu^qx]{Mqy9>55<h[?8z08?TNgfnV[F⩃AxgWŞEji"Z$ĠSX*ǴYIy 㫯\,hY?EEbpPLM7\*?ϹOFW{%D"OLk c:|E['vfl?=v 1LLLS3>^"iljcK{SΏonmlo2(,{tJ/:׬G5G5GHY?H(6><ևeGeŹ׃i!0O m jYc!^={ ?+ssC~"bs*T+GG ͫj'}ݻqڞMR4WRQV BA]U@x^s^s!ؑm>Jm}_v|^V}=N*'ıF:A ~RAPMJm}_v|^V~=6ƙWds{L j>Bio(Qd.yp+Bq7>}z%c{ gQ=#U?e# w32Gh;3W"k`t<=vzĈ,*O<+ΥYKsb(ȄJ[_ʀ#ǎ$ThQhC`m40ބ89ql8L jDV4u!. 913'.ć998/?#|xup)ŋ*tLe|?yvmSgWe1~NZ>uD{҇ k C#'F=bnOcJ̄\,rfx4ŊjFdQd1U"J›#***5G5GHY?H(6><ևeGeŹ׃ia21;Px ~? }pA&["?A!ўr(ܦkB(r'f A0Yd)>E<-[[F ^2u8zT)ă> zoG.g`pLH'vfl6_7rM9OOK[9|> 1s/+;:toA0mrO>0verp1^}}H̼s_~qX?3VOdx9Ofn:Hk mN$^C208, 9Z\~u|lln Y<,-E}1y9ѿkk>;~PQm_q>ifF:;'T5ccyjJ%g~Ŋ/=wfI|OVd~f3Z_9Ҍ!pm'bzӖK,*jJDSH,|"BicC "1{,W> JC# %3|><h[?8z0m8??!~Z\B;O'.cI`if Oމo{߼xQܼiI7nɕ?/zΝO >Uxc^|eGFk=Wj4#}@ۙf\/Gx*ðq]ےb#q6KiYlz6M |c9z_hŊOq^s^s!ؑm>Jm}_v|^V{=fƛYee. A ~RAP͌>1sz42Neu΢E{"|\Lȸs?,d-ھsѢo}%ړ843OL0atBeQ=\ٳ9qP}[ܽq~gov;EUբ^H$NxEw32| vjѢOև k J̄\,rTI݇R8H,).RjKuS* Sr,,,=zykk.>;~PQm T3Ow~xMBN^3.*>11108@|d/愸|d>E3<<2eJm}_v|^V{=fƛ.Ax<'/ҺL jf<o֛ 7? o1W}7GpOԩLN.zf_?_yuĆ F% Is*3qk[*&m}@IEGNTTS71ًuB|9OsP[Rr K:;;U@oA{u{=]ǎ$ThQhC`mt0΄ `n|1``B T9g78WJ҇ k8T{lT; fn> T3> x AH^@83c{syR%u9sy``?=zT~W"^O C# %3|><h[?8z08?Ȧ &SI B5(ggy뫉}k!pmgmQq|b|||O6HW:+uǎ$ThQhC`m4ãm{P |xm}@ۙf\T<ևeGe׃9!f &SI B5|x!pm'Oa0EuIh/ǎ$ThQhC`mvhMvL jhCΌۢCۋ@cG*Jg(|x!0~Ѷ~tA{Yq`qtH&[RfƍY@$ jhCΌۢCۋ@cG*Jg(|x!0~Ѷ~tA{Yq`A %> TG[˺x~A f]r9D,rOA{9?vd DxG[mG7^J? QI B5|x!0Ifg_r~9!"Cۋ@cG*Jg(|x!0~Ѷ~tA{Yq`:A %> TG[*Ei8iooonnp8\\\7_~ʕT4 ک`޵" YGʚi+**G[_J3Cãm{P |xm}kjjƴAWEEEiii0zY5>>><<|JCi͚5۶mŢ Y?քJg沴 |xã/%K !ÃѶpA><>P*K赲rq 4z~ǵS֮]ظ4IOZ[[ׯ_m۶Ç>}BDO㣄JSEFMHYR ><m̃ÃAh^ ³gҦydxxZA><1DHyzSF9zy<2qn{;vl޽6m7o޾}СCFFF̃/9eBD֏P#2<>h[?&h<y?<e\<>gv?IG^G|h0MI:DQ۫:B#*gѢteby#h^џ=T?}!w6Ο9h60~а~$h/;g<Goj|Ot(*α:͋UUUBDQڋ><'Gꧡ,vy,<':l`RaH^v^1 ~! ')xdy 8x 5!|1ƏڦX ;hȬ y%K |xãxU2*^A&s<+z֏n>h/+n>+|ѳj޺ur-'><҇ ZZZE7Hh*--70G[?Jd4Fo_"Vk-1nO1*g;|xDeEcE Mo+'NV|b|x#}i kժUCCCij0C{)|xAD֏PYDm❗TQQDB|xm}0~)Ѷ~^J^J? G c jhC9_ݻ;H{{_ ^/K |xã%~dBeCwֺ}\:|5% ><`Rm ~! 'A.><֧Fui*++KKK n7K |xã%~ })iY%$Tf><>h[?h/%h/%AȣI B5|x!.]ѱsNTh0K $x⒒'@a`֥p`` z8gG<^V:@a  ҫ ց U;{{{ڶt6m~S3|?ǎ$T8fHmG7K7ď>J?<ڶ.><ևfgO \_Go7'ćz W&yq>Ӈ@cG*Jg(|x!0~Ѷ~tA{Yѿ񩯯M,,y>J?<ڶ.><և)k׮@dBQ)(*([\fNEEETuuuZd8q>Ӈ@cG*J{O3|xˎˊ핈OmmmEEEy l=?rG G><Z:N>uV@dB<>/;֏n>h/+W">trgE8nmm] g~ãm{P |xm}NX^;vD&u_:!^ZZJg k֬8~3g<AABECi><!0~Ѷ~tA{Yѿ1'|sss%dK]]ݳPy6>J?<ڶ.><և)\T|Ŝk`l[shhhttw$|?ǎ$T8fHmG7+˄I!O<!0~Ѷ~tA{YѿAB 'A.><և)e_T:M{`p,1ٷ<^+N<;Tq>Ӈ@cG*J{O3|xˎˊ핈3ᛑ1N! 3f*rBe| ~xm/\I-7rіw֮5?<tܾqㆸ|9? ~CZ:bNpS[8}$7:! 6X>q!Y?H(q=><>/;֏n>h/+W">&|]thu*lBY(Ah^ Trsdd| = ggȸ BDwlO}dM<%m j󋚚8I\D:[٬yF5_}WIŵkFB ߻(҇)EÀ>;~PQ{|x#}_v|^VoD||$?6*HG G4\bX>! 78'DK/;?b旿<!0~Ѷ~tA{YѿQNffn?W[FL<#%m jAFW{\b! 1(T$ү qDYdyAW_|Y#jk-S$Ԕqի#~fFZ:f\TR*211aN&zŢI8ďC# %><҇eGeEJY/Q?J?V? "}pAfN}ny.^y33҇A/*^Z^:08Go-;cbǢ>!ؑ' |xC`m{%⣜}Fx@(vBXA$x>):Ⱥ)}ypk/BlqJȢ):Çƺ)}}q7brR[Chubo[&K-aEš>Y?H(q=m><>/;֏n>h/+W">q&|}>OYM<%m j>w#) uS̯3'݌ g}&#gqF_|GQ.\0M1N?w3h B{HBVW"k`t<=vzĈX~8cABE~i><!0~Ѷ~tA{Yѿ7K%f>KMPY%m j\(ׅYiΆ̉(B}#gpL\.<!0~Ѷ~tA{YѿIfw8f*HH^G Gx>["Pb?[i/"O&Q!T`p\ w̄cgqA?W{ˡCS]G8gq !:auJ{͸xuMj[%MEq>Ӈ@cG*J{O3|xˎˊ핈3ᛕbvbv,'T|G G}>J[9lɔ_}ލ$f^x9b~fn:Hk_-WΪ40ver0?}}H̼-~g~en:H8Chu?d-TnfNcQYDABE><!0~Ѷ~tA{Yѿa&|K &뭈فʳPY%m jfӏGr'h;΀[_ }h)!F#%33Xs}9~ҌFD{PGZ_ }h)1:jlܿ+ܹB{HBVg}֛,m^JǢ>Y?H(q=m><>/;֏n>h/+W">'|/$q}¯(Ah^ T3L~r;E!nFʇBPWh/Chuq x[X~8cABE~i><!0~Ѷ~tA{Yѿ7ʊ]M< %m jfIhd o =j$r[sr> oݴ}UoўtOq^<8!85PY Ξ=ΝW ۷ݻ|Ym7m߹STU-z%OBHBV׌I q,J,A>;~PQ{|x#}_v|^VoD|MZx <x6Z&T B53$x'M/x$аI!.q'}lI3΋D1_iӋG .3%)+ڋAZ:f\T|bbb`p ^bDX>)1}?vd q4Gh[?^ě.@x<'/Һg6,| ~xm/\Tfy'J0n}xۭW~"yGЛ#8~ҌTy'JW$[$ W_Nl`QZZЛ ~DZ:EGNTTS71ًuB' ~ȇ@cG*J{O'|xˎˊ핈O 'x n7byxV*DG G}9DyDZ:~3W!:auV{1SQYb0Pǎ$T86HmG7+o&^,l&T B5c΀ǀ၏3  SkN8ďC# %><҇eGeEJ'Ahy6*L>ǎ B5(gg1^?s 3; S Ç#}?vd q4Gh[?^ A c jhChuqQJ#'|?ǎ$T8fHmG7+$TP?1h;~!~ ~DP |xm}NX^I8NAǎ$T8NHmG7+s7 g!l| ~xm/\|xã ڋ_T<sO ~?vd ġGh[?^)޾*lG G><Z:8|?<҇@cG*J{O3|xˎˊ핈{oI7Fgaaϳ\?QѶpA><>V'Ni/,*!ؑ |xC`m{G G><^E ~_7qQ>;~PQ{|x#}_v|^Vo/|?V(Ah^ TG[DK.*N\o;{%'X~8C>;~PQ{:|x#}_v|^Vo/|?V(Ah^ TG[*Ei8iooonnp8\\\7_~ʕT4 ک`޵E¡>?Jd$T,.H[YV)PI><`Rm ~! 'A.><֧^=mL4zUTTAx^nmm84[*֬Ym6,J8AQ"ǚPl?\#23|xDA{)A{)A$Cm/ďOH\|xãO(!z\F0^yyy999~q5>>~ԩᡡk׶577766.Mo۶mppçO6\g<~((TQSb6_#2|xDA{)A{)A$Cm/ďOHٳgi<2<<|xOCY*Xy8|xãOtޥ:͋VUUBDQڋ><stx=bZ<|x>aZe,2%4nRA{><>EEEP)Bcc4PSSSQQA%h/%3cӕ1qӖ,yݖPo156=P9>}=ďO>E5oݺus^9{Ef|x><i,J߾DR[bܞb&T^vhSTTT[[Ҳ,1gCccc]]]UUUiii~~9m9&5ڒ%>SOdZ}1ߵgzOLBďmg%a5Y?J0&^Ҧ'NX+>1><|xH3rXۘ;/" +><755-[lժUCCCi4{^Jãm<ߧ~!~h? ^v8/{讉Q4A.> DY@h jey!;fHN'>73Q4A.>|xHkBe߶mkJzڃi+kzI |xãOMMMcccKKKݻwGFF֥f,---((ph/%6/L_IrS?JWrW5A T>#-Z#I ,.+f] Sx|xIWf,@B%hC,]cΝ֭kI# $x⒒hצi/ďmgתQ.{Awi,*+ y|oN;-ѿ ď "}pA><#|9"-EkUZK=>>=GO|xABE ><!0dÃxVLh/ďm'yI $U.)tC"ϒܪ`NQ ey2y9?|L ~`< %><҇Y2S?JCs"_Ve8.|%oN]]u<ؘȌiH\|x$T$3*/ћds*fBe7PhXz59s#O|xABE ><!0dÃxVLP_%IO}}}mtvvFgacccGݵkW{CP^vU:)g҂?乳<ﹿoW̘SA,k.>H">O޺u+́HB%?/-.۸y5YH {۷oFB%m}PQ|x#}$T ~xJ%TyGIRS[[K>/wV9!NǂpAHy՟B(- Ux ss~W亳,O+*Zvz@ j8ǛQ^0sB̎e,)H$2|}wx,VO15RZZJg k֬8~3g<>H(A><>*v?H(A><>*v? T>EEE@eQ6|}4@CS̯C<>< GHA 0 MQT`B3>>~Q?5>_7;xOƥ%=MAw*.yB>/+;'˕ efVeg/ɡח_x/2c@ j8‡yPQdGLR?<2}QzkJwOYb>oy666W7n˗]w֚IIGcNrq#&gI'fQzk tt-2Bɍf&TB tX,J8>H(A><>*v?Tބ3g:OmvveV⬬%پ#2*ڂʰГ{=EE~w hHBJUIq"B" ~PI B52>< GHA QTęc|ȲTiˢ4TgggfVdedfffʛQ|*'*z뭷&''J*H\I/~Q_|Y >%z{ѣw{7Źs%sg~>$P[SggEO.-/Bo-feG~+O G[$T ~xH ;ij*/ďwX}N>w˗egY݇3$?33K23#sL*]nM~\n ҩS&#DJjH\S[<5P2>.^yyL,|x>愾3} h+++aRkTUU@U___]]MohpqQT*++͔ Es3x>H">}}ҹ3,X>Em}PQ|x#}&^Jãm<_dMPߧ~!~$? gv ڲk.2ߚ17&rJ𥗾3A2P hɕ5T0;֏+&''_AB%5.1OA>4M{Gxㆸ}[LNu-N>< %><҇@Bcc1 }GIRgB\}AT؄PYvwf$;rJL)%Th7Py}l+WDJjH\Qܹ#\Od]`b~G{ gP8~GcN[)++dOTVVҟogycfS ׬YF\F)6ӫ}ժU* |}YCs}#'F-O`QYh냄|xC bÃxVb={b*/ď'ބ89ql86!Nر;7w۔c*f|ޗ5r3\>[Eɓף_AB%5.zU\Ecz:ɇsΟkF?uD'E@CKEEE8O2*BZjÆ ]]]k4"+ooo1+'m{{{7oggƄJwO#G1?1ҧ|xã*J?<|xY * IfB|8f* ^]rNgefUfe-rdg>/z#G9y0*(NpJ*!}pA&ϖ--#T\i/OvM=*gEK };Tf>Aq͚5G>۷o335FnQ,J">H(A><>*v?ݴiS#hO: gIć_~hYbPҧ|xã*J?<|xY=(G3!]j̅Gx<^oET؄S۷bŊW,# vOd崑PiɮΪ, fz\^ϛdz\\Wf*?o?|w/m3r#DJjH\GN?>nNdy {| >Ԕ56J_|{}9~ |xã 9}Iuu514566Ґfz]z+\W_ݱc֭fϞ=f4(mz_顝GGGK;H(A><>*v?PWΪ4(}<193B# 6"kΛˢl]+\O#A׃޽{{OwKGa}yɓ#3̸J__-(}>< GHA ̘P}M!~$?&czyyyYY`, q7y,XQ$wNWޙ^%Y)2_Bw^K6OVMߩZ+[wѯD jfIfctBez8#bgϞEΉW݌s>,x)ҷhO:'>ΩȄJ[[ۊ+i3)W9lHC8rmٻwށ-E:uرcôggƄJRҧ|xã*J?<|xYɌ }ץK%IO q|F>T^BetttϞ=mmmS{VPײGӯO9ͮή,,|Sy)K/7deR9Og+WUѪ%p֭[$TRAP͌> މbcӦ169).\G f>KfSWgO|x>QV eFs*2bŊNI_kWٔjZ%Iy֎<22B_qwo]mdSK+rFO >}v>zh,J">H(A><>*v? $S&T֮]n k6,}'oࣣtGo\>~!;gIć_~HuM5z`Q|xABE ><!PA<+*/$TTęb v>>/f7!Nþ}z˛Á=L?zI㔉Y2K2ʳʌɛW TH$wc=չPiYl<̜wtmeSd"a:y{mkb)r9ǎu#LoEttS٨,X>Em}PQ|x#}$T ~xJʼ? x$? 0L^YcANjCwkJLMxszи;TЖőWJTJp~щeߧ~G ~PI B5cfPb@>Ym}PQ|x#}$T ~xJBB%IOG6%X8]Gj~';~tmz΁5ٙӽbr**O&TNO휾bz}oѲ%?*/;w.5@ jQfAf\(} 3QSꪭj^dGbH>rhϦ?uKO<#|b*fΣՓ@6,fNekue|}f\>ES>< %><҇@BI/$TT`B<ϙ3gȑ#۷oymw{焞XCeo{.c|׷-*Nz~۷oۿ'|= ~PI B5|xcO9#f|D|E*X>Em}PQ|x#}$T ~xJ%T4y*H*~ p8\7+(H3gN:u{>U2we2< GHA Lch/$TT)޾'FGG;6oZ%Vڠ(bz!7ُqfrŋ>x ~PI B5|x/2%<2|x#}PQ|x#}$T ~xJ%T4y*H*~vKlܸ1z8 ?4*wVژR,|*c;dBꫯS)V? >~ B5|xჄdF,JG GHA (*< xh?nKF~;D]Pyɓ'(Ik~ȵ;w.A(x j8 Ɍ>E ~_7>< %><҇Y2PY"C(5*Ź".\P ;C&T^1"(iH\|x$T$Eizٳ/9~L`QYh냄|xC`DPy_HCqz{5WRlbEJ(W|[7$xXWrD_ ~`)m}b*kzWf,H$|xm}ܯ6jkkpqqP<ãm<֧^=mLt ^A{)PګϖbPhܒ=7%F/JUU"'s<iH\|x:ujxxxhhoڵmmm͍Ku۶m<|ӧoA{><4>J4UdԔ%H|xm}BPEEEUUUuu5VVV.N#p0///''Gxy_HCYUrYAE7 7 Ÿ#lJW+%ODD/Ϟ=Kak'><ᙅϱc߿iӦYAy۷ :thdd<8ڋ><>cZKKK#Л4R\\ C&h/%6c2 ?J^~?o.7BWď "} ƒ?^{ͬ (|xYlذaݺu I2]v]]]t[;F{|xãOcx c0oKAn4RGO`0H>m~k9R=9&1:>}=gxU 1}ի4> |xÓOuGTͣEhIqg><>Ezn;'x<(*B{1GxIrvMB0h?N{ ! ;O|@><7sN"`UUUP(*QTb|x4i(]%~K0|x4ThX?36=fmP'|!  y4l/ďORȂpAjB><CcMfz*444АYQQAKGO?01,ZeT潄M*x><W<X'&&b/ˬ?C= c8OtQ[nݜWΞ=eGИAWKK˲uuuUUUhGȢKy-%)fBl><>h[?𱢿OL>CYʣKRJh^+> Br k'><ҧVZ544ߑFh& s1G[?Jd KƜ -y)MO$TOεOťb^;ѭ3q|x#}0~)Ѷ~cE|GD2+?Ѷ?V? "}PQG[<F_WwݙF"`0z^Jm}(#*Z{֐)|B?+|yֵĥ ; q|x#}0~)Ѷ~cE|G&P Cm c  5|xillliikddd]inn&҂ۍRhGkBe߶mkJzڃi+kzI`ƄʒXP\D+} \dy)S$~xH_JXGf2fGL{g|gV*Aȣm{!~ ~D ><>ҥK:::vI fi/^\RR=X\V( ̺ Dhg9~?vd$Tzڃ+kVWf$P)?U[Z/޼$F𻡱Ds*ѿ4Gh[?𱢿Oy1-bJJh^+>H|xãNRU\Vܼ9 κ |?}ӧǣǵxqϳ?;~O\4gޛ,[jݰ\zK<:ݕ%hQhC`mNJ>1 0y{]f<ڶ 'A*jhC`3c{Z=s`(H/[,W[Viܿqpp0M;~O_Iݲֶ<_$c]Y:~i><!0~Ѷ~cE|$G2+?Ѷ?V? "}PQG[>!/r}IvNܜNv4^g ~LY?HL3V?곾^MDe#]Y޹eC]]]uu5 16><ևeG}b֒b^ɬ?TNkS3z8 QѶPQG[Bh׮]jjj q_G޿xGu2A7'nscهʮ%j%Z]V*J[!y?BXW͟ךI݉ ^UUEEJ/FnJ&̓u>h?GG BtI}lEw}}}SSL*ۊz1wE'b}Nò5 GQjƥynX&k{,><!0X[>cO A1y= C#IPKu>·!|X[_H|xcatׁ֯_OEv+"e'M\f;P T6mGB%|?:|OT^ϋCONUYUE:sL*֒y#ASZU H8.( 9ٔ:Ny+cdc$|xK}T&#<;B~ Yxh$B_RJKKS"Ξ=  3|x!ήG8S xmm-]1,\p˖->CB{R㏎*C%oUw=~ʚf͢ 7c5j %N*&*[Ĵy3n=c>/k>~I7eV0I{ B<.ľd i 3|x!Ζ2n*rx j .Zo޽C%!0Ɋ )\>,zx,:}YfQ644D"y3rMMMM$tX;6Y3 |xC`ұ|~@bc`(zYxh$['ąd ><V]@gK}Shٿϡ=dڏC`Q- ):EO_,ZT³fjooFM71NV Cm)~k_sΩmp*ѿ:Y3 |xC`ұ|~@>IQH&HR cm}a@4Zª l/}Sq7+l"+#Nľ}pJ"dڏC`QE 髋A}tV+G_G._8{;~fuh_ BN Gt-'iQH HRY?Ꝡc ,O:( f2s18KTx+Ž\>p/Bss/ ᴠ/yRxatW`Sq7ÇlYzzGӯԛ^ī4c)}dtTdoBM~9'r|C ^'Ww*TڭESfQͦ3 |xC`ұ|~@>ÉQϣ?HR=ނxnTM9XOtP>d99WW_ɹB<կNr7'qM7rrnTW?sMX WQ>UU_M=j<+~A'EtTduB/]/_%^ĩ7+>='ĮCbbYѦ؟DGt-N2#<^!b~ Yxh$gAlAS+iX~~A`@4?&Q^tzͽ[,Ĺ7}?8.n CXu-MÀã|?:|:2/'rCyG}Gyͩ 97Iea9nʻ7w|xC`ұ|~t(sH/HRݸ n#p'D3;v_.! VT;[b{'߃Os;v\=jd!ΖqAcnG> zx" M%|~<㏎*N:$N^yͦ+ o:z8'?%>*'6 ׊4%{|xã|_:֖|LlQH)HRݸ H^Vu'D3cs#'B 2nUB13B<%w{|^ɹM7޹߱[PYw}!ΖqSR Ç{K#>ؔ>)!0ꄊ -)ggPܻNB; ENK4?Wt֝u=>/k>~ 3̑TEd2+$q|X[_͌Pplw|h.;ƀ߽~z*|B)ׅMq{5kA]zţ|.Mkjl;. P_Ǧ)>h?C`Q哽 }}>W '_0UquYwy6%]yo)D6LGt-'iQH HRݸ =02 O:( fx[~!tє4|5;v?9!. qL%;R>wli|q%~7`yn! zţ|.M;vؔ>Y'P9rԛgޙ_\h<]TMt7di|xK} 'F=G C#I8 P`A<}~~A`@4c"ĭ7rsG!Ə?zsׄC, s !tv 4b7]y~x-'{ӂP_<ʇ:[+=0-]t=ޡ86OA|?:|7"=&_7Ͻ;^/Ϲ=8tV;%yI8(<#nV)Nd]0|xK}$3Rˣ,bݠc> C#Ix 5q}5 x>g%U!^v-3_b;я۬(EBjkAgڏ pZ@}1(ª lW^ٷos{~86OA|?:|8aqԯWO^pu쒓MxUEO(ݻĊ%ns| {|xã|_:֖|n#^f㡑{2 ( >h?h?|0 Νz(zig}Y!v{ߖo[Q1 0lb[{]wxat׈757yGzG6'Ex>U>ٛPݾЫg.9#;O:tɦ9ҷ_lyZ<!0X[>cO0rw!G# C#IwfA|T'P`A<}~~A`@43@IntGGhK!~ޡʮ0Y#-=-^+qZ}=H?K!lAQ>UYT_}ҳ%: 86OlA!㏎*M#b}*^xᬳoʾSν)EO.oKŤVy_;o}N6LGt-'0GRy=ɬ`<4Tgk=BPQQ} ,O:( fFQ{~^mI:y{"[sZy_YW>&||s-=3xܧ~iA"/om>pZ3"ʇ:T\_wNJ/cSR㏎*M| ѻɩ9U?Ag^rշɦt+8tnOŏg#Y3|xC`ұ|~@>cXG# C#I ⧨tsj9X~~A`@43Zzw<3x],č܏ϿvUvO:KqrlA7ͦ8-W/CXu-5]]-cS:χ'P]ɩ:܌Q'œ.:OdSS;&)O Gt-'pb(zϬ`<4T d6XOtP>͌H޷ܽ;KgۯGqG= qI99CVT\*,7 8n_"Iua'8qZ˰7׽%ւrr UT>iA5~әh?#|.F\O* ؔ>Y!0 !n[O}ϋm[qv_y׼UN6%E)qw%`Ⱥa(󗎵?IfG?t^Џ2+$-7 BPiii('D3#$x'ۯbC=>=KeScvO:DxUB[VeS#AV]@gK}Çl_xd)}RdڏC`Q )u;;{qCeY }RI_)k~=d]0|xK}ͣ" C#Ix 0P(D甔4ϡxhfDyy}-M1&'#߽%n3nB>!'dO^]iAwHyW;-ۅ'Aat457QЋ/cSF!0 o[[[QSD,\+t9hsW 3م7.7\Iz8s==>/k>~ &6`(zYxh$gA|Daa!SZZ }F я[>Go3#GV]@gW}1S\"1w`SdR㏎*NPҷjpD5v<!0X[>cO a(z$Yxh$n\lQTTTZZ [&P>/}tq7}><!0X[>cO 1,̣@f㡑{G6%XOtP>$c\Nl/'5at6!0ɢJϾ+N{Rs*ۦ|+3Lw>GPQ,RS/Zgi?Y3 |xC`ұ|~@>ÉQϣ?HR cm}a@4Zª l7O*l#6OA|?:|"2Z(:oMZ65Eo|#v=/|?t'.d]0|xK}$3Rʣ,~sʛ+)8a2+$߱ h?<D3|x!΢7O* ؔ>|?:|"~t'oS=3gSzyj'͢s ~_Z^TTDߔzQTRRXeb踓SI(󗎵?G43+$߽h4ښH &h?h?|0 |xcatvx'KtT؟P)8q3gwR__J/ojEu]AIP)))D"5ub`͸cfm|xK} 6<eV0I t2XOtP>><և:[ ÇGtT؟Pqv?8Vǎ/c€h><>UR_T> h?<ʇ' *k)TmmmMMMTEE]壓c9˝G{u, wYp0-{w$ |xC`ұ|~@>iQH$Ck O( fXC`G"eҔ8 +7C`QcB%%q.Tyb$<}\[GTq CmԆ#Hqq9uMbq Na(󗎵?Gуɬ`<4B ><t/8eeez86OlA!㏎**ՃWЫSSf,Hu&f.7ֈU[⒒ihbdc$|xK}T&#<>4t9}t1c455EњMŗ.]:w\*CEtZI>h? $TN-Ր FLyb bJ0EMv NJq뷉ONZea?WNr1(_F-'<ٛgff<ڏQ>H|xcO]]]ssskkk[[51hu6.* BU_;wYrٳh2N*iӦ-\pÆ ؔ>qU>ʢiccj "S}X{Ă5b?*ݸStmw8iebjdi|x/#֖|HlQH-Ck O($T><֧FK0)DQ*++KJJ ʲյx⎎ӧOMٳg/]tÆ ===O>'{}Lj* i9Fcr ੼݇ŎgOnػ }b6'wػ(_F-'0FRy=ʬ`<4B 'ȑ#]_@ Gx Y΅^L 555 ${駟޶m[wwU-[(%׬YiӦ]vٳpgOϽ~0Q%TZ{DbU K|xc/#֖|< 3fED2+`<䱶~$qܹ~lܸ+ |xМQYYY^^Dh.#eeeEEEEյz˗/Y$ /^teC֯_O>hўGSs?ʧ=*n2G8PA7N_|~@>b(z0xcg}AIG,X|hBN2 M]4$\oӐ*ޟ{hgljܫ}"sbbaĺ=T>}!Da>9X60|Ge2Rˣyٛ>~q zA?NCϬ`hcOc1A3ebp%~|xcOleÃC>iQT"DE]><ߝG;vܹ >|xMuKK4N)SU__OKԗ˛6GBdw|F/M/D9'SS5WA}'^GFg &x><W

<_ئ/^<W9rcMf><1f3ft̑h~jmmmll-//& ԗNȥ-qD,7NZx=6;}gRasw4Qc#|M;'w5Z&8x g><`2AQ>dFH*GRԗk;|~{ !] GMSżygښH e$}伉rQ\:A.F. Ot~Ի:ȭƨzEsnq6:6U>^Bed`s+%TО'K} ξ#N ky'T^<#~Z_FP><_<'Gy=ɬX>< |xk}h& -~_]zus24aTTTdhp '8 αR+c;y=ns\U$dS^Z?FTEַ>aJcѴ  dϹ_?88yMtI>7wB$9/k}0A(@>b(z0ԗk;|~;|xcOsss{{3iسgϒ 2}thhhD"/#Y#g9wedw쯐#r[DKʞ ])kJXQkc'&]Q9f\oc>'T0e ;+2 *#|g-|IĉЫb+yϟZ_FP><_w|!4ZbԩӦM?͛i#cL2&M4a„򂂂l=5k•ᔣr˖-3>hs\=9vNvVɃr0"\[)9J%"#Q.M=~`/99(dC`QH2>c1!'* K:'5dk|>G~?5n:svSb?^}0ќJ⟃ևAQ>iQM43+/#w>w$T><ևT}L>kzEuEQ)++/>re|ZT UR<= yR FaOWg yB8pdtSGG*F7~lmƧ;TEkܾg̙4JN%v v}8v*KRևAQ>LE2+/#w>w$Ts,wq0Jx!0aX_Gܺh,W++X)+ W[ l[ݱn===%|rsgvu-*nWjްOVyC^m'ò?3P%_uGRL̠|?:|P1=ʓtF|v >FSoR-Μqر21o+vʒ砾x!0|xпxO a(z$YA}|x#b><O}bSHqc Cg"eťťRz울 ޷6 v  |uur_"!ߚ&G䮰|R``7QnwƢC`Q僄c{'5L'Xۿcל;N\Z񡭭4FM8Q4=gOTsr_oMMM4΄DÔ砾x!0|xпxO 4(z$YA}IӔڒ6-}|Yc[GB |xFc;_ ep]$n4@}XC8aO|񎎎'677p)E*2qDbw"-WUUQQ [ҿg!_~$z\>C`\Z#_ 7/wɟooT*UTV+/U>HOXe$/}}lE7rSSU:A^QW/]D켑iX7( ˥ynX&k{b(z0ԗ{KK Mui@nݺ;|#{}lHOV\a'.d8P"zB+vFڠx!F0' ׯ e&X¿؝HqW* M6' n|:WZmوt~\ޘܡbՃWܞ?U8efΜIEkkkICs켑ϩK# 24„Mst2v ZʇGLFyw8/q78 =2Toii/))F2lt~;*fÓ>Jĩ2Zx=xL-\;/=P_<#Nc裏q:&&Z.\e˖g}СCe!V^9w\Y*(,,*凋<,U['P)_+ y=lM MiF2!0ABňޞOj9s&9+=?Nc&-_KJKv >Fxgwyn^VRioo5k'7c kf+++KTJMTԷibgcKÃţ|ͣEzԗ;]A  q~;*fÓ>}?GKřr&x\ JD_Hc11v?a1n*rx j .Zo޽ a`OTɣZyqyW^]%߮?[&㨔/?>. FU<7"9*hszf{/FC`Q僄=睸RA}Vhs_,Z$)rs4D[UUEt_12ODqݛ1j?ӧO5kT 3?QSSSeS(&6):N ZʇG#G# HRݷO X.>VX7>c@4SdPι7\ L8V*+ Fg'>ĈagLΟBSlOO.|_)O4mVyeah GMr_XngLع=-oV4P_[_c!0ABňޞOj*)+8q"/YOc}tOtouwȠILߚp!QTxv >F>xbARڒF~947گ}k9 N=A}XC`A(@>IQH&2T=|~dWUdSN'ZrG^yL^]*X-MW:A<jk yZ}Q |?:|P1blρ'5zB=^JNk>"zC̓ uQ5Y0ILj<瑆/IZ5㵟4NF_׽O"6ZʇG"< dVP_FtNO zA?NHj>~C>֍d't1{)W.9{:YbWL\t)Źs]Id}8Q<낺IybX>KW(t)7m>t[_?m5(b c`|)>g+;j}~¿ ^]]MA&ϧȼr'rd<"/ΑovnO!߮4'Z O-Ո|1,χ?moWɳux9ϧ + ʇ #ڳIM&+J4j`f͚n笃*םW_q9&.nimmmm/NuMn6^4O3=3>w oOi?ESfѐK6Bx!0|xпx?Qϣ?2T,->X7>c@47snT_~/?s-G\qIg;%3>oQ|FW^xh(ڵ+Wą II|^(ݛTϕ;?)O#ݤrnbgK.voypx(?ZN#ꧭC8aOO`SqynZ_mnnMqW|y\[GsH>N6.@4-P_<tP><_[PPrﴌ-'|n|ƀh$3>4~/"wsGf|>{_DyeqP28+gor!>Y*ZBx:3)5ν,ކ+)S{{æ#wx|:kP>ĈaǶMmQY`s,>'m_cr>nk|3dU6cKÃţ|ͣ" HRݸm=Qfᣀ=>֍d?!N /D˄X+nwz͝W?읜>hw>-EWXL]+vǏ^Q:>Iρg;aqͩV.^)GKEX5|wzzRX\+Ξ݇`ZjnlTء|' #ψ s;Q  <>~d_S#VyBV)ߙ(oOPL e R6JY+eD:)O:=./:;A}b}eC`Q僄ڳʼnνjr_A.>গ.sS}bpK&k|~M|9,/k}_:(/LlQH)2T7.@mi$/o:"3 Qg F'FNǽN6WkG*!zt!e)ƍ?=}ZOUM*gΈɈO#ygcK ή*/C%/$f<蔃ǠwӮV\;;ؿ2%ϭ5y}|62W_#S驯C#NcF<7?p@m]-9|D>#8ꛜgG!&8JtsbXCYcމ_WJIQ+eͩL[g$;Cl'`MQ5ZGG*FRk.o8}GA?ss~s: G/Y{^tKDSo9]~_1_}[A}XC`A(@>IQH&2T7.@#w|(n|ƀhdL}BCξ)âx6=}dvލqw7W_M>x޽*c)+WzEeX[,6+wKΓ̫zJxDYşpl+zz8?<5?U5F(b c`|Mkjl;. P_M3CމJt|Rna9COQV5#ZX*eRrdp r쯭Sʇ #)}5>W '_0UquYwyd6%]yU=H >߾]2x!0|xпxO 1,̣@fe$n\='>YcH<ئi~7:PC8&x>ަi}{9t~9q8vL,a}aq="ުɿ> O]Eb_ /WܛT.řr`OwJOB AoJVSz!_qtء|' a6ۡ";*wU>=^/F3="先MwmwQ*7XER.rW|SRvnUyIr>mmwxx|?:|P1Z{G.8wzSr#;s~+G ']/l*'7t_1C`A(@>ÉQϣ?2Tm9?E>X7>c@4bWD7rӏow_:99s劸u7rG#Ɵ<5^W9ERoUV-~սCB;Rgͅ"BN\8O;n@aNh/!nuvjm!?m>K99ϧC8aO|cEz/m>IR|BL|kmmSܧ{yRrMOȏ3r_lo5*1GG*FRhc._qtjH~ܻ8 .CgžS♗Ďb3bV1oh"b]u(_1ô>/H-\Bw^Џ2+/#Ix 5h}"c !cu3D#|)NF*6gĤ};EP8aΏ4|Μ'OBxegzLbh [~.TTrÂCgʝ[O^;1P|o_]v*#9I`]~*aeEs%PA|bء|' #ψ +W޷=O~{~T D`A|,69ϰ!_jW{[VSlv72Uʹ)쒲_w'oiRv*D6Ip>s$үL|?:|P1B{O8Om:~Z5 IM.9Ŷ{X񘘽DM*am~ևAQ>Qh Dzԗ{2 (8|[!2cH<Ν{(zyg}lY!v QeF{# g˸w[2B#o碻;vv9O:{V-ܸbsH7" y}OߥSeΎBX<]"$_ƋyB.m_%sݻ@R(܌Ku ^S_VTn>Ce11v?aqS&P[WloraN`y'Sg+o..MLr[݄J_HyRWpY2y~/#Q|?:|P1B{ݾЫg.9#;Oj:tY soXy^Ӕ1^TMԯ7Xۿc><ʇAQ>ݥcE2+/#IwfzI= N8|cȈ>rh䝕n;縳~߃;~4R!}gwx˗mǓwNbAgh(_THM'$~-yB]!~TWg5)^%pS$ EYS2yB'K\ՈZs!,Nl <* ?#$|Ԏ~qx>>?Ra!}Hk11v?a0>}ҳ%: mr;'[*?/ ?Y+*N7eOٔ>)_=-?\ Gx 7:TXZJ'(㏎*$T֞Gľ *9Ygߋ}{ v~ѵ],$:IwFt_1C`A(@>IQH&2TgkzB \{|1 ǹGkⷊnOiz;~c:yйqT ͹5g}vpr'*^{->Mc[OtΡ>CCyn͹ukѣwuLMrfD:ߏsW_)KDGI _?wJDxR$?n\?gj>wu| ݚ3ڵnUVWP>Ĉa0S)t6G=U~B6\v7uRJ_ʃRnߓLxTʳRK ɰ\]\ רd C`Q僄󷺟{5='eO9w񙗜'5wVûw[/Zf:T׉GW#F_1C`A(@>cX`6MhIDATG# HR=) :95L.>X7>c@42ϝ;?8>gt<箎_7r4ɦ y_>*7899ɕ˗ō}4֭bs2>&er-dG~0kzlՅN68?X>t~M5sTяGKEbIxgD_3{?p#n~4k3쯲2!F0'x>#Wނx:CoO?򷫜'UW'|FMRrɠtysc/-?f˫ɰ[J2!0ABHjyǝ5] >xrE|^IM]۝kN1Y g>C_Hj>%~,tP><_<'pb(zϬ$-@6(***))?>D{|1 '8qޡ{ݵpۂǸq=(gK"jNPAŻΓb\/>E:>aD@ݽ{w(;Qq挓PtI\34T.7q'a9_w="nT81W|8_DD bo͎;^ ;I|re+ex/k ߹3r}i>ο;n99CVT\*,th7/fq}eC8aO|F\O* cyR<&4OfO97~# )/[R/n/L i&.zy-, MξFP_R_CtT b$>iVXUl~Zl}N'0'/I'#KWtP><_X7>c@42Ow-(Zx}1<'@OR$x'wǪU=аcɓĉļ'}lw̮"-P9Xh/n6σ?R1J{5aqL }ŢPΙ#$x'3uV=PʦxǬL|' #ψ>|xK zނzdG} s7|gR>!v)JHZ>R}E~#|Muw|!,OL><+$ʇ #|{.885$tFW)IJng{Lt笒xEc&ޔpM _}Zg|q .Zc./I/u&~*;A}XC`A(t(7H/2TpBtNII->X7>c@42O<"ΐ>KenBeK\~JQ񁔷!):r(*OTC`M죇ʇ #?\~wũ7kK5{uמh4J@I^"KX޹ޙ"{ᮆ;_|/-w~Eu,s|o]k|CE[[[QS["=u)s}ևAQ>LE2+/#I8 6 ZO cH>#~7H H[v?YΛ>૬rg`٫ 'ӎ_nYq"TPyL Kևq;0xfSqWR4F7Gk-4RRuMђ(%?Iyy8_WZF9ᠾF'c(㏎*$Tk-|Ir_ذl 5-j`t& 2F4v ><Ϲrgzc)$n67:C_)y=EB]ȵg˝ę2qT*W>;P_<#NcF<1c,69O*䙩&K9U)k$%-[RLʟHJSX$-g;YLy->P_R_CtT b؞#ߏjܾul]Q766|k_׿M߾%&7N?:|*ݰOЗpUUM,k{EGZۿc$A/SsjkkkhhL~>|K_ǸUZևAQ>|ưH3Gԗq:̂x>GR>֍$c\NwWgfX('Ģ"'dS\<@w~SŰx=,^+g%72+rDrΕ ί(g;ևq;0ضm><ϴ˟IޡROIܒRdj+ߓs囝އ@}__DtT bDogݢ5n3s̎jT]*ؼ7x"q-Jiiimm-}fA]s_1zv\K͝ hhjjW;#~>GBEKMh%ͣsx!0|xпxO ĨQYA}Ic>HǺdϼl,i \ޤ-Gn|QTx _mN2yC^-4W4TP_R_CtT bDoΝj9zֱcJ4 %Zv@HCJJJx]DZܤn >Fx7~vܤkiꝾ6߈Co9޽MaS>_^2nnևAQ>w)QJoN9}͕~ 0Bhԗ;|1 Ov4LПkwrR(ZƲ7rJQ`x}bx"$B18ۅ>0xx!F0' ƇT<+}L|?:|P1g1xم)TmmmMMM CBqF8󢒒 j*"Ha/I3u+ifVP_FdF[S:X,>X7>c@4ѿ] ;[g^Pp!,bQHL-Eq(-p(PNP~I|OQx!F0' އT<a<6'#@/4C<)'%K 'YRm$y}|a{}F'c(㏎*$T9%q.Ty&*&681ZIMM텵H$RQQO,]#Oq]Rsrnu**q^Mu]AIP)qq~k%bqK7NE}>/ &6`(zYA}I 4Lgg.>>֍'{}x㡿~(LX)|xyinSyDXYA)E#=՟=P_<#NcF<6͇8<5G,?-c5}o P=埜~7W\yU^(/Tk}xWIGG*F\=xU>/*?U8eVIYYyT׉1|g~ξΓBOnhV9/a|g檪BsNG1Z2d***b:|ևAQ>|1ʣTfe$NM֥͊+bCEX7>c@4OϬPlHHTxwo<$gNރb >ĈaǶMmgyQtCRnvoOy?toO>!I]/TsyB^3MEtT b؞^_{Ůļ&;9iu,05 :9YN?Nc|vEEN6^DsP1g`:ݻp8\ 9{w$>/ 3fED2+/#w>֍eAK l=VMև3b}7/EJå)GqYq~G61MmQM<ZRR)̽e5Q^pTX8a{̠|?:|P1==J޽buXFu I θKĜe.\笆Z,:\~ >Fq&iµbPc[ee%ɑH⚨[.v*k$!0|xпxO A1y= ˈ>~cu3D#])я >& DKm*NEEGA~YY> [!E*%"Q){)ᩔnEO1$VN&T^ cZsC5P_U_AtT biO>,v={r cɸb&t5~gMj3EkĪ-bywA]cqIIa4Lx!0|xпxdG{S7OQ 1pzfe?Ǻ|Z}NZFi>}:1ZZZhMMMYYm*tҹsRҴ-jwB:CSN**厈|;"B)J[ R=7{xGne$yF^ȳaB|eFP_4+3(?FT* jXlYP+'|gNJq뷉ONZea?WNrA}XʇGG9{l ̬X>< |x>>dMP_<577ё^ӛfZg֢P(]500߿sΞ+WΞ=&T6m… 7lؐ¦(dOS!\%?OIQǤ|^R>'ek\)e=w TCUromk#| EJ :$TF>LE2+/#w>w|!4OMI6֧F0)DQ-*++KJJ ʲյx⎎ӧOMٳg/]tÆ ===O>%{}'roL&\ܭǃOOOVOOO \W['y΀"FLj* i9Fcr *#lg=7wCXM]9pP_<`2AQ>|1ʣTfe?ǶBxz.><Dv Ajjj***" IO?m۶UV-[lQJYfӦM}}}vڳg~?fk"eQFߓ?],uJ쫒]؟ckP>*-="w1*%T)|xã|0A(@>iQH$2bm|x;_wI?u6n 11<MGz1ʊق4 #{뫫k˗/_dIl;/^te˖ч_}G*|<+(/'Ϡ<Lf;;|~X`%><xsA7݅4|g*hڈITUeu}54ަ!U?>-.cDCq(G-.R_ĺ=T>}!Da>9X60@dG9y7}~ YA}1X>w5P><*2Vcc#1*|xcOc1A3ebp%>L }0>3ʇ|̣D43+fl><k_&,/ǎ;a;w*O<x>4g2%aʔ)4eדe><O_񰳾bj^x]ȑ#6O><ʇ f̘1Ӆ^x3YfܛP_:>iw7,hނ8|`|6_<(/g#<IeVО=Gb֋w{_@ GDBS׼yg/ښH e><U>bq{Ew%W[?Ç>ʇGH3}Ԉg#h_F/\@|xcMFׯ~Wn @XEEEQQ|xc#|Eַ>aJcѴ B_rFÃÃţ| QϣdVО=Gpm><>3fkϞ=K2I6><`1ǿĆ)NXYX8->||x0|xпxdGYvsY͆'gVО=Gpm><>ԩSM6͛7ӤBYƘ2e L4i„ /#IlX 5[l} Oև'bnŬ~A>a~FÃÃţ|̣"ifVО=G_:.><ևfbY++RHYYy}Oև Cl><_<'ɣZf3|xcm} |xk}L`:Y~-8umY WTWб,RV.-(WV$Wٶcݢ݋{zzb |0tT`A>|>ʇGH*GRg#h h3|x!0d]ep)H6g% kOY`91Oև Cl><_<'Gy=ɬ$ҞZfѢE և@ұpm><>d]y;::&NvRHUd⤉d@"% jZ[[[ҿ Oև Cl><_<'Ϡ<Lf%R___֭}> h3|x!G'ρ֯_OUve&XŸ H$T€M6'0OvL|?:| >tFÃÃţ|T&#<;B~ YI=З┈FgƂo:ZK><£G :&$+Amm-],\p˖->CϨd k}?:| >tFÃÃţ|ͣEzDڳ[\\,BK6Z[[&և@ұpm><>d]1nrx GȆS-Z׷wOv |?:| >tFÃÃţ|ɣRf%['ąd k}/k fXC Nֵ1M?.AzzzsI'XC`Qq`|6_<(/g#<dViXO(K><£uGtݟXz喞-^~% #Nľ}>~2!0?|}0>/ 3Ey=Ȭ$Ҟߜ;~ @> h3PRnBtn.ޯt)Źsi祻ʽ+u}UD!G'O`u[z\R+Auu5}l?>Z㏎*,>|`A(@>ÉQϣ?H{, ,|x!пt/\@7}(.~u{P~+n;)3_j$ Q|FW^xh(ڵ+Wą I3w9W \ w'qã||t{ۣ2_ Q$tT`A>|>ʇGIfG+cB,v^Џ2+8 g QNQ><_:.ܛ>47{=~Myz{G|>hï$Q^~Y=$T(mi0Pn}><ʇk?>|2>U>X|g#ŃAQ>Qh^f%l\5 k}/k fAci!bkNQ!V?wr&|>hw>-EWXL]+vǏ^ϋGՙiywΠORG£ugĄA܎}{+BE a0>Z㏎*,>|`A(`b&GJDڳq7/o5?#yy[iXMXCX[_6sBG._|J!ݞwFNY?>7r>i+ZZ|>UG :79#zJ|;ɹqM|>B+$ |x/<:Y~Ftu{^ aGZq7}2>U>X|g#ŃAQ>|9ʣLf%>ã|/k f)}zލ!{\ ~aٔσܡB10 1 ] 9\x߃9 I(_xtnE/w-]xŸ0MI!0?|}0>/ 3Ey=Ȭ$Ҟ !ZKlDO3CsM)rx;v?9!. qL%;q}M sMйs%qXmf\}S<c/<:Y~M;vc d k}?:| >tFÃÃţ| 'F=GJ"9΂?XMXCX[_6>WFn('mAyM99trf+֭7o|^W9]!":oujWSowv#^9WssEã||ɺ!.:px >a0>Z㏎*,>|`A(;Ɍ(˅.~78-H{KXW{)>և@ұpm&[|g ?xUM3lA gpYJ?o>gɓ*^~م>sY 8!/|}MWS|G\C- 8>w /C Nֵ+W޷=O~{~T D a0>Z㏎*,>|`A(t(/j^f%̂o ,|x!пt/\@uTHNLt>S]S [8čw+*Aƺu-#==bv.cgkԯgݢ*ύw߭3\x>b X'FnŻ&3><ʇk?#ncx H+:&Oև Cl><_<'cạRf%,Gaaa~ XMXCX[_6u>D'iҼ Џ9ݼÃGhK!~ޡrpg@<$syAg(_TH&#( 8>sOʛK!M'à(_xtmbKϖ;4/ 1^O&և Cl><_<'0GRy=ɬ$ҞZjP>p|><_:.d|}͝xzXwlOɃ2} ݚ3ڵG}NDkI&ޱ'O:Ƀb^MPޭ[snZ{}sgwz3>U>X|g#ŃAQ>|ưH3GDsStsj9Xccm}L|4wZ㏎*,>|`A(@>ÉQϣ?H{ࡨd6XMXCX[_6u> uߡXJ?xGq gB\jNPA B4Hg'3ĉ/ θq=( (jNPAŻΓ8 d(_xt0H* >dk}?:| >tFÃÃţ|$3Rˣ qUA/ |hDs_D(*-- VϡoZKINU=LcyՉ)qDXꡧrv8yR8{/MOwxx|xK z^@=Ҋ =a!0?|}0>/I7rS2+x P(D甔4ϡoZKٟhL8NDy߿ 1.Fٟ݉;||/Y"/w(3fvH'oS: (py$߽_ ۅ#q C N6~=ijn_O&$tT`A>|>ʇG|0y=Rʬ$Ҟ,(,,sJKK<`7}ccm}Lxkx;h<£tb7c,6Oưև Cl><_<'0GRy=ɬ$Ҟ  cGG>Ç|x0|xпxO 1,̣@f%D |><_:.dq?=1Z>c |x/<:Y~ |vdk}?:| >tFÃÃţ| 'F=GJ" CX[_6Z_xtzR% #8'> cGG>Ç|x0|xпxϝdFJyқoN_ys%'Zf%_!пt/\@|xc/<:~Mד `6O*>>Z㏎*,>|`A(4(]7ff%-F֔F4> h3|x!G'Kzc6O<>>Z㏎*,>|`A(`b &GjDsKK 0; :;;և@ұpm><>d]&a!0?|}0>/ 3TE2+g..mVX8h k}/k fXC Nֵl]>Z㏎*,>|`A(@>iQH$l><ʇ@ұpm><>&0k?M#epiQ\V_pVtLgx=P>U>X|g#ŃAQ>|ŨQ`2+hFОyã|/k fXC`6],*./O= ʼA9!0?|}0>/Q(7{~---MMMh X<6]_tܹsN[Oﮎt6sLj*©Er23pfA>a~FÃÃţ|̣y6ifVО=Gpm><>uuuͭmmmtfƠ٫( $300߿sΞ+WΞ=.Sfڴi .ܰaC وcDzѴR11.8|(Ç>ʇG|0y=Rˬ=A{A2bm} |xk}i ill 2H4٫ e$quuu-^cSdK.ݰaCOOϓO>y_1*>Z?FT^VIQH*l><ˈ>ru|>chs2HMMMEE7{B!2A}I駟޶m[wwU-[(%׬YiӦ]vٳpxϘb#|QW1lA>`|6_<(/g#<dVО=G ;ww7z#|x<3*++#%tțHÛP_FRZz˗,Y$ŋ.]l2ד>hϘbƟxxQwG8 c;}0>><_M.iHϽO} |-.~u{?&|*ޒ(wVoŀ|0>3ʇ|T&#<ɛ'7c>J=@{Ě5 K?o T:a|xC>yǦ oHnuuuL XL><|xI3!*̬.^U|R><}رsN><]sGKK4N)S%W}}=i[,Q_F;}0><|xx>LE2+]><|b^x]ȑ#6O><ʇ9gƌ3]w%zܻB}><`1><|xO a(z$Yz>~p= %T*=><򩫫 7o^___ww B[mmmMMM?2X|x>|?̣HfŶU|>< 3|x~~_]zus(**B}|xc><|x(@>b(z0ۮW ($T><֧}ƌtgϞ%d$P[[D Q_Fk}0A|x>H|xc1uiӦ͟?tQBCcʔ)$0iҤ &><t~x><I3"n@Y!%W ($T><և|xã|?:h?<|xG|0y=Rˬ $T>< b><>.t~xC`A|x><'0FRy=ʬ $T>< b><>.t~xC`A|x><'Gy=ɬ҈׫mmm-ihѢH-q/|x*fXC`AS>><|xã| QϣdVHiՖ4_n]|}п>< 3|x!(|x>*b! q zA?N`CϬR" ┈Fg=e>H|xcMGt~x><I7eVH)Aqq /hmmƽe>H|xcMGt~x>< $6F&GJRJ&aO X&09/#AB |xk},h><ʇ><|xO a(z$Y!%$0H$;|xAB |xk},h><ʇ><|xO 1,̣@fI Iי'Pd2A2($T><և|xã|?:h?<|xGNzERJ9a(?"c {|xã|P1Z :h?<!0><|xs'Ze zA?NCˬR F9wZG b><>4u~xC`A|x><'<-ˬRj 02G|п>< 3|x!(|x>LE2+Z /o0UF=e>H|xcMGt~x>< 3̑TEd2+Z#6/#AB |xk},h><ʇ><|xO 1,̣@fRK#{e>H|xcMGt~x>< 3<3+j|F L%0 /#AB |xk},h><ʇ><|xϝdFjyBlb~ Y!-XSe>H|xcMGt~x><I71*ˬҨ& 'PƧ|xã|P1Z :h?<!0><|xLlQH)BJ$ Ə_$ \ NdSe>H|xcMGt~x>< 3̑TEd2+N ?B L`|}п>< 3|x!(|x>|ưH3GRJ#apI܆N rrN ?' OG b><>4u~xC`A|x><'pb(zϬR !EEE%%% X^A2($T><և|xã|?:h?<|xGIfG?t^Џ2+rA JKKCs(2|п>< 3|x!(|x>Qnj^fRN7!BSR?"c {|xã|P1Z :h?<!0><|xLlQH)BJ& mB9mB2'|п>< 3|x!(|x>|9ʣLfRK6(***-- l=e>H|xcMGt~x>< 3Ey=ȬRj #Sw$Ye>H|xcMGt~x>< 3<3+ A>H|xcMGt~x><H)Rzt+ocBˬ $T>< b><>4u~xC`A|x><'<>4u~xC`A|x><'`ɣZfI ӠstG b><>4u~xC`A|x><'0FRy=ʬ҈׫-Z6+V}G b><>4u~xC`A|x><'Gy=ɬU׫|x*fXCH>><|xã| QϣdVH * k}P1Z@:h?<!0><|x2QzoyS~ Y!%$0H$;|xAB |xk}*.G:;;ON?fh4ZSSSVV x><`1><|xOy7"̊m׫|x*fXSWWFGzMof (** B/#>><|xHlQH-b*|z>A僄>|1ʣTfŶU|><'P9ru|>U.tRB/&d ' |xc#h?<|xGH3G"ۮW=|xPٹs'pٸqW@1kH$B"tȻ! e><O<~x><gPzE&b*|z>qG,X|k .GZ.G2 ]ePL XL><|xQ('o|泏|^Џ3+DkW|>

Chip's Challenge Level Pack 5

Chip's Challenge Level Pack 5


“Chip!” Melinda shouted excitedly.

Chip McCallahan dashed into the Bit Busters Clubhouse’s control room, where his high school sweetheart was waiting to greet him. As he and Melinda embraced, his briefcase snapped open, and the papers inside flew about. It felt like Chip was experiencing slow motion as they floated to the ground.

“Oh,” he said bashfully with a knowing chuckle. “Guess I should’ve set that down first.”

“No worries!” Melinda replied. “It’s so good to see you. What’ve you got in here anyway?”

As they picked up the papers, a wave of memories swept over Chip. It had been years since he first set foot in the clubhouse and completed Melinda’s original challenge. He had periodically returned for more as the ranks of the Bit Busters grew, and new levels were made. But life often pulled him and Melinda in different directions. She was still supervising the level design guild of the club, while after a period of solitude at Mental Marvel Monastery, he landed himself a modest job as a teacher at Chip Grove City High School. His new position had brought the two of them together again.

“Are all these tests from your students?” Melinda asked.

“Yeah. As much as it can feel tedious to grade these, it’s nothing like pushing blocks around in your first clubhouse, you know!” Chip said teasingly.

“Hey, now,” she said. “We’ve both come a long way since then! And as a teacher, you get to be the new faculty sponsor for the Bit Busters’ chapter at Chip Grove City High, right?”

“That is true,” Chip said. The melancholy in his voice was evident. “I love welcoming new recruits into the club and seeing them grow. But sometimes I wish I could come back here more to test out all these new amazing levels you all have worked so hard on.”

“Well… you might just have your chance. We’ve been working on a new challenge for some of our most dedicated members! But… there’s been an incident.”

“Really?” The spark returned to Chip’s voice. “How can I help?”

“We’ve started doing something new,” explained Melinda. “You know how you used to have to deal with those blobs smothering you when my lab experiments went awry? Now the Bit Busters don’t have to worry about that! All the levels have been converted into virtual reality spaces. They’re stored in these.” Melinda held up something that looked like a miniature crystal ball.

“What’s that thing?” Chip asked.

“It’s a storage device and a portal of sorts, all in one,” said Melinda. “Whenever you push this little button here, you get transported into a level! It’s kind of like a virtual pocket dimension. You can go through a challenge as many times as you need to, and now without any bodily harm!” Melinda was especially proud of that development.

“So today’s Bit Busters don’t have to get clobbered by those pesky walkers anymore?” Chip wasn’t sure how to feel. “I kinda wish this technology was around back in the day!”

“Me too,” Melinda mused as her thoughts also started drifting into the past. Much had happened since she and Chip first went to the e-prom after he completed her first clubhouse all those years ago. “But all we can do is improve what we can and move forward. Right now, the problem is… all the virtual reality bubbles for our new clubhouse got scattered throughout Chip Grove City and the surrounding areas.

“Really?!” Chip was shocked. “How did that happen?”

“Well…” Melinda replied sheepishly, “It was my fault. I learned pretty quickly not to store these things out in the open and all in one place. Especially not on the rooftop! They’re still in development and can be a little unstable around each other. The combined force was so much that they pushed each other away! But the good news is they can be safely put into these little boxes."

“Oooh, shiny!” Chip felt like a little kid holding a new toy as he examined the box.

“Think of them like little Faraday cages for the bubbles,” said Melinda. “They’re safe when they’re in here. And what’s even better is that the bubbles are designed to teleport back into these boxes once the level inside has been completed.”

“I think I got it!” The wheels were starting to turn in Chip’s head. “Are you saying that if I go out and find the bubbles and complete the levels inside each one, they’ll be zapped back here into these things?”

“Precisely!” Melinda replied with a smile. “The good news is, most of our Bit Busters have been honing their creativity with these new levels. They’re trying out new aesthetics and even experimenting with the layouts of our old designs!”

“That’s cool! But how does that help us?” Chip asked.

“Because the designs can be a clue to where the bubbles ended up! I’ve been able to find them using this.” Melinda held up another device that looked like a handmade Geiger counter. “I made this little tracker to make sure we didn’t lose our new virtual level library to thieves. You remember that incident with Jude, right?”

“How could I forget?” Chip started having flashbacks of Melinda’s ex, who had infiltrated the Bit Busters many years ago while he was going through one of their new clubhouses.

“I started discovering the places where the bubbles ended up were very similar to what the levels themselves looked and felt like,” she continued. “Maybe they were drawn there like magnets. But because of this, I’ve been able to map out a route you can take to collect all of them and teleport them back here. Think of it like going through a new clubhouse, just world tour-style!”

“That sounds like fun!” said Chip. “Where do we get started? Where are we going?”

“Everything starts and ends here,” Melinda responded. “You’ll find the first few bubbles in our training area for new recruits, then you’ll need to explore Chip Grove City. Beyond that, there’s mountains, caves, factories, and even our server room. Then, at the end, you’ll venture into… the Mental Marvel Maelstrom. It’s my new secret project: a big tower with a gauntlet where we can house our hardest challenges. That’s where the last few levels are located.”

“That secret tower project sounds amazing! How many floors are you planning to build? Maybe 264?”

“That’s a great number, but no, not even close to that many. I just have nine for now. But we’ll get there one day. Let’s start off with the basics and get you back into action first. I’ll keep in touch here and continue supervising the Bit Busters while making sure the bubbles arrive in good condition.” Melinda handed Chip an earpiece, which he put on.

The two looked at each other longingly and basked in the moment. Knowing that the two of them always had each other was such a comforting thought.

Then Melinda broke the silence. “Good luck, Chip. If anyone can collect these levels and bring them back home, I know you can!”

Chip began running down the stairs to the training area with a newfound confidence in his step. Seeing Melinda again was always the best motivator, no matter how hard the challenge in front of him was. As he approached the door to the training area he had first experienced so long ago, he saw the first bubble on the ground.

“This is it,” Chip said. He took a deep breath and pushed the button. His latest and greatest adventure was about to begin.


Welcome

Welcome to Chip’s Challenge Level Pack 5! As you journey throughout Chip Grove City and its surrounding environs to collect the missing level bubbles, you’ll visit several different areas called worlds. These worlds have 10 levels each and a different overall aesthetic and feel. Think of them as episodes with their own individual difficulty curve, though among each other, they’ll steadily grow more difficult. You’ll also find keys to warp points via secret hints that can place you at a later part of Melinda’s route!

Here’s what you can expect to find on your travels:

  • World 1: Origin Outpost - The often-reconverted training grounds for new Bit Busters, this section of the clubhouse was once home to eight “lesson” levels but is now a gymnasium where recruits learn how to move in a virtual reality context.

  • World 2: Chip Grove City - Outside the clubhouse are shops, offices, and quiet neighborhoods where the residents of the city live and work each day. Most of the levels here are simple and easy-going, though a mysterious small island off the shore of the city looms in the distance.

  • World 3: Mountain Mayhem - Once you return back to the mainland, you’ll start a vertical climb up a small mountain. There are little villages and plenty of bite-sized challenges to discover along the way, but the top of the mountain holds its own secrets!

  • World 4: Treasure Temple - At the top of the mountain is a set of abandoned ruins that some have speculated to be ancient temples. No one knows who lived here, but the temples themselves were explored long ago and the treasure inside long gone. Thankfully, it’s now (mostly) safe to investigate, and the environment outside is peaceful and serene.

  • World 5: Caverns of Curiosity - After you’re done finding the bubbles in the temple, the journey back down the mountain will take you through a series of caves. Legend says there’s a particularly dangerous serpentine challenge at the end of the journey, so pace yourself well and get ready for the puzzles that await.

  • World 6: Factory Frolics - Chip Grove City’s industrial sector houses this set of levels where you’ll go through fire, gravel, smoke, and even a few warehouses. This is where the difficulty picks up a bit. You’ll have plenty of opportunities to use the skills you’ve built up so far, culminating in an ironworks complex that will put your knowledge to the test.

  • World 7: Wonderous Wasteland - While the industrial sector has provided plenty of jobs for Chip Grove City’s economy, it’s also not the most pleasant part of the city to live in. The surrounding area is home to a landfill. Various level bubbles without a consistent theme or aesthetic ended up here. But beyond that is another mountain, this time a popular tourist spot in the winter.

  • World 8: Painted Mines - Inside the mountain are colorful caves that many have referred to as the “painted mines” outside the city. You’ll find levels of all kinds of wild color schemes here as you dig through the rocks - er, locks.

  • World 9: Bit Busters Mainframe - After you’re done at the mines, Melinda has more in store for you back at the clubhouse! The Bit Busters’ server room is home to plenty of level bubbles featuring challenges from the students in the computer science class Chip now teaches, which is probably why they fit right into this space.

  • World 10: Colorful Compound - The more artistic members of the Bit Busters’ level design guild have crafted levels where variety meets function and a colorful aesthetic. Since then, Melinda has constructed new clubhouse wings where these levels can be showcased. This is the first of the two. You’ll find some of these colorful challenges here, but don’t get too distracted by the scenery!

  • World 11: Pattern Palace - The second of the two artistic showcase wings for the clubhouse, this one contains a plethora of design patterns that the Bit Busters have experimented with. This is where the final third of the challenge begins, so don’t let your guard down!

  • World 12: Ambitious Archipelago - Venturing back outside the clubhouse, you’ll find a series of little islands and challenges along the coastline. Despite the relaxing environment, the puzzles here will keep your brain engaged!

  • World 13: Dusty Dry Ruins - Melinda’s bubble-tracking device indicated that some levels landed in the inhospitable desert area far outside Chip Grove City. This may have been a thriving village when this area was a frontier being settled, but now everything’s been run down and abandoned, leaving behind an old ghost town.

  • World 14: Puzzle Precipice - Returning to the clubhouse for the final time, this new wing will one day hold a trial gauntlet where Bit Busters who wish to undertake the Mental Marvel Maelstrom will have to pass. For now, it’s home to the first wave of the new clubhouse’s final series of challenging levels!

  • World 15: Mental Marvel Maelstrom - This is it! The mysterious tower where Melinda is building her ultimate challenge holds the hardest trials in this new clubhouse. Everything you know will be put to the test here as you take on these nine levels.

How to Play

The CCLP5 package contains the following files:

data/CCLP5.dat The main levelset data file
data/CCLP5.ccx Story and author information file for Tile World 2
sets/*.dac Configuration files for Tile World
CCLP5.html This documentation file
cclp5res/ Images and other supporting files for this documentation

Using Tile World

To play CCLP5 using Tile World 2 or Tile World, just copy the data and sets directories to Tile World's standard location for these files. On Windows, this is the directory where Tile World has been installed. On Linux, the default location is /usr/local/share/tworld.

With Tile World, you have the choice of playing CCLP5 under either the original Lynx ruleset (which also features animated gameplay), or under the MS ruleset (as in Microsoft Chip's Challenge). Tile World also records your solutions automatically and lets you play them back later.

Using Microsoft Chip's Challenge (MSCC)

To play CCLP5 using the Microsoft version of Chip's Challenge, all you need is the CCLP5.dat file from the data folder. To make MSCC use this file, you will need a program such as CCTools, Chip's Controls or MyChips.


Links

Stuck on a level? Want to report your scores? Or just discuss the game? Then check out the links below.

  • CCLP5 Homepage: The official information and download page for CCLP5.
  • CC Scoreboards: The official CC1, CCLP1, CCLP2, CCLP3, CCLP4, CCLP5, CC2, and CC2LP1 high score tables.
  • CC Zone: Modern message board and multi-functional Chip's Challenge site.
  • CC Wiki: Detailed information about the game and levels.

Thanks to...

The CCLP5 Staff:
Josh Lee, J. B. Lewis, A Sickly Silver Moon, chipster1059, VT, mmoraleta, and Jeremy Christman
DeltaCore and Tyler Sontag:
for setting up the voting site and providing the staff with very detailed voting results.
Everyone in the Chip's Challenge community:
whose votes, feedback, continuous encouragement and occasional nagging helped make this project a success.
Aaron Farmer, Andrew Baker, Andrew Menzies, Andrew Raykowski, Archie Pusaka, Bouncycles, Calica, chipster1059, ChosenId, Craig Vilbig, Cybersmack, Daniel Bouwmeester, Dave Varberg, David Stolp, Derek Bowser, Drew Roen, Earthling, Eddy Limb, Eric Schmidt, Ernest Bartulović, Francesco & Matteo R., Gavin Duncan, Henry Potts, Ida R, Indyindeed, J.B. Lewis, Jacques Smith, Jeffrey Bardon, Jeremy Christman, Jonathan Birchall, Josh Lee, Joshua Bone, Kacper Leszczynski, Lessinath, magic, Markus O., ncrecc, random8, RB3ProKeys, Rock Généreux, Rolf Redford, Ruben Spaans, ruogoat, Scott Feeney, snacksforsale, Tom Brown, Trevor Hedges, Tyler Sontag, Victor Tsukamoto, VT, Xaser, and Zane Kuecks:
for designing levels and offering them for inclusion in CCLP5. Due to the number of levels in the set being limited, some designers could not have their creations included in CCLP5, but they certainly offered some stiff competition to the ones that did. The detailed list of levels and authors can be found here.
John Elion, Michael Hansen, Christopher Elsby, and Yongyi Chen:
for developing the excellent level editors using which these levels could be made.
Brian Raiter, Madhav Shanbhag, and Eric Schmidt:
for developing Tile World, thereby making both the Lynx and MS modes of Chip's Challenge available for playing on the various operating systems in use today.
Chuck Sommerville:
for creating that amazing, timeless, classic game called Chip's Challenge.

Change Log

2024-05-06
  • Third release of CCLP5 to correct errors in Crux of the Matter, Another Perspective, and World Revolution.
2024-03-12
  • Second release of CCLP5 to correct a flaw in Axis Point.
2024-03-01
  • Original release of CCLP5.

This package was last updated on 2024-05-06.
It may be distributed freely, as long as its contents are left intact and unmodified.

® Chip's Challenge is a registered trademark of Glynlyon, Inc.

tworld-2.3.0/docs/CCLP5/cclp5res/000077500000000000000000000000001475511570500163175ustar00rootroot00000000000000tworld-2.3.0/docs/CCLP5/cclp5res/CCLP5.css000066400000000000000000000032571475511570500176460ustar00rootroot00000000000000body { background: url("dirt.png"); color: white; text-shadow: 1px 1px 1px black; font-family: 'Open Sans', Verdana, sans-serif; line-height: 1.5; padding: 0px 20px; margin: 20px auto; max-width: 1000px; } p { text-indent: 1.5em; margin: 0.5em; } h2 { margin: 0.5em 0; } a:link { color:#B2CCFF; } a:visited { color:#E5CCFF; } a:active { color:#FF9999; } hr { display: block; margin-top: 1em; margin-bottom: 0; border-style: inset; border-width: 1px; box-shadow: 1px 1px 1px black; } img { max-width: 800px; border: 1px solid #ddd; border-radius: 4px; box-shadow: 1px 1px 1px black; display: block; margin: 0 auto; } .title { text-align: center; } .rpad { padding-right: 10px; } .small-box { font-size: smaller; text-align: center; } .thanks-header { font-style: italic; text-align: justify; padding-top: 5px; } .thanks-body { padding-left: 1.5em; text-align: justify; padding-bottom: 5px; } .name:hover { font-weight: bold; } .right { text-align: right; } .level-table { margin: 0px auto; } .level-table th { background: black; color: #FFE866; font-weight: bold; padding: 10px; border-style: solid; border-width: 2px; border-top-color: #FFE866; border-left-color: #FFE866; border-bottom-color: #D8C141; border-right-color: #D8C141; } .level-table td { padding: 10px; border-style: solid; border-width: 1px; border-top-color: white; border-left-color: white; border-bottom-color: black; border-right-color: black; } .level-table tr { background: #404040; color: white; } a.secret, a:hover.secret, a:active.secret, a:visited.secret { text-decoration: none; color: white; }tworld-2.3.0/docs/CCLP5/cclp5res/a.html000066400000000000000000000336651475511570500174420ustar00rootroot00000000000000 Chip's Challenge Level Pack 5

Chip's Challenge Level Pack 5

The Levels

# Title Author
1. Lesson Zero Josh Lee
2. Multipurpose Tool J.B. Lewis
3. Paparazzi Jeffrey Bardon
4. Key Free Jeffrey Bardon
5. Fragmented Lamina Josh Lee
6. Choice Tools Jeffrey Bardon
7. Trading Post Jeffrey Bardon
8. Trick or Trap Josh Lee
9. Secret Jungle Laboratory J.B. Lewis
10. Ages Beyond Jeffrey Bardon
11. Pyramid Scheme Josh Lee
12. Vault Line Jeffrey Bardon
13. Cardboard Cutout Josh Lee
14. High Fidelity Flame Jeffrey Bardon
15. Heterochromia Josh Lee
16. Moving Day Jeffrey Bardon
17. There Goes the Neighborhood Josh Lee
18. Press Any Button to Continue Josh Lee
19. Hue and Saturation Josh Lee
20. Forbidden Island J.B. Lewis
21. Slime Sliding Jeffrey Bardon
22. Capim Town Josh Lee
23. Elastic Energy VT
24. Uphill Battle Jeffrey Bardon
25. Drops of Jupiter Josh Lee
26. Deephaven Jeffrey Bardon
27. Dumbbell Dichotomy J.B. Lewis
28. For Want of a Nail J.B. Lewis
29. Sandshaker Jeffrey Bardon
30. Ragged Mountain Josh Lee
31. Sealed Chamber Josh Lee
32. Socket Shrine Josh Lee
33. Terre Haute J.B. Lewis
34. Spirit River Josh Lee
35. Fortune Ravine Josh Lee
36. Charmed Ridge Josh Lee
37. Quantified Nerves J.B. Lewis
38. Exit Exaggeration Josh Lee
39. Mysterious Geoglyph Josh Lee
40. Wealth and Corruption Jeffrey Bardon
41. The Dividing Line Indyindeed
42. Instigate and Exfiltrate Andrew Menzies
43. Verdant Cavern Josh Lee
44. Thunderwave Cave Josh Lee
45. Insert Name Here Caverns Jeffrey Bardon
46. Axis Point Josh Lee
47. The Toggle Station Eric Schmidt
48. Tank Game Reborn Josh Lee
49. The Sound of Silence Jeffrey Bardon
50. The Unwinding Joshua Bone
51. Nitroglycerin Below 57F Andrew Menzies
52. Magma Cone Josh Lee
53. Reproducing Jeffrey Bardon
54. The Slaughterhouse Is Open for Business Josh Lee
55. Dauntless Extraction Indyindeed
56. Smoke Inhalation Jeffrey Bardon
57. Irradiated Radiator Jeffrey Bardon
58. Warehouse of Lost Hopes and Dreams Josh Lee
59. Clone Machine Factory Josh Lee
60. Fuego Ironworks Josh Lee
61. Snowbound Tyler Sontag
62. Unlock Block J.B. Lewis
63. Party Trap Tyler Sontag
64. Condemned Facility Josh Lee
65. The World Has Turned and Left Me Here Tyler Sontag
66. Tornado Alley Jeffrey Bardon
67. Manhattan Stoplight Andrew Menzies
68. PPPuzzles Ida R
69. Shady Oasis Jeffrey Bardon
70. Ski Resort Town J.B. Lewis
71. Amethyst Mine Josh Lee
72. Miner Setbacks J.B. Lewis
73. Three Boot Night J.B. Lewis
74. Dark Hollow Jeffrey Bardon
75. Canyon of Lost Color J.B. Lewis
76. Yellow Fever Josh Lee
77. Avenues of Zagreb Ernest Bartulovic
78. Salsa Verde J.B. Lewis
79. Drawn and Quartered and Quartered J.B. Lewis
80. Indigo Lagoon Jeffrey Bardon
81. Numbskull Tom Brown
82. Encrypted Malware Josh Lee
83. Polarity Isle Jeffrey Bardon
84. Piston It Away Josh Lee
85. Sokoban Adventure Jeffrey Bardon
86. Phantasmal Stalkers Jeffrey Bardon
87. Network Corruption Josh Lee
88. Flypaper Andrew Menzies
89. Hacking to the Gate Jeffrey Bardon
90. Decrepit Crypt Jeffrey Bardon
91. Airletter Shop Josh Lee
92. Glamorous Diamond Downs Josh Lee
93. Shuffling Zane Kuecks
94. Feat After Feat J.B. Lewis
95. Room of Requirement J.B. Lewis
96. Sour Apple Cider Jeffrey Bardon
97. Color Disaster Inertia J.B. Lewis
98. Closed Circuit J.B. Lewis
99. Cosmic Express Jeffrey Bardon
100. The Most Interesting Block in the World J.B. Lewis
101. Barefoot Bandit J.B. Lewis
102. Minimalist Art Gallery J.B. Lewis
103. Illicit Logging Facility Jeffrey Bardon
104. Escape the Monotony VT
105. Beyond the Facades J.B. Lewis
106. Slimefield Josh Lee
107. Bento Box J.B. Lewis
108. Brown Note Jeffrey Bardon
109. Let's Square This Away J.B. Lewis
110. Another Perspective Jeffrey Bardon
111. Aquatica J.B. Lewis
112. Melancholia Tyler Sontag
113. Power Plant Peril Josh Lee
114. A Love for Puzzles Bouncycles
115. Titanic Monarch Josh Lee
116. Sho Sheng Shui Joshua Bone
117. Cluster Two Rock Gnreux
118. Lightning Before the Thunder Andrew Menzies
119. Unsanitary Waters Bouncycles
120. Fray Manor Isle Josh Lee
121. Lockjaw Jeffrey Bardon
122. Expanding Warehouse VT
123. Sandstorm Shelter Josh Lee
124. Dig Me Out Josh Lee
125. Holiday Spirits Jeffrey Bardon
126. Master Carpenter VT
127. Wastelands of Tabora Jeffrey Bardon
128. Fahrenheit Frenzy Jeffrey Bardon
129. Rundown Railyard J.B. Lewis
130. Apocalypse Wow Josh Lee
131. You Break It, You Buy It J.B. Lewis
132. Prism Concerto Jeffrey Bardon
133. Emblazoned Altar Josh Lee
134. Flotsam and Jetsam J.B. Lewis
135. Crux of the Matter Andrew Menzies
136. Molten Crater Jeffrey Bardon
137. Gravelways Markus O.
138. Eternal Engine Jeremy Christman
139. Udassa Joshua Bone
140. Yet Another Perspective VT
141. World Revolution Jeffrey Bardon
142. Crown Jewels J.B. Lewis
143. Lagoon of the Low Tide VT
144. Culmina Crater J.B. Lewis
tworld-2.3.0/docs/CCLP5/cclp5res/b.html000066400000000000000000000016151475511570500174310ustar00rootroot00000000000000 Chip's Challenge Level Pack 5

Chip's Challenge Level Pack 5

The Secret Levels

# Title Author
145. Pardon Our Dust J.B. Lewis
146. Broken Paradise Josh Lee
147. Lounge Act Tyler Sontag
148. Brute Force Derek Bowser
149. Shadow of the Day Josh Lee
tworld-2.3.0/docs/CCLP5/cclp5res/dirt.png000066400000000000000000000073031475511570500177720ustar00rootroot00000000000000PNG  IHDR00`nsRGBgAMA a pHYsodtEXtSoftwarePaint.NET v3.5.11GB72IDATXG5]K#뫾E ADAaPd!!! I0 &ⷎ>}:<=յzcU[,켸nq=N6gfqݯ{ˎǚyvX},փϛwWbَwY#sMWVnU,;z]/;E]QR,Zøn><-ֽhEݏ߸PP~_L!!s)ǟbvX|(FgWlҼUVe%|ǃC)n-autV[KΎ /*oW/vw b'4lHOGW6&KdW-: ru}}/6/;q~x1JG[Z, A8#sI0@#4$hnxYn |[jqz^oxʼn+%Oj^ULE^:D$a&nl YɁFG8p?*Y14xѾGNgr5<\ln!7ŗ2`J2.ĺ4}z!,ÒP6`y^0aa2#bmu@tAZ![.nac1w/(GʬInU I"by}=Ӝ3f)BXq2xe%.yхK= Cא!ߊ̉B== !5ln2 eo3 țmi06Xmy l%=]H(aGsL0Eɖl/ux[J1}ZuJۿ?\vL'J=N Ŝxtn-d\PnI]ן.8z1YwA!%^i .2~2OyA$K S4h^ባeMo"cbF~и 6\%ވeCd BcSBp=bޙTC>J9T7R E+n 鬍ɍ#Sǣ'j+̜i=/ sE4`% fE,\J8[$ᘷ޲ϨvM7x(KY4848L J2al84R)B `B66ᑪ%̻WH,$%|Y$~ o DUF؉p5LZ-~djl$&PuL:zG3{AfEd)Bl&2%B2GY>3VP"@&]I_~d|?̶|iawc6oVh7.&ŒwFi*r'Ә!ړ] G{lZ^ j[f]kM+h yExh:UaUj\H1՜S,_x!xrF%&uΔFRᯇ4kDO0_$3+"=+NQ<̿q 97CI&2y$rcˢȹƉH\w1PNCw1%B ''8M~I+—d"bbA>Z"Kׇѯ!I/g@LLp\ ~7FɢS'ň$ ?rBĥ$JʗY-PɟFI f=c;R,!Kδb+hq嵳4 |h\ u99*7oAO=LSW4^ wB>GT E8W)Qj<_® +Ki z"ؖHҔ9M1t:E?DOhR%##co(Z}Y&[fYߦRDjoKu:5-F75ɡeW>k_d9CS\ ~sY7C+_sȠNn5wl:yG~:ܧ-TO[Oɝ$Un73*#frV=Q\"rEIrrÇ^LMO>|6q p$ 4P|P)10:bŚ#&>P)10:3&!3ڤVzԟ8+$'22?$٧HI|˙?3f~ 5y %uТ2߿vm?a1H5åvB/J|`/0O p% 4 'N>Q=y'ntSof8Hc (? 0@p_ H8M@ħLڟ>ѴBgNFSKG@̟-&?3z\(sf |և5 8iOxS[?( m%yKh$h,V-hޒH@?Ӆ茺5h0ޭǔ?j[3I%!hĿ(TC Bd$(B !Õj}3 /u;,0'>E(Bm|Z'!PD4JWC{3ɽݺz%~0$? %($&>p@i O$&>p |+*t]Y8UOW{O| Iw`X%>OO Xs˙?3 _*RO]~ލX'.v~pKJH|$+ qt3__"Cn9?_%y8{.$>@ "p)27*$e|98O7@䏃Ÿu}*WZ::EI߲JXc2] _xJ~f|e|e~ 'dd!ŋ`AH|'b+6xݨ6(brL8U7, H8M| 4 'NH8M| 4 'NH8G)V +C9ebuH8+'.:bE/2?d~Î x;6>wON O O O OO(r|Yãz̍o%mXmK"I|< &.$>4>9:֗/tٹE]nQ Opp(@EZ22'(<ҘEC(@©w;#xz!'>! _M B _M B _M B _񙮲&쯓PjtCX /32?d~/BP'?ˏLѲMF K;?a7Ih8,ȉO pIu;ĔVH-&ޒ8xKhrb-ʉO$>F+'>-&t|ֹ^D'4vS ~[$roI| q[G#l=3'>?3R*2?@dL*iTKL@G K|*____2zPB%Codnt!2Ë02Ww3#4R?0RnHxJO2i:#1`cr'7⋎ '*S?P$>uHBL%> gTI|Ƞu֗o.y&ɟ$I ϴǡrn-Hp{73G\o7]! "C!9$XH8ɟ  \.,Bw(!q(!q(!q(!q(`ry6:9>K><(fhyV{:u׷& D'eJ^_]|/UWyuO9?,Gx"TwppbY8?Xϟskv~Yl|fw~ C tI{w??k%,DZ)I)>FWjaʠġتm=MЧ3Y9ߵ&FPDEP ͩ ' "B耍]ru aћ:N:g:Q}v5bQGjg |g )ѡmҹcõۖn< n=Xo%u=Ozg\OLta]y~nBw>ZY$x-QщfuF;i:z8ֿ<_rwd\4N|] -Bm# hLX-,+ϴ !0 >euw.(t#$x, c_ĝ[X˳l]Bԋu7:l6ÔH&A( Xy}|~S+;JғgA_yy|W.m۞/zexd}׉/?"~=ht`")o؁f:ա=OX}k0o/e_.>t[ZjA|p)PEWC&\vAZV;%*u;(iz v,F*jb'ȱg'fn|XxosOc ?m~Y'Q=/,yC~b /gUyˉ<2FCx_+˶1p)( KpHX&^9Qw3ڈ[B;.B ipˡ~S1?7J\t&O  utocjSVn$"kߪY5.@[@z=]SS{O z|?ܳ΄ůnk6>;[?C:|j.to^~GhmkԟցkAWC-˽j FdOw7tcB7_--7hv\~v2^8V Zͥ5z֫SA# t߁~x_ۍ>+~&>kд?LrJZK}BJ};\)'+,vXoفVD]'B ݉ Rxin .;v2Eon0-7 iN.7>?]|(yBZꅸl^]NǿzJ\Bt?vn‹nGxGޡanMbyno]z\?$|W(&Jg od# N-t?S/| ,&mճV7Z@ Zޜ0݁1*o. ֯9{o #1 7n`%PIKKa"a)+_jOm<Q V>vۭ^vlmR5իGht t/?'lK]m|=mf)-#J%ѝ('?̎ZPZ*qzr};^(0T9gs- \ @G|4PU{K`~oń/l?]?/f0I+U[q'ݶ'@gL'9q:ԇ tOcyu22o˔ʊ[΃$SoAu[8]fEP n~g[*q?Ο_%S hȮz/gQYmӿ'7\'0Ao矻 hH]oSEiwL~d)w^l&oB+<ƒ ,ujl27 mZ  ;)!z0¦`%K)_[Q"!XOj[:0V>JpFA/MKQMn^)yZ@YHXoM@-y}Οf,7oB^ϳKţdϟ R蝆d ΄-•1)NY6KЏ?xQ% ðmZQv[~p:Ѐʐ#;г%OORyWWP/'uqK-ud<%%ǹ ?˟ֿZ(TV-2/]׿Lꢰ#e)Jx/7CKߗPL>a~3zrSK䵲R?O?ݿuI_r[4 oץuX֜OH4_7~O87Y7X&*%j%+"xɟՂIU՗O7~gK|uy֗8(F$ӑ~,CS+,:+Suˠ* 2!E[W>3`6A ݑҜ#Kt]$lz4FQ"{MEl?]ufvMC5vIΗ;:Jc5/|./{UV_4jMڕ9voyoTH/gܑ=K.iqłFcԿJ[7#-gUڄ.ǵ.i@|k`h[efŬ[*uO,/n,|QK|s^C[(Ju_$*U@v2 ?xFfR=kN4^X/3(?ڤP7zIn ]K$tK~_!2[A[܂pc o(DZ-37N =}FoоlBK {Ѱju\ERn54pzy,5wNg/b#Wҷ_DcufH+}yx+kId֫/lǕ/LޞXcHK\zYzO7I.,`%:*Yt GXn햧,,/㚋Bq^We_h}Y'ƣ_K[J#jhJA-܈Ny(}.'%unEoUr`D[]ot94wRr]aoRҁ08βB~_xYg7l>]l/Cuy){RDgvm\u*YkMW%pxw/l~~"'qc/u|jh*fT(u!~o࿦f){笃BՍ-ryQ l?L/K<9u{OP@ktOt+aUyW^ ZOת!7lr:̿h d>.hԱ kdPwGߊƿQU E Ͽ_޷lgЭ9 0(L`oQf=QS]`)a^Ͽ'j?Cx]ЬS/| ,cQ@oK>±9H~0fX,V}gɳ4xbb{-e&pvt R}~NVA I࿛ַWC>17C>}0dɟϊ7kᾣhS^z.`"1rJ쳾0Xa1տ< YyUJo? 8x=:~4@; Ev7U˷e[84a_[Qƾ20O׏h#La"TÞǃY-gM / ;o)Jڪs{#|Ɍ֮ ?Tz8EAK}Ueyq$P`\~H\:ej,'Yg.>ʊh3|+}ާŤ/׿󎰀@]][3)afETC7\2uTڼq\^j[(&{λywYg?-ˢwS-*Ϋhl܄^㎁vKl^ѻԻb;"ԞCgΟQ?$s:ח Fԡ^NV8~6z2_"姤g2gK744gM@ Ysz _pl[zKd,"Ԟ(KQO+s/B9J?uI:f@϶?\_sk8,(@3Q^}&: )!jjugE wJu+Jr/%Wy.Ei*J.ζ?w2>73xьBR_G#חo >oK 2[(Q+Тag Wۊ֒Ѓ[Xz!!1/Ҷ|O}wzwr.ݿO]rr^MZ1# XV&ՋXPm&gn*|dk\șOoR<>㯕@ %!GOX:v~;/u5ח&OEL pKxtI-*FJN:wR@ϵD|R'GXՓ?gp~ #5]t|No]eYL?=?wiPX,^{Ιe?߶4v;GI2] ex'O ;6WMpd"K\ˡm;I>]S~o*di p|n[vdr} z~n>@|D-PܫSE=p~;mNNR#6HWhQ/6jze_d^~m+aHf&8RuAq* I/b6N_?5ݖ]]\_jb[^oOϭgRs[OkAU) p<x IQ1s0x1/w';>n$5]F*r nb}`׮]ogr` L%N嬝lx!3s}1Oϭg`bH8칸{ Sb u5Fڷߓ§{s}-cG]S~æACigrkhAa8־Xx_(L0oZ- ;ҿ7VB9WCv/  !燧^+$Hh7o il_S?e} (z]r EB=pps|>0A`$>82>pa@L!??,@O]bvjav+.ICd]q^//i lU8WWR*}o 6E7Q]tf3?0T>D4-:#2?=?+)=^>2?@~0_z?Gѻw/d[3n'Cօ? b*GIt]OO $~?dH,%L$Crɡ=g (uv/ۂ7~E7zVO2 G$\.u^.Y^S#![߭f&8Pe(SO³>`72m<ɟv`@hxK[/4;sk?SVOk-J;"$o =  \|xp|I.?QW%V"[!vվ'=y_N$ѥp*xK 躀ߟ0H!0z/|~s<8OJ__/[Iv Aڜ KV!_s-'_AOשudQP4SF=mwPOs i%uAj?Z($LxҼ.SC?;7er} 5OϭlP -^@Oo_-< 貯x0ئn=?{D wiU_e~8bZ$")-vR&!t E3>3`A_7EWO( |B[Le,>Dj?8(,o[\__oOϭ^:{I8I#A ~IUp#1~MT_W$|yd:t_S@S4#t I aݶ{)OW:+V=Mp.nj2ⷶ>9݌ٶy50j >d~^vaZ={~k]h"z"Q޷~e>T>ELьpT=; 3ES_?pPĴ_g3,,+C9eYAe/)kze,|+Q {)! ]R{1Wq:)nlh YFs9[>QNS=p˅!{j/zy?:å ?4ߔNUKCx. VRx@v^] ~ SgMpdA`R_hCp }2O/ι<~؟?|$+gW7+Ԣ>WY8=y*wѲK𽨣KP~9EUuYUʡ'&8J|ّ* OƧ/ߥm~m qK]_THzAg҂Jؓ#pk~ܘbv 30-դ/ѹxYRk%۹w6n}evԿ`ӣ'&8Pe%8HLȳCʄ?^(Rl/Kżolm6gz~ngSNxΙ%4qn~v ՓWfRuV%CbRlޯsހhY jJ$Șᙱ@c]u|:>O[ o/!6\'?ѩʵV=YES1ARnx'mj{šU "+yG@v.%_3f)@C05s}23Ywj|=~BHKY!N(qp:o[X"nAj`?@ߖ:C Qn{ 7x=ߏ/}eJyukYMnTh$埧{uk0 ~|EiCKՉ! y@.B?-J.ζ?ׯIw6>K>"Igzd7E;7NILH~~:UEiAC/pUɜjQa{[סZyZ@B<8 x Q./:$2/{z/` |Ͷ%$q1#<wJP=?, Q"gWCwj89~'L?Կ/CY@sg }8?oX3 ҿw8~y ճ\Vs:X^[G-{1>kQt"h2/]ϰ:˷azI38>eMY>>ܿO/'rO0[k}gH5G4v1Vd4ܸ䣻x̼BKvpo[R 8>3G2-Gw٠mqWpo[~{]BiywH%6$7ۖ#g.{ ke}&-Onf#`~a6>[~xO'{l/ee7lS?,+γԪ]Učvk`7:2?[^O Bg {>/f/O݃?A ^_o߽?o+(!\ pT3G}CهO}ZNۭ`'~ÏΩ6| hh9S?[geٌ6c Y_ҿ{qnKLn޶ ῇXLĿPּK*8Ip0zEa`v'sR@S4#|zNƹlcn:<+nXNz-%Y\^$ oBm ZX>ȿRnDMϮ~c6nq>G4|@уmU8fsaO0\'䜚wٷz sHŁxF>f6\ 8B3IחJls%vW jۍg?TͶ?[ u;n ?fpN/b7sOZ,y|⣟~c)/a,#j|Ez Xܪw퀳}v9T~gR-#.u~f_Hh4|@҆~ϟ?uaN0Bŧw?}I Ym%!+4 B)tfgk *,M?};P@C\YS^=ZJlrpK$_<3?`pO~+hŖ / R=/ƝeUHOejĿ>(4"t6kbL~ZL?[:iWڽMh yźoIon|qZXx{Hv7ԓN]ç50~[T7 d^g(! WQ/88*+VO%{z>߄wzn Gi.,4'$' EG=CC]kI>/G9 ?/w2>$b=ғsw[b:cJ9JVP$T 8хg~lB_;GT3S?;:Bt]UӥEӺC ?̨9gGcP[a,tnS''o˾O@rO?~Ē%vqY@zVF 僖n]< o7BA ڨV3m9~p, S߿]H]ё[aR|9|"oY>6>V&Sիf(E -|Ϗ' ,@,'źbe؁&ُS; c BUJ%ꮢL jҧ.lߨ!  |@Xet*j֍[-h;bbz> jwFJ#]? \N׷ ^/'^@{|Efr5G#.՜ců8Tk$}0<ko* o0n ?b,Ex ,,|!ɇdS+g?D;ѕ~M_ ;AE =v{̫g>)"h[_^@kl$Sa(Q?_Y;?BVtSOWgu<ʿ/ט^7k٫gRzGd[? 8 R;I'rF |թbRw2Ŧ.7>]К?ԿK8 H0߇+wegK`LxwQ݇. .}Fn|V޺\}(ݲyz}8EXoUN>F/ݖ ]J\Hnh+A = IDATG~xP+{Y뱥_A>YuC%OKqFw㋢YB<ހxn..>?O?~VD֑}"=s!m[ϓ ޥX(slSBzd|4ҟё'[TVo4 //e-BMBj_?}:^_*ח]"  ۍM"S[2D7sח lfuH-Awo\LY#U:U?~JR}egVwCV csޠ|\:OA& ϠOS3Aߥpiģ|qK۟q<A6u^j54q:k+ qy `(J+r7_rĬkCКթPow 覱{ԾKfsS!^벊7M[ IV!AHp: yw9e? H׉A >Cn{K8h3Q~ A#KG]{Kc,Uѽo jA-BO'KoSp/B߿Q<u\IXQvz@.]U jKbˑl.`$f#p_/X/パ+HFb6?{kjtK( w|z@jזwҘ+\Q.wmVN-&rnjWnW-:rBK7׍"KGN׎IЌ{jQ7Kg ˴ϼG8K &ßG8?hբ3g+ Fx"K,Ȫ~Nwop@km>/Hw6>MmWuoIa6&ɟ8??)۽^|(/3p=Q߀l}:elg; +c.mUL_IGf >C>:/ ]:& LX;?WwJ7^f?[p/Z:Da=K87JSJq] H@b9O %HaHœ߷ ATu$̶_VUcn\Bm7pd[k* iۿmI-hH@A7Iws[{vےF uo .PZ>VdP7韴x@v$åğt=DjpgxFΚ/de!=ݠJ¹`g&Aj%O$\t{0>_"@C2ҿV@_(4W?;ח)r닒.쟺~Ͷa~v14jF}VRR_]~ fTό0A'ƗfT-D0Aʟ%T]kZK5~7imlOW\Njkn 1]BR@2½#0[Ȕ؏6fDK ;_ <)` _? # šbg]_HRT&@w݀lΐe %*>#ӵԹlFvA uuV=o]zis/1~vX|R4iO07//+ &*1'i2HϓnCB"g"3D W5څPK Y4 'SJE][;8L_C!95[IW'wmɟƏ g1nA_PD t tw2u! 7;!B'cp裬_OS3SK/5|w%68U֠KKلpSg"Lm,>_Dp-Og u1 ⢠$iII}77o--&О15͖{ HrSx,(xV ./x.xQeu@t"#}O%~q9KK=[ws P7/)T7FM'[QtB`,>x? 9 3)eN(n(p8n/ h|x 0[KzwjhFApA`>!DY㝇ct,?Gs7+HV\_pnx'dbyZGy h' :{A Qe't(Uݩp_#Is8ZLm=ߪ% ,C'WN~?8(~ C۪e~+q=ST@(00]j|I+ߐ_گrϟ? 4wWwė榑T)6udS RTB׾4T'(?X]B+BySB,?w o?FC-܆0{eWCө_L}@sPk2P+AU hGh/inqrưal|R?^ B=ox ~06NZȩ"[_U{it$]2{ϛYx~#8yQ0K?_dָ/ ._j7uL*E|@!Q>D;ˠ^=/+V{<]g YPuOgߺ?aaR|;.Y@?5*c*`"\Ba4N//߉zPB\ҿ% 8&4#B ]qg:,=C2g; X+O{ب$FiqMGI=~E1UD(}D!) uKKx?/$_<.֚]^{g}Ip# G?ퟭ6?Q1ݬ 8D;9NvH&~Rg%ܘ・&F^Yk4ŵcQ!&C"h";{ч4z PkH˨;{>j*?VjggVH鄱CMİ^]ee7C-qg 3'2zǶLǚ#p"nE `=+G-=GN8c.mA6\>\n:>iB:O9Gs)=%rd|_$\kytkl!2/AIsls- X=K\Buq9][/ @9jJ2(X^5O?kH=,/&oO?;nG^?T˼."[uZ%q눾J;Z//jH>):g{&ZᙕfoSǐ?q~zg~Ke}}j3s}:usa"&Qw U8S!GV/@gBPhʟN6jn2/ 瞟I 0$wy|'~˱-t?f -Kǃޮ= QuQGjh v?Y׿Vj5qx1=Qf=]~.>2PC#y|FP ͩ 3Lgs^?iLgqQ#ˀ9 9J1(_:inpm% ;|B)IML=q-q{\ɕFkgoC"q:B ϤGOϚbw`.,6~f|Di'˭m˝=WNq%BKH$2}Btx)hQy8>ryȔnOߩ~%'Dp?LPy )>̅ ‡s+QU^[qFfrG^ [X=sj~8/NnS'L$oe(r>KzA ʛ- Қ4~,oF ';-:4FWu&w-q?y$6 E)J[0=O \lJV(~wxg?_ҐI__vT9u0vR%aޜԠV/JD~ud f3ObZNe}7]6w2d6󔑭V o@'߿+H&-@Uϐ *r MIЇl>Ұ-jr]^o; A懣Ǘۉw,sH;pJ(g EruYM0~8 ˺9.eNyvK,-53t7㫛H k n3 "46NEJ{ e2uo9nyci)YMzc+kO`Į~^gSW7~߬xᱼΝ~b1粲z3CVzV%JI7C0 dGO=hwK^C# $) t}s}z~$/n-8/OwR~1_\h X[q\ m@ ew39;RP^ӬZ{|Y@k s\*ax(t)% Pͳ_IN.ƥs*}g)YI'O#蕮^@;/O ?@:~'xb0Ъt$ hXJN[Uڗ_+o(5S+ÖVЍ֭R? x>_I}=|^I$)Om,ܩ})YOPQG0zZSHI^C~bײJp~U{ ]QDtÿ>SfQFvBŧwV]gVXC QBtf95Qy[؁Oqg]M s_\pY^_ЪWևxZ>YD Ҁ)I[{LְjHۏW]|\-rLPaNjvwy6b]At dL;8ϗjS3?4ǯyS&&' ]ӶUfZwkLIyk+ՍPX7$RxTۂx,>?s>-dǣa41_u8.x@zbD;t~ Usюtf \cѻ1eԯr)}hyPZV9v "?ߤ1on }ҧCap$|R?ts^./AIM|^ӿ}I)3*:Oo<(Hq3#8A q~p ه>*pm$U=º@12d IDAT`ᖀO@ _Bi.qJJAR n;<4Jˌުw=JPP!㸹 9bIK#]aS/"2RO̠;BkwmIߊvw,yH kƶ"HD3n/1@:XRK^ Y`INBP:O.X ;''cud!@+ V--Vߪg5!mUY~?FxDU)!,m ll|R?<_@=>ie8M,ϱPSl䟒T+{:qy[@{4>񟭿)/i,h/-!-E5Es,[zTZF'#|is)Y__eh1H ɷ"Q,"rD֨>/!j |jo\Ix:.45vWaU-S?Ptt Ck:co!JIw ~z2k9VZZxs݁^n,}':"C{]ٿ>4כ5I| '_.J,n(\?) i+K(苂2+D5twWtt[@PJQɭ} ~Z Q j9M|^Q| '#a<*'JD0zaƋVҖO??D} E~K[?8Aw?ZF!,b 8tj0?/\Wb,_Ѳwa>]cFε'd]Bߝdj}'O|߬rُZ"kx=?:Nꃃioэpj*O`g@;!p|-=Wӥou'=?$1< ^ R(ІhEnkU{,ܕKj>:w%4‡}F5.Qg>jrzos@@sO*SO9o}pkږXXwkUi 7&idqJmQPj{>6񂞣.4[,pcwǑp?DcrS TwՃxG^=3^ԁ U\?::n~l|b)\^ЧF/W8G%fw??GXF-mvekQd3 h0n+d_\Gr^31*>t_E -RVauWNpv&x{)iYwnt^0Kqgk+<38m~y/j^Ïv*޽׺Wl=Ѷp+-瘟1EWOQ]S\gxqYAM%N3k~:X~[{{jiK@.,4x:.ߔU{a.|xxrTy4 iOB&]?tnBlPR`}C~s}Ds/2 A~^C^0Rp)B`,qkۖO?OzGR='??ۿ]Sh@/B""=i7zo "tO}]fHTBxN߫+';[Tbڐ#3AH}:?3;^C-s} xKh$>p}OψjWYޮF7,`Szğ~c=l|2,;յ@g}ߊ/Q#fnɖ O Ӷے[мQ@nE֞l[gEWs Y@< ;4HKmU/sٹ܅w%>F˺߄:LnUcq"A2 ۟JѢ(:g,hߩWuY[K󭅸BM;~k&0y6TN'rcxrhWgxq]!sKOwZ~f9ǯΈ}b6J<ؿ%2n?LG(~y~.'hjSn d;0`M-F~ ~ F8DĘH!dGۈtC he57to>?60ozvJʞ4ʐd_ uϮ P'Ls(!h!}:?3;]ft_{4?A~2\1~;_$E]F5õ,l-ok?Q-4~όZ dl1O/o`O3a[CE/4{C~oΟS9IK(36ol:fO?CK.=p.(Ƨ'ŇO~A~^' _K,Xvh26=&wj6K2\yx;F mAIOF-$N.ȟ?W埻#OU"QJϠWCTPO6 wA 4fb8GBH+<?6?Uo'&FGL|:X@|~C~'ٰKj Mmά' #(5#&N^K<[@2؝*=ǿw#!חݔ^gCޓ{u 1gc|R?`iF+qS^dR* yϗ{#0G{[?]G8LL4p7fӿ{P U  CJ4~&όZ䄢BG;?@Woh{ l!A:̟_Tʎϯ>Uքjr\BKt]+@X_vf5' #qqtGs[~(>ٴ<¿c ]f Ax>h;MA Y5[N%fćg{UT5_^- 'gF (Ex4>g2C-wG0L2£ E>ڲ w" a0YM|R?^ N3dq}@;B{)K-pBh#dAkA FwOQ?~HBEAh/e~?dKmw.-`g(ܿ4NgF}Xݙ|IG2y<~pCH|*o(OՒ Qe /8BghpQ'ΐ} LEէ2~[t+ tjhM8A!A{g'n|ɡ42x9l&0/w6>3 h(P:L$Chdt|2lv3p}{Sx Ə`wf}(~|t()tXwr45p 5^6>]pf%?}O> - t*>-Ss@k Sߐ*c/Տ}?]hD___7}R2KN(/? pg'IW-(ho{6?S/gu0ї Q]3W8J/ΥjxyE|RC 4(;ְZZPxUN6fnvҷwK ?=-rgU`ҿ@/?OMGr_efG,-'7qpuYЁ(ߓa pY.ޱ@Nf#Fb؏"p)+f#f# dGS@.e~FGzq+B}UERg"*P 0 9(HFҐBNشDo:&=Cu͹nW-(u|xiеZ9xu|vwҘ@t{BCek񙱬s@90|mn?X΍ϥPCc*ɽ0|^ ;߽o3NY8~^{M'C.&?S?bFMiq\u-?_ZRbpZ=rfuI,_GbLiQzOgRuy7CkR O=~h_p{N_x\_yoϟ?K`@Aޡ[2 4IN'qCiCT?:b:?tqBKy'ԻWN/;ܹ(N2P^`3V{2YtP ʪ1P_n(گ'(R?3̣+?X=z^RAAE,z:>Jv祀d}:X_Jqf}*Fo?. bO}9 ؁pApwoX6>pfTh}~ NLzlV@[! TA՞m[~S[R GճG i۶[мN|X_aCrfR\:S˖N|}.tmO]5;+'* 4'lS|D!WZg, A+<\qmԅ3`Y~nI\+sOCg{B/zJݭ?a)_YQ5ἱ}Ve#Q;ݤrOwZ!WNCp~!pX]ܻ8t1CK{T.}@upY_nDhA3?%( e~֗b @) A>  h-ޙ,ӿWNM0BP h|3 soW?2au2'#:?>&XW~?ǵo򋰫u>>=n?˼hSO&QnY3L7$i\ ї;гdzkܚg7A]"CE]-?Bn+m3M|RPވh(?X]ȵPe18mJ~f ŤaP4WᰛM`^z91 /w]ċŮ=+~)1e?ǦKn,kh 7~ejcI ,'ֆܛ-dOg acyĚ@5-֍g?T[f,?=~g2o:n_Ik+{[@s=jyp9T,K7К$WtS+n\' #t̃3K:>V@ e1I$ m9֗2FhxK[ݙn`>AR:gӿLO'{3ѕϺ-t0g4.A7GO7h̅|RNLNi acG;?|A}ڂ5wߚX_@&5^ "hhfTR/u hn+S[i@cۨWԲ'ҚFzϣĩf|&o^9c>PtㅍFz"t I[]bҀcnPNT϶~O'6uL‡e$'gXfLWnv?u~ޙN I[_V@W߁Z]a >'|K&xfJjZE-Rcy1)$pS4ߋ=@.,4će4|VrGq}w~'NTF?1`O?.c9O  8&,{[.`KKd a})n@? ^hFx:笱Vjo1MI=kvɽom'@pz`vИ E.0o8 4&niU[N:[[_/7@{xJ4KtBEXl*n0@|EE >n+p`w6> !t7¬F?$?[]4x]: s-۳KFe< n5RƃZsXgu k`MT F.0B*H~=Л{i{!f9sƣL|d!RA)[01h!e ?Vwa?b/mFc/$Ca}azAy~|ҏA#~9a`!]e7JhwԵU=~͗W Ig21t|j|b^8Ӑa5a,Ūa۸/8\hL IDAT_`\Bh|X_- 9~XhP%H ~ہ`X>BWgh=F. }\=/oԧA%8xh]n[\IꟍO"zvJ|@ьalp0_ ‡gӺx/(_Gg3 a (sd姻 jZKC=cリ(|y*?D2X -8& b_OpP4#|P=o ̲?~BY_@k 쟍lsMtZہV" ut^G9;}CeH 6vs(g@Q^31%==0G#Y84=0"O(O+2"m(~? /_\_v EiV!(X2d%Qh@AD]R[q TT{ph&쏸,,֩wW})EuCH74hfb} UnM?~{$@;~G!HNR^~w|n6fӇ7*)>)|U̮ҥJr>@;*;,]G@h zd㗌!g&zJ0.`[BcG3/~TqɃYGݷ:jcYT!ΟxTܪ_/37͟I*?Nj c( {X7s%``0./O H8}`6GaJ$gi^Dz((Q?Y@wk_KrZ/Hl|d؜ڶљ<_Ґв٨>^aSfcuk +CП͟hUQ7{aRO %\ Ի7_S&E^5g`B.;W⁗BI ](Ch# ݆^G:{Ft=ol~e=uxӽ8oR zM6XY&lE./9wnC\:%{~ cjtO͍.4{>@gW%)] cn;pxerT2`_߭Ol'7__v]P|?[@nTCvVVy X):y֟͟7A75fwdm*peG~4:[_Sr0M l|J?J}[A؃S hP1+ 0 S|O0ڄnrwA}r{!h5+bFCt%Ӏ(iƒKdv! ?OI%I/?i=d\ OK!L\=K'c0AIC+b~R=oiȶE B|6O2?j3ً ټZ_Ï;cK3 9׬5(bo h |XV!iSe%TϿ^@??dGU-po M)=Kۏm@>'ۿ¿-CE3CO"<϶;~k3K7^"e.'[(,h6 h?Kj_] CB;B݂Sƾ'W8!(AggOϧB_=n=lo'+ށ{g-a,-geǼ9BS|ij!/¿ tJьЍQF0~dXs_ 46O_,V;5h_18VhbF8XD^~@[\LּtK!RoIpFN*;" g}C9U,쥬7_/sƘ矓q ܩrbt#COmf3U t~! ZJ"\I.(ZP8 p4#~9o>u=fJW7Wϟ1lB{f9N۴+ l}i7OŇc|O{A7KeL5Ma $ٿ_?pL\~/l|O^oa Qon\Mh5~-&ͧUq]~ݼ=?kf\ rKeC vp)^;/?ۿ~9%8qmK C F ?lE@rN^1ӥ; &yJ!}??O,q>A5i< 9;ق%_@k;;aTR~펔 &x\Vˣ@e? xsz C?^ &Y^.^Sd.nӞiu)J}ϬLyO\tLNʰgu?G*M3϶??$@Bd] n ̿\(W88>kN^FwڿbR706CBpO__7`:/E3%ux6|xc)~ۮoCNhA {'{(ye'V ܳ$0Gz2pQlfS-1x^M lKDrui2hn)=~;#V_o7 {on~<"ΎW6>~ wIXjhh> S7OB۴נ/@ ܩS8\E_Iпl~*>OzVrwK0\Sh)0V@Nc|}F h4w7Pp{4$u=63S(M-g/b2y3qX<뮯vL̩XNf_P|ː|z;'IO$ XC$f~-4TWJ ng֛;/F d^h]Zʯ)/F0ǿ߽.j˙‘d6>~>!?į{=$6 o{+:Y+U?xDVA*p%TF9eW4D&`I!@/7.MCgоzޫ_Ξ37_2IKG9N x^l_=&Z9³, "(UEWK6H{? AzCz!\m_4S-! x9){|½Ǻ}yBͽn6)|@;*?\_N,~c1 ˯$AT{r2-'Hm'Ic P#1Q~}Mrxjma~ړ\&W@{f{vŀ+h_ h|[8$ MJ^Zb2!K؟&'Xτ೧rSiOC-TilEy*D}@ca. 9BEԲr˚gvў?A} *5n~s ~ w_O#\ hHnjR?;c??/g$ԶH-m?_/3~$L^naIس2ll -ӗy51l9N $sQ@̘)!}}}dxu:яbi$l2 KLR[8w%  CC (9@8q>Ŀ~"kSpnoM810YK=z \Cȶٷ~ ?:lKS4h$24,2F1Ap>:|@~#>GƯ^G]q72 O@LSSuڛN C3Å ~z޿_} r;Г pmAI˨&=Ląnt?=d+Mb@\=Aջj!kygF^ rq0u?ӽY5X'NzIe>>!;׿I pR@IY7[6JA >mA ,~ۓR=3/ړ֯?ΙS$~^PSZL_y%E{)W6@y8hG9"Cs2|Ǽh;_4!m)kxyey3h o ᥀(e ov|_cm2`GY!Q|Vz#2pwL5q134 4㪥E_: !re<\zeB ct҃ZP #§1O h_pى׷!§Ck>Oc>?QK?@{lF#x),A R@gAQ'Aʟ?3f{ϒO'k,gfSJAcjTU^`A??BH!xd"vb r!X8UOg(^WK?@Atx>OʟR($@©:Z(V B>.FK0tL\.| /qO zL* "OIqqfdTX fͩ/O@\KR)@MBA/Gm (dBJ PI ‡]c(?O@aE.|/a5s?7@gW0$~0P? Q%($>pZ@i O$>pz|*t]Y8UO)DC/|;0q §`(QR/ +p_Ϫ0}u(ܝAFJM*7æO#J# ϕ?k{?+_= ?[QafaRV!>W*_@AЂ.@FB')|RD*|V2L$R0\=J?t@(Or ɺO罂֗Z_*?T~ޣbтk(icDDNխ _$q>„O$>pZ@i O$>pZ@i֪v ^F_9Ӧå_@ǡ|YP/{-몉}aί>ew]IDAT#!S>Э O$>pZ@i O$ P"v_ɳ#c_UW_9fBSZ*)| A(|Yr]թ]QNeVUɅlPQ䡥y1h,|/P>O?bE/kbFAwPԕ$>zC+?  >  ;LgYM%ºDrJ7((-*? P?e:X vx h3>62_?ZS(Qn TYߪ?z,t/ªQr%_*E+|I/`A *|Mل(6g_. a y" kgǡ($T>lQOaSZ_N/{@9; ;.zʿWhT| )|ʟ?{>8&.{OşƧ!/ln;~ )|}/P>@OBaA.| Z_S-L군K!D B1§[ G o)|^.|zLq4z13υ\V'Z ӟB_N P gq4 ?30ٻS'u¡@iȪBЇL\ڼgR 'PqT|}}}UAQ CV̞ U Cd02fFh$~` @?@QH1< ǃeuF!c Oo'F#H5'*K?P>uHBL> gT)| Ƞu֗o.y&ş$) ϴǡr~f-H0 Tile World

Tile World

Contents

Synopsis

Tile World is a reimplementation of the game "Chip's Challenge". The player controls Chip, navigating him through his challenges. The object of each level of the game is to find and reach the exit tile, which takes you to the next level. The levels contain many different kinds of obstacles, creatures both hostile and indifferent, tools, protective gear -- and, of course, chips.


Overview of the Game

The main display shows Chip in the current level and his immediate surroundings. To the right of this display is shown the basic information about the current level. The most important data shown here are how many seconds are left on the clock, and how many chips still need to be collected. (On some level the clock does not show a time. These levels have no time limit.)

The object of every level is to find and reach the exit before the time runs out. The exit is frequently (but not always) guarded by a chip socket. To move past the chip socket, Chip must collect a certain number of computer chips; the amount needed is different in each level. As you play a level, the information display on the right shows the number of chips that still need to be collected in order to open the socket. (Remember that getting enough chips to open the chip socket is only a subgoal, not the main goal. Some levels do not require any chips to be collected; some levels have no chip socket at all.)

Also occupying many of the levels are other creatures. Most (but not all) of them move about in simple, predictable patterns, and without regard for Chip's presence. The creatures know enough to avoid running into each other, but a collision with Chip is fatal. The complete taxonomy of creatures is: tanks, balls, gliders, fireballs, walkers, blobs, teeth, bugs, and paramecia.

In addition to the socket and the main exit, there are also four different kinds of doors. These doors can be opened with the right kind of key. The doors and the keys are color-coded -- red, green, blue, and yellow -- so you can tell them apart. Like the chip socket, a door that has been opened stays open. Keys are picked up simply by stepping upon them. The key disappears from the map and appears in your possession. Keys in your possession are displayed on the right-hand side of the window.

Besides keys and chip, there are also four kinds of special footgear that Chip can collect. Like keys, boots can be picked up simply by walking over them. (There is no limit to the number of boots you can have.) These boots permit Chip to walk across four different kinds of surfaces, just as if they were normal flooring. Fire and water are two kind of tiles that are normally fatal to Chip, but fire boots and water boots will permit safe passage across these. Stepping onto ice sends Chip sliding at high speed unless he has a pair of ice boots. Finally, there are force floors that push Chip along in a specific direction; these can be counteracted with force boots.

Two other types of surfaces are more useful to Chip, in that they keep other creatures out. These are dirt and gravel, and they are special in that Chip is the only one who can walk on them. However, when Chip steps onto a dirt tile, it is cleared away and becomes normal flooring. Gravel, on the other hand, is permanent.

There are numerous other objects scattered around the various levels, which Chip can interact with, although he cannot pick them up. Bombs are one kind of object which should always be avoided, as they explode when stepped on. The thief tile should also generally be avoided; entering this tile will cause Chip to lose any footgear he has collected.

Dirt blocks are large, movable squares of dirt. Chip can push them about, and use them to wall off areas or to safely detontate bombs. Furthermore, if a block is pushed into water, the tile will turn into dirt (which will become normal flooring when Chip steps on it). Finally, note that blocks can sometimes be resting on top of other objects, both helpful (such as a key) and harmful (such as a bomb).

Some levels have teleports. Entering a teleport causes Chip to vanish and instantaneously reappear at another teleport.

Even some of the walls can demonstrate surprising behavior. The so-called blue walls can either be actual walls, or empty mirages. The only way for Chip to tell which is which is to attempt to walk through one. There are also popup walls -- Chip can walk across these only once, for they turn into walls as he walks over them.

There are four different types of pushbuttons. Like keys and boots, they are color-coded. Stepping on a pushbutton activates it.

The green buttons control the toggle walls. Toggle walls have dotted green outlines, and they change between being open (passable, like any other floor) and open (unpassable, a wall). When a green button is pressed, the closed toggle walls are opened and the open toggle walls are closed.

Brown buttons control bear traps. Anything that wanders into a bear trap will be stuck there until the brown button connected to it is pushed.

Blue buttons exercise some control over the tanks. Normally, a tank moves directly forward until it hits an obstacle, whereupon it stops. But when a blue button is pressed, all tanks turn around 180 degrees and begin moving again.

The objects with the most potential for help and hindrance are the clone machines, which are controlled by red buttons. Every clone machine contains a dirt block, a tank, or some other creature. When the clone machine's red button is pressed, a duplicate of whatever the clone machine contains is created and set loose.

Once in a while there will also be hint buttons. These have a question mark displayed on them. When Chip steps onto a hint button, a short bit of information will be displayed in the lower right-hand area of the window.

Here are some general hints for successful play:

  • When moving dirt blocks around, take care not to shove them into corners where you can't get them out again.
  • On some of the more mazelike levels, you may need to sketch out a map in order to solve it.
  • Many of the creatures move in specific patterns (for example, as with the tanks mentioned above).
  • A number of the objects in the game will affect other creatures in the same way they affect Chip.
  • Remember that if you get trapped somewhere, you can always use Ctrl-R to restart a level.
  • When you find a level to be unusually difficult, take some time to examine it carefully. Make sure you truly know what options are available to you. In any case, keep trying. Occasionally the game will give you the opportunity to skip a level that seems too hard.

Passwords

Every level has a four-letter password. The password for a level is shown in the information display at the upper-right of the window. The obstensible purpose of passwords is to allow you to come back to a level. Howver, normally you will never need to remember passwords, as Tile World will automatically store the passwords for you. However, if you somehow manage to learn the password of a level that you have yet to achieve, you can use the password to gain early access to that level.

Scoring

For each level in a set that you complete, the game awards 500 points times the level's number. Furthermore, if the level is timed, an extra 10 points is added for every second left on the clock when you finish the level. You can thus sometimes improve your score by returning to already-completed levels and playing them again.


Key Commands

During game play, the arrows are the most important keys; they move Chip through the level. The keys 2 4 6 8 on the numeric keypad can also be used for the same purpose. Other keys have the following functions:

Bkspc  pauses the game; press any key to resume play.
Ctrl-N  stops the current game and moves forward to the next level.
Ctrl-P  stops the current game and moves back to the previous level.
Esc  quits the current level.
Ctrl-R  starts over at the beginning of the current level.
V  decreases the volume level. (If the volume level is reduced to zero, then the program will display sound effects textually, as onomatopoeia.)
Shift-V  increases the volume level.

At the start of a level, before game play begins, the following key commands are available:

Esc  returns to the list of available level sets.
Spc  starts the current level without moving (i.e., standing still).
N  moves to the next level.
P  moves to the previous level.
PgUp  moves ahead ten levels.
PgDn  moves back ten levels.
G  displays a prompt and accepts a password, then jumps to the level with that password.
Tab  plays back the best solution for that level.
Shift-Tab  verifies the best solution for that level. If the solution is no longer valid (e.g. because the level has been altered), the solution will automatically be deprecated.
O  toggles between even-step and odd-step offset.
Shift-O  (Lynx-mode only) increments the stepping offset by one.
F  (Lynx-mode only) changes the initial direction for the "random" force floors.
Ctrl-X  deprecates the best solution for that level. If the level is then succesfully completed again, the saved solution will be replaced with the new one, whether or not it had a better time.
Shift-Ctrl-X  deletes the saved solution for that level. If confirmed, the solution will be immediately removed from the solution file.
S  displays the list of known levels and the score for each, as well as the overall score for the level set. The score list display also permits changing the current level by moving the selection and pressing Enter.
Ctrl-S  displays the list of solution files in the save directory whose names start with the name of the current level set. From here a different solution file can be selected.

A few commands are available only during solution playback:

D  toggles the display of the stepping and (in Lynx mode) the initial direction of the "random" force floors.
PgUp  goes back about 10 seconds.
PgDn  goes forward about 10 seconds.
E  advances the playback by a "tick". (1/10th second in MS, 1/20th second in Lynx.)
Shift-E  advances the playback by a "move". (1/5th second in MS)

At every point in the program, the Esc key will abort the current activity and return to the previous display.


Rulesets

Tile World contains emulators for two different versions of "Chip's Challenge". They are referred to as the Lynx ruleset and the MS ruleset. The Lynx ruleset recreates the original implementation of the game, and the MS ruleset recreates the version that was implemented for Microsoft Windows (cf History).

The most notable difference between the two rulesets is that in the MS ruleset, movement between tiles is instantaneous, whereas under the Lynx ruleset motion occurs across several "ticks". (This probably reflects the fact that the latter ran on dedicated hardware, while the former ran on 33 MHz PCs under a non-preemptive multitasking OS.) Although the basic mechanics of the game are the same under both rulesets, there are also a host of subtle differences between the two.

Each level set file includes a flag that indicates which ruleset it is to be played under. Some level sets can be played under both rulesets (most notably, the original set of levels), but this is the exception.

Adding New Level Sets

Level sets are defined by data files. By convention these file are named with a .dat or .ccl extension. Classically, the name proper contains the author's first name, last initial, and a single digit -- for example, a set by someone named Bob Nomo could be called BobN1.dat. (The digit is used to give the sequence in case the author, for whatever reason, stores their creations in more than one file.) Some more recent level sets do not follow this naming pattern, however, so it is not always easy to find out the author from the set's name.

When a new data file is obtained, it may simply be copied into the level set directory (cf Directories), and Tile World will then make it available for playing.


Command-Line Options

tworld2 is normally invoked without arguments. The program begins by displaying a list of the available level sets. After a level set is chosen, the program jumps to the first unsolved level to begin play.

The available command-line options are enumerated in the following table.

-a  Double the size of the audio buffer. This option can be repeated, so for example -aaa would increase the audio buffer size eightfold.
-b  Do a batch-mode verification of the existing solutions and exit. Levels with invalid solutions are displayed on standard output. If used with -q, then nothing is displayed, and the program's exit code is the number of invalid solutions. Can also be used with -s or -t to have solutions verified before the other option is applied. Note that this options requires a level set file and/or a solution file be named on the command line.
-D DIR  Read level data files from DIR instead of the default directory.
-d  Display the default directories used by the program on standard output, and exit.
-F  Run in full-screen mode.
-H  Upon exit, display a histogram of idle time on standard output. (This option is used for evaluating optimization efforts.)
-h  Display a summary of the command-line syntax on standard output and exit.
-L DIR  Look for level sets in DIR instead of the default directory.
-l  Write a list of available level sets to standard output and exit.
-n N  Set the initial volume level to N, 0 being silence and 10 being full volume.
-P  Turn on pedantic mode, forcing the Lynx ruleset to emulate the original game as closely as possible. (See the Tile World website for more information on emulation of the Lynx ruleset.)
-p  Turn off all password-checking. This option allows the normal sequence of levels to be bypassed.
-q  Run quietly. All sounds, including the ringing of the terminal bell, are suppressed.
-r  Run in read-only mode. This guarantees that no changes will be made to the solution files.
-R DIR  Read resource data from DIR instead of the default directory.
-S DIR  Read and write solution files (and other saved data) under DIR instead of the default directory.
-s  Display the current scores for the selected level set on standard output and exit. A level set must be named on the command line. If used with -b, the solutions are verified beforehand, and invalid solutions are indicated.
-t  Display the best times for the selected level set on standard output and exit. A level set must be named on the command line. If used with -b, the solutions are verified beforehand, and invalid solutions are indicated.
-V  Display the program's version and license information on standard output and exit.
-v  Display the program's version number on standard output and exit.

Besides the above options, tworld2 can accept up to three command-line arguments: the name of a level set, the number of a level to start on, and the name of an alternate solution file. If the name of an installed level set is specified, then Tile World will start up in that set, skipping the initial level set selection.

If the specified level set is not a simple name but is a pathname (relative or absolute), then Tile World will use that level set only, without requiring that it first be installed. No solutions will be saved unless an explicit solution file is also supplied on the command-line. (If the command-line only specifies a solution file, then Tile World will look up the name of the level set in the solution file.)


Configuration Files

Configuration files are used to override some of the settings in a data file, or to set values not provided for by the data file format. Starting in Tile World 2.2, they are generated automatically, so you don't need to mess with them unless you want to change the defaults. Configuration files are by convention named with a .dac extension. A configuration file is stored in the sets directory. (cf Directories).

The configuration file is a simple text file. The first line of a configuration file must have the following form:

file = DATAFILE

where DATAFILE is the filename of the data file. (Arbitrary whitespace is permitted around the equal sign, but there cannot be any whitespace embedded at the beginning of the line.) After this initial line, the configuration file can contain any of the following lines:

fileinsetsdir = y|n

This specifies that the level set is found in the sets directory, rather than the data directory. The default is n.

usepasswords = y|n

This line permits password-checking to be enabled/disabled when playing the levels in the set. The default is y.

ruleset = ms|lynx

This line allows the configuration file to override the ruleset setting in the data file. This is mainly useful in the case where one level set is playable under either ruleset (as is the case with the original level set). The author can then provide one data file and two configuration files to make both versions available.

lastlevel = levelnum

This line marks an arbitrary level as being the last level in the set. The game will stop when this level is completed, instead of proceeding to the next level. (Note that if the data file contains any levels beyond this one, they will only be reachable via a password.)

fixlynx = y|n

This line is specifically for use with the original level set. It is not generally useful, and is described here only for completeness. The chips.dat file that MS distributed with their version of "Chip's Challenge" contained a few minor differences from the original level set as appeared on the Lynx. A positive value for this entry instructs the program to undo those changes, so that the original Lynx level set is obtained. (The changes made in the MS version were: an extra level was added; four passwords were garbled; and four or five levels' maps had minor alterations.)

CCX Files

The data directory may contain a file with the same name as a level set, but with a .ccx extension. This file can be used to specify various data, such as ruleset compatibility and authorship (both for the entire set and for individual levels. It is also possible to specify text displayed when reaching or completing levels. This can be used to give an ongoing story for a level set, or for other purposes. Detailed documentation does not currently exist. One way to produce a CCX file for a set is to emulate the structure of an existing one (such as that for CCLP1 or CCLP3). You can also use the "CCX File Editor" by Mike Lask.

Some people may wish not to view text associated with levels. This can be controlled using the "Auto-display Level Text" menu under "Options". Whether or not this option is enabled, level text can be viewed using the "View Prologue" (for text displayed when visiting a level) and "View Epilogue" (for text displayed when completing a level). The epilogue is only available for levels that have been completed.

Resources

Tile World loads various resources at runtime from its resource directory (cf Directories). These resources include the program's font, graphic images, and sound effects. The actual file names are determined by the contents of a file named rc (short for "resource configuration", not "runtime commands") in the same directory.

The rc file is a plain text file, and contains lines of the form

resource = filename

where resource is a symbolic resource name, and filename is the name of a file in the resource directory.

The resources can be set differently depending on the ruleset that the program is using. A line in the rc file of the form

[ruleset]

indicates that the lines that follow only apply when that ruleset is in effect (where ruleset is either MS or Lynx). Resources that are defined before any such line apply to both rulesets, and are also used as fallbacks if a ruleset-specific resource could not be loaded. (The font and the text-color resources also need to have ruleset-independent values, as these are needed when displaying the initial file list, before a ruleset has been chosen.)

A line of the form

TileImages = FILENAME

identifies the file that provides the images used to draw the game. These images are stored in a Windows bitmap. (See the Tile World website for more information about this resource.)

A line of the form

Font = FILENAME

identifies the file that provides the program's font. The font is stored as a Windows bitmap. (See the Tile World website for more information about this resource.)

A line of the form

UnsolvableList = FILENAME

identifies the filename for the database of unsolvable levels. See Database of Unsolvable Levels below for more information about this file. Note that this resource must be defined independent of the ruleset, or else it will be ignored.

A line of the form

EndMessages = FILENAME

identifies the filename for the messages displayed when losing or winning a level. See End of Level Messages below for more information about this file. Note that this resource must be defined independent of the ruleset, or else it will be ignored.

Four resources define the colors used in rendering text:

BackgroundColor = RRGGBB
TextColor = RRGGBB
BoldTextColor = RRGGBB
DimTextColor = RRGGBB

The value of RRGGBB is a string of six hexadecimal digits defining the red, green, and blue values of the color (as with the color specification used in HTML or X Windows, but without the preceding octothorpe).

The remaining resources all define the game's sound effects. The sounds are stored as Microsoft RIFF files (so-called wave files). Unlike the tile images, each sound effect is defined as a separate file. The complete list of symbolic resource names is as follows:

Sounds used in both rulesets

  • LevelCompleteSound
  • ChipDeathSound
  • BlockedMoveSound
  • PickupToolSound
  • ThiefSound
  • TeleportSound
  • OpenDoorSound
  • SocketSound
  • SwitchSound
  • BombSound
  • SplashSound

Sounds used only under the MS ruleset

  • TickSound
  • ChipDeathByTimeSound
  • PickupChipSound

Sounds used only under the Lynx ruleset

  • TileEmptiedSound
  • WallCreatedSound
  • TrapEnteredSound
  • BlockMovingSound
  • SkatingForwardSound
  • SkatingTurnSound
  • SlidingSound
  • SlideWalkingSound
  • IceWalkingSound
  • WaterWalkingSound
  • FireWalkingSound

(Note that the symbolic names for the shared and MS-only sounds match the names in the entpack.ini file used by the Microsoft program. This makes it easy for someone with a copy of Microsoft's "Chip's Challenge" to use the sound effects that were provided with that version of the game.)

Database of Unsolvable Levels

Of the many thousands of user-created levels that are publicly available, there are some that are not possible to complete. Some of these are intentionally so (e.g. requiring the player to deduce the password to the next level). The remainder, however, are simply due to poor design, and there is typically no indication that attempting to solve these levels is fruitless.

To help alleviate this, Tile World comes with a database of levels that have been identified by the community to be definitely unsolvable. When the player visits a level that appears in this database, a warning is displayed, and the password to the next level is automatically supplied.

The main database of unsolvable levels is stored in the resource directory. In addition, a player can keep a separate database in a file of the same name in the directory for solution files. If present, Tile World will use the information from both of these files.

The offending levels are identified by content as well as by name and number, so that updated versions will no longer be identified as unsolvable. See the Tile World website for more information about the format of this file, and to check for updates to the database.

End of Level Messages

When you win or lose a level, Tile World displays a message. These messages can be customized using a file in the resource directory, whose default name is messages.txt. This file can contain an umlimited number of messages for Tile World to choose from. The file consists of sections of the form

: messagetypes
message
message

Here, messagetypes can contain any of die (for when the player dies), time (for when the player runs out of time), or win (for when the player completes the level. It is possible to specify more than one type. For example, the file

:die time
Message 1
Message 2
:die
Message 3
:win
Message 4

specifies that either Message 1 or Message 2 can be displayed when the player dies or runs out of time, Message 3 can only be displayed upon death, and Message 4 can only be displayed when the level is won.

Directories

Tile World uses four different directories for storing external files. The following list enumerates the directories and describes their purpose. The default directories that the program uses can be configured at compile time. The directories can also be changed at runtime via command-line options and/or environment variables (see below).

Sets  This directory is used to hold the configuration files. For backward compatibility only, level sets can also be placed here. (default for Linux: /usr/local/share/tworld/sets)
Data  This directory is used to hold the level sets, as well as CCX files. (default for Linux: /usr/local/share/tworld/data)
Res  This directory stores the graphics and sound files used by the program. (default for Linux: /usr/local/share/tworld/res)
Save  This directory is used for saving solution files, and settings. (default for Linux: ~/.tworld)

Environment Variables

Two environment variables can be used to override the program's built-in defaults for which directories to use. They are as follows:

TWORLDDIR  Specifies a top-level directory, in which the program will look for the resource, level set, and data file directories.
TWORLDSAVEDIR  Specifies a directory for saving solution files.


License

Tile World is copyright (C) 2001-2024 by Brian Raiter, Madhav Shanbhag, and Eric Schmidt.

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.

Please send bug reports to CrapulentCretin@Yahoo.com or eric41293@comcast.net.


History

"Chip's Challenge" was created by Chuck Sommerville, and was originally written for the Atari Lynx handheld game console. ("Tile World" was his working title for the game.) "Chip's Challenge" was published by Epyx (the company who designed the Lynx before selling the rights to Atari) in 1989, and was among the first set of games made available for the Lynx.

"Chip's Challenge" was subsequently ported to several other platforms: MS-DOS, Microsoft Windows (16-bit), Amiga, ZX Spectrum, Atari ST, and the Commodore 64. (A NES port was also planned, but never completed.)

The Windows port was different from most (perhaps all?) of the others in that it was not done by the original team at Epyx. Instead it was done by Microsoft and sold as part of Windows Entertainment Pack 4 (and later as part of Best of Windows Entertainment Pack). In the process of recreating the game for the 16-bit Windows platform, Microsoft introduced a surprising number of changes to the mechanics of the game. Some were clearly intentional, some were done through ignorance or indifference, and others were simply bugs in the program. The programs in WEP4 came pre-installed on many PC computers sold during the 1990s, which is part of the reason why this particular version became the most popular. A small but fanatically loyal community of adherents to the game connected via a MSN chatroom (and later through the internet). A few members of this community managed to decipher the format of the MS game's data file, and John K. Elion subsequently created a freeware level editor, called ChipEdit. As a result there are now dozens of new level sets, created by fans of the game and all freely available.

Atari discontinued support for the Lynx in 1994. When Epyx went under, the rights to their games were purchased by Bridgestone Multimedia. Responding to the success of "Chip's Challenge", Chuck Sommerville created a sequel ("Chip's Challenge 2"). The sequel included the original game as a proper subset, and the company held the rights to both games. Bridgestone Multimedia, who has now become Alpha Omega Publications, unfortunately did not see fit to actually release "Chip's Challenge 2". It was, however, finally released on Steam in 2015, alongside a port of the original game. The other versions, including the famous port by Microsoft, are no longer being sold and cannot be obtained except by purchasing a used copy (or by downloading an illegal copy).

In 2001, the author began writing "Tile World" with the intention of recreating a version of the MS game for the Linux platform. At the encouragement of Chuck Sommerville, this project was expanded to include the goals of recreating the original Lynx game as well, and also making the program work under MS Windows in addition to Linux.

In 2010, Madhav Shanbhag produced "Tile World 2", which had several new features. In 2014, Eric Schmidt produced version 2.1. In 2017, he produced version 2.2. Similarly, in 2023-4 Michael Hansen (Zrax), ChosenID, David Stolp (pieguy), A Sickly Silver Moon, G lander, and Eevee created version 2.3.


Appendix: Notes on Nomenclature

"Chip's Challenge" has seen several incarnations. Each had its own graphical rendering, and thus many of the objects in the game are known by more than one name. For example, the four types of boots in the MS version of the game were known as fire boots, flippers (for water), skates (for ice), and suction boots (for force floors). In the original Lynx version, however, they were not even boots -- the four tools were fire shields, water shields, cleats, and magnets, respectively.

Several of the creatures have seen a variety of names. The list of creatures given in Overview of the Game corresponds to the MS version of the game. In the original Lynx version, the paramecia were centipedes instead. In still other versions of the game, gliders were referred to as ghosts or sharks, fireballs were flames, and teeth were called frogs. (You will also occasionally see bugs referred to as bees, and walkers referred to as dumbbells.)

Finally, the thief tile was called a spy in the MS version.

None of this information is needed in order to play the game, but it helps to explain the titles of some of the user-created levels. tworld-2.3.0/encoding.c000066400000000000000000000253041475511570500147770ustar00rootroot00000000000000/* encoding.c: Functions to read the level data. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include "defs.h" #include "state.h" #include "err.h" #include "encoding.h" /* Read a 16-bit value, stored little-endian, from the level data * stream. */ #define readword(p) ((p)[0] | ((p)[1] << 8)) /* Read an x-y coordinate pair from the level data stream. Ensure that * an invalid x value always produces an invalid coordinate. */ #define readpos(x, y) (*(x) < CXGRID ? *(x) + CYGRID * *(y) : CXGRID*CYGRID) /* Translation table for the codes used by the data file to define the * initial state of a level. */ static int const fileids[] = { /* 00 empty space */ Empty, /* 01 wall */ Wall, /* 02 chip */ ICChip, /* 03 water */ Water, /* 04 fire */ Fire, /* 05 invisible wall, perm. */ HiddenWall_Perm, /* 06 blocked north */ Wall_North, /* 07 blocked west */ Wall_West, /* 08 blocked south */ Wall_South, /* 09 blocked east */ Wall_East, /* 0A block */ Block_Static, /* 0B dirt */ Dirt, /* 0C ice */ Ice, /* 0D force south */ Slide_South, /* 0E cloning block N */ crtile(Block, NORTH), /* 0F cloning block W */ crtile(Block, WEST), /* 10 cloning block S */ crtile(Block, SOUTH), /* 11 cloning block E */ crtile(Block, EAST), /* 12 force north */ Slide_North, /* 13 force east */ Slide_East, /* 14 force west */ Slide_West, /* 15 exit */ Exit, /* 16 blue door */ Door_Blue, /* 17 red door */ Door_Red, /* 18 green door */ Door_Green, /* 19 yellow door */ Door_Yellow, /* 1A SE ice slide */ IceWall_Southeast, /* 1B SW ice slide */ IceWall_Southwest, /* 1C NW ice slide */ IceWall_Northwest, /* 1D NE ice slide */ IceWall_Northeast, /* 1E blue block, tile */ BlueWall_Fake, /* 1F blue block, wall */ BlueWall_Real, /* 20 not used */ Overlay_Buffer, /* 21 thief */ Burglar, /* 22 socket */ Socket, /* 23 green button */ Button_Green, /* 24 red button */ Button_Red, /* 25 switch block, closed */ SwitchWall_Closed, /* 26 switch block, open */ SwitchWall_Open, /* 27 brown button */ Button_Brown, /* 28 blue button */ Button_Blue, /* 29 teleport */ Teleport, /* 2A bomb */ Bomb, /* 2B trap */ Beartrap, /* 2C invisible wall, temp. */ HiddenWall_Temp, /* 2D gravel */ Gravel, /* 2E pass once */ PopupWall, /* 2F hint */ HintButton, /* 30 blocked SE */ Wall_Southeast, /* 31 cloning machine */ CloneMachine, /* 32 force all directions */ Slide_Random, /* 33 drowning Chip */ Drowned_Chip, /* 34 burned Chip */ Burned_Chip, /* 35 burned Chip */ Bombed_Chip, /* 36 not used */ HiddenWall_Perm, /* 37 not used */ HiddenWall_Perm, /* 38 not used */ HiddenWall_Perm, /* 39 Chip in exit */ Exited_Chip, /* 3A exit - end game */ Exit_Extra_1, /* 3B exit - end game */ Exit_Extra_2, /* 3C Chip swimming N */ crtile(Swimming_Chip, NORTH), /* 3D Chip swimming W */ crtile(Swimming_Chip, WEST), /* 3E Chip swimming S */ crtile(Swimming_Chip, SOUTH), /* 3F Chip swimming E */ crtile(Swimming_Chip, EAST), /* 40 Bug N */ crtile(Bug, NORTH), /* 41 Bug W */ crtile(Bug, WEST), /* 42 Bug S */ crtile(Bug, SOUTH), /* 43 Bug E */ crtile(Bug, EAST), /* 44 Fireball N */ crtile(Fireball, NORTH), /* 45 Fireball W */ crtile(Fireball, WEST), /* 46 Fireball S */ crtile(Fireball, SOUTH), /* 47 Fireball E */ crtile(Fireball, EAST), /* 48 Pink ball N */ crtile(Ball, NORTH), /* 49 Pink ball W */ crtile(Ball, WEST), /* 4A Pink ball S */ crtile(Ball, SOUTH), /* 4B Pink ball E */ crtile(Ball, EAST), /* 4C Tank N */ crtile(Tank, NORTH), /* 4D Tank W */ crtile(Tank, WEST), /* 4E Tank S */ crtile(Tank, SOUTH), /* 4F Tank E */ crtile(Tank, EAST), /* 50 Glider N */ crtile(Glider, NORTH), /* 51 Glider W */ crtile(Glider, WEST), /* 52 Glider S */ crtile(Glider, SOUTH), /* 53 Glider E */ crtile(Glider, EAST), /* 54 Teeth N */ crtile(Teeth, NORTH), /* 55 Teeth W */ crtile(Teeth, WEST), /* 56 Teeth S */ crtile(Teeth, SOUTH), /* 57 Teeth E */ crtile(Teeth, EAST), /* 58 Walker N */ crtile(Walker, NORTH), /* 59 Walker W */ crtile(Walker, WEST), /* 5A Walker S */ crtile(Walker, SOUTH), /* 5B Walker E */ crtile(Walker, EAST), /* 5C Blob N */ crtile(Blob, NORTH), /* 5D Blob W */ crtile(Blob, WEST), /* 5E Blob S */ crtile(Blob, SOUTH), /* 5F Blob E */ crtile(Blob, EAST), /* 60 Paramecium N */ crtile(Paramecium, NORTH), /* 61 Paramecium W */ crtile(Paramecium, WEST), /* 62 Paramecium S */ crtile(Paramecium, SOUTH), /* 63 Paramecium E */ crtile(Paramecium, EAST), /* 64 Blue key */ Key_Blue, /* 65 Red key */ Key_Red, /* 66 Green key */ Key_Green, /* 67 Yellow key */ Key_Yellow, /* 68 Flippers */ Boots_Water, /* 69 Fire boots */ Boots_Fire, /* 6A Ice skates */ Boots_Ice, /* 6B Suction boots */ Boots_Slide, /* 6C Chip N */ crtile(Chip, NORTH), /* 6D Chip W */ crtile(Chip, WEST), /* 6E Chip S */ crtile(Chip, SOUTH), /* 6F Chip E */ crtile(Chip, EAST) }; /* Initialize the gamestate by reading the level data, in MS dat-file * format, from the state's setup. */ static int expandmsdatlevel(gamestate *state) { gamesetup *setup; unsigned char const *data; unsigned char const *dataend; int size, pos, id; int i, n; memset(state->map, 0, sizeof state->map); state->trapcount = 0; state->clonercount = 0; state->crlistcount = 0; state->hinttext[0] = '\0'; setup = state->game; if (setup->levelsize < 10) goto badlevel; data = setup->leveldata; dataend = data + setup->levelsize; if (readword(data) == 0) goto badlevel; state->chipsneeded = readword(data + 4); if (readword(data + 6) > 1) goto badlevel; size = readword(data + 8); data += 10; if (data + size + 2 > dataend) goto badlevel; for (n = pos = 0 ; n < size && pos < CXGRID * CYGRID ; ++n) { if (data[n] == 0xFF) { i = data[++n]; id = data[++n]; } else { i = 1; id = data[n]; } if (id >= (int)(sizeof fileids / sizeof *fileids)) { id = Wall; state->statusflags |= SF_BADTILES; } else { id = fileids[id]; } while (i-- && pos < CXGRID * CYGRID) state->map[pos++].top.id = id; } if (n < size) warn("level %d: %d extra bytes in upper map layer", setup->number, size - n); else if (pos < CXGRID * CYGRID) warn("level %d: %d missing bytes in upper map layer", setup->number, CXGRID * CYGRID - pos); data += size + 2; size = readword(data - 2); if (data + size > dataend) goto badlevel; for (n = pos = 0 ; n < size && pos < CXGRID * CYGRID ; ++n) { if (data[n] == 0xFF) { i = data[++n]; id = data[++n]; } else { i = 1; id = data[n]; } if (id >= (int)(sizeof fileids / sizeof *fileids)) { id = Wall; state->statusflags |= SF_BADTILES; } else { id = fileids[id]; } while (i-- && pos < CXGRID * CYGRID) state->map[pos++].bot.id = id; } if (n < size) warn("level %d: %d extra bytes in lower map layer", setup->number, size - n); else if (pos < CXGRID * CYGRID) warn("level %d: %d missing bytes in lower map layer", setup->number, CXGRID * CYGRID - pos); data += size; size = readword(data); data += 2; if (data + size != dataend) warn("level %d: inconsistent metadata", setup->number); while (data + 2 < dataend) { size = data[1]; data += 2; if (data + size > dataend) size = dataend - data; switch (data[-2]) { case 1: /* time */ break; case 2: if (size < 2) warn("level %d: ignoring field 2 data of size %d", setup->number, size); else state->chipsneeded = readword(data); break; case 3: /* level name */ break; case 4: if (size % 10) warn("level %d: ignoring %d extra bytes at end of field 4", setup->number, size % 10); state->trapcount = size / 10; for (i = 0 ; i < state->trapcount ; ++i) { state->traps[i].from = readpos(data + i * 10, data + i * 10 + 2); state->traps[i].to = readpos(data + i * 10 + 4, data + i * 10 + 6); } break; case 5: if (size % 8) warn("level %d: ignoring %d extra bytes at end of field 5", setup->number, size % 8); state->clonercount = size / 8; for (i = 0 ; i < state->clonercount ; ++i) { state->cloners[i].from = readpos(data + i * 8, data + i * 8 + 2); state->cloners[i].to = readpos(data + i * 8 + 4, data + i * 8 + 6); } break; case 6: /* passwd */ break; case 7: memcpy(state->hinttext, data, size); state->hinttext[size] = '\0'; break; case 8: /* field 8 passwd */ break; case 9: /* author field */ break; case 10: if (size % 2) warn("level %d: ignoring extra byte at end of field 10", setup->number); state->crlistcount = size / 2; for (i = 0 ; i < state->crlistcount ; ++i) state->crlist[i] = readpos(data + i * 2, data + i * 2 + 1); break; default: warn("level %d: ignoring unrecognized field %d (%d bytes)", setup->number, data[-2], size); break; } data += size; } return TRUE; badlevel: errmsg(NULL, "level %d: invalid data", setup->number); return FALSE; } /* Exported interface. */ int expandleveldata(gamestate *state) { return expandmsdatlevel(state); } /* Return the setup for a small level to display at the completion of * a series. */ void getenddisplaysetup(gamestate *state) { static unsigned char endingdata[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6D, 0x00, 0x15, 0x39, 0x39, 0x39, 0x15, 0x39, 0x39, 0x15, 0x39, 0xFF, 0x17, 0x00, 0x39, 0x39, 0x15, 0x15, 0x15, 0x39, 0x39, 0x15, 0x39, 0xFF, 0x17, 0x00, 0x39, 0x39, 0x15, 0x15, 0x15, 0xFF, 0x04, 0x39, 0xFF, 0x17, 0x00, 0x15, 0x39, 0x39, 0x39, 0x15, 0x39, 0x39, 0x15, 0x39, 0xFF, 0x17, 0x00, 0xFF, 0x04, 0x15, 0x6E, 0xFF, 0x04, 0x15, 0xFF, 0x17, 0x00, 0xFF, 0x04, 0x39, 0x15, 0x39, 0x39, 0x39, 0x15, 0xFF, 0x17, 0x00, 0x15, 0x39, 0x39, 0x15, 0x15, 0x39, 0x39, 0x15, 0x39, 0xFF, 0x17, 0x00, 0x15, 0x39, 0x39, 0x15, 0x15, 0x39, 0x39, 0x39, 0x15, 0xFF, 0x17, 0x00, 0xFF, 0x04, 0x39, 0x15, 0x39, 0x39, 0x15, 0x15, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xF9, 0x00, 0x10, 0x00, 0xFF, 0x84, 0x00, 0x15, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x7E, 0x00, 0x00, 0x00 }; static gamesetup ending; ending.number = 1; ending.time = 0; ending.besttime = TIME_NIL; ending.sgflags = 0; ending.levelsize = sizeof endingdata; ending.leveldata = endingdata; ending.solutionsize = 0; ending.solutiondata = NULL; strcpy(ending.name, "CONGRATULATIONS!"); ending.passwd[0] = '\0'; state->game = &ending; expandmsdatlevel(state); ending.number = 0; } tworld-2.3.0/encoding.h000066400000000000000000000011341475511570500147770ustar00rootroot00000000000000/* encoding.h: Functions to read the level data. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_encoding_h_ #define HEADER_encoding_h_ #include "state.h" /* Initialize the gamestate by reading the level data from the setup. * FALSE is returned if the level data is invalid. */ extern int expandleveldata(gamestate *state); /* Return the setup for a small level, created at runtime, that can be * displayed at the completion of a series. */ extern void getenddisplaysetup(gamestate *state); #endif tworld-2.3.0/err.c000066400000000000000000000021721475511570500137770ustar00rootroot00000000000000/* err.c: Error handling and reporting. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include "oshw.h" #include "err.h" /* "Hidden" arguments to warn_, errmsg_, and die_. */ char const *err_cfile_ = NULL; unsigned long err_lineno_ = 0; /* Log a warning message. */ void warn_(char const *fmt, ...) { va_list args; va_start(args, fmt); usermessage(NOTIFY_LOG, NULL, err_cfile_, err_lineno_, fmt, args); va_end(args); err_cfile_ = NULL; err_lineno_ = 0; } /* Display an error message to the user. */ void errmsg_(char const *prefix, char const *fmt, ...) { va_list args; va_start(args, fmt); usermessage(NOTIFY_ERR, prefix, err_cfile_, err_lineno_, fmt, args); va_end(args); err_cfile_ = NULL; err_lineno_ = 0; } /* Display an error message to the user and exit. */ void die_(char const *fmt, ...) { va_list args; va_start(args, fmt); usermessage(NOTIFY_DIE, NULL, err_cfile_, err_lineno_, fmt, args); va_end(args); exit(EXIT_FAILURE); } tworld-2.3.0/err.h000066400000000000000000000021721475511570500140040ustar00rootroot00000000000000/* err.h: Error handling and reporting. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef HEADER_err_h_ #define HEADER_err_h_ /* Simple macros for dealing with memory allocation simply. */ #define memerrexit() (die("out of memory")) #define x_alloc(p, n) (((p) = realloc((p), (n))) || (memerrexit(), 0)) #ifdef __cplusplus extern "C" { #endif /* Log an error message and continue. */ extern void warn_(char const *fmt, ...); /* Display an error message. */ extern void errmsg_(char const *prefix, char const *fmt, ...); /* Display an error message and abort. */ extern void die_(char const *fmt, ...) __attribute__((noreturn)); #ifdef __cplusplus } #endif /* A really ugly hack used to smuggle extra arguments into variadic * functions. */ extern char const *err_cfile_; extern unsigned long err_lineno_; #define warn (err_cfile_ = __FILE__, err_lineno_ = __LINE__, warn_) #define errmsg (err_cfile_ = __FILE__, err_lineno_ = __LINE__, errmsg_) #define die (err_cfile_ = __FILE__, err_lineno_ = __LINE__, die_) #endif tworld-2.3.0/fileio.c000066400000000000000000000254111475511570500144570ustar00rootroot00000000000000/* fileio.c: Simple file/directory access functions with error-handling. * * Copyright (C) 2001-2017 by Brian Raiter and Eric Schmidt, under the * GNU General Public License. No warranty. See COPYING for details. */ #include #include #include #include #include #include #include #include #include "err.h" #include "fileio.h" /* Determine the proper directory delimiter and mkdir() arguments. */ #ifdef WIN32 #define DIRSEP_CHAR '\\' #define createdir(name) (mkdir(name) == 0) #else #define DIRSEP_CHAR '/' #define createdir(name) (mkdir(name, 0755) == 0) #endif /* Determine a compile-time number to use as the maximum length of a * path. Use a value of 1023 if we can't get anything usable from the * header files. */ #include #if !defined(PATH_MAX) || PATH_MAX <= 0 # if defined(MAXPATHLEN) && MAXPATHLEN > 0 # define PATH_MAX MAXPATHLEN # else # include # if !defined(PATH_MAX) || PATH_MAX <= 0 # if defined(MAXPATHLEN) && MAXPATHLEN > 0 # define PATH_MAX MAXPATHLEN # else # define PATH_MAX 1023 # endif # endif # endif #endif /* The function used to display error messages relating to file I/O. */ int fileerr_(char const *cfile, unsigned long lineno, fileinfo *file, char const *msg) { if (msg) { err_cfile_ = cfile; err_lineno_ = lineno; errmsg_(file->name ? file->name : "file error", errno ? strerror(errno) : msg); } return FALSE; } /* * File-handling functions. */ /* Clear the fields of the fileinfo struct. */ void clearfileinfo(fileinfo *file) { file->name = NULL; file->fp = NULL; file->alloc = FALSE; } /* The 'x' modifier (C11) in fopen() is not widely supported as of 2020. * This hack enables its use regardless of the underlying libc. */ static FILE *FOPEN(char const *name, char const *mode) { FILE * file = NULL; if (!strcmp(mode, "wx")) { int fd = open(name, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (fd != -1) file = fdopen(fd, "w"); } else file = fopen(name, mode); return file; } /* Open a file. If the fileinfo structure does not already have a * filename assigned to it, use name (after making an independent * copy). */ int fileopen(fileinfo *file, char const *name, char const *mode, char const *msg) { int n; if (!file->name) { n = strlen(name) + 1; if ((file->name = malloc(n))) { memcpy(file->name, name, n); file->alloc = TRUE; } else { file->name = (char*)name; file->alloc = FALSE; } } errno = 0; file->fp = FOPEN(name, mode); if (file->fp) return TRUE; return fileerr(file, msg); } /* Close the file, clear the file pointer, and free the name buffer if * necessary. */ void fileclose(fileinfo *file, char const *msg) { errno = 0; if (file->fp) { if (fclose(file->fp) == EOF) fileerr(file, msg); file->fp = NULL; } if (file->alloc) { free(file->name); file->name = NULL; file->alloc = FALSE; } } /* rewind(). */ int filerewind(fileinfo *file, char const *msg) { (void)msg; rewind(file->fp); return TRUE; } /* fseek(). */ int fileskip(fileinfo *file, int offset, char const *msg) { errno = 0; if (!fseek(file->fp, offset, SEEK_CUR)) return TRUE; return fileerr(file, msg); } /* feof(). */ int filetestend(fileinfo *file) { int ch; if (feof(file->fp)) return TRUE; ch = fgetc(file->fp); if (ch == EOF) return TRUE; ungetc(ch, file->fp); return FALSE; } /* read(). */ int fileread(fileinfo *file, void *data, unsigned long size, char const *msg) { if (!size) return TRUE; errno = 0; if (fread(data, size, 1, file->fp) == 1) return TRUE; return fileerr(file, msg); } /* Read size bytes from the given file into a newly allocated buffer. */ void *filereadbuf(fileinfo *file, unsigned long size, char const *msg) { void *buf; if (size == 0) { return NULL; } if (!(buf = malloc(size))) { fileerr(file, msg); return NULL; } errno = 0; if (fread(buf, size, 1, file->fp) != 1) { fileerr(file, msg); free(buf); return NULL; } return buf; } /* Read one full line from fp and store the first len characters, * including any trailing newline. */ int filegetline(fileinfo *file, char *buf, int *len, char const *msg) { int n, ch; if (!*len) { *buf = '\0'; return TRUE; } errno = 0; if (!fgets(buf, *len, file->fp)) return fileerr(file, msg); n = strlen(buf); if (n == *len - 1 && buf[n] != '\n') { do ch = fgetc(file->fp); while (ch != EOF && ch != '\n'); } else buf[n--] = '\0'; *len = n; return TRUE; } /* write(). */ int filewrite(fileinfo *file, void const *data, unsigned long size, char const *msg) { if (!size) return TRUE; errno = 0; if (fwrite(data, size, 1, file->fp) == 1) return TRUE; return fileerr(file, msg); } /* Read one byte as an unsigned integer value. */ int filereadint8(fileinfo *file, unsigned char *val8, char const *msg) { int byte; errno = 0; if ((byte = fgetc(file->fp)) == EOF) return fileerr(file, msg); *val8 = (unsigned char)byte; return TRUE; } /* Write one byte as an unsigned integer value. */ int filewriteint8(fileinfo *file, unsigned char val8, char const *msg) { errno = 0; if (fputc(val8, file->fp) != EOF) return TRUE; return fileerr(file, msg); } /* Read two bytes as an unsigned integer value stored in little-endian. */ int filereadint16(fileinfo *file, unsigned short *val16, char const *msg) { int byte; errno = 0; if ((byte = fgetc(file->fp)) != EOF) { *val16 = (unsigned char)byte; if ((byte = fgetc(file->fp)) != EOF) { *val16 |= (unsigned char)byte << 8; return TRUE; } } return fileerr(file, msg); } /* Write two bytes as an unsigned integer value in little-endian. */ int filewriteint16(fileinfo *file, unsigned short val16, char const *msg) { errno = 0; if (fputc(val16 & 0xFF, file->fp) != EOF && fputc((val16 >> 8) & 0xFF, file->fp) != EOF) return TRUE; return fileerr(file, msg); } /* Read four bytes as an unsigned integer value stored in little-endian. */ int filereadint32(fileinfo *file, unsigned long *val32, char const *msg) { int byte; errno = 0; if ((byte = fgetc(file->fp)) != EOF) { *val32 = (unsigned int)byte; if ((byte = fgetc(file->fp)) != EOF) { *val32 |= (unsigned int)byte << 8; if ((byte = fgetc(file->fp)) != EOF) { *val32 |= (unsigned int)byte << 16; if ((byte = fgetc(file->fp)) != EOF) { *val32 |= (unsigned int)byte << 24; return TRUE; } } } } return fileerr(file, msg); } /* Write four bytes as an unsigned integer value in little-endian. */ int filewriteint32(fileinfo *file, unsigned long val32, char const *msg) { errno = 0; if (fputc(val32 & 0xFF, file->fp) != EOF && fputc((val32 >> 8) & 0xFF, file->fp) != EOF && fputc((val32 >> 16) & 0xFF, file->fp) != EOF && fputc((val32 >> 24) & 0xFF, file->fp) != EOF) return TRUE; return fileerr(file, msg); } /* * Directory-handling functions. */ /* Return the size of a buffer big enough to hold a pathname. */ int getpathbufferlen(void) { return PATH_MAX; } /* Return a buffer big enough to hold a pathname. */ char *getpathbuffer(void) { char *buf; if (!(buf = calloc(PATH_MAX + 1, 1))) memerrexit(); return buf; } /* Return TRUE if name contains a path but is not a directory itself. */ int haspathname(char const *name) { struct stat st; if (!strchr(name, DIRSEP_CHAR)) return FALSE; if (stat(name, &st) || S_ISDIR(st.st_mode)) return FALSE; return TRUE; } /* Return a pointer to the filename, skipping over any directories in * the front. */ char *skippathname(char const *name) { char const *p; p = strrchr(name, DIRSEP_CHAR); return (char*)(p ? p + 1 : name); } /* Append the path and/or file contained in path to dir. If path is * an absolute path, the contents of dir are ignored. */ int combinepath(char *dest, char const *dir, char const *path) { int m, n; if (path[0] == DIRSEP_CHAR) { n = strlen(path); if (n > PATH_MAX) { errno = ENAMETOOLONG; return FALSE; } strcpy(dest, path); return TRUE; } n = strlen(dir); if (n >= PATH_MAX) { errno = ENAMETOOLONG; return FALSE; } if (dest != dir) memcpy(dest, dir, n); if (dest[n - 1] != DIRSEP_CHAR) dest[n++] = DIRSEP_CHAR; m = strlen(path); if (m + n + 1 > PATH_MAX) { errno = ENAMETOOLONG; return FALSE; } memcpy(dest + n, path, m + 1); return TRUE; } /* Create the directory dir if it doesn't already exist. */ int finddir(char const *dir) { struct stat st; return stat(dir, &st) ? createdir(dir) : S_ISDIR(st.st_mode); } /* Return the pathname for a directory and/or filename, using the * same algorithm to construct the path as openfileindir(). */ char *getpathforfileindir(char const *dir, char const *filename) { char *path; int m, n; m = strlen(filename); if (!dir || !*dir || strchr(filename, DIRSEP_CHAR)) { if (m > PATH_MAX) { errno = ENAMETOOLONG; return NULL; } path = getpathbuffer(); strcpy(path, filename); } else { n = strlen(dir); if (m + n + 1 > PATH_MAX) { errno = ENAMETOOLONG; return NULL; } path = getpathbuffer(); memcpy(path, dir, n); path[n++] = DIRSEP_CHAR; memcpy(path + n, filename, m + 1); } return path; } /* Open a file, using dir as the directory if filename is not a path. */ int openfileindir(fileinfo *file, char const *dir, char const *filename, char const *mode, char const *msg) { char buf[PATH_MAX + 1]; int m, n; if (!dir || !*dir || strchr(filename, DIRSEP_CHAR)) return fileopen(file, filename, mode, msg); n = strlen(dir); m = strlen(filename); if (m + n + 1 > PATH_MAX) { errno = ENAMETOOLONG; return fileerr(file, NULL); } memcpy(buf, dir, n); buf[n++] = DIRSEP_CHAR; memcpy(buf + n, filename, m + 1); return fileopen(file, buf, mode, msg); } /* Read the given directory and call filecallback once for each file * contained in it. */ int findfiles(char const *dir, void *data, int (*filecallback)(char const*, void*)) { char *filename = NULL; DIR *dp; struct dirent *dent; int r; if (!(dp = opendir(dir))) { fileinfo tmp; tmp.name = (char*)dir; return fileerr(&tmp, "couldn't access directory"); } while ((dent = readdir(dp))) { if (dent->d_name[0] == '.') continue; x_alloc(filename, strlen(dent->d_name) + 1); strcpy(filename, dent->d_name); r = (*filecallback)(filename, data); if (r < 0) break; else if (r > 0) filename = NULL; } if (filename) free(filename); closedir(dp); return TRUE; } tworld-2.3.0/fileio.h000066400000000000000000000127511475511570500144670ustar00rootroot00000000000000/* fileio.h: Simple file/directory access functions with error-handling. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_fileio_h_ #define HEADER_fileio_h_ #include "defs.h" #ifdef __cplusplus extern "C" { #endif /* Reset a fileinfo structure to indicate no file. */ extern void clearfileinfo(fileinfo *file); /* Open a file. If the fileinfo structure does not already have a * filename assigned to it, name will be used as the filename. If msg * is NULL, no error will be displayed if the file cannot be opened. * If msg points to a string, an error will be displayed. The text of * msg will be used only if errno is zero; otherwise a message * appropriate to the error will be used. */ extern int fileopen(fileinfo *file, char const *name, char const *mode, char const *msg); /* The following functions correspond directly to C's standard I/O * functions. If msg is NULL, no error will be displayed if * the operation fails. If msg points to a string, an error will * be displayed. The text of msg will be used only if errno is * zero; otherwise a message appropriate to the error will be used. */ extern int filerewind(fileinfo *file, char const *msg); extern int fileread(fileinfo *file, void *data, unsigned long size, char const *msg); extern int filewrite(fileinfo *file, void const *data, unsigned long size, char const *msg); extern void fileclose(fileinfo *file, char const *msg); /* fileskip() works like fseek() with whence set to SEEK_CUR. */ extern int fileskip(fileinfo *file, int offset, char const *msg); /* filetestend() forces a check for EOF by attempting to read a byte * from the file, and ungetting the byte if one is successfully read. */ extern int filetestend(fileinfo *file); /* The following functions read and write an unsigned integer value * from the current position in the given file. For the multi-byte * values, the value is assumed to be stored in little-endian. */ extern int filereadint8(fileinfo *file, unsigned char *val8, char const *msg); extern int filewriteint8(fileinfo *file, unsigned char val8, char const *msg); extern int filereadint16(fileinfo *file, unsigned short *val16, char const *msg); extern int filewriteint16(fileinfo *file, unsigned short val16, char const *msg); extern int filereadint32(fileinfo *file, unsigned long *val32, char const *msg); extern int filewriteint32(fileinfo *file, unsigned long val32, char const *msg); /* Read size bytes from the given file and return the bytes in a * newly allocated buffer. */ extern void *filereadbuf(fileinfo *file, unsigned long size, char const *msg); /* Read one full line from fp and store the first len characters, * including any trailing newline. len receives the length of the line * stored in buf, minus any trailing newline, upon return. */ extern int filegetline(fileinfo *file, char *buf, int *len, char const *msg); /* Return the maximum size of a legal pathname. */ extern int getpathbufferlen(void); /* Return an allocated buffer big enough to hold any legal pathname. */ extern char *getpathbuffer(void); /* Return TRUE if name contains a path but is not a directory itself. */ extern int haspathname(char const *name); /* Return a pointer to the filename, skipping over any directories in * the front. */ extern char *skippathname(char const *name); /* Append the path and/or file contained in path to dir, storing the * result in dest. dest and dir can point to the same buffer. dest is * assumed to be a buffer of size getpathbufferlen(). If the resulting * path is longer than this, FALSE is returned and errno is set to * ENAMETOOLONG. */ extern int combinepath(char *dest, char const *dir, char const *path); /* Return the pathname for a directory and/or filename, using the same * algorithm to construct the path as openfileindir(). The caller must * free the returned buffer. */ extern char *getpathforfileindir(char const *dir, char const *filename); /* Verify that the given directory exists, or create it if it doesn't. */ extern int finddir(char const *dir); /* Open a file, using dir as the directory if filename is not already * a complete pathname. FALSE is returned if the directory could not * be created. */ extern int openfileindir(fileinfo *file, char const *dir, char const *filename, char const *mode, char const *msg); /* Call filecallback once for every file in dir. The first argument to * the callback function is an allocated buffer containing the * filename. data is passed as the second argument to the callback. If * the callback's return value is zero, the buffer is deallocated * normally; if the return value is positive, the callback function * inherits the buffer and the responsibility of freeing it. If the * return value is negative, findfiles() stops scanning the directory * and returns. FALSE is returned if the directory could not be * examined. */ extern int findfiles(char const *dir, void *data, int (*filecallback)(char const*, void*)); /* Display a simple error message prefixed by the name of the given * file. If errno is set, a message appropriate to the value is used; * otherwise the text pointed to by msg is used. If msg is NULL, the * function does nothing. The return value is always FALSE. */ extern int fileerr_(char const *cfile, unsigned long lineno, fileinfo *file, char const *msg); #define fileerr(file, msg) (fileerr_(__FILE__, __LINE__, (file), (msg))) #ifdef __cplusplus } #endif #endif tworld-2.3.0/gen.h000066400000000000000000000042131475511570500137630ustar00rootroot00000000000000/* gen.h: General definitions belonging to no single module. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_gen_h_ #define HEADER_gen_h_ /* The standard Boolean values. */ #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /* Definition of the contents and layout of a table. * * The strings making up the contents of a table are each prefixed * with two characters that indicate the formatting of their cell. The * first character is a digit, usually "1", indicating the number of * columns that cell occupies. The second character indicates the * placement of the string in that cell: "-" to align to the left of * the cell, "+" to align to the right, "." to center the text, and * "!" to permit the cell to occupy multiple lines, with word * wrapping. At most one cell in a given row can be word-wrapped. */ typedef struct tablespec { short rows; /* number of rows */ short cols; /* number of columns */ short sep; /* amount of space between columns */ short collapse; /* the column to squeeze if necessary */ char const **items; /* the table's contents */ } tablespec; /* The dimensions of a level. */ #define CXGRID 32 #define CYGRID 32 /* The four directions plus one non-direction. */ #define NIL 0 #define NORTH 1 #define WEST 2 #define SOUTH 4 #define EAST 8 /* Translating directions to and from a two-bit representation. (Note * that NIL will map to the same value as NORTH.) */ #define diridx(dir) ((0x30210 >> ((dir) * 2)) & 3) #define idxdir(idx) (1 << ((idx) & 3)) /* The frequency of the gameplay timer. Note that "seconds" refers to * seconds in the game, which are not necessarily the same length as * real-time seconds. */ #define TICKS_PER_SECOND 20 /* The gameplay timer's value is forced to remain within 23 bits. * Thus, gameplay of a single level cannot exceed 4 days 20 hours 30 * minutes and 30.4 seconds. */ #define MAXIMUM_TICK_COUNT 0x7FFFFF #define FOREVER (2*MAXIMUM_TICK_COUNT) /* A magic number used to indicate an undefined time value. */ #define TIME_NIL 0x7FFFFFFF #endif tworld-2.3.0/generic/000077500000000000000000000000001475511570500144555ustar00rootroot00000000000000tworld-2.3.0/generic/_in.cpp000066400000000000000000000000201475511570500157160ustar00rootroot00000000000000#include "in.c" tworld-2.3.0/generic/generic.h000066400000000000000000000065731475511570500162550ustar00rootroot00000000000000/* generic.h: The internal shared definitions of the generic layer. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef HEADER_generic_h_ #define HEADER_generic_h_ #include "oshwbind.h" #ifdef __cplusplus #define OSHW_EXTERN extern "C" #else #define OSHW_EXTERN extern #endif struct gamestate; /* The dimensions of the visible area of the map (in tiles). */ #define NXTILES 9 #define NYTILES 9 /* * Values global to this module. All the globals are placed in here, * in order to minimize pollution of the main module's namespace. */ typedef struct genericglobals { /* * Shared variables. */ short wtile; /* width of one tile in pixels */ short htile; /* height of one tile in pixels */ short cptile; /* size of one tile in pixels */ TW_Surface *screen; /* the display */ TW_Rect maploc; /* location of the map in the window */ /* Coordinates of the NW corner of the visible part of the map * (measured in quarter-tiles), or -1 if no map is currently visible. */ int mapvieworigin; /* * Shared functions. */ /* Process all pending events. If wait is TRUE and no events are * currently pending, the function blocks until an event arrives. */ void (*eventupdatefunc)(int wait); /* A callback function, to be called every time a keyboard key is * pressed or released. scancode is an SDL key symbol. down is * TRUE if the key was pressed or FALSE if it was released. */ void (*keyeventcallbackfunc)(int scancode, int down); /* A callback function, to be called when a mouse button is * pressed or released. xpos and ypos give the mouse's location. * button is the number of the mouse button. down is TRUE if the * button was pressed or FALSE if it was released. */ void (*mouseeventcallbackfunc)(int xpos, int ypos, int button, int down); /* Given a pixel's coordinates, return an integer identifying the * tile on the map view display under that pixel, or -1 if the * pixel is not within the map view. */ int (*windowmapposfunc)(int x, int y); /* Render the view of the visible area of the map to the display, with * the view position centered on the display as much as possible. The * gamestate's map and the list of creatures are consulted to * determine what to render. */ void (*displaymapviewfunc)(struct gamestate const *state, TW_Rect disploc); /* Draw a tile of the given id at the position (xpos, ypos). */ void (*drawfulltileidfunc)(TW_Surface *dest, int xpos, int ypos, int id); } genericglobals; /* generic module's structure of globals. */ OSHW_EXTERN genericglobals geng; /* Some convenience macros for the above functions. */ #define eventupdate (*geng.eventupdatefunc) #define keyeventcallback (*geng.keyeventcallbackfunc) #define mouseeventcallback (*geng.mouseeventcallbackfunc) #define windowmappos (*geng.windowmapposfunc) #define displaymapview (*geng.displaymapviewfunc) #define drawfulltileid (*geng.drawfulltileidfunc) /* The initialization functions for the various modules. */ OSHW_EXTERN int _generictimerinitialize(int showhistogram); OSHW_EXTERN int _generictileinitialize(void); OSHW_EXTERN int _genericinputinitialize(void); #undef OSHW_EXTERN #endif tworld-2.3.0/generic/in.c000066400000000000000000000571141475511570500152370ustar00rootroot00000000000000/* in.c: Reading the keyboard and mouse. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include #include "generic.h" #include "../gen.h" #include "../oshw.h" #include "../defs.h" #include "../err.h" /* Structure describing a mapping of a key event to a game command. */ typedef struct keycmdmap { int scancode; /* the key's scan code */ int shift; /* the shift key's state */ int ctl; /* the ctrl key's state */ int alt; /* the alt keys' state */ int cmd; /* the command */ int hold; /* TRUE for repeating joystick-mode keys */ } keycmdmap; /* Structure describing mouse activity. */ typedef struct mouseaction { int state; /* state of mouse action (KS_*) */ int x, y; /* position of the mouse */ int button; /* which button generated the event */ } mouseaction; /* The possible states of keys. */ enum { KS_OFF = 0, /* key is not currently pressed */ KS_ON = 1, /* key is down (shift-type keys only) */ KS_DOWN, /* key is being held down */ KS_STRUCK, /* key was pressed and released in one tick */ KS_PRESSED, /* key was pressed in this tick */ KS_DOWNBUTOFF1, /* key has been down since the previous tick */ KS_DOWNBUTOFF2, /* key has been down since two ticks ago */ KS_DOWNBUTOFF3, /* key has been down since three ticks ago */ KS_REPEATING, /* key is down and is now repeating */ KS_count }; /* The complete array of key states. */ static char keystates[TWK_LAST]; /* The last mouse action. */ static mouseaction mouseinfo; /* TRUE if direction keys are to be treated as always repeating. */ static int joystickstyle = FALSE; /* The complete list of key commands recognized by the game while * playing. hold is TRUE for keys that are to be forced to repeat. * shift, ctl and alt are positive if the key must be down, zero if * the key must be up, or negative if it doesn't matter. */ static keycmdmap const gamekeycmds[] = { { TWK_UP, 0, 0, 0, CmdNorth, TRUE }, { TWK_LEFT, 0, 0, 0, CmdWest, TRUE }, { TWK_DOWN, 0, 0, 0, CmdSouth, TRUE }, { TWK_RIGHT, 0, 0, 0, CmdEast, TRUE }, { TWK_KP8, 0, 0, 0, CmdNorth, TRUE }, { TWK_KP4, 0, 0, 0, CmdWest, TRUE }, { TWK_KP2, 0, 0, 0, CmdSouth, TRUE }, { TWK_KP6, 0, 0, 0, CmdEast, TRUE }, #ifdef TWPLUSPLUS { TWK_ESCAPE, 0, 0, 0, CmdQuitLevel, FALSE }, #else { 'q', 0, 0, 0, CmdQuitLevel, FALSE }, #endif { 'p', 0, +1, 0, CmdPrevLevel, FALSE }, { 'r', 0, +1, 0, CmdSameLevel, FALSE }, { 'n', 0, +1, 0, CmdNextLevel, FALSE }, { 'g', 0, -1, 0, CmdGotoLevel, FALSE }, #ifndef TWPLUSPLUS { 'q', +1, 0, 0, CmdQuit, FALSE }, #endif { TWK_PAGEUP, -1, -1, 0, CmdPrev10, FALSE }, { 'p', 0, 0, 0, CmdPrev, FALSE }, { 'r', 0, 0, 0, CmdSame, FALSE }, { 'n', 0, 0, 0, CmdNext, FALSE }, { TWK_PAGEDOWN, -1, -1, 0, CmdNext10, FALSE }, { TWK_BACKSPACE, -1, -1, 0, CmdPauseGame, FALSE }, /* TEMP disabling help */ #ifndef TWPLUSPLUS { '?', -1, -1, 0, CmdHelp, FALSE }, { TWK_F1, -1, -1, 0, CmdHelp, FALSE }, #endif { 'o', 0, 0, 0, CmdStepping, FALSE }, { 'o', +1, 0, 0, CmdSubStepping, FALSE }, { 'f', 0, 0, 0, CmdRandomFF, FALSE }, { 'd', 0, 0, 0, CmdShowInitState, FALSE }, { 'e', 0, 0, 0, CmdAdvanceGame, FALSE }, { 'e', +1, 0, 0, CmdAdvanceMoveGame, FALSE }, { TWK_TAB, 0, -1, 0, CmdPlayback, FALSE }, { TWK_TAB, +1, -1, 0, CmdCheckSolution, FALSE }, { 'i', 0, +1, 0, CmdPlayback, FALSE }, { 'i', +1, +1, 0, CmdCheckSolution, FALSE }, { 'x', 0, +1, 0, CmdReplSolution, FALSE }, { 'x', +1, +1, 0, CmdKillSolution, FALSE }, { 's', 0, 0, 0, CmdSeeScores, FALSE }, { 's', 0, +1, 0, CmdSeeSolutionFiles, FALSE }, { 'v', +1, 0, 0, CmdVolumeUp, FALSE }, { 'v', 0, 0, 0, CmdVolumeDown, FALSE }, { TWK_RETURN, -1, -1, 0, CmdProceed, FALSE }, { TWK_KP_ENTER, -1, -1, 0, CmdProceed, FALSE }, { ' ', -1, -1, 0, CmdProceed, FALSE }, #ifndef NDEBUG { 'd', 0, +1, 0, CmdDebugCmd1, FALSE }, { 'd', +1, +1, 0, CmdDebugCmd2, FALSE }, { TWK_UP, +1, 0, 0, CmdCheatNorth, TRUE }, { TWK_LEFT, +1, 0, 0, CmdCheatWest, TRUE }, { TWK_DOWN, +1, 0, 0, CmdCheatSouth, TRUE }, { TWK_RIGHT, +1, 0, 0, CmdCheatEast, TRUE }, { TWK_HOME, +1, 0, 0, CmdCheatHome, FALSE }, { TWK_F2, 0, 0, 0, CmdCheatICChip, FALSE }, { TWK_F3, 0, 0, 0, CmdCheatKeyRed, FALSE }, { TWK_F4, 0, 0, 0, CmdCheatKeyBlue, FALSE }, { TWK_F5, 0, 0, 0, CmdCheatKeyYellow, FALSE }, { TWK_F6, 0, 0, 0, CmdCheatKeyGreen, FALSE }, { TWK_F7, 0, 0, 0, CmdCheatBootsIce, FALSE }, { TWK_F8, 0, 0, 0, CmdCheatBootsSlide, FALSE }, { TWK_F9, 0, 0, 0, CmdCheatBootsFire, FALSE }, { TWK_F10, 0, 0, 0, CmdCheatBootsWater, FALSE }, #endif { TWK_CTRL_C, -1, -1, 0, CmdQuit, FALSE }, { TWK_F4, 0, 0, +1, CmdQuit, FALSE }, #ifdef TWPLUSPLUS /* "Virtual" keys */ { TWC_SEESCORES, 0, 0, 0, CmdSeeScores, FALSE }, { TWC_SEESOLUTIONFILES, 0, 0, 0, CmdSeeSolutionFiles, FALSE }, { TWC_TIMESCLIPBOARD, 0, 0, 0, CmdTimesClipboard, FALSE }, { TWC_QUITLEVEL, 0, 0, 0, CmdQuitLevel, FALSE }, { TWC_QUIT, 0, 0, 0, CmdQuit, FALSE }, { TWC_PROCEED, 0, 0, 0, CmdProceed, FALSE }, { TWC_PAUSEGAME, 0, 0, 0, CmdPauseGame, FALSE }, { TWC_SAMELEVEL, 0, 0, 0, CmdSameLevel, FALSE }, { TWC_NEXTLEVEL, 0, 0, 0, CmdNextLevel, FALSE }, { TWC_PREVLEVEL, 0, 0, 0, CmdPrevLevel, FALSE }, { TWC_GOTOLEVEL, 0, 0, 0, CmdGotoLevel, FALSE }, { TWC_PLAYBACK, 0, 0, 0, CmdPlayback, FALSE }, { TWC_PLAYBACK, 0, +1, 0, CmdCheckSolution, FALSE }, { TWC_CHECKSOLUTION, 0, 0, 0, CmdCheckSolution, FALSE }, { TWC_REPLSOLUTION, 0, 0, 0, CmdReplSolution, FALSE }, { TWC_KILLSOLUTION, 0, 0, 0, CmdKillSolution, FALSE }, { TWC_SEEK, 0, 0, 0, CmdSeek, FALSE }, { TWC_HELP, 0, 0, 0, CmdHelp, FALSE }, { TWC_KEYS, 0, 0, 0, CmdKeys, FALSE }, #endif { 0, 0, 0, 0, 0, 0 } }; /* The list of key commands recognized when the program is obtaining * input from the user. */ static keycmdmap const inputkeycmds[] = { { TWK_UP, -1, -1, 0, CmdNorth, FALSE }, { TWK_LEFT, -1, -1, 0, CmdWest, FALSE }, { TWK_DOWN, -1, -1, 0, CmdSouth, FALSE }, { TWK_RIGHT, -1, -1, 0, CmdEast, FALSE }, { TWK_BACKSPACE, -1, -1, 0, CmdWest, FALSE }, { ' ', -1, -1, 0, CmdEast, FALSE }, { TWK_RETURN, -1, -1, 0, CmdProceed, FALSE }, { TWK_KP_ENTER, -1, -1, 0, CmdProceed, FALSE }, { TWK_ESCAPE, -1, -1, 0, CmdQuitLevel, FALSE }, { 'a', -1, 0, 0, 'a', FALSE }, { 'b', -1, 0, 0, 'b', FALSE }, { 'c', -1, 0, 0, 'c', FALSE }, { 'd', -1, 0, 0, 'd', FALSE }, { 'e', -1, 0, 0, 'e', FALSE }, { 'f', -1, 0, 0, 'f', FALSE }, { 'g', -1, 0, 0, 'g', FALSE }, { 'h', -1, 0, 0, 'h', FALSE }, { 'i', -1, 0, 0, 'i', FALSE }, { 'j', -1, 0, 0, 'j', FALSE }, { 'k', -1, 0, 0, 'k', FALSE }, { 'l', -1, 0, 0, 'l', FALSE }, { 'm', -1, 0, 0, 'm', FALSE }, { 'n', -1, 0, 0, 'n', FALSE }, { 'o', -1, 0, 0, 'o', FALSE }, { 'p', -1, 0, 0, 'p', FALSE }, { 'q', -1, 0, 0, 'q', FALSE }, { 'r', -1, 0, 0, 'r', FALSE }, { 's', -1, 0, 0, 's', FALSE }, { 't', -1, 0, 0, 't', FALSE }, { 'u', -1, 0, 0, 'u', FALSE }, { 'v', -1, 0, 0, 'v', FALSE }, { 'w', -1, 0, 0, 'w', FALSE }, { 'x', -1, 0, 0, 'x', FALSE }, { 'y', -1, 0, 0, 'y', FALSE }, { 'z', -1, 0, 0, 'z', FALSE }, { TWK_CTRL_C, -1, -1, 0, CmdQuit, FALSE }, { TWK_F4, 0, 0, +1, CmdQuit, FALSE }, { 0, 0, 0, 0, 0, 0 } }; /* The current map of key commands. */ static keycmdmap const *keycmds = gamekeycmds; /* A map of keys that can be held down simultaneously to produce * multiple commands. */ static int mergeable[CmdKeyMoveLast + 1]; /* * Running the keyboard's state machine. */ /* This callback is called whenever the state of any keyboard key * changes. It records this change in the keystates array. The key can * be recorded as being struck, pressed, repeating, held down, or down * but ignored, as appropriate to when they were first pressed and the * current behavior settings. Shift-type keys are always either on or * off. */ static void _keyeventcallback(int scancode, int down) { switch (scancode) { case TWK_LSHIFT: case TWK_RSHIFT: case TWK_LCTRL: case TWK_RCTRL: case TWK_LALT: case TWK_RALT: case TWK_LMETA: case TWK_RMETA: case TWK_NUMLOCK: case TWK_CAPSLOCK: case TWK_MODE: keystates[scancode] = down ? KS_ON : KS_OFF; break; default: if (scancode < TWK_LAST) { if (down) { keystates[scancode] = keystates[scancode] == KS_OFF ? KS_PRESSED : KS_REPEATING; } else { keystates[scancode] = keystates[scancode] == KS_PRESSED ? KS_STRUCK : KS_OFF; } } break; } } /* Initialize (or re-initialize) all key states. */ static void restartkeystates(void) { uint8_t *keyboard; int count, n; memset(keystates, KS_OFF, sizeof keystates); keyboard = TW_GetKeyState(&count); if (count > TWK_LAST) count = TWK_LAST; for (n = 0 ; n < count ; ++n) if (keyboard[n]) _keyeventcallback(n, TRUE); } /* Update the key states. This is done at the start of each polling * cycle. The state changes that occur depend on the current behavior * settings. */ static void resetkeystates(void) { /* The transition table for keys in joystick behavior mode. */ static char const joystick_trans[KS_count] = { /* KS_OFF => */ KS_OFF, /* KS_ON => */ KS_ON, /* KS_DOWN => */ KS_DOWN, /* KS_STRUCK => */ KS_OFF, /* KS_PRESSED => */ KS_DOWN, /* KS_DOWNBUTOFF1 => */ KS_DOWN, /* KS_DOWNBUTOFF2 => */ KS_DOWN, /* KS_DOWNBUTOFF3 => */ KS_DOWN, /* KS_REPEATING => */ KS_DOWN }; /* The transition table for keys in keyboard behavior mode. */ static char const keyboard_trans[KS_count] = { /* KS_OFF => */ KS_OFF, /* KS_ON => */ KS_ON, /* KS_DOWN => */ KS_DOWN, /* KS_STRUCK => */ KS_OFF, /* KS_PRESSED => */ KS_DOWNBUTOFF1, /* KS_DOWNBUTOFF1 => */ KS_DOWN, /* KS_DOWNBUTOFF2 => */ KS_DOWN, /* KS_DOWNBUTOFF3 => */ KS_DOWN, /* KS_REPEATING => */ KS_DOWN }; char const *newstate; int n; newstate = joystickstyle ? joystick_trans : keyboard_trans; for (n = 0 ; n < TWK_LAST ; ++n) keystates[n] = newstate[(int)keystates[n]]; } /* * Mouse event functions. */ /* This callback is called whenever there is a state change in the * mouse buttons. Up events are ignored. Down events are stored to * be examined later. */ static void _mouseeventcallback(int xpos, int ypos, int button, int down) { if (down) { mouseinfo.state = KS_PRESSED; mouseinfo.x = xpos; mouseinfo.y = ypos; mouseinfo.button = button; } } /* Return the command appropriate to the most recent mouse activity. */ static int retrievemousecommand(void) { int n; switch (mouseinfo.state) { case KS_PRESSED: mouseinfo.state = KS_OFF; if (mouseinfo.button == TW_BUTTON_WHEELDOWN) return CmdNext; if (mouseinfo.button == TW_BUTTON_WHEELUP) return CmdPrev; if (mouseinfo.button == TW_BUTTON_LEFT) { n = windowmappos(mouseinfo.x, mouseinfo.y); if (n >= 0) { mouseinfo.state = KS_DOWNBUTOFF1; return CmdAbsMouseMoveFirst + n; } } break; case KS_DOWNBUTOFF1: mouseinfo.state = KS_DOWNBUTOFF2; return CmdPreserve; case KS_DOWNBUTOFF2: mouseinfo.state = KS_DOWNBUTOFF3; return CmdPreserve; case KS_DOWNBUTOFF3: mouseinfo.state = KS_OFF; return CmdPreserve; } return 0; } /* * Exported functions. */ /* Wait for any non-shift key to be pressed down, ignoring any keys * that may be down at the time the function is called. Return FALSE * if the key pressed is suggestive of a desire to quit. */ int anykey(void) { int n; resetkeystates(); eventupdate(FALSE); for (;;) { resetkeystates(); eventupdate(TRUE); for (n = 0 ; n < TWK_LAST ; ++n) if (keystates[n] == KS_STRUCK || keystates[n] == KS_PRESSED || keystates[n] == KS_REPEATING) return n != 'q' && n != TWK_ESCAPE; } } /* Poll the keyboard and return the command associated with the * selected key, if any. If no key is selected and wait is TRUE, block * until a key with an associated command is selected. In keyboard behavior * mode, the function can return CmdPreserve, indicating that if the key * command from the previous poll has not been processed, it should still * be considered active. If two mergeable keys are selected, the return * value will be the bitwise-or of their command values. */ int input(int wait) { keycmdmap const *kc; int lingerflag = FALSE; int cmd1, cmd, n; for (;;) { resetkeystates(); eventupdate(wait); cmd1 = cmd = 0; for (kc = keycmds ; kc->scancode ; ++kc) { n = keystates[kc->scancode]; if (!n) continue; if (kc->shift != -1) if (kc->shift != (keystates[TWK_LSHIFT] || keystates[TWK_RSHIFT])) continue; if (kc->ctl != -1) if (kc->ctl != (keystates[TWK_LCTRL] || keystates[TWK_RCTRL])) continue; if (kc->alt != -1) if (kc->alt != (keystates[TWK_LALT] || keystates[TWK_RALT])) continue; if (n == KS_PRESSED || (kc->hold && n == KS_DOWN)) { if (!cmd1) { cmd1 = kc->cmd; if (!joystickstyle || cmd1 > CmdKeyMoveLast || !mergeable[cmd1]) return cmd1; } else { if (cmd1 <= CmdKeyMoveLast && (mergeable[cmd1] & kc->cmd) == kc->cmd) return cmd1 | kc->cmd; } } else if (n == KS_STRUCK || n == KS_REPEATING) { cmd = kc->cmd; } else if (n == KS_DOWNBUTOFF1 || n == KS_DOWNBUTOFF2) { lingerflag = TRUE; } } if (cmd1) return cmd1; if (cmd) return cmd; cmd = retrievemousecommand(); if (cmd) return cmd; if (!wait) break; } if (!cmd && lingerflag) cmd = CmdPreserve; return cmd; } /* Turn joystick behavior mode on or off. In joystick-behavior mode, * the arrow keys are always returned from input() if they are down at * the time of the polling cycle. Other keys are only returned if they * are pressed during a polling cycle (or if they repeat, if keyboard * repeating is on). In keyboard-behavior mode, the arrow keys have a * special repeating behavior that is kept synchronized with the * polling cycle. */ int setkeyboardarrowsrepeat(int enable) { joystickstyle = enable; restartkeystates(); return TRUE; } /* Turn input mode on or off. When input mode is on, the input key * command map is used instead of the game key command map. */ int setkeyboardinputmode(int enable) { keycmds = enable ? inputkeycmds : gamekeycmds; return TRUE; } /* Given a pixel's coordinates, return the integer identifying the * tile's position in the map, or -1 if the pixel is not on the map view. */ static int _windowmappos(int x, int y) { if (geng.mapvieworigin < 0) return -1; if (x < geng.maploc.x || y < geng.maploc.y) return -1; x = (x - geng.maploc.x) * 4 / geng.wtile; y = (y - geng.maploc.y) * 4 / geng.htile; if (x >= NXTILES * 4 || y >= NYTILES * 4) return -1; x = (x + geng.mapvieworigin % (CXGRID * 4)) / 4; y = (y + geng.mapvieworigin / (CXGRID * 4)) / 4; if (x < 0 || x >= CXGRID || y < 0 || y >= CYGRID) { warn("mouse moved off the map: (%d %d)", x, y); return -1; } return y * CXGRID + x; } /* Initialization. */ int _genericinputinitialize(void) { geng.keyeventcallbackfunc = _keyeventcallback; geng.mouseeventcallbackfunc = _mouseeventcallback; geng.windowmapposfunc = _windowmappos; mergeable[CmdNorth] = mergeable[CmdSouth] = CmdWest | CmdEast; mergeable[CmdWest] = mergeable[CmdEast] = CmdNorth | CmdSouth; setkeyboardrepeat(TRUE); return TRUE; } /* Online help texts for the keyboard commands. */ tablespec const *keyboardhelp(int which) { static char const *ingame_items[] = { "1-arrows", "1-move Chip", "1-2 4 6 8 (keypad)", "1-also move Chip", "1-Q", "1-quit the current game", "1-Bkspc", "1-pause the game", "1-Ctrl-R", "1-restart the current level", "1-Ctrl-P", "1-jump to the previous level", "1-Ctrl-N", "1-jump to the next level", "1-V", "1-decrease volume", "1-Shift-V", "1-increase volume", "1-Ctrl-C", "1-exit the program", "1-Alt-F4", "1-exit the program" }; static tablespec const keyhelp_ingame = { 11, 2, 4, 1, ingame_items }; static char const *twixtgame_items[] = { "1-P", "1-jump to the previous level", "1-N", "1-jump to the next level", "1-PgUp", "1-skip back ten levels", "1-PgDn", "1-skip ahead ten levels", "1-G", "1-go to a level using a password", "1-S", "1-see the scores for each level", "1-Tab", "1-playback saved solution", "1-Shift-Tab", "1-verify saved solution", "1-Ctrl-X", "1-replace existing solution", "1-Shift-Ctrl-X", "1-delete existing solution", "1-Ctrl-S", "1-see the available solution files", "1-O", "1-toggle between even-step and odd-step offset", "1-Shift-O", "1-increment stepping offset (Lynx only)", "1-F", "1-Change initial \"random\" force floor direction (Lynx only)", "1-V", "1-decrease volume", "1-Shift-V", "1-increase volume", "1-Q", "1-return to the file list", "1-Ctrl-C", "1-exit the program", "1-Alt-F4", "1-exit the program" }; static tablespec const keyhelp_twixtgame = { 19, 2, 4, 1, twixtgame_items }; static char const *scorelist_items[] = { "1-up down", "1-move selection", "1-PgUp PgDn", "1-scroll selection", "1-Enter Space", "1-select level", "1-Ctrl-S", "1-change solution file", "1-Q", "1-return to the last level", "1-Ctrl-C", "1-exit the program", "1-Alt-F4", "1-exit the program" }; static tablespec const keyhelp_scorelist = { 7, 2, 4, 1, scorelist_items }; static char const *scroll_items[] = { "1-up down", "1-move selection", "1-PgUp PgDn", "1-scroll selection", "1-Enter Space", "1-select", "1-Q", "1-cancel", "1-Ctrl-C", "1-exit the program", "1-Alt-F4", "1-exit the program" }; static tablespec const keyhelp_scroll = { 6, 2, 4, 1, scroll_items }; static char const *twplusplus_items[] = { "1-Key", "1-Action", "1-arrows", "1-move Chip", "1-2 4 6 8 (keypad)", "1-also move Chip", "1-Esc", "1-stop playing the current level", "1-Bkspc", "1-pause the game", "1-Ctrl-R", "1-restart the current level", "1-Ctrl-P", "1-jump to the previous level", "1-Ctrl-N", "1-jump to the next level", "1-V", "1-decrease volume", "1-Shift-V", "1-increase volume", "2-", "2-Before level playing starts:", "1-Esc", "1-Go back to list of levelsets", "1-P", "1-jump to the previous level", "1-N", "1-jump to the next level", "1-PgUp", "1-skip back ten levels", "1-PgDn", "1-skip ahead ten levels", "1-G", "1-go to a level using a password", "1-S", "1-see the scores for each level", "1-Tab", "1-playback saved solution", "1-Ctrl-I", "1-playback saved solution", "1-Shift-Tab", "1-verify saved solution", "1-Shift-Ctrl-I", "1-verify saved solution", "1-Ctrl-X", "1-replace existing solution", "1-Shift-Ctrl-X", "1-delete existing solution", "1-Ctrl-S", "1-see the available solution files", "1-O", "1-toggle between even-step and odd-step offset", "1-Shift-O", "1-increment stepping offset (Lynx only)", "1-F", "1-Change initial \"random\" force floor direction (Lynx only)", "2-", "2-During solution playback:", "1-PgUp", "1-Go back about 10 seconds", "1-PgDn", "1-Go forward about 10 seconds", "1-D", "1-Toggle display of stepping & initial random FF direction", "1-E", "1-Advance a tick", "1-Shift-E", "1-Advance a move" }; static tablespec const keyhelp_twplusplus = { 34, 2, 4, 1, twplusplus_items }; switch (which) { case KEYHELP_INGAME: return &keyhelp_ingame; case KEYHELP_TWIXTGAMES: return &keyhelp_twixtgame; case KEYHELP_SCORELIST: return &keyhelp_scorelist; case KEYHELP_FILELIST: return &keyhelp_scroll; case KEYHELP_TWPLUSPLUS: return &keyhelp_twplusplus; } return NULL; } tworld-2.3.0/generic/tile.c000066400000000000000000001070751475511570500155700ustar00rootroot00000000000000/* tile.c: Functions for rendering tile images. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include #include #include #include #include "generic.h" #include "../gen.h" #include "../oshw.h" #include "../err.h" #include "../state.h" /* Direction offsets. */ #define _NORTH + 0 #define _WEST + 1 #define _SOUTH + 2 #define _EAST + 3 /* The total number of tile images. */ #define NTILES 128 /* Flags that indicate the size and shape of an oversized * (transparent) tile image. */ #define SIZE_EXTLEFT 0x01 /* image extended leftwards by one tile */ #define SIZE_EXTRIGHT 0x02 /* image extended rightwards by one tile */ #define SIZE_EXTUP 0x04 /* image extended upwards by one tile */ #define SIZE_EXTDOWN 0x08 /* image extended downards by one tile */ #define SIZE_EXTALL 0x0F /* image is 3x3 tiles in size */ /* Structure providing pointers to the various tile images available * for a given id. */ typedef struct tilemap { TW_Surface *opaque[16]; /* one or more opaque images */ TW_Surface *transp[16]; /* one or more transparent images */ char celcount; /* count of animated images */ char transpsize; /* flags for the transparent size */ } tilemap; /* Different types of tile images as stored in the large format bitmap. */ enum { TILEIMG_IMPLICIT = 0, /* tile is not in the bitmap */ TILEIMG_SINGLEOPAQUE, /* a single opaque image */ TILEIMG_OPAQUECELS, /* one or more opaque images */ TILEIMG_TRANSPCELS, /* one or more transparent images */ TILEIMG_CREATURE, /* one of the creature formats */ TILEIMG_ANIMATION /* twelve transparent images */ }; /* Structure indicating where to find the various tile images in a * tile bitmap. The opaque and transp fields give the coordinates of * the tile in the small-format and masked-format bitmaps. For a * large-format bitmap, the ordering of the array determines the order * in which tile images are stored. The shape field defines what sort * of tile image is expected in the large-format bitmap. */ typedef struct tileidinfo { int id; /* the tile ID */ signed char xopaque; /* the coordinates of the opaque image */ signed char yopaque; /* (expressed in tiles, not pixels) */ signed char xtransp; /* coordinates of the transparent image */ signed char ytransp; /* (also expressed in tiles) */ int shape; /* enum values for the free-form bitmap */ } tileidinfo; /* The list of tile images. */ static tileidinfo const tileidmap[NTILES] = { { Empty, 0, 0, -1, -1, TILEIMG_SINGLEOPAQUE }, { Slide_North, 1, 2, -1, -1, TILEIMG_OPAQUECELS }, { Slide_West, 1, 4, -1, -1, TILEIMG_OPAQUECELS }, { Slide_South, 0, 13, -1, -1, TILEIMG_OPAQUECELS }, { Slide_East, 1, 3, -1, -1, TILEIMG_OPAQUECELS }, { Slide_Random, 3, 2, -1, -1, TILEIMG_OPAQUECELS }, { Ice, 0, 12, -1, -1, TILEIMG_OPAQUECELS }, { IceWall_Northwest, 1, 12, -1, -1, TILEIMG_OPAQUECELS }, { IceWall_Northeast, 1, 13, -1, -1, TILEIMG_OPAQUECELS }, { IceWall_Southwest, 1, 11, -1, -1, TILEIMG_OPAQUECELS }, { IceWall_Southeast, 1, 10, -1, -1, TILEIMG_OPAQUECELS }, { Gravel, 2, 13, -1, -1, TILEIMG_OPAQUECELS }, { Dirt, 0, 11, -1, -1, TILEIMG_OPAQUECELS }, { Water, 0, 3, -1, -1, TILEIMG_OPAQUECELS }, { Fire, 0, 4, -1, -1, TILEIMG_OPAQUECELS }, { Bomb, 2, 10, -1, -1, TILEIMG_OPAQUECELS }, { Beartrap, 2, 11, -1, -1, TILEIMG_OPAQUECELS }, { Burglar, 2, 1, -1, -1, TILEIMG_OPAQUECELS }, { HintButton, 2, 15, -1, -1, TILEIMG_OPAQUECELS }, { Button_Blue, 2, 8, -1, -1, TILEIMG_OPAQUECELS }, { Button_Green, 2, 3, -1, -1, TILEIMG_OPAQUECELS }, { Button_Red, 2, 4, -1, -1, TILEIMG_OPAQUECELS }, { Button_Brown, 2, 7, -1, -1, TILEIMG_OPAQUECELS }, { Teleport, 2, 9, -1, -1, TILEIMG_OPAQUECELS }, { Wall, 0, 1, -1, -1, TILEIMG_OPAQUECELS }, { Wall_North, 0, 6, -1, -1, TILEIMG_OPAQUECELS }, { Wall_West, 0, 7, -1, -1, TILEIMG_OPAQUECELS }, { Wall_South, 0, 8, -1, -1, TILEIMG_OPAQUECELS }, { Wall_East, 0, 9, -1, -1, TILEIMG_OPAQUECELS }, { Wall_Southeast, 3, 0, -1, -1, TILEIMG_OPAQUECELS }, { HiddenWall_Perm, 0, 5, -1, -1, TILEIMG_IMPLICIT }, { HiddenWall_Temp, 2, 12, -1, -1, TILEIMG_IMPLICIT }, { BlueWall_Real, 1, 14, -1, -1, TILEIMG_OPAQUECELS }, { BlueWall_Fake, 1, 15, -1, -1, TILEIMG_IMPLICIT }, { SwitchWall_Open, 2, 6, -1, -1, TILEIMG_OPAQUECELS }, { SwitchWall_Closed, 2, 5, -1, -1, TILEIMG_OPAQUECELS }, { PopupWall, 2, 14, -1, -1, TILEIMG_OPAQUECELS }, { CloneMachine, 3, 1, -1, -1, TILEIMG_OPAQUECELS }, { Door_Red, 1, 7, -1, -1, TILEIMG_OPAQUECELS }, { Door_Blue, 1, 6, -1, -1, TILEIMG_OPAQUECELS }, { Door_Yellow, 1, 9, -1, -1, TILEIMG_OPAQUECELS }, { Door_Green, 1, 8, -1, -1, TILEIMG_OPAQUECELS }, { Socket, 2, 2, -1, -1, TILEIMG_OPAQUECELS }, { Exit, 1, 5, -1, -1, TILEIMG_OPAQUECELS }, { ICChip, 0, 2, -1, -1, TILEIMG_OPAQUECELS }, { Key_Red, 6, 5, 9, 5, TILEIMG_TRANSPCELS }, { Key_Blue, 6, 4, 9, 4, TILEIMG_TRANSPCELS }, { Key_Yellow, 6, 7, 9, 7, TILEIMG_TRANSPCELS }, { Key_Green, 6, 6, 9, 6, TILEIMG_TRANSPCELS }, { Boots_Ice, 6, 10, 9, 10, TILEIMG_TRANSPCELS }, { Boots_Slide, 6, 11, 9, 11, TILEIMG_TRANSPCELS }, { Boots_Fire, 6, 9, 9, 9, TILEIMG_TRANSPCELS }, { Boots_Water, 6, 8, 9, 8, TILEIMG_TRANSPCELS }, { Block_Static, 0, 10, -1, -1, TILEIMG_IMPLICIT }, { Overlay_Buffer, 2, 0, -1, -1, TILEIMG_IMPLICIT }, { Exit_Extra_1, 3, 10, -1, -1, TILEIMG_SINGLEOPAQUE }, { Exit_Extra_2, 3, 11, -1, -1, TILEIMG_SINGLEOPAQUE }, { Burned_Chip, 3, 4, -1, -1, TILEIMG_SINGLEOPAQUE }, { Bombed_Chip, 3, 5, -1, -1, TILEIMG_SINGLEOPAQUE }, { Exited_Chip, 3, 9, -1, -1, TILEIMG_SINGLEOPAQUE }, { Drowned_Chip, 3, 3, -1, -1, TILEIMG_SINGLEOPAQUE }, { Swimming_Chip _NORTH, 3, 12, -1, -1, TILEIMG_SINGLEOPAQUE }, { Swimming_Chip _WEST, 3, 13, -1, -1, TILEIMG_SINGLEOPAQUE }, { Swimming_Chip _SOUTH, 3, 14, -1, -1, TILEIMG_SINGLEOPAQUE }, { Swimming_Chip _EAST, 3, 15, -1, -1, TILEIMG_SINGLEOPAQUE }, { Chip _NORTH, 6, 12, 9, 12, TILEIMG_CREATURE }, { Chip _WEST, 6, 13, 9, 13, TILEIMG_IMPLICIT }, { Chip _SOUTH, 6, 14, 9, 14, TILEIMG_IMPLICIT }, { Chip _EAST, 6, 15, 9, 15, TILEIMG_IMPLICIT }, { Pushing_Chip _NORTH, 6, 12, 9, 12, TILEIMG_CREATURE }, { Pushing_Chip _WEST, 6, 13, 9, 13, TILEIMG_IMPLICIT }, { Pushing_Chip _SOUTH, 6, 14, 9, 14, TILEIMG_IMPLICIT }, { Pushing_Chip _EAST, 6, 15, 9, 15, TILEIMG_IMPLICIT }, { Block _NORTH, 0, 14, -1, -1, TILEIMG_CREATURE }, { Block _WEST, 0, 15, -1, -1, TILEIMG_IMPLICIT }, { Block _SOUTH, 1, 0, -1, -1, TILEIMG_IMPLICIT }, { Block _EAST, 1, 1, -1, -1, TILEIMG_IMPLICIT }, { Tank _NORTH, 4, 12, 7, 12, TILEIMG_CREATURE }, { Tank _WEST, 4, 13, 7, 13, TILEIMG_IMPLICIT }, { Tank _SOUTH, 4, 14, 7, 14, TILEIMG_IMPLICIT }, { Tank _EAST, 4, 15, 7, 15, TILEIMG_IMPLICIT }, { Ball _NORTH, 4, 8, 7, 8, TILEIMG_CREATURE }, { Ball _WEST, 4, 9, 7, 9, TILEIMG_IMPLICIT }, { Ball _SOUTH, 4, 10, 7, 10, TILEIMG_IMPLICIT }, { Ball _EAST, 4, 11, 7, 11, TILEIMG_IMPLICIT }, { Glider _NORTH, 5, 0, 8, 0, TILEIMG_CREATURE }, { Glider _WEST, 5, 1, 8, 1, TILEIMG_IMPLICIT }, { Glider _SOUTH, 5, 2, 8, 2, TILEIMG_IMPLICIT }, { Glider _EAST, 5, 3, 8, 3, TILEIMG_IMPLICIT }, { Fireball _NORTH, 4, 4, 7, 4, TILEIMG_CREATURE }, { Fireball _WEST, 4, 5, 7, 5, TILEIMG_IMPLICIT }, { Fireball _SOUTH, 4, 6, 7, 6, TILEIMG_IMPLICIT }, { Fireball _EAST, 4, 7, 7, 7, TILEIMG_IMPLICIT }, { Bug _NORTH, 4, 0, 7, 0, TILEIMG_CREATURE }, { Bug _WEST, 4, 1, 7, 1, TILEIMG_IMPLICIT }, { Bug _SOUTH, 4, 2, 7, 2, TILEIMG_IMPLICIT }, { Bug _EAST, 4, 3, 7, 3, TILEIMG_IMPLICIT }, { Paramecium _NORTH, 6, 0, 9, 0, TILEIMG_CREATURE }, { Paramecium _WEST, 6, 1, 9, 1, TILEIMG_IMPLICIT }, { Paramecium _SOUTH, 6, 2, 9, 2, TILEIMG_IMPLICIT }, { Paramecium _EAST, 6, 3, 9, 3, TILEIMG_IMPLICIT }, { Teeth _NORTH, 5, 4, 8, 4, TILEIMG_CREATURE }, { Teeth _WEST, 5, 5, 8, 5, TILEIMG_IMPLICIT }, { Teeth _SOUTH, 5, 6, 8, 6, TILEIMG_IMPLICIT }, { Teeth _EAST, 5, 7, 8, 7, TILEIMG_IMPLICIT }, { Blob _NORTH, 5, 12, 8, 12, TILEIMG_CREATURE }, { Blob _WEST, 5, 13, 8, 13, TILEIMG_IMPLICIT }, { Blob _SOUTH, 5, 14, 8, 14, TILEIMG_IMPLICIT }, { Blob _EAST, 5, 15, 8, 15, TILEIMG_IMPLICIT }, { Walker _NORTH, 5, 8, 8, 8, TILEIMG_CREATURE }, { Walker _WEST, 5, 9, 8, 9, TILEIMG_IMPLICIT }, { Walker _SOUTH, 5, 10, 8, 10, TILEIMG_IMPLICIT }, { Walker _EAST, 5, 11, 8, 11, TILEIMG_IMPLICIT }, { Water_Splash, 3, 3, -1, -1, TILEIMG_ANIMATION }, { Bomb_Explosion, 3, 6, -1, -1, TILEIMG_ANIMATION }, { Entity_Explosion, 3, 7, -1, -1, TILEIMG_ANIMATION } }; /* The heap of remembered surfaces. */ static TW_Surface **surfaceheap = NULL; static int surfacesused = 0; static int surfacesallocated = 0; /* The directory of tile images. */ static tilemap tileptr[NTILES]; /* An internal buffer surface. */ static TW_Surface *opaquetile = NULL; /* Add the given surface to the heap of remembered surfaces. */ static void remembersurface(TW_Surface *surface) { if (surfacesused >= surfacesallocated) { surfacesallocated += 256; x_alloc(surfaceheap, surfacesallocated * sizeof *surfaceheap); } surfaceheap[surfacesused++] = surface; } /* Free all surfaces on the heap. */ static void freerememberedsurfaces(void) { int n; for (n = 0 ; n < surfacesused ; ++n) if (surfaceheap[n]) TW_FreeSurface(surfaceheap[n]); free(surfaceheap); surfaceheap = NULL; surfacesused = 0; surfacesallocated = 0; } /* Set the size of one tile. FALSE is returned if the dimensions are * invalid. */ static int settilesize(int w, int h) { if (w % 4 || h % 4) { warn("tile dimensions must be divisible by four"); return FALSE; } geng.wtile = w; geng.htile = h; geng.cptile = w * h; opaquetile = TW_NewSurface(w, h, FALSE); remembersurface(opaquetile); return TRUE; } /* * Functions for using tile images. */ /* Overlay a transparent tile image into the given tile-sized buffer. * index supplies the index of the transparent image. */ static void addtransparenttile(TW_Surface *dest, int id, int index) { TW_Surface *src; TW_Rect rect = { 0, 0, geng.wtile, geng.htile }; src = tileptr[id].transp[index]; if (tileptr[id].transpsize & SIZE_EXTLEFT) rect.x += geng.wtile; if (tileptr[id].transpsize & SIZE_EXTUP) rect.y += geng.htile; TW_BlitSurface(src, &rect, dest, NULL); } /* Return a surface for the given creature or animation. rect is * assumed to point to an "integral" tile location, so if moving is * non-zero, the dir and moving values are used to adjust rect to * point to the exact mid-tile position. rect is also adjusted * appropriately when the creature's image is larger than a single * tile. */ static TW_Surface *getcreatureimage(TW_Rect *rect, int id, int dir, int moving, int frame) { TW_Surface *s; tilemap const *q; int n; if (!rect) die("getcreatureimage() called without a rect"); q = tileptr + id; if (!isanimation(id)) q += diridx(dir); if (!q->transpsize || isanimation(id)) { if (moving > 0) { switch (dir) { case NORTH: rect->y += moving * geng.htile / 8; break; case WEST: rect->x += moving * geng.wtile / 8; break; case SOUTH: rect->y -= moving * geng.htile / 8; break; case EAST: rect->x -= moving * geng.wtile / 8; break; } } } if (q->transpsize) { if (q->transpsize & SIZE_EXTLEFT) rect->x -= geng.wtile; if (q->transpsize & SIZE_EXTUP) rect->y -= geng.htile; } n = q->celcount > 1 ? frame : 0; if (n >= q->celcount) die("requested cel #%d from a %d-cel sequence (%d+%d)", n, q->celcount, id, diridx(dir)); s = q->transp[n] ? q->transp[n] : q->opaque[n]; rect->w = s->w; rect->h = s->h; return s; } /* Return an image of a cell with the given tiles. If the top tile is * transparent, the appropriate composite image is constructed in the * overlay buffer. (If the top tile is opaque but has transparent * pixels, the image returned is constructed in a private surface). If * rect is not NULL, the width and height fields are filled in. */ static TW_Surface *getcellimage(TW_Rect *rect, int top, int bot, int timerval) { TW_Surface *dest; int nt, nb; if (!tileptr[top].celcount) die("map element %02X has no suitable image", top); if (rect) { rect->w = geng.wtile; rect->h = geng.htile; } nt = (timerval + 1) % tileptr[top].celcount; if (bot == Nothing || bot == Empty || !tileptr[top].transp[0]) { if (tileptr[top].opaque[nt]) return tileptr[top].opaque[nt]; TW_BlitSurface(tileptr[Empty].opaque[0], NULL, opaquetile, NULL); addtransparenttile(opaquetile, top, nt); return opaquetile; } if (!tileptr[bot].celcount) die("map element %02X has no suitable image", bot); nb = (timerval + 1) % tileptr[bot].celcount; dest = tileptr[Overlay_Buffer].opaque[0]; if (tileptr[bot].opaque[nb]) { TW_BlitSurface(tileptr[bot].opaque[nb], NULL, dest, NULL); } else { TW_BlitSurface(tileptr[Empty].opaque[0], NULL, dest, NULL); addtransparenttile(dest, bot, nb); } addtransparenttile(dest, top, nt); return dest; } /* Get a generic tile image. */ #define gettileimage(id) (getcellimage(NULL, (id), Empty, -1)) /* * Tile rendering functions. */ /* Copy a single tile to the position (xpos, ypos). */ static void drawfulltile(TW_Surface *dest, int xpos, int ypos, TW_Surface *src) { TW_Rect rect = { xpos, ypos, src->w, src->h }; if (TW_BlitSurface(src, NULL, dest, &rect)) warn("%s", TW_GetError()); } /* Draw a tile of the given id at the position (xpos, ypos). */ static void _drawfulltileid(TW_Surface *dest, int xpos, int ypos, int id) { drawfulltile(dest, xpos, ypos, gettileimage(id)); } /* Copy a tile to the position (xpos, ypos) but clipped to the * displayloc rectangle. */ static void drawclippedtile(TW_Rect const *rect, TW_Surface *src, TW_Rect displayloc) { int xoff, yoff, w, h; xoff = 0; if (rect->x < displayloc.x) xoff = displayloc.x - rect->x; yoff = 0; if (rect->y < displayloc.y) yoff = displayloc.y - rect->y; w = rect->w - xoff; if (rect->x + rect->w > displayloc.x + displayloc.w) w -= (rect->x + rect->w) - (displayloc.x + displayloc.w); h = rect->h - yoff; if (rect->y + rect->h > displayloc.y + displayloc.h) h -= (rect->y + rect->h) - (displayloc.y + displayloc.h); if (w <= 0 || h <= 0) return; { TW_Rect srect = { xoff, yoff, w, h }; TW_Rect drect = { rect->x + xoff, rect->y + yoff, 0, 0 }; if (TW_BlitSurface(src, &srect, geng.screen, &drect)) warn("%s", TW_GetError()); } } extern int pedanticmode; /* Render the view of the visible area of the map to the display, with * the view position centered on the display as much as possible. The * gamestate's map and the list of creatures are consulted to * determine what to render. */ static void _displaymapview(gamestate const *state, TW_Rect displayloc) { TW_Rect rect; TW_Surface *s; creature const *cr; int xdisppos, ydisppos; int xorigin, yorigin; int lmap, tmap, rmap, bmap; int pos, x, y; xdisppos = state->xviewpos / 2 - (NXTILES / 2) * 4; ydisppos = state->yviewpos / 2 - (NYTILES / 2) * 4; if (xdisppos < 0) xdisppos = 0; if (ydisppos < 0) ydisppos = 0; if (xdisppos > (CXGRID - NXTILES) * 4) xdisppos = (CXGRID - NXTILES) * 4; if (ydisppos > (CYGRID - NYTILES) * 4) ydisppos = (CYGRID - NYTILES) * 4; xorigin = displayloc.x - (xdisppos * geng.wtile / 4); yorigin = displayloc.y - (ydisppos * geng.htile / 4); geng.mapvieworigin = ydisppos * CXGRID * 4 + xdisppos; lmap = xdisppos / 4; tmap = ydisppos / 4; rmap = (xdisppos + 3) / 4 + NXTILES; bmap = (ydisppos + 3) / 4 + NYTILES; for (y = tmap ; y < bmap ; ++y) { if (y < 0 || y >= CXGRID) continue; for (x = lmap ; x < rmap ; ++x) { if (x < 0 || x >= CXGRID) continue; pos = y * CXGRID + x; rect.x = xorigin + x * geng.wtile; rect.y = yorigin + y * geng.htile; s = getcellimage(&rect, state->map[pos].top.id, state->map[pos].bot.id, (state->statusflags & SF_NOANIMATION) ? -1 : state->currenttime); drawclippedtile(&rect, s, displayloc); } } lmap -= 2; tmap -= 2; rmap += 2; bmap += 2; for (cr = state->creatures ; cr->id ; ++cr) { if (pedanticmode) { if (cr->id == Ball && state->map[cr->pos].top.id == HintButton) continue; } if (cr->hidden) continue; x = cr->pos % CXGRID; y = cr->pos / CXGRID; if (x < lmap || x >= rmap || y < tmap || y >= bmap) continue; rect.x = xorigin + x * geng.wtile; rect.y = yorigin + y * geng.htile; s = getcreatureimage(&rect, cr->id, cr->dir, cr->moving, cr->frame); drawclippedtile(&rect, s, displayloc); } } /* * Functions for copying individual tiles. */ /* Create a new surface containing a single tile without any * transparent pixels. */ static TW_Surface *extractopaquetile(TW_Surface *src, int ximg, int yimg, int wimg, int himg) { TW_Surface *dest; TW_Rect rect; rect.x = ximg; rect.y = yimg; rect.w = wimg; rect.h = himg; dest = TW_NewSurface(rect.w, rect.h, FALSE); TW_BlitSurface(src, &rect, dest, NULL); return dest; } /* Create a new surface containing a single tile with transparent * pixels, as indicated by the given color key. */ static TW_Surface *extractkeyedtile(TW_Surface *src, int ximg, int yimg, int wimg, int himg, uint32_t transpclr) { TW_Surface *dest; TW_Surface *temp; TW_Rect rect; dest = TW_NewSurface(wimg, himg, TRUE); TW_FillRect(dest, NULL, TW_MapRGBA(dest, 0, 0, 0, TW_ALPHA_TRANSPARENT)); TW_SetColorKey(src, transpclr); rect.x = ximg; rect.y = yimg; rect.w = dest->w; rect.h = dest->h; TW_BlitSurface(src, &rect, dest, NULL); TW_ResetColorKey(src); temp = dest; dest = TW_DisplayFormatAlpha(temp); TW_FreeSurface(temp); if (!dest) die("%s", TW_GetError()); TW_EnableAlpha(dest); return dest; } /* Create a new surface containing a single tile. Pixels with the * given transparent color are replaced with the corresponding pixels * from the empty tile. */ static TW_Surface *extractemptytile(TW_Surface *src, int ximg, int yimg, int wimg, int himg, uint32_t transpclr) { TW_Surface *dest; TW_Surface *temp; TW_Rect rect; dest = TW_NewSurface(wimg, himg, FALSE); if (tileptr[Empty].opaque[0]) TW_BlitSurface(tileptr[Empty].opaque[0], NULL, dest, NULL); TW_SetColorKey(src, transpclr); rect.x = ximg; rect.y = yimg; rect.w = dest->w; rect.h = dest->h; TW_BlitSurface(src, &rect, dest, NULL); TW_ResetColorKey(src); temp = dest; dest = TW_DisplayFormat(temp); TW_FreeSurface(temp); if (!dest) die("%s", TW_GetError()); return dest; } /* Create a new surface containing a single tile with transparent * pixels, as indicated by the mask tile. */ static TW_Surface *extractmaskedtile(TW_Surface *src, int ximg, int yimg, int wimg, int himg, int xmask, int ymask) { TW_Surface *dest; TW_Surface *temp; TW_Rect rect; unsigned char *s, *d; uint32_t transp, black; int x, y; rect.x = ximg; rect.y = yimg; rect.w = wimg; rect.h = himg; dest = TW_NewSurface(rect.w, rect.h, TRUE); TW_BlitSurface(src, &rect, dest, NULL); black = TW_MapRGB(src, 0, 0, 0); transp = TW_MapRGBA(dest, 0, 0, 0, TW_ALPHA_TRANSPARENT); if (TW_MUSTLOCK(src)) TW_LockSurface(src); if (TW_MUSTLOCK(dest)) TW_LockSurface(dest); d = (uint8_t*)dest->pixels; s = (uint8_t*)src->pixels + ymask * src->pitch + xmask * TW_BytesPerPixel(src); for (y = 0 ; y < dest->h ; ++y) { for (x = 0 ; x < dest->w ; ++x) { if (TW_PixelAt(src, xmask + x, ymask + y) == black) ((uint32_t*)d)[x] = transp; } s += src->pitch; d += dest->pitch; } if (TW_MUSTLOCK(src)) TW_UnlockSurface(src); if (TW_MUSTLOCK(dest)) TW_UnlockSurface(dest); temp = dest; dest = TW_DisplayFormatAlpha(temp); TW_FreeSurface(temp); if (!dest) die("%s", TW_GetError()); TW_EnableAlpha(dest); return dest; } /* * Reading the small format. */ /* Transfer the tiles to the tileptr array, using tileidmap to * identify and locate the individual tile images. Any magenta pixels * in tiles that are allowed to have transparencies are made * transparent. */ static int initsmalltileset(TW_Surface *tiles) { TW_Surface *s; uint32_t magenta; int id, n; magenta = TW_MapRGB(tiles, 255, 0, 255); for (n = 0 ; n < (int)(sizeof tileidmap / sizeof *tileidmap) ; ++n) { id = tileidmap[n].id; tileptr[id].opaque[0] = NULL; tileptr[id].transp[0] = NULL; tileptr[id].celcount = 0; tileptr[id].transpsize = 0; if (tileidmap[n].xtransp >= 0) { s = extractkeyedtile(tiles, tileidmap[n].xopaque * geng.wtile, tileidmap[n].yopaque * geng.htile, geng.wtile, geng.htile, magenta); if (!s) return FALSE; remembersurface(s); tileptr[id].celcount = 1; tileptr[id].opaque[0] = NULL; tileptr[id].transp[0] = s; } else if (tileidmap[n].xopaque >= 0) { s = extractopaquetile(tiles, tileidmap[n].xopaque * geng.wtile, tileidmap[n].yopaque * geng.htile, geng.wtile, geng.htile); if (!s) return FALSE; remembersurface(s); tileptr[id].celcount = 1; tileptr[id].opaque[0] = s; tileptr[id].transp[0] = NULL; } } return TRUE; } /* * Reading the masked format. */ /* Individually transfer the tiles to a one-dimensional array. The * black pixels in the maskimage are copied onto the indicated section * as transparent pixels. Then fill in the values of the tileptr * array, using tileidmap to identify the individual tile images. */ static int initmaskedtileset(TW_Surface *tiles) { TW_Surface *s; int id, n; for (n = 0 ; n < (int)(sizeof tileidmap / sizeof *tileidmap) ; ++n) { id = tileidmap[n].id; tileptr[id].celcount = 0; tileptr[id].opaque[0] = NULL; tileptr[id].transp[0] = NULL; tileptr[id].transpsize = 0; if (tileidmap[n].xopaque >= 0) { s = extractopaquetile(tiles, tileidmap[n].xopaque * geng.wtile, tileidmap[n].yopaque * geng.htile, geng.wtile, geng.htile); if (!s) return FALSE; remembersurface(s); tileptr[id].celcount = 1; tileptr[id].opaque[0] = s; } if (tileidmap[n].xtransp >= 0) { s = extractmaskedtile(tiles, tileidmap[n].xtransp * geng.wtile, tileidmap[n].ytransp * geng.htile, geng.wtile, geng.htile, (tileidmap[n].xtransp + 3) * geng.wtile, tileidmap[n].ytransp * geng.htile); if (!s) return FALSE; remembersurface(s); tileptr[id].celcount = 1; tileptr[id].transp[0] = s; } } return TRUE; } /* * Reading the large format. */ /* Copy a sequence of count tiles from the given surface at the * position indicated by rect into separate surfaces, stored in the * array at ptrs. transpclr indicates the color of the pixels to * replace with the corresponding pixels from the Empty tile. */ static int extractopaquetileseq(TW_Surface *tiles, TW_Rect const *rect, int count, TW_Surface **ptrs, uint32_t transpclr) { int x, n; for (n = 0, x = rect->x ; n < count ; ++n, x += rect->w) { ptrs[n] = extractemptytile(tiles, x, rect->y, rect->w, rect->h, transpclr); if (!ptrs[n]) return FALSE; remembersurface(ptrs[n]); } return TRUE; } /* Copy a sequence of count tiles from the given surface at the * position indicated by rect into separate surfaces, stored in the * array at ptrs. transpclr indicates the color of the pixels to make * transparent. */ static int extracttransptileseq(TW_Surface *tiles, TW_Rect const *rect, int count, TW_Surface** ptrs, uint32_t transpclr) { int x, n; for (n = count - 1, x = rect->x ; n >= 0 ; --n, x += rect->w) { ptrs[n] = extractkeyedtile(tiles, x, rect->y, rect->w, rect->h, transpclr); if (!ptrs[n]) return FALSE; remembersurface(ptrs[n]); } return TRUE; } /* Extract the tile images for a single tile type from the given * surface at the given coordinates. shape identifies the arrangement * of tile image(s) that may be present. transpclr indicates the color * of the pixels that are to be treated as transparent. pd points to a * pointer to the buffer where the tile images are to be copied. Upon * return, the pointer at pd is updated to point to the first byte in * the buffer after the copied tile images. */ static int extracttileimage(TW_Surface *tiles, int x, int y, int w, int h, int id, int shape, uint32_t transpclr) { TW_Rect rect; int n; rect.x = x; rect.y = y; rect.w = geng.wtile; rect.h = geng.htile; switch (shape) { case TILEIMG_SINGLEOPAQUE: if (h != 1 || w != 1) { warn("outsized single tiles not permitted (%02X=%dx%d)", id, w, h); return FALSE; } tileptr[id].transpsize = 0; tileptr[id].celcount = 1; extractopaquetileseq(tiles, &rect, 1, tileptr[id].opaque, transpclr); break; case TILEIMG_OPAQUECELS: if (h != 1) { warn("outsized map tiles not permitted (%02X=%dx%d)", id, w, h); return FALSE; } tileptr[id].transpsize = 0; tileptr[id].celcount = w; extractopaquetileseq(tiles, &rect, w, tileptr[id].opaque, transpclr); break; case TILEIMG_TRANSPCELS: if (h != 1) { warn("outsized map tiles not permitted (%02X=%dx%d)", id, w, h); return FALSE; } tileptr[id].transpsize = 0; tileptr[id].celcount = w; extracttransptileseq(tiles, &rect, w, tileptr[id].transp, transpclr); break; case TILEIMG_ANIMATION: if (h == 2 || (h == 3 && w % 3 != 0)) { warn("off-center animation not permitted (%02X=%dx%d)", id, w, h); return FALSE; } if (h == 3) { tileptr[id].transpsize = SIZE_EXTALL; tileptr[id].celcount = w / 3; rect.w = 3 * geng.wtile; rect.h = 3 * geng.htile; } else { tileptr[id].transpsize = 0; tileptr[id].celcount = w; rect.w = geng.wtile; rect.h = geng.htile; } extracttransptileseq(tiles, &rect, tileptr[id].celcount, tileptr[id].transp, transpclr); if (tileptr[id].celcount < 12) { for (n = 11 ; n >= 0 ; --n) tileptr[id].transp[n] = tileptr[id].transp[(n * tileptr[id].celcount) / 12]; tileptr[id].celcount = 12; } break; case TILEIMG_CREATURE: if (h == 1) { if (w == 1) { tileptr[id].transpsize = 0; tileptr[id].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id].transp, transpclr); tileptr[id + 1] = tileptr[id]; tileptr[id + 2] = tileptr[id]; tileptr[id + 3] = tileptr[id]; } else if (w == 2) { tileptr[id].transpsize = 0; tileptr[id].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id].transp, transpclr); rect.x += geng.wtile; tileptr[id + 1].transpsize = 0; tileptr[id + 1].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id + 1].transp, transpclr); tileptr[id + 2] = tileptr[id]; tileptr[id + 3] = tileptr[id + 1]; } else if (w == 4) { for (n = 0 ; n < 4 ; ++n) { tileptr[id + n].transpsize = 0; tileptr[id + n].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id + n].transp, transpclr); rect.x += geng.wtile; } } else { warn("invalid packing of creature tiles (%02X=%dx%d)", id, w, h); return FALSE; } } else if (h == 2) { if (w == 1) { tileptr[id].transpsize = 0; tileptr[id].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id].transp, transpclr); tileptr[id + 1].transpsize = 0; tileptr[id + 1].celcount = 1; rect.y += geng.htile; extracttransptileseq(tiles, &rect, 1, tileptr[id + 1].transp, transpclr); tileptr[id + 2] = tileptr[id]; tileptr[id + 3] = tileptr[id + 1]; } else if (w == 2) { tileptr[id].transpsize = 0; tileptr[id].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id].transp, transpclr); rect.x += geng.wtile; tileptr[id + 1].transpsize = 0; tileptr[id + 1].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id + 1].transp, transpclr); rect.x -= geng.wtile; rect.y += geng.htile; tileptr[id + 2].transpsize = 0; tileptr[id + 2].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id + 2].transp, transpclr); rect.x += geng.wtile; tileptr[id + 3].transpsize = 0; tileptr[id + 3].celcount = 1; extracttransptileseq(tiles, &rect, 1, tileptr[id + 3].transp, transpclr); } else if (w == 8) { tileptr[id].transpsize = 0; tileptr[id].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id].transp, transpclr); rect.x += 4 * geng.wtile; tileptr[id + 1].transpsize = 0; tileptr[id + 1].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 1].transp, transpclr); rect.x -= 4 * geng.wtile; rect.y += geng.htile; tileptr[id + 2].transpsize = 0; tileptr[id + 2].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 2].transp, transpclr); rect.x += 4 * geng.wtile; tileptr[id + 3].transpsize = 0; tileptr[id + 3].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 3].transp, transpclr); } else if (w == 16) { rect.w = geng.wtile; rect.h = 2 * geng.htile; tileptr[id].transpsize = SIZE_EXTDOWN; tileptr[id].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id].transp, transpclr); rect.x += 4 * geng.wtile; tileptr[id + 2].transpsize = SIZE_EXTUP; tileptr[id + 2].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 2].transp, transpclr); rect.x += 4 * geng.wtile; rect.w = 2 * geng.wtile; rect.h = geng.htile; tileptr[id + 1].transpsize = SIZE_EXTRIGHT; tileptr[id + 1].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 1].transp, transpclr); rect.y += geng.htile; tileptr[id + 3].transpsize = SIZE_EXTLEFT; tileptr[id + 3].celcount = 4; extracttransptileseq(tiles, &rect, 4, tileptr[id + 3].transp, transpclr); } else { warn("invalid packing of creature tiles (%02X=%dx%d)", id, w, h); return FALSE; } } else { warn("invalid packing of creature tiles (%02X=%dx%d)", id, w, h); return FALSE; } break; } return TRUE; } /* Extract the large-format tile images from the given surface. The * surface is scanned to find the delimiter pixels. Upon return, the * pointers to each tile image is stored in the appropriate field of * the tileptr array. */ static int initlargetileset(TW_Surface *tiles) { TW_Rect *tilepos = NULL; uint32_t transpclr; int row, nextrow; int n, x, y, w, h; if (TW_MUSTLOCK(tiles)) TW_LockSurface(tiles); transpclr = TW_PixelAt(tiles, 1, 0); for (w = 1 ; w < tiles->w ; ++w) if (TW_PixelAt(tiles, w, 0) != transpclr) break; if (w == tiles->w) { warn("Can't find tile separators"); return FALSE; } if (w % 4 != 0) { warn("Tiles must have a width divisible by 4."); return FALSE; } for (h = 1 ; h < tiles->h ; ++h) if (TW_PixelAt(tiles, 0, h) != transpclr) break; --h; if (h % 4 != 0) { warn("Tiles must have a height divisible by 4."); return FALSE; } if (!settilesize(w, h)) return FALSE; x_alloc(tilepos, (sizeof tileidmap / sizeof *tileidmap) * sizeof *tilepos); row = 0; nextrow = geng.htile + 1; h = 1; x = 0; y = 0; for (n = 0 ; n < (int)(sizeof tileidmap / sizeof *tileidmap) ; ++n) { if (tileidmap[n].shape == TILEIMG_IMPLICIT) continue; findwidth: w = 0; for (;;) { ++w; if (x + w * geng.wtile >= tiles->w) { w = 0; break; } if (TW_PixelAt(tiles, x + w * geng.wtile, row) != transpclr) break; } if (!w) { row = nextrow; ++nextrow; y += 1 + h * geng.htile; h = 0; do { ++h; if (y + h * geng.htile >= tiles->h) { h = 0; break; } nextrow += geng.htile; } while (TW_PixelAt(tiles, 0, nextrow) == transpclr); if (!h) { warn("incomplete tile set: missing %02X", tileidmap[n].id); goto failure; } x = 0; goto findwidth; } tilepos[n].x = x + 1; tilepos[n].y = y + 1; tilepos[n].w = w; tilepos[n].h = h; x += w * geng.wtile; } if (TW_MUSTLOCK(tiles)) TW_UnlockSurface(tiles); tileptr[Empty].transpsize = 0; tileptr[Empty].celcount = 1; tileptr[Empty].opaque[0] = extractopaquetile(tiles, 1, 1, geng.wtile, geng.htile); tileptr[Empty].transp[0] = NULL; remembersurface(tileptr[Empty].opaque[0]); for (n = 1 ; n < (int)(sizeof tileidmap / sizeof *tileidmap) ; ++n) { if (tileidmap[n].shape == TILEIMG_IMPLICIT) continue; if (!extracttileimage(tiles, tilepos[n].x, tilepos[n].y, tilepos[n].w, tilepos[n].h, tileidmap[n].id, tileidmap[n].shape, transpclr)) goto failure; } extracttileimage(tiles, 1, 1, 1, 1, Overlay_Buffer, TILEIMG_SINGLEOPAQUE, transpclr); tileptr[Block_Static].celcount = 1; tileptr[Block_Static].opaque[0] = tileptr[Block].transp[0]; tileptr[Block_Static].transp[0] = NULL; tileptr[HiddenWall_Perm] = tileptr[Empty]; tileptr[HiddenWall_Temp] = tileptr[Empty]; tileptr[BlueWall_Fake] = tileptr[BlueWall_Real]; free(tilepos); return TRUE; failure: freetileset(); free(tilepos); return FALSE; } /* * The exported functions. */ /* Free all memory allocated for the current set of tile images. */ void freetileset(void) { int m, n; for (n = 0 ; n < (int)(sizeof tileptr / sizeof *tileptr) ; ++n) { tileptr[n].celcount = 0; tileptr[n].transpsize = 0; for (m = 0 ; m < 16 ; ++m) { tileptr[n].opaque[m] = NULL; tileptr[n].transp[m] = NULL; } } geng.wtile = 0; geng.htile = 0; geng.cptile = 0; opaquetile = NULL; freerememberedsurfaces(); } /* Load the set of tile images stored in the given bitmap. Error * messages will be displayed if complain is TRUE. The return value is * TRUE if the tiles were successfully identified and loaded into * memory. */ int loadtileset(char const *filename, int complain) { TW_Surface *tiles = NULL; int f, w, h; tiles = TW_LoadBMP(filename, TRUE); if (!tiles) { if (complain) errmsg(filename, "cannot read bitmap: %s", TW_GetError()); return FALSE; } if (tiles->w % 2 != 0) { freetileset(); f = initlargetileset(tiles); } else if (tiles->w % 13 == 0 && tiles->h % 16 == 0) { w = tiles->w / 13; h = tiles->h / 16; freetileset(); f = settilesize(w, h) && initmaskedtileset(tiles); } else if (tiles->w % 7 == 0 && tiles->h % 16 == 0) { w = tiles->w / 7; h = tiles->h / 16; freetileset(); f = settilesize(w, h) && initsmalltileset(tiles); } else { if (complain) errmsg(filename, "image file has invalid dimensions (%dx%d)", tiles->w, tiles->h); f = FALSE; } TW_FreeSurface(tiles); return f; } /* Initialization. */ int _generictileinitialize(void) { geng.mapvieworigin = -1; geng.displaymapviewfunc = _displaymapview; geng.drawfulltileidfunc = _drawfulltileid; return TRUE; } tworld-2.3.0/generic/timer.c000066400000000000000000000056141475511570500157470ustar00rootroot00000000000000/* timer.c: Game timing functions. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include #include #include "../gen.h" #include "../oshw.h" #include "generic.h" /* By default, a second of game time lasts for 1000 milliseconds of * real time. */ static int mspertick = 1000 / TICKS_PER_SECOND; /* The tick counter. */ static int utick = 0; /* The time of the next tick. */ static int nexttickat = 0; /* A histogram of how many milliseconds the program spends sleeping * per tick. */ static int showhistogram = FALSE; static unsigned hist[100]; /* Set the length (in real time) of a second of game time. A value of * zero selects the default length of one second. */ void settimersecond(int ms) { mspertick = (ms ? ms : 1000) / TICKS_PER_SECOND; } /* Change the current timer setting. If action is positive, the timer * is started (or resumed). If action is negative, the timer is * stopped if it is running and the counter is reset to zero. If * action is zero, the timer is stopped if it is running, and the * counter remains at its current setting. */ void settimer(int action) { if (action < 0) { nexttickat = 0; utick = 0; } else if (action > 0) { if (nexttickat < 0) nexttickat = TW_GetTicks() - nexttickat; else nexttickat = TW_GetTicks() + mspertick; } else { if (nexttickat > 0) nexttickat = TW_GetTicks() - nexttickat; } } /* Return the number of ticks since the timer was last reset. */ int gettickcount(void) { return (int)utick; } /* Put the program to sleep until the next timer tick. If we've * already missed a timer tick, then wait for the next one. */ int waitfortick(void) { int ms; ms = nexttickat - TW_GetTicks(); if (showhistogram) if (ms < (int)(sizeof hist / sizeof *hist)) ++hist[ms >= 0 ? ms + 1 : 0]; if (ms <= 0) { ++utick; nexttickat += mspertick; return FALSE; } while (ms < 0) ms += mspertick; TW_Delay(ms); ++utick; nexttickat += mspertick; return TRUE; } /* Move to the next timer tick without waiting. */ int advancetick(void) { return ++utick; } /* At shutdown time, display the histogram data on stdout. */ static void shutdown(void) { unsigned long n; int i; settimer(-1); if (showhistogram) { n = 0; for (i = 0 ; i < (int)(sizeof hist / sizeof *hist) ; ++i) n += hist[i]; if (n) { printf("Histogram of idle time (ms/tick)\n"); if (hist[0]) printf("NEG: %.1f%%\n", (hist[0] * 100.0) / n); for (i = 1 ; i < (int)(sizeof hist / sizeof *hist) ; ++i) if (hist[i]) printf("%3d: %.1f%%\n", i - 1, (hist[i] * 100.0) / n); } } } /* Initialize and reset the timer. */ int _generictimerinitialize(int _showhistogram) { showhistogram = _showhistogram; atexit(shutdown); settimer(-1); return TRUE; } tworld-2.3.0/help.c000066400000000000000000000276401475511570500141460ustar00rootroot00000000000000/* help.c: Displaying online help. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include #include "defs.h" #include "err.h" #include "state.h" #include "oshw.h" #include "ver.h" #include "comptime.h" #include "help.h" #define COUNTOF(a) (sizeof(a) / sizeof(*a)) #define ARRAY(a) a, COUNTOF(a) /* Help for command-line options. */ static char const *yowzitch_items[] = { "1-Usage:", "1!tworld [-hvVdlsbtpqrPFa] [-n N] [-DLRS DIR] " "[NAME] [SNAME] [LEVEL]", "1- -D", "1!Read data files from DIR instead of the default.", "1- -L", "1!Read level sets from DIR instead of the default.", "1- -R", "1!Read resource files from DIR instead of the default.", "1- -S", "1!Save games and settings in DIR instead of the default.", "1- -p", "1!Disable password checking.", "1- -F", "1!Run in fullscreen mode.", "1- -q", "1!Run quietly.", "1- -r", "1!Run in read-only mode; solutions will not be saved.", "1- -P", "1!Put Lynx ruleset emulation in pedantic mode.", "1- -n", "1!Set initial volume level to N.", "1- -a", "1!Double the size of the sound buffer (can be repeated).", "1- -l", "1!Display the list of available data files and exit.", "1- -s", "1!Display scores for the selected data file and exit.", "1- -t", "1!Display times for the selected data file and exit.", "1- -b", "1!Batch-verify solutions for the selected data file and exit.", "1- -h", "1!Display this help and exit.", "1- -d", "1!Display default directories and exit.", "1- -v", "1!Display version number and exit.", "1- -V", "1!Display version and license information and exit.", "2!NAME specifies which data file to use.", "2!LEVEL specifies which level to start at.", "2!SNAME specifies an alternate solution file." }; static tablespec const yowzitch_table = { 23, 2, 2, -1, yowzitch_items }; tablespec const *yowzitch = &yowzitch_table; /* Version and license information. */ static char const *vourzhon_items[] = { "1+*", "1-Tile World: version " VERSION, "1+", "1-Copyright (c) 2001-2024 by Brian Raiter, Madhav Shanbhag, " "Eric Schmidt, Michael Hansen, ChosenID, David Stolp, " "A Sickly Silver Moon, G lander, and Eevee", "1+", "1-compiled " COMPILE_TIME, "1+*", "1!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.", "1+*", "1!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.", "1+*", "1!Bug reports are appreciated, and can be submitted at " "https://github.com/SicklySilverMoon/tworld/issues." }; static tablespec const vourzhon_table = { 6, 2, 1, -1, vourzhon_items }; tablespec const *vourzhon = &vourzhon_table; /* Descriptions of the different surfaces of the levels. */ static tiletablerow const help_floors[] = { { TRUE, Fire, 0, "Fire is fatal unless Chip has fire boots." }, { TRUE, Water, 0, "Chip drowns in Water without water boots." }, { TRUE, Ice, 0, "Chip slides across Ice without ice boots." }, { TRUE, Slide_East, 0, "Force floors push Chip along unless he has the force boots." }, { TRUE, Gravel, 0, "Gravel is safe to walk on, and no one but Chip can touch it." }, { TRUE, Dirt, 0, "Chip is also the only one that can walk on Dirt, but it" " turns into a normal floor when he steps on it." } }; /* Descriptions of the various kinds of wall-like obstacles. */ static tiletablerow const help_walls[] = { { TRUE, Wall_North, Wall, "Walls can either take up an entire square," " or just cut off one direction." }, { TRUE, BlueWall_Fake, 0, "Blue Walls can either be real walls, or just mirages. They show" " their true nature when Chip tries to walk through them." }, { TRUE, PopupWall, 0, "Popup Walls spring up when Chip walks across them, blocking retreat." }, { TRUE, Door_Green, Door_Red, "Doors can be opened if Chip has a matching key." } }; /* Descriptions of various objects to be found. */ static tiletablerow const help_objects[] = { { TRUE, Bomb, 0, "A Bomb is always fatal to whatever steps on it." }, { TRUE, CloneMachine, Button_Red, "Clone Machines produce duplicates of whatever is shown atop them" " at the touch of a Red Button." }, { TRUE, Beartrap, Button_Brown, "A Bear Trap holds fast whatever steps on it. A Brown Button" " resets the trap and permits escape." }, { TRUE, Teleport, 0, "A Teleport instantly transports you to another teleport." }, { TRUE, SwitchWall_Open, Button_Green, "Toggle Walls come and go when any Green Button is pressed." }, { TRUE, Button_Blue, 0, "A Blue Button causes tanks to turn around." }, { TRUE, HintButton, 0, "The Hint Button provides a brief suggestion on how to proceed." }, { TRUE, Burglar, 0, "The Thief takes back all your special footgear." } }; /* Descriptions of things that Chip can use. */ static tiletablerow const help_tools[] = { { TRUE, ICChip, 0, "IC Chips are what Chip needs to collect in order to pass through" " the socket." }, { TRUE, Key_Green, Key_Yellow, "Keys permit Chip to open doors of the matching color." }, { TRUE, Boots_Water, Boots_Fire, "Boots allow Chip to get past fire and water, and to traverse" " ice and force floors as if they were normal floors." }, { TRUE, Block_Static, 0, "Blocks are obstacles, but they can be pushed around. When pushed into" " water, the water square turns into dirt." }, { TRUE, Socket, 0, "The Socket can only be passed when Chip has acquired" " the necessary number of IC chips." }, { TRUE, Exit, 0, "The Exit takes Chip out. Finding and reaching the Exit" " is the main goal of every level." } }; /* Descriptions of the roaming creatures. */ static tiletablerow const help_monsters[] = { { FALSE, Tank, 0, "Tanks only move in one direction, until a blue button" " makes them turn around." }, { FALSE, Ball, 0, "Balls bounce back and forth in a straight line." }, { FALSE, Glider, 0, "Gliders fly straight until they hit an obstacle," " whereupon they turn left." }, { FALSE, Fireball, 0, "Fireballs turn to the right upon hitting an obstacle." }, { FALSE, Walker, 0, "Walkers turn in a random direction when stopped." }, { FALSE, Bug, 0, "Bugs march around things, keeping the wall to their left-hand side." }, { FALSE, Paramecium, 0, "Paramecia move along with the wall on their right-hand side." }, { FALSE, Blob, 0, "Blobs move about completely at random, albeit slowly." }, { FALSE, Teeth, 0, "Finally, Teeth home in on you; like Blobs, they can be outrun." } }; /* Wrapper function for displaying illustrated help and then waiting * for a key command. */ static int helptilescreen(char const *title, tiletablerow const *table, int count, int completed) { displaytiletable(title, table, count, completed); return anykey(); } /* Display the illustrated help sequence for the game. */ int gameplayhelp(void) { int ret; ret = helptilescreen("FLOORS", ARRAY(help_floors), +1) && helptilescreen("WALLS", ARRAY(help_walls), +1) && helptilescreen("OBJECTS", ARRAY(help_objects), +1) && helptilescreen("TOOLS", ARRAY(help_tools), +1) && helptilescreen("MONSTERS", ARRAY(help_monsters), 0); cleardisplay(); return ret; } /* An input callback used while displaying the list of help topics. */ static int scrollinputcallback(int *move) { switch (input(TRUE)) { case CmdPrev10: *move = SCROLL_ALLTHEWAY_UP; break; case CmdNorth: *move = SCROLL_UP; break; case CmdPrev: *move = SCROLL_UP; break; case CmdPrevLevel: *move = SCROLL_UP; break; case CmdSouth: *move = SCROLL_DN; break; case CmdNext: *move = SCROLL_DN; break; case CmdNextLevel: *move = SCROLL_DN; break; case CmdNext10: *move = SCROLL_ALLTHEWAY_DN; break; case CmdProceed: *move = TRUE; return FALSE; case CmdQuitLevel: *move = FALSE; return FALSE; case CmdQuit: exit(0); } return TRUE; } /* Display the list of help topics and allow the user to select which * ones to view. */ void onlinemainhelp(int topic) { static char const *items[] = { "2-", "1+\267", "1-Key commands during the game", "1+\267", "1-Key commands inbetween games", "1+\267", "1-Objects of the game", "1+\267", "1-Command-line options", "1+\267", "1-About Tile World", "1+\267", "1-Return to the program" }; static tablespec const table = { 7, 2, 4, 1, items }; int n; switch (topic) { case Help_KeysDuringGame: n = 0; break; case Help_KeysBetweenGames: n = 1; break; case Help_ObjectsOfGame: n = 2; break; case Help_CmdlineOptions: n = 3; break; case Help_AboutGame: n = 4; break; default: n = 5; break; } while (displaylist("HELP", &table, &n, LIST_HELP, scrollinputcallback)) { if (n == 5) break; switch (n) { case 0: displaytable("KEYS - DURING THE GAME", keyboardhelp(KEYHELP_INGAME), -1); anykey(); break; case 1: displaytable("KEYS - INBETWEEN GAMES", keyboardhelp(KEYHELP_TWIXTGAMES), -1); anykey(); break; case 2: (void)(helptilescreen("FLOORS", ARRAY(help_floors), +1) && helptilescreen("WALLS", ARRAY(help_walls), +1) && helptilescreen("OBJECTS", ARRAY(help_objects), +1) && helptilescreen("TOOLS", ARRAY(help_tools), +1) && helptilescreen("MONSTERS", ARRAY(help_monsters), 0)); break; case 3: displaytable("COMMAND-LINE OPTIONS", &yowzitch_table, -1); anykey(); break; case 4: displaytable("ABOUT TILE WORLD", &vourzhon_table, -1); anykey(); break; } } cleardisplay(); } /* Display a single online help screen for the given topic. */ void onlinecontexthelp(int topic) { static char const *firsthelp_items[] = { "1!Welcome to Tile World!", "1-", "1!In order to begin, you must first decide which level set you" " wish to play. The opening screen shows you the list of all the" " level sets that are currently available. Use the up and down" " arrows to move the selection. When the level set of your choice" " is selected, press Enter to begin.", "1-", "1!If the list is long, you may also use the PgUp and PgDn keys to" " scroll one windowful at a time.", "1-", "1!At any point in the program, you may use the Q key to quit the" " current activity and go back up one step. Typing Shift-Q will" " exit Tile World completely. Typing ? or F1 at any time will bring" " up a list of online help topics.", "1-", "1!Tile World also comes with offline documentation. Please see the" " tworld.html file included for more help on playing the game and" " using this program.", "1-", "1!Now, press any key to go back to the list of level sets." }; static tablespec const firsthelp_table = { 9, 1, 0, 1, firsthelp_items }; switch (topic) { case Help_First: displaytable("HELP", &firsthelp_table, -1); break; case Help_KeysDuringGame: displaytable("KEYS - DURING THE GAME", keyboardhelp(KEYHELP_INGAME), -1); break; case Help_KeysBetweenGames: displaytable("KEYS - INBETWEEN GAMES", keyboardhelp(KEYHELP_TWIXTGAMES), -1); break; case Help_FileListKeys: displaytable("KEYS - FILE LIST", keyboardhelp(KEYHELP_FILELIST), -1); break; case Help_ScoreListKeys: displaytable("KEYS - SCORE LIST", keyboardhelp(KEYHELP_SCORELIST), -1); break; } anykey(); cleardisplay(); } tworld-2.3.0/help.h000066400000000000000000000016531475511570500141470ustar00rootroot00000000000000/* help.h: Displaying online help screens. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_help_h_ #define HEADER_help_h_ #ifdef __cplusplus extern "C" { #endif /* The available help topics. */ enum { Help_None = 0, Help_First, Help_KeysDuringGame, Help_KeysBetweenGames, Help_FileListKeys, Help_ScoreListKeys, Help_ObjectsOfGame, Help_CmdlineOptions, Help_AboutGame }; /* Help for the command-line options. */ extern tablespec const *yowzitch; /* Version and license information. */ extern tablespec const *vourzhon; /* Display online help screens for the game, using the given topic as * the default topic. */ extern void onlinemainhelp(int topic); /* Display a single online help screen for the given topic. */ extern void onlinecontexthelp(int topic); #ifdef __cplusplus } #endif #endif tworld-2.3.0/logic.h000066400000000000000000000023761475511570500143170ustar00rootroot00000000000000/* logic.h: Declarations for the game logic modules. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef HEADER_logic_h_ #define HEADER_logic_h_ #include "state.h" /* Turning macros. */ #define left(dir) ((((dir) << 1) | ((dir) >> 3)) & 15) #define back(dir) ((((dir) << 2) | ((dir) >> 2)) & 15) #define right(dir) ((((dir) << 3) | ((dir) >> 1)) & 15) /* One game logic engine. */ typedef struct gamelogic gamelogic; struct gamelogic { int ruleset; /* the ruleset */ gamestate *state; /* ptr to the current game state */ int (*initgame)(gamelogic*); /* prepare to play a game */ int (*advancegame)(gamelogic*); /* advance the game one tick */ int (*endgame)(gamelogic*); /* clean up after the game is done */ void (*shutdown)(gamelogic*); /* turn off the logic engine */ }; /* The available game logic engines. */ extern gamelogic *lynxlogicstartup(void); extern gamelogic *mslogicstartup(void); /* The high simluation fidelity flag: if true, the simulation should * forgo "standard play" in favor of being as true as possible to the * original source material. */ extern int pedanticmode; #endif tworld-2.3.0/lxlogic.c000066400000000000000000001522531475511570500146560ustar00rootroot00000000000000/* lxlogic.c: The game logic for the Lynx ruleset. * * Copyright (C) 2001-2015 by Brian Raiter and Eric Schmidt, under the GNU * General Public License. No warranty. See COPYING for details. */ #include #include #include "defs.h" #include "err.h" #include "state.h" #include "random.h" #include "logic.h" /* A number well above the maximum number of creatures that could possibly * exist simultaneously. */ #define MAX_CREATURES (2 * CXGRID * CYGRID) /* The maximum number of creatures on the original Atari Lynx version. */ #define PMAX_CREATURES 128 /* Temporary "holding" values used in place of a direction. */ #define WALKER_TURN (NORTH | SOUTH | EAST) #define BLOB_TURN (NORTH | SOUTH | WEST) /* TRUE if dir is a diagonal move. */ #define isdiagonal(dir) (((dir) & (NORTH | SOUTH)) && ((dir) & (EAST | WEST))) /* Internal assertion macro. */ #ifdef NDEBUG #define _assert(test) ((void)0) #else #define _assert(test) ((test) || (die("internal error: failed sanity check" \ " (%s)\nPlease report this error to" \ " eric41293@comcast.net", #test), 0)) #endif /* A list of ways for Chip to lose. */ enum { CHIP_OKAY = 0, CHIP_DROWNED, CHIP_BURNED, CHIP_BOMBED, CHIP_OUTOFTIME, CHIP_COLLIDED, CHIP_NOTOKAY }; /* Pedantic mode flag. (Having this variable defined here is a hack, * but this is the only module that actually uses it.) */ int pedanticmode = FALSE; /* Declarations of (indirectly recursive) functions. */ static int canmakemove(creature const *cr, int dir, int flags); static int advancecreature(creature *cr, int releasing); /* Used to calculate movement offsets. */ static int const delta[] = { 0, -CXGRID, -1, 0, +CXGRID, 0, 0, 0, +1 }; /* The direction used the last time something stepped onto a random * slide floor. */ static int lastrndslidedir = NORTH; /* The most recently used stepping phase value. */ static int laststepping = 0; /* The memory used to hold the list of creatures. */ static creature *creaturearray = NULL; /* A pointer to the game state, used so that it doesn't have to be * passed to every single function. */ static gamestate *state; /* * Accessor macros for various fields in the game state. Many of the * macros can be used as an lvalue. */ #define setstate(p) (state = (p)->state) #define creaturelist() (state->creatures) #define getchip() (creaturelist()) #define chippos() (getchip()->pos) #define chipisalive() (getchip()->id == Chip) #define mainprng() (&state->mainprng) #define timelimit() (state->timelimit) #define timeoffset() (state->timeoffset) #define currenttime() (state->currenttime) #define currentinput() (state->currentinput) #define lastmove() (state->lastmove) #define stepping() (state->stepping) #define rndslidedir() (state->initrndslidedir) #define xviewpos() (state->xviewpos) #define yviewpos() (state->yviewpos) #define setnosaving() (state->statusflags |= SF_NOSAVING) #define showhint() (state->statusflags |= SF_SHOWHINT) #define hidehint() (state->statusflags &= ~SF_SHOWHINT) #define markinvalid() (state->statusflags |= SF_INVALID) #define ismarkedinvalid() (state->statusflags & SF_INVALID) #define chipsneeded() (state->chipsneeded) #define clonerlist() (state->cloners) #define clonerlistsize() (state->clonercount) #define traplist() (state->traps) #define traplistsize() (state->trapcount) #define getlxstate() (state->lxstate) #define completed() (getlxstate().completed) #define togglestate() (getlxstate().togglestate) #define couldntmove() (getlxstate().couldntmove) #define chippushing() (getlxstate().pushing) #define chipstuck() (getlxstate().stuck) #define mapbreached() (getlxstate().mapbreached) #define chiptopos() (getlxstate().chiptopos) #define chiptocr() (getlxstate().chiptocr) #define putwall() (getlxstate().putwall) #define prngvalue1() (getlxstate().prng1) #define prngvalue2() (getlxstate().prng2) #define xviewoffset() (getlxstate().xviewoffset) #define yviewoffset() (getlxstate().yviewoffset) #define creaturelistend() (getlxstate().crend) #define inendgame() (getlxstate().endgametimer) #define startendgametimer() (getlxstate().endgametimer = 12 + 1) #define decrendgametimer() (--getlxstate().endgametimer) #define resetendgametimer() (getlxstate().endgametimer = 0) #define addsoundeffect(sfx) (state->soundeffects |= 1 << (sfx)) #define stopsoundeffect(sfx) (state->soundeffects &= ~(1 << (sfx))) #define floorat(pos) (state->map[pos].top.id) #define possession(obj) (*_possession(obj)) static short *_possession(int obj) { switch (obj) { case Key_Red: return &state->keys[0]; case Key_Blue: return &state->keys[1]; case Key_Yellow: return &state->keys[2]; case Key_Green: return &state->keys[3]; case Boots_Ice: return &state->boots[0]; case Boots_Slide: return &state->boots[1]; case Boots_Fire: return &state->boots[2]; case Boots_Water: return &state->boots[3]; case Door_Red: return &state->keys[0]; case Door_Blue: return &state->keys[1]; case Door_Yellow: return &state->keys[2]; case Door_Green: return &state->keys[3]; case Ice: return &state->boots[0]; case IceWall_Northwest: return &state->boots[0]; case IceWall_Northeast: return &state->boots[0]; case IceWall_Southwest: return &state->boots[0]; case IceWall_Southeast: return &state->boots[0]; case Slide_North: return &state->boots[1]; case Slide_West: return &state->boots[1]; case Slide_South: return &state->boots[1]; case Slide_East: return &state->boots[1]; case Slide_Random: return &state->boots[1]; case Fire: return &state->boots[2]; case Water: return &state->boots[3]; } warn("Invalid object %d handed to possession()\n", obj); _assert(!"possession() called with an invalid object"); return NULL; } /* The pseudorandom number generator, used by walkers and blobs. This * exactly matches the PRNG used in the original Lynx game. */ static unsigned char lynx_prng(void) { unsigned char n; n = (prngvalue1() >> 2) - prngvalue1(); if (!(prngvalue1() & 0x02)) --n; prngvalue1() = (prngvalue1() >> 1) | (prngvalue2() & 0x80); prngvalue2() = (prngvalue2() << 1) | (n & 0x01); return (prngvalue1() ^ prngvalue2()) & 0xFF; } /* * Simple floor functions. */ /* Floor state flags. */ #define FS_CLAIMED 0x40 /* spot is claimed by a creature */ #define FS_ANIMATED 0x20 /* spot is playing an animation */ #define FS_BEARTRAP 0x01 /* there is or was a beartrap here */ #define FS_TELEPORT 0x02 /* there is or was a teleport here */ /* Accessor macros for the floor states. */ #define claimlocation(pos) (state->map[pos].top.state |= FS_CLAIMED) #define removeclaim(pos) (state->map[pos].top.state &= ~FS_CLAIMED) #define islocationclaimed(pos) (state->map[pos].top.state & FS_CLAIMED) #define markanimated(pos) (state->map[pos].top.state |= FS_ANIMATED) #define clearanimated(pos) (state->map[pos].top.state &= ~FS_ANIMATED) #define ismarkedanimated(pos) (state->map[pos].top.state & FS_ANIMATED) #define markbeartrap(pos) (state->map[pos].top.state |= FS_BEARTRAP) #define ismarkedbeartrap(pos) (state->map[pos].top.state & FS_BEARTRAP) #define markteleport(pos) (state->map[pos].top.state |= FS_TELEPORT) #define ismarkedteleport(pos) (state->map[pos].top.state & FS_TELEPORT) /* Translate a slide floor into the direction it points in. In the * case of a random slide floor, if advance is TRUE a new direction * shall be selected; otherwise the current direction is used. */ static int getslidedir(int floor, int advance) { switch (floor) { case Slide_North: return NORTH; case Slide_West: return WEST; case Slide_South: return SOUTH; case Slide_East: return EAST; case Slide_Random: if (advance) lastrndslidedir = right(lastrndslidedir); return lastrndslidedir; } warn("Invalid floor %d handed to getslidedir()\n", floor); _assert(!"getslidedir() called with an invalid object"); return NIL; } /* Alter a creature's direction if they are at an ice wall. */ static void applyicewallturn(creature *cr) { int floor, dir; floor = floorat(cr->pos); dir = cr->dir; switch (floor) { case IceWall_Northeast: dir = dir == SOUTH ? EAST : dir == WEST ? NORTH : dir; break; case IceWall_Southwest: dir = dir == NORTH ? WEST : dir == EAST ? SOUTH : dir; break; case IceWall_Northwest: dir = dir == SOUTH ? WEST : dir == EAST ? NORTH : dir; break; case IceWall_Southeast: dir = dir == NORTH ? EAST : dir == WEST ? SOUTH : dir; break; } cr->dir = dir; } /* Find the location of a beartrap from one of its buttons. */ static int trapfrombutton(int pos) { xyconn *xy; int i; if (pedanticmode) { i = pos; for (;;) { ++i; if (i == CXGRID * CYGRID) i = 0; if (i == pos) break; if (floorat(i) == Beartrap) return i; if (ismarkedbeartrap(i)) return -1; } } else { for (xy = traplist(), i = traplistsize() ; i ; ++xy, --i) if (xy->from == pos) return xy->to; } return -1; } /* Find the location of a clone machine from one of its buttons. */ static int clonerfrombutton(int pos) { xyconn *xy; int i; if (pedanticmode) { i = pos; for (;;) { ++i; if (i == CXGRID * CYGRID) i = 0; if (i == pos) break; if (floorat(i) == CloneMachine) return i; } } else { for (xy = clonerlist(), i = clonerlistsize() ; i ; ++xy, --i) if (xy->from == pos) return xy->to; } return -1; } /* Quell any continuous sound effects coming from what Chip is * standing on. If includepushing is TRUE, also quell the sound of any * blocks being pushed. */ static void resetfloorsounds(int includepushing) { stopsoundeffect(SND_SKATING_FORWARD); stopsoundeffect(SND_SKATING_TURN); stopsoundeffect(SND_FIREWALKING); stopsoundeffect(SND_WATERWALKING); stopsoundeffect(SND_ICEWALKING); stopsoundeffect(SND_SLIDEWALKING); stopsoundeffect(SND_SLIDING); if (includepushing) stopsoundeffect(SND_BLOCK_MOVING); } /* * Functions that manage the list of entities. */ /* Creature state flags. */ #define CS_FDIRMASK 0x0F /* temp storage for forced moves */ #define CS_SLIDETOKEN 0x10 /* can move off of a slide floor */ #define CS_REVERSE 0x20 /* needs to turn around */ #define CS_PUSHED 0x40 /* block was pushed by Chip */ #define CS_TELEPORTED 0x80 /* creature was just teleported */ #define getfdir(cr) ((cr)->state & CS_FDIRMASK) #define setfdir(cr, d) ((cr)->state = ((cr)->state & ~CS_FDIRMASK) \ | ((d) & CS_FDIRMASK)) /* Return the creature located at pos. Ignores Chip unless includechip * is TRUE. (This is important in the case when Chip and a second * creature are currently occupying a single location.) */ static creature *lookupcreature(int pos, int includechip) { creature *cr; cr = creaturelist(); if (!includechip) ++cr; for ( ; cr->id ; ++cr) if (cr->pos == pos && !cr->hidden && !isanimation(cr->id)) return cr; return NULL; } /* Return a fresh creature. */ static creature *newcreature(void) { creature *cr; for (cr = creaturelist() + 1 ; cr->id ; ++cr) { if (cr->hidden) return cr; } if (cr - creaturelist() >= MAX_CREATURES) { warn("Ran out of room in the creatures array!"); return NULL; } if (pedanticmode && cr - creaturelist() >= PMAX_CREATURES) return NULL; cr->hidden = TRUE; cr[1].id = Nothing; creaturelistend() = cr; return cr; } /* Flag all tanks to turn around. */ static void turntanks(void) { creature *cr; for (cr = creaturelist() ; cr->id ; ++cr) { if (cr->hidden) continue; if (cr->id != Tank) continue; if (floorat(cr->pos) == CloneMachine || isice(floorat(cr->pos))) continue; cr->state ^= CS_REVERSE; } } /* Start an animation sequence at the spot (formerly) occupied by the * given creature. The creature's slot in the creature list is reused * by the animation sequence. */ static void removecreature(creature *cr, int animationid) { if (cr->id != Chip) removeclaim(cr->pos); if (cr->state & CS_PUSHED) stopsoundeffect(SND_BLOCK_MOVING); cr->id = animationid; cr->frame = ((currenttime() + stepping()) & 1) ? 12 : 11; --cr->frame; cr->hidden = FALSE; cr->state = 0; cr->tdir = NIL; if (cr->moving == 8) { cr->pos -= delta[cr->dir]; cr->moving = 0; } markanimated(cr->pos); } /* End the given animation sequence (thus removing the final vestige * of an ex-creature). */ static void removeanimation(creature *cr) { cr->hidden = TRUE; clearanimated(cr->pos); if (cr == creaturelistend()) { cr->id = Nothing; --creaturelistend(); } } /* Abort the animation sequence occuring at the given location. */ static int stopanimationat(int pos) { creature *anim; for (anim = creaturelist() ; anim->id ; ++anim) { if (!anim->hidden && anim->pos == pos && isanimation(anim->id)) { removeanimation(anim); return TRUE; } } return FALSE; } /* What happens when Chip dies. reason indicates the cause of death. * also is either NULL or points to a creature that dies with Chip. */ static void removechip(int reason, creature *also) { creature *chip = getchip(); switch (reason) { case CHIP_DROWNED: addsoundeffect(SND_WATER_SPLASH); removecreature(chip, Water_Splash); break; case CHIP_BOMBED: addsoundeffect(SND_BOMB_EXPLODES); removecreature(chip, Bomb_Explosion); break; case CHIP_OUTOFTIME: removecreature(chip, Entity_Explosion); break; case CHIP_BURNED: addsoundeffect(SND_CHIP_LOSES); removecreature(chip, Entity_Explosion); break; case CHIP_COLLIDED: addsoundeffect(SND_CHIP_LOSES); removecreature(chip, Entity_Explosion); if (also && also != chip) removecreature(also, Entity_Explosion); break; } resetfloorsounds(FALSE); startendgametimer(); timeoffset() = 1; } /* * The laws of movement across the various floors. * * Chip, blocks, and other creatures all have slightly different rules * about what sort of tiles they are permitted to move into and out * of. The following lookup table encapsulates these rules. Note that * these rules are only the first check; a creature may be generally * permitted a particular type of move but still prevented in a * specific situation. */ #define DIR_IN(dir) (dir) #define DIR_OUT(dir) ((dir) << 4) #define NORTH_IN DIR_IN(NORTH) #define WEST_IN DIR_IN(WEST) #define SOUTH_IN DIR_IN(SOUTH) #define EAST_IN DIR_IN(EAST) #define NORTH_OUT DIR_OUT(NORTH) #define WEST_OUT DIR_OUT(WEST) #define SOUTH_OUT DIR_OUT(SOUTH) #define EAST_OUT DIR_OUT(EAST) #define ALL_IN (NORTH_IN | WEST_IN | SOUTH_IN | EAST_IN) #define ALL_OUT (NORTH_OUT | WEST_OUT | SOUTH_OUT | EAST_OUT) #define ALL_IN_OUT (ALL_IN | ALL_OUT) static struct { unsigned char chip, block, creature; } const movelaws[] = { /* Nothing */ { 0, 0, 0 }, /* Empty */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Slide_North */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Slide_West */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Slide_South */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Slide_East */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Slide_Random */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Ice */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* IceWall_Northwest */ { NORTH_OUT | WEST_OUT | SOUTH_IN | EAST_IN, NORTH_OUT | WEST_OUT | SOUTH_IN | EAST_IN, NORTH_OUT | WEST_OUT | SOUTH_IN | EAST_IN }, /* IceWall_Northeast */ { NORTH_OUT | EAST_OUT | SOUTH_IN | WEST_IN, NORTH_OUT | EAST_OUT | SOUTH_IN | WEST_IN, NORTH_OUT | EAST_OUT | SOUTH_IN | WEST_IN }, /* IceWall_Southwest */ { SOUTH_OUT | WEST_OUT | NORTH_IN | EAST_IN, SOUTH_OUT | WEST_OUT | NORTH_IN | EAST_IN, SOUTH_OUT | WEST_OUT | NORTH_IN | EAST_IN }, /* IceWall_Southeast */ { SOUTH_OUT | EAST_OUT | NORTH_IN | WEST_IN, SOUTH_OUT | EAST_OUT | NORTH_IN | WEST_IN, SOUTH_OUT | EAST_OUT | NORTH_IN | WEST_IN }, /* Gravel */ { ALL_IN_OUT, ALL_IN_OUT, ALL_OUT }, /* Dirt */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Water */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Fire */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Bomb */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Beartrap */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Burglar */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* HintButton */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Button_Blue */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Button_Green */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Button_Red */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Button_Brown */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Teleport */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Wall */ { ALL_OUT, ALL_OUT, ALL_OUT }, /* Wall_North */ { NORTH_IN | WEST_IN | EAST_IN | WEST_OUT | SOUTH_OUT | EAST_OUT, NORTH_IN | WEST_IN | EAST_IN | WEST_OUT | SOUTH_OUT | EAST_OUT, NORTH_IN | WEST_IN | EAST_IN | WEST_OUT | SOUTH_OUT | EAST_OUT }, /* Wall_West */ { NORTH_IN | WEST_IN | SOUTH_IN | NORTH_OUT | SOUTH_OUT | EAST_OUT, NORTH_IN | WEST_IN | SOUTH_IN | NORTH_OUT | SOUTH_OUT | EAST_OUT, NORTH_IN | WEST_IN | SOUTH_IN | NORTH_OUT | SOUTH_OUT | EAST_OUT }, /* Wall_South */ { WEST_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | EAST_OUT, WEST_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | EAST_OUT, WEST_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | EAST_OUT }, /* Wall_East */ { NORTH_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | SOUTH_OUT, NORTH_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | SOUTH_OUT, NORTH_IN | SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT | SOUTH_OUT }, /* Wall_Southeast */ { SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT, SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT, SOUTH_IN | EAST_IN | NORTH_OUT | WEST_OUT }, /* HiddenWall_Perm */ { ALL_OUT, ALL_OUT, ALL_OUT }, /* HiddenWall_Temp */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* BlueWall_Real */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* BlueWall_Fake */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* SwitchWall_Open */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* SwitchWall_Closed */ { ALL_OUT, ALL_OUT, ALL_OUT }, /* PopupWall */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* CloneMachine */ { ALL_OUT, ALL_OUT, ALL_OUT }, /* Door_Red */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Door_Blue */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Door_Yellow */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Door_Green */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Socket */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Exit */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* ICChip */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Key_Red */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Key_Blue */ { ALL_IN_OUT, ALL_IN_OUT, ALL_IN_OUT }, /* Key_Yellow */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Key_Green */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Boots_Slide */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Boots_Ice */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Boots_Water */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Boots_Fire */ { ALL_IN_OUT, ALL_OUT, ALL_OUT }, /* Block_Static */ { 0, 0, 0 }, /* Drowned_Chip */ { 0, 0, 0 }, /* Burned_Chip */ { 0, 0, 0 }, /* Bombed_Chip */ { 0, 0, 0 }, /* Exited_Chip */ { 0, 0, 0 }, /* Exit_Extra_1 */ { 0, 0, 0 }, /* Exit_Extra_2 */ { 0, 0, 0 }, /* Overlay_Buffer */ { 0, 0, 0 }, /* Floor_Reserved2 */ { 0, 0, 0 }, /* Floor_Reserved1 */ { 0, 0, 0 } }; /* Including the flag CMM_RELEASING in a call to canmakemove() * indicates that the creature in question is being moved out of a * beartrap or clone machine, moves that would normally be forbidden. * CMM_CLEARANIMATIONS causes animations in the destination square to * be immediately quelled. CMM_STARTMOVEMENT indicates that this is * the final check before movement begins, thus triggering side * effects such as exposing hidden walls. CMM_PUSHBLOCKS causes blocks * to be pushed when in the way of Chip. CMM_PUSHBLOCKSNOW causes * blocks to be pushed immediately, instead of waiting for the block's * turn to move. */ #define CMM_RELEASING 0x0001 #define CMM_CLEARANIMATIONS 0x0002 #define CMM_STARTMOVEMENT 0x0004 #define CMM_PUSHBLOCKS 0x0008 #define CMM_PUSHBLOCKSNOW 0x0010 /* Return TRUE if the given block is allowed to be moved in the given * direction. If flags includes CMM_PUSHBLOCKSNOW, then the indicated * movement of the block will be initiated. */ static int canpushblock(creature *block, int dir, int flags) { _assert(block && block->id == Block); _assert(floorat(block->pos) != CloneMachine); _assert(dir != NIL); if (!canmakemove(block, dir, flags)) { if (!block->moving && (flags & (CMM_PUSHBLOCKS | CMM_PUSHBLOCKSNOW))) { block->dir = dir; if (pedanticmode) { block->tdir = dir; } } return FALSE; } if (flags & (CMM_PUSHBLOCKS | CMM_PUSHBLOCKSNOW)) { block->dir = dir; block->tdir = dir; block->state |= CS_PUSHED; if (flags & CMM_PUSHBLOCKSNOW) advancecreature(block, FALSE); } return TRUE; } /* Return TRUE if the given creature is allowed to attempt to move in * the given direction. Side effects can and will occur from calling * this function, as indicated by flags. */ static int canmakemove(creature const *cr, int dir, int flags) { creature *other; int floor; int to, y, x; _assert(cr); _assert(dir != NIL); floor = floorat(cr->pos); switch (floor) { case Wall_North: if (dir & NORTH) return FALSE; break; case Wall_West: if (dir & WEST) return FALSE; break; case Wall_South: if (dir & SOUTH) return FALSE; break; case Wall_East: if (dir & EAST) return FALSE; break; case Wall_Southeast: if (dir & (SOUTH | EAST)) return FALSE; break; case IceWall_Northwest: if (dir & (SOUTH | EAST)) return FALSE; break; case IceWall_Northeast: if (dir & (SOUTH | WEST)) return FALSE; break; case IceWall_Southwest: if (dir & (NORTH | EAST)) return FALSE; break; case IceWall_Southeast: if (dir & (NORTH | WEST)) return FALSE; break; case Beartrap: case CloneMachine: if (!(flags & CMM_RELEASING)) return FALSE; break; } if (isslide(floor) && (cr->id != Chip || !possession(Boots_Slide)) && getslidedir(floor, FALSE) == back(dir)) return FALSE; y = cr->pos / CXGRID; x = cr->pos % CXGRID; y += dir == NORTH ? -1 : dir == SOUTH ? +1 : 0; x += dir == WEST ? -1 : dir == EAST ? +1 : 0; to = y * CXGRID + x; if (x < 0 || x >= CXGRID) return FALSE; if (y < 0 || y >= CYGRID) { if (pedanticmode) { if (flags & CMM_STARTMOVEMENT) { mapbreached() = TRUE; warn("map breach in pedantic mode at (%d %d)", x, y); } } return FALSE; } floor = floorat(to); if (floor == SwitchWall_Open || floor == SwitchWall_Closed) floor ^= togglestate(); if (cr->id == Chip) { if (!(movelaws[floor].chip & dir)) return FALSE; if (floor == Socket && chipsneeded() > 0) return FALSE; if (isdoor(floor) && !possession(floor)) return FALSE; if (ismarkedanimated(to)) return FALSE; other = lookupcreature(to, FALSE); if (other && other->id == Block) { if (!canpushblock(other, dir, flags & ~CMM_RELEASING)) return FALSE; } if (floor == HiddenWall_Temp || floor == BlueWall_Real) { if (flags & CMM_STARTMOVEMENT) floorat(to) = Wall; return FALSE; } } else if (cr->id == Block) { if (cr->moving > 0) return FALSE; if (!(movelaws[floor].block & dir)) return FALSE; if (islocationclaimed(to)) return FALSE; if (flags & CMM_CLEARANIMATIONS) if (ismarkedanimated(to)) stopanimationat(to); } else { if (!(movelaws[floor].creature & dir)) return FALSE; if (islocationclaimed(to)) return FALSE; if (floor == Fire && cr->id != Fireball) return FALSE; if (flags & CMM_CLEARANIMATIONS) if (ismarkedanimated(to)) stopanimationat(to); } return TRUE; } /* * How everyone selects their move. */ /* This function embodies the movement behavior of all the creatures. * Given a creature, this function enumerates its desired direction * of movement and selects the first one that is permitted. */ static void choosecreaturemove(creature *cr) { int choices[4] = { NIL, NIL, NIL, NIL }; int dir, pdir; int floor; int y, x, m, n; if (isanimation(cr->id)) return; cr->tdir = NIL; if (cr->id == Block) return; if (getfdir(cr) != NIL) return; floor = floorat(cr->pos); if (floor == CloneMachine || floor == Beartrap) { cr->tdir = cr->dir; return; } dir = cr->dir; pdir = NIL; _assert(dir != NIL); switch (cr->id) { case Tank: choices[0] = dir; break; case Ball: choices[0] = dir; choices[1] = back(dir); break; case Glider: choices[0] = dir; choices[1] = left(dir); choices[2] = right(dir); choices[3] = back(dir); break; case Fireball: choices[0] = dir; choices[1] = right(dir); choices[2] = left(dir); choices[3] = back(dir); break; case Bug: choices[0] = left(dir); choices[1] = dir; choices[2] = right(dir); choices[3] = back(dir); break; case Paramecium: choices[0] = right(dir); choices[1] = dir; choices[2] = left(dir); choices[3] = back(dir); break; case Walker: choices[0] = dir; choices[1] = WALKER_TURN; break; case Blob: choices[0] = BLOB_TURN; break; case Teeth: if ((currenttime() + stepping()) & 4) return; y = chippos() / CXGRID - cr->pos / CXGRID; x = chippos() % CXGRID - cr->pos % CXGRID; n = y < 0 ? NORTH : y > 0 ? SOUTH : NIL; if (y < 0) y = -y; m = x < 0 ? WEST : x > 0 ? EAST : NIL; if (x < 0) x = -x; if (x > y) { choices[0] = m; choices[1] = n; } else { choices[0] = n; choices[1] = m; } pdir = choices[0]; break; } for (n = 0 ; n < 4 && choices[n] != NIL ; ++n) { if (choices[n] == WALKER_TURN) { m = lynx_prng() & 3; choices[n] = cr->dir; while (m--) choices[n] = right(choices[n]); } else if (choices[n] == BLOB_TURN) { int cw[4] = { NORTH, EAST, SOUTH, WEST }; choices[n] = cw[random4(mainprng())]; } cr->tdir = choices[n]; if (canmakemove(cr, choices[n], CMM_CLEARANIMATIONS)) return; } if (pdir != NIL) cr->tdir = pdir; } /* Determine the direction of Chip's next move. If discard is TRUE, * then Chip is not currently permitted to select a direction of * movement, and the player's input should not be retained. */ static void choosechipmove(creature *cr, int discard) { int dir; int f1, f2; chippushing() = FALSE; dir = currentinput(); currentinput() = NIL; if (!directionalcmd(dir)) dir = NIL; if (dir == NIL || discard || chipstuck()) { cr->tdir = NIL; return; } lastmove() = dir; cr->tdir = dir; if (cr->tdir != NIL) dir = cr->tdir; else if (getfdir(cr) != NIL) dir = getfdir(cr); else return; if (isdiagonal(dir)) { if (cr->dir & dir) { f1 = canmakemove(cr, cr->dir, CMM_PUSHBLOCKS); f2 = canmakemove(cr, cr->dir ^ dir, CMM_PUSHBLOCKS); dir = !f1 && f2 ? dir ^ cr->dir : cr->dir; } else { if (canmakemove(cr, dir & (EAST | WEST), CMM_PUSHBLOCKS)) dir &= EAST | WEST; else dir &= NORTH | SOUTH; } cr->tdir = dir; } else { (void)canmakemove(cr, dir, CMM_PUSHBLOCKS); } } /* This function determines if the given creature is currently being * forced to move. (Ice, slide floors, and teleports are the three * possible causes of this. Bear traps and clone machines also cause * forced movement, but these are handled outside of the normal * movement sequence.) If so, the direction is stored in the * creature's fdir field, and TRUE is returned unless the creature can * override the forced move. */ static int getforcedmove(creature *cr) { int floor; setfdir(cr, NIL); floor = floorat(cr->pos); if (currenttime() == 0) return FALSE; if (isice(floor)) { if (cr->id == Chip && possession(Boots_Ice)) return FALSE; if (cr->id == Chip && chipstuck()) return FALSE; if (cr->dir == NIL) return FALSE; setfdir(cr, cr->dir); return TRUE; } else if (isslide(floor)) { if (cr->id == Chip && possession(Boots_Slide)) return FALSE; setfdir(cr, getslidedir(floor, TRUE)); return !(cr->state & CS_SLIDETOKEN); } else if (cr->state & CS_TELEPORTED) { cr->state &= ~CS_TELEPORTED; setfdir(cr, cr->dir); return TRUE; } return FALSE; } /* Return the move a creature will make on the current tick. */ static int choosemove(creature *cr) { if (cr->id == Chip) { choosechipmove(cr, getforcedmove(cr)); if (cr->tdir == NIL && getfdir(cr) == NIL) resetfloorsounds(FALSE); } else { if (getforcedmove(cr)) cr->tdir = NIL; else if (cr->id != Block) choosecreaturemove(cr); } return cr->tdir != NIL || getfdir(cr) != NIL; } /* Update the location that Chip is currently moving into (and reset * the pointer to the creature that Chip is colliding with). */ static void checkmovingto(void) { creature *cr; int dir; cr = getchip(); dir = cr->tdir; if (dir == NIL || isdiagonal(dir)) { chiptopos() = -1; chiptocr() = NULL; return; } chiptopos() = cr->pos + delta[dir]; chiptocr() = NULL; } /* * Special movements. */ /* Teleport the given creature instantaneously from one teleport tile * to another. */ static int teleportcreature(creature *cr) { int pos, origpos; _assert(floorat(cr->pos) == Teleport); origpos = pos = cr->pos; for (;;) { --pos; if (pos < 0) pos += CXGRID * CYGRID; if (floorat(pos) == Teleport) { if (cr->id != Chip) removeclaim(cr->pos); cr->pos = pos; if (!islocationclaimed(pos) && canmakemove(cr, cr->dir, 0)) break; if (pos == origpos) { if (cr->id == Chip) chipstuck() = TRUE; else claimlocation(cr->pos); return FALSE; } } else if (ismarkedteleport(pos)) { floorat(pos) = Teleport; if (pos == chippos()) getchip()->hidden = TRUE; } } if (cr->id == Chip) addsoundeffect(SND_TELEPORTING); else claimlocation(cr->pos); cr->state |= CS_TELEPORTED; return TRUE; } /* Release a creature currently inside a clone machine. If the * creature successfully exits, a new clone is created to replace it. */ static int activatecloner(int pos) { creature *cr; creature *clone; if (pos < 0) return FALSE; if (pos >= CXGRID * CYGRID) { warn("Off-map cloning attempted: (%d %d)", pos % CXGRID, pos / CXGRID); return FALSE; } if (floorat(pos) != CloneMachine) { warn("Red button not connected to a clone machine at (%d %d)", pos % CXGRID, pos / CXGRID); return FALSE; } cr = lookupcreature(pos, TRUE); if (!cr) return FALSE; clone = newcreature(); if (!clone) return advancecreature(cr, TRUE) != 0; *clone = *cr; if (advancecreature(cr, TRUE) <= 0) { clone->hidden = TRUE; return FALSE; } return TRUE; } /* Release any creature on a beartrap at the given location. */ static void springtrap(int pos) { creature *cr; if (pos < 0) return; if (pos >= CXGRID * CYGRID) { warn("Off-map trap opening attempted: (%d %d)", pos % CXGRID, pos / CXGRID); return; } if (!ismarkedbeartrap(pos)) { warn("Brown button not connected to a beartrap at (%d %d)", pos % CXGRID, pos / CXGRID); return; } cr = lookupcreature(pos, TRUE); if (cr && cr->dir != NIL) advancecreature(cr, TRUE); } /* * When something actually moves. */ /* Initiate a move by the given creature. The direction of movement is * given by the tdir field, or the fdir field if tdir is NIL. * releasing must be TRUE if the creature is moving out of a bear trap * or clone machine. +1 is returned if the creature succeeded in * moving, 0 is returned if the move could not be initiated, and -1 is * returned if the creature was killed in the attempt. */ static int startmovement(creature *cr, int releasing) { creature *other; int dir; int floorfrom; _assert(cr->moving <= 0); if (cr->tdir != NIL) dir = cr->tdir; else if (getfdir(cr) != NIL) dir = getfdir(cr); else return 0; _assert(!isdiagonal(dir)); cr->dir = dir; floorfrom = floorat(cr->pos); if (cr->id == Chip) { if (!possession(Boots_Slide)) { if (isslide(floorfrom) && cr->tdir == NIL) cr->state |= CS_SLIDETOKEN; else if (!isice(floorfrom) || possession(Boots_Ice)) cr->state &= ~CS_SLIDETOKEN; } } if (!canmakemove(cr, dir, CMM_PUSHBLOCKSNOW | CMM_CLEARANIMATIONS | CMM_STARTMOVEMENT | (releasing ? CMM_RELEASING : 0))) { if (cr->id == Chip) { if (!couldntmove()) { couldntmove() = TRUE; addsoundeffect(SND_CANT_MOVE); } chippushing() = TRUE; } if (isice(floorfrom) && (cr->id != Chip || !possession(Boots_Ice))) { cr->dir = back(dir); applyicewallturn(cr); } return 0; } if (mapbreached() && chipisalive()) { removechip(CHIP_COLLIDED, cr); return -1; } if (floorfrom == CloneMachine || floorfrom == Beartrap) _assert(releasing); if (cr->id != Chip) { removeclaim(cr->pos); if (cr->id != Block && cr->pos == chiptopos()) chiptocr() = cr; } else if (chiptocr() && !chiptocr()->hidden) { chiptocr()->moving = 8; removechip(CHIP_COLLIDED, chiptocr()); return -1; } cr->pos += delta[dir]; if (cr->id != Chip) claimlocation(cr->pos); cr->moving += 8; if (cr->id != Chip && cr->pos == chippos() && !getchip()->hidden) { removechip(CHIP_COLLIDED, cr); return -1; } if (cr->id == Chip) { couldntmove() = FALSE; other = lookupcreature(cr->pos, FALSE); if (other) { removechip(CHIP_COLLIDED, other); return -1; } } if (cr->state & CS_PUSHED) { chippushing() = TRUE; addsoundeffect(SND_BLOCK_MOVING); } return +1; } /* Continue the given creature's move. */ static int continuemovement(creature *cr) { int floor, speed; if (isanimation(cr->id)) return TRUE; _assert(cr->moving > 0); if (cr->id == Chip && chipstuck()) return TRUE; speed = cr->id == Blob ? 1 : 2; floor = floorat(cr->pos); if (isslide(floor) && (cr->id != Chip || !possession(Boots_Slide))) speed *= 2; else if (isice(floor) && (cr->id != Chip || !possession(Boots_Ice))) speed *= 2; cr->moving -= speed; cr->frame = cr->moving / 2; return cr->moving > 0; } /* Complete the movement of the given creature. Most side effects * produced by moving onto a tile occur at this point. FALSE is * returned if the creature is removed by the time the function * returns. If stationary is TRUE, we are in pedantic mode and * handling creatures starting on top of something. */ static int endmovement(creature *cr, int stationary) { int floor; int survived = TRUE; _assert(!stationary || pedanticmode); if (isanimation(cr->id)) return TRUE; _assert(cr->moving <= 0); floor = floorat(cr->pos); if (cr->id == Chip && putwall() != -1) return TRUE; if (cr->id == Chip && !possession(Boots_Ice)) applyicewallturn(cr); if (cr->id != Chip && !stationary) applyicewallturn(cr); if (cr->id == Chip) { switch (floor) { case Water: if (!possession(Boots_Water)) { removechip(CHIP_DROWNED, NULL); survived = FALSE; } break; case Fire: if (stationary) break; if (!possession(Boots_Fire)) { removechip(CHIP_BURNED, NULL); survived = FALSE; } break; case Dirt: case BlueWall_Fake: floorat(cr->pos) = Empty; addsoundeffect(SND_TILE_EMPTIED); break; case PopupWall: floorat(cr->pos) = Wall; addsoundeffect(SND_WALL_CREATED); break; case Door_Red: case Door_Blue: case Door_Yellow: case Door_Green: _assert(possession(floor)); if (floor != Door_Green) --possession(floor); floorat(cr->pos) = Empty; addsoundeffect(SND_DOOR_OPENED); break; case Key_Red: case Key_Blue: case Key_Yellow: case Key_Green: if (possession(floor) == 255) possession(floor) = -1; /* Intentional fall-through */ case Boots_Ice: case Boots_Slide: case Boots_Fire: case Boots_Water: ++possession(floor); floorat(cr->pos) = Empty; addsoundeffect(SND_ITEM_COLLECTED); break; case Burglar: possession(Boots_Ice) = 0; possession(Boots_Slide) = 0; possession(Boots_Fire) = 0; possession(Boots_Water) = 0; addsoundeffect(SND_BOOTS_STOLEN); break; case ICChip: if (stationary) break; if (chipsneeded()) --chipsneeded(); floorat(cr->pos) = Empty; addsoundeffect(SND_IC_COLLECTED); break; case Socket: _assert(stationary || chipsneeded() == 0); floorat(cr->pos) = Empty; addsoundeffect(SND_SOCKET_OPENED); break; case Exit: cr->hidden = TRUE; completed() = TRUE; addsoundeffect(SND_CHIP_WINS); break; } } else if (cr->id == Block) { switch (floor) { case Water: floorat(cr->pos) = Dirt; addsoundeffect(SND_WATER_SPLASH); removecreature(cr, Water_Splash); survived = FALSE; break; case Key_Blue: floorat(cr->pos) = Empty; break; } } else { switch (floor) { case Water: if (cr->id != Glider) { addsoundeffect(SND_WATER_SPLASH); removecreature(cr, Water_Splash); survived = FALSE; } break; case Key_Blue: floorat(cr->pos) = Empty; break; } } if (!survived) return FALSE; switch (floor) { case Bomb: if (stationary) break; floorat(cr->pos) = Empty; if (cr->id == Chip) { removechip(CHIP_BOMBED, NULL); } else { addsoundeffect(SND_BOMB_EXPLODES); removecreature(cr, Bomb_Explosion); } survived = FALSE; break; case Beartrap: if (stationary) break; addsoundeffect(SND_TRAP_ENTERED); break; case Button_Blue: if (stationary) break; turntanks(); addsoundeffect(SND_BUTTON_PUSHED); break; case Button_Green: if (stationary) break; togglestate() ^= SwitchWall_Open ^ SwitchWall_Closed; addsoundeffect(SND_BUTTON_PUSHED); break; case Button_Red: if (stationary) break; if (activatecloner(clonerfrombutton(cr->pos))) addsoundeffect(SND_BUTTON_PUSHED); break; case Button_Brown: if (stationary) break; addsoundeffect(SND_BUTTON_PUSHED); break; case Socket: _assert(stationary || chipsneeded() == 0); /* Intentional fall-through */ case Dirt: case BlueWall_Fake: floorat(cr->pos) = Empty; /* No sound effect */ break; } return survived; } /* Advance the movement of the given creature. If the creature is not * currently moving but should be, movement is initiated. If the * creature completes their movement, any and all appropriate side * effects are applied. If releasing is TRUE, the movement is occuring * out-of-turn, as with movement across an open beatrap or an * activated clone machine. The return value is +1 if the creature * successfully moved (or successfully remained stationary), 0 if the * creature tried to move and failed, or -1 if the creature was killed * and exists no longer. */ static int advancecreature(creature *cr, int releasing) { char tdir = NIL; int f; if (cr->moving <= 0 && !isanimation(cr->id)) { if (releasing) { _assert(cr->dir != NIL); tdir = cr->tdir; cr->tdir = cr->dir; } else if (cr->tdir == NIL && getfdir(cr) == NIL) { if (pedanticmode && !endmovement(cr, TRUE)) return -1; return +1; } f = startmovement(cr, releasing); if (f > 0) cr->hidden = FALSE; if (pedanticmode && f == 0 && !endmovement(cr, TRUE)) return -1; if (f < 0) return f; if (f == 0) { if (releasing) cr->tdir = tdir; return 0; } cr->tdir = NIL; } if (!continuemovement(cr)) { if (!endmovement(cr, FALSE)) return -1; } return +1; } #ifndef NDEBUG /* * Debugging functions. */ /* Print out a rough image of the level and the list of creatures. */ static void dumpmap(void) { creature *cr; int y, x; for (y = 0 ; y < CXGRID * CYGRID ; y += CXGRID) { for (x = 0 ; x < CXGRID ; ++x) fprintf(stderr, "%02X%c", state->map[y + x].top.id, (state->map[y + x].top.state ? state->map[y + x].top.state & 0x40 ? '*' : '.' : ' ')); fputc('\n', stderr); } fputc('\n', stderr); for (cr = creaturelist() ; cr->id ; ++cr) fprintf(stderr, "%02X%c%1d (%d %d)%s%s%s\n", cr->id, "-^"[(int)cr->dir], cr->moving, cr->pos % CXGRID, cr->pos / CXGRID, cr->hidden ? " dead" : "", cr->state & CS_SLIDETOKEN ? " slide-token" : "", cr->state & CS_REVERSE ? " reversing" : ""); fflush(stderr); } /* Run various sanity checks on the current game state. */ static void verifymap(void) { creature *cr; int pos; for (pos = 0 ; pos < CXGRID * CYGRID ; ++pos) { if (state->map[pos].top.id >= 0x40) warn("%d: Undefined floor %d at (%d %d)", currenttime(), state->map[pos].top.id, pos % CXGRID, pos / CXGRID); if (state->map[pos].top.state & 0x80) warn("%d: Undefined floor state %02X at (%d %d)", currenttime(), state->map[pos].top.id, pos % CXGRID, pos / CXGRID); } for (cr = creaturelist() ; cr->id ; ++cr) { if (isanimation(state->map[cr->pos].top.id)) { if (cr->moving > 12) warn("%d: Too-large animation frame %02X at (%d %d)", currenttime(), cr->moving, cr->pos % CXGRID, cr->pos / CXGRID); continue; } if (cr->id < 0x40 || cr->id >= 0x80) warn("%d: Undefined creature %d:%d at (%d %d)", currenttime(), cr - creaturelist(), cr->id, cr->pos % CXGRID, cr->pos / CXGRID); if (cr->pos < 0 || cr->pos >= CXGRID * CYGRID) warn("%d: Creature %d:%d has left the map: %04X", currenttime(), cr - creaturelist(), cr->id, cr->pos); if (isanimation(cr->id)) continue; if (cr->dir > EAST && (cr->dir != NIL || cr->id != Block)) warn("%d: Creature %d:%d moving in illegal direction (%d)", currenttime(), cr - creaturelist(), cr->id, cr->dir); if (cr->dir == NIL) warn("%d: Creature %d:%d lacks direction", currenttime(), cr - creaturelist(), cr->id); if (cr->moving > 8) warn("%d: Creature %d:%d has a moving time of %d", currenttime(), cr - creaturelist(), cr->id, cr->moving); if (cr->moving < 0) warn("%d: Creature %d:%d has a negative moving time: %d", currenttime(), cr - creaturelist(), cr->id, cr->moving); } } #endif /* * Per-tick maintenance functions. */ /* Actions and checks that occur at the start of every tick. */ static void initialhousekeeping(void) { creature *chip; creature *cr; int pos; #ifndef NDEBUG verifymap(); #endif if (currenttime() == 0) { lastrndslidedir = rndslidedir(); laststepping = stepping(); } chip = getchip(); if (chip->id == Pushing_Chip) chip->id = Chip; if (!inendgame()) { if (completed()) { startendgametimer(); timeoffset() = 1; } else if (timelimit() && currenttime() >= timelimit()) { removechip(CHIP_OUTOFTIME, NULL); } } for (cr = creaturelist() ; cr->id ; ++cr) { if (cr != getchip() && cr->hidden) continue; if (cr->state & CS_REVERSE) { cr->state &= ~CS_REVERSE; if (cr->moving <= 0) cr->dir = back(cr->dir); } } for (cr = creaturelist() ; cr->id ; ++cr) { if (cr->state & CS_PUSHED) { if (cr->hidden || cr->moving <= 0) { stopsoundeffect(SND_BLOCK_MOVING); cr->state &= ~CS_PUSHED; } } } if (togglestate()) { for (pos = 0 ; pos < CXGRID * CYGRID ; ++pos) { if (floorat(pos) == SwitchWall_Open || floorat(pos) == SwitchWall_Closed) floorat(pos) ^= togglestate(); } togglestate() = 0; } #ifndef NDEBUG if (currentinput() == CmdDebugCmd2) { dumpmap(); exit(0); currentinput() = NIL; } else if (currentinput() == CmdDebugCmd1) { static int mark = 0; warn("Mark %d (%d).", ++mark, currenttime()); currentinput() = NIL; } if (currentinput() >= CmdCheatNorth && currentinput() <= CmdCheatICChip) { switch (currentinput()) { case CmdCheatNorth: --yviewoffset(); break; case CmdCheatWest: --xviewoffset(); break; case CmdCheatSouth: ++yviewoffset(); break; case CmdCheatEast: ++xviewoffset(); break; case CmdCheatHome: xviewoffset()=yviewoffset()=0; break; case CmdCheatKeyRed: ++possession(Key_Red); break; case CmdCheatKeyBlue: ++possession(Key_Blue); break; case CmdCheatKeyYellow: ++possession(Key_Yellow); break; case CmdCheatKeyGreen: ++possession(Key_Green); break; case CmdCheatBootsIce: ++possession(Boots_Ice); break; case CmdCheatBootsSlide: ++possession(Boots_Slide); break; case CmdCheatBootsFire: ++possession(Boots_Fire); break; case CmdCheatBootsWater: ++possession(Boots_Water); break; case CmdCheatICChip: if (chipsneeded()) --chipsneeded(); break; } currentinput() = NIL; setnosaving(); } #endif chiptopos() = -1; chiptocr() = NULL; } /* Actions and checks that occur at the end of every tick. */ static void finalhousekeeping(void) { return; } /* Set the state fields specifically used to produce the output. */ static void preparedisplay(void) { creature *chip; int floor; chip = getchip(); floor = floorat(chip->pos); xviewpos() = (chip->pos % CXGRID) * 8 + xviewoffset() * 8; yviewpos() = (chip->pos / CXGRID) * 8 + yviewoffset() * 8; if (chip->moving) { switch (chip->dir) { case NORTH: yviewpos() += chip->moving; break; case WEST: xviewpos() += chip->moving; break; case SOUTH: yviewpos() -= chip->moving; break; case EAST: xviewpos() -= chip->moving; break; } } if (!chip->hidden) { if (floor == HintButton && chip->moving <= 0) showhint(); else hidehint(); if (chip->id == Chip && chippushing()) chip->id = Pushing_Chip; if (chip->moving) { resetfloorsounds(FALSE); if (floor == Fire && possession(Boots_Fire)) addsoundeffect(SND_FIREWALKING); else if (floor == Water && possession(Boots_Water)) addsoundeffect(SND_WATERWALKING); else if (isice(floor)) { if (possession(Boots_Ice)) addsoundeffect(SND_ICEWALKING); else if (floor == Ice) addsoundeffect(SND_SKATING_FORWARD); else addsoundeffect(SND_SKATING_TURN); } else if (isslide(floor)) { if (possession(Boots_Slide)) addsoundeffect(SND_SLIDEWALKING); else addsoundeffect(SND_SLIDING); } } if (chipstuck() && isice(floor)) addsoundeffect(SND_SKATING_FORWARD); } } /* * The functions provided by the gamelogic struct. */ /* Initialize the gamestate structure to the state at the beginning of * the level, using the data in the associated gamesetup structure. * The level map is decoded and assembled, the list of creatures is * drawn up, and other miscellaneous initializations are performed. */ static int initgame(gamelogic *logic) { creature crtemp; creature *cr; mapcell *cell; xyconn *xy; int pos, num, n; setstate(logic); num = state->game->number; creaturelist() = creaturearray + 1; cr = creaturelist(); if (pedanticmode) if (state->statusflags & SF_BADTILES) markinvalid(); n = -1; for (pos = 0, cell = state->map ; pos < CXGRID * CYGRID ; ++pos, ++cell) { if (cell->top.id == Block_Static) cell->top.id = crtile(Block, NORTH); if (cell->bot.id == Block_Static) cell->bot.id = crtile(Block, NORTH); if (ismsspecial(cell->top.id) && cell->top.id != Exited_Chip) { cell->top.id = Wall; if (pedanticmode) markinvalid(); } if (ismsspecial(cell->bot.id) && cell->bot.id != Exited_Chip) { cell->bot.id = Wall; if (pedanticmode) markinvalid(); } if (cell->bot.id != Empty) { if (!isfloor(cell->bot.id) || isfloor(cell->top.id)) { warn("level %d: invalid \"buried\" tile at (%d %d)", num, pos % CXGRID, pos / CXGRID); markinvalid(); } } if (iscreature(cell->top.id)) { cr->pos = pos; cr->id = creatureid(cell->top.id); cr->dir = creaturedirid(cell->top.id); if (pedanticmode) { if (cr->id == Block && isice(cell->bot.id)) cr->dir = NIL; } cr->moving = 0; cr->hidden = FALSE; if (cr->id == Chip) { if (n >= 0) { warn("level %d: multiple Chips on the map!", num); markinvalid(); } n = cr - creaturelist(); cr->dir = SOUTH; cr->state = 0; } else { cr->state = 0; claimlocation(pos); } setfdir(cr, NIL); cr->tdir = NIL; cr->frame = 0; ++cr; cell->top.id = cell->bot.id; cell->bot.id = Empty; } if (pedanticmode) if (cell->top.id == Wall_North || cell->top.id == Wall_West) markinvalid(); if (cell->top.id == Beartrap) markbeartrap(pos); if (cell->top.id == Teleport) markteleport(pos); } if (n < 0) { warn("level %d: Chip isn't on the map!", num); markinvalid(); n = cr - creaturelist(); cr->pos = 0; cr->hidden = TRUE; ++cr; } cr->pos = -1; cr->id = Nothing; cr->dir = NIL; creaturelistend() = cr - 1; if (n) { cr = creaturelist(); crtemp = cr[0]; cr[0] = cr[n]; cr[n] = crtemp; } for (xy = traplist(), n = traplistsize() ; n ; --n, ++xy) { if (xy->from >= CXGRID * CYGRID || xy->to >= CXGRID * CYGRID) { warn("Level %d: ignoring off-map beartrap wiring", num); xy->from = -1; } else if (floorat(xy->from) != Button_Brown) { warn("Level %d: invalid beartrap wiring: no button at (%d %d)", num, xy->from % CXGRID, xy->to / CXGRID); } else if (floorat(xy->to) != Beartrap) { warn("Level %d: disabling miswired beartrap button at (%d %d)", num, xy->to % CXGRID, xy->to / CXGRID); xy->from = -1; } } for (xy = clonerlist(), n = clonerlistsize() ; n ; --n, ++xy) { if (xy->from >= CXGRID * CYGRID || xy->to >= CXGRID * CYGRID) { warn("Level %d: ignoring off-map cloner wiring", num); xy->from = -1; } else if (floorat(xy->from) != Button_Red) { warn("Level %d: invalid cloner wiring: no button at (%d %d)", num, xy->from % CXGRID, xy->to / CXGRID); } else if (floorat(xy->to) != CloneMachine) { warn("Level %d: disabling miswired cloner button at (%d %d)", num, xy->to % CXGRID, xy->to / CXGRID); xy->from = -1; } } possession(Key_Red) = possession(Key_Blue) = possession(Key_Yellow) = possession(Key_Green) = 0; possession(Boots_Ice) = possession(Boots_Slide) = possession(Boots_Fire) = possession(Boots_Water) = 0; resetendgametimer(); togglestate() = 0; couldntmove() = FALSE; chippushing() = FALSE; chipstuck() = (pedanticmode ? isice(floorat(chippos())) : FALSE); mapbreached() = FALSE; completed() = FALSE; chiptopos() = -1; chiptocr() = NULL; putwall() = -1; prngvalue1() = 0; prngvalue2() = 0; rndslidedir() = lastrndslidedir; stepping() = laststepping; xviewoffset() = 0; yviewoffset() = 0; preparedisplay(); state->soundeffects = 0; return !ismarkedinvalid(); } /* Advance the game state by one tick. */ static int advancegame(gamelogic *logic) { creature *cr; setstate(logic); initialhousekeeping(); for (cr = creaturelistend() ; cr >= creaturelist() ; --cr) { if (cr != getchip() && cr->hidden) continue; if (isanimation(cr->id)) { --cr->frame; if (cr->frame < 0) removeanimation(cr); continue; } if (cr == getchip() && inendgame()) continue; if (cr->moving <= 0) choosemove(cr); } cr = getchip(); if (getfdir(cr) == NIL && cr->tdir == NIL) couldntmove() = FALSE; else checkmovingto(); for (cr = creaturelistend() ; cr >= creaturelist() ; --cr) { if (cr == getchip() && completed()) continue; if (cr != getchip() && cr->hidden) continue; if (advancecreature(cr, FALSE) < 0) continue; cr->tdir = NIL; setfdir(cr, NIL); if (pedanticmode && floorat(cr->pos) == PopupWall) { if (cr != getchip()) putwall() = chippos(); } if (floorat(cr->pos) == Button_Brown && cr->moving <= 0) springtrap(trapfrombutton(cr->pos)); } for (cr = creaturelistend() ; cr >= creaturelist() ; --cr) { if (cr->hidden) continue; if (cr->moving) continue; if (floorat(cr->pos) == Teleport) teleportcreature(cr); } if (putwall() != -1) { if (!getchip()->hidden) { if (floorat(chippos()) == Beartrap) springtrap(chippos()); floorat(putwall()) = Wall; } putwall() = -1; } finalhousekeeping(); preparedisplay(); if (inendgame()) { --timeoffset(); if (!decrendgametimer()) { resetfloorsounds(TRUE); return completed() ? +1 : -1; } } return 0; } /* Free resources associated with the current game state. */ static int endgame(gamelogic *logic) { (void)logic; return TRUE; } /* Free all allocated resources for this module. */ static void shutdown(gamelogic *logic) { (void)logic; free(creaturearray); creaturearray = NULL; } /* The exported function: Initialize and return the module's gamelogic * structure. */ gamelogic *lynxlogicstartup(void) { static gamelogic logic; creaturearray = calloc(MAX_CREATURES + 1, sizeof *creaturearray); if (!creaturearray) memerrexit(); lastrndslidedir = NORTH; laststepping = 0; logic.ruleset = Ruleset_Lynx; logic.initgame = initgame; logic.advancegame = advancegame; logic.endgame = endgame; logic.shutdown = shutdown; return &logic; } tworld-2.3.0/messages.cpp000066400000000000000000000053101475511570500153530ustar00rootroot00000000000000/* messages.cpp: Functions for end-of-game messages. * * Copyright (C) 2014 by Eric Schmidt, under the GNU General Public * License. No warranty. See COPYING for details. */ #include "messages.h" #include "fileio.h" #include "res.h" #include #include #include #include #include #include #include using std::bitset; using std::ifstream; using std::find; using std::getline; using std::istringstream; using std::strcpy; using std::string; using std::vector; namespace { vector messages; vector typeindex[MessageTypeCount]; size_t current[MessageTypeCount]; } int const maxMessageSize = 511; char const * messageTypeNames[MessageTypeCount] = { "win", "die", "time" }; int loadmessagesfromfile(char const *filename) { char *fname = getpathforfileindir(resdir, filename); ifstream in(fname); free(fname); if (!in) return FALSE; vector newmessages; vector newtypeindex[MessageTypeCount]; bitset isactive; isactive.set(MessageDie); string line; while (getline(in, line)) { // Just in case DOS line endings on Linux. Not sure if needed. string::iterator rpos(find(line.begin(), line.end(), '\r')); if (rpos != line.end()) line.erase(rpos); if (line.empty()) continue; if (line[0] == ':') { isactive.reset(); istringstream in(line); in.get(); // Discard ':' string type; while (in >> type) { int typenum = find(messageTypeNames, messageTypeNames + MessageTypeCount, type) - messageTypeNames; if (typenum < MessageTypeCount) isactive.set(typenum); } } else { for (size_t i = 0; i < isactive.size(); ++i) { if (isactive[i]) newtypeindex[i].push_back(newmessages.size()); } line = line.substr(0, maxMessageSize+1); newmessages.push_back(line); } } messages.swap(newmessages); for (size_t i = 0; i < MessageTypeCount; ++i) { typeindex[i].swap(newtypeindex[i]); current[i] = 0; } return TRUE; } char const *getmessage(int type) { static char buf[maxMessageSize+1]; if ((type < 0) || (type >= MessageTypeCount) || typeindex[type].size() == 0) return nullptr; size_t const mnum = typeindex[type][current[type]]; char const *s = messages[mnum].c_str(); current[type] = (current[type] + 1) % typeindex[type].size(); strcpy(buf, s); return buf; } tworld-2.3.0/messages.h000066400000000000000000000007301475511570500150210ustar00rootroot00000000000000/* messages.h: Functions for end-of-game messages. * * Copyright (C) 2014 by Eric Schmidt, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_messages_h_ #define HEADER_messages_h_ #ifdef __cplusplus extern "C" { #endif enum { MessageWin, MessageDie, MessageTime, MessageTypeCount }; int loadmessagesfromfile(char const *filename); char const *getmessage(int type); #ifdef __cplusplus } #endif #endif tworld-2.3.0/mklynxcc.c000066400000000000000000000043031475511570500150350ustar00rootroot00000000000000/* mklynxcc.c: Written by Brian Raiter, 2001. * * This is a quick hack that can be used to make .dat files that use * the Lynx ruleset. Run the program, giving it the name of a .dat * file, and the program will modify the .dat file to mark it as being * for the Lynx ruleset. * * This source code is in the public domain. */ #include #include #include #include #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /* The magic numbers of the .dat file. */ #define CHIPS_SIGBYTE_1 0xAC #define CHIPS_SIGBYTE_2 0xAA #define CHIPS_SIGBYTE_3 0x02 /* Error return values. */ #define ERR_BAD_CMDLINE 127 #define ERR_NOT_DATFILE 126 #define ERR_NOT_MS_DATFILE 125 /* The file to alter. */ static FILE *fp = NULL; static char const *file = NULL; /* Replace a byte in the file. */ static int changebyte(unsigned long pos, unsigned char byte) { if (fseek(fp, pos, SEEK_SET) == 0 && fputc(byte, fp) != EOF) return TRUE; perror(file); return FALSE; } /* Return FALSE if the file is not a .dat file. */ static int sanitycheck(void) { unsigned char header[4]; int n; n = fread(header, 1, 4, fp); if (n < 0) { perror(file); return FALSE; } if (n < 4 || header[0] != CHIPS_SIGBYTE_1 || header[1] != CHIPS_SIGBYTE_2 || header[2] != CHIPS_SIGBYTE_3) { fprintf(stderr, "%s is not a valid .dat file\n", file); errno = ERR_NOT_DATFILE; return FALSE; } if (header[3] != 0) { if (header[3] == 1) fprintf(stderr, "%s is already set for the Lynx ruleset\n", file); else fprintf(stderr, "%s is not set for the MS ruleset\n", file); errno = ERR_NOT_MS_DATFILE; return FALSE; } rewind(fp); return TRUE; } int main(int argc, char *argv[]) { int ret = 0; int n; if (argc < 2) { fprintf(stderr, "Usage: %s DATFILE ...\n", argv[0]); return ERR_BAD_CMDLINE; } for (n = 1 ; n < argc ; ++n) { file = argv[n]; if ((fp = fopen(file, "r+b")) == NULL) { perror(file); ret = errno; continue; } if (sanitycheck() && changebyte(3, 1)) printf("%s was successfully altered\n", file); else ret = errno; fclose(fp); } return ret; } tworld-2.3.0/mslogic.c000066400000000000000000002163621475511570500146540ustar00rootroot00000000000000/* mslogic.c: The game logic for the MS ruleset. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include "defs.h" #include "err.h" #include "state.h" #include "random.h" #include "logic.h" #ifdef NDEBUG #define _assert(test) ((void)0) #else #define _assert(test) ((test) || (die("internal error: failed sanity check (%s)\nPlease report this error to https://github.com/SicklySilverMoon/tworld/issues", #test), 0)) #endif /* A list of ways for Chip to lose. */ enum { CHIP_OKAY = 0, CHIP_DROWNED, CHIP_BURNED, CHIP_BOMBED, CHIP_OUTOFTIME, CHIP_COLLIDED, CHIP_SQUISHED, CHIP_SQUISHED_DEATH, /* added with Squish patch */ CHIP_NOTOKAY }; /* Forward declaration of a central function. */ static int advancecreature(creature* cr, int dir); /* The most recently used stepping phase value. */ static int laststepping = 0; /* A pointer to the game state, used so that it doesn't have to be * passed to every single function. */ static gamestate* state; /* * Accessor macros for various fields in the game state. Many of the * macros can be used as an lvalue. */ #define setstate(p) (state = (p)->state) #define getchip() (creatures[0]) #define chippos() (getchip()->pos) #define chipdir() (getchip()->dir) #define chipsneeded() (state->chipsneeded) #define clonerlist() (state->cloners) #define clonerlistsize() (state->clonercount) #define traplist() (state->traps) #define traplistsize() (state->trapcount) #define timelimit() (state->timelimit) #define timeoffset() (state->timeoffset) #define stepping() (state->stepping) #define currenttime() (state->currenttime) #define currentinput() (state->currentinput) #define xviewpos() (state->xviewpos) #define yviewpos() (state->yviewpos) #define mainprng() (&state->mainprng) #define lastmove() (state->lastmove) #define addsoundeffect(sfx) (state->soundeffects |= 1 << (sfx)) #define cellat(pos) (&state->map[pos]) #define setnosaving() (state->statusflags |= SF_NOSAVING) #define showhint() (state->statusflags |= SF_SHOWHINT) #define hidehint() (state->statusflags &= ~SF_SHOWHINT) #define getmsstate() (state->msstate) #define completed() (getmsstate().completed) #define chipstatus() (getmsstate().chipstatus) #define chipwait() (getmsstate().chipwait) #define controllerdir() (getmsstate().controllerdir) #define lastslipdir() (getmsstate().lastslipdir) #define xviewoffset() (getmsstate().xviewoffset) #define yviewoffset() (getmsstate().yviewoffset) #define goalpos() (getmsstate().goalpos) #define hasgoal() (goalpos() >= 0) #define cancelgoal() (goalpos() = -1) #define possession(obj) (*checkpossession(obj)) static short* checkpossession(int obj) { switch (obj) { case Key_Red: return &state->keys[0]; case Key_Blue: return &state->keys[1]; case Key_Yellow: return &state->keys[2]; case Key_Green: return &state->keys[3]; case Boots_Ice: return &state->boots[0]; case Boots_Slide: return &state->boots[1]; case Boots_Fire: return &state->boots[2]; case Boots_Water: return &state->boots[3]; case Door_Red: return &state->keys[0]; case Door_Blue: return &state->keys[1]; case Door_Yellow: return &state->keys[2]; case Door_Green: return &state->keys[3]; case Ice: return &state->boots[0]; case IceWall_Northwest: return &state->boots[0]; case IceWall_Northeast: return &state->boots[0]; case IceWall_Southwest: return &state->boots[0]; case IceWall_Southeast: return &state->boots[0]; case Slide_North: return &state->boots[1]; case Slide_West: return &state->boots[1]; case Slide_South: return &state->boots[1]; case Slide_East: return &state->boots[1]; case Slide_Random: return &state->boots[1]; case Fire: return &state->boots[2]; case Water: return &state->boots[3]; } warn("Invalid object %d handed to possession()", obj); _assert(!"possession() called with an invalid object"); return NULL; } /* * Memory allocation functions for the various arenas. */ /* The creature pool is a linked list of lumps, each lump holding this * many creatures. */ #define crpoollumpsize 256 /* The data that makes up one lump of the creature pool. */ typedef struct crpoollump crpoollump; struct crpoollump { int count; /* number of unused creatures */ crpoollump* prev; /* the previously allocated lump */ crpoollump* next; /* the next lump after this one */ creature lump[crpoollumpsize]; /* the lump proper */ }; /* The data associated with a sliding object. */ typedef struct slipper { creature* cr; int dir; } slipper; /* The linked list of creature pools, forming the creature arena. */ static crpoollump* currentcrpoollump = NULL; /* The list of active creatures. */ static creature** creatures = NULL; static int creaturecount = 0; static int creaturesallocated = 0; /* The list of "active" blocks. */ static creature** blocks = NULL; static int blockcount = 0; static int blocksallocated = 0; /* The list of sliding creatures. */ static slipper* slips = NULL; static int slipcount = 0; static int slipsallocated = 0; /* Mark all entries in the creature arena as unused. */ static void resetcreaturepool(void) { if (currentcrpoollump) while (currentcrpoollump->prev) currentcrpoollump = currentcrpoollump->prev; } /* Destroy the creature arena. */ static void freecreaturepool(void) { crpoollump* next; resetcreaturepool(); while (currentcrpoollump) { next = currentcrpoollump->next; free(currentcrpoollump); currentcrpoollump = next; } } /* Return a pointer to a fresh creature. */ static creature* allocatecreature(void) { crpoollump* next; creature* cr; if (!currentcrpoollump || currentcrpoollump->count == 0) { if (currentcrpoollump && currentcrpoollump->next) { currentcrpoollump = currentcrpoollump->next; currentcrpoollump->count = crpoollumpsize; } else { next = malloc(sizeof *next); if (!next) memerrexit(); next->count = crpoollumpsize; next->prev = currentcrpoollump; next->next = NULL; if (currentcrpoollump) currentcrpoollump->next = next; currentcrpoollump = next; } } --currentcrpoollump->count; cr = currentcrpoollump->lump + currentcrpoollump->count; cr->id = Nothing; cr->pos = -1; cr->dir = NIL; cr->tdir = NIL; cr->state = 0; cr->frame = 0; cr->hidden = FALSE; cr->moving = 0; return cr; } /* Empty the list of active creatures. */ static void resetcreaturelist(void) { creaturecount = 0; } /* Append the given creature to the end of the creature list. */ static creature* addtocreaturelist(creature* cr) { if (creaturecount >= creaturesallocated) { creaturesallocated = creaturesallocated ? creaturesallocated * 2 : 16; creatures = realloc(creatures, creaturesallocated * sizeof *creatures); if (!creatures) memerrexit(); } creatures[creaturecount++] = cr; return cr; } /* Empty the list of "active" blocks. */ static void resetblocklist(void) { blockcount = 0; } /* Append the given block to the end of the block list. */ static creature* addtoblocklist(creature* cr) { if (blockcount >= blocksallocated) { blocksallocated = blocksallocated ? blocksallocated * 2 : 16; blocks = realloc(blocks, blocksallocated * sizeof *blocks); if (!blocks) memerrexit(); } blocks[blockcount++] = cr; return cr; } /* Empty the list of sliding creatures. */ static void resetsliplist(void) { slipcount = 0; } static int msccslippers; /* Append the given creature to the end of the slip list. */ static creature* appendtosliplist(creature* cr, int dir) { int n; for (n = 0; n < slipcount; ++n) { if (slips[n].cr == cr) { slips[n].dir = dir; return cr; } } if (slipcount >= slipsallocated) { slipsallocated = slipsallocated ? slipsallocated * 2 : 16; slips = realloc(slips, slipsallocated * sizeof *slips); if (!slips) memerrexit(); } slips[slipcount].cr = cr; slips[slipcount].dir = dir; ++slipcount; msccslippers++; /* new accounting */ return cr; } /* Add the given creature to the start of the slip list. */ static creature* prependtosliplist(creature* cr, int dir) { int n; if (slipcount && slips[0].cr == cr) { slips[0].dir = dir; return cr; } if (slipcount >= slipsallocated) { slipsallocated = slipsallocated ? slipsallocated * 2 : 16; slips = realloc(slips, slipsallocated * sizeof *slips); if (!slips) memerrexit(); } for (n = slipcount; n; --n) slips[n] = slips[n - 1]; ++slipcount; slips[0].cr = cr; slips[0].dir = dir; return cr; } /* Return the sliding direction of a creature on the slip list. */ static int getslipdir(creature* cr) { int n; for (n = 0; n < slipcount; ++n) if (slips[n].cr == cr) return slips[n].dir; return NIL; } /* Remove the given creature from the slip list. */ static void removefromsliplist(creature* cr) { int n; for (n = 0; n < slipcount; ++n) if (slips[n].cr == cr) break; if (n == slipcount) return; --slipcount; for (; n < slipcount; ++n) slips[n] = slips[n + 1]; } /* * Simple floor functions. */ /* Floor state flags. */ #define FS_BUTTONDOWN 0x01 /* button press is deferred */ #define FS_CLONING 0x02 /* clone machine is activated */ #define FS_BROKEN 0x04 /* teleport/toggle wall doesn't work */ #define FS_HASMUTANT 0x08 /* beartrap contains mutant block */ #define FS_MARKER 0x10 /* marker used during initialization */ /* Translate a slide floor into the direction it points in. In the * case of a random slide floor, a new direction is selected. */ static int getslidedir(int floor) { switch (floor) { case Slide_North: return NORTH; case Slide_West: return WEST; case Slide_South: return SOUTH; case Slide_East: return EAST; case Slide_Random: return 1 << random4(mainprng()); } return NIL; } /* Alter a creature's direction if they are at an ice wall. */ static int icewallturn(int floor, int dir) { switch (floor) { case IceWall_Northeast: return dir == SOUTH ? EAST : dir == WEST ? NORTH : dir; case IceWall_Southwest: return dir == NORTH ? WEST : dir == EAST ? SOUTH : dir; case IceWall_Northwest: return dir == SOUTH ? WEST : dir == EAST ? NORTH : dir; case IceWall_Southeast: return dir == NORTH ? EAST : dir == WEST ? SOUTH : dir; } return dir; } /* Find the location of a bear trap from one of its buttons. */ static int trapfrombutton(int pos) { xyconn* traps; int i; traps = traplist(); for (i = traplistsize(); i; ++traps, --i) if (traps->from == pos) return traps->to; return -1; } /* Find the location of a clone machine from one of its buttons. */ static int clonerfrombutton(int pos) { xyconn* cloners; int i; cloners = clonerlist(); for (i = clonerlistsize(); i; ++cloners, --i) if (cloners->from == pos) return cloners->to; return -1; } /* Return the floor tile found at the given location. */ static int floorat(int pos) { mapcell* cell; cell = cellat(pos); if (!iskey(cell->top.id) && !isboots(cell->top.id) && !iscreature(cell->top.id)) return cell->top.id; if (!iskey(cell->bot.id) && !isboots(cell->bot.id) && !iscreature(cell->bot.id)) return cell->bot.id; return Empty; } /* Return a pointer to the tile that forms the floor at the given * location. */ static maptile* getfloorat(int pos) { mapcell* cell; cell = cellat(pos); if (!iskey(cell->top.id) && !isboots(cell->top.id) && !iscreature(cell->top.id)) return &cell->top; if (!iskey(cell->bot.id) && !isboots(cell->bot.id) && !iscreature(cell->bot.id)) return &cell->bot; return &cell->bot; /* ? */ } /* Return TRUE if the brown button at the give location is currently * held down. */ static int istrapbuttondown(int pos) { return pos >= 0 && pos < CXGRID * CYGRID && cellat(pos)->top.id != Button_Brown; } /* Place a new tile at the given location, causing the current upper * tile to become the lower tile. */ static void pushtile(int pos, maptile tile) { mapcell* cell; cell = cellat(pos); cell->bot = cell->top; cell->top = tile; } /* Remove the upper tile from the given location, causing the current * lower tile to become uppermost. */ static maptile poptile(int pos) { maptile tile; mapcell* cell; cell = cellat(pos); tile = cell->top; cell->top = cell->bot; cell->bot.id = Empty; cell->bot.state = 0; return tile; } /* Return TRUE if a bear trap is currently passable. */ static int istrapopen(int pos, int skippos) { xyconn* traps; int i; traps = traplist(); for (i = traplistsize(); i; ++traps, --i) if (traps->to == pos && traps->from != skippos && istrapbuttondown(traps->from)) return TRUE; return FALSE; } /* Flip-flop the state of any toggle walls. */ static void togglewalls(void) { mapcell* cell; int pos; for (pos = 0; pos < CXGRID * CYGRID; ++pos) { cell = cellat(pos); if ((cell->top.id == SwitchWall_Open || cell->top.id == SwitchWall_Closed) && !(cell->top.state & FS_BROKEN)) cell->top.id ^= SwitchWall_Open ^ SwitchWall_Closed; if ((cell->bot.id == SwitchWall_Open || cell->bot.id == SwitchWall_Closed) && !(cell->bot.state & FS_BROKEN)) cell->bot.id ^= SwitchWall_Open ^ SwitchWall_Closed; } } /* * Functions that manage the list of entities. */ /* Creature state flags. */ #define CS_RELEASED 0x01 /* can leave a beartrap */ #define CS_CLONING 0x02 /* cannot move this tick */ #define CS_HASMOVED 0x04 /* already used current move */ #define CS_TURNING 0x08 /* is turning around */ #define CS_SLIP 0x10 /* is on the slip list */ #define CS_SLIDE 0x20 /* is on the slip list but can move */ #define CS_DEFERPUSH 0x40 /* button pushes will be delayed */ #define CS_MUTANT 0x80 /* block is mutant, looks like Chip */ /* Return the creature located at pos. Ignores Chip unless includechip * is TRUE. Return NULL if no such creature is present. */ static creature* lookupcreature(int pos, int includechip) { int n; if (!creatures) return NULL; for (n = 0; n < creaturecount; ++n) { if (creatures[n]->hidden) continue; if (creatures[n]->pos == pos) if (creatures[n]->id != Chip || includechip) return creatures[n]; } return NULL; } /* Return the block located at pos. If the block in question is not * currently "active", it is automatically added to the block list. */ static creature* lookupblock(int pos) { creature* cr; int id, n; if (blocks) { for (n = 0; n < blockcount; ++n) if (blocks[n]->pos == pos && !blocks[n]->hidden) return blocks[n]; } cr = allocatecreature(); cr->id = Block; cr->pos = pos; id = cellat(pos)->top.id; if (id == Block_Static) cr->dir = NIL; else if (creatureid(id) == Block) cr->dir = creaturedirid(id); else _assert(!"lookupblock() called on blockless location"); return addtoblocklist(cr); } /* Update the given creature's tile on the map to reflect its current * state. */ static void updatecreature(creature const* cr) { maptile* tile; int id, dir; if (cr->hidden) return; tile = &cellat(cr->pos)->top; id = cr->id; if (id == Block) { tile->id = Block_Static; if (cr->state & CS_MUTANT) tile->id = crtile(Chip, NORTH); return; } else if (id == Chip) { if (chipstatus()) { switch (chipstatus()) { case CHIP_BURNED: tile->id = Burned_Chip; return; case CHIP_DROWNED: tile->id = Drowned_Chip; return; } } else if (cellat(cr->pos)->bot.id == Water) { id = Swimming_Chip; } } dir = cr->dir; if (cr->state & CS_TURNING) dir = right(dir); tile->id = crtile(id, dir); tile->state = 0; } /* Add the given creature's tile to the map. */ static void addcreaturetomap(creature const* cr) { static maptile const dummy = {Empty, 0}; if (cr->hidden) return; pushtile(cr->pos, dummy); updatecreature(cr); } /* Enervate an inert creature. */ static creature* awakencreature(int pos) { creature* new; int tileid; tileid = cellat(pos)->top.id; if (!iscreature(tileid) || creatureid(tileid) == Chip) return NULL; new = allocatecreature(); new->id = creatureid(tileid); new->dir = creaturedirid(tileid); new->pos = pos; return new->id == Block ? addtoblocklist(new) : addtocreaturelist(new); } /* Mark a creature as dead. */ static void removecreature(creature* cr) { cr->state &= ~(CS_SLIP | CS_SLIDE); if (cr->id == Chip) { if (chipstatus() == CHIP_OKAY) chipstatus() = CHIP_NOTOKAY; } else cr->hidden = TRUE; } /* Turn around any and all tanks. (A tank that is halfway through the * process of moving at the time is given special treatment.) */ static void turntanks(creature const* inmidmove) { int n; for (n = 0; n < creaturecount; ++n) { creature* cr = creatures[n]; /* convenience, Tank Top Glitch */ if (cr->hidden || cr->id != Tank) continue; cr->dir = back(cr->dir); if (cr->state & CS_SLIP && !(cr->state & CS_SLIDE) && cr->frame != 0 && cr->moving == 0) /* cr->moving: SGG instead */ cr->dir = back(cr->frame); /* Tank Top Glitch */ if (!(cr->state & CS_TURNING)) cr->state |= CS_TURNING | CS_HASMOVED; if (cr == inmidmove) continue; if (creatureid(cellat(cr->pos)->top.id) == Tank) { updatecreature(cr); } else if (cr->moving != 0) { /* handle Spontaneous Generation */ if (cr->state & CS_TURNING) { /* always TRUE? */ cr->state &= ~CS_TURNING; updatecreature(cr); cr->state |= CS_TURNING; } cr->dir = back(cr->dir); /* OK with SGG, bad for stacked tanks */ } } } /* * Maintaining the slip list. */ /* Add the given creature to the slip list if it is not already on it * (assuming that the given floor is a kind that causes slipping). */ static void startfloormovement(creature* cr, int floor, int fdir) { int dir = fdir; /* fdir used with tank reversal when stuck on teleporter */ cr->state &= ~(CS_SLIP | CS_SLIDE); if (isice(floor)) { if (fdir == NIL) { /* tank reversal patch */ dir = icewallturn(floor, cr->dir); } } else if (isslide(floor)) dir = getslidedir(floor); else if (floor == Teleport) { if (fdir == NIL) dir = cr->dir; /* tank reversal patch */ } else if (floor == Beartrap && cr->id == Block) dir = cr->dir; else if (cr->id != Chip) /* new with Convergence Patch */ return; else dir = cr->dir; /* new with Convergence Patch */ if (cr->id == Chip) { /* changed with Convergence Patch */ /* cr->state |= isslide(floor) ? CS_SLIDE : CS_SLIP; */ cr->state |= (isice(floor) || (floor == Teleport && dir != NIL)) ? CS_SLIP : CS_SLIDE; prependtosliplist(cr, dir); cr->dir = dir; updatecreature(cr); } else { cr->state |= CS_SLIP; cr->frame = 0; /* safety with Tank Top Glitch */ appendtosliplist(cr, dir); } } /* Remove the given creature from the slip list. */ static void endfloormovement(creature* cr) { cr->state &= ~(CS_SLIP | CS_SLIDE); removefromsliplist(cr); } /* Clean out deadwood entries in the slip list. */ static void updatesliplist() { int n; for (n = slipcount - 1; n >= 0; --n) if (!(slips[n].cr->state & (CS_SLIP | CS_SLIDE))) endfloormovement(slips[n].cr); } /* * The laws of movement across the various floors. * * Chip, blocks, and other creatures all have slightly different rules * about what sort of tiles they are permitted to move into. The * following lookup table encapsulates these rules. Note that these * rules are only the first check; a creature may be occasionally * permitted a particular type of move but still prevented in a * specific situation. */ #define NWSE (NORTH | WEST | SOUTH | EAST) static struct { unsigned char chip, block, creature; } const movelaws[] = { /* Nothing */ {0, 0, 0}, /* Empty */ {NWSE, NWSE, NWSE}, /* Slide_North */ {NWSE, NWSE, NWSE}, /* Slide_West */ {NWSE, NWSE, NWSE}, /* Slide_South */ {NWSE, NWSE, NWSE}, /* Slide_East */ {NWSE, NWSE, NWSE}, /* Slide_Random */ {NWSE, NWSE, 0}, /* Ice */ {NWSE, NWSE, NWSE}, /* IceWall_Northwest */ {SOUTH | EAST, SOUTH | EAST, SOUTH | EAST}, /* IceWall_Northeast */ {SOUTH | WEST, SOUTH | WEST, SOUTH | WEST}, /* IceWall_Southwest */ {NORTH | EAST, NORTH | EAST, NORTH | EAST}, /* IceWall_Southeast */ {NORTH | WEST, NORTH | WEST, NORTH | WEST}, /* Gravel */ {NWSE, NWSE, 0}, /* Dirt */ {NWSE, 0, 0}, /* Water */ {NWSE, NWSE, NWSE}, /* Fire */ {NWSE, NWSE, NWSE}, /* Bomb */ {NWSE, NWSE, NWSE}, /* Beartrap */ {NWSE, NWSE, NWSE}, /* Burglar */ {NWSE, 0, 0}, /* HintButton */ {NWSE, NWSE, NWSE}, /* Button_Blue */ {NWSE, NWSE, NWSE}, /* Button_Green */ {NWSE, NWSE, NWSE}, /* Button_Red */ {NWSE, NWSE, NWSE}, /* Button_Brown */ {NWSE, NWSE, NWSE}, /* Teleport */ {NWSE, NWSE, NWSE}, /* Wall */ {0, 0, 0}, /* Wall_North */ {NORTH | WEST | EAST, NORTH | WEST | EAST, NORTH | WEST | EAST}, /* Wall_West */ {NORTH | WEST | SOUTH, NORTH | WEST | SOUTH, NORTH | WEST | SOUTH}, /* Wall_South */ {WEST | SOUTH | EAST, WEST | SOUTH | EAST, WEST | SOUTH | EAST}, /* Wall_East */ {NORTH | SOUTH | EAST, NORTH | SOUTH | EAST, NORTH | SOUTH | EAST}, /* Wall_Southeast */ {SOUTH | EAST, SOUTH | EAST, SOUTH | EAST}, /* HiddenWall_Perm */ {0, 0, 0}, /* HiddenWall_Temp */ {NWSE, 0, 0}, /* BlueWall_Real */ {NWSE, 0, 0}, /* BlueWall_Fake */ {NWSE, 0, 0}, /* SwitchWall_Open */ {NWSE, NWSE, NWSE}, /* SwitchWall_Closed */ {0, 0, 0}, /* PopupWall */ {NWSE, 0, 0}, /* CloneMachine */ {0, 0, 0}, /* Door_Red */ {NWSE, 0, 0}, /* Door_Blue */ {NWSE, 0, 0}, /* Door_Yellow */ {NWSE, 0, 0}, /* Door_Green */ {NWSE, 0, 0}, /* Socket */ {NWSE, 0, 0}, /* Exit */ {NWSE, NWSE, 0}, /* ICChip */ {NWSE, 0, 0}, /* Key_Red */ {NWSE, NWSE, NWSE}, /* Key_Blue */ {NWSE, NWSE, NWSE}, /* Key_Yellow */ {NWSE, NWSE, NWSE}, /* Key_Green */ {NWSE, NWSE, NWSE}, /* Boots_Ice */ {NWSE, NWSE, 0}, /* Boots_Slide */ {NWSE, NWSE, 0}, /* Boots_Fire */ {NWSE, NWSE, 0}, /* Boots_Water */ {NWSE, NWSE, 0}, /* Block_Static */ {NWSE, 0, 0}, /* Drowned_Chip */ {0, 0, 0}, /* Burned_Chip */ {0, 0, 0}, /* Bombed_Chip */ {0, 0, 0}, /* Exited_Chip */ {0, 0, 0}, /* Exit_Extra_1 */ {0, 0, 0}, /* Exit_Extra_2 */ {0, 0, 0}, /* Overlay_Buffer */ {0, 0, 0}, /* Floor_Reserved2 */ {0, 0, 0}, /* Floor_Reserved1 */ {0, 0, 0}, }; /* Including the flag CMM_NOLEAVECHECK in a call to canmakemove() * indicates that the tile the creature is moving out of is * automatically presumed to permit such movement. CMM_NOEXPOSEWALLS * causes blue and hidden walls to remain unexposed. * CMM_CLONECANTBLOCK means that the creature will not be prevented * from moving by an identical creature standing in the way. * CMM_NOPUSHING prevents Chip from pushing blocks inside this * function. CMM_TELEPORTPUSH indicates to the block-pushing logic * that Chip is teleporting. This prevents a stack of two blocks from * being treated as a single block, and allows Chip to push a slipping * block away from him. CMM_NOFIRECHECK causes bugs and walkers to not * avoid fire. Finally, CMM_NODEFERBUTTONS causes buttons pressed by * pushed blocks to take effect immediately. */ #define CMM_NOLEAVECHECK 0x0001 #define CMM_NOEXPOSEWALLS 0x0002 #define CMM_CLONECANTBLOCK 0x0004 #define CMM_NOPUSHING 0x0008 #define CMM_TELEPORTPUSH 0x0010 #define CMM_NOFIRECHECK 0x0020 #define CMM_NODEFERBUTTONS 0x0040 /* Move a block at the given position forward in the given direction. * FALSE is returned if the block cannot be pushed. */ static int pushblock(int pos, int dir, int flags) { creature* cr; int slipdir, r; int slipping; /* new */ _assert(cellat(pos)->top.id == Block_Static); _assert(dir != NIL); cr = lookupblock(pos); if (!cr) { warn("%d: attempt to push disembodied block!", currenttime()); return FALSE; } slipping = (cr->state & (CS_SLIP | CS_SLIDE)); /* accounting */ if (cr->state & (CS_SLIP | CS_SLIDE)) { slipdir = getslipdir(cr); if (dir == slipdir || dir == back(slipdir)) { if (!(flags & CMM_TELEPORTPUSH)) { return FALSE; } } } if (!(flags & CMM_TELEPORTPUSH) && cellat(pos)->bot.id == Block_Static) cellat(pos)->bot.id = Empty; if (!(flags & CMM_NODEFERBUTTONS)) cr->state |= CS_DEFERPUSH; r = advancecreature(cr, dir); if (!(flags & CMM_NODEFERBUTTONS)) cr->state &= ~CS_DEFERPUSH; if (!r) { cr->state &= ~(CS_SLIP | CS_SLIDE); if (slipping) { /* new MSCC-like accounting */ msccslippers--; removefromsliplist(cr); } } return r; } /* Return TRUE if the given creature is allowed to attempt to move in * the given direction. Side effects can and will occur from calling * this function, as indicated by flags. */ static int canmakemove(creature const* cr, int dir, int flags) { int to; int floor; int id, y, x; _assert(cr); _assert(dir != NIL); y = cr->pos / CXGRID; x = cr->pos % CXGRID; y += dir == NORTH ? -1 : dir == SOUTH ? +1 : 0; x += dir == WEST ? -1 : dir == EAST ? +1 : 0; if (y < 0 || y >= CYGRID || x < 0 || x >= CXGRID) return FALSE; to = y * CXGRID + x; if (!(flags & CMM_NOLEAVECHECK)) { switch (cellat(cr->pos)->bot.id) { case Wall_North: if (dir == NORTH) return FALSE; break; case Wall_West: if (dir == WEST) return FALSE; break; case Wall_South: if (dir == SOUTH) return FALSE; break; case Wall_East: if (dir == EAST) return FALSE; break; case Wall_Southeast: if (dir & (SOUTH | EAST)) return FALSE; break; case Beartrap: if (!(cr->state & CS_RELEASED)) return FALSE; break; } } if (cr->id == Chip) { floor = floorat(to); if (!(movelaws[floor].chip & dir)) return FALSE; if (floor == Socket && chipsneeded() > 0) return FALSE; if (isdoor(floor) && !possession(floor)) return FALSE; if (iscreature(cellat(to)->top.id)) { id = creatureid(cellat(to)->top.id); if (id == Chip || id == Swimming_Chip || id == Block) return FALSE; } if (floor == HiddenWall_Temp || floor == BlueWall_Real) { if (!(flags & CMM_NOEXPOSEWALLS)) getfloorat(to)->id = Wall; return FALSE; } if (floor == Block_Static) { if (!pushblock(to, dir, flags)) return FALSE; else if (flags & CMM_NOPUSHING) return FALSE; if (cellat(to)->bot.id == CloneMachine) return FALSE; /* totally backwards: need to check this first */ if ((flags & CMM_TELEPORTPUSH) && floorat(to) == Block_Static) /* totally backwards: remove "&& cellat(to)->bot.id == Empty)" */ return TRUE; return canmakemove(cr, dir, flags | CMM_NOPUSHING); } } else if (cr->id == Block) { floor = cellat(to)->top.id; if (iscreature(floor)) { id = creatureid(floor); return id == Chip || id == Swimming_Chip; } if (!(movelaws[floor].block & dir)) return FALSE; } else { floor = cellat(to)->top.id; if (iscreature(floor)) { id = creatureid(floor); if (id == Chip || id == Swimming_Chip) { floor = cellat(to)->bot.id; if (iscreature(floor)) { id = creatureid(floor); return id == Chip || id == Swimming_Chip; } } } if (iscreature(floor)) { /* turning tank cloning patch */ creature* F = lookupcreature(to, FALSE); if (!(flags & CMM_CLONECANTBLOCK)) /* not cloning */ return FALSE; if ((F == NULL || !(F->state & CS_TURNING)) && floor == crtile(cr->id, cr->dir)) return TRUE; /* must check "floor", so same-dir non-creature tank will clone */ if (F == NULL) return FALSE; if (F->dir == cr->dir) return TRUE; return FALSE; } if (!(movelaws[floor].creature & dir)) return FALSE; if (floor == Fire && (cr->id == Bug || cr->id == Walker)) if (!(flags & CMM_NOFIRECHECK)) return FALSE; } if (cellat(to)->bot.id == CloneMachine) return FALSE; return TRUE; } /* * How everyone selects their move. */ /* This function embodies the movement behavior of all the creatures. * Given a creature, this function enumerates its desired direction of * movement and selects the first one that is permitted. Note that * calling this function also updates the current controller * direction. */ static void choosecreaturemove(creature* cr) { int choices[4] = {NIL, NIL, NIL, NIL}; int dir, pdir; int floor; int y, x, m, n; cr->tdir = NIL; if (cr->hidden) return; if (cr->id == Block) return; if (currenttime() & 2) return; if (cr->id == Teeth || cr->id == Blob) { if ((currenttime() + stepping()) & 4) return; } if (cr->state & CS_TURNING) { cr->state &= ~(CS_TURNING | CS_HASMOVED); updatecreature(cr); } if (cr->state & CS_HASMOVED) { /* should be a stalled tank */ int floor = cellat(cr->pos)->top.id; /* stacked tank patch */ int id = creatureid(floor); if (iscreature(floor) && (id == Chip || id == Swimming_Chip)) floor = cellat(cr->pos)->bot.id; if (!iscreature(floor) && movelaws[floor].creature) cr->hidden = TRUE; /* hack with (0,0) movement success */ /* maybe should check if (0,0) move goes on sliplist, but that's UB */ if (FALSE && cr->hidden && (id == Chip || id == Swimming_Chip) && (floor != Fire && floor != Water && floor != Bomb)) { chipstatus() = CHIP_COLLIDED; cellat(cr->pos)->bot.id = cellat(cr->pos)->top.id; cellat(cr->pos)->top.id = Tank + diridx(cr->dir); } /* Actually, successful (0,0) moves don't kill Chip */ } if (cr->state & CS_HASMOVED) { controllerdir() = NIL; return; } if (cr->state & (CS_SLIP | CS_SLIDE)) return; floor = floorat(cr->pos); pdir = dir = cr->dir; if (floor == CloneMachine || floor == Beartrap) { switch (cr->id) { case Tank: case Ball: case Glider: case Fireball: case Walker: choices[0] = dir; break; case Blob: choices[0] = dir; choices[1] = left(dir); choices[2] = back(dir); choices[3] = right(dir); randomp4(mainprng(), choices); break; case Bug: case Paramecium: case Teeth: choices[0] = controllerdir(); cr->tdir = controllerdir(); return; break; default: warn("Non-creature %02X trying to move", cr->id); _assert(!"Unknown creature trying to move"); break; } } else { switch (cr->id) { case Tank: choices[0] = dir; break; case Ball: choices[0] = dir; choices[1] = back(dir); break; case Glider: choices[0] = dir; choices[1] = left(dir); choices[2] = right(dir); choices[3] = back(dir); break; case Fireball: choices[0] = dir; choices[1] = right(dir); choices[2] = left(dir); choices[3] = back(dir); break; case Walker: choices[0] = dir; choices[1] = left(dir); choices[2] = back(dir); choices[3] = right(dir); randomp3(mainprng(), choices + 1); break; case Blob: choices[0] = dir; choices[1] = left(dir); choices[2] = back(dir); choices[3] = right(dir); randomp4(mainprng(), choices); break; case Bug: choices[0] = left(dir); choices[1] = dir; choices[2] = right(dir); choices[3] = back(dir); break; case Paramecium: choices[0] = right(dir); choices[1] = dir; choices[2] = left(dir); choices[3] = back(dir); break; case Teeth: y = chippos() / CXGRID - cr->pos / CXGRID; x = chippos() % CXGRID - cr->pos % CXGRID; n = y < 0 ? NORTH : y > 0 ? SOUTH : NIL; if (y < 0) y = -y; m = x < 0 ? WEST : x > 0 ? EAST : NIL; if (x < 0) x = -x; if (x > y) { choices[0] = m; choices[1] = n; } else { choices[0] = n; choices[1] = m; } pdir = choices[2] = choices[0]; break; default: warn("Non-creature %02X trying to move", cr->id); _assert(!"Unknown creature trying to move"); break; } } for (n = 0; n < 4 && choices[n] != NIL; ++n) { cr->tdir = choices[n]; controllerdir() = cr->tdir; if (canmakemove(cr, choices[n], 0)) return; } if (cr->id == Tank) { if ((cr->state & CS_RELEASED) || (floor != Beartrap /*&& floor != CloneMachine*/)) /* (c) bug: tank clones should stall */ cr->state |= CS_HASMOVED; cr->tdir = NIL; /* handle stacked tanks */ } if (cr->id != Tank) /* handle stacked tanks */ cr->tdir = pdir; } /* Select a direction for Chip to move towards the goal position. */ static int chipmovetogoalpos(void) { creature* cr; int dir, d1, d2; int x, y; if (!hasgoal()) return NIL; cr = getchip(); if (goalpos() == cr->pos) { cancelgoal(); return NIL; } y = goalpos() / CXGRID - cr->pos / CXGRID; x = goalpos() % CXGRID - cr->pos % CXGRID; d1 = y < 0 ? NORTH : y > 0 ? SOUTH : NIL; if (y < 0) y = -y; d2 = x < 0 ? WEST : x > 0 ? EAST : NIL; if (x < 0) x = -x; if (x > y) { dir = d1; d1 = d2; d2 = dir; } if (d1 != NIL && d2 != NIL) dir = canmakemove(cr, d1, 0) ? d1 : d2; else dir = d2 == NIL ? d1 : d2; return dir; } /* Translate a map position into a packed location relative to Chip. */ static int makemouserelative(int abspos) { int x, y; x = abspos % CXGRID - chippos() % CXGRID; y = abspos / CXGRID - chippos() / CXGRID; _assert(x >= MOUSERANGEMIN && x <= MOUSERANGEMAX); _assert(y >= MOUSERANGEMIN && y <= MOUSERANGEMAX); return (y - MOUSERANGEMIN) * MOUSERANGE + (x - MOUSERANGEMIN); } /* Unpack a Chip-relative map location. */ static int makemouseabsolute(int relpos) { int x, y; x = relpos % MOUSERANGE + MOUSERANGEMIN; y = relpos / MOUSERANGE + MOUSERANGEMIN; return chippos() + y * CXGRID + x; } /* Determine the direction of Chip's next move. If discard is TRUE, * then Chip is not currently permitted to select a direction of * movement, and the player's input should not be retained. */ static void choosechipmove(creature* cr, int discard) { int dir; cr->tdir = NIL; if (cr->hidden) return; if (!(currenttime() & 3)) cr->state &= ~CS_HASMOVED; if (cr->state & CS_HASMOVED) { if (currentinput() != NIL && hasgoal()) { cancelgoal(); lastmove() = CmdMoveNop; } return; } dir = currentinput(); currentinput() = NIL; if (discard || ((cr->state & CS_SLIDE) && dir == cr->dir)) { if (currenttime() && !(currenttime() & 1)) cancelgoal(); return; } if (dir >= CmdAbsMouseMoveFirst && dir <= CmdAbsMouseMoveLast) { goalpos() = dir - CmdAbsMouseMoveFirst; lastmove() = CmdMouseMoveFirst + makemouserelative(goalpos()); dir = NIL; } else if (dir >= CmdMouseMoveFirst && dir <= CmdMouseMoveLast) { lastmove() = dir; goalpos() = makemouseabsolute(dir - CmdMouseMoveFirst); dir = NIL; } else { if ((dir & (NORTH | SOUTH)) && (dir & (EAST | WEST))) dir &= NORTH | SOUTH; lastmove() = dir; } if (dir == NIL && hasgoal() && (currenttime() & 3) == 2) dir = chipmovetogoalpos(); cr->tdir = dir; } /* Teleport the given creature instantaneously from the teleport tile * at start to another teleport tile (if possible). */ static int teleportcreature(creature* cr, int start) { maptile* tile; int dest, origpos, f; int origdir = cr->dir; /* tank push IB onto blue button via teleporter */ _assert(!cr->hidden); if (cr->dir == NIL) { warn("%d: directionless creature %02X on teleport at (%d %d)", currenttime(), cr->id, cr->pos % CXGRID, cr->pos / CXGRID); return NIL; } origpos = cr->pos; dest = start; for (;;) { --dest; if (dest < 0) dest += CXGRID * CYGRID; if (dest == start) break; tile = &cellat(dest)->top; if (tile->id != Teleport || (tile->state & FS_BROKEN)) continue; cr->pos = dest; f = canmakemove(cr, cr->dir, CMM_NOLEAVECHECK | CMM_NOEXPOSEWALLS | CMM_NODEFERBUTTONS | CMM_NOFIRECHECK | CMM_TELEPORTPUSH); cr->dir = origdir; /* tank push IB onto blue button via teleporter */ cr->pos = origpos; if (f) break; } return dest; } /* Determine the move(s) a creature will make on the current tick. */ static void choosemove(creature* cr) { if (cr->id == Chip) { choosechipmove(cr, cr->state & CS_SLIP); } else { if (cr->state & CS_SLIP) cr->tdir = NIL; else choosecreaturemove(cr); } } /* Initiate the cloning of a creature. */ static void activatecloner(int buttonpos) { creature dummy; creature* cr; int pos, tileid; pos = clonerfrombutton(buttonpos); if (pos < 0 || pos >= CXGRID * CYGRID) return; tileid = cellat(pos)->top.id; if (!iscreature(tileid) || creatureid(tileid) == Chip) return; if (creatureid(tileid) == Block) { cr = lookupblock(pos); if (cr->dir != NIL) advancecreature(cr, cr->dir); } else { if (cellat(pos)->bot.state & FS_CLONING) return; memset(&dummy, 0, sizeof dummy); dummy.id = creatureid(tileid); dummy.dir = creaturedirid(tileid); dummy.pos = pos; if (!canmakemove(&dummy, dummy.dir, CMM_CLONECANTBLOCK)) return; cr = awakencreature(pos); if (!cr) return; cr->state |= CS_CLONING; if (cellat(pos)->bot.id == CloneMachine) cellat(pos)->bot.state |= FS_CLONING; } } /* Open a bear trap. Any creature already in the trap is released. */ static void springtrap(int buttonpos) { creature* cr; int pos, id; pos = trapfrombutton(buttonpos); if (pos < 0) return; if (pos >= CXGRID * CYGRID) { warn("Off-map trap opening attempted: (%d %d)", pos % CXGRID, pos / CXGRID); return; } id = cellat(pos)->top.id; if (id == Block_Static || (cellat(pos)->bot.state & FS_HASMUTANT)) { cr = lookupblock(pos); if (cr) cr->state |= CS_RELEASED; } else if (iscreature(id)) { cr = lookupcreature(pos, TRUE); if (cr) cr->state |= CS_RELEASED; } } /* Mark all buttons everywhere as having been handled. */ static void resetbuttons(void) { int pos; for (pos = 0; pos < CXGRID * CYGRID; ++pos) { cellat(pos)->top.state &= ~FS_BUTTONDOWN; cellat(pos)->bot.state &= ~FS_BUTTONDOWN; } } /* Apply the effects of all deferred button presses, if any. */ static void handlebuttons(void) { int pos, id; for (pos = 0; pos < CXGRID * CYGRID; ++pos) { if (cellat(pos)->top.state & FS_BUTTONDOWN) { cellat(pos)->top.state &= ~FS_BUTTONDOWN; id = cellat(pos)->top.id; } else if (cellat(pos)->bot.state & FS_BUTTONDOWN) { cellat(pos)->bot.state &= ~FS_BUTTONDOWN; id = cellat(pos)->bot.id; } else { continue; } switch (id) { case Button_Blue: addsoundeffect(SND_BUTTON_PUSHED); turntanks(NULL); break; case Button_Green: togglewalls(); break; case Button_Red: activatecloner(pos); addsoundeffect(SND_BUTTON_PUSHED); break; case Button_Brown: springtrap(pos); addsoundeffect(SND_BUTTON_PUSHED); break; default: warn("Fooey! Tile %02X is not a button!", id); break; } } } /* * When something actually moves. */ /* Initiate a move by the given creature in the given direction. * Return FALSE if the creature cannot initiate the indicated move * (side effects may still occur). */ static int startmovement(creature* cr, int dir) { int floor; int odir = cr->dir; /* b2 fix with convergence glitch */ _assert(dir != NIL); floor = cellat(cr->pos)->bot.id; if (!canmakemove(cr, dir, 0)) { if (cr->id == Chip || (floor != Beartrap && floor != CloneMachine && !(cr->state & CS_SLIP))) { if (cr->id != Chip || odir != NIL) cr->dir = dir; /* b2 fix */ updatecreature(cr); } return FALSE; } if (floor == Beartrap) { _assert(cr->state & CS_RELEASED); if (cr->state & CS_MUTANT) cellat(cr->pos)->bot.state &= ~FS_HASMUTANT; } cr->state &= ~CS_RELEASED; cr->dir = dir; return TRUE; } /* Complete the movement of the given creature. Most side effects * produced by moving onto a tile occur at this point. This function * is also the only place where a creature can be added to the slip * list. */ static void endmovement(creature* cr, int dir) { static int const delta[] = {0, -CXGRID, -1, 0, +CXGRID, 0, 0, 0, +1}; mapcell* cell; maptile* tile; int dead = FALSE; int wasslipping; int oldpos, newpos; int id, floor, i; int crid; /* Non-existence patch */ int blockcloning = FALSE; /* Squish patch */ oldpos = cr->pos; newpos = cr->pos + delta[dir]; cell = cellat(newpos); tile = &cell->top; floor = tile->id; crid = creatureid(cellat(oldpos)->top.id); /* Non-existence patch */ if (cr->id == Chip) { switch (floor) { case Empty: poptile(newpos); break; case Water: if (!possession(Boots_Water)) chipstatus() = CHIP_DROWNED; break; case Fire: if (!possession(Boots_Fire)) chipstatus() = CHIP_BURNED; break; case Dirt: poptile(newpos); break; case BlueWall_Fake: poptile(newpos); break; case PopupWall: tile->id = Wall; break; case Door_Red: case Door_Blue: case Door_Yellow: case Door_Green: _assert(possession(floor)); if (floor != Door_Green) --possession(floor); poptile(newpos); addsoundeffect(SND_DOOR_OPENED); break; case Boots_Ice: case Boots_Slide: case Boots_Fire: case Boots_Water: case Key_Red: case Key_Blue: case Key_Yellow: case Key_Green: if (iscreature(cell->bot.id)) chipstatus() = CHIP_COLLIDED; ++possession(floor); poptile(newpos); addsoundeffect(SND_ITEM_COLLECTED); break; case Burglar: possession(Boots_Ice) = 0; possession(Boots_Slide) = 0; possession(Boots_Fire) = 0; possession(Boots_Water) = 0; addsoundeffect(SND_BOOTS_STOLEN); break; case ICChip: if (chipsneeded()) --chipsneeded(); poptile(newpos); addsoundeffect(SND_IC_COLLECTED); break; case Socket: _assert(chipsneeded() == 0); poptile(newpos); addsoundeffect(SND_SOCKET_OPENED); break; case Bomb: chipstatus() = CHIP_BOMBED; addsoundeffect(SND_BOMB_EXPLODES); break; default: if (iscreature(floor)) chipstatus() = CHIP_COLLIDED; break; } } else if (cr->id == Block) { switch (floor) { case Empty: poptile(newpos); break; case Water: tile->id = Dirt; dead = TRUE; addsoundeffect(SND_WATER_SPLASH); break; case Bomb: tile->id = Empty; dead = TRUE; addsoundeffect(SND_BOMB_EXPLODES); break; case Teleport: if (!(tile->state & FS_BROKEN)) newpos = teleportcreature(cr, newpos); break; } id = cellat(oldpos)->top.id; if (iscreature(id) && creatureid(id) == Chip) cr->state |= CS_MUTANT; } else { if (iscreature(cell->top.id)) { tile = &cell->bot; floor = cell->bot.id; } switch (floor) { case Water: if (crid != Glider) /* use crid with Non-existence patch */ dead = TRUE; break; case Fire: if (crid != Fireball) /* use crid with Non-existence patch */ dead = TRUE; break; case Bomb: cell->top.id = Empty; dead = TRUE; addsoundeffect(SND_BOMB_EXPLODES); break; case Teleport: if (!(tile->state & FS_BROKEN)) newpos = teleportcreature(cr, newpos); break; } } if (cellat(oldpos)->bot.id != CloneMachine || cr->id == Chip) poptile(oldpos); if (dead) { removecreature(cr); if (cellat(oldpos)->bot.id == CloneMachine) cellat(oldpos)->bot.state &= ~FS_CLONING; return; } if (cr->id == Chip && floor == Teleport && !(tile->state & FS_BROKEN)) { i = newpos; newpos = teleportcreature(cr, newpos); if (TRUE || newpos != i) { /* Convergence Patch */ /* no idea, but Icysanity lvl 1 requires newpos=i to work */ addsoundeffect(SND_TELEPORTING); if (floorat(newpos) == Block_Static) { if (lastslipdir() == NIL) { /* // these seem cosmetic/superfluous with new patch cr->dir = NORTH; cellat(newpos)->top.id = crtile(Chip, NORTH); */ cr->dir = NIL; /* Convergence Patch */ /* floor = Empty; */ /* Removed with Convergence Patch, cf Chip on sliplist */ } else { /* seems ok still, with new Convergence logic */ cr->dir = lastslipdir(); } } } } cr->pos = newpos; addcreaturetomap(cr); cr->pos = oldpos; tile = &cell->bot; switch (floor) { case Button_Blue: if (cr->state & CS_DEFERPUSH) tile->state |= FS_BUTTONDOWN; else turntanks(cr); addsoundeffect(SND_BUTTON_PUSHED); break; case Button_Green: if (cr->state & CS_DEFERPUSH) tile->state |= FS_BUTTONDOWN; else togglewalls(); break; case Button_Red: cr->moving = 1; /* Hack with SGG */ if (cr->state & CS_DEFERPUSH) tile->state |= FS_BUTTONDOWN; else activatecloner(newpos); addsoundeffect(SND_BUTTON_PUSHED); cr->moving = 0; /* Hack with SGG */ break; case Button_Brown: if (cr->state & CS_DEFERPUSH) tile->state |= FS_BUTTONDOWN; else springtrap(newpos); addsoundeffect(SND_BUTTON_PUSHED); break; } cr->pos = newpos; if (cellat(oldpos)->bot.id == CloneMachine && cr->id == Block && cellat(oldpos)->top.id != Block_Static) blockcloning = TRUE; /* Squish patch */ if (cellat(oldpos)->bot.id == CloneMachine) cellat(oldpos)->bot.state &= ~FS_CLONING; if (floor == Beartrap) { if (istrapopen(newpos, oldpos)) cr->state |= CS_RELEASED; } else if (cellat(newpos)->bot.id == Beartrap) { for (i = 0; i < traplistsize(); ++i) { if (traplist()[i].to == newpos) { cr->state |= CS_RELEASED; break; } } } if (cr->id == Chip) { if (goalpos() == cr->pos) cancelgoal(); if (chipstatus() != CHIP_OKAY && chipstatus() != CHIP_SQUISHED) return; /* CHIP_SQUISHED added with Squish patch */ if (cell->bot.id == Exit) { completed() = TRUE; return; } } else { if (iscreature(cell->bot.id)) { if (creatureid(cell->bot.id) == Chip || creatureid(cell->bot.id) == Swimming_Chip) { if (cr->id != Block || !blockcloning) /* Squish patch */ chipstatus() = CHIP_COLLIDED; else chipstatus() = CHIP_SQUISHED; /* Squish patch */ return; } } } wasslipping = cr->state & (CS_SLIP | CS_SLIDE); if (floor == Teleport) startfloormovement(cr, floor, NIL); /* NIL for tank reversal patch */ else if (isice(floor) && (cr->id != Chip || !possession(Boots_Ice))) startfloormovement(cr, floor, NIL); /* NIL for tank reversal patch */ else if (isslide(floor) && (cr->id != Chip || !possession(Boots_Slide))) startfloormovement(cr, floor, NIL); /* NIL for tank reversal patch */ else if (floor == Beartrap && cr->id == Block && wasslipping) { startfloormovement(cr, floor, NIL); /* NIL for tank reversal patch */ if (cr->state & CS_MUTANT) cell->bot.state |= FS_HASMUTANT; } else { /* changes for MSCC-style sliplist */ cr->state &= ~(CS_SLIP | CS_SLIDE); if (wasslipping && cr->id != Chip) { msccslippers--; removefromsliplist(cr); } } if (!wasslipping && (cr->state & (CS_SLIP | CS_SLIDE)) && cr->id != Chip) controllerdir() = getslipdir(cr); } /* Move the given creature in the given direction. */ static int advancecreature(creature* cr, int dir) { if (dir == NIL) return TRUE; if (cr->id == Chip) chipwait() = 0; if (!startmovement(cr, dir)) { if (cr->id == Chip) { addsoundeffect(SND_CANT_MOVE); resetbuttons(); cancelgoal(); } return FALSE; } endmovement(cr, dir); if (cr->id == Chip) handlebuttons(); return TRUE; } /* Return TRUE if gameplay is over. */ static int checkforending(void) { if (chipstatus() != CHIP_OKAY && chipstatus() != CHIP_SQUISHED) { addsoundeffect(SND_CHIP_LOSES); /* Squish patch */ return -1; } if (completed()) { addsoundeffect(SND_CHIP_WINS); return +1; } return 0; } /* * Automatic activities. */ /* Execute all forced moves for creatures on the slip list. (Note the * use of the savedcount variable, which is how slide delay is * implemented.) */ static void floormovements_of_chip(void) /* split into two */ { creature* cr; int floor, slipdir, ac; int n; for (n = 0; n < slipcount; ++n) { cr = slips[n].cr; if (!(slips[n].cr->state & (CS_SLIP | CS_SLIDE))) continue; slipdir = slips[n].dir; if (slipdir == NIL && cr->id == Chip) /* Convergence Patch */ cellat(cr->pos)->top.id = crtile(Chip, NORTH); if (slipdir == NIL) continue; if (cr->id != Chip) continue; /* new, non-Chip ignored */ lastslipdir() = slipdir; ac = advancecreature(cr, slipdir); /* useful to have ac */ if (ac) { cr->state &= ~CS_HASMOVED; } else { floor = cellat(cr->pos)->bot.id; if (isslide(floor)) { cr->state &= ~CS_HASMOVED; } else if (isice(floor)) { slipdir = icewallturn(floor, back(slipdir)); lastslipdir() = slipdir; ac = advancecreature(cr, slipdir); /* again useful with ac */ if (ac) cr->state &= ~CS_HASMOVED; } else if (floor == Teleport || floor == Block_Static) { lastslipdir() = slipdir = back(slipdir); if (advancecreature(cr, slipdir)) cr->state &= ~CS_HASMOVED; } if (cr->state & (CS_SLIP | CS_SLIDE)) { endfloormovement(cr); startfloormovement(cr, cellat(cr->pos)->bot.id, NIL); /* 3rd argument with tank reversal patch */ } } if (checkforending()) return; } } static void floormovements_of_blocks_and_monsters(void) /* split into two */ { creature* cr; int floor, slipdir, ac; int origdir; int n; int oldmsccslippers; int advance = 0; for (n = 0; n < slipcount;) { oldmsccslippers = msccslippers; cr = slips[n].cr; if (cr->id == Chip) { /* new splitting */ n++; continue; } if (advance) { advance--; n++; continue; } if (!(slips[n].cr->state & (CS_SLIP | CS_SLIDE))) { n++; continue; } slipdir = slips[n].dir; origdir = slipdir; /* tank reversal patch */ if (slipdir == NIL) { n++; continue; } cr->frame = cr->dir; /* Tank Top Glitch */ ac = advancecreature(cr, slipdir); /* useful to have ac */ if (!ac) { floor = cellat(cr->pos)->bot.id; if (isice(floor)) { slipdir = icewallturn(floor, back(slipdir)); ac = advancecreature(cr, slipdir); /* again useful with ac */ } if (cr->state & (CS_SLIP | CS_SLIDE)) { endfloormovement(cr); msccslippers--; /* new MSCC accounting */ startfloormovement(cr, cellat(cr->pos)->bot.id, ac ? NIL : origdir); /* 3rd argument with tank reversal patch */ } } if (cr->state & CS_SLIP && ac) cr->state |= CS_SLIDE; /* Tank Top Glitch */ cr->frame = 0; /* Tank Top Glitch */ if (checkforending()) return; if (msccslippers == oldmsccslippers) advance++; } } static void floormovements(void) /* split version with patch */ { floormovements_of_chip(); updatesliplist(); /* remove deadwood */ /* TSG stuff, not yet included */ if (!checkforending()) /* Squish patch (maybe was oversight?) */ floormovements_of_blocks_and_monsters(); if (!completed() && chipstatus() == CHIP_SQUISHED) chipstatus() = CHIP_SQUISHED_DEATH; } static void createclones(void) { int n; for (n = 0; n < creaturecount; ++n) if (creatures[n]->state & CS_CLONING) creatures[n]->state &= ~CS_CLONING; } #ifndef NDEBUG /* * Debugging functions. */ /* Print out a rough image of the level and the list of creatures. */ static void dumpmap(void) { creature* cr; int y, x; for (y = 0; y < CXGRID * CYGRID; y += CXGRID) { for (x = 0; x < CXGRID; ++x) fprintf(stderr, "%c%02x%02X%c", (cellat(y + x)->top.state ? ':' : '.'), cellat(y + x)->top.id, cellat(y + x)->bot.id, (cellat(y + x)->bot.state ? ':' : '.')); fputc('\n', stderr); } fputc('\n', stderr); for (y = 0; y < creaturecount; ++y) { cr = creatures[y]; fprintf(stderr, "%02X%c (%d %d)", cr->id, "-^"[(int) cr->dir], cr->pos % CXGRID, cr->pos / CXGRID); for (x = 0; x < slipcount; ++x) { if (cr == slips[x].cr) { fprintf(stderr, " [%d]", x + 1); break; } } fprintf(stderr, "%s%s%s%s%s%s%s%s%s", cr->hidden ? " hidden" : "", cr->state & CS_RELEASED ? " released" : "", cr->state & CS_CLONING ? " cloning" : "", cr->state & CS_HASMOVED ? " has-moved" : "", cr->state & CS_TURNING ? " turning" : "", cr->state & CS_SLIP ? " slipping" : "", cr->state & CS_SLIDE ? " sliding" : "", cr->state & CS_DEFERPUSH ? " deferred-push" : "", cr->state & CS_MUTANT ? " mutant" : ""); if (x < slipcount) fprintf(stderr, " %c", "-^"[(int) slips[x].dir]); fputc('\n', stderr); } for (y = 0; y < blockcount; ++y) { cr = blocks[y]; fprintf(stderr, "block %d: (%d %d) %c", y, cr->pos % CXGRID, cr->pos / CXGRID, "-^"[(int) cr->dir]); for (x = 0; x < slipcount; ++x) { if (cr == slips[x].cr) { fprintf(stderr, " [%d]", x + 1); break; } } fprintf(stderr, "%s%s%s%s%s%s%s%s%s", cr->hidden ? " hidden" : "", cr->state & CS_RELEASED ? " released" : "", cr->state & CS_CLONING ? " cloning" : "", cr->state & CS_HASMOVED ? " has-moved" : "", cr->state & CS_TURNING ? " turning" : "", cr->state & CS_SLIP ? " slipping" : "", cr->state & CS_SLIDE ? " sliding" : "", cr->state & CS_DEFERPUSH ? " deferred-push" : "", cr->state & CS_MUTANT ? " mutant" : ""); if (x < slipcount) fprintf(stderr, " %c", "-^"[(int) slips[x].dir]); fputc('\n', stderr); } } /* Run various sanity checks on the current game state. */ static void verifymap(void) { creature* cr; int n; for (n = 0; n < creaturecount; ++n) { cr = creatures[n]; if (cr->id < 0x40 || cr->id >= 0x80) warn("%d: Undefined creature %02X at (%d %d)", state->currenttime, cr->id, cr->pos % CXGRID, cr->pos / CXGRID); if (!cr->hidden && (cr->pos < 0 || cr->pos >= CXGRID * CYGRID)) warn("%d: Creature %02X has left the map: (%d %d)", state->currenttime, cr->id, cr->pos % CXGRID, cr->pos / CXGRID); if (cr->dir > EAST && (cr->dir != NIL || cr->id != Block)) warn("%d: Creature %d lacks direction (%d)", state->currenttime, cr->id, cr->dir); } } #endif /* * Per-tick maintenance functions. */ /* Actions and checks that occur at the start of a tick. */ static void initialhousekeeping(void) { int n; #ifndef NDEBUG if (currentinput() == CmdDebugCmd2) { dumpmap(); exit(0); } else if (currentinput() == CmdDebugCmd1) { static int mark = 0; warn("Mark %d (%d).", ++mark, currenttime()); currentinput() = NIL; } verifymap(); if (currentinput() >= CmdCheatNorth && currentinput() <= CmdCheatICChip) { switch (currentinput()) { case CmdCheatNorth: --yviewoffset(); break; case CmdCheatWest: --xviewoffset(); break; case CmdCheatSouth: ++yviewoffset(); break; case CmdCheatEast: ++xviewoffset(); break; case CmdCheatHome: xviewoffset() = yviewoffset() = 0; break; case CmdCheatKeyRed: possession(Key_Red) = 127; break; case CmdCheatKeyBlue: possession(Key_Blue) = 127; break; case CmdCheatKeyYellow: possession(Key_Yellow) = 127; break; case CmdCheatKeyGreen: possession(Key_Green) = 127; break; case CmdCheatBootsIce: possession(Boots_Ice) = 127; break; case CmdCheatBootsSlide: possession(Boots_Slide) = 127; break; case CmdCheatBootsFire: possession(Boots_Fire) = 127; break; case CmdCheatBootsWater: possession(Boots_Water) = 127; break; case CmdCheatICChip: chipsneeded() = chipsneeded() ? 0 : 1; break; } currentinput() = NIL; setnosaving(); } #endif if (currenttime() == 0) laststepping = stepping(); if (!(currenttime() & 3)) { for (n = 1; n < creaturecount; ++n) { if (creatures[n]->state & CS_TURNING) { creatures[n]->state &= ~(CS_TURNING | CS_HASMOVED); updatecreature(creatures[n]); } } ++chipwait(); if (chipwait() > 3) { chipwait() = 3; if (getchip()->dir != NIL) /* Convergence Glitch patch (a) */ getchip()->dir = SOUTH; updatecreature(getchip()); } } } /* Actions and checks that occur at the end of a tick. */ static void finalhousekeeping(void) { return; } static void preparedisplay(void) { int pos; pos = chippos(); if (cellat(pos)->bot.id == HintButton) showhint(); else hidehint(); xviewpos() = (pos % CXGRID) * 8 + xviewoffset() * 8; yviewpos() = (pos / CYGRID) * 8 + yviewoffset() * 8; } /* * The functions provided by the gamelogic struct. */ /* Initialize the gamestate structure to the state at the beginning of * the level, using the data in the associated gamesetup structure. * The level map is decoded and assembled, the lists of beartraps, * clone machines, and active creatures are drawn up, and other * miscellaneous initializations are performed. */ static int initgame(gamelogic* logic) { static creature dummycrlist; mapcell* cell; xyconn* xy; creature* cr; creature* chip; int pos, num, n; setstate(logic); num = state->game->number; state->statusflags &= ~SF_BADTILES; state->statusflags |= SF_NOANIMATION; for (pos = 0, cell = state->map; pos < CXGRID * CYGRID; ++pos, ++cell) { if (isfloor(cell->top.id) || creatureid(cell->top.id) == Chip || creatureid(cell->top.id) == Block) { if (cell->bot.id == Teleport || cell->bot.id == SwitchWall_Open || cell->bot.id == SwitchWall_Closed) { cell->bot.state |= FS_BROKEN; } } } chip = allocatecreature(); chip->pos = 0; chip->id = Chip; chip->dir = SOUTH; addtocreaturelist(chip); for (n = 0; n < state->crlistcount; ++n) { pos = state->crlist[n]; if (pos < 0 || pos >= CXGRID * CYGRID) { warn("level %d: invalid creature location (%d %d)", num, pos % CXGRID, pos / CXGRID); continue; } cell = cellat(pos); if (!iscreature(cell->top.id)) { warn("level %d: no creature at location (%d %d)", num, pos % CXGRID, pos / CXGRID); continue; } if (creatureid(cell->top.id) != Block && cell->bot.id != CloneMachine) { cr = allocatecreature(); cr->pos = pos; cr->id = creatureid(cell->top.id); cr->dir = creaturedirid(cell->top.id); addtocreaturelist(cr); if (iscreature(cell->bot.id) && creatureid(cell->bot.id) == Chip) { chip->pos = pos; chip->dir = creaturedirid(cell->bot.id); } } cell->top.state |= FS_MARKER; } for (pos = 0, cell = state->map; pos < CXGRID * CYGRID; ++pos, ++cell) { if (cell->top.state & FS_MARKER) { cell->top.state &= ~FS_MARKER; } else if (iscreature(cell->top.id) && creatureid(cell->top.id) == Chip) { chip->pos = pos; chip->dir = creaturedirid(cell->bot.id); } } dummycrlist.id = 0; state->creatures = &dummycrlist; state->initrndslidedir = NORTH; possession(Key_Red) = possession(Key_Blue) = possession(Key_Yellow) = possession(Key_Green) = 0; possession(Boots_Ice) = possession(Boots_Slide) = possession(Boots_Fire) = possession(Boots_Water) = 0; for (n = traplistsize(), xy = traplist(); n; --n, ++xy) { if (xy->to == chippos() || cellat(xy->to)->top.id == Block_Static || istrapbuttondown(xy->from)) { springtrap(xy->from); } } chipwait() = 0; completed() = FALSE; chipstatus() = CHIP_OKAY; controllerdir() = NIL; lastslipdir() = NIL; stepping() = laststepping; cancelgoal(); xviewoffset() = 0; yviewoffset() = 0; preparedisplay(); return TRUE; } /* Advance the game state by one tick. */ static int advancegame(gamelogic* logic) { creature* cr; int r = 0; int n; setstate(logic); timeoffset() = -1; initialhousekeeping(); msccslippers = slipcount; if (getchip()->state & (CS_SLIP | CS_SLIDE)) /* new accounting */ msccslippers--; if (currenttime() && !(currenttime() & 1)) { controllerdir() = NIL; for (n = 0; n < creaturecount; ++n) { cr = creatures[n]; if (!cr->hidden && cr->id != Chip && !(currenttime() & 3) && chipstatus() == CHIP_SQUISHED && !completed()) chipstatus() = CHIP_SQUISHED_DEATH; /* Squish patch */ if (cr->hidden || (cr->state & CS_CLONING) || cr->id == Chip) continue; choosemove(cr); if (cr->tdir != NIL) advancecreature(cr, cr->tdir); } if ((r = checkforending())) goto done; } if (currenttime() && !(currenttime() & 1)) { floormovements(); if ((r = checkforending())) goto done; } updatesliplist(); timeoffset() = 0; if (timelimit()) { if (currenttime() >= timelimit()) { chipstatus() = CHIP_OUTOFTIME; addsoundeffect(SND_TIME_OUT); return -1; } else if (timelimit() - currenttime() <= 15 * TICKS_PER_SECOND && currenttime() % TICKS_PER_SECOND == 0) { addsoundeffect(SND_TIME_LOW); } } cr = getchip(); choosemove(cr); if (cr->tdir != NIL) { advancecreature(cr, cr->tdir); /* Squish patch, TW checked this?! */ if ((r = checkforending())) /* TW checks advancecreature() status */ goto done; /* guess it's a remnant of Chip starting on exit? */ cr->state |= CS_HASMOVED; } updatesliplist(); createclones(); done: finalhousekeeping(); preparedisplay(); return r; } /* Free resources associated with the current game state. */ static int endgame(gamelogic* logic) { (void) logic; resetcreaturepool(); resetcreaturelist(); resetblocklist(); resetsliplist(); return TRUE; } /* Free all allocated resources for this module. */ static void shutdown(gamelogic* logic) { (void) logic; free(creatures); creatures = NULL; creaturecount = 0; creaturesallocated = 0; free(blocks); blocks = NULL; blockcount = 0; blocksallocated = 0; free(slips); slips = NULL; slipcount = 0; slipsallocated = 0; freecreaturepool(); } /* The exported function: Initialize and return the module's gamelogic * structure. */ gamelogic* mslogicstartup(void) { static gamelogic logic; logic.ruleset = Ruleset_MS; logic.initgame = initgame; logic.advancegame = advancegame; logic.endgame = endgame; logic.shutdown = shutdown; return &logic; } tworld-2.3.0/oshw-qt/000077500000000000000000000000001475511570500144435ustar00rootroot00000000000000tworld-2.3.0/oshw-qt/CCMetaData.cpp000066400000000000000000000113451475511570500170410ustar00rootroot00000000000000/* Copyright (C) 2001-2010 by Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include "CCMetaData.h" #include #include #include namespace CCX { template static bool ReadElmAttr(const QDomElement& elm, const QString& sAttr, T (*pf)(const QString&), T& rValue) { if (!elm.hasAttribute(sAttr)) return false; rValue = (*pf)(elm.attribute(sAttr)); return true; } inline static QString ParseString(const QString& s) { return s; } inline static int ParseInt(const QString& s) { return s.toInt(); } inline static QColor ParseColor(const QString& s) { return QColor(s); } static Qt::AlignmentFlag ParseHAlign(const QString& s) { return (s == QStringLiteral("right")) ? Qt::AlignRight : (s == QStringLiteral("center")) ? Qt::AlignHCenter : Qt::AlignLeft; } static Qt::AlignmentFlag ParseVAlign(const QString& s) { return (s == QStringLiteral("bottom")) ? Qt::AlignBottom : (s == QStringLiteral("middle")) ? Qt::AlignVCenter : Qt::AlignTop; } static Compatibility ParseCompat(const QString& s) { return (s == QStringLiteral("yes")) ? COMPAT_YES : (s == QStringLiteral("no")) ? COMPAT_NO : COMPAT_UNKNOWN; } static TextFormat ParseFormat(const QString& s) { return (s == QStringLiteral("html")) ? TEXT_HTML : TEXT_PLAIN; } void RulesetCompatibility::ReadXML(const QDomElement& elm) { ReadElmAttr(elm, QStringLiteral("ms"), &ParseCompat, eMS); ReadElmAttr(elm, QStringLiteral("lynx"), &ParseCompat, eLynx); ReadElmAttr(elm, QStringLiteral("pedantic"), &ParseCompat, ePedantic); } void PageProperties::ReadXML(const QDomElement& elm) { ReadElmAttr(elm, QStringLiteral("format"), &ParseFormat, eFormat); ReadElmAttr(elm, QStringLiteral("align"), &ParseHAlign, align); ReadElmAttr(elm, QStringLiteral("valign"), &ParseVAlign, valign); ReadElmAttr(elm, QStringLiteral("color"), &ParseColor , color); ReadElmAttr(elm, QStringLiteral("bgcolor"), &ParseColor , bgcolor); } void Page::ReadXML(const QDomElement& elm, const Levelset& levelset) { sText = elm.text(); pageProps = levelset.pageProps; pageProps.ReadXML(elm); } void Text::ReadXML(const QDomElement& elm, const Levelset& levelset) { vecPages.clear(); QDomNodeList lstElmPages = elm.elementsByTagName(QStringLiteral("page")); for (int i = 0; i < int(lstElmPages.length()); ++i) { QDomElement elmPage = lstElmPages.item(i).toElement(); Page page; page.ReadXML(elmPage, levelset); vecPages.push_back(page); } } void Level::ReadXML(const QDomElement& elm, const Levelset& levelset) { sAuthor = levelset.sAuthor; ReadElmAttr(elm, QStringLiteral("author"), &ParseString, sAuthor); ruleCompat = levelset.ruleCompat; ruleCompat.ReadXML(elm); QDomNodeList lstElm; lstElm = elm.elementsByTagName(QStringLiteral("prologue")); if (lstElm.length() != 0) txtPrologue.ReadXML(lstElm.item(0).toElement(), levelset); lstElm = elm.elementsByTagName(QStringLiteral("epilogue")); if (lstElm.length() != 0) txtEpilogue.ReadXML(lstElm.item(0).toElement(), levelset); } void Levelset::ReadXML(const QDomElement& elm) { ReadElmAttr(elm, QStringLiteral("description"), &ParseString, sDescription); ReadElmAttr(elm, QStringLiteral("copyright"), &ParseString, sCopyright); ReadElmAttr(elm, QStringLiteral("author"), &ParseString, sAuthor); ruleCompat.ReadXML(elm); pageProps.ReadXML(elm); for (int i = 0; i < int(vecLevels.size()); ++i) { Level& rLevel = vecLevels[i]; rLevel.sAuthor = sAuthor; rLevel.ruleCompat = ruleCompat; } // vecLevels.clear(); QDomNodeList lstElmLevels = elm.elementsByTagName(QStringLiteral("level")); for (int i = 0; i < int(lstElmLevels.length()); ++i) { QDomElement elmLevel = lstElmLevels.item(i).toElement(); int nNumber = 0; if (!ReadElmAttr(elmLevel, QStringLiteral("number"), &ParseInt, nNumber)) continue; if ( ! (nNumber >= 1 && nNumber < int(vecLevels.size())) ) continue; Level& rLevel = vecLevels[nNumber]; rLevel.ReadXML(elmLevel, *this); } QDomNodeList lstElmStyle = elm.elementsByTagName(QStringLiteral("style")); if (lstElmStyle.length() != 0) { QDomElement elmStyle = lstElmStyle.item(0).toElement(); if (elmStyle.parentNode() == elm) sStyleSheet = elmStyle.text(); } } bool Levelset::ReadFile(const QString& sFilePath, int nLevels) { Clear(); vecLevels.resize(1+nLevels); QFile file(sFilePath); if (!file.exists()) return true; if (!file.open(QIODevice::ReadOnly|QIODevice::Text)) return false; QDomDocument doc; if (!doc.setContent(&file)) return false; QDomElement elmRoot = doc.documentElement(); if (elmRoot.tagName() != QStringLiteral("levelset")) return false; ReadXML(elmRoot); file.close(); return true; } void Levelset::Clear() { *this = Levelset(); } } tworld-2.3.0/oshw-qt/CCMetaData.h000066400000000000000000000032411475511570500165020ustar00rootroot00000000000000/* Copyright (C) 2001-2010 by Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef CCMETADATA_H #define CCMETADATA_H #include #include #include #include #include namespace CCX { struct Levelset; enum Compatibility { COMPAT_UNKNOWN, COMPAT_NO, COMPAT_YES }; struct RulesetCompatibility { Compatibility eMS, eLynx, ePedantic; RulesetCompatibility() : eMS(COMPAT_UNKNOWN), eLynx(COMPAT_UNKNOWN), ePedantic(COMPAT_UNKNOWN) {} void ReadXML(const QDomElement& elm); }; enum TextFormat { TEXT_PLAIN, TEXT_HTML }; struct PageProperties { TextFormat eFormat; Qt::AlignmentFlag align, valign; QColor color, bgcolor; PageProperties() : eFormat(TEXT_PLAIN), align(Qt::AlignLeft), valign(Qt::AlignTop), color(Qt::white), bgcolor(Qt::black) {} void ReadXML(const QDomElement& elm); }; struct Page { QString sText; PageProperties pageProps; void ReadXML(const QDomElement& elm, const Levelset& levelset); }; struct Text { std::vector vecPages; bool bSeen; Text() : bSeen(false) {} void ReadXML(const QDomElement& elm, const Levelset& levelset); }; struct Level { QString sAuthor; RulesetCompatibility ruleCompat; Text txtPrologue, txtEpilogue; void ReadXML(const QDomElement& elm, const Levelset& levelset); }; struct Levelset { QString sDescription; QString sCopyright; QString sAuthor; RulesetCompatibility ruleCompat; PageProperties pageProps; QString sStyleSheet; std::vector vecLevels; void ReadXML(const QDomElement& elm); bool ReadFile(const QString& sFilePath, int nLevels); void Clear(); }; } #endif tworld-2.3.0/oshw-qt/CMakeLists.txt000066400000000000000000000014241475511570500172040ustar00rootroot00000000000000add_library(oshw-qt STATIC "") target_sources(oshw-qt PRIVATE ../generic/generic.h ../generic/_in.cpp ../generic/tile.c ../generic/timer.c ../oshw-sdl/sdlsfx.h ../oshw-sdl/sdlsfx.c oshwbind.h oshwbind.cpp CCMetaData.h CCMetaData.cpp TWApp.h TWApp.cpp TWDisplayWidget.h TWDisplayWidget.cpp TWMainWnd.h TWMainWnd.cpp TWMainWnd.ui TWProgressBar.h TWProgressBar.cpp TWTextCoder.cpp TWTextCoder.h ) target_include_directories(oshw-qt PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/generic ${SDL2_INCLUDE_DIR} ) target_link_libraries(oshw-qt PUBLIC ${SDL2_LIBRARY} Qt::Core Qt::Gui Qt::Widgets Qt::Xml ) tworld-2.3.0/oshw-qt/TWApp.cpp000066400000000000000000000076401475511570500161510ustar00rootroot00000000000000/* Copyright (C) 2001-2010 by Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include "TWApp.h" #include "TWMainWnd.h" #include "../generic/generic.h" #include "../oshw-sdl/sdlsfx.h" #include "../gen.h" #include "../defs.h" #include "../oshw.h" #include "TWTextCoder.h" #include #include #include TileWorldApp* g_pApp = nullptr; TileWorldMainWnd* g_pMainWnd = nullptr; const QString TileWorldApp::s_sTitle = QStringLiteral("Tile World"); TileWorldApp::TileWorldApp(int& argc, char** argv) : QApplication(argc, argv), m_bSilence(false), m_bShowHistogram(false), m_bFullScreen(false), m_argc(argc), m_argv(argv) { g_pApp = this; } TileWorldApp::~TileWorldApp() { delete g_pMainWnd; g_pMainWnd = nullptr; g_pApp = nullptr; } /* Process all pending events. If wait is TRUE and no events are * currently pending, the function blocks until an event arrives. */ static void _eventupdate(int wait) { QApplication::processEvents(wait ? QEventLoop::WaitForMoreEvents : QEventLoop::AllEvents); } /* Initialize the OS/hardware interface. This function must be called * before any others in the oshw library. If silence is TRUE, the * sound system will be disabled, as if no soundcard was present. If * showhistogram is TRUE, then during shutdown the timer module will * send a histogram to stdout describing the amount of time the * program explicitly yielded to other processes. (This feature is for * debugging purposes.) soundbufsize is a number between 0 and 3 which * is used to scale the size of the sound buffer. A larger number is * more efficient, but pushes the sound effects farther out of * synchronization with the video. */ int oshwinitialize(int silence, int soundbufsize, int showhistogram, int fullscreen) { return g_pApp->Initialize(silence, soundbufsize, showhistogram, fullscreen); } bool TileWorldApp::Initialize(bool bSilence, int nSoundBufSize, bool bShowHistogram, bool bFullScreen) { geng.eventupdatefunc = _eventupdate; m_bSilence = bSilence; m_bShowHistogram = bShowHistogram; m_bFullScreen = bFullScreen; g_pMainWnd = new TileWorldMainWnd; g_pMainWnd->setWindowTitle(s_sTitle); if ( ! ( _generictimerinitialize(bShowHistogram) && _generictileinitialize() && _genericinputinitialize() && _sdlsfxinitialize(bSilence, nSoundBufSize) ) ) return false; if (bFullScreen) { g_pMainWnd->showFullScreen(); } else { g_pMainWnd->adjustSize(); g_pMainWnd->show(); } return true; } /* * Resource-loading functions. */ /* Extract the font stored in the given file and make it the current * font. FALSE is returned if the attempt was unsuccessful. If * complain is FALSE, no error messages will be displayed. */ int loadfontfromfile(char const *filename, int complain) { // N/A return true; } /* Free all memory associated with the current font. */ void freefont(void) { // N/A } void copytoclipboard(char const *text) { QClipboard* pClipboard = QApplication::clipboard(); if (pClipboard == nullptr) return; pClipboard->setText(TWTextCoder::decode(text)); } int TileWorldApp::RunTWorld() { return tworld(m_argc, m_argv); } void TileWorldApp::ExitTWorld() { // Attempt to gracefully destroy application objects // throw 1; // Can't throw C++ exceptions through C code // longjmp(m_jmpBuf, 1); // Works, but needs to be cleaner ::exit(0); // Live with this for now... } /* The real main(). */ int main(int argc, char *argv[]) { for (int i = 1; i < argc; ++i) { const char* szArg = argv[i]; if (strlen(szArg) == 2 && szArg[0] == '-' && strchr("lstbhdvV", szArg[1]) != nullptr) return tworld(argc, argv); } TileWorldApp app(argc, argv); QApplication::setStyle(QStringLiteral("fusion")); // Other styles may mess up colors QApplication::setWindowIcon(QIcon(QStringLiteral(":/tworld2.ico"))); return app.RunTWorld(); } tworld-2.3.0/oshw-qt/TWApp.h000066400000000000000000000012261475511570500156100ustar00rootroot00000000000000/* Copyright (C) 2001-2010 by Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef TWAPP_H #define TWAPP_H class TileWorldMainWnd; #include class TileWorldApp : public QApplication { public: static const QString s_sTitle; TileWorldApp(int& argc, char** argv); ~TileWorldApp(); int RunTWorld(); void ExitTWorld(); bool Initialize(bool bSilence, int nSoundBufSize, bool bShowHistogram, bool bFullScreen); private: bool m_bSilence, m_bShowHistogram, m_bFullScreen; int& m_argc; char** m_argv; }; extern TileWorldApp* g_pApp; extern TileWorldMainWnd* g_pMainWnd; #endif tworld-2.3.0/oshw-qt/TWDisplayWidget.cpp000066400000000000000000000012151475511570500201720ustar00rootroot00000000000000/* Copyright (C) 2001-2010 by Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include "TWDisplayWidget.h" #include TWDisplayWidget::TWDisplayWidget(QWidget* pParent) : QWidget(pParent) { } void TWDisplayWidget::setPixmap(const QPixmap& pixmap) { bool bResized = (pixmap.size() != m_pixmap.size()); m_pixmap = pixmap; if (bResized) updateGeometry(); // update(); repaint(); } QSize TWDisplayWidget::sizeHint() const { return m_pixmap.size(); } void TWDisplayWidget::paintEvent(QPaintEvent* pPaintEvent) { QPainter painter(this); painter.drawPixmap(0, 0, m_pixmap); } tworld-2.3.0/oshw-qt/TWDisplayWidget.h000066400000000000000000000013621475511570500176420ustar00rootroot00000000000000/* Copyright (C) 2001-2010 by Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef TWDISPLAYWIDGET_H #define TWDISPLAYWIDGET_H #include #include // QLabel's setPixmap seems to trigger a re-layout of the parent // and hence a repaint which is particularly expensive with gradients // Avoid doing that with this implementation... class TWDisplayWidget : public QWidget { public: TWDisplayWidget(QWidget* pParent = nullptr); void setPixmap(const QPixmap& pixmap); const QPixmap* pixmap() const {return &m_pixmap;} QSize sizeHint() const override; protected: void paintEvent(QPaintEvent* pPaintEvent) override; QPixmap m_pixmap; }; #endif tworld-2.3.0/oshw-qt/TWMainWnd.cpp000066400000000000000000001314241475511570500167640ustar00rootroot00000000000000/* Copyright (C) 2001-2017 by Madhav Shanbhag and Eric Schmidt * under the GNU General Public License. No warranty. See COPYING for details. */ #include "TWMainWnd.h" #include "TWApp.h" #include "../generic/generic.h" #include "../gen.h" #include "../defs.h" #include "../messages.h" #include "../settings.h" #include "../score.h" #include "../state.h" #include "../play.h" #include "../oshw.h" #include "../err.h" #include "../help.h" #include "TWTextCoder.h" extern int pedanticmode; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class TWStyledItemDelegate : public QStyledItemDelegate { public: TWStyledItemDelegate(QObject* pParent = nullptr) : QStyledItemDelegate(pParent) {} void paint(QPainter* pPainter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; }; void TWStyledItemDelegate::paint(QPainter* pPainter, const QStyleOptionViewItem& _option, const QModelIndex& index) const { QStyleOptionViewItem option = _option; option.state &= ~QStyle::State_HasFocus; QStyledItemDelegate::paint(pPainter, option, index); } // ... All this just to remove a silly little dotted focus rectangle class TWTableModel : public QAbstractTableModel { public: TWTableModel(QObject* pParent = nullptr); void SetTableSpec(const tablespec* pSpec); int rowCount(const QModelIndex& parent = QModelIndex()) const override; int columnCount(const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; protected: struct ItemInfo { QString sText; Qt::Alignment align; ItemInfo() : align(Qt::AlignCenter) {} }; int m_nRows, m_nCols; std::vector m_vecItems; QVariant GetData(int row, int col, int role) const; }; TWTableModel::TWTableModel(QObject* pParent) : QAbstractTableModel(pParent), m_nRows(0), m_nCols(0) { } void TWTableModel::SetTableSpec(const tablespec* pSpec) { beginResetModel(); m_nRows = pSpec->rows; m_nCols = pSpec->cols; int n = m_nRows * m_nCols; m_vecItems.clear(); m_vecItems.reserve(n); ItemInfo dummyItemInfo; const char* const * pp = pSpec->items; for (int i = 0; i < n; ++pp) { const char* p = *pp; ItemInfo ii; ii.sText = TWTextCoder::decode(p + 2); // The "center dot" character (U+00B7) isn't very visible in // some fonts, so we use U+25CF instead. ii.sText.replace(QChar(0x00B7), QChar(0x25CF)); char c = p[1]; Qt::Alignment ha = (c=='+' ? Qt::AlignRight : c=='.' ? Qt::AlignHCenter : Qt::AlignLeft); ii.align = (ha | Qt::AlignVCenter); m_vecItems.push_back(ii); int d = p[0] - '0'; for (int j = 1; j < d; ++j) { m_vecItems.push_back(dummyItemInfo); } i += d; } endResetModel(); } int TWTableModel::rowCount(const QModelIndex& parent) const { return m_nRows-1; } int TWTableModel::columnCount(const QModelIndex& parent) const { return m_nCols; } QVariant TWTableModel::GetData(int row, int col, int role) const { int i = row*m_nCols + col; const ItemInfo& ii = m_vecItems[i]; switch (role) { case Qt::DisplayRole: return ii.sText; case Qt::TextAlignmentRole: return int(ii.align); default: return QVariant(); } } QVariant TWTableModel::data(const QModelIndex& index, int role) const { return GetData(1+index.row(), index.column(), role); } QVariant TWTableModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal) return GetData(0, section, role); else return QVariant(); } TileWorldMainWnd::TileWorldMainWnd(QWidget* pParent, Qt::WindowFlags flags) : QMainWindow(pParent, flags/*|Qt::FramelessWindowHint*/), m_bSetupUi(false), m_bWindowClosed(false), m_pSurface(), m_pInvSurface(), m_nKeyState(), m_shortMessages(), m_bKbdRepeatEnabled(true), m_nRuleset(Ruleset_None), m_nLevelNum(0), m_bProblematic(false), m_bOFNT(false), m_nBestTime(TIME_NIL), m_hintMode(HINT_EMPTY), m_nTimeLeft(TIME_NIL), m_bTimedLevel(false), m_bReplay(false), m_title(""), m_author(""), m_pSortFilterProxyModel() { setupUi(this); m_bSetupUi = true; QLayout* pGameLayout = m_pGamePage->layout(); if (pGameLayout != nullptr) { pGameLayout->setAlignment(m_pGameFrame, Qt::AlignCenter); pGameLayout->setAlignment(m_pInfoFrame, Qt::AlignCenter); pGameLayout->setAlignment(m_pObjectsFrame, Qt::AlignCenter); pGameLayout->setAlignment(m_pMessagesFrame, Qt::AlignHCenter); } QPalette pal = m_pMainWidget->palette(); QLinearGradient gradient(0, 0, 1, 1); gradient.setCoordinateMode(QGradient::StretchToDeviceMode); QColor color = pal.window().color(); gradient.setColorAt(0, color.lighter(125)); gradient.setColorAt(1, color.darker(125)); pal.setBrush(QPalette::Window, QBrush(gradient)); m_pMainWidget->setPalette(pal); m_pTblList->setItemDelegate(new TWStyledItemDelegate(m_pTblList)); m_pTextBrowser->setSearchPaths(QStringList{ QString::fromLocal8Bit(seriesdatdir) }); g_pApp->installEventFilter(this); connect(m_pTblList, &QTableView::activated, this, &TileWorldMainWnd::OnListItemActivated); connect(m_pRadioMs, &QRadioButton::toggled, this, &TileWorldMainWnd::OnRulesetSwitched); connect(m_pTxtFind, &QLineEdit::textChanged, this, &TileWorldMainWnd::OnFindTextChanged); connect(m_pTxtFind, &QLineEdit::returnPressed, this, &TileWorldMainWnd::OnFindReturnPressed); connect(m_pBtnPlay, &QToolButton::clicked, this, &TileWorldMainWnd::OnPlayback); connect(m_pSldSpeed, &QSlider::valueChanged, this, &TileWorldMainWnd::OnSpeedValueChanged); connect(m_pSldSpeed, &QSlider::sliderReleased, this, &TileWorldMainWnd::OnSpeedSliderReleased); connect(m_pSldSeek, &QSlider::valueChanged, this, &TileWorldMainWnd::OnSeekPosChanged); connect(m_pBtnTextNext, &QToolButton::clicked, this, &TileWorldMainWnd::OnTextNext); connect(m_pBtnTextPrev, &QToolButton::clicked, this, &TileWorldMainWnd::OnTextPrev); connect(m_pBtnTextReturn, &QToolButton::clicked, this, &TileWorldMainWnd::OnTextReturn); connect(new QShortcut(Qt::Key_Escape, m_pTextPage), &QShortcut::activated, this, &TileWorldMainWnd::OnTextReturn); connect(new QShortcut(Qt::CTRL|Qt::Key_R, m_pTextPage), &QShortcut::activated, this, &TileWorldMainWnd::OnTextReturn); connect(new QShortcut(Qt::CTRL|Qt::Key_N, m_pTextPage), &QShortcut::activated, this, &TileWorldMainWnd::OnTextNext); connect(new QShortcut(Qt::CTRL|Qt::Key_P, m_pTextPage), &QShortcut::activated, this, &TileWorldMainWnd::OnTextPrev); connect(new QShortcut(Qt::Key_N, m_pTextPage), &QShortcut::activated, this, &TileWorldMainWnd::OnTextNext); connect(new QShortcut(Qt::Key_P, m_pTextPage), &QShortcut::activated, this, &TileWorldMainWnd::OnTextPrev); connect(m_pMenuBar, &QMenuBar::triggered, this, &TileWorldMainWnd::OnMenuActionTriggered); action_displayCCX->setChecked(getintsetting("displayccx")); action_forceShowTimer->setChecked(getintsetting("forceshowtimer") > 0); if (getintsetting("selectedruleset") == Ruleset_Lynx) m_pRadioLynx->setChecked(true); else m_pRadioMs->setChecked(true); int const tickMS = 1000 / TICKS_PER_SECOND; startTimer(tickMS / 2); } TileWorldMainWnd::~TileWorldMainWnd() { g_pApp->removeEventFilter(this); TW_FreeSurface(m_pInvSurface); TW_FreeSurface(m_pSurface); } void TileWorldMainWnd::closeEvent(QCloseEvent* pCloseEvent) { QMainWindow::closeEvent(pCloseEvent); m_bWindowClosed = true; if (m_pMainWidget->currentIndex() == PAGE_GAME) g_pApp->ExitTWorld(); else g_pApp->quit(); } void TileWorldMainWnd::timerEvent(QTimerEvent*) { if (m_shortMessages.empty()) return; uint32_t nCurTime = TW_GetTicks(); QPalette::ColorRole style = QPalette::BrightText; bool switchMessage = false; while (!m_shortMessages.empty()) { auto & mData = m_shortMessages.back(); if (nCurTime <= mData.nMsgUntil) { if (nCurTime > mData.nMsgBoldUntil) style = QPalette::Text; break; } else { m_shortMessages.pop_back(); switchMessage = true; } } if (switchMessage) { if (m_shortMessages.empty()) m_pLblShortMsg->clear(); else { m_pLblShortMsg->setText(m_shortMessages.back().sMsg); } } if (style != m_pLblShortMsg->foregroundRole()) m_pLblShortMsg->setForegroundRole(style); } bool TileWorldMainWnd::eventFilter(QObject* pObject, QEvent* pEvent) { if (HandleEvent(pObject, pEvent)) return true; return QMainWindow::eventFilter(pObject, pEvent); } struct QtModifier_TWKey { Qt::KeyboardModifier nQtMod; int nTWKey; }; static const QtModifier_TWKey g_modKeys[] = { {Qt::ShiftModifier, TWK_LSHIFT}, {Qt::ControlModifier, TWK_LCTRL}, {Qt::AltModifier, TWK_LALT}, {Qt::MetaModifier, TWK_LMETA} }; bool TileWorldMainWnd::HandleEvent(QObject* pObject, QEvent* pEvent) { if (!m_bSetupUi) return false; QEvent::Type eType = pEvent->type(); // if (eType == QEvent::LayoutRequest) puts("QEvent::LayoutRequest"); switch (eType) { case QEvent::KeyPress: case QEvent::KeyRelease: { QKeyEvent* pKeyEvent = static_cast(pEvent); int nQtKey = pKeyEvent->key(); if (nQtKey == Qt::Key_Backtab) nQtKey = Qt::Key_Tab; int nTWKey = -1; if (nQtKey >= 0 && nQtKey <= 0xFF) nTWKey = tolower(nQtKey); else if (nQtKey >= 0x01000000 && nQtKey <= 0x01000060) nTWKey = TWK_FUDGE(nQtKey); else return false; // Completely ignore multimedia keys, etc. and don't consume them bool bPress = (eType == QEvent::KeyPress); m_nKeyState[nTWKey] = bPress; // Always record the application key state // Handle modifier keys falling out of sync due to some events never being received // E.g., Windows 7 never sends Alt key-up after Alt+Tab for (const QtModifier_TWKey& mod : g_modKeys) { if (mod.nTWKey == nTWKey) continue; bool bModPressed = ((pKeyEvent->modifiers() & mod.nQtMod) != 0); if (m_nKeyState[mod.nTWKey] != bModPressed) { m_nKeyState[mod.nTWKey] = bModPressed; keyeventcallback(mod.nTWKey, bModPressed); // printf("*** MOD 0x%X = %d\n", mod.nTWKey, int(bModPressed)); } } bool bConsume = (m_pMainWidget->currentIndex() == PAGE_GAME) && (QApplication::activeModalWidget() == nullptr); // Only consume keys for the game, not for the tables or the message boxes // with the exception of a few keys for the table QObjectList const & tableWidgets = m_pTablePage->children(); if (bPress && tableWidgets.contains(pObject) && pKeyEvent->modifiers() == Qt::NoModifier) { bConsume = true; int currentrow = m_pTblList->selectionModel()->currentIndex().row(); int maxrow = m_pSortFilterProxyModel->rowCount()-1; if (nQtKey == Qt::Key_Home) m_pTblList->selectRow(0); else if (nQtKey == Qt::Key_End) m_pTblList->selectRow(maxrow); else if (nQtKey == Qt::Key_Up) m_pTblList->selectRow(currentrow - 1); else if (nQtKey == Qt::Key_Down) m_pTblList->selectRow(currentrow + 1); else if ((nQtKey == Qt::Key_Return || nQtKey == Qt::Key_Enter) && currentrow >= 0) g_pApp->exit(CmdProceed); else if (nQtKey == Qt::Key_Right && m_pRadioMs->isVisible() && pObject != m_pTxtFind) m_pRadioLynx->setChecked(true); else if (nQtKey == Qt::Key_Left && m_pRadioMs->isVisible() && pObject != m_pTxtFind) m_pRadioMs->setChecked(true); else if (nQtKey == Qt::Key_Escape) g_pApp->exit(CmdQuitLevel); else bConsume = false; } if (m_bKbdRepeatEnabled || !pKeyEvent->isAutoRepeat()) { // if (bConsume) // Always pass the key events so that the game's internal key state is in sync // otherwise, Ctrl/Shift remain "pressed" after Ctrl+S / Shift+Tab / etc. { // printf("nTWKey=0x%03X bPress=%d bConsume=%d\n", nTWKey, int(bPress), int(bConsume)); keyeventcallback(nTWKey, bPress); } } return bConsume; } break; case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: { if (pObject != m_pGameWidget) return false; QMouseEvent* pMouseEvent = static_cast(pEvent); mouseeventcallback(pMouseEvent->pos().x(), pMouseEvent->pos().y(), pMouseEvent->button(), (eType == QEvent::MouseButtonPress)); return true; } break; case QEvent::Wheel: { if (pObject != m_pGameWidget) return false; QWheelEvent* pWheelEvent = static_cast(pEvent); const int scrollDelta = pWheelEvent->angleDelta().y(); if (scrollDelta != 0) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) const QPointF eventPos(pWheelEvent->position()); #else const QPoint eventPos(pWheelEvent->x(), pWheelEvent->y()); #endif mouseeventcallback(int(eventPos.x()), int(eventPos.y()), (scrollDelta > 0 ? TW_BUTTON_WHEELUP : TW_BUTTON_WHEELDOWN), true); } return true; } break; default: break; } return false; } extern "C" uint8_t* TW_GetKeyState(int* pnNumKeys) { return g_pMainWnd->GetKeyState(pnNumKeys); } uint8_t* TileWorldMainWnd::GetKeyState(int* pnNumKeys) { if (pnNumKeys != nullptr) *pnNumKeys = TWK_LAST; return m_nKeyState; } void TileWorldMainWnd::PulseKey(int nTWKey) { keyeventcallback(nTWKey, true); keyeventcallback(nTWKey, false); } void TileWorldMainWnd::OnPlayback() { int nTWKey = m_bReplay ? TWC_PAUSEGAME : TWC_PLAYBACK; PulseKey(nTWKey); } /* * Keyboard input functions. */ /* Turn keyboard repeat on or off. If enable is TRUE, the keys other * than the direction keys will repeat at the standard rate. */ int setkeyboardrepeat(int enable) { if (g_pMainWnd) { return g_pMainWnd->SetKeyboardRepeat(enable); } else { return true; } } bool TileWorldMainWnd::SetKeyboardRepeat(bool bEnable) { m_bKbdRepeatEnabled = bEnable; return true; } /* * Video output functions. */ /* Create a display surface appropriate to the requirements of the * game (e.g., sized according to the tiles and the font). FALSE is * returned on error. */ int creategamedisplay(void) { return g_pMainWnd->CreateGameDisplay(); } bool TileWorldMainWnd::CreateGameDisplay() { TW_FreeSurface(m_pSurface); TW_FreeSurface(m_pInvSurface); int w = NXTILES*geng.wtile, h = NYTILES*geng.htile; m_pSurface = static_cast(TW_NewSurface(w, h, false)); m_pInvSurface = static_cast(TW_NewSurface(4*geng.wtile, 2*geng.htile, false)); m_pGameWidget->setPixmap(m_pSurface->GetPixmap()); m_pObjectsWidget->setPixmap(m_pInvSurface->GetPixmap()); m_pGameWidget->setFixedSize(m_pSurface->GetPixmap().size()); m_pObjectsWidget->setFixedSize(m_pInvSurface->GetPixmap().size()); geng.screen = m_pSurface; m_disploc = TW_Rect(0, 0, w, h); geng.maploc = m_pGameWidget->geometry(); SetCurrentPage(PAGE_GAME); m_pControlsFrame->setVisible(true); // this->adjustSize(); // this->resize(minimumSizeHint()); // TODO: not working! return true; } void TileWorldMainWnd::SetCurrentPage(Page ePage) { m_pMainWidget->setCurrentIndex(ePage); bool const showMenus = (ePage == PAGE_GAME); m_pMenuBar->setVisible(showMenus); // Menus won't disappear on some systems. Do the next best thing. m_pMenuBar->setEnabled(showMenus); } /* Select the colors used for drawing the display background, normal * text, bold (highlighted) text, and dim (grayed) text. The color * values are of the form 0x00RRGGBB. */ void setcolors(long bkgnd, long text, long bold, long dim) { // N/A? } /* Fill the display with the background color. */ void cleardisplay(void) { g_pMainWnd->ClearDisplay(); } void TileWorldMainWnd::ClearDisplay() { // TODO? geng.mapvieworigin = -1; } /* Display the current game state. timeleft and besttime provide the * current time on the clock and the best time recorded for the level, * measured in seconds. */ int displaygame(gamestate const *state, int timeleft, int besttime, int showinitstate) { return g_pMainWnd->DisplayGame(state, timeleft, besttime, showinitstate); } bool TileWorldMainWnd::DisplayGame(const gamestate* pState, int nTimeLeft, int nBestTime, bool bShowInitState) { bool const bInit = (pState->currenttime == -1); bool const bTimedLevel = (pState->game->time > 0); m_nTimeLeft = nTimeLeft; m_bTimedLevel = bTimedLevel; bool const bForceShowTimer = action_forceShowTimer->isChecked(); if (bInit) { m_nRuleset = pState->ruleset; m_nLevelNum = pState->game->number; m_bProblematic = false; m_nBestTime = nBestTime; m_bReplay = false; // IMPORTANT for OnSpeedValueChanged SetSpeed(0); // IMPORTANT m_pGameWidget->setCursor(m_nRuleset==Ruleset_MS ? Qt::CrossCursor : Qt::ArrowCursor); m_pLCDNumber->display(pState->game->number); m_title = TWTextCoder::decode(pState->game->name); m_bOFNT = (m_title.compare(QStringLiteral("YOU CAN'T TEACH AN OLD FROG NEW TRICKS"), Qt::CaseInsensitive) == 0); m_pLblTitle->setText(m_title); Qt::AlignmentFlag halign = (m_pLblTitle->sizeHint().width() <= m_pLblTitle->width()) ? Qt::AlignHCenter : Qt::AlignLeft; m_pLblTitle->setAlignment(halign | Qt::AlignVCenter); m_author = TWTextCoder::decode(pState->game->author); if (m_author.isEmpty()) { m_author = m_ccxLevelset.vecLevels[m_nLevelNum].sAuthor; } if (!m_author.isEmpty()) { m_pLblAuthor->setText(m_author); halign = (m_pLblAuthor->sizeHint().width() <= m_pLblAuthor->width()) ? Qt::AlignHCenter : Qt::AlignLeft; m_pLblAuthor->setAlignment(halign | Qt::AlignVCenter); m_pLblAuthor->show(); } else { m_pLblAuthor->hide(); } m_pLblPassword->setText(TWTextCoder::decode(pState->game->passwd)); m_pSldSeek->setValue(0); bool bHasSolution = hassolution(pState->game); m_pControlsFrame->setVisible(bHasSolution); menu_Game->setEnabled(true); menu_Solution->setEnabled(bHasSolution); menu_Help->setEnabled(true); action_GoTo->setEnabled(true); CCX::Level const & currLevel (m_ccxLevelset.vecLevels[m_nLevelNum]); bool hasPrologue(!currLevel.txtPrologue.vecPages.empty()); bool hasEpilogue(!currLevel.txtEpilogue.vecPages.empty()); action_Prologue->setEnabled(hasPrologue); action_Epilogue->setEnabled(hasEpilogue && bHasSolution); m_pPrgTime->setPar(-1); bool bParBad = (pState->game->sgflags & SGF_REPLACEABLE) != 0; m_pPrgTime->setParBad(bParBad); QString a = bParBad ? QStringLiteral(" *") : QString(); m_pPrgTime->setFullBar(!bTimedLevel); if (bTimedLevel) { if (nBestTime == TIME_NIL) { m_pPrgTime->setFormat(QStringLiteral("%v")); } else { m_pPrgTime->setFormat(QString::number(nBestTime) + a + QStringLiteral(" / %v")); m_pPrgTime->setPar(nBestTime); m_pSldSeek->setMaximum(nTimeLeft-nBestTime); } m_pPrgTime->setMaximum(pState->game->time); m_pPrgTime->setValue(nTimeLeft); } else { const QString noTime = (bForceShowTimer ? QStringLiteral("[999]") : QStringLiteral("---")); if (nBestTime == TIME_NIL) m_pPrgTime->setFormat(noTime); else { m_pPrgTime->setFormat(QLatin1Char('[') + QString::number(nBestTime) + a + QStringLiteral("] / ") + noTime); m_pSldSeek->setMaximum(999-nBestTime); } m_pPrgTime->setMaximum(999); m_pPrgTime->setValue(999); } m_pLblHint->clear(); SetHintMode(HINT_EMPTY); CheckForProblems(pState); Narrate(&CCX::Level::txtPrologue); } else { m_bReplay = (pState->replay >= 0); m_pControlsFrame->setVisible(m_bReplay); if (m_bProblematic) { m_pLblHint->clear(); SetHintMode(HINT_EMPTY); m_bProblematic = false; } menu_Game->setEnabled(false); menu_Solution->setEnabled(false); menu_Help->setEnabled(false); menu_Game->hide(); menu_Solution->hide(); menu_Help->hide(); action_GoTo->setEnabled(false); action_Prologue->setEnabled(false); action_Epilogue->setEnabled(false); } if (pState->statusflags & SF_SHUTTERED) { DisplayShutter(); } else { DisplayMapView(pState); } for (int i = 0; i < 4; ++i) { drawfulltileid(m_pInvSurface, i*geng.wtile, 0, (pState->keys[i] ? Key_Red+i : Empty)); drawfulltileid(m_pInvSurface, i*geng.wtile, geng.htile, (pState->boots[i] ? Boots_Ice+i : Empty)); } m_pObjectsWidget->setPixmap(m_pInvSurface->GetPixmap()); m_pLCDChipsLeft->display(pState->chipsneeded); m_pPrgTime->setValue(nTimeLeft); if (!bInit) { QString sFormat; if (bTimedLevel) sFormat = QStringLiteral("%v"); else if (bForceShowTimer) sFormat = QStringLiteral("[%v]"); else sFormat = QStringLiteral("---"); if ((bTimedLevel || bForceShowTimer) && nBestTime != TIME_NIL) { int value = nTimeLeft-nBestTime; if (value >= 0) sFormat += QStringLiteral(" (+%1)").arg(value); else sFormat += QStringLiteral(" (%1)").arg(value); } m_pPrgTime->setFormat(sFormat); } if (m_bReplay && !m_pSldSeek->isSliderDown()) { m_pSldSeek->blockSignals(true); m_pSldSeek->setValue(pState->currenttime / TICKS_PER_SECOND); m_pSldSeek->blockSignals(false); } if (!m_bProblematic) { // Call setText / clear only when really required // See comments about QLabel in TWDisplayWidget.h bool bShowHint = (pState->statusflags & SF_SHOWHINT) != 0; if (bShowInitState && m_bReplay) { if (SetHintMode(HINT_INITSTATE)) m_pLblHint->setText(TWTextCoder::decode(getinitstatestring())); } else if (bShowHint) { if (SetHintMode(HINT_TEXT)) m_pLblHint->setText(TWTextCoder::decode(pState->hinttext)); } else if (SetHintMode(HINT_EMPTY)) m_pLblHint->clear(); } return true; } void TileWorldMainWnd::CheckForProblems(const gamestate* pState) { QString s; if (pState->statusflags & SF_INVALID) { s = tr("This level cannot be played."); } else if (pState->game->unsolvable) { s = tr("This level is reported to be unsolvable"); if (*pState->game->unsolvable) s += QStringLiteral(": ") + TWTextCoder::decode(pState->game->unsolvable); s += QLatin1Char('.'); } else { CCX::RulesetCompatibility ruleCompat = m_ccxLevelset.vecLevels[m_nLevelNum].ruleCompat; CCX::Compatibility compat = CCX::COMPAT_UNKNOWN; if (m_nRuleset == Ruleset_Lynx) { if (pedanticmode) compat = ruleCompat.ePedantic; else compat = ruleCompat.eLynx; } else if (m_nRuleset == Ruleset_MS) { compat = ruleCompat.eMS; } if (compat == CCX::COMPAT_NO) { s = tr("This level is flagged as being incompatible with the current ruleset."); } } m_bProblematic = !s.isEmpty(); if (m_bProblematic) { m_pLblHint->setText(s); } } void TileWorldMainWnd::DisplayMapView(const gamestate* pState) { short xviewpos = pState->xviewpos; short yviewpos = pState->yviewpos; bool bFrogShow = (m_bOFNT && m_bReplay && xviewpos/8 == 14 && yviewpos/8 == 9); if (bFrogShow) { int x = xviewpos, y = yviewpos; if (m_nRuleset == Ruleset_MS) { for (int pos = 0; pos < CXGRID*CYGRID; ++pos) { int id = pState->map[pos].top.id; if ( ! (id >= Teeth && id < Teeth+4) ) continue; x = (pos % CXGRID) * 8; y = (pos / CXGRID) * 8; break; } } else { for (const creature* p = pState->creatures; p->id != 0; ++p) { if ( ! (p->id >= Teeth && p->id < Teeth+4) ) continue; x = (p->pos % CXGRID) * 8; y = (p->pos / CXGRID) * 8; if (p->moving > 0) { switch (p->dir) { case NORTH: y += p->moving; break; case WEST: x += p->moving; break; case SOUTH: y -= p->moving; break; case EAST: x -= p->moving; break; } } break; } } const_cast(pState)->xviewpos = x; const_cast(pState)->yviewpos = y; } displaymapview(pState, m_disploc); m_pGameWidget->setPixmap(m_pSurface->GetPixmap()); if (bFrogShow) { const_cast(pState)->xviewpos = xviewpos; const_cast(pState)->yviewpos = yviewpos; } } void TileWorldMainWnd::DisplayShutter() { QPixmap pixmap(m_pGameWidget->size()); pixmap.fill(Qt::black); QPainter painter(&pixmap); painter.setPen(Qt::red); QFont font; font.setPixelSize(geng.htile); painter.setFont(font); painter.drawText(pixmap.rect(), Qt::AlignCenter, tr("Paused")); painter.end(); m_pGameWidget->setPixmap(pixmap); } void TileWorldMainWnd::OnSpeedValueChanged(int nValue) { // IMPORTANT! if (!m_bReplay) return; // Even though the replay controls are hidden when play begins, // the slider could be manipulated before making the first move SetSpeed(nValue); } void TileWorldMainWnd::SetSpeed(int nValue) { int nMS = (m_nRuleset == Ruleset_MS) ? 1100 : 1000; if (nValue >= 0) settimersecond(nMS >> nValue); else settimersecond(nMS << (-nValue/2)); } void TileWorldMainWnd::OnSpeedSliderReleased() { m_pSldSpeed->setValue(0); } /* Get number of seconds to skip at start of playback. */ int getreplaysecondstoskip(void) { return g_pMainWnd->GetReplaySecondsToSkip(); } int TileWorldMainWnd::GetReplaySecondsToSkip() const { return m_pSldSeek->value(); } void TileWorldMainWnd::OnSeekPosChanged(int nValue) { PulseKey(TWC_SEEK); } /* Display a short message appropriate to the end of a level's game * play. If the level was completed successfully, completed is TRUE, * and the other three arguments define the base score and time bonus * for the level, and the user's total score for the series; these * scores will be displayed to the user. */ int displayendmessage(int basescore, int timescore, long totalscore, int completed) { return g_pMainWnd->DisplayEndMessage(basescore, timescore, totalscore, completed); } void TileWorldMainWnd::ReleaseAllKeys() { // On X11, it seems that the last key-up event (for the arrow key that resulted in completion) // is never sent (neither to the main widget, nor to the message box). // So pretend that all keys being held down were released. for (int k = 0; k < TWK_LAST; ++k) { if (m_nKeyState[k]) { m_nKeyState[k] = false; keyeventcallback(k, false); // printf("*** RESET 0x%X\n", k); } } } int TileWorldMainWnd::DisplayEndMessage(int nBaseScore, int nTimeScore, long lTotalScore, int nCompleted) { if (nCompleted == 0) return CmdNone; if (nCompleted == -2) // abandoned return CmdNone; QMessageBox msgBox(this); if (nCompleted > 0) // Success { const char* szMsg = nullptr; if (m_bReplay) szMsg = "Alright!"; else { szMsg = getmessage(MessageWin); if (!szMsg) szMsg = "You won!"; } QString sText; QTextStream strm(&sText); strm.setLocale(m_locale); strm << "" // << "" << "" // << "" ; if (!m_author.isEmpty()) strm << ""; strm << "" << "" << "" ; if (!m_bReplay) { if (m_bTimedLevel && m_nBestTime != TIME_NIL) { strm << ""; } strm << "" << "" // << "" // spacer << "

" << m_title << "

by " << m_author << "

 
" << szMsg << "" << "
"; if (m_nTimeLeft > m_nBestTime) { strm << "You made it " << (m_nTimeLeft - m_nBestTime) << " second(s) faster this time!"; } else if (m_nTimeLeft == m_nBestTime) { strm << "You scored " << m_nBestTime << " yet again."; } else { strm << "But not as quick as your previous score of " << m_nBestTime << "..."; } strm << "
 
" << "" << "" << "" << "" << "" << "
Time Bonus:" << nTimeScore << "
Level Bonus:" << nBaseScore << "
Level Score:" << (nTimeScore + nBaseScore) << "

Total Score:" << lTotalScore << "
                                
" ; } msgBox.setTextFormat(Qt::RichText); msgBox.setText(sText); Qt_Surface* pSurface = static_cast(TW_NewSurface(geng.wtile, geng.htile, false)); drawfulltileid(pSurface, 0, 0, Exited_Chip); msgBox.setIconPixmap(pSurface->GetPixmap()); TW_FreeSurface(pSurface); msgBox.setWindowTitle(m_bReplay ? tr("Replay Completed") : tr("Level Completed")); m_sTextToCopy = TWTextCoder::decode( timestring(m_nLevelNum, TWTextCoder::encode(m_title).constData(), m_nTimeLeft, m_bTimedLevel, false)); msgBox.addButton(tr("&Onward!"), QMessageBox::AcceptRole); QPushButton* pBtnRestart = msgBox.addButton(tr("&Restart"), QMessageBox::AcceptRole); QPushButton* pBtnCopyScore = msgBox.addButton(tr("&Copy Score"), QMessageBox::ActionRole); connect(pBtnCopyScore, &QPushButton::clicked, this, &TileWorldMainWnd::OnCopyText); msgBox.exec(); ReleaseAllKeys(); // macOS *does* return focus to the main window after closing the // victory dialog; this is here in case that changes this->activateWindow(); if (msgBox.clickedButton() == pBtnRestart) return CmdSameLevel; // if (!m_bReplay) Narrate(&CCX::Level::txtEpilogue); } else // Failure { bool bTimeout = (m_bTimedLevel && m_nTimeLeft <= 0); if (m_bReplay) { QString sMsg = QStringLiteral("Whoa! Chip "); if (bTimeout) sMsg += QStringLiteral("ran out of time"); else sMsg += QStringLiteral("ran into some trouble"); // TODO: What about when Chip just doesn't reach the exit or reaches the exit too early? sMsg += QStringLiteral(" there.\nIt looks like the level has changed after that solution" " was recorded."); msgBox.setText(sMsg); msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowTitle(tr("Replay Failed")); } else { const char* szMsg = nullptr; if (bTimeout) { szMsg = getmessage(MessageTime); if (!szMsg) szMsg = "You ran out of time."; } else { szMsg = getmessage(MessageDie); if (!szMsg) szMsg = "You died."; } msgBox.setTextFormat(Qt::PlainText); msgBox.setText(TWTextCoder::decode(szMsg)); // setIcon also causes the corresponding system sound to play // setIconPixmap does not QStyle* pStyle = QApplication::style(); if (pStyle) { QIcon icon = pStyle->standardIcon(QStyle::SP_MessageBoxWarning); msgBox.setIconPixmap(icon.pixmap(48)); } msgBox.setWindowTitle(tr("Oops.")); } msgBox.exec(); ReleaseAllKeys(); // macOS doesn't return focus to the main window after closing the death // dialog; this fixes that this->activateWindow(); } return CmdProceed; } /* Display a (very short) message for the given number of * milliseconds. bold indicates the number of milliseconds the * message is with highlighting. After that (if the message is * still visible) it is rendered as normal text. */ int setdisplaymsg(char const *msg, int msecs, int bold) { return g_pMainWnd->SetDisplayMsg(msg, msecs, bold); } bool TileWorldMainWnd::SetDisplayMsg(const char* szMsg, int nMSecs, int nBoldMSecs) { if (szMsg == nullptr || *szMsg == '\0') { m_pLblShortMsg->clear(); m_shortMessages.clear(); } uint32_t nCurTime = TW_GetTicks(); uint32_t msgUntil = nCurTime + nMSecs; uint32_t boldUntil = nCurTime + nBoldMSecs; const QString sMsg = TWTextCoder::decode(szMsg); m_pLblShortMsg->setForegroundRole(QPalette::BrightText); m_pLblShortMsg->setText(sMsg); m_shortMessages.push_back({sMsg, msgUntil, boldUntil}); return true; } /* Display a scrollable table. title provides a title to display. The * table's first row provides a set of column headers which will not * scroll. index points to the index of the item to be initially * selected; upon return, the value will hold the current selection. * Either listtype or inputcallback must be used to tailor the UI. * listtype specifies the type of list being displayed. * inputcallback points to a function that is called to retrieve * input. The function is passed a pointer to an integer. If the * callback returns TRUE, this integer should be set to either a new * index value or one of the following enum values. This value will * then cause the selection to be changed, whereupon the display will * be updated before the callback is called again. If the callback * returns FALSE, the table is removed from the display, and the value * stored in the integer will become displaylist()'s return value. */ int displaylist(char const *title, tablespec const *table, int *index, DisplayListType listtype, int (*inputcallback)(int*)) { return g_pMainWnd->DisplayList(title, table, index, listtype, inputcallback); } int TileWorldMainWnd::DisplayList(const char* szTitle, const tablespec* pTableSpec, int* pnIndex, DisplayListType eListType, int (*pfnInputCallback)(int*)) { int nCmd = 0; // dummy scope to force model destructors before ExitTWorld { TWTableModel model; model.SetTableSpec(pTableSpec); QSortFilterProxyModel proxyModel; m_pSortFilterProxyModel = &proxyModel; proxyModel.setFilterCaseSensitivity(Qt::CaseInsensitive); proxyModel.setFilterKeyColumn(-1); proxyModel.setSourceModel(&model); m_pTblList->setModel(&proxyModel); QModelIndex index = proxyModel.mapFromSource(model.index(*pnIndex, 0)); m_pTblList->setCurrentIndex(index); m_pTblList->resizeColumnsToContents(); m_pTblList->resizeRowsToContents(); m_pTxtFind->clear(); SetCurrentPage(PAGE_TABLE); m_pTblList->setFocus(); bool const showRulesetOptions = (eListType == LIST_MAPFILES); m_pRadioMs->setVisible(showRulesetOptions); m_pRadioLynx->setVisible(showRulesetOptions); m_pLblSpace->setVisible(showRulesetOptions); nCmd = g_pApp->exec(); *pnIndex = proxyModel.mapToSource(m_pTblList->currentIndex()).row(); SetCurrentPage(PAGE_GAME); m_pTblList->setModel(nullptr); m_pSortFilterProxyModel = nullptr; } if (m_bWindowClosed) g_pApp->ExitTWorld(); return nCmd; } void TileWorldMainWnd::OnListItemActivated(const QModelIndex& index) { g_pApp->exit(CmdProceed); } void TileWorldMainWnd::OnFindTextChanged(const QString& sText) { if (!m_pSortFilterProxyModel) return; QString sWildcard = QStringLiteral("*"); if (!sText.isEmpty()) sWildcard += sText + QLatin1Char('*'); m_pSortFilterProxyModel->setFilterWildcard(sWildcard); } void TileWorldMainWnd::OnFindReturnPressed() { if (!m_pSortFilterProxyModel) return; int n = m_pSortFilterProxyModel->rowCount(); if (n == 0) { ding(); return; } m_pTblList->setFocus(); if (!m_pTblList->currentIndex().isValid()) m_pTblList->selectRow(0); if (n == 1) g_pApp->exit(CmdProceed); } void TileWorldMainWnd::OnRulesetSwitched(bool mschecked) { setintsetting("selectedruleset", mschecked ? Ruleset_MS : Ruleset_Lynx); } /* Display an input prompt to the user. prompt supplies the prompt to * display, and input points to a buffer to hold the user's input. * maxlen sets a maximum length to the input that will be accepted. * Either inputtype or inputcallback must be used to validate input. * inputtype indicates the type of input desired. * The supplied callback function is called repeatedly to obtain * input. If the callback function returns a printable ASCII * character, the function will automatically append it to the string * stored in input. If '\b' is returned, the function will erase the * last character in input, if any. If '\f' is returned the function * will set input to "". If '\n' is returned, the input prompt is * erased and displayinputprompt() returns TRUE. If a negative value * is returned, the input prompt is erased and displayinputprompt() * returns FALSE. All other return values from the callback are * ignored. */ int displayinputprompt(char const *prompt, char *input, int maxlen, InputPromptType inputtype, int (*inputcallback)(void)) { return g_pMainWnd->DisplayInputPrompt(prompt, input, maxlen, inputtype, inputcallback); } int TileWorldMainWnd::DisplayInputPrompt(const char* szPrompt, char* pInput, int nMaxLen, InputPromptType eInputType, int (*pfnInputCallback)()) { switch (eInputType) { case INPUT_YESNO: { QMessageBox::StandardButton eBtn = QMessageBox::question( this, TileWorldApp::s_sTitle, TWTextCoder::decode(szPrompt), QMessageBox::Yes|QMessageBox::No); pInput[0] = (eBtn==QMessageBox::Yes) ? 'Y' : 'N'; pInput[1] = '\0'; return true; } case INPUT_ALPHA: default: { // TODO: proper validation, maybe embedded prompt QString sText = QInputDialog::getText(this, TileWorldApp::s_sTitle, TWTextCoder::decode(szPrompt)); if (sText.isEmpty()) return false; sText.truncate(nMaxLen); if (eInputType == INPUT_ALPHA) sText = sText.toUpper(); strcpy(pInput, TWTextCoder::encode(sText).constData()); return true; } } } /* * Miscellaneous functions. */ /* Ring the bell. */ void ding(void) { QApplication::beep(); } /* Set the program's subtitle. A NULL subtitle is equivalent to the * empty string. The subtitle is displayed in the window dressing (if * any). */ void setsubtitle(char const *subtitle) { g_pMainWnd->SetSubtitle(subtitle); } void TileWorldMainWnd::SetSubtitle(const char* szSubtitle) { QString sTitle = TileWorldApp::s_sTitle; if (szSubtitle && *szSubtitle) sTitle += QStringLiteral(" - ") + TWTextCoder::decode(szSubtitle); setWindowTitle(sTitle); } /* Display a message to the user. cfile and lineno can be NULL and 0 * respectively; otherwise, they identify the source code location * where this function was called from. prefix is an optional string * that is displayed before and/or apart from the body of the message. * fmt and args define the formatted text of the message body. action * indicates how the message should be presented. NOTIFY_LOG causes * the message to be displayed in a way that does not interfere with * the program's other activities. NOTIFY_ERR presents the message as * an error condition. NOTIFY_DIE should indicate to the user that the * program is about to shut down. */ void usermessage(int action, char const *prefix, char const *cfile, unsigned long lineno, char const *fmt, va_list args) { fprintf(stderr, "%s: ", action == NOTIFY_DIE ? "FATAL" : action == NOTIFY_ERR ? "error" : "warning"); if (prefix) fprintf(stderr, "%s: ", prefix); if (fmt) vfprintf(stderr, fmt, args); if (cfile) fprintf(stderr, " [%s:%lu] ", cfile, lineno); fputc('\n', stderr); fflush(stderr); } /* Displays a screenful of (hopefully) helpful information which * includes tile images. title provides the title of the display. rows * points to an array of tiletablerow structures. count specifies the * size of this array. The text of each row is displayed alongside one * or two tile images. completed controls the prompt that the user * sees at the bottom of the display. A positive value will indicate * that more text follows. A negative value will indicate that leaving * this screen will return to the prior display. A value of zero will * indicate that the current display is the end of a sequence. */ int displaytiletable(char const *title, tiletablerow const *rows, int count, int completed) { // TODO return true; } /* Displays a screenful of (hopefully) helpful information. title * provides the title of the display. table points to a table that * contains the body of the text. completed controls the prompt that * the user sees at the bottom of the display; see the description of * displaytiletable() for details. */ int displaytable(char const *title, tablespec const *table, int completed) { // TODO return true; } int getselectedruleset() { return g_pMainWnd->GetSelectedRuleset(); } int TileWorldMainWnd::GetSelectedRuleset() { return m_pRadioMs->isChecked() ? Ruleset_MS : Ruleset_Lynx; } /* Read any additional data for the series. */ void readextensions(gameseries *series) { if (g_pMainWnd == nullptr) return; // happens during batch verify, etc. g_pMainWnd->ReadExtensions(series); } void TileWorldMainWnd::ReadExtensions(gameseries* pSeries) { QDir dataDir(QString::fromLocal8Bit(seriesdatdir)); QString sSetName = QFileInfo(QString::fromLocal8Bit(pSeries->mapfilename)).completeBaseName(); QString sFilePath = dataDir.filePath(sSetName + QStringLiteral(".ccx")); m_ccxLevelset.Clear(); if (!m_ccxLevelset.ReadFile(sFilePath, pSeries->count)) warn("%s: failed to read file", TWTextCoder::encode(sFilePath).constData()); //is this printing? this should not be spitting out latin-1 OR windows-1252 if it is for (int i = 1; i <= pSeries->count; ++i) { CCX::Level& rCCXLevel = m_ccxLevelset.vecLevels[i]; rCCXLevel.txtPrologue.bSeen = false; // @#$ (pSeries->games[i-1].sgflags & SGF_HASPASSWD) != 0; rCCXLevel.txtEpilogue.bSeen = false; } } void TileWorldMainWnd::Narrate(CCX::Text CCX::Level::*pmTxt, bool bForce) { CCX::Text& rText = m_ccxLevelset.vecLevels[m_nLevelNum].*pmTxt; if ((rText.bSeen || !action_displayCCX->isChecked()) && !bForce) return; rText.bSeen = true; if (rText.vecPages.empty()) return; int n = rText.vecPages.size(); QString sWindowTitle = this->windowTitle(); SetSubtitle(""); // TODO: set name SetCurrentPage(PAGE_TEXT); m_pBtnTextNext->setFocus(); int d = +1; for (int nPage = 0; nPage < n; nPage += d) { m_pBtnTextPrev->setVisible(nPage > 0); CCX::Page& rPage = rText.vecPages[nPage]; m_pTextBrowser->setAlignment(rPage.pageProps.align | rPage.pageProps.valign); // TODO: not working! // m_pTextBrowser->setTextBackgroundColor(rPage.pageProps.bgcolor); // m_pTextBrowser->setTextColor(rPage.pageProps.color); QPalette pal = m_pTextBrowser->palette(); pal.setColor(QPalette::Base, rPage.pageProps.bgcolor); pal.setColor(QPalette::Text, rPage.pageProps.color); m_pTextBrowser->setPalette(pal); QTextDocument* pDoc = m_pTextBrowser->document(); if (pDoc != nullptr) { if (!m_ccxLevelset.sStyleSheet.isEmpty()) pDoc->setDefaultStyleSheet(m_ccxLevelset.sStyleSheet); pDoc->setDocumentMargin(16); } QString sText = rPage.sText; if (rPage.pageProps.eFormat == CCX::TEXT_PLAIN) { /* sText.replace("&", "&"); sText.replace("<", "<"); sText.replace(">", ">"); sText.replace("\n", "
"); m_pTextBrowser->setHtml(sText); */ m_pTextBrowser->setPlainText(sText); } else { m_pTextBrowser->setHtml(sText); } d = g_pApp->exec(); if (m_bWindowClosed) g_pApp->ExitTWorld(); if (d == 0) // Return break; if (nPage+d < 0) d = 0; } SetCurrentPage(PAGE_GAME); setWindowTitle(sWindowTitle); } void TileWorldMainWnd::ShowAbout() { QString text; int const numlines = vourzhon->rows; for (int i = 0; i < numlines; ++i) { if (i > 0) text += QStringLiteral("\n\n"); char const *item = vourzhon->items[2*i + 1]; text += TWTextCoder::decode(item + 2); // skip over formatting chars } QMessageBox::about(this, tr("About"), text); } void TileWorldMainWnd::OnTextNext() { g_pApp->exit(+1); } void TileWorldMainWnd::OnTextPrev() { g_pApp->exit(-1); } void TileWorldMainWnd::OnTextReturn() { g_pApp->exit(0); } void TileWorldMainWnd::OnCopyText() { QClipboard* pClipboard = QApplication::clipboard(); if (pClipboard == nullptr) return; pClipboard->setText(m_sTextToCopy); } void TileWorldMainWnd::OnMenuActionTriggered(QAction* pAction) { if (pAction == action_Prologue) { Narrate(&CCX::Level::txtPrologue, true); return; } if (pAction == action_Epilogue) { Narrate(&CCX::Level::txtEpilogue, true); return; } if (pAction == action_displayCCX) { setintsetting("displayccx", pAction->isChecked() ? 1 : 0); return; } if (pAction == action_forceShowTimer) { setintsetting("forceshowtimer", pAction->isChecked() ? 1 : 0); drawscreen(TRUE); return; } if (pAction == action_About) { ShowAbout(); return; } int nTWKey = GetTWKeyForAction(pAction); if (nTWKey == TWK_dummy) return; PulseKey(nTWKey); } int TileWorldMainWnd::GetTWKeyForAction(QAction* pAction) const { if (pAction == action_Scores) return TWC_SEESCORES; if (pAction == action_SolutionFiles) return TWC_SEESOLUTIONFILES; if (pAction == action_TimesClipboard) return TWC_TIMESCLIPBOARD; if (pAction == action_Levelsets) return TWC_QUITLEVEL; if (pAction == action_Exit) return TWC_QUIT; if (pAction == action_Begin) return TWC_PROCEED; if (pAction == action_Pause) return TWC_PAUSEGAME; if (pAction == action_Restart) return TWC_SAMELEVEL; if (pAction == action_Next) return TWC_NEXTLEVEL; if (pAction == action_Previous) return TWC_PREVLEVEL; if (pAction == action_GoTo) return TWC_GOTOLEVEL; if (pAction == action_Playback) return TWC_PLAYBACK; if (pAction == action_Verify) return TWC_CHECKSOLUTION; if (pAction == action_Replace) return TWC_REPLSOLUTION; if (pAction == action_Delete) return TWC_KILLSOLUTION; if (pAction == action_Keys) return TWC_KEYS; return TWK_dummy; } bool TileWorldMainWnd::SetHintMode(HintMode newmode) { bool changed = (newmode != m_hintMode); m_hintMode = newmode; return changed; } tworld-2.3.0/oshw-qt/TWMainWnd.h000066400000000000000000000063501475511570500164300ustar00rootroot00000000000000/* Copyright (C) 2001-2017 by Madhav Shanbhag and Eric Schmidt, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef TWMAINWND_H #define TWMAINWND_H #include "ui_TWMainWnd.h" #include "CCMetaData.h" #include "../generic/generic.h" #include "../gen.h" #include "../defs.h" #include "../state.h" #include "../series.h" #include "../oshw.h" #include #include class QSortFilterProxyModel; class TileWorldMainWnd : public QMainWindow, protected Ui::TWMainWnd { Q_OBJECT public: enum Page { PAGE_GAME, PAGE_TABLE, PAGE_TEXT }; TileWorldMainWnd(QWidget* pParent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); ~TileWorldMainWnd(); bool eventFilter(QObject* pObject, QEvent* pEvent) override; void closeEvent(QCloseEvent* pCloseEvent) override; void timerEvent(QTimerEvent*) override; bool SetKeyboardRepeat(bool bEnable); uint8_t* GetKeyState(int* pnNumKeys); int GetReplaySecondsToSkip() const; bool CreateGameDisplay(); void ClearDisplay(); bool DisplayGame(const gamestate* pState, int nTimeLeft, int nBestTime, bool showinitgamestate); bool SetDisplayMsg(const char* szMsg, int nMSecs, int nBoldMSecs); int DisplayEndMessage(int nBaseScore, int nTimeScore, long lTotalScore, int nCompleted); int DisplayList(const char* szTitle, const tablespec* pTableSpec, int* pnIndex, DisplayListType eListType, int (*pfnInputCallback)(int*)); int DisplayInputPrompt(const char* szPrompt, char* pInput, int nMaxLen, InputPromptType eInputType, int (*pfnInputCallback)()); int GetSelectedRuleset(); void SetSubtitle(const char* szSubtitle); void ReadExtensions(gameseries* pSeries); void Narrate(CCX::Text CCX::Level::*pmTxt, bool bForce = false); void ShowAbout(); private slots: void OnListItemActivated(const QModelIndex& index); void OnFindTextChanged(const QString& sText); void OnFindReturnPressed(); void OnRulesetSwitched(bool mschecked); void OnPlayback(); void OnSpeedValueChanged(int nValue); void OnSpeedSliderReleased(); void OnSeekPosChanged(int nValue); void OnTextNext(); void OnTextPrev(); void OnTextReturn(); void OnCopyText(); void OnMenuActionTriggered(QAction* pAction); private: bool HandleEvent(QObject* pObject, QEvent* pEvent); void SetCurrentPage(Page ePage); void CheckForProblems(const gamestate* pState); void DisplayMapView(const gamestate* pState); void DisplayShutter(); void SetSpeed(int nValue); void ReleaseAllKeys(); void PulseKey(int nTWKey); int GetTWKeyForAction(QAction* pAction) const; enum HintMode { HINT_EMPTY, HINT_TEXT, HINT_INITSTATE }; bool SetHintMode(HintMode newmode); bool m_bSetupUi; bool m_bWindowClosed; Qt_Surface* m_pSurface; Qt_Surface* m_pInvSurface; TW_Rect m_disploc; uint8_t m_nKeyState[TWK_LAST]; struct MessageData{ QString sMsg; uint32_t nMsgUntil, nMsgBoldUntil; }; QVector m_shortMessages; bool m_bKbdRepeatEnabled; int m_nRuleset; int m_nLevelNum; bool m_bProblematic; bool m_bOFNT; int m_nBestTime; HintMode m_hintMode; int m_nTimeLeft; bool m_bTimedLevel; bool m_bReplay; QString m_title; QString m_author; QSortFilterProxyModel* m_pSortFilterProxyModel; QLocale m_locale; CCX::Levelset m_ccxLevelset; QString m_sTextToCopy; }; #endif tworld-2.3.0/oshw-qt/TWMainWnd.ui000066400000000000000000002436751475511570500166330ustar00rootroot00000000000000 TWMainWnd 0 0 662 579 MS Sans Serif Tile World 0 0 0 0 255 255 255 40 80 128 60 120 192 50 100 160 20 40 64 26 53 85 255 255 255 255 255 255 255 255 255 0 0 0 40 80 128 0 0 0 20 40 64 255 255 220 0 0 0 255 255 255 255 255 255 40 80 128 60 120 192 50 100 160 20 40 64 26 53 85 255 255 255 255 255 255 255 255 255 0 0 0 40 80 128 0 0 0 20 40 64 255 255 220 0 0 0 255 255 255 20 40 64 40 80 128 60 120 192 50 100 160 20 40 64 26 53 85 20 40 64 255 255 255 20 40 64 40 80 128 40 80 128 0 0 0 40 80 128 255 255 220 0 0 0 255 255 255 true QFrame::Panel QFrame::Raised 3 0 9 0 0 QFrame::Panel QFrame::Sunken 0 0 0 0 0 0 432 432 0 0 QFrame::Panel QFrame::Raised 3 0 0 0 0 0 0 192 96 0 0 192 0 true QFrame::Panel QFrame::Raised 3 0 20 0 0 0 0 MS Sans Serif 10 75 true PASSWORD Qt::PlainText 0 0 74 0 255 255 255 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 64 0 0 0 0 0 0 MS Sans Serif 10 75 true true QFrame::Panel QFrame::Sunken <pwd> Qt::PlainText Qt::AlignCenter 3 0 0 0 0 0 0 MS Sans Serif 10 75 true LEVEL Qt::PlainText 0 0 74 24 0 255 0 232 232 232 0 0 0 0 255 0 232 232 232 0 0 0 96 96 96 0 0 0 0 0 0 true QFrame::Panel QFrame::Sunken true 5 QLCDNumber::Flat 0 20 0 0 0 0 MS Sans Serif 10 75 true CHIPS LEFT Qt::PlainText 0 0 74 24 0 255 0 232 232 232 0 0 0 0 255 0 232 232 232 0 0 0 96 96 96 0 0 0 0 0 0 MS Sans Serif 8 true QFrame::Panel QFrame::Sunken 1 true QLCDNumber::Flat 0 0 0 0 0 0 64 128 192 0 0 0 0 0 0 64 128 192 0 0 0 0 0 0 0 0 128 MS Sans Serif 10 true 999 500 Qt::AlignCenter %v MS Sans Serif 50 false 2 Qt::Horizontal 0 0 QFrame::StyledPanel QFrame::Raised 4 4 24 24 Qt::NoFocus Qt::RightArrow 1 0 Qt::NoFocus -5 5 1 Qt::Horizontal QSlider::TicksAbove 5 5 0 Qt::NoFocus 1000 false Qt::Horizontal 0 1 192 0 192 16777215 true QFrame::Panel QFrame::Raised 3 0 0 0 255 255 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 16 16 64 0 0 0 0 0 0 Microsoft Sans Serif 10 50 false false true QFrame::Panel QFrame::Sunken <hint> Qt::PlainText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 4 0 0 255 0 0 192 0 0 255 0 0 0 0 0 0 0 0 192 0 0 255 0 0 192 0 0 255 0 0 0 0 0 0 0 0 192 0 0 16 16 64 20 40 64 255 0 0 0 0 0 0 0 0 192 0 0 MS Sans Serif true QFrame::Panel QFrame::Sunken Qt::PlainText Qt::AlignCenter 2 0 0 QFrame::NoFrame 4 0 255 255 255 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 64 0 0 0 0 0 0 MS Sans Serif 10 75 true true QFrame::Panel QFrame::Sunken 1 <title> Qt::PlainText Qt::AlignCenter false 2 -1 true 2 0 255 255 255 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 64 0 0 0 0 0 0 MS Sans Serif 10 75 true true QFrame::Panel QFrame::Sunken 1 <author> Qt::PlainText Qt::AlignCenter false 2 -1 0 true 0 0 50 0 MS Find: 0 160 0 0 160 0 0 0 128 MS Sans Serif 10 75 true false QAbstractItemView::SingleSelection QAbstractItemView::SelectRows false false 0 0 Lynx 30 0 24 24 24 24 16 Verdana 11 50 false true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana','MS Sans Serif'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Verdana';">[text]</span></p></body></html> false Return Qt::ToolButtonTextBesideIcon Qt::DownArrow Qt::Horizontal 374 20 Previous Qt::ToolButtonTextBesideIcon Qt::LeftArrow Next Qt::ToolButtonTextBesideIcon Qt::RightArrow 0 0 662 23 Game Level Solution Options Help &Scores... Solution &Files... &Levelsets... E&xit &Start Pa&use &Restart &Next &Previous Enter Pass&word... &Playback &Verify &Replace &Delete &View Prologue... View &Epilogue... true true &Auto-display Level Text true &Show Timer on Untimed Levels &Copy Best Times to Clipboard &About... &Keys... TWProgressBar QProgressBar

TWProgressBar.h
TWDisplayWidget QWidget
TWDisplayWidget.h
1
m_pTblList m_pRadioMs m_pRadioLynx m_pTxtFind m_pTextBrowser m_pBtnTextReturn m_pBtnTextPrev m_pBtnTextNext tworld-2.3.0/oshw-qt/TWProgressBar.cpp000066400000000000000000000037261475511570500176630ustar00rootroot00000000000000/* Copyright (C) 2001-2010 by Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include "TWProgressBar.h" #include #include #include TWProgressBar::TWProgressBar(QWidget* pParent) : QProgressBar(pParent), m_nValue(0), m_nPar(-1), m_bParBad(false), m_bFullBar(false) { } void TWProgressBar::setValue(int nValue) { if (m_nValue == nValue) return; m_nValue = nValue; update(); } void TWProgressBar::setPar(int nPar) { if (m_nPar == nPar) return; m_nPar = nPar; update(); } void TWProgressBar::setParBad(bool bParBad) { if (m_bParBad == bParBad) return; m_bParBad = bParBad; update(); } void TWProgressBar::setFullBar(bool bFullBar) { if (m_bFullBar == bFullBar) return; m_bFullBar = bFullBar; update(); } QString TWProgressBar::text() const { QString sText = format(); sText.replace(QStringLiteral("%v"), QString::number(m_nValue)); return sText; } void TWProgressBar::paintEvent(QPaintEvent* pPaintEvent) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, false); const QPalette& pal = this->palette(); QRect rect = this->rect(); static const int M = 2; qDrawShadePanel(&painter, rect, pal, true, M); rect.adjust(+M, +M, -M, -M); painter.fillRect(rect, pal.window()); int d = maximum() - minimum(); if (d > 0) { bool bHasPar = (par() > minimum()); QRect rect2 = rect; double v = ( isFullBar() ? 1.0 : (double(value() - minimum()) / d) ); rect2.setWidth(int(v * rect.width())); painter.fillRect(rect2, (bHasPar && !m_bParBad) ? QColor(160, 32, 32) : pal.highlight()); // qDrawShadePanel(&painter, rect2, pal, false, 1); if (bHasPar && par() < value()) { double p = double(par() - minimum()) / d; rect2.setLeft(int(p * rect.width())); painter.fillRect(rect2, QColor(32, 160, 32)); } } if (isTextVisible()) { painter.setRenderHint(QPainter::TextAntialiasing, false); painter.drawText(rect, alignment(), text()); } } tworld-2.3.0/oshw-qt/TWProgressBar.h000066400000000000000000000017001475511570500173160ustar00rootroot00000000000000/* Copyright (C) 2001-2010 by Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef TWPROGRESSBAR_H #define TWPROGRESSBAR_H #include // QProgressBar's setValue is slow enough to cause glitchy movement // during gameplay; so replace it with a simple implementation... class TWProgressBar : public QProgressBar { public: TWProgressBar(QWidget* pParent = nullptr); // These aren't virtual, but we can still get by... void setValue(int nValue); int value() const {return m_nValue;} void setPar(int nPar); int par() const {return m_nPar;} void setParBad(bool bParBad); int isParBad() const {return m_bParBad;} void setFullBar(bool bFullBar); int isFullBar() const {return m_bFullBar;} QString text() const override; protected: void paintEvent(QPaintEvent* pPaintEvent) override; int m_nValue, m_nPar; bool m_bParBad; bool m_bFullBar; }; #endif tworld-2.3.0/oshw-qt/TWTextCoder.cpp000066400000000000000000000214661475511570500173340ustar00rootroot00000000000000#include "TWTextCoder.h" static constexpr QChar encodeTable[] { QChar{'\x00'}, QChar{'\x01'}, QChar{'\x02'}, QChar{'\x03'}, QChar{'\x04'}, QChar{'\x05'}, QChar{'\x06'}, QChar{'\x07'}, QChar{'\x08'}, QChar{'\x09'}, QChar{'\x0A'}, QChar{'\x0B'}, QChar{'\x0C'}, QChar{'\x0D'}, QChar{'\x0E'}, QChar{'\x0F'}, QChar{'\x10'}, QChar{'\x11'}, QChar{'\x12'}, QChar{'\x13'}, QChar{'\x14'}, QChar{'\x15'}, QChar{'\x16'}, QChar{'\x17'}, QChar{'\x18'}, QChar{'\x19'}, QChar{'\x1A'}, QChar{'\x1B'}, QChar{'\x1C'}, QChar{'\x1D'}, QChar{'\x1E'}, QChar{'\x1F'}, //Control codes are all the same as in unicode QChar{' '}, QChar{'!'}, QChar{'"'}, QChar{'#'}, QChar{'$'}, QChar{'%'}, QChar{'&'}, QChar{'\''}, QChar{'('}, QChar{')'}, QChar{'*'}, QChar{'+'}, QChar{','}, QChar{'-'}, QChar{'.'}, QChar{'/'}, QChar{'0'}, QChar{'1'}, QChar{'2'}, QChar{'3'}, QChar{'4'}, QChar{'5'}, QChar{'6'}, QChar{'7'}, QChar{'8'}, QChar{'9'}, QChar{':'}, QChar{';'}, QChar{'<'}, QChar{'='}, QChar{'>'}, QChar{'?'}, QChar{'@'}, QChar{'A'}, QChar{'B'}, QChar{'C'}, QChar{'D'}, QChar{'E'}, QChar{'F'}, QChar{'G'}, QChar{'H'}, QChar{'I'}, QChar{'J'}, QChar{'K'}, QChar{'L'}, QChar{'M'}, QChar{'N'}, QChar{'O'}, QChar{'P'}, QChar{'Q'}, QChar{'R'}, QChar{'S'}, QChar{'T'}, QChar{'U'}, QChar{'V'}, QChar{'W'}, QChar{'X'}, QChar{'Y'}, QChar{'Z'}, QChar{'['}, QChar{'\\'}, QChar{']'}, QChar{'^'}, QChar{'_'}, QChar{'`'}, QChar{'a'}, QChar{'b'}, QChar{'c'}, QChar{'d'}, QChar{'e'}, QChar{'f'}, QChar{'g'}, QChar{'h'}, QChar{'i'}, QChar{'j'}, QChar{'k'}, QChar{'l'}, QChar{'m'}, QChar{'n'}, QChar{'o'}, QChar{'p'}, QChar{'q'}, QChar{'r'}, QChar{'s'}, QChar{'t'}, QChar{'u'}, QChar{'v'}, QChar{'w'}, QChar{'x'}, QChar{'y'}, QChar{'z'}, QChar{'{'}, QChar{'|'}, QChar{'}'}, QChar{'~'}, QChar{'\x7F'}, //DEL char, also in unicode QChar{0x20AC}, QChar{' '}, QChar{0x20A1}, QChar{0x0192}, QChar{0x201E}, QChar{0x2026}, QChar{0x2020}, QChar{0x2021}, QChar{0x02C6}, QChar{0x2030}, QChar{0x0160}, QChar{0x2039}, QChar{0x0152}, QChar{' '}, QChar{0x017D}, QChar{' '}, QChar{' '}, QChar{0x2018}, QChar{0x2019}, QChar{0x201C}, QChar{0x201D}, QChar{0x2022}, QChar{0x2013}, QChar{0x2014}, QChar{0x02DC}, QChar{0x2122}, QChar{0x0161}, QChar{0x203A}, QChar{0x0153}, QChar{' '}, QChar{0x017E}, QChar{0x0178}, QChar{0x00A0}, //from here they all match Latin-1 exactly, which matches Unicode exactly QChar{0x00A1}, QChar{0x00A2}, QChar{0x00A3}, QChar{0x00A4}, QChar{0x00A5}, QChar{0x00A6}, QChar{0x00A7}, QChar{0x00A8}, QChar{0x00A9}, QChar{0x00AA}, QChar{0x00AB}, QChar{0x00AC}, QChar{0x00AD}, QChar{0x00AE}, QChar{0x00AF}, QChar{0x00B0}, QChar{0x00B1}, QChar{0x00B2}, QChar{0x00B3}, QChar{0x00B4}, QChar{0x00B5}, QChar{0x00B6}, QChar{0x00B7}, QChar{0x00B8}, QChar{0x00B9}, QChar{0x00BA}, QChar{0x00BB}, QChar{0x00BC}, QChar{0x00BD}, QChar{0x00BE}, QChar{0x00BF}, QChar{0x00C0}, QChar{0x00C1}, QChar{0x00C2}, QChar{0x00C3}, QChar{0x00C4}, QChar{0x00C5}, QChar{0x00C6}, QChar{0x00C7}, QChar{0x00C8}, QChar{0x00C9}, QChar{0x00CA}, QChar{0x00CB}, QChar{0x00CC}, QChar{0x00CD}, QChar{0x00CE}, QChar{0x00CF}, QChar{0x00D0}, QChar{0x00D1}, QChar{0x00D2}, QChar{0x00D3}, QChar{0x00D4}, QChar{0x00D5}, QChar{0x00D6}, QChar{0x00D7}, QChar{0x00D8}, QChar{0x00D9}, QChar{0x00DA}, QChar{0x00DB}, QChar{0x00DC}, QChar{0x00DD}, QChar{0x00DE}, QChar{0x00DF}, QChar{0x00E0}, QChar{0x00E1}, QChar{0x00E2}, QChar{0x00E3}, QChar{0x00E4}, QChar{0x00E5}, QChar{0x00E6}, QChar{0x00E7}, QChar{0x00E8}, QChar{0x00E9}, QChar{0x00EA}, QChar{0x00EB}, QChar{0x00EC}, QChar{0x00ED}, QChar{0x00EE}, QChar{0x00EF}, QChar{0x00F0}, QChar{0x00F1}, QChar{0x00F2}, QChar{0x00F3}, QChar{0x00F4}, QChar{0x00F5}, QChar{0x00F6}, QChar{0x00F7}, QChar{0x00F8}, QChar{0x00F9}, QChar{0x00FA}, QChar{0x00FB}, QChar{0x00FC}, QChar{0x00FD}, QChar{0x00FE}, QChar{0x00FF}, }; QString TWTextCoder::decode(QByteArray const& arr) { QString str{}; for (char const& c : arr) { if (c == '\0') { break; } str += encodeTable[static_cast(c)]; //note: may break on non-two's complement systems } return str; } QByteArray TWTextCoder::encode(QString const& str) { QByteArray arr{}; for (QChar const& c : str) { if (c.unicode() <= 0xFF) { arr += static_cast(c.unicode()); } else { char byte; switch (c.unicode()) { case 0x20AC: byte = '\x80'; break; case 0x20A1: byte = '\x81'; break; case 0x0192: byte = '\x82'; break; case 0x201E: byte = '\x83'; break; case 0x2026: byte = '\x84'; break; case 0x2020: byte = '\x85'; break; case 0x2021: byte = '\x86'; break; case 0x02C6: byte = '\x87'; break; case 0x2030: byte = '\x88'; break; case 0x0160: byte = '\x89'; break; case 0x2039: byte = '\x8A'; break; case 0x0152: byte = '\x8B'; break; case 0x017D: byte = '\x8E'; break; case 0x2018: byte = '\x91'; break; case 0x2019: byte = '\x92'; break; case 0x201C: byte = '\x93'; break; case 0x201D: byte = '\x94'; break; case 0x2022: byte = '\x95'; break; case 0x2013: byte = '\x96'; break; case 0x2014: byte = '\x97'; break; case 0x02DC: byte = '\x98'; break; case 0x2122: byte = '\x99'; break; case 0x0161: byte = '\x9A'; break; case 0x203A: byte = '\x9B'; break; case 0x0153: byte = '\x9C'; break; case 0x017E: byte = '\x9E'; break; case 0x0178: byte = '\x9F'; break; default: byte = ' '; break; } arr += byte; } } arr += '\0'; return arr; } tworld-2.3.0/oshw-qt/TWTextCoder.h000066400000000000000000000004071475511570500167710ustar00rootroot00000000000000#ifndef TWORLD_TWTEXTCODER_H #define TWORLD_TWTEXTCODER_H #include #include class TWTextCoder { public: static QString decode(const QByteArray& arr); static QByteArray encode(const QString& str); }; #endif //TWORLD_TWTEXTCODER_H tworld-2.3.0/oshw-qt/oshwbind.cpp000066400000000000000000000160071475511570500167700ustar00rootroot00000000000000/* oshwbind.cpp: Binds the generic module to the Qt OS/hardware layer. * * Copyright (C) 2001-2010 by Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include "../generic/generic.h" #include "../gen.h" #include #include #include #include genericglobals geng; Qt_Surface::Qt_Surface() { w = h = 0; bytesPerPixel = 0; pitch = 0; pixels = nullptr; m_bColorKeySet = false; m_nColorKey = 0; } void Qt_Surface::Init(const QPaintDevice& dev) { w = dev.width(); h = dev.height(); bytesPerPixel = dev.depth() / 8; pitch = 0; pixels = nullptr; } void Qt_Surface::InitImage() { bytesPerPixel = m_image.depth() / 8; pitch = m_image.bytesPerLine(); pixels = m_image.bits(); } void Qt_Surface::SetPixmap(const QPixmap& pixmap) { m_pixmap = pixmap; m_image = QImage(); Init(m_pixmap); } void Qt_Surface::SetImage(const QImage& image) { m_image = image; m_pixmap = QPixmap(); Init(m_image); InitImage(); } const QPixmap& Qt_Surface::GetPixmap() { if (m_pixmap.isNull()) { m_pixmap = QPixmap::fromImage(m_image); } return m_pixmap; } const QImage& Qt_Surface::GetImage() { if (m_image.isNull()) m_image = m_pixmap.toImage(); InitImage(); return m_image; } void Qt_Surface::Lock() { (void)GetImage(); m_pixmap = QPixmap(); } void Qt_Surface::Unlock() { // NOTHING } void Qt_Surface::FillRect(const TW_Rect* pDstRect, uint32_t nColor) { (void)GetPixmap(); // TODO?: don't force image -> pixmap? // TODO?: for 8-bit? if (!pDstRect) { m_pixmap.fill(nColor); } else { QPainter painter(&m_pixmap); painter.fillRect(*pDstRect, QColor(nColor)); } m_image = QImage(); pixels = nullptr; } void Qt_Surface::BlitSurface(Qt_Surface* pSrc, const TW_Rect* pSrcRect, Qt_Surface* pDst, const TW_Rect* pDstRect) { TW_Rect srcRect = (pSrcRect ? *pSrcRect : TW_Rect(0,0, pSrc->w, pSrc->h)); TW_Rect dstRect = (pDstRect ? *pDstRect : TW_Rect(0,0, pDst->w, pDst->h)); if (srcRect.w == 0) srcRect.w = pSrc->w; if (srcRect.h == 0) srcRect.h = pSrc->h; if (dstRect.w == 0) dstRect.w = srcRect.w; if (dstRect.h == 0) dstRect.h = srcRect.h; if (!pDstRect) {dstRect.w = srcRect.w; dstRect.h = srcRect.h;} else if (pDstRect && !pSrcRect) {srcRect.w = dstRect.w; srcRect.h = dstRect.h;} // TODO?: don't force image -> pixmap? (void)pDst->GetPixmap(); pDst->m_image = QImage(); pDst->pixels = nullptr; QPixmap srcPix; if (pSrc->IsColorKeySet()) { QImage image = pSrc->GetImage().copy(srcRect); QImage imgMask = image.createMaskFromColor(pSrc->GetColorKey()); srcPix = QPixmap::fromImage(image); QBitmap bmpMask = QBitmap::fromImage(imgMask); srcPix.setMask(bmpMask); srcRect.x = srcRect.y = 0; pDst->m_pixmap = srcPix; // @#$ return; // @#$ } else { srcPix = pSrc->GetPixmap(); } QPainter painter(&(pDst->m_pixmap)); painter.drawPixmap(QRect(dstRect).topLeft(), srcPix, srcRect); } void Qt_Surface::SetColorKey(uint32_t nColorKey) { m_nColorKey = nColorKey; m_bColorKeySet = true; } void Qt_Surface::ResetColorKey() { m_bColorKeySet = false; } Qt_Surface* Qt_Surface::DisplayFormat() { Qt_Surface* pNewSurface = new Qt_Surface(*this); if (!m_image.isNull()) pNewSurface->pixels = pNewSurface->m_image.bits(); (void)pNewSurface->GetPixmap(); return pNewSurface; } /* Create a fresh surface. If transparency is true, the surface is * created with 32-bit pixels, so as to ensure a complete alpha * channel. Otherwise, the surface is created with the same format as * the screen. */ extern "C" TW_Surface* TW_NewSurface(int w, int h, int bTransparent) { Qt_Surface* pSurface = new Qt_Surface(); if (bTransparent) { QImage image(w, h, QImage::Format_ARGB32); image.fill(0); pSurface->SetImage(image); } else { QPixmap pixmap(w, h); pixmap.fill(Qt::black); pSurface->SetPixmap(pixmap); } return pSurface; } extern "C" void TW_FreeSurface(TW_Surface* s) { Qt_Surface* pSurface = static_cast(s); delete pSurface; } extern "C" void TW_LockSurface(TW_Surface* s) { Qt_Surface* pSurface = static_cast(s); pSurface->Lock(); } extern "C" void TW_UnlockSurface(TW_Surface* s) { Qt_Surface* pSurface = static_cast(s); pSurface->Unlock(); } extern "C" void TW_FillRect(TW_Surface* pDst, const TW_Rect* pDstRect, uint32_t nColor) { Qt_Surface* pSurface = static_cast(pDst); pSurface->FillRect(pDstRect, nColor); } extern "C" int TW_BlitSurface(TW_Surface* _pSrc, const TW_Rect* pSrcRect, TW_Surface* _pDst, const TW_Rect* pDstRect) { Qt_Surface* pDst = static_cast(_pDst); Qt_Surface* pSrc = static_cast(_pSrc); Qt_Surface::BlitSurface(pSrc, pSrcRect, pDst, pDstRect); return 0; } extern "C" void TW_SetColorKey(TW_Surface* s, uint32_t nColorKey) { Qt_Surface* pSurface = static_cast(s); pSurface->SetColorKey(nColorKey); } extern "C" void TW_ResetColorKey(TW_Surface* s) { Qt_Surface* pSurface = static_cast(s); pSurface->ResetColorKey(); } extern "C" TW_Surface* TW_DisplayFormat(TW_Surface* s) { Qt_Surface* pSurface = static_cast(s); return pSurface->DisplayFormat(); } extern "C" TW_Surface* TW_DisplayFormatAlpha(TW_Surface* pSurface) { return TW_DisplayFormat(pSurface); } /* Return the color of the pixel at (x, y) on the given surface. (The * surface must be locked before calling this function.) */ extern "C" uint32_t TW_PixelAt(const TW_Surface* s, int x, int y) { const Qt_Surface* pSurface = static_cast(s); return pSurface->PixelAt(x, y); } extern "C" uint32_t TW_MapRGB(const TW_Surface* pSurface, uint8_t r, uint8_t g, uint8_t b) { // TODO: for 8-bit return qRgb(r, g, b); } extern "C" uint32_t TW_MapRGBA(const TW_Surface* pSurface, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { // TODO: for 8-bit return qRgba(r, g, b, a); } /* Load the given bitmap file. If setscreenpalette is true, the screen palette * will be synchronized to the bitmap's palette. */ extern "C" TW_Surface* TW_LoadBMP(const char* szFilename, int bSetScreenPalette) { QImage image(QString::fromLocal8Bit(szFilename)); if (image.isNull()) return nullptr; image = image.convertToFormat(QImage::Format_ARGB32); // Doesn't seem to be necessary, but just in case... Qt_Surface* pSurface = new Qt_Surface(); pSurface->SetImage(image); return pSurface; // TODO?: bSetScreenPalette? } // @#$ extern "C" void TW_DebugSurface(TW_Surface* s, const char* szFilename) { static int n = 0; if (n == 10) return; ++n; Qt_Surface* pSurface = static_cast(s); QString sNFilename = QString::number(n) + QString::fromLocal8Bit(szFilename); pSurface->GetImage().save(sNFilename); // pSurface->GetImage().createAlphaMask().save(sNFilename); } // $#@ using namespace std::chrono; extern "C" uint32_t TW_GetTicks(void) { static const steady_clock::time_point t0 = steady_clock::now(); return duration_cast(steady_clock::now() - t0).count(); } extern "C" void TW_Delay(uint32_t nMS) { std::this_thread::sleep_for(milliseconds(nMS)); } tworld-2.3.0/oshw-qt/oshwbind.h000066400000000000000000000130341475511570500164320ustar00rootroot00000000000000/* oshwbind.h: Binds the generic module to the Qt OS/hardware layer. * * Copyright (C) 2001-2010 by Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef HEADER_qt_oshwbind_h_ #define HEADER_qt_oshwbind_h_ #include #ifdef __cplusplus #include #include #include #define OSHW_EXTERN extern "C" #else #define OSHW_EXTERN extern #endif /* Constants */ enum { TW_ALPHA_TRANSPARENT = 0, TW_ALPHA_OPAQUE = 255 }; #ifdef __cplusplus #define TWK_FUDGE(k) (((k) & 0xFF) | 0x100) #define TWK_UNFUDGE(k) (((k) & 0xFF) | 0x1000000) enum { TWK_BACKSPACE = TWK_FUDGE(Qt::Key_Backspace), TWK_TAB = TWK_FUDGE(Qt::Key_Tab), TWK_RETURN = TWK_FUDGE(Qt::Key_Return), TWK_KP_ENTER = TWK_FUDGE(Qt::Key_Enter), TWK_ESCAPE = TWK_FUDGE(Qt::Key_Escape), TWK_UP = TWK_FUDGE(Qt::Key_Up), TWK_LEFT = TWK_FUDGE(Qt::Key_Left), TWK_DOWN = TWK_FUDGE(Qt::Key_Down), TWK_RIGHT = TWK_FUDGE(Qt::Key_Right), TWK_INSERT = TWK_FUDGE(Qt::Key_Insert), TWK_DELETE = TWK_FUDGE(Qt::Key_Delete), TWK_HOME = TWK_FUDGE(Qt::Key_Home), TWK_END = TWK_FUDGE(Qt::Key_End), TWK_PAGEUP = TWK_FUDGE(Qt::Key_PageUp), TWK_PAGEDOWN = TWK_FUDGE(Qt::Key_PageDown), TWK_F1 = TWK_FUDGE(Qt::Key_F1), TWK_F2 = TWK_FUDGE(Qt::Key_F2), TWK_F3 = TWK_FUDGE(Qt::Key_F3), TWK_F4 = TWK_FUDGE(Qt::Key_F4), TWK_F5 = TWK_FUDGE(Qt::Key_F5), TWK_F6 = TWK_FUDGE(Qt::Key_F6), TWK_F7 = TWK_FUDGE(Qt::Key_F7), TWK_F8 = TWK_FUDGE(Qt::Key_F8), TWK_F9 = TWK_FUDGE(Qt::Key_F9), TWK_F10 = TWK_FUDGE(Qt::Key_F10), TWK_LSHIFT = TWK_FUDGE(Qt::Key_Shift), TWK_LCTRL = TWK_FUDGE(Qt::Key_Control), TWK_LALT = TWK_FUDGE(Qt::Key_Alt), TWK_LMETA = TWK_FUDGE(Qt::Key_Meta), TWK_CAPSLOCK = TWK_FUDGE(Qt::Key_CapsLock), TWK_NUMLOCK = TWK_FUDGE(Qt::Key_NumLock), TWK_SCROLLLOCK = TWK_FUDGE(Qt::Key_ScrollLock) }; enum { TWK_dummy = 0x200, TWK_KP8, TWK_KP4, TWK_KP2, TWK_KP6, TWK_RSHIFT, TWK_RCTRL, TWK_RALT, TWK_RMETA, TWK_MODE, TWK_CTRL_C, TWC_SEESCORES, TWC_SEESOLUTIONFILES, TWC_TIMESCLIPBOARD, TWC_QUITLEVEL, TWC_QUIT, TWC_PROCEED, TWC_PAUSEGAME, TWC_SAMELEVEL, TWC_NEXTLEVEL, TWC_PREVLEVEL, TWC_GOTOLEVEL, TWC_PLAYBACK, TWC_CHECKSOLUTION, TWC_REPLSOLUTION, TWC_KILLSOLUTION, TWC_SEEK, TWC_HELP, TWC_KEYS, TWK_LAST }; enum { TW_BUTTON_LEFT = Qt::LeftButton, TW_BUTTON_RIGHT = Qt::RightButton, TW_BUTTON_MIDDLE = Qt::MiddleButton }; enum { TW_BUTTON_dummy = 0x100, TW_BUTTON_WHEELUP, TW_BUTTON_WHEELDOWN }; #endif /* Types */ typedef struct TW_Rect { int x, y; int w, h; #ifdef __cplusplus TW_Rect() {} TW_Rect(int _x, int _y, int _w, int _h) : x(_x), y(_y), w(_w), h(_h) {} TW_Rect(const QRect& qr) : x(qr.x()), y(qr.y()), w(qr.width()), h(qr.height()) {} operator QRect() const {return QRect(x, y, w, h);} #endif } TW_Rect; typedef struct TW_Surface { int w, h; int bytesPerPixel; int pitch; void* pixels; } TW_Surface; #ifdef __cplusplus class Qt_Surface : public TW_Surface { public: Qt_Surface(); void SetPixmap(const QPixmap& pixmap); void SetImage(const QImage& image); const QPixmap& GetPixmap(); const QImage& GetImage(); void Lock(); void Unlock(); void FillRect(const TW_Rect* pDstRect, uint32_t nColor); static void BlitSurface(Qt_Surface* pSrc, const TW_Rect* pSrcRect, Qt_Surface* pDst, const TW_Rect* pDstRect); void SetColorKey(uint32_t nColorKey); void ResetColorKey(); inline bool IsColorKeySet() const {return m_bColorKeySet;} inline uint32_t GetColorKey() const {return m_nColorKey;} Qt_Surface* DisplayFormat(); inline uint32_t PixelAt(int x, int y) const { return m_image.pixel(x, y); // TODO?: pixelIndex for 8-bit? } private: QPixmap m_pixmap; QImage m_image; bool m_bColorKeySet; uint32_t m_nColorKey; void Init(const QPaintDevice& dev); void InitImage(); }; #endif /* Functions */ OSHW_EXTERN TW_Surface* TW_NewSurface(int w, int h, int bTransparent); OSHW_EXTERN void TW_FreeSurface(TW_Surface* pSurface); #define TW_MUSTLOCK(pSurface) 1 OSHW_EXTERN void TW_LockSurface(TW_Surface* pSurface); OSHW_EXTERN void TW_UnlockSurface(TW_Surface* pSurface); OSHW_EXTERN void TW_FillRect(TW_Surface* pDst, const TW_Rect* pDstRect, uint32_t nColor); OSHW_EXTERN int TW_BlitSurface(TW_Surface* pSrc, const TW_Rect* pSrcRect, TW_Surface* pDst, const TW_Rect* pDstRect); OSHW_EXTERN void TW_SetColorKey(TW_Surface* pSurface, uint32_t nColorKey); OSHW_EXTERN void TW_ResetColorKey(TW_Surface* pSurface); #define TW_EnableAlpha(s) ; OSHW_EXTERN TW_Surface* TW_DisplayFormat(TW_Surface* pSurface); OSHW_EXTERN TW_Surface* TW_DisplayFormatAlpha(TW_Surface* pSurface); #define TW_BytesPerPixel(pSurface) ((pSurface)->bytesPerPixel) OSHW_EXTERN uint32_t TW_PixelAt(const TW_Surface* pSurface, int x, int y); OSHW_EXTERN uint32_t TW_MapRGB(const TW_Surface* pSurface, uint8_t r, uint8_t g, uint8_t b); OSHW_EXTERN uint32_t TW_MapRGBA(const TW_Surface* pSurface, uint8_t r, uint8_t g, uint8_t b, uint8_t a); OSHW_EXTERN TW_Surface* TW_LoadBMP(const char* szFilename, int bSetScreenPalette); OSHW_EXTERN void TW_DebugSurface(TW_Surface* pSurface, const char* szFilename); // @#$ OSHW_EXTERN uint8_t* TW_GetKeyState(int* pNumKeys); OSHW_EXTERN uint32_t TW_GetTicks(void); OSHW_EXTERN void TW_Delay(uint32_t nMS); #define TW_GetError() "unspecified error" #undef OSHW_EXTERN #endif tworld-2.3.0/oshw-sdl/000077500000000000000000000000001475511570500146015ustar00rootroot00000000000000tworld-2.3.0/oshw-sdl/CMakeLists.txt000066400000000000000000000010221475511570500173340ustar00rootroot00000000000000add_library(oshw-sdl STATIC "") target_sources(oshw-sdl PRIVATE ../generic/generic.h ../generic/in.c ../generic/tile.c ../generic/timer.c oshwbind.h oshwbind.c sdlerr.c sdlgen.h sdlin.c sdloshw.c sdlout.c sdlsfx.h sdlsfx.c sdltext.c ) target_include_directories(oshw-sdl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/generic ${SDL_INCLUDE_DIR} ) target_link_libraries(oshw-sdl PUBLIC ${SDL_LIBRARY}) tworld-2.3.0/oshw-sdl/ccicon.c000066400000000000000000001063231475511570500162100ustar00rootroot00000000000000/* tworld.ico:#3 */ #define CXCCICON 48 #define CYCCICON 48 static Uint32 cciconimage[] = { 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xA6A6A6, 0x606260, 0x8C918D, 0xA6A6A6, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0x5A5A5A, 0x2E2E2E, 0x2E2E2E, 0x363636, 0x424242, 0x494A4A, 0x525252, 0x5A5A5A, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB6B6B6, 0x7C7E7C, 0x667072, 0x999B9A, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0x525252, 0x323232, 0x323232, 0x2E2E2E, 0x363636, 0x424242, 0x4D4E4E, 0x525252, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0x606260, 0x828582, 0xA1A2A4, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xA6A6A6, 0xA6A6A6, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0x424242, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x363636, 0x424242, 0x4D4E4E, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0x888988, 0x5E5E5E, 0x727672, 0x727672, 0x646665, 0x555A56, 0x424A42, 0x424A42, 0x464A46, 0x777A76, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0x464646, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x3A3A3A, 0x464646, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0x999B9A, 0x929292, 0x828582, 0x747272, 0x646665, 0x555A56, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x727672, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0xAEAEAE, 0x3E3E3E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x323232, 0x3E3E3E, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAAAAAA, 0x7E827E, 0x6B6E6C, 0x606260, 0x555A56, 0x464A46, 0x464E46, 0x424A42, 0x464E46, 0x424A42, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x667072, 0xA1A2A4, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0xB6B6B6, 0xBFBFBF, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0x5E5E5E, 0x3A423A, 0x424A42, 0x464E46, 0x4C524D, 0x464E46, 0x424A42, 0x424642, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x4A4E4A, 0x545A52, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x4A5258, 0xAEAEAE, 0xBABABA, 0xC6C6C6, 0xD6D6D6, 0xE2E2E2, 0xF0F0F0, 0xF0F0F0, 0xEAEAEA, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0x272B25, 0x313632, 0x3E423E, 0x424A42, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x4C524D, 0x6A665A, 0x606260, 0x464E46, 0x424A42, 0x585E58, 0x6B6E6C, 0x6B6E6C, 0x7E827E, 0x5A625A, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x5A636B, 0xCED2D2, 0xE2E2E2, 0xCECECE, 0xBFBFBF, 0xB2B2B2, 0xAEAEAE, 0xA1A2A4, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xA1A2A4, 0x939CA5, 0x313237, 0x222622, 0x363636, 0x3E463E, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x929292, 0x888988, 0x7E827E, 0x666A65, 0x6A665A, 0x464A46, 0x464E46, 0x525652, 0x464A46, 0x464A46, 0x585E58, 0x777A76, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x434D52, 0x999B9A, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0x999B9A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0x939CA5, 0x728290, 0x6A7A89, 0x40586A, 0x222222, 0x272B25, 0x363A36, 0x3E463E, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x424A42, 0x4C524D, 0x606260, 0x606260, 0x6A6A6A, 0x646665, 0x6E726D, 0x464A46, 0x5A625A, 0x999B9A, 0x666A65, 0x585E58, 0x6B6E6C, 0x4C524D, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x555A56, 0x939CA5, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0x999B9A, 0x323232, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0xB2B2B2, 0xAEAEAE, 0xAEAEAE, 0x7A8896, 0x6C7D8E, 0x939CA5, 0x5A636B, 0x394650, 0x222622, 0x2A2E2A, 0x393E39, 0x3E463E, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x4C524D, 0x777A76, 0x727672, 0x727672, 0x5A625A, 0x4C524D, 0x464E46, 0x464E46, 0x7C7E7C, 0x6B6E6C, 0x666A65, 0x5A625A, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x4D4E4E, 0x7C888E, 0xAEAEAE, 0xB2B2B2, 0x8C918D, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0x728290, 0x7A8896, 0x959698, 0x728290, 0x5B778D, 0x394650, 0x222222, 0x2E322E, 0x3A423A, 0x424642, 0x424A42, 0x464A46, 0x464E46, 0x424A42, 0x464A46, 0x464E46, 0x6B6E6C, 0x6E726D, 0xA6A6A6, 0x777A76, 0x727672, 0x464A46, 0x5A625A, 0x585E58, 0x464E46, 0x545A52, 0x666A65, 0x666A65, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x4C524D, 0x7E8E96, 0xAAAAAA, 0x828582, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0xBFBFBF, 0xC6C6C6, 0xCED2D2, 0x7A8E92, 0x7A8896, 0x6A7A89, 0x6C7D8E, 0x929E7E, 0x363A36, 0x2A2A2A, 0x222222, 0x313632, 0x3E423E, 0x424A42, 0x424A42, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x4C524D, 0x777A76, 0x464E46, 0x6E726D, 0x727672, 0x525652, 0x464E46, 0x525652, 0x8C918D, 0x6B6E6C, 0x585E58, 0x666A65, 0x666A65, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x4A4E4A, 0x4C524D, 0x607183, 0x7E827E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xE2E2C2, 0xDCDCA8, 0xD6D696, 0x7C888E, 0x6C7D8E, 0x6A7A89, 0x8E9266, 0xB2AA3E, 0x7A8896, 0x5B778D, 0x2A353B, 0x222222, 0x313632, 0x3E423E, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x585E58, 0x929292, 0x555A56, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x585E58, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x636F77, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0xDECA22, 0xDEBE0E, 0x828676, 0x6F7E89, 0x6B6E6C, 0x6A7A89, 0x6B6E6C, 0x5B6E7E, 0x6C7D8E, 0x4F5E6C, 0x2A353B, 0x1F221E, 0x272B25, 0x363A36, 0x424642, 0x424A42, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x606260, 0x4C524D, 0x464A46, 0x5A625A, 0x727672, 0x666A65, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x4A4E4A, 0x485966, 0x313237, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xD63E02, 0xCA2202, 0x9E2E2E, 0x725660, 0x861E22, 0x6A7A89, 0x6C7D8E, 0x5B6E7E, 0x999B9A, 0xBEBA9E, 0x636F77, 0x465E6E, 0x262626, 0x272B25, 0x363A36, 0x3E463E, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x424A42, 0x424A42, 0x777A76, 0x999B9A, 0x6B6E6C, 0x777A76, 0x666A65, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464646, 0x323232, 0x323232, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0x923632, 0x985650, 0xAE8A7A, 0xBAAA8E, 0x728290, 0x607183, 0x7A867E, 0x6F7E89, 0x9A9E66, 0x6F7E89, 0x728290, 0x586A79, 0x2E3E46, 0x1F221E, 0x2E2E2E, 0x393E39, 0x424A42, 0x424A42, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x424A42, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x51626D, 0x393E42, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xDEDE86, 0xDEDE62, 0xDED646, 0xDECE26, 0x7A8276, 0x777A76, 0xAA8A36, 0x6A7A89, 0x667072, 0x586A79, 0x7C6A76, 0x86262A, 0x2E2E2E, 0x313237, 0x1F221E, 0x2E322E, 0x393E39, 0x424A42, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x525E62, 0x323232, 0x323232, 0x2E2E2E, 0x323232, 0xDEA802, 0xDE8A02, 0xDE6E02, 0xDA4E02, 0xD02E06, 0xBE220E, 0x725660, 0x607183, 0x5A6672, 0x607183, 0x866666, 0x6E5A62, 0x7A8896, 0x567A9A, 0x313237, 0x1F221E, 0x313632, 0x3E423E, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x4A4E4A, 0x4C524D, 0x525652, 0x5A625A, 0x6B6E6C, 0x545A52, 0x4E5E66, 0x3C434A, 0x2E2E2E, 0x2E2E2E, 0xDE8A02, 0xD61202, 0xB60202, 0x8E0E0A, 0x923632, 0x825E5E, 0x637686, 0x6F7E89, 0x8C918D, 0x5B778D, 0x86927E, 0x607183, 0x6F7E89, 0x5A6672, 0x2A353B, 0x222222, 0x222622, 0x313632, 0x3A423A, 0x424A42, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x4A4E4A, 0x464E46, 0x4A4E4A, 0x464E46, 0x4C524D, 0x585E58, 0x6B6E6C, 0x777A76, 0x7C7E7C, 0x7C7E7C, 0x727672, 0x646665, 0x545A52, 0x4A4E4A, 0x5C6A6E, 0x6A7A89, 0x424242, 0x323232, 0xDEA802, 0xDE4202, 0xB60202, 0x720E0A, 0xD6D2BA, 0xDEDE92, 0x9EA25A, 0xC2BC32, 0x7E8652, 0x607183, 0x6E726D, 0x607183, 0x926256, 0xCA6A0A, 0x545A52, 0x40586A, 0x262626, 0x272B25, 0x363A36, 0x3E423E, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x4A4E4A, 0x4C524D, 0x4C524D, 0x545A52, 0x6B6E6C, 0x777A76, 0x828582, 0x828582, 0x7E827E, 0x6E726D, 0x5A625A, 0x4C524D, 0x424A42, 0x424A42, 0x3E463E, 0x3E423E, 0x3E423E, 0x3E423E, 0x454E57, 0x5B6E7E, 0x5B6E7E, 0x2E2E2E, 0xDEBE02, 0xDE7A02, 0xCE0602, 0x8E0202, 0x9E827A, 0xDCDCA8, 0xDAD63E, 0x9A963A, 0x607183, 0x6A7A82, 0x6E4E56, 0x637686, 0x922E36, 0x7C6A76, 0x728290, 0x5B778D, 0x394650, 0x222222, 0x2A2A2A, 0x393E39, 0x424642, 0x464E46, 0x4C524D, 0x525652, 0x646665, 0x727672, 0x828582, 0x888988, 0x828582, 0x7C7E7C, 0x666A65, 0x545A52, 0x464E46, 0x464A46, 0x424642, 0x3E463E, 0x3E463E, 0x3E463E, 0x3E423E, 0x3A423A, 0x3A423A, 0x3A423A, 0x3A423A, 0x3E423E, 0x4A565E, 0x4F5E6C, 0x63727E, 0x323232, 0xDACE0E, 0xDC9602, 0xD02E06, 0xA80202, 0x662A2A, 0x828676, 0x7A7A46, 0x6E722A, 0x637686, 0x6E4E56, 0x7A2E3A, 0x6A767E, 0x664E5A, 0x586A79, 0x6F7E89, 0x827E4E, 0x323232, 0x1F221E, 0x1F221E, 0x2E322E, 0x3E423E, 0x666A65, 0x8C918D, 0x7A867E, 0x727672, 0x5A625A, 0x4C524D, 0x464E46, 0x424642, 0x3E463E, 0x3E463E, 0x3E423E, 0x3E423E, 0x3A423A, 0x3A423A, 0x3E3E3E, 0x393E39, 0x393E39, 0x393E39, 0x3E3E3E, 0x3E3E3E, 0x393E39, 0x393E39, 0x393E39, 0x4F5E6C, 0x4C6275, 0x5C6A6E, 0x2E2E2E, 0xC2BC32, 0xBA9A06, 0x3C2E18, 0x313237, 0x2A2A2A, 0x394650, 0x454E57, 0x1E1E1E, 0x5A4216, 0xBE5A16, 0x5E5666, 0x607183, 0x6A5E62, 0x607183, 0x6E6256, 0x5A4E26, 0x667072, 0x5B778D, 0x343A3F, 0x272B25, 0x393E39, 0x424642, 0x424A42, 0x424A42, 0x3E463E, 0x3E423E, 0x3A423A, 0x393E39, 0x3A423A, 0x3E423E, 0x3E3E3E, 0x3A423A, 0x3A423A, 0x3A423A, 0x3E3E3E, 0x3A423A, 0x393E39, 0x393E39, 0x3A3A3A, 0x3A3A2A, 0x2E322E, 0x2E2E2E, 0x2A2E2A, 0x2E2E2E, 0x343A3F, 0x586A79, 0x586A79, 0x323232, 0x7E8652, 0x272B25, 0x1F221E, 0x313237, 0x5B6E7E, 0x4E677B, 0x5A636B, 0x1E1E1E, 0x1F221E, 0x525652, 0x6A7A89, 0x637686, 0x394650, 0x607183, 0x454E57, 0x63727E, 0x728290, 0x7A8896, 0x586A79, 0x222222, 0x2E322E, 0x393E39, 0x3E423E, 0x3A423A, 0x3A423A, 0x3E423E, 0x3E423E, 0x3A423A, 0x393E39, 0x3A423A, 0x3E3E3E, 0x393E39, 0x3A3A3A, 0x363A36, 0x2E322E, 0x323232, 0x343A3F, 0x3C434A, 0x2E2E2E, 0x2A2A2A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x434D52, 0x637686, 0x4A5258, 0x606260, 0x222222, 0x222622, 0x222222, 0x2E2E2E, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x1E1E1E, 0x262626, 0x5A6672, 0x313237, 0x3C434A, 0x637686, 0x4E5E66, 0x4C6275, 0x6A7A89, 0x625A42, 0x3A3A2A, 0x222222, 0x2E322E, 0x363A36, 0x393E39, 0x3E3E3E, 0x3E3E3E, 0x393E39, 0x393E39, 0x3A3A3A, 0x363A36, 0x2E322E, 0x323226, 0x46381E, 0x2A2E2A, 0x2E322E, 0x363636, 0x3E3E3E, 0x3E3E3E, 0x323232, 0x313237, 0x2E2E2E, 0x2A2A2A, 0x2E2E2E, 0x2E2E2E, 0x2E322E, 0x2E2E2E, 0x2E2E2E, 0x3A3A3A, 0x313237, 0x6A6A6A, 0x3A3A3A, 0x222222, 0x222222, 0x323232, 0x3C434A, 0x3C434A, 0x5B6E7E, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x343A3F, 0x4E677B, 0x637686, 0x545A52, 0x586A79, 0x666A65, 0x5A3A02, 0x5A3A02, 0x1F221E, 0x2A2E2A, 0x363A36, 0x363A36, 0x363A36, 0x2E322E, 0x322E26, 0x3A321A, 0x48340A, 0x5A400C, 0x694602, 0x7C5202, 0x875A02, 0x514126, 0x363636, 0x363A36, 0x363A36, 0x4A5258, 0x394650, 0x465E6E, 0x51626D, 0x2A2A2A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x6B6E6C, 0x5A5A5A, 0x1E1E1E, 0x222222, 0x262626, 0x607183, 0x435E72, 0x5A6672, 0x2A2A2A, 0x222222, 0x1E1E1E, 0x394650, 0x6A7A89, 0x63727E, 0x564A2A, 0x5B6E7E, 0x666A65, 0x5A3A02, 0x5E3E02, 0x48340A, 0x3B2E11, 0x3B2E11, 0x48340A, 0x48340A, 0x5A3A02, 0x5E3E02, 0x5A3A02, 0x694602, 0x694602, 0x6F4A02, 0x754E02, 0x875A02, 0x875A02, 0x313632, 0x363636, 0x363636, 0x363A36, 0x526F86, 0x4E677B, 0x4F5E6C, 0x363636, 0x2A2A2A, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E322E, 0x323232, 0x667072, 0x6B6E6C, 0x2A2A2A, 0x1E1E1E, 0x262626, 0x262626, 0x1E1E1E, 0x1E1E1E, 0x262626, 0x222222, 0x1E1E1E, 0x222222, 0x454E57, 0x322E26, 0x524A36, 0x5B6E7E, 0x6A665A, 0x5A3A02, 0x5E3E02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5E3E02, 0x644202, 0x694602, 0x7C5202, 0x825602, 0x8F5F02, 0x5E461C, 0x363636, 0x2A353B, 0x363636, 0x3A3A3A, 0x363636, 0x323232, 0x363636, 0x2E2E2E, 0x2A2A2A, 0x323232, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x747272, 0x6B6E6C, 0x4D4E4E, 0x222222, 0x1E1E1E, 0x222222, 0x43525E, 0x2A353B, 0x607183, 0x2E2E2E, 0x1E1E1E, 0x1E1E1E, 0x1F221E, 0x2E3E46, 0x6A767E, 0x5B6E7E, 0x625A42, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5E3E02, 0x5E3E02, 0x5E3E02, 0x644202, 0x6F4A02, 0x754E02, 0x7C5202, 0x875A02, 0x8F5F02, 0x323232, 0x313632, 0x363636, 0x363636, 0x454E57, 0x3C434A, 0x40586A, 0x485966, 0x2A2A2A, 0x2A2A2A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x747272, 0x6B6E6C, 0x606260, 0x222222, 0x222222, 0x222222, 0x51626D, 0x4C6275, 0x40586A, 0x363E46, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x2A353B, 0x5B778D, 0x637686, 0x5A400C, 0x5A3A02, 0x5A3A02, 0x5E3E02, 0x5E3E02, 0x5E3E02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5E3E02, 0x5E3E02, 0x6F4A02, 0x7C5202, 0x825602, 0x875A02, 0x926208, 0xAA6E02, 0x514126, 0x363636, 0x363636, 0x363636, 0x343A3F, 0x526F86, 0x4E677B, 0x485966, 0x363636, 0x2A2A2A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x667072, 0x667072, 0x6A6A6A, 0x2E2E2E, 0x1E1E1E, 0x262626, 0x2A2A2A, 0x222222, 0x1E1E1E, 0x222222, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x1F221E, 0x394650, 0x5A4212, 0x5A3A02, 0x5E3E02, 0x5E3E02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x644202, 0x694602, 0x694602, 0x6F4A02, 0x754E02, 0x7C5202, 0x825602, 0x8F5F02, 0x875A02, 0x926208, 0x9A6814, 0xAA6E02, 0x624A1C, 0x313632, 0x3A3A3A, 0x3A3A3A, 0x3A3A3A, 0x393E42, 0x3A3A3A, 0x363636, 0x363636, 0x323232, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0x6B6E6C, 0x6B6E6C, 0x646665, 0x313237, 0x1E1E1E, 0x222222, 0x222222, 0x454E57, 0x313237, 0x40586A, 0x454E57, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x48340A, 0x5A3A02, 0x5A3A02, 0x5E3E02, 0x644202, 0x6F4A02, 0x6F4A02, 0x754E02, 0x7C5202, 0x825602, 0x7C5202, 0x825602, 0x855908, 0x966822, 0xA77F49, 0xBE966A, 0xBE925E, 0xA2701A, 0x9E6702, 0x564629, 0x3A3A3A, 0x3A3A3A, 0x3A3A3A, 0x3A3A3A, 0x3A3A3A, 0x43525E, 0x3C434A, 0x40586A, 0x4C5862, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x6A6A6A, 0x646665, 0x646665, 0x363A36, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x494A4A, 0x586A79, 0x4C6275, 0x4A565E, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x1F221E, 0x5A3A02, 0x644202, 0x6F4A02, 0x754E02, 0x7C5202, 0x825602, 0x825602, 0x8A5E12, 0x926A2A, 0x9E7642, 0xA77F49, 0xA77F49, 0xA67A36, 0xA2701A, 0x926208, 0x9E6702, 0x8F5F02, 0x6E521A, 0x3E3E3E, 0x343A3F, 0x3E3E3E, 0x3E3E3E, 0x3E3E3E, 0x343A3F, 0x464646, 0x5B778D, 0x4E677B, 0x4C6275, 0x3A3A3A, 0x323232, 0x2E2E2E, 0x323232, 0x6A6A6A, 0x606260, 0x6A5E62, 0x3E3E3E, 0x1E1E1E, 0x222222, 0x1E1E1E, 0x2A2A2A, 0x313237, 0x222222, 0x1E1E1E, 0x222222, 0x222222, 0x222622, 0x262626, 0x222622, 0x3B2E11, 0x5E3E02, 0x6F4A02, 0x7C5202, 0x825602, 0x855908, 0x92621A, 0x966822, 0x9A6814, 0x8F5F02, 0x8F5F02, 0x875A02, 0x875A02, 0x8F5F02, 0x825602, 0x6E521A, 0x464236, 0x3E3E3E, 0x3E423E, 0x424242, 0x424242, 0x3E3E3E, 0x3E423E, 0x393E42, 0x393E42, 0x394650, 0x424242, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x323232, 0x2E2E2E, 0x6A5E62, 0x5E5E5E, 0x5E5E5E, 0x424242, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x222222, 0x313237, 0x2A353B, 0x343A3F, 0x465E6E, 0x2A2A2A, 0x2A2A2A, 0x2A2A2A, 0x2A2A2A, 0x2A2A2A, 0x3B2E11, 0x5A3A02, 0x694602, 0x754E02, 0x825602, 0x825602, 0x875A02, 0x825602, 0x825602, 0x725212, 0x624A1C, 0x564629, 0x464236, 0x424242, 0x3E3E3E, 0x424242, 0x424242, 0x424242, 0x464646, 0x464646, 0x464646, 0x464646, 0x464646, 0x464646, 0x3E423E, 0x454E57, 0x3C434A, 0x3E5262, 0x4F5E6C, 0x3A3A3A, 0x363636, 0x5E5E5E, 0x5E5E5E, 0x5E5E5E, 0x494A4A, 0x222222, 0x222222, 0x262626, 0x262626, 0x2A353B, 0x5B778D, 0x435E72, 0x4E677B, 0x2A353B, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E322E, 0x323232, 0x3A362F, 0x46381E, 0x5A4212, 0x5E461C, 0x5E461C, 0x564629, 0x393E39, 0x3A3A3A, 0x3E3E3E, 0x393E42, 0x393E42, 0x3E3E3E, 0x424242, 0x424242, 0x424242, 0x464646, 0x464646, 0x464646, 0x4D4E4E, 0x5A5A5A, 0x727672, 0x959698, 0x7C7E7C, 0x3E3E3E, 0x434D52, 0x567A9A, 0x4C6275, 0x4E677B, 0x494A4A, 0x3E3E3E, 0x5A5A5A, 0x585E58, 0x5E5E5E, 0x4D4E4E, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x2A2A2A, 0x2A2A2A, 0x454E57, 0x363E46, 0x363636, 0x323232, 0x323232, 0x313237, 0x363636, 0x363636, 0x363A36, 0x363A36, 0x393E39, 0x3E3E3E, 0x393E39, 0x3E3E3E, 0x393E42, 0x3E423E, 0x424242, 0x424242, 0x424242, 0x424242, 0x464646, 0x464646, 0x494A4A, 0x525252, 0x646665, 0x828582, 0xAAAAAA, 0xBABABA, 0xBABABA, 0xA1A2A4, 0x7C7E7C, 0x393E42, 0x3A3A3A, 0x424242, 0x4E5E66, 0x46565E, 0x464646, 0x464646, 0x464646, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x4A5258, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x2A2A2A, 0x2A2A2A, 0x363636, 0x343A3F, 0x363636, 0x4A5258, 0x424242, 0x2A353B, 0x3A3A3A, 0x3A3A3A, 0x343A3F, 0x3E3E3E, 0x3E3E3E, 0x424242, 0x3E3E3E, 0x424242, 0x424242, 0x424242, 0x424642, 0x464646, 0x4D4E4E, 0x545656, 0x747272, 0x929292, 0xAEAEAE, 0xB6B6B6, 0xAAAAAA, 0x888988, 0x6A6A6A, 0x4D4E4E, 0x464646, 0x424242, 0x3E3E3E, 0x262626, 0x363636, 0x424242, 0x494A4A, 0x747272, 0x959698, 0xBFBFBF, 0x999B9A, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x545656, 0x222222, 0x222222, 0x1E1E1E, 0x2A2A2A, 0x323232, 0x2A353B, 0x5B778D, 0x40586A, 0x4C6275, 0x485966, 0x3E423E, 0x3E3E3E, 0x424242, 0x3E423E, 0x393E42, 0x424242, 0x424242, 0x464646, 0x464646, 0x4D4E4E, 0x606260, 0x7C7E7C, 0x999B9A, 0xAAAAAA, 0xAAAAAA, 0x929292, 0x747272, 0x5A5A5A, 0x494A4A, 0x464646, 0x424242, 0x424242, 0x424242, 0x3E3E3E, 0x3E3E3E, 0x2E2E2E, 0x222222, 0x2E2E2E, 0x3A3A3A, 0x4D4E4E, 0xAEAEAE, 0x888988, 0x646665, 0x4D4E4E, 0x5A5A5A, 0x5A5A5A, 0x5E5E5E, 0x5A5A5A, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x262626, 0x2E322E, 0x363636, 0x40586A, 0x5B778D, 0x485966, 0x454E57, 0x424242, 0x424242, 0x424242, 0x424642, 0x494A4A, 0x545656, 0x6A6A6A, 0x828582, 0x999B9A, 0xA1A2A4, 0x959698, 0x777A76, 0x606260, 0x4D4E4E, 0x464646, 0x424642, 0x424242, 0x424242, 0x3E3E3E, 0x3E3E3E, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x323232, 0x222222, 0x222222, 0x2A2A2A, 0x3A3A3A, 0x393E42, 0x464646, 0x424242, 0x424242, 0x424242, 0x5A5A5A, 0x5E5E5E, 0x585E58, 0x5E5E5E, 0x222222, 0x222222, 0x1E1E1E, 0x222222, 0x2E2E2E, 0x3A3A3A, 0x3E423E, 0x393E42, 0x424242, 0x424242, 0x4D4E4E, 0x464646, 0x646665, 0x888988, 0x959698, 0x929292, 0x7E827E, 0x6A6A6A, 0x525252, 0x464646, 0x424242, 0x424242, 0x424242, 0x424242, 0x3E3E3E, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x2A2A2A, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x2E2E2E, 0x363A36, 0x3E3E3E, 0x343A3F, 0x3A3A3A, 0x363636, 0x5A5A5A, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x262626, 0x1E1E1E, 0x222222, 0x1E1E1E, 0x2E2E2E, 0x363636, 0x424242, 0x485966, 0x4F5E6C, 0x454E57, 0x607183, 0x494A4A, 0x4D4E4E, 0x5A5A5A, 0x4D4E4E, 0x464646, 0x424242, 0x464646, 0x424242, 0x424242, 0x3E3E3E, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x2E2E2E, 0x262626, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x2E2E2E, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x5A5A5A, 0x5E5E5E, 0x5A5A5A, 0x5A5A5A, 0x2A2A2A, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x262626, 0x363636, 0x3E3E3E, 0x454E57, 0x628EAA, 0x4E677B, 0x5B6E7E, 0x43525E, 0x494A4A, 0x464646, 0x3E3E3E, 0x3E3E3E, 0x3E3E3E, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x323232, 0x2E2E2E, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x262626, 0x323232, 0x363636, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x5E5E5E, 0x323232, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x323232, 0x393E39, 0x424242, 0x4C6275, 0x43525E, 0x494A4A, 0x494A4A, 0x4D4E4E, 0x494A4A, 0x3E3E3E, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x2E322E, 0x2A2A2A, 0x222222, 0x222222, 0x222222, 0x1E1E1E, 0x262626, 0x2E322E, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x5A5A5A, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x363636, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x2A2A2A, 0x3A3A3A, 0x424242, 0x494A4A, 0x585E58, 0x727672, 0x888988, 0xAEAEAE, 0x4D4E4E, 0x464646, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x313237, 0x2E2E2E, 0x262626, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x262626, 0x323232, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x5A5A5A, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x3E3E3E, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x1E1E1E, 0x222222, 0x3A3A3A, 0x424242, 0x5A5A5A, 0x7C7E7C, 0x646665, 0x545656, 0x4D4E4E, 0x464646, 0x424242, 0x363636, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x3A362F, 0x313237, 0x2E2E2E, 0x262626, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x1E1E1E, 0x262626, 0x323232, 0x363636, 0x363636, 0x3A3A3A, 0x3A3A3A, 0x5A5A5A, 0x5E5E5E, 0x5A5A5A, 0x5A5A5A, 0x464646, 0x222222, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x323232, 0x3E3E3E, 0x424242, 0x3C434A, 0x424242, 0x424242, 0x424242, 0x424242, 0x3E3E3E, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x363636, 0x363636, 0x363636, 0x313237, 0x323232, 0x2E2E2E, 0x262626, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x2A2A2A, 0x323232, 0x3A3A3A, 0x363636, 0x363636, 0x3A3A3A }; static Uint8 cciconmask[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; #if 0 /* tworld.ico:#2 */ #define CXCCICON 32 #define CYCCICON 32 static Uint32 cciconimage[] = { 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0x6E6E6E, 0x9E9E9E, 0xAEAEAE, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0x9A9A9A, 0x2E2E2E, 0x323232, 0x3A3A3A, 0x4A4A4A, 0x565656, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0x929292, 0x7E7E7E, 0xA9AAAA, 0xAEAEAE, 0xAEAEAE, 0xA9AAAA, 0xA9AAAA, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0x9E9E9E, 0x323232, 0x2E2E2E, 0x323232, 0x3E3E3E, 0x4E4E4E, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xA6A6A6, 0x9A9A9A, 0x8E928E, 0x565A56, 0x626662, 0x5A625A, 0x4E524E, 0x424A42, 0x4E524E, 0x929692, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0x8D8E8D, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x323232, 0x424242, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xA6A6A6, 0x8A8A8A, 0x767A76, 0x666A66, 0x565A56, 0x4A4E4A, 0x424A42, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464A46, 0x4A4E4A, 0x8A8A8A, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0xB2B2B2, 0x8D8E8D, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0xB2B2B2, 0xB2B2B2, 0xB2B2B2, 0xAEAEAE, 0x424642, 0x424642, 0x4A4E4A, 0x4A4E4A, 0x424642, 0x464E46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x5E625E, 0x5A625A, 0x464E46, 0x4A4E4A, 0x4A4E4A, 0x7A8286, 0xCECED2, 0xDEDEDE, 0xE2E2E2, 0xDEDEDE, 0x9E9E9E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0xAEAEAE, 0xAEAEAE, 0xAEAEAE, 0x9EA2AA, 0x262E30, 0x323632, 0x3E463E, 0x464E46, 0x464E46, 0x464A46, 0x4A524A, 0x7E827E, 0x7E827E, 0x5E625E, 0x464A46, 0x5E625E, 0x4E564E, 0x5A5E5A, 0x5E5E5E, 0x464A46, 0x424A42, 0x464E46, 0x6E7A7E, 0xB2B2B2, 0xAEAEAE, 0xAEAEAE, 0x7A7A7A, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0xB2B2B2, 0xAEAEAE, 0x828E96, 0x72828F, 0x3A4246, 0x222622, 0x363A36, 0x424A42, 0x464E46, 0x464A46, 0x464A46, 0x525652, 0x767A76, 0x6A6E6A, 0x626662, 0x525652, 0x767A76, 0x666A66, 0x6A6E6A, 0x4E524E, 0x464A46, 0x464A46, 0x424A42, 0x66767A, 0xA9AAAA, 0xB2B2B2, 0x727272, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xAEAEAE, 0xB2B2B2, 0x7A8692, 0x8E969E, 0x6E7E8E, 0x3A4E5A, 0x222622, 0x3A3E3A, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x4A524A, 0x6E726E, 0x858685, 0x6A6E6A, 0x4E564E, 0x5E665E, 0x464A46, 0x565E56, 0x525A52, 0x464E46, 0x464E46, 0x4A4E4A, 0x626A6E, 0xAAAAAE, 0x6A6A6A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x323232, 0xCACACA, 0xD6D6CA, 0x7E8A96, 0x72828F, 0x869276, 0x6A7256, 0x2E363A, 0x262A26, 0x3E3E3E, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x626662, 0x666A66, 0x666A66, 0x4E524E, 0x4A524A, 0x727672, 0x565A56, 0x5A5E5A, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x566264, 0x5E5E5E, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xDED24A, 0xB6AE5A, 0x6E7E88, 0x727672, 0x7E7666, 0x72828F, 0x526272, 0x1E221E, 0x2E322E, 0x3E423E, 0x464E46, 0x464A46, 0x464E46, 0x424A42, 0x666A66, 0x464E46, 0x565E56, 0x666A66, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x4A5658, 0x3A3A3A, 0x2E2E2E, 0x323232, 0x2E2E2E, 0x323232, 0xBE2202, 0x9E261E, 0x865252, 0x6E626E, 0x6E727E, 0x8E928E, 0x8A968E, 0x586A7A, 0x292A2A, 0x2E3232, 0x424642, 0x424A42, 0x464E46, 0x464A46, 0x4A4E4A, 0x767A76, 0x6E726E, 0x626662, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x353A3E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0xCAC27E, 0xDEDA72, 0xBEBA5E, 0x6E7A7E, 0x8E865A, 0x6E7E7A, 0x5E7282, 0x764652, 0x303236, 0x222626, 0x323632, 0x424642, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x4A5658, 0x3A3E3E, 0x2E2E2E, 0x323232, 0xDE8A02, 0xD64E02, 0xC62E02, 0xA61A12, 0x666676, 0x627682, 0x6E7E88, 0x7E6E72, 0x6E8696, 0x324652, 0x222622, 0x363A36, 0x424642, 0x464A46, 0x464E46, 0x464E46, 0x464A46, 0x464E46, 0x464A46, 0x464A46, 0x464A46, 0x464E46, 0x464E46, 0x464E46, 0x4A4E4A, 0x525652, 0x626662, 0x6A6E6A, 0x666A66, 0x566264, 0x3A464A, 0x2E2E2E, 0xDE8A02, 0xBE0602, 0x8A423E, 0xCECA9E, 0x86925E, 0x9A9E56, 0x7A8276, 0x5A6A76, 0x966A5A, 0x665A3A, 0x2E3A42, 0x262A26, 0x3A3E3A, 0x424A42, 0x464A46, 0x464A46, 0x464E46, 0x464A46, 0x464E46, 0x4E564E, 0x5E665E, 0x6A6E6A, 0x6E726E, 0x6E726E, 0x6A6E6A, 0x5E625E, 0x4E524E, 0x424A42, 0x3E463E, 0x484E54, 0x637686, 0x3C3E42, 0xDEB602, 0xC62E02, 0x8A0A0A, 0xCECA9E, 0xD6D232, 0x6E727E, 0x7E5A62, 0x5C6E7E, 0x823A42, 0x6E7E8E, 0x546A7E, 0x262A26, 0x2A2E2A, 0x3E463E, 0x565E56, 0x6E726E, 0x767A76, 0x767A76, 0x727672, 0x6A6E6A, 0x565E56, 0x464E46, 0x424A42, 0x3E463E, 0x3E423E, 0x3A423A, 0x3A3E3A, 0x3A3E3A, 0x3A423A, 0x48525A, 0x586A7A, 0x3C3E42, 0xCEC21E, 0x864A0E, 0x4E262A, 0x2E363A, 0x2A3236, 0x4E4A36, 0xAE4622, 0x5C6E7E, 0x625A62, 0x6A7272, 0x766A2E, 0x4A5A66, 0x262E30, 0x363A36, 0x525652, 0x4A524A, 0x424A42, 0x3E463E, 0x3E423E, 0x3A423A, 0x3A423A, 0x3A3E3A, 0x3A3E3A, 0x3A3E3A, 0x3A423A, 0x3A3E3A, 0x363A36, 0x323632, 0x2E322E, 0x3A3A3A, 0x5C6E7E, 0x3A3E3E, 0x625E46, 0x222226, 0x323E46, 0x44525E, 0x353A3E, 0x1E1E1E, 0x565A56, 0x5A6A76, 0x44525E, 0x526272, 0x5E7282, 0x72828F, 0x424E5A, 0x2A2E2A, 0x3A3E3A, 0x3A3E3A, 0x3E3E3E, 0x3E3E3E, 0x423E3A, 0x3A3E3A, 0x3A3E3A, 0x323632, 0x323632, 0x323636, 0x3A4246, 0x323632, 0x292A2A, 0x2E2E2E, 0x2E2E32, 0x2E322E, 0x464A52, 0x4E5A62, 0x5E625E, 0x1E1E1E, 0x222226, 0x303236, 0x324652, 0x262E30, 0x222226, 0x262E30, 0x526272, 0x6A6E6A, 0x5E7282, 0x5E4A22, 0x3E2E0E, 0x262A26, 0x363A36, 0x363A36, 0x323632, 0x363626, 0x42361A, 0x523E0E, 0x6D4602, 0x56421E, 0x363636, 0x363636, 0x3A464A, 0x3D464E, 0x36424A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x6E6E6E, 0x323232, 0x222226, 0x464A52, 0x3E4A56, 0x2E3232, 0x1E1E1E, 0x2E2E32, 0x5C6E7E, 0x525242, 0x5E7282, 0x5D3E02, 0x5A3A02, 0x48320C, 0x4C3606, 0x4C3606, 0x5A3A02, 0x5D3E02, 0x664202, 0x704A02, 0x825602, 0x885A02, 0x423A2E, 0x32363A, 0x414246, 0x525E6A, 0x42464E, 0x2A2E2A, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x727272, 0x4E524E, 0x1E221E, 0x222622, 0x2E3A42, 0x44525E, 0x26262A, 0x1E1E1E, 0x1E1E1E, 0x525E66, 0x637686, 0x5A3A02, 0x5A3A02, 0x5D3E02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5A3A02, 0x5D3E02, 0x6D4602, 0x784E02, 0x885A02, 0x6C4E16, 0x323632, 0x3A3A3A, 0x3A4246, 0x323E46, 0x424E5A, 0x292A2A, 0x2E2E2E, 0x2E2E2E, 0x323232, 0x727272, 0x6A6A6A, 0x222222, 0x222222, 0x424E5A, 0x3E4652, 0x262E30, 0x1E1E1E, 0x1E1E1E, 0x526272, 0x625E46, 0x5D3E02, 0x5A3A02, 0x5A3A02, 0x5D3E02, 0x5D3E02, 0x5D3E02, 0x664202, 0x6D4602, 0x7C5202, 0x885A02, 0x966202, 0x9A6606, 0x303236, 0x32363A, 0x3A3A3A, 0x495E6E, 0x44525E, 0x323232, 0x2E2E2E, 0x2E2E2E, 0x2E2E2E, 0x6E6E6E, 0x666666, 0x2A2A2E, 0x1E221E, 0x262A26, 0x2A3236, 0x44525E, 0x222226, 0x1E221E, 0x1E221E, 0x48320C, 0x5A3A02, 0x5D3E02, 0x664202, 0x6D4602, 0x784E02, 0x7C5202, 0x7C5202, 0x865A0A, 0xA2722A, 0xAE8246, 0xAA762A, 0x9A6606, 0x363A36, 0x3A3A3A, 0x3A3A3A, 0x3A3A3A, 0x36424A, 0x465662, 0x323232, 0x2E2E2E, 0x323232, 0x6A6A6A, 0x626662, 0x303236, 0x1E1E1E, 0x222222, 0x525E6A, 0x484E54, 0x26262A, 0x1E1E1E, 0x1E221E, 0x2E261A, 0x5D3E02, 0x784E02, 0x7C5202, 0x7E560A, 0x8E621E, 0x9A6E32, 0x9E7232, 0xA2722A, 0x9A6A16, 0x966202, 0x865A0A, 0x52462E, 0x423E3A, 0x3E3E3E, 0x3E3E3E, 0x3E3E3E, 0x495E6E, 0x4A5A66, 0x3E464A, 0x2E2E2E, 0x2E2E2E, 0x626262, 0x5E5E5E, 0x323232, 0x1E1E1E, 0x222222, 0x2A2A2E, 0x2A2A2E, 0x3D464E, 0x26262A, 0x292A2A, 0x292A2A, 0x48320C, 0x664202, 0x7C5202, 0x885A02, 0x885A02, 0x885A02, 0x7E560A, 0x6C4E16, 0x5E4A22, 0x4E4636, 0x3E423E, 0x424242, 0x414246, 0x464646, 0x424242, 0x424242, 0x424242, 0x424A52, 0x36424A, 0x4A4A4E, 0x363636, 0x5A5A5A, 0x5E5E5E, 0x3E3E3E, 0x1E1E1E, 0x222622, 0x2E2E32, 0x506A82, 0x4A5A66, 0x2A3236, 0x2E2E2E, 0x2E3232, 0x2E3232, 0x363626, 0x4A3E26, 0x524226, 0x4E422E, 0x423E3A, 0x3A3E3E, 0x3C3E42, 0x3E3E3E, 0x414246, 0x464646, 0x4A4A4A, 0x525252, 0x727272, 0x929692, 0x9A9A9A, 0x3C3E42, 0x4A5A66, 0x506A82, 0x4A5A66, 0x424242, 0x5E5E5E, 0x5E5E5E, 0x3E3E3E, 0x1E221E, 0x262626, 0x292A2A, 0x2E3232, 0x323232, 0x36424A, 0x363A36, 0x3A3A3A, 0x3A3A3A, 0x3A3E3E, 0x3A3E3E, 0x3E423E, 0x3E423E, 0x424242, 0x464646, 0x4A4A4A, 0x5E5E5E, 0x7E7E7E, 0x929292, 0x9A9A9A, 0x929292, 0x727272, 0x525252, 0x353A3E, 0x323632, 0x424242, 0x5A5E5A, 0x828282, 0x858685, 0x5A5A5A, 0x5E5E5E, 0x44464A, 0x1E1E1E, 0x222222, 0x2E322E, 0x414246, 0x52728A, 0x4E667A, 0x414246, 0x424242, 0x424242, 0x424242, 0x414246, 0x4A5252, 0x666A66, 0x828282, 0x8E928E, 0x929292, 0x7A7A7A, 0x5E5E5E, 0x4A4A4A, 0x424242, 0x424242, 0x3E3E3E, 0x3A3A3A, 0x262626, 0x292A2A, 0x3E3E3E, 0x7A7A7A, 0x6E6E6E, 0x4E4E4E, 0x5A5A5A, 0x625A62, 0x4A4A4A, 0x1E1E1E, 0x1E221E, 0x2A2A2E, 0x3A3A3A, 0x484E54, 0x414246, 0x464646, 0x44464A, 0x6E6E6E, 0x7E7E7E, 0x858685, 0x7E7E7E, 0x666666, 0x4E4E4E, 0x414246, 0x3E3E3E, 0x3E423E, 0x3E3E3E, 0x3A3A3A, 0x3A3A3A, 0x363636, 0x32363A, 0x2E322E, 0x1E1E1E, 0x222222, 0x303236, 0x3A3A3A, 0x3E3E3E, 0x3A3A3A, 0x5A5E5A, 0x5A5E5A, 0x525252, 0x1E1E1E, 0x1E221E, 0x262626, 0x3A3A3A, 0x48525A, 0x4E667A, 0x586A7A, 0x4A4A4E, 0x525252, 0x464646, 0x424242, 0x424242, 0x3E3E3E, 0x423E3A, 0x3A3A3A, 0x32363A, 0x363636, 0x363636, 0x363636, 0x32363A, 0x363636, 0x323232, 0x26262A, 0x1E1E1E, 0x1E1E1E, 0x292A2A, 0x303236, 0x3A3A3A, 0x363636, 0x5A5A5A, 0x625A62, 0x525252, 0x1E1E1E, 0x1E1E1E, 0x222222, 0x323632, 0x424242, 0x546A7E, 0x4A5658, 0x484E54, 0x4A4A4E, 0x3E3E3E, 0x32363A, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x32363A, 0x363A36, 0x363636, 0x363A36, 0x363636, 0x323232, 0x222222, 0x1E221E, 0x1E1E1E, 0x262626, 0x323632, 0x363636, 0x3A3A3A, 0x5A5A5A, 0x5E5E5E, 0x5A5A5A, 0x1E1E1E, 0x1E1E1E, 0x1E1E1E, 0x2E2E2E, 0x424242, 0x5E5E5E, 0x767A76, 0x8A8A8A, 0x5A5E5A, 0x3E423E, 0x32363A, 0x3A3A3A, 0x363636, 0x3A3A3A, 0x363636, 0x363A36, 0x32363A, 0x3A3A3A, 0x363636, 0x363A36, 0x323232, 0x2E2E2E, 0x222222, 0x1E221E, 0x222222, 0x292A2A, 0x363636, 0x363636, 0x3A3A3A, 0x5A5A5A, 0x5E5E5E, 0x5E5E5E, 0x222226, 0x1E1E1E, 0x1E1E1E, 0x262626, 0x3A3A3A, 0x4A4A4A, 0x464646, 0x424242, 0x414246, 0x353A3E, 0x363636, 0x363636, 0x32363A, 0x363636, 0x363A36, 0x363636, 0x363636, 0x363636, 0x363636, 0x363636, 0x303236, 0x2A2E2A, 0x222222, 0x1E1E1E, 0x1E1E1E, 0x2A2A2E, 0x363636, 0x363636, 0x363636 }; static Uint8 cciconmask[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; #endif tworld-2.3.0/oshw-sdl/oshwbind.c000066400000000000000000000056361475511570500165740ustar00rootroot00000000000000/* oshwbind.c: Binds the generic module to the SDL OS/hardware layer. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include "SDL.h" #include "../generic/generic.h" #include "../gen.h" #include "../err.h" genericglobals geng; /* Create a fresh surface. If transparency is true, the surface is * created with 32-bit pixels, so as to ensure a complete alpha * channel. Otherwise, the surface is created with the same format as * the screen. */ TW_Surface *TW_NewSurface(int w, int h, int transparency) { SDL_Surface *s; if (transparency) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN s = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA | SDL_RLEACCEL, w, h, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); #else s = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA | SDL_RLEACCEL, w, h, 32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000); #endif } else { s = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, geng.screen->format->BitsPerPixel, geng.screen->format->Rmask, geng.screen->format->Gmask, geng.screen->format->Bmask, geng.screen->format->Amask); } if (!s) die("couldn't create surface: %s", SDL_GetError()); if (!transparency && geng.screen->format->palette) SDL_SetColors(s, geng.screen->format->palette->colors, 0, geng.screen->format->palette->ncolors); return s; } /* Return the color of the pixel at (x, y) on the given surface. (The * surface must be locked before calling this function.) */ uint32_t TW_PixelAt(TW_Surface *_s, int x, int y) { SDL_Surface *s; s = (SDL_Surface*)_s; switch (s->format->BytesPerPixel) { case 1: return (Uint32)((Uint8*)s->pixels + y * s->pitch)[x]; case 2: return (Uint32)((Uint16*)((Uint8*)s->pixels + y * s->pitch))[x]; case 3: #if SDL_BYTEORDER == SDL_BIG_ENDIAN return (Uint32)((((Uint8*)s->pixels + y * s->pitch)[x * 3 + 0] << 16) | (((Uint8*)s->pixels + y * s->pitch)[x * 3 + 1] << 8) | (((Uint8*)s->pixels + y * s->pitch)[x * 3 + 2] << 0)); #else return (Uint32)((((Uint8*)s->pixels + y * s->pitch)[x * 3 + 0] << 0) | (((Uint8*)s->pixels + y * s->pitch)[x * 3 + 1] << 8) | (((Uint8*)s->pixels + y * s->pitch)[x * 3 + 2] << 16)); #endif case 4: return ((Uint32*)((Uint8*)s->pixels + y * s->pitch))[x]; } return 0; } /* Load the given bitmap file. If setscreenpalette is true, the screen palette * will be synchronized to the bitmap's palette. */ TW_Surface *TW_LoadBMP(char const *filename, int setscreenpalette) { SDL_Surface *tiles = NULL; tiles = SDL_LoadBMP(filename); if (tiles && setscreenpalette) { if (tiles->format->palette && geng.screen->format->palette) SDL_SetColors(geng.screen, tiles->format->palette->colors, 0, tiles->format->palette->ncolors); } return tiles; } tworld-2.3.0/oshw-sdl/oshwbind.h000066400000000000000000000054771475511570500166040ustar00rootroot00000000000000/* oshwbind.h: Binds the generic module to the SDL OS/hardware layer. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef HEADER_sdl_oshwbind_h_ #define HEADER_sdl_oshwbind_h_ #include "SDL.h" #include /* Constants */ enum { TW_ALPHA_TRANSPARENT = SDL_ALPHA_TRANSPARENT, TW_ALPHA_OPAQUE = SDL_ALPHA_OPAQUE }; enum { TWK_BACKSPACE = SDLK_BACKSPACE, TWK_TAB = SDLK_TAB, TWK_RETURN = SDLK_RETURN, TWK_KP_ENTER = SDLK_KP_ENTER, TWK_ESCAPE = SDLK_ESCAPE, TWK_UP = SDLK_UP, TWK_LEFT = SDLK_LEFT, TWK_DOWN = SDLK_DOWN, TWK_RIGHT = SDLK_RIGHT, TWK_KP8 = SDLK_KP8, TWK_KP4 = SDLK_KP4, TWK_KP2 = SDLK_KP2, TWK_KP6 = SDLK_KP6, TWK_INSERT = SDLK_INSERT, TWK_DELETE = SDLK_DELETE, TWK_HOME = SDLK_HOME, TWK_END = SDLK_END, TWK_PAGEUP = SDLK_PAGEUP, TWK_PAGEDOWN = SDLK_PAGEDOWN, TWK_F1 = SDLK_F1, TWK_F2 = SDLK_F2, TWK_F3 = SDLK_F3, TWK_F4 = SDLK_F4, TWK_F5 = SDLK_F5, TWK_F6 = SDLK_F6, TWK_F7 = SDLK_F7, TWK_F8 = SDLK_F8, TWK_F9 = SDLK_F9, TWK_F10 = SDLK_F10, TWK_LSHIFT = SDLK_LSHIFT, TWK_RSHIFT = SDLK_RSHIFT, TWK_LCTRL = SDLK_LCTRL, TWK_RCTRL = SDLK_RCTRL, TWK_LALT = SDLK_LALT, TWK_RALT = SDLK_RALT, TWK_LMETA = SDLK_LMETA, TWK_RMETA = SDLK_RMETA, TWK_CAPSLOCK = SDLK_CAPSLOCK, TWK_NUMLOCK = SDLK_NUMLOCK, TWK_SCROLLLOCK = SDLK_SCROLLOCK, TWK_MODE = SDLK_MODE, TWK_CTRL_C = '\003', TWK_LAST = SDLK_LAST }; enum { TW_BUTTON_LEFT = SDL_BUTTON_LEFT, TW_BUTTON_RIGHT = SDL_BUTTON_RIGHT, TW_BUTTON_MIDDLE = SDL_BUTTON_MIDDLE, TW_BUTTON_WHEELUP = SDL_BUTTON_WHEELUP, TW_BUTTON_WHEELDOWN = SDL_BUTTON_WHEELDOWN }; /* Types */ typedef SDL_Rect TW_Rect; typedef SDL_Surface TW_Surface; /* Functions */ extern TW_Surface *TW_NewSurface(int w, int h, int transparency); #define TW_FreeSurface SDL_FreeSurface #define TW_MUSTLOCK SDL_MUSTLOCK #define TW_LockSurface SDL_LockSurface #define TW_UnlockSurface SDL_UnlockSurface #define TW_FillRect SDL_FillRect #define TW_BlitSurface SDL_BlitSurface #define TW_SetColorKey(s, c) SDL_SetColorKey(s, SDL_SRCCOLORKEY, c) #define TW_ResetColorKey(s) SDL_SetColorKey(s, 0, 0) #define TW_EnableAlpha(s) SDL_SetAlpha(s, SDL_SRCALPHA | SDL_RLEACCEL, 0) #define TW_DisplayFormat SDL_DisplayFormat #define TW_DisplayFormatAlpha SDL_DisplayFormatAlpha #define TW_BytesPerPixel(s) ((s)->format->BytesPerPixel) extern uint32_t TW_PixelAt(TW_Surface *s, int x, int y); #define TW_MapRGB(s, r, g, b) SDL_MapRGB((s)->format, r, g, b) #define TW_MapRGBA(s, r, g, b, a) SDL_MapRGBA((s)->format, r, g, b, a) extern TW_Surface *TW_LoadBMP(char const *filename, int setscreenpalette); #define TW_GetKeyState SDL_GetKeyState #define TW_GetTicks SDL_GetTicks #define TW_Delay SDL_Delay #define TW_GetError SDL_GetError #endif tworld-2.3.0/oshw-sdl/sdlerr.c000066400000000000000000000034151475511570500162430ustar00rootroot00000000000000/* sdlerr.c: Notification functionality, not supplied by the SDL library. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include "sdlgen.h" #ifdef WIN32 /* * Windows version */ #include "windows.h" /* Ring the bell already. */ void ding(void) { MessageBeep(0); } /* Display a message box. If action is NOTIFY_LOG, the text of the * message is written to stderr instead. */ void usermessage(int action, char const *prefix, char const *cfile, unsigned long lineno, char const *fmt, va_list args) { static char errbuf[4096]; char *p; p = errbuf; if (prefix) p += sprintf(p, "%s: ", prefix); if (fmt) p += vsprintf(p, fmt, args); if (cfile) p += sprintf(p, " [%s:%lu]", cfile, lineno); switch (action) { case NOTIFY_DIE: MessageBox(NULL, errbuf, "Tile World", MB_ICONSTOP | MB_OK); break; case NOTIFY_ERR: MessageBox(NULL, errbuf, "Tile World", MB_ICONEXCLAMATION | MB_OK); break; case NOTIFY_LOG: fputs(errbuf, stderr); fputc('\n', stderr); fflush(stderr); break; } } #else /* * Unix version */ /* Ring the bell already. */ void ding(void) { fputc('\a', stderr); fflush(stderr); } /* Display a formatted message on stderr. */ void usermessage(int action, char const *prefix, char const *cfile, unsigned long lineno, char const *fmt, va_list args) { fprintf(stderr, "%s: ", action == NOTIFY_DIE ? "FATAL" : action == NOTIFY_ERR ? "error" : "warning"); if (cfile) fprintf(stderr, "[%s:%lu] ", cfile, lineno); if (prefix) fprintf(stderr, "%s: ", prefix); if (fmt) vfprintf(stderr, fmt, args); fputc('\n', stderr); fflush(stderr); } #endif tworld-2.3.0/oshw-sdl/sdlgen.h000066400000000000000000000107311475511570500162300ustar00rootroot00000000000000/* sdlgen.h: The internal shared definitions of the SDL OS/hardware layer. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef HEADER_sdlgen_h_ #define HEADER_sdlgen_h_ #include "SDL.h" #include "../gen.h" #include "../oshw.h" #include "../generic/generic.h" /* Structure to hold the definition of a font. */ typedef struct fontinfo { signed char h; /* height of each character */ signed char w[256]; /* width of each character */ void *memory; /* memory allocated for the font */ unsigned char *bits[256]; /* pointers to each glyph */ } fontinfo; /* Structure to hold a font's colors. */ typedef struct fontcolors { Uint32 c[3]; } fontcolors; #define bkgndcolor(fc) ((fc).c[0]) /* the background color */ #define halfcolor(fc) ((fc).c[1]) /* the antialiasing color */ #define textcolor(fc) ((fc).c[2]) /* the main color of the glyphs */ /* Flags to the puttext function. */ #define PT_CENTER 0x0001 /* center the text horizontally */ #define PT_RIGHT 0x0002 /* right-align the text */ #define PT_MULTILINE 0x0004 /* span lines & break at whitespace */ #define PT_UPDATERECT 0x0008 /* return the unused area in rect */ #define PT_CALCSIZE 0x0010 /* determine area needed for text */ #define PT_DIM 0x0020 /* draw using the dim text color */ #define PT_HILIGHT 0x0040 /* draw using the bold text color */ /* * Values global to this module. All the globals are placed in here, * in order to minimize pollution of the main module's namespace. */ typedef struct oshwglobals { /* * Shared variables. */ fontcolors textclr; /* color triplet for normal text */ fontcolors dimtextclr; /* color triplet for dim text */ fontcolors hilightclr; /* color triplet for bold text */ fontinfo font; /* the font */ /* * Shared functions. */ /* Display a line (or more) of text in the program's font. The * text is clipped to area if necessary. If area is taller than * the font, the topmost line is used. len specifies the number of * characters to render; -1 can be used if text is NUL-terminated. * flags is some combination of PT_* flags defined above. When the * PT_CALCSIZE flag is set, no drawing is done; instead the w and * h fields of area area changed to define the smallest rectangle * that encloses the text that would have been rendered. (If * PT_MULTILINE is also set, only the h field is changed.) If * PT_UPDATERECT is set instead, then the h field is changed, so * as to exclude the rectangle that was drawn in. */ void (*puttextfunc)(SDL_Rect *area, char const *text, int len, int flags); /* Determine the widths necessary to display the columns of the * given table. area specifies an enclosing rectangle for the * complete table. The return value is an array of rectangles, one * for each column of the table. The rectangles y-coordinates and * heights are taken from area, and the x-coordinates and widths * are calculated so as to best render the columns of the table in * the given space. The caller has the responsibility of freeing * the returned array. */ SDL_Rect *(*measuretablefunc)(SDL_Rect const *area, tablespec const *table); /* Draw a single row of the given table. cols is an array of * rectangles, one for each column. Each rectangle is altered by * the function as per puttext's PT_UPDATERECT behavior. row * points to an integer indicating the first table entry of the * row to display; upon return, this value is updated to point to * the first entry following the row. flags can be set to PT_DIM * and/or PT_HIGHLIGHT; the values will be applied to every entry * in the row. */ int (*drawtablerowfunc)(tablespec const *table, SDL_Rect *cols, int *row, int flags); } oshwglobals; /* oshw's structure of globals. */ extern oshwglobals sdlg; /* Some convenience macros for the above functions. */ #define puttext (*sdlg.puttextfunc) #define measuretable (*sdlg.measuretablefunc) #define drawtablerow (*sdlg.drawtablerowfunc) #define createscroll (*sdlg.createscrollfunc) #define scrollmove (*sdlg.scrollmovefunc) /* The initialization functions for the various modules. */ extern int _sdlresourceinitialize(void); extern int _sdltextinitialize(void); extern int _sdlinputinitialize(void); extern int _sdloutputinitialize(int fullscreen); #endif tworld-2.3.0/oshw-sdl/sdlin.c000066400000000000000000000011121475511570500160510ustar00rootroot00000000000000/* sdlin.c: Reading the keyboard. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include "SDL.h" #include "sdlgen.h" #include "../defs.h" /* Turn key-repeating on and off. */ int setkeyboardrepeat(int enable) { if (enable) return SDL_EnableKeyRepeat(500, 75) == 0; else return SDL_EnableKeyRepeat(0, 0) == 0; } /* Initialization. */ int _sdlinputinitialize(void) { if (!_genericinputinitialize()) return FALSE; SDL_EnableUNICODE(TRUE); return TRUE; } tworld-2.3.0/oshw-sdl/sdloshw.c000066400000000000000000000070241475511570500164330ustar00rootroot00000000000000/* sdloshw.c: Top-level SDL management functions. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include #include #include #include "SDL.h" #include "sdlgen.h" #include "sdlsfx.h" #include "../err.h" /* Values global to this library. */ oshwglobals sdlg; /* This is an automatically-generated file, which contains a * representation of the program's icon. */ #include "ccicon.c" /* Dispatch all events sitting in the SDL event queue. */ static void _eventupdate(int wait) { static int mouselastx = -1, mouselasty = -1; SDL_Event event; if (wait) SDL_WaitEvent(NULL); SDL_PumpEvents(); while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_ALLEVENTS)) { switch (event.type) { case SDL_KEYDOWN: if (windowmappos(mouselastx, mouselasty) < 0) SDL_ShowCursor(SDL_DISABLE); keyeventcallback(event.key.keysym.sym, TRUE); if (event.key.keysym.unicode && event.key.keysym.unicode != event.key.keysym.sym) { keyeventcallback(event.key.keysym.unicode, TRUE); keyeventcallback(event.key.keysym.unicode, FALSE); } break; case SDL_KEYUP: if (windowmappos(mouselastx, mouselasty) < 0) SDL_ShowCursor(SDL_DISABLE); keyeventcallback(event.key.keysym.sym, FALSE); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: SDL_ShowCursor(SDL_ENABLE); mouselastx = event.motion.x; mouselasty = event.motion.y; mouseeventcallback(event.button.x, event.button.y, event.button.button, event.type == SDL_MOUSEBUTTONDOWN); break; case SDL_MOUSEMOTION: SDL_ShowCursor(SDL_ENABLE); mouselastx = event.motion.x; mouselasty = event.motion.y; break; case SDL_QUIT: exit(EXIT_SUCCESS); } } } /* Alter the window decoration. */ void setsubtitle(char const *subtitle) { char buf[270]; if (subtitle && *subtitle) { sprintf(buf, "Tile World - %.255s", subtitle); SDL_WM_SetCaption(buf, "Tile World"); } else { SDL_WM_SetCaption("Tile World", "Tile World"); } } /* Read any additional data for the series. */ void readextensions(struct gameseries *series) { /* Not implemented. */ } /* Get number of seconds to skip at start of playback. */ int getreplaysecondstoskip(void) { /* Not implemented. */ return -1; } void copytoclipboard(char const *text) { /* Not implemented. */ } /* Shut down SDL. */ static void shutdown(void) { SDL_Quit(); } /* Initialize SDL, create the program's icon, and then initialize * the other modules of the library. */ int oshwinitialize(int silence, int soundbufsize, int showhistogram, int fullscreen) { SDL_Surface *icon; geng.eventupdatefunc = _eventupdate; if (SDL_Init(SDL_INIT_VIDEO) < 0) { errmsg(NULL, "Cannot initialize SDL system: %s\n", SDL_GetError()); return FALSE; } atexit(shutdown); setsubtitle(NULL); icon = SDL_CreateRGBSurfaceFrom(cciconimage, CXCCICON, CYCCICON, 32, 4 * CXCCICON, 0x0000FF, 0x00FF00, 0xFF0000, 0); if (icon) { SDL_WM_SetIcon(icon, cciconmask); SDL_FreeSurface(icon); } else warn("couldn't create icon surface: %s", SDL_GetError()); return _generictimerinitialize(showhistogram) && _sdltextinitialize() && _generictileinitialize() && _sdlinputinitialize() && _sdloutputinitialize(fullscreen) && _sdlsfxinitialize(silence, soundbufsize); } /* The real main(). */ int main(int argc, char *argv[]) { return tworld(argc, argv); } tworld-2.3.0/oshw-sdl/sdlout.c000066400000000000000000000571011475511570500162630ustar00rootroot00000000000000/* sdlout.c: Creating the program's displays. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include #include #include #include #include "SDL.h" #include "sdlgen.h" #include "../err.h" #include "../state.h" /* Space to leave between graphic objects. */ #define MARGINW 8 #define MARGINH 8 /* Size of the prompt icons. */ #define PROMPTICONW 16 #define PROMPTICONH 10 /* Erase a rectangle (useful for when a surface is locked). */ #define fillrect(r) (puttext((r), NULL, 0, PT_MULTILINE)) /* Structure for holding information about the message display. */ typedef struct msgdisplayinfo { char msg[64]; /* text of the message */ unsigned int msglen; /* length of the message */ unsigned long until; /* when to erase the message */ unsigned long bolduntil; /* when to dim the message */ } msgdisplayinfo; /* The message display. */ static msgdisplayinfo msgdisplay; /* Some prompting icons. */ static SDL_Surface *prompticons = NULL; /* TRUE means the program should attempt to run in fullscreen mode. */ static int fullscreen = FALSE; /* Coordinates specifying the placement of the various screen elements. */ static int screenw, screenh; static SDL_Rect rinfoloc; static SDL_Rect locrects[8]; #define displayloc (locrects[0]) #define titleloc (locrects[1]) #define infoloc (locrects[2]) #define invloc (locrects[3]) #define hintloc (locrects[4]) #define rscoreloc (locrects[5]) #define messageloc (locrects[6]) #define promptloc (locrects[7]) /* TRUE means that the screen is in need of a full update. */ static int fullredraw = TRUE; /* * Display initialization functions. */ /* Set up a fontcolors structure, calculating the middle color from * the other two. */ static fontcolors makefontcolors(int rbkgnd, int gbkgnd, int bbkgnd, int rtext, int gtext, int btext) { fontcolors colors; colors.c[0] = SDL_MapRGB(geng.screen->format, rbkgnd, gbkgnd, bbkgnd); colors.c[2] = SDL_MapRGB(geng.screen->format, rtext, gtext, btext); colors.c[1] = SDL_MapRGB(geng.screen->format, (rbkgnd + rtext) / 2, (gbkgnd + gtext) / 2, (bbkgnd + btext) / 2); return colors; } /* Create three simple icons, to be used when prompting the user. */ static int createprompticons(void) { static Uint8 iconpixels[] = { 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,2,2,1,0,0,0,0,0,0, 0,0,0,0,1,2,2,2,2,1,0,0,0,0,0,0, 0,0,1,2,2,2,2,2,2,1,0,0,0,0,0,0, 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 0,0,1,2,2,2,2,2,2,1,0,0,0,0,0,0, 0,0,0,0,1,2,2,2,2,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,2,2,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0, 0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0, 0,0,0,0,2,2,2,2,2,2,2,2,0,0,0,0, 0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0, 0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0, 0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0, 0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0, 0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0, 0,0,0,0,2,2,2,2,2,2,2,2,0,0,0,0, 0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,2,2,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,2,2,2,2,1,0,0,0,0, 0,0,0,0,0,0,1,2,2,2,2,2,2,1,0,0, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1, 0,0,0,0,0,0,1,2,2,2,2,2,2,1,0,0, 0,0,0,0,0,0,1,2,2,2,2,1,0,0,0,0, 0,0,0,0,0,0,1,2,2,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0 }; if (!prompticons) { prompticons = SDL_CreateRGBSurfaceFrom(iconpixels, PROMPTICONW, 3 * PROMPTICONH, 8, PROMPTICONW, 0, 0, 0, 0); if (!prompticons) { warn("couldn't create SDL surface: %s", SDL_GetError()); return FALSE; } } SDL_GetRGB(bkgndcolor(sdlg.dimtextclr), geng.screen->format, &prompticons->format->palette->colors[0].r, &prompticons->format->palette->colors[0].g, &prompticons->format->palette->colors[0].b); SDL_GetRGB(halfcolor(sdlg.dimtextclr), geng.screen->format, &prompticons->format->palette->colors[1].r, &prompticons->format->palette->colors[1].g, &prompticons->format->palette->colors[1].b); SDL_GetRGB(textcolor(sdlg.dimtextclr), geng.screen->format, &prompticons->format->palette->colors[2].r, &prompticons->format->palette->colors[2].g, &prompticons->format->palette->colors[2].b); return TRUE; } /* Calculate the placements of all the separate elements of the * display. */ static int layoutscreen(void) { static char const *scoretext = "888 DRAWN AND QUARTERED" " 88,888 8,888,888 8,888,888"; static char const *hinttext = "Total Score "; static char const *rscoretext = "88888888"; static char const *chipstext = "Chips"; static char const *timertext = " 88888"; int fullw, infow, rscorew, texth; if (geng.wtile <= 0 || geng.htile <= 0) return FALSE; puttext(&displayloc, scoretext, -1, PT_CALCSIZE); fullw = displayloc.w; texth = displayloc.h; puttext(&displayloc, hinttext, -1, PT_CALCSIZE); infow = displayloc.w; puttext(&displayloc, rscoretext, -1, PT_CALCSIZE); rscorew = displayloc.w; infow += rscorew; displayloc.x = MARGINW; displayloc.y = MARGINH; displayloc.w = NXTILES * geng.wtile; displayloc.h = NYTILES * geng.htile; geng.maploc = displayloc; titleloc.x = displayloc.x; titleloc.y = displayloc.y + displayloc.h + MARGINH; titleloc.w = displayloc.w; titleloc.h = texth; infoloc.x = displayloc.x + displayloc.w + MARGINW; infoloc.y = MARGINH; infoloc.w = 4 * geng.wtile; if (infoloc.w < infow) infoloc.w = infow; infoloc.h = 6 * texth; puttext(&rinfoloc, chipstext, -1, PT_CALCSIZE); rinfoloc.x = infoloc.x + rinfoloc.w + MARGINW; rinfoloc.y = infoloc.y + 3 * texth; puttext(&rinfoloc, timertext, -1, PT_CALCSIZE); rinfoloc.h = 2 * texth; invloc.x = infoloc.x; invloc.y = infoloc.y + infoloc.h + MARGINH; invloc.w = 4 * geng.wtile; invloc.h = 2 * geng.htile; screenw = infoloc.x + infoloc.w + MARGINW; if (screenw < fullw) screenw = fullw; screenh = titleloc.y + titleloc.h + MARGINH; promptloc.x = screenw - MARGINW - PROMPTICONW; promptloc.y = screenh - MARGINH - PROMPTICONH; promptloc.w = PROMPTICONW; promptloc.h = PROMPTICONH; messageloc.x = infoloc.x; messageloc.y = titleloc.y; messageloc.w = promptloc.x - messageloc.x - MARGINW; messageloc.h = titleloc.h; hintloc.x = infoloc.x; hintloc.y = invloc.y + invloc.h + MARGINH; hintloc.w = screenw - MARGINW - hintloc.x; hintloc.h = messageloc.y - hintloc.y; if (hintloc.y + hintloc.h + MARGINH > promptloc.y) hintloc.h = promptloc.y - MARGINH - hintloc.y; rscoreloc.x = hintloc.x + hintloc.w - rscorew; rscoreloc.y = hintloc.y + 2 * texth; rscoreloc.w = rscorew; rscoreloc.h = hintloc.h - 2 * texth; return TRUE; } /* Create or change the program's display surface. */ static int createdisplay(void) { int flags; if (geng.screen) { SDL_FreeSurface(geng.screen); geng.screen = NULL; } flags = SDL_SWSURFACE | SDL_ANYFORMAT; if (fullscreen) flags |= SDL_FULLSCREEN; if (!(geng.screen = SDL_SetVideoMode(screenw, screenh, 32, flags))) { errmsg(NULL, "cannot open %dx%d display: %s\n", screenw, screenh, SDL_GetError()); return FALSE; } if (geng.screen->w != screenw || geng.screen->h != screenh) warn("requested a %dx%d display, got %dx%d instead", geng.screen->w, geng.screen->h); return TRUE; } /* Wipe the display. */ void cleardisplay(void) { SDL_FillRect(geng.screen, NULL, bkgndcolor(sdlg.textclr)); fullredraw = TRUE; geng.mapvieworigin = -1; } /* * Message display function. */ /* Refresh the message-display message. If update is TRUE, the screen * is updated immediately. */ static void displaymsg(int update) { int f; if (msgdisplay.until < SDL_GetTicks()) { *msgdisplay.msg = '\0'; msgdisplay.msglen = 0; f = 0; } else { if (!msgdisplay.msglen) return; f = PT_CENTER; if (msgdisplay.bolduntil < SDL_GetTicks()) f |= PT_DIM; } puttext(&messageloc, msgdisplay.msg, msgdisplay.msglen, f); if (update) SDL_UpdateRect(geng.screen, messageloc.x, messageloc.y, messageloc.w, messageloc.h); } /* Change the current message-display message. msecs gives the number * of milliseconds to display the message, and bold specifies the * number of milliseconds to display the message highlighted. */ int setdisplaymsg(char const *msg, int msecs, int bold) { if (!msg || !*msg) { *msgdisplay.msg = '\0'; msgdisplay.msglen = 0; msgdisplay.until = 0; msgdisplay.bolduntil = 0; } else { msgdisplay.msglen = strlen(msg); if (msgdisplay.msglen >= sizeof msgdisplay.msg) msgdisplay.msglen = sizeof msgdisplay.msg - 1; memcpy(msgdisplay.msg, msg, msgdisplay.msglen); msgdisplay.msg[msgdisplay.msglen] = '\0'; msgdisplay.until = SDL_GetTicks() + msecs; msgdisplay.bolduntil = SDL_GetTicks() + bold; } displaymsg(TRUE); return TRUE; } /* * The main display functions. */ /* Create a string representing a decimal number. */ static char const *decimal(long number, int places) { static char buf[32]; char *dest = buf + sizeof buf; unsigned long n; n = number >= 0 ? (unsigned long)number : (unsigned long)-(number + 1) + 1; *--dest = '\0'; do { *--dest = CHAR_MZERO + n % 10; n /= 10; } while (n); while (buf + sizeof buf - dest < places + 1) *--dest = CHAR_MZERO; if (number < 0) *--dest = '-'; return dest; } /* Display an empty map view. */ static void displayshutter(void) { SDL_Rect rect; rect = displayloc; SDL_FillRect(geng.screen, &rect, halfcolor(sdlg.dimtextclr)); ++rect.x; ++rect.y; rect.w -= 2; rect.h -= 2; SDL_FillRect(geng.screen, &rect, textcolor(sdlg.dimtextclr)); ++rect.x; ++rect.y; rect.w -= 2; rect.h -= 2; SDL_FillRect(geng.screen, &rect, halfcolor(sdlg.dimtextclr)); ++rect.x; ++rect.y; rect.w -= 2; rect.h -= 2; SDL_FillRect(geng.screen, &rect, bkgndcolor(sdlg.dimtextclr)); } /* Render all the various nuggets of data that comprise the * information display. timeleft and besttime supply the current timer * value and the player's best recorded time as measured in seconds. * The level's title, number, password, and hint, the count of chips * needed, and the keys and boots in possession are all used as well * in creating the display. */ static void displayinfo(gamestate const *state, int timeleft, int besttime) { SDL_Rect rect, rrect; char buf[512]; int n; puttext(&titleloc, state->game->name, -1, PT_CENTER); rect = infoloc; if (state->game->number) { sprintf(buf, "Level %d", state->game->number); puttext(&rect, buf, -1, PT_UPDATERECT); } else puttext(&rect, "", 0, PT_UPDATERECT); if (state->game->passwd && *state->game->passwd) { sprintf(buf, "Password: %s", state->game->passwd); puttext(&rect, buf, -1, PT_UPDATERECT); } else puttext(&rect, "", 0, PT_UPDATERECT); puttext(&rect, "", 0, PT_UPDATERECT); rrect.x = rinfoloc.x; rrect.w = rinfoloc.w; rrect.y = rect.y; rrect.h = rect.h; puttext(&rect, "Chips", 5, PT_UPDATERECT); puttext(&rect, "Time", 4, PT_UPDATERECT); puttext(&rrect, decimal(state->chipsneeded, 0), -1, PT_RIGHT | PT_UPDATERECT); if (timeleft == TIME_NIL) puttext(&rrect, "---", -1, PT_RIGHT); else puttext(&rrect, decimal(timeleft, 0), -1, PT_RIGHT); if (state->stepping) { rrect.x += rrect.w; rrect.w = infoloc.x + infoloc.w - rrect.x; if (state->stepping < 4) sprintf(buf, " (+%d)", state->stepping); else if (state->stepping > 4) sprintf(buf, " (odd+%d)", state->stepping & 3); else sprintf(buf, " (odd)"); puttext(&rrect, buf, -1, 0); } if (besttime != TIME_NIL) { if (timeleft == TIME_NIL) sprintf(buf, "(Best time: %s)", decimal(besttime, 0)); else sprintf(buf, "Best time: %s", decimal(besttime, 0)); n = (state->game->sgflags & SGF_REPLACEABLE) ? PT_DIM : 0; puttext(&rect, buf, -1, PT_UPDATERECT | n); } fillrect(&rect); for (n = 0 ; n < 4 ; ++n) { drawfulltileid(geng.screen, invloc.x + n * geng.wtile, invloc.y, (state->keys[n] ? Key_Red + n : Empty)); drawfulltileid(geng.screen, invloc.x + n * geng.wtile, invloc.y + geng.htile, (state->boots[n] ? Boots_Ice + n : Empty)); } if (state->statusflags & SF_INVALID) { puttext(&hintloc, "This level cannot be played.", -1, PT_MULTILINE); } else if (state->currenttime < 0 && state->game->unsolvable) { if (*state->game->unsolvable) { sprintf(buf, "This level is reported to be unsolvable: %s.", state->game->unsolvable); puttext(&hintloc, buf, -1, PT_MULTILINE); } else { puttext(&hintloc, "This level is reported to be unsolvable.", -1, PT_MULTILINE); } } else if (state->statusflags & SF_SHOWHINT) { puttext(&hintloc, state->hinttext, -1, PT_MULTILINE | PT_CENTER); } else { fillrect(&hintloc); } fillrect(&promptloc); } /* Display a prompt icon in the lower right-hand corner. completed is * -1, 0, or +1, depending on which icon is being requested. */ static int displayprompticon(int completed) { SDL_Rect src; if (!prompticons) return FALSE; src.x = 0; src.y = (completed + 1) * PROMPTICONH; src.w = PROMPTICONW; src.h = PROMPTICONH; SDL_BlitSurface(prompticons, &src, geng.screen, &promptloc); SDL_UpdateRect(geng.screen, promptloc.x, promptloc.y, promptloc.w, promptloc.h); return TRUE; } /* * The exported functions. */ /* Set the four main colors used to render text on the display. */ void setcolors(long bkgnd, long text, long bold, long dim) { int bkgndr, bkgndg, bkgndb; if (bkgnd < 0) bkgnd = 0x000000; if (text < 0) text = 0xFFFFFF; if (bold < 0) bold = 0xFFFF00; if (dim < 0) dim = 0xC0C0C0; if (bkgnd == text || bkgnd == bold || bkgnd == dim) { errmsg(NULL, "one or more text colors matches the background color; " "color scheme left unchanged."); return; } bkgndr = (bkgnd >> 16) & 255; bkgndg = (bkgnd >> 8) & 255; bkgndb = bkgnd & 255; sdlg.textclr = makefontcolors(bkgndr, bkgndg, bkgndb, (text >> 16) & 255, (text >> 8) & 255, text & 255); sdlg.dimtextclr = makefontcolors(bkgndr, bkgndg, bkgndb, (dim >> 16) & 255, (dim >> 8) & 255, dim & 255); sdlg.hilightclr = makefontcolors(bkgndr, bkgndg, bkgndb, (bold >> 16) & 255, (bold >> 8) & 255, bold & 255); createprompticons(); } /* Create the game's display. state is a pointer to the gamestate * structure. */ int displaygame(gamestate const *state, int timeleft, int besttime, int showinitstate) { if (state->statusflags & SF_SHUTTERED) { displayshutter(); } else { displaymapview(state, displayloc); } displayinfo(state, timeleft, besttime); displaymsg(FALSE); if (fullredraw) { SDL_UpdateRect(geng.screen, 0, 0, 0, 0); fullredraw = FALSE; } else { SDL_UpdateRects(geng.screen, sizeof locrects / sizeof *locrects, locrects); } return TRUE; } /* Update the display to acknowledge the end of game play. completed * is positive if the play was successful or negative if unsuccessful. * If the latter, then the other arguments can contain point values * that will be reported to the user. */ int displayendmessage(int basescore, int timescore, long totalscore, int completed) { SDL_Rect rect; int fullscore; if (totalscore) { fullscore = timescore + basescore; rect = hintloc; puttext(&rect, "Level Completed", -1, PT_CENTER); rect.y = rscoreloc.y; rect.h = rscoreloc.h; puttext(&rect, "Time Bonus", -1, PT_UPDATERECT); puttext(&rect, "Level Bonus", -1, PT_UPDATERECT); puttext(&rect, "Level Score", -1, PT_UPDATERECT); puttext(&rect, "Total Score", -1, PT_UPDATERECT); rect = rscoreloc; puttext(&rect, decimal(timescore, 4), -1, PT_RIGHT | PT_UPDATERECT); puttext(&rect, decimal(basescore, 5), -1, PT_RIGHT | PT_UPDATERECT); puttext(&rect, decimal(fullscore, 5), -1, PT_RIGHT | PT_UPDATERECT); puttext(&rect, decimal(totalscore, 7), -1, PT_RIGHT | PT_UPDATERECT); SDL_UpdateRect(geng.screen, hintloc.x, hintloc.y, hintloc.w, hintloc.h); } displayprompticon(completed); return CmdNone; } /* Render a table on the display. title is a short string to let the * user know what they're looking at. completed determines the prompt * icon that will be displayed in the lower right-hand corner. */ int displaytable(char const *title, tablespec const *table, int completed) { SDL_Rect area; SDL_Rect *cols; int i, n; cleardisplay(); area.x = MARGINW; area.y = screenh - MARGINH - sdlg.font.h; area.w = screenw - 2 * MARGINW; area.h = sdlg.font.h; puttext(&area, title, -1, 0); area.h = area.y - MARGINH; area.y = MARGINH; cols = measuretable(&area, table); for (i = table->rows, n = 0 ; i ; --i) drawtablerow(table, cols, &n, 0); free(cols); displayprompticon(completed); SDL_UpdateRect(geng.screen, 0, 0, 0, 0); return TRUE; } /* Render a table with embedded illustrations on the display. title is * a short string to display under the table. rows is an array of * count lines of text, each accompanied by one or two illustrations. * completed determines the prompt icon that will be displayed in the * lower right-hand corner. */ int displaytiletable(char const *title, tiletablerow const *rows, int count, int completed) { SDL_Rect left, right; int col, id, i; cleardisplay(); left.x = MARGINW; left.y = screenh - MARGINH - sdlg.font.h; left.w = screenw - 2 * MARGINW; left.h = sdlg.font.h; puttext(&left, title, -1, 0); left.h = left.y - MARGINH; left.y = MARGINH; right = left; col = geng.wtile * 2 + MARGINW; right.x += col; right.w -= col; for (i = 0 ; i < count ; ++i) { if (rows[i].isfloor) id = rows[i].item1; else id = crtile(rows[i].item1, EAST); drawfulltileid(geng.screen, left.x + geng.wtile, left.y, id); if (rows[i].item2) { if (rows[i].isfloor) id = rows[i].item2; else id = crtile(rows[i].item2, EAST); drawfulltileid(geng.screen, left.x, left.y, id); } left.y += geng.htile; left.h -= geng.htile; puttext(&right, rows[i].desc, -1, PT_MULTILINE | PT_UPDATERECT); if (left.y < right.y) { left.y = right.y; left.h = right.h; } else { right.y = left.y; right.h = left.h; } } displayprompticon(completed); SDL_UpdateRect(geng.screen, 0, 0, 0, 0); return TRUE; } /* Render a table as a scrollable list on the display. One row is * highlighted as the current selection, initially set by the integer * pointed to by idx. The callback function inputcallback is called * repeatedly to determine how to move the selection and when to * leave. The row selected when the function returns is returned to * the caller through idx. */ int displaylist(char const *title, tablespec const *table, int *idx, DisplayListType listtype, int (*inputcallback)(int*)) { SDL_Rect area; SDL_Rect *cols; SDL_Rect *colstmp; int linecount, itemcount, topitem, index; int j, n; cleardisplay(); area.x = MARGINW; area.y = screenh - MARGINH - sdlg.font.h; area.w = screenw - 2 * MARGINW; area.h = sdlg.font.h; puttext(&area, title, -1, 0); area.h = area.y - MARGINH; area.y = MARGINH; cols = measuretable(&area, table); if (!(colstmp = malloc(table->cols * sizeof *colstmp))) memerrexit(); itemcount = table->rows - 1; topitem = 0; linecount = area.h / sdlg.font.h - 1; index = *idx; n = SCROLL_NOP; do { switch (n) { case SCROLL_NOP: break; case SCROLL_UP: --index; break; case SCROLL_DN: ++index; break; case SCROLL_HALFPAGE_UP: index -= (linecount + 1) / 2; break; case SCROLL_HALFPAGE_DN: index += (linecount + 1) / 2; break; case SCROLL_PAGE_UP: index -= linecount; break; case SCROLL_PAGE_DN: index += linecount; break; case SCROLL_ALLTHEWAY_UP: index = 0; break; case SCROLL_ALLTHEWAY_DN: index = itemcount - 1; break; default: index = n; break; } if (index < 0) index = 0; else if (index >= itemcount) index = itemcount - 1; if (linecount < itemcount) { n = linecount / 2; if (index < n) topitem = 0; else if (index >= itemcount - n) topitem = itemcount - linecount; else topitem = index - n; } n = 0; SDL_FillRect(geng.screen, &area, bkgndcolor(sdlg.textclr)); memcpy(colstmp, cols, table->cols * sizeof *colstmp); drawtablerow(table, colstmp, &n, 0); for (j = 0 ; j < topitem ; ++j) drawtablerow(table, NULL, &n, 0); for ( ; j < topitem + linecount && j < itemcount ; ++j) drawtablerow(table, colstmp, &n, j == index ? PT_HILIGHT : 0); SDL_UpdateRect(geng.screen, 0, 0, 0, 0); n = SCROLL_NOP; } while ((*inputcallback)(&n)); if (n) *idx = index; free(cols); free(colstmp); cleardisplay(); return n; } /* Display a line of text, given by prompt, at the center of the display. * The callback function inputcallback is then called repeatedly to * obtain input characters, which are collected in input. maxlen sets an * upper limit to the length of the input so collected. */ int displayinputprompt(char const *prompt, char *input, int maxlen, InputPromptType inputtype, int (*inputcallback)(void)) { SDL_Rect area, promptrect, inputrect; int len, ch; puttext(&inputrect, "W", 1, PT_CALCSIZE); inputrect.w *= maxlen + 1; puttext(&promptrect, prompt, -1, PT_CALCSIZE); area.h = inputrect.h + promptrect.h + 2 * MARGINH; if (inputrect.w > promptrect.w) area.w = inputrect.w; else area.w = promptrect.w; area.w += 2 * MARGINW; area.x = (screenw - area.w) / 2; area.y = (screenh - area.h) / 2; promptrect.x = area.x + MARGINW; promptrect.y = area.y + MARGINH; promptrect.w = area.w - 2 * MARGINW; inputrect.x = promptrect.x; inputrect.y = promptrect.y + promptrect.h; inputrect.w = promptrect.w; len = strlen(input); if (len > maxlen) len = maxlen; for (;;) { SDL_FillRect(geng.screen, &area, textcolor(sdlg.textclr)); ++area.x; ++area.y; area.w -= 2; area.h -= 2; SDL_FillRect(geng.screen, &area, bkgndcolor(sdlg.textclr)); --area.x; --area.y; area.w += 2; area.h += 2; puttext(&promptrect, prompt, -1, PT_CENTER); input[len] = '_'; puttext(&inputrect, input, len + 1, PT_CENTER); input[len] = '\0'; SDL_UpdateRect(geng.screen, area.x, area.y, area.w, area.h); ch = (*inputcallback)(); if (ch == '\n' || ch < 0) break; if (isprint(ch)) { input[len] = ch; if (len < maxlen) ++len; input[len] = '\0'; } else if (ch == '\b') { if (len) --len; input[len] = '\0'; } else if (ch == '\f') { len = 0; input[0] = '\0'; } else { /* no op */ } } cleardisplay(); return ch == '\n'; } /* Create a display surface appropriate to the requirements of the * game. */ int creategamedisplay(void) { if (!layoutscreen() || !createdisplay()) return FALSE; cleardisplay(); return TRUE; } /* Initialize the display with a generic surface capable of rendering * text. */ int _sdloutputinitialize(int _fullscreen) { fullscreen = _fullscreen; screenw = 640; screenh = 480; promptloc.x = screenw - MARGINW - PROMPTICONW; promptloc.y = screenh - MARGINH - PROMPTICONH; promptloc.w = PROMPTICONW; promptloc.h = PROMPTICONH; createdisplay(); cleardisplay(); sdlg.textclr = makefontcolors(0, 0, 0, 255, 255, 255); sdlg.dimtextclr = makefontcolors(0, 0, 0, 192, 192, 192); sdlg.hilightclr = makefontcolors(0, 0, 0, 255, 255, 0); cleardisplay(); if (!createprompticons()) return FALSE; return TRUE; } tworld-2.3.0/oshw-sdl/sdlsfx.c000066400000000000000000000227441475511570500162610ustar00rootroot00000000000000/* sdlsfx.c: Creating the program's sound effects. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include #include #include //TWPLUSPLUS really just means TW2 #ifdef TWPLUSPLUS #include #else #include "SDL.h" #endif #include "sdlsfx.h" #include "../err.h" #include "../settings.h" #include "../state.h" /* Some generic default settings for the audio output. */ #define DEFAULT_SND_FMT AUDIO_S16SYS #define DEFAULT_SND_FREQ 22050 #define DEFAULT_SND_CHAN 1 /* The data needed for each sound effect's wave. */ typedef struct sfxinfo { Uint8 *wave; /* the actual wave data */ Uint32 len; /* size of the wave data */ int pos; /* how much has been played already */ int playing; /* is the wave currently playing? */ char const *textsfx; /* the onomatopoeia string */ } sfxinfo; /* The data needed to talk to the sound output device. */ static SDL_AudioSpec spec; /* All of the sound effects. */ static sfxinfo sounds[SND_COUNT]; /* TRUE if sound-playing has been enabled. */ static int enabled = FALSE; /* TRUE if the program is currently talking to a sound device. */ static int hasaudio = FALSE; /* The volume level. */ static int volume = SDL_MIX_MAXVOLUME; /* The sound buffer size scaling factor. */ static int soundbufsize = 0; /* Initialize the textual sound effects. */ static void initonomatopoeia(void) { sounds[SND_CHIP_LOSES].textsfx = "\"Bummer\""; sounds[SND_CHIP_WINS].textsfx = "Tadaa!"; sounds[SND_TIME_OUT].textsfx = "Clang!"; sounds[SND_TIME_LOW].textsfx = "Ktick!"; sounds[SND_DEREZZ].textsfx = "Bzont!"; sounds[SND_CANT_MOVE].textsfx = "Mnphf!"; sounds[SND_IC_COLLECTED].textsfx = "Chack!"; sounds[SND_ITEM_COLLECTED].textsfx = "Slurp!"; sounds[SND_BOOTS_STOLEN].textsfx = "Flonk!"; sounds[SND_TELEPORTING].textsfx = "Bamff!"; sounds[SND_DOOR_OPENED].textsfx = "Spang!"; sounds[SND_SOCKET_OPENED].textsfx = "Clack!"; sounds[SND_BUTTON_PUSHED].textsfx = "Click!"; sounds[SND_BOMB_EXPLODES].textsfx = "Booom!"; sounds[SND_WATER_SPLASH].textsfx = "Plash!"; sounds[SND_TILE_EMPTIED].textsfx = "Whisk!"; sounds[SND_WALL_CREATED].textsfx = "Chunk!"; sounds[SND_TRAP_ENTERED].textsfx = "Shunk!"; sounds[SND_SKATING_TURN].textsfx = "Whing!"; sounds[SND_SKATING_FORWARD].textsfx = "Whizz ..."; sounds[SND_SLIDING].textsfx = "Drrrr ..."; sounds[SND_BLOCK_MOVING].textsfx = "Scrrr ..."; sounds[SND_SLIDEWALKING].textsfx = "slurp slurp ..."; sounds[SND_ICEWALKING].textsfx = "snick snick ..."; sounds[SND_WATERWALKING].textsfx = "plip plip ..."; sounds[SND_FIREWALKING].textsfx = "crackle crackle ..."; } /* Display the onomatopoeia for the currently playing sound effect. * Only the first sound is used, since we can't display multiple * strings. */ static void displaysoundeffects(unsigned long sfx) { unsigned long flag; int i; for (flag = 1, i = 0 ; flag ; flag <<= 1, ++i) { if (sfx & flag) { setdisplaymsg(sounds[i].textsfx, 500, 10); return; } } } /* The callback function that is called by the sound driver to supply * the latest sound effects. All the sound effects are checked, and * the ones that are being played get another chunk of their sound * data mixed into the output buffer. When the end of a sound effect's * wave data is reached, the one-shot sounds are changed to be marked * as not playing, and the continuous sounds are looped. */ static void sfxcallback(void *data, Uint8 *wave, int len) { int i, n; (void)data; memset(wave, spec.silence, len); for (i = 0 ; i < SND_COUNT ; ++i) { if (!sounds[i].wave) continue; if (!sounds[i].playing) if (!sounds[i].pos || i >= SND_ONESHOT_COUNT) continue; n = sounds[i].len - sounds[i].pos; if (n > len) { SDL_MixAudio(wave, sounds[i].wave + sounds[i].pos, len, volume); sounds[i].pos += len; } else { SDL_MixAudio(wave, sounds[i].wave + sounds[i].pos, n, volume); sounds[i].pos = 0; if (i < SND_ONESHOT_COUNT) { sounds[i].playing = FALSE; } else if (sounds[i].playing) { while (len - n >= (int)sounds[i].len) { SDL_MixAudio(wave + n, sounds[i].wave, sounds[i].len, volume); n += sounds[i].len; } sounds[i].pos = len - n; SDL_MixAudio(wave + n, sounds[i].wave, sounds[i].pos, volume); } } } } /* * The exported functions. */ /* Activate or deactivate the sound system. When activating for the * first time, the connection to the sound device is established. When * deactivating, the connection is closed. */ int setaudiosystem(int active) { SDL_AudioSpec des; int n; if (!enabled) return !active; if (!active) { if (hasaudio) { SDL_PauseAudio(TRUE); SDL_CloseAudio(); hasaudio = FALSE; } return TRUE; } if (!SDL_WasInit(SDL_INIT_AUDIO)) { if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) { warn("Cannot initialize audio output: %s", SDL_GetError()); return FALSE; } } if (hasaudio) return TRUE; des.freq = DEFAULT_SND_FREQ; des.format = DEFAULT_SND_FMT; des.channels = DEFAULT_SND_CHAN; des.callback = sfxcallback; des.userdata = NULL; for (n = 1 ; n <= des.freq / TICKS_PER_SECOND ; n <<= 1) ; des.samples = (n << soundbufsize) >> 2; if (SDL_OpenAudio(&des, &spec) < 0) { warn("can't access audio output: %s", SDL_GetError()); return FALSE; } hasaudio = TRUE; SDL_PauseAudio(FALSE); return TRUE; } /* Load a single wave file into memory. The wave data is converted to * the format expected by the sound device. */ int loadsfxfromfile(int index, char const *filename) { SDL_AudioSpec specin; SDL_AudioCVT convert; Uint8 *wavein; Uint8 *wavecvt; Uint32 lengthin; if (!filename) { freesfx(index); return TRUE; } if (!enabled) return FALSE; if (!hasaudio) if (!setaudiosystem(TRUE)) return FALSE; if (!SDL_LoadWAV(filename, &specin, &wavein, &lengthin)) { warn("can't load %s: %s", filename, SDL_GetError()); return FALSE; } if (SDL_BuildAudioCVT(&convert, specin.format, specin.channels, specin.freq, spec.format, spec.channels, spec.freq) < 0) { warn("can't create converter for %s: %s", filename, SDL_GetError()); return FALSE; } if (!(wavecvt = malloc(lengthin * convert.len_mult))) memerrexit(); memcpy(wavecvt, wavein, lengthin); SDL_FreeWAV(wavein); convert.buf = wavecvt; convert.len = lengthin; if (SDL_ConvertAudio(&convert) < 0) { warn("can't convert %s: %s", filename, SDL_GetError()); return FALSE; } freesfx(index); SDL_LockAudio(); sounds[index].wave = convert.buf; sounds[index].len = convert.len * convert.len_ratio; sounds[index].pos = 0; sounds[index].playing = FALSE; SDL_UnlockAudio(); return TRUE; } /* Select the sounds effects to be played. sfx is a bitmask of sound * effect indexes. Any continuous sounds that are not included in sfx * are stopped. One-shot sounds that are included in sfx are * restarted. */ void playsoundeffects(unsigned long sfx) { unsigned long flag; int i; if (!hasaudio || !volume) { displaysoundeffects(sfx); return; } SDL_LockAudio(); for (i = 0, flag = 1 ; i < SND_COUNT ; ++i, flag <<= 1) { if (sfx & flag) { sounds[i].playing = TRUE; if (sounds[i].pos && i < SND_ONESHOT_COUNT) sounds[i].pos = 0; } else { if (i >= SND_ONESHOT_COUNT) sounds[i].playing = FALSE; } } SDL_UnlockAudio(); } /* If action is negative, stop playing all sounds immediately. * Otherwise, just temporarily pause or unpause sound-playing. */ void setsoundeffects(int action) { int i; if (!hasaudio || !volume) return; if (action < 0) { SDL_LockAudio(); for (i = 0 ; i < SND_COUNT ; ++i) { sounds[i].playing = FALSE; sounds[i].pos = 0; } SDL_UnlockAudio(); } else { SDL_PauseAudio(!action); } } /* Release all memory for the given sound effect. */ void freesfx(int index) { if (sounds[index].wave) { SDL_LockAudio(); free(sounds[index].wave); sounds[index].wave = NULL; sounds[index].pos = 0; sounds[index].playing = FALSE; SDL_UnlockAudio(); } } /* Set the current volume level to v. If display is true, the * new volume level is displayed to the user. */ int setvolume(int v, int display) { char buf[16]; if (!hasaudio) return FALSE; if (v < 0) v = 0; else if (v > 10) v = 10; volume = (SDL_MIX_MAXVOLUME * v + 9) / 10; setintsetting("volume", v); if (display) { sprintf(buf, "Volume: %d", v); setdisplaymsg(buf, 1000, 1000); } return TRUE; } /* Change the current volume level by delta. If display is true, the * new volume level is displayed to the user. */ int changevolume(int delta, int display) { return setvolume(((10 * volume) / SDL_MIX_MAXVOLUME) + delta, display); } /* Shut down the sound system. */ static void shutdown(void) { setaudiosystem(FALSE); if (SDL_WasInit(SDL_INIT_AUDIO)) SDL_QuitSubSystem(SDL_INIT_AUDIO); hasaudio = FALSE; } /* Initialize the module. If silence is TRUE, then the program will * leave sound output disabled. */ int _sdlsfxinitialize(int silence, int _soundbufsize) { atexit(shutdown); enabled = !silence; soundbufsize = _soundbufsize; initonomatopoeia(); if (enabled) setaudiosystem(TRUE); return TRUE; } tworld-2.3.0/oshw-sdl/sdlsfx.h000066400000000000000000000011531475511570500162550ustar00rootroot00000000000000/* sdlsfx.h: The internal shared definitions for sound effects using SDL. * Used in the SDL as well as the Qt OS/hardware layer. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef HEADER_sdlsfx_h_ #define HEADER_sdlsfx_h_ #include "../gen.h" #include "../oshw.h" #ifdef __cplusplus #define OSHW_EXTERN extern "C" #else #define OSHW_EXTERN extern #endif /* The initialization function for the sound module. */ OSHW_EXTERN int _sdlsfxinitialize(int silence, int soundbufsize); #undef OSHW_EXTERN #endif tworld-2.3.0/oshw-sdl/sdltext.c000066400000000000000000000340321475511570500164360ustar00rootroot00000000000000/* sdltext.c: Font-rendering functions for SDL. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #include #include #include #include #include "SDL.h" #include "sdlgen.h" #include "../err.h" /* Accept a bitmap as an 8-bit SDL surface and from it extract the * glyphs of a font. (See the documentation included in the Tile World * distribution for specifics regarding the bitmap layout.) */ static int makefontfromsurface(fontinfo *pf, SDL_Surface *surface) { char brk[267]; unsigned char *p; unsigned char *dest; Uint8 foregnd, bkgnd; int pitch, wsum; int ch; int x, y, x0, y0, w; if (surface->format->BytesPerPixel != 1) return FALSE; if (SDL_MUSTLOCK(surface)) SDL_LockSurface(surface); pitch = surface->pitch; p = surface->pixels; foregnd = p[0]; bkgnd = p[pitch]; for (y = 1, p += pitch ; y < surface->h && *p == bkgnd ; ++y, p += pitch) ; pf->h = y - 1; wsum = 0; ch = 32; memset(pf->w, 0, sizeof pf->w); memset(brk, 0, sizeof brk); for (y = 0 ; y + pf->h < surface->h && ch < 256 ; y += pf->h + 1) { p = surface->pixels; p += y * pitch; x0 = 1; for (x = 1 ; x < surface->w ; ++x) { if (p[x] == bkgnd) continue; w = x - x0; x0 = x + 1; pf->w[ch] = w; wsum += w; ++ch; if (ch == 127) ch = 144; else if (ch == 154) ch = 160; else if (ch == 256) break; } brk[ch] = 1; } if (!(pf->memory = calloc(wsum, pf->h))) memerrexit(); x0 = 1; y0 = 1; dest = pf->memory; for (ch = 0 ; ch < 256 ; ++ch) { pf->bits[ch] = dest; if (pf->w[ch] == 0) continue; if (brk[ch]) { x0 = 1; y0 += pf->h + 1; } p = surface->pixels; p += y0 * pitch + x0; for (y = 0 ; y < pf->h ; ++y, p += pitch) for (x = 0 ; x < pf->w[ch] ; ++x, ++dest) *dest = p[x] == bkgnd ? 0 : p[x] == foregnd ? 2 : 1; x0 += pf->w[ch] + 1; } if (SDL_MUSTLOCK(surface)) SDL_UnlockSurface(surface); return TRUE; } /* Given a text and a maximum horizontal space to occupy, return * the amount of vertial space needed to render the entire text with * word-wrapping. */ static int measuremltext(unsigned char const *text, int len, int maxwidth) { int brk, w, h, n; if (len < 0) len = strlen((char const*)text); h = 0; brk = 0; for (n = 0, w = 0 ; n < len ; ++n) { w += sdlg.font.w[text[n]]; if (isspace(text[n])) { brk = w; } else if (w > maxwidth) { h += sdlg.font.h; if (brk) { w -= brk; brk = 0; } else { w = sdlg.font.w[text[n]]; brk = 0; } } } if (w) h += sdlg.font.h; return h; } /* * Render a single line of pixels of the given text to a locked * surface at scanline. w specifies the total number of pixels to * render. (Any pixels remaining after the last glyph has been * rendered are set to the background color.) y specifies the vertical * coordinate of the line to render relative to the font glyphs. A * separate function is supplied for each possible surface depth. */ static void *drawtextscanline8(Uint8 *scanline, int w, int y, Uint32 *clr, unsigned char const *text, int len) { unsigned char const *glyph; int n, x; for (n = 0 ; n < len ; ++n) { glyph = sdlg.font.bits[text[n]]; glyph += y * sdlg.font.w[text[n]]; for (x = 0 ; w && x < sdlg.font.w[text[n]] ; ++x, --w) scanline[x] = (Uint8)clr[glyph[x]]; scanline += x; } while (w--) *scanline++ = (Uint8)clr[0]; return scanline; } static void *drawtextscanline16(Uint16 *scanline, int w, int y, Uint32 *clr, unsigned char const *text, int len) { unsigned char const *glyph; int n, x; for (n = 0 ; n < len ; ++n) { glyph = sdlg.font.bits[text[n]]; glyph += y * sdlg.font.w[text[n]]; for (x = 0 ; w && x < sdlg.font.w[text[n]] ; ++x, --w) scanline[x] = (Uint16)clr[glyph[x]]; scanline += x; } while (w--) *scanline++ = (Uint16)clr[0]; return scanline; } static void *drawtextscanline24(Uint8 *scanline, int w, int y, Uint32 *clr, unsigned char const *text, int len) { unsigned char const *glyph; Uint32 c; int n, x; for (n = 0 ; n < len ; ++n) { glyph = sdlg.font.bits[text[n]]; glyph += y * sdlg.font.w[text[n]]; for (x = 0 ; w && x < sdlg.font.w[text[n]] ; ++x, --w) { c = clr[glyph[x]]; #if SDL_BYTEORDER == SDL_BIG_ENDIAN *scanline++ = (Uint8)(c >> 16); *scanline++ = (Uint8)(c >> 8); *scanline++ = (Uint8)c; #else *scanline++ = (Uint8)c; *scanline++ = (Uint8)(c >> 8); *scanline++ = (Uint8)(c >> 16); #endif } } c = clr[0]; while (w--) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN *scanline++ = (Uint8)(c >> 16); *scanline++ = (Uint8)(c >> 8); *scanline++ = (Uint8)c; #else *scanline++ = (Uint8)c; *scanline++ = (Uint8)(c >> 8); *scanline++ = (Uint8)(c >> 16); #endif } return scanline; } static void *drawtextscanline32(Uint32 *scanline, int w, int y, Uint32 *clr, unsigned char const *text, int len) { unsigned char const *glyph; int n, x; for (n = 0 ; n < len ; ++n) { glyph = sdlg.font.bits[text[n]]; glyph += y * sdlg.font.w[text[n]]; for (x = 0 ; w && x < sdlg.font.w[text[n]] ; ++x, --w) scanline[x] = clr[glyph[x]]; scanline += x; } while (w--) *scanline++ = clr[0]; return scanline; } /* * The main font-rendering functions. */ /* Draw a single line of text to the screen at the position given by * rect. The bitflags in the final argument control the placement of * text within rect and what colors to use. */ static void drawtext(SDL_Rect *rect, unsigned char const *text, int len, int flags) { Uint32 *clr; void *p; void *q; int l, r; int pitch, bpp, n, w, y; if (len < 0) len = text ? strlen((char const*)text) : 0; w = 0; for (n = 0 ; n < len ; ++n) w += sdlg.font.w[text[n]]; if (flags & PT_CALCSIZE) { rect->h = sdlg.font.h; rect->w = w; return; } if (w >= rect->w) { w = rect->w; l = r = 0; } else if (flags & PT_RIGHT) { l = rect->w - w; r = 0; } else if (flags & PT_CENTER) { l = (rect->w - w) / 2; r = (rect->w - w) - l; } else { l = 0; r = rect->w - w; } if (flags & PT_DIM) clr = sdlg.dimtextclr.c; else if (flags & PT_HILIGHT) clr = sdlg.hilightclr.c; else clr = sdlg.textclr.c; pitch = geng.screen->pitch; bpp = geng.screen->format->BytesPerPixel; p = (unsigned char*)geng.screen->pixels + rect->y * pitch + rect->x * bpp; for (y = 0 ; y < sdlg.font.h && y < rect->h ; ++y) { switch (bpp) { case 1: q = drawtextscanline8(p, l, y, clr, NULL, 0); q = drawtextscanline8(q, w, y, clr, text, len); q = drawtextscanline8(q, r, y, clr, NULL, 0); break; case 2: q = drawtextscanline16(p, l, y, clr, NULL, 0); q = drawtextscanline16(q, w, y, clr, text, len); q = drawtextscanline16(q, r, y, clr, NULL, 0); break; case 3: q = drawtextscanline24(p, l, y, clr, NULL, 0); q = drawtextscanline24(q, w, y, clr, text, len); q = drawtextscanline24(q, r, y, clr, NULL, 0); break; case 4: q = drawtextscanline32(p, l, y, clr, NULL, 0); q = drawtextscanline32(q, w, y, clr, text, len); q = drawtextscanline32(q, r, y, clr, NULL, 0); break; } p = (unsigned char*)p + pitch; } if (flags & PT_UPDATERECT) { rect->y += y; rect->h -= y; } } /* Draw one or more lines of text to the screen at the position given by * rect. The text is broken up on whitespace whenever possible. */ static void drawmultilinetext(SDL_Rect *rect, unsigned char const *text, int len, int flags) { SDL_Rect area; int index, brkw, brkn; int w, n; if (flags & PT_CALCSIZE) { rect->h = measuremltext(text, len, rect->w); return; } if (len < 0) len = strlen((char const*)text); area = *rect; brkw = brkn = 0; index = 0; for (n = 0, w = 0 ; n < len ; ++n) { w += sdlg.font.w[text[n]]; if (isspace(text[n])) { brkn = n; brkw = w; } else if (w > rect->w) { if (brkw) { drawtext(&area, text + index, brkn - index, flags | PT_UPDATERECT); index = brkn + 1; w -= brkw; } else { drawtext(&area, text + index, n - index, flags | PT_UPDATERECT); index = n; w = sdlg.font.w[text[n]]; } brkw = 0; } } if (w) drawtext(&area, text + index, len - index, flags | PT_UPDATERECT); if (flags & PT_UPDATERECT) { *rect = area; } else { while (area.h) drawtext(&area, NULL, 0, PT_UPDATERECT); } } /* * The exported functions. */ /* Render a string of text. */ static void _puttext(SDL_Rect *rect, char const *text, int len, int flags) { if (!sdlg.font.h) die("no font available! (how did I get this far?)"); if (len < 0) len = text ? strlen(text) : 0; if (SDL_MUSTLOCK(geng.screen)) SDL_LockSurface(geng.screen); if (flags & PT_MULTILINE) drawmultilinetext(rect, (unsigned char const*)text, len, flags); else drawtext(rect, (unsigned char const*)text, len, flags); if (SDL_MUSTLOCK(geng.screen)) SDL_UnlockSurface(geng.screen); } /* Lay out the columns of the given table so that the entire table * fits within area (horizontally; no attempt is made to make it fit * vertically). Return an array of rectangles, one per column. This * function is essentially the same algorithm used within printtable() * in tworld.c */ static SDL_Rect *_measuretable(SDL_Rect const *area, tablespec const *table) { SDL_Rect *colsizes; unsigned char const *p; int sep, mlindex, mlwidth, diff; int i, j, n, i0, c, w, x; if (!(colsizes = malloc(table->cols * sizeof *colsizes))) memerrexit(); for (i = 0 ; i < table->cols ; ++i) { colsizes[i].x = 0; colsizes[i].y = area->y; colsizes[i].w = 0; colsizes[i].h = area->h; } mlindex = -1; mlwidth = 0; n = 0; for (j = 0 ; j < table->rows ; ++j) { for (i = 0 ; i < table->cols ; ++n) { c = table->items[n][0] - '0'; if (c == 1) { w = 0; p = (unsigned char const*)table->items[n]; for (p += 2 ; *p ; ++p) w += sdlg.font.w[*p]; if (table->items[n][1] == '!') { if (w > mlwidth || mlindex != i) mlwidth = w; mlindex = i; } else { if (w > colsizes[i].w) colsizes[i].w = w; } } i += c; } } sep = sdlg.font.w[' '] * table->sep; w = -sep; for (i = 0 ; i < table->cols ; ++i) w += colsizes[i].w + sep; diff = area->w - w; if (diff < 0 && table->collapse >= 0) { w = -diff; if (colsizes[table->collapse].w < w) w = colsizes[table->collapse].w - sdlg.font.w[' ']; colsizes[table->collapse].w -= w; diff += w; } if (diff > 0) { n = 0; for (j = 0 ; j < table->rows && diff > 0 ; ++j) { for (i = 0 ; i < table->cols ; ++n) { c = table->items[n][0] - '0'; if (c > 1 && table->items[n][1] != '!') { w = sep; p = (unsigned char const*)table->items[n]; for (p += 2 ; *p ; ++p) w += sdlg.font.w[*p]; for (i0 = i ; i0 < i + c ; ++i0) w -= colsizes[i0].w + sep; if (w > 0) { if (table->collapse >= i && table->collapse < i + c) i0 = table->collapse; else if (mlindex >= i && mlindex < i + c) i0 = mlindex; else i0 = i + c - 1; if (w > diff) w = diff; colsizes[i0].w += w; diff -= w; if (diff == 0) break; } } i += c; } } } if (diff > 0 && mlindex >= 0 && colsizes[mlindex].w < mlwidth) { mlwidth -= colsizes[mlindex].w; w = mlwidth < diff ? mlwidth : diff; colsizes[mlindex].w += w; diff -= w; } x = 0; for (i = 0 ; i < table->cols && x < area->w ; ++i) { colsizes[i].x = area->x + x; x += colsizes[i].w + sep; if (x >= area->w) colsizes[i].w = area->x + area->w - colsizes[i].x; } for ( ; i < table->cols ; ++i) { colsizes[i].x = area->x + area->w; colsizes[i].w = 0; } return colsizes; } /* Render a single row of a table to the screen, using cols to locate * the entries in the individual columns. */ static int _drawtablerow(tablespec const *table, SDL_Rect *cols, int *row, int flags) { SDL_Rect rect; unsigned char const *p; int c, f, n, i, y; if (!cols) { for (i = 0 ; i < table->cols ; i += table->items[(*row)++][0] - '0') ; return TRUE; } if (SDL_MUSTLOCK(geng.screen)) SDL_LockSurface(geng.screen); y = cols[0].y; n = *row; for (i = 0 ; i < table->cols ; ++n) { p = (unsigned char const*)table->items[n]; c = p[0] - '0'; rect = cols[i]; i += c; if (c > 1) rect.w = cols[i - 1].x + cols[i - 1].w - rect.x; f = flags | PT_UPDATERECT; if (p[1] == '+') f |= PT_RIGHT; else if (p[1] == '.') f |= PT_CENTER; if (p[1] == '!') drawmultilinetext(&rect, p + 2, -1, f); else drawtext(&rect, p + 2, -1, f); if (rect.y > y) y = rect.y; } if (SDL_MUSTLOCK(geng.screen)) SDL_UnlockSurface(geng.screen); *row = n; for (i = 0 ; i < table->cols ; ++i) { cols[i].h -= y - cols[i].y; cols[i].y = y; } return TRUE; } /* Free the resources associated with a font. */ void freefont(void) { if (sdlg.font.h) { free(sdlg.font.memory); sdlg.font.memory = NULL; sdlg.font.h = 0; } } /* Load the font contained in the given bitmap file. Error messages * will be displayed if complain is TRUE. The return value is TRUE if * the font was successfully retrieved. */ int loadfontfromfile(char const *filename, int complain) { SDL_Surface *bmp; fontinfo font; bmp = SDL_LoadBMP(filename); if (!bmp) { if (complain) errmsg(filename, "can't load font bitmap: %s", SDL_GetError()); return FALSE; } if (!makefontfromsurface(&font, bmp)) { if (complain) errmsg(filename, "invalid font file"); return FALSE; } SDL_FreeSurface(bmp); freefont(); sdlg.font = font; return TRUE; } /* Initialize the module. */ int _sdltextinitialize(void) { sdlg.font.h = 0; sdlg.puttextfunc = _puttext; sdlg.measuretablefunc = _measuretable; sdlg.drawtablerowfunc = _drawtablerow; return TRUE; } tworld-2.3.0/oshw.h000066400000000000000000000330611475511570500141750ustar00rootroot00000000000000/* oshw.h: Platform-specific functions that talk with the OS/hardware. * * Copyright (C) 2001-2017 by Brian Raiter, Madhav Shanbhag, and Eric Schmidt * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef HEADER_oshw_h_ #define HEADER_oshw_h_ #include #include "gen.h" struct gamestate; struct gameseries; #ifdef __cplusplus #define OSHW_EXTERN extern "C" #else #define OSHW_EXTERN extern #endif /* This is the declaration of the top layer's main function. It is * called directly from the real main() inside the OS/hardware layer. */ OSHW_EXTERN int tworld(int argc, char *argv[]); /* Initialize the OS/hardware interface. This function must be called * before any others in the oshw library. If silence is TRUE, the * sound system will be disabled, as if no soundcard was present. If * showhistogram is TRUE, then during shutdown the timer module will * send a histogram to stdout describing the amount of time the * program explicitly yielded to other processes. (This feature is for * debugging purposes.) soundbufsize is a number between 0 and 3 which * is used to scale the size of the sound buffer. A larger number is * more efficient, but pushes the sound effects farther out of * synchronization with the video. */ OSHW_EXTERN int oshwinitialize(int silence, int soundbufsize, int showhistogram, int fullscreen); /* * Timer functions. */ /* Control the timer depending on the value of action. A negative * value turns off the timer if it is running and resets the counter * to zero. A zero value turns off the timer but does not reset the * counter. A positive value starts (or resumes) the timer. */ OSHW_EXTERN void settimer(int action); /* Set the length (in real time) of a second of game time. A value of * zero selects the default of 1000 milliseconds. */ OSHW_EXTERN void settimersecond(int ms); /* Return the number of ticks since the timer was last reset. */ OSHW_EXTERN int gettickcount(void); /* Put the program to sleep until the next timer tick. */ OSHW_EXTERN int waitfortick(void); /* Force the timer to advance to the next tick. */ OSHW_EXTERN int advancetick(void); /* * Keyboard input functions. */ /* Turn keyboard repeat on or off. If enable is TRUE, the keys other * than the direction keys will repeat at the standard rate. */ OSHW_EXTERN int setkeyboardrepeat(int enable); /* Alter the behavior of the keys used to indicate movement in the * game. If enable is TRUE, the direction keys repeat whenever the * program polls the keyboard. Otherwise, the direction keys do not * repeat until the program polls the keyboard three times. */ OSHW_EXTERN int setkeyboardarrowsrepeat(int enable); /* Turn input mode on or off. In input mode, only the arrow and letter * keys are recognized. */ OSHW_EXTERN int setkeyboardinputmode(int enable); /* Return the latest/current keystroke. If wait is TRUE and no * keystrokes are pending, the function blocks until a keystroke * arrives. */ OSHW_EXTERN int input(int wait); /* Wait for a key to be pressed (any key, not just one recognized by * the program). The return value is FALSE if the key pressed is a * "quit" key. */ OSHW_EXTERN int anykey(void); /* Return a table suitable for displaying a help screen on the * available keyboard commands for the given context. */ OSHW_EXTERN tablespec const *keyboardhelp(int context); /* Symbolic values for requesting a specific help table. */ enum { KEYHELP_INGAME, KEYHELP_TWIXTGAMES, KEYHELP_FILELIST, KEYHELP_SCORELIST, KEYHELP_TWPLUSPLUS }; /* * Resource-loading functions. */ /* Extract the font stored in the given file and make it the current * font. FALSE is returned if the attempt was unsuccessful. If * complain is FALSE, no error messages will be displayed. */ OSHW_EXTERN int loadfontfromfile(char const *filename, int complain); /* Free all memory associated with the current font. */ OSHW_EXTERN void freefont(void); /* Extract the tile images stored in the given file and use them as * the current tile set. FALSE is returned if the attempt was * unsuccessful. If complain is FALSE, no error messages will be * displayed. */ OSHW_EXTERN int loadtileset(char const *filename, int complain); /* Free all memory associated with the current tile images. */ OSHW_EXTERN void freetileset(void); /* The font provides special monospaced digit characters at 144-153. */ #ifndef TWPLUSPLUS enum { CHAR_MZERO = 144 }; #else enum { CHAR_MZERO = '0' }; #endif /* * Video output functions. */ /* Create a display surface appropriate to the requirements of the * game (e.g., sized according to the tiles and the font). FALSE is * returned on error. */ OSHW_EXTERN int creategamedisplay(void); /* Select the colors used for drawing the display background, normal * text, bold (highlighted) text, and dim (grayed) text. The color * values are of the form 0x00RRGGBB. */ OSHW_EXTERN void setcolors(long bkgnd, long text, long bold, long dim); /* Fill the display with the background color. */ OSHW_EXTERN void cleardisplay(void); /* Display the current game state. timeleft and besttime provide the * current time on the clock and the best time recorded for the level, * measured in seconds. */ OSHW_EXTERN int displaygame(struct gamestate const *state, int timeleft, int besttime, int showinitstate); /* Display a short message appropriate to the end of a level's game * play. If the level was completed successfully, completed is TRUE, * and the other three arguments define the base score and time bonus * for the level, and the user's total score for the series; these * scores will be displayed to the user. If the return value is CmdNone, * the program will wait for subsequent user input, otherwise the * command returned will be used as the next action. */ OSHW_EXTERN int displayendmessage(int basescore, int timescore, long totalscore, int completed); /* Display a (very short) message for the given number of * milliseconds. bold indicates the number of milliseconds the * message is with highlighting. After that (if the message is * still visible) it is rendered as normal text. */ OSHW_EXTERN int setdisplaymsg(char const *msg, int msecs, int bold); /* Types of lists that can be displayed. */ typedef enum { LIST_MAPFILES, LIST_SERIES, LIST_SCORES, LIST_SOLUTIONFILES, LIST_HELP } DisplayListType; /* Display a scrollable table. title provides a title to display. The * table's first row provides a set of column headers which will not * scroll. index points to the index of the item to be initially * selected; upon return, the value will hold the current selection. * Either listtype or inputcallback must be used to tailor the UI. * listtype specifies the type of list being displayed. * inputcallback points to a function that is called to retrieve * input. The function is passed a pointer to an integer. If the * callback returns TRUE, this integer should be set to either a new * index value or one of the following enum values. This value will * then cause the selection to be changed, whereupon the display will * be updated before the callback is called again. If the callback * returns FALSE, the table is removed from the display, and the value * stored in the integer will become displaylist()'s return value. */ OSHW_EXTERN int displaylist(char const *title, tablespec const *table, int *index, DisplayListType listtype, int (*inputcallback)(int*)); /* Symbolic values for requesting relative movement of the selection. */ enum { SCROLL_NOP = -1, SCROLL_UP = -2, SCROLL_DN = -3, SCROLL_PAGE_UP = -4, SCROLL_PAGE_DN = -5, SCROLL_HALFPAGE_UP = -6, SCROLL_HALFPAGE_DN = -7, SCROLL_ALLTHEWAY_UP = -8, SCROLL_ALLTHEWAY_DN = -9 }; /* Types of input prompts. */ typedef enum { INPUT_YESNO, // Yes or No question INPUT_ALPHA // Alphabets only (lowercase folded to uppercase) } InputPromptType; /* Display an input prompt to the user. prompt supplies the prompt to * display, and input points to a buffer to hold the user's input. * maxlen sets a maximum length to the input that will be accepted. * Either inputtype or inputcallback must be used to validate input. * inputtype indicates the type of input desired. * The supplied callback function is called repeatedly to obtain * input. If the callback function returns a printable ASCII * character, the function will automatically append it to the string * stored in input. If '\b' is returned, the function will erase the * last character in input, if any. If '\f' is returned the function * will set input to "". If '\n' is returned, the input prompt is * erased and displayinputprompt() returns TRUE. If a negative value * is returned, the input prompt is erased and displayinputprompt() * returns FALSE. All other return values from the callback are * ignored. */ OSHW_EXTERN int displayinputprompt(char const *prompt, char *input, int maxlen, InputPromptType inputtype, int (*inputcallback)(void)); /* * Sound functions. */ /* Activate or deactivate the sound system. The return value is TRUE * if the sound system is (or already was) active. */ OSHW_EXTERN int setaudiosystem(int active); /* Load a wave file into memory. index indicates which sound effect to * associate the sound with. FALSE is returned if an error occurs. */ OSHW_EXTERN int loadsfxfromfile(int index, char const *filename); /* Specify the sounds effects to be played at this time. sfx is the * bitwise-or of any number of sound effects. If a non-continuous * sound effect in sfx is already playing, it will be restarted. Any * continuous sound effects that are currently playing that are not * set in sfx will stop playing. */ OSHW_EXTERN void playsoundeffects(unsigned long sfx); /* Control sound-effect production depending on the value of action. * A negative value turns off all sound effects that are playing. A * zero value temporarily suspends the playing of sound effects. A * positive value continues the sound effects at the point at which * they were suspended. */ OSHW_EXTERN void setsoundeffects(int action); /* Set the current volume level. Volume ranges from 0 (silence) to 10 * (the default). Setting the sound to zero causes sound effects to be * displayed as textual onomatopoeia. If display is TRUE, the new * volume level will be displayed to the user. FALSE is returned if * the sound system is not currently active. */ OSHW_EXTERN int setvolume(int volume, int display); /* Alters the current volume level by delta. */ OSHW_EXTERN int changevolume(int delta, int display); /* Release all memory used for the given sound effect's wave data. */ OSHW_EXTERN void freesfx(int index); /* * Miscellaneous functions. */ /* Ring the bell. */ OSHW_EXTERN void ding(void); /* Set the program's subtitle. A NULL subtitle is equivalent to the * empty string. The subtitle is displayed in the window dressing (if * any). */ OSHW_EXTERN void setsubtitle(char const *subtitle); /* Display a message to the user. cfile and lineno can be NULL and 0 * respectively; otherwise, they identify the source code location * where this function was called from. prefix is an optional string * that is displayed before and/or apart from the body of the message. * fmt and args define the formatted text of the message body. action * indicates how the message should be presented. NOTIFY_LOG causes * the message to be displayed in a way that does not interfere with * the program's other activities. NOTIFY_ERR presents the message as * an error condition. NOTIFY_DIE should indicate to the user that the * program is about to shut down. */ OSHW_EXTERN void usermessage(int action, char const *prefix, char const *cfile, unsigned long lineno, char const *fmt, va_list args); /* Values used for the first argument of usermessage(). */ enum { NOTIFY_DIE, NOTIFY_ERR, NOTIFY_LOG }; /* Structure used to define text with illustrations. */ typedef struct tiletablerow { int isfloor; /* TRUE if the images are floor tiles */ int item1; /* first illustration */ int item2; /* second illustration */ char const *desc; /* text */ } tiletablerow; /* Displays a screenful of (hopefully) helpful information which * includes tile images. title provides the title of the display. rows * points to an array of tiletablerow structures. count specifies the * size of this array. The text of each row is displayed alongside one * or two tile images. completed controls the prompt that the user * sees at the bottom of the display. A positive value will indicate * that more text follows. A negative value will indicate that leaving * this screen will return to the prior display. A value of zero will * indicate that the current display is the end of a sequence. */ OSHW_EXTERN int displaytiletable(char const *title, tiletablerow const *rows, int count, int completed); /* Displays a screenful of (hopefully) helpful information. title * provides the title of the display. table points to a table that * contains the body of the text. completed controls the prompt that * the user sees at the bottom of the display; see the description of * displaytiletable() for details. */ OSHW_EXTERN int displaytable(char const *title, tablespec const *table, int completed); /* Get the selected ruleset. */ OSHW_EXTERN int getselectedruleset(void); /* Read any additional data for the series. */ OSHW_EXTERN void readextensions(struct gameseries *series); /* Get number of seconds to skip at start of playback. */ OSHW_EXTERN int getreplaysecondstoskip(void); /* Copy text to clipboard. */ OSHW_EXTERN void copytoclipboard(char const *text); #undef OSHW_EXTERN #endif tworld-2.3.0/play.c000066400000000000000000000306331475511570500141570ustar00rootroot00000000000000/* play.c: Top-level game-playing functions. * * Copyright (C) 2001-2014 by Brian Raiter, Madhav Shanbhag, and Eric Schmidt, * under the GNU General Public License. No warranty. See COPYING for details. */ #include #include #include "defs.h" #include "err.h" #include "state.h" #include "encoding.h" #include "oshw.h" #include "res.h" #include "logic.h" #include "random.h" #include "settings.h" #include "solution.h" #include "unslist.h" #include "play.h" /* The current state of the current game. */ static gamestate state; /* The current logic module. */ static gamelogic *logic = NULL; /* TRUE if the program is running without a user interface. */ int batchmode = FALSE; /* How much mud to make the timer suck (i.e., the slowdown factor). */ static int mudsucking = 1; /* Whether to show steppping and initial random force floor direction during * solution playback. */ static int showinitstate = FALSE; /* Turn on the pedantry. */ void setpedanticmode(void) { pedanticmode = TRUE; } /* Set the slowdown factor. */ int setmudsuckingfactor(int mud) { if (mud < 1) return FALSE; mudsucking = mud; return TRUE; } void toggleshowinitstate(void) { showinitstate = !showinitstate; setintsetting("showinitstate", showinitstate); } /* Configure the game logic, and some of the OS/hardware layer, as * required for the given ruleset. Do nothing if the requested ruleset * is already the current ruleset. */ static int setrulesetbehavior(int ruleset) { if (logic) { if (ruleset == logic->ruleset) return TRUE; (*logic->shutdown)(logic); logic = NULL; } if (ruleset == Ruleset_None) return TRUE; switch (ruleset) { case Ruleset_Lynx: logic = lynxlogicstartup(); if (!logic) return FALSE; if (!batchmode) setkeyboardarrowsrepeat(TRUE); settimersecond(1000 * mudsucking); break; case Ruleset_MS: logic = mslogicstartup(); if (!logic) return FALSE; if (!batchmode) setkeyboardarrowsrepeat(FALSE); settimersecond(1100 * mudsucking); break; default: errmsg(NULL, "unknown ruleset requested (ruleset=%d)", ruleset); return FALSE; } if (!batchmode) { if (!loadgameresources(ruleset) || !creategamedisplay()) { die("unable to proceed due to previous errors."); return FALSE; } } logic->state = &state; return TRUE; } /* Initialize the current state to the starting position of the * given level. */ int initgamestate(gamesetup *game, int ruleset) { if (!setrulesetbehavior(ruleset)) die("unable to initialize the system for the requested ruleset"); memset(state.map, 0, sizeof state.map); state.game = game; state.ruleset = ruleset; state.replay = -1; state.currenttime = -1; state.timeoffset = 0; state.currentinput = NIL; state.lastmove = NIL; state.initrndslidedir = NIL; state.stepping = -1; state.statusflags = 0; state.soundeffects = 0; state.timelimit = game->time * TICKS_PER_SECOND; initmovelist(&state.moves); resetprng(&state.mainprng); if (!expandleveldata(&state)) return FALSE; return (*logic->initgame)(logic); } /* Change the current state to run from the recorded solution. */ int prepareplayback(void) { solutioninfo solution; if (!state.game->solutionsize) return FALSE; solution.moves.list = NULL; solution.moves.allocated = 0; if (!expandsolution(&solution, state.game) || !solution.moves.count) return FALSE; destroymovelist(&state.moves); state.moves = solution.moves; restartprng(&state.mainprng, solution.rndseed); state.initrndslidedir = solution.rndslidedir; state.stepping = solution.stepping; state.replay = 0; return TRUE; } /* Return the amount of time passed in the current game, in seconds. */ int secondsplayed(void) { return (state.currenttime + state.timeoffset) / TICKS_PER_SECOND; } /* Change the system behavior according to the given gameplay mode. */ void setgameplaymode(int mode) { switch (mode) { case NormalPlay: setkeyboardrepeat(FALSE); settimer(+1); setsoundeffects(+1); state.statusflags &= ~SF_SHUTTERED; break; case EndPlay: setkeyboardrepeat(TRUE); settimer(-1); setsoundeffects(+1); break; case NonrenderPlay: settimer(+1); setsoundeffects(0); break; case SuspendPlayShuttered: if (state.ruleset == Ruleset_MS) state.statusflags |= SF_SHUTTERED; /* fall through */ case SuspendPlay: setkeyboardrepeat(TRUE); settimer(0); setsoundeffects(0); break; } } /* Write a string representing the stepping to a buffer. Returns * a pointer to the terminating null character. */ static char *writesteppingstring(char *buf, int stepping) { char *p = buf; p += sprintf(p, "%s-step", state.stepping & 4 ? "odd" : "even"); if (state.stepping & 3) p += sprintf(p, " +%d", state.stepping & 3); return p; } /* Alter the stepping. If display is true, update the screen to * reflect the change. */ int setstepping(int stepping, int display) { char msg[32]; state.stepping = stepping; if (display) { writesteppingstring(msg, stepping); setdisplaymsg(msg, 1000, 1000); } return TRUE; } /* Alter the stepping by a delta. Force the stepping to be appropriate * to the current ruleset. */ int changestepping(int delta, int display) { int n; if (state.stepping < 0) state.stepping = 0; n = (state.stepping + delta) % 8; if (state.ruleset == Ruleset_MS) n &= ~3; if (state.stepping != n) return setstepping(n, display); return TRUE; } /* Append a string literal and update pointer to refer to end. */ #define APPEND(p, strliteral) do { \ strcpy(p, strliteral); \ p += strlen(strliteral); \ } while (0) /* Write a string representing the random force floor direction. Returns * a pointer to the terminating null character. */ static char *writerandomffstring(char *buf, int rndslidedir) { char *p = buf; APPEND(p, "random FF "); switch (rndslidedir) { /* The direction will be cycled again before being used */ case NORTH: APPEND(p, "east"); break; case EAST: APPEND(p, "south"); break; case SOUTH: APPEND(p, "west"); break; case WEST: APPEND(p, "north"); break; } return p; } /* Advance initial random force floor direction (in Lynx mode) */ void advanceinitrandomff(int display) { if (state.ruleset == Ruleset_Lynx) { state.initrndslidedir = right(state.initrndslidedir); if (display) { char msg[32]; writerandomffstring(msg, state.initrndslidedir); setdisplaymsg(msg, 1000, 1000); } } } char const *getinitstatestring(void) { static char buf[64]; char *p = buf; p = writesteppingstring(p, state.stepping); if (state.ruleset == Ruleset_Lynx) { *p++ = '\n'; p = writerandomffstring(p, state.initrndslidedir); } return buf; } /* Advance the game one tick and update the game state. cmd is the * current keyboard command supplied by the user. The return value is * positive if the game was completed successfully, negative if the * game ended unsuccessfully, and zero otherwise. */ int doturn(int cmd) { action act; int n; state.soundeffects &= ~((1 << SND_ONESHOT_COUNT) - 1); state.currenttime = gettickcount(); if (state.currenttime >= MAXIMUM_TICK_COUNT) { errmsg(NULL, "timer reached its maximum of %d.%d hours; quitting now", MAXIMUM_TICK_COUNT / (TICKS_PER_SECOND * 3600), (MAXIMUM_TICK_COUNT / (TICKS_PER_SECOND * 360)) % 10); return -1; } if (state.replay < 0) { if (cmd != CmdPreserve) state.currentinput = cmd; } else { if (state.replay < state.moves.count) { if (state.currenttime > state.moves.list[state.replay].when) warn("Replay: Got ahead of saved solution: %d > %d!", state.currenttime, state.moves.list[state.replay].when); if (state.currenttime == state.moves.list[state.replay].when) { state.currentinput = state.moves.list[state.replay].dir; ++state.replay; } } else { n = state.currenttime + state.timeoffset - 1; if (n > state.game->besttime) return -1; } } n = (*logic->advancegame)(logic); if (state.replay < 0 && state.lastmove) { act.when = state.currenttime; act.dir = state.lastmove; addtomovelist(&state.moves, act); state.lastmove = NIL; } return n; } /* Update the display to show the current game state (including sound * effects, if any). If showframe is FALSE, then nothing is actually * displayed. */ int drawscreen(int showframe) { int currenttime; int timeleft, besttime; playsoundeffects(state.soundeffects); state.soundeffects &= ~((1 << SND_ONESHOT_COUNT) - 1); if (!showframe) return TRUE; currenttime = state.currenttime + state.timeoffset; int const starttime = (state.game->time ? state.game->time : 999); if (hassolution(state.game)) besttime = starttime - state.game->besttime / TICKS_PER_SECOND; else besttime = TIME_NIL; timeleft = starttime - currenttime / TICKS_PER_SECOND; if (state.game->time && timeleft <= 0) { timeleft = 0; #ifndef TWPLUSPLUS setdisplaymsg("Out of time", 2, 2); #endif } return displaygame(&state, timeleft, besttime, showinitstate); } /* Stop game play and clean up. */ int quitgamestate(void) { state.soundeffects = 0; setsoundeffects(-1); return TRUE; } /* Clean up after game play is over. */ int endgamestate(void) { setsoundeffects(-1); return (*logic->endgame)(logic); } /* Close up shop. */ void shutdowngamestate(void) { setrulesetbehavior(Ruleset_None); destroymovelist(&state.moves); } /* Initialize the current game state to a small level used for display * at the completion of a series. */ void setenddisplay(void) { state.replay = -1; state.timelimit = 0; state.currenttime = -1; state.timeoffset = 0; state.chipsneeded = 0; state.currentinput = NIL; state.statusflags = 0; state.soundeffects = 0; getenddisplaysetup(&state); (*logic->initgame)(logic); } /* * Solution handling functions. */ /* Return TRUE if a solution exists for the given level. */ int hassolution(gamesetup const *game) { return game->besttime != TIME_NIL; } /* Compare the most recent solution for the current game with the * user's best solution (if any). If this solution beats what's there, * or if the current solution has been marked as replaceable, then * replace it. TRUE is returned if the solution was replaced. */ int replacesolution(void) { solutioninfo solution; int currenttime; if (state.statusflags & SF_NOSAVING) return FALSE; currenttime = state.currenttime + state.timeoffset; if (hassolution(state.game) && !(state.game->sgflags & SGF_REPLACEABLE) && currenttime >= state.game->besttime) return FALSE; state.game->besttime = currenttime; state.game->sgflags &= ~SGF_REPLACEABLE; solution.moves = state.moves; solution.rndseed = getinitialseed(&state.mainprng); solution.flags = 0; solution.rndslidedir = state.initrndslidedir; solution.stepping = state.stepping; if (!contractsolution(&solution, state.game)) return FALSE; return TRUE; } /* Delete the user's best solution for the current game. FALSE is * returned if no solution was present. */ int deletesolution(void) { if (!hassolution(state.game)) return FALSE; state.game->besttime = TIME_NIL; state.game->sgflags &= ~SGF_REPLACEABLE; free(state.game->solutiondata); state.game->solutionsize = 0; state.game->solutiondata = NULL; return TRUE; } /* Double-checks the timing for a solution that has just been played * back. If the timing is off, and the cause of the discrepancy can be * reasonably ascertained to be benign, the timing will be corrected * and TRUE is returned. */ int checksolution(void) { int currenttime; if (!hassolution(state.game)) return FALSE; currenttime = state.currenttime + state.timeoffset; if (currenttime == state.game->besttime) return FALSE; warn("saved game has solution time of %d ticks, but replay took %d ticks", state.game->besttime, currenttime); if (state.game->besttime == state.currenttime) { warn("difference matches clock offset; fixing."); state.game->besttime = currenttime; return TRUE; } else if (currenttime - state.game->besttime == 1) { warn("difference matches pre-0.10.1 error; fixing."); state.game->besttime = currenttime; return TRUE; } warn("reason for difference unknown."); state.game->besttime = currenttime; return FALSE; } tworld-2.3.0/play.h000066400000000000000000000067451475511570500141730ustar00rootroot00000000000000/* play.h: Functions to drive game-play and manage the game state. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef HEADER_play_h_ #define HEADER_play_h_ #include "defs.h" /* The different modes of the program with respect to gameplay. */ enum { NormalPlay, EndPlay, SuspendPlay, SuspendPlayShuttered, NonrenderPlay }; /* TRUE if the program is running without a user interface. */ extern int batchmode; #ifdef __cplusplus extern "C" { #endif /* Change the current gameplay mode. This affects the running of the * timer and the handling of the keyboard. */ extern void setgameplaymode(int mode); /* Initialize the current state to the starting position of the * given level. */ extern int initgamestate(gamesetup *game, int ruleset); /* Set up the current state to play from its prerecorded solution. * FALSE is returned if no solution is available for playback. */ extern int prepareplayback(void); extern int setstepping(int stepping, int display); extern int changestepping(int delta, int display); extern void advanceinitrandomff(int display); /* Get a string representing the stepping and (in Lynx mode) initial random * force floor direction. */ extern char const *getinitstatestring(void); /* Return the amount of time passed in the current game, in seconds. */ extern int secondsplayed(void); /* Handle one tick of the game. cmd is the current keyboard command * supplied by the user, or CmdPreserve if any pending command is to * be retained. The return value is positive if the game was completed * successfully, negative if the game ended unsuccessfully, and zero * if the game remains in progress. */ extern int doturn(int cmd); /* Update the display during game play. If showframe is FALSE, then * nothing is actually displayed. */ extern int drawscreen(int showframe); /* Quit game play early. */ extern int quitgamestate(void); /* Free any resources associates with the current game state. */ extern int endgamestate(void); /* Free all persistent resources in the module. */ extern void shutdowngamestate(void); /* Initialize the current state to a small level used for display at * the completion of a series. */ extern void setenddisplay(void); /* Return TRUE if a solution exists for the given level. */ extern int hassolution(gamesetup const *game); /* Replace the user's solution with the just-executed solution if it * beats the existing solution for shortest time. FALSE is returned if * nothing was changed. */ extern int replacesolution(void); /* Delete the user's best solution for the current game. FALSE is * returned if no solution was present to delete. */ extern int deletesolution(void); /* Double-check the timing for a solution that has just been played * back. If the timing is incorrect, but the cause of the discrepancy * can be reasonably ascertained to be benign, the timings will be * corrected and the return value will be TRUE. */ extern int checksolution(void); /* Turn pedantic mode on. The ruleset will be slightly changed to be * as faithful as possible to the original source material. */ extern void setpedanticmode(void); /* Slow down the game clock by the given factor. Used for debugging * purposes. */ extern int setmudsuckingfactor(int mud); /* Toggle whether to show stepping/initial random force floor direction * during solution playback. */ extern void toggleshowinitstate(void); #ifdef __cplusplus } #endif #endif tworld-2.3.0/random.c000066400000000000000000000065751475511570500145020ustar00rootroot00000000000000/* random.c: The game's random-number generator. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ /* * This module is not here because I don't trust the C library's * random-number generator. (In fact, this module uses the linear * congruential generator, which is hardly impressive. But this isn't * strong cryptography; it's a game.) It is here simply because it is * necessary for the game to use the same generator FOREVER. In order * for playback of solutions to work correctly, the game must use the * same sequence of random numbers as when it was recorded. This would * fail if the playback occurred on a version compiled with a * different C library's generator. Thus, this module. */ #include #include #include "gen.h" #include "random.h" /* The most recently generated random number is stashed here, so that * it can provide the initial seed of the next PRNG. */ static unsigned long lastvalue = 0x80000000UL; /* The standard linear congruential random-number generator needs no * introduction. */ static unsigned long nextvalue(unsigned long value) { return ((value * 1103515245UL) + 12345UL) & 0x7FFFFFFFUL; } /* Move to the next pseudorandom number in the generator's series. */ static void nextrandom(prng *gen) { if (gen->shared) gen->value = lastvalue = nextvalue(lastvalue); else gen->value = nextvalue(gen->value); } /* Create a new PRNG, reset to the shared sequence. */ prng createprng(void) { prng gen; resetprng(&gen); return gen; } /* We start off a fresh series by taking the current time. A few * numbers are generated and discarded to work out any biases in the * seed value. */ void resetprng(prng *gen) { if (lastvalue > 0x7FFFFFFFUL) lastvalue = nextvalue(nextvalue(nextvalue(nextvalue(time(NULL))))); gen->value = gen->initial = lastvalue; gen->shared = TRUE; } /* Reset a PRNG to an independent sequence. */ void restartprng(prng *gen, unsigned long seed) { gen->value = gen->initial = seed & 0x7FFFFFFFUL; gen->shared = FALSE; } /* Use the top two bits to get a random number between 0 and 3. */ int random4(prng *gen) { nextrandom(gen); return gen->value >> 29; } /* Randomly select an element from a list of three values. */ int randomof3(prng *gen, int a, int b, int c) { int n; nextrandom(gen); n = (int)((3.0 * (gen->value & 0x3FFFFFFFUL)) / (double)0x40000000UL); return n < 2 ? n < 1 ? a : b : c; } /* Randomly permute a list of three values. Two random numbers are * used, with the ranges [0,1] and [0,1,2]. */ void randomp3(prng *gen, int *array) { int n, t; nextrandom(gen); n = gen->value >> 30; t = array[n]; array[n] = array[1]; array[1] = t; n = (int)((3.0 * (gen->value & 0x3FFFFFFFUL)) / (double)0x40000000UL); t = array[n]; array[n] = array[2]; array[2] = t; } /* Randomly permute a list of four values. Three random numbers are * used, with the ranges [0,1], [0,1,2], and [0,1,2,3]. */ void randomp4(prng *gen, int *array) { int n, t; nextrandom(gen); n = gen->value >> 30; t = array[n]; array[n] = array[1]; array[1] = t; n = (int)((3.0 * (gen->value & 0x0FFFFFFFUL)) / (double)0x10000000UL); t = array[n]; array[n] = array[2]; array[2] = t; n = (gen->value >> 28) & 3; t = array[n]; array[n] = array[3]; array[3] = t; } tworld-2.3.0/random.h000066400000000000000000000020611475511570500144710ustar00rootroot00000000000000/* random.h: The game's random-number generator. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_random_h_ #define HEADER_random_h_ #include "defs.h" /* Create a fresh PRNG. */ extern prng createprng(void); /* Mark an existing PRNG as beginning a new sequence. */ extern void resetprng(prng *gen); /* Restart an existing PRNG upon a predetermined sequence. */ extern void restartprng(prng *gen, unsigned long initial); /* Retrieve the original seed value of the current sequence. */ #define getinitialseed(gen) ((gen)->initial) /* Return a random integer between zero and three, inclusive. */ extern int random4(prng *gen); /* Randomly select one of the three integer arguments as the return * value. */ extern int randomof3(prng *gen, int a, int b, int c); /* Randomly permute an array of three integers. */ extern void randomp3(prng *gen, int *array); /* Randomly permute an array of four integers. */ extern void randomp4(prng *gen, int *array); #endif tworld-2.3.0/res.c000066400000000000000000000262051475511570500140030ustar00rootroot00000000000000/* res.c: Functions for loading resources from external files. * * Copyright (C) 2001-2014 by Brian Raiter and Eric Schmidt, under the GNU * General Public License. No warranty. See COPYING for details. */ #include #include #include #include "defs.h" #include "fileio.h" #include "err.h" #include "oshw.h" #include "messages.h" #include "unslist.h" #include "res.h" /* * The resource ID numbers */ #define RES_IMG_BASE 0 #define RES_IMG_TILES (RES_IMG_BASE + 0) #define RES_IMG_FONT (RES_IMG_BASE + 1) #define RES_IMG_LAST RES_IMG_FONT #define RES_CLR_BASE (RES_IMG_LAST + 1) #define RES_CLR_BKGND (RES_CLR_BASE + 0) #define RES_CLR_TEXT (RES_CLR_BASE + 1) #define RES_CLR_BOLD (RES_CLR_BASE + 2) #define RES_CLR_DIM (RES_CLR_BASE + 3) #define RES_CLR_LAST RES_CLR_DIM #define RES_TXT_BASE (RES_CLR_LAST + 1) #define RES_TXT_UNSLIST (RES_TXT_BASE + 0) #define RES_TXT_MESSAGE (RES_TXT_BASE + 1) #define RES_TXT_LAST RES_TXT_MESSAGE #define RES_SND_BASE (RES_TXT_LAST + 1) #define RES_SND_CHIP_LOSES (RES_SND_BASE + SND_CHIP_LOSES) #define RES_SND_CHIP_WINS (RES_SND_BASE + SND_CHIP_WINS) #define RES_SND_TIME_OUT (RES_SND_BASE + SND_TIME_OUT) #define RES_SND_TIME_LOW (RES_SND_BASE + SND_TIME_LOW) #define RES_SND_DEREZZ (RES_SND_BASE + SND_DEREZZ) #define RES_SND_CANT_MOVE (RES_SND_BASE + SND_CANT_MOVE) #define RES_SND_IC_COLLECTED (RES_SND_BASE + SND_IC_COLLECTED) #define RES_SND_ITEM_COLLECTED (RES_SND_BASE + SND_ITEM_COLLECTED) #define RES_SND_BOOTS_STOLEN (RES_SND_BASE + SND_BOOTS_STOLEN) #define RES_SND_TELEPORTING (RES_SND_BASE + SND_TELEPORTING) #define RES_SND_DOOR_OPENED (RES_SND_BASE + SND_DOOR_OPENED) #define RES_SND_SOCKET_OPENED (RES_SND_BASE + SND_SOCKET_OPENED) #define RES_SND_BUTTON_PUSHED (RES_SND_BASE + SND_BUTTON_PUSHED) #define RES_SND_TILE_EMPTIED (RES_SND_BASE + SND_TILE_EMPTIED) #define RES_SND_WALL_CREATED (RES_SND_BASE + SND_WALL_CREATED) #define RES_SND_TRAP_ENTERED (RES_SND_BASE + SND_TRAP_ENTERED) #define RES_SND_BOMB_EXPLODES (RES_SND_BASE + SND_BOMB_EXPLODES) #define RES_SND_WATER_SPLASH (RES_SND_BASE + SND_WATER_SPLASH) #define RES_SND_SKATING_TURN (RES_SND_BASE + SND_SKATING_TURN) #define RES_SND_BLOCK_MOVING (RES_SND_BASE + SND_BLOCK_MOVING) #define RES_SND_SKATING_FORWARD (RES_SND_BASE + SND_SKATING_FORWARD) #define RES_SND_SLIDING (RES_SND_BASE + SND_SLIDING) #define RES_SND_SLIDEWALKING (RES_SND_BASE + SND_SLIDEWALKING) #define RES_SND_ICEWALKING (RES_SND_BASE + SND_ICEWALKING) #define RES_SND_WATERWALKING (RES_SND_BASE + SND_WATERWALKING) #define RES_SND_FIREWALKING (RES_SND_BASE + SND_FIREWALKING) #define RES_SND_LAST RES_SND_FIREWALKING #define RES_COUNT (RES_SND_LAST + 1) /* Structure for enumerating the resource names. */ typedef struct rcitem { char const *name; int numeric; } rcitem; /* Union for storing the resource values. */ typedef union resourceitem { int num; char str[256]; } resourceitem; /* The complete list of resource names. */ static rcitem rclist[RES_COUNT] = { { "tileimages", FALSE }, { "font", FALSE }, { "backgroundcolor", FALSE }, { "textcolor", FALSE }, { "boldtextcolor", FALSE }, { "dimtextcolor", FALSE }, { "unsolvablelist", FALSE }, { "endmessages", FALSE }, { "chipdeathsound", FALSE }, { "levelcompletesound", FALSE }, { "chipdeathbytimesound", FALSE }, { "ticksound", FALSE }, { "derezzsound", FALSE }, { "blockedmovesound", FALSE }, { "pickupchipsound", FALSE }, { "pickuptoolsound", FALSE }, { "thiefsound", FALSE }, { "teleportsound", FALSE }, { "opendoorsound", FALSE }, { "socketsound", FALSE }, { "switchsound", FALSE }, { "tileemptiedsound", FALSE }, { "wallcreatedsound", FALSE }, { "trapenteredsound", FALSE }, { "bombsound", FALSE }, { "splashsound", FALSE }, { "blockmovingsound", FALSE }, { "skatingforwardsound", FALSE }, { "skatingturnsound", FALSE }, { "slidingsound", FALSE }, { "slidewalkingsound", FALSE }, { "icewalkingsound", FALSE }, { "waterwalkingsound", FALSE }, { "firewalkingsound", FALSE } }; /* The complete collection of resource values. */ static resourceitem allresources[Ruleset_Count][RES_COUNT]; /* The resource values for the current ruleset. */ static resourceitem *resources = NULL; /* The ruleset-independent resource values. */ static resourceitem *globalresources = allresources[Ruleset_None]; /* The active ruleset. */ static int currentruleset = Ruleset_None; /* The directory containing all the resource files. */ char *resdir = NULL; /* A few resources have non-empty default values. */ static void initresourcedefaults(void) { strcpy(allresources[Ruleset_None][RES_IMG_TILES].str, "tiles.bmp"); strcpy(allresources[Ruleset_None][RES_IMG_FONT].str, "font.bmp"); strcpy(allresources[Ruleset_None][RES_CLR_BKGND].str, "000000"); strcpy(allresources[Ruleset_None][RES_CLR_TEXT].str, "FFFFFF"); strcpy(allresources[Ruleset_None][RES_CLR_BOLD].str, "FFFF00"); strcpy(allresources[Ruleset_None][RES_CLR_DIM].str, "C0C0C0"); memcpy(&allresources[Ruleset_MS], globalresources, sizeof allresources[Ruleset_MS]); memcpy(&allresources[Ruleset_Lynx], globalresources, sizeof allresources[Ruleset_Lynx]); } /* Iterate through the lines of the rc file, storing the values in the * allresources array. Lines consisting only of whitespace, or with an * octothorpe as the first non-whitespace character, are skipped over. * Lines containing a ruleset in brackets introduce ruleset-specific * resource values. Ruleset-independent values are copied into each of * the ruleset-specific entries. FALSE is returned if the rc file * could not be opened. */ static int readrcfile(void) { resourceitem item; fileinfo file = {0}; char buf[256]; char name[256]; char *p; int ruleset; int lineno, i, j; if (!openfileindir(&file, resdir, "rc", "r", "can't open")) return FALSE; ruleset = Ruleset_None; for (lineno = 1 ; ; ++lineno) { i = sizeof buf - 1; if (!filegetline(&file, buf, &i, NULL)) break; for (p = buf ; isspace(*p) ; ++p) ; if (!*p || *p == '#') continue; if (sscanf(buf, "[%[^]]]", name) == 1) { for (p = name ; (*p = tolower(*p)) != '\0' ; ++p) ; if (!strcmp(name, "ms")) ruleset = Ruleset_MS; else if (!strcmp(name, "lynx")) ruleset = Ruleset_Lynx; else if (!strcmp(name, "all")) ruleset = Ruleset_None; else warn("rc:%d: syntax error", lineno); continue; } if (sscanf(buf, "%[^=]=%s", name, item.str) != 2) { warn("rc:%d: syntax error", lineno); continue; } for (p = name ; (*p = tolower(*p)) != '\0' ; ++p) ; for (i = sizeof rclist / sizeof *rclist - 1 ; i >= 0 ; --i) if (!strcmp(name, rclist[i].name)) break; if (i < 0) { warn("rc:%d: illegal resource name \"%s\"", lineno, name); continue; } if (rclist[i].numeric) { i = atoi(item.str); item.num = i; } allresources[ruleset][i] = item; if (ruleset == Ruleset_None) for (j = Ruleset_None ; j < Ruleset_Count ; ++j) allresources[j][i] = item; } fileclose(&file, NULL); return TRUE; } /* * Resource-loading functions */ /* Parse the color-definition resource values. */ static int loadcolors(void) { long bkgnd, text, bold, dim; char *end; bkgnd = strtol(resources[RES_CLR_BKGND].str, &end, 16); if (*end || bkgnd < 0 || bkgnd > 0xFFFFFF) { warn("rc: invalid color ID for background"); bkgnd = -1; } text = strtol(resources[RES_CLR_TEXT].str, &end, 16); if (*end || text < 0 || text > 0xFFFFFF) { warn("rc: invalid color ID for text"); text = -1; } bold = strtol(resources[RES_CLR_BOLD].str, &end, 16); if (*end || bold < 0 || bold > 0xFFFFFF) { warn("rc: invalid color ID for bold text"); bold = -1; } dim = strtol(resources[RES_CLR_DIM].str, &end, 16); if (*end || dim < 0 || dim > 0xFFFFFF) { warn("rc: invalid color ID for dim text"); dim = -1; } setcolors(bkgnd, text, bold, dim); return TRUE; } /* Attempt to load the tile images. */ static int loadimages(void) { char *path; int f; f = FALSE; path = getpathbuffer(); if (*resources[RES_IMG_TILES].str) { combinepath(path, resdir, resources[RES_IMG_TILES].str); f = loadtileset(path, TRUE); } if (!f && resources != globalresources && *globalresources[RES_IMG_TILES].str) { combinepath(path, resdir, globalresources[RES_IMG_TILES].str); f = loadtileset(path, TRUE); } free(path); if (!f) errmsg(resdir, "no valid tilesets found"); return f; } /* Load the font resource. */ static int loadfont(void) { char *path; int f; f = FALSE; path = getpathbuffer(); if (*resources[RES_IMG_FONT].str) { combinepath(path, resdir, resources[RES_IMG_FONT].str); f = loadfontfromfile(path, TRUE); } if (!f && resources != globalresources && *globalresources[RES_IMG_FONT].str) { combinepath(path, resdir, globalresources[RES_IMG_FONT].str); f = loadfontfromfile(path, TRUE); } free(path); if (!f) errmsg(resdir, "no valid font found"); return f; } /* Load the list of unsolvable levels. */ typedef int (*txtloader)(char const * fname); static int loadtxtresource(int resid, txtloader loadfunc) { char const *filename; if (*resources[resid].str) filename = resources[resid].str; else if (resources != globalresources && *globalresources[resid].str) filename = globalresources[resid].str; else return FALSE; return loadfunc(filename); } /* Load all of the sound resources. */ static int loadsounds(void) { char *path; int count; int n, f; path = getpathbuffer(); count = 0; for (n = 0 ; n < SND_COUNT ; ++n) { f = FALSE; if (*resources[RES_SND_BASE + n].str) { combinepath(path, resdir, resources[RES_SND_BASE + n].str); f = loadsfxfromfile(n, path); } if (!f && resources != globalresources && *globalresources[RES_SND_BASE + n].str) { combinepath(path, resdir, globalresources[RES_SND_BASE + n].str); f = loadsfxfromfile(n, path); } if (f) ++count; } free(path); return count; } /* Load all resources that are available. FALSE is returned if the * tile images could not be loaded. (Sounds are not required in order * to run, and by this point we should already have a valid font and * color scheme set.) */ int loadgameresources(int ruleset) { currentruleset = ruleset; resources = allresources[ruleset]; loadcolors(); loadfont(); if (!loadimages()) return FALSE; if (loadsounds() == 0) setaudiosystem(FALSE); return TRUE; } /* Parse the rc file and load the font and color scheme. FALSE is returned * if an error occurs. */ int initresources(void) { initresourcedefaults(); resources = allresources[Ruleset_None]; if (!readrcfile() || !loadcolors() || !loadfont()) return FALSE; loadtxtresource(RES_TXT_UNSLIST, loadunslistfromfile); loadtxtresource(RES_TXT_MESSAGE, loadmessagesfromfile); return TRUE; } /* Free all resources. */ void freeallresources(void) { int n; freefont(); freetileset(); clearunslist(); for (n = 0 ; n < SND_COUNT ; ++n) freesfx(n); } tworld-2.3.0/res.h000066400000000000000000000015451475511570500140100ustar00rootroot00000000000000/* res.h: Functions for loading resources from external files. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_res_h_ #define HEADER_res_h_ /* The directory containing all the resource files. */ extern char *resdir; /* Parse the rc file and initialize the resources that are needed at * the start of the program (i.e., the font and color settings). * FALSE is returned if the rc file contained errors or if a resource * could not be loaded. */ extern int initresources(void); /* Load all resources, using the settings for the given ruleset. FALSE * is returned if any critical resources could not be loaded. */ extern int loadgameresources(int ruleset); /* Release all memory allocated for the resources. */ extern void freeallresources(void); #endif tworld-2.3.0/res/000077500000000000000000000000001475511570500136325ustar00rootroot00000000000000tworld-2.3.0/res/atiles.bmp000066400000000000000000212301361475511570500156230ustar00rootroot00000000000000BM^0E6(j(0Eޭڨ٨ϨǨ٨樨Ԩծδ˲ᨨׯܪ˨γٲⶶѨΨߨܯ樨樨֨ѨݰèԨ娨稨بݨ訨㨨ϯ躺񸸸ݺꨨ騨֪ꨨཽ𳳳ª󨨨ݶըڨ娨ݨܨ鹹⨨֨¯޲򨨨Ũᨨضֺ뽽ߨٶѾǨܭҺϵپꮮרԾɨ𨨨䶶娨ۨȨdz﨨ߨè֯񯯯ܨר騨稨稨ٳͯ츸ᨨѿ﨨ۼǪ׶Ҩ׽䨨ިبب˿载ٸب򨨨㮮źѨ۳ǯ㨨ۨ˾Өͷ񨨨߸人˨ܺବ쨨ϵ쨨ܼͳۨ񻻻⽽⨨򨨨娨޸񸸸췷㾾רŨƶ箮⨨κスިݨ⨨רȨ쨨쨨ʨѨծ먨ʺ𨨨򨨨ҭ۶ŭ򨨨մ񱱱麺㨨Ѷ樨ߨۨϨ٨騨Ҩ¬иڨҾǼߨ󵵵_s\ovexvriRcUfzg}wP`uTeިezwjP`䨨z]pttnp_skbvUgptxnZmZmi𹹹vrbvP`uਨzezo]rnZmi~uowg}xg|tf|_rvtUgᴴg}P`_sTexWiszezzni~]pmexcwP`WisorTeUfworotRbۻzf{vmRcnxpf{ezzcwssP`ߨP`ezbvUgumoZmjtoZmtUfurtxn\oxf{uP`xcwtrRcttoRPPFuFgF`PukpZnFk}LsL}FpYw]]e\L25\bf}NwPLxcbcwjv_tRPP]gTTR_z_\_{TuRLmFkFFFkjjjom~F{FFnnopoou~iZnJHJUrwZRw``}sUFTu_s{}zrJouzL2Lzbbtf|NkLJJfbb{UfjtjZzLJJYuiirTfb}RRb{t\\t݀pjTsTvFxFFFFFijjs_RtFrFFFFmU\]uUeLrJHFHJo޲YZNFFZF"HFFLUx\\rUFFFFHr\\\NoYkP`cYjb}NuJFFR{c{cbxczg_jT{LJJJJk{jZ}RRPRWst]ZbwsjfgPfNNuFkJrFuFFFFFiikkӳȨHFvL~FFFFFnsLF{NR}JFFFHrvYPFFFFF;sUڼ]Z]UFFFFP{\]z|v_u`|`cL}HJc~{bug_t_sjRJJNRtfffiT~PUYspLbsc\`sroorp~~ffZnLFFFFFFFFFFFFkFFFFFHwwFFFmUUnFFFFJLwrJYWUZxkFFFFFFNYexZZ]\n;FFFFU~]`__cLHHHHHJYkfx]`gLJJNNNR_feegeRRPUWJNb`c`\`bnjffLFFFFFFFFFFFFFggmjiHFFFFkHHjmonTFFFFFF~omnsootUUtNFFFFFFsssusP`\bvcwZrFFFFP]xxxssupc_Wuf{bJHHHHHUcʦg]\__zJJNN]sfecWYg}U}RPUf}spb__b"URZ`romffi`]gn}{z|}t}fgLFFFFiFFFFFiiPPHFFikoRpJFFFHJno}WUUUFFFFLNWstjrv_ZoYYR\HpFFFFNPR\_`_UUUYZ~FFFHHHTYZpYxf]\\\PPPRLvLJHHLNNP_\eBDUURRJ|HHHPPUUWgezo_]YYZRRPPPYY_mef]\\fpogeeFFFFFFNeegkjH_WiimFFFFHiiijnzg}pFU}wc{HFF=opsTYvF}FFFFLWtttYFkHnuj|ZYPumRFFFFP\zz]kJLrc_WUJJFFFFFFHTUberFrFNkg]\PNNJFFFHLLN\Y\fcUWTPPHFFFNTWpevso_YWYYPNPW]_p{{{|rgeece\\ejk}vtponozzzzet~LFFFFrefL{FrFoFcfmLrLpU|UwWejNNNP}FFFFFFNjUfFb;FPFFFFFFFNFFFFcP`WtiTLnLLFFFJJJLTYYYWP{FFFFTpbw]YYRPPPPFFFFFFFNNPZ\]]]FFHJW`_UUJHHFFFFFFFFTTUWcNrLLLNJm{f\NN=@HHHFFFFLLLN\__`YWYeUTTPNNN@HFFLNNRTTUcffRRRfcZYWWWWWWWWWWW]_WWbi\\ccccccej٨njfPLJFFeeFFFFFFT{T|RTniLFFFFFFJBjsFFZgFcYsoPHFFFFFFFFFF}oFFFFFP|mxxULLspFFFFHJJLUWWWxFFFFFbp|ZYPFFFFFFFFFNPZZZ\]FFFHTb_UHHHFFFFFFFFFHTWWWWZUfLJLTg\NLFFHFFFFFFLN\]]FF_oYY]nP`YUNNN@@LLLRTceHHHHJetZWWWWUUU\]mnUU`r`\ZZbcccciijz|nosonmnwxx~~~ie\bNFHJHFFFFFFFFRPPPgwPPFj}FFF.FJBHYkP`FFFFFFFW~UF{YzP`PHN;FP`FFFFFFFFFF"FFFFFFNP}\{\{Jk\WTLJFFF}FHHJJTTUUUPFFFP]bvZYPPNFFFFFFFFLNNNPPPPPPTFuFRRRJFWb`WUJHHFFFFFFFFFFFFRTTUUUUUWZ}\LNPNNLHLLLLJFFFFFJFJLLNZZNFFFF\\_umZZ|p稱ZPNNNNNRNRRLLLLLLRRRTUULHHHHHW򶶶ZPPWW_YUUUUUZ\\jeU_`rn]ZZZcbcijniLkFFFFRFFFFFFFFFFRHFTiFFFFF稸F=oFFFFFFFRFLTk{]pr\oxxR\NFuFFFFFFFFFFFFFFFFFFNJYmm\oLLJP]FFFFFFFHHFFFJJFLuFFFRT_PFFPTJFFFFFFLLNNNFNPRFoUR\FBUYZJHFFPf`+.FFFFFFFFRTFFFTURm\ZcfjP`RNHHHHRtjWJJJFFFFFFFFFFFF\_pn\{j|PNNNZbwRPPPRRTNHFFHUefPNNWgnUUZZZijveo``s˨f\ZZpmbciiix~sjmmwwx~~~}||ieJP~FFFFF~jFFFFFFFFHFFHRf}kPNFFTFFFFF]pFFFFFFFJFJUYoTzF|‹tWFFFFFFFFFFFFFFFHHHJZx{xJFF_tfFFFFFFFHHFFFJ'FFNFFPJL_FFFFmviUFFFFJFFLLLFFFFNNNPLr_UNTTTWYJHFFFUwweUFFFFFFFFRFFFFFFTTUWLp`x\eZTf{iPHHHFWgwzcJJJJNTJFJFFFFFFZ\`f\PNNNY`uxPPPPW]g_RWWRNPccfRPNNNox}{ZZZn]ZY`g}sbikmifFFf|FFF}}FFFFFFFFFFHTNf{nFzzFFLFFFFFFFFJLTJHFU\_gnmYFFFFFFFFFFFNPn]JFFF{eeinncFHHFFFJLYߨJJJmFFFFHv_cgkbNFFFFFNHnb_kPYo_HFFFFj5È}m_TNWgofLFFFFFTTTWm}{WYT]JHHFHbrec|jNJJU_c`HHFHJ\ZZ\iwff|\ncPHFN_{\P`s_iYeccfZPN]wZZgggsvxnorfZYetgvuuuw}~vji"}~zJFForn}{FFΨFFFFFFFFRP}]puڊw{FFNHFFFFFFFRHFF`twvx{|zmFFHFFFFFFNZLFF8wtstvwvnRFFFJJJJLN2HmFJJ]JFF`Ҏno|~wj]LFFNNNNNNPRT~TjTeNPRTe}HFFFYm.wjcn}zw_RF]UUTTTTYb|WpNHFFZfukcUYntwNNNJZZZ\kg_PHFUcnx~sT]]egncsvYWPNPY`u}ZfrnmYZcvtui'iFFFP`|@fJFFFFFFFFF]mFFFbvoFF󸸸FFFFFFFFFY{RHFzs}}z]FP`NHJFFFFWFFFFFxxwuvwxucHRJNR{k{m]HFFi}xuotzunWuWNPT2JPsRcNFFFFbn_o_N\{|]TWYDN_`檸gNHFF_gu{j`U]PZZ_jvbPHFZfr|~\\\eieccr]PNUg}ffefronorjZ_nutsss~zjn|NP~FFf{mm{nt~HHHFFFFFFFFR}PFJFFFǨrJFFFFFFFFWHFWi¬}nFNrNNHFFWFFJxxubcwUTRLLLLFRTwsFFFFmxwuojv{}vUWWNPNDTHwYpw_NFFFFbocYcWZTTTUWWYNokzkDNHFFZiu}mT\\_Z\_HFPgp~uZZZeeccfWPNL`g~n{eccncYis{kzFFijFrg}H{~f|HHFFFFFTuonFkp"UftF_sJJL|P`FFFF`xFf{o`۬}}f|~NNHJFH{g|Y|P`FF_zxxuwpinxjRJLNFwFzFs`oHFFFFuvvnkbRrtnYWNRRTxgvZHFJFNogvUUw}}P`]TUWZs;RHFiurktRYZfZ\_񵵵k]LLbiYWbfeWfstWLeƇcb``ooorkZWwronns~}nkwutuzFFFFLLFvFLuZ`tP`5sHHrFFR~FkFuF5z|~wǾJP`i~FNFvFn{o;gNRwPNNNFcwHHfWTuFFJkxvo`\ZLjwRJJJLLNPmFFFF+jtLLNoYPcxP`NPPPRUz`vZm_LF;FFpnf~vgJRPRUrTTTUWYLHFWusrozUNNNNZo_sZNNP\]_bPNLLgvvwWTTT`UWWPNL}|`]]]```rZYYx_\\\npmwpt򨨧FFFFFFFFF訰.FD`P`HPFFFFF]{{TF28ZmvLPZmUTFrFtFHw}|rbW+FFuN~FF_sHbYwY|H{ntxwFFHJmUJ'JJJL`tvWiܨ`jw`HFFFFsTHJNpPzcwNNP.Txf~]NHFFFrruFFFFFU}HHHP`Ws]scHFFFnvspLJJJNZkNNN\_f{ZobNLJvt~RPR`{cwUUekUT_NLLL`਩_i~_`egb`]ܨWYnnoomxsg}t~xZwNFFFFFFvPJNvRPHFFFFLFFFFiwزJFFJLLtJb\RRPFWFFwL~FFuHf}PPWFWzUFFuzxwFFFFJsJH;;JLZnsbFFFFtrTFFFFFFFFFNNP;R]_JHFFFoor~gFFFFFFHRFFFoTTUWzucNLJJPssp\HFFFFFL\YLLLLNN\zi]PLLL~utFFFFFFFFcmPPPTTUUWfvf{ZUTTbLHHHLNbY~Yk__mYke`u{YPPTgvUxiegWiNFFFFJF5HFZJLmugNFFӨNFFFYf|Nnoo稨`FiLLPT5DHFFF{sRUF~FFFFFFFHPU\rFHcxxgJUFFFFFFrFwkJL\o\vN\nbxuRFFFFFFFvNHFFFFFNPjjtbFFFxoFFFFFFFFJkTmTHFFFFHTTWRrJJR]FFFFFFFneTFFFLLt\URnHFFFFFFJoos]PNNTU_]U_JFFFFJNkTYY]`zg~r~c`cPLLR\ofzgxi|vunc`biz}{ur`uzmf{ZxLJFFFJHbWFFF{ujbJLLNfZ\p\jpHHFZUFF~LLPR\pŨRJPPR2F'R}UWsk\FFHWjPPUUWHHfci_}xFFFFFFFFFFJJLwr'PLz\RPFFFFFFFHJFFFFFFFrTePPRvY|RPrٺFFFFFFFFNNHFFFFFFFTTUp\LJ\ZRFFFFFFFLNJJFFFFFLLNkZTRPxjHFF}FFFFFF}\]LLLFFLNTTTuZnt\Zv\HFFFFFFFHJPvWWRNPWWY_mbsobPNJHHJFJLPx_o\fu_WWZ`uf{oLJJFLwHcgLbF~}tHJJJLfNNL2oFFHuNfZHF|LNNPnRR`䨨~skFFFF'YFmPRRWH薲euΛ._cYFxFFFFFRWHFFF+LLNҨ\NLzFFFnTfFFFFFFFFFF+wNPPjsxUPgFFFFFFFFFFFFFFFFFFbvT{YJxPF|FFFFFFFFHHFFFFFFFLLNg~P`sRx`FFFFFFFFFFFFJJJHFFFNNTU{Wi`Z}}mWFFFFFFFFFFPRTPJNW]enbuj`~w_LJHHFFHNbY]fpwu|m`UW\c'z{~{w{zPrLJJJNZmfFW}tcHJJJJFFPNY]oD5=BgBFF]HzueLL8xNNP\RRi~Pj~zFFFWRFxZzgPJJWW=W~RHsrFFFFFFFLi`WHBDFJ._JLLt5YLL{fFFFFx`tFFFFFFFFFF'NNPPTRgzUFFFFcxFFFFFFFFFFFFFwUWkWkFFFFFFFFFFFFFFFFFFFFFLLB=g}cTRfTFFFFFFFFFFFFFFHHJFFFFNNTTYZ]YubPHFFFFFFFFFFFPPRNNPPJLPZ\c{rg`cTLJHHJFHJNP_bbo`ue_WYZ`++LJLTZbsvۨ}sbHJJJFFFWYn"FL+FZ~ntcLxwFFHRR'|k}FFP`FpzoWF`uvPJTN{{vpFFFFFfg`UFFJU]JL++NLsmPFFFFFFFFFFNFFFFFFNPR}bFFFFFFvFFFFFFFFFFFFFHUtz\W\sTFFFFFF_sP`FFFFFFFFFFFFLxnT\`P}rYFFFFFFFFFFFFFFFHFFFFFRY``vsr\mwUJFFFFFFFFFFFHJNPJP\]jkgn]RJJLHJLNR]copxxu~uoc_b_ew{}|z|LLLLUUYx=FFF{_sr_HJJFFFPPYYY\zsus_rxDs`LLLNFFTTUwN.2zoT}RFFxjFnD+TFFFFFP`PJJJJN`uRH{z2xzWJFFFF]f]TFFFJJLLZWLRv{n]HFFFFFFFFFFFFFFFFNP]RPgvcPFFFFFFFFFFFFFFFFFFHJYWJk}iWFFFFFzkFFFFFFFFFFFHLRRTU\䶸]s_R\xnYLFFFFFFYmFFFFFFFFFFFFRRYYr\oZY~t`UHHFFFFFFFFFFJHHJJHJLR`b`fke]TNNPRLNNPRRWbpuwcmpzez\nLLLLcjFpLJFxsR`cwFFHHJJFPP}gLFZ_}FFFYmFFLLFw_Uv_nkN}jik|{PFFFFH.FFFri~JJJwsHiwJ5fxxwWFkFFFWNFFFFFFLLLP`{WFvvvtwtrrmTFFFFFFFFFFFFF~TPxmkkeHFFFFFFFFFFFFFFHNfYc~pcbc\FFFFFFFFFFFFFFHPRU\txcRi|zr`ZYZPFFvP`FFFFFFFFFFFRYv\ob|]Zu\UUYHJFFFFFFHHJHJPbc\ex}ifob]ejpRTYWers_svtxspnjorx~rP`|{}rtrnLLLFFFHJJpFf}FFWi}FJJJJJFPPF~˪FLe|"jf쨨wFzsF\nNN_J|JPPPPPNFx}sgk}}FFFFFFFHHPPJJ\eWUUUUUFUxgswHWFxxwktFFFFFFFFLLLtgN]zZYWFftvvvtitttttjZnFFFFFFFFFFFF_RF}rrr{ooooeFFFFFFFFFFFFHNNڨi\LUzojji\FFFFFFFFFFFFHRTUU`R`x~}}|wpki`PFFFFFFFFFFFFNPUbP`ccx\WkxsmfzprFFFHHJHHLLNPce{xux~TTPRWY]}P`kug}LLFFFbrLFv_sbuiFFLJJJLF}FF`8F|FNkNeFHNNFFebuFF}fFFF`RNFLRTFFxcvzkFFFFxwiFFFFPUPiWWYFRttvvvs]FHJttx`tFFFFFFFFFFLuT|\nZW]_]Fbrrrrrk\FFooiLFFFFFFFFFHJU`ffZFFzbtjmcJFFFFFFFFHHUkppm`FYw}}}}}|z`FFFHHJFFFNRfrrw~{m\H\wsrPHHHJJJLNZw{jkgsDBTeUUTUW]wr~v}}LFFFFkoFtxvtFFFNzfLLJLFFFWxFFFL΁N]xnHF֨PNNNNJ}wFFWNNFFFFnFF}zeF]JFHNZTRRN|LFFFFZLRRTFoxFFFHxxmFFHJLgYWWYRFFzmPPPWWYFFmtvvvuiJLPtpLJJLLFFFs}Rc\\WPJTUU]]FFtrrrrpiZcokf{FFFFFHHLr_zzYkcZkW]\\\eZF`kjfYriZFFFHJJLNPwgecFFp|}}}}t`HHHJJLLNNPT{mHWj|tRRRRTTLNWYZf|سjNex|tuWUWWYZ\]ppgsbuLFFFLFFPnFFFLLLLFFJc@FFFFzFށ{cuP`JJFR|NNFFFFFJ`FFFFFFFpHFF}oTuJwTRoFFrrFJFJLFFFFczpsbFFHJxvFW@HHJzZwWY+FFFFFPYFFFFoxvvteNtzJJJLLLRp]\WNHFHTU_FF]wrrpjTopNPRHJLv`tb\TZ\eFFpmkkc\oHHJJN]{~tbWccnkFUv|}}}}}cNNPTWgbopxkJ_nx}RRWZv|jYj~``beg~vmnouf{pZkf{N~NNFFFFg}~|HFFFFFuN|NNNRFFFFFFFFFFF_~LFJP`NFRRRFFFFFFFFFF}}}rFnP`]~LgTTUpFitFFFFFFFFFFFnw{xxxxwYR5HJJLN{vZYY+FFFFFFPPFFeuvtPtutJJ樨LLLNNR|Rb]WTxFFHTTU]`FFFUuTUnPPPRRTUYe]TRNNZZfeFFFmkjxuwP`JJJJLLNPscZ@UbekFFYsz|}}}RPNPPRRTUv\omc`kFR_m}YWYY\_TN\o|``f~kzZmPxP}iFFFFF{g}FFFFFsm|FFF`FHF'FFtDcFFurP`FFFFFFFרFrFFFe}}}FFFFFuxRcNpu~FFFFFFFFFFFFFwxxxHHHHJJpP`zLZFFFFFFFYNFFptttttrLLJRLLNj݁`ukFFFFJU~TFFFFLwrsv\PPRU_rf|ZRJNZ]fFFFPn{xUJJJJZ`U@@coocFFTbkptw{}o]pPPRTgz`u__`ozwLFN\ix~|niYYZ\bg}g}sn{Z\wf`bcmn|~vw~jNuFFFFFFFFkcxcwFrHFFFFF`PFFz|FR~2LrsFLvFFgYtJFNzHo2@ҨNFPu`wFFNNPRFxRmNFFFFRR\RFwRJF_twwFHHHHHJJRzg|{P`HTFFFFFJzW~WwNwNF}FbpstpJFLLLLLLNkPFFFFFHp]FFFFnvvrFRPPRRRRTTbogTTJJJP]fZFFUbnvxwniYJJJJLL]_tZUUWcFFW`ceov`wiPPPRRT__okNHT\``b`vYYZZ\_tmZYr{~i``kjP`t}vmFFFcFmHusFFFFFFTTiF~FpFFgg}F5wLLFFWWsF}FFTWoPwgFNPw_rFLN\WFFYjtUTRcrmFFFHJW@JvsiFFT`frxYWF_mmLJFLLNNZ||g}TeݨFFF]]TFFWfcLFFRRTWuuTFLNtfZFFLWfccJLLN\{P`bRWspk`NFPZ]jRRRRUr騨`ZTo~}wkNLNtstZZZ]bmn{iT_wg`bem{Wiws}~vvx|goL~~zzkFtJJJ~xFFFFFFRP~Nx{UFFFL]rLT~FFRTeJvHUYT}RRRjFFFH{PPvpJJLN\NtZUUUTTTTcNFFFFJiUYHYjTU`\YWY]TFFFPNNNPY_sp\pbLt\e`]\LTTPPHHHTTTTUW`s`tR}HnPpfcbLkeTNLLLLNZ]fcLoN]m``okTTRRRTTTUe|cwb=k]j\Z\\_jtPbbbcN~ccFTJtoPFFFFFFFPrfFFF+LtFFFRTJo\oRjFFFDPm`tFFFJJNm\UUFFFFFFJwLT}bwFRcu\ZYYFFFFF\PPY]NNkcxfib]\]FFJsNJzUUW\zspfcbceP{RNZ\gUiun~rmbbjkmWTTUcfuexzmjkttum]\]_oez"|xxxx{z\ocefn~xxz|NeFFLJFFFFFFFFFFvPPPFFF_NLLFFFFFFFYnsxRRFFFFFF|RPFFFLWYbrbnUUUrtpFFFFFTTTzFxYkPPRTZYYYZFFFFFRb}PPPRZFLLN`c~_]]_FFFYfUUU_wUtWptP`rfcZ~n\}]\\\wtmjbWWWcmmvb{__`xjmxpLJFHHxnfJFFFFFF吟H~vèUvNLFFFFFFH}~pFFFRkU`P";FFFFFY_tWFFFgu{UTLFFPR_xZFFFFFbUvPNc_]_FFJUUWU{k|f|WjҮecefNpm]\]irkkmzYceprP`ezYkrmmuxb`o{}zz{sno}mPsLJF''DFNtgNJFFFFFFJLRNH+uwHxtmiNFFFFFFUJHpR.HFFFFFLx_vYJ\FirRcWTLLFFFFPRTUtsZFFFFLpPPvmWgx_FFPeYUUUU}x}oeefn\\]mmfcevze{nc~g}xLFFTzmYzgnFFFFJJJJLNFFFFFFFFHP`LzZmLsLtr풨bwp;HHFFFFe''uLFFF_]YP_pRPFFFFYe`}H}HmivWUWLF|{jef`\\gcommoecfpnvwrno{\o}{{pPvLFFTFoeFFFJJJJJJLNTzPHFYoUF~FFFNNNNPULJTtTuoJHHHHJuiPULFFFFH\~\ZRRFFHJFRsuWWNJoP`prg\]xwncwppsTfxcw\eFoYxifFFFJJJJJLN\ZfRf}m`vivFFNNNNLLn~Ww]pvbvsrmRJHJJJtr}]us_}}xRFJJJLWwgը]Upoexw{b𨱲}}~WnTNxifFFFJJJJJLLNNRkUTpxPvktRHFFNNNNNNNPUunUwUZoJJJJJRRTZwZ]YWNNfz\TRLncWWPNP|bou_UUWf|Zm]gۭY\P{FFFLLLLNikFHHNNNPRjUUrnJJJRRTpZYL5vssWWZNrbgp}xw\Tozc`WPRnjUWvr_i}iiuZYN}LLFNNNNNNNg\g}~DHHPPPPPPPPRRZWWnJRRRTTx{\Z\8sgYWNNNNPPn`vbbb]s]\ZTRT`YRRRjWW]jp_fYkpggNNYjjjij}mPRRRRRT|_nzexpLuTTTTvw]\tmYNNWWzcxx`bg}x\ZRTgob``YigY]{trtr`gwYkpswcwxjwRb樨zcxZnbuP`tjrsrkmtcxi~P`P`ݨexP`ji~P`zz\oxnz_sumP`f|g|ZmxcxZntscxtZmzP`wxnn]rwoums丸Ufwiung|ng}vrvopsoo]p]ptvZmRcpum`upZnwP`vrP`vmwbutuP`of{xkntsP`ntP`P`oTeP`xmpxmx]ppsxezopTeiubvxezwwxg}rjP`騨rzUfp]pwcx\ownP`mpwji~Yjzkg}P`z_snvYkP`zg|ti~wj''ј͖לҙј㥥ﮮߢ{{FFppss;;ccoo{{ࣣ{{WWϗ{{||""ZZ``ᤤΖNN姧==..UU⥥稨㦦++{{˔;;ϗccΗ||RR稨++{{DD{{Ȓ;;ppcc{{ss穩LL槧22..Ïﯯ\\ZZᤤҙࣣ||{{NN{{''RR뫫{{骪ꫫ쬬xxtt쭭̕Ǒ;;55ߣܠ՜vvRRFF||񯯨{{槧ǐ88ߣҙޢ__..Ȓ{{ᤤ񯯨{{DD姧姧˔姧Ηޢј䦦묬՜JJܠﮮ{{BB樨}}䦦ꪪԚ詩..zzŽٞ˔ii姧RRϗ骪ЗȒLLʓם''姧穩{{{{]]{{{{FF򱱨ݡ""PPLLܠל~~{{""cc..ٞ{{䦦ܠPP͖ݡŐ22ﮮďܠDD쬬]]骪++{{˔{{З⤤묬Ɛ槧\\ٞff""++bbɒ骪ϗ骪Ԛܠ槧Ő;;BBם{{Žҙﯯ쬬۠{{͕{{㥥לFFꪪ詩ꪪ}}{{㥥򰰨{{ꪪ۠뫫DD~~˔۠ii쬬UU~~Ï{{..;;ם==;;{{֜㥥''++姧..{{ߣ++̕񰰩..͕HH򰰯UUߢڟ{{З{{說{{לǑ22Η..~~樨骪јTTWW88ppߢ՜󱱽""@@FFZZ||ee{{UU姧䦦YYꫫ⥥֜ʓ؝樨穩88쬬񯯵묬{{~~ﮮꪪ˔⥥88ɒ۠{{""RRNN骪..לत''쬬ڟɒ묬~~++LLccHH㦦˔ƐLL++ǐ"";;ɒל``ڟǐࣣᤤ㥥{{++ꪪ{{묬WW쬬""bbʓ{{̕ҙӚݡďjjިwwԛ..姧ࣣ==ݡ͕ss22ڟ{{ᤤ{{55{{姧..{{ȒЗᤤٞϗ骪WWYYɒPP뫫iiŐݡ..FF{{''姧稨{{ҙ묬۠穩ߢRRҙ骪LL{{225522ј""{{ꫫ{{詩Ǒ{{ǐ穩iitt""ҙΖ++22BB槧DD䧧{{ﯯJJ''䦦@@͖ʓ̕묬ZZ55骪Ǻ䧧說ff{{5522UUǑ''NN穩HH{{묬쭭ooڟ骪јﯯЗ{{==HHҙٞﮮHH''ٞ䧧..ϗŐܠ䧧@@Ӛȑ򰰨㥥۠RRٞ22PP++]]詩˔||==՜򰰸ל__++++BB{{55ݡPP؝⥥TTPP}}֜88詩ם""eeFF@@՜ÏםzzԚssߣ""ooŐ{{@@DD󱱨HH88JJkkuu{{ݡ֜NN++FF;;Η͖묬؝22{{ccﮮ""姧TT槧vv֜ҙLL{{ﯯvvDD{{說..ccतᤤ++ꪪ說骪ҙᤤHHᤤ˔詩˔{{՜++++ܠڟ姧ߢ@@~~ꪪޢ''''ٞcc˔⤤Ï@@ܠBBܠלҙ詩++Ï@@UUјNN++WW\\YY֜֜לkk՜++zz؝֜..ȒǑ{{ᤤ֜Ǒ{{۠ꫫUU骪;;ttPPTT묬ꪪ55LL;;ם++ݡTTࣣۨם~~֜{{++""ܠ22樨ﯯ槧ww22ᤤ{{Ž䧧22뫫..ʓ~~''55͖RR򰰨{{ԚǐJJBB骪NN뫫ꪪΗ{{55ݡ{{̕..詩""==ﮮ̕稨۠ϗ]]ʓ{{88ם՜ࣣ~~ꫫܠȑ}}{{HH22穩ﯯŐ{{]]槧ҙߣꪪ՛ԛ==""{{ٞ''PPrrHH{{JJ++jjʓ䦦''ǐ||՛֜{{ݡ؝88㥥DD⥥{{..쬬{{..姧՛''""֜{{樨䧧DD̕TT稨..לďmmﯯNNnnΗUU~~rrFF說22ߢpp..Ɛ՛јԛ{{͖ΖRRߢ++㦦՛ݡߣ++PP22DD骪⤤ggBBѾ``穩骪==ꫫ򱱨{{ﮮ~~姧詩TTꫫ{{''BB22뫫ݡ..ԚҙÏ뫫{{֜{{{{''ߢ{{㥥姧樨⤤iiFF؝ᤤΗ||RR䦦㦦ﮮ++;;88YYܠRRFF{{gg88ܠŐnn۠TTNNٞ{{ggmm˔2288ꫫࣣLLࣣpp++骪ʓNN{{""""ﮮÎ䦦TTᤤ՜++ߢ""{{ܠԚ֜ÏΗٞɒ񯯨{{HH@@ݡttﮮ""묬՛NNFFHH""֜RRƐﮮ\\묬Ǒ詩ᤤ{{ϗ쬬}}++TT''{{詩͖ݡŐ{{ٞ==ꫫ{{BB{{؝ȑ؝穩ܠ⥥""ɒFF@@ooꪪ""22ŽTTÏ{{..{{ל{{۠""++{{BB==JJםȒÎ{{㦦zz{{ʓ]]++ߣӚ{{̕22۠BBȑ''vvɒꪪ{{;;ZZڟ22oo==ј뫫םݡڟJJ..88PP@@||""䧧۠==ď۠22''++⥥""''ࣣ++''Ő{{@@||Î__ߣ..ٞ稨ᤤ姧..mm뫫""ל⤤{{ȑ뫫骪""ʓDDﯯޢ{{֜ҙﯯ}}ﮮ""뫫8888ɒ""ݡnnFFff詩{{ss}}⥥̕PP22Ǒ==++WW穩{{稨{{ڟӚbb詩Ő++22䧧YY""{{gg{{""==''@@''ٞ槧뫫Ő..骪ᤤ뫫""姧{{ܠ묬तbbݡ詩@@⤤BBssjj姧ᤤڟ{{۠쬬Ӛל..쬬WWbbј{{22骪穩؝''ϗ穩P"P"P"A]]\YYYYYYYYYYYY]]\YYY"|xz"|xz"|xz{xzt{rf\YYYYYYYcpg\YYoxkbYYvtn`ZYYYYt{rf\YYIJ"zj_cYi_znzIJ"zj_cYi_znzIJ"zj_cYi_znx~rj_cYi_znyYY\\YYYYY\\YYYYYYcwwi]YYwfbZYYYi~|o\Y~rbYY}|mYYYYYcwwi]YYμPǴısj2BB=885D@"YPi_wμPǴısj2BB=885D@"YPi_zμPǴısj2BB=885D@"YPi]~r~2`Y.==;852D@"YPi_uP""P"u1}P"}P"u1}_wsj{zp`YYYY_wsj{zp`YYYYxrjkmu}|zmY{kgcfnwweYYYZYYYZi|mZYpYxrjkmu}|zmYͺ"˷ɶB\\\\\\TTT@@@D@"bYsͺ"˷ɶB\\\\\\TTT@@@D@"cY|ͺ"˷ɶB\\\\\\TTT@@@D@"]Toeui}}{i`5LLLNNNHHH;;;D@"bYs}"|tPNE|xz"|xtv|}wsuy"|x~txmpf970"|xtv|}wsuy~zfYYYYYY~zfYYYYYYvjijt}_rf\_cowpYYtpswYYi{Yvjijt}_ϼϻκmj`jjjiiibbbTTT885`W{o|ϼϻκmj`jjjiiibbbTTT885j_ϼϻκmj`jjjiiibbbTTT882YP\RcZvuuNNFUUUUUUPPPFFF552f\wIJ"zj_cYg]oeodxj_cYi_znzIJ"zj_cYi_znuzntutsgf\bYi_znzIJ"zj_cYi_xmtui_bYeZj_i_IJ"zj_cYi_znuzntutsgf\bYi_znzpbYYYYYYYpbYYYYYYY{k]`fs|Yvm\YY_mx{r\Ytmjkv\kiotZ{k]`fs|YҾӾԿtrguuuiiiYYY==;YPj`|oҾӾԿroerrriii\\\BB=zҾӾԿtrguuufffNNN222WNYPYPwkujvj888@@@jjjTTTJJJ;;8ti}μPǴısj2B@=882D@"YP]Uj_9ne2BB=885D@"YPi_zμPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_zμPǴısj2BB=885D@"YPcZoc?g_+88252.D@"YP]TcZμPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_z{riZYYYYY{riZYYYYYvnku{Ywi]ck}riYocgnzYvnnsbvnku{Y.'8`rrrttteeeRRR88.YPYPdZ.'8pkT\\\___eee\\\ne2".'8`rrrtttggg\\\FFF=8+bYaYUMYP@=.;;;;;;===JJJHHHYR+t|ͺ"˷ɶB\\\WWWLLL;;;D@"ZPcZe\y}zjc@\\\\\\TTT@@@D@"cY|ͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{ͺ"˷ɶB\\\\\\TTT@@@D@"YPYPXOpg2BBB@@@;;;222D@"YPYPUMͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{ujYYYYYYYYujYYYY}mYvrbY{~YtpufY}mYHZe`kkkiii\\\@@@NHYPE>FôTZZZ\\\UUUDDDjc@NHZe`trgkkkfffYYYBBB]U"si+D@'888;;;;;;888==8ZU2tuvu1ϼϻκmj`fff___TTTDDD55.YP\T_Uvkj`NJ.DDDeeeiiibbbTTT885j_ϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_ϼϻκmj`jjjiiibbbTTTBBBD@+TJYPHH@@@@;;;222...22.YPYPYPϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_xmZYYYr}uiYYr}uiYYxmZYYY}um`YYo}tpeYY|fYYoYY}um`YYcfZ8WkkkcccNNN@=+`V]}W\\\ZZZPPPNJ.{cfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ottҾӾԿroejjj]]]===...22.YPYPYP(((FD2DDDPPPUUU___iii\\\BB=zҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;sҾӾԿtrguuuiiiggg```UUUDDD@=.~~sB@;............22.YPYPYPҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;s{o\YYmuZYmuZY{o\YYre\YYYwpj`YYYtk_YY|x|p`YYre\YYYH'ų.kkkgggZZZ===~yfZZZ\\\WWWDDDj`~H'Ӿ˸|wejjjbbbRRR777............85.WNYP\Rsgzn.'8Z\\\HHH;;;...B='YPYP;;;HHHPPPWWWZZZ\\\\\\rrrjjj\\\sj2.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y..'8`rrruuummmrrrooojjjcccYYYJJJ999000sxnvkNH+............D@"YPYPUM.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y.{wn]Yw]Yw]Y{wn]Yr_YYYYwkZYYYYt_YYYY|xvztfbYYr_YYYY.Ҿ]jjj```LLL555WWW\\\ZZZPPPFD2vkz9.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWPHZ]PLH8PJULYPYPYPUMA;---<<>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5AHZe`trgnkb}xgrrrrrroookkkeee\\\NNN<<<999MG*]T]UYPYPULNHB='B='YPYPYPE>HZe`trgkkknnnjjj```RRR:::>>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5AweYYwYYwYYweYYzi\YYYYkZYYYYYYj\YYYY]~v}vp`YYzi\YYYYkkkfffWWW888AAAYYY\\\WWWHHH(((kkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... eJwmmbpeocj_cY\TYPYP=6000===HHHPPPWWW\\\\\\\\\ZZZ}WôT8Կκɶı"fZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{fZ8Կκɶ;`ppprrrpppmmmfff___RRR@@@<<<dZmbpeocj_cY\TYPYPYPYPYPUMfZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{}jYYiYiY}jYYs_YYYYzn]ZZ\YYYY}cYYYYYY_cnwuuzugbYYs_YYYYiiijjj___HHH999SSS\\\\\\RRR;;;jjjiiiib8t}~ztujg]\TYPYPLF...)))=t}~ztujg]\TYPYPOG///===HHHNNNUUUWWW\\\\\\YYYWWW]F'Ӿϻ˷ǴIJ"cH'Ӿϻ˷RnnnmmmfffZZZDDDbZ!t}~ztujg]\TYPYPNG...............D@'YPuju}cH'Ӿϻ˷ǴIJ"mmmooorrrpppnnniii```UUUDDD<<>>+ɶѼvcκɵðpeWP +ɶѼvcκɵðpeVN.ɶѼvcκɵðpeQJ999+ɶѼvcκɵðpeVNtnoZYuYuYtnoZY++kkzz..""""roukZ++DD22YYYRRԚ55""}|``==22WW++uupp88m++kkzz..""""roukZXVHcZmbpeocj_cY\TYPYP=6E>UMYPYPUMP"AP"P"P"AP"e[mbpeocj_cY\TYPYPUL?:&Ǵм8vv;ϻʶŲmbIC!DDDWWWcccWǴм8vv;ϻʶŲmbVP8Ǵм8vv;ϻʶŲmbSO4Ǵм8vv;ϻʶŲmbFD.@@@888NNNǴм8vv;ϻʶŲmbSO4rgj\Y`Y`Yrgj\Y22ZZHHZZJJumneY88TT@@YYNNDD]]FFu;;++UUrr''88Բ@@Y22ZZHHZZJJumneYof1t}~ztujg]\TYPYPOGUMYPYPYPYPYPeZi_"|xz{xz"|xz"|xz"|xz{xz"|xulb$t}~ztujg]\TYPYPOGñκӿϻ˷Ų}e[111HHHZZZfffnnn+κӿϻ˷Ų}e[κӿϻ˷Ų}bYñκӿϻ˷Ų}cZNNNYYYWWWLLL===999κӿϻ˷Ų}bYvmiZYxYYxYYvmiZY88ӏ88""\\zzbbvjk`Y""55==..''FF@@""UU``HHccHHux22{{..55RRv88ӏ88""\\zzbbvjk`Y~urfbWYPYPXOYPYPYPYPYPYP\Tj_pfIJ"zj_cYi_znx~rj_cYi_znyIJ"zj_cYi_znzIJ"zj_cYi_znzIJ"zj_cYi_znx~rj_cYi_znyIJ"zj_cYi]nczn~urfbWYPYPOGǸcɶѽҾκʶıt$$$NNN___gggsss|||nnnVɶѽҾκʶıtHHHZZZZɶѽҾκʶıtJF5333ȹeɶѽҾκʶıtXVHbbbiiifff```ZZZNNN@@@666EEEHHHZZZZɶѽҾκʶıtJF5333rgYYr\Yr\YrgYY..ȣYY88==poZYTTjjƼcc""2255""""}}ף\\""zwtnf++UUff''''xx}}]];;..ȣYY88==poZYzwkcZYPYPYPYPD@"22.22.D@"YPeZxmμPǴısj2BB=885D@"YPi]~r~2`Y.==;852D@"YPi_uμPǴısj2BB=885D@"YPi_zμPǴısj2BB=885D@"YPi_wμPǴısj2BB=885D@"YPi]~r~2`Y.==;852D@"YPi_uμPǴısj2BB=885D@"YPmbzwkcZYPYP=65˷ѽӾм͹ȴ¯bZ!P"<<dZ|o|P"u:III___mmmrrrF˷ѽӾм͹ȴ¯ib8UUULLL777???si+aWYPeZuixpYY~}Y~}YxpYY""||ƺDD{rYYY__''++~~==~sY55pp޳mm..''''v""||ƺDD{rY|wkbWYPYPB='.........222D@"bYt}ͺ"˷ɶB\\\\\\TTT@@@D@"]Toeui}}{i`5LLLNNNHHH;;;D@"bYs}ͺ"˷ɶB\\\\\\TTT@@@D@"cY|ͺ"˷ɶB\\\\\\TTT@@@D@"bYsͺ"˷ɶB\\\\\\TTT@@@D@"]Toeui}}{i`5LLLNNNHHH;;;D@"bYs}ͺ"˷ɶB\\\\\\RRR888B='|wkbWYPXXXkkkFɶκмѼϻ͹ɶısj8DDD"|s65.DDDWWWccckkkrrrjjjddd°5ɶκмѼϻ͹ɶıznYWN"we_=cccnnnsssrrrkkk5ɶκмѼϻ͹ɶıwn>>IJ"zj_cYZT"TPDZZZfffnnnooogggcccñǴɶȵƳ¯mbocvIJ"zi_\YJgggpppssspppgggXXXñǴɶȵƳ¯jjjkkkiiibbbUUUBBB=8+WNYP]Tg]znzIJ"ǴɶȵƳ¯iiijjjkkkiiieee___WWWLLL===@=+NHYPYP`WbYi_znzIJ"zi_\YJgggpppssspppgggXXXñǴɶȵƳ¯jjjkkkiiibbbUUUBBB=8+WNYP]Tg]znztYzztYpYrjtYpYP¯ıŲŲðug]YPNH......;;;@@@882uҾӾԿtrguuufffNNN222WNYPYPwkujvj888@@@jjjTTTJJJ;;8ti}ҾӾԿroerrriii\\\BB=zҾӾԿtrguuuiiiYYY==;YPj`|oҾӾԿtrguuufffNNN222WNYPYPwkujvj888@@@jjjTTTJJJ;;8ti}ҾӾԿtrguuukkkiii;¯ıŲŲðug]YPUMYP_Ue\P~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZμPǴısj2BB==;8PPJ___gggsss|||nnnfffbbb"';piBB='YPi_zμPǴısj2BB=WWWjjjpppsssooodddXXX.SkkkjjjeeeYYYFFF222882D@"YPi_zμPǴızrFZ@'Rjjjkkkjjjfff```ZZZNNN@@@88.==;885D@"YPi_zμPǴısj2BB=WWWjjjpppsssooodddXXX.SkkkjjjeeeYYYFFF222882D@"YPi_zrYk`kYk`kYrYri]r"|ıȴʶ˷ʶɵdzñ~uj\TUL...222@@@BBBg_+.'8`rrrtttggg\\\FFF=8+bYaYUMYP@=.;;;;;;===JJJHHHYR+t|.'8pkT\\\___eee\\\ne2".'8`rrrttteeeRRR88.YPYPdZ.'8`rrrtttggg\\\FFF=8+bYaYUMYP@=.;;;;;;===JJJHHHYR+t|.'8`rrruuunnnooo'ıȴʶ˷ʶɵdzñ~uj\TYPYPYP\TcZj`od"geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWujuͺ"˷ɶB\\\\\\WWWjjjxxxvvvmmmdddͺ"˷ɶNoooiiiWWW888D@"cY|ͺ"˷ɶB\\\\\\kkkrrrrrrmmmgeZ~1;|wekkkfff\\\NNNTTT@@@D@"cY|ͺ"˷ɶBbbbpppnnn___FB.cY|llliiikkkjjjgggccc\\\RRRYYYTTT@@@D@"cY|ͺ"˷ɶB\\\\\\kkkrrrrrrmmmgeZ~1;|wekkkfff\\\NNNTTT@@@D@"cY|mYxnjxYYYxnjxYmYnZ_YnIJ"zj_cY¯ɶ͹κϻϻκ˸ȵIJtcYYPNH+B@;HH@pg2EHZe`trgkkkfffYYYBBB]U"si+D@'888;;;;;;888==8ZU2tuvu1FôTZZZ\\\UUUDDDjc@NHZe`kkkiii\\\@@@NHYPE>HZe`trgkkkfffYYYBBB]U"si+D@'888;;;;;;888==8ZU2tuvu1HZe`trgmj`N¯ɶ͹κϻϻκ˸ȵIJtcYYPYPYPYPZP]ToeIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znϼϻκmj`jjjiiibbbrrrjjjzsWdddϼϻκmj`nnnkkk___RRR885j_ϼϻκmj`jjjiiijjjrrrkkkc`Rϼ˸]kkkgggfffbbbTTT885j_ϼϻκmj`kkkoookkkWWW882j_]kkkkkkiiieeeiiibbbTTT885j_ϼϻκmj`jjjiiijjjrrrkkkc`Rϼ˸]kkkgggfffbbbTTT885j_@@ZZ|jYzkYYYmrm]YYYmrm]YYzkYY@@ZZ|jYbpbμPǴısj2BB=882FB.Ƴ͹мҾӿ;cTκ"ȵñzj_YPvkscfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ott]}W\\\ZZZPPPNJ.{cfZ8WkkkcccNNN@=+`VcfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ottcfZ8ԿκɶƳ͹мҾӿ;cTκ"ȵñzj_YPB='22.55.D@"YPg]uμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_zҾӾԿtrguuuiiibbbfffwpP'ҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiiibbbNNLzҾӾԿtrgtttiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾų.Wkkktttiii\\\BB=zҾӾԿtrguuuiiibbbNNLzҾӾԿtrgtttiii\\\BB=zTTRR|jYvj_YYYw_YYw_YYvj_YYYTTRR|jYwY˷ɶB\\\\\\WWW___'ȵϻӾvT˸dz~oc]Uxn~H'Ӿ˸|wejjjbbbRRR777............85.WNYP\Rsgzn~yfZZZ\\\WWWDDDj`~H'ų.kkkgggZZZ===H'Ӿ˸|wejjjbbbRRR777............85.WNYP\RsgznH'Ӿϻ˷ȵϻӾvT˸dz~ocUL......DDD;;;D@"cY|˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2@@22|jY}r`YYYYzgYYzgYY}r`YYYY@@22|jYtϼϻκmj`jjjiiikkknnn@ɶѼvcκɵðpe]Tt~?.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWPWWW\\\ZZZPPPFD2vkz9.Ҿ]jjj```LLL555.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWP.Ҿϼͺ""ɶѼvcκɵðpePJ;;;===TTTLLL882j_ϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_HZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`B~jt_YYYYbYbYt_YYYY~j|ҾӾԿtrguuuooopppZǴм8vv;ϻʶŲmbMG*kkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... YYY\\\WWWHHH(((kkkfffWWW888AAAkkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... Ǵм8vv;ϻʶŲmbLH8HHH]]]___WWWB@=zҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zfZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı"v_{eZYYYYwZYwZY{eZYYYYv_.'8`rrruuukkkbbbzrFκӿϻ˷Ų}dZjjjiiiib8t}~ztujg]\TYPYPLF...)))SSS\\\\\\RRR;;;iiijjj___HHH999jjjiiiib8t}~ztujg]\TYPYPLF...)))ñκӿϻ˷Ų}wmP]]]jjjfff\\\sj2".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"88==mYx`YYYYjYjYx`YYYY88==mYHZe`trgmj`BɶѽҾκʶıtwn<~urfbWYPYPNGQQQVVV\\\WWWHHHlllkkkeeeUUU777wn<~urfbWYPYPNGȹeɶѽҾκʶıtJ]Zroemj`BPHZe`trgmj`BPHZe`trgmj`BP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμPWWPPeu_YYYzYzYu_YYYWWPPecfZ8Կκɶı˷ѽӾм͹ȴ¯ja$zwkcZYPYP=6WWWWWWPPP<<<jjjiii]]]DDDEEEzwkcZYPYP=6°5˷ѽӾм͹ȴ¯=eZ8Կκɶı"cfZ8Կκɶı"cfZ8Կκɶı"++r_YYY""gY""gYr_YYY++H'Ӿϻ˷ǴIJ"°5ɶκмѼϻ͹ɶı|wkbWYPPPPWWWUUUHHH---kkkeeeRRR666|wkbWYP°5ɶκмѼϻ͹ɶıH'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"jo`YY''PP++uY''PP++uYo`YYj.Ҿϼͺ"μPñǴɶȵƳ¯"^X4Szrf\TYPA;AAATTTUUUNNN===jjjiii\\\@@@Szrf\TYPA;V+ǴɶȵƳ¯.Ҿϼͺ"μP.Ҿϼͺ"μP.Ҿϼͺ"μPunYY++YY55vY++YY55vYunYY.={\fffNNN¯ıŲŲðug]YPQIHHHRRRPPPHHHiiikkkcccNNN999¯ıŲŲðug]YPQIfffnnnW+P{sYY..wY..wY{sYYlllrrrmmm\\\;;;ıȴʶ˷ʶɵdzñ~uj\TWNHHHLLLHHH===kkkgggZZZ===ıȴʶ˷ʶɵdzñ~uj\TWNddd|||ccc>>>|tZYYY|tZYooopppeeeJJJHHH¯ɶ͹κϻϻκ˸ȵIJtcYYP777BBBDDD@@@///jjj```LLL¯ɶ͹κϻϻκ˸ȵIJtcYYPmmmnnnWWW'''x~zv_Y_Y_Y~zv_YxmmmrrrkkkYYY<<<Ƴ͹мҾӿ;cTκ"ȵñzj_YP888;;;;;;555lllkkkfffWWW888Ƴ͹мҾӿ;cTκ"ȵñzj_YPdddvvvfffDDDPP~~==vvxvcYt_YYt_YYvxvcYPP~~==vvvvpppooocccDDDȵϻӾvT˸dz~ocWN.........---iiiiiiYYY@@@999ȵϻӾvT˸dz~ocWNmmmjjjsssZZZssHH]""PPssNNu|xgYu`YYYu`YYY""PPssNNu|xgYssHH]nnnrrrjjjUUU<<<.ɶѼvcκɵðpeSKVP8WP XPYPYPWNOHB='...... bbbNNNFD.QJXPYPYPWNQIA;.ɶѼvcκɵðpeSKcccrrrgggHHH55YY{Y++~~؅''==DD""tvwfY}jYYYY}jYYYY++~~؅''==DD""tvwfY55YY{Yrrrooo```@@@AAAǴм8vv;ϻʶŲmbIC!P"e[mbpeocj_cY\TYPYPUL?:&P"AXVHcZmbpeocj_cY\TYPYP=6E>UMYPYPUMǴм8vv;ϻʶŲmbIC!gggxxx___111JJPPvY""55""bb..wvsbYx`YYYY]]\YYYx`YYYY""55""bb..wvsbYJJPPvYYYYYYYYYY]]\YYYnnnrrriiiRRR999ñκӿϻ˷Ų}e["|xulb$t}~ztujg]\TYPYPOG"|xz{xzof1t}~ztujg]\TYPYPOGUMYPYPYPYPYPeZi_ñκӿϻ˷Ų}e[bbbooojjjNNNxx55tY""Á88HHffUUztp\YwbYYYYt{rf\YYwbYYYY""Á88HHffUUztp\Yxx55tYvtn`ZYYYYoxkbYYYYYYYcpg\YYt{rf\YYnnnrrrnnn___<<<ǸcɶѽҾκʶıtIJ"zj_cYi]nczn~urfbWYPYPOGIJ"zj_cYi_znx~rj_cYi_zny~urfbWYPYPXOYPYPYPYPYPYP\Tj_pfǸcɶѽҾκʶıtfffbbb++UUn++֥kk..ujYs`YYYYYYYcwwi]YYs`YYYY++֥kk..ujY++UUn}|mYY~rbYYwfbZYYYi~|o\YYYYcwwi]YYooopppfffNNN0005˷ѽӾм͹ȴ¯bZ!μPǴısj2BB=885D@"YPmbzwkcZYPYP=6μPǴısj2BB=885D@"YPi]~r~2`Y.==;852D@"YPi_uzwkcZYPYPYPYPD@"22.22.D@"YPeZxm5˷ѽӾм͹ȴ¯bZ!nnnkkkSSS$$$P""P"u1}P"}P"u1}@@uu55euu˴FFjY|`YYYxrjkmu}|zmY|`YYYuu˴FFjY@@uu55epYYZYYYZi|mZY{kgcfnwweYYxrjkmu}|zmYrrrmmm\\\999XXXkkkFɶκмѼϻ͹ɶısj8DDDͺ"˷ɶB\\\\\\RRR888B='|wkbWYPͺ"˷ɶB\\\\\\TTT@@@D@"]Toeui}}{i`5LLLNNNHHH;;;D@"bYs}|wkbWYPYPB='.........222D@"bYt}XXXkkkFɶκмѼϻ͹ɶısj8DDDddd|||ccc<<<"|tPNE|xz"|xtv|}wsuy"|x~txmpf970"|xtv|}wsuy""88..fYr`YYYvjijt}_r`YYY""88..fYYi{YtpswYrf\_cowpYYvjijt}_ooopppeeeJJJXXXgggrrrrrrZǴɶȵƳ¯'ws]gggZZZ@@@>>>ϼϻκmj`jjjiii___WWWpiBzrf\TYPA;ϼϻκmj`jjjiiibbbTTT882YP\RcZvuuNNFUUUUUUPPPFFF552f\wRzrf\TYPB='......222;;;52.i_XXXgggrrrrrrZǴɶȵƳ¯'ws]gggZZZ@@@>>>dddmmmnnnWWWIJ"zj_cYg]oeodxj_cYi_znzIJ"zj_cYi_znuzntutsgf\bYi_znzIJ"zj_cYi_xmtui_bYeZj_i_IJ"zj_cYi_znuzntutsgf\bYi_znzbbo_YY{k]`fs|Yo_YYbb\kiotZtmjkvvm\YY_mx{r\Y{k]`fs|YmmmrrrkkkYYY@=.YPXOP~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZҾӾԿtrguuukkkiii;¯ıŲŲðug]YPUMYP_Ue\ҾӾԿtrguuufffNNN222WNYPYPwkujvj888@@@jjjTTTJJJ;;8ti}P¯ıŲŲðug]YPNH......;;;@@@882uP~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZPzsWvvvfffμPǴısj2B@=882D@"YP]Uj_9ne2BB=885D@"YPi_zμPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_zμPǴısj2BB=885D@"YPcZoc?g_+88252.D@"YP]TcZμPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_zxbrjYYYvnku{YrjYYYbxvnnsbocgnzYwi]ck}riYvnku{YpppooocccDDDTJYPoct"geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWuju.'8`rrruuunnnooo'ıȴʶ˷ʶɵdzñ~uj\TYPYPYP\TcZj`od.'8`rrrtttggg\\\FFF=8+bYaYUMYP@=.;;;;;;===JJJHHHYR+t|"|ıȴʶ˷ʶɵdzñ~uj\TUL...222@@@BBBg_+"geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWuju"'jjjsssZZZ65.ͺ"˷ɶB\\\WWWLLL;;;D@"ZPcZe\y}zjc@\\\\\\TTT@@@D@"cY|ͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{ͺ"˷ɶB\\\\\\TTT@@@D@"YPYPXOpg2BBB@@@;;;222D@"YPYPUMͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{\tg]YY}mYtg]YY\tpufY{~YvrbY}mYIJ"`rrrjjjUUUD@+YPcYxmIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znHZe`trgmj`N¯ɶ͹κϻϻκ˸ȵIJtcYYPYPYPYPZP]ToeHZe`trgkkkfffYYYBBB]U"si+D@'888;;;;;;888==8ZU2tuvu1IJ"zj_cY¯ɶ͹κϻϻκ˸ȵIJtcYYPNH+B@;HH@pg2EIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znIJ"wpPrrrgggTPDϼϻκmj`fff___TTTDDD55.YP\T_Uvkj`NJ.DDDeeeiiibbbTTT885j_ϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_ϼϻκmj`jjjiiibbbTTTBBBD@+TJYPHH@@@@;;;222...22.YPYPYPϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_sf`YY}um`YYsf`YYoYY|fYYo}tpeYY}um`YYμPǴ;rrrooo```BBBD@"YPi_zμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_zcfZ8ԿκɶƳ͹мҾӿ;cTκ"ȵñzj_YPB='22.55.D@"YPg]ucfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ottμPǴısj2BB=882FB.Ƴ͹мҾӿ;cTκ"ȵñzj_YPvksμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_zμPǴısj2fffxxx___ZT"sҾӾԿroejjj]]]===...22.YPYPYP(((FD2DDDPPPUUU___iii\\\BB=zҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;sҾӾԿtrguuuiiiggg```UUUDDD@=.~~sB@;............22.YPYPYPҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;ssrfg]YYre\YYYrfg]YYs|x|p`YYtk_YYwpj`YYYre\YYY˷ɶ}xgrrrgggTTT@@@D@"cY|˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|H'Ӿϻ˷ȵϻӾvT˸dz~ocUL......DDD;;;D@"cY|H'Ӿ˸|wejjjbbbRRR777............85.WNYP\Rsgzn˷ɶB\\\\\\WWW___'ȵϻӾvT˸dz~oc]Uxn~˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|˷ɶB\\\bbbjjjPPJcY|.'8Z\\\HHH;;;...B='YPYP;;;HHHPPPWWWZZZ\\\\\\rrrjjj\\\sj2.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y..'8`rrruuummmrrrooojjjcccYYYJJJ999000sxnvkNH+............D@"YPYPUM.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y.oeicYYr_YYYYoeicYY|xvztfbYYt_YYYYwkZYYYYr_YYYYϼϻκnkbmmmiiibbbTTT885j_ϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_.Ҿϼͺ""ɶѼvcκɵðpePJ;;;===TTTLLL882j_.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWPϼϻκmj`jjjiiikkknnn@ɶѼvcκɵðpe]Tt~?ϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_ϼϻκmj`jjjiiibbbWWW=;8j_HZ]PLH8PJULYPYPYPUMA;---<<>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5AHZe`trgnkb}xgrrrrrroookkkeee\\\NNN<<<999MG*]T]UYPYPULNHB='B='YPYPYPE>HZe`trgkkknnnjjj```RRR:::>>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5A{n`fbYYzi\YYYY{n`fbYY]~v}vp`YYj\YYYYkZYYYYYYzi\YYYYҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zǴм8vv;ϻʶŲmbLH8HHH]]]___WWWB@=zkkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... ҾӾԿtrguuuooopppZǴм8vv;ϻʶŲmbMG*ҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zeJwmmbpeocj_cY\TYPYP=6000===HHHPPPWWW\\\\\\\\\ZZZ}WôT8Կκɶı"fZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{fZ8Կκɶ;`ppprrrpppmmmfff___RRR@@@<<<dZmbpeocj_cY\TYPYPYPYPYPUMfZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{o__`YYs_YYYYo__`YYY_cnwuuzugbYY}cYYYYYzn]ZZ\YYYYs_YYYY.'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"ñκӿϻ˷Ų}wmP]]]jjjfff\\\sj2"jjjiiiib8t}~ztujg]\TYPYPLF...))).'8`rrruuukkkbbbzrFκӿϻ˷Ų}dZ.'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"=t}~ztujg]\TYPYPOG///===HHHNNNUUUWWW\\\\\\YYYWWW]F'Ӿϻ˷ǴIJ"cH'Ӿϻ˷RnnnmmmfffZZZDDDbZ!t}~ztujg]\TYPYPNG...............D@'YPuju}cH'Ӿϻ˷ǴIJ"mmmooorrrpppnnniii```UUUDDD<<>>ıȴʶ˷ʶɵdzñ~uj\TWNlllrrrmmm\\\;;;ıȴʶ˷ʶɵdzñ~uj\TWNıȴʶ˷ʶɵdzñ~uj\TWNıȴʶ˷ʶɵdzñ~uj\TWNıȴʶ˷ʶɵdzñ~uj\TWN`cYwvcYYcY`iYjYbYwvcYYmmmnnnWWW'''¯ɶ͹κϻϻκ˸ȵIJtcYYPooopppeeeJJJHHH¯ɶ͹κϻϻκ˸ȵIJtcYYP¯ɶ͹κϻϻκ˸ȵIJtcYYP¯ɶ͹κϻϻκ˸ȵIJtcYYP¯ɶ͹κϻϻκ˸ȵIJtcYYP\nY~ssiYYnY\''..""pY""``""++++''""WWwYoY~ssiYYdddvvvfffDDDƳ͹мҾӿ;cTκ"ȵñzj_YPmmmrrrkkkYYY<<<Ƴ͹мҾӿ;cTκ"ȵñzj_YPƳ͹мҾӿ;cTκ"ȵñzj_YPƳ͹мҾӿ;cTκ"ȵñzj_YPƳ͹мҾӿ;cTκ"ȵñzj_YP~\Y""""sYxuwiYY""""sY~\YWWuuLL''8855tY++׵''""ggmm''YYο22pxuwiYYmmmjjjsssZZZȵϻӾvT˸dz~ocWNvvvpppooocccDDDȵϻӾvT˸dz~ocXPȵϻӾvT˸dz~ocWNȵϻӾvT˸dz~ocXPȵϻӾvT˸dz~ocWNbYHHmmWW@@2288UUTT;;p;;PP88rnuiZYHHmmWW@@2288UUTT;;pbYHH88``22;;==""t''22UUvv;;jjTT~""''vn;;PP88rnuiZYcccrrrgggHHH.ɶѼvcκɵðpeSKnnnrrrjjjUUU<<<'''>>>+ɶѼvcκɵðpeWP +ɶѼvcκɵðpeVN.ɶѼvcκɵðpeQJ999+ɶѼvcκɵðpeVNsYccDŽDDb++kkzz..""""roukZccDŽDDbsY``==22WW++uupp88mYYRRԚ55""}|++DD22Y++kkzz..""""roukZgggxxx___111Ǵм8vv;ϻʶŲmbIC!rrrooo```@@@AAADDDWWWcccWǴм8vv;ϻʶŲmbVP8Ǵм8vv;ϻʶŲmbSO4Ǵм8vv;ϻʶŲmbFD.@@@888NNNǴм8vv;ϻʶŲmbSO4Y''PPYYWWUUYYȗTT''22ZZHHZZJJumneY''PPYYWWUUYYȗTT''Y;;++UUrr''88Բ@@YYYNNDD]]FFu88TT@@22ZZHHZZJJumneYbbbooojjjNNNñκӿϻ˷Ų}e[nnnrrriiiRRR999111HHHZZZfffnnn+κӿϻ˷Ų}e[κӿϻ˷Ų}bYñκӿϻ˷Ų}cZNNNYYYWWWLLL===999κӿϻ˷Ų}bY88c@@~~]]22j88ӏ88""\\zzbbvjk`Y@@~~]]22j88c22{{..55RRvUU``HHccHHux""55==..''FF@@""88ӏ88""\\zzbbvjk`YfffbbbǸcɶѽҾκʶıtnnnrrrnnn___<<<$$$NNN___gggsss|||nnnVɶѽҾκʶıtHHHZZZZɶѽҾκʶıtJF5333ȹeɶѽҾκʶıtXVHbbbiiifff```ZZZNNN@@@666EEEHHHZZZZɶѽҾκʶıtJF5333==bbj55WWUU;;Y..ȣYY88==poZY55WWUU;;Y==bbj++UUff''''xx}}]];;""}}ף\\""zwtnfTTjjƼcc""2255""..ȣYY88==poZYnnnkkkSSS$$$5˷ѽӾм͹ȴ¯bZ!ooopppfffNNN000P"<<dZ|o|P"u:III___mmmrrrF˷ѽӾм͹ȴ¯ib8UUULLL777???si+aWYPeZui..zzn'';;88++Y""||ƺDD{rY'';;88++Y..zzn55pp޳mm..''''v~~==~sYYY__''++""||ƺDD{rYddd|||ccc<<<XXXkkkFɶκмѼϻ͹ɶısj8DDDrrrmmm\\\999"|s65.DDDWWWccckkkrrrjjjddd°5ɶκмѼϻ͹ɶıznYWN"we_=cccnnnsssrrrkkk5ɶκмѼϻ͹ɶıwn>>ooopppeeeJJJIJ"zj_cYZT"TPDZZZfffnnnooogggcccñǴɶȵƳ¯mbocvIJ"zi_\YJgggpppssspppgggXXXñǴɶȵƳ¯jjjkkkiiibbbUUUBBB=8+WNYP]Tg]znzIJ"ǴɶȵƳ¯iiijjjkkkiiieee___WWWLLL===@=+NHYPYP`WbYi_znzIJ"zi_\YJgggpppssspppgggXXXñǴɶȵƳ¯jjjkkkiiibbbUUUBBB=8+WNYP]Tg]znz""pY""tYjrpYPzsWvvvfffP~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZmmmrrrkkkYYY@=.YPXOμPǴısj2BB==;8PPJ___gggsss|||nnnfffbbb"';piBB='YPi_zμPǴısj2BB=WWWjjjpppsssooodddXXX.SkkkjjjeeeYYYFFF222882D@"YPi_zμPǴızrFZ@'Rjjjkkkjjjfff```ZZZNNN@@@88.==;885D@"YPi_zμPǴısj2BB=WWWjjjpppsssooodddXXX.SkkkjjjeeeYYYFFF222882D@"YPi_zr]ir"'jjjsssZZZ65."geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWujupppooocccDDDTJYPoctͺ"˷ɶB\\\\\\WWWjjjxxxvvvmmmdddͺ"˷ɶNoooiiiWWW888D@"cY|ͺ"˷ɶB\\\\\\kkkrrrrrrmmmgeZ~1;|wekkkfff\\\NNNTTT@@@D@"cY|ͺ"˷ɶBbbbpppnnn___FB.cY|llliiikkkjjjgggccc\\\RRRYYYTTT@@@D@"cY|ͺ"˷ɶB\\\\\\kkkrrrrrrmmmgeZ~1;|wekkkfff\\\NNNTTT@@@D@"cY|""fn""fY_ZnIJ"wpPrrrgggTPDIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znIJ"`rrrjjjUUUD@+YPcYxmϼϻκmj`jjjiiibbbrrrjjjzsWdddϼϻκmj`nnnkkk___RRR885j_ϼϻκmj`jjjiiijjjrrrkkkc`Rϼ˸]kkkgggfffbbbTTT885j_ϼϻκmj`kkkoookkkWWW882j_]kkkkkkiiieeeiiibbbTTT885j_ϼϻκmj`jjjiiijjjrrrkkkc`Rϼ˸]kkkgggfffbbbTTT885j_bpbμPǴısj2fffxxx___ZT"sμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_zμPǴ;rrrooo```BBBD@"YPi_zҾӾԿtrguuuiiibbbfffwpP'ҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiiibbbNNLzҾӾԿtrgtttiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾų.Wkkktttiii\\\BB=zҾӾԿtrguuuiiibbbNNLzҾӾԿtrgtttiii\\\BB=zYw˷ɶB\\\bbbjjjPPJcY|˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|˷ɶ}xgrrrgggTTT@@@D@"cY|.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2.'8`rrruuujjj\\\sj2tϼϻκmj`jjjiiibbbWWW=;8j_ϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_ϼϻκnkbmmmiiibbbTTT885j_HZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`BHZe`trgmj`BPHZe`trgmj`B|ҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zfZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı"fZ8Կκɶı"cfZ8Կκɶı".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"cH'Ӿϻ˷ǴIJ"HZe`trgmj`BPHZe`trgmj`BPHZe`trgmj`BPHZe`trgmj`BP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμP.ҾϼμPcfZ8Կκɶı"cfZ8Կκɶı"cfZ8Կκɶı"cfZ8Կκɶı"H'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ".Ҿϼͺ"μP.Ҿϼͺ"μP.Ҿϼͺ"μP.Ҿϼͺ"μP|fez`fi}pPJLiNNxwrnZRU~PL]x]gYJLbrbjvLNZ444444444222""""""RbZs|LHWWwtwg]g}i]_JJ]III;;;GGGDDD&&&;;;GGGDDD&&&;;;GGGDDD&&&:::;;;<<>>EEEDDDFFF>>>EEEDDDFFF<<<EEEDDD===+++888FFF777BBBDDD***;;;$$$555""";;;$$$PRgN~}PFF_NFJWWFHRLHH}]RHFJW888KKK;;;TTTHHHOOO;;;YYYHHHLLL;;;PPPHHH<<<+++000III;;;GGGHHH???&&&%%%+++"""333***999)))***%%%222###+++333***999)))***YY%% qaVTE33~xkLYY%% qaVTE,,}%%f Z YVTTTETJUoJ\b]JJZLPL\YijNFJ\ZNHFFZfUJFFJeLLL888DDDFFF"BH8NTDDD(((FFF"BH8NTDDD(((FFF"BH8NTDDD(((777+++000FFF"BH8NTDDD>>>!!!666)))<<>>FFFGGG555333>>>'''===+++HHH888BBB@@@===BBB222BBB@@@666"""000aaa@@@ZZZ,,,FFF555<<>>PPPJJJGGGDDDDDDBBBBBB\\\;;;GGGAAA888444PPPGGGBBB:::<<>>zzz-00BFF'22"22".."++'++-00@@@***888...>>>...EEETTT222moo'22"22"..'.."++8;;555@@@===<<<===,,,>>>zzz-00BFF'22"22".."++'++-00@@@***888...,,Tbfc\YYYYXO++Z{{b,,Tbfc\YYYYXO,,Tbfc\YYYYXO;;_RRYTTY;;YYW7BBl7;;_RRYTTY;;YYW7''iHHYYYYYYYYYYTTYFFYRRYYYYLLYTTY;;YYW7}PL\ktHFHT]UPPJUTbsmZHRxe|ur{YFHYvetzkixxgWPWcunnnnmkjgeb__kwpjggiosv}xgcigiifeefreeeEEE777ZϐjzZϐjzGGGPPP...'''!!!Zϐjz777EEE<<>>===@@@444888Y]]2BB5HH5JJ5JJ2FF.BB'88++"''===777---""" <<<rrrxxxMSS2BB5HH5JJ5JJ2FF.BB'88++!**000DDD888xx''nFFfnnvrrxggmkko``iRR]88Y""YYWArExx''nFFfnnvrrxggmkko``iRR]88Y""YYWAxx++oTTn~~HHe""\YWA""nRRYYYYWWY22YYQ^""nRRYYYYWWY22YYQgRRYYYYYYYYYYNNYYY22YTTYYYYWWY22YYQPJJ_nswHFFFFHPibNHHHTb|~eJNjZin]j{|ZFH|{pzzoi]]nm\YUUUWYZZWWUTRRPNLJJJJLPUb_YWTRRPRRTTUZ`bbcc`]]]gn\UPNWbbZTUR]eikkjigffintx{vUUU@@@HHH+Zao+ZaoCCCJJJ999AAA<<<<<<+Zao;;;...LLLGGGEEE555+ZaoGGGGGGDDD888666HHH<<>>III999NNNLLLYYYNNNIIIBBB888;;;XXXLLLLLLaaaRRR@@@FPP8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++===@@@###BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""AAA]]]YYY@JJ8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++...DDD666BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777""""""%%%###"""HHppu|||ffi]]`YYYYYYTTYYYYRRY..YYTfHHppu|||ffi]]`YYYYYYTTYYYYRRY..YYTTTŽȾ55`YT|HHYWWYYYYRRY''YXBBt|HHYWWYYYYRRY''YX''""_WWYYYYYYYYYYLLYYYY22YHHYYYYRRY''YXbLHJ]mpFFFFRNHFFJewTJcbm]HLi{\FPjzs}wnzjguYPNNNNNNLLLJJJHHFFFFFHJTk`}bfie`ZYUPLJJJLLLLRRPNR\r`YUTT\]]\WPLHHL]jmie\Ynb{i}stxbLL`{ztpnkms{voZLLL<<<[[[{<<<{>>>JJJ111GGG{:::...DDD444{GGG555sssQQQ888@@@LLL444!!!777HHHFFF999KKK@@@999UUUKKK???[[[<<<666)))>>>8BB;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22"''555888)))GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***```999;;;8888885@@;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22'++@@@!!!GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***NNN######)))   ###FF};;uu~JJ|=={''j_Y""Y..Y88YTTYYYYNNYRRY''YXDD{FF};;uu~JJ|=={''j_Y""Y..Y88YTTYYYYNNYRRY''YXFF}==ϲffZZ8888RRmmss{{{..\XHHZWWYYYYYYY..YYHHZWWYYYYYYY..YY;;YYYYZZZ______..ZYYYY@@YYYYZZZ..ZYJFHZgkHHJHHR``PHFFF`cN_bjTFFLx\FHPftsn|fbwutxwiRNJJJHHHHHFFFFFHHHFFFFFFHHJJLLPUbbZWUUTRRRRRTTRPPRNLJHHHHHHHHHHHJHHHHJT\bceYUPNLLLNPU\YTRPLJLLJFFHJT]n||ui_jZ}Wvc\PJHJYzsccinspeTJNUGGG888 \iZgR]CL*0...666GGG]]]888uuuEEE444999BBB[gZgR]CL*0<<333;;;@@@BBBBBBBBB@@@DDD777999QQQ444000+++===;;;PPPFFF999777GGGHHHEEE]]]DDD@@@)))WWWAAA'''DDDIIINNN=HHBZZD__F``F``F``F``F``F``F``F``D]]@WW8LL'88"++000&&&CCCfffHHH;FFBZZD__F``F``F``F``F``F``F``F``D]]@WW8LL'88'++BBBDDD***@@@999=HHBZZD__F``F``F``F``F``F``F``F``D]]@WW8LL'88+..BBB000CCCfffHHH;FFBZZD__F``F``F``F``F``F``F``F``D]]@WW8LL'88'++BBBDDD***???&&&%%%+++"""000%%%+++"""000%%%+++"""333***999)))!!!888"""222999)))%%%888"""222999)))***%%%222###......)))222###......)))222###+++333***999)))!!!888"""222999)))%%%888"""222999)))***KKRR55bbrkkk]]c```]]]ZZZYYYYYYYYYTTYYYYRRY''Y22YWWYRRYHHYYJJKKRR55bbrkkk]]c```]]]ZZZYYYYYYYYYTTYYYYRRY''Y22YWWYRRYHHYYKKff}RR}}jjoWWeYtWWYWWYTTYYYYHHYYtWWYWWYTTYYYYHHYY88ZYYY]]]``````@@ZYYYYYYnnszzzWWeYJFFLTU_Wn]HJ_bRJFFHnYgzgNLHFFFLo]HLP`ikckfR]w~usrii_YLHLZjspePFFFJPUJFFFFJT_gmnke\URP]cZWRRRPNNNJHHHHHFHHNUYZZWNHJHFFFFFHT]YJFJYp]YZZRNJHFFFFFFHHHHFFHZg_JFFFFFLjzWTRWPLTUNLLLHFRtxfxz]FFHJU[t{~n}NZAIM***EEE222999BBBMMM;;;LLL~n}NZ$6;MMMHHHHHH???...OOO=Y`~n}NZ27QQQ>_g~n}NZ)8=,,,===!!!DDD...222CCC:::,,,+++<<<BBB===GGG222BBB444DDD,,,FFFDDDWWWGGG@@@BBB***YYYDDD...333DDD888444FFF]kkD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB'..WWWPPP+++FFFQQQFYYD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<>>>BBB___FFF@UUD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++222777"""FFFQQQFYYD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<>>>!!!666)))<<>>vT_ 555DDDWWW```[[[XXXPPP@@@===TTTDDDAAADDDAAA===222777GGGvT_BBB;;;EEEEEEDDD===999>>>PPPvT_;;;444#CKHRKVLWJUHQBL7="EEE///999;;;...777:::;;;#CKHRKVLWJUHQBL7=",,,FFF222AAABBB###BBB#CKHRKVLWJUHQBL7="GGG...HHH111ccc...#CKHRKVLWJUHQBL7="///EEE333]]]111JJJGGG666:::@@@iiiD\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..wwwFFF###GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999@@@BBBDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..;;;'''GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999DDD000CCCTTT000HHH8885;;'55"22".."..".."..".."..".."..".."..".."..".."..".."..".."+++..+++@@@DDD---<<<===,,,>>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888...>>>...EEETTT222moo'22"22"..".."..".."..".."..".."..".."..".."..".."..".."..'.."++8;;555@@@===<<<===,,,>>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888.....LL~~rrrbbv.."";;==22''''nNNYYYYWWYTTYYYY''YQ..^..LL~~rrrbbv.."";;==22''''nNNYYYYWWYTTYYYY''YQ..LL''}wkb_YYYYYYYLLYZZZ''YQ''nYYYTTY22YYYYRRYYABBE''nYYYTTY22YYYYRRYYA''88____nnnvvvzzzWWeYYYYYZjRR{{YAcHFFFHufZJFFFHNrLHFJfsLJPJUuwgeUJPftfTHFJWWWYUNHFFFHHHHFFFFFHR]bgvogbZU_RPPJHHFFFFFFFHRRRTY`iv}WLo\PHFFFFFFFHP\nwgfRHHNZfpxvfZLFHTctOOO~_m3>BFFFHHHGGGFFFDDD444555~_m3>@UUU]]][[[WWWRRRBBBJJJ;;;cccEEE===888-Xa~_m 24PPP===UUUGGGDDD===4Zd~_m)58###X`ccrm|opn~jzesZgNZFR>G222@@@###666555 ;;;...X`ccrm|opn~jzesZgNZFR>GHHHFFF,,,@@@X`ccrm|opn~jzesZgNZFR>G;;;BBB!!!888FFF***bbbX`ccrm|opn~jzesZgNZFR>G&&&EEE777888UUU ,,,JJJCCCDDDTTT222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..bbb222>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFQQQ999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222@@@+++>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222VVV;;;;BB2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++'++...777==="""<<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888TTT>>>===@@@444888Y]]2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++"''===777---""" <<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888zz~;;''zzⓓzzRR..22cWWYYYYYYYRRYY77zz~;;''zzⓓzzRR..22cWWYYYYYYYRRYY7==}xkb\YYYYYYYYY''YYYYRRYY7NNYWWY''YFFYNNY..YWrNNYWWY''YFFYNNY..YWp]]]mmmwww{{{bbnYYYYYYm}wwss{55`WPHFFFFU{eRHFFFHN`WLHFHgU\~{}_PL__jtjgZLPeizTwW\FFJUUUWTPJHFFFFFFFHHHFFFFHUbjzJN\sUUTTRRPJHFFFFFFFLZksnZHHJNUs]Ym\TNJHFFFFFFFFFHY~z~ugYYZZRLHFPgutcWUZbimmgZNTfrYAAA=_g;k5gv7@D888NNN8882220002228884]f;k5gvDKO888BBB$$$FFF?dn;k5gv~555PPP888Ben;k5gvB%*\\\Mgnn~{}xtm|_mNZEOEEE===-2DKO3>@%*000JJJ>>>IIIrrrvvvB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..888###QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222NNNKKK999@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBAAA%%%QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222LLLaaaRRR@@@FPP8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++===@@@###BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""AAA]]]YYY@JJ8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++...DDD666BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""UUzz{rrʍ弼}}''tRRYWWYYYY22YWlUUzz{rrʍ弼}}''tRRYWWYYYY22YWUUss|sibZZYYYYYYYYYY@@YYYY22YW88eYYYRRY''YYYYRRYY=BB=88eYYYRRY''YYYYRRYY=''YY]vvv""YYYYY]r@@Y=gHFFFFJgze_cHFFFFHLjLHHN`NLxn\bw{R]gp{wmj]RgjNnoctJFfYZUNJHFFFFFHHJJLLHFFHP\be|W|YWURLFFFFFFFUrkLFHL\xiUJHFFFFFFFFFFFFZ|{z]JYT|JHHUnznfegiif`YYnwbNLLLCCCiwgv/3AAAlll000...555:::>>>QQQiwgv-2FFFKKKiwgv-9<;;;HHHiwgv/3AAAGGGFFF===>>>^z{{tiwUbFPDDD?G`mgvgv_mT_27555555^z{{tiwUbFPEEE0@D`mgvgv_mT_)8=333^z{{tiwUbFPFFF?G`mgvgv_mT_AIMDDD^z{{tiwUbFP@@@?E`mgvgv_mT_$6;LLL<<<bbb111666EEEB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..sssjjj)))GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@EEEWWWBBBB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH".....GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@666)))>>>8BB;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22"''555888)))GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***```999;;;8888885@@;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22'++@@@!!!GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***VV''ggDD""HHZWWYWWYYVVVV''ggDD""HHZWWYWWYYVV''vvzwk`Z\ZZYYYYYYYYYYYHHYWWYY~YYYYYY""YTTYYYY""YOb~YYYYYY""YTTYYYY""YONN\wwwBBbYYYYiu""\ORJHNJFLbjbJ]eFFFFFHNbTLHJW]{uJHo}JFHZptebJPZm~|}ppjZLRgkZYrnTFL]ZURPLHFFFFFHHJJJLJHFFFHJJ_ZZ\ZWUPHFFFFFFHP\jrogfiox}_RHFFFFFFJJHFFFFJ`v{}gLJRRTU|PLHFHRi}ui_]_cgjjjirjNEEE>>>AAAB˶r`mGGG>>>OOO===<<<>>>B˶r`mGGG>>>PPPIIIB˶r`m444AAAPPPGGGB˶r`mPPPNNNLLLHHH999wm|WcEO)]h~~vgvNZ8?***wm|WcEO,]h~~vgvNZ7>***wm|WcEO,]h~~vgvNZ7@***wm|WcEO-]h~~vgvNZ ;A***GGGrrr888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..&&&???... ???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""BBBCCCCCC777B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..;;;DDD000???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""iii888\]]=TTBZZD]]D__D__F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__D]]@YY;PP.BB++8;;HHH666 HHHBBB@@@999<<>>!v`oDM~iwCL{'_kDDDHHHEEE!v`oDM~iwCL{'_kDDDHHHBBB!v`oDM~iwCL{'_kDDDHHHEEE!v`oDM~iwCL{'_kDDDHHHEEEDDD888444777B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..^^^sss...DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%HHHFFFTTT@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..***777"""DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%GGG888444FFF]kkD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB'..WWWPPP+++IIIQQQFYYD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<>>>BBB___FFF@UUD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++222777"""IIIQQQFYYD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<PPBB5522׉""""nRRY''YPPPPBB5522׉""""nRRY''YPPBBii~g''vv{{{zzztttUUc@@ZYYY22YLLY''YBBbYYYLLY""YZZZ``iY9BB7BBbYYYLLY""YZZZ``iY9''22iuu~ZZ\kw88Y9jLFHJFFHHHFHRebfnw]JJPgJHRYUPYZkgmcgYHFFFFU]JFFvgrcTvpWRfenYJRiwtmfjkx]J]FHHJJJHHFFFFFHYkoojecej}}f]RHFFFFFH`UPLHFJe}eNLegoTZTLLgz`ZTLLgWWW777;;;...999NNNQEEEBBB...GGG555888;;;<<<BBBRRRW===UUU;;;???TTTWBBB@@@///222QQQAAAOOO;;;;;;A,,,BBBGGGJJJHHHFFFDDD}m|LWwR]+{8NT}m|LWwR]+{8NT}m|LWwR]+{8NT}m|LWwR]+{8NTSSSLLLZZZB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..---%%%AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))QQQGGG999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@DDD---AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))IIIZZZBZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..222555(((AAA;;;888888BZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..555888)))"""OOOKKKBBB;;;BYYFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..BBBDDD---AAA;;;888888BZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..555888)))"""""eepp'';;_FFYU""m""eepp'';;_FFYU""ôZiFFwwwvvvsssmmm```YY\..ZYYYYYFFYU@@fYYYFFZY__`kkoY@@fYYYFFZY__`kkoY..mnn}ZZbwYWLFFFFFFFFFHRc]_viRJJPePJHPUPJTnou`YcYHFFFHNUcTLHFf}\ZvwYNPc]`JFFLWciijcf{`LRFFFFHHHHHHHFFFFFFFJNPWY]bi`YNJHFFFFFHYoZURPLHFFFNeousj]NJm~}r|WZ\WLTuweRLe???999......111HHH-NVR]P\LWDM9A;;;GGG:::,,,DDD...<<<-NWR]P\LWDM9AEEE777BBB:::<<>>>>>@@@eeeUggHccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22{{{FFF###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999@@@BBBDDDB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22===---###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999ÓHH;;LLYYÓHH;;LLYYôǤ''`ssswwwvvvmmmnnnkkkiii```]]]___LLYYRRYRRYY''@@gZZZFFZ_ffiiimY;BB=''@@gZZZFFZ_ffiiimY;''++..pmm{\bm}Y;kLFFFFFFFFFJZeYY|vkRLJPiJHLNJHRsrmYU`YJFFFHW]PHFYZ]w}|\RmLHHHFHTbigZNg~ubNZFFFFHHFFFFFFFFFHJRUTRTY_fvuYRNJHFFFFFFJ\grUNJHFFFFHLUWUNHF_c_NHH_z|s_Ug~wvLLL;;;***222<<<G^ehvsusm|`oPZEODDDDDD:::BBB***LLLOekhvsusm|`oPZEOEEE333888;;;>>>Oekhvsusm|`oPZEODDD777555sss666;;;:::AY`hvsusm|`oPZEOEEE888_Ҳv;uR]+Ŷk[f+Z.{FFF;;;<<<_Ҳv;uQ[+Ŷk[g+Z.{FFF;;;777_Ҳv;uR]+Ŷk \i+Z.{FFF;;;>>>_Ҳv;uR]+Ŷk[g+Z.{FFF;;;>>>DDDTTT222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..bbb222>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFQQQ999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222@@@+++>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..qqqBBB]]]===BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22555bbb222DDD777BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, FFFQQQ;;;DYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'55@@@BBB+++DDD777BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, rr++vvDD88cYrrrr++vvDD88cYrr++сkkwPPnHHp;;r..p..m22i@@bDD]NN\YY]]]]___```___]]]\\\___YYYNNYFFYYYYY22BBf]]]NN_''k|||rrx\22BBf]]]NN_''k|||rrx\NN;;rZix88\YLFFFFFFFHHTijWT{pzbLLLiRLJHHFFRkjgRU]YJFFFHPek]\HFRvo~_Zv{bPRcWLJLLFFHZgcYRLeggnbTUjNLJHHFFFFFFFFFHPbrz{z{|zZPPNNLJHHFHHHHHHLTZbgmu_RNLHFFFFFHLPNJFFRsmYLHFFHLTY_befff`ZgrBBB+++...777QQQHhqw}vkzWcFPGGG===999BBB999Rpxw}vkzWcFP&&&EEE000>>>;;;<<>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***NNNLLLBBBDDDDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HH5;;BBB<<<%%%>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***55YEL55YE;;ƐvvJJp88_HHYWWYYYYYYYZZZYYYYYYTTYRRY""YE..==LL````FFg==znnvcBB..==LL````FFg==znnvc''xxHHpww`t}ZZȒcnNFHPRHFFLJ\roPTzebNHLWmNJHFFRZr\bPU\THFFFHW]PHFP`Te_txsfUTPLHFFUe_\\LLUZ`cpfbZZc_HFFFFFHL\r||`rJJJHHHJNPPPPRRRPNNPRY`mzYRHFFFFFFHHHHFHP_e_Z\co}nbZPLHHHHHFFHLPU`onrHHHJJJ000~xm|UbEOFFFFFF999GGG~xm|UbEO///DDD***VVV999===~xm|UbEO@@@DDD222@@@;;;cu{~xm|UbEOKKKHv{Z.hvaef0)ZefffkkkHv{Z.hv@DE*}%WaSSSYYYHv{Z.hvPSU*)Yd]]]kkkHv{Z.hvaef4%Zessskkkbbb111666EEEB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..sssjjj)))GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@EEEWWWBBBB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH".....GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@```999;;;888;==HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB222===NNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$UUUZZZ@@@@BBHbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB888888)))***NNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$;;''++];;;;''++];;ųYYYYێ먨xxNN++m88ZTTYYYYYYYYYYYYYYYY@@YRR;;TTZ]]c..wJJ|ppuFFffRR;;TTZ]]c..wJJ|ppuFFffϜPPn55`m|ffTTnfZNHLeiWFHLLbxoNT{UHFHLPWPNJFFFHLUPzrZNUUNFHHFJRWgULFFN~ZJH`s_bowwi`ife\cYRLHJLWf]]cTR_`UHY{we]`_fePHFFFFFH\|~z`FHHHHHHHJNNLLNPPRRRUUUUYcuWURRNJFFFFFFFFFFFJYb_Z]ZTP_pZZUTPNNNNNPNHFFFFHc|ncWvW[[[FFF>>>0wiwNZ>GHHHIIIBBB;;;JJJ///3wiwNZ>G444BBB)))???;;;;;;3wiwNZ>GGGG...@@@;;;,}wiwNZ>GHHH999wPelTTT===5mz=Y`666wAY`;;;;;;5n{>_gBBB555wG^eNNN222/kv[t{DDD888[[[wPelAAA-U^===GGGrrr888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..&&&???... ???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""BBBCCCCCC777B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..;;;DDD000???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""VVVKKK[[[HHHHHHFUUJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNY]]TTT,,,999%%%>>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###DDDDDDGGGDDDBRRJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NN;BBHHHHHH666&&&NNN>>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###''tT''k''tT'']]"";;88m;;YWWYYYYYYYYYY@@YTzz""bbbkkk""''nbBB{zz""bbbkkk""''nb''ҨkkwUU|x++obnNHUpzgHHJJcwkHUzRFFHLbtRJHFFFFFHggTNRPHFHHHLYWJFFLnYFFFLem_RPYe`RJL]bWsRPWZcn_\eZesfPFFbj`U]`cPJFFFFFFHUpFFFFHHHHHHFFFFFHHJPU\]`cgsPNJHFFHHHHHHFFPeotvwvvw}\WTNNNHFFFFFY{_LFFFt_mFR"\\\JJJ444t_mFR"@@@@@@000^^^TTTBBBt_mFR"GGG888***;;;t_mFR"HHH999~Rpx???999?dn-XauOOO888YYY~Efn;;;;;;JJJBen4ZdvBBB444]]]~Jiq999...=_gSxGGG<<>>aaa...RRRZZZBBB===FYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRFPP;;;000BBBFFFYYYAAAFYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRY``>>>aaa...&&''&&&&UU22""_RRYYYYYYY22Y''Փ;;~iiibbr==z,,T++Z''Փ;;~iiibbr==z,,TՎ..tPPϤz,,TYNHYs{mHHJJZkYFRr]FFJLT\UPLHFFFFFFPuo\LPRJFFHJHNTnbTNHFFL\HFFFHLJFFHJPJFFHPW`e`U]bftzgUb`w|fLFFYf]R]\]m`TLJHFFFFFFFJ]szmecefeHHHFFFFFFFFFFFFFFFHNTYYYYZc}TRPNNPPNNRRPNLJHFJ`w`ZURNNLLLJHFFFLYb{nf]TJNtFFFFFFDDDD{m|NZ7=VVVBBBJJJPPPGGGD{m|NZ7=DDD;;;@@@@@@D{m|NZ7=@@@222;;;999;{m|NZ7=OOOGGG53EEE;;;888===@@@5,}:::<<>>DDDZZZCCC===BRRHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT5@@YYY444EEE555NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;bbbHHHBBBCCC===FUUHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT8BB@@@VVVTTT+++!!!???NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;&&V''x&&V&&{{gHHYYYYBBYT}}zzTTfggn55kkuu~HHxBB}}zzTTfggn55kkuu~HHx''88YY{{TTxnNTjsgHFJLRHFJb`HFLPv}WNHFFFFFFFR`YJHRRHFFHHJPZTHFFLPFFFHLNNHFFFFFFFFHLUTT]fvuPbzfHFFL`ZNYYbUNJHHFFFFFFJT`]RUepvvnYHFHRZ_`_\HHg}uP{N~LHHFFFFFFFFFFFFFHJJHHHHJn{gYZbsUTT\bZPLHFFRw}\{PLJT\YLHJU`fjwxbWURLZLLLFFF@@@tZgBLBBBtZgBLGGGMMMPPP===tZgBLDDD555<<<tZgBL&D<<<bbb===GGGBBB555&;<<<;;;SSSeeeDDDPPPEEE888GGG&D111AAAOOOUUUEEE777&D888222SSSBBBIIIZZZB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..---%%%AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))"""QQQGGG;;;B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD---AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))"""]]]\\\BBBBBBDDD@BBDRRDYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BYY@UU=HHFHH888]]]@@@...:::NNNTTTAAADDDDRRBYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BZZFYY;FFbdd]]]000rrr===DDDZZZ999HHH;==R]]BYYUggB\\B\\B\\B\\B\\B\\B\\D\\B\\B\\B\\B\\B\\B\\B\\D\\BZZ]kk=HH\]]RRR---CCC>>>NNNTTTAAADDDDRRBYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BZZFYY;FFbdd]]]000rrr===''a''ss}''a&&{{iLLYBBYT""Լ''..rrrrrzRR""Լ''..rrrrrzRR;;JJffȤUNHJZeYHFHHHHFFHPsTHHNTY}`RNHFFFFFFFFHHFHRPHFFFJLRT]TLHFFHHFFFTbe]NJHFFHHHHJLUWfgYLTfPieFFFFUUJPUbTTUUTPLJHHFFFFHHFFHbzw_HFFHJRZWJHFFFZ~}f\RNLJHHHHHHFHHHHFFFFFFFF\~jg``e|rZNLRYZWWZjUuP~LHFFJiwtw}{rxjWn}ZTNJHJUUJHPUZ]`erwfbnx\JJHHRRRRFFF@@@xesHQDDD444xesHQKKK;;;OOO;;;xesHQHHH888EEENNN???MMMxesHQ>>>:::EEE777BBB111;;;===GGG>>>TTT888<<<...;;;<<<>>>III555DDDRRR555MMM>>>000999AAA>>>>>>@@@eeeUggHccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22{{{FFF###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999@@@BBBDDDB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22===---###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999DDDHHHZZZGGG@@@DDD;;;DDD;;;BBBDDD777BBB@@@999DDD999@@@DDD777BBB@@@999DDD;;;FFF999HHH888AAA===BBBDDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000GGG\\\DDD<<>>aaa222000DDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000'' qBB33~'' q&&mm++c;;YVєꍍbbv|||HHp;;BBєꍍbbv|||HHp;;''""vvZZ==nNJHLRJFFHHHHFFFHr]JFHUYPHFFFFFFFFFFFHRPFFFHJW\|THFFFFFFHe{iUNHFHJLLPZ_LbRxbFHFFJPHWgZZWTLJHHHHFFFFNbki]LFFFFF\onZHFFHft]TPPLJJHJHHFFFFFFFHb{jZLFJm]\_jcPHFHL`xupmjgfiotx{|{vgNFPcTLLJHHFFHJNRU]fnu{t\Tu~xwgNFFFNFFFEEE}jzJUDDD}jzJU888PPP888}jzJU;;;FFF@@@}jzJUKKK;;;BBB222333;;;lll999```DDD===QQQ222...:::<<>>>>>ooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGG>>>[[[;;;III]]]@@@444rrrrrrTTT@@@444rrrrrrTTT@@@444iii)))DDDvvvooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGG''BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBPP''&&ZRR;;rrr__sWW\\sUUpRR;;rrr__sWW\\s""__\\sUNJHHHFFFFFHFFFFF\|pJFFHRY_eZTRJFFFFFFFFFFFHPNFFFHLRYW_UNJHHFFFFJosWPHFHLPP~PRT\iZN\R_HNHFHHFJZtm]]_YUTRRNLJHHHLRRJHFFFFFR]]UJFFTz]ZWUTRRPLJHHHFFFFFFHZw~mg]PJUsb_ZURNJHP]is{|wpjijjge`_]\\\ZYTJFHRt_TRPNNLJJJPY]_`bbb`]\YTJFHZvziWHFFJUVVVDDD.L;n~LWGGG+++.L;n~LWBBBJJJJJJ888.L;n~LWcccBBBJJJFFF.L;n~LW<<<888ccc===;;;999888999;;;@@@UUU===BBB777***000777<<>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***NNNLLLBBBDDDDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HH5;;BBB<<<%%%>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***RRRDDDUUUFFF@@@GGGFFFEEECCCEEEFFF@@@GGGFFFEEECCCEEEFFF@@@KKKBBB@@@EEE999TTTLLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<KKK999BBB>>>III888NNNGGG111DDD:::LLL888MMMGGG111DDD:::LLL888NNNDDD666LLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<''%%''%%&&s Y++ֺDDzz~BB++ֺDDzz~''YYvv''ȅpNLLJHFFFFFFFFFFL\UFFFH\u]RNHFFFFFFFFFFHPLFFFHLW_WNJJHFFFJkuULHFHNTZ~Y]W}L~YHLHLJFJWb}xrm_YTLLLLLJJHFFFFFHHHHFF]}k_WUYRNLJHHHFFNpweZUPLsg\TLWbfb\YWUUZ]ZUPJHHFFFFFHJxiZWWWZU\]TNLHFFFFFNfu{uj]PJHJ{NNNZϒv2pKVJJJZϒv2pKVIII===JJJZϒv2pKVEEELLLBBBZϒv2pKV;;;AAA......888LLLLLL;;;DDDGGG<<<...999NNNLLL;;;///>>>...>>>;;;DDDuuu```999;;;888;==HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB222===NNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$UUUZZZ@@@@BBHbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB888888)))***NNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$LLLDDDHHHBBBKKKDDDHHHBBBKKKDDD>>>TTTNNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBBVVVIII>>>GGGOOONNN666DDDOOONNN666DDDLLLNNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBB''%%''%%&& Z""ԠYYrrDŽEECC""ԠYYrrDŽEE''==шEEYPNRYTNHFFFFFFFFFHHHFFFJUbRRNJHHHLHFFFFFHPLFFFHPTUbUTNPHFFFF`oLHFFHPgZ`PxiHoTHNNJYUHL\g`\UTRPNLJJJJHHHHHHJJJHHHU{bYUWUTTTRRRPNNLJWttcTJHJPgb_WUY`geWPNNLLJLLLJLLLJHHHHJPf]WWWZ`c]`\UTRPNLLLJJJ`sxtg]WUUeRRRIII&{ToHRPPPGGG&{ToHRNNN<<<PPPGGG&{ToHRPPPGGGJJJ<<<&{ToHR===>>>DDD222???@@@???<<<EEE777LLLEEE000+++;;;???WWWNNNIII<<<111<<<000JJJGGGMMMVVVVVVKKK[[[HHHHHHFUUJffNjjxTkkJccFbbF``D]]@YY8NNY]]TTT,,,999%%%>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###DDDDDDGGGDDDBRRJffNjjxTkkJccFbbF``D]]@YY8NN;BBHHHHHH666&&&NNN>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###NNNQQQTTTNNNQQQTTTNNNOOONNNAAAGGG???AAAGGG???AAAHHHAAAIIIbbbIIIIIIbbbIIIIIINNNAAAGGG???AAAGGG???AAAHHH''%%f''ՉPPggzz{==KKBBJJ''ՉPPggzz{==KK'']]FF}xss==KKT\YJFFFHHHHFFFFFFFHJcmcPLHHRHFFFFFPNFFFHPWb\WPHFFFFRp}eHFFFH_m`_u\LpRFZLHN\UHW\xtmn{~mZTPNNNRTRPne~__ZYWWUTezNJNYj`]\WT\RPRRPPPPTcf`\YZ_ge`]Z\ci`Rrxuncvem|#CKvem|#CKYYYBBBMMMvem|#CKFFFvem|#CK;;;999lllAAA;;;HHH<<>>JJJBBBLLL```;;;...===<<<999===FYYJffJggUoo]ttRkkHeeFbbD__BZZ;RR@JJ888333555BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...RRRZZZBBB===FYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRFPP;;;000BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...sssQQQsssQQQssssssQQQsssQQQsssrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr'';;pp22""ttίLLcccc;;pp22""ttίLLcc22igiTT|vvزLLccgY\b\NHFFHHHHFFFFFFFHL_RPPLHJPRUJHHHHNNHFFHPUWZg_WPHFFFFH]eNFFFFHRenYJfunHFLzHHNNLTJJNWWjfc`__`bjcbp{_`kgecgc`cnimjnunHͯYcrHͯYcrGGG<<<HͯYcrNNN???HͯYcrBBB;;;VVV;;;DDDGGG***555???FFFJJJLLL;;;@@@GGG@@@@@@FFFFFFFFFHHH<<<888"""===OOO>>>DDDZZZCCC===BRRHbbHeeHeeHccFbbD__BZZ=TT5@@YYY444EEE555NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;bbbHHHBBBCCC===FUUHbbHeeHeeHccFbbD__BZZ=TT8BB@@@VVVTTT+++!!!???NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;,,}DDHH55vvUU..BB..DDHH55vvUU..''''`ZiiȯUU..eijRJHLJHHFFFFFFFPoogPLNU]LJHJJHFFRZxg]NFFFFFJJFFFFFFNcgnewTZgUFHFgu_FHNLJLUY5N_2{5N_2{NNN:::5N_2{5555N_2{GGG888888;;;===@@@TTT???IIIFFFJJJTTTIIIAAAFFFNNNGGG888===BBBRRRQQQIIIDDDFFFFFFFFFFFFNNN[[[GGG444///999***...555@@@]]]\\\BBBBBBDDD@BBDRRDYYB\\BYY@UU=HHFHH888]]]@@@...:::NNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===DDDZZZ999HHH;==R]]BYYUggBZZ]kk=HH\]]RRR---CCC>>>NNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===''''''''''''''''''''''''''''''''''..++55ee}}''++55ee}}''}}''_UPJLPNJHFFFFFFHLT]TPRPNPRZ\RNNJHHHFFLTZjmZNJHHFFFFFFFFFFFN`co`PJNPHHLJLTHFHNNNJJLRWYn~n~ZZZBBB333n~FFF***n~PPPJJJJJJPPPOOOPPP^^^PPPKKKRRRNNNPPPHHHPPPPPP\\\RRRNNNRRRLLLPPPJJJJJJGGGBBBBBBDDDGGGDDDHHHZZZGGG@@@DDD;;;DDD;;;FFF999HHH888AAA===BBBDDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000GGG\\\DDD<<>>aaa222000DDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000vvBB''VVBB''VVvvBB''VV''++ѴǕBB''VVncYNPJHFFFFFFHUuwiRNPU_ZPHHHFHWccPLJJHFFHHFFFFFHW]v{rcwNJHFHLPLLHHLPLPWZ{Mgn{MgnGGG{MgnNNNAAA{MgnGGGbbbDDDZZZBBBQQQBBB___ZZZ;;;>>>>>>ooo\\\FFF>>>YYYHHH888IIIfff999888GGG>>>[[[;;;III]]]@@@444iii)))DDDvvvooo\\\FFF>>>YYYHHH888IIIfff999888GGG''++PPBBssPP''++PPmm{{{{UU;;++PPebWURRPJHHFHHFHJT_UUTNPTWZ_\NHHHFHRcYPPPNJHHLLHHHHJJPTWc\sTLJHHJPUTWNLPTRPTWZZiPPPGGGRRRIIIRRRDDDUUUFFF@@@KKKBBB@@@EEE999TTTLLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<KKK999BBB>>>III888OOODDD666LLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<''''''''''&&&&'';;'''''''';;''''''''''&&&&'';;''''&&&&&&&&&&&&&&'';;r`WZRNJHHHPJJLWz}bTWPW``UNJHHFJoszRUPPNNJLLNNR\_uT}LLLNYZZUUT]`]H"!H"!H"!H"!LLLDDD>>>TTTNNN>>>KKKBBBVVVIII>>>GGGLLLNNN>>>KKKBBBbWUURNHFFH_PLNWgYUZURU\biPJHFFLegW\UZUPPPNNRRNNTYWzR~TNPRRT|WW\WWZef`NNNOOONNNAAAHHHAAAIIINNNAAAHHHoWYTHFFb]R\`\]WWcpeJHFHN~|]~isYRRWPTffWZ]WUYe_YtvbssssssUY]PFFFLYUTr]oZvW|ZpRJHFHP{vYUUWYUPRU]bi\YRRNTZn\jpWYWHFFNefWYfsizTwfJFFHTxi\Z{\UTrsrjWPNP_c]iYTWfeNFFHRWYUWTxHFFJfTwfTTU\Z{\]c_PNPRWrTYfLFFFP]UinHFHJRpZZveo]x}]RUWUYmvtzpnj\nZNR\sib\UR]JFFHNTZYWN~HFHJPecZWWZ]\Z`fZTPPRWRRRRYi]~btYZ_eZYUTW]\ZWZ}""""""fWL_HFFNUUbm}eFFHPib\UUZYkYNNRNNPPZ\Wgk`feZWk\WWRPTWzNNN######))) ###WLJJPPHHHJNRZWW`JFHHJNU``WTPTWWTb\RNNNLLJLNNPRPTURR]`]TUUUUYZZWYU|NLLLLRT}_u-NWR]P\LWDM9A-NWR]P\LWDM9A-NWR]P\LWDM9A-NWR]P\LWDM9A***;;;$$$555""";;;$$${_TJHFHHFHHJPRWbe}cRHFHHHN\_ZTNUUcWPJHHHHLLHHJNPYiZWTRTLWUPJHHJT\sOekhvsusm|`oPZEOGGGKbhhvsusm|`oPZEOOdkhvsusm|`oPZEOOekhvsusm|`oPZEO@@@???&&&%%%+++"""333***999)))***%%%222###+++333***999)))***?NTTVZ\\>hxr?NTTVZ\\?NT\ZZZTTTwUPHFFFFFFHJPPPNYnWNHFHHHLPYZ_ZUPNNRRU]ZWPHFFFFFHHFFHJJLPcZWWPNLNPPLHHLLRPLHFHJNcwRpxw}vkzWcFPGGG***Jiqw}vkzWcFPKjsw}vkzWcFPRpxw}vkzWcFP111--->>>!!!666)))<<G<<<777)}wiwNZ>G0wiwNZ>G3wiwNZ>G<<<&&&BBB,,,!!!222[[[TTT"""''''''+++000444@@@OOOJJJ""",,,444000&&&+++111@@@555&&&""""""""""""'''***@@@@@@HHH'''***555555222222<<<DDD000CCCTTT000HHH8885;;'55"22".."+++..+++@@@DDD---<<<===,,,>>>zzz-00BFF'22"22".."++'++-00@@@***888...>>>...EEETTT222moo'22"22"..'.."++8;;555@@@===<<<===,,,>>>zzz-00BFF'22"22".."++'++-00@@@***888...,,m%%^ ^ ]\ZZYYYYYYYYYYYYYYYYYYYYYYYYYYYYQvw\\|||YYc;;jhvw\\|||YYc;;jvwooвÍ]]tYYYYYYYYYHH]fe`_````Y{p_HFFFFFFFHHHHFFH\b\gZUHFFHNNHHHHJUPHPRncenRHFFFFNe]HFFFFHW_gjWNJJTLNHHzLFHnufJ~xb`__`cefmw~`_{pbccejskc`cfgecceegjks{nucznijtxrmiijntt_mFR"***t_mFR"t_mFR"t_mFR"111000444%%%<<<UUUDDD}}}]]]...&&&+++111<<<,,,"""'''444BBBeee777...FFFGGG222VVV;;;;BB2BB5HH5JJ5JJ2FF.BB'88++'++...777==="""<<<rrrxxxMSS2BB5HH5JJ5JJ2FF.BB'88++!**000DDD888TTT>>>===@@@444888Y]]2BB5HH5JJ5JJ2FF.BB'88++"''===777---""" <<<rrrxxxMSS2BB5HH5JJ5JJ2FF.BB'88++!**000DDD888--~b`````````````````````````````````Y@@u]]i""7h@@u]]i""7BBwȶ``eeoooooooooffptric`````YmJHFFFFFFFHHHHFFFJTY\RTbYWPHFFFNPFFFFFHPRJHHLNPR__m_RHFFFHe}pRFFFFHPRWY\\ZWNHU\LNNHLZFRpL\nPPRRTTRNNLNNNPPPTWZnmYRNJNZz{eRTUUWWWYZZ__e~TPPPPPPPPRRRRRPRRU\TUW\]`ccnuxwr_R`c]\ZZ]`g_ZYY\]`f?{m|NZ7=WWW222NNN;{m|NZ7=;{m|NZ7=D{m|NZ7=+++DDD^^^NNN<<<sss```~~~<<<666'''+++000777000+++TTT000777IIIMMMDDDIIIBBBLLLaaaRRR@@@FPP8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++===@@@###BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""AAA]]]YYY@JJ8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++...DDD666BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777""""""%%%###"""``n66M ?777777777777777777777``n66M ?777777777777777777777&&e````````````````````````````````_YTJJvBBggjTTmIIzJJvBBggjTTmJJvBBffeexxxxxxxxxttw++ug``````YbUJFFFHHHFFFFFFFFFHNYNYUTPHFFFLPHFFFFFHHHHNR|j`ZgPHFFHLo`FFFFHNUbo\LHUYJNNToHixP{UHHJJJHHHHHJJJLNRW\`guxPHJTctWJLNRRTUUYbpPHHHJLLJLLJLLNPWgYW_bgUW]gtxs`JJLLNPT\`]c`ZWW]fuBBBtZgBL@@@<<<tZgBLEEEtZgBL@@@tZgBL777&&&FFF|||>>>sss888IIIJJJ>>>BBBDDDIII###III???666)))>>>8BB;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22"''555888)))GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***```999;;;8888885@@;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22'++@@@!!!GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***NNN######)))   ###]]v]]v&&r````````````````````````````````]YTBB``ȳff7CChBB``ȳff7BB``||HHZZpb``````Y\THFFFU\LFFFFFFFFFFHJLLJNU_WRLHFFFLPHFFFFFFFFFFHNRR]]YUZ~UuTNHFHLUukJFFFHJJNPWbWJFJLHLPHY}L}UW]FFHHHHFFFFFHJJJLLLLLLPTUY_WLPUZewpNFFHHHHJLNPRWYUWW_RJHFFFFFHHJPUZ]ZUUWY\bffbWLLPT\gWJHJP]juzufNFFFFFHJLNT]]\YUWZWWWWWZi999 xesHQ***222EEE000xesHQEEE&&&xesHQ444xesHQ000...AAA===:::DDD&&&222wwwJJJ~~~ccc===NNN===###GGGAAA@@@>>>HHHBBB""")))444HHH@@@JJJ@@@iii888\]]=TTBZZD]]D__D__F``F``F``F__D]]@YY;PP.BB++8;;HHH666 HHHBBB@@@999<<>>BBB___FFF@UUD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++222777"""FFFQQQFYYD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<>>>!!!666)))<<>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888...>>>...EEETTT222moo'22"22"..".."..".."..".."..".."..".."..".."..".."..".."..'.."++8;;555@@@===<<<===,,,>>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888...''V''r''V''ʀžub````````````````````bgpurfLLYBBYZ]]FFh]]FF]]Ȏkk{`````````YTJFF]rRFYkZJJHHm{sYHYnTHJHFFJRPL\ouPFFFFFFHP\e`WPHFFJPJHFFJLHFFFH\LFFHNbm]]R]fYFFLf|w`bUiztfb]U`efecemzs]JFFFFFFFHJT`}cZYYYYTNHFFFFFFFFFFFFFFFHHHw`JFHJNRNPNPTtJT]fn{bYLFFFHJLLNU`sTTT"""[[[vem|AHIII""""""___FFF999vem|AH<<<qqq===...vem|AH"""@@@vem|AH~~~HHHFFF)58crm|opn~jzesZgNZFR>GTTT;;;###pppsss%26crm|opn~jzesZgNZFR>GHHHBBB333AAAHHH)58crm|opn~jzesZgNZFR>GBBB<<GDDDTTT222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..bbb222>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFQQQ999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222@@@+++>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222VVV;;;;BB2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++'++...777==="""<<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888TTT>>>===@@@444888Y]]2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++"''===777---""" <<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888''''""''''ɀ¿wf````````````````ckwtHH]YYYBB`JJNN7hJJNN7JJ~ȍ88p`````````YbRLHFFRzUJkwcJJHHgzpUHNnYRLHHHFHPRNTggHFFFFFHJRRtWgb]LJR`eYPR_meLFFFYnLFFJPW`__U`jbFFPfseZe\_ncZWPNR\pUHFFFFFFJPcsgc`]\UPJHHFFFFFHHHHHHFFFF}wvvwvtoePFFHHHHHHFFHJNNPPUL_{YFFFFFHLNNNNNPTUW\JJJ@@@HͯYcr777***YYYDDD<<<HͯYcr222(((III555---HͯYcrDDDTTTGGG444,,,HͯYcrBBBJJJLLL...$375@B.2EEE<<<IRn~{}xtm|_mNZEODDD...$375AC3>B%*<<<@@@IRn~{}xtm|_mNZEOIIIrrrvvvB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..888###QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222NNNKKK999@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBAAA%%%QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222LLLaaaRRR@@@FPP8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++===@@@###BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""AAA]]]YYY@JJ8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++...DDD666BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""''xT''''x''xT''ccſ¶LLxkc````````cgo{++ffpYYYYYY22}\ů¿++cmmů¿++cmmů¿++cDDƾg`````````YuPHFHU{TNoxbLHFWieLHZgRHHHFNUUNZrzPULHFFFJNWcei`iwwob_s`HJZ~NFFLUji_`]ew{YHU`_RTc]]fWLJLYx`z~|\HFFFFFHPefucYUUUURRRPPNLLNNJHHHHHHFp_PTZ]Z_bYJFFFFFFFFFFFJNRWWvWcn|cHFFFFHNPNNNPUZZBBB;;;TTT1N_2{000555QQQBBBMMM4N_2{222;;;---vvv*N_2{```[[[444&N_2{JJJ-DG`mgvgv_mT_+;?uuuHR{{tiwUbFP===?G`mgvgv_mT_38WWWHR{{tiwUbFP666@@@#BI`mgvgv_mT_+;?FFFHR{{tiwUbFPCCC)DI`mgvgv_mT_6>@;;;HR{{tiwUbFPbbb111666EEEB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..sssjjj)))GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@EEEWWWBBBB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH".....GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@666)))>>>8BB;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22"''555888)))GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***```999;;;8888885@@;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22'++@@@!!!GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***''kT''++q''kT''ǎ˄ZZttwoooYYYbbbgg|TBBȨ==o..7hBBȨ==o..7BBȨgiiþc`````````YWNLHNbezRPor\JLFFHRPHFNWRHFFFHT\UPb\rZRFFHJLNTUWfsxt_eT`PFHP]ZZbfrc`ZULL\\_eUFFHLPPT`||r\LHFFFFFHP_czm`YRPNNPRRRPPPPNJHHHJJJJJn}oc\Z_e_PHFHHHHFFFFFFHLRWYno`UPLHFFHHHHHHHLPZbIII===@@@n~)58DDDTTT,,,OOO===OOOn~+7:555!!!HHH\\\333JJJn~)59DDD|||sssUUU---555n~&36LLL@@@/_i~~vgvNZ:@!&wm|WcEO@@@-]f~~vgvNZ ;A!&wm|WcEO@@@Lmv~~vgvNZ:@!&wm|WcEO@@@Inw~~vgvNZ7>!&wm|WcEOGGGrrr888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..&&&???... ???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""BBBCCCCCC777B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..;;;DDD000???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""iii888\]]=TTBZZD]]D__D__F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__D]]@YY;PP.BB++8;;HHH666 HHHBBB@@@999<<>>>>>000JJJ777HR***WWW>>>OOOAAA555666HRFFFddd'''!!!HRsssiiiLLLBBB555n}o"IQ~iwCLv`oDMLLLBBB555n}o"IQ~iwCLv`oDMLLLBBB555n}o"IQ~iwCLv`oDMLLLBBB555n}o"IQ~iwCLv`oDMDDD888444777B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..^^^sss...DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%HHHFFFTTT@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..***777"""DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%GGG888444FFF]kkD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB'..WWWPPP+++IIIQQQFYYD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<>>>BBB___FFF@UUD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++222777"""IIIQQQFYYD__FbbFbbF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<++vv88i\?==>++vv88i\?++ŀԿ׸ո҄zz``ffuuÃxxxeeb?Ͳ""\Ͳ""\Ͳ""\mȩuu``````````YeJRiv_]cRHFFFFFFFFFWcNHFFFHYcY`uonTJPUPHPcNYwvZ\}fFHLTptR`{fcjiicWLFFJ]ib]YWPNHFFFFFFFHHHHHHFFFFoYHFFFFFHJY`}|r}~mJN]isuoeNFFFHLRZeLRewuTL\ZWEEE@@@9!&AAAHHH@@@@@@KKKGGG888<!&'''"""VVVKKK===<<<6!&uuuAAA+++"""AAA3!&^^^ppp,,,qqq8iu'^kwR]}m|LWqqq8iu'^kwR]}m|LWqqq8iu'^kwR]}m|LWqqq8iu'^kwR]}m|LWSSSLLLZZZB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..---%%%AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))QQQGGG999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@DDD---AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))IIIZZZBZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..222555(((AAA;;;888888BZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..555888)))"""OOOKKKBBB;;;BYYFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..BBBDDD---AAA;;;888888BZZFbbHeeJccF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``B\\=TT2FF"..555888)))"""ϪTT`_LLϪTT`_ϻΡ22bԿ׸شռʯeeIJè_rrϹĶY7rrhrrϹĶY7rrϹĶYgȚff``````````YPJJJ]wnfbeRHFHHHFFJHFLUULFFFFHYgcmgkZYPUYRHJRRLWpvTcrgvFFJR]]PJ]xkjfmtwiRJYnef}jecejookYHFFFFFHHHJJJJHHFH`HFFFFFHLR]fogeLNe}eJFHLNPRUgLLTZ`zgLLTZYTPJJJBBB555\gZgR]CL*0<<>>HHH[fZgR]CL*0WWW###"Wb]lz"rw5~Zg2YeT2sP\"Wb]lz"rw5~Zg2YeT2sP\"Wb]lz"rw5~Zg2YeT2sP\"Wb]lz"rw5~Zg2YeT2sP\666:::@@@iiiD\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..wwwFFF###GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999@@@BBBDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..;;;'''GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999AAA>>>>>>@@@eeeUggHccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22{{{FFF###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999@@@BBBDDDB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22===---###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999""͠||;;jYYi^""TT""͠||;;jYYi^""͠м_```Ӿ׸شռʯHHЃ^УY||++++hУY||++УYbȘʻ``..``````````YcJJHL_YzvijWHHPURHHPPHJUbJFFFFHZsuzfLH`\YZRHJRfLUjwPo|oLFHP{NH\oj`mtjz{icWRRZirxwkRHHFFFHHJPNNRuRFFFFFFJT]_gui`LHLb{p]JFHNT\xfNR\cebbix~oZLFJRWTNNNNGGG;;;)Ze{~wiwPZ:@FFFEEE???AAAGGGDDD)Yc{~wiwPZ7>;;;@@@DDDFFFHHHHHHIIIJJJIII...@@@zzzQQQ\\\VVVAAA555%Yd{~wiwPZ:@uuuuuu222KKKFFFBBB===;;;888555...333)Ze{~wiwPZ ;A,,,iii2225555Z6nz+Ŷk[g_Ҳv;uR]iii2225555Z6nz+Ŷk[f_Ҳv;uR]iii2225555Z6nz+Ŷk\g_Ҳv;uR]iii2225555Z6mz+Ŷk \g_Ҳv;uR]DDDTTT222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..bbb222>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFQQQ999B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..222@@@+++>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..qqqBBB]]]===BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22555bbb222DDD777BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, FFFQQQ;;;DYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'55@@@BBB+++DDD777BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, bb֦FF""YYc88jSDD@@gbb֦FF""YYc88jSbb֍UUrY_88׷شռʯkk''``JJuSrrѶ""`ǕLL7rr55hrrѶ""`ǕLL7rrѶ""`\ȰzzZZ``````````YNHHFFHHm}cJJ\b]JHUTHJiRWNHFFHciFHij\ZNHLiRJUiu}_}{z]HHLZgLFY|~iYgkj]JHHHJT\bcZLHHHFFHHLPPRRRTWzgPFFFFFFHU]]_bcLb}oTHFFHTeok`RHFFFHPU]x~okcZY\]\UPPRRLHFFHLPUYZRP<]f~n}NZ+;?!!!??????FFF<_g~n}NZ6>@<<<666---111XXX@`i~n}NZ+;?222EEELLL>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***NNNLLLBBBDDDDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HH5;;BBB<<<%%%>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***Լɬ55]]i||njjԼɬ55]]i||nԾ˧YYsxxΚزջʫ``ȶnѲ55\Ȫgg55DDѲ55\Ȫgg55Ѳ55\YnȞ՗υ``````````YbNHFFFFFe]JbjbLFJNHRbetpZHFJ}oHJv{]WJHTgLZjpp}|~mZPJuLFTnrYZk_JJHFFFHJJJJHFFFFFHPUZ]}xoifgorj\PHFFFFFFPWZ\ZZJLg}{v`JFFFFHJJFFFFFFHR_}Njrijjjgc_]_gu}iRHFLU|TRDDD}gv??????BBB}gv@@@DDD777\\\}gv222LLL555777[[[}gv444III1%YdHv{Z.hvaefIII6)ZeHv{Z.hvaefIII4)ZeHv{Z.hvaefIII*|)YcHv{Z.hv_cdbbb111666EEEB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..sssjjj)))GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@EEEWWWBBBB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH".....GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@```999;;;888;==HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB222===NNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$UUUZZZ@@@@BBHbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB888888)))***NNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$''ϖĠTTn\\|''pp++''ϖĠTTn\\|''ϖLLr`_zLLvvTTƞΰ͘ʚ˩ǕYYiiDDffoorrǗZZwRRp\\ww7RRhrrǗZZwRRp\\ww7rrǗZZwYbTTƲ``````````YLHFFFFHc_ezgJFFFFHRg{wb\nxLN`NHHLURL]jmw{pg]LRfLFJtconNjg{eb\PHFFHLLJJJHHFFFFFHJNUZYix\LHFLkrUFFFFFFFLRRUUUWYWW|TwPJ]z{|ZFFFFFFFFFFFFHJPUNbwnYY`fiigefnznUHHJN~T|WYDDD&&&vT_.2AAA???444999 vT_999AAAFFFHHHIIIMMMXXXNipvT_!!!---OOOEEE===888111<<>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###DDDDDDGGGDDDBRRJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NN;BBHHHHHH666&&&NNN>>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###==Ϸffggjx--Y88xx++a==Ϸffggjx--Y==ww\Ybx--Y55]]ͤHHk==Ҥ55JJHHh55]]ͤHHk==Ҥ55]]ͤYZuvvظssc`````````Y`HFFFHRe{UFFFFHP}{~\UgHFHLWeLZgjtj__L_JFF\WwTzis\NJzjbUHFFFFHHHFFFFFFFHJUWUUY]sUNJHHZnskZLFFFFFFFHJRTTUizYYgu~z~YHFFFFFFFFFHJTmYrfTNZgmmibZUWctugPFHLZZbbb...EEE555~_m5@B+++EEEEEE~_m3>BDDDHHHIIIIII[[[Pjr~_m(49***TTTBBB===555-W`~_m%58---"""iiihhhTTTYu}PjrNipAAA///~Lkseee;aj-W`lLLL...~Rpx===4]fRxJJJGGG555~Rpx777555AAA>>aaa...RRRZZZBBB===FYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRFPP;;;000BBBFFFYYYAAAFYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRY``>>>aaa...Ё55""""pp@@uvЊ;;Ё55""""pp@@uvЁֿgg{Y\o||BBwv""22]Ρ7""zzh""22]Ρ7""22]Y]LL8855k`````````YNHFFFJZfuHFFFHNcsfJFHLrPJUegwuUJPJLWJFHTftgfUZbgovgb]RHFFFFFHHHHFFFHJNRUYWWWWLW}ui_YTRRRHFFFFFFFHHJNPPPPR_gwn\PHFFFFFFFHJPU\otcTHFLZfvxpfZNHHLRf===)))...0002228884]f;k5gv/<>III===<<<@@@BBB>>DDDZZZCCC===BRRHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT5@@YYY444EEE555NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;bbbHHHBBBCCC===FUUHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT8BB@@@VVVTTT+++!!!???NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;55ڼbb'']]YYUU55ڜ55ڼbb'']]YYUU55ڼ55_cZnHHìшvv]]w__YYсFFшvv]]w__YYшvvYYiȚ88""x`````````Y_HFR\R_eNFFFFL{\HFH_bLP`f}`HFFFUiJNZuspfbwwuUJLJHFFFFHWgmgYJFHT`cbfkHH_rnw{j\PJHFFFFFFFFFFHHHJNNTZxtTLP`uvfYRPNLLLHFFHHHHJLR_}ZP\ioR]wWHFFJWbffb\ULJJJJL\+++<<<555888>>>WWWiwgv!16TTT"""EEEBBB:::@@@BBBDDDKKKiwgv$37444iwgv$37GGGHHHBBB:::<<<BBBBBBiwgv"37DDDwww<<<HHHnnn\\\HHHQQQ!;WWWNNN===III\\\888HHH"D888222JJJWWW"?;;;777FFF@@@JJJ<<>>NNNTTTAAADDDDRRBYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BZZFYY;FFbdd]]]000rrr===..̗\\__⡡ww55FFBB}..}}..̗\\__⡡ww55FFBB}..~~YYYs""BB}ZZ;;RRx\\]]7ZZ;;۝hZZ;;RRx\\]]7ZZ;;RRxY\s׆`````````YTJH]oZ`UJHFFJ`jgwNFFHTPLJ_iPFFFFHP_`fvxccnfeRiwtspk_UUNHFFFHHFFFFRiz{seRHJTYfi`ffLFFJ_ibTJFFHN\fg`]\YUPJFFFFFFFFFHJLLLPNTYfwiLFFFHUjpm]LFFFFFFFFFFFHJPPPNNPPRW{]NHFHRkzwfRRiLFFHHP]]TLN\YTPNLLNEEE888888222B˶r`mNNNBBBDDDKKKTTTB˶r`m)))###B˶r`mSSS===FFFNNN444===B˶r`m~~~}}}JJJLLLHHHFFF[[[XXX===666SSSYYYBBB<<<;;;GGG666>>>000EEE777fff888KKK<<<KKK===MMMAAA>>>>>>@@@eeeUggHccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22{{{FFF###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999@@@BBBDDDB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22===---###KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999DDDHHHZZZGGG@@@DDD;;;DDD;;;BBBDDD777BBB@@@999DDD999@@@DDD777BBB@@@999DDD;;;FFF999HHH888AAA===BBBDDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000GGG\\\DDD<<>>aaa222000DDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000ԣ丸§͘==\\ggLL++..mmpp``Ԭ]]ԣ丸§͘==\\ggLL++..mmpp``ԣ丸 Y]\i~""``''ӃϮ||̵''""''Ӈ~~h''ӃϮ||̵''""''ӃϮ`]Ynxxױf````````Y_JH]nW_UTLFFJggYnHFFJb`LH]oLFFFHLNisu~w]Rfkcki]RU\eknmg_TJFFFFJUPJFFFRepsjZLHL_miexYJFJY]THFFFFFHJHNWZZYUNHHFHHHHHNNRRWczjLFFFFFJ_gZHFFHHHHFFFFFFHJRZY]pUJHFF]zxfxtRFHLLNUTLPmkWRW^^^RRR'''[[[QQQ0al+"~aaa/ly+"~)DI...III>>@@@;;;888...@@@888DDD===OOOBBB<<<qqqBBB]]]===BYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'22555bbb222DDD777BYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, FFFQQQ;;;DYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'55@@@BBB+++DDD777BYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, GGGbbbDDDZZZBBBQQQBBBTTT<<>>>>>ooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGG>>>[[[;;;III]]]@@@444rrrrrrTTT@@@444rrrrrrTTT@@@444iii)))DDDvvvooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGG''ض˜||­̝Ǖ||]]ȅJJv''ؿRRIIz''ض˜||­̝Ǖ||]]ȅJJv''ض˜`YY]uȅJJv֯雛bb7ֳ]]h֯雛bb7֯雛YYZo;;w````````YTJHWZJ\w__THFJ_Zt`ZrFFFHRPJH\tTFFFJ]Wewx{xfRRxwimne]PJNW\_]ZTLHFFFFNTPHFFFHLUYTJHHLR`nUP]geUHFFFFFFFFHJNRRPLHJJJLNNPRRRPPPPRRTUetu]HFFFFFP_]PHHJLPRPLJHHHHJNTZ`jULHH`tz}|wkcjJFHLPRTTYYzT}R~f...222;;;666888;;;===@@@4Lmv@@@BBB555*|InwCCCDDDBBB@@@888<<<;;;"""IIITTTzzz1/_iJJJLLLHHHDDD;;;===444OOO+++???BBBYYYWWWeeeeee```6-]f===KKKHHHGGGzzzJJJVVVAAA222^^^???TTT888BBB<<<@@@222[[[QQQ555III777@@@IIIBBBQQQDDD999IIIXXXR]]HeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHmoo\\\###""")))>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***NNNLLLBBBDDDDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HH5;;BBB<<<%%%>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***RRRDDDUUUFFF@@@GGGFFFEEECCCEEEFFF@@@GGGFFFEEECCCEEEFFF@@@KKKBBB@@@EEE999TTTLLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<KKK999BBB>>>III888NNNGGG111DDD:::LLL888MMMGGG111DDD:::LLL888NNNDDD666LLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<88۷ٛRRxYYu˨DZNN]]88]]88۷ٛRRxYYu˨DZNN]]88۷ٛRRxYYZbn~~]]..ڷ˧55..RR..ڷ˧55..ڷˠYe\bzԃb```````Y`HHJHHkgZHFJ_Nc`FFFH`fHF\xLFFTjbwxtuwbf|nstbPLJJHHFFFFFFHHHFFFFFHHHHJJJRicb\JHHHJHHHHHHHHHHHJLRPTRRRUWZb_iu||n]TJHFFJLLLPRY\PNLLNPYeuUNJTepsniccszYJHJP\cpuWvZ}j@@@@@@GGG[[[r777BBB555<<<iIIIHHHEEEBBBhhhXXX_+++KKKNNNZZZAAAdddccc^^^kkkSSS\\\r===IIIHHHIIIwwwOOO;;;JJJccc+++===FFF777...'''222dddDDD@@@CCC<<<TTT@@@SSSYYYFFF;;;```999;;;888;==HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB222===NNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$UUUZZZ@@@@BBHbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB888888)))***NNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$LLLDDDHHHBBBKKKDDDHHHBBBKKKDDD>>>TTTNNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBBVVVIII>>>GGGOOONNN666DDDOOONNN666DDDLLLNNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBB..گvv22]HHkRRpJJw==n++cBBJJ..ڳ~~JJ..گvv22]HHkRRpJJw==n++cBBJJ..گvv22]YYYZbgmmmg++cBBJJ88۶ڸ—Dz @88ۿ]]h88۶ڸ—Dz @88۶ڸ~~55_YY_s88u```````ZRHFFFFpm]JHLbJTweJFFHNPHF\{iLH]mbcugjznw}szxjTPJHFFFFFHHHJJJLLLLNNNNNNNNNPTY\URPNNPRRTRLLLLLJJJJLNPRUYYZ`eifb`}YU\eimj]LHHLPRW\]]\WTTTTUY`Zbov{zsmknptz{n`LLTbb{6nzlz^k"IQ666GGG333FFF5557776mzlz^k"IQZZZhhh6nzlz^k"IQ6nzlz^k"IQDDD;;;RRRKKK>>>===333dddEEE===BBBEEE777KKK111RRR888<<<RRR===TTTOOOGGGKKK:::___JJJ::::::VVVKKK[[[HHHHHHFUUJffNjjxTkkJccFbbF``D]]@YY8NNY]]TTT,,,999%%%>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###DDDDDDGGGDDDBRRJffNjjxTkkJccFbbF``D]]@YY8NN;BBHHHHHH666&&&NNN>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###NNNQQQTTTNNNQQQTTTNNNOOONNNAAAGGG???AAAGGG???AAAHHHAAAIIIbbbIIIIIIbbbIIIIIINNNAAAGGG???AAAGGG???AAAHHHփړŤZZx55\""`YY""Z..Yjj~HHև띝FFփړŤZZx55\""`YY""Z..Yjj~HHփړŤZZx55\""`YY""Z..Yjj~HH''أ̼''ج}}h''أ̼''أ̼gg{\`Y_``Äf``````ZiHFFFFHwsn_JJPjJe~|bTHHHb|HFZ|{j]niZm]]iozzp{|wULJJJLNRTUWZYWUU\ocbb`ZUTRRTY_bv{gTbbWP\jzwnkg]]`cpw{xnfgjkeRf}8oEEEBBB???GGGIIIZZZ7778888o{{{8o8o<<<:::nnn222WWW;;;\\\------,,,OOO555EEE222888III;;;DDDeee;;;222000NNN<<<999===FYYJffJggUoo]ttRkkHeeFbbD__BZZ;RR@JJ888333555BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...RRRZZZBBB===FYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRFPP;;;000BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...sssQQQsssQQQssssssQQQsssQQQsss'';;ۈ͗ºȯJJ'';;ہzzHH'';;ۈ͗ºȯJJ'';;ۈ͗ºȯJJ5566M蜜;;h5566MڿwwLLrYY`LLb`````\PU]THFHtk\LPRHZmsbTUJPYHFY{ru|eTcWPWgxxikztevj__bejmnnvogjigreefii^kHHH<<<OOOCCC@@@888888;;;^knnnHHH^k^kGGG555&&&>>>\\\HHH;;;555...''',,,[[[LLL222222888AAA^^^EEE+++)))EEEBBB@@@[[[aaaBBBEEETTTEEE<<<222***777MMM>>>DDDZZZCCC===BRRHbbHeeHeeHccFbbD__BZZ=TT5@@YYY444EEE555NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;bbbHHHBBBCCC===FUUHbbHeeHeeHccFbbD__BZZ=TT8BB@@@VVVTTT+++!!!???NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;""]]rrDzҶϣIJˢeeBB""JJRRDD55++""]]rrDzҶϣIJˢeeBB""]]rrDzҶϣIJˢeeBB..55ځĬFF..55ڊxx++..55ځĬFF..55ځǧUUr_22bƶ}b```` ]{zfZgweWL`JUgji]eTeJFTvx|UUJHN\b\R]`TvZϐlzGGGdddfffZϐlz[[[LLLZϐlzZϐlzXXXEEEIII===888555222+++&&&ppp;;;"""!!!555555,,,===...&&&JJJ""""""))) NNN""" WWWGGG<<<222***]]]\\\BBBBBBDDD@BBDRRDYYB\\BYY@UU=HHFHH888]]]@@@...:::NNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===DDDZZZ999HHH;==R]]BYYUggBZZ]kk=HH\]]RRR---CCC>>>NNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===55dd55dd55dd55ddrr==֖ڼɦ||JJ]rr88ppjj@@hrr==֖ڼɦ||JJ]rr==֖ھˍže``` ^~v\NPZPP]Zr_Yg\UPHJguUuUHFFJWnPHFHJb5]'n}3bl@@@0005]'n}3blCCCFFFHHH5]'n}3bl5]'n}3blIIIGGGRRREEEEEEaaa+++''''''---444444@@@DDDDDDTTTIIIEEEEEE===999BBBTTTIIIEEE999BBBWWWGGGGGGDDDHHHZZZGGG@@@DDD;;;DDD;;;FFF999HHH888AAA===BBBDDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000GGG\\\DDD<<>>aaa222000DDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000''bb֠Ъvv''DDTTLL==''j''bb֠Ъvv''bb֠лŖ22reb%%^JoUJU\LPLZJJ]b\JFNjieJFFJUfZFFHNlll555"Wb8iu555@@@lll555"Wb8iu555GGGHHHHHHlll555"Wb8iu555lll555"Wb8iu555GGGbbbDDDZZZBBBQQQBBB___ZZZ;;;>>>>>>ooo\\\FFF>>>YYYHHH888IIIfff999888GGG>>>[[[;;;III]]]@@@444iii)))DDDvvvooo\\\FFF>>>YYYHHH888IIIfff999888GGG""++++``n""''..++''""77w""++++``n""++TTԏ΄ccŀ€rr~,,m}~NgRPWJFN_FFPcRHFW_WJFHR]}HHLUBBB222BBB999@@@###BBB222BBB999IIIHHHJJJBBB222BBB999BBB222BBB999RRRDDDUUUFFF@@@KKKBBB@@@EEE999TTTLLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<KKK999BBB>>>III888OOODDD666LLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<PP;;''''''''''''''&&PP;;''''''''@@PP;;''''''''''''''&&PP;;''''''''''''''&&&&&&--}uz|\biPUJL}HFJ{RPnzuxUNHLT{NJ{555<<<LLL555iii===555<<<LLL555iiiKKKHHHKKK555<<<LLL555iii555<<<LLL555iiiLLLDDD>>>TTTNNN>>>KKKBBBVVVIII>>>GGGLLLNNN>>>KKKBBB|sZbRWRWHLYi}}g]gwtwz]RJJ_]UIII555@@@@@@NNNIIIIII555@@@@@@RRRIIIIII555@@@@@@III555@@@@@@NNNOOONNNAAAHHHAAAIIINNNAAAHHHURmx]LPbLJYg]sNLvjbrXXXpppXXXpppXXXpppXXXpppssssss``z}ifiLJPpZWnrwxNN|}frerrgl5BOrgl8BQrgl8BQrgl8BQ=J+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+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2iZhzjxjr}@M^;J\9EViZhzjxjr}>M];J\9GWiZhzjxjr}@M^;J\9GWiZhzjxjr}>M];J\9GWZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5m_wgmUfyvg~@Pb;HX6DT8FY6EU:J\:J[m_wgmUfyvg~@Pb;HX8DT8FY6EU:J\:J[m_wgmUfyvg~@Pb;HX8DT8FY6EW:L\:J[m_wgmUfyvg~@Pb;HX8DT8FY6EU:J\:J[Zm`uTfL\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\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5777777xxmej{BDE;@G7CT;HZ5DU5DU5DUxxmej{DEGBFL7ET;HZ5DU5DU5DUxxmej{DGGHLR7ET;HZ5DU5DU5DUxxmej{DEGBFL7ET;HZ5DU5DU5DUZm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5888...***zvif[oC44+.8.5'.'."+''*&-7//.144@P5BR8FW5DU6BSzvif[oC44+.8.5'.'."+''-!)>664@P5BR8FW5DU6BSzvif[oC44+.8.5'.'."+''-%)A::4BP5BR8FW5DU6EUzvif[oC44+.8.5'.'."+''-!)>664@P5BR8FW5DU6BSZm`ucx8p@n~ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYkTeL\=J+5;;;mmmBBB###888222++++++###888222++++++###888222++++++###888222++++++###???222.......................................###???222.......................................###???222.......................................###???222.......................................###_u\rg3@B*:='.5+2H"+='2@.=".&*!!!29B5BT2@P2@P+7E_u\rg3@B*:='.5+2H"+='2@.=".&*%!!4;D5BT2@P2@P+7E_u\rg3@B*:='.5+2H"+='2@.=".&*%!!9@H5BT2@P2@P.9E_u\rg3@B*:='.5+2H"+='2@.=".&*%!!4;D5BT2@P2@P+7EZm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5UUUBBB AAABBB888...+++***AAABBB888...+++***AAABBB888...+++***AAABBB888...+++***JJJLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***JJJLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***JJJLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***JJJLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***__55}++g58D.;D'.H";@2;H'5B.8F"8D8=+2"'%,/01&)DFF__55}++g58D.;D'.H";@2;H'5B.8F"8D8=+2"'%,>??&,FFF__55}++g58D.;D'.H";@2;H'5B.8F"8D8=+2"' ),CDD),GFF__55}++g58D.;D'.H";@2;H'5B.8F"8D8=+2"'%,>??&,FFFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5S_\\\\\\\\P22UUUBBBHZZZZZZ\\ZLBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++AAAH@@`i]N2''***AAAH@@`i]N2''***AAAH@@`i]N2''***AAAH@@`i]N2''***TTTYYYZZZWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888***TTTYYYZZZWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888***TTTYYYZZZWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888***TTTYYYZZZWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888***55x++e//L/HW=F"@F.HW'=J.=J5=J5=N"5@'5@".5"+2!!*"%, DFF<55x++e//L/HW=F"@F.HW'=J.=J5=J5=N"5@'5@".5"+2!!* FFF!!>55x++e//L/HW=F"@F.HW'=J.=J5=J5=N"5@'5@".5"+2!!* FFF%%B55x++e//L/HW=F"@F.HW'=J.=J5=J5=N"5@'5@".5"+2!!* FFF!!>Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5++++++++++++++++++zg22UUUBBB`wnmnpw|}Z++++++++++++++++++BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++???T@@jW5''???T@@jW5''???T@@jW5''???T@@jW5''YYY```bbb___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZTTTHHH888YYY```bbb___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZTTTHHH888YYY```bbb___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZTTTHHH888YYY```bbb___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZTTTHHH888(3-6'VV^@@~22t''Z!!GTV['=P.=N5FY.NU2@L'@HBTg5H\.5J.5F".B++='5'EFF B@@~22t''Z!!GTV['=P.=N5FY.NU2@L'@HBTg5H\.5J.5F".B++='5'EFFB@@~22t''Z!!GTV['=P.=N5FY.NU2@L'@HBTg5H\.5J.5F".B++='5'EFF B@@~22t''Z!!GTV['=P.=N5FY.NU2@L'@HBTg5H\.5J.5F".B++='5'EFFBZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5888888888888888888z22UUUBBBowxzf888888888888888888BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++7+=1$77+=1$77+=1$7===777===777===777===777===777???DDDgU+++***???DDDgU+++***???DDDgU+++***???DDDgU+++***]]]eee````````````````````````````````````___ZZZTTTHHH888***]]]eee````````````````````````````````````___ZZZTTTHHH888***]]]eee````````````````````````````````````___ZZZTTTHHH888***]]]eee````````````````````````````````````___ZZZTTTHHH888***D_@Y.B#',1=JEMVoxCPY@Y=T2F(7!!GF!!G^aeFFT&&IFF&&G=DP>?AVV[::H%%EFFEC/1=08AFFT&&IFF&&G=DP>?A55}22p''YF+@P.BD+BP.FJ;Uc2DT5HW@L+8F+=J'5@+;@'58'+%&&.FFFF55}22p''YF+@P.BD+BP.FJ;Uc2DT5HW@L+8F+=J'5@+;@'58'+**-!!+FFFF55}22p''YF+@P.BD+BP.FJ;Uc2DT5HW@L+8F+=J'5@+;@'58'+!!'..6FFFF55}22p''YF+@P.BD+BP.FJ;Uc2DT5HW@L+8F+=J'5@+;@'58'+**-!!+FFFF@@J88D..96AN>Na9AI..;((7 .6AN>Na4=E--;--;""06AN>Na6=F..;((7 .6AN>Na4=EZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5==================22UUUBBBuz}v==================BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7QITREWRBYP=YP;YP;YP=YRBYPEW777TTTWWWYYYWUYTJYR@YP;YP;YN9W1$7M:TN9WYYYYYYYYYYYYYYYYYYN9W1$7M:TN9WP;YP;YR@YTJYWUYYYYWWW647QITREWRBYP=YP;YP;YP=YRBYPEW777CCCJJJiDD];''+++***CCCJJJiDD];''+++***CCCJJJiDD];''+++***CCCJJJiDD];''+++***fffvvv```````````````````````````````````````___ZZZTTTHHH888***fffvvv```````````````````````````````````````___ZZZTTTHHH888***fffvvv```````````````````````````````````````___ZZZTTTHHH888***fffvvv```````````````````````````````````````___ZZZTTTHHH888***RpRpLi@Y*<:HX7EV4AQ2@P+19M\p2@PTezJ]tJfJgF`;R2D!0""L""P""PH"'H2@P8DR77W""PHFFFFF+5L2@P2@P4?L;;Y//RFFFFFFFFFF"'H5BT2BP2@P1=J/5?77W""PHFFFFF+5L2@P2@P4?L8888~..mJPPZENX'@N+@N';J=Wi;L]28PF`w8LU=FY5@P+;H+8"+"+"%FFFF""08888~..mJPPZENX'@N+@N';J=Wi;L]28PF`w8LU=FY5@P+;H+8"+"+"%FFFF""08888~..mJPPZENX'@N+@N';J=Wi;L]28PF`w8LU=FY5@P+;H+8"+"+FFFF..98888~..mJPPZENX'@N+@N';J=Wi;L]28PF`w8LU=FY5@P+;H+8"+"+"%FFFF""0**U""NFFFFFFFF B%%B+.<2AO5DU8FY7ET9DPFFV&&S""NFFFFFFFFB!!>&*92AO5DU8FY7ET9CP33F&&S""NFFFFFFFF B<&*92AO5DU8FY7ET7COFFV&&S""NFFFFFFFFB!!>&*92AO5DU8FY7ET9CPZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5BBBBBBBBBBBBBBBBBB22UUUBBBx}BBBBBBBBBBBBBBBBBBBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=VTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=SLVXU[___bbbccc_TcYBbU=_R;\P;YP;YP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBccccbbb___\\\YYYYYYP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBcY@cW@bU=_R;\R=YULYYYYYYYYYYSPW8-=VTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=JJJTTTWWWFFpF''222+++***JJJTTTWWWFFpF''222+++***JJJTTTWWWFFpF''222+++***JJJTTTWWWFFpF''222+++***bbbfffeee``````````````````````````````````````````___ZZZTTTHHH888***bbbfffeee``````````````````````````````````````````___ZZZTTTHHH888***bbbfffeee``````````````````````````````````````````___ZZZTTTHHH888***bbbfffeee``````````````````````````````````````````___ZZZTTTHHH888***VvY{WwPoHc5J(:HY2@P3>KPe~>M^WnTbqPoNkF`@W5J*<BBk22u;;88..n""P+8L4AQ;;88..k""NFFFF+8L2@P2@P;;88..j""LFFFFFFFF""F8FY8FW5BT;;88..k""NFFFF+8L2@P2@Phh==;;22v""TRST5DR"BL2;H8NRD]nfz2=R2FP2JW.DP5;B+8B"8;".5#$$>FFFFhh==;;22v""TRST5DR"BL2;H8NRD]nfz2=R2FP2JW.DP5;B+8B"8;".5#9FFFFhh==;;22v""TRST5DR"BL2;H8NRD]nfz2=R2FP2JW.DP5;B+8B"8;".5$$>FFFFhh==;;22v""TRST5DR"BL2;H8NRD]nfz2=R2FP2JW.DP5;B+8B"8;".5#9FFFF>>e88;;88~++fHFFFFFFFFF+2L5BT2BP8FY;>A::b88;;88~++fHFFFFFFFFF+2L5BT2BP8FY<>A00]88;;88~++fHFFFFFFFFF+2L5BT2BP8FY69=::b88;;88~++fHFFFFFFFFF+2L5BT2BP8FY<>AZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5DDDDDDDDDDDDDDDDDD22UUUBBBx{DDDDDDDDDDDDDDDDDDBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++YFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;YYFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;YYFa`FkiLtnPzs_|ug|ukzupwpkskgnebg]T`UJZRBYP;YP;YP;Y]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=YYIajgktttzzz|||tb|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;YYFa`FkiLtnPzoP|oP|zzzwwwsssnnnggg```R;ZP;YP;YP;YP;YYFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`UHZYYYYYYYYYWTY]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=YJJJUUU\\\___++Y;;;222...JJJUUU\\\___++Y;;;222...JJJUUU\\\___++Y;;;222...JJJUUU\\\___++Y;;;222...oooaaa]]]`````````````````````````````````````````````___ZZZTTTHHH888oooaaa]]]`````````````````````````````````````````````___ZZZTTTHHH888oooaaa]]]`````````````````````````````````````````````___ZZZTTTHHH888oooaaa]]]`````````````````````````````````````````````___ZZZTTTHHH888[jw\_\TtJg;P .8HY5DT1?OYpYpVj8VjRrLjF`@W8N.@>>~==@@==88..i"'J2@P?HR@@~==BB==88~++gHFE-3J4?K0@N2@P0..63589CS;H\:HVAP`$ 7,++b22s==FFHHDD@@55wF55$$>&&.&(+6AQ;H\8FTAP`##BFFBMZEKV?Ob!%(2@P2@PIIiJFFFFFF:*BMZEKV?Ob!%(2@P2@PDDBB==55x''_J2'*E*DDBB==55x''_J2'DDBB==55x''_J2'DDBB==55x''_J2'88..o55|55{55w55w25t+=+FJ+DY.=R"8J.;L;L+8P'BP'+B'8B';J'8+;""T22t55w..o''ZHF88..o55|55{55w55w25t+=+FJ+DY.=R"8J.;L;L+8P'BP'+B'8B';J'8+;""T22t55w..o''ZHF88..o55|55{55w55w25t+=+FJ+DY.=R"8J.;L;L+8P'BP'+B'8B';J'8+;""T22t55w..o''ZHF88..o55|55{55w55w25t+=+FJ+DY.=R"8J.;L;L+8P'BP'+B'8B';J'8+;""T22t55w..o''ZHF&D&8""BJ""N..j==FFDD@@22tB?Ob!C!8""BJ""N..j==FFDD@@22tB?ObB8""BJ""N..j==FFDD@@22tB?Ob!C!8""BJ""N..j==FFDD@@22tB?ObZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFr22UUUBBBHY`{FFFFFFFFFFFFFFFFFF++sgcir|\{^cimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;Y{^cimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;Y|czzzmmm```YYYYYYWTYvcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;Y{^cppoomkigc`\xWnPzbFmW@`P;YP;YP;Y{^cimnppppo`\xWnPzbFmW@`P;YP;YP;Y{^cimnppppoomkigc`\xWr`zmmm```YYYWUYP;Yvcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;YJJJTTTZZZ]]]___```___22T222ZZZZZZTTTHHH888JJJTTTZZZ]]]___```___22T222ZZZZZZTTTHHH888JJJTTTZZZ]]]___```___22T222ZZZZZZTTTHHH888JJJTTTZZZ]]]___```___22T222ZZZZZZTTTHHH888`````````````````````````````````````````````````````````___ZZZTTTHHH888`````````````````````````````````````````````````````````___ZZZTTTHHH888`````````````````````````````````````````````````````````___ZZZTTTHHH888`````````````````````````````````````````````````````````___ZZZTTTHHH888^e^FFFFFFF--5FFFCDUj=N`FZpAOO"B2F(F,IPI B$F=+.)2>L2@P2@P9AN99e""RHFFFFFFFFDUj=N`FZpAOO"B2F(F,IPI B$F=+.)2>L2@P2@P9AN4:F$/<+4?AFKGGe@@==.2k"'L"2BC#4:F$/<+4?AFKGGe@@==.2k"'L"2?&6 41'!!O@@==.2k"'L"24:F$/<+4?AFKGGe@@==.2k"'L"2?88~@@BB@@@@@@@@2P.@;F.8Y'8J=Wo.BZD`s'8B'8R+;="5B2F+@88~@@@@==55|++fF88~@@BB@@@@@@@@2P.@;F.8Y'8J=Wo.BZD`s'8B'8R+;="5B2F+@88~@@@@==55|++fF88~@@BB@@@@@@@@2P.@;F.8Y'8J=Wo.BZD`s'8B'8R+;="5B2F+@88~@@@@==55|++fF88~@@BB@@@@@@@@2P.@;F.8Y'8J=Wo.BZD`s'8B'8R+;="5B2F+@88~@@@@==55|++fF9?G+4?$/<$/<$/< 0;'...;88@F..i@@BB55}""T5""+%)!*!%CQdAJV9?G+4?$/<$/<$/< 0;'...;88@F..i@@BB55}""T5""+%)$-(*,AQb>GS(4$3 2 22 0+...;88@F..i@@BB55}""T5""+ %,$-#AQbGSZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFmW22UUUBBBFYYZmFFFFFFFFFFFFFFFFFF++miic\YYZmwZckortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP;Yckortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP;Yutsrpnkifbnu{x{mmm___YYYYYYWTYgkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=Ycuuutsrpnkifb]zYoP{bFmU=_P;YP;YP;Yckortuuuutfb]zYoP{bFmU=_P;YP;YP;Yckortuuuutsrpnkifb]zY{x{mmm___YYYRDYP;Ygkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=YJJJTTTZZZ]]]___``````___22FF''U222]]]___ZZZTTTHHH888***JJJTTTZZZ]]]___``````___22FF''U222]]]___ZZZTTTHHH888***JJJTTTZZZ]]]___``````___22FF''U222]]]___ZZZTTTHHH888***JJJTTTZZZ]]]___``````___22FF''U222]]]___ZZZTTTHHH888***``````````````````````````````````````````````````````___]]]ZZZUUULLL@@@...***``````````````````````````````````````````````````````___]]]ZZZUUULLL@@@...***``````````````````````````````````````````````````````___]]]ZZZUUULLL@@@...***``````````````````````````````````````````````````````___]]]ZZZUUULLL@@@...***-T-"L"F=5J+"H.'@2+"2", 9$(FFFEjx_xNc{>M^5N:F=5J+"H.'B--0*--%%2+"2+"'5F2:A2@P2@P4AO44t..n""UFFFTZ>@V,2R27/2,"5++"2."2+"'5FFCjx_xNc{>M^5N:F=5J+"H.'B--0*--%%2+"2+"'5F2:A2@P2@P4AO2U2T.P.N'@;'._'2F+.'2"28"."+'.BB'FF:*.@.@.@*<!02U2T.P.N'@;'._'2F+.'2"28"."+'.BB'[\\2U2T.P.N'@;'._'2F+.'2"28"."+'.BRRW2U2T.P.N'@;'._'2F+.'2"28"."+'.BB'@@FFFFFFDDDDDD+8n.B.D.2e8;w2@nBTk.Fj+;W;B;@5H5H+NBBDDDDBB==88~""N@@FFFFFFDDDDDD+8n.B.D.2e8;w2@nBTk.Fj+;W;B;@5H5H+NBBDDDDBB==88~""N@@FFFFFFDDDDDD+8n.B.D.2e8;w2@nBTk.Fj+;W;B;@5H5H+NBBDDDDBB==88~""N@@FFFFFFDDDDDD+8n.B.D.2e8;w2@nBTk.Fj+;W;B;@5H5H+NBBDDDDBB==88~""N1Q2R2R2R2R2R2R2R2R2T2U.P'B55D'+]+N+@+;2='5='.5'.".+2"+(/@AA1Q2R2R2R2R2R2R2R2R2T2U.P'B55D'+]+N+@+;2='5='.5'.".+2"+$,:;;[\\1Q2R2R2R2R2R2R2R2R2T2U.P'B55D'+]+N+@+;2='5='.5'.".+2"+$,.001Q2R2R2R2R2R2R2R2R2T2U.P'B55D'+]+N+@+;2='5='.5'.".+2"+$,:;;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFw22UUUBBBNs_YYeFFFFFFFFFFFFFFFFFF++u_YYepZmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YN9Wmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YN9Wxzzxxwutrpmjfc]zYr`zjgk]]]YYYYYYSPWmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIWmzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YN9Wmruvxxzzxxjfc]zYnPz`FkT=]P;YP;YN9Wmruvxxzzxxwutrpmjfc]uzzzkkk]]]UPYP;YN9Wmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIWJJJTTTZZZ]]]___`````````___22++RRW555___```___ZZZTTTHHH888***JJJTTTZZZ]]]___`````````___22++RRW555___```___ZZZTTTHHH888***JJJTTTZZZ]]]___`````````___22++RRW555___```___ZZZTTTHHH888***JJJTTTZZZ]]]___`````````___22++RRW555___```___ZZZTTTHHH888***333<<<ggg```___NNN@@@555555555555555555555555555555555555555555555222222222222555222+++***333<<<ggg```___NNN@@@555555555555555555555555555555555555555555555222222222222555222+++***333<<<ggg```___NNN@@@555555555555555555555555555555555555555555555222222222222555222+++***333<<<ggg```___NNN@@@555555555555555555555555555555555555555555555222222222222555222+++***:^:"R""J'@+="!94-CA*=L'8@.5&4A6>H??N2 (RRW DFFFFRg;H`EMX)E)B'@+="!94-EA*=L'8@.5&4A*A<&<7'"@+B'?5;D*4K+8L2@P8855w++`F//JVV^J(/EET@JS*=L'8@.5&4A*A<&<7'"@+B'B*E*Rg;H`EMX)E)B'@+="!94-EA*=L'8@.5&4A*A<&<7'"@+B'?5;D*4K+8L2@PIRa=e@i=g;c;b5Y.H"8F+2=8B.5'58'8.5"'.';@+FFF=85J8N5J2D(7IRa=e@i=g;c;b5Y.H"8F+2=8B.5'58'8.5"'.';@+F.)4M=e@i=g;c;b5Y.H"8F+2=8B.5'58'8.5"'.';IRa=e@i=g;c;b5Y.H"8F+2=8B.5'58'8.5"'.';@+F.)FFJJJJHHHHHHHH;B.B+='P'+b'+_''Y''\++b++e+U+@2F'+]@@FFHHFF@@;;&&SFFJJJJHHHHHHHH;B.B+='P'+b'+_''Y''\++b++e+U+@2F'+]@@FFHHFF@@;;&&SFFJJJJHHHHHHHH;B.B+='P'+b'+_''Y''\++b++e+U+@2F'+]@@FFHHFF@@;;**UFFJJJJHHHHHHHH;B.B+='P'+b'+_''Y''\++b++e+U+@2F'+]@@FFHHFF@@;;&&S:_=e=e=e=e=e=e=e=e=e@i@i;c5Z+H'@22F5H2D;@'5@'5@.2=5=2=.."+8"'":_=e=e=e=e=e=e=e=e=e@i@i;c5Z+H'@22F5H2D;@'5@'5@.2=5=2=.."+8"'":Q8_=e=e=e=e=e=e=e=e=e@i@i;c5Z+H'@22F5H2D;@'5@'5@.2=5=2=.."+8"'":_=e=e=e=e=e=e=e=e=e@i@i;c5Z+H'@22F5H2D;@'5@'5@.2=5=2=.."+8"'"Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF22UUUBBBviYYmFFFFFFFFFFFFFFFFFF++iYYmznZjrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP;Y1$7jrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP;Y1$7|}}}||{xwutpnkgc]xWkPwbYgZZZYYYYYY647nrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777jr}}||{xwutpnkgc]xWkNw]DgR;ZP;YP;Y1$7jrvx{|}}}||nkgc]xWkNw]DgR;ZP;YP;Y1$7jrvx{|}}}||{xwutpnkgcnwwwgggZYZP;YP;Y1$7nrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777JJJTTTZZZ]]]___````````````___DD;;ꁁR++555`````````___ZZZTTTHHH888***JJJTTTZZZ]]]___````````````___DD;;ꁁR++555`````````___ZZZTTTHHH888***JJJTTTZZZ]]]___````````````___DD;;ꁁR++555`````````___ZZZTTTHHH888***JJJTTTZZZ]]]___````````````___DD;;ꁁR++555`````````___ZZZTTTHHH888***]YHHHDDD@@@;;;```PPPJJJFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDH;;R++WUTRJ""@55;;;222+++***eWHHHDDD@@@;;;```PPPJJJFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDH;;R++WUTRJ""@55;;;222+++***m\HHHDDD@@@;;;```PPPJJJFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDH;;R++WUTRJ""@55;;;222+++***kvHHHDDD@@@;;;```PPPJJJFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDH;;R++WUTRJ""@55;;;222+++****&'F'+F""82=P'@L";F"=F'2B5@+;F+5J"5=@'(* DFFFFEE\FFq{%)'F'+F""82=P'@L";F"=F'2B5@+;F+5J"5=@!#%-6KFF-6L;;55{''WF//J ),'F'+F""82=P'@L";F"=F'2B5@+;F+5J"5=@@BCEE\FFq{%)'F'+F""82=P'@L";F"=F'2B5@+;F+5J"5=@!#%-6KFF-6L,FgDrFtDrBoBn=c2L+=N'2=+2D'2B"5@".@"=@"'...5'"'5FFF@J@W@W=T2F',FgDrFtDrBoBn=c2L+=N'2=+2D'2B"5@".@"=@"'...5'"'5=+0@LDjDrFtDrBoBn=c2L+=N'2=+2D'2B"5@".@"=@"'...52 (,FgDrFtDrBoBn=c2L+=N'2=+2D'2B"5@".@"=@"'...5'"'5=+HHJJJJHHHHJJ=B+H+H'D'D'D'D'D'D'D'D";2D..j==FFFF@@8833FHHJJJJHHHHJJ=B+H+H'D'D'D'D'D'D'D'D";2D..j==FFFF@@88FFVHHJJJJHHHHJJ=B+H+H'D'D'D'D'D'D'D'D";2D..j==FFFF@@88MM\HHJJJJHHHHJJ=B+H+H'D'D'D'D'D'D'D'D";2D..j==FFFF@@88FFVX`mBnDpDpDpDpDpDpDpDpDpFtDsBn=f5Y.P";+@5H5D'5F+5D'8J'5B+.;".;';H"2@.5'+!%%A;;X`mBnDpDpDpDpDpDpDpDpDpFtDsBn=f5Y.P";+@5H5D'5F+5D'8J'5B+.;".;';H"2@.5'+!%%>660@LNnBnDpDpDpDpDpDpDpDpDpFtDsBn=f5Y.P";+@5H5D'5F+5D'8J'5B+.;".;';H"2@.5'+!!%7//X`mBnDpDpDpDpDpDpDpDpDpFtDsBn=f5Y.P";+@5H5D'5F+5D'8J'5B+.;".;';H"2@.5'+!%%>66Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFUUUBBBiYZFFFFFFFFFFFFFFFFFF++iYZ{}xmZmpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YG3Ompv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YG3O}~¯¯¯­~}|{xvtrnkfb\uUfJrZL`YYYYYYOOOpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDOmp¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YG3Ompv{}~¯¯¯­~rnkfb\uUfJrW@`P;YP;YG3Ompv{}~¯¯¯­~}|{xvtrnkfbrrr```RBYP;YG3Opv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDOJJJTTTZZZ]]]___```````````````___{ZZ88H;;555````````````___ZZZTTTHHH888JJJTTTZZZ]]]___```````````````___{ZZ88H;;555````````````___ZZZTTTHHH888JJJTTTZZZ]]]___```````````````___{ZZ88H;;555````````````___ZZZTTTHHH888JJJTTTZZZ]]]___```````````````___{ZZ88H;;555````````````___ZZZTTTHHH888TRUUUUUUUUUTTTZZZRRRRRRPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLZFFz''{pfYF'';''+++PnUUUUUUUUUTTTZZZRRRRRRPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLZFFz''{pfYF'';''+++Y|UUUUUUUUUTTTZZZRRRRRRPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLZFFz''{pfYF'';''+++c~UUUUUUUUUTTTZZZRRRRRRPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLZFFz''{pfYF'';''+++HQ]>KXLRP"2'5.D+5D'FH'@H+=F"@H'=J";D"8B"5@2;".8"+2CFFF%%E11d''YF!!GNUR"2'5.D+5D'FH'@H+=F"@H'=J";D"8B"5@2;".8"+2#*(99?EFF&&G@@''ZFF))IRTV"2'5.D+5D'FH'@H+=F"@H'=J";D"8B"5@2;".8"+2HNV8DPXZ_11d''YF!!GNUR"2'5.D+5D'FH'@H+=F"@H'=J";D"8B"5@2;".8"+2#*(99?EFF&&G%GmFvHxFvFtDs@c2=H2@H2HJ2LW+=="@D'BL".B+;@"2;+5H&<72+"FFFF8FbFbF`=T-6%GmFvHxFvFtDs@c2=H2@H2HJ2LW+=="@D'BL".B+;@"2;+5H&<75+"F!%)%G\HpFvHxFvFtDs@c2=H2@H2HJ2LW+=="@D'BL".B+;@"2;+5H??N9$(%GmFvHxFvFtDs@c2=H2@H2HJ2LW+=="@D'BL".B+;@"2;+5H&<75+"F!%)HHHHFFHHHH8b8_8\5W5W5W5W5W5W5W5W.P'@5F..j==BB;;00]HHHHFFHHHH8b8_8\5W5W5W5W5W5W5W5W.P'@5F..j==BB;;::bHHHHFFHHHH8b8_8\5W5W5W5W5W5W5W5W.P'@5F..j==BB;;>>eHHHHFFHHHH8b8_8\5W5W5W5W5W5W5W5W.P'@5F..j==BB;;::bDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D+U;@2=b+8N.;D.;F2BH2JJ+HT'88=@"8B'8"&**!!DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D+U;@2=b+8N.;D.;F2BH2JJ+HT'88=@"8B'8"&**!!%G\UxDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D+U;@2=b+8N.;D.;F2BH2JJ+HT'88=@"8B'8"&**!!DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D+U;@2=b+8N.;D.;F2BH2JJ+HT'88=@"8B'8"&**!!Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFBB22_YrFFFFFFFFFFFFFFFFFF++_Y`rvv{|{wnZmu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YN9Wmu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YN9W~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjUHZYYYWWWu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWmu¼ųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YN9Wmu{~±IJųƳdzƲűurnjf`|ZpR|_DjR;ZP;YN9Wmu{~±IJųƳdzƲűįî}|zwurnjf|||jjjUJZP;YN9Wu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWJJJTTTZZZ]]]___``````````````````___bbb22""텅z''DDD555```````````````___ZZZTTTHHH888***JJJTTTZZZ]]]___``````````````````___bbb22""텅z''DDD555```````````````___ZZZTTTHHH888***JJJTTTZZZ]]]___``````````````````___bbb22""텅z''DDD555```````````````___ZZZTTTHHH888***JJJTTTZZZ]]]___``````````````````___bbb22""텅z''DDD555```````````````___ZZZTTTHHH888***gb\\\]]]]]]]]]WWWWWWYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTgLLp]U5''***jNo\\\]]]]]]]]]WWWWWWYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTgLLp]U5''***Tt\\\]]]]]]]]]WWWWWWYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTgLLp]U5''***kg\\\]]]]]]]]]WWWWWWYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTgLLp]U5''***:HX;J\EIV'@+=8L.5@2=J5BJ5@L28R.;P2BT'=P"2D+;@"+2"+."'CFFFF55x..iJF11L'@+=8L.5@2=J5BJ5@L28R.;P2BT'=P"2D+;@"+2"+."')1<FFFFddjPP|++b""PFF'@+=8L.5@2=J5BJ5@L28R.;P2BT'=P"2D+;@"+2"+."';@I8DP4AQ2@P55x..iJF11L'@+=8L.5@2=J5BJ5@L28R.;P2BT'=P"2D+;@"+2"+."')1<FFFFddj%GmFvHxFvFtDs";T.=U'=L'@H.@J5JP2DN'=L"@B.8@'5="8D*A<2."FFFHDLjNmJg@YKNP%GmFvHxFvFtDs";T.=U'=L'@H.@J5JP2DN'=L"@B.8@'5="8D*A<.+" B$FoFvHxFvFtDs";T.=U'=L'@H.@J5JP2DN'=L"@B.8@'5="8D6@H%GmFvHxFvFtDs";T.=U'=L'@H.@J5JP2DN'=L"@B.8@'5="8D*A<.+" B$FFFFFF8B;c=e;b8_8_8_8_8_8_8_8_5Y+H5@""N22s8811iFFFFFF8B;c=e;b8_8_8_8_8_8_8_8_5Y+H5@""N22s88;;mFFFFFF8B;c=e;b8_8_8_8_8_8_8_8_5Y+H5@""N22s88??oFFFFFF8B;c=e;b8_8_8_8_8_8_8_8_5Y+H5@""N22s88;;mZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++e=@+;N".B';J.8J"=J+@H.=J2JU2@J"2@25"'.'ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++e=@+;N".B';J.8J"=J+@H.=J2JU2@J"2@25"'.'W{DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++e=@+;N".B';J.8J"=J+@H.=J2JU2@J"2@25"'.'ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++e=@+;N".B';J.8J"=J+@H.=J2JU2@J"2@25"'.'Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFuYiFFFFFFFFFFFFFFFFFF++sYYfxwZpz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YP;Ysss```YYYYYY~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`ULYYYYz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBYpzżɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YP;Ypz~óƴȶɶʶʶʶɴwtpmic]wWgJsW@`P;YP;Ypz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmisss]T`P;YP;Yz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBYKKKTTTZZZ]]]___`````````````````````___bbbZZTTJJZFFDDD555``````````````````___ZZZTTTHHH888***KKKTTTZZZ]]]___`````````````````````___bbbZZTTJJZFFDDD555``````````````````___ZZZTTTHHH888***KKKTTTZZZ]]]___`````````````````````___bbbZZTTJJZFFDDD555``````````````````___ZZZTTTHHH888***KKKTTTZZZ]]]___`````````````````````___bbbZZTTJJZFFDDD555``````````````````___ZZZTTTHHH888***U]]]]]]]]]\\\WWW\\\\\\ZZZWWWWWWWWWWWWWWWWWWWWWWWWWWW''gW2''***###]]]]]]]]]\\\WWW\\\\\\ZZZWWWWWWWWWWWWWWWWWWWWWWWWWWW''gW2''***###\]]]]]]]]]\\\WWW\\\\\\ZZZWWWWWWWWWWWWWWWWWWWWWWWWWWW''gW2''***###i]]]]]]]]]\\\WWW\\\\\\ZZZWWWWWWWWWWWWWWWWWWWWWWWWWWW''gW2''***###Wn;Fc+._''\''Y+L5B+@NBJ+HJ+8N'BD5@N+8H2=L'=P'DF+;F"+2"'."."2JJHFF::H88~''Y""P''\''\''Y+L5B+@NBJ+HJ+8N'BD5@N+8H2=L'=P'DF+;F"+2"'."."2JJHFFF22r''W''\''\''Y+L5B+@NBJ+HJ+8N'BD5@N+8H2=L'=P'DF+;F"+2"'."."2J""L&&K+8L2@P=GS88~''Y""P''\''\''Y+L5B+@NBJ+HJ+8N'BD5@N+8H2=L'=P'DF+;F"+2"'."."2JJHFFF%GmFvHxFvFtFp+=P2;L.DJ8Jb;D_+DR2FU2@N2@L25N'@H5@&7H++"FFJ8RnRrPoJfCPY%GmFvHxFvFtFp+=P2;L.DJ8Jb;D_+DR2FU2@N2@L25N'@H5@&7H-%%ChFvHxFvFtFp+=P2;L.DJ8Jb;D_+DR2FU2@N2@L25N'@H5@&7H, %GmFvHxFvFtFp+=P2;L.DJ8Jb;D_+DR2FU2@N2@L25N'@H5@&7H-%%DDFF'@zBmDpBo@k@k@k@k@k@k@k@k=f5Z'B8J++b++^DDFF'@zBmDpBo@k@k@k@k@k@k@k@k=f5Z'B8J++b66bDDFF'@zBmDpBo@k@k@k@k@k@k@k@k=f5Z'B8J++b;;dDDFF'@zBmDpBo@k@k@k@k@k@k@k@k=f5Z'B8J++b66bDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++c5Bt.BW.;H+.DNbv.DNF_v5;U.FR"8B.;J.8F"';'.DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++c5Bt.BW.;H+.DNbv.DNF_v5;U.FR"8B.;J.8F"';'.%IbDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++c5Bt.BW.;H+.DNbv.DNF_v5;U.FR"8B.;J.8F"';'.DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D++c5Bt.BW.;H+.DNbv.DNF_v5;U.FR"8B.;J.8F"';'.Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF\cFFFFFFFFFFFFFFFFFF++vNFH\ktxzuo`H ###***u|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP;Y777{{{gggYYYYYY777ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgR=YWUY777x|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777u|ï͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP;Y1$7u|ôǶʸ˸͹͹͹͸̷zvtpkgb}ZoP{]DgP;YP;Y1$7u|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpk{{{ebgP;YP;Y1$7x|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777TTTYYYZZZ]]]___````````````````````````___bbbccc\\..''gLLLLLDDD555`````````````````````___ZZZTTTHHH888###TTTYYYZZZ]]]___````````````````````````___bbbccc\\..''gLLLLLDDD555`````````````````````___ZZZTTTHHH888###TTTYYYZZZ]]]___````````````````````````___bbbccc\\..''gLLLLLDDD555`````````````````````___ZZZTTTHHH888###TTTYYYZZZ]]]___````````````````````````___bbbccc\\..''gLLLLLDDD555`````````````````````___ZZZTTTHHH888###XXXXXX___YYY___```]]]\\\\\\\\\\\\\\\\\\\\\\\\vTTjN++++++XXXXXX___YYY___```]]]\\\\\\\\\\\\\\\\\\\\\\\\vTTjN++++++XXXXXX___YYY___```]]]\\\\\\\\\\\\\\\\\\\\\\\\vTTjN++++++XXXXXX___YYY___```]]]\\\\\\\\\\\\\\\\\\\\\\\\vTTjN++++++Xdy2;c88;;8888~55z2F"8L"=N2DY5Rb+BR.;H;HZ@D\'@J2@J.8B'2='.;"."H''\++c++g""LF<<..n88;;8888~55z2F"8L"=N2DY5Rb+BR.;H;HZ@D\'@J2@J.8B'2='.;"."H''\++c..i""NF&&Igg22v88;;8888~55z2F"8L"=N2DY5Rb+BR.;H;HZ@D\'@J2@J.8B'2='.;"."H''\++c..j""P"'H.;N<<..n88;;8888~55z2F"8L"=N2DY5Rb+BR.;H;HZ@D\'@J2@J.8B'2='.;"."H''\++c..i""NF&&I%GmFvHxFvFtDn+=W2@P55P;F_;Rf@Ug=HYBTi+5D2@U';F"=H"2;"2"FJX`8Vj%GmFvHxFvFtDn+=W2@P55P;F_;Rf@Ug=HYBTi+5D2@U';F"=H"2;-**%GmFvHxFvFtDn+=W2@P55P;F_;Rf@Ug=HYBTi+5D2@U';F"=H"2;$( %GmFvHxFvFtDn+=W2@P55P;F_;Rf@Ug=HYBTi+5D2@U';F"=H"2;-**=@"@zFuHxFvDsDsDsDsDsDsDsDsBn;c.P8B 7,=@"@zFuHxFvDsDsDsDsDsDsDsDsBn;c.P8B3C;=@"@zFuHxFvDsDsDsDsDsDsDsDsBn;c.P8B=KE=@"@zFuHxFvDsDsDsDsDsDsDsDsBn;c.P8B3C;ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+]BRj.;T=N+=N5@N22J2=U@Wo5FTBUi8BR'2B'.B'+ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+]BRj.;T=N+=N5@N22J2=U@Wo5FTBUi8BR'2B'.B'+ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+]BRj.;T=N+=N5@N22J2=U@Wo5FTBUi8BR'2B'.B'+ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+]BRj.;T=N+=N5@N22J2=U@Wo5FTBUi8BR'2B'.B'+Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFcgFFFFFFFFFFFFFFFFFF++22BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB...777~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\R@Y777nnn\\\YYY777~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\TJY777w~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777w~¸ƲϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y1$7w~ƶʸ̺λϼϼмϼϻ|xurnic]tTcHnR;\P;Y1$7w~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnkgnR;\P;Y1$7w~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777YYY```bbb``````````````````````````````___bbbccceeeiii``HHFFvTTWWWTTTLLLDDD555````````````````````````___ZZZRRRDDD...YYY```bbb``````````````````````````````___bbbccceeeiii``HHFFvTTWWWTTTLLLDDD555````````````````````````___ZZZRRRDDD...YYY```bbb``````````````````````````````___bbbccceeeiii``HHFFvTTWWWTTTLLLDDD555````````````````````````___ZZZRRRDDD...YYY```bbb``````````````````````````````___bbbccceeeiii``HHFFvTTWWWTTTLLLDDD555````````````````````````___ZZZRRRDDD...ZZZbbbcccbbb________________________FF]...+++ZZZbbbcccbbb________________________FF]...+++ZZZbbbcccbbb________________________FF]...+++ZZZbbbcccbbb________________________FF]...+++11n;;DDDDBB@@@@5=b.DP2DJ.HU8Wc2HT.DR;BR+BN.5H.=N'5J52F'28"...'']22s55{88..kF;;DDDDBB@@@@5=b.DP2DJ.HU8Wc2HT.DR;BR+BN.5H.=N'5J52F'28"...'']22s55{88..nHFFT;;BBDDBB@@@@5=b.DP2DJ.HU8Wc2HT.DR;BR+BN.5H.=N'5J52F'28"...'']22s55{88..oH"F;;DDDDBB@@@@5=b.DP2DJ.HU8Wc2HT.DR;BR+BN.5H.=N'5J52F'28"...'']22s55{88..nHFFT%GmFvHxFvFtFi+DZ8@J.DP;R_+JT8Rf2FW=@W=J]2@R'@N'2B2;572%GmFvHxFvFtFi+DZ8@J.DP;R_+JT8Rf2FW=@W=J]2@R'@N'2B2;402%GmFvHxFvFtFi+DZ8@J.DP;R_+JT8Rf2FW=@W=J]2@R'@N'2B2;"5"F> . .(%GmFvHxFvFtFi+DZ8@J.DP;R_+JT8Rf2FW=@W=J]2@R'@N'2B2;402XX"NH"@vHzJ|J{HwHwHwHwHwHwHwHwDs@i2U8""$>$TT"NH"@vHzJ|J{HwHwHwHwHwHwHwHwDs@i2U8""7I7TT"NH"@vHzJ|J{HwHwHwHwHwHwHwHwDs@i2U8""DSDTT"NH"@vHzJ|J{HwHwHwHwHwHwHwHwDs@i2U8""7I7DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D''Z.FjD`t'8P5F\5=H5FTBUe2HN@N5H\2;J8@R'2@'2GIJDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D''Z.FjD`t'8P5F\5=H5FTBUe2HN@N5H\2;J8@R'2@'2GIIDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D''Z.FjD`t'8P5F\5=H5FTBUe2HN@N5H\2;J8@R'2@'2EFHDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D''Z.FjD`t'8P5F\5=H5FTBUe2HN@N5H\2;J8@R'2@'2GIIZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF''..isFFFFFFFFFFFFFFFFFF++''..BBUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUmmm888µȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_TJY¾sss___YYYµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_R@Yzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;YzĻȴѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;Yzµȸ̺ϼѽѾҾƗɛ¬}{wtpkf`zYgJsU=_P;Yzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtppksU=_P;Yzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;Y\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccvvvbbbbbbbbbbbbbbbbbbbbbbbbHHJJ텅ꁁRR''i888222\\\cccvvvbbbbbbbbbbbbbbbbbbbbbbbbHHJJ텅ꁁRR''i888222\\\cccvvvbbbbbbbbbbbbbbbbbbbbbbbbHHJJ텅ꁁRR''i888222\\\cccvvvbbbbbbbbbbbbbbbbbbbbbbbbHHJJ텅ꁁRR''i88822255}@@HHHHFFFFFF@F2DT2BN+;N.DH=T`;R`H\p.J].;L2=L+;H'8=.;+2'H55w;;====88//RyyBBHHHHFFFFFF@F2DT2BN+;N.DH=T`;R`H\p.J].;L2=L+;H'8=.;+2'H55w;;====88""PHHHHFFFFFF@F2DT2BN+;N.DH=T`;R`H\p.J].;L2=L+;H'8=.;+2'H55w;;====88""PFVV^yyBBHHHHFFFFFF@F2DT2BN+;N.DH=T`;R`H\p.J].;L2=L+;H'8=.;+2'H55w;;====88""P@fFvHxFvFtDr.FU.BT.=U.HT8BP2@R.8J.FR'BU'@T+=J8D*:F%GmFvHxFvFtDr.FU.BT.=U.HT8BP2@R.8J.FR'BU'@T+=J8D*:FB0-IPI%GmFvHxFvFtDr.FU.BT.=U.HT8BP2@R.8J.FR'BU'@T+=J8D*:F@2+FFB';N;P5J*<%GmFvHxFvFtDr.FU.BT.=U.HT8BP2@R.8J.FR'BU'@T+=J8D*:FB0-IPI5zB;`HwJ|J{HxHxHxHxHxHxHxHxFt@i2T.8$7$5{B;`HwJ|J{HxHxHxHxHxHxHxHxFt@i2T.8JTJ5{B;`HwJ|J{HxHxHxHxHxHxHxHxFt@i2T.8V^V5{B;`HwJ|J{HxHxHxHxHxHxHxHxFt@i2T.8JTJ%:QDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+_.=Z+=J+HU.DT+@R.;T@Wb@J\.@N.5H';H'=L"8F.;ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+_.=Z+=J+HU.DT+@R.;T@Wb@J\.@N.5H';H'=L"8F.;ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+_.=Z+=J+HU.DT+@R.;T@Wb@J\.@N.5H';H'=L"8F.;ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+_.=Z+=J+HU.DT+@R.;T@Wb@J\.@N.5H';H'=L"8F.;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF==eeiFFFFFFFFFFFFFFFFFF++==ee22w22W22r22222222222222z22g22P22;;;ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwYBbWUY===wwwbbbYYY===zĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP;Y===ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===zƽʶ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP;Y7+=zĶʺμѾҿ˜Į|xurmgb|ZkNwW@bP;Y7+=zĶʺμѾҿ˜̠޼з˴ȲĮ|xurupwW@bP;Y7+=ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...333<<<jjj]]]eeejjjjjjjjjjjjjjjjjjjjjjjj``TTFF`BBB888333<<<jjj]]]eeejjjjjjjjjjjjjjjjjjjjjjjj``TTFF`BBB888333<<<jjj]]]eeejjjjjjjjjjjjjjjjjjjjjjjj``TTFF`BBB888333<<<jjj]]]eeejjjjjjjjjjjjjjjjjjjjjjjj``TTFF`BBB888??BBJJJJHHHHHHDH'FP'FP8=R@Zj=Rb5BY8Pe.HR5BP5;L.@L'8D"8;+..2m==BBDDBB;;;;YLLJJJJHHHHHHDH'FP'FP8=R@Zj=Rb5BY8Pe.HR5BP5;L.@L'8D"8;+..2m==BBDDBB;;77WTTJJJJHHHHHHDH'FP'FP8=R@Zj=Rb5BY8Pe.HR5BP5;L.@L'8D"8;+..2m==BBDD@@;;""P!!GLLJJJJHHHHHHDH'FP'FP8=R@Zj=Rb5BY8Pe.HR5BP5;L.@L'8D"8;+..2m==BBDDBB;;77W9DOBjFvHxFvFtDs'BY.JN;N@ZmBNc5BT5DW;HU'JL"5H'@H2DP@HQR/2%GmFvHxFvFtDs'BY.JN;N@ZmBNc5BT5DW;HU'JL"5H'@H2DP-CAH.'(F,%GmFvHxFvFtDs'BY.JN;N@ZmBNc5BT5DW;HU'JL"5H'@H2DP-CAH.'FFFFBJgHc@Y.B%GmFvHxFvFtDs'BY.JN;N@ZmBNc5BT5DW;HU'JL"5H'@H2DP-CAH.'(F,AE;bFvHzHxFuFuFuFuFuFuFuFuDp=e2R.BBD;bFvHzHxFuFuFuFuFuFuFuFuDp=e2R.!C!@B;bFvHzHxFuFuFuFuFuFuFuFuDp=e2R.&D&BD;bFvHzHxFuFuFuFuFuFuFuFuDp=e2R.!C!9DOJjDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+b;B5Hc.8N.HN;Ti.BY@Zm=FY8L]2;N.=F'FJ+;'25DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+b;B5Hc.8N.HN;Ti.BY@Zm=FY8L]2;N.=F'FJ+;'25DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+b;B5Hc.8N.HN;Ti.BY@Zm=FY8L]2;N.=F'FJ+;'25DsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'+b;B5Hc.8N.HN;Ti.BY@Zm=FY8L]2;N.=F'FJ+;'25Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..DDmFFFFFFFFFFFFFFFFFF++..DDm\Ÿ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPz_TcYYYþzzzcccYYYzŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cP;YŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBYzïŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cP;YzŸ˻ϾŒ٭Ưì}{wsoic~\nPzY@cP;YzŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsukzY@cP;YŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBY\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH..._UHHHDDD@@@;;;]]]fffiiiiiiiiiiiiiiiiiiiiiiiiiii..""88;;++H@@AAA_HHHDDD@@@;;;]]]fffiiiiiiiiiiiiiiiiiiiiiiiiiii..""88;;++H@@AAAk]HHHDDD@@@;;;]]]fffiiiiiiiiiiiiiiiiiiiiiiiiiii..""88;;++H@@AAApiHHHDDD@@@;;;]]]fffiiiiiiiiiiiiiiiiiiiiiiiiiii..""88;;++H@@AAAee@@FFJJHHHHHHHH8Bj8DR2BR8JN5P];Pf;F_2FP'BL.HT2;@+5F"+2"2@==DDFFFF@@MMJJHHHHHHHH8Bj8DR2BR8JN5P];Pf;F_2FP'BL.HT2;@+5F"+2"2@==DDFFFF==MMJJHHHHHHHH8Bj8DR2BR8JN5P];Pf;F_2FP'BL.HT2;@+5F"+2"2@==DDFFFF==22u""LMMJJHHHHHHHH8Bj8DR2BR8JN5P];Pf;F_2FP'BL.HT2;@+5F"+2"2@==DDFFFF==%GZHpFvHxFvFtDs"D]'FN.BP8BJ8HY.BP;Pj2;H2BP.DJ';H5BYEETV,2%GmFvHxFvFtDs"D]'FN.BP8BJ8HY.BP;Pj2;H2BP.DJ';H5BY!94J+"F%GmFvHxFvFtDs"D]'FN.BP8BJ8HY.BP;Pj2;H2BP.DJ';H5BY!94J+"FFFJBTtRpLj@Y(3%GmFvHxFvFtDs"D]'FN.BP8BJ8HY.BP;Pj2;H2BP.DJ';H5BY!94J+"FbbYbFvHzHwFuFuFuFuFuFuFuFuDp=e2R+.]]YbFvHzHwFuFuFuFuFuFuFuFuDp=e2R'.QQYbFvHzHwFuFuFuFuFuFuFuFuDp=e2R'.]]YbFvHzHwFuFuFuFuFuFuFuFuDp=e2R'.%GZUxDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'P.2k2DJ2DP'FN+@P5DR5@D2BR+;F.BY+8B+;F!4?B-4ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'P.2k2DJ2DP'FN+@P5DR5@D2BR+;F.BY+8B+;F!4?B-0ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'P.2k2DJ2DP'FN+@P5DR5@D2BR+;F.BY+8B+;F!4?D-3ZcsDsFuFuFuFuFuFuFuFuFuHxHwDs@k8_5W'D'P.2k2DJ2DP'FN+@P5DR5@D2BR+;F.BY+8B+;F!4?B-0Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFDDFFFFFFFFFFFFFFFFFF++DD\̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\tb|cccWWW|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9W|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9WŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREW|ŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9W|Ÿ̼пŽŒگȱĭ~|xtoje\oP|ZBcN9W|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtug|ZBcN9WŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREW\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...bUUUUUUUUUTTT```fffiiikkkeeeeeeeeeeeeeeeeeeeeeeeeeee\\T@@AAANoUUUUUUUUUTTT```fffiiikkkeeeeeeeeeeeeeeeeeeeeeeeeeee\\T@@AAATtUUUUUUUUUTTT```fffiiikkkeeeeeeeeeeeeeeeeeeeeeeeeeee\\T@@AAAgUUUUUUUUUTTT```fffiiikkkeeeeeeeeeeeeeeeeeeeeeeeeeee\\T@@AAAOOIIDDDDDDFF;@.BR.FU2=F.DT+DH8;R.BN'5L5J+;H''=.@'._@@BBDDBB==}MMDDDDDDFF;@.BR.FU2=F.DT+DH8;R.BN'5L5J+;H''=.@'._@@BBDDBB@@~MMDDDDDDFF;@.BR.FU2=F.DT+DH8;R.BN'5L5J+;H''=.@'._@@BBDDBB>>~BBkMMDDDDDDFF;@.BR.FU2=F.DT+DH8;R.BN'5L5J+;H''=.@'._@@BBDDBB@@~0DSLuHzJ{HzFvFuBm+FZ85T5@T2@R5HR=;T5BN8BN5=D'5B'5J(/Z>@,JoHzJ{HzFvFuBm+FZ85T5@T2@R5HR=;T5BN8BN5=D'5B'5@"=5"B2,JoHzJ{HzFvFuBm+FZ85T5@T2@R5HR=;T5BN8BN5=D'5B'5@"=5FFF"]t]WwRrD_,JoHzJ{HzFvFuBm+FZ85T5@T2@R5HR=;T5BN8BN5=D'5B'5@"=5"B2%NhFvHzHwFuFuFuFuFuFuFuFuDp=e2R 0%NhFvHzHwFuFuFuFuFuFuFuFuDp=e2R 0;%NhFvHzHwFuFuFuFuFuFuFuFuDp=e2R 0;%NhFvHzHwFuFuFuFuFuFuFuFuDp=e2R 0;0DSY~FvHwHwHwHwHwHwHwHwHxJ{J{FvBo;b8\+H+=.B.DT+DR.@R88R.8U5DP.;N;JW85L2=F.8B--0FvHwHwHwHwHwHwHwHwHxJ{J{FvBo;b8\+H+=.B.DT+DR.@R88R.8U5DP.;N;JW85L2=F.8B--0FvHwHwHwHwHwHwHwHwHxJ{J{FvBo;b8\+H+=.B.DT+DR.@R88R.8U5DP.;N;JW85L2=F.8B--0FvHwHwHwHwHwHwHwHwHxJ{J{FvBo;b8\+H+=.B.DT+DR.@R88R.8U5DP.;N;JW85L2=F.8B--0Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFee..FFFFFFFFFFFFFFFFFF++ee..\çѿŽÎŐϠƗټϸ̶ɲůª|xupkep|||bbbTTTŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xus_|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQIT\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...TR\\\]]]]]]]]]```fffgggfffccccccccccccccccccccccccccccccZZ22++FFiDDDDD???Pn\\\]]]]]]]]]```fffgggfffccccccccccccccccccccccccccccccZZ22++FFiDDDDD???kY|\\\]]]]]]]]]```fffgggfffccccccccccccccccccccccccccccccZZ22++FFiDDDDD???nc~\\\]]]]]]]]]```fffgggfffccccccccccccccccccccccccccccccZZ22++FFiDDDDD???8e5T'@_8DR+;R8@U.@P2;D+=L";@8@"5H.H;!!O8e5T'@_8DR+;R8@U.@P2;D+=L";@8@"5H.H;GGe8e5T'@_8DR+;R8@U.@P2;D+=L";@8@"5H.H;GGe8e5T'@_8DR+;R8@U.@P2;D+=L";@8@"5H.H;GGeHhHxJ}J{HxHwBo5T+=P2BL+FH'=L2DL2=H.5D2BL8D"@VV^LZpHxJ}J{HxHwBo5T+=P2BL+FH'=L2DL2=H.5D2BL8D"@@+FAOOLZpHxJ}J{HxHwBo5T+=P2BL+FH'=L2DL2=H.5D2BL8D"@@+FFFWfe_YzPoLZpHxJ}J{HxHwBo5T+=P2BL+FH'=L2DL2=H.5D2BL8D"@@+FAOOFvHzHwFuFuFuFuFuFuFuFuDp=e2R2FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<SrHvHzHzHzHzHzHzHzHzHzJ|J|HxDp=e8_+H.B.B2F2B"DP;BN.=J+FL"5B5HR'2B17C0AMHuHzHzHzHzHzHzHzHzHzJ|J|HxDp=e8_+H.B.B2F2B"DP;BN.=J+FL"5B5HR'2B17C0AMHuHzHzHzHzHzHzHzHzHzJ|J|HxDp=e8_+H.B.B2F2B"DP;BN.=J+FL"5B5HR'2B17C0AMHuHzHzHzHzHzHzHzHzHzJ|J|HxDp=e8_+H.B.B2F2B"DP;BN.=J+FL"5B5HR'2B17C0AMZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..==''FFFFFFFFFFFFFFFFFF++..==''\˺’ŽÏσϠگ٭˜ռϹͶʳƯ«}zupozzz___ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_ð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_ï·ʨσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_ï·˼пŽÏσϠگʳƯ«}zupke\nPzU=_ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}znPzU=_ð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...{Y]]]]]]]]]\\\```cccfffeeebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{ZZDD22222222DDvZZ___WWWJJJ???W]]]]]]]]]\\\```cccfffeeebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{ZZDD22222222DDvZZ___WWWJJJ???\]]]]]]]]]\\\```cccfffeeebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{ZZDD22222222DDvZZ___WWWJJJ???v]]]]]]]]]\\\```cccfffeeebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{ZZDD22222222DDvZZ___WWWJJJ???DRf@kBoBm@c'@Y+@T"8N+@T';H;P@Y=c5Y'@'DRf@kBoBm@c'@Y+@T"8N+@T';H;P@Y=c5Y'@AFKDRf@kBoBm@c'@Y+@T"8N+@T';H;P@Y=c5Y'@AFKDRf@kBoBm@c'@Y+@T"8N+@T';H;P@Y=c5Y'@AFK,LpHxHxFvFu@k8e;@5F_'=H"=H2@B'5F.;L".8'B"'F1NrHxHxFvFu@k8e;@5F_'=H"=H2@B'5F.;L".8'B"'FB'5N:1NrHxHxFvFu@k8e;@5F_'=H"=H2@B'5F.;L".8'B"'F"J'"L"FQTc`\~Vu1NrHxHxFvFu@k8e;@5F_'=H"=H2@B'5F.;L".8'B"'FB'5N:%EjFvHzHwFuFuFuFuFuFuFuFuDp=e2R 2%EjFvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<%EjFvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<%EjFvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<5JaHvFvFvFvFvFvFvFvFvHwHzFuBm;c8b=B;B+8n2P+='DJ+@L'BJ.=H"5B.;B+5@=@IHvFvFvFvFvFvFvFvFvHwHzFuBm;c8b=B;B+8n2P+='DJ+@L'BJ.=H"5B.;B+5@=@IHvFvFvFvFvFvFvFvFvHwHzFuBm;c8b=B;B+8n2P+='DJ+@L'BJ.=H"5B.;B+5@=@IHvFvFvFvFvFvFvFvFvHwHzFuBm;c8b=B;B+8n2P+='DJ+@L'BJ.=H"5B.;B+5@=@IZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF++\ʬÏÏÏŐŒŒ־ҼйͶʳǯ«}zutttXU[~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[~ȺϾÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[~ɻϾŽÏÏÏŐŒʳǯ«}zupke~\iLtR<[~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}z~iLtR<[ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...XXXXXX___``````bbb```____________________________________________________________\\\TTTCCCXXXXXX___``````bbb```____________________________________________________________\\\TTTCCCXXXXXX___``````bbb```____________________________________________________________\\\TTTCCCXXXXXX___``````bbb```____________________________________________________________\\\TTTCCCFuHwFuDsDsDoDnBfDpDsDsBn;b.N1FuHwFuDsDsDoDnBfDpDsDsBn;b.N+4?FuHwFuDsDsDoDnBfDpDsDsBn;b.N+4?FuHwFuDsDsDoDnBfDpDsDsBn;b.N+4?[dv%EiDRfFFHHBH5B|';\2D5B+;'5'ghi[dv%EiDRfFFHHBH5B|';\2D5B+;'5')E)[dv%EiDRfFFHHBH5B|';\2D5B+;'5'"R"-T-^e^Xbl[jw[dv%EiDRfFFHHBH5B|';\2D5B+;'5')E)FvHzHwFuFuFuFuFuFuFuFuDp=e2R 2FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<FvHzHwFuFuFuFuFuFuFuFuDp=e2R$/<,Hk%Ej%Ej%NhYb;b;`"@v"@z'@z8BHHJJHHDD@@25t'D'55DKQU\``d|,Hk%Ej%Ej%NhYb;b;`"@v"@z'@z8BHHJJHHDD@@25t'D'55DKQU\``d|,Hk%Ej%Ej%NhYb;b;`"@v"@z'@z8BHHJJHHDD@@25t'D'55DKQU\``d|,Hk%Ej%Ej%NhYb;b;`"@v"@z'@z8BHHJJHHDD@@25t'D'55DKQU\``d|Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF++\»ϾʨΎԾҼϹͶʳƯ°jgkSLVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTVĿÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}x~j`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTV\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...```````````````````````````````````````````````````````````````___]]]ZZZUUUJJJ```````````````````````````````````````````````````````````````___]]]ZZZUUUJJJ```````````````````````````````````````````````````````````````___]]]ZZZUUUJJJ```````````````````````````````````````````````````````````````___]]]ZZZUUUJJJ%EiFvHxFvFtFtFtFtFtFtFtFtBo;c.P 4%EiFvHxFvFtFtFtFtFtFtFtFtBo;c.P$/<%EiFvHxFvFtFtFtFtFtFtFtFtBo;c.P$/<%EiFvHxFvFtFtFtFtFtFtFtFtBo;c.P$/<DDHHHHFF@@55z+L'@"2 ),DDHHHHFF@@55z+L'@"2%)DDHHHHFF@@55z+L'@"2*&:^:DDHHHHFF@@55z+L'@"2%),HkFvHzHwFuFuFuFuFuFuFuFuDp=e2R$3,HkFvHzHwFuFuFuFuFuFuFuFuDp=e2R+4?,HkFvHzHwFuFuFuFuFuFuFuFuDp=e2R+4?,HkFvHzHwFuFuFuFuFuFuFuFuDp=e2R+4?QQ@B5{B"NH=@FFFFHHHHHHDD@@55wD".'8RSTd|]]BD5{B"NH=@FFFFHHHHHHDD@@55wD".'8RSTd|bbAE5zB"NH=@FFFFHHHHHHDD@@55wD".'8RSTd|]]BD5{B"NH=@FFFFHHHHHHDD@@55wD".'8RSTd|Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF++\ſʶȴƲïż¼}zYIaȻϾŽŽŽտԽѻϸͶɲů|xtni`sTYFaȻϾŽŽŽտԽѻϸͶɲů|xtni`sTYFaȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]UaʬŽŽտԽѻϸͶɲů|xtni`sTYFaȻϾŽŽŽɲů|xtni`sTYFaȻϾŽŽŽտԽѻϸͶɲů|sTYFaȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]Ua\\\cccffffff``````````````````````````````eeefffkkkǀbbb]]]ZZZUUUPPPFFF@@@```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````eeefffkkkǀbbb]]]ZZZUUUPPPFFF@@@```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````eeefffkkkǀbbb]]]ZZZUUUPPPFFF@@@```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````eeefffkkkǀbbb]]]ZZZUUUPPPFFF@@@```````````````````````````]]]UUUHHH...````````````````````````````````````````````````````````````___]]]ZZZTTTJJJ````````````````````````````````````````````````````````````___]]]ZZZTTTJJJ````````````````````````````````````````````````````````````___]]]ZZZTTTJJJ````````````````````````````````````````````````````````````___]]]ZZZTTTJJJHxJ{HzFvFvFvFvFvFvFvFvDr=g2T&6HxJ{HzFvFvFvFvFvFvFvFvDr=g2T4:FHxJ{HzFvFvFvFvFvFvFvFvDr=g2T4:FHxJ{HzFvFvFvFvFvFvFvFvDr=g2T4:FDDHHHHFF@@88~''YRTVDDHHHHFF@@88~''YNURDDHHHHFF@@88~''YLRPDDHHHHFF@@88~''YNURFvHzHwFuFuFuFuFuFuFuFuDp=e2R(4FvHzHwFuFuFuFuFuFuFuFuDp=e2R9?GFvHzHwFuFuFuFuFuFuFuFuDp=e2R9?GFvHzHwFuFuFuFuFuFuFuFuDp=e2R9?GTTDDFFFFHHHHDD@@55wH8'BPPZ^uZnpjuTTDDFFFFHHHHDD@@55wH8'BPPZ^uZnpjuXXDDFFFFHHHHDD@@55wH8'BPPZ^uZnpjuTTDDFFFFHHHHDD@@55wH8'BPPZ^uZnpjuZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF++\źeOo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\eKo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\eKo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gTo½’ԾҼѺθ˴ȱĭ~{vrme~\eKo·ʻϾȱĭ~{vrme~\eKo·ʻϾԾҼѺθ˴ȱĭ~neKo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gTo\\\cccffffff```````````````````````````bbbfffgggiiivvvccc```\\\YYYRRRJJJNNN```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````bbbfffgggiiivvvccc```\\\YYYRRRJJJNNN```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````bbbfffgggiiivvvccc```\\\YYYRRRJJJNNN```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````bbbfffgggiiivvvccc```\\\YYYRRRJJJNNN```````````````````````````]]]UUUHHH...`````````````````````````````````````````````````````````___]]]ZZZTTTJJJ`````````````````````````````````````````````````````````___]]]ZZZTTTJJJ`````````````````````````````````````````````````````````___]]]ZZZTTTJJJ`````````````````````````````````````````````````````````___]]]ZZZTTTJJJHxJ}J{HxHxHxHxHxHxHxHxFt@i2U68>HxJ}J{HxHxHxHxHxHxHxHxFt@i2UHxJ}J{HxHxHxHxHxHxHxHxFt@i2UHxJ}J{HxHxHxHxHxHxHxHxFt@i2UDDHHHHFFBB88''\F))I//J//JFFTHSbimtDDHHHHFFBB88''\11LPW_DDHHHHFFBB88''\WX`QW^DDHHHHFFBB88''\11LPW_HvHzHwFuFuFuFuFuFuFuFuDp=e1QHvHzHwFuFuFuFuFuFuFuFuDp=e1QHvHzHwFuFuFuFuFuFuFuFuDp=e1QHvHzHwFuFuFuFuFuFuFuFuDp=e1QFFHHJJHHFF@@55{""N""P""U""TJF!!G//LCJ_jb}kr|FFHHJJHHFF@@55{""N""P""U""TJF!!G//LCJ_jb}kr|FFHHJJHHFF@@55{""N""P""U""TJF!!G//LCJ_jb}kr|FFHHJJHHFF@@55{""N""P""U""TJF!!G//LCJ_jb}kr|Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF++䂂TT_½½sqQ|·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`qQ|·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`qQ|·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`s^|ź˺ԿԿӾҼѺϸ̶ʳƯ«}xuoi`qQ|·ʻϽѾӿԿԿƯ«}xuoi`qQ|·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}qQ|·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`s^|\\\cccffffff``````````````````````````````cccfffffffffeeecccbbb___\\\WWWRRRPPP___```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````cccfffffffffeeecccbbb___\\\WWWRRRPPP___```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````cccfffffffffeeecccbbb___\\\WWWRRRPPP___```````````````````````````]]]UUUHHH...\\\cccffffff``````````````````````````````cccfffffffffeeecccbbb___\\\WWWRRRPPP___```````````````````````````]]]UUUHHH...``````````````````````````````````````````````````````___]]]ZZZTTTJJJ``````````````````````````````````````````````````````___]]]ZZZTTTJJJ``````````````````````````````````````````````````````___]]]ZZZTTTJJJ``````````````````````````````````````````````````````___]]]ZZZTTTJJJ1NrHxHzFvFvFvFvFvFvFvFvDr=e1J1NrHxHzFvFvFvFvFvFvFvFvDr=e0>S,LpHxHzFvFvFvFvFvFvFvFvDr=e0>S1NrHxHzFvFvFvFvFvFvFvFvDr=e0>SMMJJJJHHDD;;''\FFFFFFVV^@N`bm|QgMMJJJJHHDD;;''\F!!GW\bIYkBTisuxIIJJJJHHDD;;.._=JZDO]MMJJJJHHDD;;''\F!!GW\bIYkBTisux[ewHuFvDsDsDsDsDsDsDsDsBn8_[ewHuFvDsDsDsDsDsDsDsDsBn:_5JaHvFvDsDsDsDsDsDsDsDsBn:_[ewHuFvDsDsDsDsDsDsDsDsBn:_HHJJJJFFBB55|''Y..m22u22v..m''Y''Z++e++gmikim]oHHJJJJFFBB55|''Y..m22u22v..m''Y''Z++e++gmikim]oHHJJJJFFBB55|''Y..m22u22v..m''Y''Z++e++gmikim]oHHJJJJFFBB55|''Y..m22u22v..m''Y''Z++e++gmikim]oZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFzSµȿȺÿcwYµȹͻϼмѼлϺθ̶ʴǰí~{vrkcwYµȹͻϼмѼлϺθ̶ʴǰí~{vrkcwYµȹͻϼмѼлϺθ̶ʴǰí~{vrkczcſçѼлϺθ̶ʴǰí~{vrkcwYµȹͻϼмѼí~{vrkcwYµȹͻϼмѼлϺθ̶ʴǰí~x]µȹͻϼмѼлϺθ̶ʴǰí~{vrkczc\\\cccffffff```````````````````````````````````````]]]]]]\\\ZZZYYYWWWWWWZZZ`````````````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````````````````]]]]]]\\\ZZZYYYWWWWWWZZZ`````````````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````````````````]]]]]]\\\ZZZYYYWWWWWWZZZ`````````````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````````````````]]]]]]\\\ZZZYYYWWWWWWZZZ`````````````````````````````````]]]UUUHHH...```````````````````````````````````````````````````___]]]ZZZTTTJJJ```````````````````````````````````````````````````___]]]ZZZTTTJJJ```````````````````````````````````````````````````___]]]ZZZTTTJJJ```````````````````````````````````````````````````___]]]ZZZTTTJJJLZp,Jo%Gm%Gm%Gm%Gm%GmChFoHpDj4MLZp,Jo%Gm%Gm%Gm%Gm%Gm%Gm%Gm%Gm,FgHhLuHpBj@f%Gm%Gm%Gm%Gm%Gm,FgLZp,Jo%Gm%Gm%Gm%Gm%Gm%Gm%Gm%Gm,FgMMJJHHBB88''W""PF''W++`""UHF"FPf~YpRg~BMYMMJJHHDD88""PJFF4?VFYnJ]thpzOOFFJJHHDD885B]?OaMMJJHHDD88""PJFF4?VFYnJ]thpzZcsZcs%IbW{UxNn:QZcsZcsX`mSrY~UxJj%:QZcsX`mZcsZcsX`mHHJJFF@@..o55}====;;88~22p22t55x55}vvtWmY_gHHJJFF@@..o55}====;;88~22p22t55x55}vvtWmY_gHHJJFF@@..o55}====;;88~22p22t55x55}vvtWmY_gHHJJFF@@..o55}====;;88~22p22t55x55}vvtWmY_gZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5JJJJJJJJJJJJJJJJJJTTJJJJJJJJJJJJJJJJJJBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++ĵɷ˽ïƽϏƾörmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmgv»̸˶ʵȲƯí~{vrmc{^ĵɷ˸̸ÿ{vrmc{^ĵɷ˸̸̸˶ʵȲƯí~|cĵɷ˸̸̸˶ʵȲƯí~{vrmgv]]]eee___WWWJJJ222\\\]]]TTT;;;\\\]]]TTT;;;]]]eee___WWWJJJ222]]]eee___WWWJJJ222\\\]]]TTT;;;\\\]]]TTT;;;]]]eee___WWWJJJ222]]]eee___WWWJJJ222\\\]]]TTT;;;\\\]]]TTT;;;]]]eee___WWWJJJ222]]]eee___WWWJJJ222\\\]]]TTT;;;\\\]]]TTT;;;]]]eee___WWWJJJ222???222````````````````````````````````````````````````___]]]ZZZTTTJJJ???222````````````````````````````````````````````````___]]]ZZZTTTJJJ???222````````````````````````````````````````````````___]]]ZZZTTTJJJ???222````````````````````````````````````````````````___]]]ZZZTTTJJJ%G\jlm0DS%GZ9DOTT;;22v22r++b''Z55{55w..n""RJBLouZs@Pc8FYLLBB;;..n''Y..i''YFTj`z8FY2@Poo@@BB@@;;2;cWn8FWLLBB;;..n''Y..i''YFTj`z8FY2@P%G\jlm0DS%GZ9DOFF@@88~88BBBB@@==8855}@@~__zxc|FF@@88~88BBBB@@==8855}@@~__zxc|FF@@88~88BBBB@@==8855}@@~__zxc|FF@@88~88BBBB@@==8855}@@~__zxc|Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5RRRRRRRRRRRRRRRRRR䂂++++++++++++++++++++++++++++++++++++++++RRRRRRRRRRRRRRRRRRBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++~²ŲŲŲį­~|zupjp~²ŲŲŲį­~|zupjp~²ŲŲŲį­~|zupjp²ŲŲŲį­~|zupnżŲį­~|zupjp~²Ųupjp~²ŲŲŲį­~v²ŲŲŲį­~|zupnfffvvvbbbZZZLLL???___]]]]]]UUU@@@___]]]]]]UUU@@@fffvvvbbbZZZLLL???fffvvvbbbZZZLLL???___]]]]]]UUU@@@___]]]]]]UUU@@@fffvvvbbbZZZLLL???fffvvvbbbZZZLLL???___]]]]]]UUU@@@___]]]]]]UUU@@@fffvvvbbbZZZLLL???fffvvvbbbZZZLLL???___]]]]]]UUU@@@___]]]]]]UUU@@@fffvvvbbbZZZLLL???JJJLLLJJJ`````````````````````````````````````````````___]]]ZZZTTTJJJJJJLLLJJJ`````````````````````````````````````````````___]]]ZZZTTTJJJJJJLLLJJJ`````````````````````````````````````````````___]]]ZZZTTTJJJJJJLLLJJJ`````````````````````````````````````````````___]]]ZZZTTTJJJPP|@@;;8844t99eJNoqg[s]oVV<<88~55x11dYojZqXh{??55}58r_vcxY`gVV<<88~55x11dYojZqXh{mme{mme{mme{mme{Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5JJJJJJJJJJJJJJJJJJ++JJJJJJJJJJJJJJJJJJBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++|zzzwupmm|zzzwupmm|zzzwupmmzwxupmm|mm|zzzwxbbbfffeee```YYYJJJXXX]]]]]]UUUDDD<<<XXX]]]]]]UUUDDD<<<bbbfffeee```YYYJJJbbbfffeee```YYYJJJXXX]]]]]]UUUDDD<<<XXX]]]]]]UUUDDD<<<bbbfffeee```YYYJJJbbbfffeee```YYYJJJXXX]]]]]]UUUDDD<<<XXX]]]]]]UUUDDD<<<bbbfffeee```YYYJJJbbbfffeee```YYYJJJXXX]]]]]]UUUDDD<<<XXX]]]]]]UUUDDD<<<bbbfffeee```YYYJJJTTTYYYZZZWWW``````````````````````````````````````````___]]]ZZZTTTJJJTTTYYYZZZWWW``````````````````````````````````````````___]]]ZZZTTTJJJTTTYYYZZZWWW``````````````````````````````````````````___]]]ZZZTTTJJJTTTYYYZZZWWW``````````````````````````````````````````___]]]ZZZTTTJJJZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++oooaaa]]]YYYTTTXXX]]]\\\UUUHHH333XXX]]]\\\UUUHHH333oooaaa]]]YYYTTToooaaa]]]YYYTTTXXX]]]\\\UUUHHH333XXX]]]\\\UUUHHH333oooaaa]]]YYYTTToooaaa]]]YYYTTTXXX]]]\\\UUUHHH333XXX]]]\\\UUUHHH333oooaaa]]]YYYTTToooaaa]]]YYYTTTXXX]]]\\\UUUHHH333XXX]]]\\\UUUHHH333oooaaa]]]YYYTTTYYY```bbb___```````````````````````````````````````___]]]ZZZTTTJJJYYY```bbb___```````````````````````````````````````___]]]ZZZTTTJJJYYY```bbb___```````````````````````````````````````___]]]ZZZTTTJJJYYY```bbb___```````````````````````````````````````___]]]ZZZTTTJJJZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++YUUYWW\]\\v~ii~v]]]eeeffffffffffffffffffffffffffffffffffff```]]]ZZZTTTJJJ]]]eeeffffffffffffffffffffffffffffffffffff```]]]ZZZTTTJJJ]]]eeeffffffffffffffffffffffffffffffffffff```]]]ZZZTTTJJJ]]]eeeffffffffffffffffffffffffffffffffffff```]]]ZZZTTTJJJZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5BBBBBBBBBBBBBBBBBB==BBBBBBBBBBBBBBBBBBBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++R_R]no_one|tkt|mcpckfffvvvffffffffffffffffffffffffffffffffffffbbbZZZTTTJJJfffvvvffffffffffffffffffffffffffffffffffffbbbZZZTTTJJJfffvvvffffffffffffffffffffffffffffffffffffbbbZZZTTTJJJfffvvvffffffffffffffffffffffffffffffffffffbbbZZZTTTJJJZm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5TbbTPNNPYTTYggbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYKKKbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYKKKbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYKKKbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYKKKZm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5ogvjkrnkoooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTTZm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5Zm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5Zm`t`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`u`u`u`u`u`u`u`u`u`u`uJZ+5WjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=J=J+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+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2ZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5Zm`uTfL\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\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5Zm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5Zm`ucx8p@n~ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYkTeL\=J+5.888222.......................................###888222.......................................###888222.......................................###888222.......................................###Zm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5'H;D."8|+u8='{n;JGGGLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***GGGLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***GGGLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***GGGLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5S_\\\\\\\\\\\\\\\\\\\\ZLBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888++++{z+'Y\YWjb;`j5H8HJJJTTTYYYWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888###JJJTTTYYYWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888###JJJTTTYYYWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888###JJJTTTYYYWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888###Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5++++++++++++++++++z}Z++++++++++++++++++BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++x"sis'"mB\JJJTTTZZZ]]]___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZRRRDDD...JJJTTTZZZ]]]___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZRRRDDD...JJJTTTZZZ]]]___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZRRRDDD...JJJTTTZZZ]]]___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZRRRDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5888888888888888888f888888888888888888BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++7+=1$77+=1$77+=1$7===777===777===777===777===777???222...666GGG^^^nnn```TTT999]]]nnn```TTT999111222...###???222...666GGG^^^nnn```TTT999]]]nnn```TTT999111222...###???222...666GGG^^^nnn```TTT999]]]nnn```TTT999111222...###???222...666GGG^^^nnn```TTT999]]]nnn```TTT999111222...###JJJTTTZZZ]]]___```````````````````````````````````````___WWWJJJ222JJJTTTZZZ]]]___```````````````````````````````````````___WWWJJJ222JJJTTTZZZ]]]___```````````````````````````````````````___WWWJJJ222JJJTTTZZZ]]]___```````````````````````````````````````___WWWJJJ222LXh:J[FVjGGe..a++`''Y--RCCROOYzFVkPf9Ea--]'']""R&&IMMTW`lJ]w""NFE//?zFVkPf9Ea--]'']""R&&IMMTdzsuxVV^SS\mmqdzsuxVV^SS\mmqdzsuxVV^SS\mmqdzsuxVV^SS\mmqZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5==================v==================BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7M:TN9WP;YP;YP;YP;YP;YP;YN9W1$7QITREWRBYP=YP;YP;YP=YRBYPEW777M:TN9WP;YP;YR@YTJYWUYYYYWWW647M:TN9WYYYYYYYYYYYYYYYYYYN9W1$7TTTWWWYYYWUYTJYR@YP;YP;YN9W1$7QITREWRBYP=YP;YP;YP=YRBYPEW777JJJLLLJJJDDD888***@@@TTTiii___PPPLLLccc___PPPGGGLLLJJJDDD888***JJJLLLJJJDDD888***@@@TTTiii___PPPLLLccc___PPPGGGLLLJJJDDD888***JJJLLLJJJDDD888***@@@TTTiii___PPPLLLccc___PPPGGGLLLJJJDDD888***JJJLLLJJJDDD888***@@@TTTiii___PPPLLLccc___PPPGGGLLLJJJDDD888***JJJTTTZZZ]]]___``````````````````````````````````````````\\\ZZZLLL111JJJTTTZZZ]]]___``````````````````````````````````````````\\\ZZZLLL111JJJTTTZZZ]]]___``````````````````````````````````````````\\\ZZZLLL111JJJTTTZZZ]]]___``````````````````````````````````````````\\\ZZZLLL111[\]&-$$*0(qpinuHP;;88====;;++g''Z""RJ""P,,O22Kmeze}55};;88''_J""P""L++Ie}@Ju""RJFF''6meze}55};;88''_J""P""L++I[\]&-$+04(Vg}:J[2@P6BRWWoHHp==u22p22s22v22r..m++g''W""N""N&&JVg}:J[2@P6BRWWoHHp==u22p22s22v22r..m++g''W""N""N&&JVg}:J[2@P6BRWWoHHp==u22p22s22v22r..m++g''W""N""N&&JVg}:J[2@P6BRWWoHHp==u22p22s22v22r..m++g''W""N""N&&JZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=RIVR<[U=_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP;YN9W6'=VTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=RIVR<[U=_Y@bZBcY@cW@bU=_R;\R=YULYYYYYYYYYYSPW8-=RIVR<[U=_Y@bZBccccbbb___\\\YYYYYYP;YP;YP;YN9W6'=SLVXU[___bbbccc_TcYBbU=_R;\P;YP;YP;YP;YP;YN9W6'=VTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=TTTYYYZZZWWWRRRHHH888...\\\\\\FFF NNNTTTDDD ???WWWZZZWWWRRRHHH888###TTTYYYZZZWWWRRRHHH888...\\\\\\FFF NNNTTTDDD ???WWWZZZWWWRRRHHH888###TTTYYYZZZWWWRRRHHH888...\\\\\\FFF NNNTTTDDD ???WWWZZZWWWRRRHHH888###TTTYYYZZZWWWRRRHHH888...\\\\\\FFF NNNTTTDDD ???WWWZZZWWWRRRHHH888###JJJTTTZZZ]]]___`````````````````````````````````````````````JJJWWWGGGJJJTTTZZZ]]]___`````````````````````````````````````````````JJJWWWGGGJJJTTTZZZ]]]___`````````````````````````````````````````````JJJWWWGGGJJJTTTZZZ]]]___`````````````````````````````````````````````JJJWWWGGGikl.A'="8"5022 2 2 ,'1?$/<$/<$/< (9(9(7+17+4A$/<$/>$/<&6"5"5"5.'1?$/<$/<$/< (9(9(7+17mtFH@@BBDDFFDD55{22r++g55{88~22t'']%%G~txbv==BB==++c55}88~22t''\%%Gug88~8822s''ZF~txbv==BB==++c55}88~22t''\%%Gikl:M.B'8'8(!(STXMPTJLOCEJ?BFSTXMPTKMQ 2<+='8'8!1STXMPTJLOCEJ?BFwGXlJ_v8HY5DUBBBBBB@@@@@@==;;55{..j55z55w..j""NwGXlJ_v8HY5DUBBBBBB@@@@@@==;;55{..j55z55w..j""NwGXlJ_v8HY5DUBBBBBB@@@@@@==;;55{..j55z55w..j""NwGXlJ_v8HY5DUBBBBBB@@@@@@==;;55{..j55z55w..j""NZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++YFa`FkiLtnPzs_|ug|ukzupwpkskgnebg]T`UJZRBYP;YP;YP;YYFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;YYFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;Y]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=YYFa`FkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`UHZYYYYYYYYYWTYYFa`FkiLtnPzoP|oP|zzzwwwsssnnnggg```R;ZP;YP;YP;YP;YYIajgktttzzz|||tb|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP;Y]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=YYYY```bbb___ZZZNNN888+++222WWW555......PPP555...222JJJ\\\___ZZZRRRDDD...YYY```bbb___ZZZNNN888+++222WWW555......PPP555...222JJJ\\\___ZZZRRRDDD...YYY```bbb___ZZZNNN888+++222WWW555......PPP555...222JJJ\\\___ZZZRRRDDD...YYY```bbb___ZZZNNN888+++222WWW555......PPP555...222JJJ\\\___ZZZRRRDDD...JJJTTTZZZ]]]___````````````````````````````````````````````````222???JJJTTTZZZ]]]___````````````````````````````````````````````````222???JJJTTTZZZ]]]___````````````````````````````````````````````````222???JJJTTTZZZ]]]___````````````````````````````````````````````````222???+;Q5W5W2T2T.P.N+J+H+F'D'@5&20>T5W5W2T2T.P.N+J+H+F'D'@5#20>T5W5W2T2T.P.N+J+H+F'D'@5.0>T5W5W2T2T.P.N+J+H+F'D'@5#2t}rOOBBFFHHHH;;22p88==;;55{..i""R$$Fu{\lDD8888==;;55{++g""P Duu?D@@;;55{++g""PCu{\lDD8888==;;55{++g""P D9DP.L+H'D'D'D'D'D'D'D'D";1')..K+H'D'D'D'D'D'D'D'D";!4359.K+H'D'D'D'D'D'D'D'D";2!.K+H'D'D'D'D'D'D'D'D";!4359rLbzH\sRgPe}Pe~HHHHHHFFDDDDBBBB55{55z888855w++f""L33KrLbzH\sRgPe}Pe~HHHHHHFFDDDDBBBB55{55z888855w++f""L55LrLbzH\sRgPe}Pe~HHHHHHFFDDDDBBBB55{55z888855w++f""L00IrLbzH\sRgPe}Pe~HHHHHHFFDDDDBBBB55{55z888855w++f""L55LZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF==vfZLeKosT~j~{{{sssjjj```ZYZUPYRDYP;YN9W+0eKosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YN9W+0eKosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YN9W+0gTosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YPCW000eKosTzY~\\]\~\|ZzYtToP{gJs_DjZL`ZZZYYYYYYWTYN>~''Y88==8822t++b""UHAAv88==8822t++b""UHMP`88==8822t++b""UHAAv88==8822t++b""UH7[5W.P+J+J+J+J+J+J+J+J'@51/137[5W.P+J+J+J+J+J+J+J+J'@51'),7[5W.P+J+J+J+J+J+J+J+J'@51 7[5W.P+J+J+J+J+J+J+J+J'@51'),RW_\rRi]wOOJJHHDDDDBB@@..n22r88~8888~22v++bHRW_\rRi]wOOJJHHDDDDBB@@..n22r88~8888~22v++bHRW_\rRi]wOOJJHHDDDDBB@@..n22r88~8888~22v++bHRW_\rRi]wOOJJHHDDDDBB@@..n22r88~8888~22v++bHZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}ZqQ|n|||rrrggg]]]YYYWUYRDYO:X+0qQ|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YO:X+0qQ|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YO:X+0s^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000qQ|~\`beeeecb`]}ZwWoP|fJrbYg]]]YYYYYYWPYO:X+0qQ|~\`beeeeoP|fJr]DgT=]P;YP;YP;YO:X+0qQ|eecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YO:X+0s^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000\\\cccffffff```````````````````````````___NNNLLLLLLLLLLLLJJJFFFDDD===555...222YYY```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___NNNLLLLLLLLLLLLJJJFFFDDD===555...222YYY```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___NNNLLLLLLLLLLLLJJJFFFDDD===555...222YYY```````````````````````````]]]UUUHHH...\\\cccffffff```````````````````````````___NNNLLLLLLLLLLLLJJJFFFDDD===555...222YYY```````````````````````````]]]UUUHHH...JJJTTTZZZ]]]___``````````````````````````````````````````````````````JJJTTTZZZ]]]___``````````````````````````````````````````````````````JJJTTTZZZ]]]___``````````````````````````````````````````````````````JJJTTTZZZ]]]___``````````````````````````````````````````````````````5KhDrFtDsBm=f8_5Y.L+H'D'B'@";5"15KhDrFtDsBm=f8_5Y.L+H'D'B'@";5.5KhDrFtDsBm=f8_5Y.L+H'D'B'@";5,5KhDrFtDsBm=f8_5Y.L+H'D'B'@";5.MQV..J""T..n..o++g''YJFMSU""T..n..o++g''YJF>GH""T..n..o++g''YJFMSU""T..n..o++g''YJF:J`8\5W.P+J+J+J+J+J+J+J+J'@52$0:J`8\5W.P+J+J+J+J+J+J+J+J'@52!0:J`8\5W.P+J+J+J+J+J+J+J+J'@52*:J`8\5W.P+J+J+J+J+J+J+J+J'@52!0Xk^ixa{kffUU+.f++b"'U''_..n55w55x22p++e""RF7F=3H3?A?Xk^ixa{kffUU+.f++b"'U''_..n55w55x22p++e""RF;I@8K8Xk^ixa{kffUU+.f++b"'U''_..n55w55x22p++e""RF#9,"<"Xk^ixa{kffUU+.f++b"'U''_..n55w55x22p++e""RF;I@8K8Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF''\x]wwwkkk___YYYYYYWPYNP<9Ph'DR'BL5;T@LZ@L]2FU2LZ5;U.@T";@"."2+F5Y;`8]2R$/<T7>Ph'DR'BL5;T@LZ@L]2FU2LZ5;U.@T";@"."2+F5Y;`8]2R0P<9Ph'DR'BL5;T@LZ@L]2FU2LZ5;U.@T";@"."2+F5Y;`8]2R$/<88S""P''\=kHzJ|J{HwHwHwHwHwHwHwHwDs@i2U;FF88S""P''\=kHzJ|J{HwHwHwHwHwHwHwHwDs@i2U;FF88S""P''\=kHzJ|J{HwHwHwHwHwHwHwHwDs@i2U;FF88S""P''\=kHzJ|J{HwHwHwHwHwHwHwHwDs@i2U;FFrw{'HT2=YFUj;HZ'DP@Tb5=YHb{.HR.=H+.B+5D"5F.H"'Y=gHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'Drw{'HT2=YFUj;HZ'DP@Tb5=YHb{.HR.=H+.B+5D"5F.H"'Y=gHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'Drw{'HT2=YFUj;HZ'DP@Tb5=YHb{.HR.=H+.B+5D"5F.H"'Y=gHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'D(rw{'HT2=YFUj;HZ'DP@Tb5=YHb{.HR.=H+.B+5D"5F.H"'Y=gHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'DZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF==eeiFFFFFFFFFFFFFFFFFFTTTLLL........5522............@@bbi\zĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP;Y===wwwbbbYYY===ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwYBbWUY===ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===zĶʺμѾҿ˜̠޼з˴ȲĮ|xurupwW@bP;Y7+=zĶʺμѾҿ˜Į|xurmgb|ZkNwW@bP;Y7+=zƽʶ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP;Y7+=ĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===fffwww൵ccc`````````````````````___bbbcccw\\..~''WJJLLLDDD555````````````````````````___]]]YYYLLL888fffwww൵ccc`````````````````````___bbbcccw\\..~''WJJLLLDDD555````````````````````````___]]]YYYLLL888fffwww൵ccc`````````````````````___bbbcccw\\..~''WJJLLLDDD555````````````````````````___]]]YYYLLL888fffwww൵ccc`````````````````````___bbbcccw\\..~''WJJLLLDDD555````````````````````````___]]]YYYLLL888eee88TTFFz``jjjjjjjjjjjjjjjjjjjjjjjj```YYYLLL222 999eee88TTFFz``jjjjjjjjjjjjjjjjjjjjjjjj```YYYLLL222 999eee88TTFFz``jjjjjjjjjjjjjjjjjjjjjjjj```YYYLLL222 999eee88TTFFz``jjjjjjjjjjjjjjjjjjjjjjjj```YYYLLL222 999BBDD@@;;EE8Z5J.=J8HR8BJ2FN';N'BU=Pc2@T28P5BL2BH28F"'2".'8+@YjwlZpDDFFBB88<GHknFFDD@@ss{5H5H;U'HW8H]8Pb5L].FU'BR.FW'@J+=D'DR"BB+5B'5Z+=+=MSUDDBB;;--]`ky5H5H;U'HW8H]8Pb5L].FU'BR.FW'@J+=D'DR"BB+5B'5Z+=+=MQV>>~;;55{++g--RFFDD@@ss{5H5H;U'HW8H]8Pb5L].FU'BR.FW'@J+=D'DR"BB+5B'5Z+=+=MSUDDBB;;--]`bc`5T====;;|wn?pi\p5R`8FN+;R2N\"BH.DH+DJ+=='.5+5=2R=eBmBn=e2T88{vk?kg\p5R`8FN+;R2N\"BH.DH+DJ+=='.5+5=2R=eBmBn=e2Trw\p5R`8FN+;R2N\"BH.DH+DJ+=='.5+5=2R=eBmBn=e2T"8$88{vk?kg\p5R`8FN+;R2N\"BH.DH+DJ+=='.5+5=2R=eBmBn=e2TDDn55z22u22r22v8;FwJ|HzHwHwHwFvFtDrDrDrBm;b+L"'W''_++c++c""LDDn55z22u22r22v8;FwJ|HzHwHwHwFvFtDrDrDrBm;b+L"'W''_++c++c""LDDn55z22u22r22v8;FwJ|HzHwHwHwFvFtDrDrDrBm;b+L"'W''_++c++c""LDDn55z22u22r22v8;FwJ|HzHwHwHwFvFtDrDrDrBm;b+L"'W''_++c++c""L5FJ+8R.LZ'FH8PW2LW5HL.=D.8D2@H".="+B"'T"2bDsHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'D5FJ+8R.LZ'FH8PW2LW5HL.=D.8D2@H".="+B"'T"2bDsHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'D5FJ+8R.LZ'FH8PW2LW5HL.=D.8D2@H".="+B"'T"2bDsHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'D'8$5FJ+8R.LZ'FH8PW2LW5HL.=D.8D2@H".="+B"'T"2bDsHwHxHwFtBm;`.L+J+J+J+J+J+J+J+J'DZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFDD..++FFFFFFFFFFFFFFFFFF++DD\|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9W|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9W̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\tb|cccWWWŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREW|Ÿ̼пŽŒگɛۻϷ˴ȱĭ~|xtug|ZBcN9W|Ÿ̼пŽŒگȱĭ~|xtoje\oP|ZBcN9W|ŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcN9WŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREWqqqdddgggxxx൵ccc```````````````___bbb22W@@@555]]]```````````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```````````````___bbb22W@@@555]]]```````````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```````````````___bbb22W@@@555]]]```````````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```````````````___bbb22W@@@555]]]```````````````___]]]ZZZTTTJJJpppaaa|ZZ""w\\eeeeeeeeeeeeeeeeeeeeeeeeeeebbbZZZLLL@@@555\\\___```{H2pppaaa|ZZ""w\\eeeeeeeeeeeeeeeeeeeeeeeeeeebbbZZZLLL@@@555\\\___```\"2pppaaa|ZZ""w\\eeeeeeeeeeeeeeeeeeeeeeeeeeebbbZZZLLL@@@555\\\___```b8pppaaa|ZZ""w\\eeeeeeeeeeeeeeeeeeeeeeeeeeebbbZZZLLL@@@555\\\___```N5DDHHDD;;55\TX] 8G2F28p=B_R]sWr"@N2BW8Ug'@L8ReDP{F=p8;u8;+;17[m@@;;8@^TX]@G2F28p=B_R]sWr"@N2BW8Ug'@L8ReDP{F=p8;u8;+;0;^q==55}GGaTX]JE2F28p=B_R]sWr"@N2BW8Ug'@L8ReDP{F=p8;u8;+; 3?KKHHDD;;''Y[m@@;;8@^TX]@G2F28p=B_R]sWr"@N2BW8Ug'@L8ReDP{F=p8;u8;+;0;^q==55}GGa^re"kҡ8z~@@@@@@Jm.b`UNJx'LN8BP'BDDYt2L\+5H+5F+8D"5D2LBmDsFvDs@i5W(1A8]He+b]UNJx'LN8BP'BDDYt2L\+5H+5F+8D"5D2LBmDsFvDs@i5W'1?\>@jP]NJx'LN8BP'BDDYt2L\+5H+5F+8D"5D2LBmDsFvDs@i5W'=&-8]He+b]UNJx'LN8BP'BDDYt2L\+5H+5F+8D"5D2LBmDsFvDs@i5W'1?88@@==;;;;@@8@BkFuDsBn=g;`5Y2R2R2U2U+H"N++b..m..o22v++f""N88@@==;;;;@@8@BkFuDsBn=g;`5Y2R2R2U2U+H"N++b..m..o22v++f""N88@@==;;;;@@8@BkFuDsBn=g;`5Y2R2R2U2U+H"N++b..m..o22v++f""N88@@==;;;;@@8@BkFuDsBn=g;`5Y2R2R2U2U+H"N++b..m..o22v++f""N`II;FH8DN5P]2DU.BR.=N5;H.=P';J+2B'=N+5+=.DFuHzJ{J{FvBo;c2R.P.P.P.P.P.P.P.P+HSTX`II;FH8DN5P]2DU.BR.=N5;H.=P';J+2B'=N+5+=.DFuHzJ{J{FvBo;c2R.P.P.P.P.P.P.P.P+HSTX`II;FH8DN5P]2DU.BR.=N5;H.=P';J+2B'=N+5+=.DFuHzJ{J{FvBo;c2R.P.P.P.P.P.P.P.P+H.B&-`II;FH8DN5P]2DU.BR.=N5;H.=P';J+2B'=N+5+=.DFuHzJ{J{FvBo;c2R.P.P.P.P.P.P.P.P+HSTXZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFFbb@@@555FFFFFFFFFFFFFFFFFF++ee..\Ÿ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TçѿŽÎŐϠƗټϸ̶ɲůª|xupkep|||bbbTTTŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xus_|Y@bM:TŸ̼ѿŽÎŐϠɲůª|xupke]oP|Y@bM:TŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bM:TŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITdddgggxxx൵ccc````````````___vZZf@55555\\\````````````___]]]ZZZTTTJJJdddgggxxx൵ccc````````````___vZZf@55555\\\````````````___]]]ZZZTTTJJJdddgggxxx൵ccc````````````___vZZf@55555\\\````````````___]]]ZZZTTTJJJdddgggxxx൵ccc````````````___vZZf@55555\\\````````````___]]]ZZZTTTJJJ___cccYYPP..22vZZcccccccccccccccccccccccccccccc```YYYLLLRRRWWWx+'___cccYYPP..22vZZcccccccccccccccccccccccccccccc```YYYLLLRRRWWWsY"___cccYYPP..22vZZcccccccccccccccccccccccccccccc```YYYLLLRRRWWWҍj8___cccYYPP..22vZZcccccccccccccccccccccccccccccc```YYYLLLRRRWWWmHnDDHHFF;;55\jP]f}Pe~+HT.@L?UlG|eCebeU=U;F.o2wi~FU}CG@N=Yb]U?kgQv{Pe~+HT.@L?UlGxcAzebbU;|T8xD3e6ugYkOOBDDP@Zb`U?piS{|Pe~+HT.@L?UlVWhhiklHHFF==++`wi~FU}CG@N=Yb]U?kgQv{Pe~+HT.@L?UlGxcAzebbU;|T8xD3e6ugYk%dg;tP~f.~nBB@@BB@ZBD2=N+5B"BL;N.@F.=J";F+5=+52RJ{HzHxFt@j5W===YBD2=N+5B"BL;N.@F.=J";F+5=+52RJ{HzHxFt@j5WBD2=N+5B"BL;N.@F.=J";F+5=+52RJ{HzHxFt@j5W.A[\]===YBD2=N+5B"BL;N.@F.=J";F+5=+52RJ{HzHxFt@j5W??DDDDDDBBBBDD8=+=.F.\+2k"'U"JDBD8""B++`..n55x55|55w..j&&J??DDDDDDBBBBDD8=+=.F.\+2k"'U"JDBD8""B++`..n55x55|55w..j&&J??DDDDDDBBBBDD8=+=.F.\+2k"'U"JDBD8""B++`..n55x55|55w..j&&J??DDDDDDBBBBDD8=+=.F.\+2k"'U"JDBD8""B++`..n55x55|55w..j&&J58H"BJ.@P.DF+@N"@J28B';D'2@5;.B.@+=BkJ|J|J|HxDr=e5W5W5W5W5W5W5W5W5W.K58H"BJ.@P.DF+@N"@J28B';D'2@5;.B.@+=BkJ|J|J|HxDr=e5W5W5W5W5W5W5W5W5W.K58H"BJ.@P.DF+@N"@J28B';D'2@5;.B.@+=BkJ|J|J|HxDr=e5W5W5W5W5W5W5W5W5W.L:M[\]58H"BJ.@P.DF+@N"@J28B';D'2@5;.B.@+=BkJ|J|J|HxDr=e5W5W5W5W5W5W5W5W5W.KZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@@@555zFFFFFFFFFFFFFFFFFF++..==''\ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_˺’ŽÏσϠگ٭˜ռϹͶʳƯ«}zupozzz___ð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_ï·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}znPzU=_ï·˼пŽÏσϠگʳƯ«}zupke\nPzU=_ï·ʨσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU=_ð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_qqqdddgggxxx൵ccc`````````___DDpJ""222ZZZ`````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc`````````___DDpJ""222ZZZ`````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc`````````___DDpJ""222ZZZ`````````___]]]ZZZTTTJJJqqqdddgggxxx൵ccc`````````___DDpJ""222ZZZ`````````___]]]ZZZTTTJJJooo___cccfffeee{ZZDD22222222DDvZZbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb___WWWNNN```222\\\iiinnnooo___cccfffeee{ZZDD22222222DDvZZbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb___WWWNNN```222\\\iiinnn'ooo___cccfffeee{ZZDD22222222DDvZZbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb___WWWNNN```222\\\iiinnnooo___cccfffeee{ZZDD22222222DDvZZbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb___WWWNNN```222\\\iiinnn5FFHHDD;;\>@rx^IPT7>BOBFe=uvbZbDLT2@r5@@;;3o3p{Zr[ajIQ==He+|vmUTFP<9EDGQDFwobY_DJN.=g.88?lCt`{QV]IIDDBBJm.|woUTFJB5+=+H><hjbLQQ/2N?AYYFFDD==..ap{Zr[ajIQ==He+|vmUTFP<9EDGQDFwobY_DJN.=g.88?lCt`{QV]=gcc`]4}ZBBDDDP25u";R2F';J5H.@L.;H"=F+5R'+\DrHzHwFvDr=e0>TIQ@N25u";R2F';J5H.@L.;H"=F+5R'+\DrHzHwFvDr=e0>T25u";R2F';J5H.@L.;H"=F+5R'+\DrHzHwFvDr=e+;QIQ@N25u";R2F';J5H.@L.;H"=F+5R'+\DrHzHwFvDr=e0>TBBHHHHHHFFFFFF+8o.@+;''Y'.Z"5.B"+5'="@=2""R++f55w888855w""NBBHHHHHHFFFFFF+8o.@+;''Y'.Z"5.B"+5'="@=2""R++f55w888855w""NBBHHHHHHFFFFFF+8o.@+;''Y'.Z"5.B"+5'="@=2""R++f55w888855w""NBBHHHHHHFFFFFF+8o.@+;''Y'.Z"5.B"+5'="@=2""R++f55w888855w""Neij/GV+@U+=J'@N2BN.8D'8@5B2D2U+8o8=8@FwHxHzFvBn;`8\8\8\8\8\8\8\8\7[eij/GV+@U+=J'@N2BN.8D'8@5B2D2U+8o8=8@FwHxHzFvBn;`8\8\8\8\8\8\8\8\7[eij/GV+@U+=J'@N2BN.8D'8@5B2D2U+8o8=8@FwHxHzFvBn;`8\8\8\8\8\8\8\8\7[9DPeij/GV+@U+=J'@N2BN.8D'8@5B2D2U+8o8=8@FwHxHzFvBn;`8\8\8\8\8\8\8\8\7[Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@555JFFFFFFFFFFFFFFFFFF++\~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[ʬÏÏÏŐŒŒ־ҼйͶʳǯ«}zutttXU[ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[~ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}z~iLtR<[~ɻϾŽÏÏÏŐŒʳǯ«}zupke~\iLtR<[~ȺϾÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtR<[ɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[dddgggxxx൵ccc``````___22{R222ZZZ``````___]]]ZZZTTTJJJdddgggxxx൵ccc``````___22{R222ZZZ``````___]]]ZZZTTTJJJdddgggxxx൵ccc``````___22{R222ZZZ``````___]]]ZZZTTTJJJdddgggxxx൵ccc``````___22{R222ZZZ``````___]]]ZZZTTTJJJ___bbb```____________________________________________________________]]]YYY___```TTT^^^___bbb```____________________________________________________________]]]YYY___```TTT^^^___bbb```____________________________________________________________]]]YYY___```TTT^^^___bbb```____________________________________________________________]]]YYY___```TTT^^^LLDD@@22sootͽ@@FFDDDDBB==5w51C1yio8]88=rCHN==5wUEe^zkTjBB@@@@;;5}5.o."L"BBBB8899ayio8]88=rCHN==5wUEe^zkTj]n~IIBD2F5H8L5F5J2;b;@;@88~'']ADV,Hk5KhCG2F5H8L5F5J2;b;@;@88~'']ADV,Hk5Kh2F5H8L5F5J2;b;@;@88~'']ADV,Hk5KhCG2F5H8L5F5J2;b;@;@88~'']ADV,Hk5KhBBJJJJJJHHHHHH2U.B'8F'5;.='2"5;'8'8".2"'F''W..n55}8855{""NBBJJJJJJHHHHHH2U.B'8F'5;.='2"5;'8'8".2"'F''W..n55}8855{""NBBJJJJJJHHHHHH2U.B'8F'5;.='2"5;'8'8".2"'F''W..n55}8855{""NBBJJJJJJHHHHHH2U.B'8F'5;.='2"5;'8'8".2"'F''W..n55}8855{""NqTcwSW_6FO5J2F'5e@BHHFFDD@@8;';r=k;j8b5U5UDU%A^%A^%A^:J`qTcwSW_6FO5J2F'5e@BHHFFDD@@8;';r=k;j8b5U5UDU%A^%A^%A^:J`qTcwSW_6FO5J2F'5e@BHHFFDD@@8;';r=k;j8b5U5UDU%A^%A^%A^:J`qTcwSW_6FO5J2F'5e@BHHFFDD@@8;';r=k;j8b5U5UDU%A^%A^%A^:J`Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@555WvFFFFFFFFFFFFFFFFFF++\ĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIV»ϾʨΎԾҼϹͶʳƯ°jgkSLVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTVĹͽÎÏÏΎԾҼϹͶʳƯ«}x~j`FkRIVĹͽÎÏÏΎʳƯ«}xupjbzY`FkRIVĿÏÏΎԾҼϹͶʳƯ«}xupjbzY`FkRIVĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTVqqqdddgggxxx൵ccc```___22T222\\\```___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```___22T222\\\```___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```___22T222\\\```___]]]ZZZTTTJJJqqqdddgggxxx൵ccc```___22T222\\\```___]]]ZZZTTTJJJooo___cccsss൵ccc````````````````````````````````````````````````````````````ooo___cccsss൵ccc````````````````````````````````````````````````````````````ooo___cccsss൵ccc````````````````````````````````````````````````````````````ooo___cccsss൵ccc````````````````````````````````````````````````````````````UVBB==??mKKDDFFDD@@88!O1`zmwvxdz4}ZBB@@==;;.m.#B#OO@@;;GGe`zmwvxdzOOJE5H8Z.=vDFHHDD@@55}""T@G5H8Z.=vDFHHDD@@55}""T 8G5H8Z.=vDFHHDD@@55}""T@G5H8Z.=vDFHHDD@@55}""TDDFFJJHHHHHH@B2D+="5B"2;"+=";D'=2@+5B'5"."+""@F++`22s55z..j''WDDFFJJHHHHHH@B2D+="5B"2;"+=";D'=2@+5B'5"."+""@F++`22s55z..j''WDDFFJJHHHHHH@B2D+="5B"2;"+=";D'=2@+5B'5"."+""@F++`22s55z..j''WDDFFJJHHHHHH@B2D+="5B"2;"+=";D'=2@+5B'5"."+""@F++`22s55z..j''W]rLT`+=+;;HHHHFFBB;;22v++g''\"N@5+e54o7]rLT`+=+;;HHHHFFBB;;22v++g''\"N@5+e51o4]rLT`+=+;;HHHHFFBB;;22v++g''\"N@5+e5.p2BkB]rLT`+=+;;HHHHFFBB;;22v++g''\"N@5+e51o4Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFF++\ȻϾŽŽŽտԽѻϸͶɲů|xtni`sTYFaȻϾŽŽŽտԽѻϸͶɲů|xtni`sTYFaſʶȴƲïż¼}zYIaȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]UaȻϾŽŽŽտԽѻϸͶɲů|sTYFaȻϾŽŽŽɲů|xtni`sTYFaʬŽŽտԽѻϸͶɲů|xtni`sTYFaȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]Uadddgggxxx൵ccc___22FF''U222]]]___]]]ZZZTTTJJJdddgggxxx൵ccc___22FF''U222]]]___]]]ZZZTTTJJJdddgggxxx൵ccc___22FF''U222]]]___]]]ZZZTTTJJJdddgggxxx൵ccc___22FF''U222]]]___]]]ZZZTTTJJJdddgggxxx൵ccc`````````````````````````````````````````````````````````dddgggxxx൵ccc`````````````````````````````````````````````````````````dddgggxxx൵ccc`````````````````````````````````````````````````````````dddgggxxx൵ccc`````````````````````````````````````````````````````````qLU===RBBBB;;"cW8N#].~n@@==88'Y.##hrJPDJTX]VfDDHHHHDD@@55}""TTX]UcDDHHHHDD@@55}""TTX]EEDDHHHHDD@@55}""TTX]UcDDHHHHDD@@55}""TppHHHHDD@@;;;;'5e@H5@+8F"=D'@B"5F+8F".='.='5'.8'2"'".@""U..m55|55{++gppHHHHDD@@;;;;'5e@H5@+8F"=D'@B"5F+8F".='.='5'.8'2"'".@""U..m55|55{++gppHHHHDD@@;;;;'5e@H5@+8F"=D'@B"5F+8F".='.='5'.8'2"'".@""U..m55|55{++gppHHHHDD@@;;;;'5e@H5@+8F"=D'@B"5F+8F".='.='5'.8'2"'".@""U..m55|55{++gLYi8FWnnsCCZ'F"B;;HHHHFFBB;;22r++`""PIiMazaLYi8FWnnsCCZ'F"B;;HHHHFFBB;;22r++`""PIiMb|bLYi8FWnnsCCZ'F"B;;HHHHFFBB;;22r++`""PIiM\{\LYi8FWnnsCCZ'F"B;;HHHHFFBB;;22r++`""PIiMb|bZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFF++\·ʻϾԾҼѺθ˴ȱĭ~{vrme~\eKo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\eKoźeOo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gTo·ʻϾԾҼѺθ˴ȱĭ~neKo·ʻϾȱĭ~{vrme~\eKo½’ԾҼѺθ˴ȱĭ~{vrme~\eKo·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gToqqqdddgggxxx൵___22++RRW555]]]]]]ZZZTTTJJJqqqdddgggxxx൵___22++RRW555]]]]]]ZZZTTTJJJqqqdddgggxxx൵___22++RRW555]]]]]]ZZZTTTJJJqqqdddgggxxx൵___22++RRW555]]]]]]ZZZTTTJJJqqqdddgggxxx൵ccc``````````````````````````````````````````````````````qqqdddgggxxx൵ccc``````````````````````````````````````````````````````qqqdddgggxxx൵ccc``````````````````````````````````````````````````````qqqdddgggxxx൵ccc``````````````````````````````````````````````````````p|TjCRd@awf8c;YfoTs@Y%,`f8z~5T.sTFZ#0xoz_wQV]\rDDHHHHFFBB88''Y^w<K.;D'@D5DN5@F;Tc5P].DN2;U+@P'=H2FH+.;5='.%,0RSTDDDD@@22vVV^HHJJFF88CCZ3>K.;D'@D5DN5@F;Tc5P].DN2;U+@P'=H2FH+.;5='.%,0RSTDDDD@@22vVV^HHJJFF88CCZ3>K.;D'@D5DN5@F;Tc5P].DN2;U+@P'=H2FH+.;5='.%,0RSTDDDD@@22vVV^HHJJFF88CCZ3>K.;D'@D5DN5@F;Tc5P].DN2;U+@P'=H2FH+.;5='.%,0RSTDDDD@@22vVV^O[hDWk]wPf~LYHHHHHHHHJJJJJJJJHHFFJJHHDD88DDnO[hDWk]wPf~LYHHHHHHHHJJJJJJJJHHFFJJHHDD88DDnO[hDWk]wPf~LYHHHHHHHHJJJJJJJJHHFFJJHHDD88DDnO[hDWk]wPf~LYHHHHHHHHJJJJJJJJHHFFJJHHDD88DDnZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5JJJJJJJJJJJJJJJJJJTT22@@@555JJJJJJJJJJJJJJJJJJBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++ĵɷ˸̸̸˶ʵȲƯí~{vrmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmc{^ĵɷ˽ïƽϏƾörmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmgvĵɷ˸̸̸˶ʵȲƯí~|cĵɷ˸̸ÿ{vrmc{^»̸˶ʵȲƯí~{vrmc{^ĵɷ˸̸̸˶ʵȲƯí~{vrmgvdddccc```eee..""텅|""FFF;;;BBBJJJdddccc```eee..""텅|""FFF;;;BBBJJJdddccc```eee..""텅|""FFF;;;BBBJJJdddccc```eee..""텅|""FFF;;;BBBJJJdddgggxxx൵ccc`````````````````````````````````````````````+++...@@@dddgggxxx൵ccc`````````````````````````````````````````````+++...@@@dddgggxxx൵ccc`````````````````````````````````````````````+++...@@@dddgggxxx൵ccc`````````````````````````````````````````````+++...@@@gFSbuVg{dj'j_Tt=gg"kbY{F_xmtim|LTBB@@55}++`qo|m@@DDFFBB@@BB@@tt~PYBBDDHHHHHHBBBBBB@@BBIIqo|m@@DDFFBB@@BB@@~~HHJJDD88~'@L.DT2@T=PeBNb8BT2HP8L`8;Z.@L+DN".=.='.=@GffDDDD@@22s~~HHJJDD88~'@L.DT2@T=PeBNb8BT2HP8L`8;Z.@L+DN".=.='.=@GffDDDD@@22s~~HHJJDD88~'@L.DT2@T=PeBNb8BT2HP8L`8;Z.@L+DN".=.='.=@GffDDDD@@22s~~HHJJDD88~'@L.DT2@T=PeBNb8BT2HP8L`8;Z.@L+DN".=.='.=@GffDDDD@@22sPbvTiZrltZZFFHHHHHHHHHHDDBBBB??bb|PbvTiZrltZZFFHHHHHHHHHHDDBBBB??bb|PbvTiZrltZZFFHHHHHHHHHHDDBBBB??bb|PbvTiZrltZZFFHHHHHHHHHHDDBBBB??bb|Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5RRRRRRRRRRRRRRRRRR䂂++++++++++++++++88@@@555""''""""""""''''RRRRRRRRRRRRRRRRRRBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++~²ŲŲŲį­~|zupjp~²ŲŲŲį­~|zupjp~²ŲŲŲį­~|zupjp²ŲŲŲį­~|zupn~²ŲŲŲį­~v~²ŲupjpżŲį­~|zupjp²ŲŲŲį­~|zupnqqq___bbbfffPPTTJJj@@JJJ@@@:::qqq___bbbfffPPTTJJj@@JJJ@@@:::qqq___bbbfffPPTTJJj@@JJJ@@@:::qqq___bbbfffPPTTJJj@@JJJ@@@:::qqqdddgggxxx൵ccc``````````````````````````````````````````888888***GGGqqqdddgggxxx൵ccc``````````````````````````````````````````888888***GGGqqqdddgggxxx൵ccc``````````````````````````````````````````888888***GGGqqqdddgggxxx൵ccc``````````````````````````````````````````888888***GGGrcc\~%Nf%de`TsJV`k{DD@@77}nWWFFDDBBAAVVYYLLFFDDDDGGddnWWFFDDBBAAVVFFHHBB55x.=D+;@8JT.=H;N`5FU+P`BWj.DR+DL+@B';H"55"2=MNQHHFF@@22rFFHHBB55x.=D+;@8JT.=H;N`5FU+P`BWj.DR+DL+@B';H"55"2=MNQHHFF@@22rFFHHBB55x.=D+;@8JT.=H;N`5FU+P`BWj.DR+DL+@B';H"55"2=MNQHHFF@@22rFFHHBB55x.=D+;@8JT.=H;N`5FU+P`BWj.DR+DL+@B';H"55"2=MNQHHFF@@22rOax[dpppOax[dpppOax[dpppOax[dpppZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5JJJJJJJJJJJJJJJJJJ++..@@@555JJJJJJJJJJJJJJJJJJBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++|zzzwupmm|zzzwupmm|zzzwupmmzwx|zz|mmupmmzwx___cccYY\HHJJJ???___cccYY\HHJJJ???___cccYY\HHJJJ???___cccYY\HHJJJ???dddgggxxx൵ccc```````````````````````````````````````NNNHHH888666dddgggxxx൵ccc```````````````````````````````````````NNNHHH888666dddgggxxx൵ccc```````````````````````````````````````NNNHHH888666dddgggxxx൵ccc```````````````````````````````````````NNNHHH888666Fdz^rggOOHHBB77x5BN5=P=;T;Lg8@U.5J=Pe5HY'@J8HT"DF'8H'5B'5NOQJJHHBB==uOOHHBB77x5BN5=P=;T;Lg8@U.5J=Pe5HY'@J8HT"DF'8H'5B'5NOQJJHHBB==uOOHHBB77x5BN5=P=;T;Lg8@U.5J=Pe5HY'@J8HT"DF'8H'5B'5NOQJJHHBB==uOOHHBB77x5BN5=P=;T;Lg8@U.5J=Pe5HY'@J8HT"DF'8H'5B'5NOQJJHHBB==uZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5HHHHHHHHHHHHHHHHHH..@@@555HHHHHHHHHHHHHHHHHHBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++ooo___ccc""NNNCCCooo___ccc""NNNCCCooo___ccc""NNNCCCooo___ccc""NNNCCCqqqdddgggxxx൵ccc````````````````````````````````````ZZZRRRDDD...qqqdddgggxxx൵ccc````````````````````````````````````ZZZRRRDDD...qqqdddgggxxx൵ccc````````````````````````````````````ZZZRRRDDD...qqqdddgggxxx൵ccc````````````````````````````````````ZZZRRRDDD...ZZHHDD==vCHU:AM;BP2=F=J\+@P8@RDRc2BR+=N+HT";B8=,7@OOHHBBHHpZZHHDD==vCHU:AM;BP2=F=J\+@P8@RDRc2BR+=N+HT";B8=,7@OOHHBBHHpZZHHDD==vCHU:AM;BP2=F=J\+@P8@RDRc2BR+=N+HT";B8=,7@OOHHBBHHpZZHHDD==vCHU:AM;BP2=F=J\+@P8@RDRc2BR+=N+HT";B8=,7@OOHHBBHHpZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5FFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFFBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++___|ZZYHHEEE___|ZZYHHEEE___|ZZYHHEEE___|ZZYHHEEEdddgggxxx௯ffffffffffffffffffffffffffffffffffff___WWWJJJ222dddgggxxx௯ffffffffffffffffffffffffffffffffffff___WWWJJJ222dddgggxxx௯ffffffffffffffffffffffffffffffffffff___WWWJJJ222dddgggxxx௯ffffffffffffffffffffffffffffffffffff___WWWJJJ222HHDDFHouxy8BL2FT5Y`+FY=FZ5DY2;H'DF'2H+8@..=HHBBWWqHHDDFHouxy8BL2FT5Y`+FY=FZ5DY2;H'DF'2H+8@..=HHBBWWqHHDDFHouxy8BL2FT5Y`+FY=FZ5DY2;H'DF'2H+8@..=HHBBWWqHHDDFHouxy8BL2FT5Y`+FY=FZ5DY2;H'DF'2H+8@..=HHBBWWqZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5BBBBBBBBBBBBBBBBBB..@@@555==BBBBBBBBBBBBBBBBBBBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++pppaaat__8822\NNGGGpppaaat__8822\NNGGGpppaaat__8822\NNGGGpppaaat__8822\NNGGGqqqdddgggwwwffffffffffffffffffffffffffffffffffffbbbZZZLLL???qqqdddgggwwwffffffffffffffffffffffffffffffffffffbbbZZZLLL???qqqdddgggwwwffffffffffffffffffffffffffffffffffffbbbZZZLLL???qqqdddgggwwwffffffffffffffffffffffffffffffffffffbbbZZZLLL???]kPe};J\@Rf\_e;9@.CM'8J+FY8J\.8N2;U8@J.AD6BD]rN\;Bu]kPe};J\@Rf\_e;9@.CM'8J+FY8J\.8N2;U8@J.AD6BD]rN\;Bu]kPe};J\@Rf\_e;9@.CM'8J+FY8J\.8N2;U8@J.AD6BD]rN\;Bu]kPe};J\@Rf\_e;9@.CM'8J+FY8J\.8N2;U8@J.AD6BD]rN\;BuZm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5LLL@@@555bbbeeeccc___YYYKKKbbbeeeccc___YYYKKKbbbeeeccc___YYYKKKbbbeeeccc___YYYKKKbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYJJJbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYJJJbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYJJJbbbfffeeecccccccccccccccccccccccccccccccccccc```YYYJJJYoRg5DU2BR9EU`II8FJ+BT'8HFL'HT52;C**iWoNc|5DU@ITYoRg5DU2BR9EU`II8FJ+BT'8HFL'HT52;C**iWoNc|5DU@ITYoRg5DU2BR9EU`II;FJ+BT'8HFL'HT52;C**iWoNc|5DU@ITYoRg5DU2BR9EU`II8FJ+BT'8HFL'HT52;C**iWoNc|5DU@ITZm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5BBB888AAAoooaaa]]]YYYTTToooaaa]]]YYYTTToooaaa]]]YYYTTToooaaa]]]YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTToooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTT]v]uFYn=NbFVjHYlKQUexfUkUkJ]t2@P]v]uFYn=NbFVjHYlKQUexfUkUkJ]t2@P]v]uFYn=NbFVjHYlKQUexfUkUkJ]t2@P]v]uFYn=NbFVjHYlKQUexfUkUkJ]t2@PZm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5TTT\\\BBBJJJO\nFXmEUhFYnFVhk_wg~f^pJ\pJ_vDUj5BRO\nFXmEUhFYnFVhk_wg~f^pJ\pJ_vDUj5BRO\nFXmEUhFYnFVhk_wg~f^pJ\pJ_vDUj5BRO\nFXmEUhFYnFVhk_wg~f^pJ\pJ_vDUj5BRZm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5]]]by^rRg\oQatHQ[FZoYhzK[nK\pby^rRg\oQatHQ[FZoYhzK[nK\pby^rRg\oQatHQ[FZoYhzK[nK\pby^rRg\oQatHQ[FZoYhzK[nK\pZm`t`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`u`u`u`u`u`u`u`u`u`u`uJZ+5rjnrjnrjnrjnWjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=JBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeejjjUUUDDD==============================;;;NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUUUDDD==============================;;;NNNjjjjjjUUUDDD==============================;;;NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUUUDDD==============================;;;NNNjjjjjjUUUDDD==============================;;;NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUUUDDD==============================;;;NNNjjjjjjUUUDDD==============================;;;NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUUUDDD==============================;;;NNNjjjNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNNNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNNNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNNNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNN|||cccccccccccccccccc```___ZZZYYYUUUTTTRRRPPPNNNNNNNNNNNNNNNNNNNNNPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPNNNNNNNNNвލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFU|||ccccccccccccccccccccccccccccccccccccccccccbbbbbb`````````_________________________________________________________``````bbbbbbccccccccccccYYY|ckcpctcfcccccccccccccxcccrceccccccccccccbbbbbbbbbbbbbbb`}`__]\\Z{YzYpW\WYoYcYnWsTrTfRT_RRRUUUWWWUUUUUUUUURRR|||cccccccccccccccccccccccccccccccccccccccccccccccccccbbbbbbbbbbbbbbb``````______]]]\\\\\\ZZZYYYYYYWWWWWWYYYYYYWWWTTTTTTRRRRRRUUUWWWUUUUUUUUURRRѾͺ̹ȶų@@ooTTbb""==22""""++@@ooTTbb""==22""``ttLL''..++@@ooTTbb""==22""``ttLL''..++@@ooTTbb""==22""``ttLL''..++@@ooTTbb""==22""``ttLL''..++222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppggg222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppggg___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNN___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNN___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNN___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNN~~~tttggg```YYYPPPNNNNNNNNNNNNNNNNNNNNNPPPTTTTTTZZZZZZ\\\_______________________________________]]]ZZZUUUPPPNNNNNNNNNNNNޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡʫtggggggggggggggggggggggggggggggggggggggggggggtނ."""""""""""""""""""""""""""""""""""""""""""".ރF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻F~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cccޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠßؓؓٓȓ̓Ǔ䄪{vuoor|sojc}]p]bkbefgkkmppknogjjjmW]{{{vvvuuuoooooorrrsssooojjjccc]]]]]]bbbgggmmmkkkgggjjjWWWޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘۖ֓ՒЏ͌ɊŇ}|xussonnopswbbzzWW..wwHHzz==LLLL''++{~bbzzWW..wwHHYYWW22DD]]''++{~bbzzWW..wwHHYYWW22DD]]''++{~bbzzWW..wwHHYYWW22DD]]''++{~bbzzWW..wwHHYYWW22DD]]''++{~222NNNtttggg222NNNtttgggcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;cccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;cccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;cccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;NNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNmmm]]]RRRNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRWWWYYY______cccffffffffffffffffffffffffffffffffffff```ZZZRRRNNNNNNNNNNNNNNNNNNޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘʫggނ""ރF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻F~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cccޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘf=;snsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnf=;յީħȧŨĩéĩũŦååä⢜ϒ}}|vpkfggjooornuU`}}}}}}|||vvvpppkkkfffggggggjjjooooooooorrrnnnUUUޘUFFFFFFFFFFFFFFFFFFFFFDDBB@==;;;88552222222=t..'';;ZZWW""BBDD܍RRZZRR""""==....'';;ZZWW""BBDD|JJee..""''@@HH..""..'';;ZZWW""BBDD|JJee..""''@@HH..""..'';;ZZWW""BBDD|JJee..""''@@HH..""..'';;ZZWW""BBDD|JJee..""''@@HH..""222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttggg222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttggggggooorrrmmmrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrooofffYYY===gggooorrrmmmrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrooofffYYY===gggooorrrmmmrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrooofffYYY===gggooorrrmmmrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrooofffYYY===PPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBdzeeeRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPRRRYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYUUUNNNNNNNNNNNNNNNNNNNNNNNNNNNޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘʫgޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡgނ"tggggggggggggggggggggggggggggggggggggggggt"ރF޻ނ."""""""""""""""""""""""""""""""""""""""".ރ޻FdzuuuooommmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmtttcccޘFFޘsn޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻ƒsnԳʳ˳ͳγϳѳҮ٧֧שڲݳٳڳ۲ܫڪטҐ}umjijjjrrpsinUY|dz}}}uuummmjjjiiijjjjjjjjjrrrrrrpppsssiiiUUUޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻ݺ׶ִұѰʪä5t==zzBB@@jjLLڗttee55JJ====܄""88HH..FF==zzBB@@jjLLDDBBee55~~;;..2288''@@TT__RR55==zzBB@@jjLLDDBBee55~~;;....88''@@TT__RR55==zzBB@@jjLLDDBBee55~~;;..22;;''BBTT``RR55==zzBB@@jjLLDDBBee55~~;;++..88''@@TT__RR55222NNNeeeppppppppppppooobbbHHH======888222222BBBZZZkkkppppppppptttggg222NNNeeeppppppppppppooobbbHHH======888222222BBBZZZkkkppppppppptttggggggooorrrfffiiioooooooooooooooooooooooojjj\\\UUUjjjjjjjjjfffZZbPP`FFf@@e@@cBB`JJZTT\___gggjjjjjjjjjrrruuuooooooooooooooooooooooooooorrrfffYYY===gggooorrrfffiiioooooooooooooooooooooooojjj\\\UUUjjjjjjjjjfffZZbPP`FFf@@e@@cBB`JJZTT\___gggjjjjjjjjjrrruuuooooooooooooooooooooooooooorrrfffYYY===gggooorrrfffiiioooooooooooooooooooooooojjj\\\UUUjjjjjjjjjfffZZbPP`FFf@@e@@cBB`JJZTT\___gggjjjjjjjjjrrruuuooooooooooooooooooooooooooorrrfffYYY===gggooorrrfffiiioooooooooooooooooooooooojjj\\\UUUjjjjjjjjjfffZZkPPpFF|@@{@@zBBwJJjTTf___gggjjjjjjjjjrrruuuooooooooooooooooooooooooooorrrfffYYY===YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555dz{{{FFF=========DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDD============DDDNNNNNNNNNNNNNNNNNNޘF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻FޘʫgޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘgނ"gg"ރF޻ނ""ރ޻Fdzttt___RRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPUUUnnn}}}cccޘFFޘsn޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻snڳѳͳγϳѳҮҟѐ͐Ҝ٧ܲݳݳ߲߯xrszvjjibjjkpmksjmmUUUdzvvvjjjjjjiiibbbjjjjjjkkkpppmmmkkksssjjjUUUޘF޻ލރރރރރރރރރރރރރރރރރރ܁}{xurnmmgb___\__`_c5s""22TTBBBBbb랞RRoo@@++JJ'';;""""FF..\\JJ++LL''""22++""BBnn``""..LLwwttBB88LL''""22++""BBnn``""..LLwwttBB88LL''""22++""BBnn``""..LLwwttBB88LL''""22++""BBnn``""..LLwwttBB88LL''222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttggg222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttggggggooorrrfffYYY___gggggggggggggggggggggccc___jjjffgRRk22~""i@@UZZ]iiijjjjjjgggggggggggggggggggggjjjooorrrfffYYY===gggooorrrfffYYY___gggggggggggggggggggggccc___jjjffgRRk22~""i@@UZZ]iiijjjjjjgggggggggggggggggggggjjjooorrrfffYYY===gggooorrrfffYYY___gggggggggggggggggggggccc___jjjffgRRk22~""i@@UZZ]iiijjjjjjgggggggggggggggggggggjjjooorrrfffYYY===gggooorrrfffYYY___gggggggggggggggggggggccc___jjjffjRR|22""@@iZZ`iiijjjjjjgggggggggggggggggggggjjjooorrrfffYYY===```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...dzrrr555222222222222'''555NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN===555222222222222'''555NNNNNNNNNNNNNNNޘF޻ނ."""""""""""""""""""""""""""""""""""".ރ޻FޘʫgޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘgނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރF޻ނ"tggggggggggggggggggggggggggggggggggggt"ރ޻FdzxxxmmmTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWWWeee}}}cccޘFŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻFޘsn޻ނ."""""""""""""""""""""""""""""""""""".ރ޻sn߳׳ϳϳѳүѠʂWkƈ՜ާ۲߲v`YU`it}iggbbjjgjjrtgmUUUdz}}}iiiggggggbbbbbbjjjjjjgggjjjjjjrrrtttgggUUUޘF޻ނ.""""""""""""""""""""\5s""''++++..""8855}}}}++''FFcc""""FFkkxx]]==\\..}~{~``]]FFcc""""FFkkxx]]==\\..}}{~__\\FFcc""""FFkkxx]]==\\..}{``]]FFcc""""FFkkxx]]==\\..~}~{~__]]FFcc""222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttggg222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttggggggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjffiDDx''..55..22YWWYiiijjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjffiDDx''..55..22YWWYiiijjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjffiDDx''..55..22YWWYiiijjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjffkDD''..55..22uWW]iiijjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz@@@BBB@@@@@@@@@===888'''DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHH@@@BBB@@@@@@@@@===888'''DDDNNNNNNNNNNNNޘF޻ނ""ރ޻FޘʫgޘF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻Fޘgނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރF޻ނ"gg"ރ޻Fdznnn]]]8;8+2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++.+BBBNNNNNNPPPTTTnnncccGLQQGGޘFŻ޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲ŻFޘsn޻ނ"޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲"ރ޻snܳѳϳѳҲԡe;oNNkʈכԦڭvPNNNN]p|}ukjkccbibgmrvrkzWWbdz}}}uuukkkjjjkkkccccccbbbiiibbbgggmmmrrrvvvrrrkkkWWWޘF޻ނ"}|xwuws}\2s;;}uu""}}ҔkkNN55DD@@;;++vvjjBB88@@;;}22\\;;;;YY..88++{uvz}}}55++ggiiBB88@@;;}22\\;;;;YY..88++{vvz}||55++ggjjBB88@@;;}22\\;;;;YY..88++|vvz}~55++ggjjBB88@@;;}22\\;;;;YY..88++{uvz}||55++ggjjBB88@@222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttggg222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttggggggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjPPv''55JJJJJJJJ55''..LLZZ5588T```jjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjPPv''55JJJJJJJJ55''..LLZZ5588T```jjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjPPv''55JJJJJJJJ55''..LLZZ5588T```jjjjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjPP''55JJJJJJJJ55''..LLZZ5588k```jjjjjjjjjjjjjjjjjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzFFFJJJU\cT_j]rWcn===222===NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFJJJU\cT_j]rWcn===222===NNNNNNNNNNNNޘF޻ނ"tggggggggggggggggggggggggggggggggt"ރ޻FޘʫgޘF޻ނ."""""""""""""""""""""""""""""""".ރ޻Fޘgނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻FdzuuuWWWeeeDHDBHB@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@@F@;B;+.+NNNNNNUUUNNNmmmccc;@D.B2F2D$1D;;BFD1ޘFŻޫtggggggggggggggggggggggggggggggggtޫŻFޘsn޻ނ"ޫtggggggggggggggggggggggggggggggggtޫ"ރ޻snٳѳѳҳԦrL|8g;NNkψҘՠۧYTNHFLNPgorjjgffcccboutxwnWZ~dzvvvrrrjjjjjjgggffffffcccccccccbbbooouuutttxxxwwwnnnWWWޘF޻ނ"tggggggggggggggge`_]ZWUTPNLJHHDFFNw]5s;;;;uuHHYYbbTT}}ZZ__22""55LL..첲uuHH++LL;;;;uuHH++BB==BBWWBBTTPPLL~{zxvuxUUHH++LL;;;;uuHH++BB==DDZZDDTTLLHHzxxvuuxWWHH++LL;;;;uuHH++BB==DDZZBBUUPPNN""~{xzwvzWWHH++LL;;;;uuHH++BB==BBTT;;LLHHHH{zxvuuzWWHH++LL222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttggg222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttggggggooorrrfffYYY===jjjjjjjjjjjjjjjggk55''TTeetjjjjjjjjjjjjjjjjjjjjjjjjeexTT''ZZzz22eUUYjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjggk55''TTeetjjjjjjjjjjjjjjjjjjjjjjjjeexTT''ZZzz22eUUYjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjggk55''TTeetjjjjjjjjjjjjjjjjjjjjjjjjeexTT''ZZzz22eUUYjjjjjjjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjjjjggo55''TTeexjjjjjjjjjjjjjjjjjjjjjjjjee}TT''ZZzz22UU\jjjjjjjjjjjjjjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urfz@@@222===NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFNNNes`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gg"ރ޻FޘʫgޘF޻ނ""ރ޻Fޘgނ"gޘF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻Fޘg"ރF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttccc}}}5s2F2F5H8J5H2F2D,?*9#0sFFHJHFD?90ޘFŻޫggޫŻFޘsn޻ނ"ޫggޫ"ރ޻snڳ׳ԯ{_YL8z;NNkֈ՘۟RPLF=5NPZcic_ZY\\\bcnruzzn}WWWdzvvvmmmiiiccc___ZZZYYY\\\\\\\\\bbbcccnnnrrruuuzzzzzznnnWWWޘF޻ނ"gλ̺ŴDs_5tLLLLooss88ccLLbb==""8888oo88JJpp쯯ȁJJ""PPLLLLooss88~;;ZZ..55PPggUU~}|xwux}""PPLLLLooss88~BBii2222@@PPFFxx}}zuusw|""PPLLLLooss88~BBii55;;WWkkWW|xwvz}""PPLLLLooss88~88NNo""p''@@__RR}|zvtsx}""PP222NNNeeepppcccgggmmmrrrppppppppppppppppppppppppjjj]]]HHH222eeetttggg222NNNeeepppcccgggmmmrrrppppppppppppppppppppppppjjj]]]HHH222eeetttggggggooorrrfffYYY===jjjjjjjjjjjjbbo""'']]~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj]]++}}oosNNWiiijjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjbbo""'']]~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj]]++}}oosNNWiiijjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjbbo""'']]~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj]]++}}oosNNWiiijjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjjjjbbw""'']]jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj]]++}}ooNN`iiijjjjjjjjjgggooorrrfffYYY===ccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urfz@@@222'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''+++FFFNNNes`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻FޘʫgޘF޻ނ"tggggggggggggggggggggggggggggt"ރ޻Fޘgނ"gޘF޻ނ."""""""""""""""""""""""""""".ރ޻Fޘg"ރF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccmmmvvvxxxxxx~~~jjjRXRl#!EFHF2R;R@5b2D.B.@+='8+=.A,>):*!!22;;bDB@=8=A>:*ޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡgޫŻFޘsn޻ނ"ޫggޫ"ރ޻sn݇ge_YL8;NNkTNHB88NNT]b]WPNTY\_`kov~ruuYYYdz{{{pppfffbbb]]]WWWPPPNNNTTTYYY___bbbgggpppssszzz~~~rrrYYYޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘۗՑ΍ʋ…|tsong`\\]gFv_5vccgg]]NJѐ‚''DDNN88FF..BBYYLL55""..++@@ccggYYjj\\~vicgfm''w==x==rou""~55xtttsu}}@@ccggYYjj\\~++v\NJP`n""{55wrttsu}}@@ccggYYjj\\~++;;WWNN++;;}uvwtu}}@@ccggYYjj\\~|fPDF_++r55sx|''88vtttsu}}@@222NNNeeepppccckkkwwwpppppppppppppppppppppppppppooocccRRR222```tttggg222NNNeeepppccckkkwwwpppppppppppppppppppppppppppooocccRRR222```tttggggggooorrrfffYYY===jjjjjjjjjbbrJJjjjjjjjjjjjjjjjccfWWbHHeBBe@@cDD]NNY\\]fffjjjjjjjjjjjjJJbbߎzNNWjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjbbrJJjjjjjjjjjjjjjjjccfWWbHHeBBe@@cDD]NNY\\]fffjjjjjjjjjjjjJJbbߎzNNWjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjbbrJJjjjjjjjjjjjjjjjcciWWnHHxBB{@@zDDrNNf\\bfffjjjjjjjjjjjjJJbbߎzNNWjjjjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjjjjbbzJJjjjjjjjjjjjjjjjccfWWbHHeBBe@@cDD]NNY\\]fffjjjjjjjjjjjjJJbbNN`jjjjjjjjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNYckT`mZnWcn@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;===NNNYckT`mZnWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻FޘʫgޘF޻ނ"gg"ރ޻Fޘgނ"gޘF޻ނ""ރ޻Fޘg"ރF޻ނ"gޘF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻Fޘg"ރ޻FdzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}ccc777YYYTTTJJJfffsss B DFJNRUWU^FJLz.TF@;5~.k'D+;.@.B.B5H2F-@(9*zz..~kD;@BBHF@9*ޘFŻޫgޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘgޫŻFޘsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻snκ酫fge_YL8;NNkiULF@2BNNU``WNNNPTUUU]`rtwwYYYdz~~~ssspppiii```WWWNNNNNNNNNTTTYYYbbbcccjjjrrrvvvuuuYYYޘF޻ނ"gޘUFFFFFFFFFFFDB@==;5522.++++8fH}e8{..nnFFBBᦦƁυNN..@@BB;;RR88~~⥥\\敕gg""BB''..nnFFeeJJ88DD""@@''~fRFBDDDHHFHP""i88u88nrwuux}~|..nnFFeeJJ88DD""@@''Y8."L'H.8@@Jj;;uBBz;;mputtx}~|..nnFFeeJJ88DD""@@''""++|==TTRRDDttxvuz}~|..nnFFeeJJ88DD""@@''uHD+"L"D25@BTco..NN|HH{==noutux}~|222NNNeeepppfffpppppppppppppppppppppppppppppppppfffWWW888___tttggg222NNNeeepppfffpppppppppppppppppppppppppppppppppfffWWW888___tttggggggooorrrfffYYY===jjjjjjggn''ZZxjjjjjjjjjjjjUUm22""gDDU```jjjjjjjjjZZRRיsUUYjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjggn''ZZxjjjjjjjjjjjjUUm22""gDDU```jjjjjjjjjZZRRיsUUYjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjggn''ZZxjjjjjjjjjjjjUU}22""DDj```jjjjjjjjjZZRRיsUUYjjjjjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjjggp''ZZjjjjjjjjjjjjUUm22""gDDU```jjjjjjjjjZZRR虙UU\jjjjjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNHHHFFFFFFDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘgނ"gޘF޻ނ"tggggggggggggggggggggggggt"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ."""""""""""""""""""""""".ރ޻Fޘg"ރ޻FdznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc2D2F3G5D->RTUOOOEEE~~~ukFHHJFDD>6!_Z]_+;#5DHJL8ZB`NFDBBDB=5.|2m;x2D.B+;"2_ZZ;D##88BB|mxDB;2ޘFŻޫgޘFFޘgޫŻFޘsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻snۺ公fge_WJ8;NNkUTJD;.HNPZ_]NNNNNNNNNNTi{zpttWWWdzwwwtttnnnggg]]]NNNNNNNNNNNNUUU\\\bbbgggkkkssszzzwwwZZZޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻ݺִϯ̬£}trrs}.gJf8{""텅;;88WW....LL坝˂ZZWW""""LLnnWW__x""..;;RR``''""__NN""\"+."."."."."."."."."+5@BTbgw55vv|++}x""..;;RR``''""__NN""{tW"L55}88~22t''\'B@@J_""cegw55vw}..}x""..;;RR``''""__NN""{x}~xopnmnk''g++fgk};;vu|++}x""..;;RR``''""__NN""D2s;;88..k""N.8@DR]e""f''bfgw55vw~""..}x222NNNeeepppiiiwwwppppppppppppppppppppppppppppppfffYYY===bbbtttggg222NNNeeepppiiiwwwppppppppppppppppppppppppppppppfffYYY===bbbtttggggggooorrrfffYYY===jjjjjj55bbtjjjjjjjjj]]o++++8888nHHTfffjjjjjjbbRR׎e```jjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjj55bbtjjjjjjjjj]]o++++8888nHHTfffjjjjjjbbRR׎e```jjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjj55bbtjjjjjjjjj]]z++++8888HHbfffjjjjjjbbRR׎e```jjjgggooorrrfffYYY===gggooorrrfffYYY===jjjjjj55bb|jjjjjjjjj]]o++++8888nHHTfffjjjjjjbbRR莎```jjjgggooorrrfffYYY===ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ލރރރރރރރރރރރރރރރރރރރރރރލ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻Fޘgނ"gޘF޻ނ"gg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻FdzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmccclh>fe=2F5F5H8J5H2F2D,?+;#0!LLLYYYNNN&&&KKK""DD22wTDB@;8BDHPfwiT%;z.@2D1C)9FHJHHFFDFFFD@;8HD=5'f2z%%@DC9f2ޘFŻޫgޘFFޘgޫŻFޘsn޻ނ"ޫgsn޻ލރރރރރރރރރރރރރރރރރރރރރރލ޻sngޫ"ރ޻snۺݳfgc]TH@;NN`PPH@8.NNRYWNNNNNNNNNNNUfu{svvYYYdzxxxsssiiiZZZNNNNNNNNNNNNNNNZZZbbbeeesssxxx{{{ZZZޘF޻ނ"gޘF޻ލރރރރރރރރہ}xvpkcb\WPNNNWz.jLi8}zLLNNJJHH==""==NN==LL..==++FFZZ;;@@ێggz..JJFF22''__g@R5W5W2T2T.P.N+J+H+F'D'@5''@BUcp++ouDDWW;;z..JJFF22''__eeWW..m=8==;;55{++g""P'=@BJRYbn++nxDDYY==z..JJFF22''__eeWW..}|vof`b`W\]_ep++nvDDWW==z..JJFF22''__eeWWZ5r==BB==88~++g"F@BJPPLPZ`p++rzFF\\==222NNNeeepppjjjxxxrrrppppppppppppppppppppppppooofffYYY===jjjtttggg222NNNeeepppjjjxxxrrrppppppppppppppppppppppppooofffYYY===jjjtttgggjjjuuuiii\\\DDDjjjTTZZtjjjjjjjjjLL}..BBJJJJBB..22``ff22TbbbjjjjjjZZbboo88Tiiijjjuuuiii\\\DDDjjjuuuiii\\\DDDjjjTTZZtjjjjjjjjjLL}..BBJJJJBB..22``ff22TbbbjjjjjjZZbboo88Tiiijjjuuuiii\\\DDDjjjuuuiii\\\DDDjjjTTZZtjjjjjjjjjLL..BBJJJJBB..22``ff22nbbbjjjjjjZZbboo88Tiiijjjuuuiii\\\DDDjjjuuuiii\\\DDDjjjTTZZjjjjjjjjjLL}..BBJJJJBB..22``ff22TbbbjjjjjjZZbboo88kiiijjjuuuiii\\\DDDccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urgzFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDDDDDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ."""""""""""""""""""".ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"tggggggggggggggggggggt"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttcccκҽȵ"LLvr@Z\@2D.B.@+='8.@.B,>7AJFJP ;;__wg5=BBDHD=#@B8~2F2F0D!/BDFFDDFHHJHD@;DD@8+~FFD/ޘFŻޫgޘFŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ."""""""""""""""""""".ރ޻sngޫ"ރ޻sn޺ܳ߳兲fc]Z`bR=NLNLH=28NNNRNNNNNNHB8.HNPerwvz{ZZZdz{{{uuujjj\\\NNNNNNNNNNNNNNNRRRcccjjjrrrzzz~~~]]]ޘF޻ނ"gޘF޻ނ."""""""""R}.kNj8TTUUUUPP椤..;;''55LLNN᧧TT栠cc;;22mm55""'']c=e@j@i=e;b8]5Y2T.N+J+F'D"=58@DT_fp2222''==;;""''jj{{]]BB|''L'88==8822t++b""UH@@@@DR_fr2222''==;;""''jj{{]]BB==""{skb\TLJFFFT\fo2222''==;;""''__nnTTBBFFDD==55{++e""L;@BB@@BFP_gs2222''==;;222NNNeeepppkkksss̒ppppppppppppppppppppppppmmmcccUUUHHHoootttggg222NNNeeepppkkksss̒ppppppppppppppppppppppppmmmcccUUUHHHoootttgggjjjrrruuujjj\\\UUUggnHH}jjjjjjjjjBBJJeesjjjjjjjjjjjjjjjjjjeexJJBBԒLL++\bbbjjjjjjJJ}}22WWYjjjrrruuujjj\\\UUUjjjrrruuujjj\\\UUUggnHH}jjjjjjjjjBBJJeesjjjjjjjjjjjjjjjjjjeexJJBBԒLL++\bbbjjjjjjJJ}}22WWYjjjrrruuujjj\\\UUUjjjrrruuujjj\\\UUUggnHH}jjjjjjjjjBBJJeewjjjjjjjjjjjjjjjjjjee}JJBB撒LL++{bbbjjjjjjJJ}}22WWYjjjrrruuujjj\\\UUUjjjrrruuujjj\\\UUUggrHHjjjjjjjjjBBJJeesjjjjjjjjjjjjjjjjjjeexJJBBԒLL++\bbbjjjjjjJJ}}22WW]jjjrrruuujjj\\\UUUccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urgzFFFFFFFFFFFFFFFFFFFFFBBB;;;555222222222222222222222222888===DDDFFFFFFFFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ލރރރރރރރރރރރރރރރރރރލ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFUޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccŴNм"~κ"Ǵ"'v+b\+282+;.@.B.B5H2D->(7';;..vumB@8+DHHD5b2F2D/@!CDFHJNHe'ND@BB@8+z7bFD@!!HH''z7ޘFŻޫgޘFŻ޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲ŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲"ރ޻sngޫ"ރ޻snݳݳ```z{sWBHJHB8.BNNNNNNHB5++..5=NRensuzzYYYdzvvvmmm]]]NNNNNNNNNNNNNNNJJJTTTiiiooouuu]]]ޘF޻ނ"gޘF޻ނ"}vkgggmU2oPn=ʊ˹NNttPPLL==88FFTT''55YYee88""HHooHH;;||ӃWWUUxRgDrFtDsBm=f8_5Y.L+H'D'B'@";5+'@@DR]go++""==WWWWUUttzz;;25;;.""T..n..o++g''YJF@@@@@HNYeo++""==WWWWUUttzz;;BBccgg''~rfb\PFB@@@HU_gp++""==WWWWUU|RRPPu''DDFFBB;;22r''\J8+88@@@@@HW`ks++""==YYWWUU222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttggg222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttgggjjjjjjjjjccc___jjjJJ""iiijjjjjjNN55eepjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjeex88bb22Tfffjjjjjj++zz22Yiiijjjjjjccc___jjjjjjjjjjjjccc___jjjJJ""iiijjjjjjNN55eepjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjeex88bb22Tfffjjjjjj++zz22Yiiijjjjjjccc___jjjjjjjjjjjjccc___jjjJJ""iiijjjjjjNN55eeujjjjjjjjjjjjjjjjjjjjjjjjjjjjjjee~88ьbb22nfffjjjjjj++zz22Yiiijjjjjjccc___jjjjjjjjjjjjccc___jjjJJ""iiijjjjjjNN55eepjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjeex88bb22Tfffjjjjjj++zz22uiiijjjjjjccc___jjjccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@'gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNYckT`mZnYcnFFFFFFFFFFFFFFFDDDPB5rLUZ\\\\\ZWwP`@;."...@@@FFFFFFFFFFFFYbkT`mZnWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"tggggggggggggggggt"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ."""""""""""""""".ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘg"ރ޻FdzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}cccǴӿ52ѽ̸dzı{r'fc8jg@2D.@+;".RHHL|뉗"F2T2D.B FZJJ_u慕JB@B=5'o||牉""TDBFF__oޘFŻޫgޘFŻޫtggggggggggggggggtޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫtggggggggggggggggtޫ"ރ޻sngޫ"ރ޻sn߳߳gJF.BH{bL@FD;2+HNNHB8+++x"`+5=@LR_mvruvWW]dzgggxxxppp555zzzpppcccUUURRRPPPPPPNNNNNN===```rrr___ޘF޻ނ"gޘF޻ނ"tgggggc`]WRLHB===FgZ5zTo¤@͌ͺ""''..++DD傂ۛLL88LL==WW55``RRDDTT@@nn""""88~F8]FvHxFu@j;b2U+J"=552222"+@@@NU_ir''LLTTDD@@nn""""88~''D'5+=+@"=DJHFFF=@@@@@BJZfs''LLTTDD@@nn""""88~''22cc__55{pjeUJB@@@@BLW`jr''LLTTDD@@nn""""88~jUJHH+DDBB==55x''_J2'@@@@@HUYfkw''LLUUDD@@nn222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttggg222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttgggjjjjjjjjjjjjjjjggnYYmjjjjjj]]xBBjjjjjjjjjjjjccfRReDDf@@bHHYYY\gggjjjjjjjjjBBLLHHTjjjjjj]]ZZ55\\]jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggnYYmjjjjjj]]xBBjjjjjjjjjjjjcciRRsDD|@@xHHiYY_gggjjjjjjjjjBBLLHHTjjjjjj]]ZZ55\\]jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggnYYmjjjjjj]]BBjjjjjjjjjjjjccfRReDDf@@bHHYYY\gggjjjjjjjjjBBŌLLHHbjjjjjj]]ZZ55\\]jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggpYYwjjjjjj]]xBBjjjjjjjjjjjjccfRReDDf@@bHHYYY\gggjjjjjjjjjBBLLHHTjjjjjj]]ZZ55\\`jjjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFFFFZ+txzzzxxxxxwup`T8...DDDFFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ލރރރރރރރރރރރރރރލ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻FdznnnFLFJPJFLFFLFFLFFLFFLFbebbebFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc""AAZqpZ""ZAAqpZ"AZZqqppZZ""AZAqpZƴ"κҾԿҾм̸Ǵðκ͸ȵ¯ʷ¯\U%#8822fHJFe߽~H;.B.@*<%3HJ2Yf{D@B=5!fFF~~B@<322fffޘFŻޫgޘFŻޫggޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻snޙzZ@'Yp."].++@.'++r+Z+].i;Z.wBDJR_oxruvYYYdzBBBTTTiii@@@"""@@@PPPPPPNNNNNNWWW888ZZZ___ޘF޻ނ"gޘF޻ނ"gǷF|wƴ_k\FWcTx|o{=i_8{Wrȩ@͌ͺ''==FF镕||LL++PP..88BB㕕""FF55BBJJTT==wuB5ZHwHxDr;c2U'D"5.222222"+@@BNTW`jp{UUjj55BBJJTT==+;+='8'2.+8BFF2.2""+"++'8@BR`nt{WWjj55BBJJTT==wtv""};;~22nki`""PB@@@@@@PY]fmtzWWjj55BBJJTT==\2+"."+2"8D@@==.2k"'L"2=@@@@HYYcfot{WWkk222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttggg222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttgggjjjjjjjjjjjjjjjWW""jjjjjjjjj..55jjjjjjjjjffk==++_WWYiiijjjjjj88n```jjjjjj''ZZ@@UjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWW""jjjjjjjjj..55jjjjjjjjjffn==++}WW\iiijjjjjj88n```jjjjjj''ZZ@@UjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWW""jjjjjjjjj..55jjjjjjjjjffk==++_WWYiiijjjjjj88ђ```jjjjjj''ZZ@@UjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWW""jjjjjjjjj..55jjjjjjjjjffk==++_WWYiiijjjjjj88n```jjjjjj''ZZ@@ijjjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;++U............555;;;==_gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;U++............555;;;_==gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;+UU............555;;;=__gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;+U+............555;;;=_=gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFiR=~āÁÀ€~}{u`;."===FFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"tggggggggggggt"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ."""""""""""".ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻FdzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmccc,,((/,,/((,(//,,(/(TTTNǴȵȴŲIJκҾҾѽ˸ðɶti0+??''88DD\HJN2YJFB2m.@2D0B'JHLتFBB;2 \22m@DB''\ޘFŻޫgޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޡgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻sn'''"""Rbbr5"""'''"';"L's"pYPzBn=@L+Hx+Lr+U2b.]8oD@HPcpmkppYYYdz'''"""FFFppp"""+++===555___TTT...222+++222NNNNNNPPPeee```'''___ޘF޻ނ"gޘF޻ނ"gʖtFFFFPc@pzzu|s5N.FFFF\gH{=p`8}Yuͭ@͌ͺffww@@++PPJJ88jjcczzkk@@''DD;;FF""LL''UU==NNeessBB''''xcYD+JHzJ{@k2J';.5".+"++.2222"@@@FNY_jrt{88""''UU==NNeessBB''''|~N5p'2b+8'2".'++2"'"+;522255''@Jbpvtx88""''UU==NNeessBB''''|xocY\\`W"'FH@FF8@@@@@@R\birstx88""''UU==NNeessBB''''P'@2U2T.P.N'@;'._'2F+.'2"28"."+'.+8@@@@BNZ]fipvuz88""222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttggg222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttgggjjjjjjjjjjjjjjj==LLnjjjjjjWWccjjjjjjjbbs''FFBBwLLUiiijjjeexBBffDDUjjjjjjTTLL""igggjjjjjjjjjjjjjjjjjjjjjjjjjjj==LLnjjjjjjWWccjjjjjjjbbz''FFBBLL`iiijjjeexBBffDDUjjjjjjTTLL""igggjjjjjjjjjjjjjjjjjjjjjjjjjjj==LLnjjjjjjWWccpjjjjjjbbs''FFBBwLLUiiijjjee~BBffDDjjjjjjjTTLL""igggjjjjjjjjjjjjjjjjjjjjjjjjjjj==LLjjjjjjWWccjjjjjjjbbs''FFBBwLLUiiijjjeexBBffDDUjjjjjjTTLL""gggjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;'............555@@@5gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urgzFFFFFFFFFFFFm'ʅɄȃǂłłŁŁŁŁŁÁ€~{p`@888FFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ލރރރރރރރރރރލ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttccc..JJ22`((/..JJ22`/((.J2``(//..JJ22`(/(;¯˸Ҿ'L̸¯k`GOG0G0(`(''''RRQ"JHJJHFD+P=.Z2D2D.?FJ]t㰼"LB@;.Q""++ZDD?]]""QޘFŻޫgޘFŻޫgޘUFFFFFFFFFFUޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻sngޫ"ރ޻sn""";bk""""7L.Uk.;D'''"5B"U.W+gF@+c'Db.U5e5b'5H=8NTbgnnrsYYYdz"""xxxRRR"""&&&;;;222'''"""222...'''LLL\\\nnnfff+++___ޘF޻ނ"gޘF޻ނ"ggueB'@+@+@+;258'@D'=@58;2@+@+@+B'BT@Bxf;…ò\zЯBЏнTT셅לLL5555NNLL""JJ++""NN==UU22""""BBٜLLNNss__gg++iijj55DDZZ==""cH=25Dr2R5J.2"88+8+28"'5"'2"2"++'52.=@@@BN]nz|t~++iijj55DDZZ==++""8@|;H+;B+.B"+8"''.28""'222"="=55Ljw~{t++iijj55DDZZ==++""iLDJHNP5@8;L'8@.5+5@D+5F5@@=@@FZ`jrz}{t++iijj55DDZZ@L=e@i=g;c;b5Y.H"8F+2=8B.5'58'8.5"'.';@@@BNU""`fru{~|t222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttggg222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttgggjjjjjjjjjjjjjjj``ejjjjjj==FFvjjjjjjggn..JJJJ..ZZwWWYjjjjjjJJ``""gfffjjjeex....___jjjjjjjjjjjjjjjjjjjjjjjjjjj``ejjjjjj==FFvjjjjjjggp..JJJJ..ZZWW\jjjjjjJJ``""gfffjjjeex....___jjjjjjjjjjjjjjjjjjjjjjjjjjj``ejjjjjj==FFjjjjjjggn..JJJJ..ZZwWWYjjjjjjJJ``""fffjjjeex....___jjjjjjjjjjjjjjjjjjjjjjjjjjj``jjjjjjj==FFvjjjjjjggn..JJJJ..ZZwWWYjjjjjjJJ``""gfffjjjee}....___jjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............888==='gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNesbsrgzFFFFFFFFFFFFx·ˆʅȄǃǃǃǃǃǂǂƂŁ€}uwP222FFFFFFFFFcr`upfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޡg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"tggggggggt"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ."""""""".ރ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~ccc!!{{ꊊ!!{{䊊!{!!{{3?>>≯{tȵ<B\AFHHF]sNgD52P2D2D+;BH'Rx"LB@8+A]]NNPDD;''xx""AޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻sngޫ"ރ޻sn@PU5DP"""'''+++""""""'''"+.U{8v"@U"TrJNUUWsvpuuYZ`dzFFFFFF"""'''+++""""""'''"""\\\sss@@@===___ޘF޻ނ"gޘF޻ނ"."DFR82P.;F"2F+55+52+5@+5D2='@+.FBrj=ÆǴ]"{ѰBѐѾBB]]LL++FFYY22""ZZ22YYLLLL쭭..NNBBWW225555vv++jjiivv``JJ;;ZZDHH'U''Y""T""T'']'+Z".=""='5B5H'2F'8B+.D"8=2='+2".';FFFH'=@@Tp``JJ;;ZZHH''BBHHk{@@H5n2@R2;@+2;+2;55J.2+5"+8'+222"='D"="+Lo``JJ;;ZZHH''@@88'+;'+F""82=P'@L";F"=F'2B5@+;F+5J"5=";8JWZjp}``JJ;;ZZcFcDrFtDrBoBn=c2L+=N'2=+2D'2B"5@".@"=@"'...55;HU""c++n;;s++u{222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttggg222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttgggjjjjjjjjjjjjbbziiijjjggnbbfjjjjjjBB]]zjjjjjjjjjjjj]]JJՎ++_gggjjjeex2288\\]jjjjjj''55TT\jjjjjjjjjjjjjjjjjjjjjjjjbbziiijjjggnbbfjjjjjjBB]]jjjjjjjjjjjj]]JJ玎++}gggjjjeex2288\\]jjjjjj''55TT\jjjjjjjjjjjjjjjjjjjjjjjjbbziiijjjggpbbmjjjjjjBB]]zjjjjjjjjjjjj]]JJՎ++_gggjjjee}2288\\bjjjjjj''55TT\jjjjjjjjjjjjjjjjjjjjjjjjbbiiijjjggnbbfjjjjjjBB]]zjjjjjjjjjjjj]]JJՎ++_gggjjjeex2288\\]jjjjjj''55TTfjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNYckU]gZnYcnFFFFFFFFFFFFłω͈ˆɄȄȃȃȃȃȃǃǃƂÁ~wW222DDDFFFFFFYbkT`mZk{Wcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ލރރރރރރލ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘUFFFFFFUޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻FdzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFkokkokFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}ccci""vv䊊i""vv䊊ii"vi""vvBEB.@.B/@$]]]xxxмY@¯WNrDFJoHHNNv5RDHPڭ+PB=5u2D2F1E#0@FH=\HB=8'v55++uDFE0==vޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ލރރރރރރލ޻sngޫ"ރ޻sngޫ"ރ޻snHcc"28p8i"""'''+++'''...++++++"""''''''''''''""";H.Z"TbURPZf||t{ZbwdzHHH555"""'''+++'''...++++++"""''''''''''''"""]]]{{{'''@@@___ޘF޻ނ"gޘF޻ނ""'"."@F=2""H5D\=L`+5@';B2=N+5L"F85F;|rȩ@͌μc"{ѰBѐѾPP@@鬬ssNNLL==YYffzz锔BBTT쩩==''beU=p888855}55}88~2BU+;D2=N2=@.DP'BJ2DN+2J'2F2;';8'."'.FFJ""U""P'B@Hm++``22''ccPP``{{iif5DP~+=J2BJ.@L2;F'5H"5=+5B+58+5"'+22'B+F'D".Jp..__55''ccPPHHvHJ"2'5.D+5D'FH'@H+=F"@H'=J";D"8B"5@2;".8"+28@DH\jz++__22''cc]LkFvHxFvFtDs@c2=H2@H2HJ2LW+=="@D'BL".B+;@"2;+5HFDT]k++u==rz""++..bb22222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttggg222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttgggjjjjjjjjjjjjZZ..xjjjjjj]]""jjjjjjggo\\pjjjjjjjjjjjjjjjjjj]]ZZBBYY\jjjjjj..88NNYjjjjjj55..JJZjjjjjjjjjjjjjjjjjjjjjjjjZZ..xjjjjjj]]""jjjjjjggr\\{jjjjjjjjjjjjjjjjjj]]ZZBBYY_jjjjjj..88NNYjjjjjj55..JJZjjjjjjjjjjjjjjjjjjjjjjjjZZ..xjjjjjj]]""jjjjjjggo\\pjjjjjjjjjjjjjjjjjj]]ZZBBYY\jjjjjj..88NNfjjjjjj55..JJZjjjjjjjjjjjjjjjjjjjjjjjjZZ..jjjjjj]]""jjjjjjggo\\pjjjjjjjjjjjjjjjjjj]]ZZBBYY\jjjjjj..88NNYjjjjjj55..JJjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;++U.........55588\gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;U++.........555\88gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;+UU.........5558\\gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;+U+.........5558\8gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFȄыϊ"ˆʅɄȄȄȄȄȃȃǃǂŁxZ222DDDFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ."""".ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޡg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"tggggt"ރ޻Fޘg"ރ޻Fޘg"ރ޻FdznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc)""{{22Z)""{{22Z))"{2ZZ)""{{22Z'5BB2F2F->YYYYYYZZZڂƲw55UFFL]iXBiimr~JJ2YwD@=B8v2D.B#25K@FHJFB=5"mrr22wwvDB#K22mޘFŻޫgޘFŻޫgޘFŻŻŻŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ."""".ރ޻sngޫ"ރ޻sngޫ"ރ޻snc;Y'''"""+Fo;`'''+++......++++++...+++...+++''''''""""""@.HHTbnuˁDŽ{\mdz'''"""ggg'''+++......++++++...+++...+++''''''""""""\\\LLL```ޘF޻ނ""B=uF.t""".."5'8+@+.D"';FYpNe|.FW"=D"5D'8D2@L.;N'85"'p+"i"2Hs@;"{ѰBѐѾ@@..@@++""FFbb""DDJJoooo||xx""NN++{|m.g@@BBBB@@@@;@'=J+HL.;J2BP;DU+8D+DL"5D2;R'5@'=D"'5'."'BF''Z++e++g''\.8Ho""jjPP55PP++{|++++\\~~iiz=@{H\;N\'@L"8F'FH2=J.;L.;H28F"5=.@+++25'D+J+F".Hk""jjPP55PP++{|++++sT".=2'@+=8L.5@2=J5BJ5@L28R.;P2BT'=P"2D+;@"+2"+."'8+;@@DYo""eePP55PP++{|++R@cFvHxFvFtDs";T.=U'=L'@H.@J5JP2DN'=L"@B.8@'5="8DB'5DW_bju''22""iiPP55PP++222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eee222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eeejjjjjjjjjjjjNN;;jjjjjjjTT55pjjjjjjZZ''jjjjjjjjjjjjjjjjjjjjjjjj..FFHHYjjjjjjBB++DD]jjjjjjJJ''BB`jjjjjjjjjjjjjjjjjjjjjjjjNN;;jjjjjjjTT55pjjjjjjZZ''jjjjjjjjjjjjjjjjjjjjjjjj..FFHHijjjjjjBB++DD]jjjjjjJJ''BB`jjjjjjjjjjjjjjjjjjjjjjjjNN;;jjjjjjjTT55jjjjjjZZ''jjjjjjjjjjjjjjjjjjjjjjjj..FFHHYjjjjjjBB++DDrjjjjjjJJ''BB`jjjjjjjjjjjjjjjjjjjjjjjjNN;;jjjjjjTT55pjjjjjjZZ''jjjjjjjjjjjjjjjjjjjjjjjj..FFHHYjjjjjjBB++DD]jjjjjjJJ''BBwjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;'.........222+gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNU]eU]f]rYcnFFFFFFFFFFFFʄҌ"ϋ'̇ʅɄȄȄȄȄȄȃȃǂŁx\222DDDFFFFFFT\cT`k\oWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻ލރރލ޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޘUFFUޘg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘg"ރ޻FdzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFbebFLFbebbebFLFFLFbebFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccNJJpNJJpNNJppNJJpIJ͹ȴ52F2F5FFLRNNN³Tκȵ{o7122YYFDD5f]]WWbZkHJcz在JBBFF=2Z+='5"'BFHHDB=2!bZZccZ=5'bޘFŻޫgޘFŻޫgޘFŻ޲ޫޫ޲ŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"޲ޫޫ޲"ރ޻sngޫ"ރ޻sngޫ"ރ޻sn_Wx''''''...+++'''+++...++++++''''''...+++'''++++zis{폼؃]xdz''''''...+++'''+++...++++++''''''...+++'''+++```ޘF޻ނ'"@'\""LFFFFFFF'B+=2B"2D;;;LY"=L'BN;Ug+5F5@+BL.;L+5B+2"2H""T..k55z55}++f""RF8D"|ѰBѐѾ88ee++eeLL֛''""bbgg55++ZZHHՈbbcc..BBPPNN''DDJJ88N=FFFFFFDDDD5D{'BL'@L.@H.FR5BR.=N+L`2DR'BN+@F';;"+="+5"+;H++g22v55{22s'FW{FF55''DDPPbb88;;@@YZJUj'FT+BP'@T"@P';F.5H+8H+5D";B+='2"+2"8+H.N+H".Ff~DD55''DDPPbb88ZB+'Z''\''Y+L5B+@NBJ+HJ+8N'BD5@N+8H2=L'=P'DF+;F"+2"'."."2JJ"F.8@FfBB55''DDPPbb88H;`FvHxFvFtFp+=P2;L.DJ8Jb;D_+DR2FU2@N2@L25N'@H5@+8F;Zciow{DD55''DDPPbb...222222222222222222222222222222222222222222222222222222222222222222BBB...222222222222222222222222222222222222222222222222222222222222222222BBBjjjjjjjjjjjjNN==fjjjjjjNN==fjjjjjjNN==ijjjjjjjjjjjjjjjjjjjjjjjjJJ''@@bjjjjjjJJ@@cjjjjjjJJ@@cjjjjjjjjjjjjjjjjjjjjjjjjNN==fjjjjjjNN==fjjjjjjNN==jjjjjjjjjjjjjjjjjjjjjjjjJJ''@@xjjjjjjJJ@@cjjjjjjJJ@@cjjjjjjjjjjjjjjjjjjjjjjjjNN==fjjjjjjNN==jjjjjjNN==ijjjjjjjjjjjjjjjjjjjjjjjjJJ''@@bjjjjjjJJ@@zjjjjjjJJ@@cjjjjjjjjjjjjjjjjjjjjjjjjNN==~jjjjjjNN==fjjjjjjNN==ijjjjjjjjjjjjjjjjjjjjjjjjJJ''@@bjjjjjjJJ@@cjjjjjjJJ@@zjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNescrrgzFFFFFFFFFFFFʄҍ"Ћ'̇ʅɄȄȄȄȄȄȄȃǃŁx\222DDDFFFFFFcr`uofz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ"tt"ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻ނ..ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޘFFޘg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"gޠޡg"ރ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttccc.......ƳӿfοUig=2D2D-@(ȴҾ@mɶrf++''}BB>%%++22Y"JHN|5WDDFDB=2z!76LDFHHD@;2Y""||55z766YޘFŻޫgޘFŻޫgޘFŻޫttޫŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"ޫttޫ"ރ޻sngޫ"ރ޻sngޫ"ރ޻sn__2;@"""'''+++''+''+'''222...+++.........+++++++++'''''''''""""""'@_.r\퉤`¬dzJJJ"""'''+++'''''''''222...+++.........+++++++++'''''''''""""""DDDbbbޘF޻ނ2W++`2=ZFYs5@\'+NJFFF"'W.B5F25@5LN"@L8JU+DN'BN"=L8HY"8B"5=+2;+;"+"B""U22u==BBBD5;k2@Y2=T"F'5~ԲBҐºpp__NNee䢢....55LL++bbttNN@@LL==觧YYUUppDD..R=JJJJHHHHHH+@c.@B+8==;TBWs5BT.8H+@N5@N+=J.@J"@D"8D'58"+5"2J22r88==88~.Jp55UUZZZZppDD..o"'.HW.=R+DT;L`BPfBJb2HZ"BR+BJ.BJ"2;'+2+.'@.N2T.L".Fe}55UUZZZZppDD..b"R88;;8888~55z2F"8L"=N2DY5Rb+BR.;H;HZ@D\'@J2@J.8B'2='.;"."H''\++c..i""N25De55UUZZZZppDD..D;`FvHxFvFtDn+=W2@P55P;F_;Rf@Ug=HYBTi+5D2@U';F"=H"2;@cgnt{55UUZZZZBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeejjjjjjjjjjjjNN;;cjjjjjjNN;;cjjjjjjNN""88bjjjjjjjjjjjjjjjjjjjjjjjjJJDDfjjjjjjJJBBejjjjjjJJ@@ejjjjjjjjjjjjjjjjjjjjjjjjNN;;cjjjjjjNN;;cjjjjjjNN""88{jjjjjjjjjjjjjjjjjjjjjjjjJJDD|jjjjjjJJBBejjjjjjJJ@@ejjjjjjjjjjjjjjjjjjjjjjjjNN;;cjjjjjjNN;;|jjjjjjNN""88bjjjjjjjjjjjjjjjjjjjjjjjjJJDDfjjjjjjJJBB{jjjjjjJJ@@ejjjjjjjjjjjjjjjjjjjjjjjjNN;;|jjjjjjNN;;cjjjjjjNN""88bjjjjjjjjjjjjjjjjjjjjjjjjJJDDfjjjjjjJJBBejjjjjjJJ@@{jjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNescrrgzFFFFFFFFFFFFʄҍ"Ћ'̇ʅɄȄȄȄȄȄȄȃǃŁx\222DDDFFFFFFcr`uofz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ"tt"ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻ނ..ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޘFFޘg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"gޠޠg"ރ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFuxu~~FLFFLFuxuuxuuxuFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccww''ww''w'ww''Ŵ5Ҿmj"JN@.B.@(9aaa¯κҾ;ȴg];;++jj@@\@@@~""@@==%V%HJLg;ZDDDD@;2!+Z*HDFHHD@;.MLL;;Z!!**MޘFŻޫgޘFŻޫgޘFŻޫttޫŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"ޫttޫ"ރ޻sngޫ"ރ޻sngޫ"ރ޻sn__Jcn+++222222.....8..5222++++++.........++++++...++++++'''"""""""""''''''"""HxD~5cdz+++222222.........222++++++.........++++++...++++++'''"""""""""''''''"""cccޘF޻ނ8e58rRgRg@Ne=Fm++g''ZJ""L..o"8Z'8F+=F5@L5FL=FR5D].;N=Pc"@P"2F+=D+28'2;'2+J++g;;FFFFRZP`FZr;L_+5L'5ضDٕŹ""''22RR@@""NN++__88zzooNN""..JJNNLLDDPP++JJLLPP""LL==n.iHHJJHHHHDF5J.=N5=L5@N8BP@P`5JY;=T@Pc2=L'8H'DN'8L2@++D..n====55|\5==iiLLPP""LL==c...DP@]r;Re8F\=L_FYn=HZ@Tg';L.;P+.D".="2"8.L5W5Y.N".Fbx==iiLLPP""LL==U5zDDDDBB@@@@5=b.DP2DJ.HU8Wc2HT.DR;BR+BN.5H.=N'5J52F'28"...'']22s55{88..n+@Jk==iiLLPP""LL==F;`FvHxFvFtFi+DZ8@J.DP;R_+JT8Rf2FW=@W=J]2@R'@N'2B2;Lkrw{==ii222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppggg222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppgggjjjjjjjjjjjjNN""55cjjjjjjTT''..fjjjjjjZZ;;neeejjjjjjjjjjjjjjjjjjjjj..RRejjjjjjBBHHejjjjjjJJFFfjjjjjjjjjjjjjjjjjjjjjjjjNN""55cjjjjjjTT''..fjjjjjjZZ;;eeejjjjjjjjjjjjjjjjjjjjj..RRsjjjjjjBBHHejjjjjjJJFFfjjjjjjjjjjjjjjjjjjjjjjjjNN""55cjjjjjjTT''..jjjjjjZZ;;neeejjjjjjjjjjjjjjjjjjjjj..RRejjjjjjBBHHxjjjjjjJJFFfjjjjjjjjjjjjjjjjjjjjjjjjNN""55|jjjjjjTT''..fjjjjjjZZ;;neeejjjjjjjjjjjjjjjjjjjjj..RRejjjjjjBBHHejjjjjjJJFF|jjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNYckU]gZnYcnFFFFFFFFFFFFʅҍ'Ќ'̇ʅɄɄȄȄȄȄȄȃǃŁx\222DDDFFFFFFYbkT`mZk{Wcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻ލނނލ޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޘUFFUޘg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘg"ރ޻FdzFLFJPJFLFFLFFLFFLFFLFuxuuxuuxuuxuFLFFLFuxuuxuuxuuxuFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}cccFF,,FF,,F,FF,,ʶ=Pмȴ+2==+=2D {{{:::Ǵ"ϻ5Fɶ^V55NDDNee..H[FH+R.TDFDB=8*x"FDFHFD@8+}HH++..x""}ޘFŻޫgޘFŻޫgޘFŻ޲ޫޫ޲ŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"޲ޫޫ޲"ރ޻sngޫ"ރ޻sngޫ"ރ޻sn׺x_Tt...55555522222522;222......+++......222...222+++++++++'''""""""'''+++++++++'''WZ.ec󬬬dz...555555222222222222......+++......222...222+++++++++'''""""""'''+++++++++'''cccޘF޻ނ'5WTYrYp\k@D55|22p++c..i;;8@~"=R"@H+HN'8P'DH=FY=L`2=P+@T'DH+;F'+8+.;".""D++b55x@@HHHHHHYjUjBTiD=N"܁ܺDܗBBRRݟۡ""RRcc55zzWW22@@LL֚++NNRR22kkuu..88PP==..r2pLBDDDD.=v=L5BT5;P=HY2BP=]g'BT@L`8H\.;F'HJ'5L"588@'5'2"=""U88@8_"L''kkuu..88PP==..f".Uf'DR'BL5;T@LZ@L]2FU2LZ5;U.@T";@"."2+F5Y;`8]2R".Ffu''kkuu..88PP==..];HHHHFFFFFF@F2DT2BN+;N.DH=T`;R`H\p.J].;L2=L+;H'8=.;+2'H55w;;====88.H_t''kkuu..88PP==..J;`FvHxFvFtDr.FU.BT.=U.HT8BP2@R.8J.FR'BU'@T+=J8D58DW"w''222NNNtttggg222NNNtttgggjjjjjjjjjjjjZZ++''miiijjj]]22teeejjjggr..RRDDPiiijjjjjjjjjjjjjjj]]zccfjjjjjj..WWbjjjjjj55PP`jjjjjjjjjjjjjjjjjjjjjjjjZZ++''miiijjj]]22teeejjjggt..RRDD_iiijjjjjjjjjjjjjjj]]ccijjjjjj..WWbjjjjjj55PP`jjjjjjjjjjjjjjjjjjjjjjjjZZ++''miiijjj]]22eeejjjggr..RRDDPiiijjjjjjjjjjjjjjj]]zccfjjjjjj..WWnjjjjjj55PP`jjjjjjjjjjjjjjjjjjjjjjjjZZ++''iiijjj]]22teeejjjggr..RRDDPiiijjjjjjjjjjjjjjj]]zccfjjjjjj..WWbjjjjjj55PPpjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;..D....................Dgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;D....................D..gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;.DD...................DDgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;.D....................D.gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFʅԏ+э.͈˅ʅɄɄȄȄȄȄȃǃłz\222FFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ނ."""".ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޠg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ"tggggt"ރ޻Fޘg"ރ޻Fޘg"ރ޻FdznnnFLFJPJFLFFLFFLFFLFFLFUYUUYUFLFFLF~~FLFFLF~~FLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc55PPFFf)q55PPFFf)q5PFff))qq55PPFFf)q˷ӿҾ͹Ų{s+.B2D1C#2NNNYYY]]]uuuų5&hb5;;ۆbbBDFoDFJLDDB@;2(.Q@FFHFB=5's 0Q((s0ޘFŻޫgޘFŻޫgޘFŻŻŻŻFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ."""".ރ޻sngޫ"ރ޻sngޫ"ރ޻snmxe555555555555555555...222...222+++...+++......++++++"""'''"""+++...222...+++;Tj]ZNuܱc欬dzmmm555555555555555555...222...222+++...+++......++++++"""'''"""+++...222...+++gggcccޘF޻ނ"+=kfHW==;;55|55{55{FFBF+@J+;N5Hb5Pb+DRHTeBRg==W.HU.@L.8B.2@'.;'.5"+N55w;;BBFFFFBBRTg8FW8D"ރ޻FޘJJ++NN22xxff@@++""LLNN""55vvLL==@@JJww..''WWWW;;JJ++22=~']8Z5J.=J8HR8BJ2FN';N'BU=Pc2@T28P5BL2BH28F"'2".'8+@;+L'}''''}{''WWWW;;JJ++22s8@uWsPo;N\=JY+JL'=L2DN2FP8JY+HT';F"+=';5Y;c@i;b2T".Lt}{''WWWW;;JJt=|JJJJHHHHHHDH'FP'FP8=R@Zj=Rb5BY8Pe.HR5BP5;L.@L'8D"8;+..2m==BBDDBB;;ND}{''WWWW;;JJ++N;`FvHxFvFtDs'BY.JN;N@ZmBNc5BT5DW;HU'JL"5H'@H2DPN.;_v""DD++++''}{222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttggg222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttgggjjjjjjjjjjjjbb~++|cccjjjggp==UUZjjjjjjBBDDPeeejjjjjjjjj\\p==jjjjjjeesccfjjjjjj''ZZbjjjjjjjjjjjjjjjjjjjjjjjjbb~++|cccjjjggp==UUZjjjjjjBBÊDD_eeejjjjjjjjj\\{==jjjjjjeesccfjjjjjj''ZZbjjjjjjjjjjjjjjjjjjjjjjjjbb~++|cccjjjggs==UU`jjjjjjBBDDPeeejjjjjjjjj\\p==jjjjjjeewccijjjjjj''ZZbjjjjjjjjjjjjjjjjjjjjjjjjbb++cccjjjggp==UUZjjjjjjBBDDPeeejjjjjjjjj\\p==jjjjjjeesccfjjjjjj''ZZkjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNU]eU]f]rYcnFFFFFFFFFFFFɄג8Ւ;ΉˆʅʅɄɄɄɄɄȄǃł€zZ555FFFFFFFFFT\cT`k]oWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻ލނނނނނނލ޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޘUFFFFFFUޘg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻FdzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFUYUUYUFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccՙfNBB[fN[BBՙffNNB[[fNB[BǴ"κѼм͹Yλ._]52D2D';HNRU'''@@@vvvrrJJgDFHUX"ADFHHDDB=5)pBFHJFB=5"j""pjޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻ލނނނނނނލ޻sngޫ"ރ޻sngޫ"ރ޻sn\{{555555555555555222222...++++++...+++......'''++++++""""""+++222222222+++8Uw\W}ȩc۬dz\\\555555555555555222222...++++++...+++......'''++++++""""""+++222222222+++WWWcccޘF޻ނ"iYmYpTj_RN====@@HHBH.BR2FH'@L5T_2HT.BP=FR.BP.8H2@R+;L8;N25.2.2o;;@@BBBBPL_pZrLYn""ރ޻Fޘ..ff""NN==NNJJ''BBǂss``55''LL22..@@++BB88PP==BB55JJNR5H5H;U'HW8H]8Pb5L].FU'BR.FW'@J+=D'DR"BB+5B'5Z+=+=;vNNccNNDD..~}++BB88PP==BB55JJ\\''bg@\p5R`8FN+;R2N\"BH.DH+DJ+=='.5+5=2R=eBmBn=e2T".`"";;..~}++BB88PP@H_FJJHHHHHHHH8Bj8DR2BR8JN5P];Pf;F_2FP'BL.HT2;@+5F"+2"2@==DDFFFF==U=wFHDD..~}++BB88PP==R@cFvHxFvFtDs"D]'FN.BP8BJ8HY.BP;Pj2;H2BP.DJ';H5BYNZz''PP22PPccNNDD..~}222NNNeeeppppppppppppooobbbHHH======888222222BBBZZZkkkppppppppptttggg222NNNeeeppppppppppppooobbbHHH======888222222BBBZZZkkkppppppppptttgggjjjjjjjjjjjjjjj;;UUZjjjjjj==\\22Yiiijjjggs;;ҡn88b==i''ffkjjjjjjJJ22jjjjjjeetfffjjjjjjjjjjjjjjjjjjjjjjjjjjj;;UUZjjjjjj==\\22Yiiijjjggu;;䡡88{==''ffnjjjjjjJJ22jjjjjjeetfffjjjjjjjjjjjjjjjjjjjjjjjjjjj;;UUZjjjjjj==\\22tiiijjjggs;;ҡn88b==i''ffkjjjjjjJJ22jjjjjjeetfffjjjjjjjjjjjjjjjjjjjjjjjjjjj;;UUbjjjjjj==\\22Yiiijjjggs;;ҡn88b==i''ffkjjjjjjJJ22jjjjjjeexfffjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;"........................"gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNescsrgzFFFFFFFFFFFF~ߝR]ю2͈ˆ˅ʅʅʅʅʅɄȄǂÀzU;;;FFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޠg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ"tggggggggt"ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ނ."""""""".ރ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFuxuuxuFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttccceeឞ//ee랞//e/ee//IJȴϼ;ʶ";FB2D2F.?bFD==BFFFDB@;.BFHHDB;2 ^^ޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻sngޫ"ރ޻sne222222222222222222......+++......'''...++++++""""""'''..2222222...8_Uoc۬dzeee222222222222222222......+++......'''...++++++""""""'''...222222...bbbcccޘF޻ނ"gʢeҲ+~\BBDDDDFF8Fz'DU.;R.HJ@We2P_BWk'BU28N;HZ'@F"5="2='.=;;==@@@@{Wpظ~`pg"ރ޻FޘʊLL55++""BBPP{{22==++++UUPPBBDD88..ZZfgH2B2F\;\]=p_R]sWr"@N2BW8Ug'@L8ReDP{F=p8;uN5x+;B'5{BBnnooppFF5555BBDD88..ZZss;;""..DDNJx'LN8BP'BDDYt2L\+5H+5F+8D"5D2LBmDsFvDs@i5W2"5PPggFF5555BBDD5Bb@DDDDDDFF;@.BR.FU2=F.DT+DH8;R.BN'5L5J+;H''=.@'._@@BBDDBB_;ujmooppFF5555BBDDZ@bHzJ{HzFvFuBm+FZ85T5@T2@R5HR=;T5BN8BN5=D'5B'5JZrBBnnooppFF5555222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttggg222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttgggjjjjjjjjjjjjjjj==LL;;UjjjjjjWW]]88TTYjjjjjjbb;;ҊRRbbsjjjjjjeepUUmjjjjjjTT22~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjj==LL;;UjjjjjjWW]]88TTYjjjjjjbb;;䊊RRbbzjjjjjjeepUUmjjjjjjTT22~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjj==LL;;UjjjjjjWW]]88TT_jjjjjjbb;;ҊRRbbsjjjjjjeeuUU}jjjjjjTT22~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjj==LL;;mjjjjjjWW]]88TTYjjjjjjbb;;ҊRRbbsjjjjjjeepUUmjjjjjjTT22jjjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNes`urgzFFFFFFFFFFFFv'nѥߠ\ю2Ή͈̇̇̇̇ˆˆʅȃÁxrLBBBFFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻ލނނނނނނނނނނލ޻Fޘg"ރ޻Fޘg"ރ޻Fdz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~ccceeᙙFFeeFFeFeeFFѽT]ı28DD2D.B%4==JJR@;#$#@DFFFD@=5'N@]RjF@;.#.[''@@RR[##ޘFŻޫgޘFŻޫgޘUFFFFFFFFFFUޘgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻sngޫ"ރ޻snF'''.....................++++++''''''+++YLw]_YPgc⬬dz'''.....................++++++''''''+++cccޘF޻ނ"gޘB޻ނ"f2+=e2FN8@T;U_8JY5=U5L`.JU2=N8@P2;F+5B2;';f'"ރ޻=ؖg"ރ޻FޘʉHHYY""55YYLLRR22""@@\\朜LLHH䗗mm""__mm55BDiiWWBB@}UsRc|+HT.@LFRjsBW5x@@RR``LL]]||..""__mm55DDiiWWZBt2=N+5B"BL;N.@F.=J";F+5=+52RJ{HzHxFt@j5Wn5;YYLL]]||..""__mm8F@m8e5T'@_8DR+;R8@U.@P2;D+=L";@8@"5H.H;8DF+fRR``LL]]||..x+DHxJ}J{HxHwBo5T+=P2BL+FH'=L2DL2=H.5D2BL8D""=JWrRR``LL]]||..222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttggg222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttgggjjjjjjjjjjjjjjjWWRRsbbbjjjjjj22Ņe___jjjjjjggsBB..;;""BBggnjjjjjjjjj55++jjjjjjjjj''RRkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWWRRsbbbjjjjjj22Ņe___jjjjjjgguBB..;;""BBggpjjjjjjjjj55++jjjjjjjjj''RRkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWWRRsbbbjjjjjj22ׅ___jjjjjjggsBB..;;""BBggnjjjjjjjjj55++jjjjjjjjj''RRkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjWWRRbbbjjjjjj22Ņe___jjjjjjggsBB..;;""BBggnjjjjjjjjj55++jjjjjjjjj''RR|jjjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;..D....................Dgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;D....................D..gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;.DD...................DDgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;.D....................D.gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNYckT`mZnYcnFFFFFFFFFFFFvY=ޛFѥ]Ւ;э.Ќ'Ћ'Ћ'ϋ'ϊ"͈ˆɄātPB5FFFFFFFFFFFFYbkT`mZnWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޠg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ"tggggggggggggt"ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ނ."""""""""""".ރ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻FdzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}ccc;;PPFF++99;;PPFF++99;PF+9;;PPFF++99Ӿɶʶzt8.B+=%3#sskkv5(=BDFFDB@8*;W&H5;;&&ޘFŻޫgޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޠgޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻sntH........................+++...++++++'''PJrYJ;NNkcdz........................+++...++++++'''cccޘF޻ނ"gޘF޻ނ"g@kDn+FZ5DH'HU+DT2;T.FP+BP";L.@B".F5U'@g"ރ޻Fޘg"ރ޻Fޘʏ''BB..BB55``ii'']]DD++nnHHLLppӛ{{ۗ;;;;BB""DDoogg++ciz=Dt;@p+.j..YZx8;kr++++ggÀ@@88==;;BB""DDooggU5e";R2F';J5H.@L.;H"=F+5R'+\DrHzHwFvDr=eR'@++++ggÀ@@88==;;BB""~;L@kBoBm@c'@Y+@T"8N+@T';H;P@Y=c5Y'@2"Fe|++++ggÀ@@88==Y8]HxHxFvFu@k8e;@5F_'=H"=H2@B'5F.;L".8'B."=Dcv++++ggÀ@@88==222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttggg222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttgggjjjjjjjjjjjjjjjggp..ZZDDPjjjjjj]]]]uu''\]]]jjjjjjjjjggrZZNNNNZZggojjjjjjjjjjjjBB]]ojjjjjj]]~ffgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggp..ZZDDPjjjjjj]]]]uu''\]]]jjjjjjjjjggtZZNNNNZZggrjjjjjjjjjjjjBB]]ojjjjjj]]~ffgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggp..ZZDDPjjjjjj]]]]uu''|]]]jjjjjjjjjggrZZNNNNZZggojjjjjjjjjjjjBB]]zjjjjjj]]~ffgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggt..ZZDD_jjjjjj]]]]uu''\]]]jjjjjjjjjggrZZNNNNZZggojjjjjjjjjjjjBB]]ojjjjjj]]ffjjjjjjjjjjjjjjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFFFFu+ޛFnߝRג8ԏ+ҍ'ҍ"ҍ"Ҍ"ыω·ʅ~Z+DDDFFFFFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻ލނނނނނނނނނނނނނނލ޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻FdznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc5555555ʶ.ϼ+¯ɶdzUT2".-./55bb:@DFFDD@;2$,ZZ$$ޘFŻޫgޘFŻޫggޫŻFޘgޫŻFޘsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻snZ=u222555222222222222222222222222222...+++""85c|WL8;NNkcccdzkkk222555222222222222222222222222222...+++"""gggcccޘF޻ނ"gޘF޻ނ"gFuHwFs.@U.=R+;H2=N+;D+;L=B@U@c;b.Ng"ރ޻Fޘg"ރ޻Fޘʞ22DDPPFFLLHH''BB''++''BB==""NN55__2222pp..22..~++PP..++DDBB''""ccDD..22..~++HJ2F5H8L5F5J2;b;@;@88~'']55N+JD5ZB8]W.Pu.ccDD..22..~R5YFuHwFuDsDsDoDnBfDpDsDsBn;b.N"+Ji|ccDD..22..~~"8`2UH8]R5Yu+B@mFFHHBH5B|';\2D5B+;'5'PvccDD..222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttggg222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttgggjjjUUUDDD;;;NNNjjjJJssp]]]jjjjjjNN}}jjeTTYiiijjjjjjjjjjjjjjjjjjjjjjjjjjjccj55LL}jjjjjjjjj''DDxjjjUUUDDD;;;NNNjjjjjjUUUDDD;;;NNNjjjJJssp]]]jjjjjjNN}}jjeTTYiiijjjjjjjjjjjjjjjjjjjjjjjjjjjccj55LL}jjjjjjjjj''DDxjjjUUUDDD;;;NNNjjjjjjUUUDDD;;;NNNjjjJJssp]]]jjjjjjNN}}jjTT_iiijjjjjjjjjjjjjjjjjjjjjjjjjjjccp55LLjjjjjjjjj''DDxjjjUUUDDD;;;NNNjjjjjjUUUDDD;;;NNNjjjJJss]]]jjjjjjNN}}jjeTTYiiijjjjjjjjjjjjjjjjjjjjjjjjjjjccj55LL}jjjjjjjjj''DDjjjUUUDDD;;;NNNjjjccckkknnn{{{ppppppppppppppppppfffYYY;;;''w......''wgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;w''......w''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;'ww......'wwgggtttppppppppppppppppppjjjccc]]]TTTDDD...ccckkknnn{{{ppppppppppppppppppfffYYY;;;'w'......'w'gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFFFFFFFvY=v'~ɄʅʅʄʄʄȄłxm'iR=FFFFFFFFFFFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNNޘF޻ނ"gޘF޻ނ"tggggggggggggggggt"ރ޻Fޘg"ރ޻FޘʫgޘF޻ނ"gޘF޻ނ."""""""""""""""".ރ޻Fޘg"ރ޻Fޘgނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠg"ރ޻Fޘg"ރ޻FdzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccñ5мZҿ8ðƳȴðOI"FFh]NQ 4o`e@}j k k<87"QPh@UWB?.W + uw 5 S 2 " Z k0]VnQg'(}3I%b8'aYp9cWWVIq ) :) k7"'8S_|Ho3vlN$[bk:PJX_*Z'B x) m 4 | =mC |+|Lh*}XBO[Cf7)JI JN S/:Iof*"hN9/757H-]M-PNBH@ @ q_l>jK@ghuZ &)~[wNv]  Y " ~m   [ 6 = L4 *9.w.M;]jZWHSnEe{rO;Q-%e'zV2P5jz4+GVOJdG@w\/+EG9Win" 8   w = #>V5Vj*1odjOhc=lL#L  n { w s  9  V % f6dWf71*wA@p?Op[,*v$GLWVo0k\iLC+ iyt/nohrE Kd:Y5X|(Ad\g( H *  R Ka+ \ 7 59HF _P\;Wzb*#2tSN`j(U(A 2  b}]qp~&Ol:ldzFGW*H/En8mlRpm= B 9 ? - } ,L7e7[f u\<_.@&1?'G<lOW>r9 `c_P#r!_3('vYUf`&thXC'+E9m^,3 D";:60%l _  2 8 #(xF2u|,v`{@<Pvtn67R,K  iW " JxCO @Mk67#pKRepY^!8E_e  . q ! =tqCB6T( /Y@3+m%=L4`ykx:(v1L[*pp? B~3viCR =a4w>&A*>T f Pt U5 FAf//Yt*}~T:[s)ur~2@7G>D`o0_N<HOx lMA93mJ]pw;yq*IEU!Z=VU"w %Enoh@g2V!%LkSG_{CHZNR:LUm('}>Q21m5I@hm5#6~azR-N kQ n s  >  pQb o~k!8B uYF^),#w[/OS}'p F@RUm $uM- x}d ;(SY"r[c Uj2(H*\c+|Rf;Wc ;}"8ANo<)|{=BF\ LL1w#Q~7S`|oRc p  -WNp!4V,U!VP<+* eN4viu<XSTY36q$&eV|oM(lWj8yowp`yMGx|l>uH.V0A;!cy<qOHUbX\K&3>Wf^.14I,(.ck(Ssjf- )q;0&Mu6(2c .E.!q|@'JF$#XR+$ FJ .2](E>y"?tf5Y-QrV1l|dN!r(Ap^/`mt{?\uIIa86) :*{   c 7 I JaUv,(SL|]s#l gZ6P : ig aRw wa1)Q +MVI.drS%2p}|r(Ai[`" H  )8o r ip % 4(3+lCTiwW< u m F .N~r P @)R^\_bmQH@y]{lm jnnR7f{'5`z- LF@a.W4eHs/Ua}b:YblX4F/M 7e5<  3 Wh <l I g  Vf ir%X{=z0nfW3|5Q$0Whf*^9\+%%b9Q+^j<*!Wdr;S TgP1D[  a9CAtf_38s:h8OsKQ4 -KD ^ B ! lNk  }1 b >C:a9)}!o G. s? SFBG(j_ o a E (  % a* E\6J.}%JuEr cd4F3QfL ? [ 4 0  E U b!r X|w*n`.zM 0G0\3X[:s44 %PHtio~44/'LyjbxzDJBkI){~4e7 a[%&[Z$12'PRPti=~ ,:_ }9 % gF q :qxO{e";\L*sC\=%MT.d;UA}-D`,PqC&v\va#<U:~CB9SO & %\'I p7LzFtv}w+J.+tb>.@/r]Iq#9=@v 2g{YB!h \IyGQ] $L\P5{\,`WJ&"q RlBF (%0D>Y~whDc.BH>,x N0<" hM<{u3K\Y\Xu3El U=Znf| gnX;P'pH ?H.,WxFHV1cJ\&McC:+=Z|jI+:_vVF/F~"b3@[(,GPiZi^TH$ayV!BtvC#QaUDSS)SMc >YO W"a-wz=Q \9C(Ow;I4B@VH' {[{;1"L iWB/}h"T3h,mI!=nd{ J*sp10R;a*-dUx #V!2p4]+oyy$0 HE0Vgy$6)&w_)15 C k U  j?8LV#*1Z{8;*z<#Kj\N O"x2vNVGbEcV=`L_yN Q/fH4 }Pi+5QxxCdb]9 %jp2fNnc+y] I;.yr"E1]wBe *L%>rzyt`M2E:HcqV7KqpR[R`m,5 (.m]@vTh.* .W\l-HUEPG[R1k~U)'vsLr0qa#~~ o[&.wuaN :fucmt=bb:eM)k(H'\F129wL&(`K:W}RWJnG @ > mv,Cy36RXw4Tfth z:NEHz='ow3t x}A9s4oPj*3Zwa2B;?O_jDnxO0&.d>1Yh!nENG> Q .  ` " rF"8,}`.c  27*Iy>d^ p!c)fEnLmlN;r] W(hQ|7_..Bt)!iI53i/#|H~soYppQC!^u$WF_(z{:/r;G&,P'{kh VWE_F~B\EO'Y>|$dLwF>W15zy1pTe+m!'1o]VRIN]' Hx#$(Sa?{eab/Oi+im9 eREhgu{b NWw f ,s_JNCdHy _&7cPV {J_ > _>[Rv I8>xQ&!_ ?*l7nX~h!qLp-K982jw9  Y  u 8 j_4nimG_nqORGZO J9?Ko?;FC}` l J 3 A<i# M+pdep_!6 av*yb.|({J M  5L /vuE IXnuH^_,>PoDthILa"h@vgo  $}] {mt}73.DU383#\Yb@ugRcJN : 5 < J[  2 p y)   ?n4_,Ms\Ae$=Q};crlCd;I8~S6}ac!P>Ma?- k d|_) \C 08L,|4}WQnC?GWQStworld-2.3.0/res/bomb.wav000066400000000000000000000533161475511570500153000ustar00rootroot00000000000000RIFFVWAVEfmt +"VdataVaS/O=~,"X:Wyg%@^kE%m3ݍܨҍdǵj̈p{p¾<ҭDP D@y}W˘JP[**¬̑yϊϣ϶ϰϵϹϯϧϸϥϴϼχυϘLЫg_GHA !9DJ+Z[hihpiiiAii.i(i"i.i&i&i%i i)iDiZiZiViYihiiiiiiiiiiiiiiiiitiTi7i&i&i(i i ihhhhhhhhhihhiof)a[.VQE.S<4^c ǖ1 ז~usl`R>.-23.-021///12../.00/' ,1/00//.-//.-/31/./110133////12///-/0,*.2/-11,1=GUbiov}uuuwzn{kiM}kh2 9@%O۫ݯ}eԖE3GDWW]flpieinzωϕϛϝϨϷϪhY*@ q) 3Y<8>4M20/,*D+-<01S1]/I/2 789:>B$DA4>=^?? >;;=>(@@ABhBAA]@?>6=h;t97541&/,*'@%" y1pM  6iݣاtq_&s%$LyJ y9 0"y$o&" | ! ~<  9^r3LݩJֵԉ҂*u=Ȗ7|Ľ [/+N4ִѴM޵:[mo6L!HL!F!_&z z Ps-k{V. :  Me bx}:5<5-7ڇL܁wāāʁǁҁʁv"䅲jCiǘw%՟Uw[׮,=RκhپEè5CQI4ҤϢй6=ҳ:ӣ \Ԧdi7qףסakG֤֓oNW ۃމ6?a ݷܠ۝ݙSb $+/01//S/.C.-^-]-'-,D,+++,+r+(++C+++]+A+W+l+O+ +******r***!++q,--G../N0'112:334567m8*9(:;<<=>?N@AFA;4.Q*)++*(B" tc_Enpv v W / {6)l?S} M|2.Je9e "*)+n++,,+K)-(''&$"!!!] b][`"+{;P_aq`McCdcdcbaSa`%`_^^]']\/\l[ZYTY|X8TMG?=1J%vh H  ={q2.l8:8w87 76544332021310000j00+0c00T/1O/M l^`? av E  M Z Hxq ӄҿққҠ[RO0EҘҾ~.o ЈgQB7+..,WГDѓѦџ>K*5: ҸхђѓUжѳե)z GG{ʑɟf<+~Vfxz%bWI- H/N67~88O99:>::t:;:5-M' ):מ ؍׵~jא4h} */%55.5}5*555444Z4R4D443333M333322h2Q2:221a1%111000W0500//u/w>)f.Ȟ_'Jpkȫ6*sʪ+LJd~̯6͇ͽK΄κ;uϴDtй_ѯѶ҆җҜOӓޣz{I U *4989b::::w:}:c:i:m:[:j:i:X:m::::9:d:8;38XW /qe0Y&?I6%X443*4M332e2=211p1;1 10W0A0)0///z/C//...{.A.--G--,,,d,M,U,l,u,,,---M-t----C...F/G/y//*rl5(K^-lu)uJ"֎֜&L@L`xֆ_OeyևtE0AVaB, ջլ՟՛ՐwcP( *jԫӕYhH.yB4SRV "V7ɜɖ?xȓUXޤwK '+(*<*)>*)*M*;******+%+Y+++++9,|,,,,,,-;-[-v-----.7.t......)/m//////$0H0S0r0000001B1112&2A2j22223,3O3334<4O4444#5A5g5556520&^V Q13(kRo0fމn۶/֗Ն֌կpՎM<ԶeӍOӫ~i1ѳѓр7Кg6Ϯυ^Iδm\5 ΃̸͑ͪ͠>j4 X6Rg_fx}}n~f#Kf] *1/1e11Z111112*2N222223.3O333333 44U4445Z5t555(6Y6666 7U7777(8T88888 909<93969:9E9c9o9u9u9f9g9i9V9@998888y8B8 8777\7*766z67655o554454I44240z} SW`rSX-qqK/>R=U(,٫&%ͺͼͲͨͦ ".OyΧμθε9nϗϯ;qЍгfVљіҿvFD $ 7 q   E I $ ]#v%&y&&&~&c&7&*&& &&%%%3%'/44L4V4333{3Z3%3222o2?21111g1F110000:0d0/,w**)f)r)X)O)K)8)))((((((((((((((''&" T z  ޥٶWr Z$ӹZYHwU^}G\?a *_++?'&%bGv~ \}lէ~ԤNZP9)ӔfZ&ҖvқT5bTPڦ*6Tnk :Jhqe69:%`N 4|~}asD%- A<0"Im  %-E.-.Y.l...../,/Q/{/////0;0n0000%131P1~111152S2i22223%383k333333334&4+4d4[4b44T44435\3!|P` txlLTG%.jv)c6zPeWRg/Ԕқv1ن41/; 6tyP+U#{*a7mb9]I:565Nw{ +I!/1+01000000000000000v0k0_0\0Z0O0L0N0N0M0?0>0J0=0;0O0K0=0@0000$0 0 00030J0/000'0)0000"00////0//////0 0////0&inzE. Orڛ՚ ъ",X'2ZTRhl_fтіѐяѡѲѶѽѿ,CDRnrpҁҔҚҡҪҺҿҶҶҲҪ Ӕռp?ӸҤҬ`җ  Zzb<y hUG$+2'FNIahkwpOSaFU e, (T/0q/////x//e///A//.,-+V v| '-G/.//............./...../// / /1/=/%/7/F/5/N/X/=/G/J/D/S/I/K/m/r/l/////e/}////P//[/m't( '5nXӪӶһҰҜҚҦҫҤҝҋҐҨҗҎҝҗ҂smovi\smU_UFUV@@U_ZcnfZ[_SNfRX҂7ҋ҂W܊ V h  $39Kt#5A:Xp^ge%/0/700/900 00////////////////|//1///&x kUki u xE 7ej  ]r oo i`uPcm=N+ُ |6NVOS;HOHZVRhjgӂӘӜӪӺӿ#8GEKpԔԎԗԬԤԽ$=FJith{ՂՀՔՋՑ՞ՈթՕwշHq o i o u l M 7 ' ! # ! !         2 H 0 T!(,+++, ,&,2,,,$,),!,,,, ,,,,,+, ,+,,+++++++++++++++++}+++E++N'Adb$#s 8XL7f{uzjgcMTO9JN///#~m?)E#"st֐ւ|ևְ֪֮֡֯֬־ָֺ .; < = C B C < 4 6 6 F N : 2 4 , 0 6 * * & & 6 4 9 6 3 F  "Rsn. " e"###################################i#]$# #$<87 o#^itwu}~u|znqgH467%" -Mxߌ:&      $"37FEQF@TUK;T߮ߤWQEfewG: U j m o z |      $  & + $   R S K   r d ;"E=MH<7!;+KA  *~jY`XMSGQE(s =fd.\ +H(#)!&'&&]V)U8+KhJW[[]jp,VP.=lN]Ax]m;'Z4~piha`:B8kwstylYp/xEG]AFRSOKTUPW__]WYiqomnhdw-r4)YkOlnx`  r=v'295@NEFC8Q@DGR?ibs[.{Jy zih2H_@7Nsl rH@"#  )'!#`{|y}*?9 Ns>,Xnx_~p}x 7vrvyqpj]RNF;GLAGG79:;DFKONKiI d #dEED>DGFFFKPNNOKJNPOMF;<>..:768.-=@754<?>PHKRMnUf K"?MUZU`g^cklnry}~o_O]jH#v1=Q(p-4"| ;t[7bU'5x5p^i$(B C l  V i V}~}xy>~_q<<*`yjU=;B8541.02)+-*7$.L&PYGpxDI48LLvmhz[V_ZWZ]kuu|MGpaMG)W5H?8"pD2&_}c        Fs"GsoFs>lfJdpYgwt{}}oA379EKHCGPOKGAEKC58>>93x}m8?X Yn"4* e( U  ?          Z  ;g/-l( *4B 9% u JA7L; C - J  T `yeC1RB,MT\=GWYVXZYWZ\\ckmigihkporqxvW/Ze1T~yU-FW   x , lMrk u=e[t8=ngW9&VwJ>mi=! B R p S b ` \ d e d a _ ^ ] _ b b ` ] ^ b ] X Y T O T P H K L L I H M M H H C = B ? 9 < > < < : : : 8 5 / 3 6 2 5 5 , , . , , ( % & ' " $ $   $  1 @4}L&zmM"\@_895b"K/rxguGWZ |"   # Bzo >UB*5dNYAE!R(%IO0 %-QUqM5khXyBQqQZcm | B j"X :wI[`ad_`gcaefddgjkjmjkterUES A;yJ B x + B Z ` ] ` _ Z _ ^ V h   onc;u[}.az};&!# :|Sp9{E+Xbkonswz}yy|]PC3 lB>Q6-*N-[9X | _ x}{{~zzxt{YT AsaO%pS3`}M;8ac]$yi1Y7enBP[~gZ f Y ^ Z X Y T U W T U S S T H M C {<DgBBRYRPmU4Y<rR9d2gfFw-VNuonnokqqaC]iKh` uDr\zT''V^jBbNFeNGHGGHIHEEILLKKIHLKGGIGGGHJIGKMMOQPSRRQ \CI1` KsfIlQ*IXkx ?^tzunj\@ |M=Wa+wi-ZM'_y/qjrc3  $:D8XVNFEDDGDBDEFD?@FGDDEDCFGGJKIDDDDHDduE7NbtxTiY5{.Te_jsps{ko 7T CXVRZy(7e]~Wr )kc9U1$^%lLq'(2U~*'?#2B6[UzG"5/B'Vf=arUgW~rg\H&&) 7d8/-`<B!%d"k0` h87x=^VP\jg\M<-%x=#7RFRJ_rrotve4.3:g;5)2F`5MfSt~#c ;7^dinollllkkjijhfdaa^o'!&" "!! ylIxZ~z~eJBLTJL`mgVHIWr\v`.j %{,G)^eM@_.'8]9 SyxfW4BF nMfK;5*';ACIJHJHHLLKLLNPQQQSG% 4Dv71&@4gd *0:KV^]6 \6n <x=;qJTnh?jdklc`c_RA:FQF2$ ,M@jf4Pc~rlwvjhf^[^dnqmpz}{zzxwvvuvvutqpppnkiijjkihfabdabb___`H[%ErchvjO`p\5JenSIKU]^\]ZM4(7KO>2?]m`C'x0k1   !!##$%%'()*+,--./01234556799:;==>??ABCDEFGGIJKKMMNPPRQTsCsCu 9DMg 2eF(3>O`o{)?`xxuvutsrrqponmlkjiihfeeddb``_^]\\ZYYXWVUTSSQPOOMLKJJIHGEFD/      R0`+~oYC68?C<) umpoY?8@LUBs;4,('&" $(/6@LX_ehlrziN7l]O9  !!$).00169641.*&$   tworld-2.3.0/res/bump.wav000066400000000000000000000034141475511570500153160ustar00rootroot00000000000000RIFFWAVEfmt +"VdataWk7#MCU"v!wU M x ! o Y  j - o h [C|dl}ytnic^YSNHC>85/*$! {v<k>USPQ $)-4:=DJMSX\cglqw~ %-ij H|zunhc]XSOHB?94/)$ {&%RvX.2GIh w ( n  ?:3['zX9gN:&{W,tYKB93* .D]x .Nkt[C(zdN7#vhXK=- u]? cN6wng^RLJC:71& t_E2s[D9-|wsne\OD2"}wuuurrtw~  &))1;AHOV_chs7Tq2Kdz!/CPYdn{$1ALUcr~  "$$""""""&'&)/0249ADJQV\aefjjjnnnnnolhfc_]\XVTSOMHDA=;;99;89;989;=AABDFFDDFDBDAAA?=;9640-+)&$" ""$)-/2689===??ABBBDDABA====;;98846899;tworld-2.3.0/res/chack.wav000066400000000000000000000035561475511570500154330ustar00rootroot00000000000000RIFFfWAVEfmt +"VdataBOhFSU2ID qA8}j3sD434iw(/A8 WtW4[N!8 |A J-?f1] = ]+ q&:@>(Z `e cn\}k <Y^D T { gP~iz|}[_Bմ;9b " ڴ_N; J 1&@ hA. {" /_&^K< V]  I۲f8Q  ս&ڏްum"D53 &$  +$л}01ٱՀn E?:6MkGQ 2 " &Y #o>P]{ |Dh$ <ވkd '  \30 P  J  M> |U)1 kD +G9^~hd5UR% $p0=[ x"dh^|U&Z Tvy"Q5;]+&A Y1 Lp{ %r* h8HIeG_UNR Zn8 y%xg?MRodXe.v eW F.%HFy: @n8*1h "df93x+CX LrlTEh6[ lJB[HWm~FT X?T=3K(6jA3jwlVlnuW]?=/@ 1H\&)?6=Q3uCjxH +"/~=z=xvpSFMtworld-2.3.0/res/click.wav000066400000000000000000000032561475511570500154440ustar00rootroot00000000000000RIFFWAVEfmt +"Vdatar^L??=->7(Ou'4@fA()DU&I,|)b>pPc(cK7$BSY$ 9-9sQGThB/J$DD<.,.b@Ț- dءʯւ 7+Ў5lgƪb. M 6 Wv!F rwn`O NY7_ ( ~uSP +: _?8 { k<aU  sS}R j$do"."XkdgK&i1||(6sYm#}vPRU ;*2\ umGo76<*{!/_7?W>jx=0Y6~T3em;MbLO<4 =0PJ *T P7a\5P0$SU 0JCVlJrn93_Ht?fBKD5Djs"wLPT%Rnb (GRS] ^4HL+F>) R8zCgg$)fa%| *$7+">Dd*Sp+ gFYJe%""NFF;e(x~t(W'NSfcrtworld-2.3.0/res/crackle.wav000066400000000000000000000704501475511570500157630ustar00rootroot00000000000000RIFF qWAVEfmt +"VdatapcqOjau8++Twox$h[Qo,pSLR"][0v=Iznn,W ~VBqN "=,'E9 8+nsf;w>0ln4eqDB;M01>i|an(~^:hR[j0?=xJ.S42 o^\>5 cF o^`j!38J_C;SQQ0o) o6h_[7!/O1=B0h]wfdUp:\5MY?W8)8+6&u @zGm_hH"O09+$&u%%M@. s?a7K!vRn@I-A(Q|?T~2c?MM v*WRl- (KN t<FNBBaa~WAD}v $67$4%oh. dhom6d;2u{0qnew)zFs;)H MO-fzxlu5Z;D MI_ D(q%aASZ&f+ j~sX0[jD?%;vHOD[aQ.V|02Xwx73o_p\6ldvDDao*xKx  a-DZFJsqd@z4dmvI0}P<BL`;BE%l\VF@$lv?? y yeQ BxBq2|Dc%DOZH%NB; z&iD2q@qc $qe9-Va"en+lJs--' Bkimkf@t%@*nM%bxRZB_B_"/aTi1)67jK z.7o,Do$d)2]v>3DJ V]Bx=) W]u|90+caK/B O|~ Bx&a7v'4V+]P?R@K ao2[)nKu7VT.dz;E[EhU9f g84` o_T2K0d#OfFOR62VvOu=9d nD)_4qzSXXd-o$JzBv\yWHHZu2=vj,tEr*BH hl@cleZ"T~.0?+wflS"sn6|HVF<%=!'h'dFM9VlzXHV2SeJs|J[dlEm[Awn;_2 FQ$6u+TKx\HDRHdK6_] 09MT%<r8@Ja2R]++V X=KuB9jM[+%I8<>P-&u=0d )?6lT@"ZRwTf=e|_%sz6f "Ru9d)s|m?huQs j&q<WlvDa' F9;ZQ9. mZF"4aR=]MOQK_,oSl+BOu Fz+VJ ;n HBV$fk:faP4t*x "fQ*)X?lj D)f[ $a e?_.l+OhzqqxG0.9~T+K+"Kwt@oScB<|fvh$Ao6o\`;6doxT>d{B!u9BQQ@JQTW X\<|4Iw-~Du7@ oZ IIV+Vx; OnQj|n[z zhX".0d7K6M6'$"zQ$)zc,vTEDKY%xIXOFe/ | FQQ?W m[m4H)"*oh MVKe3[DW4a4R^ 7'-3M2 ZIFO]'< c= 7+-FB*ZK svD9  g#VNQK%8x&/.. a{r~&T_wQ54QH#0q0V"c_Ar?VPHeHNo;9%7AHZI.Dl6?B-?H=H%qfRMO@F .Iuw$&Taz\\uEaq'K+qU)[AC+2S0&7=0T EHZ" bX Q wwAh&MR!DxxD2zBOjM /=O'[{O @MO_qQ,cT f~hg`XJ N 7K!wBv{`Z|wF#V+e6|+n N#T3*u*V|4VBw|K-8%?8{cUn6qixD8:!!!1+& SWMo8 | [uX{HjDZFTM97Ba3v.N)ozf7sS|"T-o4H) a[Aw_x; !ad6l hT)DD-HBm'R+-xsr_)P6~ay4'xsZ8'Y}O4w-2cjuCybd4=T=z4DTMBZW}\toH%@8Q8z30o{ ;,_47}BtfuAn" sJ6W+RSmFxKI9CshTh D=hqjNO{x  F09`%b-Qm**KB" l8A4-8FNAJ6ac$:?n6lx 9-~*]q[N0D_KQ[P[rz@<`: *\#g0Akm. K-:\RgPOR`kyr!>)44Imb3x5W+4sIs$sC3T/}'X407&%~7;O]ilr3V 7Ki/V7[J1DG[caXbH?5og[#tf U6TOBa<.+sMJ~w%I[G2.H6[%[DWd2KTMcZ& wL~cl0 Oe$;wQVdd?@$K4F9H.Gz>O'?fK U+?HVqwc?WlVb p bg4S$!A+N2j:wMF>lDz % 68$]xV)4*&~x+ Dc'/V* 02Aq u4-K Bz\BHlo0lD|ucF6@HH*Aa6CO~)? xa+. uiygx8k hl$bl[B F9 jH[%F$ y$zOQ +K z DI6 a_9_VjKaTOX'0Ph'8u6F@4+Hl50B~XMFBz0x#~jQc%fx  ,kNAFHFI]?2VOvb[4Z7J6 WZ-v MKDM7xz?4|V 4Rc4ujAj2JXfwsMZ2o?H0jR|jK~hX-vH $DK]"$.H )BxRl"@-H9q'QhoRkv_B-O w\ A>Q4_'K~[3+tN S2os4Up;\ *|0H2@8 XXQ_asV&; mz'Mn;'\ & K@]'f_V9Ll -A'2M"!QSA9'D$?+v"?2JHc  c'9hq<V_K,aHqoh Zh4j O~~.TH "'|~5|wv~l' Jl6&e+a 0@ +OKwezF=M$QFh X-"R TRZRV0-n+u%@Js6-B6H\'R;uOfK&TF3z <'KMvau%q h@Td@ O zF 2@qH&=];"%uH29q0V]xB=hz9=&4ZD}23m;U~QOq4"u)V-Fuk=w6`Ou%|[ ll22uoI#_#ROiY;h)qw[ mQ0OH_[+f0q;N[S*ue,%XFdouX~-\eJ($[]4xzM$fuf9\a$] oD]s|y4D= j=vL{3>ME47&]X|c$ \y*1 J%n/%W_<7|W) dV0 j?7A_?m@NjaNh.6;z'zFn/Me67D}>KoE?slz2$%_ RHK/w]; {ZVG0moaXFlDfD3KzqlK)X2FT ) *V%K;.+8Qf-?_[;n0(2_%V ~=zB|j\hjXgMH]Das+7OQKB_k #l6h^wyM+cT+a@Q8='B fD4*)?=uxI7a"MH"-u=cF7[EAKZocozMjO+4?Zg?_ 6__-X";; _TR7cTx 2zh0lBKn dlo7M,On]%. ~Ku*BKu0vpK=p1[ijR%e#C#7~@|Qu5KZ[XZV7<;o6>v03HF"V z)_xhu"{|eJ*:"zKX)@V]W9xq)f+";I|:8w&lcx$<iI)7BGf;J-->lr?8"-hFjw nf6x>87]0{0K "VTgCW@#%r kozzc7M |S=TTqY["0|sH9;D_R _WB/.x| ?mZlqz^$9rG2J^N1[K-F@jR[7+_-<" A+jKOhFZ"t}<8tRB2G*hc%@E+_@~?Bc&3Q^(NKwRl D 8Ax6nwx" ?F'j2[Iz'ZQ;Owwl?o+@09f]B@'xTB9@hXdMh.' f"YgV$I0\ZX4HX"SMIv26d;] 2'X027B4Bs7.xza\FDw;7f Z `n6~'O}PtB2{+loRU4uQc0o[~,Wir0~2 3+- Vo VTm=c%dl'0uS0'86TBqj%y>F;hh Fvh&+Z-;u- ?W+1eAD)R`4 %9sF|4qx`2M/2Jr"Tm6`,]fYojAXZeV1;2 B02/Ug4ifHT_.,`z;]avAeX+'R2o0fzf 0;~l+6um].uxDH?+=2Xq|FZ"$|h+_QzF3$=XB;|F7v6jIN"|Zz u_)xMzdFTzma )'| ;s4$Bmd|BhjSH|0~/60Q9 ?q7 aqwO.h%]OmsTfK2nVBh;T0 @]).O;~smMc ul uZ6qO-z?=Z$j ?h 7BD_j26cE,$afAsZh9scM!P{cFj lX6$2Koq dSWI +'20nKq fcT_) fD6D@HFjQ}f*S5MB|<N'_2 qZxmka 29Bev &I}TxkK%.==@V-=x__ G6=Io|6f-zu@7[[oXqe Vj)ThxqOj.X % ')s)c=s;$"7F.%,lI; Uok 7oHD+6[J hdl|uZ| 2f x%4TTX%1PS "Dx!oMIm!KH 006of|/cF 0 .v|.2)"D|Rq{Yd3Q7D)SHS6sl&OsWz\ d -4cz@K'e89w|l26jMm #7FE`~<8Vt)IF0N8tWVPdVh-H^UrA:8FaE|`ys/&F DQSmX|BxB_ 7Wrea(mWI;}h<!"Q/j~UIZ5R0 vy)KJ6R1%HU{aKlN8bT>-JO]+M|$X,=u0'`;.r.NNiE] xloH`^aW>2DM'7]  s_H))ahr' g *-N8cBD+~OzDDh2-I" [2H].Hmm}[9?/ozjFFJiEz?lH| _ !zzHk[,(MmRQ'e?*C$ ~EKDjf 2KIelOQVADRTd w$ ]6s]i$ZB3]F7"w=-~"I[f%0 ' oc?_%j9T)=QlT46~] qm!@Oo,[qk UAB 3Z]Oqm`,UNc6KO B6x|F0x x jsT)lV6l.[.|V/']o. cJ2Zz\x@*DxEQOd" M9OV|lTdqq 2=~=--ZV BvZ J$@+_o62 X I$K-.]~$9V8f2+2cjT4_HnaM"{2azF [KO 5_-6%2_?+$)Z !x_fTFB0 al 9mu0qaOq=9 ."PJ|A9R Ma :UR/y~f<z;m'Yz<_)S2MbtFV? Q=a9#7u@ 2wd7l+e T04| 9?66oVwTZ{sIhW;Ghl_J_?]62M+ln"Z0=ah[Dv 6 0a%z+'$940ef#E>s_8'|a\&.zFQ$xI;u-.3`Zf9w O*WwGp @`vh!u$-_ j'hk o8u$n4 D"T q4)0t3- ecdn4D89oZh`9u]0 ZD_?fND.luHOq4a\fZKfvaz +n hsO$esluu`h msO"'$ 7Qx%*| $H!"1{8OfHR-mj.0F;V.$Od;;DnssQ Kl_|~W[?+|7]KH+6+X| oB~v2|B$"V8_1vh:<OO0a\s2 o =x,xeD_-2X.Vafv=P>A#VTd#"r%E+jT/4BTcR)TXx~B"&64nHa /;a|9pa+=vI._qb#*,H^Mbo_hvs mSk<B_9.'T26xO@AO //a'2"o~7R Jy;z BK7 %F Ka s9'q%8-V?vDmMj_F]Z+|~Xafnf~JQ"'"eQi%! %mY]Zo90uUNS0FcHq6|~ L$+O#792 6dD@7,I.aD o![;@zsb+$aVMjH.?l8DD_!ywV:lMR.]&/BRDV %azvc )0.\9w[]o]X"z-n0Q2c- zS1MV|2[7he@+4"@tworld-2.3.0/res/death.wav000066400000000000000000001210641475511570500154420ustar00rootroot00000000000000RIFF,WAVEfmt +"Vdata2MO9R $O" ~94[zHd=4'MVdF+IKR;F=@xzOK 9 w].ezfox7?R|a MX6e; \qn sX67_22 $xxcxjH67nx.e9F-sx fd$dM'2o9Tm2o-\$"47uB;$es)9o?"6@2F-=cq79 x@@Hq s7Q.)q0Z~0h|BM_qXqOu>N)0o%TTx.m-lf$8rS8H6.6Q]<3r'VZ%fBuoZ=&lZ#QH$9B_72Q BqV"- _0dM~ ]+m[mN~H H5q0iW_[K*>!p^>nXl OM5mj`y5N4>tw"8O_UnHS4=A'r"?T)QCe>%wa+jh|VZ;Z]XeFQRB0+IH/^ENTS )NdLr!Eh.;h[& JGwsyX _~F)x=;JN!,C\q2Y4h,H)b92RN.*vOYe ~ {!n@RFe{OjiIRT'Afq%~J,Lgf"; c7OB1r< X9b<e[Gv,0'p6] OGUNK Oa{$Xr_.  Q' j:4bgdQ^tL"aN r M4 (c/B+^ H K,\ c iD_ @0<_{GL%xB mnxp y@r ` &jg=M fP~ f5 { a] zK( &EQs  0  &;^\ sy$* K\6FUDFg7- " g|  $ pD>$N =R9Vo/=R y n2C2?  #1I A$ W9 zݎ9!=}L  qz  3E 9;cK!X Bw a51aPj=%  91مٺ)[@>8  \#g$S,P߱!$_DFeDT .  K)ךS!W/a3gy%bX!YX7+ :(Wl  mYO(زkE qI ! Ԃ mރ 1#] : }k< %Z>I wYOCU&!J&\1mT+ 0  Z(VɈ&*a$,}10Y ~[| CH Ks ,mIn;V1' >"':= 4 V  u)@+*]dSCݮB   P { 0 z.\b}g dk X%lȅ? 9K%uǕt6-ݲt!GO Hu;U ft@6cᲚ'&"ȓ\?D1  )DD ?!3I-ЂM )|| q ] 3!}^ ,H \'%Kpjqߴ3ڸ i _  ^_? gaL,) d 8ַ5S   p B:(  ,<<U$ lj S] !>& G >v1\ F5&˕D%p3  yRR=u!1_zSGS #=_ ] sU.X&;Qe(X) m GU > $uH) &yrgu ['  a ^Wm  %"o  L ~ /ѬST@ ձJ - I 7On''3* |ܴuUŹO;t L^MTyr"{f\1@. s$0& ys  ܮ _O#  VF9 j({} >3t܄h#~R   tY]\"}]׵6  `S $W q^&_] ZeZ ;n(:K?*5O"rkqap}  -%;ғ 3] &N ^ޚ`F96 ??-fiR* []Q5Y |Ư-608 -6t|ίt$']n wT 6hP} ,#frР$Ԗ w zrL4:/ ;f~ o V*ctR۪nU"|ۦaJ,t E}! }X _ AP; !e04{1a h[ \x \$# @@f ( X O*Q ci $! . o#iZ)2T8 &'AZ e~_2cNϒ(Pԡ \ T S]dVXME~'ZJ" MX q4 s  8?ۅ" Z ܛ  ,b2޹ 8Rpz_ "Pb$DZ~! % m1,-{(rjz_:= Ja~ u-s s xfC2Y%%:{>Ov~!-$),Bn  &#zhh$fUH^۱L Mb 0 F  \LW/q X- S$ l1  \sc.XHI 3   O v&g[."c`b k f @ X$N ݇]?5mY{Ib HMyB3TOO"92`S1B?H ZH7 S ]>l9q-'` ]K ] #E 3 zM =!$> e  'ZtD! H y[ 1P"K/L5 U[b (CT%=VQ$ hw++T X61* ]  M F +<K; l e8>X6l tdANhos@, w( s   9zZ i7Pp n4 r^=zty(%A#?] P \M\sAw< FVRD 3 rCyQ1VA< faA 4( V sdwA. x r :(CNP jv J p 26 w{0tu]a2 PI(| % U? ] ?bu* T+b\ ~ } S/c B y`o/WJ~ %v\!' gl iW])n _7u}'tj E x]7_CO~GEW(#Q=D/S B3y Y5tU\Y6CPrnz_< o. L [ Jb>q f)RdT-|CYP <dEEw ['KIWNJu2RPN>)JTXv|*<06|)d5 U%d2l'CT^KJ}t+@8fM(bV {(=/^g iD[Td/r}VnQrFFK%qm5 \%e !MF_F}h$iT_} w;@JH1R.x2Xl{8RXpsAKk )x=;v nHS\QQ3hBBq5uOe9("$Uy[>/d'tD$!w| )`05@[}h[RY>gUL~H!>Sn 5KI%N IO8wpR"o]Mt [K_#*} gwS`-!m`[HzWI_)%SOvC[6AD/ % E9q}HYE#rV`PAd)D5@P= Y=IWE'`Pg]D%;.`fVN>vWD=~47Dbf_9[7&?>ek2if <.PA O#{ id2qn~6^8R<At*^q `w`:gmKaWCDn9{_$60;@h<]lx!dfds<lr\ [Z jKt*+?m+x(Bj eJ!y{OaZ_Zb_Y IKjvq?7!B3_DDdl#$d_dF][ !u'Hms !0ZZ% z ;4bYAQ y>Yw0:0oHb?ULnsR%K; ` ,`~yQa{~ 6[j4WjfHP=#lQHr94]BR!Dt$18YgFck`0v 3Ruj9c < *Scl>O?W4O&F \f- k5F &{td i]N 5JA4 $u: zfhm8$9iM 7$o'Ui   8Cf!ycXJ nKZ 3 Tm&UmCM 3R OO Y: )n`@p0Lxn59Xh)3 $ :e`^Bn XOz rlh-L2I'?xo=)-e 5,Mf ylC]l!%/ d9;7BvMDyZ 6}+( \X1KLjc9 . n ]{,Mn})5cr x !);x *,j,DDFWJ S] Z\e&!  6tw~1dnL */ nV^0 ny } hVw : AGP qt' [x \N -xU+l/) sH R'5[<`$jR -/j  C|w6ip=b ZI Ll %>Ac*Mv Vr [(/?^K< Ll J CJb+ k,bx +t`X(%M Sfנ : E+7 )b(S 1!s e# HH5# X'c={>g  t  %r-+a!jRf 0s`<3M%fSj   --tԐ*3R<  LPf , z "z [tR)(J͢ e%yW! ($HB$"`7 lCE"B)t:k*{ tKPH*h 7w C fb"%P-")uqQP u /[[ Er g i =lI\#-ַ % uxmW{dS Jf v1 P   Zxn'wb Ny_ےS:]8Yd4-#(x ` 8qK.s%:U#F O i | I#O@)NȽV!a*,L %f|0.+h@)'l _O3!n֩e7|yP'=Ux T$U89$P O1*c .ؑ $`´F%n,̖ C?9B <5 (8~Fp؃0t0Q#|TV{! e%F~zrӪ!- }RK)l K /}"+#֫vA b b W. ]-#:' c-;_*sn iǻ%%2iC:5. fIϨD =#\ N&V8'h 3X}@/*pO7  8k) <eϥc T K 'BiiL :2)! 2 g r+a1'ob<9 WEp Ho A V k*' ݔ $ <L^dTiy8O/`Je"$6 ԓ{W=2/  ^i)Sԋe G{)3$ֲC  Ԧ I)OD fn -Ie#=AB6 ;70J⃲ N4- 3  hcQ9 #T2j!'=U7"6@;͠t ,  J I= w 7As W`Da jב |X$l%C  L1hMf$%i)I}!&)a!{ݚys{r9&LAJb 58 $")o҄ ?=OP{=  l[(FC|?Qz5% @ 8.P~W v3. ]Y k!DSaw-Hs5Q|@Pje ?I v'>%Zz   .+} ( .`Iq+ $y. :$l='11Rr &W"oܶ j Tێq 2 gl7Au$.EvK}\-.D X QwfV$ vT f 3VY"@ eB]g1=L#Լ 3$+ޜR`W3N| {Zu I:*joO2+|"D Rv\#v+"& 7i Z .^"?##:{9 #yj62 `Ql$m> {2< x 9Z E)o\i  | 5*Yg; Mg WcXb j =\  gJ2m E! % /, `%ܵ |Y; Mw[M !VP Qf ElZEu4%DxY Yp7. ^I(-k  K"F+s %  ?[] u `3={J^ kV^lygG Ij D8 6hc]=S[3wzM.ULUL ,[Q|T=+*kj% R2\SJ-8 sBBKV >+ t7y)z (K"' 5% zw ]d ( kj"hN` ?dph)C#PD `]($  ! &n "3G= ,"uK.l'lM jG_ 75 xe ol Z  F `^tRMC]9 6a z2 QrFz* Z)z, &$'d0L#RNߴ t!wF _ :&@W?X?iYdu W{ef)|]1A -15 ~ m(,Kܤ3a JЕڅ 4;" }5 ,.e *RL u nZJ%N{^xiUo7>Ur* F 5 " C\ ~ ] zV q-0' tZ;<B!1H R^ RBmRD _8`   cc rs /|D:I3.us+pli %(Gg]u QPHC\a%GJ&r|vbaxv2:ED  4`  r< x7 ;3 afc < J # ) - z  j$6UXq!rIX0Uh , Y W JTW!! A lze2` 0Hl.4I "x  d- #$o  P D  SA D &  ^Hf,*VPN s ܷ8 !0H@H3UO0"   Y2A! \ ` I B P:9 =χ '  n&*}e  Ll dWA) IZ5Tljeni~ C0,!2d*ݯ CU0  IE B1`':<=i . )%Zp _3 [#X_M$?R=W7 %=Fo  w/# /TةK(** tʓ Q`*__=)~!j^ !`f#hvE Ux9  "! r W , %f_Q :/_u% ! X , vJM?asf6"R;m>| vsY_< , P\% ?V.ޅr I=? H@;l"M I12K B9rިz % iR Yj", 9U _i;Z!\?^ zTMD eG_,rX Zu4F5y  [J{#h <6g R  t9$mU tc [Z  eAQ i.lHDD 7]Gc3 0Dۇ: ( n{ 6s wz M!c +V7Zzߐ  Z_;If M &6- % rh&"Kd V K? B7RI!4tc 8 G[$p+s ( <)S*7  :~A| 6?v  ~ * + ov 5 vO(> z/ p t7ZSH *",v 3 ovv  Mci M &X  `? >z{aX/HZgyUPR* "Vp g fuikz9a \G%]߹zPP=]#z2 /9  {l52\ |z7x ?P yJ D A@DC U` D: O7 'r fWAo [5 =k i -0  / 80,5 $ n % r  !-,Je# V&F N Fi$   V 5s"3 A8 8%0Z A 2%le. & g f [k'qllCC &4, / 0  WF3l W [L/{{}4?'K xܧt+ :-I{:&4 ]n &_a@;ۮA AdB' j\4 sY! 4  8- Quh!%{f+MaAtX ES 1~ E;ys{FPu~ N  " M i1,:uNxv *bl &o [)f&$fAgpt>f Y$ jVw C *>IQ> }%Xfz ,2E"C t m k+KAG!@dMXyi?( $& t99 [t i R  >.P ]a ) y3y 4F}  )^X e`cb XYA+b k YB >{9 ! n'i 2 XY$m ` 2~ d0G _,` ZI& ROk%^>BQC4|q 8* < / ? @d A I *  sU-@ ;` EH/>7 . o/  &* Gw jP  pZJ 5l~B +a ;4D \&y/^#~ t  lxo ('jn4R@$qGt)@, %%p l0) o$` )b j oRP"~`&sk_ K @aM*} _ 5/V  , p[k :"y wApsjqpWH|4`9Q +Z %>) >g@b 5L$ 3(  0r2^ d Ou  l B% b}t2.Q  W jn' J?'y +H V   f<Z:6 , OALe\  | 4 rH t * *X0jmyo1DA D5 $Wo Q G3 Myu+H l c9 6O_8Z :27 \  'C 8 E;T'8Y=U 26m kE #f_rV.)n=]"MTO @ 5{ ' P7U.$q wT  EPZ4L%f(3 I ] g?}B7(E0URO  /P- TgR;( E@lZ  4S^c)(oeW& D ZS rcu\M v i Zb( ~d\",S  @h W hX~ $u&~ < Yt. +OK#Pi "K$';! f $U |^ e<&_nd Y=8pgR_Z E?u:Yv<{d{ 'O #B1L"d i6 f <z8\ 6} f 8~nw :X?L KZB -}K=B1XF }L)j Bu- B; J w 9 -xA5Ep `Tb$ n 6 D & K 7[UJv=Jdp lu  a."X'Y=Zf.`/:4n f fX +uax!iD { |J}B|eH X6* - - A !" yA]Eng-YOO%5t q|{YN s `N p>Q{,}:nQ  p 2ruJ#z$< 1Ma [< _ iRPfQ 1=^6?DZq *  :-I >+BgkUD z2 R  KhUfInMC*i* gJp UX !A2 > gݒvec8G* o1T\> j!7~q  !{J\ ,7? + N #)< $ 0 jl =O63< D&oPT 45!. | cA }'s \OC | . a B: ) 5:UEW!anE#Z* Ni ".z 7 RLM1+ Gmb= ;3n?_f 8Tye m3#.Yu S;BK>o [OF :8EzK H *?DG !vbO_ FP$s LX"W@Q U \MU~ 6rf 7   n? `" {O$i "hUV^ +j` QPF*q  &a e|S~_{KcOj7 Erpm fB4  "p٢p a{Z` A6޷C'nzg d}^? n F+qxM4K W c{b ImD\s5St - t43 6  Xg  1z^Fa( /6   | U OC tB:Ur #V }9~W[Rdӹ[:m2 e _B'r ^EhJi% .+bg 5 Q a 9PId % Hyi@":T  ) [-3Any @#TQ_' MiF %    i?1yyg . v2t G D5=KcJ-C =~ m9g;*>z  ,.R4Sn62Nu[ \? N2j9u #+ .)^6)e ,*W 5߻} X\ %GXU%8 y? $f=uy$- C) _  _ $=@pdeP36t\3bg-   :L *)O Dgw GL o5!>Y k;:0 5<3eMY$B 2N s ySh{*9\%'C 1R( vgT<&_[k  \ .!|QJ=mw] yq\8&NmY  z 0LI u[ L y 0I Kf] $W }iy< Io 7 sa t:OW3um} VAv[  HpB & iM tRI@ /` cI> dH|9'3_ 7 A p9ax Om|>%2& B  gtWB2 ]G/<%fH H h a`]fP#0QA2P d$*!y .mc  uV_Yw S? L_0i/ t  >e~u C ^;g!` rAMv+lmB RN  (  ?O% 80 iZJ~0  ? 5 e3 /Ee&hzH >& #WU5}B m:<,u4U t67X?$ [ ;  od!Ni2J2i!i/T \ U_dP>xT^aK Lh vZ8  6f=K40brzPr= q ]1@ 9-C o& : iEQ;oS /J Su*u: Ly2  /*_ **  X  Dwt6M4I( \s4z n [&SR Fc)S e;t fuWS#>A bjq2js !rQ uM prX >#4p CRkB#~HaM   Dg %^PjPonyT{  ^x#@m9d'l5RmN nQP-* Z (%wx|4* lS ]f4d L" @ CxZq:a~ b [ a] !" O>?4@5 c;q !A Z VCEi=9yW3Myjxo' &HE*_)(EfiTa2 c Yd~e:PP]( e>s7:s%-~V Q $`c/L{ -'y v% J9 yHL fs  d7t Q7 0vU[w z9&:{C p` #Q6 b  y5]pzrPO J = -(Tr y f0jYzr6.0w2 qZg sJ x/ e qgjo-\;?W":? U: |( 3  0 Lh@^ Ao ?eG[tY$| hN ynu{P47W`  -m!va}We386f.zja q oMo } o]288f<y6 ][ q ~'ucSswyn j=pCU Fjk Keu[Kw~nTC <+~L,ba@/y!7d)?  Lm.{5!7:='=sA !H|jX}I;\Bs7v% c[V q&6[)r'|  M & L; )]y4R>?3{FnPK1jt k A$ )p} 'i. fY V E.f1Ez; e 3o':MiD< =33{0*@-\n!:5 sBxi+ T&:r < |yN\Gn,Z`by l0 { Aq T3]}vp2vfw W0 .~XVD!DYn;&@eoC.CD *A9wE 1?<A$+\K5&a6) E!-uyz?<\I_[HgWI[/~ 0e cSK7>}mR  G : q<$>v t.iK !7)UqQW>vH4hxNv a J R Nz b,Em$9kt  Ji VW O48`Ca tbR( 9@704=xdsZL@ VLp0 R|Yx* 7j<_9(k+] tssa`V=43, YbXCO|9V6DJV"Sx^&AZ]m=Ryd\?Ss8sX8QxxRB,^7 XG)"sMAZ";)y-uk AO  P-eukgHttC_SDq QH&.; "q%}nZ\ &W.=hUK8K06f/; !X{98[|$\_i>w^t1khs[KeGrzhBvx6:S8$dv U4i%h*}O\u;t,I f9)3Fa5Vmb2iLi/KHbqZZdZxP+#( KONEj@Pu .mH#7ezE#"E sq10/\a% TIJkri+`S8!(EJa#7e%@_V*Z8Q-C0TX3!|wxgXe N7?76Oc"t4:_w )EE 1bzG'00'87yb'<R1o~j;8>[)c\=gXlzS  @0XOhZ3OD*i2 *ofP; E8ugj'A36'09orq;~[l9 nsn$~4M.QBd4KB= F +"gqnzd!h$i OoZMz=0@t$8`,=Mngnv0]f'N`~YnwZ1Wz}$Icqm*%@ cI4;GM$`4erJ+,_.{5(K#Mcp+47z?OTmhR,*q-y`V]'fc6 7oD/DZlC'`8~~/l~qu4s+0IELSelVuhs9~^P|?zlw;IO_o R}.#TjIK]Y_3z{v vqDTHJXZNqcz!,2  ]-2!0.Nb BFnOZ|JMhlXwM$M+}M8MOzhvE-[3*I.7}3-\ Gzt kBy=26QCn83c=1yo|5+ < eE1{&1Bd7"cmTM@^|KlNog8K_ _Xe aP6@ ++/M7NEjl qOX$wZi +IEN?"NlCV kRY#HoGN p dg x "t;tz6_MQ 3D& KIrUM*fn4Jz/D6S&8}| 8+9Sy5Vb>i' d-5R]vEW#CM'lrd$loo,z{3yln`nLmOyn/HV XM q#se$%cT5S$cX|JVj'> 8fLT90;xN|:~[y[S*>o,N1<`},Y$d o@qHUMw+:AG %T'Ed-k/\z]  S; &#c~(EV$0bIt *u#aW~_*mIxJ+osOB21KzAlSTM@nZ+>*wdR""R St\e/)("bM&x8 wUeY]5&*h=%h4] 1v7Tb?lk m\[x(WzmM;; vbmU,.1vqWuj?\Z](@i-%[%1_9(Tc]KQ 5a;Py  l-Sy:PG\{*Nm5+  o W}?|yB2*XSStk F4zE7$(Z7^ G(u&!D:-e-$W?Cd;vb ;Q2i+ 8k6  Y4T*}>k9I7$] |OdW.*kCgHs&>$"9Mw5A(OP359lRPvjX?RY N[Vf&?V WL3m0<U Nr9!q *x.+rmixqw (]2D* D <~]zqN]}0 \O-bwggI  1P(O3 fy( R:\ Es&  (@.Nme4g9 -o%A#-  Sl- G3gT{H/y#S6V C"f~Ivc6 W`{'v ' Q_!L=d* r 22( &=( E$ q8u60jB ]nn _KN_Y<@C; e2Rr; =2(gZ2mRY  {pvi_/isoR\. , i=hm $IS : ]F1cB 7] '%btH cG+ P R:O %J ceR*M {j:Ii. mMme  PPIS8x 0.a$n bK(7 zs9W9'`:C `{/ F N8  [7-E; X=HX>& 9 $5O#? E` 5Z&dU 'uh fa  U4 6xQ79iv | h,}r ; o?   .n^ m\K~,  (&u p rGIA +  Xp=8T :  phA/ {ErH?  M:pW `VSj$, Vy8G~% J [ +boutQ  zE<Bm9' UAwA US |KeIp E &74T > ,[_, "5N: & Q [Na cHFT CgJO F ]/~D  s-~p} J.& P |*1:> '8_ NK\  a}AQAMgP2  'N3  yd^1sB@uNUAlwn@<3  @qfP  d% f !sDae}\ _ = ' ƚ0GLN$\d;oDm0I6S" X1aZs ;?>27%b̧?r1+!$iwϲ9Ų17&!Lki?ƣ5{('`^ bƥ8)Cp3N4>‘\u "#- R -(*6ǐ+m ']|Ⱥ=+~'(A!HAo$/v7V>zn'2 Ʉ׮$+ d[89yX#3M \̝҉xZ!^ 2N8;3}n"1"h0ۡZ  Q7I3:(( f>>V%g%26<52;7(":x? j(') N4ª-4:g!Sl-D-,̆=9fu&]2%5؅3?- 9:z %+ Q˳/9/߀5?E)tRY6|= <**7P`2?z48"qQ#:'+S"5[+4> }01!>ިQ&.$*F;4::iٝ ,*15$MUZ˔˜_D%1l! Z|0 3J&5[&a(ٙ%-2#r//[q_$h8)-"նłVպ(w"'L{./g$:-YhűTG #j$K./б@)D?/I;$w# t //e 0X1j+;5TͬGz L' a mhɰ/.'А3s3E73M)#-!_ -Dg,0mQ s54Ĩ0t 266c*),. UZ,69 6?) ‚3;rmH+-#'#Dz.m8`ڋ d38& l7؂#>)0o(!s051 h-*5c(z Ǜ<Ųr4'93e'R ./I(6* I@%ȥx%2"!{}ʸ+y*S9!%9-'-$ -<[c*y(8K#_<41)?b͡9"(3~Ǹ)({&4osӦ>8- | &\ *")I-L6w9B2u& -((#e") ,j(2@ǁ8ɚ4^.Dƥt "-%'ɹ)(M5LȪ7xK0.(91`%]>ʼ''-Ҟu621E c.83,1d&D R ) 1*c5?+B81T9rr,]2*b\+/v0 :+,k@6T>0V)5,8ʖ++q~*9/Nd:s"8'd5(P(=)&Ƥ%:#1~H=5ΈK& 2#ɩ&d"#>4KӤ>=aE+$,O"'_t%!ÚR$"%9M y<6ĩY '")#%%")? <p7]/Z߀ )%O<ş'!3"o0=W52)? "v.( l&-!fe4>Z>SƝ-'Y߼ 'q3)oe$#P,6!: M**à\,4<*P#!({`6ƞ3Z>*`0Y.5@-s#&]){3F0x;/M6),60Gc'%?b-< 3v4{:Rgr4*F8.m&! 0'<5'Dt89q%%'*/a80k w!ýI4]7)=(U-ŃlS/<93g" ?7/\7/~p.2w -:4 "9(?:g ʻ35vEL**:0!5#2='65ۺk'6+q3 !*m"7+1;غs%k2);'2"&Dҽ3)66Q #/+4žU0u(Zə)d.P"d2(J "0~.Er0s0/<(1fȾ( 1[ -%51Ȏx*4Y3}H2$o#2՘ *]:2Kʜb959g> O74ر/;f4;_'\l|;vf47?b[')6/'=d9 T3h*Kn>Eƞ-S.~,a=N7r>.3$§ &2/=Dt)8;}2uʵ^ B+Ľ%$;Ҿ3=-^7&27.Hl )_ ʱ+ҟ1&0Ъ %3k.b -(s#0.ϴ,+x #3F15~ '"*$՞/& )Z3$65g /)YJ0э,'!)Λ )  *D;% 8KʥG45,&$ '<"81&Tɾ(8ً9, T)xQ%98'^ Ȅtҡ.= ϼ#-?8$:y;(%W܇n=B>ve&N>?)0\ܩ+29-4?O+5V*̖2O.ޣ۰3e?MZĤ 0n-',-K/; T#1 t3uh0P}}O*@//=(m+3/1d0}εق$w7 1g*x9 0CǼ-0E2վӃ4=%d(1? ,QC+B !Z ז95Ө(!U> j)>*f ]vb;? .R's:-&=<+ iր}" n]7F%<>-[ȅʬ[C  6-L%?:Õ.Aʬ# Т%W\lìH@W q7qoq)Ƙ/̨ )v=:.r'2C Z5ؐ*lߦ8nb=r<2>, 2M@I5V TS n(wل6<P 4>͠6 R3u #Ҹց7|6 !>? p2W4 M`Fט:;!;d #/9^ʹ1 l=ȹ@e?: x$,,7 'E+fž0 Ύ W[:F$43܍'ˆ0 Q̮ 3ճ)?! /%? m2 ʜ ?ܿ͸{-,(a%>%4w ! D[?8#ܼ3J<@_ *<ѩ6'ǂ* O5n05̊!9BҊ >'\͸ 2О h0 -]e6go B:U ·! !f+ fM)K:5Q)067 Cl%d&a&x76=/4Oڙ @P#xӟ%vöʹ96,T"j6&]z;gB C;?  $tԸ*`C=qР a *95i¸!o$1պ-j=4|jI$%h3P{t/j'ځv 5%8λ2ߚ-) |!u̮/FƆo$ml1)b+΋mÞ։mώ-#ƪ'hãVd+a)J*.&$J[((yҿu<+ڮ (I#ʟ ȳoҼx'/ r]%Kά܍ʘz "ueb!#P)vo)T3&Fded.di!2KY'Wco81V7"f# F"ŒƳ~2ؾ'ҁ"?@A\*

(st9!m0*S;%wq!- W?49":PrΒ! 21 94#3"d$'-;7&,I*$٦$< &=* X'M^ "H >H/ٙ)} K>:1܃)i;r"̊< U0ڜ(R> EfI'ե 9G-d׮Q( qa /5%)ӄA(b7902%=k}Ҵ(faF-=w/"α(l1=z4 /@1!XЖI)9Zۤs0" *܈ -!32'ڣ-߫M-44+-c0o j*\@5.}yv18+ 35/ 0 hZ/P֝ 0,۶߯/6,,a!)b/?$(g$/%d$4!~Dܝ0I%-X 2#Aw61$Tqս22K&"3&5-)/:P)'08'?5*vn+;_:5)n-9^S(w8\|&+1N8K;>' k"x(Dde7bljih.$77>S! 88\Gx\}sDr9i?ԉ\wܟu:d!ݙO2=a ݝ"MbKCs@&bn<)Ac#-)3SJV&H}VIϚe"۲*4Ɨ 1ؔd3((^'Uq?L i_l(D߶y V'7f/Wأ KA'k'ֽ3Z?֑!D0՘R*%]^*ϗ=E'&̬4O Ղ$CyD?OA  ɍf8>2>n|ۄUMʒ3?q-S}w^X3 eI 8_yʊYЕa?Uw+ˡ҉čh6EpqpOa\(J3{\5f!=f:݄ &11?pW *d{)f8šjYԌT#<7[ .IN՚0!G< ? #PN J?+*_?k݋J0s)2U„F0l2[*:+"R;aM>FjJ2u8:!:n.*6T 0c3} 7_82A $gM 37 =hn4[ )jZ53 V5 Z 4le G6l<2=g `q,GK. l O%)h H5J I$,"hl&*-V *I$-$6D M3 ; $<)<&mK'F _( 9 _9 ' 1/ / z$B dC $Z #iR|*5- C2I""0<~%nP,) 3 ] 4j! 0> # 'U># #/x!u " - 7# x 8n zJ~# $ C"D $;%6 c2z0'Mm4Rz n6.7I F ):()9v)=.BR70Q=E;a M=~41K=O'h=bd_{/>0qk9X~*)wiz:/` ߩCEʕ cq0^ LES! y *vu](6h`:jф~MJ7I&i.6t1Ն mH"*Ϡ#$.ܴ&#Pݧ(~QҪޠ)!=u)O/8>> a)l63>d,r(j/$!r=2*!3n(?$ 4o36;k4&6a3%1h2.-2+v3&,Pq6+/9@-pV:.30.==0-.b ?(2B-K?$U>)7 3$o?h?MN?mS=aFM= Dwt=<d ~?<=!Vb]' $? 8P`4-384f8Qv=T?`?60f,w12Sb4X ([ 7:b>':fH/?g-L_p#Q3cVgRMY5]K weAe#A:!D?2!;{,Fu(B'\(K**Y(l::#%G "c+Z+!"b&' ,.\F;`(*Y'[28?? jC# a6w%![y$Ak&c)M ,!R9/*24%`/K:`/>2}4840au)6_^P/ l9Io2 j+ X2[#6~0~OE!<9LC#T(=R/-;9Y08EA3g6<:;j/q' #&""T#"#s jw<Q2)$-< 0 Q+"# "yS[0?m>59+c0&"E,t%$=<M?9 ,P/+29?/EWI6k xrc(.?8:0.-A--9/(a?q0r^v# G?5^D2J8 e16N$98>v  M"E285 /CPn 0>p= +$ CA"tworld-2.3.0/res/ding.wav000066400000000000000000000507701475511570500153030ustar00rootroot00000000000000RIFFQWAVEfmt +"VdataQ5B'M=UC}VC]ג,*||EFqS.T:2%Oγ\K| L ~T62nDH#&30#M (&TR!4= "  0 /;ߞ".*I/G؟e6_;tx2k6W[N3Ii 4%TI(V!9{@W S?V(b7l{q D[ZՈ 0&5  #Cjf hdoZr#jx ees& Z#۴f #<]gob;df6 JUO2'hL Gk g ^('6d%6 w# +Yܧ .f m ݉ s!} ݚq P, #؜R >Jd GA2\0!H " ; -CZ%nY&Cb2%^i) i r H *L} B )gxu5(v< 9h}t`*$ J {Ay? gqJ x0})! H$J7 aU>J Q-Z'>x Fn Q /NE9Ct- 3Y66V{W.9@LOU o9 rT)g^|e{#P  u[`PU)i0S ^ v'vG  u ! d& S d4D8u8ilc.( _1HZ#k9 ?{+?w 3_'~l?jg`l* ~%4Y S@ U+E =aL/B.Owvytq% !g :^:Q r@By ~ = s # W  v 3 h H v;P !k jNl  7 0Ki p J8b1 FO?8 n3M2 k v tM@ h p< $tng 9/_&r>v q _DpQ5!Q(`X ? =4G-R K r; b iY# ,fCG ^ cN b[^S 5A U ]K |>\#da>} SV rNAlv^ M_Z &7H y Iz j q u* j0m h ]w R2p Q }^j p O$ 6 bR I$CJ%: 8IL% u/ bh M xd[zX}\  yeYi Wq ]V V8# H I[R 9k g @]z r~&mi5 v +(&Mp 0X +Zb lEz_ \W@ Kj< MJ wE 2t> ns` ,E{ FR >6 c `/ M\kiWN5uHF&T6!Bzl!&|OSNn] K&/vI|QvBuW V9PIYsiL\ge `2LT*ZMo0LGA<z[V09 r/= lf)P[Blu8Hs/) {5<Vo3 N\9F3C*s~/{@moZ \? .D^&hKN+sAt[SI@7&t9w(Dk]kK< I{9B+G]&6E}NR|XW8+zrVR)5/;)n @A]ND0(']-=z.$ a\DgQ2^4Tuc#Su"%H1 j-v"IWL9KtD *fQONc # N7EZC:q{X'S!k7fw~8)3uxk  FlZKjBF2tI&a&&jk9/3bT}opu(E {?uO&E33%6m#m%ax#Q{$\dQIWa~dFt4I_1!StK`34#h<!j!Z)&o+0f~I!0qBbyd@Nur5:&sW%<YAZ]dGdc)XRv`Iz\yMq`-Z:JH-Di  /16e{Po vx{QUzog[foi= h`']#fOr"@g*ne&I[&7\R&zec_e.>r{W%/&`7|1J_fC~bfii r< Dg?{x x-\Wm~ES>SyM s| poLs!H_W"5^d$d1co)N{X4's:IEVT`hJa0Pm=t6" m-}f,s eoT4t6/MDu187Oq$ &fvvmGtBFNumlqPI;oH{Z8--^N;h!cGqV!kH%s}u? 5_:3(<yOFhw=M_`8.M Z913tT(:v3t%,a( ?Nki y3tjZIN I\TuI,L2t'E$2*,%so!\OoXg+)/gg#No]6/:%t0sh/"Jr,R P*"*xJIHu,\)Ep{_5r0lHD<'-Ic4 S5Y.YF?K~\A& |fwg \:b4;K;h+| b@c&f`qRm"u*zXP.k <b`"ff$"|2+*nQ# Fqd`? 3;)<9;!Re_+[ml/`/r_{JCO]nKMd>eX[ -L+{pC\B9JC ^x$iI]az-a@aKEZ@&RlovAc7E#,([]&uBtaP( <s|eVaCC&h&s;@M?B4eE?8l~{o H_\/WEUjq>wY0ZXd< q|ydN6 W^9d$Ag:U$]Rs}4MnIgu`Kzl |#7#$,EDDfRv2 U(5h  $xTo}n9_rj]e}0gcrB lLVKpP n`Jwi6&+xyf k?@4f{kA'  q}:9SPzpr?M s":1- 1gt!|k@O,Q/i;D(zm6 }xV9!D +tQ[ x8OO\B^ED7}zmQ7d@L?u;"#VK)-m|iT:)H$mzoG^)L/3f[mWsDy/"4`4 HDUOc]?A\cq'26FP}\$7)/$mF<u  SgnmlCN8-'3Ar"p-O, 90<l^=)h)or32oulWO~$agERSA@; P?n8d| 9X]|HD2f>r@`??9Z; VlN6FU=!#!,h|]vfr}dOzUxdVx'_ L!"W.yE| s$otI@ rT;c0,%lgo[,)A6@T!Q#H+Efdw%fK(l1-: GIjxd J, _t^;1@ B&XNw7~*fR9-m  ?Y o]BO5POu+=|&ciLa&P=FbePG@*V07`1 pqK)H(upIx[ZKSWK/72oGHU, OUNZcy8?;?c^RZl?6YRO8? 8pZ.HJo[x[?8'Qop@Apq~HV 8y{R=+}d7g Igx-]gyPBU #iK:=mtL"L;<~q`j*ooQ=DdEEG?]`K<;4kqZ~'(OU6Gx 9>`sfcEQm%(Qu)|mHZ;H:n{*&\lvy1Bf9<4a^Nm,#Cq-7& +w72;C#P$ !h-oQELDBTCON43V_HJSX~mN|m*Hd>f ^"D+'L\-041r NoTcq4NKJhJ_?+ps$^gi=9daXzPux&f7 9;l.9Gfd2neu7E$5czo99H4o<K]?<T[PZ+M .voV$% 5{"v6I-h4(j:(&)!lJZx9D^j 6; 9*0tm'|uVvTl<]KmV2roytJ7gAoX, vt>lplxD\jv .#NE>OZW<T^PXr0|;cAxD<Ac"D Zq/^iuoji0T%]Jqo&-6K+!c& ?`>7B%y0FH>Ez[:/6a"Sbh2YP9*u^?9KCw~L}d?uH T[| %rME (cQWQ.[^q.fEtT*GpJP~g0Spi6(0>TI<.[?~z?+&bSM|2=]<68UPubKB];70"$qG+Io N PZnNTFZ)%P]U6fo00`W OF1SFe"*ZHq{{ FUG%u|''rDubTC 1R1b^l&jx~)u ` /-Ll"3 jn86DDDSp/$8c@w|Q'l3rka)X,zq *cxIW/, ~Hd/Xqc.imr6UDP3Mt,i=6"5h0 j }D6%~ fJg2BW"Oryn!6T&iv :\;N%++&1-tworld-2.3.0/res/door.wav000066400000000000000000000146361475511570500153260ustar00rootroot00000000000000RIFFWAVEfmt +"Vdatar 0HTN:($ !,' $*))3EVZH)*65+ ,T{m'!1%   '-4X\= i 36@ g[ /4MO4/ͰKI{%ٰHF-$LL0LVVU˺K:?"EKĜP%@8]ܶAi=89D3' (~)5  $ n oSf[!ڑ;- A%% |&$!r M#<_2xI A6Y r }W>O\[O^tl*Yil&wP ZF(Q=/D l_EAzsLR~vH[iLNZauayx)Z{wa*:5\jZqTi"w@QlvzmJ5OSMH=0$ +QggQ0:kfVVbtNTl3'YzvV$an? 9jvP'  5:!|_]ipwo^W`vhKDY}{iZXeyH{%/*vK('57'bON_v,CT]T<qZI2"$2CZt'5<:0' )@Wjwyn_QLSe}qcg{l_]gz|mc]bnz}tbRE:>L\d[C#)793038;/ ,,$%!$" !  jW^~.VCKMZ(2PeaN<2@\vpO88U #1=GYjvoHD[VE<>K]aWH<7639!':$j2!30B0&|]y:ϽFo }qDfۑ!KR"X q 4Pt8tf|r V ({`O or<$>o?[Q%WX  Zady[w + 1`!Qq>9,  (j;I 8!h5XK U;HU/X& =g8Y@PenIg}j  -=.DOg=}f`PXP(.Z>"> vC\_& >x{vYtA*NbU@D*G\5bXmyAvo  Icnb8NC/Q")_|A/~h`n,>XfY#>eZ/\/k 8"55:(hOjb\O /P}m<{* A, G)Qe2@.tV-}TYY|BX1+yY0 I wzw0(xU7w <C K5 [  '|   *gʤSӉo^ Wu 8 S + 3ol `y6H51 \*"y3)q /t0{ (v~ dOڹי{)SR p1 t 79 Xd M\y-zW!P}'t ecEZ} 9h! N 1Bt n~#nFlG` F ~dCg+Oo1@GDn!X" a` BeyUH&Ai~+ KX^a)DUXO|:ȈSSX\  CͼƮ=mx!c]Kҽ'n8jG#()j k(>Ga?* "+# "C Ef  e 6 ?huc2 #(4)y%?WCcԥ[F1=v4 AYG&o`wDhdef}/rT\Wgh8FX =Tb"  lv\>&ybw+ngM@' -q;rRTQjqo}(WT?Aj.I<*,X$9 zk`Zv_[.;UNqy{u%~J$"BrFE0*J{^7D]6" . E3EcQz:vMO)QtgfE3s^e }@)ZGMAEg2xnek\:B+g=;J2Qx'NcS%0)  >gg^b^^\B08B7   5PHE;~!oN, )  "! $0;?:>O\l~{c?   \5}W E`^my=$JSE,  .IajZ@ tworld-2.3.0/res/font.bmp000066400000000000000000000463661475511570500153170ustar00rootroot00000000000000BMLv(fL3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333323333333 33333333333333333333333333333333333333333333333333333333333333333333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 #333333233333333333333333333333333333333333333333333333333333333333333333333333 #33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333303333333333333333333333333333333333333333330 #330 #330 #330333333333333033303333333033033303233233233233233333330 33030303033 3333332333333333333333333333333333333333333300333003330033230230230230230233033303333333033 # #3303 #3 #3 #3 #3 #3303323#3# 3# 3# 3# 323333 #3333333333333333333333333333333333330033300333003333303330333033303330333303330333333303330330330330330330330332#3300330330330330303323303333333333333333333333333333333333330033300333003330333030303033033303333333033303303303303303303303333330033033033033030333330333333333333333333333333333333333303330333033303303330330330330333033303333333033 # #33033033033033033033003303303303303 # #33322333333333333333333333333333333333333333033333303333330333230230230230230233033303333333033033# 3 #3 #3 #3 #3 #33333323#330330330330330323033333333333333333333333333333333333033330333303333033333333333303330333333303333333323323323323323332#333 3303303303303303303333333333333333333333333333333333333333333333332323333333333333333333333333333333333333333333333333333333333333333233#3#33333333333333333#3#333333330333333333333333333333333333333333333333333333333333333333333333333333333333233333 30#03333033333333333333332333332331333323333333333113 3303333 330#333 30#30333133333333333333 330#333 30#33130#3333331333333333333333333333333333333333333 3330#3303333332333333333333333 3330#3330303333 3330#3333300303330033233333303300330333333333333323333330333033333"3330333333333333333333333333333333333330333333333232333333233333333333333033333330333333330333333303333333333#3#3333330333333#3#33333333333333333333330333333333330333333333333333333333333333333333333333333333333303303333333333330333333333333333333330333333333333333303333333333333333333033333333033333333333333333333333303333333303333333333333333333333333333333333333333333333333333333303333333033333330333333333303333033330333303333033330333303333033330333333333333333333333333333333333333033333333333333333333333333330333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 #3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333033303330333033303303333#03#032#3 332#33 333303 3333303333330333333333303332#33 332#33 33303303330333333333333333333 #3 #3 #3 #3 #3 #3 #3 #33303 #3 #33033303 33330333333033333303333330333 303303 33#23303 33#23303 3333330# 3300333330033333303303333 333333333333333330333033303330333 #3 #30333 #0333 32#3333033333303333330333333033303003 303233#3 303233#3 303033323033#2303 3#2303 3303303333033333333333333333033033033033033033003333333333303333330333333033333303333300 3333303303333303303333300303333330303333030330330333033333333333333333223322332233223303332233033333333#3033#30333333033333303333300333330330333330330333333330333333030333303033330 33 333333333333333333033303330333033223330332033333333330333333033333033333303033003333303303333303303333330330033333030333303033 3300303333333333333333333033303330333033303330333033333333333033333303333330333333033333003 303233#3 303233#333333330333333030333303030030033 333333333333333333 #333 #333 #333 #3330333 #3330333 32#333303333330333333033333303330300303 33#23303 33#233 30300323033333030333303030030 33033333333333333333303333033330333303333 #33303333 33303 3#03#03332#3 332#330333 303033333033333303303 303333# 3333303033330303333033 # 3333333333333333332 333"3332#3"333333333033332333033333"30#33"32#032 3"33"3"33 3333030333"3330#3333"3"33333333333333333300332 33"3332#2#30303"30333033333333333333333323333233303303333333332333333333333333 #33 #3033333233230333333333330 333 #3333 #33303332333333333333333333332333233333333333323033333333333333333333333303333330333033333303333033333333333333333333333020333303333003333333033333333333333330#3333333333333333330333330333033333333033333333333333333333333333333333333333333333333333333333333333333333330333333303333333333333033333333033333333330333333333330333333333330333333333333330333333333033333333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 #333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333333333333333333333333333333333333333333333333333333333333303333223333330333333333333333333333333333333333333333333333333333333333333333333333333333333333333033 3333333303303 23333333 #33333333333333333333332333333333333333333333333330 330033333333 #333333333333333333333333333333333333333333333333333333333333333333333332#30303333 3330330333 33333303333333330#3333333333330333333333333"333333333333333023300333333303333333333 2332333323333233330233333333333333333333333333333333333333332#3 303333 33330330330333333023330#3333333330 # 33333333333333333333333333303330033333333333333032 333 3033 33033 30303"33333333333333333333333333333333333333332#3033033330333033033333203333330#3333333333 0#0#3333333333333333333333333303330033""3333333333333333 23320332333320303333333333333333333333333333333333333333333330330333333330332#30333332333333330#330303 00#33333333333333333333333303330032#3333333333333332 333 32333 3033 3233#33333333333333333333333333333333333333333333033#33333332#30333332333230#33333333333 0#0#3333333333333333333333333303300303333333333 333 2333203332033320330333333333333333333333333333333333333333333"33 3033333332 #30333333320333330#3333333333 0#0#33333333333330333333033030333333 30032 332# 332# 3333 3330333333333333333333333333333333333333333333333030333303300303333333322333330#33333333330  3333330033"33333303333333333032#33333303003 23333233332330#233333333333333333333333333333333333333333333333"3330330#333 3333330333333333033333333333333333333330333333003333330333030#3333333033""33333330300333333333 33333 33333 3332#33333333333333333333333333333333333333333333333333#3333 3333303#30033 #333333333333333333332333333300333333333333333333330#3333333333030033333333323333233032330333333333333333333333333333333333333333333333333333333333333333333333032#2#33333332#3333333333333333333333033333333303033033333333333333333333 33 33333332333 32333 30#33 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333303303333333333333333333333332333333333333 333333 33333333333333333333333333333333333333333333333333330333333303333033333333303333303333333333333333303333033303333303333033333330333333333303333333033333333330333333330333333033333303333330333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333333 333333333333333333333333333333330333333333333333333333333333333333333 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333# 33333333# 333333333333333333333333333333303333333333333333333333333333333333332333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333333033333333333333333333333333333330333333333333333333333333333333333333333333333#333233333333333333333333333333333333333333333333333333333333333330 #0 3333 333333303303330330330003303233330333303303303233322333333233 3233330#3333333033 30333330333333033333333333330230230230233333# 3303330333330003303 #3# 3# 3333# 3033# 3 #33 #30033 #30333033330333333333333303330233303023223303322333033333330330333033033333333033033303 333000330330330330333333#3033303033003333303333303333033333323 #333323332#3303333303332330333333333333033033303303333330330333033333000330330330330333323303330303300330333033033 #3333232323303033333 33333300333330333333033333333330303303330330333333303303330303330003303303303303333 3330333022322233332233332333333#03030333333#3332320323230233333223333333333023023023023033# 3#03330333330 3# 3 #3# 3# 3#3# 303330033033330030333303 #3333233303033333303323303030333 #33302333330303333333333303 33330330330  33332333303303233003303333333033 30333303323230303333333333233 303330333330322303330#3333303333333333333333332333333333333333333333333333333333333333333333333333333333033333333333333333333333333333333303333033333323 #33333332#333030333033333030330333333333033333333333333333303333333333"332#3333333333333333333333333333333333333333330333333333333333333333333333333333233330#33333333330330230233230333333333232230233333333033333333333333333303333333333333033333333333333333333333333333333333333333323333333333333333333333333333333333#33233333333033333333333 3033030333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333303333033330333303333033333333333330333333330333333333333333333333333333333333330333303333333333033330333333330333033330333303333033330333303333033330333303333033330333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333323333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333303#33333333333333333333333333333333333333333333333333330333333333333333333333333333333333333333 3333033333333033333030303 33330303#02#033233033333333303 #33333332#3333333333030330330303330333333333333333333333333333333333330333333033 303 33 303333333#230303030 3033333300033033#23333330 30330233333300332333223323 #33033233303330333333333333333333333333333333333332 #3 #3 #3303 32#330303333332333030303330300333330 0333233#33333 03023333333333#233033300333333303333330333 #33333333333333333333333333333333332030333033333333303333330333030303330303333330033303303333333330 #333033333333330333003330333033303303333333333333333333333333333333333333323303333 33333333303333330323030303330303333330 303033033333330333#3333333333 # #33 # # #332#33333323303333333333333333333333333333333333333323322333333333333033#30333303033303033333300303033033 333330233 3333333333330333030332#333 33333303323333333333333333333333333333333333320330333 33333333303333330333303030333030333333003 330330330333330332333333333333303330303303300333 #303303333233233333333333333333333333333332333033303 32#33030333333233"3030303330300333330#2333233#3303 3030330333333333332323232323333300333030330333303333333333333333333333333333303333 #333 303 33 303333333#23030303330303333330333333#2333 303 3023033333333330333033333323 #33333323033 #33333033333333333333333333333333333 #3330333333333303#3030303 333 30303333033 3#333033333330333033330333033333303033330303333333303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333303333303333333033330333333330333333333303333333333333330333303333033333333303333303333333303333333330333303333333303333033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333333333333333333333333333333323333333333333333333333333333333333333333333333333333333333333333 33333333333333333333333333333333333333333333333333333333333333333333333333333333333330323333033333033333333333333 333333033333332#3303333330330333333033033323333333333333333333333333333333333333333333333333333333333333333333333333"3333333333033 30"3#33333330333 333"3333333332#333300333333333 333333 3 # #33333 # #33333"30333033333033333"33333333333333333333333333333333333333333333333333333333333333303303320"33 33333233233 33333333333333333 #33 #23333 333"303#333033033 #333033303333333033333333333333333333333333333333333333333333333333333333333333333"333333333330333 333333330333332#33333333333333330333333332333330333333033033033303330333333033333333333333333333333333333333333333333333333333333333333333333333333333333330#3332333033330333303333303333033333333303333 3 #33#3 3# #33033 # #30 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333323333 33303333330333332#333333333333333323333333333#33 3303333333233033# 33030333333333 3333333333333333333333333333333333333333333333333333332#3333303 330"233333333033333 33333333333333333333333333330333 3233333333333333 # #3303"32#3303333333333323333333333333333333333333333333333333333333333333333332#303333330330"3 33033232332333 333"3333333333333333 #23"333303"3033 33333333333333303303333333303333303332#33333333333333333333333333333333333333333333333333333332#3 "33333 3333230333 3333033333333333333333333333 #30030333 33 33 333333033333 #3 # #3# 3333333333333333333302333333333333333333333333333333333333333333333333333333333 "33333330333333#3333333033333333333333333333333330333333303303332333333303303333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333033333333333333333333333333333333333333333333330333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333330333333033333333303333333333033033333033333333033033330333333333033333333333333333333333333333333333303333333330333303333033333333333333333333333333333333333333333333333333tworld-2.3.0/res/force.wav000066400000000000000000000106641475511570500154560ustar00rootroot00000000000000RIFFWAVEfmt +"Vdata)1"uS#l%o +#QQ F$!Gq NP +Hw~$-# $C `"$ݕwteX>?ߓ iiog ) ,ka? ~D3 =u 0j EgT _^ ^)  =*  !B P!0QK Oe[Z%DI F5f'r J s^Sm/O ye_)E]F>N x  @?K 6V@inH|&X;|l`j)V*s6?6}e23xV6xRS W^kvp<iozI5QQ F$!Gq NP +Hw~$-# $C `"$ݕwteX>?ߓ iiog ) ,ka? ~D3 =u 0j EgT _^ ^)  =*  !B P!0QK Oe[Z%DI F5f'r J s^Sm/O ye_)E]F>N x  @?K 6V@inH|&X;|l`j)V*s6?6}e23xV6xRS W^kvp<iozI5  z@ VBk I LD'WVuw :lSj3E lu,z I #d%mFw'yQz&3? 24 xl0 s; {98H+DU!0(e5QyXBEQyKa* xI&E4{54\he^zX[Ku-Y{<##R?w=19d-KiN:O&:x.O@"Qgj;:_lF0qB`d~TCIR B W0"tworld-2.3.0/res/messages.txt000066400000000000000000000011031475511570500161750ustar00rootroot00000000000000:die Whoops... Let's try again. Why don't ya watch where you're going? Getting killed can be injurious to Chip's health! Uh-oh: Chip performed a fatal operation and was terminated. Great, now look what you did! Hey, are you doing that on purpose? :time Well, that was an untimely demise. You do know there's a time limit on this level, right? Look, we don't have all the time in the world! Alert: The system has determined that you are either moving or thinking too slowly. :die time The idea here is to win the level, not lose it! :win Congratulations! Well done! Good work! tworld-2.3.0/res/oof.wav000066400000000000000000000126321475511570500151400ustar00rootroot00000000000000RIFFWAVEfmt +"Vdatanwu2O%ukl {.RH|/WsSpAnt3Sr+A~]i 5  r'Aef+(c%1H$*b )O <#bKp N-TMa3 R h Ul\n|2hYL\RW I Y{#C8F,!jf aA5k (+ y .]=^7e Fm0{o RKN kD;,&b* C3 eL3WM  EP<2^+~ge(nS i} $ 4 E %'8W\;x$t1;-4@ u!65A Ob"_] HspWD@     ^#6wZ1wvxURn )z  _a{"M;m2?==U %! N\z=0?*N>g'5 ikYy be(}^}}U.uejo ~ K ;:npO5vx{Ba5`Ke)g+1 7v0*uTsoQ k z&~G$WZ z0uAR\VQ,I08N!M&cD J>nI{p7.I9lXtQ>_Lm #y-q e! 1IgVh K@8?Vg\%K ? j$ `w/D+h:|xOoTEMa"#2%"$v 2^v!lvB\.8)b|olt%"%+%5 r Bv|h^!&7)`- S&,M( 2] #0tVJ~x~\ A /w pq!-2& N\oweSfsL 3 S$G.23+ ^ U)) 21nqKsxa#aQ t>; &+041"K_ ]+AHC J6n<-CV ya#&++ o&l r'AuL'h81%]( NIE  uB5"&W'HISWTY$;q<0['YVi_& S & &Vo" s#z Q i}i@%U{\P=F!  Z ? ] E_o}hsXc !!~E"/) a y j  {DEc{OG/O[d\'tf}_, % t j =@4h?W  I |W29qY121?OdfEVEx% T T  / t @ ` [  @ f;mTVQ8)Z3DIM {^^8TmFkr8 :-p;bY%\oD*O?V*iqEh5mf0>0({U LCD^[R]+uyA6pe,c :6%c_.yaWc U.iDl0;) TQa.J)m6mM5 !P O0 Wnr1?U*\psK|4a2x|KFNvG)EvWxV;>MTRB[%BV$t$;JXR$`   z  ? z T O o j   1pIj  goZoh@lJ$6 Es1}7Y2F;=ha],f!RE0)ITzG+:Ji; ~u?f9J[ M|dTi ` --w+w"B!,f! ID\20uW&Zw'\xhsnHF4!/Q|\- DPvdk.z]6+ZB $Jl6X#`{d2j]nCiY`dbrS ]Bo59IYE@G_dPhoo qoqW#cF4nej_QTMS=?DXo,%lZ=%fD2lL$ "***!18EFXy$=] 7?F_c;Tq{hizko}i`t{]>2hXH4u~% =KO[XcdXh_IZ@tworld-2.3.0/res/plip.wav000066400000000000000000000212141475511570500153150ustar00rootroot00000000000000RIFF"WAVEfmt +"Vdata`" Xv&nTHlVv|x~-X[4. 0B20Bq\w -9%6'2=?;.'9VIR[V72? w6&.K_HpJNC*navdn>OiEw|Et59 7/N\:`M!yVJ`pwN0KR4@v>7?9d_{$E"`&*kRf!H5h_*?Qq)qPI Q]%]TX A :I*) |\&n{F1( c- W@I ik7 #g ~ i*qz ify M Bc1/&Dov&$c\H/'/sr=#;.qU\GR=09VOKj 49VldOBDz.~Vds"Vl)ulafH+T.9nzQs?GQ$oC<L0*]Tgi"LIw/EVna9"uVO$;-k0GL?d~p  ]_l`'FkvtQUrgU)Q__"~v"&:xzTa/6KI.{!q0[<,.&;@-zX XVIdO Q9n)wa2mhZ'9|~V?;+D2xQ~4 o Z2~ITVOzq6V6h-T "I sBuJ%2da2]QfRh?lAjax'?24%%daT) ?D6RunI0?=_6j -oB-l8ZRj&;zX[qoM\ qsAjVO"$X@8_oX'07\aTFTvuo X 4vzQ@V"4 B+ols|a\Fu0%Q@)~eKI $"QQBOc  72)K %$M.) ))Q|d2TX4"_?   ;4 % 276I)" + 9TBM@ '  '4ZvRqQfB@ZI0;9RfXTOT7 "%4f'B.Z7 $2oj?dV=D%Q)"7%?;$OR2      9--O@_F.'-Fxf 6-?f~d2%;=?K)$Mo4 +TzFaM~ 6~\ ) w"%?0 f\a=H6Fq|uKzshOosw+$0O4 4?KR9?R).=j|9 ThmDvZHOmqVxomvVTTu_'O[) .$ "QQv]f_/BoAl9jsa5B~X fxlo"6@q$ qx@Hd )?@B7;h|T%O_mD7O- ;BIO6 $OR-B0O2 %$=%7D+R)DRZZ)'"|ZIs %"$Q)%.6aFBO%Q4G$8Fg E, nrV~;hA0[sS}f8E~HA|C|Eime:fVYM_5; u+"]N*@[$J'Z 1-$s<j_N+"c5c:IFJ_HfchB/2BSyt--3/FT<9$~Sn0x@jq\P6R qJ MKT@hM<vMH6Cz A#}aj.C  u [  YY w ( # *kp iB2"W ,=hZ%tbk/ 2ru _{S:) U3V^ kA2 )uhsYQ>2awHdK230C>B 4/9 )ey7_rr~ 0  * &A:5agZ,-&YiC15FDxd>% xIf aDR~Rq ]``aOp r.7,+QE1qfF''24Q' Y_h+Fs_~zF+=n0ZM2%-a(Fr& ; |i\R3~Vfnse{F$j4zc&jJXg^Xs&V84MVA+9uO|oQ6VdK0'jvhqTudvdD  "6FHTmzmZK=" 6c]9" 0FO?% $'7KB | $ )4467.'$9vBDH aKOS;"+Oehs$ .70"%+0+%   "+0))..'  %)"-6=;90%     %$"079?BHMTTK?60$%9KM@;BOTTI6+ )0 .70 '67) )6BKI=02-    $4BD7-"$.-%  '6;6+%$2767762-07??9) -760-% $-2-"$490%''.0+--47."  %'$%  )66$-OfcTK?4-'$  .9==@BFF?4) "%26-   |x$460)    0=6$  '%   %' +22.)$ "$$ )6=DIQOMD97@KMMTXZZI=046tworld-2.3.0/res/snick.wav000066400000000000000000000213601475511570500154620ustar00rootroot00000000000000RIFF"WAVEfmt +"Vdata"'>X3zu0z ks 6 AOf-4+1y "\hiLQkSxNH# m (z @]H<D u P.5'ex7J1|c;J5!7<kq4 @Ab_G(Tg,YCV-#u+%Bw_uvn$CG2-f&0kk`h VoC'p;8+H*%'qdx)_?k[em Fw23H94d(uPdTuMnuPz.b*n y#.~@B )gPvwrc$!Wni9%N`>lKM6`^pxz$9;?2!A/$$ -4%=)$6   %34).* !$3/-RA?L_rcc{~uwzmQ.%/6+%" mioXovowgrsx  #$13"$B:<ncEVVH+.2  iy &  -5 !$#8-2GNWD?G773'5073;O?1AJ)#5  &* $-'/2//) ($&-  # #;9F2  $/),0CL<17>6<7+-  -2(-0LDQQ[yj^gF -) < )) ) 2`uZtt]_H6:3(  +$ " !     (+#-%$ " %- (%*1#7A:;30-&%9#$HO3-1.!%5A4"# 3(0, -:0!$)#(')&$!    # ,  $F9-61$2-    " (" #  --0</(6/+?FWF,.0*(B$'$ &-#.?*, $ 7LUUF:5.AFM`PXHNIC_IMHOR>-#?47G/-1@*>OcentA>B7($" ,+   &  EV0m5[S   w .0TbtQ~&[m"&G<B?EkbObZx-PE]1RMpm9y6oIJ Hdxq j x P nb_ ~ $4EU*Ppa\;CS%Yd 2ZW0c[%-y&KYQUnGW|ailwZThYTrEChZkmYVWCZMH{  %EC;F08-742" .8-/=LQNBRTP_WU\~~bchoq^dZH55MFWR6+  ' !4=64O55H<G\OA@1MU?.   }~yo%#!3&+==;B8'%?NMVK)3, - :]Yl{MhlNOP1 $+"  # $-)117$-- %"$  (  !  "     $,5, !'!#    % -$!1-,0*6G-+=6 $         -:JZOF@?8-         %$ !    !,%).$"       "!!35,08?3/26=5>>68) $'$       ')$$   *7;R4l2R *6                tworld-2.3.0/res/socket.wav000066400000000000000000000132721475511570500156460ustar00rootroot00000000000000RIFFWAVEfmt "VDdata-\ > 9K C ) |Oll TD@/.X  4&@ p Gy{ {% F f n'yzILxE8w?ICV)fo.(-@.>͡? h'/_@th/:I*_(E)Ը2L.' c uF3U1H(F(3}W(w*i|05 ;d  M S1 & LX5mf=+ :Ks]" 3HᇡK:6T/EaܬT:Fz=ъOTge쏾fX6fٍ\ZC5%SA*.$ WI Q6(#@2 q0A=E*X"9.mL|';4L14,b΂7P&%_y&WF\Ge"8"k!R?!QO|F[=z'EM~a*0X}br|Xl sC{!PW+$~yh3Fk3B-ژ5卢Ir!֑6ϧ\XCĤ7z9pXCc1\ɩN#kO͠/93iA}KWo@䰥oօN,Y"!L#,h7)?aJ#.euy:/K5b4pDrr&YJk͉%~r@dALnV]/y.M"A"׈60CyϦ]͓3hSsXõ/Xi?AB}Xw5\@8:(w+8QR0pˎhφc!S', "C@Znz̃j15# X 3cIAP"6?jҥsq!~8"0;::)6s, &Ugz$նRfΣ@<- ۭ  g[p=‰h-3%S0K7a:7Y 2+ !u0ꊂk}#NFdICY _ʉT,"Tݳ5as="$kq߸{>*r/᭍B.!QEH')n 8 "37=m6K1=<š8SK! k˻>n1@벟C73H'2)(Pdh6 o+/a׊-0 f6ֺq`.7<'F7d:*( b&pPk7]$l)$)Sj "02VLߵss_},J 7 ? sqex.]*h , h I<`V m :@H K L (.3B6v JA e s  # IT4 zJ L Zۉ~IIK/= 'G6F4+چ]!aQiNr9\!tU/B%9:cf:8  !z)e" A|qnc"BY/OB({yf)jo&& Xd4rB+.RK..wn-@`Qu6#]|e7Lt{ n2?f4h;6+C*FD\3=0<//"&D27zqtR?{ms,R?z=]7W:<o}*\uH2z oJ#9=+oY_Aa,cY'Q \0Jqv`fPJKhVb\$JT(&xQKDR[%tpVX#hAZ?ZBrSfv?>3rpBu, C%.Rj#A5mDl?vSL')@H9M8den +T2b\DyW4x|I-Xeep 9|:3Y jM6ge,uLYtworld-2.3.0/res/splash.wav000066400000000000000000000602341475511570500156500ustar00rootroot00000000000000RIFF`WAVEfmt +"Vdatap` $%$*(  6  "%-:;  .'! 7@6;4)""$E6=ZIPRMUT?ILfv}cKH7"'/6K2&4i~c{r2*3 :IU|so@\: ALpunlifHcC 8.D2yC$Pt;dS[*'h}"MpHC$|cg'R,dta/V.K0XfMz^RxyHtsyGVF+Q P}LBXs5DnJv{|84n| z'  &pZQDcI&if[peep`9=.rCJ.% g  Y>6F 9V  / *R0e;I@#@&UDdS1fe>TMH`6QKME`$b&f[,gMW2+[*\-h",1,@Rx I'{fzo87u\T2{5)n+GUZ5A:$z`KdZ JSZ_7J/ f{$qh&Vb b _3,= rp.bD\'.5q`*Y 4Bmv2#lY"   2t\fO1Dl )[D `8w(kartqfb`ST2vuY%o-Inb'n*c?@4~ 8_X_[]mmiB2/(M;,'/8Q @" %dVxfr[+pbS 2$C@;!DM+> {w[ 5 +2| T,Aݠ(kTQE H Z  q % V  &s]{%1E  CbmO)6FJ@ ;h x l T, Ev?5 Vd:. Y,nmi N/mj{|x`;lRW8/Qy_}CP),WEx\0'Q"\0[yVT=OD#g?K|Z:a8&^^( "+ U|UG"$c+o a vg{u6 c ,q%aV |tCORTBe ;  +\ kY9r &*[  P i-$Rd7T kQ }Rxi  ,~? @  ).!Rv 94 <n{{ao%2?d i(\wX<fVil9 /u@! A0 AZ'8y n.tj t"R6 wM)[ MS6" I6 $r y1c6TA1f 7 h   G 9n0,yPS%p > = x~il`7(n r Y/C+qCI|. S Y7?iG/ W| o\% =E bUB'y>y ?z" fM \0>1x[_}07IYM.vHm5Tc<k/jz,AZ?1hHh1T0JP=AEOg'O!={eb'F8V50zLV:'c UM { :P %d% D\^->~L _9Ouq5p79\ Mr jjnl_ '3 O&j rLv pT `# ` `{v]5 'I[0IIA~yB%v]X[8Y+c@W=tXJ{aFm!?-N=gk"{ wFsujl!!8Ja GS:/v/NTY80.Az& ,k PQ14.]JOr|l&$ql?$-<'5'VN9-5CS"GS &xt R{X+2=JQW2fZg&W . ;sAWoAac0 Rh@  P!vEG @coj._KUd8}\X, z [-c.hp ] Q9$ v~H g jn)| f %[Pi@=$Mj?L y5 h 3sf_ L q D 1 V>|phDM\gKJ#v@ .R Rla(CUbnV D`ev ^/ >F@?mgr/,[M4m-n +UQ gruc8 * LLa6^ ~ 2 ji Z ΃l*s =&WkЮۈ "G9t%.?oU VCs#Dm*6J $>A} 0Q(rUd(mc 'g j^0a> K. ^i[w[q U- < L Zl[G& ' z2q a*l}f<+2 ! m{l=BFEH\  n  ,|fLYz&k G .5ql6a2# i=Wq EjW  e#2 _S2Q13 Me Dy_1}jQ -78D sqc^ xl !@/ 5u u  madY3L Y  L+c(1b0.ns2bV00 / d t*v B /2 \  q"&  ?NvBME]m8"q1Zr1 [%;m# (. S~x m s,a t Y0F (%H)= ? )Ed*  N*s F,*;d%I^aoem r*2(Y )~uK P:BEYr>=b%LBi8o]{XP UdqO{u8I+V{)q!X@Z". LV d&#_EO`ax^g H `o4 CMq!0 y 5KXpvK3? ?'vbn xYw CN jS`z+~p l mGZ K|akތ/ ) #}Y>u&HA1& A`h 7 ujx < X\k Fc_ *N] /hYEF} %Q~ t 2 [t 5 w=IRRJ !5MwC*B>"f  hL Q JqHyv c {oC<}o ZF_MV# v nA1b G6`5m P8RG$l 7 ` sc=M=QhhP< (_H>EG  P  Iݒ~# +h.{z C_RSr]&\_U2| g[HG(^  8 S4xT%Nyb!nh V4G= ]o`uo=o9rsr _Y@ # e#nW|:xK = N lb<.Pcd( & HA-b8 8pDzg'"=m 4!fM4'*%3/ ݐ!FD ;>)`   16F  X{$8 r @4s` Jn^<"<H/w ? {Q2:n,po/TQ]s0FPI[^>N% ^P2LTFf Q#D1.SO N ]zQyGj-JbL  9p\Bpnp<' PZ  YR;B=%{ Nmw= ' 1,O^`>']IGZ3`_V ]~IR"FyvrS\@3'W/3ZzU]R7y9-+J o+ {*l B_ew- I/"~>! 9  <$ ! d4Y9uH^Kglq }20 fiV%]} zqp/ EgN (c]\XW RA XuL^\,& k]{+lhz+F&[w=kRL*yCf  gmFe_V ciG~~IN-k%G.@I2TW+ *NV6a[[x5 -R&yz#C ko@OD D}P NjRjpIt]$ +6>O;,m#O%]wy;>8K@>(o~/YNpA:bZU 40LG{'j*{1[p[g+C<5fqc>F_rX+h}w TlZ[3er,YEr ~/tvm>^e.CJ'r}VF}cac{%#o |_w`ZA8,z Q D%zg}DgiV `) J!q(!c3sM&1_"!z,&N.upo6NJQ6J;na3eb}<LC}W7NH8'#h# *E0ME3kH9iDT V/hf\ )+8cc 0I({D}$~!(p6/0iXBr ^0Nx w',-=ga`{? ,D`3|3i'_@Sd1uM'\4nsIII%C<]GG WI_X`aWc{ /TaeAmb)_)\k E-n>r]*N3FTL%H*'oxj/GdzC;%g+[pf?k[t} O` 5b&m3m0F<NS- i= 1r[=OQX  ?=nxgtfNG>g3"'GFu!~p6 SmQA _UHDZAJcb'I2"map9:'W366`R9>B( T9zch8Mh(?Mv .1#qVx& 6 yb%T-Q :jUAru[m:&)\m#62DN7BPr!fn>y:M&3OE#H-hs3k U>> c&{|y >VrRfX&V7I$I[jy}W`3(VSMnMc8Z%%);qgf@$P7LC59a~MxGc,c6 11~4|v1cg3 .Z9140UsE`/98OP6:fa/|w_". 5-{T]?qe,1uA1m,K7Dh" R?Aj 5 ,qMg^hyi'Z VC0>6NFA,iPJIba5S!hZ} $#|G3|3>06jP]X@EW?sgBD%fFuQ|g\0@,vW7: iG*3<8 W/RyQ2N(.'UQ,?uc=hY>E3 sYm/}0= w6KZtv_Bsg@c`kn-0'2+_h0DOjI]*#V A KZnR%%CL<u"LpCUK |YVH/Wl'.5W^i7HzBCbGF^P~ ie t!vc[ !5~/m1xHq:pQ*VO1wgD'q fJJpDTuB< =u HW u6MT!))K'h QLzYO|N(g_W/DRI^i +.an?7pin)7*?A6.u0*A:s%`5$3T/c=$m.5an?~?"88# 0 j_88! )&Qa *Q =Ec Z;8wZaF7I:F6Z5-d 3Q,Ag?TDz<n$W,.d {}<7NQ'jeHI(0|I HPT,$I#%$ )mvd&Lol.0wtnR,pD8pDM$6iB|(?$#q w#Z#k,0#m&oEc]+j>cN/ | Cw+S2 - rHf$FUN<XAwD7nH'a"{>3[ NQt:`4?_Mt$ml^tyu#J d9p> (N0t\3fxv<4)?=j0{>Z-."6}QTsD@EQ)2w V(l8%y.1! LQ$?I#!4Jp?ze8^m!C9cw>ef[qj5i :>J#;$51-lr"/)WE# AQm- (T2j^i ^o I@0c.@?-7I,iN$cH3C# uW!(;] "IcVx@U s*Wem:(7CD-lD^l") o c )A/uJQ 7+XQ8qUr& 'jTx"=e)7W$QBNF1#X GT8O14-O)DRrB6K n0 '\ (h43lZT'lw;G?I%UdrLq#,6C{1]_VN$6KH(dH9WO2 =_+6K.@S)/% JS;tFc|?8Q=0* eH6[-5&t ?r$cBY # }]qHGT[t]I!I Q{ye(tkn7`2{^x~lV:PL%FFm@rY+"-E*t$iU? wf0;%*f$+x#d]V av9skZC]FD0qjo v.TOB@kte3]Kk]0]qyxgZ[u M'pAQa2*(U:f)->:Y02CMa(^tb>#TQs7zQ$-fn[9 DB* Y?f"J FE 6}o'} -^1P@C%`+F<? pOa3P[<4:POVSD)/ " [LP7@vS L] k! Xu[$8*bH l6Ez6 v?glN5"6Z"u HzIdgovxV HM2 QA Bysq $P"| hG+ L D9v "oYcha/n{Z@4h%/6%C*NF [(OF"[;o bs LhL`2{N;wrP$3 /[`8*S_ vw}1&c"? $ O67)f9*B4g}'_3\y`\7mjuS(c Yr .G,|=3 kT"P!@OP%<YL42@)ed$P0 pJuk4G>L\:{vQ[so^@ &=--&    !0   $6   +R._3#+.7c<(L6NrOdllzdx4z(*6 !cSe_mNCTyA 8AY~*Y,!$@(KK]v&ih</~U5>q#{0]x25Z#0y]R !^Z?C~?0OY& aHcAu PI2&a?P0I>k3, )U?:ErEV.^'uH:AW0?)%,  $C=&L  M?  </-5"5-I F ?B ><?+MK?EiuHi>eG onja$Qm-QZ ZStCSnGE+AefWR3J\cn 6oKcQblnym m D* %9 ),3)9355&9,   tworld-2.3.0/res/tada.wav000066400000000000000000001060341475511570500152660ustar00rootroot00000000000000RIFFWAVEfmt +"Vdata6RXI=TTZ~z;;-/no/]_2qbR$2DGc$X=~V[hB6nDhV?c4va]$0TFO3OO924Xj2nO4T= iu _[d9_n"lH4F~s$ q+h__%o~ZO]FB 9o-;K|V]~2Fma_H4z9lOKX9 l@hXZ|;]R?slxO._=\I6?VD3u9_mz-Udu # -F" ';eM_ Fz96Q 9m)cXShoqAh072$;T9|=K ' +yo^]:M;^2F.Q Yj"I=-YIBzX)m_]C'wMXp]~E`8u\<$BA0U\dy5;4@E&W3Wi#7b?t_Wm*g97Wi c jf$| a4hK '/y6 9 1HM ~veܑx i tM>9STE B q$r W5'!\ 6C ْ .&.+E FufE) G 9\  9ToAYJ  0/RV.{!zFv] q _vi3"A0ϱ$ JMA HB+ T [i kyhUlIi ^ -/\ rb ~V =E <`[F(}J TvO H3' yF/kG i8$Wh~)r W l *hz  E &CGVz o,>bS" Vm$:2n6 h A } m z n okD^!_Y[e7 Q;LL<IX{ $$1,H4{2 ? +bfx~ GKA "% r  VW sO  f  4lyEYmo  PE { D(+0 U%.` W~1 v2 #g3<; #+1^ 3;nvyG2/sEpK ~Q 4`:"?L b=2 P:w:K4DdA~fs4Z2  ]6T m<1I\w3m 4 o| sBWF4.#eRz=9@m+gQt `w # _g}?{~j | : {f''q4hT oGp;oRJ! >:|0+}C2U]$=-E q,U 51Ha0 n-[ !S;h4S8JMFQ~#zF!,_{\\!zhnTwlDI sxkWM\ +;tdN3x-)nD8S.VfB+7 VXhSiAFn/Z]=3^=vWDZ9xv=$Nn^a|mj_=EXX^;pE=1ji O@+7au0-]&zI?"d,XM7)u~x6lB'+8PT7TvZ3I2$xd OeDX*X\-noH:nS6[0z ] 1d Kjs'NFHD v})G;Jz~PO/F2-6f]T-=$X9aMwA)8~J1"=HR4'u.IaS-Hw/[%'u|8T) X@MXq<7B .=6oQ~=~xV0^RQgm9~' '~9+:Rcr~ V2*J/4J s=P\rs2Xhx?sX&(%2XJ-J"^~qBhzV 9DH~4; V[+Kz-u[$F8$%m7Ux+9HaR!_?Z)> wJ:r+\MD dBmBFmr?&Wfz;# 7#T%l=(B| FHz VqP3BuoI|z I70'xc")w]5f m_x|&Z-zB;$C%%'X-T\T;XQ$[}B7l6=z6_T+ hJ:w o$8P-+E00_$~YZ 6{{X[@Vo I_4aH@6V:: 'ZufHRF%-qebR]NT&pyc|i6a9~XM_3qdmQ;]- s&J&wHQzi:nL8$.OH?.hX[Wqa99?[40vz;t|\dk A"+ }l+?U]^{^l$bF,. MC 0WA!s%,o8>)? " |!4 J^.yb*   pJ o ;6GG  BP/}6w_=7 |yEQ@T ScoVU)U^ xdC!4 X 9a U!PBE'dm 0[Y9  wOLv: \{a FyR~ A.+o l" p| *+=nٚ׾_ S : EB?s'zgڥtjT f y_}ͧrF`*txn1T %jcI#} v e6Qg'8#m-nE&eԛ-5r _^  zm b|1ݳ(6!τc(*k4C0 .GQ;c?EuDH s$\]d `! *:'imD08 _^U-!o U i% E^4@|؍.Ƴ&_6U><H)a_)'&. / %7jgݓ (7_Ƣ't"Dגv%;O0>һE5 qѝjdg#9;N%T"rð6 k<n+̵ŗ/&sUj&-Y ,L&p<1fC,[T<_bf[87Q@*r# R9bB70]Z[ED ZlV@tW﷼7"\;кC Pl6*,0TV*=ӈ՚Z0 F ݧ4"Oe #"?Y- F9& #٨E! Y2 㧳~Ķ1_M4$P'FIJĎ@4x !f6r"v<#jf )"ﲜ&*# 8 ,+K0^Ш+bP;x*%ֻBb4^MŤ'$ Le Ռ{*-Z$~  H h1 ݽCN66$5D d>Q +\Ѿa(ٞ40EuG9%CHg"ᶬW -D 'fP6D(-2qav}sG3 u['͛qm/ 9:= D([Uޡr93/@j#Yzm:FJ" W$ &L+ Pߣ 0 /;"9/~ IA,~ V2 r# 2 %(0u3Yʽ P.@& Z 4@ M(- ;$fT-:kمr)wf.,k.sn N\&Ƨ(0r+\pJ*SF *U8%a-TO0Ҷf7I!4G=ĞͿ&2v- y/ =r_2~'lSs ./Ԇd4߁;];w;K }3?QJr AKJPrޡ"'-E.H| %҉,;# x$߾!=>*uKw h@Z縱Έ#/;1#s`S0; o r>cی45 !(dE A#-Y>q1̣*6{'b0Y3Ǯ̀M(*L'J?8# */.bܾӡD?Y')2-(Ǜ-6#&*7u$ͦ/  z: :389 N8".Wa$д  ^} +Nݚ˂ 'D, =/GJ;",?/[ޤms 2J60콾< ? k U/bT _%, <"Tm) F  KLX  ++=%>00OZѺ~"V'u'/lJM jQ^Y9$ ] Ӧ+z rLF:I ~UQ92/iHJ7e X:n(ų %Q vL'k.Xe  lH%o ghɊX`#>^9.r:c@@ӽZQUw780 =J#P[ ;\,ك(9BYOVPB`F 2 E !{ا$ $8x *}ع/:'/(*ᮤPH4G x'Ngٓ3I.$2Ok@ [xpٸ:OZN!Qz%&"u9Κg"D/tD8ch Q /"/od)9 ԵP 0j-XU*/ϱ7:#"itD5=Nq=!#%6ZeQ3C@.m]%N' _s,De <M'<]0dB#^X?[4.D EOZTsY+ ~$Y.Z6O Q$ҍ-"cc/B['=LOM47*<JN< ] Gfma$]uM]7){i:lG$E+ E/ ׌#۵4.<,ZΪx K5&" GbYMu70O1صҐo |`H):y yӳ p0 $  FZ \ـ?%P7AK  ңHuDI$Zĵa)3CgR ` DUB ~ "vxʚ865;ǘ80q2+-89Σ,JPTZI ,W9<( {Ϛ0C@/ "dj Z΀/'bT.z}Bu!Ga$ڇ}8^ Q_ bn,2 !(=4ՠ (ݭ 3_%vGj3/# p?}+_ 9DvN-_ ON q.%:#M? 4 M ! F^hŎq(B.OT hKxRbDciGUƯ!( pM*3 HX$ 1"\g,^C/4=,!/$h֋CP-n>a  ?  *ZsSeW `a6D M?*)޹n>`!S(t4 IP9mI}} ߴ  23; 8#?g5vb+1/98D% 'L+s $߄fnb(m7/19k&'8 0?1x /N{iu : qM_|O x/sRi rF@iFA|(-&E9@(de$H* hNB!otFu .]A0TZq(}ؾ?&;%v. 'G*U/Ct?1g&8i&?U8q ` (p"\4]y  y  l8I9 (̸$~ +1Ԟ\7:j,~ ) lRS@) Q%˖%.(T @ 0 "H 305C&Թܾpc)8 lӝT 3. 6rޚD %Z$L& $O#ݟaP#+{rL#T-9en{<C)GsU !|_)2.A TJݿ%HX:FQDOT)C}n<"*gV>_(, 66 <Ʌ$LciQR ra )dSIG3+s sl٭0Gr,!BW:DS}cҘ7) Жs0 /Y&2)/Bń >$ɔ1p'ݤ%_%C)1 A*otVp/ V E t/J'Y*";ȩէ,,y] X'6!8 6Z%_;p157$=> Q@,JR?QD3|ް@ aCP  -705Xȉ%03Q!7r;ݷϥܘ + '1e WFj0~ B< -+I?:.%%h@&bY8)>3up$ 4-w0 /dzK?49-?O X"j՜U6^۪$T*8н'8:)ވݿh(5ԏ/o@G+2cu|$4{ ) q evV1*z("(n1Ƕ<*@ ) u6k#I{jETu 1/*tKj$9kݽbT!@ZQPw[*դq [73[p0.A J(j8 fDRgs Paף` #3 4Tv &Vr*")BpUzaQH߶?Jm% G,g #%~^ <325^N0g +_5LQXz$*BZދޯj;.Fm!-Ȃ->G -Jc}%k.f.S5ڹ7W~tmo._s"P 3 ]J  ,W)Q /);$ XQD,=-H:tWy3<3ޫ K,Q:j s C2!vE2@wJ>״ E+Jݧ ..H ZT !E*˱ݣ4E, -a?Mr*z".+(j!"_GCe9R@69 #"wрl ft!p bk&!BV J"z1<pa T!AbY B|!K<_j('n `^ . 6,|B !(E qkGF>; Y/܏J < 0' )4 uP'Z j|߽-8y6ԃ_E'YU Su&r '2>nlSp"< xP+Ɛq<`L+ si PO޻z9G5".7P7atd!E6$  a2'-(C C)>#ZL&"tOPs۸d>f!0  =1 q,tl܋f+>mb S_ hA@ !oTG   > B.J }N3UH!By* tK@ I! |bc۠R9^p:޷#Wەܾ B)JPc 3,!nN  36Jݫ@Ie6){F(  j$ )[ z T +ddQOWm @>$#,!{ n" tNO?[S%Gw""!j |s9k * & 8e8L}x< 7>& {O P  (Eo{G&M:(1 1*z|] !#2E%!; qa 0V 6 9#2>%x Q 0 c*ٗt   ]} ?Y%; %hGBe7O B6  S?K.jpW4x ` =kJ*2[ *=.  &tQ %K@(ѳCx 8_V_.<}!U . 9 {zG#$d mUK>8 *  :v|h2)!) Ha7U- #*ڝ:  .?,F^C) սYvۙ%s02pA% "մ6}4;Y*JM&]8@Ha[x 7 Rk*l< W  '!0Es\  05pyWNZW7*8T؏ /i{'Bi3ޙ2 #0$.-!W(͆ xi-4}" u >u '  G'u$})u iv.EoT9- ءDE ur* ye!4X_ yx _ $ 6rfV";VCUm') -dR}PK.x-Rf_w  B` ]K dVR- qP3Sk{ aO4{*a>ަ* l$5* a=LI0 )o&Z 3N/ I!(oz4 >ppc}`F |9G$9af&'!7[ssAC%C.QTa c<!R (#Cf<p?*!Q"9 Pn2&bY+W gKn2 5^d$2    _ ) >)w& ^.؂X%yO2| 4&RBe0l <m2D " fժU1 Q v)&IbI ' nGfn@# l  vL'@&-^1kM'C6cݷE, pr!t'p6B@2G"'R{  BjՃc HE;<91) ^? ) xmhA5DMסVOHIcUvyig O_S+( aG Gx#g8) - `R%%Z #hI"cs@]g 9Xk ' J  A _a+pS &t~+g 4U8% &w?JR&5&_/YH2NsK Z[M5'oy"Y61 (% [4S lJLS7 R. z. 9 aD D +k3_=hjEb`?_}wޛ6 _r'Jf& 8A e9 $CO% khۓx- *N9DNM! ac[1)U3BL2$Mu sj  6 /%ni xNPS6+e#*|pe C*"&  yU +Z1  >?{jM,2n( `!7Q_ov7od%Fw D_3\ z  L 6gS 5[]} :cxv2_ ` n gr>{  YfQNBr u 5{~m Xf@ Dp/ x=^3D&k"{kigX_[/X KS{  R,xf&W  5q5 %}\ f4D+2  H} mb7:  =( >mD K[x <[bqmTS A z8H)  [ +nFg D UUf 0  0lW F^ eG !! 5 qc&;{hC / +*y .Y_ >  nCc&[ CI:b%Xf lZ#   nF . J ; {ScT4q_Vb@51M6 i  6V ' 6R K!$ 5K+ z;G^ e N%\_e. W3 Z>,%D%|FT% aamwHr \Mvl 6! e +RY^A f<[a) - aiZ fOX&(  ) Z\H H k8 m sU  | ccC6C cEQn : pK' "[S1p' qj -@O@ D '*=- v&3#s a6 H %.K @_qfxf \?V 4 ,(, F bG6XqHO $yA J, WRc-bb| D n~E{%h  l^ Gv7 []H?0i/s?k S  @! S5^ G+C8 Sg|b! lejh"G)5r5 w5B m-M  k/XVY}-9b+ ay;y3i @ck' * 4O~UVhQ{>,{^tdu% f 3lui{ !>_ = ]D   i V L &K7M5`5 }M)u 4@i> *k1F'%Nm fi|B 1Hx px89CK$j>%=l  ":wKH r ?%7uK TiOB[^ !w) w3Y |"<$=*)Mm c0#xP`8-=mI+m~ \sB~(A+T}R_`9<v 177* qTa@-)S#\^hAR,LThd/hwlIqr.#./jv% `t { c``8' 5 e%=\p2Ee>suiod5y] 2e_K-  ?,Gv( .ha /\$<i*CPWMP#l?'3/+zBzHLq73 ;$j-nREz{__9K@aYBVG!0 YA#X8=pM[P T4. {'\Br#![#kT'3A6]\& eSJBl$N; q?4$x'%A"@Cn6JU&R 0?an1m\3OO}\RA( 6^d'n\\zXY\8#&9;3VzK v"I;N>7r?th%_s{*Z2'u4f,=DR`/vFnWC.FExi$3?ozh3`6iQ&@wOjc9 X3mpk;@I['9;aD[G[U8IMtxd;oV5Y@mum4nFcx?VzOw/'$-l9MS@If9w 0<]' LpJU%(J4\$X'9l IR|;U=bHV7 x 6TZS<2 ]]ok3Z60 E8np23X]mkcm{0>`7q8niha/cftH.=DjwIHH&\=^Y:9{/3c9'T>F+&!^<@g?qABK7q],Io@   Ca +T<M~t.j1Annr2.HHnfVa mhf2s'~~?x-4/UuH(u OZdv R`'X'zu\V8]XdRKO sln_R%xRRh jc~(@X3x8JQ&~ +6; @V,VT=&26L%=4"X/'&i!eEX><[FqBVfh'|K|flB& 'zw[R]e+QhHOZXXzd~R7ha)h Z{9s8D_0c s>&*7aw-SOn&SIKu"4u:z"9-]=j?~@h2$XhB-@6j4zT _E<PdMfxH)F q__o|\1&$Y|so2d@ 2X09O h]ATosR_)7uo$aqq~Bj J6-7;aVT"Z8E5IxcT]h\6Bu$TdVQx?-/2n;zK2"uZ;Ku6?|o;qcx_cX@&e;8 ,%I*_m2 7[q@ c%|yqfBq)q6VbzY qF'|dG=6.)fZOZS Xo6nQ V+BTJ+eIMI6wKOq=2K Gt;uF aK6So9RnH j-=]ZX6JMv_wfuO 4$_V26q?m;lH~s=MBn zVFsha46@68MXd!z"ZBseDHq]uK]HX\8 O' 4+ h- 9zuQ TT!s;whcJeIKeBx=FK99FJcjA9q] )%s@  mX]"Hqj\|' Zc42Vq ?M)-hXvF2DRHMD4I?hc"=jSlzV|sls;+ov|Q- ]X$l4&9Qz~]o-ooXas;l8]nQB?B%B]hjO'TM nVO0 e6ZmdjxaKD~D sOJf~ssRclVIZZOTR. 4fj? .l~lVSFM~~uV@~hwK+nMOcZQVo]Ow Oaof;"6?Mc|T ']"cc\QQ;2Sae0Zda|TvfD)~.]hRQ_oh; 0QD2 6?6'xDS~4DB?029=2 w dzI|F|j|oMF0OKF]Ouus~2TcH_aRF%9$xVSQVls]]'HcdTqfahZQ;.RjXB" 9D@TQ;==.Q[2@~2w0R]KFHB.' .? DfxdTF ~_xzu @xoov]; u\Qz'RMH_j~jVTK2 "=MF) xo7O?6B[V==2% ?9  HZZd_9+47".2 sZT[V;~sjajz7jv|~s_ZD-??$?xhfsx 0MKRamvR4 '@;4" %'BB?QOM=)Z'.HKuzV[I 6DRx|zz|qRRX6) @MZZZQ-%=. QI)nq|6M?9OadVD0'0KF 2.6 6F4  0=I[V4 9f; +)OlF'=K=-  -6 ~~ .IQ]adqsq]OM?0"' xw%?DmxKTlllIHhI +[49IQ[]RTT;. T7Gh9m6 0XxoD+zD?T_sVI?X]XM4F]H+?RR9 4? "KOFI; '229= +-4$     4j6"2'@F2TV9OM2-     -7-4F9.2 "|V4".;FO707%   2B7=2  %$ "@QRcZccB;-VoD% "+)  ++$ ".KH=4''tworld-2.3.0/res/teleport.wav000066400000000000000000000306561475511570500162210ustar00rootroot00000000000000RIFF1WAVEfmt +"Vdata1YhP+QBMs Qgd|]`Kl/\"h 0+/] ]ZMd =SKvgc/XGQ^>E[L49HZY${dt9~wGwH3-k >I_Y~ Cf]9\2*-dGg'xrn9-T kl&5{\)9|0X"Oqa2KX@A3M,qg2@ Z w]7T[+zc}I @Z+$[k&ErI`}f_]zY~5+_jO ,|}*?~yv$[BIf+[`+I0;H2BB0R\IFu*M8r46dm!Cn!]]>7xCiY3!i$e3Z? I0@>$g+<(gewOHHHt]Xj. 2$!vB}__A3v|v(F0IGe2%E 1Z';B2M:|uZNlE~J?HU+hik9'&VTp88dw Z/crU!OZ@\W,qNeUsN m> 3xLEv.4umE 0dRZel|\g-9:5g2aUU*Ttv=5ej! 3&}0dm697ZbLl;aFWu3Hn 3>,1[tw  3kN11!k` 2D AT_qQf`%|BA^_<}v,^xXa(NFL Q\y3f&=;yIIl3xZnVZ?Gqog[7k@W"A R eiF&Al`$'`t)R6*8U dVyZh&!Z|8OPR=#Vq LJUQ;*J 7qtaGWbrl[$+@|!RMVnhcu\. Fo3R0W{Q>JY0m"|C3{`4u,Ae5U|81`nqcy3]}0c:hzma0 ^J25Cjpc/n5QT3$q&HAG gzC O4Zm4Va dyqaZJ"p@5.AMs qY{unocRa 2j)+#Y>E igMp[/rf*EAJ s6$YX %Q+[?E] p4w,X;</Vw`)1Da~;rHC5%Ajo ,jq9c0+DQI[[ t2=>; 659u :`X|hQ] %  8s RWt?b^%it@0u1,(e"5Z:t}eX:<:2BeP,JF\lXNUIB.atAE$Oyj"ZSe |)&D?!A:ZRDAmrB]x\yB@m${t tS d vZ48]4`Z ; 4m>=NlGR $8 b 7d $ztyyhyTa  ~E-n\[ W  mM" " s aZ}sI\3 Xd<F9Ip}mIT$TjC,;m$CNoMN~s RNVeL2!3 JWsjo4%?`QR*A, gM"Fq ?Re9 0y/@ (b ~:R+Fo}a*v XBx6c2yDu oIIv,%, A>0|B,nN>l>Q07VJ{~~fo`SxmVO t \    z I%7 vpl%`|i:?" ^^-IjG  c *0].>t`/rW6#d ZX moa "F? s9db%, wO|k s  S%,^ : 9 O[mo#~0K% TJ [Tb>ioLtD,%2H=i :R`W\ 8?I$ =]V\0 a7,i> :NR= oAR`" "= 5 B IvL }F!T tp { 2 kk D   8 M1A;xy} ~?+v s D !v~eb KURe C&$ @v~ U"n ZhtN |'rmw90#%jVr"P )( ~{u[ .lI- R/ X?x z8a ./&0 O D2o 4W aZ ( n }_}%E' |$ L_ >HRC~| q V4`Iif GS2 i?14? %4hO { mQ \<FvkD A5 Xd5vhI/ 68 t q[' HqR* B 5 p% $ ^; >G \ QJ`pSl01MIZh~ k5 TM 0A N +1&v "g> &\QB' {Fpi1. y>X3 Z+ e`fn ReOcF@Mj |hR&*LBm1q ] (Q_BMY )!K ,JEu NCE)ws ) -'nj pO   C9 #/9k9,  7Y:" ?4 6)n0 _Sc  x  e & (q ?\ =U:7}s 3'5f< _'QXT `teW ^Ak Aj e YV" w$6 @^| ^9AA"chVP{ o 6B-k{P>H!i Q %S%+Og!FAR~wq F'V[.; ;  `ro?K!h]U%Q8!m(Tu> N[ U T3~ h<bVn;}fR Vr.+ d!U u`C@XKv nk/u k@= @zRJf>%Ov~ V - j3 b 2V $`[ N 8t =8io\oB +sy>;=dG0 =0=B_W\L p}s x q{t.iZ[JC 'k8Xq  H1aG!  r\ ;@ :E?< avh *" ~  0@ G"u|:SL}%   hg< \) . J* ~]J{8 3L&&[=?^7 cHa1I# :1L 6 Q -}@n4P `z+ nI w! =C1K$M_WlU- ; 5 7 =+BjB D U  5*fu!T/ pj  NDn" X]F{| {ZX % 5# WBiqX;\~ zwh o d qN/0=0s&# Jme#? - ='& 7  } )iHA|v? N = FMW) e 00 3GafSQ.KN)I}cPH B% sKk )( @gxuH P '^j"  82,k  9u=hN!:f G y"Ij u6M Q3 #x 8k ,/;{TA1e()` ;K" ,_~6>.\b-,#% d z  &B. C5U\gpIov MRmb?1Y& Tw"0A^  'ND}q "  e'r v9U5 J(2m ? 45|}9Q.)QE YAQ#Q[O + [uwaR 3_)obB' 7!*R`RRj~ ' [*  M. tt^ | p9f7 @_ A B \!g;S%$xw OowH"6: ڛ4 jY #!/Yc Oify 6v):NE'(lߕ:_: | =J&K`- ,Dfi,uP:j/#VbQ8L{o d3+k5tި'+S7<+ A t[fcOA? .B7=>#{,`Oxu ށlm4<d6?O v"j# `EC_M A#<ݪ O'TI/~Tv,4W3*tm!2Ԍ*O0ٞ} .z^v -j%&nԎY>C {6)B * -S$z bv#_C8yBt!zOpRC#c=: 4P'V 3 [v=r J3X B|AT R gi "<)2'YWInk oAwEB+ߥۛ 3P,UGݹ= D5ўy%M%j%/\#N+M  (ev4 (Dc~5 $z9kx= /[YV@fv7 CI,&H%H 3t db} = [n G!a).07 :Y r} \d\3g6 6_ 0ix ck+Km $(a !o[ &7. d 7.Kk \tn u,G J8 eM( +;N^Afji/!` cD5!U{(&y}lJG3O >Sq=e S &6  MU$D? ,@MY t c  d ou<1 < @ gzgj N'>{]= -{g^n UZ]SnB ?r { * m? mP{ %5zf<S So>J KL] U( SrJ_},icH1c)(kǑ6' '  tworld-2.3.0/res/thief.wav000066400000000000000000000307561475511570500154630ustar00rootroot00000000000000RIFF1WAVEfmt +"Vdata1zuK]t VTy+P=S0) `F (o5*1( >_:}!YG:"HPW#U=5X~=$Y-&+%261_(& V s ) m ~ 7~ZK;R KuA{x#ly3:; [%kad )(( ~&$c+w% vAz1SO hr \  Q-4p@Wp_=~$#m  }iF}6cv*' q-]vO(pt" YGBpoqQ,V_ "+q W%ElvJdo\6} e # A\u"F)& xc T6^&bf$ml 1`IqM`| ?gXc F z2^5{67;- y g~7z)JDs?/ eX # ;iH mi6k. s  Q=f_I;UK_>nR r Ns} - M ?_'Nnv{HiRc% ),|4hX2D V  >c K;r[c  7&+<s9q ?*-/ x1o  ngGO 4:y\LcQ{,AN!KjS8l!x s f0WfIs - SUy @@ -;1`m4 61 rw}kk8 r4.%Vn~cZZu+.<.!#32@-(4T(ڕ@#D@]w~ 2PY(~T` 'B C)  (V{ 6= O%i  ~g޾"Tgtd$I ܾ ~ [%  ,/(M ~o2 f\V>  %VrPko+w P'WXJ &)@S&*1f7Mv =$R V/x߲'W.LS9X Jd '-. u #+\@JQ!hlJ  EU=a8G ,."iD! J<<TM'I g=ULS<7? RWc $'f]iz{qy 4JH|x46,3VF  ^  IMAa% 2 h;]R6 a 1 ,6^P B  P+;Y * ~R9T _p0RD%@F+g ,x y v\=_WbOg i1  ^ -_E2 :[f/OFK>60  &#VPWlG ~  T A 8q*^ KX  $ 'r&R W!.,4p+S%.L "\9Xy]!i";Z0j} V {Kz g 3k Bk- -7WT!(h$bh>b Uy=h).ty h*׫3 u ٻ E$z!J `7  V}2g|H s R RW wPO?#h;  O v ;* |>2uG Cnj  .# 4 kKL'o v .SXE)!! J  Nk[ܸۧl\Z,LX byF& 8VSD+#IBVAI,1fr7~۟"7"^-5 +Px][ q)6RKO@Bk*2 0  !AH#V V zN ] :#oV0 ~(4::U1!ncQgEzԼ-PF3,E5b9BQcMqk; \A#,k/'3 ~fl M > :{p )i!!# y3YM 7*i f}bk"*1dC \ U)/%'  }^6Hl N&o)#LVO  Uiz  h %aE]{DJr  !5 Vf <pPد1ѨnEK@"Yx O54j)P 4 0K 3,%' ; ~ ^z. Sk ^)q:t3~|4 DO]b~=I 9:8!7܏1ڬnV]L^NE "e:~ | * iU{ A\"5%4 ~ ] & p Nx XFCwF  [L"0 |aw ܄=7X* )ph!v }('y =As !rm  V  $)jj x J a +9oBI xs8} "e{N=v,b On%co|@:t RL * >pK\w< = |:j eh #uDl0 a _Bx7uq)]"m'*[&2ei9B?%zsg )"JjH Vj``$Z+SMZten`L [ G>}(Tq[ `(r 3 @ e.|4afTB-\@aX 7}Gnwssf ?۩eςџ"_U,d21T*hI9<*Htn4S . t# 'U (+2;)Vq~-C?ME.IN-,` B] ҃ɪM )ԡJUr!#ʹPlS\%/(w6KWf0Q)&8Yp #J#/6kOs#߄$l 7_H  lI+ 4 5,I #E A^m͐f}39~1q@B;d ! i,9=R w>%W[ D  oAO ) xv !8 ](_lB1YHmf <} A? w-Ѱs_]Æؚ. ?\!h(M$ t 0-@ yZ s LDb.h?K,dk%9My@B +_UQ,/!WOV%*x!AY !"hblG /w ?[St*O  nn5EtrU/ Avr""B/33f|%p ebk ,!AU48>8 o ~ E{> 4'|@6R>SBA/> { [n Q 9'mUb5/* iX < wKU7 6 5G*  B hZ{+|D c vT| %+p8654Z^AQJ56D-q);JlseZ "`m1Y T<ONJv[!NSC;P=2qBJaM@2; Y[z# ~=7VLn,'s6-t-b[\ }>v`$x1ML557z|R  wB"c%sq=8\/DikZiN(J#5~VLg Q u 7Pev &rm = | |{)HI4` #o`:7!!D1I 3"  3T$z8&5O\1/O:M?=6 z[.% c ` [Mr%^WtY4dgV(?4??f>#G-=;2qjcJ~nQpOv f +[?z77a&E"W'Q"h]azOWIgW=V/S*Jn[ IYud(TKrM0Kz!G1~_l0f)As_|0dfM0H)No0*f~8}l XAt ij"z.0+@zVoQ#N~=?qzz 0 f +/nW]3 6U,]m0)B@ -0Kuh>D[+dB;d+7SV;R#2@IqX$KeF7j$eT9e'jVsM?AK7#vFuj z%v@s4\+6au_X?$FXSq H`|QF'|cTh+Z<'4R[s$&B';HaZVygT u[KjX2~'l Xzo)B%| DqzalM[4Hyp=?tC'-Bv5#l8a3Su$ w xszia{z7#$Se`w\g J`tEbHB< [  MK  NhiE0"Qn} .`#)J+8$IB F=a._ӧ<;Y%y 6[\x` _ - " V(F$g1 4jb=?/I6V.F!4 چ ?H +|7@P7CT`/LoF}/{ & @.ؤ"{Ϗ7:M.du&550;c-l"DN[A0  X"jtW ne|`' #R$M*:T # >  A k]W ;\^Y=%R\~ J LP  Mt U ;V: 6> Ufa=E3 8  o8NN ``Y W$ (#@X ptworld-2.3.0/res/tick.wav000066400000000000000000000020501475511570500153000ustar00rootroot00000000000000RIFF WAVEfmt +"VdataRO*%7:'& aeyo-(Φ (#zPQu!DJoK# */[q T)<I F8 .re~ X"? s _ c MvdC2 3ihqHw[asJ  %Z==W|XKn}.2^*7=dzu:'UTAV~;8 z h<{v|394f|N([fc8=jth{Y i{b#/0^_kS"1d|; [X}xH3ER>l2U F+2'f:Kf^/e a0(Ueujp~eZMySU]qlR@z6tworld-2.3.0/res/tiles.bmp000066400000000000000000027500661475511570500154720ustar00rootroot00000000000000BM6 6(P =J+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+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2NNNNNNNNNYNBeP2kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'jR'fP2ZPBNNNNNNNNN|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY@@ooTTbb""==22""``ttLL''..++ZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5NNNPNLnW2_'c'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'~_'vZ'oU'gR2PNLNNNcccbbzzWW..wwHHYYWW22DD]]''++{~Zm`uTfL\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\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5NNNv\2i'm'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'm'm'm'm'm'm'm'm'm'm'm'k'f'}_'rU'gR2NNNccc..'';;ZZWW""BBDD|JJee..""''@@HH..""Zm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5eUBj'r't'u'u+v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2{@{Fj.}_'oU'ZPBdzccc==zzBB@@jjLLDDBBee55~~;;..22;;''DDWWbbRR55Zm`ucx8p@n~ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYkTeL\=J+5c2r'w'z'z'|2DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDf}{Ff'vZ'fP2dzccc""22++""BBnn``''22RR~~wwDD88LL'']]\YYY#!-"2".#Zm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5m'v'{'2D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Pf{@k'~_'jR'dzccc""FFkkxx]]==\\..~ggccFFcc""t{rf\YY,04!.$ ,'8.@2F8L5J2F.@'8Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dz¸ccc;;}22\\;;;;YY..88++|;;++mmkkBB88@@BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++YYYcwwi]YY.5;8N.B+;+;+=.B2D5H5H2F.B.@+='8Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzϸccc;;;;uuHH++BB==DDWW==LLJJHHYYHH++LLBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++xrjkmu}|zmY@W2F+;+;+;+=+=+=+;+;+;+;+;+;-6Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dz׶cccLLLLooss88~{5Bi=L`"5r''==ZZNN""PPBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++vjijt}_$=OBWBWJb;D.5+;+;+;+;+;+;+;+;+;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzeLRpʕųcccccggYYjj\\~ZJ""NFF58Z''o22s|..FF''@@BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++{k]`fs|YIRrNkFb=UF`Hc.B+;+;++e""NFFF'\'"N""L"FFFFFPZPZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dz_2FFFFFFFFFFFFFFF5kkޖ׳ccc""""88~b"N'J'Y"`DDFFHHFFBB88''ZF'@BP\eeegps}''NNWWFF@@nn++sgcir|\zi\YYYY%G\Z|UvRrWs+kF'_'"N"B""=F++gHFF.=FFFFFFFFFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzw2FFFFFFFFFFFFFFF5kk.۰ccc55BBJJTT==v""82222'"JDDJJJJHHBB;;''ZF+8@JYcbeijksv{YYmm++miic\YYZmwZs_YYYYIS]\\~`'`H;;5|5+f+'\'.H_''\FFFB+FFFFFFFFF/J/Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzF2FFFFFFFFFFFFFFF5mm{ɺϳccc''UU==NNeessBB''''"+F";2222''\DDJJJJHHBB55|''Y8"8@HZ""`ecinnsuv{88""++u_YYepZfZYYYY@^r]=o'W=@@885|55|52ZU++c""NF"D"L'"L"HFFFFFFFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzuuu"""""+۴糳ccc++iijj55DDZZ@L.L.P.P.L+H";"+ZFFJJJJDD;;''Y.+'8@@BUf..fipvx~zt}++iYYmznZ|e\YYY%aFb5z=;;==;;.@b..o''_HF2;FHFFFFFF)I)Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzT""||"||"||"||ޕ游ccc``JJ;;ZZZ@W;b=f=e;b;`2U'F====55x"'T2".+'";;"@@@JZ++i''pu}~}++iYZ{}xmZ}g\YY%XuBB.k.2;p22p""RFFF'@="BFFFFnsnZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dz8"FFFFFFFFFFFFFFF+uupʸ³ccc''cc]JeDpDsDpBm@k;c.H+;+='8"2""'@F;"@@@DT_kw""..\\..++_Y`rvv{|{wnZweYY``DD"U"2;o..i''\""RHF';FF)I)Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzvvv'FFFFFFFFFFFFFFF8ccRҴȳccc{|++R@cHwHzHwFtDs@k8\2D+;+8"+"2+;DFF@@@@BNbjv++""bbJJ55PP++++sYYfxwZ|t\Y+4A222@5='+;]55};;8822r""T;"FZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzkkkDYYFFFFFFFFFFFFFFF+uuްʳccc88H;bHzJ|J{HwFvBo;`8L+;.5+;D".;';"+="@D+;@@@@BLZep{@@22''DDPPbb++vNFH\ktxzuo`H ###***vbY.G";222228;BBDDBB==22u"J."Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzeee5FFFFFFFFFFFFFFFFFF5kkޭȳcccppDD..D;bHzJ}J{HxHwBn;]+8P2=D8="+;"2;"2@".'2'25"@@@@FNYfoz55UUZZZZ++22BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB...777wvcYY>IZ+H";22222BBFFFFFFBB88''ZF+8F:Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'dzbbb@ttFFFFFFFFFFFFFFFFFF8ccޫijcccLLPP""LL==F;bHzJ}J{HxHw@g"8D+2B.=F;B';='8@.B8D"+5"'5+==@BLRckpw|==ii++''..BBUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUmmm888~ssiYY%>|Zm`t`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`u`u`u`u`u`u`u`u`u`u`uJZ+5NNNTPLn2w'x'x'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'v'r'j'v\2PNLNNNccc55==ffmmDD"";;||HH;;||ff55[[WjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=JNNNNNNNNNr]Bk2o'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'm'c2eUBNNNNNNNNN|||..LL""""..iimmPP++"";;HH..iirr88=J+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+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2NNNNNNNNNYNBeP2kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'kR'jR'fP2ZPBNNNNNNNNNBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeee@@ooTTbb""==22""``ttLL''..++ZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5NNNPNLnW2_'c'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'b'~_'vZ'oU'gR2PNLNNN222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppggg222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppgggbbzzWW..wwHHYYWW22DD]]''++{~Zm`uTfL\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\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5NNNv\2i'm'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'm'm'm'm'm'm'm'm'm'm'm'k'f'}_'rU'gR2NNN222NNNtttggg222NNNtttggg..'';;ZZWW""BBDD|JJee..""''@@HH..""777777%)-Zm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5eUBj'r't'u'u+v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2{@{Fj.}_'oU'ZPB222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttggg222NNNeeeppppppppppppppppppooojjjbbb___```eeekkkooopppppppppppptttggg==zzBB@@jjLLDDBBee55~~;;..22;;''DDWWbbRR55888...***IXb.Nb'FY3@J146! ATBZ=T8N2D".Zm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5m'v'{'2D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Pf{@k'~_'jR'222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttggg222NNNeeepppppppppmmmTTTNNNUUUYYYYYYWWWRRRHHH888222LLLiiipppppptttggg""FFkkxx]]==\\..ggccFFcc""UUUBBB t{rf\YYYwZ|YzTsFb2F,03D\BZ=U8L5H+;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttggg222NNNeeeppppppnnnTTTZZZ```cccfffffffffccc]]]TTT@@@...LLLkkkppptttggg;;}22\\;;;;YY..88++~;;++mmkkBB88@@S_\\\\\\\\P22UUUBBBHZZZZZZ\\ZLYYYcwwi]YYQbo__\~UvJf;P!('8D=T@W8L.@+=+;#Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttggg222NNNeeepppppp```___eeeiiimmmoooppppppooojjjbbbUUU@@@222ZZZoootttggg;;;;uuHH++BB==DDZZDDWWUUUU""YYHH++LL++++++++++++++++++zg22UUUBBB`wnmnpw|}Z++++++++++++++++++xrjkmu}|zmYcFw]UvJg;R'8N;P2B+;+;+; ,Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttggg222NNNeeepppkkk___gggkkkoooppppppppppppppppppmmmbbbTTT888BBBkkktttgggLLLLooss88~BBjj55@@__{{ee""PP888888888888888888z22UUUBBBowxzf888888888888888888vjijt}_OcseoWwJg8N*5H+;+;+;+;+;#Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppcccgggmmmrrrppppppppppppppppppppppppjjj]]]HHH222eeetttggg222NNNeeepppcccgggmmmrrrppppppppppppppppppppppppjjj]]]HHH222eeetttgggccggYYjj\\~++""@@ee]]""88LL''@@==================22UUUBBBuz}v=================={k]`fs|Ybi;mRp@W-@*9+;+;+;+;+;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppccckkkwwwpppppppppppppppppppppppppppooocccRRR222```tttggg222NNNeeepppccckkkwwwpppppppppppppppppppppppppppooocccRRR222```tttggg..nnFFeeJJ88DD""@@''++22++PPttssZZ~|BBBBBBBBBBBBBBBBBB22UUUBBBx}BBBBBBBBBBBBBBBBBBvnku{Y!_`YzJf8L*:*:+;+;+;+;)8Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppfffpppppppppppppppppppppppppppppppppfffWWW888___tttggg222NNNeeepppfffpppppppppppppppppppppppppppppppppfffWWW888___tttggg""..;;RR``''""__NN""{z..88BBNN++''22}xDDDDDDDDDDDDDDDDDD22UUUBBBx{DDDDDDDDDDDDDDDDDD}mY%]zWsJDD.@+2528@+B"@'.5(7Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppiiiwwwppppppppppppppppppppppppppppppfffYYY===bbbtttggg222NNNeeepppiiiwwwppppppppppppppppppppppppppppppfffYYY===bbbtttgggz..JJFF22''__eeWW..|{{~""==PPffBBFFFFFFFFFFFFFFFFFF22UUUBBBtvFFFFFFFFFFFFFFFFFF}um`YY4\h"P.HFFF3"R""T"HFD"--Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppjjjxxxrrrppppppppppppppppppppppppooofffYYY===jjjtttggg222NNNeeepppjjjxxxrrrppppppppppppppppppppppppooofffYYY===jjjtttggg""''jj{{]]BB@@""xv{|wx{x~'';;88''@@;;FFFFFFFFFFFFFFFFFF22UUUBBBkxvFFFFFFFFFFFFFFFFFFre\YYYGQ]1f1"P""L"FFFDG'W'"T""L"FFDALZZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppkkksss̒ppppppppppppppppppppppppmmmcccUUUHHHoootttggg222NNNeeepppkkksss̒ppppppppppppppppppppppppmmmcccUUUHHHoootttgggttzz;;DDkkrr++|zxuontkks}++""BBZZWWUUFFFFFFFFFFFFFFFFFF22UUUBBB\frFFFFFFFFFFFFFFFFFFr_YYYYQez7CSXj~+e+"U""R"JFFFF'Y''Z'"T"JFFhtX_jXcr8HYQW^Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttggg222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttggg""""88~''55oottDD''}tsrjmojgjrw}''NNUUFF@@nnFFFFFFFFFFFFFFFFFFr22UUUBBBHY`{FFFFFFFFFFFFFFFFFFzi\YYYYTjBKVTj"T""P"JFFFF"P"']''Z'"T"JFFU^UL`x8FY@ITZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttggg222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttggg55BBJJTT==..PP@@""''@@{""omgeeefggjjpv{WWkkFFFFFFFFFFFFFFFFFFmW22UUUBBBFYYZmFFFFFFFFFFFFFFFFFFs_YYYYYoFZob{8V8"P""L"HFFFF"T"'Y''W'"R""L"FF5N5YnBTg5BT6BRZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttggg222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttggg''UU==NNeessBB''''|~|ust|~~~22}22u''jebo;;g..g""egimksvv{88""FFFFFFFFFFFFFFFFFFw22UUUBBBNs_YYeFFFFFFFFFFFFFFFFFFfZYYYYi}]v`zTiNT\s{s'Z''Z'"P"JFFF/J//Q/"T""R""P""N"HFFI\oNc{BRf2BPZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttggg222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttggg++iijj55DDZZ==++""sJ8;+DH"D8=N._fT8@B.DF'B5;2BTe..egorx}{t}FFFFFFFFFFFFFFFFFF22UUUBBBviYYmFFFFFFFFFFFFFFFFFF|e\YYY|gXcp:]:+b++`+"T""L"FFF/J//L/HJ"N""N"JFF5N5NaxPcz8HZZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttggg222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttggg``JJ;;ZZHH''BB};=F""L''W""U""NHF""P""P""NJFFF.Fe""ns{~}FFFFFFFFFFFFFFFFFFUUUBBBiYZFFFFFFFFFFFFFFFFFF}g\YY\cN\8Dc'Y'+c+'_'"R"FFFF&I&FFFJFFFFqqx2;Y9GZZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttggg222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttggg''ccPP\\TU"'@""L''_++f++b''W""L''Z''Y""PJHF@.@Tep""z++\\..FFFFFFFFFFFFFFFFFFBB22_YrFFFFFFFFFFFFFFFFFFweYYHHt''_FFFTV_V"U"+e++f+'Z'JFHHFFFFFHJFFFJF;=OZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttggg222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttggg{|+++8n8o=HU;@'5'8@J++`..m..k++c"'R''Y""RJFFF@+8+;+P_oz""bbHH55PP++FFFFFFFFFFFFFFFFFFuYiFFFFFFFFFFFFFFFFFF|t\Y>>q''WF))I"T".j.+g+'\'"R""J'=88;"8@"5@5;;2D"FFFFFV^V--OHFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eee222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eee88~=++bJF'N+;+="@H8HT"BRFJ88+=8+;F2N2D.'8F8=FF"DD`s@@22''DDPPbbFFFFFFFFFFFFFFFFFF\cFFFFFFFFFFFFFFFFFFvbY77p++b""LFGYG"T".i..i.+`+"L."'LHFFHFF"DB'FFFFFHF&&IZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'...222222222222222222222222222222222222222222222222222222222222222222BBB...222222222222222222222222222222222222222222222222222222222222222222BBBppDD..Y+`..j++g++g+.i.@.B'@FT.DPBkD;g@=W5BN.=JBBP@5J2@N5BF+D""LHF.8Lm55UUZZZZFFFFFFFFFFFFFFFFFFcgFFFFFFFFFFFFFFFFFFwvcYY55{22u++cHFFT"N"'_'']'"H2"DJHFFHHFF"D=.FFFCSCFFFFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'BBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeBBBeeegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeLLPP""LL==R.k;;;;;;882T2D.B@;"D;FjPfL`v+8D";B2@P2@P'.J55B'J''W'']""L'=Fi==iiFFFFFFFFFFFFFFFFFF''..isFFFFFFFFFFFFFFFFFF~ssiYY;;88..n""N11LE_EF8+=FJJJHF""N""LHFFF';2@CSC11LFFFFZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppggg222\\\ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttpppgggkkuu..88PP==..Z5|DDDDBBBB2;|2F5F.8H"8@UmLcz'@N"FL+@L';D5@L2@P++='2";""R++c..n++e+@Nmx''FFFFFFFFFFFFFFFFFF==eeiFFFFFFFFFFFFFFFFFFxuwiYY==;;22s""R//J+FFFFFFHHFFFF+9;<FFFFnnsZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNtttggg222NNNtttggg''WWWW;;JJb@HHHHFFFFBD5J=L+8D"FJ8LU'BN"@L@Uk2@T;H'DL+8H"2=+5'D''Y..k55{22t.Fi~|{FFFFFFFFFFFFFFFFFF..DDmFFFFFFFFFFFFFFFFFF;;PP88rnuiZY==;;++e""L//J9;>=HFFFFFJHFFFF;9;Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttggg222NNNeeepppnnnooo~~~ppppppppppppppppppoooiii```NNNbbbppptttggg++..==''ZZmmmm@@..ZZ""""@@HH]]DD==__HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH.DY.FJ'@N5T_2FR.BR@FT2DT.8H2@R+;L5;H2;.5$/<Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttggg222NNNeeeppppppmmmttt䒒rrrppppppppprrrkkkeeeZZZTTToooppptttggg""BB..BB++"";;DDjjBBPPggTT..~55``ee""FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF%Ej'Fc'FT2=R2LT8PZ5N_;Nc.J`2;N5BR'=F"5="8=.=$/<Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5n'w'|'DàpT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Dv2m'b'kR'222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttggg222NNNeeeppppppooommmttt̴wwwmmmggg___TTTmmmpppppptttggg""++''rrmm88''RRBBUUnnTT552288""BBBBBBBBBBBBBBBBBB==BBBBBBBBBBBBBBBBBBHz+F`5BU2JF8HU5=W'=P.LW.=P5=N2;B.8D2L2U+4AZm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5o'x'~+gָҳTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT;|2u+m'b'kR'222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttggg222NNNeeepppppppppooommmooosssxxxwwwpppkkkggg___```nnnppppppppptttgggFFjjBBWW__''22DDDDDDPP''""LLff''{;QnHzJ}"Jj5@F'FU'BP8D\.DN+BN5F+;B8W@i2U9?IZm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5k2x'~+ȥvָàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpàpDz'u'n'c'eP2222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttggg222NNNeeepppppppppppppppnnnkkkjjjiiifffcccccckkkppppppppppppppptttggg''xx2288PPDD""..@@"";;kkxxee++HvJ|J{Fn"Bf+=W28P2=F";PBZFpFt@i4SijlZm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5r]Bw'}'=ȥvgDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD2z't'm'_'YNB222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttggg222NNNeeepppppppppppppppppppppppppppppppppppppppppppppppppppppptttgggDD""""__PPTTTT..''22DD\\cc88{{++IuFvFtFtFtFtFtFtFtFtBn>aZm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5NNNn2z'}'~+~+|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'|'{'w'r'i'nW2NNN222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttggg222NNN```eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeetttggg""..RR__""88@@DD~BBii55RR{{LLDDPPZcsZcsZcsZcsZcsZm`t`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`u`u`u`u`u`u`u`u`u`u`uJZ+5NNNTPLn2w'x'x'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'w'v'r'j'v\2PNLNNN222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eee222DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\\\eee55==ffmmDD"";;||HH;;||ff55WjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=JNNNNNNNNNr]Bk2o'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'n'm'c2eUBNNNNNNNNN...222222222222222222222222222222222222222222222222222222222222222222BBB...222222222222222222222222222222222222222222222222222222222222222222BBB..LL""""..iimmPP++"";;HH..iirr88ޖަ޻þ޾ޯޙގގގގގގޙޯ޾û޻ަޖͺURN============================================================================================================NJHλͺͺͺͺͺͺYYY@@@JJJDDDBBBFFFPPPNNNJJJHHHUUUDDDNNN@@@YYY;;;TTT@@@BBBJJJLLLBBB|||FFFHHHBBBBBB;;;RRRLLLTTT@@@BBBDDDNNN@@@@@@BBBJJJ;;;FFFDDDJJJ888@@@PPPBBB888@@ooTTbb""==22""``ttLL''..++þ޾ޯޙގގގގގގގގގގގގޙޯ޾à\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@λͺ͹͸̸̸NNN;;;DDDLLL555;;;@@@TTTFFF555===@@@LLL===HHHDDDHHH@@@===@@@FFFBBB===BBBRRRPPPNNNFFF555HHHFFFDDDNNNDDDJJJHHHHHHDDDHHHPPPFFFJJJLLLWWWBBB@@@PPP===bbzzWW..wwHHYYWW22DD]]''++{~þ޾ޯޙގގގގގގގގގގގގގގގގގގޙޯ޾omkkkkmmmffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbTTTNJHλͺ̸̸̸̸HHHJJJ===TTTYYYHHHDDD]]]```UUUHHH@@@DDD;;;FFFHHH@@@FFFFFFBBBDDDUUUHHHFFFBBBDDD888JJJHHHWWWFFF===888BBBDDD;;;JJJDDD===NNNHHH===FFFFFFNNN===DDD===..'';;ZZWW""BBDD|JJee..""''@@HH..""þ޾ޯޙގގގގގގގގގގގގގގގގގގގގގގގގޙޯ޾gggtttpppppppppppppppppppppppppppppppppppppppppppppppptttzzzmmm\\\URN͹͸̸̸͸͸222BBBWWW@@@RRRJJJDDDNNN===PPP===TTTUUUJJJBBBHHHBBB\\\HHHDDD@@@HHHDDDUUUDDDNNNLLL======HHHHHHJJJBBBDDDNNNFFF===ZZZLLL@@@JJJ@@@===BBBBBBWWW@@@FFF==zzBB@@jjLLDDBBee55~~;;..22;;''DDWWbbRR55:;<*05#%'þ޾ޯޙގގގގގގގގގގގގގގގގގގގގގގގގގގގގގގޙޯ޾gggtttpppppppppppppppppppppppppppppppppppppppsssvvvwwwuuutttsssttttttuuuttttttttttttttttttttttttttttttttttttttttttkkk\\\͸͸͸͹͹͹TTT555HHHFFFBBB============\\\@@@FFFBBB___TTTPPP;;;RRRPPPPPP@@@@@@BBB@@@DDD@@@jjjrrr@@@BBBHHH@@@LLL@@@JJJRRRLLL===BBBNNNRRRFFFHHHNNNBBBUUU;;;DDD""22++""BBnn``''22RR~~wwDD88LL'']]\YYY:ITDYB\=T5H'5$þ޾ޯޙގގގގގގގގގގގގގގގކoo@@@@ooކގގގގގގގގގގގގގގގޙޯ޾gggtttppppppppppppppppppppppppppppppppprrrrrrnnnkkkjjjjjjiiiggggggggggggggggggggggggggggggggggggggggggggggggggggggonk͸͸͹͹ͺͺͺHHHHHHFFFHHHHHHDDDTTTDDD@@@===;;;FFFHHH@@@NNNLLLDDDBBBHHHLLLHHHLLLHHHJJJFFFBBBPPP@@@@@@BBBHHHFFFNNN===HHHBBBFFFHHH;;;@@@BBBJJJ@@@BBB===RRRFFF222""FFkkxx]]==\\..~ggccFFcc""t{rf\YYAP^RoRpNkHeD];R2D'8!.$޾ޯޙގގގގގގގގގގގގގގގކoo@@@@ooކގގގގގގގގގގގގގގގޙޯ޾gggtttppppppppppppppppppppppppppppppoookkkiiigggcccwtrýμ͸ͺϾμλξ͸ͺͺλϾ===ZZZFFFDDDPPPNNN888888HHHJJJHHHLLL```DDDFFFBBBDDDDDDYYYLLLRRRBBBFFFRRRBBBBBB@@@PPPLLLFFFBBBLLLFFFPPPLLL@@@DDDJJJJJJ===BBBFFFYYYHHHDDD222FFFUUU;;}22\\;;;;YY..88++{wx~;;++mmkkBB88@@BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++YYYcwwi]YY,UmWwTtTsPnHe@W5J.@+;+;+;'8!ގގގގގގގގގގގގގގގކoo@@@@ooކގގގގގގގގގގގގގގގgggtttppppppppppppppppppppppppoookkkgggeee___ομͺͺμλͺλμμͺͺμξDDDLLLDDD@@@@@@HHHFFFHHHRRRBBBYYYBBBBBBBBBJJJHHHjjjFFFDDDJJJRRRDDD888FFFFFFDDDDDDZZZUUUfffFFFDDDFFFHHHLLL;;;===gggHHHJJJPPP@@@BBB@@@NNNLLL;;;NNN;;;;uuHH++BB==DDZZDDUUNNJJ{}YYHH++LLBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++xrjkmu}|zmY#RlWxUv5cDgHc=T.@+;+;+;+;+;'5ގގގގގގގގގގގގކoo@@@@ooކގގގގގގގގގގގގgggtttppppppppppppppppppooommmiiieee___wñ͹͹͹ξͺλνͺͺλλμFFFPPPRRRHHHDDDDDD;;;===JJJDDDBBBPPPDDD]]];;;JJJNNNYYYBBB@@@\\\NNN@@@HHHDDD@@@BBBHHH@@@ZZZBBBFFF@@@NNNHHHNNN@@@DDD555===DDDNNNDDD===;;;HHHUUU@@@LLLLooss88~BB\ef'=c'5w88TTHHwz~""PPBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++vjijt}_SsTsRpJgDY;B;.25+;+;+;+;+;$,ގގގގގގގގގކoo@@@@ooކގގގގގގގގގgggtttpppppppppppppppoookkkgggbbbgebμͺͺ͹͸ͺϿϾͺμν888PPPBBBYYY;;;HHHPPPJJJ@@@RRRBBB@@@FFFNNNLLL;;;TTT@@@NNNBBBJJJYYYBBBJJJJJJDDDHHHTTT;;;DDDHHHRRRLLLLLLJJJHHHWWWJJJHHH;;;HHHBBBBBB@@@UUU===\\\RRRccggYYjj\\~g'U'']JF.8NY`o""88""@@BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++{k]`fs|YiyGWjFN[HTHDF.FFFFD".5+;+;+;59<ގގގގގގކoo@@@@ooކގގގގގގgggtttppppppppppppoookkkfff```c`];μμλͺͺ̸̸λμͻ͹̷ͺϾJJJ@@@===TTTHHHFFFBBBLLL@@@UUUTTT@@@;;;BBBLLL@@@HHHBBBJJJ======@@@HHHUUUDDDUUUFFFbbb===BBBFFFBBB===BBBFFFHHHJJJJJJJJJFFFLLLHHHNNN;;;___PPPDDDYYY..nnFFeeJJ88DD""@@''22v..k""RFF;@Bb22JJDD~|BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++vnku{Yp]vL`xBUjKV+LfZw{|HN;;..o""U=';+;=+FFFFFFFFFD".5+;EKOgggtttppppppoooiiibbbUUUλͺ͹̸˴ʴ˴˶̷ͺμϿμͺͺϿμ͹˶ʳʳ˴˶͹λνͺͺͺͺLLLHHH\\\DDD]]]HHHFFFBBBBBB@@@======JJJ@@@@@@FFFBBBHHHNNN@@@DDDNNNrrrHHH@@@@@@RRRJJJ888DDDBBB;;;TTTBBB```FFFNNNDDDYYYPPPDDDUUULLLBBBFFFBBB@@@JJJ""''jj{{]]@@|++j55|====88..n""L25@DP_mox~'';;88''@@;;}Zre\YYY;cvtW{8f5H@@8855w..k""T+@D"FFFFFFFFF6I=dfigggtttppppppmmmeeeYYYwoμμλͺνϾϿͺ̷˵˵˵˶̷͹ͺͺλμͺͺ͹͸̸̸˶ʴʲʳ˴͸ͺͺ͹͸BBBBBBBBB@@@DDDYYYFFFiii@@@ZZZFFF@@@PPPHHHDDDDDDBBB;;;NNNRRRTTT@@@LLLgggeee@@@HHHYYYZZZRRRDDDDDDUUUDDD===DDDDDDDDDBBBDDD@@@JJJDDDBBBDDDLLLHHH555ttzz;;R"+"D.@@FFFFBB;;..i"F@DP\efgpw++''BBZZWWUU''\r_YYYYFcxf8m@s+i]]5J@@@@;;55|''_'BFFFFFFFF)I)gggtttpppoooggg___LLLĵμͻͺͺͺͺͺ͸͹̸˶̷̸͸ͺͺͺͺλλͻͺ̸˶˶˶˵ʳʴ˵͹ͺͺ͸̸FFFHHH;;;LLLJJJHHHFFFbbbDDDBBBNNNRRR@@@DDD\\\PPPJJJFFF======FFFDDDBBBDDDNNNBBBYYYBBBWWWHHHFFFFFFBBBeeeJJJDDDFFFHHHLLLBBB===DDDNNNFFF@@@===DDDWWW""""88~''+'''YDDHHHHDD@@55{""T@@DJY]YZfnz''NNWWFF@@nn''sgcir\zi\YYYYe'mڤ2m5o@HDDDD@@88""U"DB'FFFFF)I)gggtttpppmmmcccWWWλͺ͹̸͸ͺ͹ͺͺ͹ͺͺͺͺͺͻμϾͺ͹͸͹̸˵˴˵͹Ͼλ͹͹DDDWWW@@@@@@NNN@@@BBBBBBBBBLLLDDDDDDDDD888@@@@@@BBBPPPJJJ@@@UUUPPPBBBHHHDDD;;;DDD@@@@@@FFFPPPDDDBBBDDDFFFBBBDDD===PPPHHHDDDHHHFFFTTTFFFHHH@@@ZZZ55BBJJTT=="2'""P@@JJJJFF@@55|''W";2222"+@JWcnv|WWmm""miic\YYZm\s_YYYY2gfi"jf+mf"PiDFFFDD55|'']F+B"J"FFF1L1gggtttpppiii___LLLžν͸̸̸͹ͺͺλλνμͻͺλμνμϾμ̸˶˵͹ͺͺDDDLLLUUUWWWbbb@@@FFFPPP@@@HHHFFFYYYUUUDDDWWWDDD;;;DDDHHH@@@HHHDDDBBBNNNJJJFFFNNNFFFDDDBBBfffNNNPPPFFFHHHRRRHHHBBBBBBFFF;;;\\\888HHHJJJ@@@@@@@@@''UU==NNeessBB''''|~|+=+;2''Z@@FFBB==22u""RB222222@J]ouu{88""""u_YYe\fZYYYYcb`]UWJ'JJ@FDD88~..n''YH+B"J"FF)I)vvvvvvgggtttoooeeeYYYeb_μ͸̸͹ͺμͺμμͺͺλϾμͺ̸˶͹ͻμ@@@FFF===@@@]]]BBB===LLLTTT;;;===WWWeeeDDDBBBcccHHHDDDDDDLLLFFF```FFFJJJNNNFFFBBBLLLDDDNNNBBBDDDDDDJJJFFFHHHPPPDDDNNNPPP;;;BBBHHHJJJ@@@NNNFFFFFF++iijj55DDZZ==++""}+.B2F2D"5B..k88~22v++c""N"="='@'B"=522"D_u~zt}""iYYm\|e\YYY@\R"T""L"J'\';|R8H}55|..o''ZF'BFFFvvvvvvvvvvvvgggtttmmmbbbTTTͺ͸͸ͺμμμͻͺλλ͹̸͹ϾϿWWWJJJJJJBBBBBBDDDHHHBBBJJJLLL222BBBDDDLLLDDDJJJeeeJJJ===NNN@@@TTTBBB888@@@LLLFFFUUUHHH\\\HHHDDDDDDBBB===@@@LLL@@@BBBFFF@@@NNNDDDLLL@@@@@@ZZZFFF``JJ;;ZZHH''BBHH~H5=2F5H2F+;.8FFB8'B+F.L.L'D5"+Db}~~iYZ\}g\YY1a1"T"JH"U";;;Uv;;55z'']FF85FF5N5vvvvvvvvvvvvvvvvvvgggtttkkk___LLL͹͸ͺνμͻͺͺμνλ͹͸ͺͺλWWWsssFFF@@@DDDJJJBBB@@@@@@UUUBBBPPP===BBBNNNBBBDDDZZZHHHTTTDDDJJJNNNFFFFFFDDD===DDDFFFDDDJJJUUUDDDTTTRRRBBBLLLJJJDDDLLLBBBDDD@@@@@@PPP===;;;DDD''ccPP``{{iiFDD;@5Y+='5+'"'"8'D.N2T.P'B"+Ff..\\..""_Yr\weYY+b+"U"FFF2p2'+_==22v..i''Z""NF;2F)I)vvvvvvvvvvvvvvvvvvvvvvvvgggtttttt]]]FFFſμ͹͹ͻλͺ͹ͺμμμλμͺͺͺͺ͹ͺͺμϿ;;;rrrPPPJJJ@@@PPPTTT@@@___TTTDDDNNNBBB@@@HHHDDD@@@DDDFFFBBBBBB===RRRBBBPPPDDDHHH@@@DDDDDDBBBNNNTTT@@@NNNYYYBBBgggTTTDDDDDDHHHWWW===DDDPPP@@@JJJ{|++++\\~~iiBBDD@@+2f"D""'".2"=.L2T2T+J".Ff""bbJJ55PP++''vuYi\|t\YJwJ2v2'\''Y'"R"HD+.;;8888;;55}++gJ;2='&6222ijlvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvgggtttfffbbb@@@μͺͺλϿλ͹ͺͻλμμμλͻλμμμͺ͹͹͹λFFF===DDDDDDBBBDDDJJJ888@@@LLLPPPLLLPPP@@@PPPWWW@@@bbbUUULLLBBBDDDNNNBBBBBBYYYNNNLLLNNNBBB@@@888FFFNNN;;;TTTDDD@@@ZZZJJJFFF@@@BBBHHH===DDDJJJLLL88;;@@''nH=B+2Y'8L+.J".5"+"+"++222'D.P2T.L".Fg~@@22''DDPPbbJJJAAA""WJz\c\vbYFF88885{52s2'\++'.2o@@DDDDBB;;++e"F222222!4vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvgggtttfffYYYJJJϿͺͺ͹ͺͺͺͺμμμλͺͺͺλ͹ͺHHHBBBPPPDDDBBB@@@WWWLLLLLL======@@@LLL@@@DDDLLLBBBBBBHHHLLLJJJBBBHHHHHHNNNDDDDDDJJJFFF\\\PPPHHHHHHHHH888FFFWWWJJJBBBDDDTTTUUUBBBHHHPPPDDD]]]FFFppDD..v8D'2\'.D'.="+;"+22=+."+5'+22";+J.P+J".Hi}55UUZZZZBBB888555555555555555555555555555555555555555555555++cg\wvcYYKK====;;5|5+i2+.++`DDHHHHDD@@55x""R2222222vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvgggtttfffYYY===μλͺͺϾλ͹͹ϾϾλͺͺͺͺͻνPPPBBB@@@\\\DDDHHH===DDDBBBRRRRRRBBBZZZFFFHHHYYYDDDLLLHHHDDDDDDBBBDDDDDDBBBHHHcccBBBFFFfffBBBWWWHHHLLLBBBcccBBBBBBDDDNNNHHHBBBUUUJJJFFFBBBeee@@@LLPP""LL==iYZe"H'FR+8B.5J+8F'85"=D25'."".'.25+F.L+J".Jk{==ii]]]\\\BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..is\~ssiYY@@@@==882gL".+""TBBJJJJFFBB88~''W;222222$/<vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvgggtttfffYYY===ϾλϿμͺ̸͹μμλͺͺν͹ͺλ555DDD===@@@;;;JJJHHHPPPHHHZZZrrrDDDFFFLLLTTTLLLDDDDDDDDDHHHLLLHHHLLLNNNFFFBBB]]]HHH@@@DDD@@@BBBBBBBBB===BBBLLLDDDDDDFFFHHH===BBBDDDWWWJJJ@@@888kkuu..88PP==..k"'}"WDj'8F2BH28F+5D.2B"+8.DL+2@.+.+22+F.N+J".Nrv{''TTTLLL........5522............@@bbi\xuwiYYBB==;;5eZ+="2;..iDDFFDD==55w""TB222222$/<vvvvvvvvvvvvvvvvvvvvvvvvgggtttfffYYY===λͺͺͺ͹̸̷̸͸μ͹͹ξ̸̸LLLBBBPPPNNNJJJ222@@@NNN@@@DDDTTTDDDDDDDDDLLLYYYWWWPPPNNN===DDDDDDFFFDDDDDDNNN;;;JJJJJJDDDUUUDDDFFFDDDJJJHHHJJJDDDNNNBBBRRRLLLFFFDDDFFFHHHJJJJJJ''WWWW;;JJ++22prmDW`zDYk5@J+8B2;F=@W"8=+.D'58".8+."25+H.P.L".Y~}{++..DDm\;;PP88rnuiZY@@@@@@5j].@2F.B5""T55|;;55|..i""N=";";"="822$/<vvvvvvvvvvvvvvvvvvgggtttfffYYY===͹͹νϾͺ͸̸˶˶̷̸͹ͻϾϾͺ͸UUU===JJJDDDJJJFFF@@@FFFBBBFFFFFFFFF@@@WWWDDDBBBHHHYYYRRRDDDPPPDDDDDDDDDDDDTTTDDD;;;UUUBBBjjjJJJLLLFFFDDDDDDPPPDDD===;;;fffBBBWWWLLL@@@BBBBBBLLL++BB88PP==BB55JJ\\''n'.]sL`z'@L2DL+=L5FT+=T';B2;J5@F.D.."+2"=.N2T.L"2g''==..~}++DD\++kkzz..""""roukZ[[@@@@@op'8j2F5H2F'55H""U""RJ";'D'D+J+J'B5vvvvvvvvvvvvgggtttfffYYY===͹ͺͺͺ͹͸͹ͺ͹͸̷˶˶͹ͺνϿͺμϿ@@@222LLLJJJFFFLLLDDDFFFBBBDDDFFFcccRRR@@@@@@JJJBBBJJJTTT@@@FFF]]]DDDDDDBBBWWWPPPBBBDDD@@@DDDFFFBBBDDD@@@BBBJJJPPPDDDBBBBBB;;;===RRRLLLFFFFFF===BBDD88..ZZss;;""''J`u+HP.BR';L'HH8DR5=R8FZ8BT"=D8L+5+2"2+H2U5Y.P"2HHggFF5555++ee..\22ZZHHZZJJumneYIIBB@umDD5=2L.@'8".'"+";+F.N2R.N'@$/<vvvvvvgggtttfffYYY===μͻͺ͹̸͸͹λͺ͹̸˶˶ͺνϾϾ͹˶̷̸ͺNNNDDD888BBBHHHWWWHHHFFFDDDDDDDDDNNNZZZ```BBBDDDHHH;;;]]]DDDDDDJJJUUUBBBBBBBBBTTTNNNDDDBBBBBBBBBPPPPPPFFFBBB======LLLFFFBBBJJJ;;;NNNJJJBBBFFFWWW""__mm55DDwDD8N]';N2P`'BW"@R2HW25L.8J+8F'BH'2D+5@"2+D2U8\8]2T@"2NNJJ]]||..++..==''\88ӏ88""\\zzbbvjk`YBB=YBBDD=@'2c"5""'".2'@.L2U2T+J$/>gggtttfffYYY===ͻͺ͹͸͸͹νͻ͸̷˶ϾξϾνͺ̸˶˶͹μνλUUUFFFBBBDDDHHHJJJTTTDDDLLL;;;NNNDDD===FFFBBBBBBWWWLLLFFFDDDDDDDDDDDDLLLDDD@@@NNN```FFFHHH===;;;DDDTTTFFFJJJFFF===FFFfff@@@@@@DDDccc@@@JJJ;;;UUU;;BB""DDzJN5JT5Re2H].=LTbv8=R+BN'DU2JR2DP'8@'+;".2U;`=f;`2Rt++++ggÀ@@88==++\..ȣYY88==poZYBb@@BD25i';R+.T'2"+"+""'225+F.P2T.L$/>gggtttfffYYY===μλͺ͹͹ͺͻμͺ͹͹ξνϾνͻͺ̷˶͸λϾͻμͻλμJJJRRRLLL===PPPDDDHHHDDDRRR]]]@@@HHHLLLnnnDDD@@@DDDBBBDDDRRRBBBFFF;;;UUULLLDDDDDDBBB===FFFRRRBBB]]]FFFFFFUUULLLJJJBBBDDD]]]JJJFFFJJJBBBPPP555DDD22..~prkBL8RgB`s;H`BTjFWj=J\;N_'=P'2N'8D"'8.F;b@i=g"8\o+ccDD..++\""||ƺDD{rY8@u28o'2J"+5'.@'2;.;'+"+8..22";+J.P+JgggtttfffYYY===Ͼλͺͺͺνͻ͹͹μμϾν̷̸͸͹̸͸ͺ@@@DDDWWWBBBDDDBBBDDDDDDDDDNNNUUU222FFFFFFDDDPPPLLLJJJLLLDDD\\\PPPbbb@@@PPPLLLHHHDDDDDD===BBB===HHHDDDFFFBBBDDDLLLHHHFFFFFF===BBBRRRFFFNNNPPP555FF'';;gg;;z}fxFcz.DN;@Z.@J@Nc+BN.LZ5@U'BR+=J+2B5=}2z2x2JJ++\..55++~kY~kubHg'BN'28+5H'2D'85";D.2'.""+'22"8+H.N+J$/>gggtttfffYYY===ͺ͸͸͹ͺλλϾλν̸̷̷̷̸λNNNHHHDDDBBBHHHFFF@@@]]]BBBDDDLLLFFFDDDDDDBBBPPPBBBNNNLLLJJJDDD@@@YYYPPPBBBJJJBBB===TTTDDDFFFUUU@@@LLLHHH```BBB\\\HHH@@@FFFDDDPPPBBBDDD888JJJNNNggDDFFss;;@@@@22kFF.JW;FP.HU+BP2FT5JH.BL+@@'8@PRWWDD""FF++\pYW25;@v"2=5DL28H.8F'.8".=.DJ'+;.'.+22+F.L+J$/>gggtttfffYYY===ͺ̷̷̷̸ͺνϾνϾμμμμͺξϿ͹͹͸͹Ͽ888JJJRRRLLLHHHRRRNNNDDD@@@BBBTTTDDDDDDNNNFFFYYY@@@BBB===PPPDDDHHHBBBRRRLLLYYYJJJPPPRRRTTT@@@LLL@@@BBB888NNNHHH@@@BBBFFFNNNDDDRRRHHHJJJFFF\\\@@@""88||À\\HH__''z''+DN2DL+BL+BW=B'8H+;J+8B'+L88FFTTNN++䂂TT_rvxV_v\uDZm2;B.8D2;F@@Y"58'2D+5@+5'+'25+F.N.L$/>55__ނނ__55gggtttfffYYY===͸̸̸˷˶̷ͺϾμͻͺͺͺλͻ͹ͺBBBDDD;;;FFFDDDBBBFFFTTTBBBBBBDDDJJJFFFDDD;;;PPPLLLPPP@@@DDDPPPDDDLLL===BBBDDD@@@@@@BBBNNNJJJFFFWWW\\\JJJLLLJJJDDDDDD888;;;LLLRRR@@@RRRLLL@@@NNN''NN22++22==NN..8855++++~"'`+8'@R8N+=B.=Y+=e55o8'WNNUU55''==..|{}zSnbLPXmYo'@J5FN.@L2@L5BZ'8@2=L5@D".@.2"+2";.L2R.L55__ނގގގގގގނ__55gggtttfffYYY===͹͸̸̷˷̸ͺμϿλͺͺͻμJJJFFFFFF;;;FFFTTTJJJFFFHHHiiiFFFFFFBBBBBBHHHBBBHHHNNNWWWBBBFFFBBB___TTT@@@DDDHHHDDDRRRBBB\\\HHHBBBDDDDDDLLLPPPDDDDDDRRR===@@@FFFNNNHHHTTTBBBBBBww""++55@@YYHHs2rHHFHHHBB55|{+""++22BBRRDD++@@BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++b\::Wp2HR.DR+=L+FH8@N.@T.BP8@R"=D;L".5'2.+F2T5W.P$/>55__ނގގގގގގގގގގގގނ__55gggtttfffYYY===ͺ͹͸̸̷̸ͺϾͺͺͺμBBBDDDRRRWWW===;;;DDDWWWRRRHHHTTTFFFLLLBBBHHH@@@BBBBBBFFFRRRcccYYYBBBHHHHHHeeeJJJBBBHHH@@@BBBHHHBBBBBBNNN555BBBUUUJJJJJJYYY888...@@@BBB===UUU888++rrxx88j8HHDDD;t@''++WW88''TTÀgg""''""BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++N=?@Te'@N8Rc.HZ"FU.BR55J2;P.;H'@H'.F'2@".'@2R5Z8]2R55__ނގގގގގގގގގގގގގގގގގގނ__55gggtttfffYYY===ͺ͹͸͹͹͸λ͸̸͹ͺͺͻμBBBBBBFFFFFFTTTBBBBBBBBBWWWBBBBBB===PPPRRRDDDJJJeeeDDD===@@@BBBRRRFFF@@@@@@DDDFFFDDDLLLFFFJJJJJJBBB===DDD@@@FFF@@@TTTBBBNNNRRRBBBJJJJJJBBBNNNRRR""~ffYYBB55..""'=22""++DD]]``==LLffBBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++QCF.HP.FZ.J]+@PN]s;FW+BL+BR2DL2HR'8='.8"52R8_=e;`2T55__ނގގގގގގގގގގގގގގގގގގގގގގގގނ__55uspmmm\\\UTRͻͺͺͺͺλμ̸̷̸͹Ͼͺμ555DDD@@@LLLPPP===RRR@@@@@@```DDDFFF222HHHHHHHHHFFFFFFTTTHHHUUU===LLLFFFFFFHHHDDDUUUDDDJJJLLLTTTHHHJJJRRRLLLBBB===FFFDDDfffFFFLLLDDDDDDZZZDDDUUU++..==''ZZmmmm@@..ZZ""""@@HH]]DD==__BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++3HU8Tg5Rb5DZBRg@N`=F_2J]"BR.8R".@"+8.@;`=g@i;`4AR55__ނގގގގގގގގގގގގގގގގގގގގގގގގގގގގގގނ__55ssskkk\\\μͺͺλͺͺͺμͺ̸͸̷̸ϾϾJJJ555555555\\\DDDBBBNNNDDDHHH===HHHTTT888======PPPFFFWWW888HHHPPPHHHJJJPPPrrrBBBBBB===;;;888DDDHHHWWW;;;HHHPPP555NNN\\\@@@DDDDDDLLL===LLLBBBLLL""BB..BB++"";;DDjjBBPPggTT..~55``ee""BBBFFFHHHJJJRRRJJJFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDBBB===888+++W57UZ`D`v+BN;@\2=J@Nc.FR.HW5=Y';N+BL'.BB5LY;DN+JR+@R2FR2HN5HT'=B'2=@DK55__ނގގގގގގގގގގގގގގގޖަ޻û޻ަޖގގގގގގގގގގގގގގގނ__55ͺ͹͹͸ͺͺ͹͹ͺͺμϾͺͻ͹˶̸λμλλλλͺLLLFFF;;;PPPBBBFFF======DDDBBB===WWWNNNJJJDDDPPP\\\YYYBBBHHHBBBFFFHHH===HHHNNNNNNBBBDDDBBBRRRDDDJJJDDDWWW===DDDHHHLLL888===HHHBBB@@@FFFHHHLLLHHHFFjjBBWW__''22DDDDDDPP''""LLff''{'HR8HP+=N'BTBF+@J'=F+=D'2Lގގގގގގގގގގގގގގގޖަ޻û޻ަޖގގގގގގގގގގގގގގގμλμͺͺͺͺ͹ͺͺͺμͺν̸˶͸Ͼͻμμͺͺͺμμ\\\UUU======NNNLLLPPP;;;TTTYYY555===888PPPFFFBBBBBBFFFDDDWWWJJJHHHJJJ@@@DDDBBB]]]bbb@@@DDD@@@BBBUUUBBBHHH888;;;ZZZDDDBBB===PPPDDDBBB===TTT888NNN''xx2288PPDD""..@@"";;kkxxee++6=G'BJ8N'=D.;H"=T25`ގގގގގގގގގގގގޖަ޻û޻ަޖގގގގގގގގގގގގμμμνλλͺͺ͹ͺϾϿͺͺλͺ̸˶ͻμλϿͺμμμϿμDDDDDDUUUBBBDDD@@@FFFJJJ@@@HHHFFFNNNFFFUUUFFFDDDDDDJJJLLLHHH@@@======TTTDDDBBBBBB\\\@@@```ooo@@@UUUBBBLLLDDDNNNDDDYYYJJJ555FFFBBB@@@;;;BBBHHH555DD""""__PPTTTT..''22DD\\cc88{{++JLBF@DDFBB88OOfގގގގގގގގގޖަ޻û޻ަޖގގގގގގގގގμμϾͺͺ͹̸̸̸ͺλλͺͺϾμ̸͹μϾBBB@@@===@@@HHHFFF555HHHLLLBBBLLLNNNHHHUUUBBBDDDPPPBBB@@@FFFLLLUUU===FFF]]]DDD@@@JJJFFFNNNWWW@@@@@@BBBFFFRRRRRRHHHDDDHHH@@@FFFHHH@@@FFF222NNN@@@""..RR__""88@@DD~BBii55RR{{LLDDPPJJHHFF==JJoގގގގގގޖަ޻û޻ަޖގގގގގގͺμμ͹˶˵ʴ˵˶͹λϾϿͺμμϾμμϾλDDDRRRDDDPPP@@@JJJRRR;;;FFFFFFLLL===;;;======;;;DDD888BBB222HHHFFFHHH@@@DDDPPP;;;@@@LLL===BBBUUUDDDLLLHHH888555BBBBBBNNN222BBBLLL===FFFDDDNNNHHH55==ffmmDD"";;||HH;;||ff55ގގގޖަ޻þ޾ޯޙޙޯ޾û޻ަޖގގގϿϾϿ͸˶˵˴˵̸ͺͺ͹λμμϿμͺͺνDDDBBBLLLHHHNNN===PPPYYY...BBBJJJJJJYYYFFFDDD===RRRDDDNNNNNN;;;NNNeeeHHHDDDNNNPPPBBBFFFFFFLLL@@@DDDBBBNNNFFFBBBJJJDDDHHHBBB___FFF555FFFPPPBBBDDD..LL""""..iimmPP++"";;HH..iirr88ͺͺ˶˶μνμμλλϾͺ̸͸͸ͺμͺ͸̸ͺͺλλͺͺͺͺͺͺͺͺ˶˶ƛURN============================================================================================================NJHͺ|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY@@ooTTbb""==22""``ttLL''..++D]Jf@Y.B"2͸˶˴̷μμμμμμμλͺ͸͸ͺͻϿμͺλμμμλͺ͹͸̸̸͸˶˴̷ˠ\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@cccbbzzWW..wwHHYYWW22DD]]''++{~;SePoJgBZ2D+;ν˷̸ͻμϾμμμμνμͻͺͺͺͻͺμͺ͹λνλλͺ̸̸̸̸ν˷̸ͻμϾonkkkkmmmffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbTTTNJFccc..'';;ZZWW""BBDD|JJee..""''@@HH..""PoJgB\2F+;#ϾϾμμμμμμϿͺ͸̷͸ͺͺλͺμμͺ͹͸̸̸͸͸ϾϾμusrԋ|||ssspppppppppppppppppppppppppppppppppppppppppppppfffYYY===dzccc==zzBB@@jjLLDDBBee55~~;;..22;;''DDWWbbRR55;VkPoLiD]5H+;!,λλͻμμμμϾ͹̸̷̸ͺμμͺͺλ͹͸͸͸͹͹͹λssstttttttttttttttttttttttttttttttttttttttttttttuuuuuurrrppppppppppppppppppppppppppppppppppppfffYYY===dzccc""22++""BBnn``''22RR~~wwDD88LL'']]\YYYNjRp@gYxNm5H#19ͻ͹͹ͺͺͺͻͺͺνμͺ̸̸͹μλͺͺ͸͸͹͹ͺͺͺͻ͹uspgggggggggggggggggggggggggggggggggggggggggggggiiijjjmmmnnnppp{{{ʗrrrppppppppppppppppppppppppppppppfffYYY===dzccc""FFkkxx]]==\\..ggccFFcc""t{rf\YYTt_2oY+g+L.Pc+?Mλͺ͹̸͹͹ͺμϾλͺνμμμ͸ͺϾμλξ͸ͺͺλϾλͺ͹̸͹͹ͺμϾλͺνμμμ͸ͺϾļ}{oootttшpppppppppppppppppppppppppppfffYYY===dzccc;;}22\\;;;;YY..88++~~;;++mmkkBB88@@S_\\\\\\\\\\\\\\\\\\\\ZLYYYcwwi]YY?Yl]gk2t2+b+J@81DSλͺ͹̸̸͹ͻͺͺͺμμͺͺμλͺλμμͺͺμξλͺ͹̸̸͹ͻͺͺͺμμͺͺμnnnvvv骪rrrpppppppppppppppppppppfffYYY===dzccc;;;;uuHH++BB==@@TT==PPNNLL""YYHH++LL++++++++++++++++++z}Z++++++++++++++++++xrjkmu}|zmYe.sR.k.'W'HB"@EHλͺ͹͹͸ͺμλͺ͹͹͹ξͺλνͺͺλλμλͺ͹͹͸ͺμλͺ͹͹͹ξͺλƶppptttppppppppppppppppppfffYYY===dzcccLLLLooss88~;;ZZ..55NNggWW""PP888888888888888888f888888888888888888vjijt}_Ul~e.k.'Y'JFFλͺͺͺͺλνμͺͺ͹͸ͺϿϾͺμνλͺͺͺͺλνμͺͺ͹͸ͺϿǿzwutttpppppppppppppppfffYYY===dzcccccggYYjj\\~|sop""ns++}BB@@ttx''88~{@@==================v=================={k]`fs|Y)eo.o..k.']'JFLWLνͺͻνͺͺͺμμμμλͺͺ̸̸λμͻ͹̷ͺϾνͺͻνͺͺͺμμμμλͺͺ̸̸λμxwv|||rrrppppppppppppfffYYY===dzccc..nnFFeeJJ88DD""@@''tD+.+2222222.2+H"c22m==u88tz~|BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBvnku{YAvA5|52u2.j.'W'F9N9μͺͺͺξξͺ͹͸ͺλλμ̸˶̷͹λλμ̷˴˵˶͸ͺͻͺͺλμͺͺͺξξͺ͹͸ͺλλμ̸˶̷͹λλμöxvt檪ppppppppppppfffYYY===dzccc""..;;RR``''""__NN""w+";22222222222''BLcsDD''''55}xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD}mY88885|5.o.+b+J)I)νͺ̸͹λͺ͸͸ͺϾ͹˵˴˵̸͸Ͽλμ͸ʴʴ˴˵˶͸ͺͺͺͺμνͺ̸͹λͺ͸͸ͺϾ͹˵˴˵̸͸Ͽλμ͸Ͼzwu鈈pppppppppfffYYY===dzcccz..JJFF22''PU+H";2222222222228@Tg22PPeeBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF}um`YYff;;;;8~82u2+g+"R"F,;+;+;'8%ͺ̸ͺμϿμμμλͺ͹̸˴ʴ˴˶̷ͺμϿμͺͺϿμ͹˶ʳʳ˴˶͹λνͺͺͺͺͺ̸ͺμϿμμμλͺ͹̸˴ʴ˴˶̷ͺμϿμͺͺϿμ͹˶ʳppprrrppppppfffYYY===dzccc""''}JY+J+H+H'D'D'D'D'D'D'D'D"=22.'@N\k{'';;88''@@;;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFre\YYY==;;885z5.j."U"F2F+;+;+;'8ͺ͹͹͸͸ͺμμμλͺνϾϿͺ̷˵˵˵˶̷͹ͺͺλμͺͺ͹͸̸̸˶ʴʲʳ˴͸ͺͺ͹͸ͺ͹͹͸͸ͺμμμλͺνϾϿͺ̷˵˵˵˶̷͹ͺͺλμͺͺ͹͸̸̸˶ʴʲʳvvv՗ppppppfffYYY===dzcccY=W8\;c;b8_8]8]8]8]8]8]8]5W+F5"+@NYcn{++""BBZZWWUUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFr_YYYYVV@@==;;5z5.i.'Y'F.GJ2D.B+=+;+;#ͻͺ͹̸͹ͺϾμͻͺͺͺͺͺ͸͹̸˶̷̸͸ͺͺͺͺλλͻͺ̸˶˶˶˵ʳʴ˵͹ͺͺ͸̸ͻͺ͹̸͹ͺϾμͻͺͺͺͺͺ͸͹̸˶̷̸͸ͺͺͺͺλλͻͺ̸˶˶˶˵ʳʴ®nnnrrrpppfffYYY===dzccc""""88~J2TBmDpBn@k@k@k@k@k@k@k@k=f5Y'B"+@N\`gpu|''NNUUDD@@nnFFFFFFFFFFFFFFFFFFsgcirFFFFFFFFFFFFFFFFFFzi\YYYY@@==;;5z5.i."U"F'HZ"H=@+28+;Ͽͺ͸͹ͺϿλͺ͹̸͸ͺ͹ͺͺ͹ͺͺͺͺͺͻμϾͺ͹͸͹̸˵˴˵͹Ͼλ͹͹Ͽͺ͸͹ͺϿλͺ͹̸͸ͺ͹ͺͺ͹ͺͺͺͺͺͻμϾͺ͹͸͹̸˵˴˵tttňpppfffYYY===dzccc55BBJJTT==~~B8\FuHxFvDsDsDsDsDsDsDsDsBm;b.L".@RZbgjjrw{WWkkFFFFFFFFFFFFFFFFFFmiic\YYZmFFFFFFFFFFFFFFFFFFs_YYYY==2t=J5B2822.+.!4E+5+.+.'.'8*ͺ͸͹ͺν͸̸̸͹ͺͺλλνμͻͺλμνμϾμ̸˶˵͹ͺͺͺ͸͹ͺν͸̸̸͹ͺͺλλνμͻͺλμνμϾμ̸˶˵ϿooopppfffYYY===dzccc''UU==NNeessBB''''to88_HxJ|J{HwHwHwFvFtDrDpBo@j;`.N".DT]bfjjptt{88""FFFFFFFFFFFFFFFFFFu_YYeFFFFFFFFFFFFFFFFFFfZYYYY&XF";22222222222ϾϾ͸̸͹Ͼμ͸̸͹ͺμͺμμͺͺλϾμͺ̸˶͹ͻμϾϾ͸̸͹Ͼμ͸̸͹ͺμͺμμͺͺλϾμͺ̸˶͹|w{{{sssfffYYY===dzccc++iijj55DDZZ==++jY25ZHzJ}J{HxHwFtBo@j=f;c;c;`5W+H5@NZ''W\jnu|zt}FFFFFFFFFFFFFFFFFFiYYmFFFFFFFFFFFFFFFFFF|e\YYYIP^+H";222222222222#(2λͺ˷˶̸ͺϾͺ͸͸ͺμμμͻͺλλ͹̸͹ϾϿλͺ˷˶̸ͺϾͺ͸͸ͺμμμͻͺλλ͹̸͹ppp|||fffYYY===dzccc``JJ;;ZZHH|"+Y"2.=F+WHwJ}J{HwDp=g8\2U.N+J.L+J+F"=BF'=8+=BRiw}}FFFFFFFFFFFFFFFFFFiYZFFFFFFFFFFFFFFFFFF}g\YY+H";222222222222"1ͺ͹˶̸λ͹͸ͺνμͻͺͺμνλ͹͸ͺͺλͺ͹˶̸λ͹͸ͺνμͻͺͺμνλ͹͸ͺĶnnnfffYYY===dzccc''\eH.U''_'']''Y''Z..n+;v@fFv@k8\.L'B"82255.@FH""LJF'=@Pm++\\..FFFFFFFFFFFFFFFFFF_YrFFFFFFFFFFFFFFFFFFweYY@N+H";222222222222%3[^dIPXQW^ͺ͹̸ͺμ͹͹ͻλͺ͹ͺμμμλμͺͺͺͺ͹ͺͺμϿͺ͹̸ͺμ͹͹ͻλͺ͹ͺμμμλμͺͺͺͺɺmmmfffYYY===dzccc{|H.m22r;;8855}55}8828x'5"5+R".W"2+=."8=8=F""L''Z''\""RF+;De""bbHH55PP++FFFFFFFFFFFFFFFFFFuYiFFFFFFFFFFFFFFFFFF|t\Y4n4HN+H'B'@"="="="="="="="="822+.;FT2BR8DRμͺ̸ͺμͺͺλϿλ͹ͺͻλμμμλͻλμμμͺ͹͹͹λμͺ̸ͺμͺͺλϿλ͹ͺͻλμμμλͻλμμμͺjjjuuufffYYY===dzccc8888@@BB@@@@@@@@'2f'8"2='5@2B".+5"5.+22FH'']++g++c''YFFj@@22''DDPPbbFFFFFFFFFFFFFFFFFF\cFFFFFFFFFFFFFFFFFFvbY_v_5{5LP5W8_8]5Z5Z5Z5Z5Z5Z5Z5Z2T'@2+.F.;N2=NIPXν̸˶͹Ͽͺͺ͹ͺͺͺͺμμμλͺͺͺλ͹ͺν̸˶͹Ͽͺͺ͹ͺͺͺͺμμμλͺͺͺiiiuuufffYYY===dzcccppDD..P;FFFFFFDDDDDD2R+@"5B2;'+=';F'8+;'2;"2"+"'"'FF''\..j22s..k'DYu55UUZZZZFFFFFFFFFFFFFFFFFFcgFFFFFFFFFFFFFFFFFFwvcYY5w5LT@jBnBm@i@i@i@i@i@i@i@i;c5W"=+.FPZP))IFF˷˴̸ͺμλͺͺϾλ͹͹ϾϾλͺͺͺͺͻν˷˴̸ͺμλͺͺϾλ͹͹ϾϾλͺͺͺgggtttfffYYY===dzcccLLPP""LL==_;JJJJHHHHHH@B8F"8B+5D;@'BF"5D+8D+5'+=+;"+2".'@F''W..m55{22u=Fk{==iiFFFFFFFFFFFFFFFFFF''..isFFFFFFFFFFFFFFFFFF~ssiYYKqK2s2D_FtFvFuDrDrDrDrDrDrDrDrBm;`+J'2FCSC55NFFFF˶ʴ˶͹ϾλϿμͺ̸͹μμλͺͺν͹ͺλ˶ʴ˶͹ϾλϿμͺ̸͹μμλͺͺgggtttfffYYY===dzccckkuu..88PP==..'YHHJJHHHHHH+;s+BJ28B.+F+5H8D+;P.8B22H+8@+2B+.8"+;'2"'2F''W..m55|22tc.xw{''FFFFFFFFFFFFFFFFFF==eeiFFFFFFFFFFFFFFFFFFxuwiYY+\=;gHxJ|HzFvFvFvFvFuDsDrBo@j;`.N;@+FTFFFFF^^eϾ˵ʴ˶͹ͺλͺͺͺ͹̸̷̸͸μ͹͹ξ̸̸Ͼ˵ʴ˶͹ͺλͺͺͺ͹̸̷̸͸μ͹͹gggtttfffYYY===dzccc''WWWW;;JJ++8iNDDDDDBB8R;H+8B+5P+=D2D]+8N+@H.2H'BH=J.@B".;"'."+'D''W..j=5tj'H~|{FFFFFFFFFFFFFFFFFF..DDmFFFFFFFFFFFFFFFFFF;;PP88rnuiZY"N28bHzJ}J{HxHxFvDrBm@j=g=g;c5Z+J=@+=GIFFFF))I˶˴˶͸͸͸͹͹νϾͺ͸̸˶˶̷̸͹ͻϾϾͺ͸˶˴˶͸͸͸͹͹νϾͺ͸̸˶˶̷̸͹ͻϾϾgggtttfffYYY===dzccc++BB88PP==BB55JJTY..\;L.;B'FJ8DP8@J5N\8R`.DL5D\+5L.BL5JL'2;5='.".8W;;TTDDBB..~}FFFFFFFFFFFFFFFFFFDD..++FFFFFFFFFFFFFFFFFF++kkzz..""""roukZnns!*C.WHxJ}J{HxDs@j;`5Z2T.N.P.P+J'BB'B"DFFFF̸͹νͻͺ͹ͺͺͺ͹͸͹ͺ͹͸̷˶˶͹ͺνϿͺμϿ̸͹νͻͺ͹ͺͺͺ͹͸͹ͺ͹͸̷˶˶͹ͺνϿͺμgggtttfffYYY===dzcccBBDD88..ZZUY2D;H'BP'BL5DW2DRDRi8@P.HP"=L5@Y+=J'@N".@.;'.+"Jz88bbeemmFF5555FFFFFFFFFFFFFFFFFFbb@@@555FFFFFFFFFFFFFFFFFF22ZZHHZZJJumneY::^""T""P""R++g@vFtHxBo;`2R+H'@"85"8"8"5=FFHHFFFKKWϿϿμͻͺ͹̸͸͹λͺ͹̸˶˶ͺνϾϾ͹˶̷̸ͺϿϿμͻͺ͹̸͸͹λͺ͹̸˶˶ͺνϾϾ͹˶̷̸ͺgggtttfffYYY===dzccc""__efH2B2H2@D+;@5FN.@L=N`2@P8Ym=Pb'@L.FL'@='8D"55".;+8'pLL]]LL]]||..FFFFFFFFFFFFFFFFFF..@@@@@555zFFFFFFFFFFFFFFFFFF88ӏ88""\\zzbbvjk`Y**Y++g8855|55w55w8825v"2.H.U.Y";';.";;5'=F""L''W''Y""NFFͻͺ͹͸͸͹νͻ͸̷˶ϾξϾνͺ̸˶˶͹μνλͻͺ͹͸͸͹νͻ͸̷˶ϾξϾνͺ̸˶˶͹μgggtttfffYYY===dzccc;;BB""~;=BDT5=P;;T@Ri8DZ2;L+@P8FU'=J2DN"FJ"5F".@'2`{++++ggÀ@@88==FFFFFFFFFFFFFFFFFF..@@@555JFFFFFFFFFFFFFFFFFF..ȣYY88==poZYDDv22v==@@@@======+5j'8.;'.F2D""..8"2.".52FH'']++e''_""RFμλͺ͹͹ͺͻμͺ͹͹ξνϾνͻͺ̷˶͸λϾͻμͻλμμλͺ͹͹ͺͻμͺ͹͹ξνϾνͻͺ̷˶͸λgggtttfffYYY===dzccc22..~F;H8=N8BN2@L@Ue+FR;=TDUj5BR'=J'@R";D"8@8'5xz~ccDD..FFFFFFFFFFFFFFFFFF..@@@555WvFFFFFFFFFFFFFFFFFF""||ƺDD{rY====FFFFDDDDDDDD.P+@"2@5;"+82;"2+=".8"."+''FF'']..j..n++g//NϾλͺͺͺνͻ͹͹μμϾν̷̸͸͹̸͸ͺϾλͺͺͺνͻ͹͹μμϾν̷̸͸gggtttfffYYY===dzcccFF'';;gg;;z}.FW8BL5FR+LN+BY@Lb.;N58L+FJ+8L+8@.2;}55JJFFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFF..55++~kYDDBBJJJJHHFFFFBD.@5='2@8='=B'5D+8F'5+.B'5"+2"."BF''Y..m55z22s22Tͺͺ͸͸͹ͺλλϾλν̸̷̷̷̸λͺͺ͸͸͹ͺλλϾλν̸̷̷gggtttfffYYY===dzcccggDDFFss;;@@@@"8;D+@J';L"DW8JZ.;N2;R5@H;=FD@BcgWWDD""FFFFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFFpYdzBBJJJJJJHHHH.;x+FJ+2='.B"2B"8D+=N.8=+2B.8B+5H+.8+;"+"'2F""U..m55}22vII^ͺͺ̷̷̷̸ͺνϾνϾμμμμͺξϿ͹͹͸͹Ͽͺͺ̷̷̷̸ͺνϾνϾμμμμͺξϿ͹͹gggtttfffYYY===dzccc""88||À\\HH__''gU'5DDL+BU'8H'HU"DL8;F_58j@@FFTTNNFFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFFrv}R_FFFFFFFF5P"@R.;F+5R+;F2F_.8T.@L..F'@D;F+;@"2="'."+"F''W..j55x??nͺ͸̸̸˷˶̷ͺϾμͻͺͺͺλͻ͹ͺͺ͸̸̸˷˶̷ͺϾμͻͺͺͺλͻgggtttfffYYY===dzccc''NN22++22==NN..8855++++}t"'r"'U2;U;Bu+u}NNUU55''==..|{}FFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFFntgpp.5n"=L.=B'BB8DP5@F8R`2LW.BJ2;T+=N'=H.DB+.;5='+"555Ghhyͺ͹͸̸̷˷̸ͺμϿλͺͺͻμͺ͹͸̸̷˷̸ͺμϿλͺͺgggtttfffYYY===dzcccww""++55@@YYHH""++22BBRRDD++@@JJJJJJJJJJJJJJJJJJTT22@@@555JJJJJJJJJJJJJJJJJJbm~jOZg9?D.B8H'BP+DN2BU=RcBL`5@N2HP2HZ5;W.=J+DN+;.;".'"9;<ͺλμͺ͹͸̸̷̸ͺϾͺͺͺμͺλμͺ͹͸̸̷̸ͺϾͺͺͺμgggtttfffYYY===dzccc++rrxx88''++WW88''TTÀgg""''""RRRRRRRRRRRRRRRRRR䂂++++++++++++++++88@@@555""''""""""""''''RRRRRRRRRRRRRRRRRR2D5H+=B+=B8JU5FU;Nb2BT+N`;N_+BN+DL+@@'8H"55"2;".+ADG͹ͺμμͺ͹͸͹͹͸λ͸̸͹ͺͺͻμ͹ͺμμͺ͹͸͹͹͸λ͸̸͹ͺͺͻμgggtttfffYYY===dzccc""~ffYYBB55..""22""++DD]]``==LLffJJJJJJJJJJJJJJJJJJ++..@@@555JJJJJJJJJJJJJJJJJJCLV.AS2=R=;U@To8@U.8J5J].BR'BL5FR"@D"5B'2B".;>BͺͺλμϾͻͺͺͺͺλμ̸̷̸͹ϾͺμͺͺλμϾͻͺͺͺͺλμ̸̷̸͹Ͼͺμutsmmm\\\UTRdzccc++..==''ZZmmmm@@..ZZ""""@@HH]]DD==__HHHHHHHHHHHHHHHHHH..@@@555HHHHHHHHHHHHHHHHHH:CT25D8BP;HW=N_+@P8@RDRc5DT+=L+FR"8F8@!.:ijk͹ͺͺͺμμμͺͺλͺͺͺμͺ̸͸̷̸ϾϾ͹ͺͺͺμμμͺͺλͺͺͺμͺ̸͸̷̸ϾϾϦssskkk\\\dzccc""BB..BB++"";;DDjjBBPPggTT..~55``ee""FFFFFFFFFFFFFFFFFF..@@@555FFFFFFFFFFFFFFFFFF5HU5BJ2DR.TZ+HZ@H].;N.8F'FJ'8J+=D.2;;BGͺͺͺ͹ͺͺͺͺμλλμͺͺμϾͻλϾͻλͺ̷̷ξͺͺͺ͹ͺͺͺͺμλλμͺͺμϾͻλϾͻλͺ̷̷Ħusponmάdzccc""++''rrmm88''RRBBUUnnTT552288""BBBBBBBBBBBBBBBBBB..@@@555==BBBBBBBBBBBBBBBBBBuxy4EM2FN+;P.DY8HZ+8L5;U5@J.BH+BF?BNͺ͹͹͸ͺͺ͹͹ͺͺμϾͺͻ͹˶̸λμλλλλͺͺ͹͹͸ͺͺ͹͹ͺͺμϾͺͻ͹˶̸λμλλλλͺ̬dzcccFFjjBBWW__''22DDDDDDPP''""LLff''{LLL@@@555N+.8EN4O[+BT2BU+FU+DP&AJ7<@O(,μλμͺͺͺͺ͹ͺͺͺμͺν̸˶͸Ͼͻμμͺͺͺμμμλμͺͺͺͺ͹ͺͺͺμͺν̸˶͸ϾͻμμͺͺͺμμƬdzccc''xx2288PPDD""..@@"";;kkxxee++BBB888AAAraaT57DFL*>IC=CQ,/O35μμμνλλͺͺ͹ͺϾϿͺͺλͺ̸˶ͻμλϿͺμμμϿμμμμνλλͺͺ͹ͺϾϿͺͺλͺ̸˶ͻμλϿͺμμμϿμdzcccDD""""__PPTTTT..''22DD\\cc88{{++TTT\\\BBBJJJμμϾͺͺ͹̸̸̸ͺλλͺͺϾμ̸͹μϾμμϾͺͺ͹̸̸̸ͺλλͺͺϾμ̸͹μϾʬǵccc""..RR__""88@@DD~BBii55RR{{LLDDPP]]]ͺμμ͹˶˵ʴ˵˶͹λϾϿͺμμϾμμϾλͺμμ͹˶˵ʴ˵˶͹λϾϿͺμμϾμμϾλάccc55==ffmmDD"";;||HH;;||ff55ϿϾϿ͸˶˵˴˵̸ͺͺ͹λμμϿμͺͺνϿϾϿ͸˶˵˴˵̸ͺͺ͹λμμϿμͺͺνΧ|||..LL""""..iimmPP++"";;HH..iirr888oWjew\nZm`s+i{g|"cu']n2n]p"fzWi5rRb.k~Yj\oewf{Zmg`tcv\n\oRc.i{"fx2k}Wj\nZj'ewYkWi\o"`sP`"\m]p"btN]Wi"i}ZmPbͺͺ˶˶μνμμλλϾͺ̸͸͸ͺμͺ͸̸ͺͺλλͺͺͺͺͺͺ|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY"gzRc_s"ewJYRcWi.j}_rJZUgYkfzTecx]rbtYkTfWjbu\nUgZm+j|'j~"g{_sJZbu`t\o"g{\oezbucw_rex.gz_scwfz5n\nWi"j}Te͸˶˴̷μμμμμμμλͺ͸͸ͺͻϿμͺλμμμλͺ͹͸̸̸ccccv"buTc.m8o`sZk@sBv2m~buWi]pRcbubvYj`t_s\o_s2mbu`tZm]pL]"cvbu5n]oTeL]Zm]pRb"bu]pTf+evcwUg_s_s"g|Tf\nUgν˷̸ͻμϾμμμμνμͻͺͺͺͻͺμͺ͹λνλλͺ̸̸̸̸cccf=;snsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnf=;DRZk2nYj.j}cv\o"g{Ug'g{Tf.k~2m'bs\nbvZm=scvZkWibv]p2m]r"g{"ewTeTfbubt"btZm]o'g{_rTe;pewYjcwWjUgZnZm5oYk`tϾϾμμμμμμϿͺ͸̷͸ͺͺλͺμμͺ͹͸̸̸͸͸dzcccsn޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻ƒsn.j}HWbv_rZnUgTeUfUf;rYkbu\n@t2k}'i|P`+i|+i|'i}YjWjZmWj]pYkP~\YkZnbuWj"cuYkcv'j~"ewTe\n+ev'j}`tcv'fxZm2k~P`_rλλͻμμμμϾ͹̸̷̸ͺμμͺͺλ͹͸͸͸͹͹͹dz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻sncwbu`sbtbuZk.m]oYjTfRb`u"`sWi"fxfx_s\obt"ewbtewbucv_sZm+gzWjYjZmcw`t"gzUg']nZm_rexP`Wi\obtYk\nTe.i{`tBPͻ͹͹ͺͺͺͻͺͺνμͺ̸̸͹μλͺͺ͸͸͹͹ͺͺͺdz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ."""""""""""""""""""""""""""""""""""".ރ޻snUf;pbu_s'j}+evN_N]buew"]o'cvDv]o_rZn_r]r8n"ew.i{\o_r'k\n\nYj+fx"cv_sZm"fz`t'i{"cvWi]pex'bsTeZm]n8pbv\oFU`s.mλͺ͹̸͹͹ͺμϾλͺνμμμ͸ͺϾμλξ͸ͺURNNLHĬdz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ"޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲"ރ޻snP"u1}_s"ev_sYjYjbubv"_p.j}Yk5pZk\nZmbtcxR~]o]p"`s+i|]pL\bv`t_r]r;p8k}Lz_s]p`ubuexRbUfL|bu"cv"i}Te\nWj"g{fxP`+fxλͺ͹̸̸͹ͻͺͺͺμμͺͺμλͺλμμͺ\\\\\\TTT@@@dz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ"ޫtggggggggggggggggggggggggggggggggtޫ"ރ޻sn"|xtv|}wsuy]o+i{+j|cv]p]pPbTefzZkZk'j}_r=tP`"bt'fx8pZmWi=r"fzWibu]pYjZm`tWi8p\n`sYj"fzbt"i}Wj]pHWTc]p'fx_sTeRcbu2nWgλͺ͹͹͸ͺμλͺ͹͹͹ξͺλνͺͺλλμonkkkkmmmbbbTTTNLLdz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ"ޫggޫ"ރ޻sn===777IJ"zj_cYi_znuzntutsgf\bYi_znzL\'g{Zm8pPbcv'j}'`rTe'k\oYj_ri}"cvRb.k~Wj"fx\ocv5o\n"`sbu]obu2i{Rc]pbv+j}+ctg{'`r`t8ncwcvRc"_p\o\oYk2mTe=r'j}λͺͺͺͺλνμͺͺ͹͸ͺϿϾͺμνgggtttfffYYY===dz.8JZ]p`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ"ޫggޫ"ރ޻snQITREWRBYP=YP;YP;YP=YRBYPEW777μPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_zRXRl#"cvWiTf2j|bt]nYji}Wi5k}.k}WiRcZm'evYkbuZmcvTeUfYkex2m]o.m_sFwUg\o`sZmUfZmbubv"btexcv_s'cu`s"g{P`Bu+i{]p8oνͺͻνͺͺͺμμμμλͺͺ̸̸λμͻ͹̷ͺgggtttfffYYY===dz.8JZ]p`t`t`t`t`tbu`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tbu`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tcccsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻snVTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=ͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{ B DFJNRUWU^`tbu]pWjUf+i|Wi_pZmZn@t'j}ZnYjbu"_r]o+i|5o.i{+i|Uf+`r`s\o"cvbucv'i|P`cvL|\n]pZn_s\o_s]r_s+j}+gx"i|Wg]p_r5k}Ugμͺͺͺξξͺ͹͸ͺλλμ̸˶̷͹λλμ̷˴˵˶͸gggtttfffYYY===dz.8JZ]p`t`t`t`t]rbu`t`t`t`t`t`t`t`t`t`t`t`t`t]rbu`t`t`t`t`t`t`t`t`t`t`t`t`t]rcccsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻sn]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=Yϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_ukFHHJFDD>6!_\oTf2k}8o_sYjYk_s"fxRcDu]pbvZm8o+mUfBs'g{.j}.gx\n'ew\ncw`uR~Yj"fx'ewRc=p'i{bvZmZmZm\n_r\o`t]r_rWiN{]p'j}]oνͺ̸͹λͺ͸͸ͺϾ͹˵˴˵̸͸Ͽλμ͸ʴʴ˴˵˶gggtttfffYYY===dz.8JZ]p`t`t`t]rUeHwbu`t`t`t`t`t`t`t`t`t`t`t]r.\jP|bu`t`t`t`t`t`t`t`t`t`t`t]r"Wgcccsn޻ނ"ޫgsn޻ލރރރރރރރރރރރރރރރރރރރރރރލ޻sngޫ"ރ޻sngTosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YPCW000ҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;s""DD22wTDB@;8BDHPfwiTg|_r=p]r;tcv_rZm\oYkTfUgcuWiYkbu\nbu'evYk]p+ewZ"`sYkWj+j|ewN_\nZmRb2i{\nBubui}]p8n'g{]r2mew\obuZmWg"cuͺ̸ͺμϿμμμλͺ͹̸˴ʴ˴˶̷ͺμϿμͺͺϿμ͹˶ʳʳ˴˶͹gggtttfffYYY===dz.8JZ]p`t`t]rUe`efbimHwbu`t`t`t`t`t`t`t`t`t]r.\jP|bu`t`t`t`t`t`t`t`t`t]r+Zjcccsn޻ނ"ޫgsn޻ނ."""""""""""""""""""".ރ޻sngޫ"ރ޻sns^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y.;;__wg5=BBDHD=#ZnZm\oWj\n5pbuP}Wj8rbuYk+fxcv_s_s\oRc"gz+j}2k}Yj"cvL{JxYk`s5o=p.i{_s_r2m]pUf]p_r]pZn_rYkew_r\o\ng|buJYͺ͹͹͸͸ͺμμμλͺνϾϿͺ̷˵˵˵˶̷͹ͺͺλμͺͺ͹͸̸̸˶ʴʲʳ˴͸gggtttfffYYY===dz.8JZ]p`t]rTcZ_`jjjkkkksuJxbu`t`t`t`t`t`t`t]r.\jP|bu`t`t`t`t`t`t`t]r.\jcccsn޻ނ"ޫgsn޻ނ"޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲"ރ޻sngޫ"ރ޻snzc`eijkkkjigfcb]|ZuUkNw`FkU=_P;YP;YP;YPCWHZe`trgkkknnnjjj```RRR:::>>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5A;;..vumB@8+`sbtRbg|"`s"_rbuFw]p\o"fz+i|Wj]o;r+i{cw`tTeUg`t]oZm_s'fz\n5o\o5ncv_s`s\oJx"`s]p_s"`rf{\oUf]p'fx`tYjTe]o5oͻͺ͹̸͹ͺϾμͻͺͺͺͺͺ͸͹̸˶̷̸͸ͺͺͺͺλλͻͺ̸˶˶˶˵ʳʴ˵͹gggtttfffYYY===dz.8JZ]p]rTcFLNbbbjjjkkkvvvu{~Jxbu`t`t`t`t`t]r.\jP}bu`t`t`t`t`t]r.\kcccsn޻ނ"ޫgsn޻ނ"ޫtggggggggggggggggtޫ"ރ޻sngޫ"ރ޻snvcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;YfZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{R_s2pWiYj'gzYkZm\oZn"ew]p_r_sN]YkYk\n"i}cwYk.m'i}\ncw]pRc\nWiWj`t+i{]o\o\n_r\n]rUf'i|cv\ncv_r+n`ucwYj;rϿͺ͸͹ͺϿλͺ͹̸͸ͺ͹ͺͺ͹ͺͺͺͺͺͻμϾͺ͹͸͹̸˵˴˵͹gggtttfffYYY===dz.8JZ\nTcFLNNNNbbbjjjkkkvvvv}Jxbu`t`t`t]r+ZjP|bu`t`t`t]r2]mcccsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻sngkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=YcH'Ӿϻ˷RnnnmmmfffZZZDDDbZ!t}~ztujg]\TYPYPNG...............D@'YPuju}8822f\n'cu2m8k}DwWi`s'i|Ufbu`t8p2m]r2n]pPb]r`tWj`t]pZm"g{cw`t"i|`t]p\oLz"g{'i{`tcw+j~bvZn\o`uPb;rN_"_o"cuWjWiUeͺ͸͹ͺν͸̸̸͹ͺͺλλνμͻͺλμνμϾμ̸˶˵͹gggtttfffYYY===dz.8HWN]FLNNNNNNNbbbjjjkkkvvv~~~|||xJxbu`t]r'YiN|bu`t]r.\kcccsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻snmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIW.ҾϼμPnnnnnngggsj8~urfbWYPYPLF......... UMwkv}~2??''88DD\Yj_pTfUg=tZmTfex.k~P`Te2oHz]r\oFx"_p\o]r"cv_pDu`tcu"g|bu\o"fx]p'fxZn]r_scw`tbv'i|_s"g|'i|P`\obucuYk"i|`t`sϾϾ͸̸͹Ͼμ͸̸͹ͺμͺμμͺͺλϾμͺ̸˶͹gggtttfffYYY===dz+5=HFJLNNNNNNNNNbbbjjjkkkuuuvvvwwww~Jx]r'YgN{]r+Zicccsn޻ނ"ޫgsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻sngޫ"ރ޻snnrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777mmmws]zwkcZYPYP=;'---GOG0G0(`(''''RRQ5ncw"`sZmZm]o`tZnfzf{FUZm]pfz]r"buHxcuTe'g{Yj2j|YkN_Wi"fz`s.mbu=rbv_s_r\oUfYj'ctYjZn`tWj"fz]pexYjWg8r`tλͺ˷˶̸ͺϾͺ͸͸ͺμμμͻͺλλ͹̸͹ϾgggtttfffYYY===dz+5FHJNNNNNNNNNNNNbbbjjjkkkppprrrsss~~~w~Jx"Wgw{}L{'Yicccsn޻ނ"ޫgsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻sngޫ"ރ޻snpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDO'|wkbWYPUL <B\A8m~]]pYk]pcvZmWiWi2k}\o+gzUgYj'fx\n]p8r"_p5j|_rcvi~]p_s_sUg]o`t]rcv5m~_s.k}.j}\oewex]rexZm_sWiWj"j~UfRc_sͺ͹˶̸λ͹͸ͺνμͻͺͺμνλ͹͸ͺͺgggtttfffYYY===dzFHJNNNNNNNNNNNNNNNbbbjjjiiikkkmmmppp}}}ppp|||w~svxxxxcccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ލރރރރރރލ޻sngޫ"ރ޻sngޫ"ރ޻snu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWSzrf\TYPA;rDFJoHHNNvRbZ+i{"cuYk'gz.k~Wi@u2k~]p'ewZnWjbt]oWi]r`t\oZnUg+j}Zm'g{_r`sYk_r\o\o"g{+kYj+cu8oZmL{2j{]p]pbu2nTe]p"j~Yj"btͺ͹̸ͺμ͹͹ͻλͺ͹ͺμμμλμͺͺͺͺ͹gggtttfffYYY===dzNNNNNNNNNNNNNNNNNNbbbgggcccfffjjjooonnnjjjvvvxxxvvvxxxcccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ."""".ރ޻sngޫ"ރ޻sngޫ"ރ޻snz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBY¯ıŲŲðug]YPQI55UFFL]iXBiim_rUf_r]rZm]pewN]Yk+bs'g{f{'j}Yj'j}5nYkDv2n"fxZn_r"fz\nZk8o'g{"fx"fz\nYkL\`u"fzP`+m_rWj=oew`tWiZmbuTe\mcu"exμͺ̸ͺμͺͺλϿλ͹ͺͻλμμμλͻλμμμͺgggtttfffYYY===dzNNNNNNNNNNNNNNNNNN___bbb]]]ccciiicccjjjjjjmmmeeepppuuuwww|||}}}uuucccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"޲ޫޫ޲"ރ޻sngޫ"ރ޻sngޫ"ރ޻snx|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777ıȴʶ˷ʶɵdzñ~uj\TWN22YYFDD5f]]WWbbvZm'gz]pZkYj2n"exf{TeTeYk"fxYj_sexZmZmbuexbu\obvcv'fx]p]pew`t=r'i{cw`sbuL\`t5ncv\n_s.m2nZnbu'gz_r@s_rν̸˶͹Ͽͺͺ͹ͺͺͺͺμμμλͺͺͺggguuufffYYY===dzNNNNNNNNNNNNNNNNNN]]]\\\ZZZbbb\\\___jjjccc```bbb___iiisssrrrrrrzzz~~~{{{~~~wwwkkkpppooossswww~~~zzzcccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"ޫttޫ"ރ޻sngޫ"ރ޻sngޫ"ރ޻snw~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777¯ɶ͹κϻϻκ˸ȵIJtcYYP++''}BB>%%++22Y'j}ZmYk;s]obuTe]pYj+k~.i{Zn;p]pbu8n_r"fzbv]p]pZm]r_s\obuHwZm_sL{Zm5nbtfz\oHxZm\o_s'fzbuZm2mew`t\oJxWj˷˴̸ͺμλͺͺϾλ͹͹ϾϾλͺͺͺgggtttfffYYY===dzNNNNNNNNNNNNNNNNNNWWWYYYYYYYYYYYY___cccYYY___\\\WWWTTT```mmmrrrrrrsss}}}~~~uuurrrvvvvvvjjjjjjeeecccZZZcccvvvvvvzzzcccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"ޫttޫ"ރ޻sngޫ"ރ޻sngޫ"ރ޻snzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;YƳ͹мҾӿ;cTκ"ȵñzj_YP;;++jj@@\@@@~""@@==%V%JZ]rTeYkP`excw"j~cv=pZ]o`sex.j|ew]p]p\ocwfzbv"fz"fz`s\o@rcvWi]rYk\n\o\oTeZm"ex]o\n"]ocwTfZn]p5n"btWiL\˶ʴ˶͹ϾλϿμͺ̸͹μμλͺͺgggtttfffYYY===dzNNNNNNNNNNNNNNNNNNTTTWWWPPPYYYYYY\\\YYYYYYYYYWWWPPPNNNRRR```mmmmmmjjjooosssrrrrrrkkkccciiieeebbbWWWNNNRRRjjjtttrrrzzz{{{cccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ"޲ޫޫ޲"ރ޻sngޫ"ރ޻sngޫ"ރ޻snĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===ȵϻӾvT˸dz~ocWN55NDDNee..'ewZm"j~"g{btFUYj+ctUg\o2j|]o]p_r'ev8n8n'i|.cuTf]p]p`t]r_s'fxP`cvfz_r5m~]r`u]rewbubu]p'fw\n+k~"cvbu_r`t`tcvfzϾ˵ʴ˶͹ͺλͺͺͺ͹̸̷̸͸μ͹͹ýgggsssfffYYY===dzNNNNNNNNNNNNNNNNNNRRRNNNPPPYYYWWWTTTYYYRRRUUUPPPNNNNNNNNNRRR```gggiiibbbgggpppkkkbbbbbb\\\___WWWNNNNNNNNNYYYfffkkknnnssscccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ނ."""".ރ޻sngޫ"ރ޻sngޫ"ރ޻snŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBY+ɶѼvcκɵðpeVN;;ۆbbBDFo.mUgex_rcv`sWi`t\o`t`s`tWj5m]p\obu5o.i{\o'i|_s_s_s_s.m_rRc.m\oP}"btex_s]p_s'g{_sTeP`L{\n5n"cvYkZn\o"ew˶˴˶͸͸͸͹͹νϾͺ͸̸˶˶̷̸͹ͻϾϾüiiitttzzzfffYYY===dzNNNNNNNNNNNNNNNNNNNNNFLNJLLWWWNNNTTTRRRNNNNNNNNNNNNNNNNNNNNNRRR______Y]_YZ\fffbbbbbb\\\WWWPPPNNNNNNNNNNNNNNN\\\fffccc`efcccsn޻ނ"ޫgsn޻ނ"ޫgsn޻ލނނނނނނލ޻sngޫ"ރ޻sngޫ"ރ޻snŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREWǴм8vv;ϻʶŲmbSO4rrJJgDFHUXWjFUfzex`u"ew]r`sZm]r`uHx.i|YjYkcuYkcw2k}Wi`t@s]r]p\n5o+i|Zm_sYk]p_p\o_rWjZn"`s"j~]p\n\oRcUg'm"ex`t`tUg̸͹νͻͺ͹ͺͺͺ͹͸͹ͺ͹͸̷˶˶͹ͺνϿͺμŢjjjuuutttfffYYY===dzNNNNNNNNNNNNNNNNNNFLNTc=JHJJNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPPUWTe@JRTT___\\\WWWPPPNNNNNNNNNNNNNNNNNNNNNYYYW\]Tecccsn޻ނ"ޫgsn޻ނ"ޫgsn޻޻޻޻޻޻޻޻ƒsngޫ"ރ޻sngޫ"ރ޻snŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITκӿϻ˷Ų}bYbFD=g{\nL\Yk"]n5ncv`s_r]p]p+fw;pBv\o]pbtP`@s]p_scw2k}\oZnYk+k'fx]p\o\o\n'i|'g{`t\oUgUgfz`s\oexPb+cubt\o]o2oϿϿμͻͺ͹̸͸͹λͺ͹̸˶˶ͺνϾϾ͹˶̷̸ͺwtojjjwwwpppfffYYY===dzNNNNNNNNNNNNNNNFLNTc]rWi=HFHJNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFLNTc]rWi=JJLLTTTPPPNNNNNNNNNNNNNNNNNNNNNNNNHNPTc]rcccsn޻ނ"ޫgsn޻ނ"ޫgf=;snsnsnsnsnsnsnsnsnsnf=;gޫ"ރ޻sngޫ"ރ޻snð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_HHHZZZZɶѽҾκʶıtJF5333==JJR@;#$#2m~`tYj]r`sbu2j|_r"cvRc'fz]pTe`u\n\n2n'cu`t]p_s_s_r"ew]pWi+fwDv`t"`sUgRb_s.j}`tbu`tUf_sJzYjYk]pHwYkcwRc2nͻͺ͹͸͸͹νͻ͸̷˶ϾξϾνͺ̸˶˶ξccckkkvvvpppfffYYY===dzNNNNNNNNNNNNFLNTc]r`t`sWi=HFHJNNNNNNNNNNNNNNNNNNNNNNNNFLNTc]r`t`sWi=HFHJNNNNNNNNNNNNNNNNNNNNNNNNFLNTc]r`tcccsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻snɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[P"u:III___mmmrrrF˷ѽӾм͹ȴ¯ib8UUULLL777???si+aWYPeZuisskkv5(cv'k~"cuUf+i{]r`s_r'j}@sWibufzU_rYk]pZn]p+i{\o_pRc2m~fz]p]pZmTe`u+kZm@sbu_s2m~"fzew\o]p@sbu_s"cu\n'j}JY]pμλͺ͹͹ͺͻμͺ͹͹ξνϾνͻͺ̷˶gggnnnssspppfffYYY===dzNNNNNNNNNFLNTc]r`t`t`t`sWi=HFHJNNNNNNNNNNNNNNNNNNFLNTc]r`t`t`t`sWi=HFHJNNNNNNNNNNNNNNNNNNFLNTc]r`t`tcccsn޻ނ"ޫgsn޻ނ"ޫggޫ"ރ޻sngޫ"ރ޻snĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTV"we_=cccnnnsssrrrkkk5ɶκмѼϻ͹ɶıwnRTUOOOEEE~~~Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===λͺ͸͸ͺϾ͹˵˴˵̸͸Ͽλμ͸ʴʴ˴˵˶͸ͺͺͺͺμdzcc}oz~zsme]YYYY..ULLNNNNNNNNNNNNNNNNNNNNNNNNNZZZi{}m}sY``ޘFŻޫgޘFFޘgޫŻFޘgTosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YPCW000cfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ottlh>fe=2F5F5H8J5H2F2D,?+;#0!LLLYYYNNN&&&KKKZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===Ͽμμμλͺ͹̸˴ʴ˴˶̷ͺμϿμͺͺϿμ͹˶ʳʳ˴˶͹λνͺͺͺͺdzLL~xne\YYY""WLLNNNNNNNNNNNNNNNNNNNNNNTTTevxsxsZ`bޘFŻޫgޘFŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻFޘgޫŻFޘs^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000H'Ӿ˸|wejjjbbbRRR777............85.WNYP\Rsgznκҽȵ"LLvr@Z\@2D.B.@+='8.@.B,>7AJFJP Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===͸ͺμμμλͺνϾϿͺ̷˵˵˵˶̷͹ͺͺλμͺͺ͹͸̸̸˶ʴʲʳ˴͸ͺͺ͹͸dzNN}si_YYY""WLLNNNNNNNNNNNNNNNNNNNWWWcmnswsZbbޘFŻޫgޘFŻ޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲ŻFޘgޫŻFޘzc`eijkkkjigfcb]|ZuUkNw`FkU=_P;YP;YP;YPCW.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWPŴNм"~κ"Ǵ"'v+b\+282+;.@.B.B5H2D->(7'Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===͹ͺϾμͻͺͺͺͺͺ͸͹̸˶̷̸͸ͺͺͺͺλλͻͺ̸˶˶˶˵ʳʴ˵͹ͺͺ͸̸dzoo~vm`YYY..UNNNNNNNNNNNNNNNNNNUUUbmnnvrY`bޘFŻޫgޘFŻޫtggggggggggggggggtޫŻFޘgޫŻFޘvcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;YkkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... Ǵӿ52ѽ̸dzı{r'fc8jg@2D.@+;".Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===ͺϿλͺ͹̸͸ͺ͹ͺͺ͹ͺͺͺͺͺͻμϾͺ͹͸͹̸˵˴˵͹Ͼλ͹͹dztcYYYDDPNNNNNNNNNNNNNNNZZZbnojsrZbbޘFŻޫgޘFŻޫggޫŻFޘgޫŻFޘgkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=Yjjjiiiib8t}~ztujg]\TYPYPLF...)))ƴ"κҾԿҾм̸Ǵðκ͸ȵ¯ʷ¯\U%#Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===ͺν͸̸̸͹ͺͺλλνμͻͺλμνμϾμ̸˶˵͹ͺͺdzBB}iZYWNNNNNNNNNNNNNNN___itumwoY`bޘFŻޫgޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޡgޫŻFޘgޫŻFޘmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIWwn<~urfbWYPYPNGTTTNǴȵȴŲIJκҾҾѽ˸ðɶti0+Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===Ͼμ͸̸͹ͺμͺμμͺͺλϾμͺ̸˶͹ͻμdzogkZYBBRNNNNNNNNNNNNbbbp|}tzrZbcޘFŻޫgޘFŻޫgޘUFFFFFFFFFFUޘgޫŻFޘgޫŻFޘnrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777zwkcZYPYP=6;¯˸Ҿ'L̸¯k`Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===Ͼͺ͸͸ͺμμμͻͺλλ͹̸͹ϾϿȬdzffn`\Yb5N+Y++UNNNNNNNNNPPPgggr}~|u\ceޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDO|wkbWYP3?>>≯{tȵZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===͹͸ͺνμͻͺͺμνλ͹͸ͺͺλƬdz..r\=+"{`jNPgNNNNNNWWWnnnu|]efޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWSzrf\TYPA;BEB.@.B/@$]]]xxxмY@¯WNZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===μ͹͹ͻλͺ͹ͺμμμλμͺͺͺͺ͹ͺͺμϿȬdz"s}R+`P`UFPNNNNNNbbbrrrz_fgޘFŻޫgޘFŻޫgޘFŻŻŻŻFޘgޫŻFޘgޫŻFޘz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBY¯ıŲŲðug]YPQI'5BB2F2F->YYYYYYZZZڂƲwZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===μͺͺλϿλ͹ͺͻλμμμλͻλμμμͺ͹͹͹λʬdz2]L.st~DLxNNNUUUjjjxxx~_ggޘFŻޫgޘFŻޫgޘFŻ޲ޫޫ޲ŻFޘgޫŻFޘgޫŻFޘx|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777ıȴʶ˷ʶɵdzñ~uj\TWNIJ͹ȴ52F2F5FFLRNNN³Tκȵ{o71Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===Ͽͺͺ͹ͺͺͺͺμμμλͺͺͺλ͹ͺʬdz`'8@8.i.~=fPPPeeessu{{{`giޘFŻޫgޘFŻޫgޘFŻޫttޫŻFޘgޫŻFޘgޫŻFޘw~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777¯ɶ͹κϻϻκ˸ȵIJtcYYPƳӿfοUig=2D2D-@(ȴҾ@mɶrfZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===μλͺͺϾλ͹͹ϾϾλͺͺͺͺͻν¬dz""..nn]WF8LUp'no=T]fptx|`giޘFŻޫgޘFŻޫgޘFŻޫttޫŻFޘgޫŻFޘgޫŻFޘzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;YƳ͹мҾӿ;cTκ"ȵñzj_YPŴ5Ҿmj"JN@.B.@(9aaa¯κҾ;ȴg]Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttfffYYY===ϾλϿμͺ̸͹μμλͺͺν͹ͺλdz@@HH..nn8.~w+m_RRn|uxŜǜ`iiޘFŻޫgޘFŻޫgޘFŻ޲ޫޫ޲ŻFޘgޫŻFޘgޫŻFޘĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===ȵϻӾvT˸dz~ocWNʶ=Pмȴ+2==+=2D {{{:::Ǵ"ϻ5Fɶ^VZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttgggZZZ@@@ŷͺͺͺ͹̸̷̸͸μ͹͹ξ̸̸dzWW㞞==...."t'''Pm@wUc|u{̝͢bjjޘFŻޫgޘFŻޫgޘFŻŻŻŻFޘgޫŻFޘgޫŻFޘŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBY.ɶѼvcκɵðpeSK˷ӿҾ͹Ų{s+.B2D1C#2NNNYYY]]]uuuų5&hb5Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttjjj\\\DDD͹νϾͺ͸̸˶˶̷̸͹ͻϾϾͺ͸dz..PP⧧=="LtFR`5F=sF]J+w냕ȌšϦϡcjkޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREWǴм8vv;ϻʶŲmbIC!Ǵ"κѼм͹Yλ._]52D2D';HNRU'''@@@vvvZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttmmm___JJJͺͺͺ͹͸͹ͺ͹͸̷˶˶͹ͺνϿͺμϿdzff22rrHH;c2W`;BpD+mm\HLF򌘹ԫԧckkޘFŻޫgޘFŻޫgޘFFޘgޫŻFޘgޫŻFޘŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITñκӿϻ˷Ų}e[IJȴϼ;ʶ";FB2D2F.?Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttooobbbPPP_YTͻͺ͹̸͸͹λͺ͹̸˶˶ͺνϾϾ͹˶̷̸ͺƬdz22PPWW@H""r2@e;z"ZJ;]pڲ٩ckkޘFŻޫgޘFŻޫgޘUFFFFFFFFFFUޘgޫŻFޘgޫŻFޘð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_ǸcɶѽҾκʶıtѽT]ı28DD2D.B%4Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppfffWWW;;;̼ͺ͹͸͸͹νͻ͸̷˶ϾξϾνͺ̸˶˶͹μνλdzBBn5bLPPku2oLDfե׭ܳ٩ckkޘFŻޫgޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޠgޫŻFޘgޫŻFޘɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[5˷ѽӾм͹ȴ¯bZ!Ӿɶʶzt8.B+=%3#Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppkkk]]]HHHzλͺ͹͹ͺͻμͺ͹͹ξνϾνͻͺ̷˶͸λϾͻμͻλμdz"kUk`runBðܳ٩ckkޘFŻޫgޘFŻޫggޫŻFޘgޫŻFޘĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTVXXXkkkFɶκмѼϻ͹ɶısj8DDDʶ.ϼ+¯ɶdzUT2".-./Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppooocccTTT888ȼλͺͺͺνͻ͹͹μμϾν̷̸͸͹̸͸ͺɬdzoo"+==;5iHc߳۳ةcjkޘFŻޫgޘFŻޫtggggggggggggggggtޫŻFޘgޫŻFޘȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]UaXXXgggrrrrrrZǴɶȵƳ¯'ws]gggZZZ@@@>>>ñ5мZҿ8ðƳȴðOI"Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttppppppjjj\\\FFFxtoͺ͸͸͹ͺλλϾλν̸̷̷̷̸λͬdzPP"5P;F"ҳͳݳڳשcjkޘFŻޫgޘFŻ޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲ŻFޘgޫŻFޘ·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gToP~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZ˷Ҿ5Ѿ2ŲɶŲsZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttppppppooocccUUU;;;ͺ̷̷̷̸ͺνϾνϾμμμμͺξϿ͹͹͸͹ϿάdzPP.=8c55U߳۳ٳ֩cjkޘFŻޫgޘFŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻFޘgޫŻFޘ·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`s^|"geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWujuHƳϻѾλ"ǴǴ¯Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppppppppkkk___NNNLJF̸̸̼˷˶̷ͺϾμͻͺͺͺλͻ͹ͺѬdzoo'.eRoܳڳ׳ԩcjkޘFŻޫgޘFFޘgޫŻFޘµȹͻϼмѼлϺθ̶ʴǰí~{vrkczcIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znð͸ϻ̸ȴŲZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppppppppoooiii\\\JJJLHD̸̷̼˷̸ͺμϿλͺͺͻμ֬dzBB.tBFB³ݳܳ׳ճөcjkޘFŻޫgޘFFޘgޫŻFޘĵɷ˸̸̸˶ʵȲƯí~{vrmgvμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_z¯ʷ͹ʶǴ¯MH+Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttppppppppppppooofffZZZHHHLHD̸̷̸̼ͺϾͺͺͺμլdzff...Ffgϳﳿ糸ȳ볳߳ݳڳسֳԳѩcjkޘFŻޫgޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘgޫŻFޘ²ŲŲŲį­~|zupn˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|Ǵɶ˷ȵımcZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppppppppppppppoooeeeZZZJJJLJF͹͸λ͸̸͹ͺͺͻμӬdzdzݳݳܳڳسֳԳҳЩcjkޘFŻޫgޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠgޫŻFޘzwxϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_8ѾLƳwZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttppppppppppppppppppooofff\\\NNN;;;xpg°λμ̸̷̸͹ϾͺμϬdz۳ܳڳٳ׳ճԳҳгΩcjkޘFŻޫggޫŻFޘҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=zY̸Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttpppppppppppppppppppppoooiii___UUUFFF888x̼μͺ̸͸̷̸ϾϾάdzسڳٳ׳ֳճӳѳгγͩcjjޘFŻޫtggggggggggggggggggggggggggggggggtޫŻFޘ.'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"~rZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5gggtttppppppppppppppppppppppppoookkkccc\\\TTTHHH;;;_YTͻλͺ̷̷ξάdz׳׳ֳճճԳҳѳϳγͳ˩cjjޘFŻ޲ޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫޫ޲ŻFޘHZe`trgmj`BPHZe`trgmj`BPvZm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5gggtttppppppppppppppppppppppppppppppooojjjccc]]]WWWPPPJJJDDD@@@===================================================NLHλλλͺ̬dzɳԳԳԳԳӳҳѳгϳγͳ˳ʩcjjޘFŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻFޘcfZ8Կκɶı"cfZ8Կκɶı"Zm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5gggtttppppppppppppppppppppppppppppppppppppoookkkfffbbb___\\\ZZZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@ͺμμƬdzγѳѳѳѳѳгϳϳγͳ̳˳ʳɩcjjޘFFޘH'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"Zm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5gggtttpppppppppppppppppppppppppppppppppppppppppppppooommmjjjgggfffffffffffffffffffffffffffffffffffffffffffffffffffbbbTTTNJHμμμϿμdzƳγϳϳϳϳϳγγγͳ̳˳˳ʳɳȩcijޘFFޘ.Ҿϼͺ"μP.Ҿϼͺ"μPZm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5uspԋmmm\\\UTRʬյœcijޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘZm`t`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`u`u`u`u`u`u`u`u`u`u`uJZ+5sssttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttkkk\\\ϾλάźźźźźźźźźźźźźźźźźźźĺğcijޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠWjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=JŦutsggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggonmϿμͺͺνΧ||||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccY8YYYLLH8HYYYNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNN|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY˹ƵŴŴ˹ͺ̺°_~~ssYYH8HNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNcccޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘݘѐsrw{ʋ…zrpsrtsrssspopopsu{+"ssLLNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNcccޘUFFFFFFFFFFFFFFFD=2++.5;;;~~.++.2222222225255@rdz']zzTTPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBdzcccޘF޻޻޻޻޻޻޻޻޻޻޻޻޻׶ijHD]=T2=8mr~BLH8N2DFF.os{5sdz']zzTTYYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555dzcccޘF޻ލރރރރރރރރރރރރjNUuUvPnBZF85NPLHND_@W8N2DZ@+NRYZYUUW]_``g5udz']zzTT```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...dzcccޘF޻ނ.""""""""""'Uv]\WwJf5Hwx""F`B\@W;P5H+;|]5sdz']zzTTccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz¸cccޘF޻ނ"+=_b`Z|Nk;R\\".D]@W;P5H.B+;Ugggjpsuwx}_5wP"u1}GLQdz']zzTTccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzϸcccޘF޻ނ"tggggggggL;PcHxbZ|Nm=T85".=U=P5F+;+;+;.'==@DFHHJRx_5t"|xtv|}wsuy;@D.B2F2D$1dz']zzTTccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz׶cccޘF޻ނ"gʶepY{Lj;P|}r|~u5H+;+;+;+;+;opg{}J}_5u===777IJ"zj_cYi_znuzntutsgf\bYi_znz5s2F2F5H8J5H2F2D,?*9#0dz']zzTTccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...dz}Wkްޒk]ІʾųcccޘF޻ނ"gޠޘޘޘޘޘޘӑbi;nRpBZ2BD\]2@=+;+;+;+;+;W\_cgnpzJ}b5zQITREWRBYP=YP;YP;YP=YRBYPEW777μPǴısj2BB=885D@"YPf\ujWPsg{otYR+;;8552D@"YPi_z!EFHF2R;R@5b2D.B.@+='8+=.A,>):*dz']zzTTccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...dzگޖr8fޱޑf8pŖޭےɐԳcccޘF޻ނ"gޘUFFFFFFev`Y{Jf8L"5;++"5;+;+;+;+;=F5+++.22@vNc5xVTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=ͺ"˷ɶB\\\\\\TTT@@@D@"ZRbWdZUM\RmbZU2HHHJJJFFF;;;D@"cY{FJLz.TF@;5~.k'D+;.@.B.B5H2F-@(9*dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...dzBU޻ޠ}D_޲ސ_B}޿ޤނUHٳcccޘF޻ނ"gޘF޻޻޻޻޻szmWsJDD.@+25rr28@+B"@'.5FD2rt}8{Ri5x]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=Yϼϻκmj`jjjiiibbbNNN52.YPYPYPYPYPYP==8JJJTTTPPPHHH852j_Z]_+;#5DHJL8ZB`NFDBBDB=5.|2m;x2D.B+;"2dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzÔޅ_8oެމRU޴ޏWR҉޷ޗo8_޺ϪԳcccޘF޻ނ"gޘF޻ލރރރރgU'Z2"L"FFFtNtN"R""T"HFD"T=+NT]co8|Uj5xgTosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YPCW000ҾӾԿtrguuugggZZZFFF=;+YP_UYPWN=;+888===jjjUUUNNN==;s%;z.@2D1C)9FHJHHFFDFFFD@;8HD=5'f2dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dztޱޚ|JT޸ޖcL޵ތLb̖ޭވTJ|ީޑΌųcccޘF޻ނ"gޘF޻ނ."""]n.'Y'"L"FFF8B8D'W'"T""L"FF8B'n;Yo8}s^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000.'8`rrruuunnnggg]]]LLL=;2OH85.555;;;;;;@@@UUULLL`Y.@B8~2F2F0D!/BDFFDDFHHJHD@;DD@8+dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzRPvÔޯޕo;rޤsDܷފFsŤޠr;oޮޔvPuκcccޘF޻ނ"gޘF޻ނ"@2r2'Z'"R"JFFFF'Y''Z'"T"JFFo"tŧ=Yo;zc`eijkkkjigfcb]|ZuUkNw`FkU=_P;YP;YP;YPCWHZe`trgkkknnnjjj```RRR:::>>>IC!SKWNYPYPWNQIA; ......555;;;;;;888NNFi`5ADHHD5b2F2D/@!CDFHJNHe'ND@BB@8+z7dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@'gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzre@Jv×ެލ\R޲ބDڹކDڄ޺ޏR\޴ޗvL=c޴׳cccޘF޻ނ"gޘF޻ނ"t]8'Z'"P"HFFFF"P"']''Z'"T"JFFL"fwȨ=ÆYo;vcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;YfZ8Կʷ_nnnkkkcccUUU@@@e[mbpeocj_cY\TYPYP=6))).........555888@=.vju{HHL|뉗"F2T2D.B FZJJ_u慕JB@B=5'odz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz|{ԉpJFvÛީރFuޖNռނL֖ޭuF޻ޛvFHo޷ީ۴cccޘF޻ނ"gޘF޻ނ"g"R""L"HFFFF"T"'Y''W'"R""L"FF~`xɩ=ÆYp¤=gkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=YcH'Ӿϻ˷RnnnmmmfffZZZDDDbZ!t}~ztujg]\TYPYPNG...............D@'YPuju}HJFe߽~H;.B.@*<%3HJ2Yf{D@B=5!fdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;+UU............555;;;=__gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzkަޔ}WBvàޤsRު_|}_ΪޚRsޠvDW޿|ޯޞގޗɺϳcccޘF޻ނ"gޘF޻ނ"g'+e+']'"P"JFFFuRuR"T""R""P""N"HFF`xͭ@ƇYsĥ=Ćųmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIW.ҾϼμPnnnnnngggsj8~urfbWYPYPLF......... UMwkv}~2HJN2YJFB2m.@2D0B'JHLتFBB;2 \dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;'............555@@@5gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzuuuJg|޲ޡދgBvçޜZ|xttx|ZާvBg޶ޣސ|gW۴糳cccޘF޻ނ"gޘF޻ނ"W]'.o.+f+"U""L"FFFu+u+HJ"N""N"JFFN8zϯBώɶ\uȨ@ȉȶnrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777mmmws]zwkcZYPYP=;'---"JHJJHFD+P=.Z2D2D.?FJ]t㰼"LB@;.Qdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;............888==='gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz\{D8D_zޱޛzJvñޑWޖmmݖޭWޱvJxީޑz`D8F֛游cccޘF޻ނ"gޘF޻ނ"5z52s2+f+"R"FFFFW`W`FFFJFFFF"{ѰBѐϼ_vɪ@ȉȶpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDO'|wkbWYPUL FHHF]sNgD52P2D2D+;BH'Rx"LB@8+Adz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzf{o_H@TvޮޏZw¿}޸jjٷމݿ}wZܳޕvU@H]n{ʳ³cccޘF޻ނ"gޘF޻ނ"@5|52s2.o.'_'JFHHFFFFFHJFFF""~ԳBҐѾ_x̬@ȉɷu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWSzrf\TYPA;5RDHPڭ+PB=5u2D2F1E#0@FH=\HB=8'vdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;+UU.........5558\\gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzvvvޞޘސކxfNNoީt|oxxo|tݛpNNex†޹޲ޫަҡȳcccޘF޻ނ"gޘF޻ނ"B5|58~82v2+`+"T""J'=88;"8@"5@5;;2D"FFFFF""~ִD֒bz̬@ʋμz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBY¯ıŲŲðug]YPQIr~JJ2YwD@=B8v2D.B#25K@FHJFB=5"mdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;'.........222+gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzkkkm޺޸޴ޯުޢޘފt]mۜ݌ټգխٌn]sĉ޶ޫޢޚޓގވރʳcccޘF޻ނ"gޘF޻ނ"T";;;;5x5+e+"L."'JHFFHFF"DB'FFFF."~ִDՒѾb"{ͭ@ЏѾx|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777ıȴʶ˷ʶɵdzñ~uj\TWNZkHJcz在JBBFF=2Z+='5"'BFHHDB=2!bdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzeeeúDPRUY]bgow޺ޯݚ̖ùÚݪޓރxoib]YURPLȳcccޘF޻ނ"gޘF޻ނ"\';;882r2"L2"F""LHFFHHFF"D=.FFF2"ـٷDהc"}ЯBѐѾw~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777¯ɶ͹κϻϻκ˸ȵIJtcYYP"JHN|5WDDFDB=2z!76LDFHHD@;2Ydz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzbbb@NRUY]bgowރޓݪõ̖ݛޯ޻wogb]YURNLijcccޘF޻ނ"gޘF޻ނ"`+88H'.@FJJJHF""N""LHFFF';2@2"ڀڸDהc"~ѰBѐѾzµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;YƳ͹мҾӿ;cTκ"ȵñzj_YPHJLg;ZDDDD@;2!+Z*HDFHHD@;.Mdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccf݃ވގޓޚޢޫ޶s]nٌۨխդټm]tފޘޢުޯ޴޸޺޾cccޘF޻ނ"gޘF޻ނ".FFFFFFHHFFFF+"ڀڸDהc"~ұBѐѾĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===ȵϻӾvT˸dz~ocWNH[FH+R.TDFDB=8*x"FDFHFD@8+}dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;.DD...................DDgggtttppppppppppppppppppjjjccc]]]TTTDDD...dzjjjvuۤޫ޲޹xeNNpޛt|oxxo|tݩoNNfxކސޘޞϠcccޘF޻ނ"gޘF޻ނ"=HFFFFFJHFFFF;"ڀڸDؔc"~ճBѐѾŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBY+ɶѼvcκɵðpeVNDFJLDDB@;2(.Q@FFHFB=5's 0dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzsssWruոn]H@Uvޕ޳Zwݿ}މkj޸}wZ܏ޮuT@H_o{ōcccޘF޻ނ"gޘF޻ނ"F""L""T""PJFF""L""L""LJFFF"܁۸Dڕc"~ִBӐҿŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREWǴм8vv;ϻʶŲmbSO4"ADFHHDDB=5)pBFHJFB=5"jdz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;"........................"gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzJge=ž8D`zޑީxJvޱWޭmkޖWޑuJzޛޱz_D8FֲcccޘF޻ނ"gޘF޻ނ"""@""L'']++`''Z""PH""R""T""NJHF@"ރ޻Fݗe"~ִD֒Ÿ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITκӿϻ˷Ų}bY=BFFFDB@;.BFHHDB;2 ^dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzYYY=f|ސޣ޶gBvާZ|xtsx|ZޜvBgދޡ޲|gTڠcccޘF޻ނ"gޘF޻ނ"+".@J''_++c++c''Z""N""U""R""LHFF@"ރ޻Fޘg"܂۹Dږð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_HHHZZZZɶѽҾκʶıtJF5333@DFFFD@=5'N@]RjF@;.#.[dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;.DD...................DDgggtttppppppppppppppppppjjjccc]]]TTTDDD...dznnnPkzɞޯ޿|WDvޠsRޚ_}|_ުRsޤvBW}ޕަ޴ުcccޘF޻ނ"gޘF޻ނ"`8"."2=H+"P.'P..UF@W..D2.B"='=.+B"=F;`2"ރ޻Fޘg"ރ޻FݘɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[P"u:III___mmmrrrF˷ѽӾм͹ȴ¯ib8UUULLL777???si+aWYPeZui=BDFFDB@8*;W&H5dz']zzTTccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzUWY}soHFvޛ޻FvޭLւ޼NޖuFރީvFJpމޚښcccޘF޻ނ"gޘF'W=BF"J"2'5"8FP.DZB\H+L@2H8;F58DNBNH.@;5P;FF.DFW=B'Fޘg"ރ޻FޘĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTV"we_=cccnnnsssrrrkkk5ɶκмѼϻ͹ɶıwn:*dzcccccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccVTVWL[U@_Y@bZBcY@cW@bU=_R;\P;YP;YP;YP;YP=YRIW<9=.'8`rrrtttggg\\\FFF=8+bYaYUMYP@=.;;;;;;===JJJHHHYR+t|zz..~kD;@BBHF@9*dzcccccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccc]Ua`HkiLtnPzoP|oP|nPzkNwgJscHn]DgW@`R;ZP;YP;YP;YP=YHZe`trgkkkfffYYYBBB]U"si+D@'888;;;;;;888==8ZU2tuvu1_ZZ;D##88BB|mxDB;2dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccgTosTzY~\\]\~\|ZzYtToP{gJs_DjW@`R;ZP;YP;YP;YPCW000cfZ8Կ]kkkeeeUUU;;;??? ...555555555=;+YPmb{ottz%%@DC9f2dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccs^|~\`beeeecb`]}ZwWoP|fJr]DgT=]P;YP;YP;YQCX000H'Ӿ˸|wejjjbbbRRR777............85.WNYP\Rsgzn~FFD/dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccczc`eijkkkjigfcb]|ZuUkNw`FkU=_P;YP;YP;YPCW.Ҿϼ;kkkiii___LLL333SO4VNWNYPYPWNQIA; ---............OHYPYPUMWPbFD@!!HH''z7dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzzzzeeeZZZWWW\\\eeevvvcccdzcccvcimnppppoomkigc`\xWnPzbFmW@`P;YP;YP;YkkkgggUUUHF5bYmbpeocj_cY\TYPYPUL=;'......... ||牉""TDBFF__odzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz||gBBgicZU..PFFNNN```~~~cccdzcccgkortuuuutsrpnkifb]zYoP{bFmU=_P;YP;YP=Yjjjiiiib8t}~ztujg]\TYPYPLF...)))FF~~B@<322fffdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;+U+............555;;;=_=gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz__u_T22NLLYYY~~~cccdzcccmruvxxzzxxwutrpmjfc]zYnPz`FkT=]P;YP;YRIWwn<~urfbWYPYPNG22m@DB''\dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzJJiW""NLL```cccdzcccnrvx{|}}}||{xwutpnkgc]xWkNw]DgR;ZP;YP=Y777zwkcZYPYP=6""++ZDD?]]""Qdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzuuiT22NNNvvvcccdzcccpv{}~¯¯¯­~}|{xvtrnkfb\uUfJrW@`P;YP;YLDO|wkbWYP]]NNPDD;''xx""Adzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz_PFFeeecccdzcccu{~±IJųƳdzƲűįî}|zwurnjf`|ZpR|_DjR;ZP;YPEWSzrf\TYPA;55++uDFE0==vdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;+U+.........5558\8gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzoouU..\\\cccdzcccz~óƴȶɶʶʶʶɴȳƲį­~|zwtpmic]wWgJsW@`P;YRBY¯ıŲŲðug]YPQIrr22wwvDB#K22mdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzBBZWWWcccdzcccx|ôǶʸ˸͹͹͹͸̷˶ʴȲŰí~|zvtpkgb}ZoP{]DgP;YP=Y777ıȴʶ˷ʶɵdzñ~uj\TWNZZccZ=5'bdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzc\\\cccdzcccw~ƶʸ̺λϼϼмϼϻϺͷ˵Ȳưí~|xurnic]tTcHnR;\P;Y777¯ɶ͹κϻϻκ˸ȵIJtcYYP""||55z766Ydzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz''..ieeecccdzccczµȸ̺ϼѽѾҾƗɛĖ׼и˵Ȳů¬}{wtpkf`zYgJsU=_P;YƳ͹мҾӿ;cTκ"ȵñzj_YPLL;;Z!!**Mdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzBB==eegzzzcccdzcccĶʺμѾҿ˜̠޼з˴ȲĮ|xurmgb|ZkNwW@bP=Y===ȵϻӾvT˸dz~ocWNHH++..x""}dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;.D....................D.gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzoo..DDgBBcccdzcccŸ˻ϾŒ٭Ė׺ͶʳƯì}{wsoic~\nPzY@cRBY.ɶѼvcκɵðpeSKQ((s0dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzDD||cccdzcccŸ̼пŽŒگɛۻϷ˴ȱĭ~|xtoje\oP|ZBcREWǴм8vv;ϻʶŲmbIC!""pjdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzwwee..__cccdzcccŸ̼ѿŽÎŐϠƗټϸ̶ɲůª|xupke]oP|Y@bQITñκӿϻ˷Ų}e[^dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzPP..==''JJcccdzcccð·˼пŽÏσϠگ٭˜ռϹͶʳƯ«}zupke\nPzU@_ǸcɶѽҾκʶıt''@@RR[##dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;.D....................D.gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzwwuucccdzcccɻϾŽÏÏÏŐŒŒ־ҼйͶʳǯ«}zupke~\iLtWL[5˷ѽӾм͹ȴ¯bZ!;;&&dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzooBBBBoocccdzcccĹͽÎÏÏΎԾҼϹͶʳƯ«}xupjbzY`HkVTVXXXkkkFɶκмѼϻ͹ɶısj8DDDZ$$dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;'w'......'w'gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccȻϾŽŽŽտԽѻϸͶɲů|xtni`sT]UaXXXgggrrrrrrZǴɶȵƳ¯'ws]gggZZZ@@@>>><<vdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccc·ʻϾԾҼѺθ˴ȱĭ~{vrme~\gToP~1dddpppsssmmmZZZEEE+SmmmnnnfffUUU:::_UYPdZdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccc·ʻϽѾӿԿԿӾҼѺϸ̶ʳƯ«}xuoi`s^|"geZooosssnnn___HHHnnnmmmcccRRR=;2YPYPbWuju&&mdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccµȹͻϼмѼлϺθ̶ʴǰí~{vrkczcIJ"zc`RmmmssspppcccIIInnnkkk```LLL=;+YPZRf\znB22dzcccccckkknnn{{{ppppppppppppppppppfffYYY@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ZZZtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccĵɷ˸̸̸˶ʵȲƯí~{vrmgvμPǴısj2NNLkkkrrrpppggge_=μPRnnnjjj]]]FFF52.D@"YPi_zbdzcccccckkknnn{{{ppppppppppppppppppfff\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYnnnppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccc²ŲŲŲį­~|zupn˷ɶB\\\bbbrrrrrrjjj\YJx˷_nnngggZZZNNN@@@D@"cY|DD``}dzcccccckkknnn{{{ppppppppppppppppppiiiffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff~~~ppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccczwxϼϻκmj`jjjiiijjjkkkWWWi_ϼϻʷkkknnngggbbbTTT885j_''c;;dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccҾӾԿtrguuuiii\\\BB=zҾӾԿtrguuuiii\\\BB=z%%dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzccc.'8`rrruuujjj\\\sj2".'8`rrruuujjj\\\sj2"dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzcccHZe`trgmj`BPHZe`trgmj`BPdzccceeemmmpppΨoooeee___UUUHHH222dzcccdzccccfZ8Կκɶı"cfZ8Կκɶı"dzcccbbbnnnrrrΔwwwggg```YYYJJJ888dzcccdzcccH'Ӿϻ˷ǴIJ"H'Ӿϻ˷ǴIJ"dzcccYYYnnnrrrzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pppiiibbbYYYHHHDDDdzcccdzccc.Ҿϼͺ"μP.Ҿϼͺ"μPǵcccNNNfffppprrrrrrpppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmggg```UUUDDDNNNǵcccǵccccccNNNPPPfffnnnnnnmmmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjeee\\\NNNLLLNNNcccccc|||NNNNNNNNNYYYbbbeeecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc```YYYPPPNNNNNNNNN|||||||||Y8YYYLLH8HccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYYNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNN|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY|||cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc5ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYYn~~ssYYj_jcccNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNcccfkccc+"ssT+TcccNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNccc+vª񹹹ccc']zzTTcccPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBdzcccdz.֐\Ͳwʒf³γccc']zzTTcccYYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555dzcccdz\m\ҲBJഴwoccc']zzTTccc```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...dzcccdz㶆fw̳njſ㽽޸Poccc,,}%%f Z YVTTTE']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzf㸤f\fmĔȽȳccc..sZ;;YBBYBBY22Y@@Y@@Y""YYYU'']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzݼo粩f.BLccccLLYYYYYYYYYYYYYRRYYYYRRYFFY''YYT']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdz}w.ȶdzfnζkccc''iHHYYYYYYYYYYTTYFFYRRYYYYLLYTTY;;YYW7']zzTTcccccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...dzccc@Ϝf²绻ʳo襜ʙcccgiifeefrgRRYYYYYYYYYYNNYYY22YTTYYYYWWY22YYQ']zzTTcccccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...dzccc貲ŸԞȒw]ŧzw۳|\ͳcccR]eikkjigffintx{v''""_WWYYYYYYYYYYLLYYYY22YHHYYYYRRY''YX']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccǵB@…Œdz28ֱ㵯cccnb{i}stxbLL`{ztpnkms{voZ;;YYYYZZZ______..ZYYYY@@YYYYZZZ..ZY']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzjԯs̸jܹǶ޶cccjZ}Wvc\PJHJYzsccinspeTJNU''mTTYYYY\\\]]]YY\YYYYY''YLLYeeiUUcY']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccǺwƙfس˜fLJꓰˠ٭ϲů{꺺ccceR~YzzYTRLHFJjckw|}zt`HHU88ZYYY]]]``````@@ZYYYYYYnnszzzWWeY']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzccco貤nBǿ䬍\椸ҞFe蕸mȼn굵cccWTRWPLTUNLLLHFRtxfxz]FFHJU''mWWY___iiimmmUUcYYYYYYZxx~jjo55\X']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzzzzeeeZZZWWW\\\eeevvvcccǺ³цzZ䴩Bn]R\žԇԺnϴccctNLNPY\NLT]]PHHFFLiRRfwzkRHFHN{HHY```kkksssttt55ZYYYYYYf}}..\T']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz|}~BJP5@2;.828.;=FHJNNN```~~~cccdzǹ@ܺgBBخU.ؼeڜ϶Ԓ̤Bº¯mccc\PLJJJJJLPU\bffbWJFFHWw]Roi\PZ}''88____nnnvvvzzzWWeYYYYYZjRR{{YA"AZZqqppZZ']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;++U............555;;;==_gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz_gkBPHWJYJYFUBP8D+52;@LLLYYY~~~cccr2˲.5ضfƒڦՍij\LײkиmfwcccfRHHNZfpxvfZLFHTctp]]]mmmwww{{{bbnYYYYYYm}wwss{55`W,(//']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzJ]fN]RcUfUgUgTfRbL\BP2;"28LLL```cccٜײBó\]]w;֢Ǻ5۹ܷсқ؏ėܠ\lj\ҳcccZZRLHFPgutcWUZbimmgZNTfrY''YY]vvv""YYYYY]r@@Y=.J2``(//']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzuRcYjZn\o]p]p\oZmWiP`DR2;2;@NNNvvvcccݳԴw߬Pe.ඍ˧NԢ˛e.¡ɕϖD\ѳ\³cccYT|JHHUnznfegiif`YYnwbNNN\wwwBBbYYYYiu""\O!{']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzTeZn]p_r_s`t`t`t_s]pYjP`BN+5FHJeeecccdzȏvݧĵ˻cYju٤t~ղ־İԥtոwóRRTU|PLHFHRi}ui_]_cgjjjirjN''DD]sss==cYYY_m{mmHHeXii"v']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;++U.........55588\gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzo~Zn_s`t`t`t`t`t`t`t`t]pWiL\8D.;=\\\cccŅ2fZ׶f˼sȜͻU|ἂB˹B|˨ϑ8fޢ\㩵ϺRZULHFFHLRRPPU\]\YZcko~xo@@biiwYYYezRR~~Y))"{2ZZ']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzBgt_sbvbu`t`t`t`t`t`t`t_sZmRbBP28WWWcccDȐ.B.ff}|p蟰Ř=FҜ՛zƐžwנpfʢߊȝfԓzzzNNTWWRJFLZo}xibbec\RNfx''22iuu~ZZ\kw88Y9NNJpp']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzZmbvexew`t`t`t`t`t`t`t`t\oTfFU.8\\\cccdžՆmƺƳŘʳѐZ͌ޱ봴ݼNwͳB͞׳oڲcccTZTLLgz`ZTLLg..mnn}ZZbwY.']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dz\ocx'k~.k~`t`t`t`t`t`t`t`t]pUgJY2;eeecccLBճw.ϳɳoǼoPٰ.ف~ikžտ2̏ᶄ겤˝¼ƞ.wcccWZ\WLTuweRLe''++..pmm{\bm}Y;w'']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzBk{ez=te`t`t`t`t`t`t`t`t]pUgJY5@zzzcccϒfڦڰώߎ{՘ϭ=.Nֹ@sw.ڀPoگųB.ةcccc_NHH_z|s_Ug~wvNN;;rZix88\F,']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..D....................Dgggtttppppppppppppppppppjjjccc]]]TTTDDD...dzoez.oDu`t`t`t`t`t`t_s\oUfHWBJPcccƳߵо~Ӹî֨Ξi.BnRZPócccmYLHFFHLTY_befff`Zgr''xxHHpww`t}ZZȒc5PFff))qq']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcwg}Du`t`t`t`t`t_rZnRcBP|}~cccdzᱭw촤ʱ.}ŌձѸ̯ځ_࣯ΡÛҳFbZPLHHHHHFFHLPU`onrϜPPn55`m|ffTTnfՙffNNB[[']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzwf{je.k~ewbu`t]pYjN]_imcccdz†fƸ_Bdz..w~\±޳owZ..ʹ\PmZZUTPNNNNNPNHFFFFHc|ncWvW''ҨkkwUU|x++obe/']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzPtf{g}.o=t'k~exbv_sZnRcJ]fcccdzf.ǘ|ƨ֏ͧѐcBo_ҌŊת˞ھBӧt\f\ճR\WTNNNHFFFFFY{_LՎ..tPPϤz,,TeF']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..D....................Dgggtttppppppppppppppppppjjjccc]]]TTTDDD...dzwcwezezcxbv_sZnTeucccdzΆ.βؽίfҎğ򾝭Ųvpѷ~¤ccc`ZURNNLLLJHFFFLYb{nf]TJNt''88YY{{TTx;PF+9']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzoBk{\oZmBgto~cccdz\ˌB峩fͳҳ.;זʸ\~͋~ccc\{PLJT\YLHJU`fjwxbWURLZ;;JJffȤ5']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''w......''wgggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzьﶤIJT辆ʃտ踟ޤecccZTNJHJUUJHPUZ]`erwfbnx\JJHHR''""vvZZ==']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzÒf\¾w˲oPֺwԁޒmЙDΡJ`soپccccTLLJHHFFHJNRU]fnu{t\Tu~xwgNFFFN""__\\s']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzw.w;.׳oǴPw˲՘կڤNvžNᗴ枺Pڴccct_TRPNNLJJJPY]_`bbb`]\YTJFHZvziWHFFJU''YYvv''ȅ']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzfũ.f˵m\\@BˌufwǕ{ݶccciZWWWZU\]TNLHFFFFFNfu{uj]PJHJ{''==шEE']zzTTcccccckkknnn{{{ppppppppppppppppppfffYYY@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ZZZtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzoⱱcǫĩwdžɞڳŒ͆ɳ|׭t贴cccf]WWWZ`c]`\UTRPNLLLJJJ`sxtg]WUUe'']]FF}xss==KK']zzTTcccccckkknnn{{{ppppppppppppppppppfff\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYnnnppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzv{饺޲\ó̒޷Wǰͳcccf`\YZ_ge`]Z\ci`Rrxunc22igiTT|vvزLLcc']zzTTcccccckkknnn{{{ppppppppppppppppppiiiffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff~~~ppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzѲoڹֶѲȴȳcccnimjnun''''`ZiiȯUU..']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdz׳fȤڻj{wΨeгȒͳccc}}''']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzP.׆to.ffц˲ccc''++ѴǕBB''VV']zzTTcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccdzw.ಮ\PٳźŲ~P䱨cccmm{{{{UU;;++PP']zzTTccceeemmmpppΨoooeee___UUUHHH222dzcccdz\̳ݪpo~\vBBccc''''&&&&&&&&&&&&&&'';;']zzTTcccbbbnnnrrrΔwwwggg```YYYJJJ888dzcccdz.ȴfkw˳fnոccc']zzTTcccYYYnnnrrrzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pppiiibbbYYYHHHDDDdzcccdz\ֳ.詳oޘccc+J"~~e8eǵcccNNNfffppprrrrrrpppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmggg```UUUDDDNNNǵccc٭ؙŴŴŽǵcccnJ{cccNNNPPPfffnnnnnnmmmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjeee\\\NNNLLLNNNccc湹kتڄ꺤cccn++n|||NNNNNNNNNYYYbbbeeecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc```YYYPPPNNNNNNNNN|||.Ȭ||||||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYYNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNN\\\\\\\\\\\\\\\\\\\\\\\u||}ccccccccccccccccccccccf|cocscpciccjcccccccccccccccccccccm5bpcccccccccccccccccfcoc|c{cuctcocmcg{ccccccccccccccccccccccccccccccYYYecccNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNwwwwwwwwwwwwwwwwwwwwww\ʓ֓֓Гfkbͅғ㓰֓֓֓ՓǓʓcccNNxwrnZcccNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNwwwwwwwwwwwwwwwwwwwwww\õǩƩک+{vǩן]˚ȩک虽ݩȐ_唾ũũéΩթԩѩħcccrbjvLNZdzcccPPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBkkkccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYYww\׳˳̳ͳγӳ.°ռ׳.ѩ璠f.ѳгϳϳ쩽Γccc]_JJ]dzcccYYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555cccww\ٳ̳ͳΤȳӳmt\oٳcwo׳ҳѳѳϳݳ擞cccUJN{TLHNUdzccc```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...cccww\ٳͳΤꆚ۳fwݳ.wPճԳҳҳѳ߳ⓞcccLHH}]RHFJWdzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccڳγΩfvfڮf\wֳճԳӳҳٳ奔ȓcccZNHFFZfUJFFJedzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccڳγϳѳҳߖo.f.iԳӳҳܳ߳ѩcccbHFHPnWJFFHu&&6;9dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc۳ϳѳҳճ.Bw.Bҳfn̲ܳӳҳѳϩ“cccvoT`]R\b\NHJUc,,Tbfc\YYYYXOdzcccccckkknnn{{{pppppppppppppppppp~~~ppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccʺȥfӮҳҳDfPیfBworݳ򓢼cccvetzkixxgWPWcxx++oTTn~~HHe""\YWAdzcccccckkknnn{{{ppppppppppppppppppfffnnnttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttwwwppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccֳܺԳDծ\|2wTtow\ce|{pzzoi]]nmTTŽȾ55`YTdzcccccckkknnn{{{ppppppppppppppppppfffYYYZZZggggggggggggggggggggggggggggggggggggggggggggggggggggggjjjtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccԺݮճӳճ۳Hom@uz׌f2|\fckjzs}wnzjguFF}==ϲffZZ8888RRmmss{{{..\Xdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ҺݳҳԳֳ׳\H;wنͤowcgtsn|fbwutxwEE__ȃPP@@ww55\Ydzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ҺޤwϮ׳سnTv}ۍ.w.ccjemiwxRRfxzxwKKff}RR}}jjoWWeYdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ٺo׳~Jvs8JmHYU@cccikckfR]w~usriccȢ{urmjexx~xxxUUcYdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................888@@@''gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ߩfzZBF+\ǴژІ䓡cccefnccxvf`_==Ѭ""wxki]YZYZmmsccg..ZXdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;...............222;;;@@@gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\߳ةw@\@].5'ifgDB˯mǓcccfpsuZNJR..LL''}wkb_YYYYYYYLLYZZZ''YQ""AZAqpZdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;U++............555;;;_==gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\mvLFܕD]o\kfwǓcccftfTHFJW==}xkb\YYYYYYYYY''YYYYRRYY7,,(/(dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''............555@@@55gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccWL`\je@PR⪾N×H@\i\֩ǓcccizTwW\FFJUUss|sibZZYYYYYYYYYY@@YYYY22YW..JJ22`(/(dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............888===''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccfP\JBfNi~PY]}R+\\שȓccfgjNnoctJFfVV''vvzwk`Z\ZZYYYYYYYYYYYHHYWWYY!!{{dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............;;;;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc"Wt~wٳשȐ;kZYrnTFL''}}TT|}..tUU|55`wwmm{nn}uu~iiw==cBBb""YYYYYYYY22YYYY;;YTi""vvdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;U++.........555\88gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc~k=2egUiBvB|f\\fUʼnjgYi~|YFLgͭiZZ{{bbnWWe55ZYYYYYTTYTTYY')""{{22Zdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;''.........222++gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc}rrϖH8|'oDo.wBY=fPPJ蓺_i{zjtm`jo\HNPPBBii~g''vv{{{zzztttUUc@@ZYYY22YLLY''YNJJpdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccBk2P5~xBՂN+TocfenYJRiwtmfjkx]J]""ôZiFFwwwvvvsssmmm```YY\..ZYYYYYFFYU..dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;............gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\Bٳw.=PoP{@8\HY+u_\Y.bwc]`JFFLWciijcf{`LRôǤ''`ssswwwvvvmmmnnnkkkiii```]]]___LLYYRRYRRYYww''dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\foBB`{ւϗNv@`fB.cmLHHHFHTbigZNg~ubNZrr++сkkwPPnHHp;;r..p..m22i@@bDD]NN\YY]]]]___```___]]]\\\___YYYNNYFFYYYYYFF,,dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;D....................D..gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\fBB]R2BP|gc~WLJLLFFHZgcYRLeggnbTUj;;ƐvvJJp88_HHYWWYYYYYYYZZZYYYYYYTTYRRY""YE55PPFFf)qdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ww5ckrBw.\FuTPLHFFUe_\\LLUZ`cpfbZZ;;ųYYYYێ먨xxNN++m88ZTTYYYYYYYYYYYYYYYY@@YfNB[Bdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;""........................""gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\׳i.BewgBBws\PmYRLHJLWf]]cTR_`UHY{we]`_'']]"";;88m;;YWWYYYYYYYYYY@@YTee//dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;........................gggtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\B@__'w.wf\RtsRPWZcn_\eZesfPFFbj`U]`&&UU22""_RRYYYYYYY22YeeFFdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;D....................D..gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccպ2tg鏵NժoسpZccc`U]bftzgUb`w|fLFFYf]R]\]m&&{{gHHYYYYBBYT;;PPFF++99dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;..................gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc߳֘\Bxpfڲ]sÆ߳cccTT]fvuPbzfHFFL`ZNYYb&&{{iLLYBBYT55dzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;w''......w''gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc߳ՌTz.eܩfܳcccgYLTfPieFFFFUUJPUb&&mm++c;;YVdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc߳ewгPxws.Jssroڳٓccc_LbRxbFHFFJPHWg&&Zdzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzccc޳.oPpww~RNv\|PeڳԩœccjZN\R_HNHFHHFJZt&&s Ydzcccccckkknnn{{{ppppppppppppppppppfffYYY;;;gggtttppppppppppppppppppjjjccc]]]TTTDDD...ww\dzcccֺݳҳԳܳf.@foP`ȕ5txfwēcezW}L~YHLHLJFJWb&& Zdzcccccckkknnn{{{ppppppppppppppppppfffYYY@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ZZZtttppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ݳҳӳճֳkԘoځsنϳ͓cfPxiHoTHNNJYUHL\''%%fdzcccccckkknnn{{{ppppppppppppppppppfff\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYnnnppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ܳѳҳԩس޳Pfo\=ϓciu\LpRFZLHN\UHW\''dzcccccckkknnn{{{ppppppppppppppppppiiiffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff~~~ppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\۳гfܺܳݳ߳w.BPBZB.ΓcgYJfunHFLzHHNNLTJJNWWj,,}dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\۳ϳђf۳ٳڳܳݳBfwwʨeޑ.w쩿“cerwTZgUFHFgu_FHNLJLUY''''''''''''''''''''''''''''''''''..dzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ڳγϳֳݳٳPb.Pov.~f޳.ڳϳΩccc`PJNPHHLJLTHFHNNNJJLRWYdzcccccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzcccww\ڳγγ昶ڳw.;۳\oPcP.PgϳγΩcccrcwNJHFHLPLLHHLPLPWZ{e8eTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT+Tj_jccceeemmmpppΨoooeee___UUUHHH222ww\ǵcccٳͳγ\m۳ֳ׳سٳܳo5ow\~oγͩccc\sTLJHHJPUTWNLPTRPTWZZin~~zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzssYYH8HbbbnnnrrrΔwwwggg```YYYJJJ888ww\cccٳ̳ͳѤԳճֳ֩ڤ.׳kmwfnԸͳ̩ccc_uT}LLLNYZZUUT]`]+"ssLLYYYnnnrrrzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pppiiibbbYYYHHHDDDww\kkk׳˳̳ͳγҳֳܳѳҳҳԳԳ\m.~ϳسo߳ܳ˩cccWzR~TNPRRT|WW\WWZef`+J]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]"~~YYNNNfffppprrrrrrpppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmggg```UUUDDDNNNww\\\\\\\\\\\\\\\\\\\\\߭陬2׵ǓcccfWZ]WUYe_YtvbnJ''''''''''''''''''''''''''''''''''''''''''Y8YNNNPPPfffnnnnnnmmmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjeee\\\NNNLLLNNNwwwwwwwwwwwwwwwwwwwwwwwúúúúĺĺźźźźƺƺƺǺǺغDk{Ϻݺݺݺ޺ㄗDϺßcccbi\YRRNTZn\jpn++n|||NNNNNNNNNYYYbbbeeecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc```YYYPPPNNNNNNNNNwwwwwwwwwwwwwwwwwwwwwww.~kЬЬȬǬƬ˧閧󬮺||}srjWPNP_c]i|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY\\\\\HFFFFFFFFFFFFFFFFFc|||cccccccccccccccccccccccccccccccccccccccccccccccccccccc```\\\YYYWWWUUUWWWZZZZZZ\\\ZZZWWWUUUUUUUUUUUUWWWUUUUUUTTTUUUTTTTTTTTTTTTTTTTTTTTTUUURRRcccޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡwwwwFFFFFFFFFFFFFFFFFFcFsssbbb]]]___kkkxxx~~~zzzjjj___```ccceeegggffffffeeeccceeeeeeeeegggeeeeeeiiiiiicccTTTcccޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘwwtFFFFFFFFFFFFFFFFFFcFFrrrLLLNNNNNNTTTnnneeeJJJNNNNNN\\\iiiiiinnnmmmiiifffiiikkkooopppjjjooorrrpppfffUUUdzcccޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻FޘNNNNNNNNNDDD888222.............................................................................................555BBBNNNNNNNNNFFFdzUUU""""""JJJNNN```ooo555+++LLLNNN\\\iiikkkjjjgggjjjjjjmmmrrrsssxxxwwwwwwsssiiiUUUdzcccޘF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻FޘNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNFFFdzzzz++++++'''"""+++NNNPPP888"""555NNNTTTcccgggccc\\\\\\```nnnooottttttsssssspppjjjUUUdzcccޘF޻ނ."""""""""""""""""""""""""""""""""""".ރ޻FޘNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNFFFdz.........+++"""FFFHHH""""""JJJNNNRRRRRRRRRWWWWWWZZZYYY```fffkkkooossssssjjjUUU?NT\ZZZTTTdzcccޘF޻ނ""ރ޻Fޘww\PPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBdz222222...+++'''DDDFFF"""@@@NNNNNNNNNRRR]]]bbbeeejjjjjjjjjjjjpppxxxvvvmmmUUUS^_`BBgffwgg|22}BB_BBY;;YYYYYYYQdzcccޘF޻ނ"tggggggggggggggggggggggggggggggggt"ރ޻Fޘww\YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555dz555555222+++'''DDDDDD;;;NNNNNNTTT```cccjjjjjjoookkkkkkooorrrrrrrrriiiUUU--YnJJubbbYYYYYYLLYZZZZ]_`YdzcccޘF޻ނ"gg"ރ޻Fޘww\```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...dz555555222...'''FFFHHH@@@NNNPPPYYYbbbiiikkkrrrtttppprrrrrrrrruuutttmmmWWWvwooвÍ]]tYYYYYYYYYHH]fe`_````YdzcccޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz222555222+++""""""NNNNNN"""JJJNNNRRR\\\eeeoootttxxxzzzrrrrrrtttwwwxxxvvvnnnWWW{nucznijtxrmiijntBBwȶ``eeoooooooooffptric`````YdzcccޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzZZZ222...'''NNNNNN'''NNNNNNWWWcccppprrrzzz~~~||||||{{{{{{}}}zzznnnWWWccnuxwr_R`c]\ZZ]`g_ZYY\]`fJJvBBffeexxxxxxxxxttw++ug``````YdzcccޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzccc+++NNNNNN+++NNNRRR```sssxxx}}}zzznnnWWWUW]gtxs`JJLLNPT\`]c`ZWW]fuBB``||HHZZpb``````YdzcccޘF޻ނ"gޘF޻ލރރރރރރރރރރރރރރރރރރރރރރލ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdzsssBBBBBB222NNN\\\ooo{{{{{{pppYYYWJHJP]juzufNFFFFFHJLNT]]\YUWZWWWWWZiJJHH''Əg```````YdzcccޘF޻ނ"gޘF޻ނ."""""""""""""""""""".ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdzxxxHHH"""""""""ZZZrrrLLLtttYYYJFFHWizvZHFJTY\]`bbb``YPJJJLNPT_tWWȫ""kk]]wb```````YdzcccޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdzUUU555rrrfff}}}tttzzzxxxYYYNFFFNgwx~uT\t{unf]URNJHFFHHJLLPU]BB""ȇ55k````````YdzcccޘF޻ނ"gޘF޻ނ"tggggggggggggggggt"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz"""pppWWWJJJ~~~"""oooWWW{{{ZZZRHHJJ\xnbfwpe`]ZUPHJUUJHNZHH¢``c````````YdzcccޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz'''+++pppeeeWWW;;;|||ZZZZJLRUWbxwjf`UJHLY\TJJLPT\{]]Ȏkk{`````````Y""AAZqpZdzcccޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz'''+++"""]]]]]]BBB"""\\\tJT]fn{bYLFFFHJLLNU`sJJ~ȍ88p`````````Y,,((/dzcccޘF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz222+++ppp]]]]]]iii555"""\\\L_{YFFFFFHLNNNNNPTUW\ů¿++cDDƾg`````````Y..JJ22`((/dzcccޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz'''DDDDDD222BBB\\\WvWcn|cHFFFFHNPNNNPUZZBBȨgiiþc`````````Y!!{{ꊊdzcccޘF޻ނ"gޘF޻ނ"gޘF޻ލރރރރރރލ޻Fޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzooo\\\no`UPLHFFHHHHHHHLPZbeejj~mYYȫ``````````Yi""vv䊊dzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ."""".ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzjjjRRR"""NNNbbb___rgZ`fffeb_YTLHFFHYmmȢú..Ynȕʐ``````````Y)""{{22ZdzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzHHH""""""BBB___vw~gU_s|z_HHNZ_cͲ""\mȩuu``````````YNJJpdzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ"tt"ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz'''"""___eLRewuTL\ZWrrϹĶYgȚff``````````Y..dzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ"tt"ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz+++'''"""gggeee___gLLTZ`zgLLTZYTPУYbȘʻ``..``````````Yww''dzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz++++++"""]]]~~~\\\___xfNR\cebbix~oZLFJRWTNrrѶ""`\ȰzzZZ``````````YFF,,dzcccޘF޻ނ"gޘF޻ނ"gޘF޻ނ."""".ރ޻Fޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz++++++]]]]]]___x~okcZY\]\UPPRRLHFFHLPUYZRPѲ55\YnȞ՗υ``````````Y55PPFFf)qdzcccޘF޻ނ"gޘF޻ނ"gޘF޻ލނނނނނނލ޻Fޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdzbbbggggggZZZ```Njrijjjgc_]_gu}iRHFLU|TRrrǗZZwYbTTƲ``````````YՙfNBB[dzcccޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdzDDDxxxxxxDDD~~~```NbwnYY`fiigefnznUHHJN~T|WY55]]ͤYZuvvظssc`````````Yeeឞ//dzcccޘF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FFFdz""""""'''""""""bbbYrfTNZgmmibZUWctugPFHLZZ""22]Y]LL8855k`````````YeeᙙFFdzcccޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޠg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz'''++++++ccctcTHFLZfvxpfZNHHLRfшvvYYiȚ88""x`````````Y;;PPFF++99dzcccޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz'''"""......''''''++++++"""'''""""""ccc}ZP\ioR]wWHFFJWbffb\ULJJJJL\ZZ;;RRxY\s׆`````````Y55dzcccޘF޻ނ"gޘF޻ނ"tggggggggggggggggt"ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dz''''''+++''''''...222..."""""""""'''"""ccc{]NHFHRkzwfRRiLFFHHP]]TLN\YTPNLLN''ӃϮ`]Ynxxױf````````YdzcccޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzYYY............222222...'''"""'''+++'''+++""""""RRRcccUJHFF]zxfxtRFHLLNUTLPmkWRW֯雛YYZo;;w````````YdzcccޘF޻ނ"gޘF޻ނ."""""""""""""""""""".ރ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzccc555555222222222555...+++'''''''''+++''''''+++'''""""""'''"""]]]cccULHH`tz}|wkcjJFHLPRTTYYzT}R~f..ڷˠYe\bzԃb```````YdzcccޘF޻ނ"gޘF޻ލނނނނނނނނނނނނނނނނނނނނނނލ޻Fޘg"ރ޻Fޘww\ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...dzuuu555555555555555555++++++...+++++++++...+++++++++'''""""""''''''pppcccUNJTepsniccszYJHJP\cpuWvZ}j88۶ڸ~~55_YY_s88u```````ZdzcccޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FHJdzDDD555555555555222+++......+++.........++++++'''''''''""""""'''''';;;cccZbov{zsmknptz{n`LLTbb{''أ̼gg{\`Y_``Äf``````ZdzcccޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...FLLdzeee222222222......+++......+++......+++...+++'''+++'''"""''''''```cccw{xnfgjkeRf}ڿwwLLrYY`LLb`````\dzcccޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠg"ރ޻Fޘccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...HTPdzbbb222...222...............+++...'''"""'''___cccreefii..55ځǧUUr_22bƶ}b```` ]dzcccޘF޻ނ"gg"ރ޻FޘeeemmmpppΨoooeee___UUUHHH222N_Tdzbbb222.....................+++++++++""""""]]]cccrr==֖ھˍže``` ^dzcccޘF޻ނ"tggggggggggggggggggggggggggggggggt"ރ޻FޘbbbnnnrrrΔwwwggg```YYYJJJ888\gWdzccc222222...+++222......222......'''+++'''"""]]]ccc''bb֠лŖ22reb%%^dzcccޘF޻ނ""ރ޻FޘYYYnnnrrrzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pppiiibbbYYYHHHDDDjpZdzmmm555555......+++222.........+++...'''+++"""gggccc""++TTԏ΄ccŀ€rr~,,mdzcccޘF޻ނ."""""""""""""""""""""""""""""""""""".ރ޻Fޘww\NNNfffppprrrrrrpppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmggg```UUUDDDNNNdz555555222...+++......+++...+++++++++..."""cccPP;;''''''''''''''&&&&&&--dzcccޘF޻ލނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނލ޻Fޘww\NNNPPPfffnnnnnnmmmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjeee\\\NNNLLLNNNdzDDD555555222222.........'''...222222...;;;cccdzcccޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘww\NNNNNNNNNYYYbbbeeecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc```YYYPPPNNNNNNNNNdzPPP222222222222222222222222222...LLLcccǵcccޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘww\\\\\\\\\\\\\\\\\\\\\Ǵǵccccccޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠwwwwwwwwwwwwwwwwwwwwwwwccc|||wwwwwwwwwwwwwwwwwwwwwww||||ckcpctcfcccccccccccccxcccrceccccccccccccccccccccccccccccccccccccczcgcexcmcwc~c~ctccmccccccccccccccccccYYYޙû޻ގގގގގނvvvvv@@ގގގގގ|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY|ckcpctcfcccccccccccccxcccrceccccccccccccccc```\\\YYYWWWUuWZZ\ZW~UzUxUoUZWYoUbUmTsUtTgTU`TTTTTTTTTTTTTTTUUURRR]c_PNPRWßؓؓٓȓ̓Ǔ擴哚cjޯæަގގގގގ__vvvvvooގގގގގcccßؓؓٓȓ̓Ǔswwbgi]ce_eekvx~zj_`cegfrfwe~ceeveisgkkegieiiikmikkcgT\pnj\nZNR\sibյީħȧŨĩéĩũũƩǩǩǩȩȨ֤کةששΩcm޾Öޖގގގގގ55vvvvvކގގގގގcccյީħȧŨĩéĩũşrLtwNNTneJNN\iinmifikopjorpfnU_btYZ_eZYUTW]\ZWZ}Գʳ˳ͳγϳѳҮ٧֧שڲݳٳڳ۳ܳۤڠܳ׳ϳγͳ˳ʩcfû޻ގގގގގނvvvvv@@ގގގގގޙdzcccԳʳ˳ͳγϳѳҮ٧֧שڲݳٳڭUjk"";'\"BuJN`n5+LN\ikjgjjmrsxwwsinUY}k`feZWk\WWRPTWzڳѳͳγϳѳҮҟѐ͐Ҝ٧ܲݳݳ߳ݳֳҳѳϳҳԳөcccæަގގގގގ__vvvvvooގގގގގޯdzcccڳѳͳγϳѳҮҟѐ͐Ҝ٧ܲݳz++2+='R"]+xNP8"5NTcgc\\`nottsspjnnUUU]`]TUUUUYZZWYU|NLLLLRT}_u߳׳ϳϳѳүѠʂWkƈ՜ާ۲߲v`YZn׳ֳԳӳٳڳٳکړcccÖޖގގގގގ55vvvvvކގގގގގ޾dzccc߳׳ϳϳѳүѠʂWkƈ՜ާۧ....5].Z+u"FH""JNRRRWWZY`fkossjoUUUiZWTRTLWUPJHHJT\sܳѳϳѳҲԡe;oNNkʈכԦڭvPNNNT۳ڳسֳ۳ܳ۳ccmû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccܳѳϳѳҲԡe;oNNkʈכԉ22225B._+''FF"@NNNR]bejjjjpxvm|UWbZWWPNLNPPLHHLLRPLHFHJNcwٳѳѳҳԦrL|8g;NNkψҘՠۧ\YWRJLU޳ܳڳڳcfæަގގގގގ__vvvvvooގގގގގޯìdzcccٳѳѳҳԦrL|8g;NNkψs5555==2_+'@B5'iHL];NNT`cjjokkorrri~UY~iWRLJNNNFHTJLHHPNJ`ڳ׳ԯ{_YL8z;NNkֈ՘۟UYWRF8\~cccÖޖގގގގގ55vvvvvކގގގގގ޾ìdzcccڳ׳ԯ{_YL8z;NNkp5;;5BW2g.2D;2+nF=`=_=g@NPY]bgptprrrutm|WWWYUPLHJLNNHF_ugFHFUgZJT,,m%%^ ^ ]\ZZYYYYYYYYYYYYYYYYYYYYYYYYYYYYQ݇ge_YL8;NNkWYUNB8b蓖cccû޻ގގގގގނvvvvv@@ގގގގގޙìdzccc݇ge_YL8;NNc2F5T2z+@=5++Z@p=v8\8_JNNNRW_cjcinuxvnrsWWWjWNJJTLNHHzLFHnufJ~--~b`````````````````````````````````Yκ酫fge_YL8;NNkjYYTL=Bb|bbbæަގގގގގ__vvvvvooގގގގގޯìdzcccκ酫fge_YL8;NN82|.'@2++'UgT2x'_}NNNNTTU\_\]_eszmprUUU\ZWNHU\LNNHLZFRpL\&&e````````````````````````````````_YTۺ公fge_WJ8;NNkWYWTJ8Jbu~ǎ```Öޖގގގގގ55vvvvvކގގގގގ޾ìdzcccۺ公fge_WJ8;N5+nf"'++"tmj\j+NNNNNPPPPPNN\gmfkkTTTo\LHUYJNNToHixP{&&r````````````````````````````````]YTۺݳfgc]TH@;NN`RYWRF2NZjtvutronje`\UTi䍐```û޻ގގގގގނvvvvv@@ގގގގގޙìdzcccۺݳfgc]TH@;8Dr'U8LT""~mpm]2NNNNNNNNNNNPYZ`gkkUUUbWJFJLHLPHY}L}UW&&e```````````````````````````````ZYT޺ܳ߳兲fc]ZceT=NLPUTN@8NT_igc`ZURHB85JNTvڌ```æަގގގގގ__vvvvvooގގގގގޯìdzccc޺ܳ߳兲RDx]ZbcR"]@'`BYr}xjY}"NNNNNH+82HNNY_cjooUUUtfJFHHFHNH_R\Z''b`````````````````````````````_ZYݳݳ``s~wZBHNPNH8BNNPRNNHB825;@DHNRrȆ___Öޖގގގގގ55vvvvvކގގގގގ޾ìdzcccݳݳLep"=D]D{|i'H2'c=Zk]iDHB5+'+5=NNYZ`imnUUUgWJHPJFFHFbxRbLP_''}b```````````````````````````c`ZYZ߳߳~eN@JLH@2HNNLB825;@DFJLNPNUm돬]]bû޻ގގގގގނvvvvv@@ގގގގގޙìdzzzzeeeZZZWWW\\\eeevvvccc߳߳"""=;iw=Zep8+ePgRHH'.2~2p"""+x"r;;LNT\fgmmTTZw`PJUUFFFFeiPfTLg''rr22f````````````````````````bgieZ;;YZ}\D;==8.+B825;@DFxJ~LNPRRTTNWp׉}\\\æަގގގގގ__vvvvvooގގގގގޯìdz||BBggicZ..UFFPNNN```~~~ccc'''+++ߛR"2twU8u"P8'J;i=n=v+FbHmB@HNRgjciiTTTbYYNZ`LFFHfzbPuvf]TT''ʀžub````````````````````bgpurfLLYBBYZ""ZAAqpZt@+.p.`+Y+.5;@DFJLNtPxRRTTUUUPPZ{x|}\\\Öޖގގގގގ55vvvvvކގގގގގ޾ìdz__u_22TLLNYYY~~~ccc'''+++"""Ť;\u]F5.u2=_BjBp"2H"""DD=HR`iebggUUUm]]R]fYFFLf|w`bUiztfb]U`''ɀ¿wf````````````````ckwtHH]YYYBB`,,/((f++w.Rp5Rp;Uu@rDFJLNPRRzTvT|UUUUURJHmkpvzv{{ZZZ޻ގގގގގނvvvvv@@ގގގގގޙìdzJJi""WLLN```ccc222+++jJ''|_PNU\HN.BRFoHwH".;"""2;;ZYY_finnWWW`__U`jbFFPfseZe\_ncZWPNR\''ccſ¶LLxkc````````cgo{++ffpYYYYYY22}\..JJ22`/((ⅰB{5c;_@b}DeFfJfL{NPRRTTUUUU~UUTU_inneYWw}w|}\\cަގގގގގ__vvvvvooގގގގގޯìdzuui22TNNNvvvccc'''ӳ;H"n"iYY]gk`J'cHwHD+8+Wm`bZNTkpkppWY_i_`]ew{YHU`_RTc]]fWLJLYx''ǎ˄ZZttwoooYYYbbbgg|T!!{{䊊kBr5n;x@{DvFtJnLoNpPpRpRTTUUUUUUTYk{voeYPZf|z]e{ޖގގގގގ55vvvvvކގގގގގ޾ìdz_FFPeeecccj+Wz;u8k"b+|'gcF\Z]cjmmjbUZrZ"oFB_UPZfuupvY`uZZbfrc`ZULL\\_eUFFHLPPTу;;""5555]]xxxoooYYYffwNi""vv䊊c=\;Tu@\{DcFnJwLNPRR|TwTwUxUUUUUTT`zxpfFJTbnúȈ]oގގގގގނvvvvv@@ގގގގގޙû޻dzoou..U\\\cccc=\+5J"5FJvDuL"ZJ+~WDeossojiknpw{82"T+cJTbnu~w\kjUbnggeLRYcgZHFFLJWPPTTԖԸц8888ss厎酅ZZ..88kkxxxooo]]tBBg)""{{22Z_Y|JfpLitNkzPrRRTTUUUUUUTPJ@LNj}reRFF.is{ۆ_{ގގގގގ__vvvvvooގގގގގޯæަdzBBZWWWccc_Y|'.2;LBe"m"`D"tDBjz{xpc_isxbgJ+kF.e.is{鋸Ԃ]wZTNbu~gNZgibTHFHHHLRm++ŀԿ׸ո҄zz``ffuuÃxxxeeb?NJJp__TsRr~TsTUUUUUUTRNB8BD8;WgsHTZ\.v\`Ŏގގގގގ55vvvvvކގގގގގ޾Öޖdzc\\\ccc__'''"""22D|Bfi\P;e88fvrpk]\jt{ub="T85+pZ醠_tR`{fcjiicWLFFJ]ϻΡ22bԿ׸شռʯeeIJè_..__YzUvUwUUUTRRUURF22FNH@ux\_bcH8cގގގގގ55vvvvvކގގގގގ޾Öޖdz''..ieeeccc_Ww+++'''"+p=2iB`\WRB"uiFcfe]ZcgUreD.n55j5_]PJ]xkjfmtwiRJYnef""͠м_```Ӿ׸شռʯHHЃ^ww''׺x_Y|UwT|ZwWYUNB+5JUTHz}cceeb.gćcގގގގގ__vvvvvooގގގގގޯæަdzBB==eegzzzccc׺xZ|++++++"2@J|ePLPL=_8+=@55]R"T"U\BDP|.b_NH\oj`mtjz{ibb֍UUrY_88׷شռʯkk''``JJuSFF,,mx֦{YYTL=58JTL=Tteeeb_Rzܱcގގގގގނvvvvv@@ގގގގގޙû޻dzoo..ڮDDBBgcccm+++++52=]@885'~'52e"Y=uRzHnۨ_gLFY|~iYgkjԾ˧YYsxxΚزջʫ``ȶn55PPFFf)q\ZYTJ8_D;=;FTbpxwnfeb_Y}ʪcܖޖގގގގގ55vvvvvކގގގގގ޾ìdzהDD||cccb'+5gL""F8k+@RvĠ`LFTnrYZk''ϖLLr`_zLLvvTTƞΰ͘ʚ˩ǕYYiiDDffoofN[BBUknTH;_N8FTZ_bceeeb_Yocۦަގގގގގ__vvvvvooގގގގގޯìdzwwڔﮮee..__ccc_+DcxD@o'BZw`fLFJtconNjg==ww\Ybx--Yee랞//W`_PR]nNTZ_bceeeb_YPgc޻ގގގގގނvvvvv@@ގގގގގޙìdzPP..==''JJccc"""2"""'''""""""""u;ڧbJFF\WwTziЁֿgg{Y\o||BBwveeFFtYYTL@Pm__bceeeb_YJ;NNkcÖޖގގގގގ55vvvvvކގގގގގ޾ìdzwwuuccc'''++++++"+"+'F"L8z"D5g+vڜcWJFHTftgf55ڼ55_cZnHHì;;PPFF++99ZYWTJ8.P`ceeeb_Y]WL8;NNkcccæަގގގގގ__vvvvvooގގގގގޯìdzooBBBBooccc'''"""......''''''++++.."""'''"""""".=cccciJNZuspf..~~YYYs""BB}55|UYWRF28Uceeb_YZoj_YL8;NNk듡cpû޻ގގގގގނvvvvv@@ގގގގގޙìdzccc''''''+++''''''...222..."""""""""'''"""Hkꓡcp_`fvxccnfeԣ丸 Y]\i~""``mTWYUNB+s=zU`b_Ywfge_YL8;NNkڲғciÖޖގގގގގ55vvvvvކގގގގގ޾ìdzcccTxx............222222...'''"""'''+++'''+++"""""""buNNkڲғciisu~w]Rfkcki''ض˜`YY]uȅJJvoNFPYYTxL|=u+Pk=YPWUufge_YL8;NNkѩϨÓciæަގގގގގ__vvvvvooގގގގގޯìdzcccU555555222222222555...+++'''''''''+++''''''+++'''""""""'''"""f;NNkѩϨÓci~wx{xfRRxwimne88۷ٛRRxYYZbn~~]]۳۳ݯݓrRFTZTYWxTxJx8m{+Df;RuDpfge_YL8;NNķۧciû޻ގގގގގނvvvvv@@ގގގގގޙìdzccc۳۳ݯݓr@o555555555555555555++++++...+++++++++...+++++++++'''""""""''''''28;NNķۧciwxtuwbf|nst..گvv22]YYYZbgmmmg++cBBJJڳճֳٳۢYFTZ_]U|Y{WwRxFu2bp+Fjofge_YL8;NW˧cjÖޖގގގގގ55vvvvvކގގގގގ޾ìdzcccڳճֳٳۢYFP8DN555555555555222+++......+++.........++++++'''''''''""""""''''''+HLTL8;NW˧cjugjznw}szxjփړŤZZx55\""`YY""Z..Yjj~HHڳӳճחFvTZ_bc]WzYzUxN|BpYfge_YL8;֩coæަގގގގގ__vvvvvooގގގގގޯìdzcccڳӳճחFvTZ_]Bb~222222222......+++......+++......+++...+++'''+++'''"""''''''=|__YL8;֩com]]iozzp{|'';;ۈ͗ºȯJJٳҳԳ֙Z_bceeYY{Y{TL=z͏Գfge_YLzǓcmû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccٳҳԳ֙Z_bceeYY{Y{8H_222...222...............+++...'''"""'''_fge_YLzǓcmcWPWgxxikztev""]]rrDzҶϣIJˢeeBBسѳҳԯiceeeb]\\\W;xѤfge_cccÖޖގގގގގ55vvvvvކގގގގގ޾ìdzcccسѳҳԯiceeeb]\\;No222.....................+++++++++""""""]|fge_cccUJHN\b\R]`Tv55dd׳ϳѳҳԌeeb_Ye\\`fgԳcccæަގގގގގ__vvvvvooގގގގގޯìdzccc׳ϳѳҳԌeeb_Ye=Nv222222...+++222......222......'''+++'''"""]{fgԳcccuUHFFJWnPHFHJbֳγϳѳүj_Y~ϳѩȓcccû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccֳγϳѳүj_Y~m555555......+++222.........+++...'''+++"""gϳѩȓccceJFFJUfZFFHNֳͳγϳѳҧ~߳γͩcccÖޖގގގގގ55vvvvvކގގގގގ޾dzcccֳͳγϳѳҧ~߳555555222...+++......+++...+++++++++..."""γͩcccWJFHR]}HHLUճ˳ͳγϳѳҳԳճܳҳ˩cccæަގގގގގ__vvvvvooގގގގގޯdzcccճ˳ͳγϳѳҳԳճܳDLT555555222222.........'''...222222...;HLҳ˩cccUNHLT{NJ{ĺԳʳ˳ͳγϳѳҳӳ߳߳޳ٳʩcccû޻ގގގގގނvvvvv@@ގގގގގޙdzcccĺԳʳ˳ͳγϳѳҳӳP]i222222222222222222222222222...L]fٳʩccc]RJJ_]U亻յ“ccc޾Öޖގގގގގ55vvvvvކގގގގގǵccc亻Ǵȴȴȴʹ۴ߴߴʴյ“cccsNLvjbrĺĺúĺۺۺߺٺպպպպԺúcccޯæަގގގގގ__vvvvvooގގގގގcccĺĺúĺۺۺߺٺպպպպԺúcccZWnrwxNN󬭱쬬լǬǬĬ¬ǬȬǬ|}ޙû޻ގގގގގނvvvvv@@ގގގގގ|||󬭱쬬լǬǬĬ¬ǬȬǬ|}er@@ooTTbb""==22""``ttLL''..++ގގގގގ55vvvvvކގގގގގ޾Öޖ|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY@@ooTTbb""==22""""++bbzzWW..wwHHYYWW22DD]]''++{~ގގގގގ__vvvvvooގގގގގޯæަcccbbzzWW..wwHHzz==LLLL''++{~..'';;ZZWW""BBDD|JJee..""''@@HH..""ގގގގގނvvvvv@@ގގގގގޙû޻ccc..'';;ZZWW""BBDD܍RRZZRR""""==..==zzBB@@jjLLDDBBee55~~;;..22;;''DDWWbbRR55ޖގގގގގ55vvvvvކގގގގގ޾ìdzccc==zzBB@@jjLLڗttee55JJ====܄""88HH..FF""22++""BBnn``''22RR~~wwDD88LL''ަގގގގގ__vvvvvooގގގގގޯìdzccc""22TTBBBBbb랞RRoo@@++JJ'';;""""FF..\\JJ++LL''???222.......................................###""FFkkxx]]==\\..ggccFFcc""޻ގގގގގނvvvvv@@ގގގގގޙìdzccc""''++++..""8855}}}}++''FFcc""JJJLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***;;}22\\;;;;YY..88++~;;++mmkkBB88@@Öޖގގގގގ55vvvvvކގގގގގ޾ìdzccc;;}uu""}}ҔkkNN55DD@@;;++vvjjBB88@@TTTYYYZZZWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888***;;;;uuHH++BB==DDZZDDWWUUUU""YYHH++LLæަގގގގގ__vvvvvooގގގގގޯìdzccc;;;;uuHHYYbbTT}}ZZ__22""55LL..첲uuHH++LLGGG+++444JJJBBB(((,,,222IIIYYY```bbb___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZTTTHHH888LLLLooss88~BBjj55@@__{{ee""PPû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccLLLLooss88ccLLbb==""8888oo88JJpp쯯ȁJJ""PPPPPJJJGGGDDDDDDBBBBBB\\\;;;LLL@@@>>>CCCDDDvvv@@@]]]eee````````````````````````````````````___ZZZTTTHHH888***ccggYYjj\\~++""@@ee]]"";;PP++@@Öޖގގގގގ55vvvvvކގގގގގ޾ìdzcccccgg]]NJѐ‚''DDNN88FF..BBYYLL55""..++@@VVVBBBhhh===fffvvv```````````````````````````````````````___ZZZTTTHHH888***..nnFFeeJJ88DD""@@''++55++TTzzzz__~|æަގގގގގ__vvvvvooގގގގގޯìdzccc..nnFFBBᦦƁυNN..@@BB;;RR88~~⥥\\敕gg""BB''III999>>>bbbfffeee``````````````````````````````````````````___ZZZTTTHHH888***"""""..;;RR``''""__NN""{z55@@JJ""UU..++88}xû޻ގގގގގނvvvvv@@ގގގގގޙìdzccc""텅;;88WW....LL坝˂ZZWW""""LLnnWW__xHHHFFF999AAA;;;oooaaa]]]`````````````````````````````````````````````___ZZZTTTHHH888###z..JJFF22''__eeWW..''FF""YYkkFFÖޖގގގގގ55vvvvvކގގގގގ޾ìdzccczLLNNJJHH==""==NN==LL..==++FFZZ;;@@ێggFFF===:::IIIttt@@@888%%%777````````````````````````````````````````````````___ZZZTTTHHH888***;;;$$$""""""""''jj{{]]BB@@""++BB@@++BB;;æަގގގގގ__vvvvvooގގގގގޯìdzcccTTUUUUPP椤..;;''55LLNN᧧TT栠cc;;22mm55GGGiii<<<777```````````````````````````````````````````````````___ZZZTTTHHH888***333***999)))!!!888"""222999)))%%%888"""222999)))***ttzz;;DDkkrr++22''DD]]WWUUû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccNNttPPLL==88FFTT''55YYee88""HHooHH;;||ӃWWUUDDD,,,DDDttt:::<<<@@@888``````````````````````````````````````````````````````___ZZZTTTHHH888***GGG...###<<>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888...''UU==NNeessBB''''|~@@DD8855oo]]@@}88""û޻ގގގގގނvvvvv@@ގގގގގޙìdz__u_2T2LNLYYY~~~cccffww@@++PPJJ88jjcczzkk@@''DD;;FF""LLX`ccrm|opn~jzesZgNZFR>G;;;BBB!!!uuuBBB333<<<ggg```___NNN@@@555555555555555555555555555555555555555555555222222222222555222+++***<<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888++iijj55DDZZ==++""FF55RRjj""zÖޖގގގގގ55vvvvvކގގގގގ޾dzJJi"W"LNL```cccTT셅לLL5555NNLL""JJ++""NN==UU22""""BBٜLLNNss__ggMgnn~{}xtm|_mNZEOEEE666/3RY[)5;%*>>>;;; kvHHHDDD@@@;;;```PPPJJJFFFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDH;;R++WUTRJ""@55;;;222+++***BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""``JJ;;ZZHH''BBHHffccppHH++""""æަގގގގގ__vvvvvooގގގގގޯdzuui2T2NNNvvvcccBB]]LL++FFYY22""ZZ22YYLLLL쭭..NNBBWW225555vv++jjiivv^z{{tiwUbFPFFF?G`mgvgv_mT_38===c~UUUUUUUUUTTTZZZRRRRRRPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLZFFz''{pfYF'';''+++GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***''ccPP``{{ii""PPjj..55""22ee55û޻ގގގގގނvvvvv@@ގގގގގޙdz_FPFeeecccPP@@鬬ssNNLL==YYffzz锔BBTT쩩==wm|WcEO,]h~~vgvNZ7@***kg\\\]]]]]]]]]WWWWWWYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTgLLp]U5''***HHHBBB@@@999<<>>333<<<jjj]]]eeejjjjjjjjjjjjjjjjjjjjjjjj``TTFF`BBB888DDD777BYYHee]ttxF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, ''WWWW;;JJ++22''''++YY22..UU....''}{޾Öޖގގގގގ55vvvvvކގގގގގdzoo..DDBgBcccJJ++NN22xxff@@++""LLNN""55vvLL==@@JJww..HNίLs-NWBi;{,LLLFFF;;;piHHHDDD@@@;;;]]]fffiiiiiiiiiiiiiiiiiiiiiiiiiii..""88;;++H@@AAA>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***++BB88PP==BB55JJ\\''55]]55PPccNNDD..~}û޻ގގގގގނvvvvv@@ގގގގގޙdzDD||ccc..ff""NN==NNJJ''BBǂss``55''LL22..@@Hv{Z.hvaef0,\fccckkkgUUUUUUUUUTTT```fffiiikkkeeeeeeeeeeeeeeeeeeeeeeeeeee\\T@@AAANNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$BBDD88..ZZss;;""88BBnnooppFF5555æަގގގގގ__vvvvvooގގގގގޯdzwwee..__cccLL55++""BBPP{{22==++++UUPPwPelTTT===5mz]v|gggnc~\\\]]]]]]]]]```fffgggfffccccccccccccccccccccccccccccccZZ22++FFiDDDDD???>>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###""__mm55DDiiWWRR``LL]]||..Öޖގގގގގ55vvvvvކގގގގގ޾dzPP..==''JJcccHHYY""55YYLLRR22""@@\\朜LLHH䗗mm~Rpx???999@dmdQQQuuuBBBv]]]]]]]]]\\\```cccfffeeebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{ZZDD22222222DDvZZ___WWWJJJ???BBBFFFYYYAAAFYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRY``>>>aaa...;;BB""DDoogg2255==++++ggÀ@@88==û޻ގގގގގނvvvvv@@ގގގގގޙìdzwwuuccc''BB..BB55``ii'']]DD++nnHHLLppӛ{{ۗ;;53EEE;;;CCC>>>RRR>>>XXXXXX___``````bbb```____________________________________________________________\\\TTTCCCNNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;22..~++PP..++DDBB''""ccDD..æަގގގގގ__vvvvvooގގގގގޯìdzooBBBBooccc22DDPPFFLLHH''BB''++''BB==""NN55__2222pp..&D<<<DDDkkkjjjOOO```````````````````````````````````````````````````````````````___]]]ZZZUUUJJJNNNTTTAAADDDDRRBYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BZZFYY;FFbdd]]]000rrr===FF'';;gg;;z}5588LLHHiimm22JJÖޖގގގގގ55vvvvvކގގގގގ޾ìdzcccFF'';;==``΅NNpp՗rrbbHH55JJ>>>:::BBBJJJuuuJJJ````````````````````````````````````````````````````````````___]]]ZZZTTTJJJDDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000ggDDFFss;;@@@@""ZZ``__uuWWDD""FFû޻ގގގގގނvvvvv@@ގގގގގޙìdzcccggDDFF||YY88UUHH++``FF""NN8822``LLJJJJ;;FFKKK;;;BBBBBB`````````````````````````````````````````````````````````___]]]ZZZTTTJJJooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGG""88||À\\HH__''@@FFTTNNæަގގގގގ__vvvvvooގގގގގޯìdzccc""88||WW;;''驩DD;;;;''==ԕUUeebb└;;LL<<<888SSS@@@OOOAAA[[[TTT``````````````````````````````````````````````````````___]]]ZZZTTTJJJLLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<''NN22++22==NN..8855++++NNUU55''==..|{}Öޖގގގގގ55vvvvvކގގގގގ޾ìdzccc5555""NN====..BBڇ88..""22JJNN䩩ggFFcc|{};;;;;;DDDDDDCCC```````````````````````````````````````````````````___]]]ZZZTTTJJJNNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBBww""++55@@YYHH""++22BBRRDD++@@û޻ގގގގގނvvvvv@@ގގގގގޙìdzcccww88JJ˄PP""JJ55{{DDZZHH捍mm++jj@@===>>>GGG:::MMMIII???222````````````````````````````````````````````````___]]]ZZZTTTJJJNNNAAAGGG???AAAGGG???AAAHHH++rrxx88''++WW88''TTÀgg""''""æަގގގގގ__vvvvvooގގގގގޯìdzccc""ߌFFNNNNYY..cc__zzWWÀgg""''"";;;999lllBBB999JJJLLLJJJ`````````````````````````````````````````````___]]]ZZZTTTJJJsssQQQsssQQQsss""~ffYYBB55..""22""++DD]]``==LLffÖޖގގގގގ55vvvvvކގގގގގ޾ìdzccc""~__{{׎JJLLLL''JJ88쪪wwٝܒ@@NN88]]``==LLffBBB;;;VVVCCC;;;TTTYYYZZZWWW``````````````````````````````````````````___]]]ZZZTTTJJJ++..==''ZZmmmm@@..ZZ""""@@HH]]DD==__û޻ގގގގގނvvvvv@@ގގގގގޙìdzccc++..==``22JJ..LLBB;;8888ff""''TT==iiNN@@HH]]DD==__GGG888888;;;===@@@TTT???GGG777777888]]]EEEYYY```bbb___```````````````````````````````````````___]]]ZZZTTTJJJ""BB..BB++"";;DDjjBBPPggTT..~55``ee""æަގގގގގ__vvvvvooގގގގގޯìdzccc""BB..BB++@@㡡LL""..훛ԃ55""55==ژ;;==\\55``ee""PPPJJJJJJPPPOOOPPP^^^PPPJJJHHHNNNPPPRRR]]]eeeffffffffffffffffffffffffffffffffffff```]]]ZZZTTTJJJ""++''rrmm88''RRBBUUnnTT552288""Öޖގގގގގ55vvvvvކގގގގގ޾ìdzccc""++''rrmm88kkŃЖ++==}}BB++""NNۜ55\\BBBBfffvvvffffffffffffffffffffffffffffffffffffbbbZZZTTTJJJFFjjBBWW__''22DDDDDDPP''""LLff''{޻ގގގގގނvvvvv@@ގގގގގޙìdzcccFFjjBBLL..==WWHHNN..gg''nnee''{bbbfffeeecccccccccccccccccccccccccccccccccccc```YYYKKK''xx2288PPDD""..@@"";;kkxxee++ަގގގގގ__vvvvvooގގގގގޯìdzccc''xx222288HHLLLLNNooUU""ZZDDHH@@88++oooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTTDD""""__PPTTTT..''22DD\\cc88{{++ޖގގގގގ55vvvvvކގގގގގ޾ìdzcccDD""""]]""ccՒDD''''PP__88{{++""..RR__""88@@DD~BBii55RR{{LLDDPPގގގގގނvvvvv@@ގގގގގޙû޻ǵccc""..FF88WW++@@""''NN""BBii55RR{{LLDDPP55==ffmmDD"";;||HH;;||ff55ގގގގގ__vvvvvooގގގގގޯæަcccLL==UUHHLL"";;||HH;;||ff55..LL""""..iimmPP++"";;HH..iirr88ގގގގގ55vvvvvކގގގގގ޾Öޖ|||..LL""""PPmmPPBB;;HH..iirr88|||ccccccccccccccccccccccccccccccccccccccccccbbbbbb`````````_________________________________________________________``````bbbbbbccccccccccccYYYގގގޙޯ޾û޻ަޖޖަ޻þ޾ޯޙގގގ|||cccccccccccccccccc```___ZZZYYYUUUTTTRRRPPPNNNNNNNNNNNNNNNNNNNNNPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPNNNNNNNNNoooo@@@@ooWW~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cccގގގގގގޙޯ޾þ޾ޯޙގގގގގގ~~~tttggg```YYYPPPNNNNNNNNNNNNNNNNNNNNNPPPTTTTTTZZZZZZ\\\_______________________________________]]]ZZZUUUPPPNNNNNNNNNNNN~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cccގގގގގގގގގޙޯ޾þ޾ޯޙގގގގގގގގގmmm]]]RRRNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRWWWYYY______cccffffffffffffffffffffffffffffffffffff```ZZZRRRNNNNNNNNNNNNNNNNNN444"""dzuuuooommmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmtttcccގގގގގގގގގގގގޙޯ޾þ޾ޯޙގގގގގގގގގގގގdzeeeRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPRRRYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYUUUNNNNNNNNNNNNNNNNNNNNNNNNNNN;;;GGGDDD&&&###dzttt___RRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPUUUnnn}}}cccގގގގގގގގގގގގގގގޙޯ޾þ޾ޯޙގގގގގގގގގގގގގގގdz{{{FFF=========DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDDD============DDDNNNNNNNNNNNNNNNNNNFFF>>>EEEDDD888222++++++###;;;$$$dzxxxmmmTTTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWWWeee}}}ccc@@ooކގގގގގގގގގގގގގގގޙޯ޾þ޾ޯޙގގގގގގގގގގގގގގގކoo@@dzrrr555222222222222'''555NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN===555222222222222'''555NNNNNNNNNNNNNNNPPeeLLL;;;UUUHHHAAABBB888...+++***333***999)))***dznnn]]]8;8+2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++2++.+BBBNNNNNNPPPTTTnnnccc@@ooކގގގގގގގގގގގގގގގޙޯ޾޾ޯޙގގގގގގގގގގގގގގގކoo@@dz@@@BBB@@@@@@@@@===888'''DDDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHH@@@BBB@@@@@@@@@===888'''DDDNNNNNNNNNNNN@@ގWWvvvvvvttގ55FFF"BH8NTDDD(((AAAH@@`i]N2''***GGG...###<<>>zzz-00BFF'22"22".."++'++-00@@@***888...dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~ccc@@ooކގގގގގގގގގގގގގގގގގގކoo@@dzFFFNNNes`urfz@@@222'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''+++FFFNNNes`urfz@@@222===NNNNNNNNNNNN@@ގގގގގWWvvvvvvvvvvvvvvvvvvvvvvvvxxގގގގގ55TTTJJJZϐjz888777777CCCJJJiDD];''+++***<<<rrrxxxMSS2BB5HH5JJ5JJ2FF.BB'88++!**000DDD888dzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}ccc@@ooކގގގގގގގގގގގގކoo@@dzFFFNNNYckT`mZnWcn@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;===NNNYckT`mZnWcn@@@222===NNNNNNNNNNNNooގގގގގޯxxvvvvvvvvvvvvvvvvvvvvvvvvvvަގގގގގ__CCC[[[JJJOOO+Zao///<<<@@@<<<%%%JJJTTTWWWFFpF''222+++***BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""dznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnnccc@@ooކގގގގގގކoo@@dzFFFNNNHHHFFFFFFDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNކގގގގގ޾xxvvvvvvvvvvvvvvvvvvû޻ގގގގގނIIIDDDAAAuuujjj>>>{ @@@<<<888JJJUUU\\\___++Y;;;222...GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***dzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmccc@@ooކކoo@@dzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNN@@ގގގގގޙxxvvvvvvvvvvÖޖގގގގގ55MMMDDDkkkBBB[gZgR]CL*0;;;BBB666@@@;;;JJJTTTZZZ___vZZf@55555@@@888***HHHBBB@@@999<<>>JJJTTTZZZ]]]___DDpJ""222LLLHHH888***CCCfffHHH;FFBZZD__F``F``F``F``F``F``F``F``D]]@WW8LL'88'++BBBDDD***dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccdzFFFNNNes`urgzFFFFFFFFFFFFFFFFFFFFFBBB;;;555222222222222222222222222888===DDDFFFFFFFFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNNކގގގގގ޾__˂û޻ގގގގގނ]u|~n}NZ38JJJTTTZZZ]]]______22{R222UUUTTTHHH888***FFFQQQFYYD__FbbFbbF``F``F``F``F``F``F``F__BZZ;RR.BB"++<<<dzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}cccdzFFFNNNYckT`mZnYcnFFFFFFFFFFFFFFFDDDPB5rLUZ\\\\\ZWwP`@;."...@@@FFFFFFFFFFFFYbkT`mZnWcn@@@222===NNNNNNNNNNNN@@ގގގގގޙû޻ގWWttގ޾Öޖގގގގގ55}gvJJJTTTZZZ]]]___```___22T222ZZZZZZTTTHHH888AAA;;;888888BZZFbbHeeJccF``F``F``F``F``F``F``F``B\\=TT2FF"..555888)))dznnnFLFJPJFLFFLFFLFFLFFLFbebbebFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnncccdzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFFFFZ+txzzzxxxxxwup`T8...DDDFFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNooގގގގގޯæަގގWWttގގޯæަގގގގގ__vT_JJJTTTZZZ]]]___``````___22FF''U222]]]___ZZZTTTHHH888***GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999dzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccdzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFiR=~āÁÀ€~}{u`;."===FFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNNކގގގގގ޾ÖޖގގގWWttގގގޙû޻ގގގގގނOOOJJJ>>>~_m)5;...;;;JJJTTTZZZ]]]___`````````___22++RRW555___```___ZZZTTTHHH888***>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttcccvvvvvvdzFFFNNNes`urgzFFFFFFFFFFFFm'ʅɄȃǂłłŁŁŁŁŁÁ€~{p`@888FFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNN@@ގގގގގޙû޻ގގގގގWWooގގގގގ޾Öޖގގގގގ55EEE;;;999:::;;;@@@BBBBBBDDDCCC@dm;k5gvRY[uuuxxxwwwtttiiitttAAA>>>===@@@JJJTTTZZZ]]]___````````````___DD;;ꁁR++555`````````___ZZZTTTHHH888***QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccvvvvvvvvvvvvdzFFFNNNesbsrgzFFFFFFFFFFFFx·ˆʅȄǃǃǃǃǃǂǂƂŁ€}uwP222FFFFFFFFFcr`upfz@@@222===NNNNNNNNNNNNooގގގގގޯæަގގގގގ__ooގގގގގޯæަގގގގގ__RRR]]]CCCBBBGGGSSS^^^iwgv/3DDDHHHhhhvvvJJJTTTZZZ]]]___```````````````___{ZZ88H;;555````````````___ZZZTTTHHH888GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@dzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFkokkokFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}cccvvvvvvvvvvvvvvvvvvdzFFFNNNYckU]gZnYcnFFFFFFFFFFFFłω͈ˆɄȄȃȃȃȃȃǃǃƂÁ~wW222DDDFFFFFFYbkT`mZk{Wcn@@@222===NNNNNNNNNNNNކގގގގގ޾Öޖގގގގގ55@@ގގގގގޙû޻ގގގގގނPPP888B˶r`mDDD222JJJTTTZZZ]]]___``````````````````___bbb22""텅z''DDD555```````````````___ZZZTTTHHH888***???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""dznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnncccvvvvvvvvvvvvvvvvvvvvvvvvdzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFȄыϊ"ˆʅɄȄȄȄȄȃȃǃǂŁxZ222DDDFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNގގގގގޙû޻ގގގގގނކގގގގގ޾ÖޖގގގގގNNN7775mz+"~BBBKKKTTTZZZ]]]___`````````````````````___bbbZZTTJJZFFDDD555``````````````````___ZZZTTTHHH888***GGG@@@TTTHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFHHH888"""dzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFbebFLFbebbebFLFFLFbebFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvdzFFFNNNU]eU]f]rYcnFFFFFFFFFFFFʄҌ"ϋ'̇ʅɄȄȄȄȄȄȃȃǂŁx\222DDDFFFFFFT\cT`k\oWcn@@@222===NNNNNNNNNNNNގގގގގޯæަގގގގގ__ooގގގގގޯæަގގގގގHHH777999===0,]hFFF666!!!>>>(((TTTYYYZZZ]]]___````````````````````````___bbbccc\\..''gLLLLLDDD555`````````````````````___ZZZTTTHHH888###DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttcccvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvdzFFFNNNescrrgzFFFFFFFFFFFFʄҍ"Ћ'̇ʅɄȄȄȄȄȄȄȃǃŁx\222DDDFFFFFFcr`uofz@@@222===NNNNNNNNNNNNގގގގގ޾Öޖގގގގގ55eeHH@@ގގގގގޙû޻ގގގގގJJJUUU;;;???TTTWEEEBBB...@@@YYY```bbb``````````````````````````````___bbbccceeeiii``HHFFvTTWWWTTTLLLDDD555````````````````````````___ZZZRRRDDD...AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))dz|~|FLFJPJFLFFLFFLFFLFFLFuxu~~FLFFLFuxuuxuuxuFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvdzFFFNNNescrrgzFFFFFFFFFFFFʄҍ"Ћ'̇ʅɄȄȄȄȄȄȄȃǃŁx\222DDDFFFFFFcr`uofz@@@222===NNNNNNNNNNNNގގގގގ޾Öޖގގގގގ55jjPP@@ގގގގގޙû޻ގގގގގPPPGGGBBB:::<<>>Oekhvsusm|`oPZEODDDDDD:::\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..dznnnFLFJPJFLFFLFFLFFLFFLFUYUUYUFLFFLF~~FLFFLF~~FLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnncccvvvvvvvvvvvvvvvvvvvvvvvvdzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFʅԏ+э.͈˅ʅɄɄȄȄȄȄȃǃłz\222FFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNގގގގގޙû޻ގގގގގނކގގގގގ޾Öޖގގގގގ>>>;;;<<GHHHIIIBBB;;;\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccvvvvvvdzFFFNNNes`urgzFFFFFFFFFFFFv'nѥߠ\ю2Ή͈̇̇̇̇ˆˆʅȃÁxrLBBBFFFFFFFFFcr`urfz@@@222===NNNNNNNNNNNN@@ގގގގގޙû޻ގގގގގWWooގގގގގ޾Öޖގގގގގ55^^^TTTBBBt_mFR"\\\\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...GGG@@@TTTHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFHHH888"""dzFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUeee}}}cccdzFFFNNNYckT`mZnYcnFFFFFFFFFFFFvY=ޛFѥ]Ւ;э.Ќ'Ћ'Ћ'ϋ'ϊ"͈ˆɄātPB5FFFFFFFFFFFFYbkT`mZnWcn@@@222===NNNNNNNNNNNNކގގގގގ޾ÖޖގގގWWttގގގޙû޻ގގގގގނ@@@D{m|NZ7=VVVBBBJJJ\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...JJJB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%!!!dznnnFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNPPPTTTnnncccdzFFFNNNHHHFFFFFFFFFFFFFFFFFFFFFFFFu+ޛFnߝRג8ԏ+ҍ'ҍ"ҍ"Ҍ"ыω·ʅ~Z+DDDFFFFFFFFFFFFFFFFFFFFFDDD@@@222===NNNNNNNNNNNNooގގގގގޯæަގގWWttގގޯæަގގގގގ__PPP===tZgBLBBB\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))"""dzuuuWWWeeeFLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUNNNmmmcccdzFFFNNNU]eT`k]rYcnFFFFFFFFFFFFFFFFFFvY=v'~ɄʅʅʄʄʄȄłxm'iR=FFFFFFFFFFFFFFFFFFT\cT`k]rWcn@@@222===NNNNNNNNNNNN@@ގގގގގޙû޻ގWWttގ޾Öޖގގގގގ55OOO;;;xesHQDDD444\\\cccffffff``````````````````````````````eeefffkkkǀbbb]]]ZZZUUUPPPFFF@@@```````````````````````````]]]UUUHHH...KKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{tttcccdzFFFNNNes`urgzFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFcr`urfz@@@222===NNNNNNNNNPPPކގގގގގ޾__΂û޻ގގގގގނPPP888}jzJUDDD\\\cccffffff```````````````````````````bbbfffgggiiivvvccc```\\\YYYRRRJJJNNN```````````````````````````]]]UUUHHH...DDD777BYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, dz|~|FLFJPJFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~k}~~~cccdzFFFNNNes`urgzFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFcr`urfz@@@222===NNNNNNPPPRRRooގގގގގޯxxvvæަގގގގގ__JJJ888.L;n~LWGGG+++\\\cccffffff``````````````````````````````cccfffffffffeeecccbbb___\\\WWWRRRPPP___```````````````````````````]]]UUUHHH...>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***dzFLFJPJFLFDJDFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNUUUfff}}}cccނ__5555__ނdzFFFNNNYckT`mZnYcnFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFYbkT`mZnWcn@@@222===NNNNNNYYYTTT@@ގގގގގޙxxvvvvvvvvvvÖޖގގގގގ55JJJZϒv2pKVJJJ\\\cccffffff```````````````````````````````````````]]]]]]\\\ZZZYYYWWWWWWZZZ`````````````````````````````````]]]UUUHHH...NNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$dznnnFLFJPJDJDBHBW]WFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNNNNNYYYTTTnnncccގގގނ__5555__ނގގގdzFFFNNNHHHFFFFFFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFFFFFFFDDD@@@222===NNNRRR```UUUކގގގގގ޾xxvvvvvvvvvvvvvvvvvvû޻ގގގގގނPPPGGG&{ToHRPPPGGG]]]eee___WWWJJJ222\\\]]]TTT;;;\\\]]]TTT;;;]]]eee___WWWJJJ222>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###dzuuuWWWeeeFLFJPJ@F@@F@HNHW]WFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+NNN]]]gggNNNnnncccގގގގގގނ__5555__ނގގގގގގdzFFFNNNU]eT`k]rWcnBBBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNNU]eT`k]rWcn@@@222===NNN___gggYYYooގގގގގޯxxvvvvvvvvvvvvvvvvvvvvvvvvvvަގގގގގ__vem|#CKfffvvvbbbZZZLLL???___]]]]]]UUU@@@___]]]]]]UUU@@@fffvvvbbbZZZLLL???BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...dz|~|FLFJPJBHB;@;@F@BHBDJDFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~j{|||cccގގގގގގގގގނ__5555__ނގގގގގގގގގdzFFFNNNes`urfz@@@888@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDFFFNNNes`urfz@@@222===RRRmmmtttZZZ@@ގގގގގWWvvvvvvvvvvvvvvvvvvvvvvvvxxގގގގގ55HͯYcrbbbfffeee```YYYJJJXXX]]]]]]UUUDDD<<<XXX]]]]]]UUUDDD<<<bbbfffeee```YYYJJJNNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;dz|~|FLFJPJFLFBHB@F@DJDFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLF@F@+2+vuo~mcccގގގގގގގގގގގގނ__5555__ނގގގގގގގގގގގގdzFFFNNNes`urfz@@@222===eeeFFFNNNes`urfz@@@222===eee~~~___ކގގގWWvvvvvvvvvvvvvvvvvvttގގގނ5N_2{oooaaa]]]YYYTTTXXX]]]\\\UUUHHH333XXX]]]\\\UUUHHH333oooaaa]]]YYYTTTNNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===dzRWRosoJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJJPJBHBBDBcccގގގގގގގގގގގގގގގނ__5555__ނގގގގގގގގގގގގގގގdzHHHgggbjsUbn\oYeo@@@222FFFHHHgggbjsUbn\oYeo@@@222FFF```ooގގWWvvvvvvvvvvvvttގގ__n~v~ii~vDDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000dzRWRFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFFLFLRLccc޻ަޖގގގގގގގގގގގގގގގނ__5555__ނގގގގގގގގގގގގގގގޖަ޻dzHHHgggNNNNNNJJJBBB555{{{HHHgggNNNNNNJJJBBB555{{{ccc@@ގWWvvvvvvttގ55{Mgncpckooo\\\FFF>>>YYYHHH888IIIfff999888GGGdzcccû޻ަޖގގގގގގގގގގގގގގގނ__5555__ނގގގގގގގގގގގގގގގޖަ޻ìdz{{{HHHHHHFFFFFFFFF@@@rrr{{{HHHHHHFFFFFFFFF@@@rrrcccPPeeggLLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<dzcccû޻ަޖގގގގގގގގގގގގގގގގގގގގގގގގގގގގގގޖަ޻ìdzcccH"!nkNNN>>>KKKBBBdzcccû޻ަޖގގގގގގގގގގގގގގގގގގގގގގގގޖަ޻ìdzcccNNNAAAHHHǵcccû޻ަޖގގގގގގގގގގގގގގގގގގޖަ޻ìǵcccssscccû޻ަޖގގގގގގގގގގގގޖަ޻ìccc|||ޙޯ޾û޻ަޖގގގގގގޖަ޻þ޾ޯޙ|||oo__5555__WWNNNNNNNNNDDD888222...............................................................................................................555BBBNNNNNNNNN=J+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+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYYjjjUUUDDD==============================;;;NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUUUDDD==============================;;;NNNjjjNNNLLLDDDHHHJJJHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDBBB888...555LLLNNNZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5ccc___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNNNNNNNUUUYYYYYYUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRJJJ===...555NNNZm`uTfL\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\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5ccccccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiiffffffffffffffffffffffffffffffbbbTTT;;;PPP\\\```bbb```___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZUUULLL===...BBBZm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5dzvvUU..''JJjjcccgggooorrrmmmrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrooofffYYY===YYYeeegggiiigggeeeccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbb\\\UUUJJJ888555Zm`ucx8p@n~ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYkTeL\=J+5dzkk""TTcccgggooorrrfffiiioooooooooooooooooooooooojjj\\\UUUjjjjjjjjjfffZZbPP`FFf@@e@@cBB`JJZTT\___gggjjjjjjjjjrrruuuooooooooooooooooooooooooooorrrfffYYY===888222.......................................###```jjjmmmpppwwwooojjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfffbbbZZZRRRBBB...Zm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5dzYY==cccgggooorrrfffYYY___gggggggggggggggggggggccc___jjjffgRRk22~""i@@UZZ]iiijjjjjjgggggggggggggggggggggjjjooorrrfffYYY===GGGLLLJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDD888***ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzuuWW|cccgggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjffiDDx''..55..22YWWYiiijjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===JJJTTTYYYWWWUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURRRHHH888###ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzNN..cccgggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjPPv''55JJJJJJJJ55''..LLZZ5588T```jjjjjjjjjjjjjjjjjjgggooorrrfffYYY===EEE333((( GGG999666+++JJJTTTZZZ]]]___]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]ZZZRRRDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz..''..22cccgggooorrrfffYYY===jjjjjjjjjjjjjjjggk55''TTeetjjjjjjjjjjjjjjjjjjjjjjjjeexTT''ZZzz22eUUYjjjjjjjjjjjjjjjgggooorrrfffYYY===RRRNNN"""&&&,,,///999[[[TTT"""''''''+++000444@@@JJJTTTZZZ]]]___```````````````````````````````````````___WWWJJJ222ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz..ffjjFFTTcccgggooorrrfffYYY===jjjjjjjjjjjjbbo""'']]~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj]]++}}oosNNWiiijjjjjjjjjgggooorrrfffYYY===CCCUUUDDDJJJTTTZZZ]]]___``````````````````````````````````````````\\\ZZZLLL111ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz....eebbcccgggooorrrfffYYY===jjjjjjjjjbbrJJjjjjjjjjjjjjjjjccfWWbHHeBBe@@cDD]NNY\\]fffjjjjjjjjjjjjJJbbߎzNNWjjjjjjjjjgggooorrrfffYYY===jjj@@@sss```JJJTTTZZZ]]]___`````````````````````````````````````````````JJJWWWGGG"""ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzPPffDDTT..cccgggooorrrfffYYY===jjjjjjggn''ZZxjjjjjjjjjjjjUUm22""gDDU```jjjjjjjjjZZRRיsUUYjjjjjjgggooorrrfffYYY===111\\\DDD|||JJJTTTZZZ]]]___````````````````````````````````````````````````222???###ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzwwjjWW|cccgggooorrrfffYYY===jjjjjj55bbtjjjjjjjjj]]o++++8888nHHTfffjjjjjjbbRR׎e```jjjgggooorrrfffYYY===)))222iiiAAADDDJJJTTTZZZ]]]___```````````````````````````````````````````````````;;;$$$""""""ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzwxz.55PRRoopjjcccjjjuuuiii\\\DDDjjjTTZZtjjjjjjjjjLL}..BBJJJJBB..22``ff22TbbbjjjjjjZZbboo88Tiiijjjuuuiii\\\DDDCCC&&&IIILLL```>>>dddhhhHHHJJJTTTZZZ]]]___``````````````````````````````````````````````````````333***999)))!!!888"""222999)))%%%888"""222999)))***ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz\\++++'''"wwwjjTT==cccjjjrrruuujjj\\\UUUggnHH}jjjjjjjjjBBJJeesjjjjjjjjjjjjjjjjjjeexJJBBԒLL++\bbbjjjjjjJJ}}22WWYjjjrrruuujjj\\\UUUSSSBBBfff:::AAA???JJJTTTZZZ]]]___`````````````````````````````````````````````````````````GGG...###<<>>zzz-00BFF'22"22".."..".."..".."..".."..".."..".."..".."..".."..".."++'++-00@@@***888...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz..B]pFczLevBZ=T8N5H.BTTcccjjjjjjjjjjjjjjjWW""jjjjjjjjj..55jjjjjjjjjffk==++_WWYiiijjjjjj88n```jjjjjj''ZZ@@UjjjjjjjjjjjjjjjNNNDDD666NNNCCC)58crm|opn~jzesZgNZFR>G???@@@;;;555555555222222222222555555555555555555555555555555555555555888@@@YYY___ 999<<<rrrxxxMSS2BB5HH5JJ5JJ5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH5HH2FF.BB'88++!**000DDD888ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5Ǟwxz.25+HeHg~Un"LfD]@Y=T"+FFcccjjjjjjjjjjjjjjj==LLnjjjjjjWWccjjjjjjjbbs''FFBBwLLUiiijjjeexBBffDDUjjjjjjTTLL""igggjjjjjjjjjjjjRRR666((("37Y^a,;=%*uuu]]]IRn~{}xtm|_mNZEOCCCJJJJJJFFFH;;R++WUTRJ""@55@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@222222UUU...DDDPPPTTT\BBB888777000wwwY``8NN;RR=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5\\++'''".;PLiLiHeF`'++jj22jjcccjjjjjjjjjjjjjjj``ejjjjjj==FFvjjjjjjggn..JJJJ..ZZwWWYjjjjjjJJ``""gfffjjjeex....___jjjjjjjjjjjjRRR$AI`mgvgv_mT_+;?uuuHR{{tiwUbFPEEENNN\HHj@@|""{pfWLBBLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLHHH@@@...===555TTT___```H"GGG]]]4AA;RR@YYBZZB\\D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5\\=U8L2D'8"2".++'8.@"+++..JJcccjjjjjjjjjjjjbbziiijjjggnbbfjjjjjjBB]]zjjjjjjjjjjjj]]JJՎ++_gggjjjeex2288\\]jjjjjj''55TT\jjjjjjjjjjjj@@@Knw~~vgvNZ:@!&wm|WcEOGGGYHHoWJJTTTTTTTTTTTTTTTTTTTTTTTTTTTPPPFFF555...PPPҤJHHHBBB@@@999<<>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5]]""vvjj".++8L+=".++++UUcccjjjjjjjjjjjjbb~++|cccjjjggp==UUZjjjjjjBBDDPeeejjjjjjjjj\\p==jjjjjjeesccfjjjjjj''ZZbjjjjjjjjjjjjIII4)ZeHv{Z.hvaefpppaaa|ZZ""w\\eeeeeeeeeeeeeeeeeeeeeeeeeeebbbZZZLLL@@@555\\\___```N5NNNPPP@@@HbbJgg`ttF``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``F``D__BZZ;RR2BB-00<<<$$$ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5..FFjj+;+++8L+=".++++ffvvcccjjjjjjjjjjjjjjj;;UUZjjjjjj==\\22Yiiijjjggs;;ҡn88b==i''ffkjjjjjjJJ22jjjjjjeetfffjjjjjjjjjjjjTTTJJJ8n{>_g;;;wPel___cccYYPP..22vZZcccccccccccccccccccccccccccccc```YYYLLLRRRWWWmHn>>>@@@DDDETTJffNjjxTkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffJccFbbF``D]]@YY8NNMSSzzz@@@###ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5Ǟ@@jjjj8L+;+++8N.=".++++cccjjjjjjjjjjjjjjj==LL;;UjjjjjjWW]]88TTYjjjjjjbb;;ҊRRbbsjjjjjjeepUUmjjjjjjTT22~jjjjjjjjjjjjjjjIIIBBB@dnu```GGG555~Rpxooo___cccfffeee{ZZDD22222222DDvZZbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb___WWWNNN```222\\\iiinnn5BBBFFFYYYAAAFYYJffJggUoo]ttRkkLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffLffHeeFbbD__BZZ;RRY``>>>aaa...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzNNffjjjj8N+;+++8N.@".++++""cccjjjjjjjjjjjjjjjWWRRsbbbjjjjjj22Ņe___jjjjjjggsBB..;;""BBggnjjjjjjjjj55++jjjjjjjjj''RRkjjjjjjjjjjjjjjjKKKHHHLLL:::OOOBBB>>>10___bbb```____________________________________________________________]]]YYY___```TTT^^^NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzppDDjjjj8N+;.++8N5H5H2D+@'5"...kkcccjjjjjjjjjjjjjjjggp..ZZDDPjjjjjj]]]]uu''\]]]jjjjjjjjjggrZZNNNNZZggojjjjjjjjjjjjBB]]ojjjjjj]]~ffgjjjjjjjjjjjjjjjJJJSSS;;;IIISSS"?ooo___cccsss൵ccc````````````````````````````````````````````````````````````NNNTTTAAADDDDRRBYYB\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\B\\BZZFYY;FFbdd]]]000rrr===ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzYY""jj8N+;.++Lg8J"2+".2DF`ffcccjjjUUUDDD;;;NNNjjjJJssp]]]jjjjjjNN}}jjeTTYiiijjjjjjjjjjjjjjjjjjjjjjjjjjjccj55LL}jjjjjjjjj''DDxjjjUUUDDD;;;NNNjjjGGGCCC@@@EEE444dddgggxxx൵ccc`````````````````````````````````````````````````````````DDDNNNYYY@@@@@@FFF777HHH888HHH222DDDDDD666HHH888HHH222DDDDDD666HHH888QQQHHH<<<777<<<000ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzjjLLjj8N+;.++.@BNWfmt\fnfpzYYccc___\\\\\\TTT@@@NNNggs;;tt22WfffjjjjjjBB}}uu22YUUZeeejjjjjjjjjjjjjjjbbfFFvBBjjjjjjjjjJJffi___\\\\\\TTT@@@NNNIIIFFFIII^^^BBBTTT@@@qqqdddgggxxx൵ccc``````````````````````````````````````````````````````ooo\\\FFF>>>YYYHHH888KKKHHH222DDDDDDHHH888DDDHHH222DDDDDDHHH888FFFfff999888GGGccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dznnjj=T@Ue=R8L2D'8+ccccccjjjiiibbbTTT;;;jjjTTvvLLBBRiiijjjjjjNN]]߅88t..f;;c==f55p""NNjjjjjjjjjZZxPPvjjjcccjjjiiibbbTTT;;;\\\111666DDDLLLGGG777dddgggxxx൵ccc```````````````````````````````````````````````````LLLBBBPPPAAAEEEUUU;;;TTT:::GGGUUU>>>SSS;;;TTT:::GGGUUU>>>SSS;;;CCC@@@BBB<<<ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz{{nnjjfu+;'5'8@NY.PeuucccgggooorrrfffYYY===jjjjjj55""HHPiiijjjjjj]]22]]\\==..]]xjjjjjjjjjbbt55jjjjjjgggooorrrfffYYY===ppp???+++DDDFFFUUUDDD@@@qqqdddgggxxx൵ccc````````````````````````````````````````````````NNN>>>KKK@@@???;;;GGG@@@???;;;GGGBBBccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dztt\\""eeNNcccgggooorrrfffYYY===jjjjjjggs88ΤBBRfffjjjjjjjjjWW==22''==WWjjjjjjjjjjjjZZt""ggkjjjjjjgggooorrrfffYYY===IIIDDDEEEBBBOOO===TTTdddgggxxx൵ccc`````````````````````````````````````````````+++...@@@NNNAAAGGG???AAAGGG???AAAHHHccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzssLLff++..cccgggooorrrfffYYY===jjjjjjjjjbb@@Ӥ""22W]]]jjjjjjjjjjjjggp]]TTNNNNTT]]ggnjjjjjjjjjjjjiiiHH}bbojjjjjjjjjgggooorrrfffYYY===<<<III;;;qqqdddgggxxx൵ccc``````````````````````````````````````````888888***GGGsssQQQsssQQQsssccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz~~LLFFvv\\..cccgggooorrrfffYYY===jjjjjjjjjjjjbb88ΜLLpDDPbbbjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjYYm""''bbrjjjjjjjjjjjjgggooorrrfffYYY===LLL===BBB@@@[[[dddgggxxx൵ccc```````````````````````````````````````NNNHHH888666ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzss\\..cccgggooorrrfffYYY===jjjjjjjjjjjjjjjggs55vvtts;;UUUZccciiijjjjjjjjjjjjjjjiii``eLLn""55ggnjjjjjjjjjjjjjjjgggooorrrfffYYY===PPP!!!,,, JJJ""""""))) qqqdddgggxxx൵ccc````````````````````````````````````ZZZRRRDDD...ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzttnnPPcccgggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjTT;;ssZZ|''n55c;;c==f;;j..xTTjjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===NNNEEEBBB999999BBBTTTIIIEEEEEE===999BBBdddgggxxx௯ffffffffffffffffffffffffffffffffffff___WWWJJJ222ccckkknnn{{{ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppjjjccc]]]TTTDDD...Zm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dz{{nnLLwwcccgggooorrrfffYYY===jjjjjjjjjjjjjjjjjjjjjjjjggsJJ..RRLL;;JJggnjjjjjjjjjjjjjjjjjjjjjjjjgggooorrrfffYYY===qqqdddgggwwwffffffffffffffffffffffffffffffffffffbbbZZZLLL???eeemmmpppΨoooeee___UUUHHH222Zm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5dzjjYYDD\\cccgggooorrrfffYYYBBB=====================;;;NNNjjjggpWW==++++""==WWggnjjjUUUDDD=====================___ooorrrfffYYY===bbbfffeeecccccccccccccccccccccccccccccccccccc```YYYJJJbbbnnnrrrΔwwwggg```YYYJJJ888Zm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5dzppNN@@..""..oocccgggooorrrfff\\\YYYYYYYYYYYYYYYYYYYYYYYYTTT@@@NNNjjjjjjjjjjjjbb~ZZNNNNNNNNZZbbzjjjjjjjjjjjj___\\\\\\YYYYYYYYYYYYYYYYYYYYYYYYiiirrrfffYYY===oooaaa]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\YYYTTTYYYnnnrrrzzz{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pppiiibbbYYYHHHDDDZm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5dz]]WWRR\\cccgggooorrrgggfffffffffffffffffffffffffffbbbTTT;;;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccjjjiiifffffffffffffffffffffffffffmmmfffYYY===NNNfffppprrrrrrpppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmggg```UUUDDDNNNZm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5ǵcccjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjuuurrrrrrrrrrrrrrrrrrrrrrrrrrrrrriii\\\DDDNNNPPPfffnnnnnnmmmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjeee\\\NNNLLLNNNZm`t`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`u`u`u`u`u`u`u`u`u`u`uJZ+5cccjjjrrruuuoooooooooooooooooooooooooooooojjj\\\UUUjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjrrruuuoooooooooooooooooooooooooooooojjj\\\UUUNNNNNNNNNYYYbbbeeecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc```YYYPPPNNNNNNNNNWjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=J|||jjjjjjjjjggggggggggggggggggggggggggggggccc___jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjggggggggggggggggggggggggggggggccc___jjj|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY=J+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+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+2|||ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccYYY|||Y8YYYTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTLLH8HYYYcccZmJZ=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J=J;H+5cccn~~zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzssYYH8HcccZm`uTfL\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\L\L\L\L\L\L\L\L\L\L\L\L\L\L\JY=J+5ccc+"ssLL"""dzcccZm`ucx\nTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeTeRcL\=J+5dzccc+J]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]TzzTT###dzcccZm`ucx8p@n~ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYkTeL\=J+5dzcccnJ''''''''''''''''''''''''''''''''''''''''2]zzTT-NWR]P\LWDM9A;;;$$$dzcccZm`ucx8pj8k}_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_s_rZmTeL\=J+5dzccc{8']zzTTOekhvsusm|`oPZEOn;J333***999)))***dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTRpxw}vkzWcFP5H8HGGG...###<<G???222...666GGG^^^nnn```TTT999]]]nnn```TTT999111222...###<<<===,,,>>>zzz-00BFF'22"22".."++'++-00@@@***888...dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTt_mFR"JJJLLLJJJDDD888***@@@TTTiii___PPPLLLccc___PPPGGGLLLJJJDDD888***<<<rrrxxxMSS2BB5HH5JJ5JJ2FF.BB'88++!**000DDD888dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT?{m|NZ7=TTTYYYZZZWWWRRRHHH888...\\\\\\FFF NNNTTTDDD ???WWWZZZWWWRRRHHH888###BBB888777000wwwY``8NN;RR=UU=UU=UU=TT;RR8LL.BB"22"++000***777"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTBBBtZgBL@@@YYY```bbb___ZZZNNN888+++222WWW555......PPP555...222JJJ\\\___ZZZRRRDDD...GGG]]]4AA;RR@YYBZZB\\D]]D]]B\\BZZ@WW;PP2DD"22!**@@@DDD***dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT999 xesHQ444\\\cccffffff`````````````````````````````````RRR@@@222222222...++++++...===UUU___```````````````````````````]]]UUUHHH...HHHBBB@@@999<<>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTJJJ@@@HͯYcrDDDTTTGGG\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...QQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTBBB;;;TTT1N_2{```[[[\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...GGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTIII===@@@n~)59DDD|||sssUUU\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTOOODDD777{IR???hhh\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...GGG@@@TTTHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFHHH888"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTGGG@@@444HRFFFddd\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...DDD@@@B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%%%%dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTBBBEEE>>>9!&uuuAAA999\\\cccffffff```````````````````````````___bbbccceeeiiijjjbbb___\\\WWWTTTLLLDDD555```````````````````````````]]]UUUHHH...AAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT999 IIIBBB555\gZgR]CL*0]]]]]].../// ]]]eeeccc````````````````````````___bbbccceeeiiiz``HHFFgTTWWWTTTLLLDDD555```````````````````````````___WWWJJJ222GGGSSSHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..DDDHHH999dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT999,,,OOOGGG;;;)Ze{~wiwPZ:@uuuuuu,,,(((fffwww൵ccc`````````````````````___bbbcccw\\..~''WJJLLLDDD555````````````````````````___]]]YYYLLL888>>>666B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTBBB!!!>_g~n}NZ+;?&&&333bbbgggxxx൵ccc``````````````````___bbbvZZoLBBDDD555___``````````````````___]]]ZZZTTTGGGQQQ???;;;UUUDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..BBBDDD222dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTEEE}gv"""qqqdddgggxxx൵ccc```````````````___bbb22W@@@555]]]```````````````___]]]ZZZTTTJJJGGGDDDDDDB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..@@@dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTNNNPPP===<<>>AAADDD@@@CCCNNNEEEdddgggxxx൵ccc````````````___vZZf@55555\\\````````````___]]]ZZZTTTJJJ???:::222222B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..(((,,,"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTdddLLLEEEDDDDDDBBB@@@;;;:::~_m,;=CCCcccTTTfff```iii\\\jjjRRRqqqdddgggxxx൵ccc`````````___DDpJ""222ZZZ`````````___]]]ZZZTTTJJJGGG@@@TTTHHHHHHB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..FFFHHH888"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT^^^WWWSSSLLL@dn;k5gvY^aNNN@@@BBBLLLdddgggxxx൵ccc``````___22{R222ZZZ``````___]]]ZZZTTTJJJJJJB\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..%%%!!!dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTiwgv"37qqqdddgggxxx൵ccc```___22T222\\\```___]]]ZZZTTTJJJAAA;;;888888B\\HccLffLffF``F``F``F``F``F``F``F``D]]=UU5HH"..555888)))"""dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTB˶r`mdddgggxxx൵ccc___22FF''U222]]]___]]]ZZZTTTJJJKKKUUUHHHHHHB\\HccRkkTkkF``F``F``F``F``F``F``F``D]]=UU5JJ"22FFFHHH999dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT5n{+"~(((qqqdddgggxxx൵___22++RRW555]]]]]]ZZZTTTJJJDDD777BYYHee]ttxF``F``F``F``F``F``F``F``D]]=UU5JJ'22,,, dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTBBBJJJ4KnwRRR666666dddgggxxx___DD;;ꁁR++555\\\ZZZTTTJJJ>>>AAAYYYFFFDRRHeeUoo`ttF``F``F``F``F``F``D__B\\=UU5HHBFFZZZLLL***dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTDDDHHHIIITTTrRRRDDD999222qqqdddgggsss___{ZZ88H;;555PPPTTTJJJNNNPPP@@@HbbJgg`ttF``F``F``F``F``D__BZZ;RR2BB-00<<<$$$dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTIII+++666IIICCCJJJKKK6nzlz^k"IQNNNPPP888III111dddccc```eee..""텅|""FFF;;;BBBJJJ>>>@@@DDDETTJffNjjxTkkJccFbbF``D]]@YY8NNMSSzzz@@@###dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT???111FFFGGG8oNNNTTTBBB&&&)))qqq___bbbfffPPTTJJj@@JJJ@@@:::BBBFFFYYYAAAFYYJffJggUoo]ttRkkHeeFbbD__BZZ;RRY``>>>aaa...dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT\\\III^kSSSCCC___cccYY\HHJJJ???NNNLLL\\\AAADDDAAAETTHbbHeeHeeHccFbbD__BZZ=TT4AAwwwxxx,,,333;;;dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTZϐlzooo___ccc""NNNCCCNNNTTTAAADDDDRRBYYB\\BZZFYY;FFbee]]]000rrr===dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTT5]'n}3bl___|ZZYHHEEEDDDNNNYYY@@@@@@FFF777HHH888QQQHHH<<<777<<<000dzcccZm`ucx8pjJw'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx'fx_sZmTeL\=J+5dzcccdz']zzTTlll555"Wb8iu555pppaaat__8822\NNGGGooo\\\FFF>>>YYYHHH888IIIfff999888GGGdzcccZm`ucx8pjT}JwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJwJw8k}ZmTeL\=J+5dzcccdz']zzTTBBB222BBB999bbbeeeccc___YYYKKKLLLBBBPPPAAAEEEUUU;;;CCC@@@BBB<<<dzcccZm`ucx8pgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj@n~TeL\=J+5dzcccdz']zzTT555<<<LLL555iiioooaaa]]]YYYTTTNNN>>>KKKBBBdzcccZm`ucx.m8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p\nL\=J+5dzcccdz']zzTTIII555@@@@@@NNNAAAHHHǵcccZm`ucwcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxTf=J+5ǵcccǖ8J"~~YYXXXpppssscccZm`t`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`u`u`u`u`u`u`u`u`u`u`uJZ+5ccc{JY8Y|||WjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm=J|||n++n|||tworld-2.3.0/res/ting.wav000066400000000000000000000176541475511570500153270ustar00rootroot00000000000000RIFFWAVEfmt "VDdataKSEߦנ7- { N 4wlR  : ](OG 1]P]5 06)F}u a>-X{0IE_ RRFg{ 8xgkw `lt# e4MoV\ Rg_p [W]bi N+0s R ZEUK! a g k n,X ~f3!&8,rV_qQaul>TKH5P qL< ;j7=1sexx -6P` ?s}Y>X<.W4ALIe g>8X)tTh!"}}*30i[ E% gxZ 1j= W)LnJJn@|.1_E,V}N'mzi 0!  OpF L tFLTZ~LB & Rf>.LV9kIaiGg1&o| >9H!?vH%vX3~1plpy =% i߉ C! Mphv  B G %%{ck$/+)K~. r * 7= R} Mm'wZ Y #_4 ) 0|dBv _2JU+d$?CZlZ:F[\m.w]<GV`~l"ew4Iu.^v?A~ a<`Kt `G* - vsY  `6~sR(tk.CQDebZ5C|)Q*a,;xB O]\C ~u w?} GTU  ?\C-0]/{2 /tppRRB )-$z_v0Lc _ S shz) z-cgr F1}=&8Qy*v9h)ogU` Bi3Y<iy8>I#Y9 S 6 @ F!,} x/uTAb2? W `q  P\ 86 \3 {x H  #$ gN[N X/ YUu 94 h p5W * M iAll uD /. *Y -w _ 8] t #X H5Z w KB O Eo=n E=Z)  QK Y ^b :}A }Kd qNkV# f tp D# (cs[  n? 1 Xm\ h < s`* +"- /P8 "N ;13yi y ^^W $ ~ +C Z& nxS sx[G S G /:od { V5R|e*6 ~ AF`Y [|O_ ; 'k:|1^ 7@=q  Sj&F ! $ 8@xH;+<%C6. h~9"~{Y"saN@|3/R"j  h}"]&q9QY *G#$wj}F6sa>0 m=*@j.1glUBAUk'_4[BtN=!CYC.;IWNi@?uT*(J/h]a_x <:6bZr-tY:G`kG0Vb?#q#`cKQ.u| N{L~_6}C qE1*0 T1WtG& +UR"/)3"tV69a\0R&L9TeECSaBi|:NV-T5Wd?KNaYD-oR0X.&#lL],L^pk&QbM {!S  ,j`,rY$ sc;\/J2hpU EPfm!E,U?Ab,r cqw#Xz2XW+;qd@?&.X#Ny%b#3Xd{$fenzQ9-v"&ZOzw%$O| uX UL\#dG=*\ nTdRp+a* ]"J}%?MMh-c rS\,^YpT-NagijLOtI?4x)Ou 6^{a* f*8~)D^k</ FOF-jFGwAO{B,SMm<)F084Rvm*He<rn;iDod{9fpEbw.i\qt }Rp|"=r)tvC!8#* &q2B~[@\-mWa5.}pm;Qwiv\ORc3hilF2XH2]+ k!/jx%HXo<9{nYrr:iS~ZLg jB`$=B-%Op_2?V2Q hk4w@!|= BpJ5Z eE9~y"9ls9 e dmk]s?_^vM}?2\c?MF[d6O${cl,S"{gT&Zr;<4$)mW,$P%0X%(<'V*.*4<"G *-O t"BC'b3_=7XLeGD'iurc<?hzzl>TWtoR[B~[LkK/VT^P,xZKL_-yeIJo#lcWdtW ~[F~h= ~j3 nw=Zf-Oj({JdUdWTSQAJ <O<G:76-'*%.$,(%$  tworld-2.3.0/res/traphit.wav000066400000000000000000000041261475511570500160270ustar00rootroot00000000000000RIFFNWAVEfmt +"Vdata*xR<i*wz' p  o ! N f m x  [ X - VBY(?emY+>m|uqlhaZRKB=7.)$z'q9tpA 0{tzACg ?j )=a ]!"HRWm7iv{r KL! &'''''(?(c(Z(V(U(M(\(n(y((((()7)h))))*7*I*****Q'N!"|>1S "0AQZnn3`*[ /%d F t , { ! e%<$Q)")6CD1) 0 W0x3EAe  = l  ,  T % [Zc=>x  j+rC@  } } n ` Y ^ ^ U N E < C C 7 & (  AY '0KsL8$g&B n {  I -    \${GYeK   o ,*.@BTk%AU^kt1}_2. infG0##,, ##- _Bt#@X`<y+86/&  RL0*g'Xjr|jW8t\nfvo5C>IWPRPPSU[YPR^eb\WL\V*wRzR I!=#7:%.(!  LX=SGB Ir#(,,&*371*%(1EPRL N&8wQb}rrrmbV>!KG/D4mY_itqomhfdb_WW_]WVND]:Yktworld-2.3.0/res/unslist.txt000066400000000000000000000041611475511570500160760ustar00rootroot00000000000000[AlexMS1.dat] 246: 01B1 87F61A80: no exit 250: 0284 67F1FA9E: no exit [BrennanG2.dat] 001: 03E7 1B214B64: not enough chips can be collected [BrianP3.dat] 052: 02E0 BD9CA0B7: no exit [Chipster3534.dat] 079: 03C5 956F6BA7: bug room is impassible 083: 0341 F2FF8970: no exit [DanM1.dat] 115: 04E6 83DB1DB4: not enough chips [DrakeW1.dat] 001: 0117 CC4F988E: no exit 009: 0299 BFF7876A: not enough chips [EvanD1.dat] 034: 03E0 21444BAE: not enough time 044: 026F 020096B2: not enough time 124: 02E3 C697D84E: not enough time [HarrisonD1.dat] 001: 02F1 FF05B44D: level ends after six seconds 003: 03D1 98E2549D: trap is impassible 004: 03AA BB6D9986: not enough chips 006: 0465 A25DFB77: fire boots are inaccessible [HarrisonD2.dat] 001: 0526 9EF0590D: bomb is impassible 002: 0496 1019B77A: cannot juggle the necessary footgear 005: 0415 F940689C: cannot open the blue door 006: 0387 778BA113: no exit 007: 03B7 2431B598: exit is unreachable without skates 010: 0321 92D9311E: exit is blocked by walkers 011: 028B 463721BB: force floors are impassible with skates 013: 026B F8E853D3: bombs are impassible 014: 0283 D9B1A5E2: force floor is impassible 015: 02F5 4586CD87: green door is impassible [HerbertH1.dat] 017: 021D EB495D97: all exits are blocked [IDD1.dat] 010: 037A 003C4C2E: not enough chips [JoeP2.dat] 002: 0380 DFD6631E: exit is blocked [JulianD4.dat] 001: 0112 D97E4663: red key is inaccessible [JulianD5.dat] 001: 04C3 8F5039DC: not enough chips [KyleW1.dat] 003: 03B1 759C695E: bugs don't stay in formation 008: 03C7 444F2FFD: cannot return to teleports 012: 0416 397AC27D: unconnected trap button 027: 01A7 08FED2B2: unconnected clone button 031: 03FC FCFD6910: fourth chip is inaccessible 034: 0463 F395198E: can't leave first room 037: 030F F1AA2CC6: top section is inaccessible 048: 0398 FB659E4B: can't leave first room 052: 0274 5DD790A9: can't reach the chips 057: 0283 84154011: can't reach the chips [MewtwoDX1.dat] 065: 01FF 0FCFC126: last chip is inaccessible 086: 04BF FF2CE3A1: fire boots are inaccessible 097: 02D5 13D49C66: not enough chips 102: 02CF 9AA22E70: no exit [TomP1.dat] 001: 0113 4358436E: not enough chips tworld-2.3.0/res/whisk.wav000066400000000000000000000167401475511570500155060ustar00rootroot00000000000000RIFFWAVEfmt +"Vdata.@MRRQR]ju|xlcZF-xneXJMX_oHlq[B-s\;{~$V$MjsX@4% @j*Ihz[>%~I|ujZHJTq2 )9XqR@=FKI4 '=I9"j+rJNF_$=?6 xXQQj]_w|a-$-0&BDq~Y{f9)b,w{,{0|;o'/867vv8]lI>W4'dzx|FZq niS-Fc4a|\=4fAV;Qw"6Oh\Bc/$v,% "2uxh9< VW{ll" xT* Lu.EHl=<`YYa'[1ZCNS`]+O%` XC>u wqw|TB*:~Z-*&rp\n9|M{09Xlzx){ 9x|'9Q+s8e}L 2j`AJmD^){[;@8, i6#1%gI2nf&j1x0CWd;;t_`bLaU0h^~ a 5 eE]*R2Of\u}N;6+MEE?0v kJgv^3GG)% ,*-r<[`= ) | Ut<gtG-'MFg}` HmTFXJ\^p,MVys@86`pi*y%T.b|NQ7x`;!."H@|cS~tAl/M>xN1].H32 f `h03Gb:6- "]FN8z$b8jJ{*}StEd7W=Amc!hZ'13RH=D<ohgE=CKnID2h| iF.(4HA%Z834oYgUOT&0q{Vr72 ;T20qI6* r5!HxgeEc$C~BC R[ D 4FARF47%qZ9s=3} XD S@v7a\d`&R-U`i^ JA\ -`19y"!mIm7>0 !|%&jqs9@Ef`<I5ls6'+h^W:@PwO.PT~-L*6 Qa7c :gV9/00] +hI ;`J==&ZE9'|Fl_Ox/;ysv>G]!v:&6U#[x[V~rAWr!yW: Z]h_iN}V>{-}{cOyr(:T]28yr*rqhO=0wOs4d;~"` .v_lq= s$SBBq=$ZX|_3hM$Qs'f._.'a*"1io9za7dw`;hf3N7P@N)! %BR.]4mX6eB0~Nil<8'J8#jO"-sSs8E "z';oXzSf?vm-RqjB|sv$T)fjl\X9 Dh OnB)%H/]u u?6;+BRAVVXZf7XV6V Z_mlnuH)&zK"[sm_Ic4To+@0d? 89_&0 y6ZJx_o @]%l"]=Z)2S~sf?ZB3Wkr.r@V75Nju8Kqwwle -+_M0fz.0"j"]Oj+T-X[Q B\K9)Saq|uxA|OwZ;zoF9$VuZ-2H0KHX-xQZ|dB)@QFZzxQ)"FKA89M/2hmcM- V;[H ZXV8$$j"z]|7FZZHBa?=D[x"a@H+@H4@6d_4 4S\c8fch2e)"ZQ RD? 9a=4HFKj7D% )xaQ)hs?=V="- _jO|/E^`i]%)K0mBQmFoVQZ-Q@6l)jK~XHRH[T4zoFD +F $? -'7B+@ _$9FVl]excq~F FMDdq]xsvuTOc+xwVs]~ VQxTRM9VQH F9[lX \_x$' M;D&\e"4_c$oXfc2I4+R%0RcR44"')'XnQ;|xOzq\V  7.)=_|jj|m[oq?F- tworld-2.3.0/score.cpp000066400000000000000000000235301475511570500146630ustar00rootroot00000000000000/* score.cpp: Calculating scores and formatting the display of same. * * Copyright (C) 2001-2017 by Brian Raiter and Eric Schmidt, under the GNU * General Public License. No warranty. See COPYING for details. */ #include #include #include #include #include #include #include "defs.h" #include "err.h" #include "play.h" #include "score.h" using std::ostringstream; using std::string; /* Translate a number into a string. The second argument supplies the * character value to use for the zero digit. */ static char const *decimal(long number, char zero) { static char buf[32]; char *dest = buf + sizeof buf; unsigned long n; n = number >= 0 ? (unsigned long)number : (unsigned long)-(number + 1) + 1; *--dest = '\0'; do { *--dest = zero + n % 10; n /= 10; } while (n); if (number < 0) *--dest = '-'; return dest; } /* Translate a number into a string, complete with commas. The second * argument supplies the character value to use for the zero digit. */ static char const *cdecimal(long number, char zero) { static char buf[32]; char *dest = buf + sizeof buf; unsigned long n; int i = 0; n = number >= 0 ? (unsigned long)number : (unsigned long)-(number + 1) + 1; *--dest = '\0'; do { ++i; if (i % 4 == 0) { *--dest = ','; ++i; } *--dest = zero + n % 10; n /= 10; } while (n); if (number < 0) *--dest = '-'; return dest; } /* Return the user's scores for a given level. */ int getscoresforlevel(gameseries const *series, int level, int *base, int *bonus, long *total) { gamesetup *game; int levelscore, timescore; long totalscore; int n; *base = 0; *bonus = 0; totalscore = 0; for (n = 0, game = series->games ; n < series->count ; ++n, ++game) { if (n >= series->allocated) break; levelscore = 0; timescore = 0; if (hassolution(game)) { levelscore = game->number * 500; if (game->time) timescore = 10 * (game->time - game->besttime / TICKS_PER_SECOND); } if (n == level) { *base = levelscore; *bonus = timescore; } totalscore += levelscore + timescore; } *total = totalscore; return TRUE; } /* Produce a table that displays the user's score, broken down by * levels with a grand total at the end. If usepasswds is FALSE, all * levels are displayed. Otherwise, levels after the last level for * which the user knows the password are left out. Other levels for * which the user doesn't know the password are in the table, but * without any information besides the level's number. */ int createscorelist(gameseries const *series, int usepasswds, char zchar, int **plevellist, int *pcount, tablespec *table) { gamesetup *game; char const **ptrs; char *textheap; char *blank; int *levellist = nullptr; int levelscore, timescore; long totalscore; int count; int used, j, n; if (plevellist) { levellist = (int*)malloc((series->count + 2) * sizeof *levellist); if (!levellist) memerrexit(); } ptrs = (char const **)malloc((series->count + 2) * 5 * sizeof *ptrs); textheap = (char*)malloc((series->count + 2) * 128); if (!ptrs || !textheap) memerrexit(); totalscore = 0; n = 0; used = 0; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Level"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-Name"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Base"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Bonus"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Score"); blank = textheap + used; used += 1 + sprintf(textheap + used, "4- "); count = 0; for (j = 0, game = series->games ; j < series->count ; ++j, ++game) { if (j >= series->allocated) break; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", decimal(game->number, zchar)); if (hassolution(game)) { ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-%.64s", game->name); if (game->sgflags & SGF_REPLACEABLE) { ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "3.*BAD*"); } else { levelscore = 500 * game->number; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", cdecimal(levelscore, zchar)); ptrs[n++] = textheap + used; if (game->time) { timescore = 10 * (game->time - game->besttime / TICKS_PER_SECOND); used += 1 + sprintf(textheap + used, "1+%s", cdecimal(timescore, zchar)); } else { timescore = 0; strcpy(textheap + used, "1+---"); used += 6; } ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", cdecimal(levelscore + timescore, zchar)); totalscore += levelscore + timescore; } if (plevellist) levellist[count] = j; ++count; } else { if (!usepasswds || (game->sgflags & SGF_HASPASSWD)) { ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "4-%s", game->name); if (plevellist) levellist[count] = j; } else { ptrs[n++] = blank; if (plevellist) levellist[count] = -1; } ++count; } } while (ptrs[n - 1] == blank) { n -= 2; --count; } ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "2-Total Score"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "3+%s", cdecimal(totalscore, zchar)); if (plevellist) levellist[count] = -1; ++count; if (plevellist) *plevellist = levellist; if (pcount) *pcount = count; table->rows = count + 1; table->cols = 5; table->sep = 2; table->collapse = 1; table->items = ptrs; return TRUE; } /* Produce a table that displays the user's best times for each level * that has a solution. If showpartial is zero, times are rounded down * to second precision, otherwise fractional values will be * calculated. */ int createtimelist(gameseries const *series, int showpartial, char zchar, int **plevellist, int *pcount, tablespec *table) { gamesetup *game; char const **ptrs; char *textheap; char *untimed; int *levellist = nullptr; long leveltime; int count; int used, secs, j, n; if (plevellist) { levellist = (int*)malloc((series->count + 1) * sizeof *levellist); if (!levellist) memerrexit(); } ptrs = (char const **)malloc((series->count + 1) * 4 * sizeof *ptrs); textheap = (char *)malloc((series->count + 1) * 128); if (!ptrs || !textheap) memerrexit(); n = 0; used = 0; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Level"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-Name"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Time"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+Solution"); untimed = textheap + used; used += 1 + sprintf(textheap + used, "1+---"); count = 0; for (j = 0, game = series->games ; j < series->count ; ++j, ++game) { if (j >= series->allocated) break; if (!hassolution(game)) continue; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", decimal(game->number, zchar)); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-%.64s", game->name); if (game->time) { leveltime = game->time * TICKS_PER_SECOND - game->besttime; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", decimal(game->time, zchar)); } else { leveltime = 999 * TICKS_PER_SECOND - game->besttime; ptrs[n++] = untimed; } if (game->sgflags & SGF_REPLACEABLE) { ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1.*BAD*"); } else { if (leveltime < 0) secs = -(-leveltime / TICKS_PER_SECOND); else secs = (leveltime + TICKS_PER_SECOND - 1) / TICKS_PER_SECOND; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1+%s", decimal(secs, zchar)); if (showpartial) { double f, i; f = modf((double)leveltime / TICKS_PER_SECOND, &i); f = f <= 0 ? -f : 1.0 - f; secs = (int)(f * showpartial + 0.49); --used; used += 1 + sprintf(textheap + used, " - .%s", decimal(showpartial + secs, zchar) + 1); } } if (plevellist) levellist[count] = j; ++count; } if (plevellist) *plevellist = levellist; if (pcount) *pcount = count; table->rows = count + 1; table->cols = 4; table->sep = 2; table->collapse = 1; table->items = ptrs; return TRUE; } /* Free the memory allocated by createscorelist() or createtimelist(). */ void freescorelist(int *levellist, tablespec *table) { free(levellist); if (table) { free((void*)table->items[0]); free(table->items); } } char const* timestring(int lvlnum, char const *lvltitle, int besttime, int timed, int bad) { static string result; ostringstream oss; oss << '#' << lvlnum << " (" << lvltitle << "): "; if (!timed) oss << '['; oss << besttime; if (!timed) oss << ']'; if (bad) oss << " *bad*"; oss << '\n'; result = oss.str(); return result.c_str(); } char const* leveltimes(gameseries const *series) { static string result; result.clear(); for (int i = 0; i < series->count; ++i) { gamesetup const & game = series->games[i]; if (hassolution(&game)) { int const starttime = (game.time ? game.time : 999); int const besttime = starttime - game.besttime / TICKS_PER_SECOND; bool const timed = (game.time > 0); bool const bad = (game.sgflags & SGF_REPLACEABLE); result += timestring(game.number, game.name, besttime, timed, bad); } } return result.c_str(); } tworld-2.3.0/score.h000066400000000000000000000043201475511570500143240ustar00rootroot00000000000000/* score.h: Calculating and formatting the scores. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_score_h_ #define HEADER_score_h_ #include "defs.h" #ifdef __cplusplus extern "C" { #endif /* Return the user's scores for a given level. The last three arguments * receive the base score for the level, the time bonus for the level, * and the total score for the series. */ extern int getscoresforlevel(gameseries const *series, int level, int *base, int *bonus, long *total); /* Produce a table showing the player's scores for the given series, * formatted in columns. Each level in the series is listed in a * separate row, with a header row and an extra row at the end giving * a grand total. The pointer pointed to by plevellist receives an * array of level indexes to match the rows of the table (less one for * the header row), or -1 if no level is displayed in that row. If * usepasswds is TRUE, levels for which the user has not learned the * password will either not be included or will show no title. FALSE * is returned if an error occurs. */ extern int createscorelist(gameseries const *series, int usepasswds, char zchar, int **plevellist, int *pcount, tablespec *table); /* Produce a table showing the player's times for the given series. If * showpartial is zero, the times will be rounded to second values. * Otherwise, showpartial should be a power of ten, and the function * will attempt to provide fractional amounts to the appropriate * number of digits. */ extern int createtimelist(gameseries const *series, int showpartial, char zchar, int **plevellist, int *pcount, tablespec *table); /* Free all memory allocated by the above functions. */ extern void freescorelist(int *plevellist, tablespec *table); #define freetimelist freescorelist /* Create a string representing the level time achieved for a level. */ char const *timestring(int lvlnum, char const *lvltitle, int besttime, int timed, int bad); /* Create a list of timestrings for all levels with solutions in the * gameseries. */ char const* leveltimes(gameseries const *series); #ifdef __cplusplus } #endif #endif tworld-2.3.0/series.c000066400000000000000000000774241475511570500145150ustar00rootroot00000000000000/* series.c: Functions for finding and reading the data files. * * Copyright (C) 2001-2017 by Brian Raiter and Eric Schmidt under the GNU * General Public License. No warranty. See COPYING for details. */ #include #include #include #include #include #include "defs.h" #include "err.h" #include "fileio.h" #include "solution.h" #include "unslist.h" #include "series.h" #include "oshw.h" /* The signature bytes of the data files. */ #define SIG_DATFILE 0xAAAC #define SIG_DATFILE_MS 0x0002 #define SIG_DATFILE_LYNX 0x0102 /* The "signature bytes" of the configuration files. */ #define SIG_DACFILE 0x656C6966 typedef struct { mapfileinfo *buf; int count; int datdircount; /* Number of mapfiles in datdir */ } mfinfovector; static void addgameseries(intlist *g, int gameseriesindex, int ruleset) { g += ruleset; ++g->count; x_alloc(g->list, g->count * sizeof g->list); g->list[g->count-1] = gameseriesindex; } /* Add a level file to a mfinfovector. The vector takes ownership of the * filename string. */ static void addlevelfile(mfinfovector *v, char *filename, int levelcount, int locdirs) { ++v->count; x_alloc(v->buf, v->count * sizeof *v->buf); v->buf[v->count-1].filename = filename; for (int n = 0; n < Ruleset_Count; ++n) { v->buf[v->count-1].sfilelst[n].list = NULL; v->buf[v->count-1].sfilelst[n].count = 0; } v->buf[v->count-1].levelcount = levelcount; v->buf[v->count-1].locdirs = locdirs; } /* A callback function to compare mapfileinfo structs */ static int compare_mapfileinfo(void const *a, void const *b) { return stricmp(((mapfileinfo*)a)->filename, ((mapfileinfo*)b)->filename); } #ifdef TWPLUSPLUS /* Remove .dat and .ccl suffixes from the mapfilenames */ static void removefilenamesuffixes(mfinfovector *v) { for (int n = 0; n < v->count; ++n) { size_t const namelength = strlen(v->buf[n].filename); if (namelength > 4u) { char *suffix = &v->buf[n].filename[namelength - 4u]; if (!stricmp(suffix, ".dat") || !stricmp(suffix, ".ccl")) *suffix = '\0'; } } } #endif /* Mini-structure for finding/generating the series files. */ typedef struct seriesdata { mfinfovector mfinfo; /* list of levelset files */ gameseries *list; /* the gameseries list */ char const *curdir; /* directory we are searching */ int allocated; /* number of gameseries currently allocated */ int count; /* number of gameseries filled in */ } seriesdata; /* The directory containing the series files (data files and * configuration files). */ char *seriesdir = NULL; /* The directory containing the configured data files. */ char *seriesdatdir = NULL; /* Calculate a hash value for the given block of data. */ static unsigned long hashvalue(unsigned char const *data, unsigned int size) { static unsigned long remainders[256] = { 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD, 0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9, 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75, 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011, 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD, 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039, 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5, 0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81, 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D, 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49, 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95, 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1, 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D, 0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE, 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072, 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16, 0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA, 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE, 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02, 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066, 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA, 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E, 0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692, 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6, 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A, 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E, 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2, 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686, 0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A, 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637, 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB, 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F, 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53, 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47, 0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B, 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF, 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623, 0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7, 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B, 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F, 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3, 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7, 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B, 0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F, 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3, 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640, 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C, 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8, 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24, 0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30, 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC, 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088, 0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654, 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0, 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C, 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18, 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4, 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0, 0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C, 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4 }; unsigned long accum; unsigned int i, j; for (j = 0, accum = 0xFFFFFFFFUL ; j < size ; ++j) { i = ((accum >> 24) ^ data[j]) & 0x000000FF; accum = (accum << 8) ^ remainders[i]; } return accum ^ 0xFFFFFFFFUL; } /* * Reading the data file. */ /* Examine the top of a data file and identify its type. FALSE is * returned if any header bytes appear to be invalid. */ static int readseriesheader(gameseries *series) { unsigned short val16; int ruleset; if (!filereadint16(&series->mapfile, &val16, "not a valid data file")) return FALSE; if (val16 != SIG_DATFILE) return fileerr(&series->mapfile, "not a valid data file"); if (!filereadint16(&series->mapfile, &val16, "not a valid data file")) return FALSE; switch (val16) { case SIG_DATFILE_MS: ruleset = Ruleset_MS; break; case SIG_DATFILE_LYNX: ruleset = Ruleset_Lynx; break; default: fileerr(&series->mapfile, "data file uses an unrecognized ruleset"); return FALSE; } if (series->ruleset == Ruleset_None) series->ruleset = ruleset; if (!filereadint16(&series->mapfile, &val16, "not a valid data file")) return FALSE; series->count = val16; if (!series->count) { fileerr(&series->mapfile, "file contains no maps"); return FALSE; } return TRUE; } /* Read a single level out of the given data file. The level's name, * password, and time limit are extracted from the data. */ static int readleveldata(fileinfo *file, gamesetup *game) { unsigned char *data; unsigned char const *dataend; unsigned short size; int n; if (!filereadint16(file, &size, NULL)) return FALSE; data = filereadbuf(file, size, "missing or invalid level data"); if (!data) return FALSE; if (size < 2) { fileerr(file, "invalid level data"); free(data); return FALSE; } game->levelsize = size; game->leveldata = data; dataend = game->leveldata + game->levelsize; game->number = data[0] | (data[1] << 8); if (size < 10) goto badlevel; game->time = data[2] | (data[3] << 8); game->besttime = TIME_NIL; game->passwd[0] = '\0'; data += data[8] | (data[9] << 8); data += 10; if (data + 2 >= dataend) goto badlevel; data += data[0] | (data[1] << 8); data += 2; size = data[0] | (data[1] << 8); data += 2; if (data + size != dataend) warn("level %d: inconsistent size data (%d vs %d)", game->number, dataend - data, size); while (data + 2 < dataend) { size = data[1]; data += 2; if (size > dataend - data) size = dataend - data; switch (data[-2]) { case 1: if (size > 1) game->time = data[0] | (data[1] << 8); break; case 3: memcpy(game->name, data, size); game->name[size] = '\0'; break; case 6: for (n = 0 ; n < size && n < 15 && data[n] ; ++n) game->passwd[n] = data[n] ^ 0x99; game->passwd[n] = '\0'; break; case 9: memcpy(game->author, data, size); game->author[size] = '\0'; break; case 8: warn("level %d: ignoring field 8 password", game->number); break; } data += size; } if (!game->passwd[0] || strlen(game->passwd) != 4) goto badlevel; game->levelhash = hashvalue(game->leveldata, game->levelsize); return TRUE; badlevel: free(game->leveldata); game->levelsize = 0; game->leveldata = NULL; errmsg(file->name, "level %d: invalid level data", game->number); return FALSE; } /* Assuming that the series passed in is in fact the original * chips.dat file, this function undoes the changes that MS introduced * to the original Lynx levels. A rather "ad hack" way to accomplish * this, but it permits this fixup to occur without requiring the user * to perform a special one-time task. Four passwords are repaired, a * possibly missing wall in level 88 is restored, the beartrap wirings * of levels 99 and 111 are fixed, the layout changes to 121 and 127 * are undone, and level 145 is removed. */ static int undomschanges(gameseries *series) { struct { int num, pos, val; } *fixup, fixups[] = { { 5, 0x011D, 'P' ^ 0x99 }, { 95, 0x035F, 'W' ^ 0x99 }, { 9, 0x032D, 'V' ^ 0x99 }, { 95, 0x0360, 'V' ^ 0x99 }, { 9, 0x032E, 'U' ^ 0x99 }, { 95, 0x0361, 'H' ^ 0x99 }, { 27, 0x01E7, 'D' ^ 0x99 }, { 95, 0x0362, 'Y' ^ 0x99 }, { 87, 0x0148, 0x09 }, { 120, 0x0195, 0x00 }, { 98, 0x0340, 8 }, { 98, 0x0342, 14 }, { 98, 0x034A, 23 }, { 98, 0x034C, 14 }, { 98, 0x0354, 8 }, { 98, 0x0356, 16 }, { 98, 0x035E, 23 }, { 98, 0x0360, 16 }, { 98, 0x0368, 16 }, { 98, 0x036A, 18 }, { 98, 0x0372, 6 }, { 98, 0x0374, 20 }, { 98, 0x037C, 16 }, { 98, 0x037E, 20 }, { 98, 0x0386, 23 }, { 98, 0x0388, 23 }, { 98, 0x0390, 23 }, { 98, 0x0392, 25 }, { 110, 0x02B6, 22 }, { 110, 0x02B8, 11 }, { 110, 0x02C0, 15 }, { 110, 0x02C2, 6 }, { 126, 0x00B6, 0x00 }, { 126, 0x00C2, 0x01 }, { 126, 0x01B6, 0x01 }, { 126, 0x01C2, 0x00 }, { -1, -1, -1 } }; if (series->count != 149) return FALSE; for (fixup = fixups ; fixup->num >= 0 ; ++fixup) if (series->games[fixup->num].levelsize <= fixup->pos) return FALSE; free(series->games[144].leveldata); memmove(series->games + 144, series->games + 145, 4 * sizeof *series->games); --series->count; for (fixup = fixups ; fixup->num >= 0 ; ++fixup) series->games[fixup->num].leveldata[fixup->pos] = fixup->val; series->games[5].passwd[3] = 'P'; series->games[9].passwd[0] = 'V'; series->games[9].passwd[1] = 'U'; series->games[27].passwd[3] = 'D'; series->games[95].passwd[0] = 'W'; series->games[95].passwd[1] = 'V'; series->games[95].passwd[2] = 'H'; series->games[95].passwd[3] = 'Y'; return TRUE; } /* * Functions to read the data files. */ /* Load all levels from the given data file, and all of the user's * saved solutions. */ int readseriesfile(gameseries *series) { int n; if (series->gsflags & GSF_ALLMAPSREAD) return TRUE; if (series->count <= 0) { errmsg(series->filebase, "cannot read from empty level set"); return FALSE; } if (!series->mapfile.fp) { if (!openfileindir(&series->mapfile, seriesdir, series->mapfilename, "rb", "unknown error")) return FALSE; if (!readseriesheader(series)) return FALSE; } x_alloc(series->games, series->count * sizeof *series->games); memset(series->games + series->allocated, 0, (series->count - series->allocated) * sizeof *series->games); series->allocated = series->count; n = 0; while (n < series->count && !filetestend(&series->mapfile)) { if (readleveldata(&series->mapfile, series->games + n)) ++n; else --series->count; } fileclose(&series->mapfile, NULL); series->gsflags |= GSF_ALLMAPSREAD; if (series->gsflags & GSF_LYNXFIXES) undomschanges(series); markunsolvablelevels(series); readsolutions(series); readextensions(series); return TRUE; } /* Free all memory allocated for the given gameseries. */ void freeseriesdata(gameseries *series) { gamesetup *game; int n; clearsolutions(series); fileclose(&series->mapfile, NULL); clearfileinfo(&series->mapfile); free(series->mapfilename); series->mapfilename = NULL; free(series->savefilename); series->savefilename = NULL; series->gsflags = 0; series->solheaderflags = 0; for (n = 0, game = series->games ; n < series->count ; ++n, ++game) { free(game->leveldata); game->leveldata = NULL; game->levelsize = 0; } free(series->games); series->games = NULL; series->allocated = 0; series->count = 0; series->ruleset = Ruleset_None; series->gsflags = 0; *series->filebase = '\0'; *series->name = '\0'; } /* * Reading the configuration file. */ /* Parse the lines of the given configuration file. The return value * is the name of the corresponding data file, or NULL if the * configuration file could not be read or contained a syntax error. */ static char *readconfigfile(fileinfo *file, gameseries *series) { static char datfilename[256]; char buf[256]; char name[256]; char value[256]; char *p; int lineno, n; n = sizeof buf - 1; if (!filegetline(file, buf, &n, "invalid configuration file")) return NULL; if (sscanf(buf, "file = %[^\n\r]", datfilename) != 1) { fileerr(file, "bad filename in configuration file"); return NULL; } if (haspathname(datfilename)) { fileerr(file, "levelset filename may not contain a path"); return NULL; } for (lineno = 2 ; ; ++lineno) { n = sizeof buf - 1; if (!filegetline(file, buf, &n, NULL)) break; for (p = buf ; isspace(*p) ; ++p) ; if (!*p || *p == '#') continue; if (sscanf(buf, "%[^= \t] = %s", name, value) != 2) { fileerr(file, "invalid configuration file syntax"); return NULL; } for (p = name ; (*p = tolower(*p)) != '\0' ; ++p) ; if (!strcmp(name, "lastlevel")) { n = (int)strtol(value, &p, 10); if (*p || n <= 0) { fileerr(file, "invalid lastlevel in configuration file"); return NULL; } series->final = n; } else if (!strcmp(name, "ruleset")) { for (p = value ; (*p = tolower(*p)) != '\0' ; ++p) ; if (strcmp(value, "ms") && strcmp(value, "lynx")) { fileerr(file, "invalid ruleset in configuration file"); return NULL; } series->ruleset = *value == 'm' ? Ruleset_MS : Ruleset_Lynx; } else if (!strcmp(name, "usepasswords")) { if (tolower(*value) == 'n') series->gsflags |= GSF_IGNOREPASSWDS; else series->gsflags &= ~GSF_IGNOREPASSWDS; } else if (!strcmp(name, "fixlynx")) { if (tolower(*value) == 'n') series->gsflags &= ~GSF_LYNXFIXES; else series->gsflags |= GSF_LYNXFIXES; } else if (!strcmp(name, "fileinsetsdir")) { if (tolower(*value) == 'n') series->gsflags &= ~GSF_DATFORDACSERIESDIR; else series->gsflags |= GSF_DATFORDACSERIESDIR; } else { warn("line %d: directive \"%s\" unknown", lineno, name); fileerr(file, "unrecognized setting in configuration file"); return NULL; } } return datfilename; } /* * Functions to locate the series files. */ /* Open the given file and read the information in the file header (or * the entire file if it is a configuration file), then allocate and * initialize a gameseries structure for the file and add it to the * list stored under the second argument. This function is used as a * findfiles() callback. */ static int getseriesfile(char const *filename, void *data) { fileinfo file; seriesdata *sdata = (seriesdata*)data; gameseries *series; unsigned long magic; char *datfilename; int config, f; clearfileinfo(&file); if (!openfileindir(&file, sdata->curdir, filename, "rb", "unknown error")) return 0; if (!filereadint32(&file, &magic, "unexpected EOF")) { fileclose(&file, NULL); return 0; } filerewind(&file, NULL); if (magic == SIG_DACFILE) { config = TRUE; } else if ((magic & 0xFFFF) == SIG_DATFILE) { config = FALSE; } else { fileerr(&file, "not a valid data file or configuration file"); fileclose(&file, NULL); return 0; } if (sdata->count >= sdata->allocated) { sdata->allocated = sdata->count + 1; x_alloc(sdata->list, sdata->allocated * sizeof *sdata->list); } series = sdata->list + sdata->count; series->mapfilename = NULL; clearfileinfo(&series->savefile); series->savefilename = NULL; series->gsflags = 0; series->solheaderflags = 0; series->allocated = 0; series->count = 0; series->final = 0; series->ruleset = Ruleset_None; series->games = NULL; sprintf(series->filebase, "%.*s", (int)(sizeof series->filebase - 1), filename); sprintf(series->name, "%.*s", (int)(sizeof series->name - 1), skippathname(filename)); f = FALSE; if (config) { fileclose(&file, NULL); if (!openfileindir(&file, sdata->curdir, filename, "r", "unknown error")) return 0; clearfileinfo(&series->mapfile); free(series->mapfilename); series->mapfilename = NULL; datfilename = readconfigfile(&file, series); fileclose(&file, NULL); if (datfilename) { char const *datdir = ((series->gsflags & GSF_DATFORDACSERIESDIR) ? seriesdir : seriesdatdir); if (openfileindir(&series->mapfile, datdir, datfilename, "rb", NULL)) f = readseriesheader(series); else warn("cannot use %s: %s unavailable", filename, datfilename); fileclose(&series->mapfile, NULL); clearfileinfo(&series->mapfile); if (f) series->mapfilename = getpathforfileindir(datdir, datfilename); } } else { series->mapfile = file; f = readseriesheader(series); fileclose(&series->mapfile, NULL); clearfileinfo(&series->mapfile); if (f) { series->mapfilename = getpathforfileindir(sdata->curdir, filename); char *dup = strdup(filename); if (dup == NULL) memerrexit(); addlevelfile(&sdata->mfinfo, dup, series->count, LOC_SERIESDIR); } } if (f) ++sdata->count; return 0; } /* Determine whether the file is a map file. If so, add it to the list of * available map files. This function is used as a findfiles() callback. */ static int getmapfile(char const *filename, void *data) { fileinfo file; seriesdata *sdata = (seriesdata*)data; gameseries s; unsigned long magic; int f; clearfileinfo(&file); if (!openfileindir(&file, sdata->curdir, filename, "rb", "unknown error")) return 0; if (!filereadint32(&file, &magic, "unexpected EOF")) { fileclose(&file, NULL); return 0; } filerewind(&file, NULL); if ((magic & 0xFFFF) != SIG_DATFILE) { fileclose(&file, NULL); return 0; } s.mapfile = file; s.ruleset = Ruleset_None; f = readseriesheader(&s); fileclose(&file, NULL); clearfileinfo(&file); if (f) { mfinfovector *v = &sdata->mfinfo; mapfileinfo key; key.filename = (char*)filename; mapfileinfo *existingmf = bsearch(&key, v->buf, v->datdircount, sizeof key, compare_mapfileinfo); if (existingmf) { existingmf->locdirs |= LOC_SERIESDATDIR; existingmf->levelcount = s.count; } else { char *dup = strdup(filename); if (dup == NULL) memerrexit(); addlevelfile(v, dup, s.count, LOC_SERIESDATDIR); } } return 0; } #ifndef TWPLUSPLUS /* A callback function to compare two gameseries structures by * comparing their filenames. */ static int gameseriescmp_name(void const *a, void const *b) { return stricmp(((gameseries*)a)->name, ((gameseries*)b)->name); } #endif /* A callback function to compare two gameseries structures by * comparing their map filenames. */ static int gameseriescmp_mapfilename(void const *a, void const *b) { char const * namea = skippathname(((gameseries*)a)->mapfilename); char const * nameb = skippathname(((gameseries*)b)->mapfilename); return stricmp(namea, nameb); } /* The name we should use for a (currently) nonexisting .dac file */ char *generatenewdacname(mapfileinfo const *datfile, int ruleset) { static char const *rulesetname[Ruleset_Count]; rulesetname[Ruleset_Lynx] = "lynx"; rulesetname[Ruleset_MS] = "ms"; char const *basename = skippathname(datfile->filename); size_t newnamelen = 0u; newnamelen += strlen(basename); newnamelen += 1u; /* hyphen */ newnamelen += strlen(rulesetname[ruleset]); newnamelen += strlen(".dac"); char *namebuf = NULL; x_alloc(namebuf, newnamelen+1u); sprintf(namebuf, "%s-%s.dac", basename, rulesetname[ruleset]); return namebuf; } /* Generate a new dac file. Return TRUE if successful. */ static int createnewdacfile (char const *name, mapfileinfo const *datfile, int ruleset) { fileinfo file; clearfileinfo(&file); if (!openfileindir(&file, seriesdir, name, "wx", "unknown error")) return FALSE; char const *locstr = (datfile->locdirs & LOC_SERIESDATDIR ? "" : "fileinsetsdir=y\n"); char const *rulesetstr = (ruleset == Ruleset_MS ? "ms" : "lynx"); errno = 0; int status = fprintf(file.fp, "file=%s\n%sruleset=%s\n", datfile->filename, locstr, rulesetstr); if (status < 0) { fileerr(&file, "write error"); return FALSE; } fileclose(&file, NULL); return TRUE; } /* Try to create a new gameseries for the specified level file and ruleset. Also * attempt to create the .dac file. Fail if our chosen filename is taken. If * the filename wasn't taken but creation still failed for some reason, we * still create the gameseries. The gameseries is added to the seriesdata * struct. Returns the new gameseries if successful. */ static gameseries* createnewseries (seriesdata *s, mapfileinfo const *datfile, int ruleset) { char *newdacname = generatenewdacname(datfile, ruleset); int ok = createnewdacfile(newdacname, datfile, ruleset); if (!ok) { errmsg(newdacname, "Attempt to create %s ruleset .dac for %s failed", ruleset == Ruleset_MS ? "MS" : "Lynx", datfile->filename); } if (errno == EEXIST) return NULL; if (s->count >= s->allocated) { s->allocated = s->count + 1; x_alloc(s->list, s->allocated * sizeof *s->list); } gameseries *series = s->list + s->count; clearfileinfo(&series->mapfile); clearfileinfo(&series->savefile); series->savefilename = NULL; series->gsflags = 0; series->solheaderflags = 0; series->allocated = 0; series->count = datfile->levelcount; series->final = 0; series->ruleset = ruleset; series->games = NULL; sprintf(series->filebase, "%.*s", (int)(sizeof series->filebase - 1), newdacname); sprintf(series->name, "%.*s", (int)(sizeof series->name - 1), newdacname); char *datfileloc = (datfile->locdirs & LOC_SERIESDATDIR ? seriesdatdir : seriesdir); series->mapfilename = getpathforfileindir(datfileloc, datfile->filename); ++s->count; free(newdacname); return series; } /* For each map file present, ensure at least one gameseries exists for each * ruleset. We also populate the structures mapping mapfile/ruleset to * gameseries. */ static void createallmissingseries(seriesdata *s) { qsort(s->mfinfo.buf, s->mfinfo.count, sizeof *s->mfinfo.buf, compare_mapfileinfo); qsort(s->list, s->count, sizeof *s->list, gameseriescmp_mapfilename); int seriesrulesetcount[Ruleset_Count]; int nseries = s->count; int m = 0; for (int n = 0; n < s->mfinfo.count; ++n) { memset(seriesrulesetcount, 0, sizeof seriesrulesetcount); mapfileinfo const *currentlevelfile = &s->mfinfo.buf[n]; char *currentmapname = currentlevelfile->filename; while (m < nseries && !stricmp(currentmapname, skippathname(s->list[m].mapfilename))) { int ruleset = s->list[m].ruleset; addgameseries(s->mfinfo.buf[n].sfilelst, m, ruleset); ++seriesrulesetcount[ruleset]; ++m; } for (int k = Ruleset_First; k < Ruleset_Count; ++k) { if (seriesrulesetcount[k] == 0) { gameseries *newseries = createnewseries(s, currentlevelfile, k); if (newseries) addgameseries(s->mfinfo.buf[n].sfilelst, newseries - s->list, k); } } } } /* Produce a warning if the versions of the named file in both seriesdir and * seriesdatdir are different. */ static void warnifversionsaredifferent(char const *fname) { fileinfo file1; clearfileinfo(&file1); if (!openfileindir(&file1, seriesdir, fname, "rb", "unknown error")) return; fileinfo file2; clearfileinfo(&file2); if (!openfileindir(&file2, seriesdatdir, fname, "rb", "unknown error")) { fileclose(&file1, NULL); return; } for (;;) { int c1 = getc(file1.fp); int c2 = getc(file2.fp); if (c1 != c2) { warn("Additionally, the two files are different!"); break; } if (c1 == EOF) break; } fileclose(&file1, NULL); fileclose(&file2, NULL); } /* Produce warnings about all cases where seriesdir and seriesdatdir contain * a mapfile of the same name. */ static void warnaboutdoublemapfiles(mfinfovector *v) { for (int i = 0; i < v->count; ++i) { if (v->buf[i].locdirs == (LOC_SERIESDIR | LOC_SERIESDATDIR)) { warn("The levelset \"%s\" is present in both \"%s\" and \"%s\"", v->buf[i].filename, seriesdatdir, seriesdir); warnifversionsaredifferent(v->buf[i].filename); } } } /* Search the series directory and generate an array of gameseries * structures corresponding to the data files found there. The array * is returned through list, and the size of the array is returned * through count. If preferred is not NULL, then the array returned * will only contain the series with that string as its filename * (presuming it can be found). The program will be aborted if a * serious error occurs or if no series can be found. */ static int getseriesfiles(char const *preferred, gameseries **list, int *count, mapfileinfo **mflist, int *mfcount) { seriesdata s; int n; s.mfinfo.buf = NULL; x_alloc(s.mfinfo.buf, sizeof *s.mfinfo.buf); /* Ensure buf not null */ s.mfinfo.count = 0; s.list = NULL; s.allocated = 0; s.count = 0; if (preferred && *preferred && haspathname(preferred)) { if (getseriesfile(preferred, &s) < 0) return FALSE; if (!s.count) { errmsg(preferred, "couldn't read data file"); return FALSE; } *seriesdir = '\0'; s.list[0].gsflags |= GSF_NODEFAULTSAVE; } else { if (!*seriesdir) return FALSE; s.curdir = seriesdir; findfiles(s.curdir, &s, getseriesfile); /* Sort because we want to look files up during next phase */ qsort(s.mfinfo.buf, s.mfinfo.count, sizeof *s.mfinfo.buf, compare_mapfileinfo); s.mfinfo.datdircount = s.mfinfo.count; s.curdir = seriesdatdir; findfiles(s.curdir, &s, getmapfile); warnaboutdoublemapfiles(&s.mfinfo); createallmissingseries(&s); if (!s.count) { errmsg(NULL, "no series files found"); return FALSE; } if (preferred && *preferred) { for (n = 0 ; n < s.count ; ++n) { if (!strcmp(s.list[n].name, preferred)) { s.list[0] = s.list[n]; s.count = 1; n = 0; break; } } if (n == s.count) { errmsg(preferred, "no such data file"); return FALSE; } } #ifndef TWPLUSPLUS qsort(s.list, s.count, sizeof *s.list, gameseriescmp_name); #else removefilenamesuffixes(&s.mfinfo); qsort(s.mfinfo.buf, s.mfinfo.count, sizeof *s.mfinfo.buf, compare_mapfileinfo); #endif } *list = s.list; *count = s.count; *mflist = s.mfinfo.buf; *mfcount = s.mfinfo.count; return TRUE; } /* Produce a list of the series that are available for play. An array * of gameseries structures is returned through pserieslist, the size * of the array is returned through pcount. The list of levelsets is returned * through pmflist and the number of levelsets through pmfcount. A table of * the gameseries filenames is returned through table. preferredfile, if not * NULL, limits the results to just the series with that filename. */ int createserieslist(char const *preferredfile, gameseries **pserieslist, int *pcount, mapfileinfo **pmflist, int *pmfcount, tablespec *table) { static char const *rulesetname[Ruleset_Count]; gameseries *serieslist; char const **ptrs; char *textheap; int listsize; mapfileinfo *mapfilelist; int mapfilelistsize; int used, col, n, y; if (!getseriesfiles(preferredfile, &serieslist, &listsize, &mapfilelist, &mapfilelistsize)) return FALSE; *pserieslist = serieslist; *pcount = listsize; *pmflist = mapfilelist; *pmfcount = mapfilelistsize; if (!table) return TRUE; col = 8; for (n = 0 ; n < listsize ; ++n) if (col < (int)strlen(serieslist[n].name)) col = strlen(serieslist[n].name); if (col > 48) col = 48; rulesetname[Ruleset_Lynx] = "Lynx"; rulesetname[Ruleset_MS] = "MS"; ptrs = malloc((listsize + 1) * 2 * sizeof *ptrs); textheap = malloc((listsize + 1) * (col + 32)); if (!ptrs || !textheap) memerrexit(); n = 0; used = 0; ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-Filename"); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1.Ruleset"); for (y = 0 ; y < listsize ; ++y) { ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1-%-*s", col, serieslist[y].name); ptrs[n++] = textheap + used; used += 1 + sprintf(textheap + used, "1.%s", rulesetname[serieslist[y].ruleset]); } table->rows = listsize + 1; table->cols = 2; table->sep = 2; table->collapse = 0; table->items = ptrs; return TRUE; } /* Make an independent copy of a single gameseries structure from list. */ void getseriesfromlist(gameseries *dest, gameseries const *list, int index) { int n; *dest = list[index]; n = strlen(list[index].mapfilename) + 1; if (!(dest->mapfilename = malloc(n))) memerrexit(); memcpy(dest->mapfilename, list[index].mapfilename, n); } /* Free all memory allocated by the createserieslist() table. */ void freeserieslist(gameseries *list, int count, mapfileinfo *mflist, int mfcount, tablespec *table) { int n; if (list) { for (n = 0 ; n < count ; ++n) free(list[n].mapfilename); free(list); } if (mfcount) { for (n = 0; n < mfcount; ++n) { free(mflist[n].filename); for (int m = 0; m < Ruleset_Count; ++m) free(mflist[n].sfilelst[m].list); } free(mflist); } if (table) { free((void*)table->items[0]); free(table->items); } } /* * Miscellaneous functions */ /* A function for looking up a specific level in a series by number * and/or password. */ int findlevelinseries(gameseries const *series, int number, char const *passwd) { int i, n; n = -1; if (number) { for (i = 0 ; i < series->count ; ++i) { if (series->games[i].number == number) { if (!passwd || !strcmp(series->games[i].passwd, passwd)) { if (n >= 0) return -1; n = i; } } } } else if (passwd) { for (i = 0 ; i < series->count ; ++i) { if (!strcmp(series->games[i].passwd, passwd)) { if (n >= 0) return -1; n = i; } } } else { return -1; } return n; } tworld-2.3.0/series.h000066400000000000000000000046341475511570500145130ustar00rootroot00000000000000/* series.h: Functions for finding and reading the series files. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_series_h_ #define HEADER_series_h_ #include "defs.h" /* The directory containing the series files. */ extern char *seriesdir; /* The directory containing the configured data files. */ extern char *seriesdatdir; /* Load all levels of the given series. */ extern int readseriesfile(gameseries *series); /* Release all resources associated with a gameseries structure. */ extern void freeseriesdata(gameseries *series); /* Produce a list all available data files. pserieslist receives the * location of an array of gameseries structures, one per data file * successfully found. pcount points to a value that is filled in with * the number of the data files. table, if it is not NULL, is filled * in with a tabular representation of the list of data files, showing * the names of the files and which ruleset each uses, with the first * row of the table containing column headres. preferredfile * optionally provides the filename or pathname of a single data file. * If the preferred data file is found, it will be the only one * returned. FALSE is returned if no series files are found. An * unrecoverable error will cause the function to abort the program. */ extern int createserieslist(char const *preferredfile, gameseries **pserieslist, int *pcount, mapfileinfo **pmflist, int *pmfcount, tablespec *table); /* Make an independent copy of a single gameseries structure from * a list obtained from createserieslist(). */ extern void getseriesfromlist(gameseries *dest, gameseries const *list, int index); /* Free the memory used by the table created in createserieslist(). * The pointers can be NULL. */ extern void freeserieslist(gameseries *list, int count, mapfileinfo *mflist, int mfcount, tablespec *table); /* A function for looking up a specific level in a series by number * and/or password. If number is -1, only the password will be * searched for; if passwd is NULL, only the number will be used. The * function returns the index of the game in the series, or -1 if the * data could not be matched, or if it matched more than one level * (ugh). */ extern int findlevelinseries(gameseries const *series, int number, char const *passwd); #endif tworld-2.3.0/sets/000077500000000000000000000000001475511570500140175ustar00rootroot00000000000000tworld-2.3.0/sets/CCLP1-Lynx.dac000066400000000000000000000000521475511570500162170ustar00rootroot00000000000000file=CCLP1.dat lastlevel=144 ruleset=lynx tworld-2.3.0/sets/CCLP1-MS.dac000066400000000000000000000000501475511570500156020ustar00rootroot00000000000000file=CCLP1.dat lastlevel=144 ruleset=ms tworld-2.3.0/sets/CCLP2.dac000066400000000000000000000000471475511570500152740ustar00rootroot00000000000000file=CCLP2.dat lastlevel=144 ruleset=mstworld-2.3.0/sets/CCLP3-Lynx.dac000066400000000000000000000000521475511570500162210ustar00rootroot00000000000000file=CCLP3.dat lastlevel=144 ruleset=lynx tworld-2.3.0/sets/CCLP3-MS.dac000066400000000000000000000000501475511570500156040ustar00rootroot00000000000000file=CCLP3.dat lastlevel=144 ruleset=ms tworld-2.3.0/sets/CCLP4-Lynx.dac000066400000000000000000000000521475511570500162220ustar00rootroot00000000000000file=CCLP4.dat lastlevel=144 ruleset=lynx tworld-2.3.0/sets/CCLP4-MS.dac000066400000000000000000000000501475511570500156050ustar00rootroot00000000000000file=CCLP4.dat lastlevel=144 ruleset=ms tworld-2.3.0/sets/CCLP5-Lynx.dac000077500000000000000000000000521475511570500162260ustar00rootroot00000000000000file=CCLP5.dat lastlevel=144 ruleset=lynx tworld-2.3.0/sets/CCLP5-MS.dac000077500000000000000000000000501475511570500156110ustar00rootroot00000000000000file=CCLP5.dat lastlevel=144 ruleset=ms tworld-2.3.0/sets/CCLXP2.dac000066400000000000000000000000531475511570500154210ustar00rootroot00000000000000file=CCLXP2.dat lastlevel=144 ruleset=lynx tworld-2.3.0/sets/cc-fixlynx.dac000066400000000000000000000000641475511570500165540ustar00rootroot00000000000000file=CHIPS.dat lastlevel=144 ruleset=lynx fixlynx=y tworld-2.3.0/sets/cc-lynx.dac000066400000000000000000000000521475511570500160420ustar00rootroot00000000000000file=CHIPS.dat lastlevel=144 ruleset=lynx tworld-2.3.0/sets/cc-ms.dac000066400000000000000000000000501475511570500154650ustar00rootroot00000000000000file=CHIPS.dat lastlevel=144 ruleset=ms tworld-2.3.0/sets/intro-lynx.dac000066400000000000000000000000341475511570500166100ustar00rootroot00000000000000file=intro.dat ruleset=lynx tworld-2.3.0/sets/intro-ms.dac000066400000000000000000000000321475511570500162330ustar00rootroot00000000000000file=intro.dat ruleset=ms tworld-2.3.0/settings.cpp000066400000000000000000000043101475511570500154030ustar00rootroot00000000000000/* settings.cpp: Functions for managing settings. * * Copyright (C) 2014-2017 by Eric Schmidt, under the GNU General Public * License. No warranty. See COPYING for details. */ #include "settings.h" #include "err.h" #include "fileio.h" #include #include #include #include #include extern char *savedir; using std::free; using std::getline; using std::ifstream; using std::istringstream; using std::map; using std::move; using std::ofstream; using std::ostringstream; using std::string; namespace { map settings; } char const * sfname = "settings"; void loadsettings() { char *fname = getpathforfileindir(savedir, sfname); ifstream in(fname); free(fname); if (!in) return; map newsettings; string line; while (getline(in, line)) { size_t pos(line.find('=')); if (pos != string::npos) newsettings.insert({line.substr(0, pos), line.substr(pos+1)}); } if (!in.eof()) warn("Error reading settings file"); settings = move(newsettings); } void savesettings() { char *fname = getpathforfileindir(savedir, sfname); ofstream out(fname); free(fname); if (!out) { warn("Could not open settings file"); return; } for (map::const_iterator i(settings.begin()); i != settings.end(); ++i) { out << i->first << '=' << i->second << '\n'; } if (!out) { warn("Could not write settings"); } } int getintsetting(char const * name) { std::map::const_iterator loc(settings.find(name)); if (loc == settings.end()) return -1; std::istringstream in(loc->second); int i; if (!(in >> i)) return -1; return i; } void setintsetting(char const * name, int val) { std::ostringstream out; out << val; settings[name] = out.str(); } char const * getstringsetting(char const * name) { std::map::const_iterator loc(settings.find(name)); if (loc == settings.end()) return nullptr; return loc->second.c_str(); } void setstringsetting(char const * name, char const * val) { settings[name] = val; } tworld-2.3.0/settings.h000066400000000000000000000014311475511570500150510ustar00rootroot00000000000000/* settings.h: Functions for managing settings. * * Copyright (C) 2014-2017 by Eric Schmidt, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_settings_h_ #define HEADER_settings_h_ #ifdef __cplusplus extern "C" { #endif void loadsettings(void); void savesettings(void); /* Obtain integer setting. Returns -1 if setting doesn't exist or cannot be * parsed as an int. */ int getintsetting(char const * name); void setintsetting(char const * name, int val); /* Obtain a string setting. Returned pointer is good until the setting is modified. Returns NULL if the setting doesn't exist. */ char const * getstringsetting(char const * name); void setstringsetting(char const * name, char const * val); #ifdef __cplusplus } #endif #endif tworld-2.3.0/solution.c000066400000000000000000000610731475511570500150700ustar00rootroot00000000000000/* solution.c: Functions for reading and writing the solution files. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include #include "defs.h" #include "err.h" #include "fileio.h" #include "series.h" #include "solution.h" /* * The following is a description of the solution file format. Note that * numeric values are always stored in little-endian order, consistent * with the data file. * * The header is at least eight bytes long, and contains the following * values: * * HEADER * 0-3 signature bytes (35 33 9B 99) * 4 ruleset (1=Lynx, 2=MS) * 5 other options (currently always zero) * 6 other options (currently always zero) * 7 count of bytes in remainder of header (currently always zero) * * After the header are level solutions, usually but not necessarily * in numerical order. Each solution begins with the following values: * * PER LEVEL * 0-3 offset to next solution (from the end of this field) * 4-5 level number * 6-9 level password (four ASCII characters in "cleartext") * 10 other flags (currently always zero) * 11 initial random slide direction and stepping value * 12-15 initial random number generator value * 16-19 time of solution in ticks * 20-xx solution bytes * * If the offset field is 0, then none of the other fields are * present. (This permits the file to contain padding.) If the offset * field is 6, then the level's number and password are present but * without a saved game. Otherwise, the offset should never be less * than 16. * * Note that byte 11 contains the initial random slide direction in * the bottom three bits, and the initial stepping value in the next * three bits. The top two bits are unused. (The initial random slide * direction is always zero under the MS ruleset.) * * The solution bytes consist of a stream of values indicating the * moves of the solution. The values vary in size from one to five * bytes in length. The size of each value is always specified in the * first byte. There are five different formats for the values. (Note * that in the following byte diagrams, the bits are laid out * little-endian instead of the usual MSB-first.) * * The first format can be either one or two bytes long. The two-byte * form is shown here: * * #1: 01234567 89012345 * NNDDDTTT TTTTTTTT * * The two lowest bits, marked with Ns, contain either one (01) or two * (10), and indicate how many bytes are used. The next three bits, * marked with Ds, contain the direction of the move. The remaining * bits are marked with Ts, and these indicate the amount of time, in * ticks, between this move and the prior move, less one. (Thus, a * value of T=0 indicates a move that occurs on the tick immediately * following the previous move.) The very first move of a solution is * an exception: it is not decremented, as that would sometimes * require a negative value to be stored. If the one-byte version is * used, then T is only three bits in size; otherwise T is 11 bits * long. * * The second format is four bytes in length: * * #2: 01234567 89012345 67890123 45678901 * 11DD0TTT TTTTTTTT TTTTTTTT TTTTTTTT * * This format allocates 27 bits for the time value. (The top four * bits will always be zero, however, as the game's timer is currently * limited to 23 bits.) Since there are only two bits available for * storing the direction, this format can only be used to store * orthogonal moves (i.e. it cannot be used to store a Lynx diagonal * move). * * The third format has the form: * * #3: 01234567 * 00DDEEFF * * This value encodes three separate moves (DD, EE, and FF) packed * into a single byte. Each move has an implicit time value of four * ticks separating it from the prior move (i.e. T=3). Like the second * format, only two bits are used to store each move. * * The fourth and final format, like the first format, can vary in * size. It can be two, three, four, or five bytes long, depending on * how many bits are needed to store the time interval. It is shown * here in its largest form: * * #4: 01234567 89012345 67890123 45678901 23456789 * 11NN1DDD DDDDDDTT TTTTTTTT TTTTTTTT TTTTTTTT * * The two bits marked NN indicate the size of the field in bytes, * less two (i.e., 00 for a two-byte value, 11 for a five-byte value). * Seven bits are used to indicate the move's direction, which allows * this field to store MS mouse moves. The time value is encoded * normally, and can be 2, 10, 18, or 26 bits long. */ /* The signature bytes of the solution files. */ #define CSSIG 0x999B3335UL /* Translate move directions between three-bit and four-bit * representations. * * 0 = NORTH = 0001 = 1 * 1 = WEST = 0010 = 2 * 2 = SOUTH = 0100 = 4 * 3 = EAST = 1000 = 8 * 4 = NORTH | WEST = 0011 = 3 * 5 = SOUTH | WEST = 0110 = 6 * 6 = NORTH | EAST = 1001 = 9 * 7 = SOUTH | EAST = 1100 = 12 */ static int const diridx8[16] = { -1, 0, 1, 4, 2, -1, 5, -1, 3, 6, -1, -1, 7, -1, -1, -1 }; static int const idxdir8[8] = { NORTH, WEST, SOUTH, EAST, NORTH | WEST, SOUTH | WEST, NORTH | EAST, SOUTH | EAST }; #define isdirectmove(dir) (directionalcmd(dir)) #define ismousemove(dir) (!isdirectmove(dir)) #define isdiagonal(dir) (isdirectmove(dir) && diridx8[dir] > 3) #define isorthogonal(dir) (isdirectmove(dir) && diridx8[dir] <= 3) #define dirtoindex(dir) (diridx8[dir]) #define indextodir(dir) (idxdir8[dir]) /* TRUE if file modification is prohibited. */ int readonly = FALSE; /* The path of the directory containing the user's solution files. */ char *savedir = NULL; /* * Functions for manipulating move lists. */ /* Initialize or reinitialize list as empty. */ void initmovelist(actlist *list) { if (!list->allocated || !list->list) { list->allocated = 16; x_alloc(list->list, list->allocated * sizeof *list->list); } list->count = 0; } /* Append move to the end of list. */ void addtomovelist(actlist *list, action move) { if (list->count >= list->allocated) { list->allocated *= 2; x_alloc(list->list, list->allocated * sizeof *list->list); } list->list[list->count++] = move; } /* Make to an independent copy of from. */ void copymovelist(actlist *to, actlist const *from) { if (!to->allocated || !to->list) to->allocated = 16; while (to->allocated < from->count) to->allocated *= 2; x_alloc(to->list, to->allocated * sizeof *to->list); to->count = from->count; if (from->count) memcpy(to->list, from->list, from->count * sizeof *from->list); } /* Deallocate list. */ void destroymovelist(actlist *list) { if (list->list) free(list->list); list->allocated = 0; list->list = NULL; } /* * Functions for handling the solution file header. */ /* Read the header bytes of the given solution file. flags receives * the option bytes (bytes 5-6). extra receives any bytes in the * header that this code doesn't recognize. */ static int readsolutionheader(fileinfo *file, int ruleset, int *flags, int *extrasize, unsigned char *extra) { unsigned long sig; unsigned short f; unsigned char n; if (!filereadint32(file, &sig, "not a valid solution file")) return FALSE; if (sig != CSSIG) return fileerr(file, "not a valid solution file"); if (!filereadint8(file, &n, "not a valid solution file")) return FALSE; if (n != ruleset) return fileerr(file, "solution file is for a different ruleset" " than the level set file"); if (!filereadint16(file, &f, "not a valid solution file")) return FALSE; *flags = (int)f; if (!filereadint8(file, &n, "not a valid solution file")) return FALSE; *extrasize = n; if (n) if (!fileread(file, extra, *extrasize, "not a valid solution file")) return FALSE; return TRUE; } /* Write the header bytes to the given solution file. */ static int writesolutionheader(fileinfo *file, int ruleset, int flags, int extrasize, unsigned char const *extra) { return filewriteint32(file, CSSIG, NULL) && filewriteint8(file, ruleset, NULL) && filewriteint16(file, flags, NULL) && filewriteint8(file, extrasize, NULL) && filewrite(file, extra, extrasize, NULL); } /* Write the name of the level set to the given solution file. */ static int writesolutionsetname(fileinfo *file, char const *setname) { char zeroes[16] = ""; int n; n = strlen(setname) + 1; return filewriteint32(file, n + 16, NULL) && filewrite(file, zeroes, 16, NULL) && filewrite(file, setname, n, NULL); } /* * Solution translation. */ /* Expand a level's solution data into an actual list of moves. */ int expandsolution(solutioninfo *solution, gamesetup const *game) { unsigned char const *dataend; unsigned char const *p; action act; int n; if (game->solutionsize <= 16) return FALSE; solution->flags = game->solutiondata[6]; solution->rndslidedir = indextodir(game->solutiondata[7] & 7); solution->stepping = (game->solutiondata[7] >> 3) & 7; solution->rndseed = game->solutiondata[8] | (game->solutiondata[9] << 8) | (game->solutiondata[10] << 16) | (game->solutiondata[11] << 24); initmovelist(&solution->moves); act.when = -1; p = game->solutiondata + 16; dataend = game->solutiondata + game->solutionsize; while (p < dataend) { switch (*p & 0x03) { case 0: act.dir = indextodir((*p >> 2) & 0x03); act.when += 4; addtomovelist(&solution->moves, act); act.dir = indextodir((*p >> 4) & 0x03); act.when += 4; addtomovelist(&solution->moves, act); act.dir = indextodir((*p >> 6) & 0x03); act.when += 4; addtomovelist(&solution->moves, act); ++p; break; case 1: act.dir = indextodir((*p >> 2) & 0x07); act.when += ((*p >> 5) & 0x07) + 1; addtomovelist(&solution->moves, act); ++p; break; case 2: if (p + 2 > dataend) goto truncated; act.dir = indextodir((*p >> 2) & 0x07); act.when += ((p[0] >> 5) & 0x07) + ((unsigned long)p[1] << 3) + 1; addtomovelist(&solution->moves, act); p += 2; break; case 3: if (*p & 0x10) { n = (*p >> 2) & 0x03; if (p + 2 + n > dataend) goto truncated; act.dir = ((p[0] >> 5) & 0x07) | ((p[1] & 0x3F) << 3); act.when += (p[1] >> 6) & 0x03; while (n--) act.when += (unsigned long)p[2 + n] << (2 + n * 8); ++act.when; p += 2 + ((*p >> 2) & 0x03); } else { if (p + 4 > dataend) goto truncated; act.dir = indextodir((*p >> 2) & 0x03); act.when += ((p[0] >> 5) & 0x07) | ((unsigned long)p[1] << 3) | ((unsigned long)p[2] << 11) | ((unsigned long)p[3] << 19); ++act.when; p += 4; } addtomovelist(&solution->moves, act); break; } } return TRUE; truncated: errmsg(NULL, "level %d: truncated solution data", game->number); initmovelist(&solution->moves); return FALSE; } /* Take the given solution and compress it, storing the compressed * data as part of the level's setup. */ int contractsolution(solutioninfo const *solution, gamesetup *game) { action const *move; unsigned char *data; int size, delta, when, i; free(game->solutiondata); game->solutionsize = 0; game->solutiondata = NULL; if (!solution->moves.count) return TRUE; size = 21; move = solution->moves.list + 1; for (i = 1 ; i < solution->moves.count ; ++i, ++move) size += !isorthogonal(move->dir) ? 5 : move[0].when - move[-1].when <= (1 << 3) ? 1 : move[0].when - move[-1].when <= (1 << 11) ? 2 : 4; data = malloc(size); if (!data) { errmsg(NULL, "failed to record level %d solution:" " out of memory", game->number); return FALSE; } data[0] = game->number & 0xFF; data[1] = (game->number >> 8) & 0xFF; data[2] = game->passwd[0]; data[3] = game->passwd[1]; data[4] = game->passwd[2]; data[5] = game->passwd[3]; data[6] = solution->flags; data[7] = dirtoindex(solution->rndslidedir) | (solution->stepping << 3); data[8] = solution->rndseed & 0xFF; data[9] = (solution->rndseed >> 8) & 0xFF; data[10] = (solution->rndseed >> 16) & 0xFF; data[11] = (solution->rndseed >> 24) & 0xFF; data[12] = game->besttime & 0xFF; data[13] = (game->besttime >> 8) & 0xFF; data[14] = (game->besttime >> 16) & 0xFF; data[15] = (game->besttime >> 24) & 0xFF; when = -1; size = 16; move = solution->moves.list; for (i = 0 ; i < solution->moves.count ; ++i, ++move) { delta = -when - 1; when = move->when; delta += when; if (ismousemove(move->dir) || (isdiagonal(move->dir) && delta >= (1 << 11))) { data[size] = 0x13 | ((move->dir << 5) & 0xE0); data[size + 1] = ((move->dir >> 3) & 0x3F) | ((delta & 0x03) << 6); if (delta < (1 << 2)) { size += 2; } else { data[size + 2] = (delta >> 2) & 0xFF; if (delta < (1 << 10)) { data[size] |= 1 << 2; size += 3; } else { data[size + 3] = (delta >> 10) & 0xFF; if (delta < (1 << 18)) { data[size] |= 2 << 2; size += 4; } else { data[size + 4] = (delta >> 18) & 0xFF; data[size] |= 3 << 2; size += 5; } } } } else if (delta == 3 && i + 2 < solution->moves.count && isorthogonal(move[0].dir) && move[1].when - move[0].when == 4 && isorthogonal(move[1].dir) && move[2].when - move[1].when == 4 && isorthogonal(move[2].dir)) { data[size++] = (dirtoindex(move[0].dir) << 2) | (dirtoindex(move[1].dir) << 4) | (dirtoindex(move[2].dir) << 6); move += 2; i += 2; when = move->when; } else if (delta < (1 << 3)) { data[size++] = 0x01 | (dirtoindex(move->dir) << 2) | ((delta << 5) & 0xE0); } else if (delta < (1 << 11)) { data[size++] = 0x02 | (dirtoindex(move->dir) << 2) | ((delta << 5) & 0xE0); data[size++] = (delta >> 3) & 0xFF; } else { data[size++] = 0x03 | (dirtoindex(move->dir) << 2) | ((delta << 5) & 0xE0); data[size++] = (delta >> 3) & 0xFF; data[size++] = (delta >> 11) & 0xFF; data[size++] = (delta >> 19) & 0xFF; } } game->solutionsize = size; game->solutiondata = realloc(data, size); if (!game->solutiondata) game->solutiondata = data; return TRUE; } /* * File I/O for level solutions. */ /* Read the data of a one complete solution from the given file into * the appropriate fields of game. */ static int readsolution(fileinfo *file, gamesetup *game) { unsigned long size; game->number = 0; game->sgflags = 0; game->besttime = TIME_NIL; game->solutionsize = 0; game->solutiondata = NULL; if (!file->fp) return TRUE; if (!filereadint32(file, &size, NULL) || size == 0xFFFFFFFF) return FALSE; if (!size) return TRUE; game->solutionsize = size; game->solutiondata = filereadbuf(file, size, "unexpected EOF"); if (!game->solutiondata || (size <= 16 && size != 6)) return fileerr(file, "invalid data in solution file"); game->number = (game->solutiondata[1] << 8) | game->solutiondata[0]; memcpy(game->passwd, game->solutiondata + 2, 4); game->passwd[5] = '\0'; game->sgflags |= SGF_HASPASSWD; if (size == 6) return TRUE; game->besttime = game->solutiondata[12] | (game->solutiondata[13] << 8) | (game->solutiondata[14] << 16) | (game->solutiondata[15] << 24); size -= 16; if (!game->number && !*game->passwd) { game->sgflags |= SGF_SETNAME; if (size > 255) size = 255; memcpy(game->name, game->solutiondata + 16, size); game->name[size] = '\0'; free(game->solutiondata); game->solutionsize = 0; game->solutiondata = NULL; } return TRUE; } /* Write the data of one complete solution from the appropriate fields * of game to the given file. */ static int writesolution(fileinfo *file, gamesetup const *game) { if (game->solutionsize) { if (!filewriteint32(file, game->solutionsize, "write error") || !filewrite(file, game->solutiondata, game->solutionsize, "write error")) return FALSE; } else if (game->sgflags & SGF_HASPASSWD) { if (!filewriteint32(file, 6, "write error") || !filewriteint16(file, game->number, "write error") || !filewrite(file, game->passwd, 4, "write error")) return FALSE; } return TRUE; } /* * File I/O for solution files. */ /* Locate the solution file for the given data file and open it. */ static int opensolutionfile(fileinfo *file, char const *datname, int writable) { static int savedirchecked = FALSE; char *buf = NULL; char const *filename; int n; if (writable && readonly) return FALSE; if (file->name) { filename = file->name; } else { n = strlen(datname); if (datname[n - 4] == '.' && tolower(datname[n - 3]) == 'd' && tolower(datname[n - 2]) == 'a' && tolower(datname[n - 1]) == 't') n -= 4; x_alloc(buf, n + 5); memcpy(buf, datname, n); memcpy(buf + n, ".tws", 5); filename = buf; } if (writable) { if (!savedirchecked && savedir && *savedir && !haspathname(filename)) { savedirchecked = TRUE; if (!finddir(savedir)) { *savedir = '\0'; fileerr(file, "can't access directory"); } } } n = openfileindir(file, savedir, filename, writable ? "wb" : "rb", writable ? "can't access file" : NULL); if (buf) free(buf); return n; } /* Read the saved solution data for the given series into memory. */ int readsolutions(gameseries *series) { gamesetup gametmp = {0}; int n; if (!series->savefile.name) series->savefile.name = series->savefilename; if ((!series->savefile.name && (series->gsflags & GSF_NODEFAULTSAVE)) || !opensolutionfile(&series->savefile, series->filebase, FALSE)) { series->solheaderflags = 0; series->solheadersize = 0; return TRUE; } if (!readsolutionheader(&series->savefile, series->ruleset, &series->solheaderflags, &series->solheadersize, series->solheader)) return FALSE; for (;;) { if (!readsolution(&series->savefile, &gametmp)) break; if (gametmp.sgflags & SGF_SETNAME) { if (strcmp(gametmp.name, series->name)) { warn("%s: solution file %s was recorded for a different level" " set (%s); continuing anyway, but disabling saving", series->name, series->savefile.name, gametmp.name); series->gsflags |= GSF_NOSAVING; } continue; } n = findlevelinseries(series, gametmp.number, gametmp.passwd); if (n < 0) { n = findlevelinseries(series, 0, gametmp.passwd); if (n < 0) { fileerr(&series->savefile, "unmatched password in solution file"); continue; } warn("level %d has been moved to level %d", gametmp.number, series->games[n].number); } series->games[n].besttime = gametmp.besttime; series->games[n].sgflags = gametmp.sgflags; series->games[n].solutionsize = gametmp.solutionsize; series->games[n].solutiondata = gametmp.solutiondata; } fileclose(&series->savefile, NULL); return TRUE; } /* Write out all the solutions for the given series. */ int savesolutions(gameseries *series) { gamesetup *game; int i; if (readonly || (series->gsflags & GSF_NOSAVING)) return TRUE; if (series->savefile.fp) fileclose(&series->savefile, NULL); if (!series->savefile.name) series->savefile.name = series->savefilename; if (!series->savefile.name && (series->gsflags & GSF_NODEFAULTSAVE)) return TRUE; if (!opensolutionfile(&series->savefile, series->filebase, TRUE)) return FALSE; if (!writesolutionheader(&series->savefile, series->ruleset, series->solheaderflags, series->solheadersize, series->solheader)) return fileerr(&series->savefile, "saved-game file has become corrupted!"); if (!writesolutionsetname(&series->savefile, series->name)) return fileerr(&series->savefile, "saved-game file has become corrupted!"); for (i = 0, game = series->games ; i < series->count ; ++i, ++game) { if (!writesolution(&series->savefile, game)) return fileerr(&series->savefile, "saved-game file has become corrupted!"); } fileclose(&series->savefile, NULL); return TRUE; } /* Free all memory allocated for storing the game's solutions, and mark * the levels as being unsolved. */ void clearsolutions(gameseries *series) { gamesetup *game; int n; for (n = 0, game = series->games ; n < series->count ; ++n, ++game) { free(game->solutiondata); game->besttime = TIME_NIL; game->sgflags = 0; game->solutionsize = 0; game->solutiondata = NULL; } series->solheadersize = 0; series->solheaderflags = 0; fileclose(&series->savefile, NULL); clearfileinfo(&series->savefile); } /* Extract just the set name from the given solution file. */ int loadsolutionsetname(char const *filename, char *buffer) { fileinfo file; unsigned long dwrd; unsigned short word; int size; clearfileinfo(&file); if (!openfileindir(&file, savedir, filename, "rb", NULL)) return -1; if (!filereadint32(&file, &dwrd, NULL) || dwrd != CSSIG) goto badfile; if (!filereadint32(&file, &dwrd, NULL)) goto badfile; dwrd = (dwrd >> 24) & 0xFF; if (!fileskip(&file, dwrd, NULL) || !filereadint32(&file, &dwrd, NULL)) goto badfile; size = dwrd - 16; if (size <= 0) goto nosetname; if (!filereadint16(&file, &word, NULL) || !filereadint32(&file, &dwrd, NULL)) goto badfile; if (word || dwrd) goto nosetname; if (!fileskip(&file, 10, NULL) || !fileread(&file, buffer, size, NULL)) goto badfile; fileclose(&file, NULL); return size; badfile: fileclose(&file, NULL); return -1; nosetname: fileclose(&file, NULL); return 0; } /* * Creating the list of solution files. */ /* Mini-structure for passing data in and out of findfiles(). */ typedef struct solutiondata { char *pool; /* the found filenames, pooled together */ int allocated; /* number of bytes allocated for the pool */ int count; /* number of filenames in the pool */ char const *prefix; /* the filename prefix to seek */ int prefixlen; /* length of the filename prefix */ } solutiondata; /* If the given file starts with the prefix stored in the solutiondata * structure, then add it to the pool of filenames, prefixed with * "1-". This function is a callback for findfiles(). */ static int getsolutionfile(char const *filename, void *data) { solutiondata *sdata = data; int n; if (!memcmp(filename, sdata->prefix, sdata->prefixlen)) { n = strlen(filename) + 1; x_alloc(sdata->pool, sdata->allocated + n + 2); sdata->pool[sdata->allocated++] = '1'; sdata->pool[sdata->allocated++] = '-'; memcpy(sdata->pool + sdata->allocated, filename, n); sdata->allocated += n; ++sdata->count; } return 0; } /* Produce a list of available solution files associated with the * given series (i.e. that have the name of the series as their * prefix). An array of filenames is returned through pfilelist, the * array's size is returned through pcount, and the table of the * filenames is returned through table. FALSE is returned if no table * was returned. If morethanone is TRUE, and less than two solution * files are found, FALSE is returned and the table is not created. */ int createsolutionfilelist(gameseries const *series, int morethanone, char const ***pfilelist, int *pcount, tablespec *table) { solutiondata s; char const **filelist; int offset, i, n; s.pool = NULL; s.allocated = 0; s.count = 0; s.prefix = series->name; s.prefixlen = n = strlen(series->name); if (n > 4 && s.prefix[n - 4] == '.' && tolower(s.prefix[n - 3]) == 'd' && tolower(s.prefix[n - 2]) == 'a' && tolower(s.prefix[n - 1]) == 't') s.prefixlen -= 4; if (!findfiles(savedir, &s, getsolutionfile) || !s.count) return FALSE; if (s.count == 0 || (s.count == 1 && morethanone)) { free(s.pool); return FALSE; } filelist = malloc(s.count * sizeof *filelist); table->items = malloc((2 * s.count + 1) * sizeof *table->items); if (!filelist || !table->items) memerrexit(); table->rows = s.count + 1; table->cols = 2; table->sep = 4; table->collapse = 1; table->items[0] = "2-Select a solution file"; offset = 0; for (i = 0 ; i < s.count ; ++i) { n = strlen(s.pool + offset) + 1; filelist[i] = s.pool + offset + 2; table->items[2 * i + 1] = "1+\267"; table->items[2 * i + 2] = s.pool + offset; offset += n; } *pfilelist = filelist; if (pcount) *pcount = s.count; return TRUE; } /* Free the memory allocated by createsolutionfilelist(). */ void freesolutionfilelist(char const **filelist, tablespec *table) { free(filelist); if (table) { free((void*)table->items[2]); free(table->items); } } tworld-2.3.0/solution.h000066400000000000000000000071411475511570500150710ustar00rootroot00000000000000/* solution.c: Functions for reading and writing the solution files. * * Copyright (C) 2001-2010 by Brian Raiter and Madhav Shanbhag, * under the GNU General Public License. No warranty. See COPYING for details. */ #ifndef HEADER_solution_h_ #define HEADER_solution_h_ #include "defs.h" #include "fileio.h" /* A structure holding all the data needed to reconstruct a solution. */ typedef struct solutioninfo { actlist moves; /* the actual moves of the solution */ unsigned long rndseed; /* the PRNG's initial seed */ unsigned long flags; /* other flags (currently unused) */ unsigned char rndslidedir; /* random slide's initial direction */ signed char stepping; /* the timer offset */ } solutioninfo; /* The path of the directory containing the user's solution files. */ extern char *savedir; /* No file modification will be done unless this variable is FALSE. */ extern int readonly; /* Initialize or reinitialize list as empty. */ extern void initmovelist(actlist *list); /* Append move to the end of list. */ extern void addtomovelist(actlist *list, action move); /* Make to an independent copy of from. */ extern void copymovelist(actlist *to, actlist const *from); /* Deallocate list. */ extern void destroymovelist(actlist *list); /* Expand a level's solution data into the actual solution, including * the full list of moves. FALSE is returned if the solution is * invalid or absent. */ extern int expandsolution(solutioninfo *solution, gamesetup const *game); /* Take the given solution and compress it, storing the compressed * data as part of the level's setup. FALSE is returned if an error * occurs. (It is not an error to compress the null solution.) */ extern int contractsolution(solutioninfo const *solution, gamesetup *game); /* Read all the solutions for the given series into memory. FALSE is * returned if an error occurs. Note that it is not an error for the * solution file to not exist. */ extern int readsolutions(gameseries *series); /* Write out all the solutions for the given series. The solution file * is created if it does not currently exist. The solution file's * directory is also created if it does not currently exist. (Nothing * is done if the directory's name has been unset, however.) FALSE is * returned if an error occurs. */ extern int savesolutions(gameseries *series); /* Free all memory allocated for storing the game's solutions, and mark * the levels as being unsolved. */ extern void clearsolutions(gameseries *series); /* Read the solution file at filename to see if it contains a set * name. If so, copy it into buffer and return its length in bytes (up * to 255). Zero is returned if the solution file contains no set * name. A negative value is returned if the file cannot be read or is * not a valid solution file. */ extern int loadsolutionsetname(char const *filename, char *buffer); /* Produce a list of available solution files associated with the * given series (i.e. that have the name of the series as their * prefix). An array of filenames is returned through pfilelist, the * array's size is returned through pcount, and the table of the * filenames is returned through table. FALSE is returned if no table * was returned. If morethanone is TRUE, and less than two solution * files are found, FALSE is returned and the table is not created. */ extern int createsolutionfilelist(gameseries const *series, int morethanone, char const ***pfilelist, int *pcount, tablespec *table); /* Free the memory allocated by createsolutionfilelist(). */ extern void freesolutionfilelist(char const **filelist, tablespec *table); #endif tworld-2.3.0/state.h000066400000000000000000000215041475511570500143340ustar00rootroot00000000000000/* state.h: Definitions for embodying the state of a game in progress. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_state_h_ #define HEADER_state_h_ #include "defs.h" /* The tiles that make up Chip's universe. */ enum { Nothing = 0, Empty = 0x01, Slide_North = 0x02, Slide_West = 0x03, Slide_South = 0x04, Slide_East = 0x05, Slide_Random = 0x06, Ice = 0x07, IceWall_Northwest = 0x08, IceWall_Northeast = 0x09, IceWall_Southwest = 0x0A, IceWall_Southeast = 0x0B, Gravel = 0x0C, Dirt = 0x0D, Water = 0x0E, Fire = 0x0F, Bomb = 0x10, Beartrap = 0x11, Burglar = 0x12, HintButton = 0x13, Button_Blue = 0x14, Button_Green = 0x15, Button_Red = 0x16, Button_Brown = 0x17, Teleport = 0x18, Wall = 0x19, Wall_North = 0x1A, Wall_West = 0x1B, Wall_South = 0x1C, Wall_East = 0x1D, Wall_Southeast = 0x1E, HiddenWall_Perm = 0x1F, HiddenWall_Temp = 0x20, BlueWall_Real = 0x21, BlueWall_Fake = 0x22, SwitchWall_Open = 0x23, SwitchWall_Closed = 0x24, PopupWall = 0x25, CloneMachine = 0x26, Door_Red = 0x27, Door_Blue = 0x28, Door_Yellow = 0x29, Door_Green = 0x2A, Socket = 0x2B, Exit = 0x2C, ICChip = 0x2D, Key_Red = 0x2E, Key_Blue = 0x2F, Key_Yellow = 0x30, Key_Green = 0x31, Boots_Ice = 0x32, Boots_Slide = 0x33, Boots_Fire = 0x34, Boots_Water = 0x35, Block_Static = 0x36, Drowned_Chip = 0x37, Burned_Chip = 0x38, Bombed_Chip = 0x39, Exited_Chip = 0x3A, Exit_Extra_1 = 0x3B, Exit_Extra_2 = 0x3C, Overlay_Buffer = 0x3D, Floor_Reserved2 = 0x3E, Floor_Reserved1 = 0x3F, Chip = 0x40, Block = 0x44, Tank = 0x48, Ball = 0x4C, Glider = 0x50, Fireball = 0x54, Walker = 0x58, Blob = 0x5C, Teeth = 0x60, Bug = 0x64, Paramecium = 0x68, Swimming_Chip = 0x6C, Pushing_Chip = 0x70, Entity_Reserved2 = 0x74, Entity_Reserved1 = 0x78, Water_Splash = 0x7C, Bomb_Explosion = 0x7D, Entity_Explosion = 0x7E, Animation_Reserved1 = 0x7F }; /* Macros to assist in identifying tile taxons. */ #define isslide(f) ((f) >= Slide_North && (f) <= Slide_Random) #define isice(f) ((f) >= Ice && (f) <= IceWall_Southeast) #define isdoor(f) ((f) >= Door_Red && (f) <= Door_Green) #define iskey(f) ((f) >= Key_Red && (f) <= Key_Green) #define isboots(f) ((f) >= Boots_Ice && (f) <= Boots_Water) #define ismsspecial(f) ((f) >= Drowned_Chip && (f) <= Overlay_Buffer) #define isfloor(f) ((f) <= Floor_Reserved1) #define iscreature(f) ((f) >= Chip && (f) < Water_Splash) #define isanimation(f) ((f) >= Water_Splash && (f) <= Animation_Reserved1) /* Macro for getting the tile ID of a creature with a specific direction. */ #define crtile(id, dir) ((id) | diridx(dir)) /* Macros for decomposing a creature tile into ID and direction. */ #define creatureid(id) ((id) & ~3) #define creaturedirid(id) (idxdir((id) & 3)) /* * Substructures of the game state */ /* Two x,y-coordinates give the locations of a button and what it is * connected to. */ typedef struct xyconn { short from; /* location of the button */ short to; /* location of the trap/cloner */ } xyconn; /* A tile on the map. */ typedef struct maptile { unsigned char id; /* identity of the tile */ unsigned char state; /* internal state flags */ } maptile; /* A location on the map. */ typedef struct mapcell { maptile top; /* the upper tile */ maptile bot; /* the lower tile */ } mapcell; /* A creature. */ #if 0 typedef struct creature { signed int pos : 11; /* creature's location */ signed int dir : 5; /* current direction of creature */ signed int id : 8; /* type of creature */ signed int state : 8; /* internal state value */ signed int hidden: 1; /* TRUE if creature is invisible */ signed int moving: 5; /* positional offset of creature */ signed int frame : 5; /* explicit animation index */ signed int tdir : 5; /* internal state value */ } creature; #else typedef struct creature { short pos; /* creature's location */ unsigned char id; /* type of creature */ unsigned char dir; /* current direction of creature */ signed char moving; /* positional offset of creature */ signed char frame; /* explicit animation index */ unsigned char hidden; /* TRUE if creature is invisible */ unsigned char state; /* internal state value */ unsigned char tdir; /* internal state value */ } creature; #endif /* Status information specific to the MS game logic. */ struct msstate_ { unsigned char chipwait; /* ticks since Chip's last movement */ unsigned char chipstatus; /* Chip's status (one of CHIP_*) */ unsigned char controllerdir; /* current controller direction */ unsigned char lastslipdir; /* Chip's last involuntary movement */ unsigned char completed; /* level completed successfully */ short goalpos; /* mouse spot to move Chip towards */ signed char xviewoffset; /* offset of map view center */ signed char yviewoffset; /* position from position of Chip */ }; /* Status information specific to the Lynx game logic. */ struct lxstate_ { creature *chiptocr; /* is Chip colliding with a creature */ creature *crend; /* near the end of the creature list */ short chiptopos; /* just starting to move itself? */ short putwall; /* location to put a wall */ unsigned char prng1; /* the values used to make the */ unsigned char prng2; /* pseudorandom number sequence */ signed char xviewoffset; /* offset of map view center */ signed char yviewoffset; /* position from position of Chip */ unsigned char endgametimer; /* end-game countdown timer */ unsigned char togglestate; /* extra state of the toggle walls */ unsigned char completed; /* level completed successfully */ unsigned char stuck; /* Chip is stuck */ unsigned char pushing; /* Chip is pushing against something */ unsigned char couldntmove; /* can't-move sound has been played */ unsigned char mapbreached; /* Border of map has been breached */ }; /* * The game state structure proper. */ /* Ideally, everything that the gameplay module, the display module, * and both logic modules need to know about a game in progress is * in here. */ typedef struct gamestate { gamesetup *game; /* the level specification */ int ruleset; /* the ruleset for the game */ int replay; /* playback move index */ int timelimit; /* maximum time permitted */ int currenttime; /* the current tick count */ int timeoffset; /* offset for displayed time */ short currentinput; /* the current keystroke */ short chipsneeded; /* no. of chips still needed */ short xviewpos; /* the visible part of the */ short yviewpos; /* map (ie, where Chip is) */ short keys[4]; /* keys collected */ short boots[4]; /* boots collected */ short statusflags; /* flags (see below) */ short lastmove; /* most recent move */ unsigned char initrndslidedir; /* initial random-slide dir */ signed char stepping; /* initial timer offset 0-7 */ unsigned long soundeffects; /* the latest sound effects */ actlist moves; /* the list of moves */ prng mainprng; /* the main PRNG */ creature *creatures; /* the creature list */ short trapcount; /* number of trap buttons */ short clonercount; /* number of cloner buttons */ short crlistcount; /* number of creatures */ xyconn traps[256]; /* list of trap wirings */ xyconn cloners[256]; /* list of cloner wirings */ short crlist[256]; /* list of creatures */ char hinttext[256]; /* text of the hint */ mapcell map[CXGRID * CYGRID]; /* the game's map */ /* Ruleset specific state. A union could be used to reduce memory, but these are not large enough to make it worth it. */ struct msstate_ msstate; struct lxstate_ lxstate; } gamestate; /* General status flags. */ #define SF_NOSAVING 0x0001 /* solution won't be saved */ #define SF_INVALID 0x0002 /* level is not playable */ #define SF_BADTILES 0x0004 /* map has undefined tiles */ #define SF_SHOWHINT 0x0008 /* display the hint text */ #define SF_NOANIMATION 0x0010 /* suppress tile animation */ #define SF_SHUTTERED 0x0020 /* hide map view */ /* Macros for the keys and boots. */ #define redkeys(st) ((st)->keys[0]) #define bluekeys(st) ((st)->keys[1]) #define yellowkeys(st) ((st)->keys[2]) #define greenkeys(st) ((st)->keys[3]) #define iceboots(st) ((st)->boots[0]) #define slideboots(st) ((st)->boots[1]) #define fireboots(st) ((st)->boots[2]) #define waterboots(st) ((st)->boots[3]) #endif tworld-2.3.0/tworld.c000066400000000000000000001554711475511570500145350ustar00rootroot00000000000000/* tworld.c: The top-level module. * * Copyright (C) 2001-2017 by Brian Raiter, Madhav Shanbhag, and Eric Schmidt, * under the GNU General Public License. No warranty. See COPYING for details. */ #include #include #include #include #include "defs.h" #include "err.h" #include "series.h" #include "res.h" #include "play.h" #include "score.h" #include "settings.h" #include "solution.h" #include "unslist.h" #include "help.h" #include "oshw.h" #include "cmdline.h" #include "ver.h" /* Bell-ringing macro. */ #define bell() (silence ? (void)0 : ding()) enum { Play_None, Play_Normal, Play_Back, Play_Verify }; /* The data needed to identify what level is being played. */ typedef struct gamespec { gameseries series; /* the complete set of levels */ int currentgame; /* which level is currently selected */ int playmode; /* which mode to play */ int usepasswds; /* FALSE if passwords are to be ignored */ int status; /* final status of last game played */ int enddisplay; /* TRUE if the final level was completed */ int melindacount; /* count for Melinda's free pass */ } gamespec; /* Structure used to hold data collected by initoptionswithcmdline(). */ typedef struct startupdata { char *filename; /* which data file to use */ char *savefilename; /* an alternate solution file */ int levelnum; /* a selected initial level */ int listdirs; /* TRUE if directories should be listed */ int listseries; /* TRUE if the files should be listed */ int listscores; /* TRUE if the scores should be listed */ int listtimes; /* TRUE if the times should be listed */ int batchverify; /* TRUE to enter batch verification */ } startupdata; /* History of levelsets in order of last used date/time. */ static history *historylist = NULL; static int historycount = 0; /* Structure used to hold the complete list of available series. */ typedef struct seriesdata { gameseries *list; /* the array of available series */ int count; /* size of array */ mapfileinfo *mflist; /* List of all levelset files */ int mfcount; /* Number of levelset files */ tablespec table; /* table for displaying the array */ } seriesdata; /* TRUE suppresses sound and the console bell. */ static int silence = FALSE; /* TRUE means the program should attempt to run in fullscreen mode. */ static int fullscreen = FALSE; /* FALSE suppresses all password checking. */ static int usepasswds = TRUE; /* TRUE if the user requested an idle-time histogram. */ static int showhistogram = FALSE; /* Slowdown factor, used for debugging. */ static int mudsucking = 1; /* Frame-skipping disable flag. */ static int noframeskip = FALSE; /* The sound buffer scaling factor. */ static int soundbufsize = -1; /* The initial volume level. */ static int volumelevel = -1; /* The top of the stack of subtitles. */ static void **subtitlestack = NULL; /* * Text-mode output functions. */ /* Find a position to break a string inbetween words. The integer at * breakpos receives the length of the string prefix less than or * equal to len. The string pointer *str is advanced to the first * non-whitespace after the break. The original string pointer is * returned. */ static char *findstrbreak(char const **str, int maxlen, int *breakpos) { char const *start; int n; retry: start = *str; n = strlen(start); if (n <= maxlen) { *str += n; *breakpos = n; } else { n = maxlen; if (isspace(start[n])) { *str += n; while (isspace(**str)) ++*str; while (n > 0 && isspace(start[n - 1])) --n; if (n == 0) goto retry; *breakpos = n; } else { while (n > 0 && !isspace(start[n - 1])) --n; if (n == 0) { *str += maxlen; *breakpos = maxlen; } else { *str = start + n; while (n > 0 && isspace(start[n - 1])) --n; if (n == 0) goto retry; *breakpos = n; } } } return (char*)start; } /* Render a table to the given file. This function encapsulates both * the process of determining the necessary widths for each column of * the table, and then sequentially rendering the table's contents to * a stream. On the first pass through the data, single-cell * non-word-wrapped entries are measured and each column sized to fit. * If the resulting table is too large for the given area, then the * collapsible column is reduced as necessary. If there is still * space, however, then the entries that span multiple cells are * measured in a second pass, and columns are grown to fit them as * well where needed. If there is still space after this, the column * containing word-wrapped entries may be expanded as well. */ void printtable(FILE *out, tablespec const *table) { int const maxwidth = 79; char const *mlstr; char const *p; int *colsizes; int mlindex, mlwidth, mlpos; int diff, pos; int i, j, n, i0, c, w, z; if (!(colsizes = malloc(table->cols * sizeof *colsizes))) return; for (i = 0 ; i < table->cols ; ++i) colsizes[i] = 0; mlindex = -1; mlwidth = 0; n = 0; for (j = 0 ; j < table->rows ; ++j) { for (i = 0 ; i < table->cols ; ++n) { c = table->items[n][0] - '0'; if (c == 1) { w = strlen(table->items[n] + 2); if (table->items[n][1] == '!') { if (w > mlwidth || mlindex != i) mlwidth = w; mlindex = i; } else { if (w > colsizes[i]) colsizes[i] = w; } } i += c; } } w = -table->sep; for (i = 0 ; i < table->cols ; ++i) w += colsizes[i] + table->sep; diff = maxwidth - w; if (diff < 0 && table->collapse >= 0) { w = -diff; if (colsizes[table->collapse] < w) w = colsizes[table->collapse] - 1; colsizes[table->collapse] -= w; diff += w; } if (diff > 0) { n = 0; for (j = 0 ; j < table->rows && diff > 0 ; ++j) { for (i = 0 ; i < table->cols ; ++n) { c = table->items[n][0] - '0'; if (c > 1 && table->items[n][1] != '!') { w = table->sep + strlen(table->items[n] + 2); for (i0 = i ; i0 < i + c ; ++i0) w -= colsizes[i0] + table->sep; if (w > 0) { if (table->collapse >= i && table->collapse < i + c) i0 = table->collapse; else if (mlindex >= i && mlindex < i + c) i0 = mlindex; else i0 = i + c - 1; if (w > diff) w = diff; colsizes[i0] += w; diff -= w; if (diff == 0) break; } } i += c; } } } if (diff > 0 && mlindex >= 0 && colsizes[mlindex] < mlwidth) { mlwidth -= colsizes[mlindex]; w = mlwidth < diff ? mlwidth : diff; colsizes[mlindex] += w; diff -= w; } n = 0; for (j = 0 ; j < table->rows ; ++j) { mlstr = NULL; mlwidth = mlpos = 0; pos = 0; for (i = 0 ; i < table->cols ; ++n) { if (i) pos += fprintf(out, "%*s", table->sep, ""); c = table->items[n][0] - '0'; w = -table->sep; while (c--) w += colsizes[i++] + table->sep; if (table->items[n][1] == '-') fprintf(out, "%-*.*s", w, w, table->items[n] + 2); else if (table->items[n][1] == '+') fprintf(out, "%*.*s", w, w, table->items[n] + 2); else if (table->items[n][1] == '.') { z = (w - strlen(table->items[n] + 2)) / 2; if (z < 0) z = w; fprintf(out, "%*.*s%*s", w - z, w - z, table->items[n] + 2, z, ""); } else if (table->items[n][1] == '!') { mlwidth = w; mlpos = pos; mlstr = table->items[n] + 2; p = findstrbreak(&mlstr, w, &z); fprintf(out, "%.*s%*s", z, p, w - z, ""); } pos += w; } fputc('\n', out); while (mlstr && *mlstr) { p = findstrbreak(&mlstr, mlwidth, &w); fprintf(out, "%*s%.*s\n", mlpos, "", w, p); } } free(colsizes); } /* Display directory settings. */ static void printdirectories(void) { printf("Resource files read from: %s\n", resdir); printf("Level sets read from: %s\n", seriesdir); printf("Configured data files read from: %s\n", seriesdatdir); printf("Solution files saved in: %s\n", savedir); } /* * Callback functions for oshw. */ /* An input callback that only accepts the characters Y and N. */ static int yninputcallback(void) { switch (input(TRUE)) { case 'Y': case 'y': return 'Y'; case 'N': case 'n': return 'N'; case CmdWest: return '\b'; case CmdProceed: return '\n'; case CmdQuitLevel: return -1; case CmdQuit: exit(0); } return 0; } /* An input callback that accepts only alphabetic characters. */ static int keyinputcallback(void) { int ch; ch = input(TRUE); switch (ch) { case CmdWest: return '\b'; case CmdProceed: return '\n'; case CmdQuitLevel: return -1; case CmdQuit: exit(0); default: if (isalpha(ch)) return toupper(ch); } return 0; } /* An input callback used while displaying a scrolling list. */ static int scrollinputcallback(int *move) { int cmd; switch ((cmd = input(TRUE))) { case CmdPrev10: *move = SCROLL_HALFPAGE_UP; break; case CmdNorth: *move = SCROLL_UP; break; case CmdPrev: *move = SCROLL_UP; break; case CmdPrevLevel: *move = SCROLL_UP; break; case CmdSouth: *move = SCROLL_DN; break; case CmdNext: *move = SCROLL_DN; break; case CmdNextLevel: *move = SCROLL_DN; break; case CmdNext10: *move = SCROLL_HALFPAGE_DN; break; case CmdProceed: *move = CmdProceed; return FALSE; case CmdQuitLevel: *move = CmdQuitLevel; return FALSE; case CmdHelp: *move = CmdHelp; return FALSE; case CmdQuit: exit(0); } return TRUE; } /* An input callback used while displaying the scrolling list of scores. */ static int scorescrollinputcallback(int *move) { int cmd; switch ((cmd = input(TRUE))) { case CmdPrev10: *move = SCROLL_HALFPAGE_UP; break; case CmdNorth: *move = SCROLL_UP; break; case CmdPrev: *move = SCROLL_UP; break; case CmdPrevLevel: *move = SCROLL_UP; break; case CmdSouth: *move = SCROLL_DN; break; case CmdNext: *move = SCROLL_DN; break; case CmdNextLevel: *move = SCROLL_DN; break; case CmdNext10: *move = SCROLL_HALFPAGE_DN; break; case CmdProceed: *move = CmdProceed; return FALSE; case CmdSeeSolutionFiles: *move = CmdSeeSolutionFiles; return FALSE; case CmdQuitLevel: *move = CmdQuitLevel; return FALSE; case CmdHelp: *move = CmdHelp; return FALSE; case CmdQuit: exit(0); } return TRUE; } /* An input callback used while displaying the scrolling list of solutions. */ static int solutionscrollinputcallback(int *move) { int cmd; switch ((cmd = input(TRUE))) { case CmdPrev10: *move = SCROLL_HALFPAGE_UP; break; case CmdNorth: *move = SCROLL_UP; break; case CmdPrev: *move = SCROLL_UP; break; case CmdPrevLevel: *move = SCROLL_UP; break; case CmdSouth: *move = SCROLL_DN; break; case CmdNext: *move = SCROLL_DN; break; case CmdNextLevel: *move = SCROLL_DN; break; case CmdNext10: *move = SCROLL_HALFPAGE_DN; break; case CmdProceed: *move = CmdProceed; return FALSE; case CmdSeeScores: *move = CmdSeeScores; return FALSE; case CmdQuitLevel: *move = CmdQuitLevel; return FALSE; case CmdHelp: *move = CmdHelp; return FALSE; case CmdQuit: exit(0); } return TRUE; } /* * Basic game activities. */ /* Return TRUE if the given level is a final level. */ static int islastinseries(gamespec const *gs, int index) { return index == gs->series.count - 1 || gs->series.games[index].number == gs->series.final; } /* Return TRUE if the current level has a solution. */ static int issolved(gamespec const *gs, int index) { return hassolution(gs->series.games + index); } /* Mark the current level's solution as replaceable. */ static void replaceablesolution(gamespec *gs, int change) { if (change < 0) gs->series.games[gs->currentgame].sgflags ^= SGF_REPLACEABLE; else if (change > 0) gs->series.games[gs->currentgame].sgflags |= SGF_REPLACEABLE; else gs->series.games[gs->currentgame].sgflags &= ~SGF_REPLACEABLE; } /* Mark the current level's password as known to the user. */ static void passwordseen(gamespec *gs, int number) { if (!(gs->series.games[number].sgflags & SGF_HASPASSWD)) { gs->series.games[number].sgflags |= SGF_HASPASSWD; savesolutions(&gs->series); } } /* Change the current level, ensuring that the user is not granted * access to a forbidden level. FALSE is returned if the specified * level is not available to the user. */ static int setcurrentgame(gamespec *gs, int n) { if (n == gs->currentgame) return TRUE; if (n < 0 || n >= gs->series.count) return FALSE; if (gs->usepasswds) if (n > 0 && !(gs->series.games[n].sgflags & SGF_HASPASSWD) && !issolved(gs, n -1)) return FALSE; gs->currentgame = n; gs->melindacount = 0; return TRUE; } /* Change the current level by a delta value. If the user cannot go to * that level, the "nearest" level in that direction is chosen * instead. FALSE is returned if the current level remained unchanged. */ static int changecurrentgame(gamespec *gs, int offset) { int sign, m, n; if (offset == 0) return FALSE; m = gs->currentgame; n = m + offset; if (n < 0) n = 0; else if (n >= gs->series.count) n = gs->series.count - 1; if (gs->usepasswds && n > 0) { sign = offset < 0 ? -1 : +1; for ( ; n >= 0 && n < gs->series.count ; n += sign) { if (!n || (gs->series.games[n].sgflags & SGF_HASPASSWD) || issolved(gs, n - 1)) { m = n; break; } } n = m; if (n == gs->currentgame && offset != sign) { n = gs->currentgame + offset - sign; for ( ; n != gs->currentgame ; n -= sign) { if (n < 0 || n >= gs->series.count) continue; if (!n || (gs->series.games[n].sgflags & SGF_HASPASSWD) || issolved(gs, n - 1)) break; } } } if (n == gs->currentgame) return FALSE; gs->currentgame = n; gs->melindacount = 0; return TRUE; } /* Return TRUE if Melinda is watching Chip's progress on this level -- * i.e., if it is possible to earn a pass to the next level. */ static int melindawatching(gamespec const *gs) { if (!gs->usepasswds) return FALSE; if (islastinseries(gs, gs->currentgame)) return FALSE; if (gs->series.games[gs->currentgame + 1].sgflags & SGF_HASPASSWD) return FALSE; if (issolved(gs, gs->currentgame)) return FALSE; return TRUE; } /* * The subtitle stack */ static void pushsubtitle(char const *subtitle) { void **stk; int n; if (!subtitle) subtitle = ""; n = strlen(subtitle) + 1; stk = NULL; x_alloc(stk, sizeof(void**) + n); *stk = subtitlestack; subtitlestack = stk; memcpy(stk + 1, subtitle, n); setsubtitle(subtitle); } static void popsubtitle(void) { void **stk; if (subtitlestack) { stk = *subtitlestack; free(subtitlestack); subtitlestack = stk; } setsubtitle(subtitlestack ? (char*)(subtitlestack + 1) : NULL); } static void changesubtitle(char const *subtitle) { int n; if (!subtitle) subtitle = ""; n = strlen(subtitle) + 1; x_alloc(subtitlestack, sizeof(void**) + n); memcpy(subtitlestack + 1, subtitle, n); setsubtitle(subtitle); } /* * */ static void dohelp(int topic) { pushsubtitle("Help"); switch (topic) { case Help_First: case Help_FileListKeys: case Help_ScoreListKeys: onlinecontexthelp(topic); break; default: onlinemainhelp(topic); break; } popsubtitle(); } /* Display a scrolling list of the available solution files, and allow * the user to select one. Return TRUE if the user selected a solution * file different from the current one. Do nothing if there is only * one solution file available. (If for some reason the new solution * file cannot be read, TRUE will still be returned, as the list of * solved levels will still need to be updated.) */ static int showsolutionfiles(gamespec *gs) { tablespec table; char const **filelist; int readonly = FALSE; int count, current, f, n; if (haspathname(gs->series.name) || (gs->series.savefilename && haspathname(gs->series.savefilename))) { bell(); return FALSE; } else if (!createsolutionfilelist(&gs->series, FALSE, &filelist, &count, &table)) { bell(); return FALSE; } current = -1; n = 0; if (gs->series.savefilename) { for (n = 0 ; n < count ; ++n) if (!strcmp(filelist[n], gs->series.savefilename)) break; if (n == count) n = 0; else current = n; } pushsubtitle(gs->series.name); for (;;) { f = displaylist("SOLUTION FILES", &table, &n, LIST_SOLUTIONFILES, solutionscrollinputcallback); if (f == CmdProceed) { readonly = FALSE; break; } else if (f == CmdSeeScores) { readonly = TRUE; break; } else if (f == CmdQuitLevel) { n = -1; break; } else if (f == CmdHelp) { dohelp(Help_FileListKeys); } } popsubtitle(); f = n >= 0 && n != current; if (f) { clearsolutions(&gs->series); if (!gs->series.savefilename) gs->series.savefilename = getpathbuffer(); sprintf(gs->series.savefilename, "%.*s", getpathbufferlen(), filelist[n]); if (readsolutions(&gs->series)) { if (readonly) gs->series.gsflags |= GSF_NOSAVING; } else { bell(); } n = gs->currentgame; gs->currentgame = 0; passwordseen(gs, 0); changecurrentgame(gs, n); } freesolutionfilelist(filelist, &table); return f; } /* Display the scrolling list of the user's current scores, and allow * the user to select a current level. */ static int showscores(gamespec *gs) { tablespec table; int *levellist; int ret = FALSE; int count, f, n; restart: if (!createscorelist(&gs->series, gs->usepasswds, CHAR_MZERO, &levellist, &count, &table)) { bell(); return ret; } for (n = 0 ; n < count ; ++n) if (levellist[n] == gs->currentgame) break; pushsubtitle(gs->series.name); for (;;) { f = displaylist(gs->series.filebase, &table, &n, LIST_SCORES, scorescrollinputcallback); if (f == CmdProceed) { n = levellist[n]; break; } else if (f == CmdSeeSolutionFiles) { if (!(gs->series.gsflags & GSF_NODEFAULTSAVE)) { n = levellist[n]; break; } } else if (f == CmdQuitLevel) { n = -1; break; } else if (f == CmdHelp) { dohelp(Help_ScoreListKeys); } } popsubtitle(); freescorelist(levellist, &table); if (f == CmdSeeSolutionFiles) { setcurrentgame(gs, n); ret = showsolutionfiles(gs); goto restart; } if (n < 0) return ret; return setcurrentgame(gs, n) || ret; } /* Obtain a password from the user and move to the requested level. */ static int selectlevelbypassword(gamespec *gs) { char passwd[5] = ""; int n; setkeyboardinputmode(TRUE); n = displayinputprompt("Enter Password", passwd, 4, INPUT_ALPHA, keyinputcallback); setkeyboardinputmode(FALSE); if (!n) return FALSE; n = findlevelinseries(&gs->series, 0, passwd); if (n < 0) { bell(); return FALSE; } passwordseen(gs, n); return setcurrentgame(gs, n); } /* * The levelset history functions. */ /* Load the levelset history. */ static int loadhistory(void) { fileinfo file; char buf[256]; int n; char *hdate, *htime, *hpasswd, *hnumber, *hname; int hyear, hmon, hmday, hhour, hmin, hsec; history *h; historycount = 0; free(historylist); clearfileinfo(&file); if (!openfileindir(&file, savedir, "history", "r", NULL)) return FALSE; for (;;) { n = sizeof buf - 1; if (!filegetline(&file, buf, &n, NULL)) break; if (buf[0] == '#') continue; hdate = strtok(buf , " \t"); htime = strtok(NULL, " \t"); hpasswd = strtok(NULL, " \t"); hnumber = strtok(NULL, " \t"); hname = strtok(NULL, "\r\n"); if ( ! (hdate && htime && hpasswd && hnumber && hname && sscanf(hdate, "%d-%d-%d", &hyear, &hmon, &hmday) == 3 && sscanf(htime, "%d:%d:%d", &hhour, &hmin, &hsec) == 3 && *hpasswd && *hnumber && *hname) ) continue; ++historycount; x_alloc(historylist, historycount * sizeof *historylist); h = historylist + historycount - 1; sprintf(h->name, "%.*s", (int)(sizeof h->name - 1), hname); sprintf(h->passwd, "%.*s", (int)(sizeof h->passwd - 1), hpasswd); h->levelnumber = (int)strtol(hnumber, NULL, 0); h->dt.tm_year = hyear - 1900; h->dt.tm_mon = hmon - 1; h->dt.tm_mday = hmday; h->dt.tm_hour = hhour; h->dt.tm_min = hmin; h->dt.tm_sec = hsec; h->dt.tm_isdst = -1; } fileclose(&file, NULL); return TRUE; } /* Update the levelset history for the set and level being played. */ static void updatehistory(char const *name, char const *passwd, int number) { time_t t = time(NULL); int i, j; history *h; h = historylist; for (i = 0; i < historycount; ++i, ++h) { if (stricmp(h->name, name) == 0) break; } if (i == historycount) { ++historycount; x_alloc(historylist, historycount * sizeof *historylist); } for (j = i; j > 0; --j) { historylist[j] = historylist[j-1]; } h = historylist; sprintf(h->name, "%.*s", (int)(sizeof h->name - 1), name); sprintf(h->passwd, "%.*s", (int)(sizeof h->passwd - 1), passwd); h->levelnumber = number; h->dt = *localtime(&t); } /* Save the levelset history. */ static void savehistory(void) { fileinfo file; history *h; int i; clearfileinfo(&file); if (!openfileindir(&file, savedir, "history", "w", NULL)) return; h = historylist; for (i = 0; i < historycount; ++i, ++h) { fprintf(file.fp, "%04d-%02d-%02d %02d:%02d:%02d\t%s\t%d\t%s\n", 1900 + h->dt.tm_year, 1 + h->dt.tm_mon, h->dt.tm_mday, h->dt.tm_hour, h->dt.tm_min, h->dt.tm_sec, h->passwd, h->levelnumber, h->name); } fileclose(&file, NULL); } /* * The game-playing functions. */ #define leveldelta(n) if (!changecurrentgame(gs, (n))) { bell(); continue; } /* Get a key command from the user at the start of the current level. */ static int startinput(gamespec *gs) { static int lastlevel = -1; char yn[2]; int cmd, n; if (gs->currentgame != lastlevel) { lastlevel = gs->currentgame; setstepping(0, FALSE); } drawscreen(TRUE); gs->playmode = Play_None; for (;;) { cmd = input(TRUE); if (cmd >= CmdMoveFirst && cmd <= CmdMoveLast) { gs->playmode = Play_Normal; return cmd; } switch (cmd) { case CmdProceed: gs->playmode = Play_Normal; return cmd; case CmdQuitLevel: return cmd; case CmdPrev10: leveldelta(-10); return CmdNone; case CmdPrev: leveldelta(-1); return CmdNone; case CmdPrevLevel: leveldelta(-1); return CmdNone; case CmdNextLevel: leveldelta(+1); return CmdNone; case CmdNext: leveldelta(+1); return CmdNone; case CmdNext10: leveldelta(+10); return CmdNone; case CmdStepping: changestepping(4, TRUE); break; case CmdSubStepping: changestepping(1, TRUE); break; case CmdRandomFF: advanceinitrandomff(TRUE); break; case CmdVolumeUp: changevolume(+2, TRUE); break; case CmdVolumeDown: changevolume(-2, TRUE); break; case CmdHelp: dohelp(Help_KeysBetweenGames); break; case CmdQuit: exit(0); case CmdPlayback: case CmdAdvanceGame: case CmdAdvanceMoveGame: if (prepareplayback()) { gs->playmode = Play_Back; return cmd; } bell(); break; case CmdSeek: if (getreplaysecondstoskip() > 0) { gs->playmode = Play_Back; return CmdProceed; } break; case CmdCheckSolution: if (prepareplayback()) { gs->playmode = Play_Verify; return CmdProceed; } bell(); break; case CmdReplSolution: if (issolved(gs, gs->currentgame)) replaceablesolution(gs, -1); else bell(); break; case CmdKillSolution: if (!issolved(gs, gs->currentgame)) { bell(); break; } yn[0] = '\0'; setkeyboardinputmode(TRUE); n = displayinputprompt("Really delete solution?", yn, 1, INPUT_YESNO, yninputcallback); setkeyboardinputmode(FALSE); if (n && *yn == 'Y') if (deletesolution()) savesolutions(&gs->series); break; case CmdSeeScores: if (showscores(gs)) return CmdNone; break; case CmdSeeSolutionFiles: if (showsolutionfiles(gs)) return CmdNone; break; case CmdTimesClipboard: copytoclipboard(leveltimes(&gs->series)); break; case CmdGotoLevel: if (selectlevelbypassword(gs)) return CmdNone; break; case CmdKeys: n = 0; displaylist("", keyboardhelp(KEYHELP_TWPLUSPLUS), &n, LIST_HELP, NULL); return CmdNone; default: continue; } drawscreen(TRUE); } } /* Get a key command from the user at the completion of the current * level. */ static int endinput(gamespec *gs) { char yn[2]; int bscore = 0, tscore = 0; long gscore = 0; int n; int cmd = CmdNone; if (gs->status < 0) { if (melindawatching(gs) && secondsplayed() >= 10) { ++gs->melindacount; if (gs->melindacount >= 10) { yn[0] = '\0'; setkeyboardinputmode(TRUE); n = displayinputprompt("Skip level?", yn, 1, INPUT_YESNO, yninputcallback); setkeyboardinputmode(FALSE); if (n && *yn == 'Y') { passwordseen(gs, gs->currentgame + 1); changecurrentgame(gs, +1); } gs->melindacount = 0; return TRUE; } } } else { getscoresforlevel(&gs->series, gs->currentgame, &bscore, &tscore, &gscore); } cmd = displayendmessage(bscore, tscore, gscore, gs->status); for (;;) { if (cmd == CmdNone) cmd = input(TRUE); switch (cmd) { case CmdPrev10: changecurrentgame(gs, -10); return TRUE; case CmdPrevLevel: changecurrentgame(gs, -1); return TRUE; case CmdPrev: changecurrentgame(gs, -1); return TRUE; case CmdSameLevel: return TRUE; case CmdSame: return TRUE; case CmdNextLevel: changecurrentgame(gs, +1); return TRUE; case CmdNext: changecurrentgame(gs, +1); return TRUE; case CmdNext10: changecurrentgame(gs, +10); return TRUE; case CmdGotoLevel: selectlevelbypassword(gs); return TRUE; case CmdPlayback: return TRUE; case CmdSeeScores: showscores(gs); return TRUE; case CmdSeeSolutionFiles: showsolutionfiles(gs); return TRUE; case CmdKillSolution: return TRUE; case CmdHelp: dohelp(Help_KeysBetweenGames); return TRUE; case CmdQuitLevel: return FALSE; case CmdQuit: exit(0); case CmdCheckSolution: case CmdProceed: if (gs->status > 0) { if (islastinseries(gs, gs->currentgame)) gs->enddisplay = TRUE; else changecurrentgame(gs, +1); } return TRUE; case CmdReplSolution: if (issolved(gs, gs->currentgame)) replaceablesolution(gs, -1); else bell(); return TRUE; } cmd = CmdNone; } } /* Get a key command from the user at the completion of the current * series. */ static int finalinput(gamespec *gs) { int cmd; for (;;) { cmd = input(TRUE); switch (cmd) { case CmdSameLevel: case CmdSame: return TRUE; case CmdPrevLevel: case CmdPrev: case CmdNextLevel: case CmdNext: setcurrentgame(gs, 0); return TRUE; case CmdQuit: exit(0); default: return FALSE; } } } #define SETPAUSED(paused, shutter) do { \ if (paused) { \ setdisplaymsg("(paused)", FOREVER, FOREVER); \ setgameplaymode((shutter) ? SuspendPlayShuttered : SuspendPlay); \ if (shutter) drawscreen(TRUE); \ gamepaused = TRUE; \ } \ else { \ setdisplaymsg(NULL, 0, 0); \ setgameplaymode(NormalPlay); \ gamepaused = FALSE; \ } \ } while (0) /* Play the current level, using firstcmd as the initial key command, * and returning when the level's play ends. The return value is FALSE * if play ended because the user restarted or changed the current * level (indicating that the program should not prompt the user * before continuing). If the return value is TRUE, the gamespec * structure's status field will contain the return value of the last * call to doturn() -- i.e., positive if the level was completed * successfully, negative if the level ended unsuccessfully. Likewise, * the gamespec structure will be updated if the user ended play by * changing the current level. */ static int playgame(gamespec *gs, int firstcmd) { int render, lastrendered; int cmd, n; cmd = firstcmd; if (cmd == CmdProceed) cmd = CmdNone; gs->status = 0; setgameplaymode(NormalPlay); render = lastrendered = TRUE; int gamepaused = FALSE; for (;;) { if (gamepaused) cmd = input(TRUE); else { n = doturn(cmd); drawscreen(render); lastrendered = render; if (n) break; render = waitfortick() || noframeskip; cmd = input(FALSE); } if (cmd == CmdQuitLevel) { quitgamestate(); n = -2; setdisplaymsg(NULL, 0, 0); break; } if (!(cmd >= CmdMoveFirst && cmd <= CmdMoveLast)) { switch (cmd) { case CmdPreserve: break; case CmdPrevLevel: n = -1; goto quitloop; case CmdNextLevel: n = +1; goto quitloop; case CmdSameLevel: n = 0; goto quitloop; case CmdQuit: exit(0); case CmdVolumeUp: changevolume(+2, TRUE); cmd = CmdNone; break; case CmdVolumeDown: changevolume(-2, TRUE); cmd = CmdNone; break; case CmdPauseGame: SETPAUSED(!gamepaused, TRUE); if (!gamepaused) cmd = CmdNone; break; case CmdHelp: setgameplaymode(SuspendPlay); dohelp(Help_KeysDuringGame); if (!gamepaused) setgameplaymode(NormalPlay); cmd = CmdNone; break; #ifndef NDEBUG case CmdDebugCmd1: break; case CmdDebugCmd2: break; case CmdCheatNorth: case CmdCheatWest: break; case CmdCheatSouth: case CmdCheatEast: break; case CmdCheatHome: break; case CmdCheatKeyRed: case CmdCheatKeyBlue: break; case CmdCheatKeyYellow: case CmdCheatKeyGreen: break; case CmdCheatBootsIce: case CmdCheatBootsSlide: break; case CmdCheatBootsFire: case CmdCheatBootsWater: break; case CmdCheatICChip: break; #endif default: cmd = CmdNone; break; } } } if (!lastrendered) drawscreen(TRUE); setgameplaymode(EndPlay); if (n > 0) if (replacesolution()) savesolutions(&gs->series); gs->status = n; return TRUE; quitloop: setdisplaymsg(NULL, 0, 0); if (!lastrendered) drawscreen(TRUE); quitgamestate(); setgameplaymode(EndPlay); if (n) changecurrentgame(gs, n); return FALSE; } /* Skip past secondstoskip seconds from the beginning of the solution. */ static int hideandseek(gamespec *gs, int secondstoskip) { int n = 0; quitgamestate(); setgameplaymode(EndPlay); gs->playmode = Play_None; endgamestate(); initgamestate(gs->series.games + gs->currentgame, gs->series.ruleset); prepareplayback(); gs->playmode = Play_Back; gs->status = 0; setgameplaymode(NonrenderPlay); while (secondsplayed() < secondstoskip) { n = doturn(CmdNone); if (n) break; advancetick(); } drawscreen(TRUE); setsoundeffects(-1); setgameplaymode(NormalPlay); return n; } /* Advance play by numticks ticks. */ static int advancegame(gamespec *gs, int numticks) { int n = 0; setgameplaymode(NonrenderPlay); while (numticks--) { n = doturn(CmdNone); if (n) break; advancetick(); } drawscreen(TRUE); setsoundeffects(-1); setgameplaymode(SuspendPlay); return n; } #define ADVANCEGAME(cmd) do { \ int skipticks; \ if ((cmd) == CmdAdvanceMoveGame) \ skipticks = 4; \ else if (gs->series.ruleset == Ruleset_MS) \ skipticks = 2; \ else \ skipticks = 1; \ n = advancegame(gs, skipticks); \ lastrendered = TRUE; \ SETPAUSED(TRUE, FALSE); \ } while (0) /* Play back the user's best solution for the current level in real * time. Other than the fact that this function runs from a * prerecorded series of moves, it has the same behavior as * playgame(). */ static int playbackgame(gamespec *gs, int initcmd) { int render, lastrendered, n = 0, cmd; int secondstoskip; int gamepaused = FALSE; secondstoskip = getreplaysecondstoskip(); if (secondstoskip > 0) { n = hideandseek(gs, secondstoskip); SETPAUSED(TRUE, FALSE); } else if ((initcmd == CmdAdvanceGame) || (initcmd == CmdAdvanceMoveGame)) ADVANCEGAME(initcmd); else { drawscreen(TRUE); gs->status = 0; setgameplaymode(NormalPlay); } render = lastrendered = TRUE; while (!n) { if (gamepaused) { setgameplaymode(SuspendPlay); cmd = input(TRUE); } else { n = doturn(CmdNone); drawscreen(render); lastrendered = render; if (n) break; render = waitfortick() || noframeskip; cmd = input(FALSE); } switch (cmd) { case CmdSeek: case CmdPrev10: case CmdNext10: if (cmd == CmdSeek) { secondstoskip = getreplaysecondstoskip(); } else { secondstoskip = secondsplayed() + ((cmd == CmdNext10) ? +10 : -10); } n = hideandseek(gs, secondstoskip); lastrendered = TRUE; break; case CmdPrevLevel: changecurrentgame(gs, -1); goto quitloop; case CmdNextLevel: changecurrentgame(gs, +1); goto quitloop; case CmdSameLevel: goto quitloop; case CmdPlayback: goto quitloop; case CmdQuitLevel: goto quitloop; case CmdQuit: exit(0); case CmdVolumeUp: changevolume(+2, TRUE); break; case CmdVolumeDown: changevolume(-2, TRUE); break; case CmdPauseGame: SETPAUSED(!gamepaused, FALSE); break; case CmdShowInitState: toggleshowinitstate(); drawscreen(TRUE); break; case CmdAdvanceGame: case CmdAdvanceMoveGame: ADVANCEGAME(cmd); break; case CmdHelp: setgameplaymode(SuspendPlay); dohelp(Help_None); if (!gamepaused) setgameplaymode(NormalPlay); break; } } setdisplaymsg(NULL, 0, 0); if (!lastrendered) drawscreen(TRUE); setgameplaymode(EndPlay); gs->playmode = Play_None; if (n < 0) replaceablesolution(gs, +1); if (n > 0) { if (checksolution()) savesolutions(&gs->series); } gs->status = n; return TRUE; quitloop: setdisplaymsg(NULL, 0, 0); if (!lastrendered) drawscreen(TRUE); quitgamestate(); setgameplaymode(EndPlay); gs->playmode = Play_None; return FALSE; } #undef ADVANCEGAME #undef SETPAUSED /* Quickly play back the user's best solution for the current level * without rendering and without using the timer the keyboard. The * playback stops when the solution is finished or gameplay has * ended. */ static int verifyplayback(gamespec *gs) { int n; gs->status = 0; setdisplaymsg("Verifying ...", FOREVER, 0); setgameplaymode(NonrenderPlay); for (;;) { n = doturn(CmdNone); if (n) break; advancetick(); switch (input(FALSE)) { case CmdPrevLevel: changecurrentgame(gs, -1); goto quitloop; case CmdNextLevel: changecurrentgame(gs, +1); goto quitloop; case CmdSameLevel: goto quitloop; case CmdPlayback: goto quitloop; case CmdQuitLevel: goto quitloop; case CmdQuit: exit(0); } } gs->playmode = Play_None; quitgamestate(); setdisplaymsg(NULL, 0, 0); drawscreen(TRUE); setgameplaymode(EndPlay); if (n < 0) { #ifndef TWORLDPLUSPLUS setdisplaymsg("Invalid solution!", 1, 1); #endif replaceablesolution(gs, +1); } if (n > 0) { if (checksolution()) savesolutions(&gs->series); } gs->status = n; return TRUE; quitloop: setdisplaymsg(NULL, 0, 0); gs->playmode = Play_None; setgameplaymode(EndPlay); return FALSE; } /* Manage a single session of playing the current level, from start to * finish. A return value of FALSE indicates that the user is done * playing levels from the current series; otherwise, the gamespec * structure is updated as necessary upon return. */ static int runcurrentlevel(gamespec *gs) { int ret = TRUE; int cmd; int valid, f; char const *name; name = gs->series.filebase; updatehistory(skippathname(name), gs->series.games[gs->currentgame].passwd, gs->series.games[gs->currentgame].number); if (gs->enddisplay) { gs->enddisplay = FALSE; changesubtitle(NULL); setenddisplay(); drawscreen(TRUE); displayendmessage(0, 0, 0, 0); endgamestate(); return finalinput(gs); } valid = initgamestate(gs->series.games + gs->currentgame, gs->series.ruleset); changesubtitle(gs->series.games[gs->currentgame].name); passwordseen(gs, gs->currentgame); if (!islastinseries(gs, gs->currentgame)) if (!valid || gs->series.games[gs->currentgame].unsolvable) passwordseen(gs, gs->currentgame + 1); cmd = startinput(gs); if (cmd == CmdQuitLevel) { ret = FALSE; } else { if (cmd != CmdNone) { if (valid) { switch (gs->playmode) { case Play_Normal: f = playgame(gs, cmd); break; case Play_Back: f = playbackgame(gs, cmd); break; case Play_Verify: f = verifyplayback(gs); break; default: f = FALSE; break; } if (f) ret = endinput(gs); } else bell(); } } endgamestate(); return ret; } static int batchverify(gameseries *series, int display) { gamesetup *game; int valid = 0, invalid = 0; int i, f; batchmode = TRUE; for (i = 0, game = series->games ; i < series->count ; ++i, ++game) { if (!hassolution(game)) continue; if (initgamestate(game, series->ruleset) && prepareplayback()) { setgameplaymode(NonrenderPlay); while (!(f = doturn(CmdNone))) advancetick(); setgameplaymode(EndPlay); if (f > 0) { ++valid; checksolution(); } else { ++invalid; game->sgflags |= SGF_REPLACEABLE; if (display) printf("Solution for level %d is invalid\n", game->number); } } endgamestate(); } if (display) { if (valid + invalid == 0) { printf("No solutions were found.\n"); } else { printf(" Valid solutions:%4d\n", valid); printf("Invalid solutions:%4d\n", invalid); } } return invalid; } /* * Game selection functions */ /* Set the current level to that specified in the history. */ static void findlevelfromhistory(gamespec *gs, char const *name) { int i, n; history *h; name = skippathname(name); h = historylist; for (i = 0; i < historycount; ++i, ++h) { if (stricmp(h->name, name) == 0) { n = findlevelinseries(&gs->series, h->levelnumber, h->passwd); if (n < 0) n = findlevelinseries(&gs->series, 0, h->passwd); if (n >= 0) { gs->currentgame = n; if (gs->usepasswds && !(gs->series.games[n].sgflags & SGF_HASPASSWD)) changecurrentgame(gs, -1); } break; } } } #define PRODUCE_SINGLE_COLUMN_TABLE(table, heading, data, count, L, R) do { \ size_t _alloc = 0; \ _alloc += 3 + strlen(heading); \ for (int _n = 0; _n < (count); ++_n) \ _alloc += 3 + strlen(L(data)[_n] R); \ char const **_ptrs = malloc(((count) + 1) * sizeof *_ptrs); \ char *_textheap = malloc(_alloc); \ if (!_ptrs || !_textheap) memerrexit(); \ \ int _n = 0; \ int _used = 0; \ _ptrs[_n++] = _textheap + _used; \ _used += 1 + sprintf(_textheap + _used, "1-" heading); \ \ for (int _y = 0 ; _y < (count) ; ++_y) { \ _ptrs[_n++] = _textheap + _used; \ _used += 1 + sprintf(_textheap + _used, \ "1-%s", L(data)[_y] R); \ } \ (table).rows = (count) + 1; \ (table).cols = 1; \ (table).sep = 0; \ (table).collapse = 0; \ (table).items = _ptrs; \ } while (0) #ifdef TWPLUSPLUS /* Free a table generated by the preceding macro */ static void free_table(tablespec * table) { free((void*)table->items[0]); free(table->items); } /* Determine the index in series->mflist where the gameseries with index idx * is found. Returns 0 if there is no such index. */ static int findseries(seriesdata *series, int idx) { for (int n = 0; n < series->mfcount; ++n) { mapfileinfo *mfi = &series->mflist[n]; for (int i = Ruleset_First; i < Ruleset_Count; ++i) { intlist *gsl = &mfi->sfilelst[i]; for (int j = 0; j < gsl->count; ++j) { if (gsl->list[j] == idx) return n; } } } return 0; } #endif /* Helper function for selectseriesandlevel */ static int chooseseries(seriesdata *series, int *pn, int founddefault) { #ifndef TWPLUSPLUS return displaylist(" Welcome to Tile World. Type ? or F1 for help.", &series->table, pn, LIST_SERIES, scrollinputcallback); #else tablespec mftable; PRODUCE_SINGLE_COLUMN_TABLE(mftable, "Levelset", series->mflist, series->mfcount, , .filename); /* Choose mapfile to be selected by default */ int n = (founddefault ? findseries(series, *pn) : 0); int chosenseries = -1; while (chosenseries < 0) { int f = displaylist("", &mftable, &n, LIST_MAPFILES, scrollinputcallback); if (f != CmdProceed) { free_table(&mftable); return f; } int ruleset = getselectedruleset(); intlist *chosengsl = &series->mflist[n].sfilelst[ruleset]; if (chosengsl->count < 1) /* Can happen if .dac name was taken */ continue; if (chosengsl->count == 1) chosenseries = chosengsl->list[0]; else { tablespec gstable; PRODUCE_SINGLE_COLUMN_TABLE(gstable, "Profile", chosengsl->list, chosengsl->count, series->list[,].filebase); int m = 0; for (;;) { f = displaylist("", &gstable, &m, LIST_SERIES, scrollinputcallback); if (f == CmdProceed) { chosenseries = chosengsl->list[m]; break; } else if (f == CmdQuitLevel) break; } free_table(&gstable); } } free_table(&mftable); *pn = chosenseries; return CmdProceed; #endif } /* Display the full selection of available series to the user as a * scrolling list, and permit one to be selected. When one is chosen, * pick one of levels to be the current level. All fields of the * gamespec structure are initialized. If autosel is TRUE, then the * function will skip the display if there is only one series * available. If defaultseries is not NULL, and matches the name of * one of the series in the array, then the scrolling list will be * initialized with that series selected. If defaultlevel is not zero, * and a level in the selected series that the user is permitted to * access matches it, then that level will be the initial current * level. The return value is zero if nothing was selected, negative * if an error occurred, or positive otherwise. */ static int selectseriesandlevel(gamespec *gs, seriesdata *series, int autosel, char const *defaultseries, int defaultlevel) { int okay, f, n; if (series->count < 1) { errmsg(NULL, "no level sets found"); return -1; } okay = TRUE; if (series->count == 1 && autosel) { getseriesfromlist(&gs->series, series->list, 0); } else { n = 0; int founddefault = FALSE; if (defaultseries) { n = series->count; while (n) if (!strcmp(series->list[--n].filebase, defaultseries)) { founddefault = TRUE; break; } } for (;;) { f = chooseseries(series, &n, founddefault); if (f == CmdProceed) { getseriesfromlist(&gs->series, series->list, n); okay = TRUE; break; } else if (f == CmdQuitLevel) { okay = FALSE; break; } else if (f == CmdHelp) { pushsubtitle("Help"); dohelp(Help_First); popsubtitle(); } } } freeserieslist(series->list, series->count, series->mflist, series->mfcount, &series->table); if (!okay) return 0; setstringsetting("selectedseries", gs->series.filebase); if (!readseriesfile(&gs->series)) { errmsg(gs->series.filebase, "cannot read data file"); freeseriesdata(&gs->series); return -1; } if (gs->series.count < 1) { errmsg(gs->series.filebase, "no levels found in data file"); freeseriesdata(&gs->series); return -1; } gs->enddisplay = FALSE; gs->playmode = Play_None; gs->usepasswds = usepasswds && !(gs->series.gsflags & GSF_IGNOREPASSWDS); gs->currentgame = -1; gs->melindacount = 0; if (defaultlevel) { n = findlevelinseries(&gs->series, defaultlevel, NULL); if (n >= 0) { gs->currentgame = n; if (gs->usepasswds && !(gs->series.games[n].sgflags & SGF_HASPASSWD)) changecurrentgame(gs, -1); } } if (gs->currentgame < 0) findlevelfromhistory(gs, gs->series.filebase); if (gs->currentgame < 0) { gs->currentgame = 0; for (n = 0 ; n < gs->series.count ; ++n) { if (!issolved(gs, n)) { gs->currentgame = n; break; } } } return +1; } /* Get the list of available series and permit the user to select one * to play. If lastseries is not NULL, use that series as the default. * The return value is zero if nothing was selected, negative if an * error occurred, or positive otherwise. */ static int choosegame(gamespec *gs, char const *lastseries) { seriesdata s; if (!createserieslist(NULL, &s.list, &s.count, &s.mflist, &s.mfcount, &s.table)) return -1; return selectseriesandlevel(gs, &s, FALSE, lastseries, 0); } /* * Initialization functions. */ /* Set the four directories that the program uses (the series * directory, the series data directory, the resource directory, and * the save directory). Any or all of the arguments can be NULL, * indicating that the default value should be used. The environment * variables TWORLDDIR, TWORLDSAVEDIR, and HOME can define the default * values. If any or all of these are unset, the program will use the * default values it was compiled with. */ static void initdirs(char const *series, char const *seriesdat, char const *res, char const *save) { unsigned int maxpath; char const *root = NULL; char const *dir; maxpath = getpathbufferlen(); if (series && strlen(series) >= maxpath) { errmsg(NULL, "Data (-D) directory name is too long;" " using default value instead"); series = NULL; } if (seriesdat && strlen(seriesdat) >= maxpath) { errmsg(NULL, "Configured data (-C) directory name is too long;" " using default value instead"); seriesdat = NULL; } if (res && strlen(res) >= maxpath) { errmsg(NULL, "Resource (-R) directory name is too long;" " using default value instead"); res = NULL; } if (save && strlen(save) >= maxpath) { errmsg(NULL, "Save (-S) directory name is too long;" " using default value instead"); save = NULL; } if (!save && (dir = getenv("TWORLDSAVEDIR")) && *dir) { if (strlen(dir) < maxpath) save = dir; else warn("Value of environment variable TWORLDSAVEDIR is too long"); } if (!res || !series || !seriesdat) { if ((dir = getenv("TWORLDDIR")) && *dir) { if (strlen(dir) < maxpath - 8) root = dir; else warn("Value of environment variable TWORLDDIR is too long"); } if (!root) { #ifdef ROOTDIR root = ROOTDIR; #else root = "."; #endif } } resdir = getpathbuffer(); if (res) strcpy(resdir, res); else combinepath(resdir, root, "res"); seriesdir = getpathbuffer(); if (series) strcpy(seriesdir, series); else combinepath(seriesdir, root, "sets"); seriesdatdir = getpathbuffer(); if (seriesdat) strcpy(seriesdatdir, seriesdat); else combinepath(seriesdatdir, root, "data"); savedir = getpathbuffer(); if (!save) { #ifdef SAVEDIR save = SAVEDIR; #else if ((dir = getenv("HOME")) && *dir && strlen(dir) < maxpath - 8) combinepath(savedir, dir, ".tworld"); else combinepath(savedir, root, "save"); #endif } else { strcpy(savedir, save); } } /* Parse the command-line options and arguments, and initialize the * user-controlled options. */ static int initoptionswithcmdline(int argc, char *argv[], startupdata *start) { cmdlineinfo opts; char const *optresdir = NULL; char const *optseriesdir = NULL; char const *optseriesdatdir = NULL; char const *optsavedir = NULL; char buf[256]; int listdirs, pedantic; int ch, n; char *p; start->filename = getpathbuffer(); *start->filename = '\0'; start->savefilename = NULL; start->levelnum = 0; start->listseries = FALSE; start->listscores = FALSE; start->listtimes = FALSE; start->batchverify = FALSE; listdirs = FALSE; pedantic = FALSE; mudsucking = 1; soundbufsize = 0; volumelevel = -1; initoptions(&opts, argc - 1, argv + 1, "abD:dFfHhL:lm:n:PpqR:rS:stVv"); while ((ch = readoption(&opts)) >= 0) { switch (ch) { case 0: if (start->savefilename && start->levelnum) { fprintf(stderr, "too many arguments: %s\n", opts.val); printtable(stderr, yowzitch); return FALSE; } if (!start->levelnum && (n = (int)strtol(opts.val, &p, 10)) > 0 && *p == '\0') { start->levelnum = n; } else if (*start->filename) { start->savefilename = getpathbuffer(); sprintf(start->savefilename, "%.*s", getpathbufferlen(), opts.val); } else { sprintf(start->filename, "%.*s", getpathbufferlen(), opts.val); } break; case 'D': optseriesdatdir = opts.val; break; case 'L': optseriesdir = opts.val; break; case 'R': optresdir = opts.val; break; case 'S': optsavedir = opts.val; break; case 'H': showhistogram = !showhistogram; break; case 'f': noframeskip = !noframeskip; break; case 'F': fullscreen = !fullscreen; break; case 'p': usepasswds = !usepasswds; break; case 'q': silence = !silence; break; case 'r': readonly = !readonly; break; case 'P': pedantic = !pedantic; break; case 'a': ++soundbufsize; break; case 'd': listdirs = TRUE; break; case 'l': start->listseries = TRUE; break; case 's': start->listscores = TRUE; break; case 't': start->listtimes = TRUE; break; case 'b': start->batchverify = TRUE; break; case 'm': mudsucking = atoi(opts.val); break; case 'n': volumelevel = atoi(opts.val); break; case 'h': printtable(stdout, yowzitch); exit(EXIT_SUCCESS); case 'v': puts(VERSION); exit(EXIT_SUCCESS); case 'V': printtable(stdout, vourzhon); exit(EXIT_SUCCESS); case ':': fprintf(stderr, "option requires an argument: -%c\n", opts.opt); printtable(stderr, yowzitch); return FALSE; case '?': fprintf(stderr, "unrecognized option: -%c\n", opts.opt); printtable(stderr, yowzitch); return FALSE; default: printtable(stderr, yowzitch); return FALSE; } } if (pedantic) setpedanticmode(); initdirs(optseriesdir, optseriesdatdir, optresdir, optsavedir); if (listdirs) { printdirectories(); exit(EXIT_SUCCESS); } if (*start->filename && !start->savefilename) { if (loadsolutionsetname(start->filename, buf) > 0) { start->savefilename = getpathbuffer(); strcpy(start->savefilename, start->filename); strcpy(start->filename, buf); } } if (start->listscores || start->listtimes || start->batchverify || start->levelnum) if (!*start->filename) strcpy(start->filename, "chips.dat"); return TRUE; } /* Run the initialization routines of oshw and the resource module. */ static int initializesystem(void) { #ifdef NDEBUG mudsucking = 1; #endif setmudsuckingfactor(mudsucking); if (!oshwinitialize(silence, soundbufsize, showhistogram, fullscreen)) return FALSE; if (!initresources()) return FALSE; setkeyboardrepeat(TRUE); if (volumelevel < 0) volumelevel = getintsetting("volume"); if (volumelevel >= 0) setvolume(volumelevel, FALSE); return TRUE; } /* Time for everyone to clean up and go home. */ static void shutdownsystem(void) { savesettings(); savehistory(); shutdowngamestate(); freeallresources(); free(resdir); free(seriesdir); free(seriesdatdir); free(savedir); } /* Determine what to play. A list of available series is drawn up; if * only one is found, it is selected automatically. Otherwise, if the * listseries option is TRUE, the available series are displayed on * stdout and the program exits. Otherwise, if listscores or listtimes * is TRUE, the scores or times for a single series is display on * stdout and the program exits. (These options need to be checked for * before initializing the graphics subsystem.) Otherwise, the * selectseriesandlevel() function handles the rest of the work. Note * that this function is only called during the initial startup; if * the user returns to the series list later on, the choosegame() * function is called instead. */ static int choosegameatstartup(gamespec *gs, char const *lastseries, startupdata const *start) { seriesdata series; tablespec table; int n; if (!createserieslist(start->filename, &series.list, &series.count, &series.mflist, &series.mfcount, &series.table)) return -1; free(start->filename); if (series.count <= 0) { errmsg(NULL, "no level sets found"); return -1; } if (start->listseries) { printtable(stdout, &series.table); if (!series.count) puts("(no files)"); return 0; } if (series.count == 1) { if (start->savefilename) series.list[0].savefilename = start->savefilename; if (!readseriesfile(series.list)) { errmsg(series.list[0].filebase, "cannot read level set"); return -1; } if (start->batchverify) { n = batchverify(series.list, !silence && !start->listtimes && !start->listscores); if (silence) exit(n > 100 ? 100 : n); else if (!start->listtimes && !start->listscores) return 0; } if (start->listscores) { if (!createscorelist(series.list, usepasswds, '0', NULL, NULL, &table)) return -1; freeserieslist(series.list, series.count, series.mflist, series.mfcount, &series.table); printtable(stdout, &table); freescorelist(NULL, &table); return 0; } if (start->listtimes) { if (!createtimelist(series.list, series.list->ruleset == Ruleset_MS ? 10 : 100, '0', NULL, NULL, &table)) return -1; freeserieslist(series.list, series.count, series.mflist, series.mfcount, &series.table); printtable(stdout, &table); freetimelist(NULL, &table); return 0; } } if (!initializesystem()) { errmsg(NULL, "cannot initialize program due to previous errors"); return -1; } /* extensions cannot be read until the system is initialized */ if (series.count == 1) readextensions(series.list); return selectseriesandlevel(gs, &series, TRUE, lastseries, start->levelnum); } /* * The main function. */ int tworld(int argc, char *argv[]) { startupdata start; gamespec spec; char lastseries[sizeof spec.series.filebase]; int f; if (!initoptionswithcmdline(argc, argv, &start)) return EXIT_FAILURE; loadhistory(); loadsettings(); atexit(shutdownsystem); char const *selectedseries = getstringsetting("selectedseries"); if (selectedseries && strlen(selectedseries) < sizeof lastseries) strcpy(lastseries, selectedseries); else lastseries[0] = '\0'; if (getintsetting("showinitstate") > 0) toggleshowinitstate(); f = choosegameatstartup(&spec, lastseries, &start); if (f < 0) return EXIT_FAILURE; else if (f == 0) return EXIT_SUCCESS; while (f > 0) { pushsubtitle(NULL); while (runcurrentlevel(&spec)) { } savehistory(); popsubtitle(); cleardisplay(); strcpy(lastseries, spec.series.filebase); freeseriesdata(&spec.series); f = choosegame(&spec, lastseries); }; return (f == 0 ? EXIT_SUCCESS : EXIT_FAILURE); } tworld-2.3.0/tworld.ico000066400000000000000000000162761475511570500150640ustar00rootroot0000000000000000(0`ZZZ^^^ZZZZZZFFF"""""""""222>>>BBB>>:::666666666666:::666:::666::::::666666666666127222...&&&"""***222:::666666:::ZZZZZZ^^^^^^>>>"""""":::BBBZZZ|~|dfeTVVMNNFFFBBB666::::::666666666:::666666666666666:::666::::6/127...&&&"""&&&222666666::::::ZZZZZZ^^^^^^666***:::BBBIJJX^XrvrMNNFFF666666666666666:::666666666:::666666666666666666127...&&&"""&&&222666666:::666ZZZ^^^^^^^^^222"""2229>9BBBLbuCR^IJJIJJMNNIJJ>>>666666666666:::666666666666666666666:::666:::666666.2.***"""""""""&&&.2.666666666:::ZZZ^^^ZZZZZZ***"""&&&666>>>ENWbNg{[n~CR^IJJFFF>>>>>>>>>::::::666666666:::666:::666::::::666666666666222..."""&&&222666::::::666ZZZZZZ^^^^^^&&&"""...666BBBHYfO^lENW`qIJJMNNZZZMNNFFFBBBFFFBBBBBB>>>:::666:::666666666666666:::666666666...&&&"""...666666666:::ZZZ^^^X^X^^^"""""""""...:::>B>9>BBBBBBBMNNFFFdfe~~jjjRRRFFFBBBBBBBBBBBB>>>::::::666666666666666:::666***"""...6:6>>>4:?:::666ZZZZZZ^^^ZZZ"""&&&.2.666@Xj[wHYfENWBBBBBBBBBBFBIJJTVVjjjwzv`b`MNNFFFBFBBBBBBB>>>>>>::::::666666222""""""***:::9>BFFFBBBBBBBBBZZZ^^^^^^TVV""""""***222*5;[w@XjLbuHYf>B>>>>BBB>B>9>BBBBBBBFFFFFFMNN`b`|~|trrZZZIJJFFFBBBBBBBBB>>>>>>..."""...:::MNNdfeMNNZZZ^^^^^^JRX"""******6664:?666JRXBBB*5;::::::4:?>>>>>>BBB>>>BBBBBBBBBBFBFFFMNNTVVtrrjjjMNNFFFBBB>>>&&&666BBBIJJtrrZZZX^X^^^MNN"""******ENW6>F6662222221276666666:66:69>9>>>9>9>>>9>B>B>BBBBBBBBBBBBFFFFFFIJJRRRdfe|~|9>B:::BBBN^fFV^FFFFFFFFF^^^^^^^^^IJJ""""""&&&&&&*5;[wC^rNg{*5;..........2.222:6/F8ZB^F^FVF)9>9:::>>>9>B9>B>>>BBBBBBBBBFFFFFFFFFMNNZZZrvr|~|>>>CMRVzLbuNg{IJJ>>>j^b^^^^^^BBB""""""127*5;4:?F^n***************;.Z:iFuNVVZVVrRbJVF)FB6BBB>>>BBBBBBBBBFFFFFFFFFFFFFFFFFF>B>ENWRbO^l:::666jjj`b`j^b>>>"""***127""""""""""&"&&&"&";.^>oJ|RVYbh"h__ZZ_VnRFB6>>>>B>BBBBBB>>>>B>9>B9>B9FPBBB:::666:::222...jjjdfedfe6:6IJJXjyLbuJV^""""Z:dBoJuN|RVV^j*vBIIz6pbg_nR>>>4:?>>>>>>>>>4:?FFF[wNg{Lbu:::222...222knlknldfe127""""""ENW127@XjENWH4 Z:Z:^>dBoJoJuN|RV|RVYh"Ij^pgVF):::::::::::::::CR^^>Z:Z:Z:dBiFiFoJuN|RV_ZbhnbJ162:::::::::9>B:::666666222...222...222trrknl`b`"""""""""QbmLbu@Xj6>F"""*5;[wcvZ@ Z:Z:^>^>^>Z:Z:Z:Z:^>^>oJ|RVZbnQA&6666666664:?RoNg{HYf666***............trrknlMNN""""""CR^*5;`q...".>Fjv~[n~bZBZ:Z:Z:Z:Z:Z:Z:Z:^>^>^>dBoJuN|RZ_222162666666ENWZ:Z:Z:Z:Z:Z:Z:Z:^>dBiF|RV_^F666*5;666:::666222666...***222222.........knlZZZ"""&&&`qC^rZfr***"""9FPjzcr~VJ*[n~fjeZ:^>H4 ;.;.H4 H4 Z:^>Z:iFiFoJuNZZ1626666666:6RoNg{O^l666***...222.......2.222jjj:::""""""2229>>>>>>9>99>9:::6:6.2.22&F8*.*.2.666>>>>>>222127...***.......2.......:::127~R'+%"127[n~Ng{Zck"RVRjzcv9FP`qENWcr~rzXjy""".2.9>9>B>:B::B:>B>>B>:B:9>9:B:>>>9>9:::6:6.2.2224:?9BFBBJBBJB>F>>B>:B:9>9:B:>B>>>>:B::B::B:>>>:B:9>99>9:::::*.2....*.*...4:?XjyXjy222ܖ.f**vzzFnr*cvnNVz.:jv~fNZXjyo~~N222"".2.>B>fjez~rvrZbZLRMFNFBFB>F>>F>>B>>B>:B::B:>>>9>99>99>9>>>>>>9>99>99>9O^lLbu\jn...޾zzܨ>:`qjznNVcv.6|jvr[w9FP"""***9>9BFBFNFLRMRVRdfervr|~|fjeTZRFNFFJFBFB>F>>F>>F>>B>:B::B::B::B:>B>JV^O^lcr~222ިBr ҺޒZ¼2~R`qnrm`qbVj TZR@Xj&&&'+%6:6>B>FJFFNFFNFFJFFNFFNFJNJLRMLRMTZRknlwzv~~nrmZbZLRMBJBBJB>F>>B>>B>>B>ENW[n~[n~...ފ 62^^cvo~[w~`qo~Zfr*5;""""&"162:B:BJBFNFFNFFJFFJFFNFFJFFJFFNFFJFFNFJNJFNFJNJFNFLRMX^Xknlwzv|~||~|rvrdfeTZRJNJ\jnjzBBB222ިފnN."rV``qZfr`qffnZbzVz127"162>B>FJFFNFFJFFJFFNFFNFFJFFNFFNFFJFFNFFJFFNFFJFFNFFNFFNFFJFFJFFNFJNJLRMRVRZbZknlTZRN^f9BJBFJFFJFFJFFNFFNFFJFFJFFNFFJFFJFFNFFJFFNFFJFFNFFJFFJFFJFFNFFNFFJFFNFFNFFNFFNFR^b222222...22262VPzr`qz~o~fo~rXjy.>F"...9>9BJBBJBFNFFNFFNFFJFBJBFNFFNFFJFFNFFNFFJFFNFFJFFNFFJFFNFFNFFNFFJFFJFFNFFJFFJFFJFQbm9>B............>"..rV`"jzl}[n~cowF^n&&&'+%6:6>F>FNFFJFFJFFJFBJBBJBwzvknlwzvfjeFJFFJFFNFFJFFNFFJFFNFFJFFJFFJFFNFFNFFJFFNFFFF222222...222...222"޾vo~knljzknl[n~l}O^l*5;"'+%6:6BFBBJBFJFFNFFNFFNFFNF`b`LRMFJFZbZrvrfjeFNFFNFFJFFNFFJFFNFFJFFNFFNFFNFFJFFJFJNJHYf127..................ܨ֖|l}jzf>z[w*5;"""162>B>FJFFJFFJFFNFFJFFJFX^XUZVFJFFNFFJFFJFX^XFNFFJFFNFFJFFNFFJFFNFFJFFJFFJFFNFcow222............222...222zzjzl}~6:6***"""162>B>BJBBJBFNFFNFFJFFNFLRMwzvFNFnrmrvrRVRFNFRVRknlX^XfjefjeFJFFNFFJFFNFJNJLRM`q~~...222...222............rzr[w9FP""".2.:B:BFBBJBFJFFNFBJBFJFFNFknlnrmwzvrvrFJFZbZX^XFNFTZRfjefjeFNFFNFFNFFJFFNFLRM~.........222...222...222zl}Zck9FP"&"*.*9>9>F>FNFFNFFNFFJFFNFLRMwzvrvrrvrZbZLRMFNFFNF|~|knlfjeZbZFJFFJFFJFFJFFJFFNFMNN|...222..................rjz@Xj"""'+%6:6>F>FJFFJFFJFFJFBJBLRM`b``b`jjjdfenrmFJFZbZfjeX^XknlLRMFNFFNFFNFFNFFNFUZV222222...............222127"&"666>F>FJFFJFFNFFNFFNFFNF~~fjejfZFJFFNFRVRFJFFJFX^XwzvFJFFJFFJFFJFFJFCMR.........222...222......'+%162>B>BJBFJFFJFFJFFJFFJFFJFFJFLRMjfZ`b`FNFBJBX^Xknlknl~~ZbZFJFFJFFNFFNFFNFZckο...............222...222^^^:B:BJBFNFLRMFNFBJBBFBFNFFNFFNFFJFFJFFNFFJFFNFFJFFJFJNJTZRFJFFNFFNFFJFFJFJRX.........222............~~knl`b`UZVFJFFNFBJBFNFBJBFJFFJFFNFFNFFJFFNFFJFFNFFNFFNFFJFFNFFJFFJFfpr......222222.........222trrdfeUZVFJFFJFFNFFJFFNFFJFFJFFJFFNFFJFFNFrvr>>>222.........222222>>>^^^rvrrvrdfeUZVBJBBJBFJFwzvFFF............222:::FFF`b`BBB.........222666BBBMNN|~|fprRRR222222...666BBBMNNRRR`b`ZZZ......666BBBIJJRRRZZZtworld-2.3.0/tworld.rc000066400000000000000000000000301475511570500146730ustar00rootroot00000000000000SDL_app ICON tworld.ico tworld-2.3.0/tworld2.ico000066400000000000000000000162761475511570500151460ustar00rootroot0000000000000000(0```ޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻FޘޘF޻ލރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރރލ޻FޘޘF޻ނ."""""""""""""""""""""""""""""""""""".ރ޻FޘޘF޻ނ""ރ޻FޘޘF޻ނ"tggggggggggggggggggggggggggggggggt"ރ޻FޘޘF޻ނ"gg"ރ޻FޘޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻FޘޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻FޘޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ލރރރރރރރރރރރރރރރރރރރރރރލ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ."""""""""""""""""""".ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"tggggggggggggggggt"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޡg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘF޻ލރރރރރރލ޻Fޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘF޻ނ."""".ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘF޻ނ"tt"ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘF޻ނ"tt"ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘF޻ނ."""".ރ޻Fޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘF޻ލނނނނނނލ޻Fޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘF޻޻޻޻޻޻޻޻Fޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޘUFFFFFFFFFFUޘg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޠg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"gg"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ"tggggggggggggggggt"ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ""ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ނ."""""""""""""""""""".ރ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻ލނނނނނނނނނނނނނނނނނނނނނނލ޻Fޘg"ރ޻FޘޘF޻ނ"gޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻Fޘg"ރ޻FޘޘF޻ނ"gޘUFFFFFFFFFFFFFFFFFFFFFFFFFFUޘg"ރ޻FޘޘF޻ނ"gޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠg"ރ޻FޘޘF޻ނ"gg"ރ޻FޘޘF޻ނ"tggggggggggggggggggggggggggggggggt"ރ޻FޘޘF޻ނ""ރ޻FޘޘF޻ނ."""""""""""""""""""""""""""""""""""".ރ޻FޘޘF޻ލނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނނލ޻FޘޘF޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻޻FޘޘUFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUޘޠޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޘޠtworld-2.3.0/tworld2.qrc000066400000000000000000000001551475511570500151460ustar00rootroot00000000000000 tworld2.ico tworld-2.3.0/tworld2.rc000066400000000000000000000000311475511570500147560ustar00rootroot00000000000000SDL_app ICON tworld2.ico tworld-2.3.0/unslist.c000066400000000000000000000164521475511570500147160ustar00rootroot00000000000000/* unslist.c: Functions to manage the list of unsolvable levels. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #include #include #include #include #include "defs.h" #include "err.h" #include "fileio.h" #include "res.h" #include "solution.h" #include "unslist.h" /* The information comprising one entry in the list of unsolvable * levels. */ typedef struct unslistentry { int setid; /* the ID of the level set's name */ int levelnum; /* the level's number */ int size; /* the levels data's compressed size */ unsigned long hashval; /* the levels data's hash value */ int note; /* the entry's annotation ID, if any */ } unslistentry; /* The pool of strings. In here are stored the level set names and the * annotations. The string IDs are simple offsets from the strings * pointer. */ static int stringsused = 0; static int stringsallocated = 0; static char *strings = NULL; /* The list of level set names for which unsolvable levels appear on * the list. This list allows the program to quickly find the level * set name's string ID. */ static int namescount = 0; static int namesallocated = 0; static int *names = NULL; /* The list of unsolvable levels proper. */ static int listcount = 0; static int listallocated = 0; static unslistentry *unslist = NULL; /* * Managing the pool of strings. */ /* Turn a string ID back into a string pointer. (Note that a string ID * of zero will always return a null string, assuming that * storestring() has been called at least once.) */ #define getstring(id) (strings + (id)) /* Make a copy of a string and add it to the string pool. The new * string's ID is returned. */ static int storestring(char const *str) { int len; len = strlen(str) + 1; if (stringsused + len > stringsallocated) { stringsallocated = stringsallocated ? 2 * stringsallocated : 256; x_alloc(strings, stringsallocated); if (!stringsused) { *strings = '\0'; ++stringsused; } } memcpy(strings + stringsused, str, len); stringsused += len; return stringsused - len; } /* * Managing the list of set names. */ /* Return the string ID of the given set name. If the set name is not * already in the list, then if add is TRUE the set name is added to * the list; otherwise zero is returned. */ static int lookupsetname(char const *name, int add) { int i; for (i = 0 ; i < namescount ; ++i) if (!strcmp(getstring(names[i]), name)) return names[i]; if (!add) return 0; if (namescount >= namesallocated) { namesallocated = namesallocated ? 2 * namesallocated : 8; x_alloc(names, namesallocated * sizeof *names); } names[namescount] = storestring(name); return names[namescount++]; } /* * Managing the list of unsolvable levels. */ /* Add a new entry with the given data to the list. */ static int addtounslist(int setid, int levelnum, int size, unsigned long hashval, int note) { if (listcount == listallocated) { listallocated = listallocated ? listallocated * 2 : 16; x_alloc(unslist, listallocated * sizeof *unslist); } unslist[listcount].setid = setid; unslist[listcount].levelnum = levelnum; unslist[listcount].size = size; unslist[listcount].hashval = hashval; unslist[listcount].note = note; ++listcount; return TRUE; } /* Remove all entries for the given level from the list. FALSE is * returned if the level was not on the list to begin with. */ static int removefromunslist(int setid, int levelnum) { int i, f = FALSE; for (i = 0 ; i < listcount ; ++i) { if (unslist[i].setid == setid && unslist[i].levelnum == levelnum) { --listcount; unslist[i] = unslist[listcount]; f = TRUE; } } return f; } /* Add the information in the given file to the list of unsolvable * levels. Errors in the file are flagged but do not prevent the * function from reading the rest of the file. */ static int readunslist(fileinfo *file) { char buf[256], token[256]; char const *p; unsigned long hashval; int setid; unsigned int size; int lineno, levelnum, n; setid = 0; for (lineno = 1 ; ; ++lineno) { n = sizeof buf - 1; if (!filegetline(file, buf, &n, NULL)) break; for (p = buf ; isspace(*p) ; ++p) ; if (!*p || *p == '#') continue; if (sscanf(p, "[%[^]]]", token) == 1) { setid = lookupsetname(token, TRUE); continue; } n = sscanf(p, "%d: %04X%08lX: %[^\n\r]", &levelnum, &size, &hashval, token); if (n > 0 && levelnum > 0 && levelnum < 65536 && setid) { if (n == 1) { n = sscanf(p, "%*d: %s", token); if (n > 0 && !strcmp(token, "ok")) { removefromunslist(setid, levelnum); continue; } } else if (n >= 3) { addtounslist(setid, levelnum, size, hashval, n == 4 ? storestring(token) : 0); continue; } } warn("%s:%d: syntax error", file->name, lineno); } return TRUE; } /* * Exported functions. */ /* Return TRUE if the given level in the list of unsolvable levels. No * set name is supplied, so this function relies on the other three * data. A copy of the level's annotation is made if note is not NULL. */ int islevelunsolvable(gamesetup const *game, char *note) { int i; for (i = 0 ; i < listcount ; ++i) { if (unslist[i].levelnum == game->number && unslist[i].size == game->levelsize && unslist[i].hashval == game->levelhash) { if (note) strcpy(note, getstring(unslist[i].note)); return TRUE; } } return FALSE; } /* Look up the levels that constitute the given series and find which * levels appear in the list. Those that do will have the unsolvable * field in the gamesetup structure initialized. */ int markunsolvablelevels(gameseries *series) { int count = 0; int setid, i, j; for (j = 0 ; j < series->count ; ++j) series->games[j].unsolvable = NULL; setid = lookupsetname(series->name, FALSE); if (!setid) return 0; for (i = 0 ; i < listcount ; ++i) { if (unslist[i].setid != setid) continue; for (j = 0 ; j < series->count ; ++j) { if (series->games[j].number == unslist[i].levelnum && series->games[j].levelsize == unslist[i].size && series->games[j].levelhash == unslist[i].hashval) { series->games[j].unsolvable = getstring(unslist[i].note); ++count; break; } } } return count; } /* Read the list of unsolvable levels from the given filename. If the * filename does not contain a path, then the function looks for the * file in the resource directory and the user's save directory. */ int loadunslistfromfile(char const *filename) { fileinfo file = {0}; if (openfileindir(&file, resdir, filename, "r", NULL)) { readunslist(&file); fileclose(&file, NULL); } if (!haspathname(filename)) { clearfileinfo(&file); if (openfileindir(&file, savedir, filename, "r", NULL)) { readunslist(&file); fileclose(&file, NULL); } } return TRUE; } /* Free all memory associated with the list of unsolvable levels. */ void clearunslist(void) { free(unslist); listcount = 0; listallocated = 0; unslist = NULL; free(names); namescount = 0; namesallocated = 0; names = NULL; free(strings); stringsused = 0; stringsallocated = 0; strings = NULL; } tworld-2.3.0/unslist.h000066400000000000000000000026161475511570500147200ustar00rootroot00000000000000/* unslist.h: Functions to manage the list of unsolvable levels. * * Copyright (C) 2001-2006 by Brian Raiter, under the GNU General Public * License. No warranty. See COPYING for details. */ #ifndef HEADER_unslist_h_ #define HEADER_unslist_h_ #include "defs.h" /* Read the list of unsolvable levels from the given filename. If the * filename does not contain a path, then the function looks for the * file in the resource directory and the user's save directory. */ extern int loadunslistfromfile(char const *filename); /* Look up the given level in the list of unsolvable levels. TRUE is * returned if the level is found in the list, FALSE otherwise. (Since * the setname is not supplied, this function is potentially less * reliable.) If the level is in the list and note is not NULL, then * the buffer it points to will receive a copy of the level's * annotation. */ extern int islevelunsolvable(gamesetup const *game, char *note); /* Look up all the levels in the given series, and mark the ones that * appear in the list of unsolvable levels by initializing the * unsolvable field. Levels that do not appear in the list will have * their unsolvable fields explicitly set to NULL. The number of * unsolvable levels is returned. */ extern int markunsolvablelevels(gameseries *series); /* Free all memory associated with the list of unsolvable levels. */ extern void clearunslist(void); #endif tworld-2.3.0/ver.h000066400000000000000000000001571475511570500140110ustar00rootroot00000000000000#ifdef TWPLUSPLUS #define VERSION "2.3.0" #else #define VERSION "1.4.0" #endif