gltron-0.70/0000777000076400001440000000000007767023550006525 5gltron-0.70/README0000644000076400001440000000176307471767264007341 gltron, a 3d lightcycle game using OpenGL Copyright (C) 1999 Andreas Umbach Soundtrack: gltron.it - 'Revenge of Cats' is copyright by Peter Hajba The latest manual & information can be found at http://www.gltron.org/ Installation from source: see the INSTALL file in this archive License: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA gltron-0.70/COPYING0000644000076400001440000004312707427244142007476 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 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. gltron-0.70/ChangeLog0000644000076400001440000003122307766301721010212 0.62 to 0.70 - booster - wall acceleration - better handling of .ini file (versioning & protection against partly written files) - simplified GUI - new bot AI 0.61 to 0.62 - better & faster shadows - red outlines on the recognizer - better 3D sound effects - sound effects for player's lightcycle - sound effects for recognizer flying overhead - support for 'switching songs' (add your own music) - mp3 support - ogg/vorbis support (only linux version) - better camera zoom functions - integrated scripting language - more & more intuitive configuration options - many stability & performance enhancements - distribution friendly build process 0.59 to 0.61 - fixed lightcycle-hits-lightcycle lockup bug - fixed a view z-buffer issues - camera settings are saved 0.59 to 0.60 Usage: - new camera controls, use the mouse to tweak/rotate/zoom - removed the 2D map - simplified the menu structure Graphics: - vastly better visuals due to lighting & shadows - fixed many rendering artefacts - added recognizers - new textures / create your own Audio: - 3D positional sound & doppler effects Gameplay: - more movie-like default - much much stronger AI options (try to beat the MCP) Others: - in-game credits some details (outdated): - fixed load/save of player options (computer/human/none) - fixed crash on exit on linux/3dfx - converted all '// ... ' comments to '/* ... */' for added portability - added z-tests for almost everything to prevent visual artefacts - back-to-front ordering of transparent surfaces (sort-of) - converted 0 to NULL for null pointers - changed internals for: - collision detection, turns, movement, trails, - messed with trail drawing (z-buffer), moved that to trail.c - added mouse callbacks (glut only) and stubs in the gui - added mouse callbacks for SDL and SYSTEM_MOUSEUP, SYSTEM_MOUSEDOWN constants - colored debug texture (2D map) - added second 2D map for evaluation (one line drawing, one textured) - added "console" for status messages - added ligthing for trails - added shadows to trails - added line to trail-top to make them appear 'thick' - added 'art-pack' support - rewritten texture handling / loading. added 'fallback' path - texture repeat or stretch on larger arenas (configurable) - too many to add 0.53 to 0.59 most important visible changes (including the ones to 0.59beta) Game play: - rewrote computer player / added skill levels - different arena sizes (menu item) - different speeds (menu item) - experimental speed oszillation - configure players (human, computer, none) Other: - very cool new model from Charles Babbage - levels-of-detail for the model - configure keyboard controls (not saved between games yet) - added volume settings for music / fx to Audio menu - used wall & floor texture from Nicolas Zimmermann - (optional) sound effects, SDL version only - added trail decals on solid trails (option) - added trail bow before cycle - changed GUI background - resized menu (dynamic size now) - added screenshot function (F12 - disabled on MacOS) - fixed lightcycle going backwards (if you liked the old way better, that's an option now) - added arena overview camera mode when dead - GNU autoconf WOOO! WOOO! - textures in png format other visible changes (including the ones to 0.59beta) - played with wall dimensions - fixed chase camera starting position - fixed bug with crash texture turning then crashing during smooth turn - 4 different wall textures (Nicolas, Darrell) - added mipmapping with GLU box filter (Darrell) - choose bitween bilinear & trilinear filtering - fixed wall textures being upside down - adjusted clip plane (better 1st person view now) - added polygon counter - added support for multiple fonts - cam chase speed scales with cycle speed now code changes: - see cvs logs to 0.59beta visible changes - Arena size is now a variable (game->settins->grid_size or grid_size in gltron.ini) - cam chase speed scales with cycle speed now - fixed lightcycle going backwards (if you liked the old way better, that's an option now) - (optional) sound effects, SDL version only - fixed wall textures being upside down - used wall & floor texture from Nicolas Zimmermann - fixed bug with crash texture turning then crashing during smooth turn - 4 different wall textures (Nicolas, Darrell) - added mipmapping with GLU box filter (Darrell) - added different speeds to Game Settings menu (boring, normal, fast, crazy) - fixed chase camera starting position - played with wall dimensions - experimental speed oszillation - very cool new model from Charles Babbage - levels-of-detail for the model - configure players (human, computer, none) - configure keyboard controls (not saved between games yet) - added arena overview camera mode when dead - GNU autoconf WOOO! WOOO! code changes - removed clearCol - added parameters for value, colmap, colwidth to setCol, getCol to remove dependency from global variable - moved all data files (except sound effects) into data/ subdirectory this breaks make install of course - regrouped variable declarations in data.h - hopefully fixed stupid file loading bug now - changed MAX_VAR_NAME_LEN to 64 - sanity check for grid_size and speed - added sound effect stubs to libmikmod code for compatibility - halfed crash texture - changed wall texture OGL format to GL_RGB (565 is better than 4444) - fixed bug with capped walls (wrong texcoords) - properly shut down SDL sound at exit - unite special&keyboard callbacks to 0.54 - fixed bug that caused a crash on non-linux unices: do not free pointer returned by getenv - removed error.h dependancy from sgi_texture.c - moved all glut stuff to system_glut.c, makes porting to SDL easier - moved data structures from gltron.h to data.h - added glutReshapeCallback to center the game area when the window is maximised to 0.53 - added switch/option to capture mouse pointer (useful for Voodoo1/2 owners) - added switch/option do disable lightcycle turning smoothly - added switch/option to disable crash texture - moved lightcycle option to video/options - added bilinear filtering for wall & crash textures (thanks David for pointing that out, I just forgot it) - new logo from David Banz - accordingly, changed the color of the menu foreground and background to fit the logo - moved player loading into initGameStructures and the mesh data into Player->Model->Mesh - moved player color into Player->Model - small clean-ups - changed FPS code, added average / worst case FPS counter - fixed bug in drawText - added seperate display callback for gui pause mode - changed all display() calls in idle functions to glutPostRedisplay() - game finishes now after last crash is over (less abrupt) - can't turn cycle now after crash - randomized explosion vectors a bit, looks much better now - explosion debris fades slowly to 0.52 - added crash texture - +necessary files: gltron_crash.cgi - added exploding lightcycle upon crash - added rotating lightcycle when doing corners (still ugly) - fixed lightcycle material alpha - changed floor texture a bit to 0.51: - moved to CVS (now on www.ards.net) - fixed model coloring - fixed a few win32 problems - fixed chase camera (finally) to 0.50: - optimised drawPlayers, does now frustum culling based on object coordinates - added configuration menu for the bots - threw some junk out to 0.50beta4: - incorporated the low poly models, not yet optimized - fixed font / font-tex.pl generating distorted texture - added Game Settings menu - made font size screen size dependent (where useful) - changed menu layout and initialization a bit - changed menu highlighting (it's now done by font color) - necessary files: + t-u-low.obj to 0.50beta3: - added new font handling and font textures - consequently dropped M. Kilgards TexFont - organized files (a bit) - necessary files: + xenotron.ftx, xenotron.0.sgi, xenotron.1.sgi - necessary files: - helvetica.txf to 0.50beta2: - broke FPS counter again (actually, it wasn't ever working really good) - changed texture format to 'SGI image data, 3-D, 4 channels, uncompressed' - broke a LOT of stuff - rewrote some more - it's too late in the evening - added some nifty background effects to the UI - added new callback management, works GREAT so far - necessary files: + gltron.sgi to 0.50alpha: - GPL'd all my stuff - rewrote a whole LOT of code not mentioned here - added a (primitive) menu system - added general file searching routine, it now looks in ., GLTRON_HOME, /usr/share/games/gltron and /usr/local/share/games/gltron - necessary files are (currently): menu.txt settings.txt helvetica.txf - added these to make install... - changed INSTALL to mention the files from above - changed GLTRON_SNDDIR to GLTRON_HOME - changed the way settings are loaded (and pointers to game->settings->whatever are obtained) - finally really fixed the 'behind'-view (F10 to switch) - switched to Mark Kilgard's TexFont for Fonts (not permanent, because it's not GPL'd) - hopefully didn't break the rpm.specs to 0.47: (all changes by Thomas Flynn) - Added ifdefs to .h files to allow multiple inclusion - Moved a bunch of functions from gltron.c to engine.c These seem to be functions necessary for the game and do not contain OpenGL or glut code. List of functions are: setCol(); clearCol(); getCol(); turn(); initDisplay(); changeDisplay(); initGame(); initdata(); colldetect(); doTrail(); fixTrails(); clearTrails(); mainIdle(); gameIdle(); defaultDisplay(); cycleDisplay(); allAI(); resetScores(); movePlayers(); timediff(); chaseCamMove(); camMove(); screenSaverCheck(); - Added argument to drawTraces() so that pfTron knows which player (0,1,2,3) to draw traces for. - Created getElapsedTime() to replace frequent calls to glutGet(GLUT_ELAPSED_TIME); which are specific to glut. - Changed name of Display structure to gDisplay. Conflicts with Display structure in Xlib.h - Changed movePlayers() to call setGameIdleFunc() where it used to call glutIdleFunc(). Needed to move that glut call elsewhere. - Changed it so that scores are not updated if in screensaver mode. Didn't seem to make sense. If you disagree, lemme know. - Changed it so that the sound file is searched for in $GLTRON_SNDDIR then ./ then /usr/share/games/gltron. - Decided to get consistant with the naming. All instances of gltron are now gltron. - Added gltron.rpm.spec and gltron_sound.rpm.spec. - New Makefile. New rules: install, packages. Must be root for both. The packages rule makes .rpms, .tgz, and .deb files. to 0.46: - fixed bug with -k option, no more crashes - capped FPS at 90-100 FPS (you need more???) - fixed crazy FPS counter under windows - now shows the real numbers - fixed alternate camera mode under windows - did a new windows version (with sound!) - included glut.dll in the win32 distribution - changed texture format, it's now char[] instead of char*, that should remove problems with non-gcc compilers - fullscreen rendering under win32 (switched to glutGameMode where avaiable) - added '-i' switch, forces in-a-window-rendering under win32 - added '-v' switch, demo/screensafer mode (don't use with -f!) to 0.45: - added sound (Song by Peter Hajba) - added load/save for preferences - split code over several files to 0.44: - added help screen to 0.43: - fixed bug with uninitialised variable 'loop' in mainIdle() that caused the game to crash sometimes - added #ifdefs for FreeBSD (patch from Andrey Zahkhatov) to 0.42: - added glow around players (patch from Xavier Bouchoux) - added second camera (patch from Mike Field) - added nice color fade to model color where actually the bikes should be (I hope I'll receive the models soon) - added optional erasing of crashed players (like in the movie) - added optional fast finishing of the game after human crashes (no more long wait for next round if the computers decide to go in circles around the block) - added message who actually won the round (if you can't find it, it's at the bottom of the screen) - added CREDITS file - added keys for steering player 3 & 4 (you're silly if you think you can get 4 people to use one keyboard) - fixed a few minor bugs (e.g. speed change is now persistent) - changed behaviour of Display->onScreen - added keys for cycling players in upper/lower window in split-screen mode - changed FOV to 105 - added keys to change FOV - introduced a bug that makes the game freeze (very very rare), perhaps someone finds out why? to 0.41: - changed floor & wall textures (I'm still no artist though) - changed trail colors to fit new floor texture - multiple perspectives, view 1, 2 or 4 players (F1-F3 changes that on the fly) - it's worth the download! - fixed typos with -h switch - fixed Makefile, compiles now with -O2 instead of -g (debug) I can't see an obvious speed increase though - added this CHANGELOG file gltron-0.70/INSTALL0000644000076400001440000000260707471767264007510 GLtron - Installation from source If you install from CVS, read also README.CVS Requirements: Get a working OpenGL / Mesa installation Get libpng / zlib (standard on almost any system) Get SDL-1.2 (1.1 might work, but is unsupported) If you want sound, you need to grab SDL_sound 0.1.4 or later from http://icculus.org/SDL_sound/ Required libraries for SDL_sound: libmikmod 3.1.5 or newer Compiling: ./configure make And (probably as root) make install Data files get installed by default to /usr/local/share/gltron The config file gets stored in $HOME/.gltronrc and any screenshots you make get stored in $HOME/gltron-$version-$index.png You can tweak most file locations using ./configure options. Try ./configure --help If you want to play from the source directory, use ./configure --enable-localdata GLtron will then chdir() to the binary location upon startup, and load things from there. This is useful for the loki installer. You can put everything (binary & data) into one directory, and but a symlink into e.g. /usr/local/bin. Usage: 'gltron -h' lists a few runtime options. Most notably is the -O option, which will speed things up greatly *if you don't have a 3D card*. Don't use this unless the game runs really slow, the visuals will suffer terribly. Start gltron with the -s option if you don't want the sound playing. Visit http://www.gltron.org/ frequently for updates and patches! gltron-0.70/Makefile.am0000644000076400001440000000156107740235537010501 SUBDIRS = lua nebu src art data music scripts bin_PROGRAMS = gltron gltron_SOURCES = @top_srcdir@/src/gltron.c gltron_LINK = $(CXX) -o $@ gltron_LDADD = \ src/game/libgame.a \ src/input/libinput.a \ src/audio/libaudio.a \ src/video/libvideo.a \ src/configuration/libconfiguration.a \ src/base/libbase.a \ src/filesystem/libfilesystem.a \ nebu/input/libinput.a \ nebu/audio/libaudio.a \ nebu/video/libvideo.a \ nebu/scripting/libscripting.a \ nebu/filesystem/libfilesystem.a \ nebu/base/libbase.a \ lua/src/liblua.a \ lua/src/lib/liblualib.a #gltron_LDFLAGS = -static AM_CFLAGS = \ -I@top_srcdir@/src/include \ -I@top_srcdir@/lua/include \ -I@top_srcdir@/nebu/include AM_CXXFLAGS = \ -I@top_srcdir@/src/include \ -I@top_srcdir@/lua/include \ -I@top_srcdir@/nebu/include tags: etags `find -name '*.c' -or -name '*.cpp' -or -name '*.h' -or -name '*.lua'` gltron-0.70/Makefile.in0000644000076400001440000004027507767023243010515 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ SUBDIRS = lua nebu src art data music scripts bin_PROGRAMS = gltron gltron_SOURCES = @top_srcdir@/src/gltron.c gltron_LINK = $(CXX) -o $@ gltron_LDADD = \ src/game/libgame.a \ src/input/libinput.a \ src/audio/libaudio.a \ src/video/libvideo.a \ src/configuration/libconfiguration.a \ src/base/libbase.a \ src/filesystem/libfilesystem.a \ nebu/input/libinput.a \ nebu/audio/libaudio.a \ nebu/video/libvideo.a \ nebu/scripting/libscripting.a \ nebu/filesystem/libfilesystem.a \ nebu/base/libbase.a \ lua/src/liblua.a \ lua/src/lib/liblualib.a #gltron_LDFLAGS = -static AM_CFLAGS = \ -I@top_srcdir@/src/include \ -I@top_srcdir@/lua/include \ -I@top_srcdir@/nebu/include AM_CXXFLAGS = \ -I@top_srcdir@/src/include \ -I@top_srcdir@/lua/include \ -I@top_srcdir@/nebu/include subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = bin_PROGRAMS = gltron$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) am_gltron_OBJECTS = gltron.$(OBJEXT) gltron_OBJECTS = $(am_gltron_OBJECTS) gltron_DEPENDENCIES = src/game/libgame.a src/input/libinput.a \ src/audio/libaudio.a src/video/libvideo.a \ src/configuration/libconfiguration.a src/base/libbase.a \ src/filesystem/libfilesystem.a nebu/input/libinput.a \ nebu/audio/libaudio.a nebu/video/libvideo.a \ nebu/scripting/libscripting.a nebu/filesystem/libfilesystem.a \ nebu/base/libbase.a lua/src/liblua.a lua/src/lib/liblualib.a gltron_LDFLAGS = DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/gltron.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(gltron_SOURCES) RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ uninstall-info-recursive all-recursive install-data-recursive \ install-exec-recursive installdirs-recursive install-recursive \ uninstall-recursive check-recursive installcheck-recursive DIST_COMMON = README COPYING ChangeLog INSTALL Makefile.am Makefile.in \ aclocal.m4 config.guess config.sub configure configure.in \ depcomp install-sh missing mkinstalldirs DIST_SUBDIRS = $(SUBDIRS) SOURCES = $(gltron_SOURCES) all: all-recursive .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$@ $(SHELL) ./config.status $(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): configure.in cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(bindir) @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo $$p1|sed '$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$f"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$f; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f $(DESTDIR)$(bindir)/$$f"; \ rm -f $(DESTDIR)$(bindir)/$$f; \ done clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) gltron.$(OBJEXT): @top_srcdir@/src/gltron.c gltron$(EXEEXT): $(gltron_OBJECTS) $(gltron_DEPENDENCIES) @rm -f gltron$(EXEEXT) $(gltron_LINK) $(gltron_LDFLAGS) $(gltron_OBJECTS) $(gltron_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gltron.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` gltron.o: @top_srcdir@/src/gltron.c @AMDEP_TRUE@ source='@top_srcdir@/src/gltron.c' object='gltron.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/gltron.Po' tmpdepfile='$(DEPDIR)/gltron.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gltron.o `test -f @top_srcdir@/src/gltron.c || echo '$(srcdir)/'`@top_srcdir@/src/gltron.c gltron.obj: @top_srcdir@/src/gltron.c @AMDEP_TRUE@ source='@top_srcdir@/src/gltron.c' object='gltron.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/gltron.Po' tmpdepfile='$(DEPDIR)/gltron.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gltron.obj `cygpath -w @top_srcdir@/src/gltron.c` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = . # Avoid unsightly `./'. distdir = $(PACKAGE)-$(VERSION) GZIP_ENV = --best distdir: $(DISTFILES) -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir) mkdir $(distdir) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done for subdir in $(SUBDIRS); do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist: distdir $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir) GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/=build mkdir $(distdir)/=inst chmod a-w $(distdir) dc_install_base=`CDPATH=: && cd $(distdir)/=inst && pwd` \ && cd $(distdir)/=build \ && ../configure --srcdir=.. --prefix=$$dc_install_base \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && (test `find $$dc_install_base -type f -print | wc -l` -le 1 \ || (echo "Error: files left after uninstall" 1>&2; \ exit 1) ) \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && $(MAKE) $(AM_MAKEFLAGS) distclean \ && rm -f $(distdir).tar.gz \ && (test `find . -type f -print | wc -l` -eq 0 \ || (echo "Error: files left after distclean" 1>&2; \ exit 1) ) -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir) @echo "$(distdir).tar.gz is ready for distribution" | \ sed 'h;s/./=/g;p;x;p;x' check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: $(mkinstalldirs) $(DESTDIR)$(bindir) install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am dist-all: distdir $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir) distclean: distclean-recursive -rm -f config.status config.cache config.log distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-binPROGRAMS install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-recursive dist dist-all \ distcheck distclean distclean-compile distclean-depend \ distclean-generic distclean-recursive distclean-tags distdir \ dvi dvi-am dvi-recursive info info-am info-recursive install \ install-am install-binPROGRAMS install-data install-data-am \ install-data-recursive install-exec install-exec-am \ install-exec-recursive install-info install-info-am \ install-info-recursive install-man install-recursive \ install-strip installcheck installcheck-am installdirs \ installdirs-am installdirs-recursive maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-recursive \ tags tags-recursive uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-info-am \ uninstall-info-recursive uninstall-recursive tags: etags `find -name '*.c' -or -name '*.cpp' -or -name '*.h' -or -name '*.lua'` # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/aclocal.m40000644000076400001440000005447007767023241010310 # aclocal.m4 generated automatically by aclocal 1.5 # Copyright 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # Do all the work for Automake. This macro actually does too much -- # some checks are only needed if your package does certain things. # But this isn't really a big deal. # serial 5 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # We require 2.13 because we rely on SHELL being computed by configure. AC_PREREQ([2.13]) # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) # ----------------------------------------------------------- # If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED. # The purpose of this macro is to provide the user with a means to # check macros which are provided without letting her know how the # information is coded. # If this macro is not defined by Autoconf, define it here. ifdef([AC_PROVIDE_IFELSE], [], [define([AC_PROVIDE_IFELSE], [ifdef([AC_PROVIDE_$1], [$2], [$3])])]) # AM_INIT_AUTOMAKE(PACKAGE,VERSION, [NO-DEFINE]) # ---------------------------------------------- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`CDPATH=:; cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first]) fi # Define the identity of the package. PACKAGE=$1 AC_SUBST(PACKAGE)dnl VERSION=$2 AC_SUBST(VERSION)dnl ifelse([$3],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) # Autoconf 2.50 wants to disallow AM_ names. We explicitly allow # the ones we care about. ifdef([m4_pattern_allow], [m4_pattern_allow([^AM_[A-Z]+FLAGS])])dnl # Autoconf 2.50 always computes EXEEXT. However we need to be # compatible with 2.13, for now. So we always define EXEEXT, but we # don't compute it. AC_SUBST(EXEEXT) # Similar for OBJEXT -- only we only use OBJEXT if the user actually # requests that it be used. This is a bit dumb. : ${OBJEXT=o} AC_SUBST(OBJEXT) # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_MISSING_PROG(AMTAR, tar) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_DEP_TRACK])dnl AC_REQUIRE([AM_SET_DEPDIR])dnl AC_PROVIDE_IFELSE([AC_PROG_][CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_][CC], defn([AC_PROG_][CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_][CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_][CXX], defn([AC_PROG_][CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) # # Check to make sure that the build environment is sane. # # serial 3 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # serial 2 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= am_backtick='`' AC_MSG_WARN([${am_backtick}missing' script is too old or missing]) fi ]) # AM_AUX_DIR_EXPAND # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [ # expand $ac_aux_dir to an absolute path am_aux_dir=`CDPATH=:; cd $ac_aux_dir && pwd` ]) # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # serial 4 -*- Autoconf -*- # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # --------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX" or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'] [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. echo '#include "conftest.h"' > conftest.c echo 'int i;' > conftest.h echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=conftest.c object=conftest.o \ depfile=conftest.Po tmpdepfile=conftest.TPo \ $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && grep conftest.h conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then am_cv_$1_dependencies_compiler_type=$depmode break fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) $1DEPMODE="depmode=$am_cv_$1_dependencies_compiler_type" AC_SUBST([$1DEPMODE]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [rm -f .deps 2>/dev/null mkdir .deps 2>/dev/null if test -d .deps; then DEPDIR=.deps else # MS-DOS does not allow filenames that begin with a dot. DEPDIR=_deps fi rmdir .deps 2>/dev/null AC_SUBST(DEPDIR) ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking Speeds up one-time builds --enable-dependency-tracking Do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) pushdef([subst], defn([AC_SUBST])) subst(AMDEPBACKSLASH) popdef([subst]) ]) # Generate code to set up dependency tracking. # This macro should only be invoked once -- use via AC_REQUIRE. # Usage: # AM_OUTPUT_DEPENDENCY_COMMANDS # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],[ AC_OUTPUT_COMMANDS([ test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do case "$mf" in Makefile) dirpart=.;; */Makefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;; *) continue;; esac grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue # Extract the definition of DEP_FILES from the Makefile without # running `make'. DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` test -z "$DEPDIR" && continue # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n -e '/^U = / s///p' < "$mf"` test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" # We invoke sed twice because it is the simplest approach to # changing $(DEPDIR) to its actual value in the expansion. for file in `sed -n -e ' /^DEP_FILES = .*\\\\$/ { s/^DEP_FILES = // :loop s/\\\\$// p n /\\\\$/ b loop p } /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`echo "$file" | sed -e 's|/[^/]*$||'` $ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1 # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])]) # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' doit: @echo done END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include='#' am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote='"' _am_result=BSD fi fi AC_SUBST(am__include) AC_SUBST(am__quote) AC_MSG_RESULT($_am_result) rm -f confinc confmf ]) # serial 3 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. # # FIXME: Once using 2.50, use this: # m4_match([$1], [^TRUE\|FALSE$], [AC_FATAL([$0: invalid condition: $1])])dnl AC_DEFUN([AM_CONDITIONAL], [ifelse([$1], [TRUE], [errprint(__file__:__line__: [$0: invalid condition: $1 ])dnl m4exit(1)])dnl ifelse([$1], [FALSE], [errprint(__file__:__line__: [$0: invalid condition: $1 ])dnl m4exit(1)])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi]) # Configure paths for SDL # Sam Lantinga 9/21/99 # stolen from Manish Singh # stolen back from Frank Belew # stolen from Manish Singh # Shamelessly stolen from Owen Taylor dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS dnl AC_DEFUN(AM_PATH_SDL, [dnl dnl Get the cflags and libraries from the sdl-config script dnl AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], sdl_prefix="$withval", sdl_prefix="") AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], sdl_exec_prefix="$withval", sdl_exec_prefix="") AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], , enable_sdltest=yes) if test x$sdl_exec_prefix != x ; then sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_args="$sdl_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi AC_REQUIRE([AC_CANONICAL_TARGET]) PATH="$prefix/bin:$prefix/usr/bin:$PATH" AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) min_sdl_version=ifelse([$1], ,0.11.0,$1) AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" dnl dnl Now check if the installed SDL is sufficiently new. (Also sanity dnl checks the results of sdl-config to some extent dnl rm -f conf.sdltest AC_TRY_RUN([ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } ],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" AC_TRY_LINK([ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) rm -f conf.sdltest ]) gltron-0.70/config.guess0000755000076400001440000011351607447137001010760 #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. timestamp='2001-08-21' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Written by Per Bothner . # Please send patches to . # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi dummy=dummy-$$ trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int dummy(){}" > $dummy.c ; for c in cc gcc c89 ; do ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; if test $? = 0 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; rm -f $dummy.c $dummy.o $dummy.rel ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_MACHINE}" in i?86) test -z "$VENDOR" && VENDOR=pc ;; *) test -z "$VENDOR" && VENDOR=unknown ;; esac test -f /etc/SuSE-release && VENDOR=suse # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # Netbsd (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # Determine the machine/vendor (is the vendor relevant). case "${UNAME_MACHINE}" in amiga) machine=m68k-unknown ;; arm32) machine=arm-unknown ;; atari*) machine=m68k-atari ;; sun3*) machine=m68k-sun ;; mac68k) machine=m68k-apple ;; macppc) machine=powerpc-apple ;; hp3[0-9][05]) machine=m68k-hp ;; ibmrt|romp-ibm) machine=romp-ibm ;; *) machine=${UNAME_MACHINE}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE}" in i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. cat <$dummy.s .data \$Lformat: .byte 37,100,45,37,120,10,0 # "%d-%x\n" .text .globl main .align 4 .ent main main: .frame \$30,16,\$26,0 ldgp \$29,0(\$27) .prologue 1 .long 0x47e03d80 # implver \$0 lda \$2,-1 .long 0x47e20c21 # amask \$2,\$1 lda \$16,\$Lformat mov \$0,\$17 not \$1,\$18 jsr \$26,printf ldgp \$29,0(\$26) mov 0,\$16 jsr \$26,exit .end main EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null if test "$?" = 0 ; then case `./$dummy` in 0-0) UNAME_MACHINE="alpha" ;; 1-0) UNAME_MACHINE="alphaev5" ;; 1-1) UNAME_MACHINE="alphaev56" ;; 1-101) UNAME_MACHINE="alphapca56" ;; 2-303) UNAME_MACHINE="alphaev6" ;; 2-307) UNAME_MACHINE="alphaev67" ;; 2-1307) UNAME_MACHINE="alphaev68" ;; esac fi rm -f $dummy.s $dummy echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; arc64:OpenBSD:*:*) echo mips64el-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hkmips:OpenBSD:*:*) echo mips-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mips-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; sparc*:NetBSD:*) echo `uname -p`-unknown-netbsd${UNAME_RELEASE} exit 0 ;; atari*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; sun3*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy \ && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) case "${HPUX_REV}" in 11.[0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; esac ;; esac fi ;; esac if [ "${HP_ARCH}" = "" ]; then sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF eval $set_cc_for_build (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi rm -f $dummy.c $dummy fi ;; esac echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; hppa*:OpenBSD:*:*) echo hppa-unknown-openbsd exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*X-MP:*:*:*) echo xmp-cray-unicos exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3D:*:*:*) echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY-2:*:*:*) echo cray2-cray-unicos exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i386-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; mips:Linux:*:*) case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in big) echo mips-${VENDOR}-linux && exit 0 ;; little) echo mipsel-${VENDOR}-linux && exit 0 ;; esac case `sed -n '/^system type/s/^.*: \([^ ]*\).*/\1/p' < /proc/cpuinfo` in SGI|sgi) echo mips-${VENDOR}-linux-gnu && exit 0 ;; esac ;; ppc:Linux:*:*|ppc64:Linux:*:*) echo powerpc-${VENDOR}-linux exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-${VENDOR}-linux${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-${VENDOR}-linux ;; PA8*) echo hppa2.0-${VENDOR}-linux ;; *) echo hppa-${VENDOR}-linux ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-${VENDOR}-linux exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux exit 0 ;; x86_64:Linux:*:*) echo x86_64-${VENDOR}-linux exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. ld_supported_targets=`cd /; ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-${VENDOR}-linux" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-${VENDOR}-linuxaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-${VENDOR}-linuxcoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linuxoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-${VENDOR}-linuxoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf cat >$dummy.c < #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 printf ("%s-${VENDOR}-linux\n", argv[1]); # else printf ("%s-${VENDOR}-linuxlibc1\n", argv[1]); # endif # else printf ("%s-${VENDOR}-linuxlibc1\n", argv[1]); # endif #else printf ("%s-${VENDOR}-linuxaout\n", argv[1]); #endif return 0; } EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) echo `uname -p`-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) if test "${UNAME_MACHINE}" = "x86pc"; then UNAME_MACHINE=pc fi echo `uname -p`-${UNAME_MACHINE}-nto-qnx exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-[KW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gltron-0.70/config.sub0000755000076400001440000006672207447137001010431 #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. timestamp='2001-08-13' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dsp16xx \ | fr30 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | m32r | m68000 | m68k | m88k | mcore \ | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el | mips64vr4300 \ | mips64vr4300el | mips64vr5000 | mips64vr5000el \ | mipsbe | mipsel | mipsle | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | ns16k | ns32k \ | openrisc \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | s390 | s390x \ | sh | sh[34] | sh[34]eb | shbe | shle \ | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic80 | tron \ | v850 \ | we32k \ | x86 | xscale \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alphapca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armv*-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c54x-* \ | clipper-* | cray2-* | cydra-* \ | d10v-* | d30v-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | m32r-* \ | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipsel-* \ | mipsle-* | mipstx39-* | mipstx39el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | s390-* | s390x-* \ | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ | sparc-* | sparc64-* | sparc86x-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* \ | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ | v850-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | ymp) basic_machine=ymp-cray os=-unicos ;; cray2) basic_machine=cray2-cray os=-unicos ;; [cjt]90) basic_machine=${basic_machine}-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mipsel*-linux*) basic_machine=mipsel-unknown ;; mips*-linux*) basic_machine=mips-unknown ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon) basic_machine=i686-pc ;; pentiumii | pentium2) basic_machine=i686-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc64) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sparclite-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=t3e-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; windows32) basic_machine=i386-pc os=-windows32-msvcrt ;; xmp) basic_machine=xmp-cray os=-unicos ;; xps | xps100) basic_machine=xps100-honeywell ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; mips) case $os in linux*) basic_machine=mips-unknown ;; *) basic_machine=mips-mips ;; esac ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh3eb | sh4eb) basic_machine=sh-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; c4x*) basic_machine=c4x-none os=-coff ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto*) os=-nto-qnx ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gltron-0.70/configure0000755000076400001440000046302307767023243010357 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by Autoconf 2.52. # # Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Sed expression to map a string onto a valid variable name. as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi # Name of the executable. as_me=`echo "$0" |sed 's,.*[\\/],,'` if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file as_executable_p="test -f" # Support unset when possible. if (FOO=FOO; unset FOO) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # NLS nuisances. $as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } $as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } $as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } $as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} ac_unique_file="src/gltron.c" ac_default_prefix="/usr/local" # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. build=$build_alias host=$host_alias target=$target_alias # FIXME: should be removed in autoconf 3.0. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_CXX_set=${CXX+set} ac_env_CXX_value=$CXX ac_cv_env_CXX_set=${CXX+set} ac_cv_env_CXX_value=$CXX ac_env_CXXFLAGS_set=${CXXFLAGS+set} ac_env_CXXFLAGS_value=$CXXFLAGS ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} ac_cv_env_CXXFLAGS_value=$CXXFLAGS ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat < if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. EOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue cd $ac_subdir # A "../" for each directory in /$ac_subdir. ac_dots=`echo $ac_subdir | sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'` case $srcdir in .) # No --srcdir option. We are building in place. ac_sub_srcdir=$srcdir ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_sub_srcdir=$srcdir/$ac_subdir ;; *) # Relative path. ac_sub_srcdir=$ac_dots$srcdir/$ac_subdir ;; esac # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_sub_srcdir/configure.gnu; then echo $SHELL $ac_sub_srcdir/configure.gnu --help=recursive elif test -f $ac_sub_srcdir/configure; then echo $SHELL $ac_sub_srcdir/configure --help=recursive elif test -f $ac_sub_srcdir/configure.ac || test -f $ac_sub_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\EOF Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. EOF exit 0 fi exec 5>config.log cat >&5 </dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` PATH = $PATH _ASUNAME } >&5 cat >&5 <\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" ac_sep=" " ;; *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg" ac_sep=" " ;; esac # Get rid of the leading space. done # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. trap 'exit_status=$? # Save into config.log some information that might help in debugging. echo >&5 echo "## ----------------- ##" >&5 echo "## Cache variables. ##" >&5 echo "## ----------------- ##" >&5 echo >&5 # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } >&5 sed "/^$/d" confdefs.h >conftest.log if test -s conftest.log; then echo >&5 echo "## ------------ ##" >&5 echo "## confdefs.h. ##" >&5 echo "## ------------ ##" >&5 echo >&5 cat conftest.log >&5 fi (echo; echo) >&5 test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" >&5 echo "$as_me: exit $exit_status" >&5 rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:865: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} cat "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:876: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:884: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:900: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:904: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:910: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:912: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:914: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. It doesn't matter if # we pass some twice (in addition to the command line arguments). if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:933: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:935: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac echo "#! $SHELL" >conftest.sh echo "exit 0" >>conftest.sh chmod +x conftest.sh if { (echo "$as_me:955: PATH=\".;.\"; conftest.sh") >&5 (PATH=".;."; conftest.sh) 2>&5 ac_status=$? echo "$as_me:958: \$? = $ac_status" >&5 (exit $ac_status); }; then ac_path_separator=';' else ac_path_separator=: fi PATH_SEPARATOR="$ac_path_separator" rm -f conftest.sh ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:984: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Make sure we can run config.sub. $ac_config_sub sun4 >/dev/null 2>&1 || { { echo "$as_me:994: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:998: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6 if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_build_alias=$build_alias test -z "$ac_cv_build_alias" && ac_cv_build_alias=`$ac_config_guess` test -z "$ac_cv_build_alias" && { { echo "$as_me:1007: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || { { echo "$as_me:1011: error: $ac_config_sub $ac_cv_build_alias failed." >&5 echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:1016: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6 build=$ac_cv_build build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` test -z "$build_alias" && build_alias=$ac_cv_build echo "$as_me:1026: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6 if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_host_alias=$host_alias test -z "$ac_cv_host_alias" && ac_cv_host_alias=$ac_cv_build_alias ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || { { echo "$as_me:1035: error: $ac_config_sub $ac_cv_host_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:1040: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6 host=$ac_cv_host host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` test -z "$host_alias" && host_alias=$ac_cv_host echo "$as_me:1050: checking target system type" >&5 echo $ECHO_N "checking target system type... $ECHO_C" >&6 if test "${ac_cv_target+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_target_alias=$target_alias test "x$ac_cv_target_alias" = "x" && ac_cv_target_alias=$ac_cv_host_alias ac_cv_target=`$ac_config_sub $ac_cv_target_alias` || { { echo "$as_me:1059: error: $ac_config_sub $ac_cv_target_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:1064: result: $ac_cv_target" >&5 echo "${ECHO_T}$ac_cv_target" >&6 target=$ac_cv_target target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- test -z "$target_alias" && target_alias=$ac_cv_target # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:1092: checking for a BSD compatible install" >&5 echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_IFS=$IFS; IFS=$ac_path_separator for ac_dir in $PATH; do IFS=$ac_save_IFS # Account for people who put trailing slashes in PATH elements. case $ac_dir/ in / | ./ | .// | /cC/* \ | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \ | /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do if $as_executable_p "$ac_dir/$ac_prog"; then if test $ac_prog = install && grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:1141: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:1152: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:1176: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:1189: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:1195: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`CDPATH=:; cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= am_backtick='`' { echo "$as_me:1220: WARNING: ${am_backtick}missing' script is too old or missing" >&5 echo "$as_me: WARNING: ${am_backtick}missing' script is too old or missing" >&2;} fi for ac_prog in mawk gawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:1228: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue ac_cv_prog_AWK="$ac_prog" echo "$as_me:1243: found $ac_dir/$ac_word" >&5 break done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:1251: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:1254: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:1261: checking whether ${MAKE-make} sets \${MAKE}" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\EOF all: @echo 'ac_maketemp="${MAKE}"' EOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:1281: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:1285: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi # Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval="$enable_dependency_tracking" fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi rm -f .deps 2>/dev/null mkdir .deps 2>/dev/null if test -d .deps; then DEPDIR=.deps else # MS-DOS does not allow filenames that begin with a dot. DEPDIR=_deps fi rmdir .deps 2>/dev/null # test to see if srcdir already configured if test "`CDPATH=:; cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:1321: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # Define the identity of the package. PACKAGE=gltron VERSION=0.70 cat >>confdefs.h <>confdefs.h <&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:1393: found $ac_dir/$ac_word" >&5 break done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:1401: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:1404: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:1413: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:1428: found $ac_dir/$ac_word" >&5 break done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:1436: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:1439: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:1452: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:1467: found $ac_dir/$ac_word" >&5 break done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:1475: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:1478: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:1487: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue ac_cv_prog_ac_ct_CC="cc" echo "$as_me:1502: found $ac_dir/$ac_word" >&5 break done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:1510: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:1513: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:1526: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:1546: found $ac_dir/$ac_word" >&5 break done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift set dummy "$ac_dir/$ac_word" ${1+"$@"} shift ac_cv_prog_CC="$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:1568: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:1571: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:1582: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:1597: found $ac_dir/$ac_word" >&5 break done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:1605: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:1608: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:1621: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:1636: found $ac_dir/$ac_word" >&5 break done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:1644: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:1647: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:1659: error: no acceptable cc found in \$PATH" >&5 echo "$as_me: error: no acceptable cc found in \$PATH" >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:1664:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:1667: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:1670: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:1672: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:1675: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:1677: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:1680: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF #line 1684 "configure" #include "confdefs.h" int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:1700: checking for C compiler default output" >&5 echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:1703: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:1706: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. for ac_file in `ls a.exe conftest.exe 2>/dev/null; ls a.out conftest 2>/dev/null; ls a.* conftest.* 2>/dev/null`; do case $ac_file in *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;; a.out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 { { echo "$as_me:1729: error: C compiler cannot create executables" >&5 echo "$as_me: error: C compiler cannot create executables" >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:1735: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:1740: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:1746: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1749: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:1756: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:1764: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:1771: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:1773: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:1776: checking for executable suffix" >&5 echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6 if { (eval echo "$as_me:1778: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:1781: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:1797: error: cannot compute EXEEXT: cannot compile and link" >&5 echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:1803: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:1809: checking for object suffix" >&5 echo $ECHO_N "checking for object suffix... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 1815 "configure" #include "confdefs.h" int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:1827: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1830: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 { { echo "$as_me:1842: error: cannot compute OBJEXT: cannot compile" >&5 echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:1849: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:1853: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 1859 "configure" #include "confdefs.h" int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:1874: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1877: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:1880: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1883: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:1895: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:1901: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 1907 "configure" #include "confdefs.h" int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:1919: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1922: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:1925: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1928: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:1938: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:1965: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:1968: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:1971: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:1974: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ ''\ '#include ' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF #line 1986 "configure" #include "confdefs.h" #include $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:1999: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2002: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:2005: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2008: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 continue fi rm -f conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF #line 2018 "configure" #include "confdefs.h" $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:2030: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2033: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:2036: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2039: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands default-1" am_make=${MAKE-make} cat > confinc << 'END' doit: @echo done END # If we don't find an include directive, just comment out the code. echo "$as_me:2074: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 am__include='#' am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote='"' _am_result=BSD fi fi echo "$as_me:2101: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6 rm -f confinc confmf depcc="$CC" am_compiler_list= echo "$as_me:2107: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. echo '#include "conftest.h"' > conftest.c echo 'int i;' > conftest.h echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=conftest.c object=conftest.o \ depfile=conftest.Po tmpdepfile=conftest.TPo \ $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && grep conftest.h conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then am_cv_CC_dependencies_compiler_type=$depmode break fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi echo "$as_me:2169: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 CCDEPMODE="depmode=$am_cv_CC_dependencies_compiler_type" ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:2183: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:2198: found $ac_dir/$ac_word" >&5 break done fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then echo "$as_me:2206: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:2209: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:2222: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:2237: found $ac_dir/$ac_word" >&5 break done fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then echo "$as_me:2245: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6 else echo "$as_me:2248: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CXX" && break done test -n "$ac_ct_CXX" || ac_ct_CXX="g++" CXX=$ac_ct_CXX fi # Provide some information about the compiler. echo "$as_me:2260:" \ "checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:2263: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:2266: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:2268: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:2271: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:2273: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:2276: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:2279: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 2285 "configure" #include "confdefs.h" int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:2300: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2303: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:2306: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2309: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:2321: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="-g" echo "$as_me:2327: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 2333 "configure" #include "confdefs.h" int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:2345: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2348: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:2351: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2354: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cxx_g=no fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:2364: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi for ac_declaration in \ ''\ '#include ' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF #line 2391 "configure" #include "confdefs.h" #include $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:2404: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2407: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:2410: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2413: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 continue fi rm -f conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF #line 2423 "configure" #include "confdefs.h" $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:2435: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:2438: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:2441: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:2444: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= echo "$as_me:2468: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. echo '#include "conftest.h"' > conftest.c echo 'int i;' > conftest.h echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=conftest.c object=conftest.o \ depfile=conftest.Po tmpdepfile=conftest.TPo \ $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && grep conftest.h conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then am_cv_CXX_dependencies_compiler_type=$depmode break fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi echo "$as_me:2530: result: $am_cv_CXX_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 CXXDEPMODE="depmode=$am_cv_CXX_dependencies_compiler_type" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:2539: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF #line 2560 "configure" #include "confdefs.h" #include Syntax error _ACEOF if { (eval echo "$as_me:2565: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? egrep -v '^ *\+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:2571: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF #line 2594 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:2598: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? egrep -v '^ *\+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:2604: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:2641: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF #line 2651 "configure" #include "confdefs.h" #include Syntax error _ACEOF if { (eval echo "$as_me:2656: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? egrep -v '^ *\+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:2662: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF #line 2685 "configure" #include "confdefs.h" #include _ACEOF if { (eval echo "$as_me:2689: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? egrep -v '^ *\+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:2695: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:2723: error: C preprocessor \"$CPP\" fails sanity check" >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo "$as_me:2737: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:2752: found $ac_dir/$ac_word" >&5 break done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:2760: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:2763: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo "$as_me:2772: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. $as_executable_p "$ac_dir/$ac_word" || continue ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:2787: found $ac_dir/$ac_word" >&5 break done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:2796: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:2799: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi CFLAGS="-DSEPARATOR=\"'/'\"" # Check whether --enable-warn or --disable-warn was given. if test "${enable_warn+set}" = set; then enableval="$enable_warn" enable_warn=$enableval else enable_warn=yes fi; if test "x$enable_warn" = xyes; then CFLAGS="$CFLAGS -Wall -Werror" fi # Check whether --enable-debug or --disable-debug was given. if test "${enable_debug+set}" = set; then enableval="$enable_debug" enable_debug=$enableval else enable_debug=off fi; if test "x$enable_debug" = xyes; then CFLAGS="$CFLAGS -g3" CXXFLAGS="$CXXFLAGS -g3" fi # Check whether --enable-profile or --disable-profile was given. if test "${enable_profile+set}" = set; then enableval="$enable_profile" enable_profile=$enableval else enable_profile=off fi; if test "x$enable_profile" = xyes; then if test "x$GCC" = xyes; then CFLAGS="$CFLAGS -pg" else CFLAGS="$CFLAGS -p" fi fi # Check whether --enable-optimize or --disable-optimize was given. if test "${enable_optimize+set}" = set; then enableval="$enable_optimize" enable_optmize=$enableval else enable_optimize=s fi; if test "x$enable_optimize" ; then CFLAGS="$CFLAGS -O$enable_optimize" CXXFLAGS="$CXXFLAGS -O$enable_optimize" fi # Check whether --with-sdl-prefix or --without-sdl-prefix was given. if test "${with_sdl_prefix+set}" = set; then withval="$with_sdl_prefix" sdl_prefix="$withval" else sdl_prefix="" fi; # Check whether --with-sdl-exec-prefix or --without-sdl-exec-prefix was given. if test "${with_sdl_exec_prefix+set}" = set; then withval="$with_sdl_exec_prefix" sdl_exec_prefix="$withval" else sdl_exec_prefix="" fi; # Check whether --enable-sdltest or --disable-sdltest was given. if test "${enable_sdltest+set}" = set; then enableval="$enable_sdltest" else enable_sdltest=yes fi; if test x$sdl_exec_prefix != x ; then sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_args="$sdl_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi PATH="$prefix/bin:$prefix/usr/bin:$PATH" # Extract the first word of "sdl-config", so it can be a program name with args. set dummy sdl-config; ac_word=$2 echo "$as_me:2899: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_SDL_CONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $SDL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a path. ;; *) ac_save_IFS=$IFS; IFS=$ac_path_separator ac_dummy="$PATH" for ac_dir in $ac_dummy; do IFS=$ac_save_IFS test -z "$ac_dir" && ac_dir=. if $as_executable_p "$ac_dir/$ac_word"; then ac_cv_path_SDL_CONFIG="$ac_dir/$ac_word" echo "$as_me:2916: found $ac_dir/$ac_word" >&5 break fi done test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no" ;; esac fi SDL_CONFIG=$ac_cv_path_SDL_CONFIG if test -n "$SDL_CONFIG"; then echo "$as_me:2928: result: $SDL_CONFIG" >&5 echo "${ECHO_T}$SDL_CONFIG" >&6 else echo "$as_me:2931: result: no" >&5 echo "${ECHO_T}no" >&6 fi min_sdl_version=1.1.0 echo "$as_me:2936: checking for SDL - version >= $min_sdl_version" >&5 echo $ECHO_N "checking for SDL - version >= $min_sdl_version... $ECHO_C" >&6 no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" rm -f conf.sdltest if test "$cross_compiling" = yes; then echo $ac_n "cross compiling; assumed OK... $ac_c" else cat >conftest.$ac_ext <<_ACEOF #line 2961 "configure" #include "confdefs.h" #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:3022: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3025: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:3027: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3030: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 no_sdl=yes fi rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then echo "$as_me:3046: result: yes" >&5 echo "${ECHO_T}yes" >&6 CFLAGS="$CFLAGS $SDL_CFLAGS"; CXXFLAGS="$CXXFLAGS $SDL_CFLAGS"; LIBS="$LIBS $SDL_LIBS" else echo "$as_me:3050: result: no" >&5 echo "${ECHO_T}no" >&6 if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3065 "configure" #include "confdefs.h" #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main int main () { return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3085: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3088: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3091: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3094: \$? = $ac_status" >&5 (exit $ac_status); }; }; then echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" { { echo "$as_me:3120: error: SDL is not installed" >&5 echo "$as_me: error: SDL is not installed" >&2;} { (exit 1); exit 1; }; } fi rm -f conf.sdltest echo "$as_me:3127: checking for main in -lGL" >&5 echo $ECHO_N "checking for main in -lGL... $ECHO_C" >&6 if test "${ac_cv_lib_GL_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGL $LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3135 "configure" #include "confdefs.h" int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3147: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3150: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3153: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3156: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_GL_main=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_lib_GL_main=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:3167: result: $ac_cv_lib_GL_main" >&5 echo "${ECHO_T}$ac_cv_lib_GL_main" >&6 if test $ac_cv_lib_GL_main = yes; then cat >>confdefs.h <&5 echo "$as_me: error: OpenGL is not installed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:3182: checking for gzopen in -lz" >&5 echo $ECHO_N "checking for gzopen in -lz... $ECHO_C" >&6 if test "${ac_cv_lib_z_gzopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3190 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gzopen (); int main () { gzopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3209: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3212: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3215: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3218: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_z_gzopen=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_lib_z_gzopen=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:3229: result: $ac_cv_lib_z_gzopen" >&5 echo "${ECHO_T}$ac_cv_lib_z_gzopen" >&6 if test $ac_cv_lib_z_gzopen = yes; then cat >>confdefs.h <&5 echo "$as_me: error: libz is not installed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:3244: checking for png_read_info in -lpng" >&5 echo $ECHO_N "checking for png_read_info in -lpng... $ECHO_C" >&6 if test "${ac_cv_lib_png_png_read_info+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpng $LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3252 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char png_read_info (); int main () { png_read_info (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3271: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3274: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3277: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3280: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_png_png_read_info=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_lib_png_png_read_info=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:3291: result: $ac_cv_lib_png_png_read_info" >&5 echo "${ECHO_T}$ac_cv_lib_png_png_read_info" >&6 if test $ac_cv_lib_png_png_read_info = yes; then cat >>confdefs.h <&5 echo "$as_me: error: libpng is not installed" >&2;} { (exit 1); exit 1; }; } fi # Check whether --enable-localdata or --disable-localdata was given. if test "${enable_localdata+set}" = set; then enableval="$enable_localdata" CPPFLAGSA="$CPPFLAGSA -DLOCAL_DATA" else CPPFLAGSA="$CPPFLAGSA -DDATA_DIR=\\\"\$(datadir)/\$(PACKAGE)\\\"" fi; # Check whether --with-snapshot-dir or --without-snapshot-dir was given. if test "${with_snapshot_dir+set}" = set; then withval="$with_snapshot_dir" CPPFLAGSA="$CPPFLAGSA -DSNAP_DIR=\\\"$withval\\\"" else CPPFLAGSA="$CPPFLAGSA -DSNAP_DIR=\\\"~\\\"" fi; # Check whether --with-preferences-dir or --without-preferences-dir was given. if test "${with_preferences_dir+set}" = set; then withval="$with_preferences_dir" CPPFLAGSA="$CPPFLAGSA -DPREF_DIR=\\\"$withval\\\"" else CPPFLAGSA="$CPPFLAGSA -DPREF_DIR=\\\"~\\\"" fi; # Check whether --enable-sound or --disable-sound was given. if test "${enable_sound+set}" = set; then enableval="$enable_sound" use_sound=no else use_sound=yes fi; if test "x$use_sound" = xyes; then echo "$as_me:3339: checking for main in -lsmpeg" >&5 echo $ECHO_N "checking for main in -lsmpeg... $ECHO_C" >&6 if test "${ac_cv_lib_smpeg_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsmpeg $LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3347 "configure" #include "confdefs.h" int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3359: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3362: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3365: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3368: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_smpeg_main=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_lib_smpeg_main=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:3379: result: $ac_cv_lib_smpeg_main" >&5 echo "${ECHO_T}$ac_cv_lib_smpeg_main" >&6 if test $ac_cv_lib_smpeg_main = yes; then cat >>confdefs.h <&5 echo "$as_me: WARNING: smpeg not found - music playback may not work correctly" >&2;} fi echo "$as_me:3393: checking for main in -logg" >&5 echo $ECHO_N "checking for main in -logg... $ECHO_C" >&6 if test "${ac_cv_lib_ogg_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-logg $LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3401 "configure" #include "confdefs.h" int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3413: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3416: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3419: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3422: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_ogg_main=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_lib_ogg_main=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:3433: result: $ac_cv_lib_ogg_main" >&5 echo "${ECHO_T}$ac_cv_lib_ogg_main" >&6 if test $ac_cv_lib_ogg_main = yes; then cat >>confdefs.h <&5 echo "$as_me: WARNING: ogg not found - music playback may not work correctly" >&2;} fi echo "$as_me:3447: checking for main in -lvorbis" >&5 echo $ECHO_N "checking for main in -lvorbis... $ECHO_C" >&6 if test "${ac_cv_lib_vorbis_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lvorbis $LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3455 "configure" #include "confdefs.h" int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3467: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3470: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3473: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3476: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_vorbis_main=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_lib_vorbis_main=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:3487: result: $ac_cv_lib_vorbis_main" >&5 echo "${ECHO_T}$ac_cv_lib_vorbis_main" >&6 if test $ac_cv_lib_vorbis_main = yes; then cat >>confdefs.h <&5 echo "$as_me: WARNING: vorbis not found - music playback may not work correctly" >&2;} fi echo "$as_me:3501: checking for main in -lvorbisfile" >&5 echo $ECHO_N "checking for main in -lvorbisfile... $ECHO_C" >&6 if test "${ac_cv_lib_vorbisfile_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lvorbisfile $LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3509 "configure" #include "confdefs.h" int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3521: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3524: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3527: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3530: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_vorbisfile_main=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_lib_vorbisfile_main=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:3541: result: $ac_cv_lib_vorbisfile_main" >&5 echo "${ECHO_T}$ac_cv_lib_vorbisfile_main" >&6 if test $ac_cv_lib_vorbisfile_main = yes; then cat >>confdefs.h <&5 echo "$as_me: WARNING: vorbisfile not found - music playback may not work correctly" >&2;} fi echo "$as_me:3555: checking for main in -lsmpeg" >&5 echo $ECHO_N "checking for main in -lsmpeg... $ECHO_C" >&6 if test "${ac_cv_lib_smpeg_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsmpeg $LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3563 "configure" #include "confdefs.h" int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3575: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3578: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3581: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3584: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_smpeg_main=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_lib_smpeg_main=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:3595: result: $ac_cv_lib_smpeg_main" >&5 echo "${ECHO_T}$ac_cv_lib_smpeg_main" >&6 if test $ac_cv_lib_smpeg_main = yes; then cat >>confdefs.h <&5 echo "$as_me: WARNING: smpeg not found - music playback may not work correctly" >&2;} fi echo "$as_me:3609: checking for main in -lmikmod" >&5 echo $ECHO_N "checking for main in -lmikmod... $ECHO_C" >&6 if test "${ac_cv_lib_mikmod_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmikmod $LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3617 "configure" #include "confdefs.h" int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3629: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3632: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3635: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3638: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_mikmod_main=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_lib_mikmod_main=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:3649: result: $ac_cv_lib_mikmod_main" >&5 echo "${ECHO_T}$ac_cv_lib_mikmod_main" >&6 if test $ac_cv_lib_mikmod_main = yes; then cat >>confdefs.h <&5 echo "$as_me: WARNING: mikmod not found - music playback may not work correctly" >&2;} fi echo "$as_me:3663: checking for Sound_Init in -lSDL_sound" >&5 echo $ECHO_N "checking for Sound_Init in -lSDL_sound... $ECHO_C" >&6 if test "${ac_cv_lib_SDL_sound_Sound_Init+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lSDL_sound $LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3671 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char Sound_Init (); int main () { Sound_Init (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3690: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3693: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3696: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3699: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_SDL_sound_Sound_Init=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_lib_SDL_sound_Sound_Init=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:3710: result: $ac_cv_lib_SDL_sound_Sound_Init" >&5 echo "${ECHO_T}$ac_cv_lib_SDL_sound_Sound_Init" >&6 if test $ac_cv_lib_SDL_sound_Sound_Init = yes; then LIBS="-lSDL_sound $LIBS"; SOUND_OBJS="sound.o sound_glue.o Source.o Source3D.o SourceMusic.o SourceSample.o SoundSystem.o SourceCopy.o SourceEngine.o" else { echo "$as_me:3716: WARNING: SDL_sound not found - disabling sound" >&5 echo "$as_me: WARNING: SDL_sound not found - disabling sound" >&2;}; SOUND_OBJS="sound_stubs.o sound_glue_stubs.o" fi else SOUND_OBJS="sound_stubs.o sound_glue_stubs.o" fi # Check whether --enable-network or --disable-network was given. if test "${enable_network+set}" = set; then enableval="$enable_network" enable_network=$enableval else enable_network=off fi; if test "x$enable_network" = xyes; then echo "$as_me:3734: checking for SDLNet_Init in -lSDL_net" >&5 echo $ECHO_N "checking for SDLNet_Init in -lSDL_net... $ECHO_C" >&6 if test "${ac_cv_lib_SDL_net_SDLNet_Init+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lSDL_net $LIBS" cat >conftest.$ac_ext <<_ACEOF #line 3742 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char SDLNet_Init (); int main () { SDLNet_Init (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:3761: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3764: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:3767: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3770: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_SDL_net_SDLNet_Init=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_lib_SDL_net_SDLNet_Init=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:3781: result: $ac_cv_lib_SDL_net_SDLNet_Init" >&5 echo "${ECHO_T}$ac_cv_lib_SDL_net_SDLNet_Init" >&6 if test $ac_cv_lib_SDL_net_SDLNet_Init = yes; then CFLAGS="$CFLAGS -DNETWORK"; LIBS="$LIBS -lSDL_net"; NETWORK_OBJS="network.o system_net.o" else { echo "$as_me:3788: WARNING: SDL_net not found - disabling network" >&5 echo "$as_me: WARNING: SDL_net not found - disabling network" >&2;} fi fi echo "$as_me:3794: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 3800 "configure" #include "confdefs.h" #include #include #include #include _ACEOF if { (eval echo "$as_me:3808: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? egrep -v '^ *\+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:3814: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF #line 3836 "configure" #include "confdefs.h" #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF #line 3854 "configure" #include "confdefs.h" #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF #line 3875 "configure" #include "confdefs.h" #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:3901: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:3904: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:3906: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:3909: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:3922: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi for ac_header in unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:3935: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 3941 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:3945: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? egrep -v '^ *\+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:3951: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_ext fi echo "$as_me:3970: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 3989 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:3993: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? egrep -v '^ *\+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:3999: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_ext fi echo "$as_me:4018: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 4041 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:4045: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? egrep -v '^ *\+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:4051: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_ext fi echo "$as_me:4070: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 4094 "configure" #include "confdefs.h" #include <$ac_header> _ACEOF if { (eval echo "$as_me:4098: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? egrep -v '^ *\+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:4104: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_ext fi echo "$as_me:4123: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <&5 echo "$as_me: error: cant find GL headers" >&2;} { (exit 1); exit 1; }; } } echo "$as_me:4142: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF #line 4150 "configure" #include "confdefs.h" #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:4199: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4202: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:4205: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4208: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:4225: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:4228: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac echo "$as_me:4233: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 4239 "configure" #include "confdefs.h" int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset x; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; ccp = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++ccp; p = (char**) ccp; ccp = (char const *const *) p; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:4297: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:4300: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:4303: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4306: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:4316: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6 if test $ac_cv_c_const = no; then cat >>confdefs.h <<\EOF #define const EOF fi for ac_func in strstr mkstemp do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:4329: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line 4335 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. */ #include /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); char (*f) (); int main () { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else f = $ac_func; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:4366: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:4369: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:4372: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:4375: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 cat conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:4385: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overriden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if cmp -s $cache_file confcache; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\EOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p EOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:4507: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated automatically by configure. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false SHELL=\${CONFIG_SHELL-$SHELL} ac_cs_invocation="\$0 \$@" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi # Name of the executable. as_me=`echo "$0" |sed 's,.*[\\/],,'` if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file as_executable_p="test -f" # Support unset when possible. if (FOO=FOO; unset FOO) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # NLS nuisances. $as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } $as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } $as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } $as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } exec 6>&1 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\EOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." EOF cat >>$CONFIG_STATUS <>$CONFIG_STATUS <<\EOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` shift set dummy "$ac_option" "$ac_optarg" ${1+"$@"} shift ;; -*);; *) # This is not an option, so the user has probably given explicit # arguments. ac_need_defaults=false;; esac case $1 in # Handling of the options. EOF cat >>$CONFIG_STATUS <>$CONFIG_STATUS <<\EOF --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:4678: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) shift CONFIG_FILES="$CONFIG_FILES $1" ac_need_defaults=false;; --header | --heade | --head | --hea ) shift CONFIG_HEADERS="$CONFIG_HEADERS $1" ac_need_defaults=false;; # This is an error. -*) { { echo "$as_me:4697: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done exec 5>>config.log cat >&5 << _ACEOF ## ----------------------- ## ## Running config.status. ## ## ----------------------- ## This file was extended by $as_me 2.52, executed with CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS > $ac_cs_invocation on `(hostname || uname -n) 2>/dev/null | sed 1q` _ACEOF EOF cat >>$CONFIG_STATUS <>$CONFIG_STATUS <<\EOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "lua/Makefile" ) CONFIG_FILES="$CONFIG_FILES lua/Makefile" ;; "lua/include/Makefile" ) CONFIG_FILES="$CONFIG_FILES lua/include/Makefile" ;; "lua/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES lua/src/Makefile" ;; "lua/src/lib/Makefile" ) CONFIG_FILES="$CONFIG_FILES lua/src/lib/Makefile" ;; "nebu/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/Makefile" ;; "nebu/include/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/include/Makefile" ;; "nebu/include/audio/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/include/audio/Makefile" ;; "nebu/include/base/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/include/base/Makefile" ;; "nebu/include/filesystem/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/include/filesystem/Makefile" ;; "nebu/include/input/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/include/input/Makefile" ;; "nebu/include/scripting/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/include/scripting/Makefile" ;; "nebu/include/video/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/include/video/Makefile" ;; "nebu/base/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/base/Makefile" ;; "nebu/filesystem/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/filesystem/Makefile" ;; "nebu/scripting/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/scripting/Makefile" ;; "nebu/input/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/input/Makefile" ;; "nebu/video/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/video/Makefile" ;; "nebu/audio/Makefile" ) CONFIG_FILES="$CONFIG_FILES nebu/audio/Makefile" ;; "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/include/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/include/Makefile" ;; "src/include/audio/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/include/audio/Makefile" ;; "src/include/base/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/include/base/Makefile" ;; "src/include/configuration/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/include/configuration/Makefile" ;; "src/include/filesystem/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/include/filesystem/Makefile" ;; "src/include/game/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/include/game/Makefile" ;; "src/include/input/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/include/input/Makefile" ;; "src/include/scripting/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/include/scripting/Makefile" ;; "src/include/video/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/include/video/Makefile" ;; "src/base/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/base/Makefile" ;; "src/filesystem/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/filesystem/Makefile" ;; "src/configuration/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/configuration/Makefile" ;; "src/audio/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/audio/Makefile" ;; "src/video/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/video/Makefile" ;; "src/input/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/input/Makefile" ;; "src/game/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/game/Makefile" ;; "art/Makefile" ) CONFIG_FILES="$CONFIG_FILES art/Makefile" ;; "art/default/Makefile" ) CONFIG_FILES="$CONFIG_FILES art/default/Makefile" ;; "data/Makefile" ) CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; "music/Makefile" ) CONFIG_FILES="$CONFIG_FILES music/Makefile" ;; "scripts/Makefile" ) CONFIG_FILES="$CONFIG_FILES scripts/Makefile" ;; "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; *) { { echo "$as_me:4784: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. : ${TMPDIR=/tmp} { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=$TMPDIR/cs$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 { (exit 1); exit 1; } } EOF cat >>$CONFIG_STATUS <\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@DEFS@,$DEFS,;t t s,@LIBS@,$LIBS,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t s,@build_os@,$build_os,;t t s,@host@,$host,;t t s,@host_cpu@,$host_cpu,;t t s,@host_vendor@,$host_vendor,;t t s,@host_os@,$host_os,;t t s,@target@,$target,;t t s,@target_cpu@,$target_cpu,;t t s,@target_vendor@,$target_vendor,;t t s,@target_os@,$target_os,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@AMTAR@,$AMTAR,;t t s,@install_sh@,$install_sh,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t s,@DEPDIR@,$DEPDIR,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@am__include@,$am__include,;t t s,@am__quote@,$am__quote,;t t s,@CCDEPMODE@,$CCDEPMODE,;t t s,@CXX@,$CXX,;t t s,@CXXFLAGS@,$CXXFLAGS,;t t s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@CXXDEPMODE@,$CXXDEPMODE,;t t s,@CPP@,$CPP,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@SDL_CONFIG@,$SDL_CONFIG,;t t s,@SDL_CFLAGS@,$SDL_CFLAGS,;t t s,@SDL_LIBS@,$SDL_LIBS,;t t s,@SOUND_OBJS@,$SOUND_OBJS,;t t s,@NETWORK_OBJS@,$NETWORK_OBJS,;t t CEOF EOF cat >>$CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" EOF cat >>$CONFIG_STATUS <<\EOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then { case "$ac_dir" in [\\/]* | ?:[\\/]* ) as_incr_dir=;; *) as_incr_dir=.;; esac as_dummy="$ac_dir" for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do case $as_mkdir_dir in # Skip DOS drivespec ?:) as_incr_dir=$as_mkdir_dir ;; *) as_incr_dir=$as_incr_dir/$as_mkdir_dir test -d "$as_incr_dir" || mkdir "$as_incr_dir" ;; esac done; } ac_dir_suffix="/`echo $ac_dir|sed 's,^\./,,'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'` else ac_dir_suffix= ac_dots= fi case $srcdir in .) ac_srcdir=. if test -z "$ac_dots"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_dots | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_dots$srcdir$ac_dir_suffix ac_top_srcdir=$ac_dots$srcdir ;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_dots$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:5032: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated automatically by config.status. */ configure_input="Generated automatically from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:5050: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo $f;; *) # Relative if test -f "$f"; then # Build tree echo $f elif test -f "$srcdir/$f"; then # Source tree echo $srcdir/$f else # /dev/null tree { { echo "$as_me:5063: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } EOF cat >>$CONFIG_STATUS <>$CONFIG_STATUS <<\EOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done EOF cat >>$CONFIG_STATUS <<\EOF # # CONFIG_COMMANDS section. # for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` case $ac_dest in default-1 ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do case "$mf" in Makefile) dirpart=.;; */Makefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;; *) continue;; esac grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue # Extract the definition of DEP_FILES from the Makefile without # running `make'. DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` test -z "$DEPDIR" && continue # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n -e '/^U = / s///p' < "$mf"` test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" # We invoke sed twice because it is the simplest approach to # changing $(DEPDIR) to its actual value in the expansion. for file in `sed -n -e ' /^DEP_FILES = .*\\\\$/ { s/^DEP_FILES = // :loop s/\\\\$// p n /\\\\$/ b loop p } /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`echo "$file" | sed -e 's|/[^/]*$||'` $ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1 # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; esac done EOF cat >>$CONFIG_STATUS <<\EOF { (exit 0); exit 0; } EOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: exec 5>/dev/null $SHELL $CONFIG_STATUS || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi gltron-0.70/configure.in0000644000076400001440000001335407767021216010755 dnl Process this file with autoconf to produce a configure script. dnl initialisation AC_INIT(src/gltron.c) AC_CANONICAL_HOST AC_CANONICAL_TARGET AM_INIT_AUTOMAKE(gltron, 0.70) AC_PREFIX_DEFAULT("/usr/local") dnl AM_MAINTAINER_MODE dnl Checks for programs. AC_PROG_CC AC_PROG_CXX AC_PROG_CPP AC_PROG_RANLIB dnl CFLAGS set-up CFLAGS="-DSEPARATOR=\"'/'\"" dnl CFLAGS="-ansi -pedantic" dnl CXXFLAGS="" dnl CPPFLAGS="" AC_ARG_ENABLE(warn, AC_HELP_STRING([--enable-warn],[Enable compiler warnings @<:@default=on@:>@]), enable_warn=$enableval, enable_warn=yes) if test "x$enable_warn" = xyes; then CFLAGS="$CFLAGS -Wall -Werror" fi AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug],[Enable debugging @<:@default=off@:>@]), enable_debug=$enableval, enable_debug=off) if test "x$enable_debug" = xyes; then CFLAGS="$CFLAGS -g3" CXXFLAGS="$CXXFLAGS -g3" fi AC_ARG_ENABLE(profile, AC_HELP_STRING([--enable-profile],[Enable profiling @<:@default=off@:>@]), enable_profile=$enableval, enable_profile=off) if test "x$enable_profile" = xyes; then if test "x$GCC" = xyes; then CFLAGS="$CFLAGS -pg" else CFLAGS="$CFLAGS -p" fi fi AC_ARG_ENABLE(optimize, AC_HELP_STRING([--enable-optimize=@<:@level@:>@],[Enable optimization @<:@default=s@:>@]), enable_optmize=$enableval, enable_optimize=s) dnl this is always true if test "x$enable_optimize" ; then CFLAGS="$CFLAGS -O$enable_optimize" CXXFLAGS="$CXXFLAGS -O$enable_optimize" fi dnl library checks AM_PATH_SDL(1.1.0, CFLAGS="$CFLAGS $SDL_CFLAGS"; CXXFLAGS="$CXXFLAGS $SDL_CFLAGS"; LIBS="$LIBS $SDL_LIBS", AC_MSG_ERROR(SDL is not installed)) AC_CHECK_LIB(GL, main,, AC_MSG_ERROR(OpenGL is not installed)) dnl AC_CHECK_LIB(opengl32, main,, AC_MSG_ERROR(OpenGL is not installed)) AC_CHECK_LIB(z, gzopen,, AC_MSG_ERROR(libz is not installed)) AC_CHECK_LIB(png, png_read_info,, AC_MSG_ERROR(libpng is not installed)) dnl local data dir setup AC_ARG_ENABLE(localdata, AC_HELP_STRING([--enable-localdata],[Use local data directory @<:@default=no@:>@]), CPPFLAGSA="$CPPFLAGSA -DLOCAL_DATA", CPPFLAGSA="$CPPFLAGSA -DDATA_DIR=\\\"\$(datadir)/\$(PACKAGE)\\\"") dnl snapshot dir setup AC_ARG_WITH(snapshot-dir, AC_HELP_STRING([--with-snapshot-dir=@<:@path@:>@],[Snapshot directory @<:@default=~@:>@]), CPPFLAGSA="$CPPFLAGSA -DSNAP_DIR=\\\"$withval\\\"", CPPFLAGSA="$CPPFLAGSA -DSNAP_DIR=\\\"~\\\"") dnl preferences dir setup AC_ARG_WITH(preferences-dir, AC_HELP_STRING([--with-preferences-dir=@<:@path@:>@],[Preferences directory @<:@default=~@:>@]), CPPFLAGSA="$CPPFLAGSA -DPREF_DIR=\\\"$withval\\\"", CPPFLAGSA="$CPPFLAGSA -DPREF_DIR=\\\"~\\\"") dnl sound set-up AC_ARG_ENABLE(sound, AC_HELP_STRING([--disable-sound],[Don't compile in sound @<:@default=off@:>@]), use_sound=no, use_sound=yes) if test "x$use_sound" = xyes; then AC_CHECK_LIB(smpeg, main,, AC_MSG_WARN(smpeg not found - music playback may not work correctly)) AC_CHECK_LIB(ogg, main,, AC_MSG_WARN(ogg not found - music playback may not work correctly)) AC_CHECK_LIB(vorbis, main,, AC_MSG_WARN(vorbis not found - music playback may not work correctly)) AC_CHECK_LIB(vorbisfile, main,, AC_MSG_WARN(vorbisfile not found - music playback may not work correctly)) AC_CHECK_LIB(smpeg, main,, AC_MSG_WARN(smpeg not found - music playback may not work correctly)) AC_CHECK_LIB(mikmod, main,, AC_MSG_WARN(mikmod not found - music playback may not work correctly)) AC_CHECK_LIB(SDL_sound, Sound_Init, LIBS="-lSDL_sound $LIBS"; SOUND_OBJS="sound.o sound_glue.o Source.o Source3D.o SourceMusic.o SourceSample.o SoundSystem.o SourceCopy.o SourceEngine.o", AC_MSG_WARN(SDL_sound not found - disabling sound); SOUND_OBJS="sound_stubs.o sound_glue_stubs.o") AC_SUBST(SOUND_OBJS) else SOUND_OBJS="sound_stubs.o sound_glue_stubs.o" AC_SUBST(SOUND_OBJS) fi dnl network set-up AC_ARG_ENABLE(network, AC_HELP_STRING([--enable-network],[Experimental network mode @<:@default=off@:>@]), enable_network=$enableval, enable_network=off) if test "x$enable_network" = xyes; then AC_CHECK_LIB(SDL_net, SDLNet_Init, CFLAGS="$CFLAGS -DNETWORK"; LIBS="$LIBS -lSDL_net"; NETWORK_OBJS="network.o system_net.o", AC_MSG_WARN(SDL_net not found - disabling network)) AC_SUBST(NETWORK_OBJS) fi dnl CXXFLAGS="$CFLAGS" dnl header checks AC_HEADER_STDC AC_CHECK_HEADERS(unistd.h) AC_CHECK_HEADERS(GL/gl.h, have_gl_h=true, have_gl_h=false) $have_gl_h || { AC_CHECK_HEADERS(/usr/X11R6/include/GL/gl.h, includes_in_x=1 have_gl_h=true, have_gl_h=false) } $have_gl_h || { AC_CHECK_HEADERS(/usr/local/include/GL/gl.h, includes_in_local=1 have_gl_h=true, have_gl_h=false) } $have_gl_h || { AC_MSG_ERROR(cant find GL headers) } dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST dnl Checks for library functions. AC_CHECK_FUNCS(strstr mkstemp) CPPFLAGS="$CPPFLAGS $CPPFLAGSA" AC_OUTPUT([Makefile \ lua/Makefile \ lua/include/Makefile \ lua/src/Makefile \ lua/src/lib/Makefile \ nebu/Makefile \ nebu/include/Makefile \ nebu/include/audio/Makefile \ nebu/include/base/Makefile \ nebu/include/filesystem/Makefile \ nebu/include/input/Makefile \ nebu/include/scripting/Makefile \ nebu/include/video/Makefile \ nebu/base/Makefile \ nebu/filesystem/Makefile \ nebu/scripting/Makefile \ nebu/input/Makefile \ nebu/video/Makefile \ nebu/audio/Makefile src/Makefile \ src/include/Makefile \ src/include/audio/Makefile \ src/include/base/Makefile \ src/include/configuration/Makefile \ src/include/filesystem/Makefile \ src/include/game/Makefile \ src/include/input/Makefile \ src/include/scripting/Makefile \ src/include/video/Makefile \ src/base/Makefile \ src/filesystem/Makefile \ src/configuration/Makefile \ src/audio/Makefile \ src/video/Makefile \ src/input/Makefile \ src/game/Makefile \ art/Makefile \ art/default/Makefile \ data/Makefile \ music/Makefile \ scripts/Makefile \ ]) gltron-0.70/depcomp0000755000076400001440000002752507447137001010021 #! /bin/sh # depcomp - compile a program generating dependencies as side-effects # Copyright 1999, 2000 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # `libtool' can also be set to `yes' or `no'. depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. This file always lives in the current directory. # Also, the AIX compiler puts `$object:' at the start of each line; # $object doesn't have directory information. stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" outname="$stripped.o" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; tru64) # The Tru64 AIX compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. tmpdepfile1="$object.d" tmpdepfile2=`echo "$object" | sed -e 's/.o$/.d/'` if test "$libtool" = yes; then "$@" -Wc,-MD else "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a space and a tab in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. test -z "$dashmflag" && dashmflag=-M ( IFS=" " case " $* " in *" --mode=compile "*) # this is libtool, let us make it quiet for arg do # cycle over the arguments case "$arg" in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac "$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) # X makedepend ( shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift;; -*) ;; *) set fnord "$@" "$arg"; shift;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tail +3 "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. ( IFS=" " case " $* " in *" --mode=compile "*) for arg do # cycle over the arguments case $arg in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. ( IFS=" " case " $* " in *" --mode=compile "*) for arg do # cycle over the arguments case $arg in "--mode=compile") # insert --quiet before "--mode=compile" set fnord "$@" --quiet shift # fnord ;; esac set fnord "$@" "$arg" shift # fnord shift # "$arg" done ;; esac "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" ) & proc=$! "$@" stat=$? wait "$proc" if test "$stat" != 0; then exit $stat; fi rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 gltron-0.70/install-sh0000755000076400001440000001273607447137001010446 #!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 gltron-0.70/missing0000755000076400001440000002123107447137001010027 #! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing 0.3 - GNU automake" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar ${1+"$@"} && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar ${1+"$@"} && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" ${1+"$@"} && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" ${1+"$@"} && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 gltron-0.70/mkinstalldirs0000755000076400001440000000132207447137001011235 #! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here gltron-0.70/src/0000777000076400001440000000000007767023547007322 5gltron-0.70/src/gltron.c0000644000076400001440000000046507704041045010674 /* gltron Copyright (C) 1999 by Andreas Umbach */ #include "SDL.h" #include "game/init.h" #include "filesystem/path.h" #include "base/util.h" #include "SDL.h" int main(int argc, char *argv[] ) { initSubsystems(argc, argv); runScript(PATH_SCRIPTS, "main.lua"); return 0; } gltron-0.70/src/Makefile.am0000644000076400001440000000070307675155323011266 SUBDIRS = include filesystem base configuration audio video input game noinst_LIBRARIES = libGLtron.a libGLtron_a_SOURCES = libGLtron_a_LIBADD = \ base/libbase.a \ filesystem/libfilesystem.a \ audio/libaudio.a \ video/libvideo.a \ input/libinput.a \ game/libgame.a ## libNebu_a_LIBADD = \ ## base/libbase.a \ ## filesystem/libfilesystem.a \ ## scripting/libscripting.a \ ## audio/libaudio.a \ ## video/libvideo.a \ ## input/libinput.a gltron-0.70/src/Makefile.in0000644000076400001440000002460307767023246011304 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ SUBDIRS = include filesystem base configuration audio video input game noinst_LIBRARIES = libGLtron.a libGLtron_a_SOURCES = libGLtron_a_LIBADD = \ base/libbase.a \ filesystem/libfilesystem.a \ audio/libaudio.a \ video/libvideo.a \ input/libinput.a \ game/libgame.a subdir = src mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libGLtron_a_AR = $(AR) cru libGLtron_a_DEPENDENCIES = base/libbase.a filesystem/libfilesystem.a \ audio/libaudio.a video/libvideo.a input/libinput.a \ game/libgame.a am_libGLtron_a_OBJECTS = libGLtron_a_OBJECTS = $(am_libGLtron_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(libGLtron_a_SOURCES) RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ uninstall-info-recursive all-recursive install-data-recursive \ install-exec-recursive installdirs-recursive install-recursive \ uninstall-recursive check-recursive installcheck-recursive DIST_COMMON = Makefile.am Makefile.in DIST_SUBDIRS = $(SUBDIRS) SOURCES = $(libGLtron_a_SOURCES) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libGLtron.a: $(libGLtron_a_OBJECTS) $(libGLtron_a_DEPENDENCIES) -rm -f libGLtron.a $(libGLtron_a_AR) libGLtron.a $(libGLtron_a_OBJECTS) $(libGLtron_a_LIBADD) $(RANLIB) libGLtron.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = .. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done for subdir in $(SUBDIRS); do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ clean-generic clean-noinstLIBRARIES clean-recursive distclean \ distclean-compile distclean-generic distclean-recursive \ distclean-tags distdir dvi dvi-am dvi-recursive info info-am \ info-recursive install install-am install-data install-data-am \ install-data-recursive install-exec install-exec-am \ install-exec-recursive install-info install-info-am \ install-info-recursive install-man install-recursive \ install-strip installcheck installcheck-am installdirs \ installdirs-am installdirs-recursive maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-recursive \ tags tags-recursive uninstall uninstall-am uninstall-info-am \ uninstall-info-recursive uninstall-recursive # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/include/0000777000076400001440000000000007767023546010744 5gltron-0.70/src/include/Makefile.am0000644000076400001440000000011107675155477012714 SUBDIRS = audio base configuration filesystem game input scripting video gltron-0.70/src/include/Makefile.in0000644000076400001440000002211707767023247012726 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ SUBDIRS = audio base configuration filesystem game input scripting video subdir = src/include mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ uninstall-info-recursive all-recursive install-data-recursive \ install-exec-recursive installdirs-recursive install-recursive \ uninstall-recursive check-recursive installcheck-recursive DIST_COMMON = Makefile.am Makefile.in DIST_SUBDIRS = $(SUBDIRS) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/include/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done for subdir in $(SUBDIRS); do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ clean-generic clean-recursive distclean distclean-generic \ distclean-recursive distclean-tags distdir dvi dvi-am \ dvi-recursive info info-am info-recursive install install-am \ install-data install-data-am install-data-recursive \ install-exec install-exec-am install-exec-recursive \ install-info install-info-am install-info-recursive install-man \ install-recursive install-strip installcheck installcheck-am \ installdirs installdirs-am installdirs-recursive \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-recursive tags tags-recursive uninstall \ uninstall-am uninstall-info-am uninstall-info-recursive \ uninstall-recursive # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/include/audio/0000777000076400001440000000000007767023546012045 5gltron-0.70/src/include/audio/audio.h0000644000076400001440000000125107704041045013213 #ifndef AUDIO_H #define AUDIO_H #include "sound_glue.h" #define SONG_PREFIX "song_" /* menu sound enumerations */ enum { fx_action, fx_highlight }; #include "SDL.h" #include "SDL_sound.h" #include #include #include extern void Sound_loadFX(void); extern void Sound_init(void); extern void Sound_shutdown(void); extern void Sound_load(char *name); extern void Sound_play(void); extern void Sound_stop(void); extern void Sound_idle(void); extern void Sound_setMusicVolume(float volume); extern void Sound_setFxVolume(float volume); extern void Sound_reloadTrack(void); extern void Sound_initTracks(void); extern void Sound_setup(void); #endif gltron-0.70/src/include/audio/sound_glue.h0000644000076400001440000000122407704041045014256 #ifndef SOUND_GLUE_H #define SOUND_GLUE_H #ifdef __cplusplus extern "C" { #endif void Audio_EnableEngine(void); void Audio_DisableEngine(void); void Audio_Idle(void); void Audio_CrashPlayer(int player); void Audio_LoadPlayers(void); void Audio_Init(void); void Audio_Start(void); void Audio_Quit(void); void Audio_LoadPlayers(void); void Audio_LoadSample(char *name, int number); void Audio_LoadMusic(char *name); void Audio_PlayMusic(void); void Audio_StopMusic(void); void Audio_SetMusicVolume(float volume); void Audio_SetFxVolume(float volume); void Audio_StartEngine(int player); void Audio_StopEngine(int player); #ifdef __cplusplus } #endif #endif gltron-0.70/src/include/audio/Makefile.am0000644000076400001440000000004607675155477014024 noinst_HEADERS = audio.h sound_glue.h gltron-0.70/src/include/audio/Makefile.in0000644000076400001440000001357307767023247014035 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = audio.h sound_glue.h subdir = src/include/audio mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/include/audio/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/include/base/0000777000076400001440000000000007767023546011656 5gltron-0.70/src/include/base/switchCallbacks.h0000644000076400001440000000075207704041045015031 #ifndef SWITCHCALLBACKS_H #define SWITCHCALLBACKS_H #include "Nebu_base.h" extern Callbacks gameCallbacks; extern Callbacks guiCallbacks; extern Callbacks pauseCallbacks; extern Callbacks configureCallbacks; extern Callbacks promptCallbacks; extern Callbacks creditsCallbacks; extern Callbacks timedemoCallbacks; extern void restoreCallbacks(void); extern void switchCallbacks(Callbacks* callbacks); extern void updateCallbacks(void); extern void setCallback(const char *name); #endif gltron-0.70/src/include/base/util.h0000644000076400001440000000012407674616531012714 #ifndef UTIL_H #define UTIL_H void runScript(int ePath, const char *name); #endif gltron-0.70/src/include/base/Makefile.am0000644000076400001440000000005207675155477013632 noinst_HEADERS = switchCallbacks.h util.h gltron-0.70/src/include/base/Makefile.in0000644000076400001440000001357507767023247013650 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = switchCallbacks.h util.h subdir = src/include/base mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/include/base/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/include/configuration/0000777000076400001440000000000007767023546013613 5gltron-0.70/src/include/configuration/configuration.h0000644000076400001440000000041407764076762016553 #ifndef CONFIGURATION_H #define CONFIGURATION_H extern void parse_args(int argc, const char *argv[]); extern void updateSettingsCache(void); extern void initColors(void); extern void checkSettings(void); extern void saveSettings(void); #include "settings.h" #endif gltron-0.70/src/include/configuration/settings.h0000644000076400001440000000227107766302265015537 #ifndef SETTINGS_H #define SETTINGS_H /* * SettingsCache - A Structure for storing lua settings during play to * avoid the overhead of fetching from lua repeatedly. Values should be * considered and const as they are never written back out to lua. */ typedef struct SettingsCache { int use_stencil; int show_scores; int show_ai_status; int ai_level; int show_fps; int show_console; int softwareRendering; int show_floor_texture; int line_spacing; int antialias_lines; int show_decals; int alpha_trails; int turn_cycle; int light_cycles; int lod; float fov; int stretch_textures; int show_skybox; int show_recognizer; int show_impact; int show_glow; int show_wall; int fast_finish; int playMusic; int playEffects; int camType; float znear; float clear_color[4]; float map_ratio_w, map_ratio_h; } SettingsCache; extern int isSetting(const char *name); extern float getSettingf(const char *name); extern int getSettingi(const char *name); extern float getVideoSettingf(const char *name); extern int getVideoSettingi(const char *name); extern void setSettingf(const char *name, float f); extern void setSettingi(const char *name, int i); #endif gltron-0.70/src/include/configuration/Makefile.am0000644000076400001440000000005407675155477015571 noinst_HEADERS = configuration.h settings.h gltron-0.70/src/include/configuration/Makefile.in0000644000076400001440000001362107767023247015575 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = configuration.h settings.h subdir = src/include/configuration mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/include/configuration/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/include/filesystem/0000777000076400001440000000000007767023546013130 5gltron-0.70/src/include/filesystem/dirsetup.h0000644000076400001440000000020407704041045015031 #ifndef DIRSETUP_H #define DIRESTUP_H #include "path.h" void dirSetup(const char *executable); const char* getHome(void); #endif gltron-0.70/src/include/filesystem/path.h0000644000076400001440000000070107704041045014130 #ifndef PATH_H #define PATH_H extern const char* getDirectory(int eLocation); extern char* getPath(int eLocation, const char *filename); extern char* getPossiblePath(int eLocation, const char *filename); extern char* getArtPath(const char *artpack, const char *filename); extern void initDirectories(void); enum { PATH_PREFERENCES = 0, PATH_SNAPSHOTS, /* demos, screenshots */ PATH_DATA, PATH_SCRIPTS, PATH_MUSIC, PATH_ART }; #endif gltron-0.70/src/include/filesystem/Makefile.am0000644000076400001440000000004307675155477015104 noinst_HEADERS = dirsetup.h path.h gltron-0.70/src/include/filesystem/Makefile.in0000644000076400001440000001360207767023247015111 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = dirsetup.h path.h subdir = src/include/filesystem mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/include/filesystem/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/include/game/0000777000076400001440000000000007767023546011655 5gltron-0.70/src/include/game/camera.h0000644000076400001440000000117507704041045013157 #ifndef CAMERA_H #define CAMERA_H typedef struct { int interpolated_cam; int interpolated_target; int coupled; int freedom[3]; int type; } CameraType; typedef struct { float cam[3]; float target[3]; float movement[4]; /* indices CAM_R, CAM_CHI, CAM_PHI, CAM_PHI_OFFSET */ CameraType type; } Camera; enum { CAM_FREE_R = 0, CAM_FREE_PHI, CAM_FREE_CHI }; enum { CAM_CIRCLE = 0, CAM_FOLLOW, CAM_COCKPIT, CAM_FREE }; enum { CAM_R = 0, CAM_CHI, CAM_PHI, CAM_PHI_OFFSET }; extern char *cam_names[]; extern float cam_defaults[][3]; void nextCameraType(void); void doCameraMovement(void); #endif gltron-0.70/src/include/game/client_data.h0000644000076400001440000000006607674616531014212 #ifndef CLIENT_DATA_H #define CLIENT_DATA_H #endif gltron-0.70/src/include/game/data.h0000644000076400001440000000052207675152736012654 #ifndef DATA_H #define DATA_H #include "basic_types.h" #include "game_data.h" #include "client_data.h" /* general data structures */ #define PLAYER_IS_ACTIVE(x) ((x)->data->speed > 0) enum { GAME_SINGLE = 1, #ifdef RECORD GAME_SINGLE_RECORD = 2, GAME_PLAY = 4, GAME_PLAY_NETWORK = 8, GAME_NETWORK_RECORD #endif }; #endif gltron-0.70/src/include/game/engine.h0000644000076400001440000000036207704041045013171 #ifndef ENGINE_H #define ENGINE_H #include "event.h" extern void doLeftTurn(GameEvent *e); extern void doRightTurn(GameEvent *e); extern void doCrashPlayer(GameEvent *e); extern int getCol(int x, int y); extern void initData(void); #endif gltron-0.70/src/include/game/event.h0000644000076400001440000000064207674616531013064 #ifndef EVENT_H #define EVENT_H typedef enum { EVENT_TURN_LEFT = 1, EVENT_TURN_RIGHT = 2, EVENT_CRASH = 4, EVENT_STOP = 8 } event_type_e; typedef struct GameEvent { int type; /* what */ int player; /* who */ float x; /* where */ float y; unsigned int timestamp; } GameEvent; extern void createEvent(int player, event_type_e eventType); extern int processEvent(GameEvent *e); #endif /* EVENT_H */ gltron-0.70/src/include/game/game.h0000644000076400001440000000416007766642731012656 #ifndef GAME_H #define GAME_H #include "game_data.h" #include "engine.h" #include "event.h" #include "Nebu_base.h" /* use enums, not magic */ enum { TURN_LEFT = 3, TURN_RIGHT = 1 }; enum { AI_HUMAN = 0, AI_COMPUTER = 1, AI_NONE = 2 }; enum { RETURN_GAME_LAUNCH = 0, RETURN_GAME_END, RETURN_GAME_PAUSE, RETURN_GAME_UNPAUSE, RETURN_GAME_CREDITS, RETURN_GAME_ESCAPE, RETURN_GUI_PROMPT, RETURN_TIMEDEMO, RETURN_TIMEDEMO_ABORT, RETURN_CREDITS, RETURN_QUIT, RETURN_GUI_ESCAPE, RETURN_PROMPT_ESCAPE, RETURN_PAUSE_ESCAPE }; /* physics recomputed every 10ms */ #define PHYSICS_RATE 20 #define PLAYERS 4 #define MAX_PLAYERS 4 #define MAX_TRAIL 1000 /* these must be < 0 */ #define SPEED_CRASHED -1 #define SPEED_GONE -2 #define TRAIL_HEIGHT 3.5f /* game options */ #define SPEED_OZ_FREQ 1200 #define SPEED_OZ_FACTOR 0.09f #define TURN_LENGTH 200 #define FAST_FINISH 40 enum { PAUSE_NO_GAME = 0, PAUSE_GAME_RUNNING, PAUSE_GAME_FINISHED, PAUSE_GAME_SUSPENDED, PAUSE_DEMO_NEW, PAUSE_DEMO_RUNNING, }; extern Game main_game; extern Game *game; extern Game2 main_game2; extern Game2 *game2; extern SettingsCache gSettingsCache; extern segment2 walls[]; extern int dirsX[]; extern int dirsY[]; extern float default_speeds[]; extern int default_arena_sizes[]; /* ai -> computer.c */ extern void initGameAI(int level); extern void doComputer(int player, int target); extern void resetScores(void); extern void doTurn(GameEvent* e, int direction); extern List* doMovement(int mode, int dt); extern void writePosition(int player); extern void initGameStructures(void); extern void initClientData(void); extern void Game_Idle(void); extern void enterGame(void); extern void exitGame(void); extern void gameMouseMotion(int x, int y); extern void gameMouse(int buttons, int state, int x, int y); extern void resetVideoData(void); extern void resetPlayerData(void); extern void doCameraMovement(void); extern void initCamera(Camera *cam, Data *data, int type); extern void initWalls(void); extern void getPositionFromIndex(float *x, float *y, int player); extern void getPositionFromData(float *x, float *y, Data *data); #endif gltron-0.70/src/include/game/game_data.h0000644000076400001440000000316007764076763013652 #ifndef GAME_DATA_H #define GAME_DATA_H #include "Nebu_base.h" #include "Nebu_filesystem.h" #include "configuration/configuration.h" #include "game/camera.h" #define PLAYER_IS_ACTIVE(x) ((x)->data->speed > 0) enum { GAME_SINGLE = 1 #ifdef RECORD , GAME_SINGLE_RECORD = 2, GAME_PLAY = 4, GAME_PLAY_NETWORK = 8, GAME_NETWORK_RECORD #endif }; typedef struct Grid { int width, height; unsigned char *data; } Grid; /* this struct contains all the necessary parameters to define a game round (except number of players) any change forces a restart of the round */ typedef struct RuleSet { int eraseCrashed; float speed; int grid_size; } RuleSet; typedef struct Game2 { Grid grid; RuleSet rules; int mode; int players; int *startPositions; SystemTime time; List events; FILE *record; FILE *play; // Input input; } Game2; typedef struct Data { int dir; int score; float speed; /* set to -1 when dead */ float booster; int boost_enabled; float trail_height; int last_dir; unsigned int turn_time; /* for cycle animation */ segment2 *trails; int trailOffset; } Data; typedef struct AI { int active; int tdiff; long lasttime; segment2 left, right, front, backleft; } AI; typedef struct Player { Camera *camera; Data *data; AI *ai; } Player; typedef struct Game { Player *player; int players; /* number of players - currently limited to 4 somewhere */ int winner; /* who won this round */ int pauseflag; /* if the game is finished: the PAUSE_GAME_FINISHED flag is set */ int running; /* the amount of players that are still alive */ } Game; #endif gltron-0.70/src/include/game/gltron.h0000644000076400001440000000142207674616532013246 #ifndef GLTRON_H #define GLTRON_H /* gltron Copyright (C) 1999 by Andreas Umbach */ #define RC_NAME ".gltronrc" /* Win32 port maintained by Andreas Umbach */ #ifdef WIN32 #include #undef RC_NAME #define RC_NAME "gltron.ini" #endif /* WIN32 */ /* MacOS port maintained by Darrell Walisser */ #ifdef macintosh /* os9/classic */ #include #undef RC_NAME #define RC_NAME "gltronPrefs.txt" #endif #ifdef __APPLE__ /* osx */ #undef RC_NAME #define RC_NAME "gltronPrefs.txt" #endif /* the engine */ #include "Nebu.h" /* subsystems */ #include "game/game.h" #include "configuration/configuration.h" #include "video/video.h" #include "audio/audio.h" #include "input/input.h" #endif /* GLTRON_H */ gltron-0.70/src/include/game/init.h0000644000076400001440000000063707704260731012701 #ifndef INIT_H #define INIT_H extern void initSubsystems(int argc, const char *argv[]); extern void initScripting(void); extern void initConfiguration(int argc, const char *argv[]); extern void initVideo(void); extern void initAudio(void); extern void initInput(void); extern void initGame(void); /* platform stuff */ extern void videoInit(void); extern void audioInit(void); extern void inputInit(void); #endif gltron-0.70/src/include/game/menu.h0000644000076400001440000000122207674616532012703 #ifndef MENU_H #define MENU_H extern float menu_fgColor[4]; extern float menu_hlColor1[4]; extern float menu_hlColor2[4]; typedef struct { /* FontTex *font; */ float fgColor[4]; /* entries */ float hlColor1[4]; /* the highlighted one */ float hlColor2[4]; char szCaption[64]; } mDisplay; typedef struct Menu { int nEntries; int iHighlight; mDisplay display; char szName[64]; char szCapFormat[64]; struct Menu** pEntries; struct Menu* parent; void* param; /* reserved to bind parameters at runtime */ } Menu; typedef struct { void* data; void* next; } node; /* fixme: this variable is a hack */ extern int menutime; #endif gltron-0.70/src/include/game/timedemo.h0000644000076400001440000000003307674616532013541 #ifndef TIMEDEMO_H #endif gltron-0.70/src/include/game/timesystem.h0000644000076400001440000000011107704041045014117 #ifndef TIMESYSTEM_H #define TIMESYSTEM_H void Time_Idle(void); #endif gltron-0.70/src/include/game/ai.h0000644000076400001440000000137707755147554012346 typedef struct { int location; segment2 player; segment2 opponent; vec2 intersection; float t_player, t_opponent; } AI_Configuration; typedef struct { float front, left, right, backleft; } AI_Distances; typedef struct { int minTurnTime[4]; float maxSegLength[4]; float critical[4]; int spiral[4]; int rlDelta[4]; } AI_Parameters; extern AI_Parameters ai_params; void ai_getDistances(int player, AI_Distances *distances); void ai_getClosestOpponent(int player, int* opponent, float *distance); void ai_getConfig(int player, int opponent, AI_Configuration *config); void ai_aggressive(int player, int opponent, int location, AI_Distances *distances); void ai_evasive(int player, int opponent, int location, AI_Distances *distances); gltron-0.70/src/include/game/Makefile.am0000644000076400001440000000020707753205560013615 noinst_HEADERS = camera.h client_data.h data.h engine.h event.h game.h game_data.h gltron.h init.h menu.h timedemo.h timesystem.h ai.h gltron-0.70/src/include/game/Makefile.in0000644000076400001440000001373207767023247013642 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = camera.h client_data.h data.h engine.h event.h game.h game_data.h gltron.h init.h menu.h timedemo.h timesystem.h ai.h subdir = src/include/game mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/include/game/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/include/input/0000777000076400001440000000000007767023546012103 5gltron-0.70/src/include/input/input.h0000644000076400001440000000052207706273106013316 #ifndef INPUT_H #define INPUT_H typedef struct { int mouse1; int mouse2; int mousex; int mousey; } Input; #define MOUSE_ORIG_X 100 #define MOUSE_ORIG_Y 100 #define MOUSE_CX 0.003f #define MOUSE_CY 0.003f void keyGame(int state, int key, int x, int y); void Input_Idle(); extern int joy_threshold; extern Input gInput; #endif gltron-0.70/src/include/input/Makefile.am0000644000076400001440000000003107675155500014037 noinst_HEADERS = input.h gltron-0.70/src/include/input/Makefile.in0000644000076400001440000001355607767023250014066 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = input.h subdir = src/include/input mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/include/input/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/include/scripting/0000777000076400001440000000000007767023546012746 5gltron-0.70/src/include/scripting/scripting.h0000644000076400001440000000012507704041045015014 #ifndef SCRIPTING_H #define SCRIPTING_H extern void init_c_interface(void); #endif gltron-0.70/src/include/scripting/Makefile.am0000644000076400001440000000003507675155500014706 noinst_HEADERS = scripting.h gltron-0.70/src/include/scripting/Makefile.in0000644000076400001440000001357207767023250014727 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = scripting.h subdir = src/include/scripting mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/include/scripting/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/include/video/0000777000076400001440000000000007767023547012053 5gltron-0.70/src/include/video/explosion.h0000644000076400001440000000015507674616532014160 #ifndef EXPLOSION_H #define EXPLOSION_H void drawExplosion(float *spire_radius); #endif /* EXPLOSION_H */ gltron-0.70/src/include/video/fonttex.h0000644000076400001440000000061607674616532013631 #ifndef FONTTEX_H #define FONTTEX_H typedef struct { int nTextures; int texwidth; /* texture width */ int width; /* character width */ int lower; /* lowest ascii character (normally: 32) */ int upper; /* highest ascii character (normally: 126) */ int *texID; char *fontname; char *bitmapname; int bitmapTexwidth; int bitmapWidth; /* character width */ } FontTex; #endif gltron-0.70/src/include/video/graphics_fx.h0000644000076400001440000000036307674616532014436 #ifndef GRAPHICS_FX_H #define GRAPHICS_FX_H #include "video.h" #include "game/game.h" extern void drawImpact(PlayerVisual *pV); extern void drawGlow(Camera *pCam, Player *pTarget, PlayerVisual *pV, Visual *d, float dim); #endif gltron-0.70/src/include/video/graphics_hud.h0000644000076400001440000000051207674616532014575 #ifndef GRAPHICS_HUD_H #define GRAPHICS_HUD_H #include "video.h" #include "game/game.h" extern void drawAI(Visual *d); extern void drawPause(Visual *d); extern void drawScore(Player *p, Visual *d); extern void drawFPS(Visual *d); extern void drawConsoleLines(char *line, int call); extern void drawConsole(Visual *d); #endif gltron-0.70/src/include/video/graphics_lights.h0000644000076400001440000000021707674616532015311 #ifndef GRAPHICS_LIGHTS_H #define GRAPHICS_LIGHTS_H extern void setupLights(int type); enum { eCycles = 0, eRecognizer, eWorld }; #endif gltron-0.70/src/include/video/graphics_utility.h0000644000076400001440000000056607674616532015531 #ifndef GRAPHICS_UTILITY_H #define GRAPHICS_UTILITY_H #include "video.h" extern void checkGLError(const char *where); extern void rasonly(Visual *d); extern void doPerspective(float fov, float ratio, float znear, float zfar); extern void doLookAt(float *cam, float *target, float *up); extern void drawText(FontTex* ftx, int x, int y, int size, const char *text); #endif gltron-0.70/src/include/video/graphics_world.h0000644000076400001440000000037407674616532015152 #ifndef GRAPHICS_WORLD_H #define GRAPHICS_WORLD_H void drawWalls(void); int drawFloorTextured(int grid_size, GLuint texture); void drawFloorGrid(int grid_size, int line_spacing, float line_color[4], float square_color[4]); #endif gltron-0.70/src/include/video/model.h0000644000076400001440000000236207705324072013230 #ifndef MODEL_H #define MODEL_H #ifdef __cplusplus extern "C" { #endif #define MAX_VERTICES 30000 #define MAX_FACES 20000 #define MAX_NORMALS 30000 #define MAX_MATERIALS 200 #define BUF_SIZE 120 #define NO_SDL_GLEXT #include "SDL_opengl.h" // #include #include "Nebu_base.h" #include "Nebu_filesystem.h" typedef struct { float ambient[4]; float diffuse[4]; float specular[4]; float shininess; char *name; char *map_diffuse; } Material; typedef struct { vec3 vMin; vec3 vSize; float fRadius; } BoundingBox; typedef struct { GLfloat *pVertices; GLfloat *pNormals; GLshort **ppIndices; int nVertices, nNormals, nMaterials; Material* pMaterials; int *pnFaces; BoundingBox BBox; } Mesh; typedef enum { TRI_MESH, QUAD_MESH } MeshType; extern Mesh* readMeshFromFile(const char* filename, MeshType type); extern void drawModel(Mesh* pMesh, MeshType type); extern void drawModelExplosion(Mesh *pMesh, float fRadius); typedef enum { eAmbient = 0, eDiffuse, eSpecular } ColorType; extern void SetMaterialColor(Mesh *pMesh, char *name, ColorType eType, float pColor[4]); extern void computeBBox(Mesh* pMesh); extern int polycount; #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* MODEL_H */ gltron-0.70/src/include/video/recognizer.h0000644000076400001440000000043507731371365014304 #ifndef RECOGNIZER_H #define RECOGNIZER_H #include "Nebu_base.h" extern void resetRecognizer(void); extern void doRecognizerMovement(void); extern void drawRecognizer(void); extern void drawRecognizerShadow(void); extern void getRecognizerPositionVelocity(vec2 *p, vec2 *v); #endif gltron-0.70/src/include/video/skybox.h0000644000076400001440000000023507704041045013437 #ifndef SKYBOX_H #define SKYBOX_H void enableSkyboxTexture(void); void disableSkyboxTexture(void); void drawSkybox(int grid_size); #endif /* SKYBOX_H */ gltron-0.70/src/include/video/texture.h0000644000076400001440000000063107674616532013637 #ifndef TEXTURE_H #define TEXTURE_H typedef struct { int count; char name[48]; int type; int wrap_s; int wrap_t; int id; float anisotropy; } TextureInfo; enum { TEX_FLOOR = 0, TEX_GUI, TEX_LOGO, TEX_WALL1, TEX_WALL2, TEX_WALL3, TEX_WALL4, TEX_IMPACT, TEX_TRAIL, TEX_DECAL, TEX_DEBUG, TEX_SKYBOX, /* insert all texture tokens before TEX_COUNT */ TEX_COUNT }; #endif gltron-0.70/src/include/video/trail_geometry.h0000644000076400001440000000214707731373201015154 #ifndef TRAIL_GEOMETRY_H #define TRAIL_GEOMETRY_H #include "video.h" #include "game/game.h" typedef struct { vec3* pVertices; // each vertex consists of three floats vec3* pNormals; // each normal consists of three float vec2* pTexCoords; // each texcoord consists of three float unsigned short *pIndices; // each triangle consists of three 16bit indices unsigned char *pColors; // each vertex color consists of 4 bytes unsigned int iSize; unsigned int iUsed; } TrailMesh; void storeVertex(TrailMesh *pMesh, int offset, segment2 *s, float t, float fFloor, float fTop, float fSegLength, float fTotalLength); void storeIndices(TrailMesh *pMesh, int indexOffset, int vertexOffset); void trailGeometry(Player *pPlayer, PlayerVisual *pV, TrailMesh *pMesh, int *pVertexOffset, int *pIndexOffset); void bowGeometry(Player *pPlayer, PlayerVisual *pV, TrailMesh *pMesh, int *pVertexOffset, int *pIndexOffset); void trailRender(TrailMesh *pMesh); void trailStatesNormal(Player *pPlayer, int texture); void trailStatesShadowed(void); void trailStatesRestore(void); #endif gltron-0.70/src/include/video/video.h0000644000076400001440000001461507731371701013242 #ifndef VIDEO_H #define VIDEO_H #include "game/camera.h" #include "video/fonttex.h" #include "video/model.h" #include "Nebu_video.h" /* dropped support for anything else than libpng */ #include typedef png_texture texture; #define LOAD_TEX(x) load_png_texture(x) #define TEX_SUFFIX ".png" typedef struct { char *path; /* char *name; currently ignored */ } Artpack; typedef struct { Visual display; float pColorDiffuse[4]; float pColorSpecular[4]; float pColorAlpha[4]; // unsigned int turn_time; /* for cycle animation */ unsigned int spoke_time; /* for cycle wheel animation */ int spoke_state; /* showing spoke or not */ /* explosion stuff */ float impact_radius; float exp_radius; /* explosion of the cycle model */ } PlayerVisual; enum { VP_SINGLE = 0, VP_SPLIT = 1, VP_FOURWAY = 2 }; // Viewport Type; #include "recognizer.h" /* rendering stuff */ #include "explosion.h" #include "graphics_utility.h" #include "graphics_fx.h" #include "graphics_hud.h" #include "graphics_lights.h" #include "graphics_world.h" #include "trail_geometry.h" /* resource management */ #include "texture.h" extern int game_textures; extern int n_textures; extern TextureInfo textures[]; /* artpack stuff */ extern void initArtpacks(void); extern void loadArt(void); extern void reloadArt(void); /* graphics libs */ // #include "extgl.h" // #include #define NO_SDL_GLEXT #include "SDL_opengl.h" // #include enum { NEAREST = 0, LINEAR, MIPMAP, TRILINEAR }; #define PI ((float) M_PI) #ifdef WIN32 #define floorf (float)floor #define fabsf (float)fabs #define sqrtf (float)sqrt #define cosf (float) cos #define sinf (float) sin #define acosf (float) acos #define tanf (float) tan #endif #define B_HEIGHT 0 #define CYCLE_HEIGHT 8 #define RECOGNIZER_HEIGHT 50 #define WALL_H 12 /* global constants */ #define CAM_TYPE_CIRCLING 0 #define CAM_TYPE_FOLLOW 1 #define CAM_TYPE_COCKPIT 2 #define CAM_TYPE_MOUSE 3 #define CAM_COUNT 4 #define CAM_CIRCLE_DIST 17 #define CAM_CIRCLE_Z 8.0f #define CAM_FOLLOW_DIST 18 #define CAM_FOLLOW_Z 6.0f #define CAM_FOLLOW_SPEED 0.05f #define CAM_FOLLOW_SPEED_FACTOR 1.0f / 82.0f #define CAM_SPEED 0.000349f #define CAM_COCKPIT_Z 4 #define CAM_R_MIN 2.0 #define CAM_R_MAX 100 #define CAM_CHI_MIN PI / 6 #define CAM_CHI_MAX PI / 2 - PI / 6 #define CAM_DR 6.4f #define EXP_RADIUS_MAX 30 #define EXP_RADIUS_DELTA 0.01f /* trail definitions */ #define DECAL_WIDTH 20.0f #define BOW_LENGTH 6 #define BOW_DIST3 2 #define BOW_DIST2 0.85f #define BOW_DIST1 0.4f extern int gl_error; extern int viewport_content[4]; extern float camAngle; extern float cam_phi; extern float cam_chi; extern float cam_r_mouse; extern float cam_r_follow; extern float cam_r_circle; #ifdef DEPTH_SORT extern int quadBufSize; extern Quad* quadBuf; extern int* quadBufIndex; #endif #define LC_LOD 3 extern char *lc_lod_names[]; extern Mesh *recognizer; extern Mesh *recognizer_quad; extern float rec_outline_color[3]; extern float rec_spec_color[4]; extern Mesh *lightcycle[]; /* extern TexFont *txf; */ extern FontTex *gameFtx; extern FontTex *guiFtx; extern int fontID; #define MAX_FONTS 17 extern float camAngles[]; extern int polycount; extern float colors_trail_diffuse[][4]; extern float colors_model_diffuse[][4]; extern float colors_model_specular[][4]; extern int vps; extern int vp_max[]; extern float vp_x[4][4]; extern float vp_y[4][4]; extern float vp_w[4][4]; extern float vp_h[4][4]; extern unsigned char debugcolors[6][4]; extern float shadow_color[4]; extern float shadow_matrix[16]; /* pixel stuff */ extern unsigned char* loadPixels(const char *filename, Visual *d); extern unsigned char* scalePixels(const unsigned char *source, int sw, int sh, int x, int y, int w, int h, int dw, int dh, int bytes); /* font stuff ->fonts.c */ extern void initFonts(void); extern void deleteFonts(void); extern void draw( void ); /* FontTex stuff */ extern texture* loadTextureData(const char *filename); extern void freeTextureData(texture *tex); extern FontTex *ftxLoadFont(const char *filename); extern void ftxUnloadFont(FontTex *ftx); extern void loadTexture(const char *filename, int format); /* It's not necessary to bind the texture explicitly. */ /* (and we don't know which texture to bind) */ /* ftxRenderString will take care of that */ /* extern void ftxBindFontTexture(fontTex *ftx); */ extern void ftxRenderString(FontTex *ftx, const char *string, int len); /* extern void ftxGetStringWidth(fontTex *ftx, */ /* const char *string, int len, int *width); */ /* can't get max_ascent, max_descent yet */ extern void doTrail(segment2 *t, int value); extern void initDisplay(Visual *d, int type, int p, int onScreen); extern void changeDisplay(int view); extern void updateDisplay(int vpType); /* vp types defined in data.h */ extern void drawGame(void); extern void displayGame(void); extern void initGLGame(void); extern void shutdownDisplay(Visual *d); extern void setupDisplay(Visual *d); extern void initFonts(void); extern void initTexture(Visual*); extern void deleteTextures(Visual*); /* texture loading -> load_texture.c */ /* uses sgi_texture.c or sdl_texture.c */ extern void loadTexture(const char *filename, int format); /* screenshot.c */ extern void doBmpScreenShot(Visual *display); extern void doPngScreenShot(Visual *display); /* probably common graphics stuff -> graphics.c */ extern void rasonly(Visual *d); extern int hsv2rgb(float, float, float, float*, float*, float*); extern void colorDisc(void); /* gltron game graphics -> gamegraphics.c */ extern void rebuildDebugTex(void); extern void drawDebugLines(Visual *d); extern void drawDebugTex(Visual *d); /* extern void drawHelp(Visual *d); */ extern void drawPlayers(Player *p, PlayerVisual *pV); extern void drawCam(Player *p, PlayerVisual *pV); extern void draw2D( Visual *d ); /* trail.c */ extern void drawTrailLines(Player *p, PlayerVisual *pV); extern void drawTrailShadow(Player *p, PlayerVisual *pV); extern float getSegmentUV(segment2 *line); extern float getSegmentEndUV(segment2 *line, Data *data); extern float getSegmentEndX(Data *data, int type); extern float getSegmentEndY(Data *data, int type); extern void drawMenu(Visual *d); extern void initVideoData(void); extern void initGameScreen(void); extern void Video_Idle(void); extern Visual *gScreen; extern int gViewportType; extern int video_initialized; extern PlayerVisual *gPlayerVisuals; #endif gltron-0.70/src/include/video/Makefile.am0000644000076400001440000000027307675155500014016 noinst_HEADERS = explosion.h fonttex.h graphics_fx.h graphics_hud.h graphics_lights.h graphics_utility.h graphics_world.h model.h recognizer.h skybox.h texture.h trail_geometry.h video.h gltron-0.70/src/include/video/Makefile.in0000644000076400001440000001402007767023250014020 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = explosion.h fonttex.h graphics_fx.h graphics_hud.h graphics_lights.h graphics_utility.h graphics_world.h model.h recognizer.h skybox.h texture.h trail_geometry.h video.h subdir = src/include/video mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/include/video/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/filesystem/0000777000076400001440000000000007767023547011506 5gltron-0.70/src/filesystem/Makefile.am0000644000076400001440000000023507675152620013447 noinst_LIBRARIES=libfilesystem.a libfilesystem_a_SOURCES = \ path.c dirsetup.c AM_CFLAGS = \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include gltron-0.70/src/filesystem/Makefile.in0000644000076400001440000001760307767023247013473 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libfilesystem.a libfilesystem_a_SOURCES = \ path.c dirsetup.c AM_CFLAGS = \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include subdir = src/filesystem mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libfilesystem_a_AR = $(AR) cru libfilesystem_a_LIBADD = am_libfilesystem_a_OBJECTS = path.$(OBJEXT) dirsetup.$(OBJEXT) libfilesystem_a_OBJECTS = $(am_libfilesystem_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/dirsetup.Po $(DEPDIR)/path.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(libfilesystem_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libfilesystem_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/filesystem/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libfilesystem.a: $(libfilesystem_a_OBJECTS) $(libfilesystem_a_DEPENDENCIES) -rm -f libfilesystem.a $(libfilesystem_a_AR) libfilesystem.a $(libfilesystem_a_OBJECTS) $(libfilesystem_a_LIBADD) $(RANLIB) libfilesystem.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/dirsetup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/path.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/filesystem/path.c0000644000076400001440000000603207707044300012503 #include "filesystem/path.h" #include "filesystem/dirsetup.h" #include "Nebu_filesystem.h" #include #include #include #include // #include #include #ifndef PATH_MAX // #warning PATH_MAX "is not defined in limits.h!" #define PATH_MAX 255 #endif static char preferences_dir[PATH_MAX]; static char snapshots_dir[PATH_MAX]; static char data_dir[PATH_MAX]; static char art_dir[PATH_MAX]; static char music_dir[PATH_MAX]; static char scripts_dir[PATH_MAX]; void initDirectories(void) { if(PREF_DIR[0] != '~') sprintf(preferences_dir, PREF_DIR); else sprintf(preferences_dir, "%s%s", getHome(), PREF_DIR + 1); if(SNAP_DIR[0] != '~') sprintf(snapshots_dir, SNAP_DIR); else sprintf(snapshots_dir, "%s%s", getHome(), SNAP_DIR + 1); #ifdef LOCAL_DATA #ifdef macintosh sprintf(data_dir, ":data"); sprintf(art_dir, ":art"); sprintf(scripts_dir, ":scripts"); sprintf(music_dir, ":music"); #else sprintf(data_dir, "data"); sprintf(art_dir, "art"); sprintf(scripts_dir, "scripts"); sprintf(music_dir, "music"); #endif #else sprintf(data_dir, "%s%c%s", DATA_DIR, SEPARATOR, "data"); sprintf(art_dir, "%s%c%s", DATA_DIR, SEPARATOR, "art"); sprintf(scripts_dir, "%s%c%s", DATA_DIR, SEPARATOR, "scripts"); sprintf(music_dir, "%s%c%s", DATA_DIR, SEPARATOR, "music"); #endif /* printf("directories:\n" "\tprefs: %s\n" "\tsnaps: %s\n" "\tdata: %s\n" "\tart: %s\n" "\tscripts: %s\n" "\tmusic: %s\n", preferences_dir, snapshots_dir, data_dir, art_dir, scripts_dir, music_dir); */ makeDirectory(preferences_dir); makeDirectory(snapshots_dir); } char* getPath( int eLocation, const char *filename) { char *path = getPossiblePath( eLocation, filename ); if( fileExists(path) ) return path; fprintf(stderr, "*** failed to locate file '%s' at '%s' (type %d)\n", filename, path, eLocation); assert(0); free(path); return NULL; } char* getPossiblePath( int eLocation, const char *filename ) { char *path = malloc( PATH_MAX ); sprintf(path, "%s%c%s", getDirectory( eLocation ), SEPARATOR, filename); return path; } const char* getDirectory( int eLocation ) { switch( eLocation ) { case PATH_PREFERENCES: return preferences_dir; break; case PATH_SNAPSHOTS: return snapshots_dir; break; case PATH_DATA: return data_dir; break; case PATH_SCRIPTS: return scripts_dir; break; case PATH_MUSIC: return music_dir; break; case PATH_ART: return art_dir; break; default: fprintf(stderr, "invalid path type\n"); assert(0); } return NULL; } char *getArtPath(const char *artpack, const char *filename ) { char *path = malloc( PATH_MAX ); sprintf(path, "%s%c%s%c%s", art_dir, SEPARATOR, artpack, SEPARATOR, filename); if( fileExists(path) ) return path; sprintf(path, "%s%c%s%c%s", art_dir, SEPARATOR, "default", SEPARATOR, filename); if( fileExists(path) ) return path; fprintf(stderr, "*** failed to locate art file '%s', giving up\n", filename); assert(0); free(path); return NULL; } gltron-0.70/src/filesystem/dirsetup.c0000644000076400001440000000043507674616531013425 #include "filesystem/path.h" #include "filesystem/dirsetup.h" #include "Nebu_filesystem.h" #include "stdlib.h" const char* getHome() { return getenv("HOME"); } void dirSetup(const char *executable) { #ifdef LOCAL_DATA goto_installpath(executable); #endif initDirectories(); } gltron-0.70/src/base/0000777000076400001440000000000007767023547010234 5gltron-0.70/src/base/Makefile.am0000644000076400001440000000024607674616531012204 noinst_LIBRARIES=libbase.a libbase_a_SOURCES = \ util.c AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include gltron-0.70/src/base/Makefile.in0000644000076400001440000001726107767023246012220 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libbase.a libbase_a_SOURCES = \ util.c AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include subdir = src/base mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libbase_a_AR = $(AR) cru libbase_a_LIBADD = am_libbase_a_OBJECTS = util.$(OBJEXT) libbase_a_OBJECTS = $(am_libbase_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/util.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(libbase_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libbase_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/base/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libbase.a: $(libbase_a_OBJECTS) $(libbase_a_DEPENDENCIES) -rm -f libbase.a $(libbase_a_AR) libbase.a $(libbase_a_OBJECTS) $(libbase_a_LIBADD) $(RANLIB) libbase.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/util.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/base/util.c0000644000076400001440000000034207674616531011266 #include "filesystem/path.h" #include "Nebu_scripting.h" #include void runScript(int ePath, const char *name) { char *s; s = getPath(ePath, name); scripting_RunFile(s); free(s); } gltron-0.70/src/configuration/0000777000076400001440000000000007767023547012171 5gltron-0.70/src/configuration/Makefile.am0000644000076400001440000000027307675011430014125 noinst_LIBRARIES=libconfiguration.a libconfiguration_a_SOURCES = \ settings.c AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include gltron-0.70/src/configuration/Makefile.in0000644000076400001440000001756407767023247014164 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libconfiguration.a libconfiguration_a_SOURCES = \ settings.c AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include subdir = src/configuration mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libconfiguration_a_AR = $(AR) cru libconfiguration_a_LIBADD = am_libconfiguration_a_OBJECTS = settings.$(OBJEXT) libconfiguration_a_OBJECTS = $(am_libconfiguration_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/settings.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(libconfiguration_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libconfiguration_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/configuration/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libconfiguration.a: $(libconfiguration_a_OBJECTS) $(libconfiguration_a_DEPENDENCIES) -rm -f libconfiguration.a $(libconfiguration_a_AR) libconfiguration.a $(libconfiguration_a_OBJECTS) $(libconfiguration_a_LIBADD) $(RANLIB) libconfiguration.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/settings.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/configuration/settings.c0000644000076400001440000001070107766302222014075 #include #include #include #include #include "base/util.h" #include "game/gltron.h" #include "filesystem/path.h" #define BUFSIZE 100 #define MAX_VAR_NAME_LEN 64 void checkSettings(void) { /* sanity check: speed, grid_size */ if(getSettingf("speed") <= 0) { fprintf(stderr, "[gltron] sanity check failed: speed = %.2ff\n", getSettingf("speed")); setSettingf("speed", 6.0); fprintf(stderr, "[gltron] reset speed: speed = %.2f\n", getSettingf("speed")); } if(getSettingi("grid_size") % 8) { fprintf(stderr, "[gltron] sanity check failed: grid_size %% 8 != 0: " "grid_size = %d\n", getSettingi("grid_size")); setSettingi("grid_size", 240); fprintf(stderr, "[gltron] reset grid_size: grid_size = %d\n", getSettingi("grid_size")); } } void saveSettings(void) { char *script; script = getPath(PATH_SCRIPTS, "save.lua"); scripting_RunFile(script); free(script); #ifdef WIN32 scripting_RunFormat("writeto(\"%s\")", "gltron.ini"); #else { char *path = getPossiblePath(PATH_PREFERENCES, RC_NAME); if(path == NULL) return; scripting_RunFormat("writeto(\"%s\")", path); free(path); } #endif scripting_Run("save()"); scripting_Run("write \"save_completed = 1\\n\""); scripting_Run("writeto()"); // select stdout again } int getSettingi(const char *name) { return (int) getSettingf(name); } int getVideoSettingi(const char *name) { return (int) getVideoSettingf(name); } float getSettingf(const char *name) { float value; if( scripting_GetGlobal("settings", name, NULL) ) { /* does not exit, return default */ fprintf(stderr, "error accessing setting '%s'!\n", name); assert(0); return 0; } if( scripting_GetFloatResult(&value) ) { fprintf(stderr, "error reading setting '%s'!\n", name); assert(0); return 0; } return value; } float getVideoSettingf(const char *name) { float value; if( scripting_GetGlobal("video", "settings", name, NULL) ) { /* does not exit, return default */ fprintf(stderr, "error accessing setting '%s'!\n", name); assert(0); return 0; } if( scripting_GetFloatResult(&value) ) { fprintf(stderr, "error reading setting '%s'!\n", name); assert(0); return 0; } return value; } int isSetting(const char *name) { scripting_GetGlobal("settings", name, NULL); return ! scripting_IsNilResult(); } void setSettingf(const char *name, float f) { scripting_SetFloat( f, name, "settings", NULL ); } void setSettingi(const char *name, int i) { setSettingf(name, (float)i); } void updateSettingsCache(void) { /* cache lua settings that don't change during play */ gSettingsCache.use_stencil = getSettingi("use_stencil"); gSettingsCache.show_scores = getSettingi("show_scores"); gSettingsCache.show_ai_status = getSettingi("show_ai_status"); gSettingsCache.ai_level = getSettingi("ai_level"); gSettingsCache.show_fps = getSettingi("show_fps"); gSettingsCache.show_console = getSettingi("show_console"); gSettingsCache.softwareRendering = getSettingi("softwareRendering"); gSettingsCache.line_spacing = getSettingi("line_spacing"); gSettingsCache.alpha_trails = getSettingi("alpha_trails"); gSettingsCache.antialias_lines = getSettingi("antialias_lines"); gSettingsCache.turn_cycle = getSettingi("turn_cycle"); gSettingsCache.light_cycles = getSettingi("light_cycles"); gSettingsCache.lod = getSettingi("lod"); gSettingsCache.fov = getSettingi("fov"); gSettingsCache.show_floor_texture = getVideoSettingi("show_floor_texture"); gSettingsCache.show_skybox = getVideoSettingi("show_skybox"); gSettingsCache.show_wall = getVideoSettingi("show_wall"); gSettingsCache.stretch_textures = getVideoSettingi("stretch_textures"); gSettingsCache.show_decals = getVideoSettingi("show_decals"); gSettingsCache.show_impact = getSettingi("show_impact"); gSettingsCache.show_glow = getSettingi("show_glow"); gSettingsCache.show_recognizer = getSettingi("show_recognizer"); gSettingsCache.fast_finish = getSettingi("fast_finish"); gSettingsCache.fov = getSettingf("fov"); gSettingsCache.znear = getSettingf("znear"); gSettingsCache.camType = getSettingi("camType"); gSettingsCache.playEffects = getSettingi("playEffects"); gSettingsCache.playMusic = getSettingi("playMusic"); gSettingsCache.map_ratio_w = getSettingf("map_ratio_w"); gSettingsCache.map_ratio_h = getSettingf("map_ratio_h"); scripting_GetGlobal("clear_color", NULL); scripting_GetFloatArrayResult(gSettingsCache.clear_color, 4); } gltron-0.70/src/audio/0000777000076400001440000000000007767023547010423 5gltron-0.70/src/audio/Makefile.am0000644000076400001440000000044507675033430012364 noinst_LIBRARIES=libaudio.a libaudio_a_SOURCES = \ sound.c sound_glue.cpp AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include AM_CXXFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include gltron-0.70/src/audio/Makefile.in0000644000076400001440000002132707767023246012405 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libaudio.a libaudio_a_SOURCES = \ sound.c sound_glue.cpp AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include AM_CXXFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include subdir = src/audio mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libaudio_a_AR = $(AR) cru libaudio_a_LIBADD = am_libaudio_a_OBJECTS = sound.$(OBJEXT) sound_glue.$(OBJEXT) libaudio_a_OBJECTS = $(am_libaudio_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/sound.Po $(DEPDIR)/sound_glue.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ CXXFLAGS = @CXXFLAGS@ DIST_SOURCES = $(libaudio_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libaudio_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/audio/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libaudio.a: $(libaudio_a_OBJECTS) $(libaudio_a_DEPENDENCIES) -rm -f libaudio.a $(libaudio_a_AR) libaudio.a $(libaudio_a_OBJECTS) $(libaudio_a_LIBADD) $(RANLIB) libaudio.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/sound.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/sound_glue.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ .cpp.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(CXXCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< .cpp.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(CXXCOMPILE) -c -o $@ `cygpath -w $<` CXXDEPMODE = @CXXDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/audio/sound.c0000644000076400001440000000521107766301732011624 #include "game/gltron.h" #include "filesystem/path.h" #define NUM_GAME_FX 3 static char *game_fx_names[] = { #if 1 "game_engine.wav", "game_crash.wav", "game_recognizer.wav" #else "game_engine.ogg", "game_crash.ogg", "game_recognizer.ogg" #endif }; void Sound_loadFX(void) { int i; char *path; for(i = 0; i < NUM_GAME_FX; i++) { path = getPath(PATH_DATA, game_fx_names[i]); if(path) { Audio_LoadSample(path, i); free(path); } else { fprintf(stderr, "[error] can't load sound fx file %s\n", game_fx_names[i]); exit(1); // FIXME: handle missing fx somewhere else } } } void Sound_reloadTrack(void) { char *song; char *path; scripting_GetGlobal("settings", "current_track", NULL); scripting_GetStringResult(&song); fprintf(stderr, "[sound] loading song %s\n", song); path = getPath( PATH_MUSIC, song ); free(song); if(path == NULL) { fprintf(stderr, "[sound] can't find song...exiting\n"); exit(1); // FIXME: handle missing song somewhere else } Sound_load(path); Sound_play(); free(path); } void Sound_shutdown(void) { Audio_Quit(); } void Sound_load(char *name) { Audio_LoadMusic(name); } void Sound_play(void) { Audio_SetMusicVolume(getSettingf("musicVolume")); Audio_PlayMusic(); return; } void Sound_stop(void) { Audio_StopMusic(); } void Sound_idle(void) { Audio_Idle(); } void Sound_setMusicVolume(float volume) { if(volume > 1) volume = 1; if(volume < 0) volume = 0; Audio_SetMusicVolume(volume); } void Sound_setFxVolume(float volume) { if(volume > 1) volume = 1; if(volume < 0) volume = 0; Audio_SetFxVolume(volume); } void Sound_initTracks(void) { const char *music_path; List *soundList; List *p; int i; music_path = getDirectory( PATH_MUSIC ); soundList = readDirectoryContents(music_path, NULL); if(soundList->next == NULL) { fprintf(stderr, "[sound] no music files found...exiting\n"); exit(1); // FIXME: handle missing songs somewhere else } i = 1; for(p = soundList; p->next != NULL; p = p->next) { // bugfix: filter track list to readable files (and without directories) char *path = getPossiblePath( PATH_MUSIC, (char*)p->data ); if( path != NULL && fileExists( path ) ) { scripting_RunFormat("tracks[%d] = \"%s\"", i, (char*) p->data); i++; free( path ); } } scripting_Run("setupSoundTrack()"); } void Sound_setup(void) { printf("[sound] initializing sound\n"); Audio_Init(); Sound_loadFX(); Audio_LoadPlayers(); Sound_setFxVolume(getSettingf("fxVolume")); Sound_reloadTrack(); Sound_setMusicVolume(getSettingf("musicVolume")); Audio_Start(); } gltron-0.70/src/audio/sound_glue.cpp0000644000076400001440000001775007764076762013225 #include "Nebu_audio.h" extern "C" { #include "game/game.h" #include "video/video.h" // 3d sound engine needs to know the camera's location! } #include "audio/sound_glue.h" #include "SDL.h" #include "SDL_sound.h" static Sound::System *sound = NULL; static Sound::SourceMusic *music = NULL; static Sound::SourceSample *sample_crash = NULL; static Sound::SourceSample *sample_engine = NULL; static Sound::SourceSample *sample_recognizer = NULL; static Sound::Source3D *players[PLAYERS]; static Sound::Source3D *recognizerEngine; #define TURNLENGTH 250.0f static void output_decoders(void) { const Sound_DecoderInfo **rc = Sound_AvailableDecoders(); const Sound_DecoderInfo **i; const char **ext; printf("Supported sound formats:\n"); if (rc == NULL) printf(" * Apparently, NONE!\n"); else { for (i = rc; *i != NULL; i++) { printf(" * %s\n", (*i)->description); for (ext = (*i)->extensions; *ext != NULL; ext++) printf(" File extension \"%s\"\n", *ext); printf(" Written by %s.\n %s\n\n", (*i)->author, (*i)->url); } /* for */ } /* else */ printf("\n"); } /* output_decoders */ extern "C" { void Audio_EnableEngine(void) { int i; for(i = 0; i < game->players; i++) if( game->player[i].data->speed > 0) Audio_StartEngine(i); sample_engine->Start(); if (gSettingsCache.show_recognizer) sample_recognizer->Start(); // printf("[audio] turning on engine sound\n"); } void Audio_DisableEngine(void) { sample_engine->Stop(); sample_recognizer->Stop(); // printf("[audio] turning off engine sound\n"); } void Audio_Idle(void) { // iterate over all the players and update the engines if(sample_engine->IsPlaying()) { for(int i = 0; i < PLAYERS; i++) { Player *p; Sound::Source3D *p3d; float x, y; p3d = players[i]; p = game->player + i; getPositionFromIndex(&x, &y, i); p3d->_location = Vector3(x, y, 0); float V = p->data->speed; int dt = game2->time.current - p->data->turn_time; if(dt < TURN_LENGTH) { float t = (float)dt / TURNLENGTH; float vx = (1 - t) * dirsX[p->data->last_dir] + t * dirsX[p->data->dir]; float vy = (1 - t) * dirsY[p->data->last_dir] + t * dirsY[p->data->dir]; p3d->_velocity = Vector3(V * vx, V * vy, 0); } else { p3d->_velocity = Vector3(V * dirsX[p->data->dir], V * dirsY[p->data->dir], 0); } if(i == 0) { if(p->data->boost_enabled) { ( (Sound::SourceEngine*) p3d )->_speedShift = 1.2f; } else { ( (Sound::SourceEngine*) p3d )->_speedShift = 1.0f; } ( (Sound::SourceEngine*) p3d )->_pitchShift = p->data->speed / getSettingf("speed"); } #if 0 if(i == 0) { if( dt < TURNLENGTH ) { float t = (float)dt / TURNLENGTH; float speedShift = ( 1 - t ) * 0.4 + t * 0.3; float pitchShift = ( 1 - t ) * 0.9 + t * 1.0; ( (Sound::SourceEngine*) p3d )->_speedShift = speedShift; ( (Sound::SourceEngine*) p3d )->_pitchShift = pitchShift; } else { ( (Sound::SourceEngine*) p3d )->_speedShift = 0.3; ( (Sound::SourceEngine*) p3d )->_pitchShift = 1.0; } } #endif } } if(sample_recognizer->IsPlaying()) { if (gSettingsCache.show_recognizer) { vec2 p, v; getRecognizerPositionVelocity(&p, &v); // recognizerEngine->_location = Vector3(p.x, p.y, RECOGNIZER_HEIGHT); recognizerEngine->_location = Vector3(p.v[0], p.v[1], 10.0f); recognizerEngine->_velocity = Vector3(v.v[0], v.v[1], 0); } } Sound::Listener& listener = sound->GetListener(); listener._location = Vector3(game->player[0].camera->cam); Vector3 v1 = Vector3(game->player[0].camera->target); Vector3 v2 = Vector3(game->player[0].camera->cam); listener._direction = v1 - v2; // listener._location = players[0]->_location; // listener._direction = players[0]->_velocity; listener._velocity = players[0]->_velocity; listener._up = Vector3(0, 0, 1); sound->SetMixMusic(gSettingsCache.playMusic); sound->SetMixFX(gSettingsCache.playEffects); sound->Idle(); } void Audio_CrashPlayer(int player) { Sound::SourceCopy *copy = new Sound::SourceCopy(sample_crash); copy->Start(); copy->SetRemovable(); copy->SetType(Sound::eSoundFX); sound->AddSource(copy); } void Audio_Init(void) { Sound_Init(); // Init SDL_Sound // output_decoders(); SDL_AudioSpec* spec = new SDL_AudioSpec; spec->freq = 22050; spec->format = AUDIO_S16SYS; spec->channels = 2; spec->samples = 1024; sound = new Sound::System(spec); spec->userdata = sound; spec->callback = sound->GetCallback(); SDL_AudioSpec obtained; if(SDL_OpenAudio( spec, &obtained ) != 0) { fprintf(stderr, "[error] %s\n", SDL_GetError()); sound->SetStatus(Sound::eUninitialized); } else { sound->SetStatus(Sound::eInitialized); /* fprintf(stderr, "[sound] frequency: %d\n", obtained.freq); fprintf(stderr, "[sound] format: %d\n", obtained.format); fprintf(stderr, "[sound] channels: %d\n", obtained.channels); fprintf(stderr, "[sound] silence: %d\n", obtained.silence); fprintf(stderr, "[sound] buffer in samples: %d\n", obtained.samples); fprintf(stderr, "[sound] buffer in bytes: %d\n", obtained.size); */ } sound->SetMixMusic(gSettingsCache.playMusic); sound->SetMixFX(gSettingsCache.playEffects); } void Audio_Start(void) { SDL_PauseAudio(0); } void Audio_Quit(void) { SDL_PauseAudio(1); Sound_Quit(); SDL_CloseAudio(); } void Audio_LoadMusic(char *name) { if(music != NULL) { music->Stop(); music->SetRemovable(); } music = new Sound::SourceMusic(sound); music->Load(name); music->SetLoop(255); music->SetType(Sound::eSoundMusic); char *sname = new char[32]; sprintf(sname, "music"); music->SetName(sname); sound->AddSource(music); } void Audio_PlayMusic(void) { music->Start(); } void Audio_StopMusic(void) { music->Stop(); } void Audio_SetMusicVolume(float volume) { music->SetVolume(volume); } void Audio_SetFxVolume(float volume) { sample_engine->SetVolume(volume); sample_crash->SetVolume(volume); if(volume > 0.8f) sample_recognizer->SetVolume(volume); else sample_recognizer->SetVolume(volume * 1.25f); } void Audio_StartEngine(int iPlayer) { players[iPlayer]->Start(); } void Audio_StopEngine(int iPlayer) { players[iPlayer]->Stop(); } void Audio_LoadPlayers(void) { for(int i = 0; i < PLAYERS; i++) { if(i != 0) { players[i] = new Sound::Source3D(sound, sample_engine); players[i]->SetType(Sound::eSoundFX); sound->AddSource(players[i]); char *name = new char[32]; sprintf(name, "player %d", i); players[i]->SetName(name); } else { players[i] = new Sound::SourceEngine(sound, sample_engine); players[i]->SetType(Sound::eSoundFX); sound->AddSource(players[i]); char *name = new char[32]; sprintf(name, "player %d", i); players[i]->SetName(name); } } recognizerEngine = new Sound::Source3D(sound, sample_recognizer); recognizerEngine->SetType(Sound::eSoundFX); recognizerEngine->Start(); sound->AddSource(recognizerEngine); char *name = new char[32]; sprintf(name, "recognizer"); recognizerEngine->SetName(name); } void Audio_LoadSample(char *name, int number) { switch(number) { case 0: sample_engine = new Sound::SourceSample(sound); sample_engine->Load(name); break; case 1: sample_crash = new Sound::SourceSample(sound); sample_crash->Load(name); break; case 2: sample_recognizer = new Sound::SourceSample(sound); sample_recognizer->Load(name); break; default: /* programmer error, but non-critical */ fprintf(stderr, "[error] unkown sample %d: '%s'\n", number, name); } } } gltron-0.70/src/video/0000777000076400001440000000000007767023547010430 5gltron-0.70/src/video/Makefile.am0000644000076400001440000000070507677107443012400 noinst_LIBRARIES=libvideo.a libvideo_a_SOURCES = \ artpack.c explosion.c fonts.c fonttex.c gamegraphics.c \ graphics_fx.c graphics_hud.c graphics_lights.c \ graphics_utility.c graphics_world.c \ load_texture.c material.c model.c recognizer.c \ screenshot.c skybox.c texture.c trail.c trail_geometry.c \ trail_render.c video.c visuals_2d.c AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include gltron-0.70/src/video/Makefile.in0000644000076400001440000002513007767023250012401 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libvideo.a libvideo_a_SOURCES = \ artpack.c explosion.c fonts.c fonttex.c gamegraphics.c \ graphics_fx.c graphics_hud.c graphics_lights.c \ graphics_utility.c graphics_world.c \ load_texture.c material.c model.c recognizer.c \ screenshot.c skybox.c texture.c trail.c trail_geometry.c \ trail_render.c video.c visuals_2d.c AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include subdir = src/video mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libvideo_a_AR = $(AR) cru libvideo_a_LIBADD = am_libvideo_a_OBJECTS = artpack.$(OBJEXT) explosion.$(OBJEXT) \ fonts.$(OBJEXT) fonttex.$(OBJEXT) gamegraphics.$(OBJEXT) \ graphics_fx.$(OBJEXT) graphics_hud.$(OBJEXT) \ graphics_lights.$(OBJEXT) graphics_utility.$(OBJEXT) \ graphics_world.$(OBJEXT) load_texture.$(OBJEXT) \ material.$(OBJEXT) model.$(OBJEXT) recognizer.$(OBJEXT) \ screenshot.$(OBJEXT) skybox.$(OBJEXT) texture.$(OBJEXT) \ trail.$(OBJEXT) trail_geometry.$(OBJEXT) trail_render.$(OBJEXT) \ video.$(OBJEXT) visuals_2d.$(OBJEXT) libvideo_a_OBJECTS = $(am_libvideo_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/artpack.Po $(DEPDIR)/explosion.Po \ @AMDEP_TRUE@ $(DEPDIR)/fonts.Po $(DEPDIR)/fonttex.Po \ @AMDEP_TRUE@ $(DEPDIR)/gamegraphics.Po $(DEPDIR)/graphics_fx.Po \ @AMDEP_TRUE@ $(DEPDIR)/graphics_hud.Po \ @AMDEP_TRUE@ $(DEPDIR)/graphics_lights.Po \ @AMDEP_TRUE@ $(DEPDIR)/graphics_utility.Po \ @AMDEP_TRUE@ $(DEPDIR)/graphics_world.Po \ @AMDEP_TRUE@ $(DEPDIR)/load_texture.Po $(DEPDIR)/material.Po \ @AMDEP_TRUE@ $(DEPDIR)/model.Po $(DEPDIR)/recognizer.Po \ @AMDEP_TRUE@ $(DEPDIR)/screenshot.Po $(DEPDIR)/skybox.Po \ @AMDEP_TRUE@ $(DEPDIR)/texture.Po $(DEPDIR)/trail.Po \ @AMDEP_TRUE@ $(DEPDIR)/trail_geometry.Po \ @AMDEP_TRUE@ $(DEPDIR)/trail_render.Po $(DEPDIR)/video.Po \ @AMDEP_TRUE@ $(DEPDIR)/visuals_2d.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(libvideo_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in compile SOURCES = $(libvideo_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/video/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libvideo.a: $(libvideo_a_OBJECTS) $(libvideo_a_DEPENDENCIES) -rm -f libvideo.a $(libvideo_a_AR) libvideo.a $(libvideo_a_OBJECTS) $(libvideo_a_LIBADD) $(RANLIB) libvideo.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/artpack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/explosion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/fonts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/fonttex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gamegraphics.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/graphics_fx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/graphics_hud.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/graphics_lights.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/graphics_utility.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/graphics_world.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/load_texture.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/material.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/model.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/recognizer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/screenshot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/skybox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/texture.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/trail.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/trail_geometry.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/trail_render.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/video.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/visuals_2d.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/video/compile0000644000076400001440000001551007731373135011711 cd /home/andreas/GLtron/gltron/src/video/ make -k source='recognizer.c' object='recognizer.o' libtool=no \ depfile='.deps/recognizer.Po' tmpdepfile='.deps/recognizer.TPo' \ depmode=gcc /bin/sh ../../depcomp \ gcc -DPACKAGE=\"gltron\" -DVERSION=\"0.63alpha1\" -DHAVE_LIBGL=1 -DHAVE_LIBZ=1 -DHAVE_LIBPNG=1 -DHAVE_LIBSMPEG=1 -DHAVE_LIBOGG=1 -DHAVE_LIBVORBIS=1 -DHAVE_LIBVORBISFILE=1 -DHAVE_LIBSMPEG=1 -DHAVE_LIBMIKMOD=1 -DSTDC_HEADERS=1 -DHAVE_UNISTD_H=1 -DHAVE_GL_GL_H=1 -Dconst= -DHAVE_STRSTR=1 -DHAVE_MKSTEMP=1 -I. -I. -DLOCAL_DATA -DSNAP_DIR=\"~\" -DPREF_DIR=\"~\" -I../../lua/include -I../../nebu/include -I../../src/include -DSEPARATOR="'/'" -Wall -Werror -Os -I/usr/local/include/SDL -D_REENTRANT -c `test -f recognizer.c || echo './'`recognizer.c recognizer.c: In function `drawRecognizer': recognizer.c:83: `Point' undeclared (first use in this function) recognizer.c:83: (Each undeclared identifier is reported only once recognizer.c:83: for each function it appears in.) recognizer.c:83: parse error before `p' recognizer.c:88: `p' undeclared (first use in this function) recognizer.c:88: `v' undeclared (first use in this function) make: *** [recognizer.o] Error 1 source='trail.c' object='trail.o' libtool=no \ depfile='.deps/trail.Po' tmpdepfile='.deps/trail.TPo' \ depmode=gcc /bin/sh ../../depcomp \ gcc -DPACKAGE=\"gltron\" -DVERSION=\"0.63alpha1\" -DHAVE_LIBGL=1 -DHAVE_LIBZ=1 -DHAVE_LIBPNG=1 -DHAVE_LIBSMPEG=1 -DHAVE_LIBOGG=1 -DHAVE_LIBVORBIS=1 -DHAVE_LIBVORBISFILE=1 -DHAVE_LIBSMPEG=1 -DHAVE_LIBMIKMOD=1 -DSTDC_HEADERS=1 -DHAVE_UNISTD_H=1 -DHAVE_GL_GL_H=1 -Dconst= -DHAVE_STRSTR=1 -DHAVE_MKSTEMP=1 -I. -I. -DLOCAL_DATA -DSNAP_DIR=\"~\" -DPREF_DIR=\"~\" -I../../lua/include -I../../nebu/include -I../../src/include -DSEPARATOR="'/'" -Wall -Werror -Os -I/usr/local/include/SDL -D_REENTRANT -c `test -f trail.c || echo './'`trail.c trail.c: In function `getSegmentEndX': trail.c:39: `line' undeclared (first use in this function) trail.c:39: (Each undeclared identifier is reported only once trail.c:39: for each function it appears in.) cc1: warnings being treated as errors trail.c:35: warning: unused variable `s' trail.c:34: warning: `tlength' might be used uninitialized in this function trail.c: In function `getSegmentEndY': trail.c:47: `Line' undeclared (first use in this function) trail.c:47: `line' undeclared (first use in this function) trail.c:46: warning: `tlength' might be used uninitialized in this function trail.c: At top level: trail.c:58: parse error before `*' trail.c: In function `getSegmentEndUV': trail.c:58: number of arguments doesn't match prototype ../../src/include/video/video.h:263: prototype declaration trail.c:60: `data' undeclared (first use in this function) trail.c:60: `line' undeclared (first use in this function) trail.c:59: warning: `tlength' might be used uninitialized in this function trail.c: At top level: trail.c:67: parse error before `*' trail.c: In function `getSegmentUV': trail.c:67: number of arguments doesn't match prototype ../../src/include/video/video.h:262: prototype declaration trail.c:69: `line' undeclared (first use in this function) trail.c:68: warning: `tlength' might be used uninitialized in this function trail.c: In function `drawTrailLines': trail.c:80: `Line' undeclared (first use in this function) trail.c:80: `line' undeclared (first use in this function) trail.c:80: warning: statement with no effect trail.c:81: parse error before `float' trail.c:91: `data' undeclared (first use in this function) trail.c:92: `cam' undeclared (first use in this function) trail.c:94: `height' undeclared (first use in this function) trail.c:116: `dist' undeclared (first use in this function) trail.c:117: `alpha' undeclared (first use in this function) trail.c:119: `trail_top' undeclared (first use in this function) trail.c:121: `normal' undeclared (first use in this function) make: *** [trail.o] Error 1 source='trail_geometry.c' object='trail_geometry.o' libtool=no \ depfile='.deps/trail_geometry.Po' tmpdepfile='.deps/trail_geometry.TPo' \ depmode=gcc /bin/sh ../../depcomp \ gcc -DPACKAGE=\"gltron\" -DVERSION=\"0.63alpha1\" -DHAVE_LIBGL=1 -DHAVE_LIBZ=1 -DHAVE_LIBPNG=1 -DHAVE_LIBSMPEG=1 -DHAVE_LIBOGG=1 -DHAVE_LIBVORBIS=1 -DHAVE_LIBVORBISFILE=1 -DHAVE_LIBSMPEG=1 -DHAVE_LIBMIKMOD=1 -DSTDC_HEADERS=1 -DHAVE_UNISTD_H=1 -DHAVE_GL_GL_H=1 -Dconst= -DHAVE_STRSTR=1 -DHAVE_MKSTEMP=1 -I. -I. -DLOCAL_DATA -DSNAP_DIR=\"~\" -DPREF_DIR=\"~\" -I../../lua/include -I../../nebu/include -I../../src/include -DSEPARATOR="'/'" -Wall -Werror -Os -I/usr/local/include/SDL -D_REENTRANT -c `test -f trail_geometry.c || echo './'`trail_geometry.c trail_geometry.c:41: parse error before `Line' trail_geometry.c: In function `storeVertex': trail_geometry.c:43: number of arguments doesn't match prototype ../../src/include/video/trail_geometry.h:19: prototype declaration trail_geometry.c:44: `pMesh' undeclared (first use in this function) trail_geometry.c:44: (Each undeclared identifier is reported only once trail_geometry.c:44: for each function it appears in.) trail_geometry.c:44: `offset' undeclared (first use in this function) trail_geometry.c:59: `line' undeclared (first use in this function) trail_geometry.c:66: `fTotalLength' undeclared (first use in this function) trail_geometry.c:68: `t' undeclared (first use in this function) trail_geometry.c:70: `fFloor' undeclared (first use in this function) trail_geometry.c:71: `fSegLength' undeclared (first use in this function) trail_geometry.c:78: `fTop' undeclared (first use in this function) trail_geometry.c: At top level: trail_geometry.c:106: parse error before `*' trail_geometry.c: In function `cmpdir': trail_geometry.c:106: number of arguments doesn't match prototype trail_geometry.c:9: prototype declaration trail_geometry.c:107: `line1' undeclared (first use in this function) trail_geometry.c:107: `line2' undeclared (first use in this function) trail_geometry.c: In function `trailGeometry': trail_geometry.c:123: structure has no member named `ex' trail_geometry.c:123: structure has no member named `sx' trail_geometry.c:124: structure has no member named `ey' trail_geometry.c:124: structure has no member named `sy' trail_geometry.c:146: `Line' undeclared (first use in this function) trail_geometry.c:146: parse error before `line' trail_geometry.c:147: `line' undeclared (first use in this function) trail_geometry.c:147: structure has no member named `sx' trail_geometry.c:148: structure has no member named `sy' cc1: warnings being treated as errors trail_geometry.c:120: warning: `fSegLength' might be used uninitialized in this function trail_geometry.c: In function `bowGeometry': trail_geometry.c:206: `Line' undeclared (first use in this function) trail_geometry.c:206: parse error before `line' trail_geometry.c:211: `line' undeclared (first use in this function) make: *** [trail_geometry.o] Error 1 make: Target `all' not remade because of errors. Compilation exited abnormally with code 2 at Mon Sep 15 19:25:33 gltron-0.70/src/video/artpack.c0000644000076400001440000000240107766301735012127 #include "video/video.h" #include "filesystem/path.h" #include "base/util.h" #include "Nebu_scripting.h" #include "Nebu_filesystem.h" void initArtpacks(void) { const char *art_path; List *artList; List *p; int i; art_path = getDirectory( PATH_ART ); artList = readDirectoryContents(art_path, NULL); if(artList->next == NULL) { fprintf(stderr, "[fatal] no art files found...exiting\n"); exit(1); /* OK: critical, installation corrupt */ } i = 1; for(p = artList; p->next != NULL; p = p->next) { if(strncmp((char*)p->data, "Makefile", 8)) { scripting_RunFormat("artpacks[%d] = \"%s\"", i, (char*) p->data); i++; } } scripting_Run("setupArtpacks()"); } void loadArt(void) { char *path; char *artpack; runScript(PATH_SCRIPTS, "artpack.lua"); // load default art settings scripting_GetGlobal("settings", "current_artpack", NULL); scripting_GetStringResult(&artpack); fprintf(stderr, "[status] loading artpack '%s'\n", artpack); path = getArtPath(artpack, "artpack.lua"); free(artpack); if(path != NULL) { scripting_RunFile(path); free(path); } initTexture(gScreen); initFonts(); } void reloadArt(void) { printf("[status] reloading art\n"); deleteTextures(gScreen); loadArt(); } gltron-0.70/src/video/explosion.c0000644000076400001440000000740307704041046012515 #include "video/video.h" #include "video/explosion.h" #define IMPACT_RADIUS_DELTA 0.025f #define IMPACT_MAX_RADIUS 25.0f /* shockwave behavior constants */ #define SHOCKWAVE_MIN_RADIUS 0.0f #define SHOCKWAVE_MAX_RADIUS 45.0f #define SHOCKWAVE_WIDTH 0.2f #define SHOCKWAVE_SPACING 6.0f #define SHOCKWAVE_SPEED 1.2f /* speed relative to IMPACT_RADIUS_DELTA */ #define SHOCKWAVE_SEGMENTS 25 #define NUM_SHOCKWAVES 3 /* draw a single semi-circular shockwave of a given radius */ static void drawWave(double radius) { int i, j; double angle; double delta_radius = SHOCKWAVE_WIDTH / SHOCKWAVE_SEGMENTS; double delta_angle = (180.0 / SHOCKWAVE_SEGMENTS) * (PI/180); double start_angle = 270.0 * (PI/180); for (i = 0; i < SHOCKWAVE_SEGMENTS; i++) { glBegin(GL_QUAD_STRIP); angle = start_angle; for (j = 0; j <= SHOCKWAVE_SEGMENTS; j++) { glVertex2d((radius + delta_radius) * sin(angle), (radius + delta_radius) * cos(angle)); glVertex2d(radius * sin(angle), radius * cos(angle)); angle += delta_angle; } glEnd(); radius += delta_radius; } } static void drawShockwaves(float radius) { int waves; glColor3f(1,0,0); for(waves = 0; waves < NUM_SHOCKWAVES; waves++) { if (radius > SHOCKWAVE_MIN_RADIUS && radius < SHOCKWAVE_MAX_RADIUS) { drawWave(radius); } radius -= SHOCKWAVE_SPACING; } } /* impact spire behavior constants */ #define SPIRE_MAX_RADIUS 25 #define SPIRE_WIDTH 0.40f #define NUM_SPIRES 21 static void drawSpires(float radius) { int i; float left[3], right[3]; float zunit[3] = {0, 0, 1}; float vectors[NUM_SPIRES][3] = { { 1.00f, 0.20f, 0.00f }, { 0.80f, 0.25f, 0.00f }, { 0.90f, 0.50f, 0.00f }, { 0.70f, 0.50f, 0.00f }, { 0.52f, 0.45f, 0.00f }, { 0.65f, 0.75f, 0.00f }, { 0.42f, 0.68f, 0.00f }, { 0.40f, 1.02f, 0.00f }, { 0.20f, 0.90f, 0.00f }, { 0.08f, 0.65f, 0.00f }, { 0.00f, 1.00f, 0.00f }, /* vertical spire */ { -0.08f, 0.65f, 0.00f }, { -0.20f, 0.90f, 0.00f }, { -0.40f, 1.02f, 0.00f }, { -0.42f, 0.68f, 0.00f }, { -0.65f, 0.75f, 0.00f }, { -0.52f, 0.45f, 0.00f }, { -0.70f, 0.50f, 0.00f }, { -0.90f, 0.50f, 0.00f }, { -0.80f, 0.30f, 0.00f }, { -1.00f, 0.20f, 0.00f } }; glColor3f(1, 1, 1); glVertex3f(0, 0, 0); glBlendFunc(GL_ONE, GL_ONE); glBegin(GL_TRIANGLES); for (i=0; i < NUM_SPIRES; i++) { normcrossprod(vectors[i], zunit, right); normcrossprod(zunit, vectors[i], left); vmul(right, SPIRE_WIDTH); vmul(left, SPIRE_WIDTH); glColor4f(1,1,1,0.0); glVertex3fv(right); glVertex3f(radius * vectors[i][0], radius * vectors[i][1], 0.0); glVertex3fv(left); } glEnd(); } #define GLOW_START_OPACITY 1.2f #define GLOW_INTENSITY 1.0f static void drawImpactGlow(float glow_radius) { float opacity; opacity = GLOW_START_OPACITY - (glow_radius / IMPACT_MAX_RADIUS); glPushMatrix(); glScalef(glow_radius, glow_radius, 1.0f); glBindTexture(GL_TEXTURE_2D, gScreen->textures[TEX_IMPACT]); glEnable(GL_TEXTURE_2D); glColor4f(GLOW_INTENSITY, GLOW_INTENSITY, GLOW_INTENSITY, opacity); glDepthMask(0); glBegin(GL_POLYGON); glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, -1.0); glTexCoord2f(1.0, 0.0); glVertex2f(1.0, -1.0); glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0); glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0); glEnd(); glDepthMask(1); glDisable(GL_TEXTURE_2D); glPopMatrix(); } void drawExplosion(float *radius) { float shockwave_radius = (*radius * SHOCKWAVE_SPEED); drawShockwaves(shockwave_radius); if (*radius < IMPACT_MAX_RADIUS) { drawImpactGlow(*radius); drawSpires(*radius); } *radius += game2->time.dt * IMPACT_RADIUS_DELTA; } gltron-0.70/src/video/fonts.c0000644000076400001440000000262307704041046011625 #include "video/video.h" #include "filesystem/path.h" #include "Nebu_filesystem.h" void initFonts(void) { char *path; file_handle file; char buf[100]; char gamefont[100]; char guifont[100]; char *game = NULL, *gui = NULL; if(gameFtx != NULL) ftxUnloadFont(gameFtx); if(guiFtx != NULL) ftxUnloadFont(guiFtx); path = getPath(PATH_DATA, "fonts.txt"); if(path != NULL) { file = file_open(path, "r"); while(file_gets(file, buf, sizeof(buf)) != NULL) { if(sscanf(buf, "game: %s ", gamefont) == 1) game = gamefont; else if(sscanf(buf, "menu: %s ", guifont) == 1) gui = guifont; } file_close(file); free(path); } else { fprintf(stderr, "can't load fonts.txt\n"); exit(1); /* OK: critical, installation corrupt */ } if(game == NULL || gui == NULL) { fprintf(stderr, "incomplete font definition in fonts.txt\n"); exit(1); /* OK: critical, installation corrupt */ } gameFtx = ftxLoadFont(game); guiFtx = ftxLoadFont(gui); if(gameFtx == NULL) { fprintf(stderr, "can't load font %s\n", game); exit(1); /* OK: critical, installation corrupt */ } if(guiFtx == NULL) { fprintf(stderr, "can't load font %s\n", gui); exit(1); /* OK: critical, installation corrupt */ } } void deleteFonts(void) { if(gameFtx != NULL) ftxUnloadFont(gameFtx); gameFtx = NULL; if(guiFtx != NULL) ftxUnloadFont(guiFtx); guiFtx = NULL; } gltron-0.70/src/video/fonttex.c0000644000076400001440000001315007705324073012165 #include "video/video.h" #include "filesystem/path.h" #include "Nebu_filesystem.h" #include #include // #include #define NO_SDL_GLEXT #include "SDL_opengl.h" #define FTX_ERR "[FontTex error]: " void getLine(char *buf, int size, file_handle file) { do { file_gets(file, buf, size); } while( buf[0] == '\n' || buf[0] == '#'); } FontTex *ftxLoadFont(const char *filename) { char *path; file_handle file; char buf[100]; int i; int len; FontTex *ftx; path = getPath(PATH_DATA, filename); if(path == NULL) { fprintf(stderr, FTX_ERR "can't load font file '%s'\n", filename); return NULL; } file = file_open(path, "r"); free(path); /* TODO(5): check for EOF errors in the following code */ /* nTextures, texture width, char width */ ftx = (FontTex*) malloc(sizeof(FontTex)); getLine(buf, sizeof(buf), file); sscanf(buf, "%d %d %d ", &(ftx->nTextures), &(ftx->texwidth), &(ftx->width)); /* lowest character, highest character */ getLine(buf, sizeof(buf), file); sscanf(buf, "%d %d ", &(ftx->lower), &(ftx->upper)); /* font name */ getLine(buf, sizeof(buf), file); len = strlen(buf) + 1; ftx->fontname = (char*)malloc(len); memcpy(ftx->fontname, buf, len); /* prepare space for texture IDs */ ftx->texID = (GLuint*) malloc(ftx->nTextures * sizeof(unsigned int)); glGenTextures(ftx->nTextures, ftx->texID); /* the individual textures */ for(i = 0; i < ftx->nTextures; i++) { char *texname; getLine(buf, sizeof(buf), file); len = strlen(buf) + 1; if(buf[len - 2] == '\n') buf[len - 2] = 0; texname = (char*)malloc(len); memcpy(texname, buf, len); glBindTexture(GL_TEXTURE_2D, ftx->texID[i]); loadTexture(texname, GL_RGBA); free(texname); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); /* glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); */ /* glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); } file_close(file); return ftx; } void ftxUnloadFont(FontTex *ftx) { glDeleteTextures(ftx->nTextures, ftx->texID); free(ftx->texID); free(ftx->fontname); free(ftx); } static int color_base = 48; static int colors = 8; enum { white = 0, black, red, orange, yellow, lt_green, green, blue_green }; unsigned char color_codes[][3] = { { 255, 255,255 }, { 0, 0, 0 }, { 255, 0, 0 }, { 255, 128, 0 }, { 255, 255, 0 }, { 128, 255, 0 }, { 0, 255, 0 }, { 0, 255, 128 } }; /* 0 48 white 65535 65536 65535 FFFFFF 1 49 black 0 0 0 000000 2 50 red 65535 0 0 FF0000 3 51 orange 65535 32768 0 FF8000 4 52 yellow 65535 65535 0 FFFF00 5 53 lt green 32768 65535 0 80FF00 6 54 green 0 65535 0 00FF00 7 55 blue green 0 65535 32768 00FF80 8 56 cyan 0 65535 65535 00FFFF 9 57 lt blue 0 32768 65535 0080FF : 58 blue 0 0 65535 0000FF ; 59 purple 32768 0 65535 8000FF < 60 magenta 65535 0 65535 FF00FF = 61 purple red 65535 0 32768 FF0080 > 62 lt gray 49152 49152 49152 C0C0C0 ? 63 dk gray 16384 16384 16384 404040 @ 64 - 32768 0 0 800000 A 65 | 32768 16384 0 804000 B 66 | 32768 32768 0 808000 C 67 | darker 16384 32768 0 408000 D 68 | versions 0 32768 0 008000 E 69 | of 0 32768 16384 008040 F 70 | colors 0 32768 32768 008080 G 71 | 50..61 0 16384 32768 004080 H 72 | 0 0 32768 000080 I 73 | 16384 0 32768 400080 J 74 | 32768 0 32768 800080 K 75 - 32768 0 16384 800040 */ void ftxRenderString(FontTex *ftx, const char *string, int len) { int i; int bound = -1; int index; int tex; int w; float cw; float cx, cy; w = ftx->texwidth / ftx->width; cw = (float)ftx->width / (float)ftx->texwidth; for(i = 0; i < len; i++) { if(string[i] == 3) { /* color code */ i++; if(i >= len) return; if(string[i] < color_base && string[i] > color_base + colors) continue; glColor3ubv(color_codes[ string[i] - color_base ]); continue; } /* find out which texture it's in */ /* TODO(4): find out why the +1 is necessary */ index = string[i] - ftx->lower + 1; if(index >= ftx->upper) fprintf(stderr, FTX_ERR " index out of bounds"); tex = index / (w * w); /* bind texture */ if(tex != bound) { glBindTexture(GL_TEXTURE_2D, ftx->texID[tex]); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); bound = tex; } /* find texture coordinates */ index = index % (w * w); cx = (float)(index % w) / (float)w; cy = (float)(index / w) / (float)w; /* draw quad */ /* fprintf(stderr, FTX_ERR "coords: tex %d (%.2f, %.2f), %.2f\n", */ /* bound, cx, cy, cw); */ glBegin(GL_QUADS); glTexCoord2f(cx, 1 - cy - cw); glVertex2f(i, 0); glTexCoord2f(cx + cw, 1 - cy - cw); glVertex2f(i + 1, 0); glTexCoord2f(cx + cw, 1 - cy); glVertex2f(i + 1, 1); glTexCoord2f(cx, 1 - cy); glVertex2f(i, 1); glEnd(); } /* checkGLError("FontTex.c ftxRenderString\n"); */ } gltron-0.70/src/video/gamegraphics.c0000644000076400001440000002716407767017710013147 #include "video/video.h" #include "game/game.h" #include "video/skybox.h" #include "video/recognizer.h" #include "video/explosion.h" // static float arena[] = { 1.0, 1.2, 1, 0.0 }; #define MAX_LOD_LEVEL 3 static int lod_dist[MAX_LOD_LEVEL + 1][LC_LOD + 1] = { { 1000, 1000, 1000 }, /* insane */ { 100, 200, 400 }, /* high */ { 30, 100, 200 }, /* low */ { 10, 30, 150 } /* ugly */ }; /* spoke colors */ static float SpokeColor[4] = {1.0, 1.0, 1.0, 1.0}; static float NoSpokeColor[4] = {0.0, 0.0, 0.0, 1.0}; void drawGame(void) { GLint i; polycount = 0; glEnable(GL_DEPTH_TEST); glClearColor(gSettingsCache.clear_color[0], gSettingsCache.clear_color[1], gSettingsCache.clear_color[2], gSettingsCache.clear_color[3]); if(gSettingsCache.use_stencil) { glClearStencil(0); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT ); } else { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); } for(i = 0; i < vp_max[gViewportType]; i++) { Player *p = game->player + viewport_content[i]; PlayerVisual *pV = gPlayerVisuals + viewport_content[i]; Visual *d = & pV->display; if(d->onScreen == 1) { glViewport(d->vp_x, d->vp_y, d->vp_w, d->vp_h); drawCam(p, pV); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); if (gSettingsCache.show_scores) drawScore(p, d); if (gSettingsCache.show_ai_status) if(p->ai->active == AI_COMPUTER) drawAI(d); } glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); } if (gSettingsCache.show_fps) drawFPS(gScreen); if(gSettingsCache.show_console) drawConsole(gScreen); /* printf("%d polys\n", polycount); */ } float GetDistance(float *v, float *p, float *d) { float diff[3]; float tmp[3]; float t; vsub(v, p, diff); t = scalarprod(d, diff) / scalarprod(d, d); vcopy(d, tmp); vmul(tmp, t); vsub(diff, tmp, tmp); return sqrtf( scalarprod(tmp, tmp) ); } static float dirangles[] = { 0, -90, -180, 90, 180, -270 }; float getDirAngle(int time, Player *p) { int last_dir; float dirAngle; if(time < TURN_LENGTH) { last_dir = p->data->last_dir; if(p->data->dir == 3 && last_dir == 2) last_dir = 4; if(p->data->dir == 2 && last_dir == 3) last_dir = 5; dirAngle = ((TURN_LENGTH - time) * dirangles[last_dir] + time * dirangles[p->data->dir]) / TURN_LENGTH; } else dirAngle = dirangles[p->data->dir]; return dirAngle; } void doCycleTurnRotation(PlayerVisual *pV, Player *p) { int neigung_dir = -1; int time = game2->time.current - p->data->turn_time; float dirAngle = getDirAngle(time, p); glRotatef(dirAngle, 0, 0, 1); #define neigung 25 if(time < TURN_LENGTH && p->data->last_dir != p->data->dir) { float axis = 1.0f; if(p->data->dir < p->data->last_dir && p->data->last_dir != 3) axis = -1.0; else if((p->data->last_dir == 3 && p->data->dir == 2) || (p->data->last_dir == 0 && p->data->dir == 3)) axis = -1.0; glRotated(neigung * sin(PI * time / TURN_LENGTH), 0.0, axis * neigung_dir, 0.0); } #undef neigung } void drawCycleShadow(PlayerVisual *pV, Player *p, int lod, int drawTurn) { Mesh *cycle; int turn_time = game2->time.current - p->data->turn_time; if(turn_time < TURN_LENGTH && !drawTurn) return; if(pV->exp_radius != 0) return; cycle = lightcycle[lod]; /* states */ glEnable(GL_CULL_FACE); if(gSettingsCache.use_stencil) { glEnable(GL_STENCIL_TEST); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); glStencilFunc(GL_GREATER, 1, 1); glEnable(GL_BLEND); glColor4fv(shadow_color); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else { glColor3f(0, 0, 0); glDisable(GL_BLEND); } /* transformations */ glPushMatrix(); { float x, y; getPositionFromData(&x, &y, p->data); glTranslatef(x,y, 0.0); } glMultMatrixf(shadow_matrix); if (gSettingsCache.turn_cycle) { doCycleTurnRotation(pV, p); } else if (pV->exp_radius == 0) { glRotatef(dirangles[p->data->dir], 0.0, 0.0, 1.0); } glTranslatef(0, 0, cycle->BBox.vSize.v[2] / 2); /* render */ drawModel(cycle, TRI_MESH); /* restore */ if(gSettingsCache.use_stencil) glDisable(GL_STENCIL_TEST); glDisable(GL_BLEND); glDisable(GL_CULL_FACE); glPopMatrix(); } void drawCycle(Player *p, PlayerVisual *pV, int lod, int drawTurn) { Mesh *cycle = lightcycle[lod]; unsigned int spoke_time = game2->time.current - pV->spoke_time; int turn_time = game2->time.current - p->data->turn_time; if(turn_time < TURN_LENGTH && !drawTurn) return; glPushMatrix(); { float x, y; getPositionFromData(&x, &y, p->data); glTranslatef(x, y, 0.0); } if (pV->exp_radius == 0 && gSettingsCache.turn_cycle == 0) { glRotatef(dirangles[p->data->dir], 0.0, 0.0, 1.0); } if (gSettingsCache.turn_cycle) { doCycleTurnRotation(pV, p); } setupLights(eCycles); SetMaterialColor(cycle, "Hull", eDiffuse, pV->pColorDiffuse); SetMaterialColor(cycle, "Hull", eSpecular, pV->pColorSpecular); if (gSettingsCache.light_cycles) { glEnable(GL_LIGHTING); } glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); if (pV->exp_radius == 0) { glEnable(GL_NORMALIZE); glTranslatef(0, 0, cycle->BBox.vSize.v[2] / 2); /* draw spoke animation */ if (spoke_time > 140 - (p->data->speed * 10) && game->pauseflag == PAUSE_GAME_RUNNING) { if (pV->spoke_state == 1) { pV->spoke_state = 0; SetMaterialColor(cycle, "Spoke", eSpecular, SpokeColor); SetMaterialColor(cycle, "Spoke", eAmbient, SpokeColor); } else { pV->spoke_state = 1; SetMaterialColor(cycle, "Spoke", eSpecular, NoSpokeColor); SetMaterialColor(cycle, "Spoke", eAmbient, NoSpokeColor); } pV->spoke_time = game2->time.current; } glEnable(GL_CULL_FACE); drawModel(cycle, TRI_MESH); glDisable(GL_CULL_FACE); } else if(pV->exp_radius < EXP_RADIUS_MAX) { glEnable(GL_BLEND); if (gSettingsCache.show_impact) { drawImpact(pV); } glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glTranslatef(0, 0, cycle->BBox.vSize.v[2] / 2); drawModelExplosion(cycle, pV->exp_radius); } glDisable(GL_BLEND); glDisable(GL_LIGHTING); glPopMatrix(); } int playerVisible(Player *eye, Player *target) { float v1[3]; float v2[3]; float tmp[3]; float s; float d; int i; int lod_level; float x, y; vsub(eye->camera->target, eye->camera->cam, v1); normalize(v1); getPositionFromData(&x, &y, target->data); tmp[0] = x; tmp[1] = y; tmp[2] = 0; lod_level = (gSettingsCache.lod > MAX_LOD_LEVEL) ? MAX_LOD_LEVEL : gSettingsCache.lod; /* calculate lod */ vsub(eye->camera->cam, tmp, v2); d = length(v2); for(i = 0; i < LC_LOD && d >= lod_dist[lod_level][i]; i++); if(i >= LC_LOD) return -1; vsub(tmp, eye->camera->cam, v2); normalize(v2); s = scalarprod(v1, v2); /* maybe that's not exactly correct, but I didn't notice anything */ d = cosf((gSettingsCache.fov / 2) * 2 * PI / 360.0); /* printf("v1: %.2f %.2f %.2f\nv2: %.2f %.2f %.2f\ns: %.2f d: %.2f\n\n", v1[0], v1[1], v1[2], v2[0], v2[1], v2[2], s, d); */ if(s < d-(lightcycle[i]->BBox.fRadius*2)) return -1; else return i; } void drawPlayers(Player *p, PlayerVisual *pV) { int i; for(i = 0; i < game->players; i++) { int lod; int drawTurn = 1; if (gSettingsCache.camType == CAM_TYPE_COCKPIT && p == &game->player[i]) drawTurn = 0; lod = playerVisible(p, &(game->player[i])); if (lod >= 0) { drawCycle(game->player + i, gPlayerVisuals + i, lod, drawTurn); } } } void drawCam(Player *p, PlayerVisual* pV) { int i; float up[3] = { 0, 0, 1 }; Visual *d = & pV->display; glColor3f(0.0, 1.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); doPerspective(gSettingsCache.fov, d->vp_w / d->vp_h, gSettingsCache.znear, game2->rules.grid_size * 6.5f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* set positions for GL lights in world coordinates */ glLightfv(GL_LIGHT1, GL_POSITION, p->camera->cam); doLookAt(p->camera->cam, p->camera->target, up); glDisable(GL_LIGHTING); glDisable(GL_BLEND); glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); /* skybox */ if (gSettingsCache.show_skybox) { drawSkybox(game2->rules.grid_size); } /* fixme: clear z-buffer handling */ /* glDepthMask(GL_TRUE); */ /* floor */ if (gSettingsCache.show_floor_texture) { drawFloorTextured(game2->rules.grid_size, gScreen->textures[TEX_FLOOR]); } else { /* should this be an artpack setting? */ float line_color[] = {1.0, 1.0, 1.0}; drawFloorGrid(game2->rules.grid_size, gSettingsCache.line_spacing, line_color, gSettingsCache.clear_color); } /* glDepthMask(GL_FALSE); */ /* shadows on the floor: cycle, recognizer, trails */ if (gSettingsCache.show_recognizer) { drawRecognizerShadow(); } for(i = 0; i < game->players; i++) { int lod = playerVisible(p, game->player + i); if (lod >= 0) { int drawTurn = 1; if (! gSettingsCache.camType == CAM_TYPE_COCKPIT || p != &game->player[i]) drawTurn = 0; drawCycleShadow(gPlayerVisuals + i, game->player + i, lod, drawTurn); } if (game->player[i].data->trail_height > 0 ) drawTrailShadow(game->player + i, gPlayerVisuals + i); } glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); if (gSettingsCache.show_recognizer && p->data->speed != SPEED_GONE) { drawRecognizer(); } if (gSettingsCache.show_wall == 1) { drawWalls(); } drawPlayers(p, pV); setupLights(eWorld); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1,1); { TrailMesh mesh; mesh.pVertices = (vec3*) malloc(1000 * sizeof(vec3)); mesh.pNormals = (vec3*) malloc(1000 * sizeof(vec3)); mesh.pColors = (unsigned char*) malloc(1000 * 4 * sizeof(float)); mesh.pTexCoords = (vec2*) malloc(1000 * sizeof(vec2)); mesh.pIndices = (unsigned short*) malloc(1000 * 2); for(i = 0; i < game->players; i++) { if (game->player[i].data->trail_height > 0 ) { int vOffset = 0; int iOffset = 0; mesh.iUsed = 0; trailGeometry(game->player + i, gPlayerVisuals + i, &mesh, &vOffset, &iOffset); bowGeometry(game->player + i, gPlayerVisuals + i, &mesh, &vOffset, &iOffset); trailStatesNormal(game->player + i, gScreen->textures[TEX_DECAL]); trailRender(&mesh); trailStatesRestore(); } } free(mesh.pVertices); free(mesh.pNormals); free(mesh.pColors); free(mesh.pTexCoords); free(mesh.pIndices); } glDisable(GL_POLYGON_OFFSET_FILL); for(i = 0; i < game->players; i++) if (game->player[i].data->trail_height > 0 ) drawTrailLines(game->player + i, gPlayerVisuals + i); /* transparent stuff */ /* draw the glow around the other players: */ if (gSettingsCache.show_glow == 1) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); for (i = 0; i < game->players; i++) { if (p != game->player + i && PLAYER_IS_ACTIVE(game->player + i)) { drawGlow(p->camera, game->player + i, gPlayerVisuals + i, d, TRAIL_HEIGHT * 4); } glDisable(GL_BLEND); } } /* 2d hack */ if(gSettingsCache.map_ratio_w > 0) { Visual d2d; memcpy(&d2d, d, sizeof(Visual)); d2d.vp_w *= gSettingsCache.map_ratio_w; d2d.vp_h *= gSettingsCache.map_ratio_h; d2d.vp_x += 20; d2d.vp_y += 20; glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); draw2D(&d2d); glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); } } void initGLGame(void) { glShadeModel( GL_SMOOTH ); glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); } gltron-0.70/src/video/graphics_fx.c0000644000076400001440000000537707735616600013012 #include "video/video.h" #include "game/game.h" void drawGlow(Camera *pCam, Player *pTarget, PlayerVisual *pV, Visual *d, float dim) { float mat[4*4]; float alpha, dist; float x, y; glPushMatrix(); getPositionFromData(&x, &y, pTarget->data); glTranslatef(x, y, 0); glDepthMask(GL_FALSE); glEnable(GL_DEPTH_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glEnable(GL_BLEND); glGetFloatv(GL_MODELVIEW_MATRIX, mat); mat[0] = mat[5] = mat[10] = 1.0; mat[1] = mat[2] = 0.0; mat[4] = mat[6] = 0.0; mat[8] = mat[9] = 0.0; glLoadMatrixf(mat); { vec3 v; v.v[0] = x - pCam->cam[0]; v.v[1] = y - pCam->cam[1]; v.v[2] = 0 - pCam->cam[2]; dist = vec3Length(&v); } { const float fMin = 30; const float fMax = 100; if(dist < fMin) alpha = 0.0f; else if(dist > fMax) alpha = 1.0f; else alpha = (dist - fMin) / (fMax - fMin); // printf("dist: %.2f, alpha: %.2f\n", dist, alpha); } glBegin(GL_TRIANGLE_FAN); glColor4f(pV->pColorDiffuse[0], pV->pColorDiffuse[1], pV->pColorDiffuse[2], alpha); glVertex3f(0,TRAIL_HEIGHT/2, 0); glColor4f(0,0,0,0.0); glVertex3d(dim*cos(-0.2*3.1415/5.0), TRAIL_HEIGHT/2+dim*sin(-0.2*3.1415/5.0), 0); glVertex3d(dim*cos(1.0*3.1415/5.0), TRAIL_HEIGHT/2+dim*sin(1.0*3.1415/5.0), 0); glVertex3d(dim*cos(2.0*3.1415/5.0), TRAIL_HEIGHT/2+dim*sin(2.0*3.1415/5.0), 0); glVertex3d(dim*cos(3.0*3.1415/5.0), TRAIL_HEIGHT/2+dim*sin(3.0*3.1415/5.0), 0); glVertex3d(dim*cos(4.0*3.1415/5.0), TRAIL_HEIGHT/2+dim*sin(4.0*3.1415/5.0), 0); glVertex3d(dim*cos(5.2*3.1415/5.0), TRAIL_HEIGHT/2+dim*sin(5.2*3.1415/5.0), 0); glEnd(); polycount += 5; glBegin(GL_TRIANGLES); glColor4f(pV->pColorDiffuse[0], pV->pColorDiffuse[1], pV->pColorDiffuse[2], alpha); glVertex3f(0,TRAIL_HEIGHT/2, 0); glColor4f(0,0,0,0.0); glVertex3f(0,-TRAIL_HEIGHT/4,0); glVertex3d(dim*cos(-0.2f*3.1415/5.0), TRAIL_HEIGHT/2+dim*sin(-0.2*3.1415/5.0), 0); glColor4f(pV->pColorDiffuse[0], pV->pColorDiffuse[1], pV->pColorDiffuse[2], alpha); glVertex3f(0,TRAIL_HEIGHT/2, 0); glColor4f(0,0,0,0.0); glVertex3d(dim*cos(5.2*3.1415/5.0), TRAIL_HEIGHT/2+dim*sin(5.2*3.1415/5.0), 0); glVertex3f(0,-TRAIL_HEIGHT/4,0); glEnd(); polycount += 3; glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); glPopMatrix(); } void drawImpact(PlayerVisual *pV) { glDisable(GL_LIGHTING); glPushMatrix(); glRotatef(90, 90, 0, 1); /* * Drop impact slightly below the floor and move it a tiny bit * back from the impact point so we don't draw behind the * trail/wall that's hit. */ glTranslatef(0.0, -0.5, -0.5); glColor3f(0.68f, 0, 0); drawExplosion(&(pV->impact_radius)); glPopMatrix(); glEnable(GL_LIGHTING); } gltron-0.70/src/video/graphics_hud.c0000644000076400001440000000702707764076763013163 #include "video/video.h" #include "game/game.h" void drawAI(Visual *d) { char ai[] = "computer player"; rasonly(d); glColor3f(1.0, 1.0, 1.0); drawText(gameFtx, d->vp_w / 4, 10, d->vp_w / (2 * strlen(ai)), ai); /* glRasterPos2i(100, 0); */ } void drawPause(Visual *display) { char pause[] = "Game is paused"; char winner[] = "Player %d wins!"; char nowinner[] = "No one wins!"; char buf[100]; char *message; static float d = 0; static float lt = 0; float delta; int now; now = SystemGetElapsedTime(); delta = now - lt; lt = now; delta /= 500.0; d += delta; /* printf("%.5f\n", delta); */ if (d > 2 * PI) { d -= 2 * PI; } if ((game->pauseflag & PAUSE_GAME_FINISHED) && game->winner != -1) { if (game->winner >= -1) { float* player_color = gPlayerVisuals[game->winner].pColorAlpha; /* make the 'Player wins' message oscillate between white and the winning bike's color */ glColor3f((player_color[0] + ((sinf(d) + 1) / 2) * (1 - player_color[0])), (player_color[1] + ((sinf(d) + 1) / 2) * (1 - player_color[1])), (player_color[2] + ((sinf(d) + 1) / 2) * (1 - player_color[2]))); message = buf; sprintf(message, winner, game->winner + 1); } else { glColor3d(1.0, (sin(d) + 1) / 2, (sin(d) + 1) / 2); message = nowinner; } } else { glColor3d(1.0, (sin(d) + 1) / 2, (sin(d) + 1) / 2); message = pause; } rasonly(gScreen); drawText(gameFtx, display->vp_w / 6, 20, display->vp_w / (6.0f / 4.0f * strlen(message)), message); } void drawScore(Player *p, Visual *d) { char tmp[10]; /* hey, they won't reach such a score */ sprintf(tmp, "%d", p->data->score); rasonly(d); glColor4f(1.0, 1.0, 0.2f, 1.0); drawText(gameFtx, 5, 5, 32, tmp); } void drawFPS(Visual *d) { #define FPS_HSIZE 20 /* draws FPS in upper left corner of Display d */ static int fps_h[FPS_HSIZE]; static int pos = -FPS_HSIZE; static int fps_min = 0; static int fps_avg = 0; char tmp[20]; int diff; rasonly(d); diff = (game2->time.dt > 0) ? game2->time.dt : 1; if(pos < 0) { fps_avg = 1000 / diff; fps_min = 1000 / diff; fps_h[pos + FPS_HSIZE] = 1000 / diff; pos++; } else { fps_h[pos] = 1000 / diff; pos = (pos + 1) % FPS_HSIZE; if(pos % 10 == 0) { int i; int sum = 0; int min = 1000; for(i = 0; i < FPS_HSIZE; i++) { sum += fps_h[i]; if(fps_h[i] < min) min = fps_h[i]; } fps_min = min; fps_avg = sum / FPS_HSIZE; } } sprintf(tmp, "average FPS: %d", fps_avg); glColor4f(1.0, 0.4f, 0.2f, 1.0); drawText(gameFtx, d->vp_w - 180, d->vp_h - 20, 10, tmp); sprintf(tmp, "minimum FPS: %d", fps_min); drawText(gameFtx, d->vp_w - 180, d->vp_h - 35, 10, tmp); sprintf(tmp, "triangles: %d", polycount); drawText(gameFtx, d->vp_w - 180, d->vp_h - 50, 10, tmp); } void drawConsoleLines(char *line, int call) { #define CONSOLE_SIZE 15 #define CONSOLE_X_OFF 20 int size = CONSOLE_SIZE; int length; /* fprintf(stdout, "%s\n", line); */ length = strlen(line); while(length * size > gScreen->vp_w / 2 - CONSOLE_X_OFF) size--; if(*line != 0) drawText(gameFtx, CONSOLE_X_OFF, gScreen->vp_h - 20 * (call + 1), size, line); } void drawConsole(Visual *d) { int lines; rasonly(d); glColor3f(1.0, 0.3f, 0.3f); if (gSettingsCache.softwareRendering) { lines = 1; } else if (gScreen->vp_h < 600) { lines = 3; } else { lines = 5; } consoleDisplay(drawConsoleLines, lines); } gltron-0.70/src/video/graphics_lights.c0000644000076400001440000000324407704041046013646 #include "video/video.h" void setupLights(int type) { float white[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // float gray22[] = { 0.22f, 0.22f, 0.22f, 1.0f }; float gray66[] = { 0.66f, 0.66f, 0.66f, 1.0f }; float gray10[] = { 0.1f, 0.1f, 0.1f, 1.0f }; float black[] = { 0.0f, 0.0f, 0.0f, 1.0f }; float posWorld0[] = { 1, .8f, 0, 0 }; float posWorld1[] = { -1, -.8f, 0, 0 }; float posCycles0[] = { 0, 0, 0, 1 }; int i; // turn global ambient lighting off glLightModelfv(GL_LIGHT_MODEL_AMBIENT, black); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0); switch(type) { case eWorld: glEnable(GL_LIGHTING); glMatrixMode(GL_MODELVIEW); glPushMatrix(); // glLoadIdentity(); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_POSITION, posWorld0); glLightfv(GL_LIGHT0, GL_AMBIENT, gray10); // glLightfv(GL_LIGHT0, GL_AMBIENT, black); glLightfv(GL_LIGHT0, GL_SPECULAR, white); glLightfv(GL_LIGHT0, GL_DIFFUSE, white); glEnable(GL_LIGHT1); glLightfv(GL_LIGHT1, GL_POSITION, posWorld1); glLightfv(GL_LIGHT1, GL_AMBIENT, black); glLightfv(GL_LIGHT1, GL_SPECULAR, gray66); glLightfv(GL_LIGHT1, GL_DIFFUSE, gray66); for(i = 2; i < 8; i++) glDisable(GL_LIGHT0 + i); glPopMatrix(); break; case eCycles: case eRecognizer: glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glLightfv(GL_LIGHT0, GL_POSITION, posCycles0); glLightfv(GL_LIGHT0, GL_AMBIENT, gray10); glLightfv(GL_LIGHT0, GL_SPECULAR, white); glLightfv(GL_LIGHT0, GL_DIFFUSE, white); for(i = 1; i < 8; i++) glDisable(GL_LIGHT0 + i); glPopMatrix(); break; } } gltron-0.70/src/video/graphics_utility.c0000644000076400001440000000340407704041046014055 #include "video/video.h" #include "game/game.h" void checkGLError(const char *where) { int error; error = glGetError(); if(error != GL_NO_ERROR) printf("[glError: %s] - %d\n", where, error); } void rasonly(Visual *d) { /* do rasterising only (in local display d) */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0f, (GLfloat) d->vp_w, 0.0f, (GLfloat) d->vp_h, 0.0f, 1.0f); checkGLError("rasonly"); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glViewport(d->vp_x, d->vp_y, d->vp_w, d->vp_h); } void doPerspective(float fov, float ratio, float znear, float zfar) { float top; float left; top = tanf( fov * PI / 360.0 ) * znear; left = - top * ratio; glFrustum(left, -left, -top, top, znear, zfar); } void doLookAt(float *cam, float *target, float *up) { float m[16]; float x[3], y[3], z[3]; vsub(cam, target, z); normalize(z); crossprod(up, z, x); crossprod(z, x, y); normalize(x); normalize(y); #define M(row,col) m[col*4+row] M(0,0) = x[0]; M(0,1) = x[1]; M(0,2) = x[2]; M(0,3) = 0.0; M(1,0) = y[0]; M(1,1) = y[1]; M(1,2) = y[2]; M(1,3) = 0.0; M(2,0) = z[0]; M(2,1) = z[1]; M(2,2) = z[2]; M(2,3) = 0.0; M(3,0) = 0.0; M(3,1) = 0.0; M(3,2) = 0.0; M(3,3) = 1.0; #undef M glMultMatrixf( m ); /* Translate Eye to Origin */ glTranslatef( -cam[0], -cam[1], -cam[2]); } void drawText(FontTex* ftx, int x, int y, int size, const char *text) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_TEXTURE_2D); glPushMatrix(); glTranslatef(x, y, 0); glScalef(size, size, size); ftxRenderString(ftx, text, strlen(text)); glPopMatrix(); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); polycount += 2 * strlen(text); /* quads are two triangles */ } gltron-0.70/src/video/graphics_world.c0000644000076400001440000000727007764076763013532 #include "video/video.h" #include "game/game.h" void drawWalls(void) { #undef WALL_H #define WALL_H 48 float t; float h; t = game2->rules.grid_size / 240.0f; if (gSettingsCache.stretch_textures) { h = t * WALL_H; t = 1.0; } else h = WALL_H; glColor4f(1.0, 1.0, 1.0, 1.0); /* glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); */ glEnable(GL_CULL_FACE); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); #define T_TOP 1.0f glBindTexture(GL_TEXTURE_2D, gScreen->textures[TEX_WALL1]); glBegin(GL_QUADS); glTexCoord2f(t, 0.0); glVertex3f(0.0, 0.0, 0.0); glTexCoord2f(t, T_TOP); glVertex3f(0.0, 0.0, h); glTexCoord2f(0.0, T_TOP); glVertex3f(game2->rules.grid_size, 0.0, h); glTexCoord2f(0.0, 0.0); glVertex3f(game2->rules.grid_size, 0.0, 0.0); glEnd(); glBindTexture(GL_TEXTURE_2D, gScreen->textures[TEX_WALL2]); glBegin(GL_QUADS); glTexCoord2f(t, 0.0); glVertex3f(game2->rules.grid_size, 0.0, 0.0); glTexCoord2f(t, T_TOP); glVertex3f(game2->rules.grid_size, 0.0, h); glTexCoord2f(0.0, T_TOP); glVertex3f(game2->rules.grid_size, game2->rules.grid_size, h); glTexCoord2f(0.0, 0.0); glVertex3f(game2->rules.grid_size, game2->rules.grid_size, 0.0); glEnd(); glBindTexture(GL_TEXTURE_2D, gScreen->textures[TEX_WALL3]); glBegin (GL_QUADS); glTexCoord2f(t, 0.0); glVertex3f(game2->rules.grid_size, game2->rules.grid_size, 0.0); glTexCoord2f(t, T_TOP); glVertex3f(game2->rules.grid_size, game2->rules.grid_size, h); glTexCoord2f(0.0, T_TOP); glVertex3f(0.0, game2->rules.grid_size, h); glTexCoord2f(0.0, 0.0); glVertex3f(0.0, game2->rules.grid_size, 0.0); glEnd(); glBindTexture(GL_TEXTURE_2D, gScreen->textures[TEX_WALL4]); glBegin(GL_QUADS); glTexCoord2f(t, 0.0); glVertex3f(0.0, game2->rules.grid_size, 0.0); glTexCoord2f(t, T_TOP); glVertex3f(0.0, game2->rules.grid_size, h); glTexCoord2f(0.0, T_TOP); glVertex3f(0.0, 0.0, h); glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); #undef T_TOP glEnd(); polycount += 8; glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); glDisable(GL_CULL_FACE); } /*! * drawFloorTextured * * \return number of polygons drawn * * Draws the arena floor covered with a repeating floor texture */ int drawFloorTextured(int grid_size, GLuint texture) { int i, j, l, t; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture); /* there are some strange clipping artefacts on some renderers */ /* try subdividing things... */ glColor4f(1.0, 1.0, 1.0, 1.0); l = grid_size / 4; t = l / 12; // glBegin(GL_QUADS); for (i = 0; i < grid_size; i += l) { glBegin(GL_QUADS); for (j = 0; j < grid_size; j += l) { glTexCoord2i(0, 0); glVertex2i(i, j); glTexCoord2i(t, 0); glVertex2i(i + l, j); glTexCoord2i(t, t); glVertex2i(i + l, j + l); glTexCoord2i(0, t); glVertex2i(i, j + l); } glEnd(); } // glEnd(); glDisable(GL_TEXTURE_2D); return grid_size * grid_size; } void drawFloorGrid(int grid_size, int line_spacing, float line_color[4], float square_color[4]) { int i, j; glColor3fv(line_color); glFogfv(GL_FOG_COLOR, square_color); glFogi(GL_FOG_MODE, GL_LINEAR); glFogi(GL_FOG_START, 100); glFogi(GL_FOG_END, 350); glEnable(GL_FOG); glBegin(GL_LINES); for (i = 0; i < grid_size; i += line_spacing) { for (j = 0; j < grid_size; j += line_spacing) { glVertex3i(i, j, 0); glVertex3i(i + line_spacing, j, 0); glVertex3i(i, j, 0); glVertex3i(i, j + line_spacing, 0); } } glEnd(); glDisable(GL_FOG); } gltron-0.70/src/video/load_texture.c0000644000076400001440000000366507766301735013216 #include "video/video.h" #include "filesystem/path.h" #include "Nebu_scripting.h" void freeTextureData(texture *tex) { free(tex->data); free(tex); } texture* loadTextureData(const char *filename) { texture *tex = NULL; char *path; char *artpack; scripting_GetGlobal("settings", "current_artpack", NULL); scripting_GetStringResult(&artpack); path = getArtPath(artpack, filename); free(artpack); if(path != NULL) { tex = LOAD_TEX(path); free(path); } if(tex == NULL) { fprintf(stderr, "fatal: failed load %s, exiting...\n", filename); exit(1); /* OK: critical, installation corrupt */ } return tex; } void loadTexture(const char *filename, int format) { texture *tex; GLint internal; int maxSize; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize); tex = loadTextureData(filename); if(tex->channels == 3) internal = GL_RGB; else internal = GL_RGBA; if(format == GL_DONT_CARE) { if(tex->channels == 3) format = GL_RGB; if(tex->channels == 4) format = GL_RGBA; } /* TODO: build mipmaps the proper way, box filters suck */ glPixelStorei(GL_UNPACK_ALIGNMENT, 1); { texture *newtex; int level = 0; while (tex->width > 1 || tex->height > 1) { if(tex->width <= maxSize && tex->height <= maxSize) { glTexImage2D(GL_TEXTURE_2D, level, format, tex->width, tex->height, 0, internal, GL_UNSIGNED_BYTE, tex->data); #ifdef PRINTF_VERBOSE printf("uploading level %d, %dx%d texture\n", level, tex->width, tex->height); #endif level++; } newtex = mipmap_png_texture(tex, 1, 0, 0); freeTextureData(tex); tex = newtex; } /* upload 1x1 mip level */ glTexImage2D(GL_TEXTURE_2D, level, format, tex->width, tex->height, 0, internal, GL_UNSIGNED_BYTE, tex->data); #ifdef PRINTF_VERBOSE printf("uploading level %d, %dx%d texture\n", level, tex->width, tex->height); #endif freeTextureData(tex); } } gltron-0.70/src/video/material.c0000644000076400001440000001013407704041046012266 #include "video/model.h" #include "filesystem/path.h" #include #include #include #include "zlib.h" void loadDefaultMaterial(Material *pMaterial) { float ambient[] = { 0.2f, 0.2f, 0.2f, 1.0 }; float diffuse[] = { 1.0, 1.0, 0.0, 1.0 }; float specular[] = { 1.0, 1.0, 1.0, 1.0 }; float shininess = 2; memcpy( pMaterial->ambient, ambient, sizeof(ambient) ); memcpy( pMaterial->diffuse, diffuse, sizeof(diffuse) ); memcpy( pMaterial->specular, specular, sizeof(specular) ); pMaterial->shininess = shininess; pMaterial->name = NULL; pMaterial->map_diffuse = NULL; } void readMaterialLibraryFromFile(char *filename, Mesh *pMesh) { Material *pMaterials; int iMaterial; char buf[BUF_SIZE]; char name[BUF_SIZE]; char *path; gzFile f; int i; path = getPath(PATH_DATA, filename); if(path == NULL) { fprintf(stderr, "** could not optain path to file '%s'\n", filename); return; } if((f = gzopen(path, "r")) == 0) { fprintf(stderr, "** could not open file '%s'\n", filename); free(path); return; } free(path); pMaterials = malloc( MAX_MATERIALS * sizeof( Material ) ); iMaterial = -1; while( gzgets(f, buf, sizeof(buf)) ) { switch(buf[0]) { case '#': break; case 'n': iMaterial++; loadDefaultMaterial(pMaterials + iMaterial); sscanf(buf, "newmtl %s ", name); pMaterials[iMaterial].name = malloc( strlen(name) + 1 ); strcpy( pMaterials[iMaterial].name, name ); break; default: if(sscanf(buf, " Ka %f %f %f ", pMaterials[iMaterial].ambient + 0, pMaterials[iMaterial].ambient + 1, pMaterials[iMaterial].ambient + 2) == 3) { // nothing } else if(sscanf(buf, " Kd %f %f %f ", pMaterials[iMaterial].diffuse + 0, pMaterials[iMaterial].diffuse + 1, pMaterials[iMaterial].diffuse + 2) == 3) { // nothing } else if(sscanf(buf, " Ks %f %f %f ", pMaterials[iMaterial].specular + 0, pMaterials[iMaterial].specular + 1, pMaterials[iMaterial].specular + 2) == 3) { // nothing } else if(sscanf(buf, " Ns %f ", & (pMaterials[iMaterial].shininess) ) == 1 ) { // nothing } else { /* FIXME: "disabled error message" */ /* fprintf(stderr, "+++ unparsed material property: %s", buf); */ } } } pMesh->nMaterials = iMaterial + 1; pMesh->pMaterials = malloc( sizeof(Material) * pMesh->nMaterials ); for(i = 0; i < pMesh->nMaterials; i++) { memcpy( pMesh->pMaterials + i, pMaterials + i, sizeof(Material) ); } free(pMaterials); } void readMaterialLibrary(char *buf, Mesh *pMesh) { char filename[BUF_SIZE]; if(sscanf(buf, " mtllib %s ", filename) != 1) { fprintf(stderr, "*** failing parsing filename from %s\n", buf); return; } readMaterialLibraryFromFile(filename, pMesh); } void setMaterial(char *buf, Mesh *pMesh, int *iGroup) { char name[BUF_SIZE]; int i; if(sscanf(buf, " usemtl %s ", name) == 1) { // search through all materials for the current one for(i = 0; i < pMesh->nMaterials; i++) { if(strstr(pMesh->pMaterials[i].name, name) == pMesh->pMaterials[i].name) { *iGroup = i; return; } } fprintf(stderr, "*** error: material %s not found\n", name); } else { fprintf(stderr, "*** error: can't parse material line %s\n", buf); } } void SetMaterialColor(Mesh *pMesh, char *name, ColorType eType, float pColor[4]) { int i; for(i = 0; i < pMesh->nMaterials; i++) { if(name == NULL || strstr(pMesh->pMaterials[i].name, name) == pMesh->pMaterials[i].name) { switch(eType) { case eAmbient: memcpy( pMesh->pMaterials[i].ambient, pColor, sizeof(float[4]) ); break; case eDiffuse: memcpy( pMesh->pMaterials[i].diffuse, pColor, sizeof(float[4]) ); break; case eSpecular: memcpy( pMesh->pMaterials[i].specular, pColor, sizeof(float[4]) ); break; } } } } /* void copyMaterialColors(Material *pIn, Material *pOut) { memcpy(pOut->ambient, pIn->ambient, sizeof( ambient )); memcpy(pOut->diffuse, pIn->diffuse, sizeof( diffuse )); memcpy(pOut->specular, pIn->specular, sizeof( specular )); pOut->shininess = pIn->shininess; } */ gltron-0.70/src/video/model.c0000644000076400001440000002435707704041046011604 // include a few datastructures & constants #include "video/model.h" #include "video/video.h" #include "math.h" #include "stdio.h" #include "stdlib.h" #include "zlib.h" extern void readMaterialLibrary(char *buf, Mesh *pMesh); extern void setMaterial(char *buf, Mesh *pMesh, int *iGroup); void readVector(char *buf, vec3 *pVertex ) { if( sscanf(buf, " %f %f %f ", pVertex->v, pVertex->v + 1, pVertex->v + 2) != 3) { fprintf(stderr, "*** failed reading Vector from %s\n", buf); } } void readTriFace(char *buf, face *pFace, int *iFace, int iGroup) { // assumes model in "f %d//%d %d//%d %d//%d\n" format if( sscanf(buf, "f %d//%d %d//%d %d//%d ", pFace[ *iFace ].vertex + 0, pFace[ *iFace ].normal + 0, pFace[ *iFace ].vertex + 1, pFace[ *iFace ].normal + 1, pFace[ *iFace ].vertex + 2, pFace[ *iFace ].normal + 2) == 6) { pFace[ *iFace ].material = iGroup; (*iFace)++; } else { fprintf(stderr, "*** failed parsing face %s\n", buf); } } void readQuadFace(char *buf, quadFace *pFace, int *iFace, int iGroup) { // assumes model in "f %d//%d %d//%d %d//%d %d//%d\n" format if( sscanf(buf, "f %d//%d %d//%d %d//%d %d//%d", pFace[ *iFace ].vertex + 0, pFace[ *iFace ].normal + 0, pFace[ *iFace ].vertex + 1, pFace[ *iFace ].normal + 1, pFace[ *iFace ].vertex + 2, pFace[ *iFace ].normal + 2, pFace[ *iFace ].vertex + 3, pFace[ *iFace ].normal + 3) == 8) { pFace[ *iFace ].material = iGroup; (*iFace)++; } else { fprintf(stderr, "*** failed parsing face %s\n", buf); } } Mesh* readMeshFromFile(const char *filename, MeshType iType) { // allocate some buffers // vertices, normals vec3 *pVertices = malloc( sizeof(vec3) * MAX_VERTICES ); vec3 *pNormals = malloc( sizeof(vec3) * MAX_NORMALS ); quadFace *pqFaces = NULL; face *pFaces = NULL; int iFaceSize = 0; Mesh *pMesh = malloc( sizeof(Mesh) ); int iGroup = 0; int iVertex = 0, iNormal = 0, iFace = 0; gzFile f; char buf[BUF_SIZE]; int i, j, k; switch(iType) { case TRI_MESH: pFaces = malloc( sizeof(face) * MAX_FACES ); iFaceSize = 3; break; case QUAD_MESH: pqFaces = malloc( sizeof(quadFace) * MAX_FACES ); iFaceSize = 4; break; default: fprintf(stderr, "[fatal]: illegal mesh type\n"); exit(1); } if((f = gzopen(filename, "r")) == 0) { fprintf(stderr, "*** could not open file '%s'\n", filename); return NULL; } while( gzgets(f, buf, sizeof(buf)) ) { switch(buf[0]) { case 'm': // material library readMaterialLibrary(buf, pMesh); break; case 'u': // material name setMaterial(buf, pMesh, &iGroup); break; case 'v': // vertex, normal, texture coordinate switch(buf[1]) { case ' ': readVector(buf + 1, pVertices + iVertex); iVertex++; break; case 'n': // normal readVector(buf + 2, pNormals + iNormal); iNormal++; break; case 't': // texture break; // ignore textures; } break; case 'f': // face (can produce multiple faces) switch(iType) { case TRI_MESH: readTriFace(buf, pFaces, &iFace, iGroup); break; case QUAD_MESH: readQuadFace(buf, pqFaces, &iFace, iGroup); break; } break; } } gzclose(f); // printf("vertices: %d, normals: %d, faces: %d\n", iVertex, iNormal, iFace); // count each material pMesh->pnFaces = malloc( sizeof(int) * pMesh->nMaterials ); for(i = 0; i < pMesh->nMaterials; i++) { pMesh->pnFaces[ i ] = 0; } switch(iType) { case TRI_MESH: for(i = 0; i < iFace; i++) { pMesh->pnFaces[ pFaces[i].material ] += 1; } break; case QUAD_MESH: for(i = 0; i < iFace; i++) { pMesh->pnFaces[ pqFaces[i].material ] += 1; } break; } // combine vectors & normals for each vertex, doubling where necessary // initialize lookup[ vertex ][ normal ] table { int nVertices = 0; int **lookup = malloc( sizeof(int*) * iVertex ); for(i = 0; i < iVertex; i++) { lookup[i] = malloc( sizeof(int) * iNormal ); for(j = 0; j < iNormal; j++) { lookup[i][j] = -1; } } switch(iType) { case TRI_MESH: for(i = 0; i < iFace; i++) { for(j = 0; j < iFaceSize; j++) { int vertex = pFaces[i].vertex[j] - 1; int normal = pFaces[i].normal[j] - 1; if( lookup[ vertex ][ normal ] == -1 ) { lookup[ vertex ][ normal ] = nVertices; nVertices++; } } } break; case QUAD_MESH: for(i = 0; i < iFace; i++) { for(j = 0; j < iFaceSize; j++) { int vertex = pqFaces[i].vertex[j] - 1; int normal = pqFaces[i].normal[j] - 1; if( lookup[ vertex ][ normal ] == -1 ) { lookup[ vertex ][ normal ] = nVertices; nVertices++; } } } break; } // now that we know everything, build vertexarray based mesh // copy normals & vertices indexed by lookup-table pMesh->nVertices = nVertices; pMesh->pVertices = malloc( sizeof(GLfloat) * 3 * nVertices ); pMesh->pNormals = malloc( sizeof(GLfloat) * 3 * nVertices ); for(i = 0; i < iVertex; i++) { for(j = 0; j < iNormal; j++) { int vertex = lookup[ i ][ j ]; if(vertex != -1 ) { for(k = 0; k < 3; k++) { *(pMesh->pVertices + 3 * vertex + k) = pVertices[ i ].v[k]; *(pMesh->pNormals + 3 * vertex + k) = pNormals[ j ].v[k]; } } } } // build indices (per Material) { int *face; face = malloc( sizeof(int) * pMesh->nMaterials ); pMesh->ppIndices = malloc( sizeof(GLshort*) * pMesh->nMaterials ); for(i = 0; i < pMesh->nMaterials; i++) { pMesh->ppIndices[i] = malloc( sizeof(GLshort) * iFaceSize * pMesh->pnFaces[i] ); face[i] = 0; } switch(iType) { case TRI_MESH: for(i = 0; i < iFace; i++) { int material = pFaces[i].material; for(j = 0; j < iFaceSize; j++) { int vertex = pFaces[i].vertex[j] - 1; int normal = pFaces[i].normal[j] - 1; pMesh->ppIndices[ material ][ iFaceSize * face[ material ] + j ] = lookup[ vertex ][ normal ]; } face[ material ] = face[ material] + 1; } break; case QUAD_MESH: for(i = 0; i < iFace; i++) { int material = pqFaces[i].material; for(j = 0; j < iFaceSize; j++) { int vertex = pqFaces[i].vertex[j] - 1; int normal = pqFaces[i].normal[j] - 1; pMesh->ppIndices[ material ][ iFaceSize * face[ material ] + j ] = lookup[ vertex ][ normal ]; } face[ material ] = face[ material] + 1; } break; } free(face); } // printf("[scenegraph] vertices: %d, faces: %d\n", nVertices, iFace); free(lookup); free(pVertices); free(pNormals); switch(iType) { case TRI_MESH: free(pFaces); break; case QUAD_MESH: free(pqFaces); break; } } computeBBox(pMesh); return pMesh; } void drawModel(Mesh *pMesh, MeshType iType) { int i; int iFaceSize = 0; GLenum primitive = GL_TRIANGLES; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glVertexPointer(3, GL_FLOAT, 0, pMesh->pVertices); glNormalPointer(GL_FLOAT, 0, pMesh->pNormals); switch(iType) { case TRI_MESH: primitive = GL_TRIANGLES; iFaceSize = 3; break; case QUAD_MESH: primitive = GL_QUADS; iFaceSize = 4; break; default: fprintf(stderr, "[fatal]: illegal mesh type\n"); exit(1); } for(i = 0; i < pMesh->nMaterials; i++) { glMaterialfv(GL_FRONT, GL_AMBIENT, pMesh->pMaterials[i].ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, pMesh->pMaterials[i].diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, pMesh->pMaterials[i].specular); glMaterialf(GL_FRONT, GL_SHININESS, pMesh->pMaterials[i].shininess); glDrawElements(primitive, iFaceSize * pMesh->pnFaces[i], GL_UNSIGNED_SHORT, pMesh->ppIndices[i]); polycount += pMesh->pnFaces[i]; } } void drawModelExplosion(Mesh *pMesh, float fRadius) { int i, j, k; #define EXP_VECTORS 10 float vectors[][3] = { { 0.03f, -0.06f, -0.07f }, { 0.04f, 0.08f, -0.03f }, { 0.10f, -0.04f, -0.07f }, { 0.06f, -0.09f, -0.10f }, { -0.03f, -0.05f, 0.02f }, { 0.07f, 0.08f, -0.00f }, { 0.01f, -0.04f, 0.10f }, { -0.01f, -0.07f, 0.09f }, { 0.01f, -0.01f, -0.09f }, { -0.04f, 0.04f, 0.02f } }; for(i = 0; i < pMesh->nMaterials; i++) { glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, pMesh->pMaterials[i].ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pMesh->pMaterials[i].diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, pMesh->pMaterials[i].specular); glMaterialf(GL_FRONT, GL_SHININESS, pMesh->pMaterials[i].shininess); for(j = 0; j < pMesh->pnFaces[i]; j++) { float *normal, *vertex; normal = pMesh->pNormals + 3 * pMesh->ppIndices[i][3 * j]; glPushMatrix(); glTranslatef(fRadius * (*(normal + 0) + vectors[j % EXP_VECTORS][0]), fRadius * (*(normal + 1) + vectors[j % EXP_VECTORS][1]), fabsf(fRadius * (*(normal + 2) + vectors[j % EXP_VECTORS][2]) )); glBegin(GL_TRIANGLES); for(k = 0; k < 3; k++) { normal = pMesh->pNormals + 3 * pMesh->ppIndices[i][3 * j + k]; vertex = pMesh->pVertices + 3 * pMesh->ppIndices[i][3 * j + k]; glNormal3fv(normal); glVertex3fv(vertex); } glEnd(); glPopMatrix(); } polycount += pMesh->pnFaces[i]; } } void computeBBox(Mesh *pMesh) { int i, j; vec3 vMin, vMax, vSize; vcopy(pMesh->pVertices, vMin.v); vcopy(pMesh->pVertices, vMax.v); for(i = 0; i < pMesh->nVertices; i++) { for(j = 0; j < 3; j++) { if(vMin.v[j] > pMesh->pVertices[3 * i + j]) vMin.v[j] = pMesh->pVertices[3 * i + j]; if(vMax.v[j] < pMesh->pVertices[3 * i + j]) vMax.v[j] = pMesh->pVertices[3 * i + j]; } /* if( vMin.v[0] <= pMesh->pVertices[3 * i + 0] && vMin.v[1] <= pMesh->pVertices[3 * i + 1] && vMin.v[2] <= pMesh->pVertices[3 * i + 2] ) vcopy(pMesh->pVertices + 3 * i, vMin.v); if( vMax.v[0] >= pMesh->pVertices[3 * i + 0] && vMax.v[1] >= pMesh->pVertices[3 * i + 1] && vMax.v[2] >= pMesh->pVertices[3 * i + 2] ) vcopy(pMesh->pVertices + 3 * i, vMax.v); */ } vsub(vMax.v, vMin.v, vSize.v); vcopy(vMin.v, pMesh->BBox.vMin.v); vcopy(vSize.v, pMesh->BBox.vSize.v); pMesh->BBox.fRadius=length(pMesh->BBox.vSize.v)/10; } gltron-0.70/src/video/recognizer.c0000644000076400001440000000701607764076763012670 #include "video/video.h" #include static float alpha = 0; const static float rec_scale_factor = 0.25f; static float xv[] = { 0.5f, 0.3245f, 0.6f, 0.5f, 0.68f, -0.3f }; static float yv[] = { 0.8f, 1.0f, 0.0f, 0.2f, 0.2f, 0.0f }; static float x(void) { return xv[0] * sinf(xv[1] * alpha + xv[2]) - xv[3] * sinf(xv[4] * alpha + xv[5]); } static float y(void) { return yv[0] * cosf(yv[1] * alpha + yv[2]) - yv[3] * sinf(yv[4] * alpha + yv[5]); } static float dx(void) { return xv[1] * xv[0] * cosf(xv[1] * alpha + xv[2]) - xv[4] * xv[3] * cosf(xv[4] * alpha + xv[5]); } static float dy(void) { return - yv[1] * yv[0] * sinf(yv[1] * alpha + yv[2]) - yv[4] * yv[3] * sinf(yv[4] * alpha + yv[5]); } float getRecognizerAngle(vec2 *velocity) { float dxval = velocity->v[0]; float dyval = velocity->v[0]; float phi = acosf ( dxval / sqrtf( dxval * dxval + dyval * dyval ) ); if (dyval < 0) { phi = 2 * PI - phi; } return (phi + PI / 2) * 180 / PI; } void getRecognizerPositionVelocity(vec2 *p, vec2 *v) { float max = recognizer->BBox.vSize.v[0] * rec_scale_factor; float rec_boundry = game2->rules.grid_size - max; p->v[0] = (max + (x() + 1.0f) * rec_boundry) / 2.0f; p->v[1] = (max + (y() + 1.0f) * rec_boundry) / 2.0f; v->v[0] = dx() * game2->rules.grid_size / 100.f; v->v[1] = dy() * game2->rules.grid_size / 100.f; } void drawRecognizerShadow(void) { float dirx; vec2 p, v; /* states */ glEnable(GL_CULL_FACE); if(gSettingsCache.use_stencil) { glEnable(GL_STENCIL_TEST); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); glStencilFunc(GL_GREATER, 1, 1); glEnable(GL_BLEND); glColor4fv(shadow_color); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else { glColor3f(0, 0, 0); glDisable(GL_BLEND); } /* transformations */ getRecognizerPositionVelocity(&p, &v); dirx = getRecognizerAngle(&v); glPushMatrix(); glMultMatrixf(shadow_matrix); glTranslatef( p.v[0], p.v[1], RECOGNIZER_HEIGHT); glRotatef(dirx, 0, 0, 1); /* up */ glScalef(rec_scale_factor, rec_scale_factor, rec_scale_factor); glEnable(GL_NORMALIZE); /* render */ drawModel(recognizer, TRI_MESH); /* restore */ if(gSettingsCache.use_stencil) glDisable(GL_STENCIL_TEST); glDisable(GL_BLEND); glDisable(GL_CULL_FACE); glPopMatrix(); } void drawRecognizer(void) { float dirx; vec2 p, v; glPushMatrix(); /* transformations */ getRecognizerPositionVelocity(&p, &v); dirx = getRecognizerAngle(&v); glTranslatef( p.v[0], p.v[1], RECOGNIZER_HEIGHT); glRotatef(dirx, 0, 0, 1); /* up */ glScalef(rec_scale_factor, rec_scale_factor, rec_scale_factor); glDisable(GL_LIGHT0); glDisable(GL_LIGHT1); glLightfv(GL_LIGHT2, GL_SPECULAR, rec_spec_color); glEnable(GL_LIGHT2); glDisable(GL_BLEND); glEnable(GL_CULL_FACE); if (gSettingsCache.light_cycles) { glEnable(GL_LIGHTING); } glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1,1); glEnable(GL_NORMALIZE); glColor3f(0.0, 0.0, 0.0); drawModel(recognizer, TRI_MESH); glDisable(GL_POLYGON_OFFSET_FILL); glDisable(GL_LIGHT2); glEnable(GL_LIGHT1); glDisable(GL_LIGHTING); glColor3fv(rec_outline_color); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); drawModel(recognizer_quad, QUAD_MESH); glDisable(GL_LINE_SMOOTH); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glDisable(GL_CULL_FACE); glPopMatrix(); } void doRecognizerMovement(void) { alpha += game2->time.dt / 2000.0f; } void resetRecognizer(void) { alpha = 0; } gltron-0.70/src/video/screenshot.c0000644000076400001440000001002407674616532012661 #include "video/video.h" #include "filesystem/path.h" #include "Nebu_filesystem.h" #include #include #include #ifndef PATH_MAX #define PATH_MAX 255 #endif #define SCREENSHOT_PREFIX "gltron" #define SCREENSHOT_PNG_BITDEPTH 8 #define SCREENSHOT_BYTES_PER_PIXEL 3 typedef struct { int width; int height; unsigned char *pixmap; } screenshot_info_t; static FILE *fp; static void user_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { fwrite(data, length, 1, fp); } static void user_flush_data(png_structp png_ptr) { fflush(fp); } static int writePixmapToPng(screenshot_info_t *screenshot, char *fname) { png_structp png_ptr; png_infop info_ptr; png_byte **row_ptrs; int i; if (!(fp = fopen(fname, "wb"))) { fprintf(stderr, "can't open %s for writing\n", fname); return -1; } if (!(png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL))) { return -1; } if (!(info_ptr = png_create_info_struct(png_ptr))) { png_destroy_write_struct(&png_ptr, (png_infopp)NULL); return -1; } png_set_write_fn(png_ptr, 0, user_write_data, user_flush_data); /* png_init_io(png_ptr, fp); */ png_set_IHDR(png_ptr, info_ptr, screenshot->width, screenshot->height, SCREENSHOT_PNG_BITDEPTH, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_write_info(png_ptr, info_ptr); /* get pointers */ if(!(row_ptrs = (png_byte**) malloc(screenshot->height * sizeof(png_byte*)))) { png_destroy_write_struct(&png_ptr, &info_ptr); return -1; } for(i = 0; i < screenshot->height; i++) { row_ptrs[i] = screenshot->pixmap + (screenshot->height - i - 1) * SCREENSHOT_BYTES_PER_PIXEL * screenshot->width; } png_write_image(png_ptr, row_ptrs); png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); free(row_ptrs); return 0; } /* getNextFilename - find the next free filename in series. */ static char* getNextFilename(const char *suffix, int *start_at) { char *path = NULL; char fname[PATH_MAX]; do { if(path != NULL) free(path); (*start_at)++; sprintf(fname, "%s-%s-%d%s", SCREENSHOT_PREFIX, VERSION, *start_at, suffix); path = getPossiblePath( PATH_SNAPSHOTS, fname ); } while ( fileExists(path)); return path; } static int captureScreenToPixmap(screenshot_info_t *img, Visual *display) { img->width = display->w; img->height = display->h; if (!(img->pixmap = malloc(img->width * img->height * SCREENSHOT_BYTES_PER_PIXEL))) { return -1; } glReadPixels(0, 0, img->width, img->height, GL_RGB, GL_UNSIGNED_BYTE, img->pixmap); return 0; } void doPngScreenShot(Visual *display) { screenshot_info_t screenshot; static int last_png_num; /* store last free file index. */ char *path; path = getNextFilename(".png", &last_png_num); if(path != NULL) { if (captureScreenToPixmap(&screenshot, display) != 0) { fprintf(stderr, "Error capturing screenshot\n"); return; } if (writePixmapToPng(&screenshot, path) != 0) { fprintf(stderr, "Error writing screenshot %s\n", path); } else { fprintf(stderr, "Screenshot written to %s\n", path); } free(screenshot.pixmap); free(path); } } void doBmpScreenShot(Visual *display) { screenshot_info_t screenshot; static int last_bmp_num; /* store last free file index. */ char *path; path = getNextFilename(".bmp", &last_bmp_num); if(path != NULL) { if (captureScreenToPixmap(&screenshot, display) != 0) { fprintf(stderr, "Error capturing screenshot\n"); return; } if (SystemWriteBMP(path, screenshot.width, screenshot.height, screenshot.pixmap) != 0) { fprintf(stderr, "Error writing screenshot %s\n", path); } else { fprintf(stderr, "Screenshot written to %s\n", path); } free(screenshot.pixmap); free(path); } } gltron-0.70/src/video/skybox.c0000644000076400001440000000367507704041046012023 #include "video/video.h" void enableSkyboxTexture(void) { glEnable(GL_TEXTURE_2D); } void disableSkyboxTexture(void) { glDisable(GL_TEXTURE_2D); } static void bindSkyboxTexture(int index) { glBindTexture(GL_TEXTURE_2D, gScreen->textures[ TEX_SKYBOX + index ]); } void drawSkybox(int grid_size) { /* matrices are: projection: perspective projection modelview: identity */ /* these are the values for y == up, x == front */ /* float sides[6][4][3] = { { { 1, -1, -1 }, { 1, -1, 1 }, { 1, 1, 1 }, { 1, 1, -1 } }, // front { { 1, 1, -1 }, { 1, 1, 1 }, { -1, 1, 1 }, { -1, 1, -1 } }, // top { { -1, -1, -1 }, { 1, -1, -1 }, { 1, 1, -1 }, { -1, 1, -1 } }, // left { { 1, -1, 1 }, { -1, -1, 1 }, { -1, 1, 1 }, { 1, 1, 1 } }, // right { { -1, -1, -1 }, { 1, -1, -1 }, { 1, -1, 1 }, { -1, -1, 1 } }, // bottom { { -1, -1, 1 }, { -1, -1, -1 }, { -1, 1, -1 }, { -1, 1, a1 } } // back }; */ /* these values are for z == up, x == front */ float sides[6][4][3] = { { { 1, 1, -1 }, { 1, -1, -1 }, { 1, -1, 1 }, { 1, 1, 1 } }, /* front */ { { 1, 1, 1 }, { -1, 1, 1 }, { -1, -1, 1 }, { 1, -1, 1 } }, /* top */ { { -1, 1, -1 }, { 1, 1, -1 }, { 1, 1, 1 }, { -1, 1, 1 } }, /* left */ { { 1, -1, -1 }, { -1, -1, -1 }, { -1, -1, 1 }, { 1, -1, 1 } }, /* right */ { { -1, 1, -1 }, { -1, -1, -1 }, { 1, -1, -1 }, { 1, 1, -1 } }, /* bottom */ { { -1, -1, -1 }, { -1, 1, -1 }, { -1, 1, 1 }, { -1, -1, 1 } } /* back */ }; float uv[4][2] = { { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 } }; int i, j; float d = grid_size * 3; glEnable(GL_TEXTURE_2D); glDepthMask(GL_FALSE); glColor3f(1.0, 1.0, 1.0); for(i = 0; i < 6; i++) { bindSkyboxTexture(i); glBegin(GL_QUADS); for(j = 0; j < 4; j++) { glTexCoord2fv( uv[j] ); glVertex3f( sides[i][j][0] * d, sides[i][j][1] * d, sides[i][j][2] * d ); } glEnd(); } glDisable(GL_TEXTURE_2D); glDepthMask(GL_TRUE); } gltron-0.70/src/video/texture.c0000644000076400001440000000423207714423117012176 #include "video/video.h" void initTexture(Visual *d) { GLint min_filter; char texname[120]; int i, j; switch(getSettingi("mipmap_filter")) { case NEAREST: min_filter = GL_NEAREST; break; case LINEAR: min_filter = GL_LINEAR; break; case MIPMAP: min_filter = GL_LINEAR_MIPMAP_NEAREST; break; case TRILINEAR: min_filter = GL_LINEAR_MIPMAP_LINEAR; break; default: min_filter = GL_LINEAR_MIPMAP_LINEAR; } printf("using min_filter: %d (setting: %d)\n", min_filter, getSettingi("mipmap_filter")); checkGLError("texture.c initTexture - start"); /* todo: move that somewhere else */ glGenTextures(game_textures, d->textures); checkGLError("texture.c initTexture - creating textures"); for(i = 0; i < n_textures; i++) { for( j = 0; j < textures[i].count; j++) { glBindTexture(GL_TEXTURE_2D, d->textures[ textures[i].id + j ]); /* todo: snprintf would be safer, but win32 doesn't have it */ if(textures[i].count == 1) { sprintf(texname, "%s%s", textures[i].name, TEX_SUFFIX); } else { sprintf(texname, "%s%d%s", textures[i].name, j, TEX_SUFFIX); } loadTexture(texname, textures[i].type); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, textures[i].wrap_s); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, textures[i].wrap_t); if(getSettingi("softwareRendering")) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } else { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); #ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE #endif #if 0 if(renderer.ext_filter_anisotropic) { /* fprintf(stderr, "enabling anisotropic filtering\n"); */ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, textures[i].anisotropy); } #endif } checkGLError("texture.c initTextures"); } } } void deleteTextures(Visual *d) { glDeleteTextures(game_textures, d->textures); checkGLError("texture.c deleted textures"); } gltron-0.70/src/video/trail.c0000644000076400001440000001271007764076763011631 #include "video/video.h" #include "game/game.h" #define TEX_SPLIT (1.0 - BOW_DIST2) / (1 - BOW_DIST1) #undef TEX_SPLIT static float normal1[] = { 1.0, 0.0, 0.0 }; static float normal2[] = { 0.0, 1.0, 0.0 }; /* getDists returns the minimum distance from (the wall) *line to the specified (eye) point the z component is ignored */ float getDist(segment2 *s, float* eye) { float n[2]; float tmp[2]; n[0] = s->vStart.v[0] + s->vDirection.v[1]; n[1] = s->vStart.v[1] - s->vDirection.v[0]; tmp[0] = eye[0] - s->vStart.v[0]; tmp[1] = eye[1] - s->vStart.v[1]; if(n[0] == n[1] == 0) return length(tmp); return abs(scalarprod2(n, tmp) / length(n)); } /* getSegmentEnd[XY]() returns the end point of the last trail segment line (before the lightcycles bow starts) */ float dists[] = { BOW_DIST2, BOW_DIST3, BOW_DIST1, 0 }; float getSegmentEndX(Data *data, int dist) { float tlength, blength; segment2 *s = data->trails + data->trailOffset; if(dirsX[data->dir] == 0) return s->vStart.v[0] + s->vDirection.v[0]; tlength = segment2_Length(s); blength = (tlength < 2 * BOW_LENGTH) ? tlength / 2 : BOW_LENGTH; return s->vStart.v[0] + s->vDirection.v[0] - dists[dist] * blength * dirsX[ data->dir ]; } float getSegmentEndY(Data *data, int dist) { float tlength, blength; segment2 *s = data->trails + data->trailOffset; if(dirsY[data->dir] == 0) return s->vStart.v[1] + s->vDirection.v[1]; tlength = segment2_Length(s); blength = (tlength < 2 * BOW_LENGTH) ? tlength / 2 : BOW_LENGTH; return s->vStart.v[1] + s->vDirection.v[1] - dists[dist] * blength * dirsY[ data->dir ]; } /* getSegmentEndUV() calculates the texture coordinates for the last segment */ float getSegmentEndUV(segment2 *s, Data *data) { float tlength, blength; tlength = segment2_Length(s); blength = (tlength < 2 * BOW_LENGTH) ? tlength / 2 : BOW_LENGTH; return (tlength - 2 * blength) / DECAL_WIDTH; } /* getSegmentUV gets UV coordinates for an ordinary segment */ float getSegmentUV(segment2 *s) { return segment2_Length(s) / DECAL_WIDTH; } /* drawTrailLines() draws a white line on top of each trail segment the alpha value is reduced with increasing distance to the player */ void drawTrailLines(Player *p, PlayerVisual *pV) { segment2 *s; float height; float *normal; float dist; float alpha; Data *data; Camera *cam; float trail_top[] = { 1.0, 1.0, 1.0, 1.0 }; data = p->data; cam = p->camera; height = data->trail_height; if(height <= 0) return; /* glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); */ if (gSettingsCache.antialias_lines) { glEnable(GL_LINE_SMOOTH); /* enable line antialiasing */ } glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_LIGHTING); glBegin(GL_LINES); s = data->trails; while(s != data->trails + data->trailOffset) { /* the current line is not drawn */ /* compute distance from line to eye point */ dist = getDist(s, cam->cam); alpha = (game2->rules.grid_size - dist / 2) / game2->rules.grid_size; // trail_top[3] = alpha; glColor4fv(trail_top); if(s->vDirection.v[1] == 0) normal = normal1; else normal = normal2; glNormal3fv(normal); glVertex3f(s->vStart.v[0], s->vStart.v[1], height); glVertex3f(s->vStart.v[0] + s->vDirection.v[0], s->vStart.v[1] + s->vDirection.v[1], height); s++; polycount++; } glEnd(); /* compute distance from line to eye point */ dist = getDist(s, cam->cam); alpha = (game2->rules.grid_size - dist / 2) / game2->rules.grid_size; // trail_top[3] = alpha; glColor4fv(trail_top); glBegin(GL_LINES); glVertex3f(s->vStart.v[0], s->vStart.v[1], height); glVertex3f( getSegmentEndX(data, 0), getSegmentEndY(data, 0), height ); glEnd(); /* glEnable(GL_LIGHTING); */ glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); /* disable line antialiasing */ /* glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); */ } /* drawTrailShadow() draws a alpha-blended shadow on the floor for each trail segment. The light source source is (in homogenous coordinates) at (-1,-1,1,0) (I hope that's correct) */ void drawTrailShadow(Player* p, PlayerVisual *pV) { /* states */ if(gSettingsCache.use_stencil) { glEnable(GL_STENCIL_TEST); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); glStencilFunc(GL_GREATER, 1, 1); glEnable(GL_BLEND); glColor4fv(shadow_color); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } else { glColor3f(0, 0, 0); glDisable(GL_BLEND); } /* transformation */ glPushMatrix(); glMultMatrixf(shadow_matrix); /* geometry */ { int vOffset = 0; int iOffset = 0; TrailMesh mesh; mesh.pVertices = (vec3*) malloc(1000 * sizeof(vec3)); mesh.pNormals = (vec3*) malloc(1000 * sizeof(vec3)); mesh.pColors = (unsigned char*) malloc(1000 * 4 * sizeof(float)); mesh.pTexCoords = (vec2*) malloc(1000 * sizeof(vec2)); mesh.pIndices = (unsigned short*) malloc(1000 * 2); mesh.iUsed = 0; trailGeometry(p, pV, &mesh, &vOffset, &iOffset); bowGeometry(p, pV, &mesh, &vOffset, &iOffset); trailStatesShadowed(); trailRender(&mesh); // no states restore, because we're drawing shadowed geometry free(mesh.pVertices); free(mesh.pNormals); free(mesh.pColors); free(mesh.pTexCoords); free(mesh.pIndices); } /* restore */ if(gSettingsCache.use_stencil) glDisable(GL_STENCIL_TEST); glDisable(GL_BLEND); glPopMatrix(); } gltron-0.70/src/video/trail_geometry.c0000644000076400001440000001467607764076763013561 #include "video/trail_geometry.h" #include enum { COLOR_TRAIL, COLOR_BRIGHT, COLOR_CYCLE }; int cmpdir(segment2 *line1, segment2 *line2); void float2ubyte(unsigned char* pubColor, float *pfColor) { pubColor[0] = (unsigned char)(pfColor[0] * 255.0f); pubColor[1] = (unsigned char)(pfColor[1] * 255.0f); pubColor[2] = (unsigned char)(pfColor[2] * 255.0f); pubColor[3] = (unsigned char)(pfColor[3] * 255.0f); } void storeColor(TrailMesh *pMesh, int offset, PlayerVisual *pV, int type) { float color[] = { 0, 0, 0, 1 }; float white[] = { 1, 1, 1, 1 }; switch(type) { case COLOR_TRAIL: if(gSettingsCache.alpha_trails) memcpy(color, pV->pColorAlpha, 4 * sizeof(float)); else memcpy(color, pV->pColorAlpha, 3 * sizeof(float)); break; case COLOR_BRIGHT: memcpy(color, white, 3 * sizeof(float)); break; case COLOR_CYCLE: memcpy(color, pV->pColorDiffuse, 3 * sizeof(float)); break; } float2ubyte(pMesh->pColors + 4 * offset, color); float2ubyte(pMesh->pColors + 4 * (offset + 1), color); } void storeVertex(TrailMesh *pMesh, int offset, segment2 *s, float t, /* 0: start, 1: end */ float fFloor, float fTop, float fSegLength, float fTotalLength) { vec3 *pVertices = pMesh->pVertices + offset; vec3 *pNormals = pMesh->pNormals + offset; vec2 *pTexCoords = pMesh->pTexCoords + offset; vec3 v; vec2 uv; float fUStart; vec3 pvNormals[] = { { { 1, 0, 0 } }, { { -1, 0, 0 } }, { { 0, 1, 0 } }, { { 0, -1, 0 } } }; int iNormal; if(s->vDirection.v[0] == 0) // iNormal = (line->sx <= line->ex) ? 0 : 1; iNormal = 0; else // iNormal = (line->sy <= line->sy) ? 2 : 3; iNormal = 2; fUStart = (fTotalLength / DECAL_WIDTH) - floorf(fTotalLength / DECAL_WIDTH); v.v[0] = s->vStart.v[0] + t * s->vDirection.v[0]; v.v[1] = s->vStart.v[1] + t * s->vDirection.v[1]; v.v[2] = fFloor; uv.v[0] = fUStart + t * fSegLength / DECAL_WIDTH; uv.v[1] = 0; vec3Copy(pVertices, &v); vec3Copy(pNormals, pvNormals + iNormal); vec2Copy(pTexCoords, &uv); v.v[2] = fTop; uv.v[1] = 1; vec3Copy(pVertices + 1, &v); vec3Copy(pNormals + 1, pvNormals + iNormal); vec2Copy(pTexCoords + 1, &uv); } void storeIndices(TrailMesh *pMesh, int indexOffset, int vertexOffset) { unsigned short ppBase[2][6] = { { 0, 2, 1, 2, 3, 1 }, { 0, 1, 2, 1, 3, 2 } }; int i; int winding; if(pMesh->pVertices[vertexOffset].v[0] == pMesh->pVertices[vertexOffset + 2].v[0]) winding = (pMesh->pVertices[vertexOffset].v[1] <= pMesh->pVertices[vertexOffset + 2].v[1]) ? 0 : 1; else winding = (pMesh->pVertices[vertexOffset].v[0] < pMesh->pVertices[vertexOffset + 2].v[0]) ? 1 : 0; for(i = 0; i < 6; i++) { pMesh->pIndices[i + indexOffset] = ppBase[winding][i] + vertexOffset; } } int cmpdir(segment2 *s1, segment2 *s2) { if((s1->vDirection.v[0] == 0 && s2->vDirection.v[0] == 0) || (s1->vDirection.v[1] == 0 && s2->vDirection.v[1] == 0)) return 0; return 1; } void trailGeometry(Player *pPlayer, PlayerVisual* pV, TrailMesh *pMesh, int *pvOffset, int *piOffset) { Data *pData = pPlayer->data; int curVertex = *pvOffset, curIndex = *piOffset; int i; float fTotalLength = 0; float fSegLength; for(i = 0; i < pData->trailOffset; i++) { fSegLength = segment2_Length(pData->trails + i); if(i == 0 || cmpdir(pData->trails + i - 1, pData->trails + i)) { storeVertex(pMesh, curVertex, pData->trails + i, 0, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_TRAIL); curVertex += 2; } storeVertex(pMesh, curVertex, pData->trails + i, 1, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_TRAIL); curVertex += 2; storeIndices(pMesh, curIndex, curVertex - 4); curIndex += 6; fTotalLength += fSegLength; } { segment2 s; vec2Copy(&s.vStart, & pData->trails[pData->trailOffset].vStart); s.vDirection.v[0] = getSegmentEndX( pData, 1 ) - s.vStart.v[0]; s.vDirection.v[1] = getSegmentEndY( pData, 1 ) - s.vStart.v[1]; fSegLength = segment2_Length(&s); storeVertex(pMesh, curVertex, &s, 0, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_TRAIL); curVertex += 2; storeVertex(pMesh, curVertex, &s, 1, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_TRAIL); curVertex += 2; storeIndices(pMesh, curIndex, curVertex - 4); curIndex += 6; fTotalLength += fSegLength; vec2Add(&s.vStart, &s.vStart, &s.vDirection); s.vDirection.v[0] = getSegmentEndX( pData, 0 ) - s.vStart.v[0]; s.vDirection.v[1] = getSegmentEndY( pData, 0 ) - s.vStart.v[1]; fSegLength = segment2_Length(&s); storeVertex(pMesh, curVertex, &s, 0, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_TRAIL); curVertex += 2; storeVertex(pMesh, curVertex, &s, 1, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_BRIGHT); curVertex += 2; storeIndices(pMesh, curIndex, curVertex - 4); curIndex += 6; } pMesh->iUsed += curIndex - *piOffset; *piOffset = curIndex; *pvOffset = curVertex; } void bowGeometry(Player *pPlayer, PlayerVisual *pV, TrailMesh *pMesh, int *pvOffset, int *piOffset) { Data *pData = pPlayer->data; segment2 s; int bdist = PLAYER_IS_ACTIVE(pPlayer) ? 2 : 3; int i; int vOffset = *pvOffset; int iOffset = *piOffset; s.vStart.v[0] = getSegmentEndX( pData, 0 ); s.vStart.v[1] = getSegmentEndY( pData, 0 ); s.vDirection.v[0] = getSegmentEndX( pData, bdist ) - s.vStart.v[0]; s.vDirection.v[1] = getSegmentEndY( pData, bdist ) - s.vStart.v[1]; for(i = 0; i < 10; i++) { float t = i * 1.0f / 10; float fTop = sqrtf(1 - t*t); float fFloor = (t < 0.6f) ? 0 : 0.5f * (t - 0.6f); if(fTop < 0.3f) fTop = 0.3f; storeVertex(pMesh, vOffset, &s, t, fFloor * pPlayer->data->trail_height, fTop * pPlayer->data->trail_height, DECAL_WIDTH, 0); storeColor(pMesh, vOffset, pV, COLOR_BRIGHT); vOffset += 2; if(i) { storeIndices(pMesh, iOffset, vOffset - 4); iOffset += 6; } } storeVertex(pMesh, vOffset, &s, 1, 0.2f * pData->trail_height, 0.3f * pData->trail_height, DECAL_WIDTH, 0); storeColor(pMesh, vOffset, pV, COLOR_CYCLE); vOffset += 2; storeIndices(pMesh, iOffset, vOffset - 4); pMesh->iUsed += iOffset - *piOffset; *piOffset = iOffset; *pvOffset = vOffset; } gltron-0.70/src/video/trail_render.c0000644000076400001440000000401407764076763013166 #include "video/trail_geometry.h" void trailStatesNormal(Player *pPlayer, int texture) { glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_COLOR_ARRAY); // glEnable(GL_CULL_FACE); glDisable(GL_CULL_FACE); glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); // glDisable(GL_TEXTURE_2D); // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // glDisable(GL_LIGHTING); glBindTexture(GL_TEXTURE_2D, texture); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); { float black[] = { 0, 0, 0, 1 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, black); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); } if(gSettingsCache.alpha_trails) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } } void trailStatesShadowed(void) { glEnableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_COLOR_ARRAY); // glEnable(GL_CULL_FACE); glDisable(GL_CULL_FACE); glDisable(GL_TEXTURE_2D); // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glDisable(GL_LIGHTING); } void trailStatesRestore(void) { glDisable(GL_COLOR_MATERIAL); glCullFace(GL_BACK); glDisable(GL_CULL_FACE); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); glEnable(GL_LIGHTING); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } void trailRender(TrailMesh *pMesh) { if(pMesh->iUsed == 0) return; glVertexPointer(3, GL_FLOAT, 0, pMesh->pVertices); glNormalPointer(GL_FLOAT, 0, pMesh->pNormals); glTexCoordPointer(2, GL_FLOAT, 0, pMesh->pTexCoords); glColorPointer(4, GL_UNSIGNED_BYTE, 0, pMesh->pColors); checkGLError("texcoord pointer"); glDrawElements(GL_TRIANGLES, pMesh->iUsed, GL_UNSIGNED_SHORT, pMesh->pIndices); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_COLOR_ARRAY); checkGLError("trail"); } gltron-0.70/src/video/video.c0000644000076400001440000001512207766301735011614 #include "video/video.h" #include "game/game.h" #include "filesystem/path.h" #include "Nebu_video.h" #include "Nebu_input.h" #include "Nebu_scripting.h" void displayGame(void) { drawGame(); SystemSwapBuffers(); } int initWindow(void) { int win_id; int flags; unsigned char fullscreen = 0; /* char buf[20]; */ SystemInitWindow(0, 0, getSettingi("width"), getSettingi("height")); if(getSettingi("windowMode") == 0) { fullscreen = SYSTEM_FULLSCREEN; } flags = SYSTEM_RGBA | SYSTEM_DOUBLE | SYSTEM_DEPTH; if(getSettingi("bitdepth_32")) flags |= SYSTEM_32_BIT; if(getSettingi("use_stencil")) flags |= SYSTEM_STENCIL; SystemInitDisplayMode(flags, fullscreen); win_id = SystemCreateWindow("gltron"); if (win_id < 0) { if( getSettingi("use_stencil") ) { flags &= ~SYSTEM_STENCIL; SystemInitDisplayMode(flags, fullscreen); win_id = SystemCreateWindow("gltron"); if(win_id >= 0) { setSettingi("use_stencil", 0); goto SKIP; } } printf("[fatal] could not create window...exiting\n"); exit(1); /* OK: critical, no visual */ } SKIP: if(getSettingi("windowMode") == 0 || getSettingi("mouse_warp") == 1) { SystemGrabInput(); } else { SystemUngrabInput(); } return win_id; } void reshape(int x, int y) { if(x < getSettingi("height") || x < getSettingi("width")) initGameScreen(); if(x > getSettingi("width") ) gScreen->vp_x = (x - getSettingi("width")) / 2; if(y > getSettingi("height") ) gScreen->vp_y = (y - getSettingi("height")) / 2; changeDisplay(-1); } void shutdownDisplay(Visual *d) { deleteTextures(d); deleteFonts(); SystemDestroyWindow(d->win_id); // printf("[video] window destroyed\n"); } void setupDisplay(Visual *d) { // fprintf(stderr, "[video] trying to create window\n"); d->win_id = initWindow(); // fprintf(stderr, "[video] window created\n"); // initRenderer(); // printRendererInfo(); // printf("win_id is %d\n", d->win_id); // fprintf(stderr, "[status] loading art\n"); loadArt(); SystemReshapeFunc(reshape); } static void loadModels(void) { char *path; int i; /* load recognizer model */ path = getPath(PATH_DATA, "recognizer.obj"); if(path != NULL) { recognizer = readMeshFromFile(path, TRI_MESH); /* old code did normalize & invert normals & rescale to size = 60 */ } else { fprintf(stderr, "fatal: could not load %s - exiting...\n", path); exit(1); /* OK: critical, installation corrupt */ } free(path); /* load recognizer quad model (for recognizer outlines) */ path = getPath(PATH_DATA, "recognizer_quad.obj"); if(path != NULL) { recognizer_quad = readMeshFromFile(path, QUAD_MESH); /* old code did normalize & invert normals & rescale to size = 60 */ } else { fprintf(stderr, "fatal: could not load %s - exiting...\n", path); exit(1); /* OK: critical, installation corrupt */ } free(path); /* load lightcycle models */ for(i = 0; i < LC_LOD; i++) { path = getPath(PATH_DATA, lc_lod_names[i]); if(path != NULL) { lightcycle[i] = readMeshFromFile(path, TRI_MESH); } else { fprintf(stderr, "fatal: could not load model %s - exiting...\n", lc_lod_names[i]); exit(1); /* OK: critical, installation corrupt */ } } free(path); } void initVideoData(void) { gScreen = (Visual*) malloc(sizeof(Visual)); gViewportType = getSettingi("display_type"); { Visual *d = gScreen; d->w = getSettingi("width"); d->h = getSettingi("height"); d->vp_x = 0; d->vp_y = 0; d->vp_w = d->w; d->vp_h = d->h; d->onScreen = -1; d->textures = (unsigned int*) malloc(game_textures * sizeof(unsigned int)); } gPlayerVisuals = (PlayerVisual*) malloc(MAX_PLAYERS * sizeof(PlayerVisual)); loadModels(); changeDisplay(-1); } void initGameScreen(void) { Visual *d; d = gScreen; d->w = getSettingi("width"); d->h = getSettingi("height"); d->vp_x = 0; d->vp_y = 0; d->vp_w = d->w; d->vp_h = d->h; } void resetVideoData(void) { /* for each player */ int i; for(i = 0; i < game->players; i++) { PlayerVisual *pV = gPlayerVisuals + i; { char name[32]; sprintf(name, "model_diffuse_%d", i); scripting_GetGlobal(name, NULL); scripting_GetFloatArrayResult(pV->pColorDiffuse, 4); sprintf(name, "model_specular_%d", i); scripting_GetGlobal(name, NULL); scripting_GetFloatArrayResult(pV->pColorSpecular, 4); sprintf(name, "trail_diffuse_%d", i); scripting_GetGlobal(name, NULL); scripting_GetFloatArrayResult(pV->pColorAlpha, 4); } if(game->player[i].ai->active != AI_NONE) { pV->impact_radius = 0.0; pV->exp_radius = 0; } else { pV->exp_radius = EXP_RADIUS_MAX; } } } void initDisplay(Visual *d, int type, int p, int onScreen) { int field; field = gScreen->vp_w / 32; d->h = gScreen->h; d->w = gScreen->w; d->vp_x = gScreen->vp_x + vp_x[type][p] * field; d->vp_y = gScreen->vp_y + vp_y[type][p] * field; d->vp_w = vp_w[type][p] * field; d->vp_h = vp_h[type][p] * field; d->onScreen = onScreen; } static void defaultViewportPositions(void) { viewport_content[0] = 0; viewport_content[1] = 1; viewport_content[2] = 2; viewport_content[3] = 3; } /* autoConfigureDisplay - configure viewports so every human player has one */ static void autoConfigureDisplay(void) { int n_humans = 0; int i; int vp; defaultViewportPositions(); /* loop thru players and find the humans */ for (i=0; i < game->players; i++) { if (game->player[i].ai->active == AI_HUMAN) { viewport_content[n_humans] = i; n_humans++; } } switch(n_humans) { case 0 : /* Not sure what the default should be for a game without human players. For now just show a single viewport. */ /* fall thru */ case 1 : vp = VP_SINGLE; break; case 2 : vp = VP_SPLIT; break; default : defaultViewportPositions(); vp = VP_FOURWAY; } updateDisplay(vp); } void changeDisplay(int view) { /* passing -1 to changeDisplay tells it to use the view from settings */ if (view == -1) { view = getSettingi("display_type"); } if (view == 3) { autoConfigureDisplay(); } else { defaultViewportPositions(); updateDisplay(view); } // displayMessage(TO_STDOUT, "set display to %d", view); setSettingi("display_type", view); } void updateDisplay(int vpType) { int i; gViewportType = vpType; for (i = 0; i < game->players; i++) { gPlayerVisuals[i].display.onScreen = 0; } for (i = 0; i < vp_max[vpType]; i++) { initDisplay(& gPlayerVisuals[ viewport_content[i] ].display, vpType, i, 1); } } void Video_Idle(void) { } gltron-0.70/src/video/visuals_2d.c0000644000076400001440000001050207735617172012557 #include "video/video.h" #include "game/game.h" /* draw a 2d map */ void draw2D( Visual *d ) { float width, height; float border_left, border_bottom; int i; float aspect = (float)d->vp_w / (float)d->vp_h; if(d->vp_w / game2->grid.width < d->vp_h / game2->grid.height) { // black borders top/bottom width = game2->grid.width + 1.0f; height = width / aspect; border_bottom = (height - game2->grid.height) / 2; border_left = 0; } else { // black borders left/right height = game2->grid.height + 1.0f; width = height * aspect; border_left = (width - game2->grid.width) / 2; border_bottom = 0; } /* { static int foo = 0; if(!foo) printf("w,h: (%f,%f), border l/b: (%f,%f)\n", width, height, border_left, border_bottom); foo = 1; } */ glViewport(d->vp_x, d->vp_y, d->vp_w, d->vp_h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, width, 0, height, 0, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(border_left, border_bottom, 0); { float w = game2->grid.width; float h = game2->grid.height; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBegin(GL_QUADS); glColor4f(0.7f, 0.7f, 0.7f, 0.3f); glVertex2f(0, 0); glVertex2f(w, 0); glVertex2f(w, h); glVertex2f(0, h); glEnd(); } glDisable(GL_LIGHTING); // glDisable(GL_BLEND); glEnable(GL_BLEND); { float w = game2->grid.width; float h = game2->grid.height; glColor3f(1, 1, 1); glBegin(GL_LINE_LOOP); glVertex3f( 0, 0, 0 ); glVertex3f( w, 0, 0 ); glVertex3f( w, h, 0 ); glVertex3f( 0, h, 0 ); glEnd(); } for(i = 0; i < game->players; i++) { Player *p = &game->player[i]; PlayerVisual *pV = gPlayerVisuals + i; segment2* trail; float x, y; getPositionFromData(&x, &y, p->data); // fixme: check if trails vanish if (p->data->trail_height <= 0) { continue; } if (p->data->trail_height < TRAIL_HEIGHT) { /* if player crashed but the trail hasn't disappeared yet, fade the trail on the 2d map as it disappears. */ glBlendFunc(GL_SRC_ALPHA, GL_ONE); glColor4f(pV->pColorAlpha[0], pV->pColorAlpha[1], pV->pColorAlpha[2], p->data->trail_height / TRAIL_HEIGHT); } else { glBlendFunc(GL_ONE, GL_ONE); glColor3fv(pV->pColorAlpha); } glPointSize(2); glBegin(GL_POINTS); glVertex2f( x, y ); glEnd(); glBegin(GL_LINES); for(trail = p->data->trails; trail != p->data->trails + p->data->trailOffset; trail++) { glVertex2f(trail->vStart.v[0], trail->vStart.v[1] ); glVertex2f(trail->vStart.v[0] + trail->vDirection.v[0], trail->vStart.v[1] + trail->vDirection.v[1] ); } if(trail != p->data->trails) { trail--; glVertex2f(trail->vStart.v[0] + trail->vDirection.v[0], trail->vStart.v[1] + trail->vDirection.v[1] ); glVertex2f( floorf(x), floorf(y)); } else { glVertex2f(trail->vStart.v[0], trail->vStart.v[1] ); glVertex2f( floorf(x), floorf(y)); } #if 0 // draw AI debug lines glColor3f(1,1,1); glVertex2f(p->ai->front.vStart.v[0], p->ai->front.vStart.v[1]); glVertex2f(p->ai->front.vStart.v[0] + p->ai->front.vDirection.v[0], p->ai->front.vStart.v[1] + p->ai->front.vDirection.v[1]); glColor3f(0,1,0); glVertex2f(p->ai->left.vStart.v[0], p->ai->left.vStart.v[1]); glVertex2f(p->ai->left.vStart.v[0] + p->ai->left.vDirection.v[0], p->ai->left.vStart.v[1] + p->ai->left.vDirection.v[1]); glColor3f(0,0,1); glVertex2f(p->ai->right.vStart.v[0], p->ai->right.vStart.v[1]); glVertex2f(p->ai->right.vStart.v[0] + p->ai->right.vDirection.v[0], p->ai->right.vStart.v[1] + p->ai->right.vDirection.v[1]); glColor3f(0,1,1); glVertex2f(p->ai->backleft.vStart.v[0], p->ai->backleft.vStart.v[1]); glVertex2f(p->ai->backleft.vStart.v[0] + p->ai->backleft.vDirection.v[0], p->ai->backleft.vStart.v[1] + p->ai->backleft.vDirection.v[1]); #endif glEnd(); } glDisable(GL_BLEND); } gltron-0.70/src/input/0000777000076400001440000000000007767023547010461 5gltron-0.70/src/input/Makefile.am0000644000076400001440000000025007674616532012425 noinst_LIBRARIES=libinput.a libinput_a_SOURCES = \ input.c AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include gltron-0.70/src/input/Makefile.in0000644000076400001440000001731007767023250012433 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libinput.a libinput_a_SOURCES = \ input.c AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include subdir = src/input mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libinput_a_AR = $(AR) cru libinput_a_LIBADD = am_libinput_a_OBJECTS = input.$(OBJEXT) libinput_a_OBJECTS = $(am_libinput_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/input.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(libinput_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libinput_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/input/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libinput.a: $(libinput_a_OBJECTS) $(libinput_a_DEPENDENCIES) -rm -f libinput.a $(libinput_a_AR) libinput.a $(libinput_a_OBJECTS) $(libinput_a_LIBADD) $(RANLIB) libinput.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/input.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/input/input.c0000644000076400001440000001372307764076763011713 #include "video/video.h" #include "game/game.h" #include "Nebu_input.h" #include "Nebu_scripting.h" /* I hear people are reading this file because they couldn't find the manual! Go to http://www.gltron.org/ */ int reserved_keys[] = { 'q', 27, ' ', SYSTEM_KEY_F1, SYSTEM_KEY_F2, SYSTEM_KEY_F3, SYSTEM_KEY_F4, SYSTEM_KEY_F5, SYSTEM_KEY_F10, SYSTEM_KEY_F11, SYSTEM_KEY_F12, SYSTEM_KEY_UP, SYSTEM_KEY_DOWN }; void keyGame(int state, int k, int x, int y) { int i; if(state == SYSTEM_KEYSTATE_DOWN) { switch (k) { /* case 'q': SystemExit(); return; */ case 27: SystemExitLoop(RETURN_GAME_ESCAPE); return; case ' ': SystemExitLoop(RETURN_GAME_PAUSE); return; case SYSTEM_KEY_F1: changeDisplay(0); return; case SYSTEM_KEY_F2: changeDisplay(1); return; case SYSTEM_KEY_F3: changeDisplay(2); return; case SYSTEM_KEY_F4: changeDisplay(3); return; case SYSTEM_KEY_F5: saveSettings(); return; case SYSTEM_KEY_F10: nextCameraType(); return; case SYSTEM_KEY_F11: doBmpScreenShot(gScreen); return; case SYSTEM_KEY_F12: doPngScreenShot(gScreen); return; case SYSTEM_KEY_UP: consoleScrollBackward(1); return; case SYSTEM_KEY_DOWN: consoleScrollForward(1); return; /* toggle lighting case SYSTEM_KEY_F6: setSettingi("light_cycles", !game->settings->light_cycles); return; */ } } for( i = 0; i < game->players; i++) { if(PLAYER_IS_ACTIVE(&game->player[i]) && !game->player[i].ai->active) { int key; if(state == SYSTEM_KEYSTATE_DOWN) { scripting_RunFormat("return settings.keys[%d].left", i + 1); scripting_GetIntegerResult( &key ); if(key == k) { createEvent(i, EVENT_TURN_LEFT); return; } scripting_RunFormat("return settings.keys[%d].right", i + 1); scripting_GetIntegerResult( &key ); if(key == k) { createEvent(i, EVENT_TURN_RIGHT); return; } } // deal with glance keys scripting_RunFormat("return settings.keys[%d].glance_left", i + 1); scripting_GetIntegerResult( &key ); if(key == k) { if(state == SYSTEM_KEYSTATE_DOWN) { printf("glance left down\n"); game->player[i].camera->movement[CAM_PHI_OFFSET] = PI / 2.0f; } else { printf("glance left up\n"); game->player[i].camera->movement[CAM_PHI_OFFSET] = 0; } return; } // deal with glance keys scripting_RunFormat("return settings.keys[%d].glance_right", i + 1); scripting_GetIntegerResult( &key ); if(key == k) { if(state == SYSTEM_KEYSTATE_DOWN) { printf("glance right down\n"); game->player[i].camera->movement[CAM_PHI_OFFSET] = - PI / 2.0f; } else { printf("glance right up\n"); game->player[i].camera->movement[CAM_PHI_OFFSET] = 0; } return; } // boost scripting_RunFormat("return settings.keys[%d].boost", i + 1); scripting_GetIntegerResult( &key ); if(key == k) { if(state == SYSTEM_KEYSTATE_DOWN) { printf("boost down\n"); if(game->player[i].data->booster > getSettingf("booster_min")) game->player[i].data->boost_enabled = 1; } else { printf("boost up\n"); game->player[i].data->boost_enabled = 0; } return; } } } if(state == SYSTEM_KEYSTATE_DOWN) { displayMessage(TO_STDERR, "key '%s' (%d) is not bound", SystemGetKeyName(k), k); } } void parse_args(int argc, const char *argv[]) { int i; while(argc--) { if(argv[argc][0] == '-') { i = 0; while(argv[argc][++i] != 0) { switch(argv[argc][i]) { case 'x': setSettingi("show_crash_texture", 0); break; case 'F': setSettingi("show_fps", 0); break; case 't': setSettingi("show_floor_texture", 0); break; case 'c': setSettingi("show_ai_status", 0); break; case 'g': setSettingi("show_glow", 0); break; case 'w': setSettingi("show_wall", 0); break; case 'C': setSettingi("show_ai_status", 1); break; case 'i': setSettingi("windowMode", 1); break; case 'O': setSettingi("softwareRendering", 1); break; case '1': /* default is 4 */ setSettingi("width", 320); setSettingi("height", 240); break; case '2': setSettingi("width", 512); setSettingi("height", 384); break; case '3': setSettingi("width", 640); setSettingi("height", 480); break; case '4': setSettingi("width", 800); setSettingi("height", 600); break; case '5': setSettingi("width", 1024); setSettingi("height", 768); break; case '6': setSettingi("width", 1280); setSettingi("height", 1024); break; case '7': setSettingi("width", 1600); setSettingi("height", 1200); break; case 's': setSettingi("playMusic", 0); setSettingi("playEffects", 0); break; case 'h': default: printf("Usage: %s [-FftwbghcCsk1234simo]\n\n", argv[0]); printf("Options:\n\n"); printf("-F\tdon't display FPS counter\n"); printf("-t\tdon't display floor texture, use lines instead" "(huge speed gain)\n"); printf("-w\tdon't display walls (speed gain)\n"); printf("-x\tdon't show crash texture (speed gain)\n"); printf("-g\tdon't show glows (small speed gain)\n"); printf("-c\tdon't show ai status\n"); printf("-C\tshow ai status (default: on)\n"); printf("-1\tSet resolution to 320x240\n"); printf("-2\tSet resolution to 512x384\n"); printf("-3\tSet resolution to 640x480\n"); printf("-4\tSet resolution to 800x600 (default)\n"); printf("-5\tSet resolution to 1024x768\n"); printf("-6\tSet resolution to 1280x1024\n"); printf("-7\tSet resolution to 1600x1200\n"); printf("-s\tDon't play sound\n"); /* printf("-v\tStart in demo/screensaver mode\n"); */ printf("-i\tforce startup in a window\n"); printf("-O\tenable software rendering optimization (only if " "you don't have a 3d card!)\n"); printf("-h\tthis help\n"); exit(0); /* OK: end of program */ } } } } } void Input_Idle(void) { SystemSetJoyThreshold( getSettingf("joy_threshold") ); } gltron-0.70/src/game/0000777000076400001440000000000007767023547010233 5gltron-0.70/src/game/Makefile.am0000644000076400001440000000052607753205557012204 noinst_LIBRARIES=libgame.a libgame_a_SOURCES = \ camera.c computer.c computer_utilities.c credits.c \ engine.c event.c game.c globals.c gui.c \ init.c init_sdl.c menu.c pause.c \ timedemo.c switchCallbacks.c scripting_interface.c AM_CFLAGS = \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include \ -I$(top_srcdir)/lua/include gltron-0.70/src/game/Makefile.in0000644000076400001440000002316207767023247012215 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libgame.a libgame_a_SOURCES = \ camera.c computer.c computer_utilities.c credits.c \ engine.c event.c game.c globals.c gui.c \ init.c init_sdl.c menu.c pause.c \ timedemo.c switchCallbacks.c scripting_interface.c AM_CFLAGS = \ -I$(top_srcdir)/nebu/include \ -I$(top_srcdir)/src/include \ -I$(top_srcdir)/lua/include subdir = src/game mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libgame_a_AR = $(AR) cru libgame_a_LIBADD = am_libgame_a_OBJECTS = camera.$(OBJEXT) computer.$(OBJEXT) \ computer_utilities.$(OBJEXT) credits.$(OBJEXT) engine.$(OBJEXT) \ event.$(OBJEXT) game.$(OBJEXT) globals.$(OBJEXT) gui.$(OBJEXT) \ init.$(OBJEXT) init_sdl.$(OBJEXT) menu.$(OBJEXT) \ pause.$(OBJEXT) timedemo.$(OBJEXT) switchCallbacks.$(OBJEXT) \ scripting_interface.$(OBJEXT) libgame_a_OBJECTS = $(am_libgame_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/camera.Po $(DEPDIR)/computer.Po \ @AMDEP_TRUE@ $(DEPDIR)/computer_utilities.Po \ @AMDEP_TRUE@ $(DEPDIR)/credits.Po $(DEPDIR)/engine.Po \ @AMDEP_TRUE@ $(DEPDIR)/event.Po $(DEPDIR)/game.Po \ @AMDEP_TRUE@ $(DEPDIR)/globals.Po $(DEPDIR)/gui.Po \ @AMDEP_TRUE@ $(DEPDIR)/init.Po $(DEPDIR)/init_sdl.Po \ @AMDEP_TRUE@ $(DEPDIR)/menu.Po $(DEPDIR)/pause.Po \ @AMDEP_TRUE@ $(DEPDIR)/scripting_interface.Po \ @AMDEP_TRUE@ $(DEPDIR)/switchCallbacks.Po $(DEPDIR)/timedemo.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(libgame_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libgame_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/game/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libgame.a: $(libgame_a_OBJECTS) $(libgame_a_DEPENDENCIES) -rm -f libgame.a $(libgame_a_AR) libgame.a $(libgame_a_OBJECTS) $(libgame_a_LIBADD) $(RANLIB) libgame.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/camera.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/computer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/computer_utilities.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/credits.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/engine.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/event.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/game.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/globals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/init_sdl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/menu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/pause.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/scripting_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/switchCallbacks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/timedemo.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/src/game/camera.c0000644000076400001440000001735307764076762011560 #include "video/video.h" #include "input/input.h" static void writeCamDefaults(Camera *cam, int type) { cam_defaults[cam->type.type][type] = cam->movement[type]; } #define CLAMP_R_MIN 6 #define CLAMP_R_MAX 45 #define CLAMP_CHI_MIN PI / 8 #define CLAMP_CHI_MAX 3 * PI / 8 static void clampCam(Camera *cam) { if(cam->type.freedom[CAM_FREE_R]) { if(cam->movement[CAM_R] < CLAMP_R_MIN) cam->movement[CAM_R] = CLAMP_R_MIN; if(cam->movement[CAM_R] > CLAMP_R_MAX) cam->movement[CAM_R] = CLAMP_R_MAX; } if(cam->type.freedom[CAM_FREE_CHI]) { if(cam->movement[CAM_CHI] < CLAMP_CHI_MIN) cam->movement[CAM_CHI] = CLAMP_CHI_MIN; if(cam->movement[CAM_CHI] > CLAMP_CHI_MAX) cam->movement[CAM_CHI] = CLAMP_CHI_MAX; } } static void initCircleCamera(Camera *cam) { cam->movement[CAM_R] = cam_defaults[CAM_CIRCLE][CAM_R]; cam->movement[CAM_CHI] = cam_defaults[CAM_CIRCLE][CAM_CHI]; cam->movement[CAM_PHI] = cam_defaults[CAM_CIRCLE][CAM_PHI]; cam->movement[CAM_PHI_OFFSET] = 0; cam->type.interpolated_cam = 0; cam->type.interpolated_target = 0; cam->type.coupled = 0; cam->type.freedom[CAM_FREE_R] = 1; cam->type.freedom[CAM_FREE_PHI] = 0; cam->type.freedom[CAM_FREE_CHI] = 1; } static void initFollowCamera(Camera *cam) { cam->movement[CAM_R] = cam_defaults[CAM_FOLLOW][CAM_R]; cam->movement[CAM_CHI] = cam_defaults[CAM_FOLLOW][CAM_CHI]; cam->movement[CAM_PHI] = cam_defaults[CAM_FOLLOW][CAM_PHI]; cam->movement[CAM_PHI_OFFSET] = 0; cam->type.interpolated_cam = 1; cam->type.interpolated_target = 0; cam->type.coupled = 1; cam->type.freedom[CAM_FREE_R] = 1; cam->type.freedom[CAM_FREE_PHI] = 1; cam->type.freedom[CAM_FREE_CHI] = 1; } static void initCockpitCamera(Camera *cam) { cam->movement[CAM_R] = cam_defaults[CAM_COCKPIT][CAM_R]; cam->movement[CAM_CHI] = cam_defaults[CAM_COCKPIT][CAM_CHI]; cam->movement[CAM_PHI] = PI; // cam_defaults ignored cam->movement[CAM_PHI_OFFSET] = 0; cam->type.interpolated_cam = 0; cam->type.interpolated_target = 1; cam->type.coupled = 1; cam->type.freedom[CAM_FREE_R] = 0; cam->type.freedom[CAM_FREE_PHI] = 1; cam->type.freedom[CAM_FREE_CHI] = 0; } static void initFreeCamera(Camera *cam) { cam->movement[CAM_R] = cam_defaults[CAM_FREE][CAM_R]; cam->movement[CAM_CHI] = cam_defaults[CAM_FREE][CAM_CHI]; cam->movement[CAM_PHI] = cam_defaults[CAM_FREE][CAM_PHI]; cam->movement[CAM_PHI_OFFSET] = 0; cam->type.interpolated_cam = 0; cam->type.interpolated_target = 0; cam->type.coupled = 0; cam->type.freedom[CAM_FREE_R] = 1; cam->type.freedom[CAM_FREE_PHI] = 1; cam->type.freedom[CAM_FREE_CHI] = 1; } void initCamera(Camera *cam, Data *data, int type) { float x,y; getPositionFromData(&x, &y, data); cam->type.type = type; switch(cam->type.type) { case CAM_TYPE_CIRCLING: initCircleCamera(cam); break; case CAM_TYPE_FOLLOW: initFollowCamera(cam); break; case CAM_TYPE_COCKPIT: initCockpitCamera(cam); break; case CAM_TYPE_MOUSE: initFreeCamera(cam); break; } cam->target[0] = x; cam->target[1] = y; cam->target[2] = 0; cam->cam[0] = x + CAM_CIRCLE_DIST; cam->cam[1] = y; cam->cam[2] = CAM_CIRCLE_Z; } /* place user into recognizer */ void observerCamera(PlayerVisual *pV, Player *player) { Camera *cam; vec2 p, v; getRecognizerPositionVelocity(&p, &v); cam = player->camera; cam->cam[0] = p.v[0]; cam->cam[1] = p.v[1]; cam->cam[2] = RECOGNIZER_HEIGHT; cam->target[0] = p.v[0] + v.v[0]; cam->target[1] = p.v[1] + v.v[1]; cam->target[2] = RECOGNIZER_HEIGHT - 2; } void playerCamera(PlayerVisual *pV, Player *p) { float dest[3]; float tdest[3]; float phi, chi, r; float x, y; Camera *cam; Data *data; /* first, process all movement commands */ /* that means, check for mouse input mainly */ /* dt hack: the time since the last frame is not necessarily the game time, since the game maybe hasn't started yet, or was paused */ static int last=0; int dt; if(game2->time.dt == 0) { dt = SystemGetElapsedTime() - last; last = SystemGetElapsedTime(); } else { dt = game2->time.dt; } cam = p->camera; data = p->data; getPositionFromData(&x, &y, data); if(cam->type.freedom[CAM_FREE_R]) { if(gInput.mouse1 == 1) cam->movement[CAM_R] += (cam->movement[CAM_R]-CLAMP_R_MIN+1) * dt / 300.0f; if(gInput.mouse2 == 1) cam->movement[CAM_R] -= (cam->movement[CAM_R]-CLAMP_R_MIN+1) * dt / 300.0f; writeCamDefaults(cam, CAM_R); } if(cam->type.freedom[CAM_FREE_PHI]) { cam->movement[CAM_PHI] += - gInput.mousex * MOUSE_CX; writeCamDefaults(cam, CAM_CHI); } if(cam->type.freedom[CAM_FREE_CHI]) { cam->movement[CAM_CHI] += gInput.mousey * MOUSE_CY; writeCamDefaults(cam, CAM_PHI); } /* done with mouse movement, now clamp the camera to legal values */ clampCam(cam); phi = cam->movement[CAM_PHI] + cam->movement[CAM_PHI_OFFSET]; chi = cam->movement[CAM_CHI]; r = cam->movement[CAM_R]; /* if the cam is coupled to player movement, change the phi accordingly */ if(cam->type.coupled) { int time = game2->time.current - p->data->turn_time; if(time < TURN_LENGTH) { int dir, ldir; dir = p->data->dir; ldir = p->data->last_dir; if(dir == 1 && ldir == 2) dir = 4; if(dir == 2 && ldir == 1) ldir = 4; phi += ((TURN_LENGTH - time) * camAngles[ldir] + time * camAngles[dir]) / TURN_LENGTH; } else phi += camAngles[p->data->dir]; } /* position the camera */ dest[0] = x + r * cosf(phi) * sinf(chi); dest[1] = y + r * sinf(phi) * sinf(chi); dest[2] = r * cosf(chi); /* ok, now let's calculate the new camera destination coordinates */ /* also, perform some camera dependant movement */ switch(cam->type.type) { case CAM_TYPE_CIRCLING: /* Andi-cam */ cam->movement[CAM_PHI] += CAM_SPEED * game2->time.dt; tdest[0] = x; tdest[1] = y; tdest[2] = B_HEIGHT; break; case CAM_TYPE_FOLLOW: /* Mike-cam */ tdest[0] = x; tdest[1] = y; tdest[2] = B_HEIGHT; break; case CAM_TYPE_COCKPIT: /* 1st person */ tdest[0] = x + 4.0f * dirsX[ p->data->dir ] + 2.0f * cosf(phi); tdest[1] = y + 4.0f * dirsY[ p->data->dir ] + 2.0f * sinf(phi); tdest[2] = CAM_COCKPIT_Z; dest[0] = x + 4.0f * dirsX[ p->data->dir ] + 0.1f * cosf(phi); dest[1] = y + 4.0f * dirsY[ p->data->dir ] + 0.1f * sinf(phi); dest[2] = CAM_COCKPIT_Z + 0.1f; break; case CAM_TYPE_MOUSE: /* mouse camera */ tdest[0] = x; tdest[1] = y; tdest[2] = B_HEIGHT; break; } memcpy(cam->cam, dest, sizeof(cam->cam)); memcpy(cam->target, tdest, sizeof(cam->target)); } void doCameraMovement(void) { int i; Player *p; PlayerVisual *pV; for(i = 0; i < game->players; i++) { p = game->player + i; pV = gPlayerVisuals + i; if(p->data->speed == SPEED_GONE) observerCamera(pV, p); else playerCamera(pV, p); } /* mouse events consumed */ gInput.mousex = 0; gInput.mousey = 0; } void nextCameraType(void) { int i; int current_cam_type = getSettingi("camType"); int new_cam_type = (current_cam_type + 1) % CAM_COUNT; setSettingi("camType", new_cam_type); /* update the cached setting */ gSettingsCache.camType = new_cam_type; for (i = 0; i < game->players; i++) { if (game->player[i].ai->active == AI_HUMAN) { initCamera(game->player[i].camera, game->player[i].data, new_cam_type); } } if (getSettingi("debug_output")) { switch (new_cam_type) { case 0 : displayMessage(TO_CONSOLE, "[camera] Circling Camera"); break; case 1 : displayMessage(TO_CONSOLE, "[camera] Behind Camera"); break; case 2 : displayMessage(TO_CONSOLE, "[camera] Cockpit Camera"); break; case 3 : displayMessage(TO_CONSOLE, "[camera] Mouse Camera"); break; } } } gltron-0.70/src/game/computer.c0000644000076400001440000001145707767023523012153 #include "game/game.h" #include "game/ai.h" #include "video/video.h" #define LEFT(x) ((x + 3) % 4) #define RIGHT(x) ((x + 1) % 4) #define OPP_MAX_DIST (0.2f * game2->rules.grid_size) #define SAVE_T_DIFF 0.500f #define SAVE_SPEED_DIFF 1.0f #define HOPELESS_T 0.80f AI_Parameters ai_params = { // minTurnTime, time to pass between turns, in milliseconds { 600, 400, 200, 100 }, // maxSegLength { 0.6f, 0.3f, 0.3f, 0.3f }, // critical { 0.2f, 0.08037f, 0.08037f, 0.08037f }, // spiral, turns until a spiral is detected { 10, 10, 10, 10 }, // rlDelta { 0, 10, 20, 30 } }; // play as if nothing concerned us void doComputerSimple(int player, int target, AI_Distances *distances) { AI *ai; Data *data; Player *me, *him; int level; me = &(game->player[ player ]); him = &(game->player[ target ]); if(me->ai == NULL) { printf("This player has no AI data!\n"); return; } data = me->data; ai = me->ai; level = gSettingsCache.ai_level; // turn off booster data->boost_enabled = 0; /* avoid too short turns */ if(game2->time.current - ai->lasttime < ai_params.minTurnTime[level]) return; // ai_getDistances(player, &front, &left, &right, &backleft); /* first, check if we are in danger, or if we should consider turning once in a while */ if(distances->front > ai_params.critical[level] * game2->rules.grid_size && segment2_Length(data->trails + data->trailOffset) < ai_params.maxSegLength[level] * game2->rules.grid_size) return; // printf("%.2f, %.2f, %.2f\n", distances->front, // distances->left, distances->right); /* decide where to turn */ if(distances->front > distances->right && distances->front > distances->left) { return; /* no way out */ } else if(distances->left > ai_params.rlDelta[level] && abs(distances->right - distances->left) < ai_params.rlDelta[level] && distances->backleft > distances->left && ai->tdiff < ai_params.spiral[level]) { createEvent(player, EVENT_TURN_LEFT); ai->tdiff++; } else if(distances->right > distances->left && ai->tdiff > - ai_params.spiral[level] ) { createEvent(player, EVENT_TURN_RIGHT); ai->tdiff--; // printf("turn right\n"); } else if(distances->right < distances->left && ai->tdiff < ai_params.spiral[level] ) { createEvent(player, EVENT_TURN_LEFT); ai->tdiff++; // printf("turn left\n"); } else { printf("tdiff decision\n"); if(ai->tdiff > 0) { createEvent(player, EVENT_TURN_RIGHT); ai->tdiff--; // printf("turn right\n"); } else { createEvent(player, EVENT_TURN_LEFT); ai->tdiff++; // printf("turn left\n"); } } ai->lasttime = game2->time.current; } // play against the other player, either cut him off, or take evasive action void doComputerActive(int player, int target, AI_Distances *distances) { Data *data = game->player[player].data; AI *ai = game->player[player].ai; AI_Configuration config; if(game2->time.current - ai->lasttime < 200) return; ai_getConfig(player, target, &config); // who's going to reach the intersection point first? // printf("active, location %d (direction: %d)\n", // config.location, data->dir); switch(config.location) { case 0: case 7: case 1: case 6: if(config.t_player < config.t_opponent) { // printf("I'm ahead: %.2f, %.2f\n", config.t_player, config.t_opponent); if(config.t_player - config.t_opponent < SAVE_T_DIFF) data->boost_enabled = 1; if(game->player[player].data->speed - game->player[target].data->speed < SAVE_SPEED_DIFF) data->boost_enabled = 1; // aggressive ai_aggressive(player, target, config.location, distances); } else { // printf("I'm behind: %.2f, %.2f\n", // config.t_player, config.t_opponent); // check speed, adjust or evasive if(config.t_opponent < HOPELESS_T) { // evasive ai_evasive(player, target, config.location, distances); } else if(config.t_opponent - config.t_player < SAVE_T_DIFF) { data->boost_enabled = 1; // aggressive ai_aggressive(player, target, config.location, distances); } else { // evasive ai_evasive(player, target, config.location, distances); } } break; case 2: case 4: case 3: case 5: doComputerSimple(player, target, distances); break; } } void doComputer(int player, int target) { float d; int opponent; AI_Distances distances; ai_getDistances(player, &distances); ai_getClosestOpponent(player, &opponent, &d); if(opponent == -1 || d > OPP_MAX_DIST || distances.front < d || game->player[opponent].ai == NULL || game->player[opponent].ai->active == 1 || gSettingsCache.ai_level == 0 /* dumb setting */) { // only fight humans // printf("inactive, closest opponent: %d, distance %.2f, front %.2f\n", // opponent, d, distances.front); doComputerSimple(player, target, &distances); } else { doComputerActive(player, opponent, &distances); } } gltron-0.70/src/game/computer_utilities.c0000644000076400001440000002073707764076762014261 #include "game/game.h" #include "game/ai.h" #include #include #ifndef FLT_MAX #define FLT_MAX 10000.0f #endif void ai_getClosestOpponent(int player, int* opponent, float *distance) { int i; vec2 v_player; vec2 v_opponent; *opponent = -1; *distance = FLT_MAX; getPositionFromIndex(v_player.v + 0, v_player.v + 1, player); for(i = 0; i < game->players; i++) { if(i == player) continue; if(game->player[i].data->speed > 0) { vec2 diff; float d; getPositionFromIndex(v_opponent.v + 0, v_opponent.v + 1, i); vec2Sub(&diff, &v_player, &v_opponent); // use manhattan distance instead of euclidean distance d = fabs(diff.v[0]) + fabs(diff.v[1]); // d = vec2Length(&diff); if(d < *distance) { *opponent = i; *distance = d; } } } } void ai_getDistances(int player, AI_Distances *distances) { enum { eFront = 0, eLeft, eRight, eBackleft, eMax }; segment2 segments[eMax]; vec2 v, vPos; Data *data = game->player[player].data; int dirLeft = (data->dir + 3) % 4; int dirRight = (data->dir + 1) % 4; int i, j; float *front = &distances->front; float *right = &distances->right; float *left = &distances->left; float *backleft = &distances->backleft; getPositionFromIndex(vPos.v + 0, vPos.v + 1, player); for(i = 0; i < eMax; i++) { vec2Copy(&segments[i].vStart, &vPos); } segments[eFront].vDirection.v[0] = dirsX[data->dir]; segments[eFront].vDirection.v[1] = dirsY[data->dir]; segments[eLeft].vDirection.v[0] = dirsX[dirLeft]; segments[eLeft].vDirection.v[1] = dirsY[dirLeft]; segments[eRight].vDirection.v[0] = dirsX[dirRight]; segments[eRight].vDirection.v[1] = dirsY[dirRight]; segments[eBackleft].vDirection.v[0] = dirsX[dirLeft] - dirsX[data->dir]; segments[eBackleft].vDirection.v[1] = dirsY[dirLeft] - dirsY[data->dir]; vec2Normalize(&segments[eBackleft].vDirection, &segments[eBackleft].vDirection); *front = FLT_MAX; *left = FLT_MAX; *right = FLT_MAX; *backleft = FLT_MAX; // loop over all segment for(i = 0; i < game->players; i++) { segment2 *wall = game->player[i].data->trails; if(game->player[i].data->trail_height < TRAIL_HEIGHT) continue; for(j = 0; j < game->player[i].data->trailOffset + 1; j++) { float t1, t2; if(i == player && j == game->player[i].data->trailOffset) break; if(segment2_Intersect(&v, &t1, &t2, segments + eFront, wall) && t1 > 0 && t1 < *front && t2 >= 0 && t2 <= 1) *front = t1; if(segment2_Intersect(&v, &t1, &t2, segments + eLeft, wall) && t1 > 0 && t1 < *left && t2 >= 0 && t2 <= 1) *left = t1; if(segment2_Intersect(&v, &t1, &t2, segments + eRight, wall) && t1 > 0 && t1 < *right && t2 >= 0 && t2 <= 1) *right = t1; if(segment2_Intersect(&v, &t1, &t2, segments + eBackleft, wall) && t1 > 0 && t1 < *backleft && t2 >= 0 && t2 <= 1) *backleft = t1; wall++; } } for(i = 0; i < 4; i++) { float t1, t2; segment2* wall = walls + i; if(segment2_Intersect(&v, &t1, &t2, segments + eFront, wall) && t1 > 0 && t1 < *front && t2 >= 0 && t2 <= 1) *front = t1; if(segment2_Intersect(&v, &t1, &t2, segments + eLeft, wall) && t1 > 0 && t1 < *left && t2 >= 0 && t2 <= 1) *left = t1; if(segment2_Intersect(&v, &t1, &t2, segments + eRight, wall) && t1 > 0 && t1 < *right && t2 >= 0 && t2 <= 1) *right = t1; if(segment2_Intersect(&v, &t1, &t2, segments + eBackleft, wall) && t1 > 0 && t1 < *backleft && t2 >= 0 && t2 <= 1) *backleft = t1; } // update debug render segments { AI *ai = game->player[player].ai; vec2Copy(&ai->front.vStart, &vPos); vec2Copy(&ai->left.vStart, &vPos); vec2Copy(&ai->right.vStart, &vPos); vec2Copy(&ai->backleft.vStart, &vPos); ai->front.vDirection.v[0] = *front * dirsX[data->dir]; ai->front.vDirection.v[1] = *front * dirsY[data->dir]; ai->left.vDirection.v[0] = *left * dirsX[dirLeft]; ai->left.vDirection.v[1] = *left * dirsY[dirLeft]; ai->right.vDirection.v[0] = *right * dirsX[dirRight]; ai->right.vDirection.v[1] = *right * dirsY[dirRight]; ai->backleft.vDirection.v[0] = dirsX[dirLeft] - dirsX[data->dir]; ai->backleft.vDirection.v[1] = dirsY[dirLeft] - dirsY[data->dir]; vec2Normalize(&ai->backleft.vDirection, &ai->backleft.vDirection); vec2Scale(&ai->backleft.vDirection, &ai->backleft.vDirection, *backleft); } // printf("%.2f, %.2f, %.2f\n", *front, *right, *left); return; } void ai_getConfig(int player, int target, AI_Configuration *config) { Data *data; getPositionFromIndex(config->player.vStart.v + 0, config->player.vStart.v + 1, player); getPositionFromIndex(config->opponent.vStart.v + 0, config->opponent.vStart.v + 1, target); data = game->player[player].data; config->player.vDirection.v[0] = dirsX[ data->dir ] * data->speed; config->player.vDirection.v[1] = dirsY[ data->dir ] * data->speed; data = game->player[target].data; config->opponent.vDirection.v[0] = dirsX[ data->dir ] * data->speed; config->opponent.vDirection.v[1] = dirsY[ data->dir ] * data->speed; // compute sector { vec2 diff; vec3 v1, v2, v3; vec3 up = { { 0, 0, 1 } }; float cosphi; float phi; int i; vec2Sub(&diff, &config->player.vStart, &config->opponent.vStart); v1.v[0] = diff.v[0]; v1.v[1] = diff.v[1]; v1.v[2] = 0; v2.v[0] = config->opponent.vDirection.v[0]; v2.v[1] = config->opponent.vDirection.v[1]; v2.v[2] = 0; vec3Normalize(&v1, &v1); vec3Normalize(&v2, &v2); vec3Cross(&v3, &v1, &v2); vec3Normalize(&v3, &v3); cosphi = vec3Dot(&v1, &v2); clamp(&cosphi, -1, 1); phi = acos(cosphi); if(vec3Dot(&v3, &up) > 0) phi = 2 * M_PI - phi; for(i = 0; i < 8; i++) { phi -= M_PI / 4; if(phi < 0) { config->location = i; break; } } } // compute intersection { segment2 seg1; segment2 seg2; seg1.vStart = config->opponent.vStart; seg1.vDirection = config->opponent.vDirection; seg2.vStart = config->player.vStart; vec2_Orthogonal( &seg2.vDirection, &config->opponent.vDirection ); vec2Normalize( &seg2.vDirection, &seg2.vDirection ); vec2Scale( &seg2.vDirection, &seg2.vDirection, vec2Length( &config->player.vDirection ) ); segment2_Intersect( &config->intersection, &config->t_opponent, &config->t_player, &seg1, &seg2 ); if(config->t_player < 0) config->t_player *= -1; } } void ai_left(int player, AI_Distances *distances) { // printf("trying left turn..."); AI *ai = game->player[player].ai; Data *data = game->player[player].data; int level = gSettingsCache.ai_level; float save_distance = (ai_params.minTurnTime[level] * data->speed / 1000.0f) + 20; if(distances->left > save_distance) { createEvent(player, EVENT_TURN_LEFT); ai->tdiff++; ai->lasttime = game2->time.current; // printf("succeeded\n"); } else { // printf("failed\n"); } } void ai_right(int player, AI_Distances *distances) { // printf("trying right turn..."); AI *ai = game->player[player].ai; Data *data = game->player[player].data; int level = gSettingsCache.ai_level; float save_distance = (ai_params.minTurnTime[level] * data->speed / 1000.0f) + 20; if(distances->right > save_distance) { createEvent(player, EVENT_TURN_RIGHT); ai->tdiff--; ai->lasttime = game2->time.current; // printf("succeeded\n"); } else { // printf("failed\n"); } } int agressive_action[8][4] = { { 2, 0, 2, 2 }, { 0, 1, 1, 2 }, { 0, 1, 1, 2 }, { 0, 1, 1, 2 }, { 0, 2, 2, 1 }, { 0, 2, 2, 1 }, { 0, 2, 2, 1 }, { 1, 1, 1, 0 } }; int evasive_action[8][4] = { { 1, 1, 2, 2 }, { 1, 1, 2, 0 }, { 1, 1, 2, 0 }, { 1, 1, 2, 0 }, { 2, 0, 1, 1 }, { 2, 0, 1, 1 }, { 2, 0, 1, 1 }, { 2, 2, 1, 1 } }; void ai_action(int action, int player, AI_Distances *distances) { switch(action) { case 0: break; case 1: ai_left(player, distances); break; case 2: ai_right(player, distances); break; } } void ai_aggressive(int player, int target, int location, AI_Distances *distances) { int dirdiff = (4 + game->player[player].data->dir - game->player[target].data->dir) % 4; // printf("aggressive mode (%d, %d)\n", player, target, location, dirdiff); ai_action(agressive_action[location][dirdiff], player, distances); } void ai_evasive(int player, int target, int location, AI_Distances *distances) { int dirdiff = (4 + game->player[player].data->dir - game->player[target].data->dir) % 4; // printf("evasive mode (%d,%d,%d)\n", player, target, location); ai_action(evasive_action[location][dirdiff], player, distances); } gltron-0.70/src/game/credits.c0000644000076400001440000000406107704041045011731 #include "game/gltron.h" static int coffset; char *credits[] = { "", " GLtron is written by " "\x03" "4" "Andreas Umbach", "", " Contributors:", " Programming: Darrell Walisser Nicolas Deniaud", " Todd Kirby Andy Howe Jon Atkins", " Art: Nicolas Zimmermann", " Charles Babbage Tracy Brown" " Tyler Esselstrom Allen Bond", " Music: Peter Hajba", " Sound: Damon Law", "", "Additional Thanks to:", "Xavier Bouchoux Mike Field Steve Baker", "Jean-Bruno Richard Andrey Zahkhatov", "Bjonar Henden Shaul Kedem Jonas Gustavsson", "Mattias Engdegard Ray Kelm Thomas Flynn", "Martin Fierz Joseph Valenzuela Ryan Gordon", "Sam Lantinga Patrick McCarthy", "", "Thanks to my sponsors:", " 3dfx: Voodoo5 5500 graphics card", " Right Hemisphere: 3D exploration software", NULL }; void mouseCredits (int buttons, int state, int x, int y) { if ( state == SYSTEM_MOUSEPRESSED ) { SystemExit(); exit(0); } } void keyCredits(int state, int k, int x, int y) { if(state == SYSTEM_KEYSTATE_UP) return; SystemExit(); exit(0); } void idleCredits(void) { scripting_RunGC(); SystemPostRedisplay(); } void drawCredits(void) { int time; int x, y; int h; int i; float colors[][3] = { { 1.0, 0.0, 0.0 }, { 1.0, 1.0, 1.0 } }; time = SystemGetElapsedTime() - coffset; glClearColor(.0, .0, .0, .0); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); rasonly(gScreen); h = gScreen->vp_h / (24 * 3 / 2); for(i = 0; i < time / 250; i++) { glColor3fv(colors[i % 2]); if(credits[i] == NULL) break; x = 10; y = gScreen->vp_h - 3 * h * (i + 1) / 2; drawText(gameFtx, x, y, h, credits[i]); } } void displayCredits(void) { drawCredits(); SystemSwapBuffers(); } void initCredits(void) { coffset = SystemGetElapsedTime(); } Callbacks creditsCallbacks = { displayCredits, idleCredits, keyCredits, initCredits, NULL, NULL, mouseCredits, NULL, "credits" }; gltron-0.70/src/game/engine.c0000644000076400001440000001265607766642636011577 #include "game/game.h" #include "video/video.h" #include "audio/audio.h" #include "Nebu_base.h" #include void getPositionFromIndex(float *x, float *y, int player) { getPositionFromData(x, y, game->player[player].data); } void getPositionFromData(float *x, float *y, Data *data) { vec2 v; vec2Add(&v, &data->trails[data->trailOffset].vStart, &data->trails[data->trailOffset].vDirection); *x = v.v[0]; *y = v.v[1]; } void initGameStructures(void) { /* called only once */ int i; /* initialize some global variables */ game2 = &main_game2; game = &main_game; game->pauseflag = PAUSE_NO_GAME; game->winner = -1; game->players = PLAYERS; game->player = (Player *) malloc(MAX_PLAYERS * sizeof(Player)); for(i = 0; i < game->players; i++) { Player *p = game->player + i; p->ai = (AI*) malloc(sizeof(AI)); p->data = (Data*) malloc(sizeof(Data)); p->data->trails = (segment2*) malloc(MAX_TRAIL * sizeof(segment2)); p->data->trailOffset = 0; p->camera = (Camera*) malloc(sizeof(Camera)); } game2->events.next = NULL; game2->mode = GAME_SINGLE; } void resetPlayerData(void) { int i; Data *data; AI *ai; int not_playing = 0; int *startIndex; startIndex = malloc( game->players * sizeof(int) ); randomPermutation(game->players, startIndex); for(i = 0; i < game->players; i++) { float startpos[][2] = { { 0.5, 0.25 }, { 0.75, 0.5 }, { 0.5, 0.75 }, { 0.25, 0.5 } }; float x, y; data = game->player[i].data; ai = game->player[i].ai; /* init ai */ switch(i) { case 0: ai->active = getSettingi("ai_player1"); break; case 1: ai->active = getSettingi("ai_player2"); break; case 2: ai->active = getSettingi("ai_player3"); break; case 3: ai->active = getSettingi("ai_player4"); break; default: fprintf(stderr, "[error] player index #%d not caught!\n", i); ai->active = AI_NONE; } ai->tdiff = 0; /* arrange players in circle around center */ /* randomize position on the grid */ x = startpos[ startIndex[i] ][0] * getSettingi("grid_size"); y = startpos[ startIndex[i] ][1] * getSettingi("grid_size"); /* randomize starting direction */ data->dir = trand() & 3; /* data->dir = startdir[i]; */ data->last_dir = data->dir; /* if player is playing... */ if(ai->active != AI_NONE) { data->speed = getSettingf("speed"); data->booster = getSettingf("booster_max"); data->boost_enabled = 0; data->trail_height = TRAIL_HEIGHT; } else { data->speed = SPEED_GONE; data->trail_height = 0; not_playing++; } // data->trail = data->trails; data->trailOffset = 0; data->trails[ data->trailOffset ].vStart.v[0] = x; data->trails[ data->trailOffset ].vStart.v[1] = y; data->trails[ data->trailOffset ].vDirection.v[0] = 0; data->trails[ data->trailOffset ].vDirection.v[1] = 0; { int camType; Camera *cam = game->player[i].camera; camType = (game->player[i].ai->active == AI_COMPUTER) ? CAM_CIRCLE : gSettingsCache.camType; initCamera(cam, data, camType); } } free(startIndex); game->running = game->players - not_playing; /* not everyone is alive */ /* printf("starting game with %d players\n", game->running); */ game->winner = -1; } void initData(void) { /* lasttime = SystemGetElapsedTime(); */ game->pauseflag = PAUSE_GAME_RUNNING; game2->rules.speed = getSettingf("speed"); game2->rules.eraseCrashed = getSettingi("erase_crashed"); game2->rules.grid_size = getSettingi("grid_size"); game2->grid.width = game2->rules.grid_size; game2->grid.height = game2->rules.grid_size; /* time management */ game2->time.lastFrame = 0; game2->time.current = 0; game2->time.offset = SystemGetElapsedTime(); /* TODO: fix that */ game2->players = game->players; /* event management */ game2->events.next = NULL; /* TODO: free any old events that might have gotten left */ resetVideoData(); resetPlayerData(); initWalls(); } void Time_Idle(void) { game2->time.lastFrame = game2->time.current; game2->time.current = SystemGetElapsedTime() - game2->time.offset; game2->time.dt = game2->time.current - game2->time.lastFrame; /* fprintf(stderr, "dt: %d\n", game2->time.dt); */ } void resetScores(void) { int i; for(i = 0; i < game->players; i++) game->player[i].data->score = 0; } void doCrashPlayer(GameEvent *e) { int j; Audio_CrashPlayer(e->player); Audio_StopEngine(e->player); for(j = 0; j < game->players; j++) if(j != e->player && PLAYER_IS_ACTIVE(&(game->player[j]))) game->player[j].data->score++; game->player[e->player].data->speed = SPEED_CRASHED; } void newTrail(Data* data) { segment2 *s; float x, y; getPositionFromData(&x, &y, data); data->trailOffset++; s = data->trails + data->trailOffset; s->vStart.v[0] = x; s->vStart.v[1] = y; s->vDirection.v[0] = 0; s->vDirection.v[1] = 0; } void doTurn(GameEvent *e, int direction) { Data *data = game->player[e->player].data; newTrail(data); data->last_dir = data->dir; data->dir = (data->dir + direction) % 4; data->turn_time = game2->time.current; } void initWalls(void) { float raw[4][4] = { { 0.0f, 0.0f, 1.0f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, -1.0f, 0.0f }, { 0.0f, 1.0f, 0.0f, -1.0f } }; float width = game2->rules.grid_size; float height = game2->rules.grid_size; int j; for(j = 0; j < 4; j++) { walls[j].vStart.v[0] = raw[j][0] * width; walls[j].vStart.v[1] = raw[j][1] * height; walls[j].vDirection.v[0] = raw[j][2] * width; walls[j].vDirection.v[1] = raw[j][3] * height; } } gltron-0.70/src/game/event.c0000644000076400001440000002500007764076762011435 #include #include #include "video/video.h" #include "game/game.h" #include "audio/audio.h" #include "Nebu_scripting.h" /*! \fn int processEvent(GameEvent* e) handle events, e.g. left/right/crash/stop frees e */ int processEvent(GameEvent* e) { int value = 0; #ifdef RECORD if(game2->mode == GAME_SINGLE_RECORD) { writeEvent(e); } #endif switch(e->type) { case EVENT_TURN_LEFT: doTurn(e, TURN_LEFT); break; case EVENT_TURN_RIGHT: doTurn(e, TURN_RIGHT); break; case EVENT_CRASH: displayMessage(TO_CONSOLE, "player %d crashed", e->player + 1); doCrashPlayer(e); break; case EVENT_STOP: // displayMessage(TO_STDOUT, "game stopped"); #ifdef RECORD if(game2->mode == GAME_SINGLE_RECORD) { stopRecording(); game2->mode = GAME_SINGLE; } else if(game2->mode == GAME_PLAY) { stopPlaying(); game2->mode = GAME_SINGLE; } #endif if(e->playerplayer[e->player].ai->active != AI_NONE) { game->winner = e->player; displayMessage(TO_CONSOLE, "winner: %d", game->winner + 1); } else { game->winner = -2; displayMessage(TO_CONSOLE, "everyone died! no one wins!"); } SystemExitLoop(RETURN_GAME_END); game->pauseflag = PAUSE_GAME_FINISHED; value = 1; break; } free(e); return value; } int crashTestPlayers(int i, const segment2 *movement) { int j, k; int crash = 0; Data *data = game->player[i].data; segment2 *current = data->trails + data->trailOffset; // debug: only test player0 against himself // j = 0; // if(i == 0) { for(j = 0; j < game->players; j++) { int crash = 0; if(game->player[j].data->trail_height < TRAIL_HEIGHT) continue; for(k = 0; k < game->player[j].data->trailOffset + 1; k++) { segment2 *wall; vec2 v; float t1, t2; if(j == i && k >= game->player[j].data->trailOffset - 1) break; wall = game->player[j].data->trails + k; if(segment2_Intersect(&v, &t1, &t2, movement, wall)) { #if 0 printf("(%.2f, %.2f), (%.2f, %.2f), %.2f, %.2f\n", data->posx, data->posy, v.v[0], v.v[1], t1, t2); #endif if(t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) { current->vDirection.v[0] = v.v[0] - current->vStart.v[0]; current->vDirection.v[1] = v.v[1] - current->vStart.v[1]; createEvent(i, EVENT_CRASH); crash = 1; break; } } } if(crash) break; } return crash; } int crashTestWalls(int i, const segment2 *movement) { int j; vec2 v; float t1, t2; int crash = 0; Data *data = game->player[i].data; segment2 *current = data->trails + data->trailOffset; for(j = 0; j < 4; j++) { if(segment2_Intersect(&v, &t1, &t2, current, walls + j)) { if(t1 >= 0 && t1 < 1 && t2 >= 0 && t2 < 1) { current->vDirection.v[0] = v.v[0] - current->vStart.v[0]; current->vDirection.v[1] = v.v[1] - current->vStart.v[1]; createEvent(i, EVENT_CRASH); crash = 1; break; } } } return crash; } int applyBooster(int player, int dt) { Data *data = game->player[player].data; if(data->booster > 0 && data->boost_enabled) { float boost = getSettingf("booster_use") * dt / 1000.0f; if(boost > data->booster) { boost = data->booster; data->boost_enabled = 0; } data->speed += boost; data->booster -= boost; return 1; } else { float booster_max = getSettingf("booster_max"); if(data->booster < booster_max) { data->booster += getSettingf("booster_regenerate") * dt / 1000.0f; if(data->booster > booster_max) data->booster = booster_max; } return 0; } } void applyDecceleration(int player, int dt, float factor) { Data *data = game->player[player].data; if(data->speed > game2->rules.speed) { float decrease = factor * dt / 1000.0f; data->speed -= decrease; if(data->speed < game2->rules.speed) data->speed = game2->rules.speed; } } int applyWallAcceleration(int player, int dt) { // find distance to enemy walls left & right enum { eLeft, eRight, eMax }; segment2 segments[eMax]; Data *data = game->player[player].data; int dirLeft = (data->dir + 3) % 4; int dirRight = (data->dir + 1) % 4; float left, right; float x, y; vec2 vPos; int i, j; getPositionFromIndex(&x, &y, player); vPos.v[0] = x; vPos.v[1] = y; for(i = 0; i < eMax; i++) { vec2Copy(&segments[i].vStart, &vPos); } segments[eLeft].vDirection.v[0] = dirsX[dirLeft]; segments[eLeft].vDirection.v[1] = dirsY[dirLeft]; segments[eRight].vDirection.v[0] = dirsX[dirRight]; segments[eRight].vDirection.v[1] = dirsY[dirRight]; left = FLT_MAX; right = FLT_MAX; for(i = 0; i < game->players; i++) { segment2 *wall = game->player[i].data->trails; if(i == player) continue; if(game->player[i].data->trail_height < TRAIL_HEIGHT) continue; for(j = 0; j < game->player[i].data->trailOffset + 1; j++) { float t1, t2; vec2 v; if(segment2_Intersect(&v, &t1, &t2, segments + eLeft, wall) && t1 > 0 && t1 < left && t2 >= 0 && t2 <= 1) left = t1; if(segment2_Intersect(&v, &t1, &t2, segments + eRight, wall) && t1 > 0 && t1 < right && t2 >= 0 && t2 <= 1) right = t1; wall++; } } { float accell_limit = getSettingf("wall_accel_limit"); if(left < accell_limit || right < accell_limit) { float boost = getSettingf("wall_accel_use") * dt / 1000.0f; data->speed += boost; return 1; } else { return 0; } } } /*! \fn static list* doMovement(int mode, int dt) do physics, create CRASH and STOP events */ List* doMovement(int mode, int dt) { int i; List *l = NULL; for(i = 0; i < game->players; i++) { Data *data = game->player[i].data; PlayerVisual *pV = gPlayerVisuals + i; if(data->speed > 0) { /* still alive */ float fs; float t; // speed boost: float deccel = 0; if(getSettingf("wall_accel_on") == 1) { if(!applyWallAcceleration(i, dt)) { deccel = getSettingf("wall_accel_decrease"); } else { deccel = -1; // forbid deacceleration for booster } } if(getSettingf("booster_on") == 1) { if(!applyBooster(i, dt) && deccel != -1) { float d = getSettingf("booster_decrease"); deccel = d > deccel ? d : deccel; } else { deccel = -1; } } if(deccel > 0) applyDecceleration(i, dt, deccel); // if(i == 0) // printf("speed: %.2f, boost: %.2f\n", data->speed, data->booster); fs = 1.0f - SPEED_OZ_FACTOR + SPEED_OZ_FACTOR * cosf(i * PI / 4.0f + (game2->time.current % SPEED_OZ_FREQ) * 2.0f * PI / SPEED_OZ_FREQ); t = dt / 100.0f * data->speed * fs; { segment2 *current = data->trails + data->trailOffset; segment2 movement; int crash = 0; float x, y; getPositionFromData(&x, &y, data); movement.vStart.v[0] = x; movement.vStart.v[1] = y; movement.vDirection.v[0] = t * dirsX[data->dir]; movement.vDirection.v[1] = t * dirsY[data->dir]; current->vDirection.v[0] += t * dirsX[data->dir]; current->vDirection.v[1] += t * dirsY[data->dir]; crash = crash || crashTestPlayers(i, &movement); crash = crash || crashTestWalls(i, &movement); } } else { /* already crashed */ if(game2->rules.eraseCrashed == 1 && data->trail_height > 0) data->trail_height -= (dt * TRAIL_HEIGHT) / 1000.0f; if(pV->exp_radius < EXP_RADIUS_MAX) pV->exp_radius += dt * EXP_RADIUS_DELTA; else if (data->speed == SPEED_CRASHED) { int winner = -1; data->speed = SPEED_GONE; game->running--; if(game->running <= 1) { /* all dead, find survivor */ int i, maxSpeed = SPEED_GONE; /* create winner event */ for(i = 0; i < game->players; i++) { if(game->player[i].data->speed >= maxSpeed) { winner = i; maxSpeed = game->player[i].data->speed; } } if(mode) { createEvent(winner, EVENT_STOP); /* a stop event is the last event that happens */ return l; } } } } } return l; } /*! \fn void idleGame( void ) game loop: run ai, process events, do physics, process events again, do camera movement */ void Game_Idle(void) { List *l; List *p; int i; int dt; int t; switch(game2->mode) { case GAME_SINGLE: #ifdef RECORD case GAME_SINGLE_RECORD: #endif /* check for fast finish */ if (gSettingsCache.fast_finish == 1) { int factors[4] = { 4, 6, 12, 25 }; int threshold[4] = { 0, 300, 600, 800 }; int factor = 1; for(i = 0; i < 4; i++) { if(game2->rules.grid_size > threshold[i]) factor = factors[i]; } for (i = 0; i < game->players; i++) { if (game->player[i].ai->active != AI_COMPUTER && gPlayerVisuals[i].exp_radius < EXP_RADIUS_MAX) { factor = 1; } } dt = game2->time.dt * factor; } else { dt = game2->time.dt; } while(dt > 0) { if(dt > PHYSICS_RATE) t = PHYSICS_RATE; else t = dt; /* run AI */ for(i = 0; i < game->players; i++) if(game->player[i].ai != NULL) if(game->player[i].ai->active == AI_COMPUTER && PLAYER_IS_ACTIVE(&game->player[i])) { doComputer(i, 0); } /* process any outstanding events (turns, etc) */ for(p = &(game2->events); p->next != NULL; p = p->next) { if(processEvent((GameEvent*) p->data)) return; } /* free events */ p = game2->events.next; while(p != NULL) { l = p; p = p->next; free(l); } game2->events.next = NULL; l = doMovement(1, t); /* this can generate new events */ if(l != NULL) { for(p = l; p->next != NULL; p = p->next) { if(processEvent((GameEvent*) p->data)); } } /* free list */ p = l; while(p != NULL) { l = p; p = p->next; free(l); } dt -= PHYSICS_RATE; } break; #ifdef RECORD case GAME_PLAY_NETWORK: /* fall through to GAME_PLAY */ case GAME_PLAY: getEvents(); l = doMovement(0, game2->time.dt); /* this won't generate new events */ if(l != NULL) { fprintf(stderr, "something is seriously wrong - ignoring events\n"); } break; #endif /* RECORD */ } doCameraMovement(); doRecognizerMovement(); } /*! \fn void createEvent(int player, event_type_e eventType) helper function to create an event struct and insert it into the global event queue */ void createEvent(int player, event_type_e eventType) { GameEvent *e; List *p = &(game2->events); /* move to the end of the event list */ while (p->next) p = p->next; /* TODO: handle failed malloc */ e = (GameEvent*) malloc(sizeof(GameEvent)); p->data = e; p->next = (List*) malloc(sizeof(List)); p->next->next = NULL; e->type = eventType; getPositionFromIndex(&e->x, &e->y, player); e->player = player; e->timestamp = game2->time.current; } gltron-0.70/src/game/game.c0000644000076400001440000000454607706272762011233 #include "game/gltron.h" #include "game/timesystem.h" void GameMode_Idle(void) { Sound_idle(); Time_Idle(); if(game2->time.dt == 0) return; Game_Idle(); Video_Idle(); Input_Idle(); Scripting_Idle(); SystemPostRedisplay(); } void enterGame(void) { /* called when game mode is entered */ updateSettingsCache(); SystemHidePointer(); SystemWarpPointer(MOUSE_ORIG_X, MOUSE_ORIG_Y); game2->time.offset = SystemGetElapsedTime() - game2->time.current; Audio_EnableEngine(); // disable booster and cam offset { int i; for(i = 0; i < game->players; i++) { game->player[i].data->boost_enabled = 0; game->player[i].camera->movement[CAM_PHI_OFFSET] = 0; } } /* reset pause flag */ if (game->pauseflag != PAUSE_GAME_FINISHED) { game->pauseflag = PAUSE_GAME_RUNNING; } /* fprintf(stderr, "init game\n"); */ } void exitGame(void) { Audio_DisableEngine(); /* fprintf(stderr, "exit game\n"); */ } void gameMouseMotion(int x, int y) { if(x != MOUSE_ORIG_X || y != MOUSE_ORIG_Y) { gInput.mousex += x - MOUSE_ORIG_X; gInput.mousey += y - MOUSE_ORIG_Y; /* fprintf(stderr, "Mouse: dx: %d\tdy: %d\n", x - MOUSE_ORIG_Y, y - MOUSE_ORIG_Y); */ /* cam_phi += - (x - MOUSE_ORIG_X) * MOUSE_CX; cam_chi += (y - MOUSE_ORIG_Y) * MOUSE_CY; if(cam_chi < CAM_CHI_MIN) cam_chi = CAM_CHI_MIN; if(cam_chi > CAM_CHI_MAX) cam_chi = CAM_CHI_MAX; */ SystemWarpPointer(MOUSE_ORIG_X, MOUSE_ORIG_Y); } } void gameMouse(int buttons, int state, int x, int y) { if(state == SYSTEM_MOUSEPRESSED) { if(buttons == SYSTEM_MOUSEBUTTON_LEFT) gInput.mouse1 = 1; if(buttons == SYSTEM_MOUSEBUTTON_RIGHT) gInput.mouse2 = 1; } else if(state == SYSTEM_MOUSERELEASED) { if(buttons == SYSTEM_MOUSEBUTTON_LEFT) gInput.mouse1 = 0; if(buttons == SYSTEM_MOUSEBUTTON_RIGHT) gInput.mouse2 = 0; } /* if(getSettingi("camType") == CAM_TYPE_MOUSE) if(state == SYSTEM_MOUSEPRESSED) { if(buttons == SYSTEM_MOUSEBUTTON_LEFT) { cam_r -= CAM_DR; if(cam_r < CAM_R_MIN) cam_r = CAM_R_MIN; } else if(buttons == SYSTEM_MOUSEBUTTON_RIGHT) { cam_r += CAM_DR; if(cam_r > CAM_R_MAX) cam_r = CAM_R_MAX; } } */ /* fprintf(stderr, "new cam_r: %.2f\n", cam_r); */ } Callbacks gameCallbacks = { displayGame, GameMode_Idle, keyGame, enterGame, exitGame, initGLGame, gameMouse, gameMouseMotion, "game" }; gltron-0.70/src/game/globals.c0000644000076400001440000000724507764076762011752 #include "game/game.h" #include "video/video.h" #include "input/input.h" /* globals */ Game main_game; Game *game; Game2 main_game2; Game2 *game2; Visual *gScreen; int gViewportType; PlayerVisual *gPlayerVisuals; Input gInput; SettingsCache gSettingsCache; int viewport_content[4]; /* max. 4 individual viewports on the screen */ /* TexFont *txf = NULL; */ FontTex *guiFtx = NULL; FontTex *gameFtx = NULL; int fontID = 6; Mesh* recognizer_quad; float rec_outline_color[] = {0.8f, 0.0, 0.0}; float rec_spec_color[] = {0.05f, 0.14f, 0.05f, 0.50f}; Mesh* recognizer; Mesh* lightcycle[LC_LOD]; char *lc_lod_names[] = { "lightcycle-high.obj", "lightcycle-med.obj", "lightcycle-low.obj" }; float camAngle = 0; float cam_phi = 0; float cam_chi = PI / 6.0f; float cam_r_mouse = CAM_CIRCLE_DIST; float cam_r_follow = CAM_FOLLOW_DIST; float cam_r_circle = CAM_CIRCLE_DIST; unsigned char* debugtex = NULL; int ogl_debugtex; int colwidth; segment2 walls[4]; int dirsX[] = { 0, -1, 0, 1 }; int dirsY[] = { -1, 0, 1, 0 }; float camAngles[] = { PI / 2, 0, 3 * PI / 2, PI, 2 * PI }; float cam_defaults[][3] = { { CAM_CIRCLE_DIST, PI / 3, 0 }, /* circle */ { CAM_FOLLOW_DIST, PI / 4, PI / 72 }, /* follow */ { CAM_COCKPIT_Z, PI / 8, 0 }, /* cockpit */ { CAM_CIRCLE_DIST, PI / 3, 0 } /* free */ }; /* int lasttime; double dt; */ /* milliseconds since last frame */ int polycount; /* poly count - how much do we draw each frame? */ unsigned char debugcolors[6][4] = { { 0, 0, 0, 0 }, { 255, 0, 0, 255 }, { 0, 255, 255, 255 }, { 0, 255, 0, 255 }, { 0, 0, 255, 255 }, { 255, 255, 255, 255 } }; int vps = 4; int vp_max[] = { 1, 2, 4, 1 }; /* windows in this display setting */ /* currently, the screen is partitioned into 32 units horizontally, and 24 units vertically */ /* these arrays have four members, for the four different visuals: single, split, quad, unused */ /* the offset of the view, in virtual units */ float vp_x[4][4] = { { 0 }, { 1, 1 }, { 1, 16, 1, 16 }, { 10 } }; float vp_y[4][4] = { { 0 }, { 0.5f, 12.5f }, { 1, 1, 12.5f, 12.5f }, { 4.5 } } ; /* the width/height of the view, in virtual units */ float vp_w[4][4] = { { 32 }, { 30, 30 }, { 14, 14, 14, 14 }, { 20 } }; float vp_h[4][4] = { { 24 }, { 11.5f, 11.5f }, { 10.5f, 10.5f, 10.5f, 10.5f }, { 15 } }; #ifdef DEPTH_SORT int quadBufSize = 100; Quad *quadBuf; int *quadBufIndex; #endif int game_textures = TEX_COUNT + 5; /* 11 + 6 + debug texture */ int n_textures = 11; #ifndef GL_VERSION_1_2 # define GL_CLAMP_TO_EDGE GL_CLAMP #endif TextureInfo textures[] = { { 1, "gltron_floor", GL_DONT_CARE, GL_REPEAT, GL_REPEAT, TEX_FLOOR, 64 }, { 1, "gltron", GL_RGB, GL_REPEAT, GL_REPEAT, TEX_GUI, 1 }, { 1, "gltron_logo", GL_RGBA, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, TEX_LOGO, 1 }, { 1, "gltron_wall_1", GL_DONT_CARE, GL_REPEAT, GL_CLAMP_TO_EDGE, TEX_WALL1, 1 }, { 1, "gltron_wall_2", GL_DONT_CARE, GL_REPEAT, GL_CLAMP_TO_EDGE, TEX_WALL2, 1 }, { 1, "gltron_wall_3", GL_DONT_CARE, GL_REPEAT, GL_CLAMP_TO_EDGE, TEX_WALL3, 1 }, { 1, "gltron_wall_4", GL_DONT_CARE, GL_REPEAT, GL_CLAMP_TO_EDGE, TEX_WALL4, 1 }, { 1, "gltron_trail", GL_RGBA, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, TEX_TRAIL, 1 }, { 1, "gltron_traildecal", GL_RGBA, GL_REPEAT, GL_CLAMP_TO_EDGE, TEX_DECAL, 1 }, { 6, "skybox", GL_RGB, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, TEX_SKYBOX, 1 }, { 1, "gltron_impact", GL_RGBA, GL_REPEAT, GL_CLAMP_TO_EDGE, TEX_IMPACT, 1 }, }; float shadow_color[] = { 0, 0, 0, .8f }; #define LX 2.0f #define LY 2.0f float shadow_matrix[] = { LX * LY, 0, 0, 0, 0, LX * LY, 0, 0, -LY, -LX, 0, 0, 0, 0, 0, LX * LY }; #undef LX #undef LY gltron-0.70/src/game/gui.c0000644000076400001440000001374607766642744011117 #include #include #include #include "game/gltron.h" /* FIXME: "ignored playMenuFX" */ void playMenuFX(int foo) { } void guiProjection(int x, int y) { checkGLError("gui.c guiProj - start"); glMatrixMode(GL_PROJECTION); glLoadIdentity(); /*glOrtho(0, 0, x, y, -1, 1); */ checkGLError("gui.c guiProj - proj"); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glViewport(gScreen->vp_x, gScreen->vp_y, x, y); checkGLError("gui.c guiProj - end"); } void drawGuiBackground(void) { checkGLError("gui background start"); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); rasonly(gScreen); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, gScreen->textures[TEX_GUI]); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glColor3f(1.0, 1.0, 1.0); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex2f(0, 0); glTexCoord2f(1.0, 0.0); glVertex2i(gScreen->vp_w, 0); glTexCoord2f(1.0, .75); glVertex2i(gScreen->vp_w, gScreen->vp_h); glTexCoord2f(0.0, .75); glVertex2i(0, gScreen->vp_h); glEnd(); } void drawGuiLogo(void) { float pos[] = { 512 - 10 - 320, 384 - 80 }; float size[] = { 320, 80 }; float glpos = 64; float glsize = 32; checkGLError("gui logo start"); rasonly(gScreen); pos[0] *= gScreen->vp_w / 512.0f; pos[1] *= gScreen->vp_h / 384.0f; size[0] *= gScreen->vp_w / 512.0f; size[1] *= gScreen->vp_h / 384.0f; glpos *= gScreen->vp_w / 512.0f; glsize *= gScreen->vp_w / 512.0f; glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, gScreen->textures[TEX_LOGO]); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor3f(1.0, 1.0, 1.0); glBegin(GL_QUADS); { // float texy = 1.0f - 256.0f / 320.0f; float texy = 0.0f; glTexCoord2f(0.0, texy); glVertex2f(pos[0], pos[1]); glTexCoord2f(1.0, texy); glVertex2f(pos[0] + size[0], pos[1]); glTexCoord2f(1.0, 1.0); glVertex2f(pos[0] + size[0], pos[1] + size[1]); glTexCoord2f(0.0, 1.0); glVertex2f(pos[0], pos[1] + size[1]); } glEnd(); glDisable(GL_BLEND); checkGLError("gui background end"); } void displayGui(void) { drawGuiBackground(); drawGuiLogo(); drawMenu(gScreen); SystemSwapBuffers(); } void displayConfigure(void) { char message[] = "Press a key for this action!"; drawGuiBackground(); drawGuiLogo(); drawMenu(gScreen); rasonly(gScreen); glColor3f(1.0, 1.0, 1.0); drawText(guiFtx, gScreen->vp_w / 6, 20, gScreen->vp_w / (6.0f / 4.0f * strlen(message)), message); SystemSwapBuffers(); } void idleGui(void) { Sound_idle(); scripting_RunGC(); SDL_Delay(10); Video_Idle(); Input_Idle(); SystemPostRedisplay(); /* animate menu */ } void keyboardConfigure(int state, int key, int x, int y) { if(state == SYSTEM_KEYSTATE_DOWN) { scripting_RunFormat("settings.keys[ configure_player ][ configure_event ]" "= %d", key); SystemExitLoop(RETURN_PROMPT_ESCAPE); } } void keyboardGui(int state, int key, int x, int y) { char *pMenuName; if(state == SYSTEM_KEYSTATE_UP) return; scripting_Run("return Menu.current"); scripting_GetStringResult(&pMenuName); switch(key) { case 27: if(strcmp(pMenuName, "RootMenu")) { // not in the root menu -> go up one menu scripting_Run("Menu.GotoParent()"); } else { // is a game already in process? then resume if(game->pauseflag != PAUSE_NO_GAME) SystemExitLoop(RETURN_GUI_ESCAPE); } break; case ' ': case SYSTEM_KEY_RETURN: case SYSTEM_JOY_BUTTON_0: case SYSTEM_JOY_BUTTON_1: case SYSTEM_JOY_BUTTON_2: case SYSTEM_JOY_BUTTON_3: case SYSTEM_JOY_BUTTON_4: case SYSTEM_JOY_BUTTON_5: case SYSTEM_JOY_BUTTON_6: case SYSTEM_JOY_BUTTON_7: case SYSTEM_JOY_BUTTON_8: case SYSTEM_JOY_BUTTON_9: case SYSTEM_JOY_BUTTON_0 + SYSTEM_JOY_OFFSET: case SYSTEM_JOY_BUTTON_1 + SYSTEM_JOY_OFFSET: case SYSTEM_JOY_BUTTON_2 + SYSTEM_JOY_OFFSET: case SYSTEM_JOY_BUTTON_3 + SYSTEM_JOY_OFFSET: case SYSTEM_JOY_BUTTON_4 + SYSTEM_JOY_OFFSET: case SYSTEM_JOY_BUTTON_5 + SYSTEM_JOY_OFFSET: case SYSTEM_JOY_BUTTON_6 + SYSTEM_JOY_OFFSET: case SYSTEM_JOY_BUTTON_7 + SYSTEM_JOY_OFFSET: case SYSTEM_JOY_BUTTON_8 + SYSTEM_JOY_OFFSET: case SYSTEM_JOY_BUTTON_9 + SYSTEM_JOY_OFFSET: scripting_Run("Menu.Action()"); break; case SYSTEM_KEY_UP: case SYSTEM_JOY_UP: case SYSTEM_JOY_UP + SYSTEM_JOY_OFFSET: scripting_Run("Menu.Previous()"); break; case SYSTEM_KEY_DOWN: case SYSTEM_JOY_DOWN: case SYSTEM_JOY_DOWN + SYSTEM_JOY_OFFSET: scripting_Run("Menu.Next()"); break; case SYSTEM_KEY_RIGHT: case SYSTEM_JOY_RIGHT: case SYSTEM_JOY_RIGHT + SYSTEM_JOY_OFFSET: scripting_Run("Menu.Right()"); break; case SYSTEM_KEY_LEFT: case SYSTEM_JOY_LEFT: case SYSTEM_JOY_LEFT + SYSTEM_JOY_OFFSET: scripting_Run("Menu.Left()"); break; case SYSTEM_KEY_F11: doBmpScreenShot(gScreen); break; case SYSTEM_KEY_F12: doPngScreenShot(gScreen); break; default: // printf("got key %d\n", key); break; } free(pMenuName); } void initGui(void) { SystemUnhidePointer(); updateSettingsCache(); } void exitGui(void) { glShadeModel( GL_SMOOTH ); } void initGLGui(void) { glShadeModel(GL_FLAT); glDisable(GL_BLEND); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); } void guiMouse(int buttons, int state, int x, int y) { fprintf(stderr, "Mouse buttons: %d, State %d, Position (%d, %d)\n", buttons, state, x, y); /* fprintf(stderr, "testing for state == %d\n", SYSTEM_MOUSEPRESSED); */ if (state == SYSTEM_MOUSEPRESSED) { if(getSettingi("playEffects")) playMenuFX(fx_action); } } void guiMouseMotion(int mx, int my) { /* TODO: add mouse cursor, highlighted areas, etc. */ } Callbacks configureCallbacks = { displayConfigure, idleGui, keyboardConfigure, initGui, exitGui, initGLGui, NULL, NULL, "configure" }; Callbacks guiCallbacks = { displayGui, idleGui, keyboardGui, initGui, exitGui, initGLGui, guiMouse, guiMouseMotion, "gui" }; gltron-0.70/src/game/init.c0000644000076400001440000000525207766301733011255 #include "filesystem/path.h" #include "game/init.h" #include "game/gltron.h" #include "base/util.h" #include "scripting/scripting.h" void initSubsystems(int argc, const char *argv[]) { initFilesystem(argc, argv); initScripting(); init_c_interface(); initConfiguration(argc, argv); initGame(); initVideo(); initAudio(); initInput(); } void initScripting(void) { scripting_Init(); /* load basic scripting services */ runScript(PATH_SCRIPTS, "basics.lua"); runScript(PATH_SCRIPTS, "joystick.lua"); } void initConfiguration(int argc, const char *argv[]) { /* load some more defaults from config file */ runScript(PATH_SCRIPTS, "config.lua"); runScript(PATH_SCRIPTS, "artpack.lua"); /* go for .gltronrc (or whatever is defined in RC_NAME) */ { char *path; path = getPossiblePath(PATH_PREFERENCES, RC_NAME); if (path != NULL) { if (fileExists(path)) { printf("[status] loading settings from %s\n", path); scripting_RunFile(path); } else { printf("[error] cannot load %s from %s\n", RC_NAME, path); } free(path); } else { printf("[fatal] can't get valid pref path for %s\n", RC_NAME); exit(1); // something is seriously wrong } } if(!isSetting("version") || getSettingf("version") < 0.70f) { /* load some more defaults from config file */ runScript(PATH_SCRIPTS, "config.lua"); runScript(PATH_SCRIPTS, "artpack.lua"); printf("[warning] old config file found, overriding using defaults\n"); } // check if config is valid scripting_GetGlobal("save_completed", NULL); if(scripting_IsNilResult()) { runScript(PATH_SCRIPTS, "config.lua"); runScript(PATH_SCRIPTS, "artpack.lua"); printf("[warning] defunct config file found, overriding using defaults\n"); } setSettingf("version", 0.70f); /* parse any comandline switches overrinding the loaded settings */ parse_args(argc, argv); /* sanity check some settings */ checkSettings(); /* intialize the settings cache, remember to do that everytime you change something */ updateSettingsCache(); } void initVideo(void) { videoInit(); runScript(PATH_SCRIPTS, "video.lua"); initVideoData(); consoleInit(); initArtpacks(); runScript(PATH_SCRIPTS, "menu.lua"); runScript(PATH_SCRIPTS, "menu_functions.lua"); setupDisplay(gScreen); } void initAudio(void) { audioInit(); runScript(PATH_SCRIPTS, "audio.lua"); /* probe for artpacks & songs */ Sound_initTracks(); Sound_setup(); } void initGame(void) { /* initialize the rest of the game's datastructures */ initGameStructures(); resetScores(); } void initInput(void) { inputInit(); gInput.mouse1 = 0; gInput.mouse2 = 0; gInput.mousex = 0; gInput.mousey = 0; } gltron-0.70/src/game/init_sdl.c0000644000076400001440000000204407704261416012106 #include "game/init.h" #include "SDL.h" #include int video_initialized = 0; void audioInit(void) { if(SDL_Init(SDL_INIT_AUDIO) < 0 ){ fprintf(stderr, "Couldn't initialize SDL audio: %s\n", SDL_GetError()); /* FIXME: disable sound system */ } } void videoInit(void) { if(SDL_Init(SDL_INIT_VIDEO) < 0 ) { fprintf(stderr, "Couldn't initialize SDL video: %s\n", SDL_GetError()); exit(1); /* OK: critical, no visual */ } else video_initialized = 1; } void inputInit(void) { /* keyboard */ SDL_EnableKeyRepeat(0, 0); /* turn keyrepeat off */ /* joystick */ if(SDL_Init(SDL_INIT_JOYSTICK) >= 0) { int i; SDL_Joystick *joy; int joysticks = SDL_NumJoysticks(); /* FIXME: why only two joysticks? */ /* joystick, currently at most 2 */ if(joysticks > 2) joysticks = 2; for(i = 0; i < joysticks; i++) { joy = SDL_JoystickOpen(i); } if(i) SDL_JoystickEventState(SDL_ENABLE); } else { const char *s = SDL_GetError(); fprintf(stderr, "[init] couldn't initialize joysticks: %s\n", s); } } gltron-0.70/src/game/menu.c0000644000076400001440000000707107766301733011257 #include "video/video.h" #include "Nebu_scripting.h" #include void drawMenu(Visual *d) { /* draw Menu pCurrent */ int i; int x, y, size, lineheight; int hsize, vsize; int max_label = 0; int max_data = 0; int nEntries; char pMenuName[200]; int iActiveItem; rasonly(d); #define MENU_TEXT_START_X 0.08 #define MENU_TEXT_START_Y 0.40 #define MENU_WIDTH 0.80 #define MENU_HEIGHT 0.40 #define MENU_TEXT_LINEHEIGHT 1.5 x = (int) (d->vp_w * MENU_TEXT_START_X); y = (int) (d->vp_h * MENU_TEXT_START_Y); /* obtain menu name */ scripting_Run("return Menu.current"); scripting_CopyStringResult(pMenuName, 200); /* obtain some information about the active menu */ scripting_RunFormat("return getn( Menu.%s.items )", pMenuName); scripting_GetIntegerResult(&nEntries); /* new stuff: calculate menu dimensions */ for(i = 0; i < nEntries; i++) { int len_label = 0; int len_data = 0; scripting_RunFormat("return strlen( Menu[Menu.%s.items[%d]].caption )", pMenuName, i + 1); scripting_GetIntegerResult(&len_label); len_label += 2; /* add ': ' */ scripting_RunFormat("return GetMenuValueWidth( Menu.%s.items[%d] )", pMenuName, i + 1); scripting_GetIntegerResult(&len_data); if(len_label > max_label) max_label = len_label; if(len_data > max_data) max_data = len_data; } /* adjust size so menu fits into MENU_WIDTH/HEIGHT */ hsize = (int) ((float)d->vp_w * MENU_WIDTH / (float) (max_label + max_data)); vsize = (int) ((float)d->vp_h * MENU_HEIGHT / ( (float)nEntries * MENU_TEXT_LINEHEIGHT)); size = (hsize < vsize) ? hsize : vsize; lineheight = (int)( (float) size * MENU_TEXT_LINEHEIGHT); /* printf("%d %d %d %d %d\n", x, y, size, maxw, pCurrent->nEntries); */ /* draw the entries */ scripting_Run("return Menu.active"); scripting_GetIntegerResult(&iActiveItem); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); for(i = 0; i < nEntries; i++) { if(i == iActiveItem - 1) { float color[4]; float active1[4]; float active2[4]; int j; float t; int time = SystemGetElapsedTime() & 4095; t = sinf( time * PI / 2048.0 ) / 2.0f + 0.5f; scripting_GetGlobal("menu_item_active1", NULL); scripting_GetFloatArrayResult(active1, 4); scripting_GetGlobal("menu_item_active2", NULL); scripting_GetFloatArrayResult(active2, 4); for(j = 0; j < 4; j++) { color[j] = t * active1[j] + (1 - t) * active2[j]; } glColor4fv(color); /* fprintf(stderr, "%.2f: %.2f %.2f %.2f\n", t, color[0], color[1], color[2]); */ } else { float color[4]; scripting_GetGlobal("menu_item", NULL); scripting_GetFloatArrayResult(color, 4); glColor4fv(color); } { char line_label[100]; char line_data[100]; scripting_RunFormat("return " "GetMenuValueString( Menu.%s.items[%d] )", pMenuName, i + 1); scripting_CopyStringResult(line_data, sizeof(line_data)); if(line_data[0] != 0) scripting_RunFormat("return " "Menu[Menu.%s.items[%d]].caption .. ': '", pMenuName, i + 1); else scripting_RunFormat("return " "Menu[Menu.%s.items[%d]].caption", pMenuName, i + 1); scripting_CopyStringResult(line_label, sizeof(line_label)); drawText(guiFtx, x, y, size, line_label); drawText(guiFtx, x + max_label * size, y, size, line_data); } /* if(i == pCurrent->iHighlight) drawSoftwareHighlight(x, y, size, ((Menu*)*(pCurrent->pEntries + i))->display.szCaption); */ y -= lineheight; } glDisable(GL_BLEND); } gltron-0.70/src/game/pause.c0000644000076400001440000000466507766643504011443 #include "game/gltron.h" /* very brief - just the pause mode */ void idlePause(void) { Sound_idle(); game2->time.dt = 0; doCameraMovement(); scripting_RunGC(); SystemPostRedisplay(); } void displayPause(void) { drawGame(); drawPause(gScreen); SystemSwapBuffers(); } void keyboardPause(int state, int key, int x, int y) { if(state == SYSTEM_KEYSTATE_UP) return; switch(key) { case 27: SystemExitLoop(RETURN_PAUSE_ESCAPE); break; case SYSTEM_KEY_F1: changeDisplay(0); break; case SYSTEM_KEY_F2: changeDisplay(1); break; case SYSTEM_KEY_F3: changeDisplay(2); break; case SYSTEM_KEY_F4: changeDisplay(3); break; case SYSTEM_KEY_F5: saveSettings(); break; case SYSTEM_KEY_F10: nextCameraType(); break; case SYSTEM_KEY_F11: doBmpScreenShot(gScreen); break; case SYSTEM_KEY_F12: doPngScreenShot(gScreen); break; case SYSTEM_KEY_UP: consoleScrollBackward(1); break; case SYSTEM_KEY_DOWN: consoleScrollForward(1); break; case SYSTEM_KEY_TAB: // SystemExitLoop(RETURN_MENU_PROMPT); break; default: if(game->pauseflag == PAUSE_GAME_FINISHED) initData(); /* lasttime = SystemGetElapsedTime(); */ SystemExitLoop(RETURN_GAME_UNPAUSE); break; } } void initPause(void) { SystemHidePointer(); SystemWarpPointer(MOUSE_ORIG_X, MOUSE_ORIG_Y); /* disable game sound effects */ Audio_DisableEngine(); /* * TODO: Provide an option to disable game music here. * Game should be totally silent in pause mode. (Nice when * the boss is walking by, phone call, etc...) */ /* set pause flag to suspended */ if (game->pauseflag != PAUSE_GAME_FINISHED) { game->pauseflag = PAUSE_GAME_SUSPENDED; } updateSettingsCache(); } void exitPause(void) { /* sound effects are re-enabled in enterGame() */ // Audio_EnableEngine(); } void initPauseGL(void) { initGLGame(); } Callbacks pauseCallbacks = { displayPause, idlePause, keyboardPause, initPause, exitPause, initPauseGL, gameMouse, gameMouseMotion, "pause" }; void keyboardPrompt(int state, int key, int x, int y) { if(state == SYSTEM_KEYSTATE_UP) return; switch(key) { case 27: case SYSTEM_KEY_TAB: SystemExitLoop(RETURN_PAUSE_ESCAPE); break; case SYSTEM_KEY_RETURN: /* promptEvaluate(); */ break; } } void initPrompt(void) { } void exitPrompt(void) { } Callbacks promptCallbacks = { displayPause, idlePause, keyboardPrompt, initPrompt, exitPrompt, NULL, NULL, NULL, "prompt" }; gltron-0.70/src/game/timedemo.c0000644000076400001440000000662507764076762012133 #include "game/gltron.h" static int startTime = 0; static int frames = 0; void idleTimedemo(void) { int t; int i, j; List *p, *l; Sound_idle(); game2->time.current += 20; for(j = 0; j < 2; j++) { // run display at a theoretical 50 Hz t = 10; // run game physics at 100 Hz game2->time.dt = 10; for(i = 0; i < game->players; i++) { if(game->player[i].ai != NULL) { if(game->player[i].ai->active == AI_COMPUTER && PLAYER_IS_ACTIVE(&game->player[i])) { doComputer(i, 0); } } } /* process any outstanding events generated by the AI (turns, etc) */ for(p = &(game2->events); p->next != NULL; p = p->next) { if(processEvent((GameEvent*) p->data)) return; } /* free events */ p = game2->events.next; while(p != NULL) { l = p; p = p->next; free(l); } game2->events.next = NULL; l = doMovement(1, t); /* this can generate new events */ if(l != NULL) { for(p = l; p->next != NULL; p = p->next) { if(processEvent((GameEvent*) p->data)); } } /* free list */ p = l; while(p != NULL) { l = p; p = p->next; free(l); } } game2->time.dt = 20; doCameraMovement(); doRecognizerMovement(); scripting_RunGC(); SystemPostRedisplay(); frames++; game2->time.lastFrame += 20; } void keyTimedemo(int state, int key, int x, int y) { if(state == SYSTEM_KEYSTATE_UP) return; if(key == 27) SystemExitLoop(RETURN_TIMEDEMO_ABORT); } struct { float speed; int eraseCrashed, grid_size; } saveRules; extern int c_resetCamera(); void initTimedemo(void) { int i = 0; printf("-- initializing timedemo\n"); frames = 0; startTime = SystemGetElapsedTime(); tsrand(12313); resetRecognizer(); updateSettingsCache(); // overwrite AI skills & rules in settingsCache gSettingsCache.ai_level = 2; gSettingsCache.show_ai_status = 0; gSettingsCache.show_fps = 0; gSettingsCache.camType = CAM_CIRCLE; gSettingsCache.show_console = 0; saveRules.speed = getSettingf("speed"); saveRules.eraseCrashed = getSettingi("erase_crashed"); saveRules.grid_size = getSettingi("grid_size"); setSettingf("speed", 12); setSettingi("erase_crashed", 1); setSettingi("grid_size", 200); game2->mode = GAME_SINGLE; initData(); changeDisplay(-1); for(i = 0; i < game->players; i++) { game->player[i].ai->active = AI_COMPUTER; // set all camera phi values to 0 game->player[i].camera->movement[CAM_PHI] = PI / 18; game->player[i].camera->movement[CAM_CHI] = PI / 3; } SystemHidePointer(); SystemWarpPointer(MOUSE_ORIG_X, MOUSE_ORIG_Y); game2->time.offset = SystemGetElapsedTime() - game2->time.current; } void exitTimedemo(void) { int dt = SystemGetElapsedTime() - startTime; if(dt) { displayMessage(TO_STDERR | TO_CONSOLE, "timedemo FPS: %.2f\n", (float) frames / dt * 1000.0f); // displayMessage(TO_STDERR | TO_CONSOLE, "timedemo FPS: %.2f (%d frames in %f seconds)\n", (float) frames / dt * 1000.0f, frames, dt / 1000.0f); } else { // displayMessage(TO_STDERR | TO_CONSOLE, "dt: %d, frames: %d\n", dt, frames); // actually, this would be a good reason to abort with a fatal error } setSettingf("speed", saveRules.speed); setSettingi("eraseCrashed", saveRules.eraseCrashed); setSettingi("grid_size", saveRules.grid_size); } Callbacks timedemoCallbacks = { displayGame, idleTimedemo, keyTimedemo, initTimedemo, exitTimedemo, initGLGame, NULL /* mouse button */, NULL /* mouse motion */, "timedemo" }; gltron-0.70/src/game/switchCallbacks.c0000644000076400001440000000337607704041045013405 #include "base/switchCallbacks.h" #include #include Callbacks *last_callback = NULL; Callbacks *current_callback = NULL; void exitCallback(Callbacks *cb) { if(cb != NULL) if(cb->exit != NULL) (cb->exit)(); /* give them the chance to quit */ } void initCallback(Callbacks *cb) { if(cb->init != NULL) (cb->init)(); if(cb->initGL != NULL) (cb->initGL)(); } void switchCallbacks(Callbacks *new) { // if(current_callback) // fprintf(stderr, "callbacks: exiting %s\n", current_callback->name); exitCallback(current_callback); SystemRegisterCallbacks(new); // fprintf(stderr, "callbacks: initializing %s\n", new->name); initCallback(new); last_callback = current_callback; current_callback = new; } void updateCallbacks(void) { /* called when the window is recreated */ exitCallback(current_callback); SystemRegisterCallbacks(current_callback); initCallback(current_callback); } void restoreCallbacks(void) { if(last_callback == NULL) { fprintf(stderr, "fatal: no last callback present, exiting\n"); exit(1); // OK: programmer error, critical } exitCallback(last_callback); current_callback = last_callback; SystemRegisterCallbacks(current_callback); initCallback(current_callback); } #define N_CALLBACKS 7 Callbacks *callbackList[N_CALLBACKS] = { &gameCallbacks, &guiCallbacks, &pauseCallbacks, &configureCallbacks, &promptCallbacks, &creditsCallbacks, &timedemoCallbacks }; void setCallback(const char *name) { int i; for(i = 0; i < N_CALLBACKS; i++) { if(strcmp( callbackList[i]->name, name ) == 0) break; } if(i == N_CALLBACKS) { fprintf(stderr, "fatal: no callback named '%s' found\n", name); exit(1); // OK: programmer error, critical } switchCallbacks(callbackList[i]); } gltron-0.70/src/game/scripting_interface.c0000644000076400001440000000573107764076762014347 #include "game/gltron.h" #include "base/switchCallbacks.h" #include "scripting/nebu_scripting.h" #include "audio/audio.h" #include "lua.h" #include "lualib.h" int c_quitGame(lua_State *L) { saveSettings(); SystemExitLoop(RETURN_CREDITS); return 0; } int c_resetGame(lua_State *L) { initData(); return 0; } int c_resetScores(lua_State *L) { resetScores(); return 0; } int c_resetCamera(lua_State *L) { int i; int camType; Camera *cam; Data *data; for(i = 0; i < game->players; i++) { cam = game->player[i].camera; data = game->player[i].data; camType = (game->player[i].ai->active == AI_COMPUTER) ? 0 : getSettingi("camType"); initCamera(cam, data, camType); } return 0; } int c_video_restart(lua_State *L) { initGameScreen(); shutdownDisplay( gScreen ); setupDisplay( gScreen ); updateCallbacks(); changeDisplay(-1); return 0; } int c_update_settings_cache(lua_State *L) { updateSettingsCache(); return 0; } int c_update_audio_volume(lua_State *L) { Sound_setMusicVolume(getSettingf("musicVolume")); Sound_setFxVolume(getSettingf("fxVolume")); return 0; } int c_startGame(lua_State *L) { game2->mode = GAME_SINGLE; initData(); changeDisplay(-1); SystemExitLoop(RETURN_GAME_LAUNCH); return 0; } int c_reloadTrack(lua_State *L) { Sound_reloadTrack(); return 0; } int c_reloadArtpack(lua_State *L) { reloadArt(); return 0; } int c_configureKeyboard(lua_State *L) { SystemExitLoop(RETURN_GUI_PROMPT); return 0; } int c_getKeyName(lua_State *L) { int top = lua_gettop(L); if(lua_isnumber(L, top)) { lua_pushstring(L, SystemGetKeyName( (int) lua_tonumber(L, top) )); } else { lua_pushstring(L, "error"); } return 1; } int c_timedemo(lua_State *L) { SystemExitLoop(RETURN_TIMEDEMO); return 0; } int c_SetCallback(lua_State *L) { const char *name; int top = lua_gettop(L); if(lua_isstring(L, top)) { name = lua_tostring(L, top); setCallback(name); // printf("enabling callback-set '%s'\n", name); } return 0; } int c_SystemMainLoop(lua_State *L) { int value = SystemMainLoop(); lua_pushnumber(L, value); return 1; } void init_c_interface(void) { scripting_Register("c_quitGame", c_quitGame); scripting_Register("c_resetGame", c_resetGame); scripting_Register("c_resetScores", c_resetScores); scripting_Register("c_resetCamera", c_resetCamera); scripting_Register("c_video_restart", c_video_restart); scripting_Register("c_update_settings_cache", c_update_settings_cache); scripting_Register("c_update_audio_volume", c_update_audio_volume); scripting_Register("c_startGame", c_startGame); scripting_Register("c_reloadTrack", c_reloadTrack); scripting_Register("c_reloadArtpack", c_reloadArtpack); scripting_Register("c_configureKeyboard", c_configureKeyboard); scripting_Register("c_getKeyName", c_getKeyName); scripting_Register("c_timedemo", c_timedemo); scripting_Register("SystemMainLoop", c_SystemMainLoop); scripting_Register("SetCallback", c_SetCallback); } gltron-0.70/lua/0000777000076400001440000000000007767023545007312 5gltron-0.70/lua/README0000644000076400001440000000627007432712643010104 This is Lua 4.0. See HISTORY for a summary of changes since the last version. * What is Lua? ------------ Lua is a powerful, light-weight programming language designed for extending applications. Lua is also frequently used as a general-purpose, stand-alone language. Lua combines simple procedural syntax (similar to Pascal) with powerful data description constructs based on associative arrays and extensible semantics. Lua is dynamically typed, interpreted from bytecodes, and has automatic memory management, making it ideal for configuration, scripting, and rapid prototyping. Lua is a language engine that you can embed into your application. This means that, besides syntax and semantics, Lua has an API that allows the application to exchange data with Lua programs and also to extend Lua with C functions. In this sense, Lua can be regarded as a language framework for building domain-specific languages. Lua is implemented as a small library of C functions, written in ANSI C, and compiles unmodified in all known platforms. The implementation goals are simplicity, efficiency, portability, and low embedding cost. The result is a fast language engine with small footprint, making it ideal in embedded systems too. Lua was awarded the first prize (technological category) in the Second Compaq Award for Research and Development in Computer Science in 1997. This award was a joint venture of Compaq Computer in Brazil, the Brazilian Ministry of Science and Technology, and the Brazilian Academy of Sciences. Lua has been used in many different projects around the world. For a short list, see http://www.tecgraf.puc-rio.br/lua/uses.html . * Availability ------------ Lua is freely available for both academic and commercial purposes and can be downloaded from the sites below. See COPYRIGHT for details. Home page: http://www.tecgraf.puc-rio.br/lua/ http://csg.uwaterloo.ca/~lhf/lua/ In Brazil: ftp://ftp.tecgraf.puc-rio.br/pub/lua/ In Canada: ftp://csg.uwaterloo.ca/pub/lhf/lua/ In the US: ftp://ftp.freesoftware.com/pub/languages/lua/ In Germany: ftp://ftp.uni-trier.de/pub/languages/lua/ In Germany: ftp://ftp.gwdg.de/pub/languages/lua/ In Greece: ftp://ftp.ntua.gr/pub/lang/lua/ In Japan: ftp://ftp.u-aizu.ac.jp/pub/lang/lua/ In Denmark: ftp://ftp.ucore.com/lua/dist * Installation ------------ See INSTALL. * Contacting the authors ---------------------- Lua was designed and implemented by Waldemar Celes, Roberto Ierusalimschy and Luiz Henrique de Figueiredo. They can be contacted by email at lua@tecgraf.puc-rio.br. Send your comments, questions, and bug reports to lua@tecgraf.puc-rio.br. For reporting bugs, try also the mailing list: lua-l@tecgraf.puc-rio.br. For more information about this list, including instructions on how to subscribe, see http://www.tecgraf.puc-rio.br/lua/lua-l.html . Lua is developed at TeCGraf, the Computer Graphics Technology Group of PUC-Rio (the Pontifical Catholic University of Rio de Janeiro in Brazil). TeCGraf is a laboratory of the Department of Computer Science. Dozens of industrial products developed by TeCGraf use Lua. (end of README) gltron-0.70/lua/Makefile.am0000644000076400001440000000002407432747473011260 SUBDIRS=src include gltron-0.70/lua/Makefile.in0000644000076400001440000002201507767023244011267 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ SUBDIRS = src include subdir = lua mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ uninstall-info-recursive all-recursive install-data-recursive \ install-exec-recursive installdirs-recursive install-recursive \ uninstall-recursive check-recursive installcheck-recursive DIST_COMMON = README Makefile.am Makefile.in DIST_SUBDIRS = $(SUBDIRS) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign lua/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = .. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done for subdir in $(SUBDIRS); do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ clean-generic clean-recursive distclean distclean-generic \ distclean-recursive distclean-tags distdir dvi dvi-am \ dvi-recursive info info-am info-recursive install install-am \ install-data install-data-am install-data-recursive \ install-exec install-exec-am install-exec-recursive \ install-info install-info-am install-info-recursive install-man \ install-recursive install-strip installcheck installcheck-am \ installdirs installdirs-am installdirs-recursive \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-recursive tags tags-recursive uninstall \ uninstall-am uninstall-info-am uninstall-info-recursive \ uninstall-recursive # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/lua/src/0000777000076400001440000000000007767023545010101 5gltron-0.70/lua/src/lapi.h0000644000076400001440000000044707432712643011111 /* ** $Id: lapi.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Auxiliary functions from Lua API ** See Copyright Notice in lua.h */ #ifndef lapi_h #define lapi_h #include "lobject.h" TObject *luaA_index (lua_State *L, int index); void luaA_pushobject (lua_State *L, const TObject *o); #endif gltron-0.70/lua/src/lcode.h0000644000076400001440000000362407432712643011252 /* ** $Id: lcode.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Code generator for Lua ** See Copyright Notice in lua.h */ #ifndef lcode_h #define lcode_h #include "llex.h" #include "lobject.h" #include "lopcodes.h" #include "lparser.h" /* ** Marks the end of a patch list. It is an invalid value both as an absolute ** address, and as a list link (would link an element to itself). */ #define NO_JUMP (-1) /* ** grep "ORDER OPR" if you change these enums */ typedef enum BinOpr { OPR_ADD, OPR_SUB, OPR_MULT, OPR_DIV, OPR_POW, OPR_CONCAT, OPR_NE, OPR_EQ, OPR_LT, OPR_LE, OPR_GT, OPR_GE, OPR_AND, OPR_OR, OPR_NOBINOPR } BinOpr; typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_NOUNOPR } UnOpr; enum Mode {iO, iU, iS, iAB}; /* instruction format */ #define VD 100 /* flag for variable delta */ extern const struct OpProperties { char mode; unsigned char push; unsigned char pop; } luaK_opproperties[]; void luaK_error (LexState *ls, const char *msg); int luaK_code0 (FuncState *fs, OpCode o); int luaK_code1 (FuncState *fs, OpCode o, int arg1); int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2); int luaK_jump (FuncState *fs); void luaK_patchlist (FuncState *fs, int list, int target); void luaK_concat (FuncState *fs, int *l1, int l2); void luaK_goiftrue (FuncState *fs, expdesc *v, int keepvalue); int luaK_getlabel (FuncState *fs); void luaK_deltastack (FuncState *fs, int delta); void luaK_kstr (LexState *ls, int c); void luaK_number (FuncState *fs, Number f); void luaK_adjuststack (FuncState *fs, int n); int luaK_lastisopen (FuncState *fs); void luaK_setcallreturns (FuncState *fs, int nresults); void luaK_tostack (LexState *ls, expdesc *v, int onlyone); void luaK_storevar (LexState *ls, const expdesc *var); void luaK_prefix (LexState *ls, UnOpr op, expdesc *v); void luaK_infix (LexState *ls, BinOpr op, expdesc *v); void luaK_posfix (LexState *ls, BinOpr op, expdesc *v1, expdesc *v2); #endif gltron-0.70/lua/src/ldebug.h0000644000076400001440000000073707432712643011430 /* ** $Id: ldebug.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Auxiliary functions from Debug Interface module ** See Copyright Notice in lua.h */ #ifndef ldebug_h #define ldebug_h #include "lstate.h" #include "luadebug.h" void luaG_typeerror (lua_State *L, StkId o, const char *op); void luaG_binerror (lua_State *L, StkId p1, int t, const char *op); int luaG_getline (int *lineinfo, int pc, int refline, int *refi); void luaG_ordererror (lua_State *L, StkId top); #endif gltron-0.70/lua/src/ldo.h0000644000076400001440000000155107432712643010737 /* ** $Id: ldo.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Stack and Call structure of Lua ** See Copyright Notice in lua.h */ #ifndef ldo_h #define ldo_h #include "lobject.h" #include "lstate.h" /* ** macro to increment stack top. ** There must be always an empty slot at the L->stack.top */ #define incr_top {if (L->top == L->stack_last) luaD_checkstack(L, 1); L->top++;} void luaD_init (lua_State *L, int stacksize); void luaD_adjusttop (lua_State *L, StkId base, int extra); void luaD_lineHook (lua_State *L, StkId func, int line, lua_Hook linehook); void luaD_call (lua_State *L, StkId func, int nResults); void luaD_callTM (lua_State *L, Closure *f, int nParams, int nResults); void luaD_checkstack (lua_State *L, int n); void luaD_breakrun (lua_State *L, int errcode); int luaD_runprotected (lua_State *L, void (*f)(lua_State *, void *), void *ud); #endif gltron-0.70/lua/src/lfunc.h0000644000076400001440000000103307432712643011263 /* ** $Id: lfunc.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Auxiliary functions to manipulate prototypes and closures ** See Copyright Notice in lua.h */ #ifndef lfunc_h #define lfunc_h #include "lobject.h" Proto *luaF_newproto (lua_State *L); void luaF_protook (lua_State *L, Proto *f, int pc); Closure *luaF_newclosure (lua_State *L, int nelems); void luaF_freeproto (lua_State *L, Proto *f); void luaF_freeclosure (lua_State *L, Closure *c); const char *luaF_getlocalname (const Proto *func, int local_number, int pc); #endif gltron-0.70/lua/src/lgc.h0000644000076400001440000000044607513504760010727 /* ** $Id: lgc.h,v 1.2 2002/07/12 07:49:04 jcatki Exp $ ** Garbage Collector ** See Copyright Notice in lua.h */ #ifndef lgc_h #define lgc_h #include "lobject.h" void luaC_collect (lua_State *L, int all); void luaC_collectgarbage (lua_State *L); void luaC_checkGC (lua_State *L); #endif gltron-0.70/lua/src/llex.h0000644000076400001440000000345107432712643011126 /* ** $Id: llex.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Lexical Analyzer ** See Copyright Notice in lua.h */ #ifndef llex_h #define llex_h #include "lobject.h" #include "lzio.h" #define FIRST_RESERVED 257 /* maximum length of a reserved word (+1 for final 0) */ #define TOKEN_LEN 15 /* * WARNING: if you change the order of this enumeration, * grep "ORDER RESERVED" */ enum RESERVED { /* terminal symbols denoted by reserved words */ TK_AND = FIRST_RESERVED, TK_BREAK, TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FOR, TK_FUNCTION, TK_IF, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, TK_RETURN, TK_THEN, TK_UNTIL, TK_WHILE, /* other terminal symbols */ TK_NAME, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER, TK_STRING, TK_EOS }; /* number of reserved words */ #define NUM_RESERVED ((int)(TK_WHILE-FIRST_RESERVED+1)) typedef union { Number r; TString *ts; } SemInfo; /* semantics information */ typedef struct Token { int token; SemInfo seminfo; } Token; typedef struct LexState { int current; /* current character */ Token t; /* current token */ Token lookahead; /* look ahead token */ struct FuncState *fs; /* `FuncState' is private to the parser */ struct lua_State *L; struct zio *z; /* input stream */ int linenumber; /* input line counter */ int lastline; /* line of last token `consumed' */ TString *source; /* current source name */ } LexState; void luaX_init (lua_State *L); void luaX_setinput (lua_State *L, LexState *LS, ZIO *z, TString *source); int luaX_lex (LexState *LS, SemInfo *seminfo); void luaX_checklimit (LexState *ls, int val, int limit, const char *msg); void luaX_syntaxerror (LexState *ls, const char *s, const char *token); void luaX_error (LexState *ls, const char *s, int token); void luaX_token2str (int token, char *s); #endif gltron-0.70/lua/src/llimits.h0000644000076400001440000001065607432712643011644 /* ** $Id: llimits.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Limits, basic types, and some other "installation-dependent" definitions ** See Copyright Notice in lua.h */ #ifndef llimits_h #define llimits_h #include #include /* ** try to find number of bits in an integer */ #ifndef BITS_INT /* avoid overflows in comparison */ #if INT_MAX-20 < 32760 #define BITS_INT 16 #else #if INT_MAX > 2147483640L /* machine has at least 32 bits */ #define BITS_INT 32 #else #error "you must define BITS_INT with number of bits in an integer" #endif #endif #endif /* ** Define the type `number' of Lua ** GREP LUA_NUMBER to change that */ #ifndef LUA_NUM_TYPE #define LUA_NUM_TYPE double #endif typedef LUA_NUM_TYPE Number; /* function to convert a Number to a string */ #define NUMBER_FMT "%.16g" /* LUA_NUMBER */ #define lua_number2str(s,n) sprintf((s), NUMBER_FMT, (n)) /* function to convert a string to a Number */ #define lua_str2number(s,p) strtod((s), (p)) typedef unsigned long lint32; /* unsigned int with at least 32 bits */ #define MAX_SIZET ((size_t)(~(size_t)0)-2) #define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */ /* ** conversion of pointer to int (for hashing only) ** (the shift removes bits that are usually 0 because of alignment) */ #define IntPoint(p) (((unsigned long)(p)) >> 3) #define MINPOWER2 4 /* minimum size for "growing" vectors */ #ifndef DEFAULT_STACK_SIZE #define DEFAULT_STACK_SIZE 1024 #endif /* type to ensure maximum alignment */ union L_Umaxalign { double d; char *s; long l; }; /* ** type for virtual-machine instructions ** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) ** For a very small machine, you may change that to 2 bytes (and adjust ** the following limits accordingly) */ typedef unsigned long Instruction; /* ** size and position of opcode arguments. ** For an instruction with 2 bytes, size is 16, and size_b can be 5 ** (accordingly, size_u will be 10, and size_a will be 5) */ #define SIZE_INSTRUCTION 32 #define SIZE_B 9 #define SIZE_OP 6 #define SIZE_U (SIZE_INSTRUCTION-SIZE_OP) #define POS_U SIZE_OP #define POS_B SIZE_OP #define SIZE_A (SIZE_INSTRUCTION-(SIZE_OP+SIZE_B)) #define POS_A (SIZE_OP+SIZE_B) /* ** limits for opcode arguments. ** we use (signed) int to manipulate most arguments, ** so they must fit in BITS_INT-1 bits (-1 for sign) */ #if SIZE_U < BITS_INT-1 #define MAXARG_U ((1<>1) /* `S' is signed */ #else #define MAXARG_U MAX_INT #define MAXARG_S MAX_INT #endif #if SIZE_A < BITS_INT-1 #define MAXARG_A ((1< MAXARG_B #undef MAXSTACK #define MAXSTACK MAXARG_B #endif /* maximum number of local variables */ #ifndef MAXLOCALS #define MAXLOCALS 200 /* arbitrary limit (=MAXSTACK #undef MAXLOCALS #define MAXLOCALS (MAXSTACK-1) #endif /* maximum number of upvalues */ #ifndef MAXUPVALUES #define MAXUPVALUES 32 /* arbitrary limit (<=MAXARG_B) */ #endif #if MAXUPVALUES>MAXARG_B #undef MAXUPVALUES #define MAXUPVALUES MAXARG_B #endif /* maximum number of variables in the left side of an assignment */ #ifndef MAXVARSLH #define MAXVARSLH 100 /* arbitrary limit (=MULT_RET #undef MAXVARSLH #define MAXVARSLH (MULT_RET-1) #endif /* maximum number of parameters in a function */ #ifndef MAXPARAMS #define MAXPARAMS 100 /* arbitrary limit (=MAXLOCALS #undef MAXPARAMS #define MAXPARAMS (MAXLOCALS-1) #endif /* number of list items to accumulate before a SETLIST instruction */ #define LFIELDS_PER_FLUSH 64 #if LFIELDS_PER_FLUSH>(MAXSTACK/4) #undef LFIELDS_PER_FLUSH #define LFIELDS_PER_FLUSH (MAXSTACK/4) #endif /* number of record items to accumulate before a SETMAP instruction */ /* (each item counts 2 elements on the stack: an index and a value) */ #define RFIELDS_PER_FLUSH (LFIELDS_PER_FLUSH/2) /* maximum lookback to find a real constant (for code generation) */ #ifndef LOOKBACKNUMS #define LOOKBACKNUMS 20 /* arbitrary constant */ #endif #endif gltron-0.70/lua/src/lmem.h0000644000076400001440000000207707432712643011117 /* ** $Id: lmem.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Interface to Memory Manager ** See Copyright Notice in lua.h */ #ifndef lmem_h #define lmem_h #include #include "llimits.h" #include "lua.h" void *luaM_realloc (lua_State *L, void *oldblock, lint32 size); void *luaM_growaux (lua_State *L, void *block, size_t nelems, int inc, size_t size, const char *errormsg, size_t limit); #define luaM_free(L, b) luaM_realloc(L, (b), 0) #define luaM_malloc(L, t) luaM_realloc(L, NULL, (t)) #define luaM_new(L, t) ((t *)luaM_malloc(L, sizeof(t))) #define luaM_newvector(L, n,t) ((t *)luaM_malloc(L, (n)*(lint32)sizeof(t))) #define luaM_growvector(L, v,nelems,inc,t,e,l) \ ((v)=(t *)luaM_growaux(L, v,nelems,inc,sizeof(t),e,l)) #define luaM_reallocvector(L, v,n,t) \ ((v)=(t *)luaM_realloc(L, v,(n)*(lint32)sizeof(t))) #ifdef LUA_DEBUG extern unsigned long memdebug_numblocks; extern unsigned long memdebug_total; extern unsigned long memdebug_maxmem; extern unsigned long memdebug_memlimit; #endif #endif gltron-0.70/lua/src/lobject.h0000644000076400001440000001125107432712643011601 /* ** $Id: lobject.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Type definitions for Lua objects ** See Copyright Notice in lua.h */ #ifndef lobject_h #define lobject_h #include "llimits.h" #include "lua.h" #ifdef LUA_DEBUG #undef NDEBUG #include #define LUA_INTERNALERROR(s) assert(((void)s,0)) #define LUA_ASSERT(c,s) assert(((void)s,(c))) #else #define LUA_INTERNALERROR(s) /* empty */ #define LUA_ASSERT(c,s) /* empty */ #endif #ifdef LUA_DEBUG /* to avoid warnings, and make sure value is really unused */ #define UNUSED(x) (x=0, (void)(x)) #else #define UNUSED(x) ((void)(x)) /* to avoid warnings */ #endif /* mark for closures active in the stack */ #define LUA_TMARK 6 /* tags for values visible from Lua == first user-created tag */ #define NUM_TAGS 6 /* check whether `t' is a mark */ #define is_T_MARK(t) ((t) == LUA_TMARK) typedef union { struct TString *ts; /* LUA_TSTRING, LUA_TUSERDATA */ struct Closure *cl; /* LUA_TFUNCTION */ struct Hash *a; /* LUA_TTABLE */ struct CallInfo *i; /* LUA_TLMARK */ Number n; /* LUA_TNUMBER */ } Value; /* Macros to access values */ #define ttype(o) ((o)->ttype) #define nvalue(o) ((o)->value.n) #define tsvalue(o) ((o)->value.ts) #define clvalue(o) ((o)->value.cl) #define hvalue(o) ((o)->value.a) #define infovalue(o) ((o)->value.i) #define svalue(o) (tsvalue(o)->str) typedef struct lua_TObject { int ttype; Value value; } TObject; /* ** String headers for string table */ /* ** most `malloc' libraries allocate memory in blocks of 8 bytes. TSPACK ** tries to make sizeof(TString) a multiple of this granularity, to reduce ** waste of space. */ #define TSPACK ((int)sizeof(int)) typedef struct TString { union { struct { /* for strings */ unsigned long hash; int constindex; /* hint to reuse constants */ } s; struct { /* for userdata */ int tag; void *value; } d; } u; size_t len; struct TString *nexthash; /* chain for hash table */ int marked; char str[TSPACK]; /* variable length string!! must be the last field! */ } TString; /* ** Function Prototypes */ typedef struct Proto { Number *knum; /* Number numbers used by the function */ int nknum; /* size of `knum' */ struct TString **kstr; /* strings used by the function */ int nkstr; /* size of `kstr' */ struct Proto **kproto; /* functions defined inside the function */ int nkproto; /* size of `kproto' */ Instruction *code; int ncode; /* size of `code'; when 0 means an incomplete `Proto' */ short numparams; short is_vararg; short maxstacksize; short marked; struct Proto *next; /* debug information */ int *lineinfo; /* map from opcodes to source lines */ int nlineinfo; /* size of `lineinfo' */ int nlocvars; struct LocVar *locvars; /* information about local variables */ int lineDefined; TString *source; } Proto; typedef struct LocVar { TString *varname; int startpc; /* first point where variable is active */ int endpc; /* first point where variable is dead */ } LocVar; /* ** Closures */ typedef struct Closure { union { lua_CFunction c; /* C functions */ struct Proto *l; /* Lua functions */ } f; struct Closure *next; struct Closure *mark; /* marked closures (point to itself when not marked) */ short isC; /* 0 for Lua functions, 1 for C functions */ short nupvalues; TObject upvalue[1]; } Closure; #define iscfunction(o) (ttype(o) == LUA_TFUNCTION && clvalue(o)->isC) typedef struct Node { TObject key; TObject val; struct Node *next; /* for chaining */ } Node; typedef struct Hash { Node *node; int htag; int size; Node *firstfree; /* this position is free; all positions after it are full */ struct Hash *next; struct Hash *mark; /* marked tables (point to itself when not marked) */ } Hash; /* unmarked tables and closures are represented by pointing `mark' to ** themselves */ #define ismarked(x) ((x)->mark != (x)) /* ** informations about a call (for debugging) */ typedef struct CallInfo { struct Closure *func; /* function being called */ const Instruction **pc; /* current pc of called function */ int lastpc; /* last pc traced */ int line; /* current line */ int refi; /* current index in `lineinfo' */ } CallInfo; extern const TObject luaO_nilobject; extern const char *const luaO_typenames[]; #define luaO_typename(o) (luaO_typenames[ttype(o)]) lint32 luaO_power2 (lint32 n); char *luaO_openspace (lua_State *L, size_t n); int luaO_equalObj (const TObject *t1, const TObject *t2); int luaO_str2d (const char *s, Number *result); void luaO_verror (lua_State *L, const char *fmt, ...); void luaO_chunkid (char *out, const char *source, int len); #endif gltron-0.70/lua/src/lopcodes.h0000644000076400001440000001232207432712643011767 /* ** $Id: lopcodes.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Opcodes for Lua virtual machine ** See Copyright Notice in lua.h */ #ifndef lopcodes_h #define lopcodes_h #include "llimits.h" /*=========================================================================== We assume that instructions are unsigned numbers. All instructions have an opcode in the first 6 bits. Moreover, an instruction can have 0, 1, or 2 arguments. Instructions can have the following types: type 0: no arguments type 1: 1 unsigned argument in the higher bits (called `U') type 2: 1 signed argument in the higher bits (`S') type 3: 1st unsigned argument in the higher bits (`A') 2nd unsigned argument in the middle bits (`B') A signed argument is represented in excess K; that is, the number value is the unsigned value minus K. K is exactly the maximum value for that argument (so that -max is represented by 0, and +max is represented by 2*max), which is half the maximum for the corresponding unsigned argument. The size of each argument is defined in `llimits.h'. The usual is an instruction with 32 bits, U arguments with 26 bits (32-6), B arguments with 9 bits, and A arguments with 17 bits (32-6-9). For small installations, the instruction size can be 16, so U has 10 bits, and A and B have 5 bits each. ===========================================================================*/ /* creates a mask with `n' 1 bits at position `p' */ #define MASK1(n,p) ((~((~(Instruction)0)<>POS_U)) #define SETARG_U(i,u) ((i) = (((i)&MASK0(SIZE_U,POS_U)) | \ ((Instruction)(u)<>POS_A)) #define SETARG_A(i,a) ((i) = (((i)&MASK0(SIZE_A,POS_A)) | \ ((Instruction)(a)<>POS_B) & MASK1(SIZE_B,0))) #define SETARG_B(i,b) ((i) = (((i)&MASK0(SIZE_B,POS_B)) | \ ((Instruction)(b)<y)? PC+=s */ OP_JMPGE,/* J y x - (x>=y)? PC+=s */ OP_JMPT,/* J x - (x~=nil)? PC+=s */ OP_JMPF,/* J x - (x==nil)? PC+=s */ OP_JMPONT,/* J x (x~=nil)? x : - (x~=nil)? PC+=s */ OP_JMPONF,/* J x (x==nil)? x : - (x==nil)? PC+=s */ OP_JMP,/* J - - PC+=s */ OP_PUSHNILJMP,/* - - nil PC++; */ OP_FORPREP,/* J */ OP_FORLOOP,/* J */ OP_LFORPREP,/* J */ OP_LFORLOOP,/* J */ OP_CLOSURE/* A B v_b-v_1 closure(KPROTO[a], v_1-v_b) */ } OpCode; #define NUM_OPCODES ((int)OP_CLOSURE+1) #define ISJUMP(o) (OP_JMPNE <= (o) && (o) <= OP_JMP) /* special code to fit a LUA_MULTRET inside an argB */ #define MULT_RET 255 /* (<=MAXARG_B) */ #if MULT_RET>MAXARG_B #undef MULT_RET #define MULT_RET MAXARG_B #endif #endif gltron-0.70/lua/src/lparser.h0000644000076400001440000000271707432712643011636 /* ** $Id: lparser.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** LL(1) Parser and code generator for Lua ** See Copyright Notice in lua.h */ #ifndef lparser_h #define lparser_h #include "lobject.h" #include "lzio.h" /* ** Expression descriptor */ typedef enum { VGLOBAL, VLOCAL, VINDEXED, VEXP } expkind; typedef struct expdesc { expkind k; union { int index; /* VGLOBAL: `kstr' index of global name; VLOCAL: stack index */ struct { int t; /* patch list of `exit when true' */ int f; /* patch list of `exit when false' */ } l; } u; } expdesc; /* state needed to generate code for a given function */ typedef struct FuncState { Proto *f; /* current function header */ struct FuncState *prev; /* enclosing function */ struct LexState *ls; /* lexical state */ struct lua_State *L; /* copy of the Lua state */ int pc; /* next position to code */ int lasttarget; /* `pc' of last `jump target' */ int jlt; /* list of jumps to `lasttarget' */ short stacklevel; /* number of values on activation register */ short nactloc; /* number of active local variables */ short nupvalues; /* number of upvalues */ int lastline; /* line where last `lineinfo' was generated */ struct Breaklabel *bl; /* chain of breakable blocks */ expdesc upvalues[MAXUPVALUES]; /* upvalues */ int actloc[MAXLOCALS]; /* local-variable stack (indices to locvars) */ } FuncState; Proto *luaY_parser (lua_State *L, ZIO *z); #endif gltron-0.70/lua/src/lstate.h0000644000076400001440000000350107432712643011452 /* ** $Id: lstate.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Global State ** See Copyright Notice in lua.h */ #ifndef lstate_h #define lstate_h #include "lobject.h" #include "lua.h" #include "luadebug.h" typedef TObject *StkId; /* index to stack elements */ /* ** marks for Reference array */ #define NONEXT -1 /* to end the free list */ #define HOLD -2 #define COLLECTED -3 #define LOCK -4 struct Ref { TObject o; int st; /* can be LOCK, HOLD, COLLECTED, or next (for free list) */ }; struct lua_longjmp; /* defined in ldo.c */ struct TM; /* defined in ltm.h */ typedef struct stringtable { int size; lint32 nuse; /* number of elements */ TString **hash; } stringtable; struct lua_State { /* thread-specific state */ StkId top; /* first free slot in the stack */ StkId stack; /* stack base */ StkId stack_last; /* last free slot in the stack */ int stacksize; StkId Cbase; /* base for current C function */ struct lua_longjmp *errorJmp; /* current error recover point */ char *Mbuffer; /* global buffer */ size_t Mbuffsize; /* size of Mbuffer */ /* global state */ Proto *rootproto; /* list of all prototypes */ Closure *rootcl; /* list of all closures */ Hash *roottable; /* list of all tables */ stringtable strt; /* hash table for strings */ stringtable udt; /* hash table for udata */ Hash *gt; /* table for globals */ struct TM *TMtable; /* table for tag methods */ int last_tag; /* last used tag in TMtable */ struct Ref *refArray; /* locked objects */ int refSize; /* size of refArray */ int refFree; /* list of free positions in refArray */ unsigned long GCthreshold; unsigned long nblocks; /* number of `bytes' currently allocated */ lua_Hook callhook; lua_Hook linehook; int allowhooks; }; #endif gltron-0.70/lua/src/lstring.h0000644000076400001440000000166007432712643011644 /* ** $Id: lstring.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** String table (keep all strings handled by Lua) ** See Copyright Notice in lua.h */ #ifndef lstring_h #define lstring_h #include "lobject.h" #include "lstate.h" /* ** any TString with mark>=FIXMARK is never collected. ** Marks>=RESERVEDMARK are used to identify reserved words. */ #define FIXMARK 2 #define RESERVEDMARK 3 #define sizestring(l) ((long)sizeof(TString) + \ ((long)(l+1)-TSPACK)*(long)sizeof(char)) void luaS_init (lua_State *L); void luaS_resize (lua_State *L, stringtable *tb, int newsize); TString *luaS_newudata (lua_State *L, size_t s, void *udata); TString *luaS_createudata (lua_State *L, void *udata, int tag); void luaS_freeall (lua_State *L); TString *luaS_newlstr (lua_State *L, const char *str, size_t l); TString *luaS_new (lua_State *L, const char *str); TString *luaS_newfixed (lua_State *L, const char *str); #endif gltron-0.70/lua/src/ltable.h0000644000076400001440000000204707432712643011425 /* ** $Id: ltable.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Lua tables (hash) ** See Copyright Notice in lua.h */ #ifndef ltable_h #define ltable_h #include "lobject.h" #define node(t,i) (&(t)->node[i]) #define key(n) (&(n)->key) #define val(n) (&(n)->val) Hash *luaH_new (lua_State *L, int nhash); void luaH_free (lua_State *L, Hash *t); const TObject *luaH_get (lua_State *L, const Hash *t, const TObject *key); const TObject *luaH_getnum (const Hash *t, Number key); const TObject *luaH_getstr (const Hash *t, TString *key); void luaH_remove (Hash *t, TObject *key); TObject *luaH_set (lua_State *L, Hash *t, const TObject *key); Node * luaH_next (lua_State *L, const Hash *t, const TObject *r); TObject *luaH_setint (lua_State *L, Hash *t, int key); void luaH_setstrnum (lua_State *L, Hash *t, TString *key, Number val); unsigned long luaH_hash (lua_State *L, const TObject *key); const TObject *luaH_getglobal (lua_State *L, const char *name); /* exported only for debugging */ Node *luaH_mainposition (const Hash *t, const TObject *key); #endif gltron-0.70/lua/src/ltm.h0000644000076400001440000000204007432712643010747 /* ** $Id: ltm.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Tag methods ** See Copyright Notice in lua.h */ #ifndef ltm_h #define ltm_h #include "lobject.h" #include "lstate.h" /* * WARNING: if you change the order of this enumeration, * grep "ORDER TM" */ typedef enum { TM_GETTABLE = 0, TM_SETTABLE, TM_INDEX, TM_GETGLOBAL, TM_SETGLOBAL, TM_ADD, TM_SUB, TM_MUL, TM_DIV, TM_POW, TM_UNM, TM_LT, TM_CONCAT, TM_GC, TM_FUNCTION, TM_N /* number of elements in the enum */ } TMS; struct TM { Closure *method[TM_N]; TString *collected; /* list of garbage-collected udata with this tag */ }; #define luaT_gettm(L,tag,event) (L->TMtable[tag].method[event]) #define luaT_gettmbyObj(L,o,e) (luaT_gettm((L),luaT_tag(o),(e))) #define validtag(t) (NUM_TAGS <= (t) && (t) <= L->last_tag) extern const char *const luaT_eventname[]; void luaT_init (lua_State *L); void luaT_realtag (lua_State *L, int tag); int luaT_tag (const TObject *o); int luaT_validevent (int t, int e); /* used by compatibility module */ #endif gltron-0.70/lua/src/lundump.h0000644000076400001440000000165207432712643011647 /* ** $Id: lundump.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** load pre-compiled Lua chunks ** See Copyright Notice in lua.h */ #ifndef lundump_h #define lundump_h #include "lobject.h" #include "lzio.h" /* load one chunk */ Proto* luaU_undump (lua_State* L, ZIO* Z); /* find byte order */ int luaU_endianess (void); /* definitions for headers of binary files */ #define VERSION 0x40 /* last format change was in 4.0 */ #define VERSION0 0x40 /* last major change was in 4.0 */ #define ID_CHUNK 27 /* binary files start with ESC... */ #define SIGNATURE "Lua" /* ...followed by this signature */ /* formats for error messages */ #define SOURCE_FMT "<%d:%.99s>" #define SOURCE tf->lineDefined,tf->source->str #define IN_FMT " in %p " SOURCE_FMT #define IN tf,SOURCE /* a multiple of PI for testing native format */ /* multiplying by 1E8 gives non-trivial integer values */ #define TEST_NUMBER 3.14159265358979323846E8 #endif gltron-0.70/lua/src/lvm.h0000644000076400001440000000173707432712643010765 /* ** $Id: lvm.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Lua virtual machine ** See Copyright Notice in lua.h */ #ifndef lvm_h #define lvm_h #include "ldo.h" #include "lobject.h" #include "ltm.h" #define tonumber(o) ((ttype(o) != LUA_TNUMBER) && (luaV_tonumber(o) != 0)) #define tostring(L,o) ((ttype(o) != LUA_TSTRING) && (luaV_tostring(L, o) != 0)) int luaV_tonumber (TObject *obj); int luaV_tostring (lua_State *L, TObject *obj); const TObject *luaV_gettable (lua_State *L, StkId t); void luaV_settable (lua_State *L, StkId t, StkId key); const TObject *luaV_getglobal (lua_State *L, TString *s); void luaV_setglobal (lua_State *L, TString *s); StkId luaV_execute (lua_State *L, const Closure *cl, StkId base); void luaV_Cclosure (lua_State *L, lua_CFunction c, int nelems); void luaV_Lclosure (lua_State *L, Proto *l, int nelems); int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top); void luaV_strconc (lua_State *L, int total, StkId top); #endif gltron-0.70/lua/src/lzio.h0000644000076400001440000000216307432712643011136 /* ** $Id: lzio.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Buffered streams ** See Copyright Notice in lua.h */ #ifndef lzio_h #define lzio_h #include /* For Lua only */ #define zFopen luaZ_Fopen #define zsopen luaZ_sopen #define zmopen luaZ_mopen #define zread luaZ_read #define EOZ (-1) /* end of stream */ typedef struct zio ZIO; ZIO* zFopen (ZIO* z, FILE* f, const char *name); /* open FILEs */ ZIO* zsopen (ZIO* z, const char* s, const char *name); /* string */ ZIO* zmopen (ZIO* z, const char* b, size_t size, const char *name); /* memory */ size_t zread (ZIO* z, void* b, size_t n); /* read next n bytes */ #define zgetc(z) (((z)->n--)>0 ? ((int)*(z)->p++): (z)->filbuf(z)) #define zungetc(z) (++(z)->n,--(z)->p) #define zname(z) ((z)->name) /* --------- Private Part ------------------ */ #ifndef ZBSIZE #define ZBSIZE 256 /* buffer size */ #endif struct zio { size_t n; /* bytes still unread */ const unsigned char* p; /* current position in buffer */ int (*filbuf)(ZIO* z); void* u; /* additional data */ const char *name; unsigned char buffer[ZBSIZE]; /* buffer */ }; #endif gltron-0.70/lua/src/Makefile.am0000644000076400001440000000075607674620062012053 SUBDIRS=lib noinst_LIBRARIES=liblua.a DEFS= AM_CPPFLAGS= AM_CFLAGS=-ansi -pedantic -Wall -I$(srcdir) -I$(top_srcdir)/lua/include LDFLAGS= LIBS=-lm liblua_a_SOURCES=lapi.c lcode.c ldebug.c ldo.c lfunc.c lgc.c llex.c lmem.c \ lobject.c lparser.c lstate.c lstring.c ltable.c ltests.c ltm.c lundump.c \ lvm.c lzio.c noinst_HEADERS=lapi.h lcode.h ldebug.h ldo.h lfunc.h lgc.h llex.h llimits.h lmem.h \ lobject.h lopcodes.h lparser.h lstate.h lstring.h ltable.h ltm.h \ lundump.h lvm.h lzio.h gltron-0.70/lua/src/Makefile.in0000644000076400001440000003211207767023244012055 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ SUBDIRS = lib noinst_LIBRARIES = liblua.a DEFS = AM_CPPFLAGS = AM_CFLAGS = -ansi -pedantic -Wall -I$(srcdir) -I$(top_srcdir)/lua/include LDFLAGS = LIBS = -lm liblua_a_SOURCES = lapi.c lcode.c ldebug.c ldo.c lfunc.c lgc.c llex.c lmem.c \ lobject.c lparser.c lstate.c lstring.c ltable.c ltests.c ltm.c lundump.c \ lvm.c lzio.c noinst_HEADERS = lapi.h lcode.h ldebug.h ldo.h lfunc.h lgc.h llex.h llimits.h lmem.h \ lobject.h lopcodes.h lparser.h lstate.h lstring.h ltable.h ltm.h \ lundump.h lvm.h lzio.h subdir = lua/src mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) liblua_a_AR = $(AR) cru liblua_a_LIBADD = am_liblua_a_OBJECTS = lapi.$(OBJEXT) lcode.$(OBJEXT) ldebug.$(OBJEXT) \ ldo.$(OBJEXT) lfunc.$(OBJEXT) lgc.$(OBJEXT) llex.$(OBJEXT) \ lmem.$(OBJEXT) lobject.$(OBJEXT) lparser.$(OBJEXT) \ lstate.$(OBJEXT) lstring.$(OBJEXT) ltable.$(OBJEXT) \ ltests.$(OBJEXT) ltm.$(OBJEXT) lundump.$(OBJEXT) lvm.$(OBJEXT) \ lzio.$(OBJEXT) liblua_a_OBJECTS = $(am_liblua_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/lapi.Po $(DEPDIR)/lcode.Po \ @AMDEP_TRUE@ $(DEPDIR)/ldebug.Po $(DEPDIR)/ldo.Po \ @AMDEP_TRUE@ $(DEPDIR)/lfunc.Po $(DEPDIR)/lgc.Po \ @AMDEP_TRUE@ $(DEPDIR)/llex.Po $(DEPDIR)/lmem.Po \ @AMDEP_TRUE@ $(DEPDIR)/lobject.Po $(DEPDIR)/lparser.Po \ @AMDEP_TRUE@ $(DEPDIR)/lstate.Po $(DEPDIR)/lstring.Po \ @AMDEP_TRUE@ $(DEPDIR)/ltable.Po $(DEPDIR)/ltests.Po \ @AMDEP_TRUE@ $(DEPDIR)/ltm.Po $(DEPDIR)/lundump.Po \ @AMDEP_TRUE@ $(DEPDIR)/lvm.Po $(DEPDIR)/lzio.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(liblua_a_SOURCES) HEADERS = $(noinst_HEADERS) RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ uninstall-info-recursive all-recursive install-data-recursive \ install-exec-recursive installdirs-recursive install-recursive \ uninstall-recursive check-recursive installcheck-recursive DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in DIST_SUBDIRS = $(SUBDIRS) SOURCES = $(liblua_a_SOURCES) all: all-recursive .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign lua/src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) liblua.a: $(liblua_a_OBJECTS) $(liblua_a_DEPENDENCIES) -rm -f liblua.a $(liblua_a_AR) liblua.a $(liblua_a_OBJECTS) $(liblua_a_LIBADD) $(RANLIB) liblua.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lcode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/ldebug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/ldo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lfunc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lgc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/llex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lmem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lobject.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lparser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lstate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lstring.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/ltable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/ltests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/ltm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lundump.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lvm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lzio.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done for subdir in $(SUBDIRS); do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) $(HEADERS) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ clean-generic clean-noinstLIBRARIES clean-recursive distclean \ distclean-compile distclean-depend distclean-generic \ distclean-recursive distclean-tags distdir dvi dvi-am \ dvi-recursive info info-am info-recursive install install-am \ install-data install-data-am install-data-recursive \ install-exec install-exec-am install-exec-recursive \ install-info install-info-am install-info-recursive install-man \ install-recursive install-strip installcheck installcheck-am \ installdirs installdirs-am installdirs-recursive \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-recursive tags tags-recursive \ uninstall uninstall-am uninstall-info-am \ uninstall-info-recursive uninstall-recursive # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/lua/src/lapi.c0000644000076400001440000002534507513504760011107 /* ** $Id: lapi.c,v 1.2 2002/07/12 07:49:04 jcatki Exp $ ** Lua API ** See Copyright Notice in lua.h */ #include #include "lua.h" #include "lapi.h" #include "ldo.h" #include "lfunc.h" #include "lgc.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" #include "lvm.h" const char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n" "$Authors: " LUA_AUTHORS " $"; #define Index(L,i) ((i) >= 0 ? (L->Cbase+((i)-1)) : (L->top+(i))) #define api_incr_top(L) incr_top TObject *luaA_index (lua_State *L, int index) { return Index(L, index); } static TObject *luaA_indexAcceptable (lua_State *L, int index) { if (index >= 0) { TObject *o = L->Cbase+(index-1); if (o >= L->top) return NULL; else return o; } else return L->top+index; } void luaA_pushobject (lua_State *L, const TObject *o) { *L->top = *o; incr_top; } LUA_API int lua_stackspace (lua_State *L) { return (L->stack_last - L->top); } /* ** basic stack manipulation */ LUA_API int lua_gettop (lua_State *L) { return (L->top - L->Cbase); } LUA_API void lua_settop (lua_State *L, int index) { if (index >= 0) luaD_adjusttop(L, L->Cbase, index); else L->top = L->top+index+1; /* index is negative */ } LUA_API void lua_remove (lua_State *L, int index) { StkId p = luaA_index(L, index); while (++p < L->top) *(p-1) = *p; L->top--; } LUA_API void lua_insert (lua_State *L, int index) { StkId p = luaA_index(L, index); StkId q; for (q = L->top; q>p; q--) *q = *(q-1); *p = *L->top; } LUA_API void lua_pushvalue (lua_State *L, int index) { *L->top = *luaA_index(L, index); api_incr_top(L); } /* ** access functions (stack -> C) */ LUA_API int lua_type (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL) ? LUA_TNONE : ttype(o); } LUA_API const char *lua_typename (lua_State *L, int t) { UNUSED(L); return (t == LUA_TNONE) ? "no value" : luaO_typenames[t]; } LUA_API int lua_iscfunction (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL) ? 0 : iscfunction(o); } LUA_API int lua_isnumber (lua_State *L, int index) { TObject *o = luaA_indexAcceptable(L, index); return (o == NULL) ? 0 : (tonumber(o) == 0); } LUA_API int lua_isstring (lua_State *L, int index) { int t = lua_type(L, index); return (t == LUA_TSTRING || t == LUA_TNUMBER); } LUA_API int lua_tag (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL) ? LUA_NOTAG : luaT_tag(o); } LUA_API int lua_equal (lua_State *L, int index1, int index2) { StkId o1 = luaA_indexAcceptable(L, index1); StkId o2 = luaA_indexAcceptable(L, index2); if (o1 == NULL || o2 == NULL) return 0; /* index out-of-range */ else return luaO_equalObj(o1, o2); } LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { StkId o1 = luaA_indexAcceptable(L, index1); StkId o2 = luaA_indexAcceptable(L, index2); if (o1 == NULL || o2 == NULL) return 0; /* index out-of-range */ else return luaV_lessthan(L, o1, o2, L->top); } LUA_API double lua_tonumber (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL || tonumber(o)) ? 0 : nvalue(o); } LUA_API const char *lua_tostring (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL || tostring(L, o)) ? NULL : svalue(o); } LUA_API size_t lua_strlen (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL || tostring(L, o)) ? 0 : tsvalue(o)->len; } LUA_API lua_CFunction lua_tocfunction (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL || !iscfunction(o)) ? NULL : clvalue(o)->f.c; } LUA_API void *lua_touserdata (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); return (o == NULL || ttype(o) != LUA_TUSERDATA) ? NULL : tsvalue(o)->u.d.value; } LUA_API const void *lua_topointer (lua_State *L, int index) { StkId o = luaA_indexAcceptable(L, index); if (o == NULL) return NULL; switch (ttype(o)) { case LUA_TTABLE: return hvalue(o); case LUA_TFUNCTION: return clvalue(o); default: return NULL; } } /* ** push functions (C -> stack) */ LUA_API void lua_pushnil (lua_State *L) { ttype(L->top) = LUA_TNIL; api_incr_top(L); } LUA_API void lua_pushnumber (lua_State *L, double n) { nvalue(L->top) = n; ttype(L->top) = LUA_TNUMBER; api_incr_top(L); } LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { tsvalue(L->top) = luaS_newlstr(L, s, len); ttype(L->top) = LUA_TSTRING; api_incr_top(L); } LUA_API void lua_pushstring (lua_State *L, const char *s) { if (s == NULL) lua_pushnil(L); else lua_pushlstring(L, s, strlen(s)); } LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { luaV_Cclosure(L, fn, n); } LUA_API void lua_pushusertag (lua_State *L, void *u, int tag) { /* ORDER LUA_T */ if (!(tag == LUA_ANYTAG || tag == LUA_TUSERDATA || validtag(tag))) luaO_verror(L, "invalid tag for a userdata (%d)", tag); tsvalue(L->top) = luaS_createudata(L, u, tag); ttype(L->top) = LUA_TUSERDATA; api_incr_top(L); } /* ** get functions (Lua -> stack) */ LUA_API void lua_getglobal (lua_State *L, const char *name) { StkId top = L->top; *top = *luaV_getglobal(L, luaS_new(L, name)); L->top = top; api_incr_top(L); } LUA_API void lua_gettable (lua_State *L, int index) { StkId t = Index(L, index); StkId top = L->top; *(top-1) = *luaV_gettable(L, t); L->top = top; /* tag method may change top */ } LUA_API void lua_rawget (lua_State *L, int index) { StkId t = Index(L, index); LUA_ASSERT(ttype(t) == LUA_TTABLE, "table expected"); *(L->top - 1) = *luaH_get(L, hvalue(t), L->top - 1); } LUA_API void lua_rawgeti (lua_State *L, int index, int n) { StkId o = Index(L, index); LUA_ASSERT(ttype(o) == LUA_TTABLE, "table expected"); *L->top = *luaH_getnum(hvalue(o), n); api_incr_top(L); } LUA_API void lua_getglobals (lua_State *L) { hvalue(L->top) = L->gt; ttype(L->top) = LUA_TTABLE; api_incr_top(L); } LUA_API int lua_getref (lua_State *L, int ref) { if (ref == LUA_REFNIL) ttype(L->top) = LUA_TNIL; else if (0 <= ref && ref < L->refSize && (L->refArray[ref].st == LOCK || L->refArray[ref].st == HOLD)) *L->top = L->refArray[ref].o; else return 0; api_incr_top(L); return 1; } LUA_API void lua_newtable (lua_State *L) { hvalue(L->top) = luaH_new(L, 0); ttype(L->top) = LUA_TTABLE; api_incr_top(L); } /* ** set functions (stack -> Lua) */ LUA_API void lua_setglobal (lua_State *L, const char *name) { StkId top = L->top; luaV_setglobal(L, luaS_new(L, name)); L->top = top-1; /* remove element from the top */ } LUA_API void lua_settable (lua_State *L, int index) { StkId t = Index(L, index); StkId top = L->top; luaV_settable(L, t, top-2); L->top = top-2; /* pop index and value */ } LUA_API void lua_rawset (lua_State *L, int index) { StkId t = Index(L, index); LUA_ASSERT(ttype(t) == LUA_TTABLE, "table expected"); *luaH_set(L, hvalue(t), L->top-2) = *(L->top-1); L->top -= 2; } LUA_API void lua_rawseti (lua_State *L, int index, int n) { StkId o = Index(L, index); LUA_ASSERT(ttype(o) == LUA_TTABLE, "table expected"); *luaH_setint(L, hvalue(o), n) = *(L->top-1); L->top--; } LUA_API void lua_setglobals (lua_State *L) { StkId newtable = --L->top; LUA_ASSERT(ttype(newtable) == LUA_TTABLE, "table expected"); L->gt = hvalue(newtable); } LUA_API int lua_ref (lua_State *L, int lock) { int ref; if (ttype(L->top-1) == LUA_TNIL) ref = LUA_REFNIL; else { if (L->refFree != NONEXT) { /* is there a free place? */ ref = L->refFree; L->refFree = L->refArray[ref].st; } else { /* no more free places */ luaM_growvector(L, L->refArray, L->refSize, 1, struct Ref, "reference table overflow", MAX_INT); L->nblocks += sizeof(struct Ref); ref = L->refSize++; } L->refArray[ref].o = *(L->top-1); L->refArray[ref].st = lock ? LOCK : HOLD; } L->top--; return ref; } /* ** "do" functions (run Lua code) ** (most of them are in ldo.c) */ LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults) { luaD_call(L, L->top-(nargs+1), nresults); } /* ** Garbage-collection functions */ /* GC values are expressed in Kbytes: #bytes/2^10 */ #define GCscale(x) ((int)((x)>>10)) #define GCunscale(x) ((unsigned long)(x)<<10) LUA_API int lua_getgcthreshold (lua_State *L) { return GCscale(L->GCthreshold); } LUA_API int lua_getgccount (lua_State *L) { return GCscale(L->nblocks); } LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold) { if (newthreshold > GCscale(ULONG_MAX)) L->GCthreshold = ULONG_MAX; else L->GCthreshold = GCunscale(newthreshold); luaC_checkGC(L); } /* ** miscellaneous functions */ LUA_API void lua_settag (lua_State *L, int tag) { luaT_realtag(L, tag); switch (ttype(L->top-1)) { case LUA_TTABLE: hvalue(L->top-1)->htag = tag; break; case LUA_TUSERDATA: tsvalue(L->top-1)->u.d.tag = tag; break; default: luaO_verror(L, "cannot change the tag of a %.20s", luaO_typename(L->top-1)); } } LUA_API void lua_unref (lua_State *L, int ref) { if (ref >= 0) { LUA_ASSERT(ref < L->refSize && L->refArray[ref].st < 0, "invalid ref"); L->refArray[ref].st = L->refFree; L->refFree = ref; } } LUA_API int lua_next (lua_State *L, int index) { StkId t = luaA_index(L, index); Node *n; LUA_ASSERT(ttype(t) == LUA_TTABLE, "table expected"); n = luaH_next(L, hvalue(t), luaA_index(L, -1)); if (n) { *(L->top-1) = *key(n); *L->top = *val(n); api_incr_top(L); return 1; } else { /* no more elements */ L->top -= 1; /* remove key */ return 0; } } LUA_API int lua_getn (lua_State *L, int index) { Hash *h = hvalue(luaA_index(L, index)); const TObject *value = luaH_getstr(h, luaS_new(L, "n")); /* value = h.n */ if (ttype(value) == LUA_TNUMBER) return (int)nvalue(value); else { Number max = 0; int i = h->size; Node *n = h->node; while (i--) { if (ttype(key(n)) == LUA_TNUMBER && ttype(val(n)) != LUA_TNIL && nvalue(key(n)) > max) max = nvalue(key(n)); n++; } return (int)max; } } LUA_API void lua_concat (lua_State *L, int n) { StkId top = L->top; luaV_strconc(L, n, top); L->top = top-(n-1); luaC_checkGC(L); } LUA_API void *lua_newuserdata (lua_State *L, size_t size) { TString *ts = luaS_newudata(L, (size==0) ? 1 : size, NULL); tsvalue(L->top) = ts; ttype(L->top) = LUA_TUSERDATA; api_incr_top(L); return ts->u.d.value; } gltron-0.70/lua/src/lcode.c0000644000076400001440000004603407432712643011247 /* ** $Id: lcode.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Code generator for Lua ** See Copyright Notice in lua.h */ #include "stdlib.h" #include "lua.h" #include "lcode.h" #include "ldo.h" #include "llex.h" #include "lmem.h" #include "lobject.h" #include "lopcodes.h" #include "lparser.h" void luaK_error (LexState *ls, const char *msg) { luaX_error(ls, msg, ls->t.token); } /* ** Returns the the previous instruction, for optimizations. ** If there is a jump target between this and the current instruction, ** returns a dummy instruction to avoid wrong optimizations. */ static Instruction previous_instruction (FuncState *fs) { if (fs->pc > fs->lasttarget) /* no jumps to current position? */ return fs->f->code[fs->pc-1]; /* returns previous instruction */ else return CREATE_0(OP_END); /* no optimizations after an `END' */ } int luaK_jump (FuncState *fs) { int j = luaK_code1(fs, OP_JMP, NO_JUMP); if (j == fs->lasttarget) { /* possible jumps to this jump? */ luaK_concat(fs, &j, fs->jlt); /* keep them on hold */ fs->jlt = NO_JUMP; } return j; } static void luaK_fixjump (FuncState *fs, int pc, int dest) { Instruction *jmp = &fs->f->code[pc]; if (dest == NO_JUMP) SETARG_S(*jmp, NO_JUMP); /* point to itself to represent end of list */ else { /* jump is relative to position following jump instruction */ int offset = dest-(pc+1); if (abs(offset) > MAXARG_S) luaK_error(fs->ls, "control structure too long"); SETARG_S(*jmp, offset); } } static int luaK_getjump (FuncState *fs, int pc) { int offset = GETARG_S(fs->f->code[pc]); if (offset == NO_JUMP) /* point to itself represents end of list */ return NO_JUMP; /* end of list */ else return (pc+1)+offset; /* turn offset into absolute position */ } /* ** returns current `pc' and marks it as a jump target (to avoid wrong ** optimizations with consecutive instructions not in the same basic block). ** discharge list of jumps to last target. */ int luaK_getlabel (FuncState *fs) { if (fs->pc != fs->lasttarget) { int lasttarget = fs->lasttarget; fs->lasttarget = fs->pc; luaK_patchlist(fs, fs->jlt, lasttarget); /* discharge old list `jlt' */ fs->jlt = NO_JUMP; /* nobody jumps to this new label (yet) */ } return fs->pc; } void luaK_deltastack (FuncState *fs, int delta) { fs->stacklevel += delta; if (fs->stacklevel > fs->f->maxstacksize) { if (fs->stacklevel > MAXSTACK) luaK_error(fs->ls, "function or expression too complex"); fs->f->maxstacksize = fs->stacklevel; } } void luaK_kstr (LexState *ls, int c) { luaK_code1(ls->fs, OP_PUSHSTRING, c); } static int number_constant (FuncState *fs, Number r) { /* check whether `r' has appeared within the last LOOKBACKNUMS entries */ Proto *f = fs->f; int c = f->nknum; int lim = c < LOOKBACKNUMS ? 0 : c-LOOKBACKNUMS; while (--c >= lim) if (f->knum[c] == r) return c; /* not found; create a new entry */ luaM_growvector(fs->L, f->knum, f->nknum, 1, Number, "constant table overflow", MAXARG_U); c = f->nknum++; f->knum[c] = r; return c; } void luaK_number (FuncState *fs, Number f) { if (f <= (Number)MAXARG_S && (Number)(int)f == f) luaK_code1(fs, OP_PUSHINT, (int)f); /* f has a short integer value */ else luaK_code1(fs, OP_PUSHNUM, number_constant(fs, f)); } void luaK_adjuststack (FuncState *fs, int n) { if (n > 0) luaK_code1(fs, OP_POP, n); else luaK_code1(fs, OP_PUSHNIL, -n); } int luaK_lastisopen (FuncState *fs) { /* check whether last instruction is an open function call */ Instruction i = previous_instruction(fs); if (GET_OPCODE(i) == OP_CALL && GETARG_B(i) == MULT_RET) return 1; else return 0; } void luaK_setcallreturns (FuncState *fs, int nresults) { if (luaK_lastisopen(fs)) { /* expression is an open function call? */ SETARG_B(fs->f->code[fs->pc-1], nresults); /* set number of results */ luaK_deltastack(fs, nresults); /* push results */ } } static int discharge (FuncState *fs, expdesc *var) { switch (var->k) { case VLOCAL: luaK_code1(fs, OP_GETLOCAL, var->u.index); break; case VGLOBAL: luaK_code1(fs, OP_GETGLOBAL, var->u.index); break; case VINDEXED: luaK_code0(fs, OP_GETTABLE); break; case VEXP: return 0; /* nothing to do */ } var->k = VEXP; var->u.l.t = var->u.l.f = NO_JUMP; return 1; } static void discharge1 (FuncState *fs, expdesc *var) { discharge(fs, var); /* if it has jumps then it is already discharged */ if (var->u.l.t == NO_JUMP && var->u.l.f == NO_JUMP) luaK_setcallreturns(fs, 1); /* call must return 1 value */ } void luaK_storevar (LexState *ls, const expdesc *var) { FuncState *fs = ls->fs; switch (var->k) { case VLOCAL: luaK_code1(fs, OP_SETLOCAL, var->u.index); break; case VGLOBAL: luaK_code1(fs, OP_SETGLOBAL, var->u.index); break; case VINDEXED: /* table is at top-3; pop 3 elements after operation */ luaK_code2(fs, OP_SETTABLE, 3, 3); break; default: LUA_INTERNALERROR("invalid var kind to store"); } } static OpCode invertjump (OpCode op) { switch (op) { case OP_JMPNE: return OP_JMPEQ; case OP_JMPEQ: return OP_JMPNE; case OP_JMPLT: return OP_JMPGE; case OP_JMPLE: return OP_JMPGT; case OP_JMPGT: return OP_JMPLE; case OP_JMPGE: return OP_JMPLT; case OP_JMPT: case OP_JMPONT: return OP_JMPF; case OP_JMPF: case OP_JMPONF: return OP_JMPT; default: LUA_INTERNALERROR("invalid jump instruction"); return OP_END; /* to avoid warnings */ } } static void luaK_patchlistaux (FuncState *fs, int list, int target, OpCode special, int special_target) { Instruction *code = fs->f->code; while (list != NO_JUMP) { int next = luaK_getjump(fs, list); Instruction *i = &code[list]; OpCode op = GET_OPCODE(*i); if (op == special) /* this `op' already has a value */ luaK_fixjump(fs, list, special_target); else { luaK_fixjump(fs, list, target); /* do the patch */ if (op == OP_JMPONT) /* remove eventual values */ SET_OPCODE(*i, OP_JMPT); else if (op == OP_JMPONF) SET_OPCODE(*i, OP_JMPF); } list = next; } } void luaK_patchlist (FuncState *fs, int list, int target) { if (target == fs->lasttarget) /* same target that list `jlt'? */ luaK_concat(fs, &fs->jlt, list); /* delay fixing */ else luaK_patchlistaux(fs, list, target, OP_END, 0); } static int need_value (FuncState *fs, int list, OpCode hasvalue) { /* check whether list has a jump without a value */ for (; list != NO_JUMP; list = luaK_getjump(fs, list)) if (GET_OPCODE(fs->f->code[list]) != hasvalue) return 1; return 0; /* not found */ } void luaK_concat (FuncState *fs, int *l1, int l2) { if (*l1 == NO_JUMP) *l1 = l2; else { int list = *l1; for (;;) { /* traverse `l1' */ int next = luaK_getjump(fs, list); if (next == NO_JUMP) { /* end of list? */ luaK_fixjump(fs, list, l2); return; } list = next; } } } static void luaK_testgo (FuncState *fs, expdesc *v, int invert, OpCode jump) { int prevpos; /* position of last instruction */ Instruction *previous; int *golist, *exitlist; if (!invert) { golist = &v->u.l.f; /* go if false */ exitlist = &v->u.l.t; /* exit if true */ } else { golist = &v->u.l.t; /* go if true */ exitlist = &v->u.l.f; /* exit if false */ } discharge1(fs, v); prevpos = fs->pc-1; previous = &fs->f->code[prevpos]; LUA_ASSERT(*previous==previous_instruction(fs), "no jump allowed here"); if (!ISJUMP(GET_OPCODE(*previous))) prevpos = luaK_code1(fs, jump, NO_JUMP); else { /* last instruction is already a jump */ if (invert) SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous))); } luaK_concat(fs, exitlist, prevpos); /* insert last jump in `exitlist' */ luaK_patchlist(fs, *golist, luaK_getlabel(fs)); *golist = NO_JUMP; } void luaK_goiftrue (FuncState *fs, expdesc *v, int keepvalue) { luaK_testgo(fs, v, 1, keepvalue ? OP_JMPONF : OP_JMPF); } static void luaK_goiffalse (FuncState *fs, expdesc *v, int keepvalue) { luaK_testgo(fs, v, 0, keepvalue ? OP_JMPONT : OP_JMPT); } static int code_label (FuncState *fs, OpCode op, int arg) { luaK_getlabel(fs); /* those instructions may be jump targets */ return luaK_code1(fs, op, arg); } void luaK_tostack (LexState *ls, expdesc *v, int onlyone) { FuncState *fs = ls->fs; if (!discharge(fs, v)) { /* `v' is an expression? */ OpCode previous = GET_OPCODE(fs->f->code[fs->pc-1]); if (!ISJUMP(previous) && v->u.l.f == NO_JUMP && v->u.l.t == NO_JUMP) { /* expression has no jumps */ if (onlyone) luaK_setcallreturns(fs, 1); /* call must return 1 value */ } else { /* expression has jumps */ int final; /* position after whole expression */ int j = NO_JUMP; /* eventual jump over values */ int p_nil = NO_JUMP; /* position of an eventual PUSHNIL */ int p_1 = NO_JUMP; /* position of an eventual PUSHINT */ if (ISJUMP(previous) || need_value(fs, v->u.l.f, OP_JMPONF) || need_value(fs, v->u.l.t, OP_JMPONT)) { /* expression needs values */ if (ISJUMP(previous)) luaK_concat(fs, &v->u.l.t, fs->pc-1); /* put `previous' in t. list */ else { j = code_label(fs, OP_JMP, NO_JUMP); /* to jump over both pushes */ /* correct stack for compiler and symbolic execution */ luaK_adjuststack(fs, 1); } p_nil = code_label(fs, OP_PUSHNILJMP, 0); p_1 = code_label(fs, OP_PUSHINT, 1); luaK_patchlist(fs, j, luaK_getlabel(fs)); } final = luaK_getlabel(fs); luaK_patchlistaux(fs, v->u.l.f, p_nil, OP_JMPONF, final); luaK_patchlistaux(fs, v->u.l.t, p_1, OP_JMPONT, final); v->u.l.f = v->u.l.t = NO_JUMP; } } } void luaK_prefix (LexState *ls, UnOpr op, expdesc *v) { FuncState *fs = ls->fs; if (op == OPR_MINUS) { luaK_tostack(ls, v, 1); luaK_code0(fs, OP_MINUS); } else { /* op == NOT */ Instruction *previous; discharge1(fs, v); previous = &fs->f->code[fs->pc-1]; if (ISJUMP(GET_OPCODE(*previous))) SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous))); else luaK_code0(fs, OP_NOT); /* interchange true and false lists */ { int temp = v->u.l.f; v->u.l.f = v->u.l.t; v->u.l.t = temp; } } } void luaK_infix (LexState *ls, BinOpr op, expdesc *v) { FuncState *fs = ls->fs; switch (op) { case OPR_AND: luaK_goiftrue(fs, v, 1); break; case OPR_OR: luaK_goiffalse(fs, v, 1); break; default: luaK_tostack(ls, v, 1); /* all other binary operators need a value */ } } static const struct { OpCode opcode; /* opcode for each binary operator */ int arg; /* default argument for the opcode */ } codes[] = { /* ORDER OPR */ {OP_ADD, 0}, {OP_SUB, 0}, {OP_MULT, 0}, {OP_DIV, 0}, {OP_POW, 0}, {OP_CONCAT, 2}, {OP_JMPNE, NO_JUMP}, {OP_JMPEQ, NO_JUMP}, {OP_JMPLT, NO_JUMP}, {OP_JMPLE, NO_JUMP}, {OP_JMPGT, NO_JUMP}, {OP_JMPGE, NO_JUMP} }; void luaK_posfix (LexState *ls, BinOpr op, expdesc *v1, expdesc *v2) { FuncState *fs = ls->fs; switch (op) { case OPR_AND: { LUA_ASSERT(v1->u.l.t == NO_JUMP, "list must be closed"); discharge1(fs, v2); v1->u.l.t = v2->u.l.t; luaK_concat(fs, &v1->u.l.f, v2->u.l.f); break; } case OPR_OR: { LUA_ASSERT(v1->u.l.f == NO_JUMP, "list must be closed"); discharge1(fs, v2); v1->u.l.f = v2->u.l.f; luaK_concat(fs, &v1->u.l.t, v2->u.l.t); break; } default: { luaK_tostack(ls, v2, 1); /* `v2' must be a value */ luaK_code1(fs, codes[op].opcode, codes[op].arg); } } } static void codelineinfo (FuncState *fs) { Proto *f = fs->f; LexState *ls = fs->ls; if (ls->lastline > fs->lastline) { luaM_growvector(fs->L, f->lineinfo, f->nlineinfo, 2, int, "line info overflow", MAX_INT); if (ls->lastline > fs->lastline+1) f->lineinfo[f->nlineinfo++] = -(ls->lastline - (fs->lastline+1)); f->lineinfo[f->nlineinfo++] = fs->pc; fs->lastline = ls->lastline; } } int luaK_code0 (FuncState *fs, OpCode o) { return luaK_code2(fs, o, 0, 0); } int luaK_code1 (FuncState *fs, OpCode o, int arg1) { return luaK_code2(fs, o, arg1, 0); } int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) { Instruction i = previous_instruction(fs); int delta = luaK_opproperties[o].push - luaK_opproperties[o].pop; int optm = 0; /* 1 when there is an optimization */ switch (o) { case OP_CLOSURE: { delta = -arg2+1; break; } case OP_SETTABLE: { delta = -arg2; break; } case OP_SETLIST: { if (arg2 == 0) return NO_JUMP; /* nothing to do */ delta = -arg2; break; } case OP_SETMAP: { if (arg1 == 0) return NO_JUMP; /* nothing to do */ delta = -2*arg1; break; } case OP_RETURN: { if (GET_OPCODE(i) == OP_CALL && GETARG_B(i) == MULT_RET) { SET_OPCODE(i, OP_TAILCALL); SETARG_B(i, arg1); optm = 1; } break; } case OP_PUSHNIL: { if (arg1 == 0) return NO_JUMP; /* nothing to do */ delta = arg1; switch(GET_OPCODE(i)) { case OP_PUSHNIL: SETARG_U(i, GETARG_U(i)+arg1); optm = 1; break; default: break; } break; } case OP_POP: { if (arg1 == 0) return NO_JUMP; /* nothing to do */ delta = -arg1; switch(GET_OPCODE(i)) { case OP_SETTABLE: SETARG_B(i, GETARG_B(i)+arg1); optm = 1; break; default: break; } break; } case OP_GETTABLE: { switch(GET_OPCODE(i)) { case OP_PUSHSTRING: /* `t.x' */ SET_OPCODE(i, OP_GETDOTTED); optm = 1; break; case OP_GETLOCAL: /* `t[i]' */ SET_OPCODE(i, OP_GETINDEXED); optm = 1; break; default: break; } break; } case OP_ADD: { switch(GET_OPCODE(i)) { case OP_PUSHINT: SET_OPCODE(i, OP_ADDI); optm = 1; break; /* `a+k' */ default: break; } break; } case OP_SUB: { switch(GET_OPCODE(i)) { case OP_PUSHINT: /* `a-k' */ i = CREATE_S(OP_ADDI, -GETARG_S(i)); optm = 1; break; default: break; } break; } case OP_CONCAT: { delta = -arg1+1; switch(GET_OPCODE(i)) { case OP_CONCAT: /* `a..b..c' */ SETARG_U(i, GETARG_U(i)+1); optm = 1; break; default: break; } break; } case OP_MINUS: { switch(GET_OPCODE(i)) { case OP_PUSHINT: /* `-k' */ SETARG_S(i, -GETARG_S(i)); optm = 1; break; case OP_PUSHNUM: /* `-k' */ SET_OPCODE(i, OP_PUSHNEGNUM); optm = 1; break; default: break; } break; } case OP_JMPNE: { if (i == CREATE_U(OP_PUSHNIL, 1)) { /* `a~=nil' */ i = CREATE_S(OP_JMPT, NO_JUMP); optm = 1; } break; } case OP_JMPEQ: { if (i == CREATE_U(OP_PUSHNIL, 1)) { /* `a==nil' */ i = CREATE_0(OP_NOT); delta = -1; /* just undo effect of previous PUSHNIL */ optm = 1; } break; } case OP_JMPT: case OP_JMPONT: { switch (GET_OPCODE(i)) { case OP_NOT: { i = CREATE_S(OP_JMPF, NO_JUMP); optm = 1; break; } case OP_PUSHINT: { if (o == OP_JMPT) { /* JMPONT must keep original integer value */ i = CREATE_S(OP_JMP, NO_JUMP); optm = 1; } break; } case OP_PUSHNIL: { if (GETARG_U(i) == 1) { fs->pc--; /* erase previous instruction */ luaK_deltastack(fs, -1); /* correct stack */ return NO_JUMP; } break; } default: break; } break; } case OP_JMPF: case OP_JMPONF: { switch (GET_OPCODE(i)) { case OP_NOT: { i = CREATE_S(OP_JMPT, NO_JUMP); optm = 1; break; } case OP_PUSHINT: { /* `while 1 do ...' */ fs->pc--; /* erase previous instruction */ luaK_deltastack(fs, -1); /* correct stack */ return NO_JUMP; } case OP_PUSHNIL: { /* `repeat ... until nil' */ if (GETARG_U(i) == 1) { i = CREATE_S(OP_JMP, NO_JUMP); optm = 1; } break; } default: break; } break; } case OP_GETDOTTED: case OP_GETINDEXED: case OP_TAILCALL: case OP_ADDI: { LUA_INTERNALERROR("instruction used only for optimizations"); break; } default: { LUA_ASSERT(delta != VD, "invalid delta"); break; } } luaK_deltastack(fs, delta); if (optm) { /* optimize: put instruction in place of last one */ fs->f->code[fs->pc-1] = i; /* change previous instruction */ return fs->pc-1; /* do not generate new instruction */ } /* else build new instruction */ switch ((enum Mode)luaK_opproperties[o].mode) { case iO: i = CREATE_0(o); break; case iU: i = CREATE_U(o, arg1); break; case iS: i = CREATE_S(o, arg1); break; case iAB: i = CREATE_AB(o, arg1, arg2); break; } codelineinfo(fs); /* put new instruction in code array */ luaM_growvector(fs->L, fs->f->code, fs->pc, 1, Instruction, "code size overflow", MAX_INT); fs->f->code[fs->pc] = i; return fs->pc++; } const struct OpProperties luaK_opproperties[NUM_OPCODES] = { {iO, 0, 0}, /* OP_END */ {iU, 0, 0}, /* OP_RETURN */ {iAB, 0, 0}, /* OP_CALL */ {iAB, 0, 0}, /* OP_TAILCALL */ {iU, VD, 0}, /* OP_PUSHNIL */ {iU, VD, 0}, /* OP_POP */ {iS, 1, 0}, /* OP_PUSHINT */ {iU, 1, 0}, /* OP_PUSHSTRING */ {iU, 1, 0}, /* OP_PUSHNUM */ {iU, 1, 0}, /* OP_PUSHNEGNUM */ {iU, 1, 0}, /* OP_PUSHUPVALUE */ {iU, 1, 0}, /* OP_GETLOCAL */ {iU, 1, 0}, /* OP_GETGLOBAL */ {iO, 1, 2}, /* OP_GETTABLE */ {iU, 1, 1}, /* OP_GETDOTTED */ {iU, 1, 1}, /* OP_GETINDEXED */ {iU, 2, 1}, /* OP_PUSHSELF */ {iU, 1, 0}, /* OP_CREATETABLE */ {iU, 0, 1}, /* OP_SETLOCAL */ {iU, 0, 1}, /* OP_SETGLOBAL */ {iAB, VD, 0}, /* OP_SETTABLE */ {iAB, VD, 0}, /* OP_SETLIST */ {iU, VD, 0}, /* OP_SETMAP */ {iO, 1, 2}, /* OP_ADD */ {iS, 1, 1}, /* OP_ADDI */ {iO, 1, 2}, /* OP_SUB */ {iO, 1, 2}, /* OP_MULT */ {iO, 1, 2}, /* OP_DIV */ {iO, 1, 2}, /* OP_POW */ {iU, VD, 0}, /* OP_CONCAT */ {iO, 1, 1}, /* OP_MINUS */ {iO, 1, 1}, /* OP_NOT */ {iS, 0, 2}, /* OP_JMPNE */ {iS, 0, 2}, /* OP_JMPEQ */ {iS, 0, 2}, /* OP_JMPLT */ {iS, 0, 2}, /* OP_JMPLE */ {iS, 0, 2}, /* OP_JMPGT */ {iS, 0, 2}, /* OP_JMPGE */ {iS, 0, 1}, /* OP_JMPT */ {iS, 0, 1}, /* OP_JMPF */ {iS, 0, 1}, /* OP_JMPONT */ {iS, 0, 1}, /* OP_JMPONF */ {iS, 0, 0}, /* OP_JMP */ {iO, 0, 0}, /* OP_PUSHNILJMP */ {iS, 0, 0}, /* OP_FORPREP */ {iS, 0, 3}, /* OP_FORLOOP */ {iS, 2, 0}, /* OP_LFORPREP */ {iS, 0, 3}, /* OP_LFORLOOP */ {iAB, VD, 0} /* OP_CLOSURE */ }; gltron-0.70/lua/src/ldebug.c0000644000076400001440000002646507432712643011431 /* ** $Id: ldebug.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Debug Interface ** See Copyright Notice in lua.h */ #include #include "lua.h" #include "lapi.h" #include "lcode.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "lobject.h" #include "lopcodes.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" #include "luadebug.h" static const char *getfuncname (lua_State *L, StkId f, const char **name); static void setnormalized (TObject *d, const TObject *s) { if (ttype(s) == LUA_TMARK) { clvalue(d) = infovalue(s)->func; ttype(d) = LUA_TFUNCTION; } else *d = *s; } static int isLmark (StkId o) { return (o && ttype(o) == LUA_TMARK && !infovalue(o)->func->isC); } LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func) { lua_Hook oldhook = L->callhook; L->callhook = func; return oldhook; } LUA_API lua_Hook lua_setlinehook (lua_State *L, lua_Hook func) { lua_Hook oldhook = L->linehook; L->linehook = func; return oldhook; } static StkId aux_stackedfunction (lua_State *L, int level, StkId top) { int i; for (i = (top-1) - L->stack; i>=0; i--) { if (is_T_MARK(L->stack[i].ttype)) { if (level == 0) return L->stack+i; level--; } } return NULL; } LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { StkId f = aux_stackedfunction(L, level, L->top); if (f == NULL) return 0; /* there is no such level */ else { ar->_func = f; return 1; } } static int nups (StkId f) { switch (ttype(f)) { case LUA_TFUNCTION: return clvalue(f)->nupvalues; case LUA_TMARK: return infovalue(f)->func->nupvalues; default: return 0; } } int luaG_getline (int *lineinfo, int pc, int refline, int *prefi) { int refi; if (lineinfo == NULL || pc == -1) return -1; /* no line info or function is not active */ refi = prefi ? *prefi : 0; if (lineinfo[refi] < 0) refline += -lineinfo[refi++]; LUA_ASSERT(lineinfo[refi] >= 0, "invalid line info"); while (lineinfo[refi] > pc) { refline--; refi--; if (lineinfo[refi] < 0) refline -= -lineinfo[refi--]; LUA_ASSERT(lineinfo[refi] >= 0, "invalid line info"); } for (;;) { int nextline = refline + 1; int nextref = refi + 1; if (lineinfo[nextref] < 0) nextline += -lineinfo[nextref++]; LUA_ASSERT(lineinfo[nextref] >= 0, "invalid line info"); if (lineinfo[nextref] > pc) break; refline = nextline; refi = nextref; } if (prefi) *prefi = refi; return refline; } static int currentpc (StkId f) { CallInfo *ci = infovalue(f); LUA_ASSERT(isLmark(f), "function has no pc"); if (ci->pc) return (*ci->pc - ci->func->f.l->code) - 1; else return -1; /* function is not active */ } static int currentline (StkId f) { if (!isLmark(f)) return -1; /* only active lua functions have current-line information */ else { CallInfo *ci = infovalue(f); int *lineinfo = ci->func->f.l->lineinfo; return luaG_getline(lineinfo, currentpc(f), 1, NULL); } } static Proto *getluaproto (StkId f) { return (isLmark(f) ? infovalue(f)->func->f.l : NULL); } LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { const char *name; StkId f = ar->_func; Proto *fp = getluaproto(f); if (!fp) return NULL; /* `f' is not a Lua function? */ name = luaF_getlocalname(fp, n, currentpc(f)); if (!name) return NULL; luaA_pushobject(L, (f+1)+(n-1)); /* push value */ return name; } LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { const char *name; StkId f = ar->_func; Proto *fp = getluaproto(f); L->top--; /* pop new value */ if (!fp) return NULL; /* `f' is not a Lua function? */ name = luaF_getlocalname(fp, n, currentpc(f)); if (!name || name[0] == '(') return NULL; /* `(' starts private locals */ *((f+1)+(n-1)) = *L->top; return name; } static void infoLproto (lua_Debug *ar, Proto *f) { ar->source = f->source->str; ar->linedefined = f->lineDefined; ar->what = "Lua"; } static void funcinfo (lua_State *L, lua_Debug *ar, StkId func) { Closure *cl = NULL; switch (ttype(func)) { case LUA_TFUNCTION: cl = clvalue(func); break; case LUA_TMARK: cl = infovalue(func)->func; break; default: lua_error(L, "value for `lua_getinfo' is not a function"); } if (cl->isC) { ar->source = "=C"; ar->linedefined = -1; ar->what = "C"; } else infoLproto(ar, cl->f.l); luaO_chunkid(ar->short_src, ar->source, sizeof(ar->short_src)); if (ar->linedefined == 0) ar->what = "main"; } static const char *travtagmethods (lua_State *L, const TObject *o) { if (ttype(o) == LUA_TFUNCTION) { int e; for (e=0; elast_tag; t++) if (clvalue(o) == luaT_gettm(L, t, e)) return luaT_eventname[e]; } } return NULL; } static const char *travglobals (lua_State *L, const TObject *o) { Hash *g = L->gt; int i; for (i=0; isize; i++) { if (luaO_equalObj(o, val(node(g, i))) && ttype(key(node(g, i))) == LUA_TSTRING) return tsvalue(key(node(g, i)))->str; } return NULL; } static void getname (lua_State *L, StkId f, lua_Debug *ar) { TObject o; setnormalized(&o, f); /* try to find a name for given function */ if ((ar->name = travglobals(L, &o)) != NULL) ar->namewhat = "global"; /* not found: try tag methods */ else if ((ar->name = travtagmethods(L, &o)) != NULL) ar->namewhat = "tag-method"; else ar->namewhat = ""; /* not found at all */ } LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { StkId func; int isactive = (*what != '>'); if (isactive) func = ar->_func; else { what++; /* skip the '>' */ func = L->top - 1; } for (; *what; what++) { switch (*what) { case 'S': { funcinfo(L, ar, func); break; } case 'l': { ar->currentline = currentline(func); break; } case 'u': { ar->nups = nups(func); break; } case 'n': { ar->namewhat = (isactive) ? getfuncname(L, func, &ar->name) : NULL; if (ar->namewhat == NULL) getname(L, func, ar); break; } case 'f': { setnormalized(L->top, func); incr_top; /* push function */ break; } default: return 0; /* invalid option */ } } if (!isactive) L->top--; /* pop function */ return 1; } /* ** {====================================================== ** Symbolic Execution ** ======================================================= */ static int pushpc (int *stack, int pc, int top, int n) { while (n--) stack[top++] = pc-1; return top; } static Instruction luaG_symbexec (const Proto *pt, int lastpc, int stackpos) { int stack[MAXSTACK]; /* stores last instruction that changed a stack entry */ const Instruction *code = pt->code; int top = pt->numparams; int pc = 0; if (pt->is_vararg) /* varargs? */ top++; /* `arg' */ while (pc < lastpc) { const Instruction i = code[pc++]; LUA_ASSERT(0 <= top && top <= pt->maxstacksize, "wrong stack"); switch (GET_OPCODE(i)) { case OP_RETURN: { LUA_ASSERT(top >= GETARG_U(i), "wrong stack"); top = GETARG_U(i); break; } case OP_TAILCALL: { LUA_ASSERT(top >= GETARG_A(i), "wrong stack"); top = GETARG_B(i); break; } case OP_CALL: { int nresults = GETARG_B(i); if (nresults == MULT_RET) nresults = 1; LUA_ASSERT(top >= GETARG_A(i), "wrong stack"); top = pushpc(stack, pc, GETARG_A(i), nresults); break; } case OP_PUSHNIL: { top = pushpc(stack, pc, top, GETARG_U(i)); break; } case OP_POP: { top -= GETARG_U(i); break; } case OP_SETTABLE: case OP_SETLIST: { top -= GETARG_B(i); break; } case OP_SETMAP: { top -= 2*GETARG_U(i); break; } case OP_CONCAT: { top -= GETARG_U(i); stack[top++] = pc-1; break; } case OP_CLOSURE: { top -= GETARG_B(i); stack[top++] = pc-1; break; } case OP_JMPONT: case OP_JMPONF: { int newpc = pc + GETARG_S(i); /* jump is forward and do not skip `lastpc'? */ if (pc < newpc && newpc <= lastpc) { stack[top-1] = pc-1; /* value comes from `and'/`or' */ pc = newpc; /* do the jump */ } else top--; /* do not jump; pop value */ break; } default: { OpCode op = GET_OPCODE(i); LUA_ASSERT(luaK_opproperties[op].push != VD, "invalid opcode for default"); top -= luaK_opproperties[op].pop; LUA_ASSERT(top >= 0, "wrong stack"); top = pushpc(stack, pc, top, luaK_opproperties[op].push); } } } return code[stack[stackpos]]; } static const char *getobjname (lua_State *L, StkId obj, const char **name) { StkId func = aux_stackedfunction(L, 0, obj); if (!isLmark(func)) return NULL; /* not an active Lua function */ else { Proto *p = infovalue(func)->func->f.l; int pc = currentpc(func); int stackpos = obj - (func+1); /* func+1 == function base */ Instruction i = luaG_symbexec(p, pc, stackpos); LUA_ASSERT(pc != -1, "function must be active"); switch (GET_OPCODE(i)) { case OP_GETGLOBAL: { *name = p->kstr[GETARG_U(i)]->str; return "global"; } case OP_GETLOCAL: { *name = luaF_getlocalname(p, GETARG_U(i)+1, pc); LUA_ASSERT(*name, "local must exist"); return "local"; } case OP_PUSHSELF: case OP_GETDOTTED: { *name = p->kstr[GETARG_U(i)]->str; return "field"; } default: return NULL; /* no useful name found */ } } } static const char *getfuncname (lua_State *L, StkId f, const char **name) { StkId func = aux_stackedfunction(L, 0, f); /* calling function */ if (!isLmark(func)) return NULL; /* not an active Lua function */ else { Proto *p = infovalue(func)->func->f.l; int pc = currentpc(func); Instruction i; if (pc == -1) return NULL; /* function is not activated */ i = p->code[pc]; switch (GET_OPCODE(i)) { case OP_CALL: case OP_TAILCALL: return getobjname(L, (func+1)+GETARG_A(i), name); default: return NULL; /* no useful name found */ } } } /* }====================================================== */ void luaG_typeerror (lua_State *L, StkId o, const char *op) { const char *name; const char *kind = getobjname(L, o, &name); const char *t = luaO_typename(o); if (kind) luaO_verror(L, "attempt to %.30s %.20s `%.40s' (a %.10s value)", op, kind, name, t); else luaO_verror(L, "attempt to %.30s a %.10s value", op, t); } void luaG_binerror (lua_State *L, StkId p1, int t, const char *op) { if (ttype(p1) == t) p1++; LUA_ASSERT(ttype(p1) != t, "must be an error"); luaG_typeerror(L, p1, op); } void luaG_ordererror (lua_State *L, StkId top) { const char *t1 = luaO_typename(top-2); const char *t2 = luaO_typename(top-1); if (t1[2] == t2[2]) luaO_verror(L, "attempt to compare two %.10s values", t1); else luaO_verror(L, "attempt to compare %.10s with %.10s", t1, t2); } gltron-0.70/lua/src/ldo.c0000644000076400001440000002424407513504760010735 /* ** $Id: ldo.c,v 1.2 2002/07/12 07:49:04 jcatki Exp $ ** Stack and Call structure of Lua ** See Copyright Notice in lua.h */ #include #include #include #include #include "lua.h" #include "ldebug.h" #include "ldo.h" #include "lgc.h" #include "lmem.h" #include "lobject.h" #include "lparser.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" #include "lundump.h" #include "lvm.h" #include "lzio.h" /* space to handle stack overflow errors */ #define EXTRA_STACK (2*LUA_MINSTACK) void luaD_init (lua_State *L, int stacksize) { L->stack = luaM_newvector(L, stacksize+EXTRA_STACK, TObject); L->nblocks += stacksize*sizeof(TObject); L->stack_last = L->stack+(stacksize-1); L->stacksize = stacksize; L->Cbase = L->top = L->stack; } void luaD_checkstack (lua_State *L, int n) { if (L->stack_last - L->top <= n) { /* stack overflow? */ if (L->stack_last-L->stack > (L->stacksize-1)) { /* overflow while handling overflow */ luaD_breakrun(L, LUA_ERRERR); /* break run without error message */ } else { L->stack_last += EXTRA_STACK; /* to be used by error message */ lua_error(L, "stack overflow"); } } } static void restore_stack_limit (lua_State *L) { if (L->top - L->stack < L->stacksize - 1) L->stack_last = L->stack + (L->stacksize-1); } /* ** Adjust stack. Set top to base+extra, pushing NILs if needed. ** (we cannot add base+extra unless we are sure it fits in the stack; ** otherwise the result of such operation on pointers is undefined) */ void luaD_adjusttop (lua_State *L, StkId base, int extra) { int diff = extra-(L->top-base); if (diff <= 0) L->top = base+extra; else { luaD_checkstack(L, diff); while (diff--) ttype(L->top++) = LUA_TNIL; } } /* ** Open a hole inside the stack at `pos' */ static void luaD_openstack (lua_State *L, StkId pos) { int i = L->top-pos; while (i--) pos[i+1] = pos[i]; incr_top; } static void dohook (lua_State *L, lua_Debug *ar, lua_Hook hook) { StkId old_Cbase = L->Cbase; StkId old_top = L->Cbase = L->top; luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ L->allowhooks = 0; /* cannot call hooks inside a hook */ (*hook)(L, ar); LUA_ASSERT(L->allowhooks == 0, "invalid allow"); L->allowhooks = 1; L->top = old_top; L->Cbase = old_Cbase; } void luaD_lineHook (lua_State *L, StkId func, int line, lua_Hook linehook) { if (L->allowhooks) { lua_Debug ar; ar._func = func; ar.event = "line"; ar.currentline = line; dohook(L, &ar, linehook); } } static void luaD_callHook (lua_State *L, StkId func, lua_Hook callhook, const char *event) { if (L->allowhooks) { lua_Debug ar; ar._func = func; ar.event = event; infovalue(func)->pc = NULL; /* function is not active */ dohook(L, &ar, callhook); } } static StkId callCclosure (lua_State *L, const struct Closure *cl, StkId base) { int nup = cl->nupvalues; /* number of upvalues */ StkId old_Cbase = L->Cbase; int n; L->Cbase = base; /* new base for C function */ luaD_checkstack(L, nup+LUA_MINSTACK); /* ensure minimum stack size */ for (n=0; ntop++) = cl->upvalue[n]; n = (*cl->f.c)(L); /* do the actual call */ L->Cbase = old_Cbase; /* restore old C base */ return L->top - n; /* return index of first result */ } void luaD_callTM (lua_State *L, Closure *f, int nParams, int nResults) { StkId base = L->top - nParams; luaD_openstack(L, base); clvalue(base) = f; ttype(base) = LUA_TFUNCTION; luaD_call(L, base, nResults); } /* ** Call a function (C or Lua). The function to be called is at *func. ** The arguments are on the stack, right after the function. ** When returns, the results are on the stack, starting at the original ** function position. ** The number of results is nResults, unless nResults=LUA_MULTRET. */ void luaD_call (lua_State *L, StkId func, int nResults) { lua_Hook callhook; StkId firstResult; CallInfo ci; Closure *cl; if (ttype(func) != LUA_TFUNCTION) { /* `func' is not a function; check the `function' tag method */ Closure *tm = luaT_gettmbyObj(L, func, TM_FUNCTION); if (tm == NULL) luaG_typeerror(L, func, "call"); luaD_openstack(L, func); clvalue(func) = tm; /* tag method is the new function to be called */ ttype(func) = LUA_TFUNCTION; } cl = clvalue(func); ci.func = cl; infovalue(func) = &ci; ttype(func) = LUA_TMARK; callhook = L->callhook; if (callhook) luaD_callHook(L, func, callhook, "call"); firstResult = (cl->isC ? callCclosure(L, cl, func+1) : luaV_execute(L, cl, func+1)); if (callhook) /* same hook that was active at entry */ luaD_callHook(L, func, callhook, "return"); LUA_ASSERT(ttype(func) == LUA_TMARK, "invalid tag"); /* move results to `func' (to erase parameters and function) */ if (nResults == LUA_MULTRET) { while (firstResult < L->top) /* copy all results */ *func++ = *firstResult++; L->top = func; } else { /* copy at most `nResults' */ for (; nResults > 0 && firstResult < L->top; nResults--) *func++ = *firstResult++; L->top = func; for (; nResults > 0; nResults--) { /* if there are not enough results */ ttype(L->top) = LUA_TNIL; /* adjust the stack */ incr_top; /* must check stack space */ } } luaC_checkGC(L); } /* ** Execute a protected call. */ struct CallS { /* data to `f_call' */ StkId func; int nresults; }; static void f_call (lua_State *L, void *ud) { struct CallS *c = (struct CallS *)ud; luaD_call(L, c->func, c->nresults); } LUA_API int lua_call (lua_State *L, int nargs, int nresults) { StkId func = L->top - (nargs+1); /* function to be called */ struct CallS c; int status; c.func = func; c.nresults = nresults; status = luaD_runprotected(L, f_call, &c); if (status != 0) /* an error occurred? */ L->top = func; /* remove parameters from the stack */ return status; } /* ** Execute a protected parser. */ struct ParserS { /* data to `f_parser' */ ZIO *z; int bin; }; static void f_parser (lua_State *L, void *ud) { struct ParserS *p = (struct ParserS *)ud; Proto *tf = p->bin ? luaU_undump(L, p->z) : luaY_parser(L, p->z); luaV_Lclosure(L, tf, 0); } static int protectedparser (lua_State *L, ZIO *z, int bin) { struct ParserS p; unsigned long old_blocks; int status; p.z = z; p.bin = bin; /* before parsing, give a (good) chance to GC */ if (L->nblocks/8 >= L->GCthreshold/10) luaC_collectgarbage(L); old_blocks = L->nblocks; status = luaD_runprotected(L, f_parser, &p); if (status == 0) { /* add new memory to threshold (as it probably will stay) */ L->GCthreshold += (L->nblocks - old_blocks); } else if (status == LUA_ERRRUN) /* an error occurred: correct error code */ status = LUA_ERRSYNTAX; return status; } static int parse_file (lua_State *L, const char *filename) { ZIO z; int status; int bin; /* flag for file mode */ int c; /* look ahead char */ FILE *f = (filename == NULL) ? stdin : fopen(filename, "r"); if (f == NULL) return LUA_ERRFILE; /* unable to open file */ c = fgetc(f); ungetc(c, f); bin = (c == ID_CHUNK); if (bin && f != stdin) { f = freopen(filename, "rb", f); /* set binary mode */ if (f == NULL) return LUA_ERRFILE; /* unable to reopen file */ } lua_pushstring(L, "@"); lua_pushstring(L, (filename == NULL) ? "(stdin)" : filename); lua_concat(L, 2); c = lua_gettop(L); filename = lua_tostring(L, c); /* filename = '@'..filename */ luaZ_Fopen(&z, f, filename); status = protectedparser(L, &z, bin); lua_remove(L, c); /* remove `filename' from the stack */ if (f != stdin) fclose(f); return status; } LUA_API int lua_dofile (lua_State *L, const char *filename) { int status = parse_file(L, filename); if (status == 0) /* parse OK? */ status = lua_call(L, 0, LUA_MULTRET); /* call main */ return status; } static int parse_buffer (lua_State *L, const char *buff, size_t size, const char *name) { ZIO z; if (!name) name = "?"; luaZ_mopen(&z, buff, size, name); return protectedparser(L, &z, buff[0]==ID_CHUNK); } LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size, const char *name) { int status = parse_buffer(L, buff, size, name); if (status == 0) /* parse OK? */ status = lua_call(L, 0, LUA_MULTRET); /* call main */ return status; } LUA_API int lua_dostring (lua_State *L, const char *str) { return lua_dobuffer(L, str, strlen(str), str); } /* ** {====================================================== ** Error-recover functions (based on long jumps) ** ======================================================= */ /* chain list of long jump buffers */ struct lua_longjmp { jmp_buf b; struct lua_longjmp *previous; volatile int status; /* error code */ }; static void message (lua_State *L, const char *s) { const TObject *em = luaH_getglobal(L, LUA_ERRORMESSAGE); if (ttype(em) == LUA_TFUNCTION) { *L->top = *em; incr_top; lua_pushstring(L, s); luaD_call(L, L->top-2, 0); } } /* ** Reports an error, and jumps up to the available recovery label */ LUA_API void lua_error (lua_State *L, const char *s) { if (s) message(L, s); luaD_breakrun(L, LUA_ERRRUN); } void luaD_breakrun (lua_State *L, int errcode) { if (L->errorJmp) { L->errorJmp->status = errcode; longjmp(L->errorJmp->b, 1); } else { if (errcode != LUA_ERRMEM) message(L, "unable to recover; exiting\n"); exit(EXIT_FAILURE); } } int luaD_runprotected (lua_State *L, void (*f)(lua_State *, void *), void *ud) { StkId oldCbase = L->Cbase; StkId oldtop = L->top; struct lua_longjmp lj; int allowhooks = L->allowhooks; lj.status = 0; lj.previous = L->errorJmp; /* chain new error handler */ L->errorJmp = &lj; if (setjmp(lj.b) == 0) (*f)(L, ud); else { /* an error occurred: restore the state */ L->allowhooks = allowhooks; L->Cbase = oldCbase; L->top = oldtop; restore_stack_limit(L); } L->errorJmp = lj.previous; /* restore old error handler */ return lj.status; } /* }====================================================== */ gltron-0.70/lua/src/lfunc.c0000644000076400001440000000456707432712643011275 /* ** $Id: lfunc.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Auxiliary functions to manipulate prototypes and closures ** See Copyright Notice in lua.h */ #include #include "lua.h" #include "lfunc.h" #include "lmem.h" #include "lstate.h" #define sizeclosure(n) ((int)sizeof(Closure) + (int)sizeof(TObject)*((n)-1)) Closure *luaF_newclosure (lua_State *L, int nelems) { int size = sizeclosure(nelems); Closure *c = (Closure *)luaM_malloc(L, size); c->next = L->rootcl; L->rootcl = c; c->mark = c; c->nupvalues = nelems; L->nblocks += size; return c; } Proto *luaF_newproto (lua_State *L) { Proto *f = luaM_new(L, Proto); f->knum = NULL; f->nknum = 0; f->kstr = NULL; f->nkstr = 0; f->kproto = NULL; f->nkproto = 0; f->code = NULL; f->ncode = 0; f->numparams = 0; f->is_vararg = 0; f->maxstacksize = 0; f->marked = 0; f->lineinfo = NULL; f->nlineinfo = 0; f->nlocvars = 0; f->locvars = NULL; f->lineDefined = 0; f->source = NULL; f->next = L->rootproto; /* chain in list of protos */ L->rootproto = f; return f; } static size_t protosize (Proto *f) { return sizeof(Proto) + f->nknum*sizeof(Number) + f->nkstr*sizeof(TString *) + f->nkproto*sizeof(Proto *) + f->ncode*sizeof(Instruction) + f->nlocvars*sizeof(struct LocVar) + f->nlineinfo*sizeof(int); } void luaF_protook (lua_State *L, Proto *f, int pc) { f->ncode = pc; /* signal that proto was properly created */ L->nblocks += protosize(f); } void luaF_freeproto (lua_State *L, Proto *f) { if (f->ncode > 0) /* function was properly created? */ L->nblocks -= protosize(f); luaM_free(L, f->code); luaM_free(L, f->locvars); luaM_free(L, f->kstr); luaM_free(L, f->knum); luaM_free(L, f->kproto); luaM_free(L, f->lineinfo); luaM_free(L, f); } void luaF_freeclosure (lua_State *L, Closure *c) { L->nblocks -= sizeclosure(c->nupvalues); luaM_free(L, c); } /* ** Look for n-th local variable at line `line' in function `func'. ** Returns NULL if not found. */ const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { int i; for (i = 0; inlocvars && f->locvars[i].startpc <= pc; i++) { if (pc < f->locvars[i].endpc) { /* is variable active? */ local_number--; if (local_number == 0) return f->locvars[i].varname->str; } } return NULL; /* not found */ } gltron-0.70/lua/src/lgc.c0000644000076400001440000002054107513504760010720 /* ** $Id: lgc.c,v 1.2 2002/07/12 07:49:04 jcatki Exp $ ** Garbage Collector ** See Copyright Notice in lua.h */ #include "lua.h" #include "ldo.h" #include "lfunc.h" #include "lgc.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" typedef struct GCState { Hash *tmark; /* list of marked tables to be visited */ Closure *cmark; /* list of marked closures to be visited */ } GCState; static void markobject (GCState *st, TObject *o); /* mark a string; marks larger than 1 cannot be changed */ #define strmark(s) {if ((s)->marked == 0) (s)->marked = 1;} static void protomark (Proto *f) { if (!f->marked) { int i; f->marked = 1; strmark(f->source); for (i=0; inkstr; i++) strmark(f->kstr[i]); for (i=0; inkproto; i++) protomark(f->kproto[i]); for (i=0; inlocvars; i++) /* mark local-variable names */ strmark(f->locvars[i].varname); } } static void markstack (lua_State *L, GCState *st) { StkId o; for (o=L->stack; otop; o++) markobject(st, o); } static void marklock (lua_State *L, GCState *st) { int i; for (i=0; irefSize; i++) { if (L->refArray[i].st == LOCK) markobject(st, &L->refArray[i].o); } } static void markclosure (GCState *st, Closure *cl) { if (!ismarked(cl)) { if (!cl->isC) protomark(cl->f.l); cl->mark = st->cmark; /* chain it for later traversal */ st->cmark = cl; } } static void marktagmethods (lua_State *L, GCState *st) { int e; for (e=0; elast_tag; t++) { Closure *cl = luaT_gettm(L, t, e); if (cl) markclosure(st, cl); } } } static void markobject (GCState *st, TObject *o) { switch (ttype(o)) { case LUA_TUSERDATA: case LUA_TSTRING: strmark(tsvalue(o)); break; case LUA_TMARK: markclosure(st, infovalue(o)->func); break; case LUA_TFUNCTION: markclosure(st, clvalue(o)); break; case LUA_TTABLE: { if (!ismarked(hvalue(o))) { hvalue(o)->mark = st->tmark; /* chain it in list of marked */ st->tmark = hvalue(o); } break; } default: break; /* numbers, etc */ } } static void markall (lua_State *L) { GCState st; st.cmark = NULL; st.tmark = L->gt; /* put table of globals in mark list */ L->gt->mark = NULL; marktagmethods(L, &st); /* mark tag methods */ markstack(L, &st); /* mark stack objects */ marklock(L, &st); /* mark locked objects */ for (;;) { /* mark tables and closures */ if (st.cmark) { int i; Closure *f = st.cmark; /* get first closure from list */ st.cmark = f->mark; /* remove it from list */ for (i=0; inupvalues; i++) /* mark its upvalues */ markobject(&st, &f->upvalue[i]); } else if (st.tmark) { int i; Hash *h = st.tmark; /* get first table from list */ st.tmark = h->mark; /* remove it from list */ for (i=0; isize; i++) { Node *n = node(h, i); if (ttype(key(n)) != LUA_TNIL) { if (ttype(val(n)) == LUA_TNIL) luaH_remove(h, key(n)); /* dead element; try to remove it */ markobject(&st, &n->key); markobject(&st, &n->val); } } } else break; /* nothing else to mark */ } } static int hasmark (const TObject *o) { /* valid only for locked objects */ switch (o->ttype) { case LUA_TSTRING: case LUA_TUSERDATA: return tsvalue(o)->marked; case LUA_TTABLE: return ismarked(hvalue(o)); case LUA_TFUNCTION: return ismarked(clvalue(o)); default: /* number */ return 1; } } /* macro for internal debugging; check if a link of free refs is valid */ #define VALIDLINK(L, st,n) (NONEXT <= (st) && (st) < (n)) static void invalidaterefs (lua_State *L) { int n = L->refSize; int i; for (i=0; irefArray[i]; if (r->st == HOLD && !hasmark(&r->o)) r->st = COLLECTED; LUA_ASSERT((r->st == LOCK && hasmark(&r->o)) || (r->st == HOLD && hasmark(&r->o)) || r->st == COLLECTED || r->st == NONEXT || (r->st < n && VALIDLINK(L, L->refArray[r->st].st, n)), "inconsistent ref table"); } LUA_ASSERT(VALIDLINK(L, L->refFree, n), "inconsistent ref table"); } static void collectproto (lua_State *L) { Proto **p = &L->rootproto; Proto *next; while ((next = *p) != NULL) { if (next->marked) { next->marked = 0; p = &next->next; } else { *p = next->next; luaF_freeproto(L, next); } } } static void collectclosure (lua_State *L) { Closure **p = &L->rootcl; Closure *next; while ((next = *p) != NULL) { if (ismarked(next)) { next->mark = next; /* unmark */ p = &next->next; } else { *p = next->next; luaF_freeclosure(L, next); } } } static void collecttable (lua_State *L) { Hash **p = &L->roottable; Hash *next; while ((next = *p) != NULL) { if (ismarked(next)) { next->mark = next; /* unmark */ p = &next->next; } else { *p = next->next; luaH_free(L, next); } } } static void checktab (lua_State *L, stringtable *tb) { if (tb->nuse < (lint32)(tb->size/4) && tb->size > 10) luaS_resize(L, tb, tb->size/2); /* table is too big */ } static void collectstrings (lua_State *L, int all) { int i; for (i=0; istrt.size; i++) { /* for each list */ TString **p = &L->strt.hash[i]; TString *next; while ((next = *p) != NULL) { if (next->marked && !all) { /* preserve? */ if (next->marked < FIXMARK) /* does not change FIXMARKs */ next->marked = 0; p = &next->nexthash; } else { /* collect */ *p = next->nexthash; L->strt.nuse--; L->nblocks -= sizestring(next->len); luaM_free(L, next); } } } checktab(L, &L->strt); } static void collectudata (lua_State *L, int all) { int i; for (i=0; iudt.size; i++) { /* for each list */ TString **p = &L->udt.hash[i]; TString *next; while ((next = *p) != NULL) { LUA_ASSERT(next->marked <= 1, "udata cannot be fixed"); if (next->marked && !all) { /* preserve? */ next->marked = 0; p = &next->nexthash; } else { /* collect */ int tag = next->u.d.tag; *p = next->nexthash; next->nexthash = L->TMtable[tag].collected; /* chain udata */ L->TMtable[tag].collected = next; L->nblocks -= sizestring(next->len); L->udt.nuse--; } } } checktab(L, &L->udt); } #define MINBUFFER 256 static void checkMbuffer (lua_State *L) { if (L->Mbuffsize > MINBUFFER*2) { /* is buffer too big? */ size_t newsize = L->Mbuffsize/2; /* still larger than MINBUFFER */ L->nblocks += (newsize - L->Mbuffsize)*sizeof(char); L->Mbuffsize = newsize; luaM_reallocvector(L, L->Mbuffer, newsize, char); } } static void callgcTM (lua_State *L, const TObject *o) { Closure *tm = luaT_gettmbyObj(L, o, TM_GC); if (tm != NULL) { int oldah = L->allowhooks; L->allowhooks = 0; /* stop debug hooks during GC tag methods */ luaD_checkstack(L, 2); clvalue(L->top) = tm; ttype(L->top) = LUA_TFUNCTION; *(L->top+1) = *o; L->top += 2; luaD_call(L, L->top-2, 0); L->allowhooks = oldah; /* restore hooks */ } } static void callgcTMudata (lua_State *L) { int tag; TObject o; ttype(&o) = LUA_TUSERDATA; L->GCthreshold = 2*L->nblocks; /* avoid GC during tag methods */ for (tag=L->last_tag; tag>=0; tag--) { /* for each tag (in reverse order) */ TString *udata; while ((udata = L->TMtable[tag].collected) != NULL) { L->TMtable[tag].collected = udata->nexthash; /* remove it from list */ tsvalue(&o) = udata; callgcTM(L, &o); luaM_free(L, udata); } } } void luaC_collect (lua_State *L, int all) { collectudata(L, all); callgcTMudata(L); collectstrings(L, all); collecttable(L); collectproto(L); collectclosure(L); } void luaC_collectgarbage (lua_State *L) { markall(L); invalidaterefs(L); /* check unlocked references */ luaC_collect(L, 0); checkMbuffer(L); L->GCthreshold = 2*L->nblocks; /* set new threshold */ callgcTM(L, &luaO_nilobject); } void luaC_checkGC (lua_State *L) { if (L->nblocks >= L->GCthreshold) luaC_collectgarbage(L); } gltron-0.70/lua/src/llex.c0000644000076400001440000002276307432712643011130 /* ** $Id: llex.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Lexical Analyzer ** See Copyright Notice in lua.h */ #include #include #include #include "lua.h" #include "llex.h" #include "lmem.h" #include "lobject.h" #include "lparser.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "luadebug.h" #include "lzio.h" #define next(LS) (LS->current = zgetc(LS->z)) /* ORDER RESERVED */ static const char *const token2string [] = { "and", "break", "do", "else", "elseif", "end", "for", "function", "if", "local", "nil", "not", "or", "repeat", "return", "then", "until", "while", "", "..", "...", "==", ">=", "<=", "~=", "", "", ""}; void luaX_init (lua_State *L) { int i; for (i=0; imarked = (unsigned char)(RESERVEDMARK+i); /* reserved word */ } } #define MAXSRC 80 void luaX_checklimit (LexState *ls, int val, int limit, const char *msg) { if (val > limit) { char buff[100]; sprintf(buff, "too many %.50s (limit=%d)", msg, limit); luaX_error(ls, buff, ls->t.token); } } void luaX_syntaxerror (LexState *ls, const char *s, const char *token) { char buff[MAXSRC]; luaO_chunkid(buff, ls->source->str, sizeof(buff)); luaO_verror(ls->L, "%.99s;\n last token read: `%.30s' at line %d in %.80s", s, token, ls->linenumber, buff); } void luaX_error (LexState *ls, const char *s, int token) { char buff[TOKEN_LEN]; luaX_token2str(token, buff); if (buff[0] == '\0') luaX_syntaxerror(ls, s, ls->L->Mbuffer); else luaX_syntaxerror(ls, s, buff); } void luaX_token2str (int token, char *s) { if (token < 256) { s[0] = (char)token; s[1] = '\0'; } else strcpy(s, token2string[token-FIRST_RESERVED]); } static void luaX_invalidchar (LexState *ls, int c) { char buff[8]; sprintf(buff, "0x%02X", c); luaX_syntaxerror(ls, "invalid control char", buff); } static void inclinenumber (LexState *LS) { next(LS); /* skip '\n' */ ++LS->linenumber; luaX_checklimit(LS, LS->linenumber, MAX_INT, "lines in a chunk"); } void luaX_setinput (lua_State *L, LexState *LS, ZIO *z, TString *source) { LS->L = L; LS->lookahead.token = TK_EOS; /* no look-ahead token */ LS->z = z; LS->fs = NULL; LS->linenumber = 1; LS->lastline = 1; LS->source = source; next(LS); /* read first char */ if (LS->current == '#') { do { /* skip first line */ next(LS); } while (LS->current != '\n' && LS->current != EOZ); } } /* ** ======================================================= ** LEXICAL ANALYZER ** ======================================================= */ /* use Mbuffer to store names, literal strings and numbers */ #define EXTRABUFF 128 #define checkbuffer(L, n, len) if ((len)+(n) > L->Mbuffsize) \ luaO_openspace(L, (len)+(n)+EXTRABUFF) #define save(L, c, l) (L->Mbuffer[l++] = (char)c) #define save_and_next(L, LS, l) (save(L, LS->current, l), next(LS)) static const char *readname (LexState *LS) { lua_State *L = LS->L; size_t l = 0; checkbuffer(L, 10, l); do { checkbuffer(L, 10, l); save_and_next(L, LS, l); } while (isalnum(LS->current) || LS->current == '_'); save(L, '\0', l); return L->Mbuffer; } /* LUA_NUMBER */ static void read_number (LexState *LS, int comma, SemInfo *seminfo) { lua_State *L = LS->L; size_t l = 0; checkbuffer(L, 10, l); if (comma) save(L, '.', l); while (isdigit(LS->current)) { checkbuffer(L, 10, l); save_and_next(L, LS, l); } if (LS->current == '.') { save_and_next(L, LS, l); if (LS->current == '.') { save_and_next(L, LS, l); save(L, '\0', l); luaX_error(LS, "ambiguous syntax" " (decimal point x string concatenation)", TK_NUMBER); } } while (isdigit(LS->current)) { checkbuffer(L, 10, l); save_and_next(L, LS, l); } if (LS->current == 'e' || LS->current == 'E') { save_and_next(L, LS, l); /* read 'E' */ if (LS->current == '+' || LS->current == '-') save_and_next(L, LS, l); /* optional exponent sign */ while (isdigit(LS->current)) { checkbuffer(L, 10, l); save_and_next(L, LS, l); } } save(L, '\0', l); if (!luaO_str2d(L->Mbuffer, &seminfo->r)) luaX_error(LS, "malformed number", TK_NUMBER); } static void read_long_string (LexState *LS, SemInfo *seminfo) { lua_State *L = LS->L; int cont = 0; size_t l = 0; checkbuffer(L, 10, l); save(L, '[', l); /* save first '[' */ save_and_next(L, LS, l); /* pass the second '[' */ for (;;) { checkbuffer(L, 10, l); switch (LS->current) { case EOZ: save(L, '\0', l); luaX_error(LS, "unfinished long string", TK_STRING); break; /* to avoid warnings */ case '[': save_and_next(L, LS, l); if (LS->current == '[') { cont++; save_and_next(L, LS, l); } continue; case ']': save_and_next(L, LS, l); if (LS->current == ']') { if (cont == 0) goto endloop; cont--; save_and_next(L, LS, l); } continue; case '\n': save(L, '\n', l); inclinenumber(LS); continue; default: save_and_next(L, LS, l); } } endloop: save_and_next(L, LS, l); /* skip the second ']' */ save(L, '\0', l); seminfo->ts = luaS_newlstr(L, L->Mbuffer+2, l-5); } static void read_string (LexState *LS, int del, SemInfo *seminfo) { lua_State *L = LS->L; size_t l = 0; checkbuffer(L, 10, l); save_and_next(L, LS, l); while (LS->current != del) { checkbuffer(L, 10, l); switch (LS->current) { case EOZ: case '\n': save(L, '\0', l); luaX_error(LS, "unfinished string", TK_STRING); break; /* to avoid warnings */ case '\\': next(LS); /* do not save the '\' */ switch (LS->current) { case 'a': save(L, '\a', l); next(LS); break; case 'b': save(L, '\b', l); next(LS); break; case 'f': save(L, '\f', l); next(LS); break; case 'n': save(L, '\n', l); next(LS); break; case 'r': save(L, '\r', l); next(LS); break; case 't': save(L, '\t', l); next(LS); break; case 'v': save(L, '\v', l); next(LS); break; case '\n': save(L, '\n', l); inclinenumber(LS); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { int c = 0; int i = 0; do { c = 10*c + (LS->current-'0'); next(LS); } while (++i<3 && isdigit(LS->current)); if (c != (unsigned char)c) { save(L, '\0', l); luaX_error(LS, "escape sequence too large", TK_STRING); } save(L, c, l); break; } default: /* handles \\, \", \', and \? */ save_and_next(L, LS, l); } break; default: save_and_next(L, LS, l); } } save_and_next(L, LS, l); /* skip delimiter */ save(L, '\0', l); seminfo->ts = luaS_newlstr(L, L->Mbuffer+1, l-3); } int luaX_lex (LexState *LS, SemInfo *seminfo) { for (;;) { switch (LS->current) { case ' ': case '\t': case '\r': /* `\r' to avoid problems with DOS */ next(LS); continue; case '\n': inclinenumber(LS); continue; case '$': luaX_error(LS, "unexpected `$' (pragmas are no longer supported)", '$'); break; case '-': next(LS); if (LS->current != '-') return '-'; do { next(LS); } while (LS->current != '\n' && LS->current != EOZ); continue; case '[': next(LS); if (LS->current != '[') return '['; else { read_long_string(LS, seminfo); return TK_STRING; } case '=': next(LS); if (LS->current != '=') return '='; else { next(LS); return TK_EQ; } case '<': next(LS); if (LS->current != '=') return '<'; else { next(LS); return TK_LE; } case '>': next(LS); if (LS->current != '=') return '>'; else { next(LS); return TK_GE; } case '~': next(LS); if (LS->current != '=') return '~'; else { next(LS); return TK_NE; } case '"': case '\'': read_string(LS, LS->current, seminfo); return TK_STRING; case '.': next(LS); if (LS->current == '.') { next(LS); if (LS->current == '.') { next(LS); return TK_DOTS; /* ... */ } else return TK_CONCAT; /* .. */ } else if (!isdigit(LS->current)) return '.'; else { read_number(LS, 1, seminfo); return TK_NUMBER; } case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': read_number(LS, 0, seminfo); return TK_NUMBER; case EOZ: return TK_EOS; case '_': goto tname; default: if (!isalpha(LS->current)) { int c = LS->current; if (iscntrl(c)) luaX_invalidchar(LS, c); next(LS); return c; } tname: { /* identifier or reserved word */ TString *ts = luaS_new(LS->L, readname(LS)); if (ts->marked >= RESERVEDMARK) /* reserved word? */ return ts->marked-RESERVEDMARK+FIRST_RESERVED; seminfo->ts = ts; return TK_NAME; } } } } gltron-0.70/lua/src/lmem.c0000644000076400001440000000745107432712643011113 /* ** $Id: lmem.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Interface to Memory Manager ** See Copyright Notice in lua.h */ #include #include "lua.h" #include "ldo.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" #ifdef LUA_DEBUG /* ** {====================================================================== ** Controlled version for realloc. ** ======================================================================= */ #include #include #include #define realloc(b, s) debug_realloc(b, s) #define malloc(b) debug_realloc(NULL, b) #define free(b) debug_realloc(b, 0) /* ensures maximum alignment for HEADER */ #define HEADER (sizeof(union L_Umaxalign)) #define MARKSIZE 16 #define MARK 0x55 /* 01010101 (a nice pattern) */ #define blocksize(b) ((unsigned long *)((char *)(b) - HEADER)) unsigned long memdebug_numblocks = 0; unsigned long memdebug_total = 0; unsigned long memdebug_maxmem = 0; unsigned long memdebug_memlimit = LONG_MAX; static void *checkblock (void *block) { unsigned long *b = blocksize(block); unsigned long size = *b; int i; for (i=0;i memdebug_memlimit) return NULL; /* to test memory allocation errors */ else { size_t realsize = HEADER+size+MARKSIZE; char *newblock = (char *)(malloc)(realsize); /* alloc a new block */ int i; if (realsize < size) return NULL; /* overflow! */ if (newblock == NULL) return NULL; if (block) { size_t oldsize = *blocksize(block); if (oldsize > size) oldsize = size; memcpy(newblock+HEADER, block, oldsize); freeblock(block); /* erase (and check) old copy */ } memdebug_total += size; if (memdebug_total > memdebug_maxmem) memdebug_maxmem = memdebug_total; memdebug_numblocks++; *(unsigned long *)newblock = size; for (i=0;i= limit-inc) lua_error(L, errormsg); if ((newn ^ nelems) <= nelems || /* still the same power-of-2 limit? */ (nelems > 0 && newn < MINPOWER2)) /* or block already is MINPOWER2? */ return block; /* do not need to reallocate */ else /* it crossed a power-of-2 boundary; grow to next power */ return luaM_realloc(L, block, luaO_power2(newn)*size); } /* ** generic allocation routine. */ void *luaM_realloc (lua_State *L, void *block, lint32 size) { if (size == 0) { free(block); /* block may be NULL; that is OK for free */ return NULL; } else if (size >= MAX_SIZET) lua_error(L, "memory allocation error: block too big"); block = realloc(block, size); if (block == NULL) { if (L) luaD_breakrun(L, LUA_ERRMEM); /* break run without error message */ else return NULL; /* error before creating state! */ } return block; } gltron-0.70/lua/src/lobject.c0000644000076400001440000000601107432712643011572 /* ** $Id: lobject.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Some generic functions over Lua objects ** See Copyright Notice in lua.h */ #include #include #include #include #include #include "lua.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" const TObject luaO_nilobject = {LUA_TNIL, {NULL}}; const char *const luaO_typenames[] = { "userdata", "nil", "number", "string", "table", "function" }; /* ** returns smaller power of 2 larger than `n' (minimum is MINPOWER2) */ lint32 luaO_power2 (lint32 n) { lint32 p = MINPOWER2; while (p<=n) p<<=1; return p; } int luaO_equalObj (const TObject *t1, const TObject *t2) { if (ttype(t1) != ttype(t2)) return 0; switch (ttype(t1)) { case LUA_TNUMBER: return nvalue(t1) == nvalue(t2); case LUA_TSTRING: case LUA_TUSERDATA: return tsvalue(t1) == tsvalue(t2); case LUA_TTABLE: return hvalue(t1) == hvalue(t2); case LUA_TFUNCTION: return clvalue(t1) == clvalue(t2); default: LUA_ASSERT(ttype(t1) == LUA_TNIL, "invalid type"); return 1; /* LUA_TNIL */ } } char *luaO_openspace (lua_State *L, size_t n) { if (n > L->Mbuffsize) { luaM_reallocvector(L, L->Mbuffer, n, char); L->nblocks += (n - L->Mbuffsize)*sizeof(char); L->Mbuffsize = n; } return L->Mbuffer; } int luaO_str2d (const char *s, Number *result) { /* LUA_NUMBER */ char *endptr; Number res = lua_str2number(s, &endptr); if (endptr == s) return 0; /* no conversion */ while (isspace((unsigned char)*endptr)) endptr++; if (*endptr != '\0') return 0; /* invalid trailing characters? */ *result = res; return 1; } /* maximum length of a string format for `luaO_verror' */ #define MAX_VERROR 280 /* this function needs to handle only '%d' and '%.XXs' formats */ void luaO_verror (lua_State *L, const char *fmt, ...) { va_list argp; char buff[MAX_VERROR]; /* to hold formatted message */ va_start(argp, fmt); vsprintf(buff, fmt, argp); va_end(argp); lua_error(L, buff); } void luaO_chunkid (char *out, const char *source, int bufflen) { if (*source == '=') { strncpy(out, source+1, bufflen); /* remove first char */ out[bufflen-1] = '\0'; /* ensures null termination */ } else { if (*source == '@') { int l; source++; /* skip the `@' */ bufflen -= sizeof("file `...%s'"); l = strlen(source); if (l>bufflen) { source += (l-bufflen); /* get last part of file name */ sprintf(out, "file `...%.99s'", source); } else sprintf(out, "file `%.99s'", source); } else { int len = strcspn(source, "\n"); /* stop at first newline */ bufflen -= sizeof("string \"%.*s...\""); if (len > bufflen) len = bufflen; if (source[len] != '\0') { /* must truncate? */ strcpy(out, "string \""); out += strlen(out); strncpy(out, source, len); strcpy(out+len, "...\""); } else sprintf(out, "string \"%.99s\"", source); } } } gltron-0.70/lua/src/lparser.c0000644000076400001440000007177507513504760011642 /* ** $Id: lparser.c,v 1.2 2002/07/12 07:49:04 jcatki Exp $ ** LL(1) Parser and code generator for Lua ** See Copyright Notice in lua.h */ #include #include #include "lua.h" #include "lcode.h" #include "lfunc.h" #include "llex.h" #include "lmem.h" #include "lobject.h" #include "lopcodes.h" #include "lparser.h" #include "lstate.h" #include "lstring.h" /* ** Constructors descriptor: ** `n' indicates number of elements, and `k' signals whether ** it is a list constructor (k = 0) or a record constructor (k = 1) ** or empty (k = ';' or '}') */ typedef struct Constdesc { int n; int k; } Constdesc; typedef struct Breaklabel { struct Breaklabel *previous; /* chain */ int breaklist; int stacklevel; } Breaklabel; /* ** prototypes for recursive non-terminal functions */ static void body (LexState *ls, int needself, int line); static void chunk (LexState *ls); static void constructor (LexState *ls); static void expr (LexState *ls, expdesc *v); static void exp1 (LexState *ls); static void next (LexState *ls) { ls->lastline = ls->linenumber; if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ ls->t = ls->lookahead; /* use this one */ ls->lookahead.token = TK_EOS; /* and discharge it */ } else ls->t.token = luaX_lex(ls, &ls->t.seminfo); /* read next token */ } static void lookahead (LexState *ls) { LUA_ASSERT(ls->lookahead.token == TK_EOS, "two look-aheads"); ls->lookahead.token = luaX_lex(ls, &ls->lookahead.seminfo); } static void error_expected (LexState *ls, int token) { char buff[100], t[TOKEN_LEN]; luaX_token2str(token, t); sprintf(buff, "`%.20s' expected", t); luaK_error(ls, buff); } static void check (LexState *ls, int c) { if (ls->t.token != c) error_expected(ls, c); next(ls); } static void check_condition (LexState *ls, int c, const char *msg) { if (!c) luaK_error(ls, msg); } static int optional (LexState *ls, int c) { if (ls->t.token == c) { next(ls); return 1; } else return 0; } static void check_match (LexState *ls, int what, int who, int where) { if (ls->t.token != what) { if (where == ls->linenumber) error_expected(ls, what); else { char buff[100]; char t_what[TOKEN_LEN], t_who[TOKEN_LEN]; luaX_token2str(what, t_what); luaX_token2str(who, t_who); sprintf(buff, "`%.20s' expected (to close `%.20s' at line %d)", t_what, t_who, where); luaK_error(ls, buff); } } next(ls); } static int string_constant (FuncState *fs, TString *s) { Proto *f = fs->f; int c = s->u.s.constindex; if (c >= f->nkstr || f->kstr[c] != s) { luaM_growvector(fs->L, f->kstr, f->nkstr, 1, TString *, "constant table overflow", MAXARG_U); c = f->nkstr++; f->kstr[c] = s; s->u.s.constindex = c; /* hint for next time */ } return c; } static void code_string (LexState *ls, TString *s) { luaK_kstr(ls, string_constant(ls->fs, s)); } static TString *str_checkname (LexState *ls) { TString *ts; check_condition(ls, (ls->t.token == TK_NAME), " expected"); ts = ls->t.seminfo.ts; next(ls); return ts; } static int checkname (LexState *ls) { return string_constant(ls->fs, str_checkname(ls)); } static int luaI_registerlocalvar (LexState *ls, TString *varname) { Proto *f = ls->fs->f; luaM_growvector(ls->L, f->locvars, f->nlocvars, 1, LocVar, "", MAX_INT); f->locvars[f->nlocvars].varname = varname; return f->nlocvars++; } static void new_localvar (LexState *ls, TString *name, int n) { FuncState *fs = ls->fs; luaX_checklimit(ls, fs->nactloc+n+1, MAXLOCALS, "local variables"); fs->actloc[fs->nactloc+n] = luaI_registerlocalvar(ls, name); } static void adjustlocalvars (LexState *ls, int nvars) { FuncState *fs = ls->fs; while (nvars--) fs->f->locvars[fs->actloc[fs->nactloc++]].startpc = fs->pc; } static void removelocalvars (LexState *ls, int nvars) { FuncState *fs = ls->fs; while (nvars--) fs->f->locvars[fs->actloc[--fs->nactloc]].endpc = fs->pc; } static void new_localvarstr (LexState *ls, const char *name, int n) { new_localvar(ls, luaS_newfixed(ls->L, name), n); } static int search_local (LexState *ls, TString *n, expdesc *var) { FuncState *fs; int level = 0; for (fs=ls->fs; fs; fs=fs->prev) { int i; for (i=fs->nactloc-1; i >= 0; i--) { if (n == fs->f->locvars[fs->actloc[i]].varname) { var->k = VLOCAL; var->u.index = i; return level; } } level++; /* `var' not found; check outer level */ } var->k = VGLOBAL; /* not found in any level; must be global */ return -1; } static void singlevar (LexState *ls, TString *n, expdesc *var) { int level = search_local(ls, n, var); if (level >= 1) /* neither local (0) nor global (-1)? */ luaX_syntaxerror(ls, "cannot access a variable in outer scope", n->str); else if (level == -1) /* global? */ var->u.index = string_constant(ls->fs, n); } static int indexupvalue (LexState *ls, expdesc *v) { FuncState *fs = ls->fs; int i; for (i=0; inupvalues; i++) { if (fs->upvalues[i].k == v->k && fs->upvalues[i].u.index == v->u.index) return i; } /* new one */ luaX_checklimit(ls, fs->nupvalues+1, MAXUPVALUES, "upvalues"); fs->upvalues[fs->nupvalues] = *v; return fs->nupvalues++; } static void pushupvalue (LexState *ls, TString *n) { FuncState *fs = ls->fs; expdesc v; int level = search_local(ls, n, &v); if (level == -1) { /* global? */ if (fs->prev == NULL) luaX_syntaxerror(ls, "cannot access upvalue in main", n->str); v.u.index = string_constant(fs->prev, n); } else if (level != 1) luaX_syntaxerror(ls, "upvalue must be global or local to immediately outer scope", n->str); luaK_code1(fs, OP_PUSHUPVALUE, indexupvalue(ls, &v)); } static void adjust_mult_assign (LexState *ls, int nvars, int nexps) { FuncState *fs = ls->fs; int diff = nexps - nvars; if (nexps > 0 && luaK_lastisopen(fs)) { /* list ends in a function call */ diff--; /* do not count function call itself */ if (diff <= 0) { /* more variables than values? */ luaK_setcallreturns(fs, -diff); /* function call provide extra values */ diff = 0; /* no more difference */ } else /* more values than variables */ luaK_setcallreturns(fs, 0); /* call should provide no value */ } /* push or pop eventual difference between list lengths */ luaK_adjuststack(fs, diff); } static void code_params (LexState *ls, int nparams, int dots) { FuncState *fs = ls->fs; adjustlocalvars(ls, nparams); luaX_checklimit(ls, fs->nactloc, MAXPARAMS, "parameters"); fs->f->numparams = fs->nactloc; /* `self' could be there already */ fs->f->is_vararg = dots; if (dots) { new_localvarstr(ls, "arg", 0); adjustlocalvars(ls, 1); } luaK_deltastack(fs, fs->nactloc); /* count parameters in the stack */ } static void enterbreak (FuncState *fs, Breaklabel *bl) { bl->stacklevel = fs->stacklevel; bl->breaklist = NO_JUMP; bl->previous = fs->bl; fs->bl = bl; } static void leavebreak (FuncState *fs, Breaklabel *bl) { fs->bl = bl->previous; LUA_ASSERT(bl->stacklevel == fs->stacklevel, "wrong levels"); luaK_patchlist(fs, bl->breaklist, luaK_getlabel(fs)); } static void pushclosure (LexState *ls, FuncState *func) { FuncState *fs = ls->fs; Proto *f = fs->f; int i; for (i=0; inupvalues; i++) luaK_tostack(ls, &func->upvalues[i], 1); luaM_growvector(ls->L, f->kproto, f->nkproto, 1, Proto *, "constant table overflow", MAXARG_A); f->kproto[f->nkproto++] = func->f; luaK_code2(fs, OP_CLOSURE, f->nkproto-1, func->nupvalues); } static void open_func (LexState *ls, FuncState *fs) { Proto *f = luaF_newproto(ls->L); fs->prev = ls->fs; /* linked list of funcstates */ fs->ls = ls; fs->L = ls->L; ls->fs = fs; fs->stacklevel = 0; fs->nactloc = 0; fs->nupvalues = 0; fs->bl = NULL; fs->f = f; f->source = ls->source; fs->pc = 0; fs->lasttarget = 0; fs->lastline = 0; fs->jlt = NO_JUMP; f->code = NULL; f->maxstacksize = 0; f->numparams = 0; /* default for main chunk */ f->is_vararg = 0; /* default for main chunk */ } static void close_func (LexState *ls) { lua_State *L = ls->L; FuncState *fs = ls->fs; Proto *f = fs->f; luaK_code0(fs, OP_END); luaK_getlabel(fs); /* close eventual list of pending jumps */ luaM_reallocvector(L, f->code, fs->pc, Instruction); luaM_reallocvector(L, f->kstr, f->nkstr, TString *); luaM_reallocvector(L, f->knum, f->nknum, Number); luaM_reallocvector(L, f->kproto, f->nkproto, Proto *); removelocalvars(ls, fs->nactloc); luaM_reallocvector(L, f->locvars, f->nlocvars, LocVar); luaM_reallocvector(L, f->lineinfo, f->nlineinfo+1, int); f->lineinfo[f->nlineinfo++] = MAX_INT; /* end flag */ luaF_protook(L, f, fs->pc); /* proto is ok now */ ls->fs = fs->prev; LUA_ASSERT(fs->bl == NULL, "wrong list end"); } Proto *luaY_parser (lua_State *L, ZIO *z) { struct LexState lexstate; struct FuncState funcstate; luaX_setinput(L, &lexstate, z, luaS_new(L, zname(z))); open_func(&lexstate, &funcstate); next(&lexstate); /* read first token */ chunk(&lexstate); check_condition(&lexstate, (lexstate.t.token == TK_EOS), " expected"); close_func(&lexstate); LUA_ASSERT(funcstate.prev == NULL, "wrong list end"); LUA_ASSERT(funcstate.nupvalues == 0, "no upvalues in main"); return funcstate.f; } /*============================================================*/ /* GRAMMAR RULES */ /*============================================================*/ static int explist1 (LexState *ls) { /* explist1 -> expr { ',' expr } */ int n = 1; /* at least one expression */ expdesc v; expr(ls, &v); while (ls->t.token == ',') { luaK_tostack(ls, &v, 1); /* gets only 1 value from previous expression */ next(ls); /* skip comma */ expr(ls, &v); n++; } luaK_tostack(ls, &v, 0); /* keep open number of values of last expression */ return n; } static void funcargs (LexState *ls, int slf) { FuncState *fs = ls->fs; int slevel = fs->stacklevel - slf - 1; /* where is func in the stack */ switch (ls->t.token) { case '(': { /* funcargs -> '(' [ explist1 ] ')' */ int line = ls->linenumber; int nargs = 0; next(ls); if (ls->t.token != ')') /* arg list not empty? */ nargs = explist1(ls); check_match(ls, ')', '(', line); #ifdef LUA_COMPAT_ARGRET if (nargs > 0) /* arg list is not empty? */ luaK_setcallreturns(fs, 1); /* last call returns only 1 value */ #else UNUSED(nargs); /* to avoid warnings */ #endif break; } case '{': { /* funcargs -> constructor */ constructor(ls); break; } case TK_STRING: { /* funcargs -> STRING */ code_string(ls, ls->t.seminfo.ts); /* must use `seminfo' before `next' */ next(ls); break; } default: { luaK_error(ls, "function arguments expected"); break; } } fs->stacklevel = slevel; /* call will remove function and arguments */ luaK_code2(fs, OP_CALL, slevel, MULT_RET); } static void var_or_func_tail (LexState *ls, expdesc *v) { for (;;) { switch (ls->t.token) { case '.': { /* var_or_func_tail -> '.' NAME */ next(ls); luaK_tostack(ls, v, 1); /* `v' must be on stack */ luaK_kstr(ls, checkname(ls)); v->k = VINDEXED; break; } case '[': { /* var_or_func_tail -> '[' exp1 ']' */ next(ls); luaK_tostack(ls, v, 1); /* `v' must be on stack */ v->k = VINDEXED; exp1(ls); check(ls, ']'); break; } case ':': { /* var_or_func_tail -> ':' NAME funcargs */ int name; next(ls); name = checkname(ls); luaK_tostack(ls, v, 1); /* `v' must be on stack */ luaK_code1(ls->fs, OP_PUSHSELF, name); funcargs(ls, 1); v->k = VEXP; v->u.l.t = v->u.l.f = NO_JUMP; break; } case '(': case TK_STRING: case '{': { /* var_or_func_tail -> funcargs */ luaK_tostack(ls, v, 1); /* `v' must be on stack */ funcargs(ls, 0); v->k = VEXP; v->u.l.t = v->u.l.f = NO_JUMP; break; } default: return; /* should be follow... */ } } } static void var_or_func (LexState *ls, expdesc *v) { /* var_or_func -> ['%'] NAME var_or_func_tail */ if (optional(ls, '%')) { /* upvalue? */ pushupvalue(ls, str_checkname(ls)); v->k = VEXP; v->u.l.t = v->u.l.f = NO_JUMP; } else /* variable name */ singlevar(ls, str_checkname(ls), v); var_or_func_tail(ls, v); } /* ** {====================================================================== ** Rules for Constructors ** ======================================================================= */ static void recfield (LexState *ls) { /* recfield -> (NAME | '['exp1']') = exp1 */ switch (ls->t.token) { case TK_NAME: { luaK_kstr(ls, checkname(ls)); break; } case '[': { next(ls); exp1(ls); check(ls, ']'); break; } default: luaK_error(ls, " or `[' expected"); } check(ls, '='); exp1(ls); } static int recfields (LexState *ls) { /* recfields -> recfield { ',' recfield } [','] */ FuncState *fs = ls->fs; int n = 1; /* at least one element */ recfield(ls); while (ls->t.token == ',') { next(ls); if (ls->t.token == ';' || ls->t.token == '}') break; recfield(ls); n++; if (n%RFIELDS_PER_FLUSH == 0) luaK_code1(fs, OP_SETMAP, RFIELDS_PER_FLUSH); } luaK_code1(fs, OP_SETMAP, n%RFIELDS_PER_FLUSH); return n; } static int listfields (LexState *ls) { /* listfields -> exp1 { ',' exp1 } [','] */ FuncState *fs = ls->fs; int n = 1; /* at least one element */ exp1(ls); while (ls->t.token == ',') { next(ls); if (ls->t.token == ';' || ls->t.token == '}') break; exp1(ls); n++; luaX_checklimit(ls, n/LFIELDS_PER_FLUSH, MAXARG_A, "`item groups' in a list initializer"); if (n%LFIELDS_PER_FLUSH == 0) luaK_code2(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH - 1, LFIELDS_PER_FLUSH); } luaK_code2(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH, n%LFIELDS_PER_FLUSH); return n; } static void constructor_part (LexState *ls, Constdesc *cd) { switch (ls->t.token) { case ';': case '}': { /* constructor_part -> empty */ cd->n = 0; cd->k = ls->t.token; break; } case TK_NAME: { /* may be listfields or recfields */ lookahead(ls); if (ls->lookahead.token != '=') /* expression? */ goto case_default; /* else go through to recfields */ } case '[': { /* constructor_part -> recfields */ cd->n = recfields(ls); cd->k = 1; /* record */ break; } default: { /* constructor_part -> listfields */ case_default: cd->n = listfields(ls); cd->k = 0; /* list */ break; } } } static void constructor (LexState *ls) { /* constructor -> '{' constructor_part [';' constructor_part] '}' */ FuncState *fs = ls->fs; int line = ls->linenumber; int pc = luaK_code1(fs, OP_CREATETABLE, 0); int nelems; Constdesc cd; check(ls, '{'); constructor_part(ls, &cd); nelems = cd.n; if (optional(ls, ';')) { Constdesc other_cd; constructor_part(ls, &other_cd); check_condition(ls, (cd.k != other_cd.k), "invalid constructor syntax"); nelems += other_cd.n; } check_match(ls, '}', '{', line); luaX_checklimit(ls, nelems, MAXARG_U, "elements in a table constructor"); SETARG_U(fs->f->code[pc], nelems); /* set initial table size */ } /* }====================================================================== */ /* ** {====================================================================== ** Expression parsing ** ======================================================================= */ static void simpleexp (LexState *ls, expdesc *v) { FuncState *fs = ls->fs; switch (ls->t.token) { case TK_NUMBER: { /* simpleexp -> NUMBER */ Number r = ls->t.seminfo.r; next(ls); luaK_number(fs, r); break; } case TK_STRING: { /* simpleexp -> STRING */ code_string(ls, ls->t.seminfo.ts); /* must use `seminfo' before `next' */ next(ls); break; } case TK_NIL: { /* simpleexp -> NIL */ luaK_adjuststack(fs, -1); next(ls); break; } case '{': { /* simpleexp -> constructor */ constructor(ls); break; } case TK_FUNCTION: { /* simpleexp -> FUNCTION body */ next(ls); body(ls, 0, ls->linenumber); break; } case '(': { /* simpleexp -> '(' expr ')' */ next(ls); expr(ls, v); check(ls, ')'); return; } case TK_NAME: case '%': { var_or_func(ls, v); return; } default: { luaK_error(ls, " expected"); return; } } v->k = VEXP; v->u.l.t = v->u.l.f = NO_JUMP; } static void exp1 (LexState *ls) { expdesc v; expr(ls, &v); luaK_tostack(ls, &v, 1); } static UnOpr getunopr (int op) { switch (op) { case TK_NOT: return OPR_NOT; case '-': return OPR_MINUS; default: return OPR_NOUNOPR; } } static BinOpr getbinopr (int op) { switch (op) { case '+': return OPR_ADD; case '-': return OPR_SUB; case '*': return OPR_MULT; case '/': return OPR_DIV; case '^': return OPR_POW; case TK_CONCAT: return OPR_CONCAT; case TK_NE: return OPR_NE; case TK_EQ: return OPR_EQ; case '<': return OPR_LT; case TK_LE: return OPR_LE; case '>': return OPR_GT; case TK_GE: return OPR_GE; case TK_AND: return OPR_AND; case TK_OR: return OPR_OR; default: return OPR_NOBINOPR; } } static const struct { char left; /* left priority for each binary operator */ char right; /* right priority */ } priority[] = { /* ORDER OPR */ {5, 5}, {5, 5}, {6, 6}, {6, 6}, /* arithmetic */ {9, 8}, {4, 3}, /* power and concat (right associative) */ {2, 2}, {2, 2}, /* equality */ {2, 2}, {2, 2}, {2, 2}, {2, 2}, /* order */ {1, 1}, {1, 1} /* logical */ }; #define UNARY_PRIORITY 7 /* priority for unary operators */ /* ** subexpr -> (simplexep | unop subexpr) { binop subexpr } ** where `binop' is any binary operator with a priority higher than `limit' */ static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { BinOpr op; UnOpr uop = getunopr(ls->t.token); if (uop != OPR_NOUNOPR) { next(ls); subexpr(ls, v, UNARY_PRIORITY); luaK_prefix(ls, uop, v); } else simpleexp(ls, v); /* expand while operators have priorities higher than `limit' */ op = getbinopr(ls->t.token); while (op != OPR_NOBINOPR && priority[op].left > limit) { expdesc v2; BinOpr nextop; next(ls); luaK_infix(ls, op, v); /* read sub-expression with higher priority */ nextop = subexpr(ls, &v2, priority[op].right); luaK_posfix(ls, op, v, &v2); op = nextop; } return op; /* return first untreated operator */ } static void expr (LexState *ls, expdesc *v) { subexpr(ls, v, -1); } /* }==================================================================== */ /* ** {====================================================================== ** Rules for Statements ** ======================================================================= */ static int block_follow (int token) { switch (token) { case TK_ELSE: case TK_ELSEIF: case TK_END: case TK_UNTIL: case TK_EOS: return 1; default: return 0; } } static void block (LexState *ls) { /* block -> chunk */ FuncState *fs = ls->fs; int nactloc = fs->nactloc; chunk(ls); luaK_adjuststack(fs, fs->nactloc - nactloc); /* remove local variables */ removelocalvars(ls, fs->nactloc - nactloc); } static int assignment (LexState *ls, expdesc *v, int nvars) { int left = 0; /* number of values left in the stack after assignment */ luaX_checklimit(ls, nvars, MAXVARSLH, "variables in a multiple assignment"); if (ls->t.token == ',') { /* assignment -> ',' NAME assignment */ expdesc nv; next(ls); var_or_func(ls, &nv); check_condition(ls, (nv.k != VEXP), "syntax error"); left = assignment(ls, &nv, nvars+1); } else { /* assignment -> '=' explist1 */ int nexps; check(ls, '='); nexps = explist1(ls); adjust_mult_assign(ls, nvars, nexps); } if (v->k != VINDEXED) luaK_storevar(ls, v); else { /* there may be garbage between table-index and value */ luaK_code2(ls->fs, OP_SETTABLE, left+nvars+2, 1); left += 2; } return left; } static void cond (LexState *ls, expdesc *v) { /* cond -> exp */ expr(ls, v); /* read condition */ luaK_goiftrue(ls->fs, v, 0); } static void whilestat (LexState *ls, int line) { /* whilestat -> WHILE cond DO block END */ FuncState *fs = ls->fs; int while_init = luaK_getlabel(fs); expdesc v; Breaklabel bl; enterbreak(fs, &bl); next(ls); cond(ls, &v); check(ls, TK_DO); block(ls); luaK_patchlist(fs, luaK_jump(fs), while_init); luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); check_match(ls, TK_END, TK_WHILE, line); leavebreak(fs, &bl); } static void repeatstat (LexState *ls, int line) { /* repeatstat -> REPEAT block UNTIL cond */ FuncState *fs = ls->fs; int repeat_init = luaK_getlabel(fs); expdesc v; Breaklabel bl; enterbreak(fs, &bl); next(ls); block(ls); check_match(ls, TK_UNTIL, TK_REPEAT, line); cond(ls, &v); luaK_patchlist(fs, v.u.l.f, repeat_init); leavebreak(fs, &bl); } static void forbody (LexState *ls, int nvar, OpCode prepfor, OpCode loopfor) { /* forbody -> DO block END */ FuncState *fs = ls->fs; int prep = luaK_code1(fs, prepfor, NO_JUMP); int blockinit = luaK_getlabel(fs); check(ls, TK_DO); adjustlocalvars(ls, nvar); /* scope for control variables */ block(ls); luaK_patchlist(fs, luaK_code1(fs, loopfor, NO_JUMP), blockinit); luaK_patchlist(fs, prep, luaK_getlabel(fs)); removelocalvars(ls, nvar); } static void fornum (LexState *ls, TString *varname) { /* fornum -> NAME = exp1,exp1[,exp1] forbody */ FuncState *fs = ls->fs; check(ls, '='); exp1(ls); /* initial value */ check(ls, ','); exp1(ls); /* limit */ if (optional(ls, ',')) exp1(ls); /* optional step */ else luaK_code1(fs, OP_PUSHINT, 1); /* default step */ new_localvar(ls, varname, 0); new_localvarstr(ls, "(limit)", 1); new_localvarstr(ls, "(step)", 2); forbody(ls, 3, OP_FORPREP, OP_FORLOOP); } static void forlist (LexState *ls, TString *indexname) { /* forlist -> NAME,NAME IN exp1 forbody */ TString *valname; check(ls, ','); valname = str_checkname(ls); /* next test is dirty, but avoids `in' being a reserved word */ check_condition(ls, (ls->t.token == TK_NAME && ls->t.seminfo.ts == luaS_new(ls->L, "in")), "`in' expected"); next(ls); /* skip `in' */ exp1(ls); /* table */ new_localvarstr(ls, "(table)", 0); new_localvar(ls, indexname, 1); new_localvar(ls, valname, 2); forbody(ls, 3, OP_LFORPREP, OP_LFORLOOP); } static void forstat (LexState *ls, int line) { /* forstat -> fornum | forlist */ FuncState *fs = ls->fs; TString *varname; Breaklabel bl; enterbreak(fs, &bl); next(ls); /* skip `for' */ varname = str_checkname(ls); /* first variable name */ switch (ls->t.token) { case '=': fornum(ls, varname); break; case ',': forlist(ls, varname); break; default: luaK_error(ls, "`=' or `,' expected"); } check_match(ls, TK_END, TK_FOR, line); leavebreak(fs, &bl); } static void test_then_block (LexState *ls, expdesc *v) { /* test_then_block -> [IF | ELSEIF] cond THEN block */ next(ls); /* skip IF or ELSEIF */ cond(ls, v); check(ls, TK_THEN); block(ls); /* `then' part */ } static void ifstat (LexState *ls, int line) { /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ FuncState *fs = ls->fs; expdesc v; int escapelist = NO_JUMP; test_then_block(ls, &v); /* IF cond THEN block */ while (ls->t.token == TK_ELSEIF) { luaK_concat(fs, &escapelist, luaK_jump(fs)); luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); test_then_block(ls, &v); /* ELSEIF cond THEN block */ } if (ls->t.token == TK_ELSE) { luaK_concat(fs, &escapelist, luaK_jump(fs)); luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); next(ls); /* skip ELSE */ block(ls); /* `else' part */ } else luaK_concat(fs, &escapelist, v.u.l.f); luaK_patchlist(fs, escapelist, luaK_getlabel(fs)); check_match(ls, TK_END, TK_IF, line); } static void localstat (LexState *ls) { /* stat -> LOCAL NAME {',' NAME} ['=' explist1] */ int nvars = 0; int nexps; do { next(ls); /* skip LOCAL or ',' */ new_localvar(ls, str_checkname(ls), nvars++); } while (ls->t.token == ','); if (optional(ls, '=')) nexps = explist1(ls); else nexps = 0; adjust_mult_assign(ls, nvars, nexps); adjustlocalvars(ls, nvars); } static int funcname (LexState *ls, expdesc *v) { /* funcname -> NAME [':' NAME | '.' NAME] */ int needself = 0; singlevar(ls, str_checkname(ls), v); if (ls->t.token == ':' || ls->t.token == '.') { needself = (ls->t.token == ':'); next(ls); luaK_tostack(ls, v, 1); luaK_kstr(ls, checkname(ls)); v->k = VINDEXED; } return needself; } static void funcstat (LexState *ls, int line) { /* funcstat -> FUNCTION funcname body */ int needself; expdesc v; next(ls); /* skip FUNCTION */ needself = funcname(ls, &v); body(ls, needself, line); luaK_storevar(ls, &v); } static void namestat (LexState *ls) { /* stat -> func | ['%'] NAME assignment */ FuncState *fs = ls->fs; expdesc v; var_or_func(ls, &v); if (v.k == VEXP) { /* stat -> func */ check_condition(ls, luaK_lastisopen(fs), "syntax error"); /* an upvalue? */ luaK_setcallreturns(fs, 0); /* call statement uses no results */ } else { /* stat -> ['%'] NAME assignment */ int left = assignment(ls, &v, 1); luaK_adjuststack(fs, left); /* remove eventual garbage left on stack */ } } static void retstat (LexState *ls) { /* stat -> RETURN explist */ FuncState *fs = ls->fs; next(ls); /* skip RETURN */ if (!block_follow(ls->t.token) && ls->t.token != ';') explist1(ls); /* optional return values */ luaK_code1(fs, OP_RETURN, ls->fs->nactloc); fs->stacklevel = fs->nactloc; /* removes all temp values */ } static void breakstat (LexState *ls) { /* stat -> BREAK [NAME] */ FuncState *fs = ls->fs; int currentlevel = fs->stacklevel; Breaklabel *bl = fs->bl; if (!bl) luaK_error(ls, "no loop to break"); next(ls); /* skip BREAK */ luaK_adjuststack(fs, currentlevel - bl->stacklevel); luaK_concat(fs, &bl->breaklist, luaK_jump(fs)); /* correct stack for compiler and symbolic execution */ luaK_adjuststack(fs, bl->stacklevel - currentlevel); } static int stat (LexState *ls) { int line = ls->linenumber; /* may be needed for error messages */ switch (ls->t.token) { case TK_IF: { /* stat -> ifstat */ ifstat(ls, line); return 0; } case TK_WHILE: { /* stat -> whilestat */ whilestat(ls, line); return 0; } case TK_DO: { /* stat -> DO block END */ next(ls); /* skip DO */ block(ls); check_match(ls, TK_END, TK_DO, line); return 0; } case TK_FOR: { /* stat -> forstat */ forstat(ls, line); return 0; } case TK_REPEAT: { /* stat -> repeatstat */ repeatstat(ls, line); return 0; } case TK_FUNCTION: { /* stat -> funcstat */ funcstat(ls, line); return 0; } case TK_LOCAL: { /* stat -> localstat */ localstat(ls); return 0; } case TK_NAME: case '%': { /* stat -> namestat */ namestat(ls); return 0; } case TK_RETURN: { /* stat -> retstat */ retstat(ls); return 1; /* must be last statement */ } case TK_BREAK: { /* stat -> breakstat */ breakstat(ls); return 1; /* must be last statement */ } default: { luaK_error(ls, " expected"); return 0; /* to avoid warnings */ } } } static void parlist (LexState *ls) { /* parlist -> [ param { ',' param } ] */ int nparams = 0; int dots = 0; if (ls->t.token != ')') { /* is `parlist' not empty? */ do { switch (ls->t.token) { case TK_DOTS: next(ls); dots = 1; break; case TK_NAME: new_localvar(ls, str_checkname(ls), nparams++); break; default: luaK_error(ls, " or `...' expected"); } } while (!dots && optional(ls, ',')); } code_params(ls, nparams, dots); } static void body (LexState *ls, int needself, int line) { /* body -> '(' parlist ')' chunk END */ FuncState new_fs; open_func(ls, &new_fs); new_fs.f->lineDefined = line; check(ls, '('); if (needself) { new_localvarstr(ls, "self", 0); adjustlocalvars(ls, 1); } parlist(ls); check(ls, ')'); chunk(ls); check_match(ls, TK_END, TK_FUNCTION, line); close_func(ls); pushclosure(ls, &new_fs); } /* }====================================================================== */ static void chunk (LexState *ls) { /* chunk -> { stat [';'] } */ int islast = 0; while (!islast && !block_follow(ls->t.token)) { islast = stat(ls); optional(ls, ';'); LUA_ASSERT(ls->fs->stacklevel == ls->fs->nactloc, "stack size != # local vars"); } } gltron-0.70/lua/src/lstate.c0000644000076400001440000000621307432712643011450 /* ** $Id: lstate.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Global State ** See Copyright Notice in lua.h */ #include #include "lua.h" #include "ldo.h" #include "lgc.h" #include "llex.h" #include "lmem.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" #ifdef LUA_DEBUG static lua_State *lua_state = NULL; void luaB_opentests (lua_State *L); #endif /* ** built-in implementation for ERRORMESSAGE. In a "correct" environment ** ERRORMESSAGE should have an external definition, and so this function ** would not be used. */ static int errormessage (lua_State *L) { const char *s = lua_tostring(L, 1); if (s == NULL) s = "(no message)"; fprintf(stderr, "error: %s\n", s); return 0; } /* ** open parts that may cause memory-allocation errors */ static void f_luaopen (lua_State *L, void *ud) { int stacksize = *(int *)ud; if (stacksize == 0) stacksize = DEFAULT_STACK_SIZE; else stacksize += LUA_MINSTACK; L->gt = luaH_new(L, 10); /* table of globals */ luaD_init(L, stacksize); luaS_init(L); luaX_init(L); luaT_init(L); lua_newtable(L); lua_ref(L, 1); /* create registry */ lua_register(L, LUA_ERRORMESSAGE, errormessage); #ifdef LUA_DEBUG luaB_opentests(L); if (lua_state == NULL) lua_state = L; /* keep first state to be opened */ #endif LUA_ASSERT(lua_gettop(L) == 0, "wrong API stack"); } LUA_API lua_State *lua_open (int stacksize) { lua_State *L = luaM_new(NULL, lua_State); if (L == NULL) return NULL; /* memory allocation error */ L->stack = NULL; L->strt.size = L->udt.size = 0; L->strt.nuse = L->udt.nuse = 0; L->strt.hash = NULL; L->udt.hash = NULL; L->Mbuffer = NULL; L->Mbuffsize = 0; L->rootproto = NULL; L->rootcl = NULL; L->roottable = NULL; L->TMtable = NULL; L->last_tag = -1; L->refArray = NULL; L->refSize = 0; L->refFree = NONEXT; L->nblocks = sizeof(lua_State); L->GCthreshold = MAX_INT; /* to avoid GC during pre-definitions */ L->callhook = NULL; L->linehook = NULL; L->allowhooks = 1; L->errorJmp = NULL; if (luaD_runprotected(L, f_luaopen, &stacksize) != 0) { /* memory allocation error: free partial state */ lua_close(L); return NULL; } L->GCthreshold = 2*L->nblocks; return L; } LUA_API void lua_close (lua_State *L) { LUA_ASSERT(L != lua_state || lua_gettop(L) == 0, "garbage in C stack"); luaC_collect(L, 1); /* collect all elements */ LUA_ASSERT(L->rootproto == NULL, "list should be empty"); LUA_ASSERT(L->rootcl == NULL, "list should be empty"); LUA_ASSERT(L->roottable == NULL, "list should be empty"); luaS_freeall(L); if (L->stack) L->nblocks -= (L->stack_last - L->stack + 1)*sizeof(TObject); luaM_free(L, L->stack); L->nblocks -= (L->last_tag+1)*sizeof(struct TM); luaM_free(L, L->TMtable); L->nblocks -= (L->refSize)*sizeof(struct Ref); luaM_free(L, L->refArray); L->nblocks -= (L->Mbuffsize)*sizeof(char); luaM_free(L, L->Mbuffer); LUA_ASSERT(L->nblocks == sizeof(lua_State), "wrong count for nblocks"); luaM_free(L, L); LUA_ASSERT(L != lua_state || memdebug_numblocks == 0, "memory leak!"); LUA_ASSERT(L != lua_state || memdebug_total == 0,"memory leak!"); } gltron-0.70/lua/src/lstring.c0000644000076400001440000001011307513504760011627 /* ** $Id: lstring.c,v 1.2 2002/07/12 07:49:04 jcatki Exp $ ** String table (keeps all strings handled by Lua) ** See Copyright Notice in lua.h */ #include #include "lua.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" #include "lstring.h" /* ** type equivalent to TString, but with maximum alignment requirements */ union L_UTString { TString ts; union L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ }; void luaS_init (lua_State *L) { L->strt.hash = luaM_newvector(L, 1, TString *); L->udt.hash = luaM_newvector(L, 1, TString *); L->nblocks += 2*sizeof(TString *); L->strt.size = L->udt.size = 1; L->strt.nuse = L->udt.nuse = 0; L->strt.hash[0] = L->udt.hash[0] = NULL; } void luaS_freeall (lua_State *L) { LUA_ASSERT(L->strt.nuse==0, "non-empty string table"); L->nblocks -= (L->strt.size + L->udt.size)*sizeof(TString *); luaM_free(L, L->strt.hash); LUA_ASSERT(L->udt.nuse==0, "non-empty udata table"); luaM_free(L, L->udt.hash); } static unsigned long hash_s (const char *s, size_t l) { unsigned long h = l; /* seed */ size_t step = (l>>5)|1; /* if string is too long, don't hash all its chars */ for (; l>=step; l-=step) h = h ^ ((h<<5)+(h>>2)+(unsigned char)*(s++)); return h; } void luaS_resize (lua_State *L, stringtable *tb, int newsize) { TString **newhash = luaM_newvector(L, newsize, TString *); int i; for (i=0; isize; i++) { TString *p = tb->hash[i]; while (p) { /* for each node in the list */ TString *next = p->nexthash; /* save next */ unsigned long h = (tb == &L->strt) ? p->u.s.hash : IntPoint(p->u.d.value); int h1 = h&(newsize-1); /* new position */ LUA_ASSERT(h%newsize == (h&(newsize-1)), "a&(x-1) == a%x, for x power of 2"); p->nexthash = newhash[h1]; /* chain it in new position */ newhash[h1] = p; p = next; } } luaM_free(L, tb->hash); L->nblocks += (newsize - tb->size)*sizeof(TString *); tb->size = newsize; tb->hash = newhash; } static void newentry (lua_State *L, stringtable *tb, TString *ts, int h) { ts->nexthash = tb->hash[h]; /* chain new entry */ tb->hash[h] = ts; tb->nuse++; if (tb->nuse > (lint32)tb->size && tb->size < MAX_INT/2) /* too crowded? */ luaS_resize(L, tb, tb->size*2); } TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { unsigned long h = hash_s(str, l); int h1 = h & (L->strt.size-1); TString *ts; for (ts = L->strt.hash[h1]; ts; ts = ts->nexthash) { if (ts->len == l && (memcmp(str, ts->str, l) == 0)) return ts; } /* not found */ ts = (TString *)luaM_malloc(L, sizestring(l)); ts->marked = 0; ts->nexthash = NULL; ts->len = l; ts->u.s.hash = h; ts->u.s.constindex = 0; memcpy(ts->str, str, l); ts->str[l] = 0; /* ending 0 */ L->nblocks += sizestring(l); newentry(L, &L->strt, ts, h1); /* insert it on table */ return ts; } TString *luaS_newudata (lua_State *L, size_t s, void *udata) { union L_UTString *uts = (union L_UTString *)luaM_malloc(L, (lint32)sizeof(union L_UTString)+s); TString *ts = &uts->ts; ts->marked = 0; ts->nexthash = NULL; ts->len = s; ts->u.d.tag = 0; ts->u.d.value = (s > 0) ? uts+1 : udata; L->nblocks += sizestring(s); /* insert it on table */ newentry(L, &L->udt, ts, IntPoint(ts->u.d.value) & (L->udt.size-1)); return ts; } TString *luaS_createudata (lua_State *L, void *udata, int tag) { int h1 = IntPoint(udata) & (L->udt.size-1); TString *ts; for (ts = L->udt.hash[h1]; ts; ts = ts->nexthash) { if (udata == ts->u.d.value && (tag == ts->u.d.tag || tag == LUA_ANYTAG)) return ts; } /* not found */ ts = luaS_newudata(L, 0, udata); if (tag != LUA_ANYTAG) ts->u.d.tag = tag; return ts; } TString *luaS_new (lua_State *L, const char *str) { return luaS_newlstr(L, str, strlen(str)); } TString *luaS_newfixed (lua_State *L, const char *str) { TString *ts = luaS_new(L, str); if (ts->marked == 0) ts->marked = FIXMARK; /* avoid GC */ return ts; } gltron-0.70/lua/src/ltable.c0000644000076400001440000002067607432712643011430 /* ** $Id: ltable.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Lua tables (hash) ** See Copyright Notice in lua.h */ /* ** Implementation of tables (aka arrays, objects, or hash tables); ** uses a mix of chained scatter table with Brent's variation. ** A main invariant of these tables is that, if an element is not ** in its main position (i.e. the `original' position that its hash gives ** to it), then the colliding element is in its own main position. ** In other words, there are collisions only when two elements have the ** same main position (i.e. the same hash values for that table size). ** Because of that, the load factor of these tables can be 100% without ** performance penalties. */ #include "lua.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #define gcsize(L, n) (sizeof(Hash)+(n)*sizeof(Node)) #define TagDefault LUA_TTABLE /* ** returns the `main' position of an element in a table (that is, the index ** of its hash value) */ Node *luaH_mainposition (const Hash *t, const TObject *key) { unsigned long h; switch (ttype(key)) { case LUA_TNUMBER: h = (unsigned long)(long)nvalue(key); break; case LUA_TSTRING: h = tsvalue(key)->u.s.hash; break; case LUA_TUSERDATA: h = IntPoint(tsvalue(key)); break; case LUA_TTABLE: h = IntPoint(hvalue(key)); break; case LUA_TFUNCTION: h = IntPoint(clvalue(key)); break; default: return NULL; /* invalid key */ } LUA_ASSERT(h%(unsigned int)t->size == (h&((unsigned int)t->size-1)), "a&(x-1) == a%x, for x power of 2"); return &t->node[h&(t->size-1)]; } static const TObject *luaH_getany (lua_State *L, const Hash *t, const TObject *key) { Node *n = luaH_mainposition(t, key); if (!n) lua_error(L, "table index is nil"); else do { if (luaO_equalObj(key, &n->key)) return &n->val; n = n->next; } while (n); return &luaO_nilobject; /* key not found */ } /* specialized version for numbers */ const TObject *luaH_getnum (const Hash *t, Number key) { Node *n = &t->node[(unsigned long)(long)key&(t->size-1)]; do { if (ttype(&n->key) == LUA_TNUMBER && nvalue(&n->key) == key) return &n->val; n = n->next; } while (n); return &luaO_nilobject; /* key not found */ } /* specialized version for strings */ const TObject *luaH_getstr (const Hash *t, TString *key) { Node *n = &t->node[key->u.s.hash&(t->size-1)]; do { if (ttype(&n->key) == LUA_TSTRING && tsvalue(&n->key) == key) return &n->val; n = n->next; } while (n); return &luaO_nilobject; /* key not found */ } const TObject *luaH_get (lua_State *L, const Hash *t, const TObject *key) { switch (ttype(key)) { case LUA_TNUMBER: return luaH_getnum(t, nvalue(key)); case LUA_TSTRING: return luaH_getstr(t, tsvalue(key)); default: return luaH_getany(L, t, key); } } Node *luaH_next (lua_State *L, const Hash *t, const TObject *key) { int i; if (ttype(key) == LUA_TNIL) i = 0; /* first iteration */ else { const TObject *v = luaH_get(L, t, key); if (v == &luaO_nilobject) lua_error(L, "invalid key for `next'"); i = (int)(((const char *)v - (const char *)(&t->node[0].val)) / sizeof(Node)) + 1; } for (; isize; i++) { Node *n = node(t, i); if (ttype(val(n)) != LUA_TNIL) return n; } return NULL; /* no more elements */ } /* ** try to remove a key without value from a table. To avoid problems with ** hash, change `key' for a number with the same hash. */ void luaH_remove (Hash *t, TObject *key) { if (ttype(key) == LUA_TNUMBER || (ttype(key) == LUA_TSTRING && tsvalue(key)->len <= 30)) return; /* do not remove numbers nor small strings */ else { /* try to find a number `n' with the same hash as `key' */ Node *mp = luaH_mainposition(t, key); int n = mp - &t->node[0]; /* make sure `n' is not in `t' */ while (luaH_getnum(t, n) != &luaO_nilobject) { if (n >= MAX_INT - t->size) return; /* give up; (to avoid overflow) */ n += t->size; } ttype(key) = LUA_TNUMBER; nvalue(key) = n; LUA_ASSERT(luaH_mainposition(t, key) == mp, "cannot change hash"); } } static void setnodevector (lua_State *L, Hash *t, lint32 size) { int i; if (size > MAX_INT) lua_error(L, "table overflow"); t->node = luaM_newvector(L, size, Node); for (i=0; i<(int)size; i++) { ttype(&t->node[i].key) = ttype(&t->node[i].val) = LUA_TNIL; t->node[i].next = NULL; } L->nblocks += gcsize(L, size) - gcsize(L, t->size); t->size = size; t->firstfree = &t->node[size-1]; /* first free position to be used */ } Hash *luaH_new (lua_State *L, int size) { Hash *t = luaM_new(L, Hash); t->htag = TagDefault; t->next = L->roottable; L->roottable = t; t->mark = t; t->size = 0; L->nblocks += gcsize(L, 0); t->node = NULL; setnodevector(L, t, luaO_power2(size)); return t; } void luaH_free (lua_State *L, Hash *t) { L->nblocks -= gcsize(L, t->size); luaM_free(L, t->node); luaM_free(L, t); } static int numuse (const Hash *t) { Node *v = t->node; int size = t->size; int realuse = 0; int i; for (i=0; isize; Node *nold = t->node; int nelems = numuse(t); int i; LUA_ASSERT(nelems<=oldsize, "wrong count"); if (nelems >= oldsize-oldsize/4) /* using more than 3/4? */ setnodevector(L, t, (lint32)oldsize*2); else if (nelems <= oldsize/4 && /* less than 1/4? */ oldsize > MINPOWER2) setnodevector(L, t, oldsize/2); else setnodevector(L, t, oldsize); for (i=0; ival) != LUA_TNIL) *luaH_set(L, t, &old->key) = old->val; } luaM_free(L, nold); /* free old array */ } /* ** inserts a key into a hash table; first, check whether key is ** already present; if not, check whether key's main position is free; ** if not, check whether colliding node is in its main position or not; ** if it is not, move colliding node to an empty place and put new key ** in its main position; otherwise (colliding node is in its main position), ** new key goes to an empty position. */ TObject *luaH_set (lua_State *L, Hash *t, const TObject *key) { Node *mp = luaH_mainposition(t, key); Node *n = mp; if (!mp) lua_error(L, "table index is nil"); do { /* check whether `key' is somewhere in the chain */ if (luaO_equalObj(key, &n->key)) return &n->val; /* that's all */ else n = n->next; } while (n); /* `key' not found; must insert it */ if (ttype(&mp->key) != LUA_TNIL) { /* main position is not free? */ Node *othern; /* main position of colliding node */ n = t->firstfree; /* get a free place */ /* is colliding node out of its main position? (can only happens if its position is after "firstfree") */ if (mp > n && (othern=luaH_mainposition(t, &mp->key)) != mp) { /* yes; move colliding node into free position */ while (othern->next != mp) othern = othern->next; /* find previous */ othern->next = n; /* redo the chain with `n' in place of `mp' */ *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */ mp->next = NULL; /* now `mp' is free */ } else { /* colliding node is in its own main position */ /* new node will go into free position */ n->next = mp->next; /* chain new position */ mp->next = n; mp = n; } } mp->key = *key; for (;;) { /* correct `firstfree' */ if (ttype(&t->firstfree->key) == LUA_TNIL) return &mp->val; /* OK; table still has a free place */ else if (t->firstfree == t->node) break; /* cannot decrement from here */ else (t->firstfree)--; } rehash(L, t); /* no more free places */ return luaH_set(L, t, key); /* `rehash' invalidates this insertion */ } TObject *luaH_setint (lua_State *L, Hash *t, int key) { TObject index; ttype(&index) = LUA_TNUMBER; nvalue(&index) = key; return luaH_set(L, t, &index); } void luaH_setstrnum (lua_State *L, Hash *t, TString *key, Number val) { TObject *value, index; ttype(&index) = LUA_TSTRING; tsvalue(&index) = key; value = luaH_set(L, t, &index); ttype(value) = LUA_TNUMBER; nvalue(value) = val; } const TObject *luaH_getglobal (lua_State *L, const char *name) { return luaH_getstr(L->gt, luaS_new(L, name)); } gltron-0.70/lua/src/ltests.c0000644000076400001440000003126007432712643011472 /* ** $Id: ltests.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Internal Module for Debugging of the Lua Implementation ** See Copyright Notice in lua.h */ #include #include #include #include #include "lua.h" #include "lapi.h" #include "lauxlib.h" #include "lcode.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "lmem.h" #include "lopcodes.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "luadebug.h" #include "lualib.h" void luaB_opentests (lua_State *L); /* ** The whole module only makes sense with LUA_DEBUG on */ #ifdef LUA_DEBUG static void setnameval (lua_State *L, const char *name, int val) { lua_pushstring(L, name); lua_pushnumber(L, val); lua_settable(L, -3); } /* ** {====================================================== ** Disassembler ** ======================================================= */ static const char *const instrname[NUM_OPCODES] = { "END", "RETURN", "CALL", "TAILCALL", "PUSHNIL", "POP", "PUSHINT", "PUSHSTRING", "PUSHNUM", "PUSHNEGNUM", "PUSHUPVALUE", "GETLOCAL", "GETGLOBAL", "GETTABLE", "GETDOTTED", "GETINDEXED", "PUSHSELF", "CREATETABLE", "SETLOCAL", "SETGLOBAL", "SETTABLE", "SETLIST", "SETMAP", "ADD", "ADDI", "SUB", "MULT", "DIV", "POW", "CONCAT", "MINUS", "NOT", "JMPNE", "JMPEQ", "JMPLT", "JMPLE", "JMPGT", "JMPGE", "JMPT", "JMPF", "JMPONT", "JMPONF", "JMP", "PUSHNILJMP", "FORPREP", "FORLOOP", "LFORPREP", "LFORLOOP", "CLOSURE" }; static int pushop (lua_State *L, Proto *p, int pc) { char buff[100]; Instruction i = p->code[pc]; OpCode o = GET_OPCODE(i); const char *name = instrname[o]; sprintf(buff, "%5d - ", luaG_getline(p->lineinfo, pc, 1, NULL)); switch ((enum Mode)luaK_opproperties[o].mode) { case iO: sprintf(buff+8, "%-12s", name); break; case iU: sprintf(buff+8, "%-12s%4u", name, GETARG_U(i)); break; case iS: sprintf(buff+8, "%-12s%4d", name, GETARG_S(i)); break; case iAB: sprintf(buff+8, "%-12s%4d %4d", name, GETARG_A(i), GETARG_B(i)); break; } lua_pushstring(L, buff); return (o != OP_END); } static int listcode (lua_State *L) { int pc; Proto *p; int res; luaL_arg_check(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1, "Lua function expected"); p = clvalue(luaA_index(L, 1))->f.l; lua_newtable(L); setnameval(L, "maxstack", p->maxstacksize); setnameval(L, "numparams", p->numparams); pc = 0; do { lua_pushnumber(L, pc+1); res = pushop(L, p, pc++); lua_settable(L, -3); } while (res); return 1; } static int liststrings (lua_State *L) { Proto *p; int i; luaL_arg_check(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1, "Lua function expected"); p = clvalue(luaA_index(L, 1))->f.l; lua_newtable(L); for (i=0; inkstr; i++) { lua_pushnumber(L, i+1); lua_pushstring(L, p->kstr[i]->str); lua_settable(L, -3); } return 1; } static int listlocals (lua_State *L) { Proto *p; int pc = luaL_check_int(L, 2) - 1; int i = 0; const char *name; luaL_arg_check(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1, "Lua function expected"); p = clvalue(luaA_index(L, 1))->f.l; while ((name = luaF_getlocalname(p, ++i, pc)) != NULL) lua_pushstring(L, name); return i-1; } /* }====================================================== */ static int get_limits (lua_State *L) { lua_newtable(L); setnameval(L, "BITS_INT", BITS_INT); setnameval(L, "LFPF", LFIELDS_PER_FLUSH); setnameval(L, "MAXARG_A", MAXARG_A); setnameval(L, "MAXARG_B", MAXARG_B); setnameval(L, "MAXARG_S", MAXARG_S); setnameval(L, "MAXARG_U", MAXARG_U); setnameval(L, "MAXLOCALS", MAXLOCALS); setnameval(L, "MAXPARAMS", MAXPARAMS); setnameval(L, "MAXSTACK", MAXSTACK); setnameval(L, "MAXUPVALUES", MAXUPVALUES); setnameval(L, "MAXVARSLH", MAXVARSLH); setnameval(L, "RFPF", RFIELDS_PER_FLUSH); setnameval(L, "SIZE_A", SIZE_A); setnameval(L, "SIZE_B", SIZE_B); setnameval(L, "SIZE_OP", SIZE_OP); setnameval(L, "SIZE_U", SIZE_U); return 1; } static int mem_query (lua_State *L) { if (lua_isnull(L, 1)) { lua_pushnumber(L, memdebug_total); lua_pushnumber(L, memdebug_numblocks); lua_pushnumber(L, memdebug_maxmem); return 3; } else { memdebug_memlimit = luaL_check_int(L, 1); return 0; } } static int hash_query (lua_State *L) { if (lua_isnull(L, 2)) { luaL_arg_check(L, lua_tag(L, 1) == LUA_TSTRING, 1, "string expected"); lua_pushnumber(L, tsvalue(luaA_index(L, 1))->u.s.hash); } else { Hash *t; luaL_checktype(L, 2, LUA_TTABLE); t = hvalue(luaA_index(L, 2)); lua_pushnumber(L, luaH_mainposition(t, luaA_index(L, 1)) - t->node); } return 1; } static int table_query (lua_State *L) { const Hash *t; int i = luaL_opt_int(L, 2, -1); luaL_checktype(L, 1, LUA_TTABLE); t = hvalue(luaA_index(L, 1)); if (i == -1) { lua_pushnumber(L, t->size); lua_pushnumber(L, t->firstfree - t->node); return 2; } else if (i < t->size) { luaA_pushobject(L, &t->node[i].key); luaA_pushobject(L, &t->node[i].val); if (t->node[i].next) { lua_pushnumber(L, t->node[i].next - t->node); return 3; } else return 2; } return 0; } static int string_query (lua_State *L) { stringtable *tb = (*luaL_check_string(L, 1) == 's') ? &L->strt : &L->udt; int s = luaL_opt_int(L, 2, 0) - 1; if (s==-1) { lua_pushnumber(L ,tb->nuse); lua_pushnumber(L ,tb->size); return 2; } else if (s < tb->size) { TString *ts; int n = 0; for (ts = tb->hash[s]; ts; ts = ts->nexthash) { ttype(L->top) = LUA_TSTRING; tsvalue(L->top) = ts; incr_top; n++; } return n; } return 0; } static int tref (lua_State *L) { luaL_checkany(L, 1); lua_pushvalue(L, 1); lua_pushnumber(L, lua_ref(L, luaL_opt_int(L, 2, 1))); return 1; } static int getref (lua_State *L) { if (lua_getref(L, luaL_check_int(L, 1))) return 1; else return 0; } static int unref (lua_State *L) { lua_unref(L, luaL_check_int(L, 1)); return 0; } static int newuserdata (lua_State *L) { if (lua_isnumber(L, 2)) lua_pushusertag(L, (void *)luaL_check_int(L, 1), luaL_check_int(L, 2)); else lua_newuserdata(L, luaL_check_int(L, 1)); return 1; } static int udataval (lua_State *L) { luaL_checktype(L, 1, LUA_TUSERDATA); lua_pushnumber(L, (int)lua_touserdata(L, 1)); return 1; } static int newstate (lua_State *L) { lua_State *L1 = lua_open(luaL_check_int(L, 1)); if (L1) lua_pushuserdata(L, L1); else lua_pushnil(L); return 1; } static int loadlib (lua_State *L) { lua_State *L1 = (lua_State *)lua_touserdata(L, 1); switch (*luaL_check_string(L, 2)) { case 'm': lua_mathlibopen(L1); break; case 's': lua_strlibopen(L1); break; case 'i': lua_iolibopen(L1); break; case 'd': lua_dblibopen(L1); break; case 'b': lua_baselibopen(L1); break; default: luaL_argerror(L, 2, "invalid option"); } return 0; } static int closestate (lua_State *L) { luaL_checktype(L, 1, LUA_TUSERDATA); lua_close((lua_State *)lua_touserdata(L, 1)); return 0; } static int doremote (lua_State *L) { lua_State *L1; const char *code = luaL_check_string(L, 2); int status; luaL_checktype(L, 1, LUA_TUSERDATA); L1 = (lua_State *)lua_touserdata(L, 1); status = lua_dostring(L1, code); if (status != 0) { lua_pushnil(L); lua_pushnumber(L, status); return 2; } else { int i = 0; while (!lua_isnull(L1, ++i)) lua_pushstring(L, lua_tostring(L1, i)); return i-1; } } static int settagmethod (lua_State *L) { int tag = luaL_check_int(L, 1); const char *event = luaL_check_string(L, 2); luaL_checkany(L, 3); lua_gettagmethod(L, tag, event); lua_pushvalue(L, 3); lua_settagmethod(L, tag, event); return 1; } static int pushbool (lua_State *L, int b) { if (b) lua_pushnumber(L, 1); else lua_pushnil(L); return 1; } static int equal (lua_State *L) { return pushbool(L, lua_equal(L, 1, 2)); } /* ** {====================================================== ** function to test the API with C. It interprets a kind of "assembler" ** language with calls to the API, so the test can be driven by Lua code ** ======================================================= */ static const char *const delimits = " \t\n,;"; static void skip (const char **pc) { while (**pc != '\0' && strchr(delimits, **pc)) (*pc)++; } static int getnum (lua_State *L, const char **pc) { int res = 0; int sig = 1; skip(pc); if (**pc == '.') { res = (int)lua_tonumber(L, -1); lua_pop(L, 1); (*pc)++; return res; } else if (**pc == '-') { sig = -1; (*pc)++; } while (isdigit(**pc)) res = res*10 + (*(*pc)++) - '0'; return sig*res; } static const char *getname (char *buff, const char **pc) { int i = 0; skip(pc); while (**pc != '\0' && !strchr(delimits, **pc)) buff[i++] = *(*pc)++; buff[i] = '\0'; return buff; } #define EQ(s1) (strcmp(s1, inst) == 0) #define getnum ((getnum)(L, &pc)) #define getname ((getname)(buff, &pc)) static int testC (lua_State *L) { char buff[30]; const char *pc = luaL_check_string(L, 1); for (;;) { const char *inst = getname; if EQ("") return 0; else if EQ("isnumber") { lua_pushnumber(L, lua_isnumber(L, getnum)); } else if EQ("isstring") { lua_pushnumber(L, lua_isstring(L, getnum)); } else if EQ("istable") { lua_pushnumber(L, lua_istable(L, getnum)); } else if EQ("iscfunction") { lua_pushnumber(L, lua_iscfunction(L, getnum)); } else if EQ("isfunction") { lua_pushnumber(L, lua_isfunction(L, getnum)); } else if EQ("isuserdata") { lua_pushnumber(L, lua_isuserdata(L, getnum)); } else if EQ("isnil") { lua_pushnumber(L, lua_isnil(L, getnum)); } else if EQ("isnull") { lua_pushnumber(L, lua_isnull(L, getnum)); } else if EQ("tonumber") { lua_pushnumber(L, lua_tonumber(L, getnum)); } else if EQ("tostring") { lua_pushstring(L, lua_tostring(L, getnum)); } else if EQ("tonumber") { lua_pushnumber(L, lua_tonumber(L, getnum)); } else if EQ("strlen") { lua_pushnumber(L, lua_strlen(L, getnum)); } else if EQ("tocfunction") { lua_pushcfunction(L, lua_tocfunction(L, getnum)); } else if EQ("return") { return getnum; } else if EQ("gettop") { lua_pushnumber(L, lua_gettop(L)); } else if EQ("settop") { lua_settop(L, getnum); } else if EQ("pop") { lua_pop(L, getnum); } else if EQ("pushnum") { lua_pushnumber(L, getnum); } else if EQ("pushvalue") { lua_pushvalue(L, getnum); } else if EQ("remove") { lua_remove(L, getnum); } else if EQ("insert") { lua_insert(L, getnum); } else if EQ("gettable") { lua_gettable(L, getnum); } else if EQ("settable") { lua_settable(L, getnum); } else if EQ("next") { lua_next(L, -2); } else if EQ("concat") { lua_concat(L, getnum); } else if EQ("rawcall") { int narg = getnum; int nres = getnum; lua_rawcall(L, narg, nres); } else if EQ("call") { int narg = getnum; int nres = getnum; lua_call(L, narg, nres); } else if EQ("dostring") { lua_dostring(L, luaL_check_string(L, getnum)); } else if EQ("settagmethod") { int tag = getnum; const char *event = getname; lua_settagmethod(L, tag, event); } else if EQ("gettagmethod") { int tag = getnum; const char *event = getname; lua_gettagmethod(L, tag, event); } else if EQ("type") { lua_pushstring(L, lua_typename(L, lua_type(L, getnum))); } else luaL_verror(L, "unknown instruction %.30s", buff); } return 0; } /* }====================================================== */ static const struct luaL_reg tests_funcs[] = { {"hash", hash_query}, {"limits", get_limits}, {"listcode", listcode}, {"liststrings", liststrings}, {"listlocals", listlocals}, {"loadlib", loadlib}, {"querystr", string_query}, {"querytab", table_query}, {"testC", testC}, {"ref", tref}, {"getref", getref}, {"unref", unref}, {"newuserdata", newuserdata}, {"udataval", udataval}, {"newstate", newstate}, {"closestate", closestate}, {"doremote", doremote}, {"settagmethod", settagmethod}, {"equal", equal}, {"totalmem", mem_query} }; void luaB_opentests (lua_State *L) { lua_newtable(L); lua_getglobals(L); lua_pushvalue(L, -2); lua_setglobals(L); luaL_openl(L, tests_funcs); /* open functions inside new table */ lua_setglobals(L); /* restore old table of globals */ lua_setglobal(L, "T"); /* set new table as global T */ } #endif gltron-0.70/lua/src/ltm.c0000644000076400001440000001014207432712643010744 /* ** $Id: ltm.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Tag methods ** See Copyright Notice in lua.h */ #include #include #include "lua.h" #include "ldo.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" #include "ltm.h" const char *const luaT_eventname[] = { /* ORDER TM */ "gettable", "settable", "index", "getglobal", "setglobal", "add", "sub", "mul", "div", "pow", "unm", "lt", "concat", "gc", "function", "le", "gt", "ge", /* deprecated options!! */ NULL }; static int findevent (const char *name) { int i; for (i=0; luaT_eventname[i]; i++) if (strcmp(luaT_eventname[i], name) == 0) return i; return -1; /* name not found */ } static int luaI_checkevent (lua_State *L, const char *name, int t) { int e = findevent(name); if (e >= TM_N) luaO_verror(L, "event `%.50s' is deprecated", name); if (e == TM_GC && t == LUA_TTABLE) luaO_verror(L, "event `gc' for tables is deprecated"); if (e < 0) luaO_verror(L, "`%.50s' is not a valid event name", name); return e; } /* events in LUA_TNIL are all allowed, since this is used as a * 'placeholder' for "default" fallbacks */ /* ORDER LUA_T, ORDER TM */ static const char luaT_validevents[NUM_TAGS][TM_N] = { {1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_TUSERDATA */ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* LUA_TNIL */ {1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, /* LUA_TNUMBER */ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_TSTRING */ {0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_TTABLE */ {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0} /* LUA_TFUNCTION */ }; int luaT_validevent (int t, int e) { /* ORDER LUA_T */ return (t >= NUM_TAGS) ? 1 : luaT_validevents[t][e]; } static void init_entry (lua_State *L, int tag) { int i; for (i=0; iTMtable[tag].collected = NULL; } void luaT_init (lua_State *L) { int t; luaM_growvector(L, L->TMtable, 0, NUM_TAGS, struct TM, "", MAX_INT); L->nblocks += NUM_TAGS*sizeof(struct TM); L->last_tag = NUM_TAGS-1; for (t=0; t<=L->last_tag; t++) init_entry(L, t); } LUA_API int lua_newtag (lua_State *L) { luaM_growvector(L, L->TMtable, L->last_tag, 1, struct TM, "tag table overflow", MAX_INT); L->nblocks += sizeof(struct TM); L->last_tag++; init_entry(L, L->last_tag); return L->last_tag; } static void checktag (lua_State *L, int tag) { if (!(0 <= tag && tag <= L->last_tag)) luaO_verror(L, "%d is not a valid tag", tag); } void luaT_realtag (lua_State *L, int tag) { if (!validtag(tag)) luaO_verror(L, "tag %d was not created by `newtag'", tag); } LUA_API int lua_copytagmethods (lua_State *L, int tagto, int tagfrom) { int e; checktag(L, tagto); checktag(L, tagfrom); for (e=0; eu.d.tag; case LUA_TTABLE: return hvalue(o)->htag; default: return t; } } LUA_API void lua_gettagmethod (lua_State *L, int t, const char *event) { int e; e = luaI_checkevent(L, event, t); checktag(L, t); if (luaT_validevent(t, e) && luaT_gettm(L, t, e)) { clvalue(L->top) = luaT_gettm(L, t, e); ttype(L->top) = LUA_TFUNCTION; } else ttype(L->top) = LUA_TNIL; incr_top; } LUA_API void lua_settagmethod (lua_State *L, int t, const char *event) { int e = luaI_checkevent(L, event, t); checktag(L, t); if (!luaT_validevent(t, e)) luaO_verror(L, "cannot change `%.20s' tag method for type `%.20s'%.20s", luaT_eventname[e], luaO_typenames[t], (t == LUA_TTABLE || t == LUA_TUSERDATA) ? " with default tag" : ""); switch (ttype(L->top - 1)) { case LUA_TNIL: luaT_gettm(L, t, e) = NULL; break; case LUA_TFUNCTION: luaT_gettm(L, t, e) = clvalue(L->top - 1); break; default: lua_error(L, "tag method must be a function (or nil)"); } L->top--; } gltron-0.70/lua/src/lundump.c0000644000076400001440000001251607432712643011643 /* ** $Id: lundump.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** load bytecodes from files ** See Copyright Notice in lua.h */ #include #include #include "lfunc.h" #include "lmem.h" #include "lopcodes.h" #include "lstring.h" #include "lundump.h" #define LoadByte ezgetc static const char* ZNAME (ZIO* Z) { const char* s=zname(Z); return (*s=='@') ? s+1 : s; } static void unexpectedEOZ (lua_State* L, ZIO* Z) { luaO_verror(L,"unexpected end of file in `%.99s'",ZNAME(Z)); } static int ezgetc (lua_State* L, ZIO* Z) { int c=zgetc(Z); if (c==EOZ) unexpectedEOZ(L,Z); return c; } static void ezread (lua_State* L, ZIO* Z, void* b, int n) { int r=zread(Z,b,n); if (r!=0) unexpectedEOZ(L,Z); } static void LoadBlock (lua_State* L, void* b, size_t size, ZIO* Z, int swap) { if (swap) { char *p=(char *) b+size-1; int n=size; while (n--) *p--=(char)ezgetc(L,Z); } else ezread(L,Z,b,size); } static void LoadVector (lua_State* L, void* b, int m, size_t size, ZIO* Z, int swap) { if (swap) { char *q=(char *) b; while (m--) { char *p=q+size-1; int n=size; while (n--) *p--=(char)ezgetc(L,Z); q+=size; } } else ezread(L,Z,b,m*size); } static int LoadInt (lua_State* L, ZIO* Z, int swap) { int x; LoadBlock(L,&x,sizeof(x),Z,swap); return x; } static size_t LoadSize (lua_State* L, ZIO* Z, int swap) { size_t x; LoadBlock(L,&x,sizeof(x),Z,swap); return x; } static Number LoadNumber (lua_State* L, ZIO* Z, int swap) { Number x; LoadBlock(L,&x,sizeof(x),Z,swap); return x; } static TString* LoadString (lua_State* L, ZIO* Z, int swap) { size_t size=LoadSize(L,Z,swap); if (size==0) return NULL; else { char* s=luaO_openspace(L,size); LoadBlock(L,s,size,Z,0); return luaS_newlstr(L,s,size-1); /* remove trailing '\0' */ } } static void LoadCode (lua_State* L, Proto* tf, ZIO* Z, int swap) { int size=LoadInt(L,Z,swap); tf->code=luaM_newvector(L,size,Instruction); LoadVector(L,tf->code,size,sizeof(*tf->code),Z,swap); if (tf->code[size-1]!=OP_END) luaO_verror(L,"bad code in `%.99s'",ZNAME(Z)); luaF_protook(L,tf,size); } static void LoadLocals (lua_State* L, Proto* tf, ZIO* Z, int swap) { int i,n; tf->nlocvars=n=LoadInt(L,Z,swap); tf->locvars=luaM_newvector(L,n,LocVar); for (i=0; ilocvars[i].varname=LoadString(L,Z,swap); tf->locvars[i].startpc=LoadInt(L,Z,swap); tf->locvars[i].endpc=LoadInt(L,Z,swap); } } static void LoadLines (lua_State* L, Proto* tf, ZIO* Z, int swap) { int n; tf->nlineinfo=n=LoadInt(L,Z,swap); tf->lineinfo=luaM_newvector(L,n,int); LoadVector(L,tf->lineinfo,n,sizeof(*tf->lineinfo),Z,swap); } static Proto* LoadFunction (lua_State* L, ZIO* Z, int swap); static void LoadConstants (lua_State* L, Proto* tf, ZIO* Z, int swap) { int i,n; tf->nkstr=n=LoadInt(L,Z,swap); tf->kstr=luaM_newvector(L,n,TString*); for (i=0; ikstr[i]=LoadString(L,Z,swap); tf->nknum=n=LoadInt(L,Z,swap); tf->knum=luaM_newvector(L,n,Number); LoadVector(L,tf->knum,n,sizeof(*tf->knum),Z,swap); tf->nkproto=n=LoadInt(L,Z,swap); tf->kproto=luaM_newvector(L,n,Proto*); for (i=0; ikproto[i]=LoadFunction(L,Z,swap); } static Proto* LoadFunction (lua_State* L, ZIO* Z, int swap) { Proto* tf=luaF_newproto(L); tf->source=LoadString(L,Z,swap); tf->lineDefined=LoadInt(L,Z,swap); tf->numparams=LoadInt(L,Z,swap); tf->is_vararg=LoadByte(L,Z); tf->maxstacksize=LoadInt(L,Z,swap); LoadLocals(L,tf,Z,swap); LoadLines(L,tf,Z,swap); LoadConstants(L,tf,Z,swap); LoadCode(L,tf,Z,swap); return tf; } static void LoadSignature (lua_State* L, ZIO* Z) { const char* s=SIGNATURE; while (*s!=0 && ezgetc(L,Z)==*s) ++s; if (*s!=0) luaO_verror(L,"bad signature in `%.99s'",ZNAME(Z)); } static void TestSize (lua_State* L, int s, const char* what, ZIO* Z) { int r=ezgetc(L,Z); if (r!=s) luaO_verror(L,"virtual machine mismatch in `%.99s':\n" " %.20s is %d but read %d",ZNAME(Z),what,s,r); } #define TESTSIZE(s) TestSize(L,s,#s,Z) #define V(v) v/16,v%16 static int LoadHeader (lua_State* L, ZIO* Z) { int version,swap; Number f=0,tf=TEST_NUMBER; LoadSignature(L,Z); version=ezgetc(L,Z); if (version>VERSION) luaO_verror(L,"`%.99s' too new:\n" " read version %d.%d; expected at most %d.%d", ZNAME(Z),V(version),V(VERSION)); if (version #include #include #include "lua.h" #include "lapi.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "lgc.h" #include "lobject.h" #include "lopcodes.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" #include "lvm.h" #ifdef OLD_ANSI #define strcoll(a,b) strcmp(a,b) #endif /* ** Extra stack size to run a function: ** TAG_LINE(1), NAME(1), TM calls(3) (plus some extra...) */ #define EXTRA_STACK 8 int luaV_tonumber (TObject *obj) { if (ttype(obj) != LUA_TSTRING) return 1; else { if (!luaO_str2d(svalue(obj), &nvalue(obj))) return 2; ttype(obj) = LUA_TNUMBER; return 0; } } int luaV_tostring (lua_State *L, TObject *obj) { /* LUA_NUMBER */ if (ttype(obj) != LUA_TNUMBER) return 1; else { char s[32]; /* 16 digits, sign, point and \0 (+ some extra...) */ lua_number2str(s, nvalue(obj)); /* convert `s' to number */ tsvalue(obj) = luaS_new(L, s); ttype(obj) = LUA_TSTRING; return 0; } } static void traceexec (lua_State *L, StkId base, StkId top, lua_Hook linehook) { CallInfo *ci = infovalue(base-1); int *lineinfo = ci->func->f.l->lineinfo; int pc = (*ci->pc - ci->func->f.l->code) - 1; int newline; if (pc == 0) { /* may be first time? */ ci->line = 1; ci->refi = 0; ci->lastpc = pc+1; /* make sure it will call linehook */ } newline = luaG_getline(lineinfo, pc, ci->line, &ci->refi); /* calls linehook when enters a new line or jumps back (loop) */ if (newline != ci->line || pc <= ci->lastpc) { ci->line = newline; L->top = top; luaD_lineHook(L, base-1, newline, linehook); } ci->lastpc = pc; } static Closure *luaV_closure (lua_State *L, int nelems) { Closure *c = luaF_newclosure(L, nelems); L->top -= nelems; while (nelems--) c->upvalue[nelems] = *(L->top+nelems); clvalue(L->top) = c; ttype(L->top) = LUA_TFUNCTION; incr_top; return c; } void luaV_Cclosure (lua_State *L, lua_CFunction c, int nelems) { Closure *cl = luaV_closure(L, nelems); cl->f.c = c; cl->isC = 1; } void luaV_Lclosure (lua_State *L, Proto *l, int nelems) { Closure *cl = luaV_closure(L, nelems); cl->f.l = l; cl->isC = 0; } /* ** Function to index a table. ** Receives the table at `t' and the key at top. */ const TObject *luaV_gettable (lua_State *L, StkId t) { Closure *tm; int tg; if (ttype(t) == LUA_TTABLE && /* `t' is a table? */ ((tg = hvalue(t)->htag) == LUA_TTABLE || /* with default tag? */ luaT_gettm(L, tg, TM_GETTABLE) == NULL)) { /* or no TM? */ /* do a primitive get */ const TObject *h = luaH_get(L, hvalue(t), L->top-1); /* result is no nil or there is no `index' tag method? */ if (ttype(h) != LUA_TNIL || ((tm=luaT_gettm(L, tg, TM_INDEX)) == NULL)) return h; /* return result */ /* else call `index' tag method */ } else { /* try a `gettable' tag method */ tm = luaT_gettmbyObj(L, t, TM_GETTABLE); } if (tm != NULL) { /* is there a tag method? */ luaD_checkstack(L, 2); *(L->top+1) = *(L->top-1); /* key */ *L->top = *t; /* table */ clvalue(L->top-1) = tm; /* tag method */ ttype(L->top-1) = LUA_TFUNCTION; L->top += 2; luaD_call(L, L->top - 3, 1); return L->top - 1; /* call result */ } else { /* no tag method */ luaG_typeerror(L, t, "index"); return NULL; /* to avoid warnings */ } } /* ** Receives table at `t', key at `key' and value at top. */ void luaV_settable (lua_State *L, StkId t, StkId key) { int tg; if (ttype(t) == LUA_TTABLE && /* `t' is a table? */ ((tg = hvalue(t)->htag) == LUA_TTABLE || /* with default tag? */ luaT_gettm(L, tg, TM_SETTABLE) == NULL)) /* or no TM? */ *luaH_set(L, hvalue(t), key) = *(L->top-1); /* do a primitive set */ else { /* try a `settable' tag method */ Closure *tm = luaT_gettmbyObj(L, t, TM_SETTABLE); if (tm != NULL) { luaD_checkstack(L, 3); *(L->top+2) = *(L->top-1); *(L->top+1) = *key; *(L->top) = *t; clvalue(L->top-1) = tm; ttype(L->top-1) = LUA_TFUNCTION; L->top += 3; luaD_call(L, L->top - 4, 0); /* call `settable' tag method */ } else /* no tag method... */ luaG_typeerror(L, t, "index"); } } const TObject *luaV_getglobal (lua_State *L, TString *s) { const TObject *value = luaH_getstr(L->gt, s); Closure *tm = luaT_gettmbyObj(L, value, TM_GETGLOBAL); if (tm == NULL) /* is there a tag method? */ return value; /* default behavior */ else { /* tag method */ luaD_checkstack(L, 3); clvalue(L->top) = tm; ttype(L->top) = LUA_TFUNCTION; tsvalue(L->top+1) = s; /* global name */ ttype(L->top+1) = LUA_TSTRING; *(L->top+2) = *value; L->top += 3; luaD_call(L, L->top - 3, 1); return L->top - 1; } } void luaV_setglobal (lua_State *L, TString *s) { const TObject *oldvalue = luaH_getstr(L->gt, s); Closure *tm = luaT_gettmbyObj(L, oldvalue, TM_SETGLOBAL); if (tm == NULL) { /* is there a tag method? */ if (oldvalue != &luaO_nilobject) { /* cast to remove `const' is OK, because `oldvalue' != luaO_nilobject */ *(TObject *)oldvalue = *(L->top - 1); } else { TObject key; ttype(&key) = LUA_TSTRING; tsvalue(&key) = s; *luaH_set(L, L->gt, &key) = *(L->top - 1); } } else { luaD_checkstack(L, 3); *(L->top+2) = *(L->top-1); /* new value */ *(L->top+1) = *oldvalue; ttype(L->top) = LUA_TSTRING; tsvalue(L->top) = s; clvalue(L->top-1) = tm; ttype(L->top-1) = LUA_TFUNCTION; L->top += 3; luaD_call(L, L->top - 4, 0); } } static int call_binTM (lua_State *L, StkId top, TMS event) { /* try first operand */ Closure *tm = luaT_gettmbyObj(L, top-2, event); L->top = top; if (tm == NULL) { tm = luaT_gettmbyObj(L, top-1, event); /* try second operand */ if (tm == NULL) { tm = luaT_gettm(L, 0, event); /* try a `global' method */ if (tm == NULL) return 0; /* error */ } } lua_pushstring(L, luaT_eventname[event]); luaD_callTM(L, tm, 3, 1); return 1; } static void call_arith (lua_State *L, StkId top, TMS event) { if (!call_binTM(L, top, event)) luaG_binerror(L, top-2, LUA_TNUMBER, "perform arithmetic on"); } static int luaV_strcomp (const TString *ls, const TString *rs) { const char *l = ls->str; size_t ll = ls->len; const char *r = rs->str; size_t lr = rs->len; for (;;) { int temp = strcoll(l, r); if (temp != 0) return temp; else { /* strings are equal up to a '\0' */ size_t len = strlen(l); /* index of first '\0' in both strings */ if (len == ll) /* l is finished? */ return (len == lr) ? 0 : -1; /* l is equal or smaller than r */ else if (len == lr) /* r is finished? */ return 1; /* l is greater than r (because l is not finished) */ /* both strings longer than `len'; go on comparing (after the '\0') */ len++; l += len; ll -= len; r += len; lr -= len; } } } int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top) { if (ttype(l) == LUA_TNUMBER && ttype(r) == LUA_TNUMBER) return (nvalue(l) < nvalue(r)); else if (ttype(l) == LUA_TSTRING && ttype(r) == LUA_TSTRING) return (luaV_strcomp(tsvalue(l), tsvalue(r)) < 0); else { /* call TM */ luaD_checkstack(L, 2); *top++ = *l; *top++ = *r; if (!call_binTM(L, top, TM_LT)) luaG_ordererror(L, top-2); L->top--; return (ttype(L->top) != LUA_TNIL); } } void luaV_strconc (lua_State *L, int total, StkId top) { do { int n = 2; /* number of elements handled in this pass (at least 2) */ if (tostring(L, top-2) || tostring(L, top-1)) { if (!call_binTM(L, top, TM_CONCAT)) luaG_binerror(L, top-2, LUA_TSTRING, "concat"); } else if (tsvalue(top-1)->len > 0) { /* if len=0, do nothing */ /* at least two string values; get as many as possible */ lint32 tl = (lint32)tsvalue(top-1)->len + (lint32)tsvalue(top-2)->len; char *buffer; int i; while (n < total && !tostring(L, top-n-1)) { /* collect total length */ tl += tsvalue(top-n-1)->len; n++; } if (tl > MAX_SIZET) lua_error(L, "string size overflow"); buffer = luaO_openspace(L, tl); tl = 0; for (i=n; i>0; i--) { /* concat all strings */ size_t l = tsvalue(top-i)->len; memcpy(buffer+tl, tsvalue(top-i)->str, l); tl += l; } tsvalue(top-n) = luaS_newlstr(L, buffer, tl); } total -= n-1; /* got `n' strings to create 1 new */ top -= n-1; } while (total > 1); /* repeat until only 1 result left */ } static void luaV_pack (lua_State *L, StkId firstelem) { int i; Hash *htab = luaH_new(L, 0); for (i=0; firstelem+itop; i++) *luaH_setint(L, htab, i+1) = *(firstelem+i); /* store counter in field `n' */ luaH_setstrnum(L, htab, luaS_new(L, "n"), i); L->top = firstelem; /* remove elements from the stack */ ttype(L->top) = LUA_TTABLE; hvalue(L->top) = htab; incr_top; } static void adjust_varargs (lua_State *L, StkId base, int nfixargs) { int nvararg = (L->top-base) - nfixargs; if (nvararg < 0) luaD_adjusttop(L, base, nfixargs); luaV_pack(L, base+nfixargs); } #define dojump(pc, i) { int d = GETARG_S(i); pc += d; } /* ** Executes the given Lua function. Parameters are between [base,top). ** Returns n such that the the results are between [n,top). */ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { const Proto *const tf = cl->f.l; StkId top; /* keep top local, for performance */ const Instruction *pc = tf->code; TString **const kstr = tf->kstr; const lua_Hook linehook = L->linehook; infovalue(base-1)->pc = &pc; luaD_checkstack(L, tf->maxstacksize+EXTRA_STACK); if (tf->is_vararg) /* varargs? */ adjust_varargs(L, base, tf->numparams); else luaD_adjusttop(L, base, tf->numparams); top = L->top; /* main loop of interpreter */ for (;;) { const Instruction i = *pc++; if (linehook) traceexec(L, base, top, linehook); switch (GET_OPCODE(i)) { case OP_END: { L->top = top; return top; } case OP_RETURN: { L->top = top; return base+GETARG_U(i); } case OP_CALL: { int nres = GETARG_B(i); if (nres == MULT_RET) nres = LUA_MULTRET; L->top = top; luaD_call(L, base+GETARG_A(i), nres); top = L->top; break; } case OP_TAILCALL: { L->top = top; luaD_call(L, base+GETARG_A(i), LUA_MULTRET); return base+GETARG_B(i); } case OP_PUSHNIL: { int n = GETARG_U(i); LUA_ASSERT(n>0, "invalid argument"); do { ttype(top++) = LUA_TNIL; } while (--n > 0); break; } case OP_POP: { top -= GETARG_U(i); break; } case OP_PUSHINT: { ttype(top) = LUA_TNUMBER; nvalue(top) = (Number)GETARG_S(i); top++; break; } case OP_PUSHSTRING: { ttype(top) = LUA_TSTRING; tsvalue(top) = kstr[GETARG_U(i)]; top++; break; } case OP_PUSHNUM: { ttype(top) = LUA_TNUMBER; nvalue(top) = tf->knum[GETARG_U(i)]; top++; break; } case OP_PUSHNEGNUM: { ttype(top) = LUA_TNUMBER; nvalue(top) = -tf->knum[GETARG_U(i)]; top++; break; } case OP_PUSHUPVALUE: { *top++ = cl->upvalue[GETARG_U(i)]; break; } case OP_GETLOCAL: { *top++ = *(base+GETARG_U(i)); break; } case OP_GETGLOBAL: { L->top = top; *top = *luaV_getglobal(L, kstr[GETARG_U(i)]); top++; break; } case OP_GETTABLE: { L->top = top; top--; *(top-1) = *luaV_gettable(L, top-1); break; } case OP_GETDOTTED: { ttype(top) = LUA_TSTRING; tsvalue(top) = kstr[GETARG_U(i)]; L->top = top+1; *(top-1) = *luaV_gettable(L, top-1); break; } case OP_GETINDEXED: { *top = *(base+GETARG_U(i)); L->top = top+1; *(top-1) = *luaV_gettable(L, top-1); break; } case OP_PUSHSELF: { TObject receiver; receiver = *(top-1); ttype(top) = LUA_TSTRING; tsvalue(top++) = kstr[GETARG_U(i)]; L->top = top; *(top-2) = *luaV_gettable(L, top-2); *(top-1) = receiver; break; } case OP_CREATETABLE: { L->top = top; luaC_checkGC(L); hvalue(top) = luaH_new(L, GETARG_U(i)); ttype(top) = LUA_TTABLE; top++; break; } case OP_SETLOCAL: { *(base+GETARG_U(i)) = *(--top); break; } case OP_SETGLOBAL: { L->top = top; luaV_setglobal(L, kstr[GETARG_U(i)]); top--; break; } case OP_SETTABLE: { StkId t = top-GETARG_A(i); L->top = top; luaV_settable(L, t, t+1); top -= GETARG_B(i); /* pop values */ break; } case OP_SETLIST: { int aux = GETARG_A(i) * LFIELDS_PER_FLUSH; int n = GETARG_B(i); Hash *arr = hvalue(top-n-1); L->top = top-n; /* final value of `top' (in case of errors) */ for (; n; n--) *luaH_setint(L, arr, n+aux) = *(--top); break; } case OP_SETMAP: { int n = GETARG_U(i); StkId finaltop = top-2*n; Hash *arr = hvalue(finaltop-1); L->top = finaltop; /* final value of `top' (in case of errors) */ for (; n; n--) { top-=2; *luaH_set(L, arr, top) = *(top+1); } break; } case OP_ADD: { if (tonumber(top-2) || tonumber(top-1)) call_arith(L, top, TM_ADD); else nvalue(top-2) += nvalue(top-1); top--; break; } case OP_ADDI: { if (tonumber(top-1)) { ttype(top) = LUA_TNUMBER; nvalue(top) = (Number)GETARG_S(i); call_arith(L, top+1, TM_ADD); } else nvalue(top-1) += (Number)GETARG_S(i); break; } case OP_SUB: { if (tonumber(top-2) || tonumber(top-1)) call_arith(L, top, TM_SUB); else nvalue(top-2) -= nvalue(top-1); top--; break; } case OP_MULT: { if (tonumber(top-2) || tonumber(top-1)) call_arith(L, top, TM_MUL); else nvalue(top-2) *= nvalue(top-1); top--; break; } case OP_DIV: { if (tonumber(top-2) || tonumber(top-1)) call_arith(L, top, TM_DIV); else nvalue(top-2) /= nvalue(top-1); top--; break; } case OP_POW: { if (!call_binTM(L, top, TM_POW)) lua_error(L, "undefined operation"); top--; break; } case OP_CONCAT: { int n = GETARG_U(i); luaV_strconc(L, n, top); top -= n-1; L->top = top; luaC_checkGC(L); break; } case OP_MINUS: { if (tonumber(top-1)) { ttype(top) = LUA_TNIL; call_arith(L, top+1, TM_UNM); } else nvalue(top-1) = -nvalue(top-1); break; } case OP_NOT: { ttype(top-1) = (ttype(top-1) == LUA_TNIL) ? LUA_TNUMBER : LUA_TNIL; nvalue(top-1) = 1; break; } case OP_JMPNE: { top -= 2; if (!luaO_equalObj(top, top+1)) dojump(pc, i); break; } case OP_JMPEQ: { top -= 2; if (luaO_equalObj(top, top+1)) dojump(pc, i); break; } case OP_JMPLT: { top -= 2; if (luaV_lessthan(L, top, top+1, top+2)) dojump(pc, i); break; } case OP_JMPLE: { /* a <= b === !(b b === (b= b === !(a 0 ? nvalue(top-3) > nvalue(top-2) : nvalue(top-3) < nvalue(top-2)) { /* `empty' loop? */ top -= 3; /* remove control variables */ dojump(pc, i); /* jump to loop end */ } break; } case OP_FORLOOP: { LUA_ASSERT(ttype(top-1) == LUA_TNUMBER, "invalid step"); LUA_ASSERT(ttype(top-2) == LUA_TNUMBER, "invalid limit"); if (ttype(top-3) != LUA_TNUMBER) lua_error(L, "`for' index must be a number"); nvalue(top-3) += nvalue(top-1); /* increment index */ if (nvalue(top-1) > 0 ? nvalue(top-3) > nvalue(top-2) : nvalue(top-3) < nvalue(top-2)) top -= 3; /* end loop: remove control variables */ else dojump(pc, i); /* repeat loop */ break; } case OP_LFORPREP: { Node *node; if (ttype(top-1) != LUA_TTABLE) lua_error(L, "`for' table must be a table"); node = luaH_next(L, hvalue(top-1), &luaO_nilobject); if (node == NULL) { /* `empty' loop? */ top--; /* remove table */ dojump(pc, i); /* jump to loop end */ } else { top += 2; /* index,value */ *(top-2) = *key(node); *(top-1) = *val(node); } break; } case OP_LFORLOOP: { Node *node; LUA_ASSERT(ttype(top-3) == LUA_TTABLE, "invalid table"); node = luaH_next(L, hvalue(top-3), top-2); if (node == NULL) /* end loop? */ top -= 3; /* remove table, key, and value */ else { *(top-2) = *key(node); *(top-1) = *val(node); dojump(pc, i); /* repeat loop */ } break; } case OP_CLOSURE: { L->top = top; luaV_Lclosure(L, tf->kproto[GETARG_A(i)], GETARG_B(i)); top = L->top; luaC_checkGC(L); break; } } } } gltron-0.70/lua/src/lzio.c0000644000076400001440000000335407432712643011134 /* ** $Id: lzio.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** a generic input stream interface ** See Copyright Notice in lua.h */ #include #include #include "lua.h" #include "lzio.h" /* ----------------------------------------------------- memory buffers --- */ static int zmfilbuf (ZIO* z) { (void)z; /* to avoid warnings */ return EOZ; } ZIO* zmopen (ZIO* z, const char* b, size_t size, const char *name) { if (b==NULL) return NULL; z->n = size; z->p = (const unsigned char *)b; z->filbuf = zmfilbuf; z->u = NULL; z->name = name; return z; } /* ------------------------------------------------------------ strings --- */ ZIO* zsopen (ZIO* z, const char* s, const char *name) { if (s==NULL) return NULL; return zmopen(z, s, strlen(s), name); } /* -------------------------------------------------------------- FILEs --- */ static int zffilbuf (ZIO* z) { size_t n; if (feof((FILE *)z->u)) return EOZ; n = fread(z->buffer, 1, ZBSIZE, (FILE *)z->u); if (n==0) return EOZ; z->n = n-1; z->p = z->buffer; return *(z->p++); } ZIO* zFopen (ZIO* z, FILE* f, const char *name) { if (f==NULL) return NULL; z->n = 0; z->p = z->buffer; z->filbuf = zffilbuf; z->u = f; z->name = name; return z; } /* --------------------------------------------------------------- read --- */ size_t zread (ZIO *z, void *b, size_t n) { while (n) { size_t m; if (z->n == 0) { if (z->filbuf(z) == EOZ) return n; /* return number of missing bytes */ zungetc(z); /* put result from `filbuf' in the buffer */ } m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ memcpy(b, z->p, m); z->n -= m; z->p += m; b = (char *)b + m; n -= m; } return 0; } gltron-0.70/lua/src/lib/0000777000076400001440000000000007767023545010647 5gltron-0.70/lua/src/lib/README0000644000076400001440000000054407432712643011437 This is the standard Lua library. It is implemented entirely on top of the official Lua API as declared in lua.h, using lauxlib.c, which contains several useful functions for writing libraries. We encourage developers to use lauxlib.c in their own libraries. The code of the standard library can be read as an example of how to export C functions to Lua. gltron-0.70/lua/src/lib/Makefile.am0000644000076400001440000000035407674620062012613 noinst_LIBRARIES=liblualib.a DEFS= CPPFLAGS= CFLAGS=-ansi -pedantic -Wall -I$(srcdir)/.. -I$(top_srcdir)/lua/include LDFLAGS= LIBS=-lm liblualib_a_SOURCES=lauxlib.c lbaselib.c ldblib.c liolib.c lmathlib.c lstrlib.c EXTRA_DIST=README gltron-0.70/lua/src/lib/Makefile.in0000644000076400001440000002044607767023244012632 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = liblualib.a DEFS = CPPFLAGS = CFLAGS = -ansi -pedantic -Wall -I$(srcdir)/.. -I$(top_srcdir)/lua/include LDFLAGS = LIBS = -lm liblualib_a_SOURCES = lauxlib.c lbaselib.c ldblib.c liolib.c lmathlib.c lstrlib.c EXTRA_DIST = README subdir = lua/src/lib mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) liblualib_a_AR = $(AR) cru liblualib_a_LIBADD = am_liblualib_a_OBJECTS = lauxlib.$(OBJEXT) lbaselib.$(OBJEXT) \ ldblib.$(OBJEXT) liolib.$(OBJEXT) lmathlib.$(OBJEXT) \ lstrlib.$(OBJEXT) liblualib_a_OBJECTS = $(am_liblualib_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/lauxlib.Po $(DEPDIR)/lbaselib.Po \ @AMDEP_TRUE@ $(DEPDIR)/ldblib.Po $(DEPDIR)/liolib.Po \ @AMDEP_TRUE@ $(DEPDIR)/lmathlib.Po $(DEPDIR)/lstrlib.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(liblualib_a_SOURCES) DIST_COMMON = README Makefile.am Makefile.in SOURCES = $(liblualib_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign lua/src/lib/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) liblualib.a: $(liblualib_a_OBJECTS) $(liblualib_a_DEPENDENCIES) -rm -f liblualib.a $(liblualib_a_AR) liblualib.a $(liblualib_a_OBJECTS) $(liblualib_a_LIBADD) $(RANLIB) liblualib.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lauxlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lbaselib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/ldblib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/liolib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lmathlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lstrlib.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/lua/src/lib/lauxlib.c0000644000076400001440000001173707432712643012371 /* ** $Id: lauxlib.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */ #include #include #include /* This file uses only the official API of Lua. ** Any function declared here could be written as an application function. ** With care, these functions can be used by other libraries. */ #include "lua.h" #include "lauxlib.h" #include "luadebug.h" LUALIB_API int luaL_findstring (const char *name, const char *const list[]) { int i; for (i=0; list[i]; i++) if (strcmp(list[i], name) == 0) return i; return -1; /* name not found */ } LUALIB_API void luaL_argerror (lua_State *L, int narg, const char *extramsg) { lua_Debug ar; lua_getstack(L, 0, &ar); lua_getinfo(L, "n", &ar); if (ar.name == NULL) ar.name = "?"; luaL_verror(L, "bad argument #%d to `%.50s' (%.100s)", narg, ar.name, extramsg); } static void type_error (lua_State *L, int narg, int t) { char buff[50]; sprintf(buff, "%.8s expected, got %.8s", lua_typename(L, t), lua_typename(L, lua_type(L, narg))); luaL_argerror(L, narg, buff); } LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) { if (space > lua_stackspace(L)) luaL_verror(L, "stack overflow (%.30s)", mes); } LUALIB_API void luaL_checktype(lua_State *L, int narg, int t) { if (lua_type(L, narg) != t) type_error(L, narg, t); } LUALIB_API void luaL_checkany (lua_State *L, int narg) { if (lua_type(L, narg) == LUA_TNONE) luaL_argerror(L, narg, "value expected"); } LUALIB_API const char *luaL_check_lstr (lua_State *L, int narg, size_t *len) { const char *s = lua_tostring(L, narg); if (!s) type_error(L, narg, LUA_TSTRING); if (len) *len = lua_strlen(L, narg); return s; } LUALIB_API const char *luaL_opt_lstr (lua_State *L, int narg, const char *def, size_t *len) { if (lua_isnull(L, narg)) { if (len) *len = (def ? strlen(def) : 0); return def; } else return luaL_check_lstr(L, narg, len); } LUALIB_API double luaL_check_number (lua_State *L, int narg) { double d = lua_tonumber(L, narg); if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ type_error(L, narg, LUA_TNUMBER); return d; } LUALIB_API double luaL_opt_number (lua_State *L, int narg, double def) { if (lua_isnull(L, narg)) return def; else return luaL_check_number(L, narg); } LUALIB_API void luaL_openlib (lua_State *L, const struct luaL_reg *l, int n) { int i; for (i=0; ip == (B)->buffer) #define bufflen(B) ((B)->p - (B)->buffer) #define bufffree(B) ((size_t)(LUAL_BUFFERSIZE - bufflen(B))) #define LIMIT (LUA_MINSTACK/2) static int emptybuffer (luaL_Buffer *B) { size_t l = bufflen(B); if (l == 0) return 0; /* put nothing on stack */ else { lua_pushlstring(B->L, B->buffer, l); B->p = B->buffer; B->level++; return 1; } } static void adjuststack (luaL_Buffer *B) { if (B->level > 1) { lua_State *L = B->L; int toget = 1; /* number of levels to concat */ size_t toplen = lua_strlen(L, -1); do { size_t l = lua_strlen(L, -(toget+1)); if (B->level - toget + 1 >= LIMIT || toplen > l) { toplen += l; toget++; } else break; } while (toget < B->level); if (toget >= 2) { lua_concat(L, toget); B->level = B->level - toget + 1; } } } LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) { if (emptybuffer(B)) adjuststack(B); return B->buffer; } LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { while (l--) luaL_putchar(B, *s++); } LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { luaL_addlstring(B, s, strlen(s)); } LUALIB_API void luaL_pushresult (luaL_Buffer *B) { emptybuffer(B); if (B->level == 0) lua_pushlstring(B->L, NULL, 0); else if (B->level > 1) lua_concat(B->L, B->level); B->level = 1; } LUALIB_API void luaL_addvalue (luaL_Buffer *B) { lua_State *L = B->L; size_t vl = lua_strlen(L, -1); if (vl <= bufffree(B)) { /* fit into buffer? */ memcpy(B->p, lua_tostring(L, -1), vl); /* put it there */ B->p += vl; lua_pop(L, 1); /* remove from stack */ } else { if (emptybuffer(B)) lua_insert(L, -2); /* put buffer before new value */ B->level++; /* add new value into B stack */ adjuststack(B); } } LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { B->L = L; B->p = B->buffer; B->level = 0; } /* }====================================================== */ gltron-0.70/lua/src/lib/lbaselib.c0000644000076400001440000004132107513504760012475 /* ** $Id: lbaselib.c,v 1.2 2002/07/12 07:49:04 jcatki Exp $ ** Basic library ** See Copyright Notice in lua.h */ #include #include #include #include #include "lua.h" #include "lauxlib.h" #include "luadebug.h" #include "lualib.h" /* ** If your system does not support `stderr', redefine this function, or ** redefine _ERRORMESSAGE so that it won't need _ALERT. */ static int luaB__ALERT (lua_State *L) { fputs(luaL_check_string(L, 1), stderr); return 0; } /* ** Basic implementation of _ERRORMESSAGE. ** The library `liolib' redefines _ERRORMESSAGE for better error information. */ static int luaB__ERRORMESSAGE (lua_State *L) { luaL_checktype(L, 1, LUA_TSTRING); lua_getglobal(L, LUA_ALERT); if (lua_isfunction(L, -1)) { /* avoid error loop if _ALERT is not defined */ lua_Debug ar; lua_pushstring(L, "error: "); lua_pushvalue(L, 1); if (lua_getstack(L, 1, &ar)) { lua_getinfo(L, "Sl", &ar); if (ar.source && ar.currentline > 0) { char buff[100]; sprintf(buff, "\n <%.70s: line %d>", ar.short_src, ar.currentline); lua_pushstring(L, buff); lua_concat(L, 2); } } lua_pushstring(L, "\n"); lua_concat(L, 3); lua_rawcall(L, 1, 0); } return 0; } /* ** If your system does not support `stdout', you can just remove this function. ** If you need, you can define your own `print' function, following this ** model but changing `fputs' to put the strings at a proper place ** (a console window or a log file, for instance). */ static int luaB_print (lua_State *L) { int n = lua_gettop(L); /* number of arguments */ int i; lua_getglobal(L, "tostring"); for (i=1; i<=n; i++) { const char *s; lua_pushvalue(L, -1); /* function to be called */ lua_pushvalue(L, i); /* value to print */ lua_rawcall(L, 1, 1); s = lua_tostring(L, -1); /* get result */ if (s == NULL) lua_error(L, "`tostring' must return a string to `print'"); if (i>1) fputs("\t", stdout); fputs(s, stdout); lua_pop(L, 1); /* pop result */ } fputs("\n", stdout); return 0; } static int luaB_tonumber (lua_State *L) { int base = luaL_opt_int(L, 2, 10); if (base == 10) { /* standard conversion */ luaL_checkany(L, 1); if (lua_isnumber(L, 1)) { lua_pushnumber(L, lua_tonumber(L, 1)); return 1; } } else { const char *s1 = luaL_check_string(L, 1); char *s2; unsigned long n; luaL_arg_check(L, 2 <= base && base <= 36, 2, "base out of range"); n = strtoul(s1, &s2, base); if (s1 != s2) { /* at least one valid digit? */ while (isspace((unsigned char)*s2)) s2++; /* skip trailing spaces */ if (*s2 == '\0') { /* no invalid trailing characters? */ lua_pushnumber(L, n); return 1; } } } lua_pushnil(L); /* else not a number */ return 1; } static int luaB_error (lua_State *L) { lua_error(L, luaL_opt_string(L, 1, NULL)); return 0; /* to avoid warnings */ } static int luaB_setglobal (lua_State *L) { luaL_checkany(L, 2); lua_setglobal(L, luaL_check_string(L, 1)); return 0; } static int luaB_getglobal (lua_State *L) { lua_getglobal(L, luaL_check_string(L, 1)); return 1; } static int luaB_tag (lua_State *L) { luaL_checkany(L, 1); lua_pushnumber(L, lua_tag(L, 1)); return 1; } static int luaB_settag (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); lua_pushvalue(L, 1); /* push table */ lua_settag(L, luaL_check_int(L, 2)); return 1; /* return table */ } static int luaB_newtag (lua_State *L) { lua_pushnumber(L, lua_newtag(L)); return 1; } static int luaB_copytagmethods (lua_State *L) { lua_pushnumber(L, lua_copytagmethods(L, luaL_check_int(L, 1), luaL_check_int(L, 2))); return 1; } static int luaB_globals (lua_State *L) { lua_getglobals(L); /* value to be returned */ if (!lua_isnull(L, 1)) { luaL_checktype(L, 1, LUA_TTABLE); lua_pushvalue(L, 1); /* new table of globals */ lua_setglobals(L); } return 1; } static int luaB_rawget (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); luaL_checkany(L, 2); lua_rawget(L, 1); return 1; } static int luaB_rawset (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); luaL_checkany(L, 2); luaL_checkany(L, 3); lua_rawset(L, 1); return 1; } static int luaB_settagmethod (lua_State *L) { int tag = luaL_check_int(L, 1); const char *event = luaL_check_string(L, 2); luaL_arg_check(L, lua_isfunction(L, 3) || lua_isnil(L, 3), 3, "function or nil expected"); if (strcmp(event, "gc") == 0) lua_error(L, "deprecated use: cannot set the `gc' tag method from Lua"); lua_gettagmethod(L, tag, event); lua_pushvalue(L, 3); lua_settagmethod(L, tag, event); return 1; } static int luaB_gettagmethod (lua_State *L) { int tag = luaL_check_int(L, 1); const char *event = luaL_check_string(L, 2); if (strcmp(event, "gc") == 0) lua_error(L, "deprecated use: cannot get the `gc' tag method from Lua"); lua_gettagmethod(L, tag, event); return 1; } static int luaB_gcinfo (lua_State *L) { lua_pushnumber(L, lua_getgccount(L)); lua_pushnumber(L, lua_getgcthreshold(L)); return 2; } static int luaB_collectgarbage (lua_State *L) { lua_setgcthreshold(L, luaL_opt_int(L, 1, 0)); return 0; } static int luaB_type (lua_State *L) { luaL_checkany(L, 1); lua_pushstring(L, lua_typename(L, lua_type(L, 1))); return 1; } static int luaB_next (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); lua_settop(L, 2); /* create a 2nd argument if there isn't one */ if (lua_next(L, 1)) return 2; else { lua_pushnil(L); return 1; } } static int passresults (lua_State *L, int status, int oldtop) { static const char *const errornames[] = {"ok", "run-time error", "file error", "syntax error", "memory error", "error in error handling"}; if (status == 0) { int nresults = lua_gettop(L) - oldtop; if (nresults > 0) return nresults; /* results are already on the stack */ else { lua_pushuserdata(L, NULL); /* at least one result to signal no errors */ return 1; } } else { /* error */ lua_pushnil(L); lua_pushstring(L, errornames[status]); /* error code */ return 2; } } static int luaB_dostring (lua_State *L) { int oldtop = lua_gettop(L); size_t l; const char *s = luaL_check_lstr(L, 1, &l); if (*s == '\33') /* binary files start with ESC... */ lua_error(L, "`dostring' cannot run pre-compiled code"); return passresults(L, lua_dobuffer(L, s, l, luaL_opt_string(L, 2, s)), oldtop); } static int luaB_dofile (lua_State *L) { int oldtop = lua_gettop(L); const char *fname = luaL_opt_string(L, 1, NULL); return passresults(L, lua_dofile(L, fname), oldtop); } static int luaB_call (lua_State *L) { int oldtop; const char *options = luaL_opt_string(L, 3, ""); int err = 0; /* index of old error method */ int i, status; int n; luaL_checktype(L, 2, LUA_TTABLE); n = lua_getn(L, 2); if (!lua_isnull(L, 4)) { /* set new error method */ lua_getglobal(L, LUA_ERRORMESSAGE); err = lua_gettop(L); /* get index */ lua_pushvalue(L, 4); lua_setglobal(L, LUA_ERRORMESSAGE); } oldtop = lua_gettop(L); /* top before function-call preparation */ /* push function */ lua_pushvalue(L, 1); luaL_checkstack(L, n, "too many arguments"); for (i=0; i=pos; n--) { lua_rawgeti(L, 1, n); lua_rawseti(L, 1, n+1); /* t[n+1] = t[n] */ } lua_pushvalue(L, v); lua_rawseti(L, 1, pos); /* t[pos] = v */ return 0; } static int luaB_tremove (lua_State *L) { int pos, n; luaL_checktype(L, 1, LUA_TTABLE); n = lua_getn(L, 1); pos = luaL_opt_int(L, 2, n); if (n <= 0) return 0; /* table is "empty" */ lua_rawgeti(L, 1, pos); /* result = t[pos] */ for ( ;pos= P */ while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) { if (i>u) lua_error(L, "invalid order function for sorting"); lua_pop(L, 1); /* remove a[i] */ } /* repeat --j until a[j] <= P */ while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) { if (j #include #include #include "lua.h" #include "lauxlib.h" #include "luadebug.h" #include "lualib.h" static void settabss (lua_State *L, const char *i, const char *v) { lua_pushstring(L, i); lua_pushstring(L, v); lua_settable(L, -3); } static void settabsi (lua_State *L, const char *i, int v) { lua_pushstring(L, i); lua_pushnumber(L, v); lua_settable(L, -3); } static int getinfo (lua_State *L) { lua_Debug ar; const char *options = luaL_opt_string(L, 2, "flnSu"); char buff[20]; if (lua_isnumber(L, 1)) { if (!lua_getstack(L, (int)lua_tonumber(L, 1), &ar)) { lua_pushnil(L); /* level out of range */ return 1; } } else if (lua_isfunction(L, 1)) { lua_pushvalue(L, 1); sprintf(buff, ">%.10s", options); options = buff; } else luaL_argerror(L, 1, "function or level expected"); if (!lua_getinfo(L, options, &ar)) luaL_argerror(L, 2, "invalid option"); lua_newtable(L); for (; *options; options++) { switch (*options) { case 'S': settabss(L, "source", ar.source); if (ar.source) settabss(L, "short_src", ar.short_src); settabsi(L, "linedefined", ar.linedefined); settabss(L, "what", ar.what); break; case 'l': settabsi(L, "currentline", ar.currentline); break; case 'u': settabsi(L, "nups", ar.nups); break; case 'n': settabss(L, "name", ar.name); settabss(L, "namewhat", ar.namewhat); break; case 'f': lua_pushstring(L, "func"); lua_pushvalue(L, -3); lua_settable(L, -3); break; } } return 1; /* return table */ } static int getlocal (lua_State *L) { lua_Debug ar; const char *name; if (!lua_getstack(L, luaL_check_int(L, 1), &ar)) /* level out of range? */ luaL_argerror(L, 1, "level out of range"); name = lua_getlocal(L, &ar, luaL_check_int(L, 2)); if (name) { lua_pushstring(L, name); lua_pushvalue(L, -2); return 2; } else { lua_pushnil(L); return 1; } } static int setlocal (lua_State *L) { lua_Debug ar; if (!lua_getstack(L, luaL_check_int(L, 1), &ar)) /* level out of range? */ luaL_argerror(L, 1, "level out of range"); luaL_checkany(L, 3); lua_pushstring(L, lua_setlocal(L, &ar, luaL_check_int(L, 2))); return 1; } /* dummy variables (to define unique addresses) */ static char key1, key2; #define KEY_CALLHOOK (&key1) #define KEY_LINEHOOK (&key2) static void hookf (lua_State *L, void *key) { lua_getregistry(L); lua_pushuserdata(L, key); lua_gettable(L, -2); if (lua_isfunction(L, -1)) { lua_pushvalue(L, 1); lua_rawcall(L, 1, 0); } else lua_pop(L, 1); /* pop result from gettable */ lua_pop(L, 1); /* pop table */ } static void callf (lua_State *L, lua_Debug *ar) { lua_pushstring(L, ar->event); hookf(L, KEY_CALLHOOK); } static void linef (lua_State *L, lua_Debug *ar) { lua_pushnumber(L, ar->currentline); hookf(L, KEY_LINEHOOK); } static void sethook (lua_State *L, void *key, lua_Hook hook, lua_Hook (*sethookf)(lua_State * L, lua_Hook h)) { lua_settop(L, 1); if (lua_isnil(L, 1)) (*sethookf)(L, NULL); else if (lua_isfunction(L, 1)) (*sethookf)(L, hook); else luaL_argerror(L, 1, "function expected"); lua_getregistry(L); lua_pushuserdata(L, key); lua_pushvalue(L, -1); /* dup key */ lua_gettable(L, -3); /* get old value */ lua_pushvalue(L, -2); /* key (again) */ lua_pushvalue(L, 1); lua_settable(L, -5); /* set new value */ } static int setcallhook (lua_State *L) { sethook(L, KEY_CALLHOOK, callf, lua_setcallhook); return 1; } static int setlinehook (lua_State *L) { sethook(L, KEY_LINEHOOK, linef, lua_setlinehook); return 1; } static const struct luaL_reg dblib[] = { {"getlocal", getlocal}, {"getinfo", getinfo}, {"setcallhook", setcallhook}, {"setlinehook", setlinehook}, {"setlocal", setlocal} }; LUALIB_API void lua_dblibopen (lua_State *L) { luaL_openl(L, dblib); } gltron-0.70/lua/src/lib/liolib.c0000644000076400001440000004536007700106116012170 /* ** $Id: liolib.c,v 1.6 2003/06/30 19:15:26 ahowe Exp $ ** Standard I/O (and system) library ** This file modified from it's original form. ** See Copyright Notice in lua.h */ #include #include #define __USE_MISC /* for mkstemp() */ #include #include #include #include #ifndef macintosh #ifndef WIN32 # include /* for close() */ #endif #endif #ifdef WIN32 # define close _close #endif #include "lua.h" #include "lauxlib.h" #include "luadebug.h" #include "lualib.h" #ifndef OLD_ANSI #include #include #define realloc(b,s) ((b) == NULL ? malloc(s) : (realloc)(b, s)) #define free(b) if (b) (free)(b) #else /* no support for locale and for strerror: fake them */ #define setlocale(a,b) ((void)a, strcmp((b),"C")==0?"C":NULL) #define LC_ALL 0 #define LC_COLLATE 0 #define LC_CTYPE 0 #define LC_MONETARY 0 #define LC_NUMERIC 0 #define LC_TIME 0 #define strerror(e) "generic I/O error" #define errno (-1) #endif #ifdef POPEN /* FILE *popen(); int pclose(); */ #define CLOSEFILE(L, f) ((pclose(f) == -1) ? fclose(f) : 0) #else /* no support for popen */ #define popen(x,y) NULL /* that is, popen always fails */ #define CLOSEFILE(L, f) (fclose(f)) #endif #define INFILE 0 #define OUTFILE 1 typedef struct IOCtrl { int ref[2]; /* ref for strings _INPUT/_OUTPUT */ int iotag; /* tag for file handles */ int closedtag; /* tag for closed handles */ } IOCtrl; static const char *const filenames[] = {"_INPUT", "_OUTPUT"}; static int pushresult (lua_State *L, int i) { if (i) { lua_pushuserdata(L, NULL); return 1; } else { lua_pushnil(L); lua_pushstring(L, strerror(errno)); lua_pushnumber(L, errno); return 3;; } } /* ** {====================================================== ** FILE Operations ** ======================================================= */ static FILE *gethandle (lua_State *L, IOCtrl *ctrl, int f) { void *p = lua_touserdata(L, f); if (p != NULL) { /* is `f' a userdata ? */ int ftag = lua_tag(L, f); if (ftag == ctrl->iotag) /* does it have the correct tag? */ return (FILE *)p; else if (ftag == ctrl->closedtag) lua_error(L, "cannot access a closed file"); /* else go through */ } return NULL; } static FILE *getnonullfile (lua_State *L, IOCtrl *ctrl, int arg) { FILE *f = gethandle(L, ctrl, arg); luaL_arg_check(L, f, arg, "invalid file handle"); return f; } static FILE *getfilebyref (lua_State *L, IOCtrl *ctrl, int inout) { FILE *f; lua_getglobals(L); lua_getref(L, ctrl->ref[inout]); lua_rawget(L, -2); f = gethandle(L, ctrl, -1); if (f == NULL) luaL_verror(L, "global variable `%.10s' is not a file handle", filenames[inout]); return f; } static void setfilebyname (lua_State *L, IOCtrl *ctrl, FILE *f, const char *name) { lua_pushusertag(L, f, ctrl->iotag); lua_setglobal(L, name); } #define setfile(L,ctrl,f,inout) (setfilebyname(L,ctrl,f,filenames[inout])) static int setreturn (lua_State *L, IOCtrl *ctrl, FILE *f, int inout) { if (f == NULL) return pushresult(L, 0); else { setfile(L, ctrl, f, inout); lua_pushusertag(L, f, ctrl->iotag); return 1; } } static int closefile (lua_State *L, IOCtrl *ctrl, FILE *f) { if (f == stdin || f == stdout || f == stderr) return 1; else { lua_pushusertag(L, f, ctrl->iotag); lua_settag(L, ctrl->closedtag); return (CLOSEFILE(L, f) == 0); } } static int io_close (lua_State *L) { IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); lua_pop(L, 1); /* remove upvalue */ return pushresult(L, closefile(L, ctrl, getnonullfile(L, ctrl, 1))); } static int file_collect (lua_State *L) { IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); FILE *f = getnonullfile(L, ctrl, 1); if (f != stdin && f != stdout && f != stderr) CLOSEFILE(L, f); return 0; } static int io_open (lua_State *L) { IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); FILE *f; lua_pop(L, 1); /* remove upvalue */ f = fopen(luaL_check_string(L, 1), luaL_check_string(L, 2)); if (f) { lua_pushusertag(L, f, ctrl->iotag); return 1; } else return pushresult(L, 0); } static int io_fromto (lua_State *L, int inout, const char *mode) { IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); FILE *current; lua_pop(L, 1); /* remove upvalue */ if (lua_isnull(L, 1)) { closefile(L, ctrl, getfilebyref(L, ctrl, inout)); current = (inout == 0) ? stdin : stdout; } else if (lua_tag(L, 1) == ctrl->iotag) /* deprecated option */ current = (FILE *)lua_touserdata(L, 1); else { const char *s = luaL_check_string(L, 1); current = (*s == '|') ? popen(s+1, mode) : fopen(s, mode); } return setreturn(L, ctrl, current, inout); } static int io_readfrom (lua_State *L) { return io_fromto(L, INFILE, "r"); } static int io_writeto (lua_State *L) { return io_fromto(L, OUTFILE, "w"); } static int io_appendto (lua_State *L) { IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); FILE *current; lua_pop(L, 1); /* remove upvalue */ current = fopen(luaL_check_string(L, 1), "a"); return setreturn(L, ctrl, current, OUTFILE); } /* ** {====================================================== ** READ ** ======================================================= */ #ifdef LUA_COMPAT_READPATTERN /* ** We cannot lookahead without need, because this can lock stdin. ** This flag signals when we need to read a next char. */ #define NEED_OTHER (EOF-1) /* just some flag different from EOF */ static int read_pattern (lua_State *L, FILE *f, const char *p) { int inskip = 0; /* {skip} level */ int c = NEED_OTHER; luaL_Buffer b; luaL_buffinit(L, &b); while (*p != '\0') { switch (*p) { case '{': inskip++; p++; continue; case '}': if (!inskip) lua_error(L, "unbalanced braces in read pattern"); inskip--; p++; continue; default: { const char *ep = luaI_classend(L, p); /* get what is next */ int m; /* match result */ if (c == NEED_OTHER) c = getc(f); m = (c==EOF) ? 0 : luaI_singlematch(c, p, ep); if (m) { if (!inskip) luaL_putchar(&b, c); c = NEED_OTHER; } switch (*ep) { case '+': /* repetition (1 or more) */ if (!m) goto break_while; /* pattern fails? */ /* else go through */ case '*': /* repetition (0 or more) */ while (m) { /* reads the same item until it fails */ c = getc(f); m = (c==EOF) ? 0 : luaI_singlematch(c, p, ep); if (m && !inskip) luaL_putchar(&b, c); } /* go through to continue reading the pattern */ case '?': /* optional */ p = ep+1; /* continues reading the pattern */ continue; default: if (!m) goto break_while; /* pattern fails? */ p = ep; /* else continues reading the pattern */ } } } } break_while: if (c != NEED_OTHER) ungetc(c, f); luaL_pushresult(&b); /* close buffer */ return (*p == '\0'); } #else #define read_pattern(L, f, p) (lua_error(L, "read patterns are deprecated"), 0) #endif static int read_number (lua_State *L, FILE *f) { double d; if (fscanf(f, "%lf", &d) == 1) { lua_pushnumber(L, d); return 1; } else return 0; /* read fails */ } static int read_word (lua_State *L, FILE *f) { int c; luaL_Buffer b; luaL_buffinit(L, &b); do { c = fgetc(f); } while (isspace(c)); /* skip spaces */ while (c != EOF && !isspace(c)) { luaL_putchar(&b, c); c = fgetc(f); } ungetc(c, f); luaL_pushresult(&b); /* close buffer */ return (lua_strlen(L, -1) > 0); } static int read_line (lua_State *L, FILE *f) { int n = 0; luaL_Buffer b; luaL_buffinit(L, &b); for (;;) { char *p = luaL_prepbuffer(&b); if (!fgets(p, LUAL_BUFFERSIZE, f)) /* read fails? */ break; n = strlen(p); if (p[n-1] != '\n') luaL_addsize(&b, n); else { luaL_addsize(&b, n-1); /* do not add the `\n' */ break; } } luaL_pushresult(&b); /* close buffer */ return (n > 0); /* read something? */ } static void read_file (lua_State *L, FILE *f) { size_t len = 0; size_t size = BUFSIZ; char *buffer = NULL; for (;;) { char *newbuffer = (char *)realloc(buffer, size); if (newbuffer == NULL) { free(buffer); lua_error(L, "not enough memory to read a file"); } buffer = newbuffer; len += fread(buffer+len, sizeof(char), size-len, f); if (len < size) break; /* did not read all it could */ size *= 2; } lua_pushlstring(L, buffer, len); free(buffer); } static int read_chars (lua_State *L, FILE *f, size_t n) { char *buffer; size_t n1; char statbuff[BUFSIZ]; if (n <= BUFSIZ) buffer = statbuff; else { buffer = (char *)malloc(n); if (buffer == NULL) lua_error(L, "not enough memory to read a file"); } n1 = fread(buffer, sizeof(char), n, f); lua_pushlstring(L, buffer, n1); if (buffer != statbuff) free(buffer); return (n1 > 0 || n == 0); } static int io_read (lua_State *L) { IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); int lastarg = lua_gettop(L) - 1; int firstarg = 1; FILE *f = gethandle(L, ctrl, firstarg); int n; if (f) firstarg++; else f = getfilebyref(L, ctrl, INFILE); /* get _INPUT */ lua_pop(L, 1); if (firstarg > lastarg) { /* no arguments? */ lua_settop(L, 0); /* erase upvalue and other eventual garbage */ firstarg = lastarg = 1; /* correct indices */ lua_pushstring(L, "*l"); /* push default argument */ } else /* ensure stack space for all results and for auxlib's buffer */ luaL_checkstack(L, lastarg-firstarg+1+LUA_MINSTACK, "too many arguments"); for (n = firstarg; n<=lastarg; n++) { int success; if (lua_isnumber(L, n)) success = read_chars(L, f, (size_t)lua_tonumber(L, n)); else { const char *p = luaL_check_string(L, n); if (p[0] != '*') success = read_pattern(L, f, p); /* deprecated! */ else { switch (p[1]) { case 'n': /* number */ if (!read_number(L, f)) goto endloop; /* read fails */ continue; /* number is already pushed; avoid the "pushstring" */ case 'l': /* line */ success = read_line(L, f); break; case 'a': /* file */ read_file(L, f); success = 1; /* always success */ break; case 'w': /* word */ success = read_word(L, f); break; default: luaL_argerror(L, n, "invalid format"); success = 0; /* to avoid warnings */ } } } if (!success) { lua_pop(L, 1); /* remove last result */ break; /* read fails */ } } endloop: return n - firstarg; } /* }====================================================== */ static int io_write (lua_State *L) { int lastarg = lua_gettop(L) - 1; IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); int arg = 1; int status = 1; FILE *f = gethandle(L, ctrl, arg); if (f) arg++; else f = getfilebyref(L, ctrl, OUTFILE); /* get _OUTPUT */ for (; arg <= lastarg; arg++) { if (lua_type(L, arg) == LUA_TNUMBER) { /* LUA_NUMBER */ /* optimization: could be done exactly as for strings */ status = status && fprintf(f, "%.16g", lua_tonumber(L, arg)) > 0; } else { size_t l; const char *s = luaL_check_lstr(L, arg, &l); status = status && (fwrite(s, sizeof(char), l, f) == l); } } pushresult(L, status); return 1; } static int io_seek (lua_State *L) { static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; static const char *const modenames[] = {"set", "cur", "end", NULL}; IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); FILE *f; int op; long offset; lua_pop(L, 1); /* remove upvalue */ f = getnonullfile(L, ctrl, 1); op = luaL_findstring(luaL_opt_string(L, 2, "cur"), modenames); offset = luaL_opt_long(L, 3, 0); luaL_arg_check(L, op != -1, 2, "invalid mode"); op = fseek(f, offset, mode[op]); if (op) return pushresult(L, 0); /* error */ else { lua_pushnumber(L, ftell(f)); return 1; } } static int io_flush (lua_State *L) { IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); FILE *f; lua_pop(L, 1); /* remove upvalue */ f = gethandle(L, ctrl, 1); luaL_arg_check(L, f || lua_isnull(L, 1), 1, "invalid file handle"); return pushresult(L, fflush(f) == 0); } /* }====================================================== */ /* ** {====================================================== ** Other O.S. Operations ** ======================================================= */ static int io_execute (lua_State *L) { lua_pushnumber(L, system(luaL_check_string(L, 1))); return 1; } static int io_remove (lua_State *L) { return pushresult(L, remove(luaL_check_string(L, 1)) == 0); } static int io_rename (lua_State *L) { return pushresult(L, rename(luaL_check_string(L, 1), luaL_check_string(L, 2)) == 0); } static int io_tmpname (lua_State *L) { /* #ifdef macintosh */ #if 1 /* mkstemp unavailable on Mac OS 9 */ assert (0); #else static char tmpfname[16]; int fid; strcpy(tmpfname,"/tmp/lua.XXXXXX"); if((fid=mkstemp(tmpfname))) close(fid); lua_pushstring(L, tmpfname); #endif return 1; } static int io_getenv (lua_State *L) { lua_pushstring(L, getenv(luaL_check_string(L, 1))); /* if NULL push nil */ return 1; } static int io_clock (lua_State *L) { lua_pushnumber(L, ((double)clock())/CLOCKS_PER_SEC); return 1; } static int io_date (lua_State *L) { char b[256]; const char *s = luaL_opt_string(L, 1, "%c"); struct tm *stm; time_t t; time(&t); stm = localtime(&t); if (strftime(b, sizeof(b), s, stm)) lua_pushstring(L, b); else lua_error(L, "invalid `date' format"); return 1; } static int setloc (lua_State *L) { static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME}; static const char *const catnames[] = {"all", "collate", "ctype", "monetary", "numeric", "time", NULL}; int op = luaL_findstring(luaL_opt_string(L, 2, "all"), catnames); luaL_arg_check(L, op != -1, 2, "invalid option"); lua_pushstring(L, setlocale(cat[op], luaL_check_string(L, 1))); return 1; } static int io_exit (lua_State *L) { exit(luaL_opt_int(L, 1, EXIT_SUCCESS)); return 0; /* to avoid warnings */ } /* }====================================================== */ static int io_debug (lua_State *L) { for (;;) { char buffer[250]; fprintf(stderr, "lua_debug> "); if (fgets(buffer, sizeof(buffer), stdin) == 0 || strcmp(buffer, "cont\n") == 0) return 0; lua_dostring(L, buffer); lua_settop(L, 0); /* remove eventual returns */ } } #define LEVELS1 12 /* size of the first part of the stack */ #define LEVELS2 10 /* size of the second part of the stack */ static int errorfb (lua_State *L) { int level = 1; /* skip level 0 (it's this function) */ int firstpart = 1; /* still before eventual `...' */ lua_Debug ar; luaL_Buffer b; luaL_buffinit(L, &b); luaL_addstring(&b, "error: "); luaL_addstring(&b, luaL_check_string(L, 1)); luaL_addstring(&b, "\n"); while (lua_getstack(L, level++, &ar)) { char buff[120]; /* enough to fit following `sprintf's */ if (level == 2) luaL_addstring(&b, "stack traceback:\n"); else if (level > LEVELS1 && firstpart) { /* no more than `LEVELS2' more levels? */ if (!lua_getstack(L, level+LEVELS2, &ar)) level--; /* keep going */ else { luaL_addstring(&b, " ...\n"); /* too many levels */ while (lua_getstack(L, level+LEVELS2, &ar)) /* find last levels */ level++; } firstpart = 0; continue; } sprintf(buff, "%4d: ", level-1); luaL_addstring(&b, buff); lua_getinfo(L, "Snl", &ar); switch (*ar.namewhat) { case 'g': case 'l': /* global, local */ sprintf(buff, "function `%.50s'", ar.name); break; case 'f': /* field */ sprintf(buff, "method `%.50s'", ar.name); break; case 't': /* tag method */ sprintf(buff, "`%.50s' tag method", ar.name); break; default: { if (*ar.what == 'm') /* main? */ sprintf(buff, "main of %.70s", ar.short_src); else if (*ar.what == 'C') /* C function? */ sprintf(buff, "%.70s", ar.short_src); else sprintf(buff, "function <%d:%.70s>", ar.linedefined, ar.short_src); ar.source = NULL; /* do not print source again */ } } luaL_addstring(&b, buff); if (ar.currentline > 0) { sprintf(buff, " at line %d", ar.currentline); luaL_addstring(&b, buff); } if (ar.source) { sprintf(buff, " [%.70s]", ar.short_src); luaL_addstring(&b, buff); } luaL_addstring(&b, "\n"); } luaL_pushresult(&b); lua_getglobal(L, LUA_ALERT); if (lua_isfunction(L, -1)) { /* avoid loop if _ALERT is not defined */ lua_pushvalue(L, -2); /* error message */ lua_rawcall(L, 1, 0); } return 0; } static const struct luaL_reg iolib[] = { {LUA_ERRORMESSAGE, errorfb}, {"clock", io_clock}, {"date", io_date}, {"debug", io_debug}, {"execute", io_execute}, {"exit", io_exit}, {"getenv", io_getenv}, {"remove", io_remove}, {"rename", io_rename}, {"setlocale", setloc}, {"tmpname", io_tmpname} }; static const struct luaL_reg iolibtag[] = { {"appendto", io_appendto}, {"closefile", io_close}, {"flush", io_flush}, {"openfile", io_open}, {"read", io_read}, {"readfrom", io_readfrom}, {"seek", io_seek}, {"write", io_write}, {"writeto", io_writeto} }; static void openwithcontrol (lua_State *L) { IOCtrl *ctrl = (IOCtrl *)lua_newuserdata(L, sizeof(IOCtrl)); unsigned int i; ctrl->iotag = lua_newtag(L); ctrl->closedtag = lua_newtag(L); for (i=0; iref[INFILE] = lua_ref(L, 1); lua_pushstring(L, filenames[OUTFILE]); ctrl->ref[OUTFILE] = lua_ref(L, 1); /* predefined file handles */ setfile(L, ctrl, stdin, INFILE); setfile(L, ctrl, stdout, OUTFILE); setfilebyname(L, ctrl, stdin, "_STDIN"); setfilebyname(L, ctrl, stdout, "_STDOUT"); setfilebyname(L, ctrl, stderr, "_STDERR"); /* close files when collected */ lua_pushcclosure(L, file_collect, 1); /* pops `ctrl' from stack */ lua_settagmethod(L, ctrl->iotag, "gc"); } LUALIB_API void lua_iolibopen (lua_State *L) { luaL_openl(L, iolib); openwithcontrol(L); } gltron-0.70/lua/src/lib/lmathlib.c0000644000076400001440000001231707432712643012520 /* ** $Id: lmathlib.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Standard mathematical library ** See Copyright Notice in lua.h */ #include #include #include "lua.h" #include "lauxlib.h" #include "lualib.h" #undef PI #define PI (3.14159265358979323846) #define RADIANS_PER_DEGREE (PI/180.0) /* ** If you want Lua to operate in radians (instead of degrees), ** define RADIANS */ #ifdef RADIANS #define FROMRAD(a) (a) #define TORAD(a) (a) #else #define FROMRAD(a) ((a)/RADIANS_PER_DEGREE) #define TORAD(a) ((a)*RADIANS_PER_DEGREE) #endif static int math_abs (lua_State *L) { lua_pushnumber(L, fabs(luaL_check_number(L, 1))); return 1; } static int math_sin (lua_State *L) { lua_pushnumber(L, sin(TORAD(luaL_check_number(L, 1)))); return 1; } static int math_cos (lua_State *L) { lua_pushnumber(L, cos(TORAD(luaL_check_number(L, 1)))); return 1; } static int math_tan (lua_State *L) { lua_pushnumber(L, tan(TORAD(luaL_check_number(L, 1)))); return 1; } static int math_asin (lua_State *L) { lua_pushnumber(L, FROMRAD(asin(luaL_check_number(L, 1)))); return 1; } static int math_acos (lua_State *L) { lua_pushnumber(L, FROMRAD(acos(luaL_check_number(L, 1)))); return 1; } static int math_atan (lua_State *L) { lua_pushnumber(L, FROMRAD(atan(luaL_check_number(L, 1)))); return 1; } static int math_atan2 (lua_State *L) { lua_pushnumber(L, FROMRAD(atan2(luaL_check_number(L, 1), luaL_check_number(L, 2)))); return 1; } static int math_ceil (lua_State *L) { lua_pushnumber(L, ceil(luaL_check_number(L, 1))); return 1; } static int math_floor (lua_State *L) { lua_pushnumber(L, floor(luaL_check_number(L, 1))); return 1; } static int math_mod (lua_State *L) { lua_pushnumber(L, fmod(luaL_check_number(L, 1), luaL_check_number(L, 2))); return 1; } static int math_sqrt (lua_State *L) { lua_pushnumber(L, sqrt(luaL_check_number(L, 1))); return 1; } static int math_pow (lua_State *L) { lua_pushnumber(L, pow(luaL_check_number(L, 1), luaL_check_number(L, 2))); return 1; } static int math_log (lua_State *L) { lua_pushnumber(L, log(luaL_check_number(L, 1))); return 1; } static int math_log10 (lua_State *L) { lua_pushnumber(L, log10(luaL_check_number(L, 1))); return 1; } static int math_exp (lua_State *L) { lua_pushnumber(L, exp(luaL_check_number(L, 1))); return 1; } static int math_deg (lua_State *L) { lua_pushnumber(L, luaL_check_number(L, 1)/RADIANS_PER_DEGREE); return 1; } static int math_rad (lua_State *L) { lua_pushnumber(L, luaL_check_number(L, 1)*RADIANS_PER_DEGREE); return 1; } static int math_frexp (lua_State *L) { int e; lua_pushnumber(L, frexp(luaL_check_number(L, 1), &e)); lua_pushnumber(L, e); return 2; } static int math_ldexp (lua_State *L) { lua_pushnumber(L, ldexp(luaL_check_number(L, 1), luaL_check_int(L, 2))); return 1; } static int math_min (lua_State *L) { int n = lua_gettop(L); /* number of arguments */ double dmin = luaL_check_number(L, 1); int i; for (i=2; i<=n; i++) { double d = luaL_check_number(L, i); if (d < dmin) dmin = d; } lua_pushnumber(L, dmin); return 1; } static int math_max (lua_State *L) { int n = lua_gettop(L); /* number of arguments */ double dmax = luaL_check_number(L, 1); int i; for (i=2; i<=n; i++) { double d = luaL_check_number(L, i); if (d > dmax) dmax = d; } lua_pushnumber(L, dmax); return 1; } static int math_random (lua_State *L) { /* the '%' avoids the (rare) case of r==1, and is needed also because on some systems (SunOS!) "rand()" may return a value larger than RAND_MAX */ double r = (double)(rand()%RAND_MAX) / (double)RAND_MAX; switch (lua_gettop(L)) { /* check number of arguments */ case 0: { /* no arguments */ lua_pushnumber(L, r); /* Number between 0 and 1 */ break; } case 1: { /* only upper limit */ int u = luaL_check_int(L, 1); luaL_arg_check(L, 1<=u, 1, "interval is empty"); lua_pushnumber(L, (int)(r*u)+1); /* integer between 1 and `u' */ break; } case 2: { /* lower and upper limits */ int l = luaL_check_int(L, 1); int u = luaL_check_int(L, 2); luaL_arg_check(L, l<=u, 2, "interval is empty"); lua_pushnumber(L, (int)(r*(u-l+1))+l); /* integer between `l' and `u' */ break; } default: lua_error(L, "wrong number of arguments"); } return 1; } static int math_randomseed (lua_State *L) { srand(luaL_check_int(L, 1)); return 0; } static const struct luaL_reg mathlib[] = { {"abs", math_abs}, {"sin", math_sin}, {"cos", math_cos}, {"tan", math_tan}, {"asin", math_asin}, {"acos", math_acos}, {"atan", math_atan}, {"atan2", math_atan2}, {"ceil", math_ceil}, {"floor", math_floor}, {"mod", math_mod}, {"frexp", math_frexp}, {"ldexp", math_ldexp}, {"sqrt", math_sqrt}, {"min", math_min}, {"max", math_max}, {"log", math_log}, {"log10", math_log10}, {"exp", math_exp}, {"deg", math_deg}, {"rad", math_rad}, {"random", math_random}, {"randomseed", math_randomseed} }; /* ** Open math library */ LUALIB_API void lua_mathlibopen (lua_State *L) { luaL_openl(L, mathlib); lua_pushcfunction(L, math_pow); lua_settagmethod(L, LUA_TNUMBER, "pow"); lua_pushnumber(L, PI); lua_setglobal(L, "PI"); } gltron-0.70/lua/src/lib/lstrlib.c0000644000076400001440000004200507432712643012374 /* ** $Id: lstrlib.c,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Standard library for string operations and pattern-matching ** See Copyright Notice in lua.h */ #include #include #include #include #include #include "lua.h" #include "lauxlib.h" #include "lualib.h" static int str_len (lua_State *L) { size_t l; luaL_check_lstr(L, 1, &l); lua_pushnumber(L, l); return 1; } static long posrelat (long pos, size_t len) { /* relative string position: negative means back from end */ return (pos>=0) ? pos : (long)len+pos+1; } static int str_sub (lua_State *L) { size_t l; const char *s = luaL_check_lstr(L, 1, &l); long start = posrelat(luaL_check_long(L, 2), l); long end = posrelat(luaL_opt_long(L, 3, -1), l); if (start < 1) start = 1; if (end > (long)l) end = l; if (start <= end) lua_pushlstring(L, s+start-1, end-start+1); else lua_pushstring(L, ""); return 1; } static int str_lower (lua_State *L) { size_t l; size_t i; luaL_Buffer b; const char *s = luaL_check_lstr(L, 1, &l); luaL_buffinit(L, &b); for (i=0; i 0) luaL_addlstring(&b, s, l); luaL_pushresult(&b); return 1; } static int str_byte (lua_State *L) { size_t l; const char *s = luaL_check_lstr(L, 1, &l); long pos = posrelat(luaL_opt_long(L, 2, 1), l); luaL_arg_check(L, 0level && cap->capture[l].len != -1)) lua_error(L, "invalid capture index"); return l; } static int capture_to_close (lua_State *L, struct Capture *cap) { int level = cap->level; for (level--; level>=0; level--) if (cap->capture[level].len == -1) return level; lua_error(L, "invalid pattern capture"); return 0; /* to avoid warnings */ } const char *luaI_classend (lua_State *L, const char *p) { switch (*p++) { case ESC: if (*p == '\0') lua_error(L, "malformed pattern (ends with `%')"); return p+1; case '[': if (*p == '^') p++; do { /* look for a ']' */ if (*p == '\0') lua_error(L, "malformed pattern (missing `]')"); if (*(p++) == ESC && *p != '\0') p++; /* skip escapes (e.g. '%]') */ } while (*p != ']'); return p+1; default: return p; } } static int match_class (int c, int cl) { int res; switch (tolower(cl)) { case 'a' : res = isalpha(c); break; case 'c' : res = iscntrl(c); break; case 'd' : res = isdigit(c); break; case 'l' : res = islower(c); break; case 'p' : res = ispunct(c); break; case 's' : res = isspace(c); break; case 'u' : res = isupper(c); break; case 'w' : res = isalnum(c); break; case 'x' : res = isxdigit(c); break; case 'z' : res = (c == '\0'); break; default: return (cl == c); } return (islower(cl) ? res : !res); } static int matchbracketclass (int c, const char *p, const char *endclass) { int sig = 1; if (*(p+1) == '^') { sig = 0; p++; /* skip the '^' */ } while (++p < endclass) { if (*p == ESC) { p++; if (match_class(c, (unsigned char)*p)) return sig; } else if ((*(p+1) == '-') && (p+2 < endclass)) { p+=2; if ((int)(unsigned char)*(p-2) <= c && c <= (int)(unsigned char)*p) return sig; } else if ((int)(unsigned char)*p == c) return sig; } return !sig; } int luaI_singlematch (int c, const char *p, const char *ep) { switch (*p) { case '.': /* matches any char */ return 1; case ESC: return match_class(c, (unsigned char)*(p+1)); case '[': return matchbracketclass(c, p, ep-1); default: return ((unsigned char)*p == c); } } static const char *match (lua_State *L, const char *s, const char *p, struct Capture *cap); static const char *matchbalance (lua_State *L, const char *s, const char *p, struct Capture *cap) { if (*p == 0 || *(p+1) == 0) lua_error(L, "unbalanced pattern"); if (*s != *p) return NULL; else { int b = *p; int e = *(p+1); int cont = 1; while (++s < cap->src_end) { if (*s == e) { if (--cont == 0) return s+1; } else if (*s == b) cont++; } } return NULL; /* string ends out of balance */ } static const char *max_expand (lua_State *L, const char *s, const char *p, const char *ep, struct Capture *cap) { long i = 0; /* counts maximum expand for item */ while ((s+i)src_end && luaI_singlematch((unsigned char)*(s+i), p, ep)) i++; /* keeps trying to match with the maximum repetitions */ while (i>=0) { const char *res = match(L, (s+i), ep+1, cap); if (res) return res; i--; /* else didn't match; reduce 1 repetition to try again */ } return NULL; } static const char *min_expand (lua_State *L, const char *s, const char *p, const char *ep, struct Capture *cap) { for (;;) { const char *res = match(L, s, ep+1, cap); if (res != NULL) return res; else if (ssrc_end && luaI_singlematch((unsigned char)*s, p, ep)) s++; /* try with one more repetition */ else return NULL; } } static const char *start_capture (lua_State *L, const char *s, const char *p, struct Capture *cap) { const char *res; int level = cap->level; if (level >= MAX_CAPTURES) lua_error(L, "too many captures"); cap->capture[level].init = s; cap->capture[level].len = -1; cap->level = level+1; if ((res=match(L, s, p+1, cap)) == NULL) /* match failed? */ cap->level--; /* undo capture */ return res; } static const char *end_capture (lua_State *L, const char *s, const char *p, struct Capture *cap) { int l = capture_to_close(L, cap); const char *res; cap->capture[l].len = s - cap->capture[l].init; /* close capture */ if ((res = match(L, s, p+1, cap)) == NULL) /* match failed? */ cap->capture[l].len = -1; /* undo capture */ return res; } static const char *match_capture (lua_State *L, const char *s, int level, struct Capture *cap) { int l = check_capture(L, level, cap); size_t len = cap->capture[l].len; if ((size_t)(cap->src_end-s) >= len && memcmp(cap->capture[l].init, s, len) == 0) return s+len; else return NULL; } static const char *match (lua_State *L, const char *s, const char *p, struct Capture *cap) { init: /* using goto's to optimize tail recursion */ switch (*p) { case '(': /* start capture */ return start_capture(L, s, p, cap); case ')': /* end capture */ return end_capture(L, s, p, cap); case ESC: /* may be %[0-9] or %b */ if (isdigit((unsigned char)(*(p+1)))) { /* capture? */ s = match_capture(L, s, *(p+1), cap); if (s == NULL) return NULL; p+=2; goto init; /* else return match(L, s, p+2, cap) */ } else if (*(p+1) == 'b') { /* balanced string? */ s = matchbalance(L, s, p+2, cap); if (s == NULL) return NULL; p+=4; goto init; /* else return match(L, s, p+4, cap); */ } else goto dflt; /* case default */ case '\0': /* end of pattern */ return s; /* match succeeded */ case '$': if (*(p+1) == '\0') /* is the '$' the last char in pattern? */ return (s == cap->src_end) ? s : NULL; /* check end of string */ else goto dflt; default: dflt: { /* it is a pattern item */ const char *ep = luaI_classend(L, p); /* points to what is next */ int m = ssrc_end && luaI_singlematch((unsigned char)*s, p, ep); switch (*ep) { case '?': { /* optional */ const char *res; if (m && ((res=match(L, s+1, ep+1, cap)) != NULL)) return res; p=ep+1; goto init; /* else return match(L, s, ep+1, cap); */ } case '*': /* 0 or more repetitions */ return max_expand(L, s, p, ep, cap); case '+': /* 1 or more repetitions */ return (m ? max_expand(L, s+1, p, ep, cap) : NULL); case '-': /* 0 or more repetitions (minimum) */ return min_expand(L, s, p, ep, cap); default: if (!m) return NULL; s++; p=ep; goto init; /* else return match(L, s+1, ep, cap); */ } } } } static const char *lmemfind (const char *s1, size_t l1, const char *s2, size_t l2) { if (l2 == 0) return s1; /* empty strings are everywhere */ else if (l2 > l1) return NULL; /* avoids a negative `l1' */ else { const char *init; /* to search for a `*s2' inside `s1' */ l2--; /* 1st char will be checked by `memchr' */ l1 = l1-l2; /* `s2' cannot be found after that */ while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { init++; /* 1st char is already checked */ if (memcmp(init, s2+1, l2) == 0) return init-1; else { /* correct `l1' and `s1' to try again */ l1 -= init-s1; s1 = init; } } return NULL; /* not found */ } } static int push_captures (lua_State *L, struct Capture *cap) { int i; luaL_checkstack(L, cap->level, "too many captures"); for (i=0; ilevel; i++) { int l = cap->capture[i].len; if (l == -1) lua_error(L, "unfinished capture"); lua_pushlstring(L, cap->capture[i].init, l); } return cap->level; /* number of strings pushed */ } static int str_find (lua_State *L) { size_t l1, l2; const char *s = luaL_check_lstr(L, 1, &l1); const char *p = luaL_check_lstr(L, 2, &l2); long init = posrelat(luaL_opt_long(L, 3, 1), l1) - 1; struct Capture cap; luaL_arg_check(L, 0 <= init && (size_t)init <= l1, 3, "out of range"); if (lua_gettop(L) > 3 || /* extra argument? */ strpbrk(p, SPECIALS) == NULL) { /* or no special characters? */ const char *s2 = lmemfind(s+init, l1-init, p, l2); if (s2) { lua_pushnumber(L, s2-s+1); lua_pushnumber(L, s2-s+l2); return 2; } } else { int anchor = (*p == '^') ? (p++, 1) : 0; const char *s1=s+init; cap.src_end = s+l1; do { const char *res; cap.level = 0; if ((res=match(L, s1, p, &cap)) != NULL) { lua_pushnumber(L, s1-s+1); /* start */ lua_pushnumber(L, res-s); /* end */ return push_captures(L, &cap) + 2; } } while (s1++capture[level].init, cap->capture[level].len); } } } } else { /* is a function */ int n; lua_pushvalue(L, 3); n = push_captures(L, cap); lua_rawcall(L, n, 1); if (lua_isstring(L, -1)) luaL_addvalue(b); /* add return to accumulated result */ else lua_pop(L, 1); /* function result is not a string: pop it */ } } static int str_gsub (lua_State *L) { size_t srcl; const char *src = luaL_check_lstr(L, 1, &srcl); const char *p = luaL_check_string(L, 2); int max_s = luaL_opt_int(L, 4, srcl+1); int anchor = (*p == '^') ? (p++, 1) : 0; int n = 0; struct Capture cap; luaL_Buffer b; luaL_arg_check(L, lua_gettop(L) >= 3 && (lua_isstring(L, 3) || lua_isfunction(L, 3)), 3, "string or function expected"); luaL_buffinit(L, &b); cap.src_end = src+srcl; while (n < max_s) { const char *e; cap.level = 0; e = match(L, src, p, &cap); if (e) { n++; add_s(L, &b, &cap); } if (e && e>src) /* non empty match? */ src = e; /* skip it */ else if (src < cap.src_end) luaL_putchar(&b, *src++); else break; if (anchor) break; } luaL_addlstring(&b, src, cap.src_end-src); luaL_pushresult(&b); lua_pushnumber(L, n); /* number of substitutions */ return 2; } /* }====================================================== */ static void luaI_addquoted (lua_State *L, luaL_Buffer *b, int arg) { size_t l; const char *s = luaL_check_lstr(L, arg, &l); luaL_putchar(b, '"'); while (l--) { switch (*s) { case '"': case '\\': case '\n': luaL_putchar(b, '\\'); luaL_putchar(b, *s); break; case '\0': luaL_addlstring(b, "\\000", 4); break; default: luaL_putchar(b, *s); } s++; } luaL_putchar(b, '"'); } /* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ #define MAX_ITEM 512 /* maximum size of each format specification (such as '%-099.99d') */ #define MAX_FORMAT 20 static int str_format (lua_State *L) { int arg = 1; const char *strfrmt = luaL_check_string(L, arg); luaL_Buffer b; luaL_buffinit(L, &b); while (*strfrmt) { if (*strfrmt != '%') luaL_putchar(&b, *strfrmt++); else if (*++strfrmt == '%') luaL_putchar(&b, *strfrmt++); /* %% */ else { /* format item */ struct Capture cap; char form[MAX_FORMAT]; /* to store the format ('%...') */ char buff[MAX_ITEM]; /* to store the formatted item */ const char *initf = strfrmt; form[0] = '%'; if (isdigit((unsigned char)*initf) && *(initf+1) == '$') { arg = *initf - '0'; initf += 2; /* skip the 'n$' */ } arg++; cap.src_end = strfrmt+strlen(strfrmt)+1; cap.level = 0; strfrmt = match(L, initf, "[-+ #0]*(%d*)%.?(%d*)", &cap); if (cap.capture[0].len > 2 || cap.capture[1].len > 2 || /* < 100? */ strfrmt-initf > MAX_FORMAT-2) lua_error(L, "invalid format (width or precision too long)"); strncpy(form+1, initf, strfrmt-initf+1); /* +1 to include conversion */ form[strfrmt-initf+2] = 0; switch (*strfrmt++) { case 'c': case 'd': case 'i': sprintf(buff, form, luaL_check_int(L, arg)); break; case 'o': case 'u': case 'x': case 'X': sprintf(buff, form, (unsigned int)luaL_check_number(L, arg)); break; case 'e': case 'E': case 'f': case 'g': case 'G': sprintf(buff, form, luaL_check_number(L, arg)); break; case 'q': luaI_addquoted(L, &b, arg); continue; /* skip the "addsize" at the end */ case 's': { size_t l; const char *s = luaL_check_lstr(L, arg, &l); if (cap.capture[1].len == 0 && l >= 100) { /* no precision and string is too long to be formatted; keep original string */ lua_pushvalue(L, arg); luaL_addvalue(&b); continue; /* skip the "addsize" at the end */ } else { sprintf(buff, form, s); break; } } default: /* also treat cases 'pnLlh' */ lua_error(L, "invalid option in `format'"); } luaL_addlstring(&b, buff, strlen(buff)); } } luaL_pushresult(&b); return 1; } static const struct luaL_reg strlib[] = { {"strlen", str_len}, {"strsub", str_sub}, {"strlower", str_lower}, {"strupper", str_upper}, {"strchar", str_char}, {"strrep", str_rep}, {"ascii", str_byte}, /* for compatibility with 3.0 and earlier */ {"strbyte", str_byte}, {"format", str_format}, {"strfind", str_find}, {"gsub", str_gsub} }; /* ** Open string library */ LUALIB_API void lua_strlibopen (lua_State *L) { luaL_openl(L, strlib); } gltron-0.70/lua/include/0000777000076400001440000000000007767023545010735 5gltron-0.70/lua/include/lauxlib.h0000644000076400001440000000552607432712643012463 /* ** $Id: lauxlib.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */ #ifndef lauxlib_h #define lauxlib_h #include #include #include "lua.h" #ifndef LUALIB_API #define LUALIB_API extern #endif struct luaL_reg { const char *name; lua_CFunction func; }; LUALIB_API void luaL_openlib (lua_State *L, const struct luaL_reg *l, int n); LUALIB_API void luaL_argerror (lua_State *L, int numarg, const char *extramsg); LUALIB_API const char *luaL_check_lstr (lua_State *L, int numArg, size_t *len); LUALIB_API const char *luaL_opt_lstr (lua_State *L, int numArg, const char *def, size_t *len); LUALIB_API double luaL_check_number (lua_State *L, int numArg); LUALIB_API double luaL_opt_number (lua_State *L, int numArg, double def); LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg); LUALIB_API void luaL_checktype (lua_State *L, int narg, int t); LUALIB_API void luaL_checkany (lua_State *L, int narg); LUALIB_API void luaL_verror (lua_State *L, const char *fmt, ...); LUALIB_API int luaL_findstring (const char *name, const char *const list[]); /* ** =============================================================== ** some useful macros ** =============================================================== */ #define luaL_arg_check(L, cond,numarg,extramsg) if (!(cond)) \ luaL_argerror(L, numarg,extramsg) #define luaL_check_string(L,n) (luaL_check_lstr(L, (n), NULL)) #define luaL_opt_string(L,n,d) (luaL_opt_lstr(L, (n), (d), NULL)) #define luaL_check_int(L,n) ((int)luaL_check_number(L, n)) #define luaL_check_long(L,n) ((long)luaL_check_number(L, n)) #define luaL_opt_int(L,n,d) ((int)luaL_opt_number(L, n,d)) #define luaL_opt_long(L,n,d) ((long)luaL_opt_number(L, n,d)) #define luaL_openl(L,a) luaL_openlib(L, a, (sizeof(a)/sizeof(a[0]))) /* ** {====================================================== ** Generic Buffer manipulation ** ======================================================= */ #ifndef LUAL_BUFFERSIZE #define LUAL_BUFFERSIZE BUFSIZ #endif typedef struct luaL_Buffer { char *p; /* current position in buffer */ int level; lua_State *L; char buffer[LUAL_BUFFERSIZE]; } luaL_Buffer; #define luaL_putchar(B,c) \ ((void)((B)->p < &(B)->buffer[LUAL_BUFFERSIZE] || luaL_prepbuffer(B)), \ (*(B)->p++ = (char)(c))) #define luaL_addsize(B,n) ((B)->p += (n)) LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B); LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B); LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l); LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s); LUALIB_API void luaL_addvalue (luaL_Buffer *B); LUALIB_API void luaL_pushresult (luaL_Buffer *B); /* }====================================================== */ #endif gltron-0.70/lua/include/lua.h0000644000076400001440000001740707513504760011604 /* ** $Id: lua.h,v 1.2 2002/07/12 07:49:04 jcatki Exp $ ** Lua - An Extensible Extension Language ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil ** e-mail: lua@tecgraf.puc-rio.br ** www: http://www.tecgraf.puc-rio.br/lua/ ** See Copyright Notice at the end of this file */ #ifndef lua_h #define lua_h /* definition of `size_t' */ #include /* mark for all API functions */ #ifndef LUA_API #define LUA_API extern #endif #define LUA_VERSION "Lua 4.0.1" #define LUA_COPYRIGHT "Copyright (C) 1994-2000 TeCGraf, PUC-Rio" #define LUA_AUTHORS "W. Celes, R. Ierusalimschy & L. H. de Figueiredo" /* name of global variable with error handler */ #define LUA_ERRORMESSAGE "_ERRORMESSAGE" /* pre-defined references */ #define LUA_NOREF (-2) #define LUA_REFNIL (-1) #define LUA_REFREGISTRY 0 /* pre-defined tags */ #define LUA_ANYTAG (-1) #define LUA_NOTAG (-2) /* option for multiple returns in lua_call */ #define LUA_MULTRET (-1) /* minimum stack available for a C function */ #define LUA_MINSTACK 20 /* error codes for lua_do* */ #define LUA_ERRRUN 1 #define LUA_ERRFILE 2 #define LUA_ERRSYNTAX 3 #define LUA_ERRMEM 4 #define LUA_ERRERR 5 typedef struct lua_State lua_State; typedef int (*lua_CFunction) (lua_State *L); /* ** types returned by `lua_type' */ #define LUA_TNONE (-1) #define LUA_TUSERDATA 0 #define LUA_TNIL 1 #define LUA_TNUMBER 2 #define LUA_TSTRING 3 #define LUA_TTABLE 4 #define LUA_TFUNCTION 5 /* ** state manipulation */ LUA_API lua_State *lua_open (int stacksize); LUA_API void lua_close (lua_State *L); /* ** basic stack manipulation */ LUA_API int lua_gettop (lua_State *L); LUA_API void lua_settop (lua_State *L, int index); LUA_API void lua_pushvalue (lua_State *L, int index); LUA_API void lua_remove (lua_State *L, int index); LUA_API void lua_insert (lua_State *L, int index); LUA_API int lua_stackspace (lua_State *L); /* ** access functions (stack -> C) */ LUA_API int lua_type (lua_State *L, int index); LUA_API const char *lua_typename (lua_State *L, int t); LUA_API int lua_isnumber (lua_State *L, int index); LUA_API int lua_isstring (lua_State *L, int index); LUA_API int lua_iscfunction (lua_State *L, int index); LUA_API int lua_tag (lua_State *L, int index); LUA_API int lua_equal (lua_State *L, int index1, int index2); LUA_API int lua_lessthan (lua_State *L, int index1, int index2); LUA_API double lua_tonumber (lua_State *L, int index); LUA_API const char *lua_tostring (lua_State *L, int index); LUA_API size_t lua_strlen (lua_State *L, int index); LUA_API lua_CFunction lua_tocfunction (lua_State *L, int index); LUA_API void *lua_touserdata (lua_State *L, int index); LUA_API const void *lua_topointer (lua_State *L, int index); /* ** push functions (C -> stack) */ LUA_API void lua_pushnil (lua_State *L); LUA_API void lua_pushnumber (lua_State *L, double n); LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len); LUA_API void lua_pushstring (lua_State *L, const char *s); LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n); LUA_API void lua_pushusertag (lua_State *L, void *u, int tag); /* ** get functions (Lua -> stack) */ LUA_API void lua_getglobal (lua_State *L, const char *name); LUA_API void lua_gettable (lua_State *L, int index); LUA_API void lua_rawget (lua_State *L, int index); LUA_API void lua_rawgeti (lua_State *L, int index, int n); LUA_API void lua_getglobals (lua_State *L); LUA_API void lua_gettagmethod (lua_State *L, int tag, const char *event); LUA_API int lua_getref (lua_State *L, int ref); LUA_API void lua_newtable (lua_State *L); /* ** set functions (stack -> Lua) */ LUA_API void lua_setglobal (lua_State *L, const char *name); LUA_API void lua_settable (lua_State *L, int index); LUA_API void lua_rawset (lua_State *L, int index); LUA_API void lua_rawseti (lua_State *L, int index, int n); LUA_API void lua_setglobals (lua_State *L); LUA_API void lua_settagmethod (lua_State *L, int tag, const char *event); LUA_API int lua_ref (lua_State *L, int lock); /* ** "do" functions (run Lua code) */ LUA_API int lua_call (lua_State *L, int nargs, int nresults); LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults); LUA_API int lua_dofile (lua_State *L, const char *filename); LUA_API int lua_dostring (lua_State *L, const char *str); LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size, const char *name); /* ** Garbage-collection functions */ LUA_API int lua_getgcthreshold (lua_State *L); LUA_API int lua_getgccount (lua_State *L); LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold); /* ** miscellaneous functions */ LUA_API int lua_newtag (lua_State *L); LUA_API int lua_copytagmethods (lua_State *L, int tagto, int tagfrom); LUA_API void lua_settag (lua_State *L, int tag); LUA_API void lua_error (lua_State *L, const char *s); LUA_API void lua_unref (lua_State *L, int ref); LUA_API int lua_next (lua_State *L, int index); LUA_API int lua_getn (lua_State *L, int index); LUA_API void lua_concat (lua_State *L, int n); LUA_API void *lua_newuserdata (lua_State *L, size_t size); /* ** =============================================================== ** some useful macros ** =============================================================== */ #define lua_pop(L,n) lua_settop(L, -(n)-1) #define lua_register(L,n,f) (lua_pushcfunction(L, f), lua_setglobal(L, n)) #define lua_pushuserdata(L,u) lua_pushusertag(L, u, 0) #define lua_pushcfunction(L,f) lua_pushcclosure(L, f, 0) #define lua_clonetag(L,t) lua_copytagmethods(L, lua_newtag(L), (t)) #define lua_isfunction(L,n) (lua_type(L,n) == LUA_TFUNCTION) #define lua_istable(L,n) (lua_type(L,n) == LUA_TTABLE) #define lua_isuserdata(L,n) (lua_type(L,n) == LUA_TUSERDATA) #define lua_isnil(L,n) (lua_type(L,n) == LUA_TNIL) #define lua_isnull(L,n) (lua_type(L,n) == LUA_TNONE) #define lua_getregistry(L) lua_getref(L, LUA_REFREGISTRY) #endif /****************************************************************************** * Copyright (C) 1994-2000 TeCGraf, PUC-Rio. All rights reserved. * * Permission is hereby granted, without written agreement and without license * or royalty fees, to use, copy, modify, and distribute this software and its * documentation for any purpose, including commercial applications, subject to * the following conditions: * * - The above copyright notice and this permission notice shall appear in all * copies or substantial portions of this software. * * - The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software in a * product, an acknowledgment in the product documentation would be greatly * appreciated (but it is not required). * * - Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * * The authors specifically disclaim any warranties, including, but not limited * to, the implied warranties of merchantability and fitness for a particular * purpose. The software provided hereunder is on an "as is" basis, and the * authors have no obligation to provide maintenance, support, updates, * enhancements, or modifications. In no event shall TeCGraf, PUC-Rio, or the * authors be held liable to any party for direct, indirect, special, * incidental, or consequential damages arising out of the use of this software * and its documentation. * * The Lua language and this implementation have been entirely designed and * written by Waldemar Celes Filho, Roberto Ierusalimschy and * Luiz Henrique de Figueiredo at TeCGraf, PUC-Rio. * * This implementation contains no third-party code. ******************************************************************************/ gltron-0.70/lua/include/luadebug.h0000644000076400001440000000245207432712643012606 /* ** $Id: luadebug.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Debugging API ** See Copyright Notice in lua.h */ #ifndef luadebug_h #define luadebug_h #include "lua.h" typedef struct lua_Debug lua_Debug; /* activation record */ typedef struct lua_Localvar lua_Localvar; typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar); LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func); LUA_API lua_Hook lua_setlinehook (lua_State *L, lua_Hook func); #define LUA_IDSIZE 60 struct lua_Debug { const char *event; /* `call', `return' */ int currentline; /* (l) */ const char *name; /* (n) */ const char *namewhat; /* (n) `global', `tag method', `local', `field' */ int nups; /* (u) number of upvalues */ int linedefined; /* (S) */ const char *what; /* (S) `Lua' function, `C' function, Lua `main' */ const char *source; /* (S) */ char short_src[LUA_IDSIZE]; /* (S) */ /* private part */ struct lua_TObject *_func; /* active function */ }; #endif gltron-0.70/lua/include/lualib.h0000644000076400001440000000124207432712643012262 /* ** $Id: lualib.h,v 1.1 2002/02/14 10:46:59 jcatki Exp $ ** Lua standard libraries ** See Copyright Notice in lua.h */ #ifndef lualib_h #define lualib_h #include "lua.h" #ifndef LUALIB_API #define LUALIB_API extern #endif #define LUA_ALERT "_ALERT" LUALIB_API void lua_baselibopen (lua_State *L); LUALIB_API void lua_iolibopen (lua_State *L); LUALIB_API void lua_strlibopen (lua_State *L); LUALIB_API void lua_mathlibopen (lua_State *L); LUALIB_API void lua_dblibopen (lua_State *L); /* Auxiliary functions (private) */ const char *luaI_classend (lua_State *L, const char *p); int luaI_singlematch (int c, const char *p, const char *ep); #endif gltron-0.70/lua/include/Makefile.am0000644000076400001440000000006307432751446012701 noinst_HEADERS=lauxlib.h lua.h luadebug.h lualib.h gltron-0.70/lua/include/Makefile.in0000644000076400001440000001357007767023244012720 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = lauxlib.h lua.h luadebug.h lualib.h subdir = lua/include mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign lua/include/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/0000777000076400001440000000000007767023546007463 5gltron-0.70/nebu/Makefile.am0000644000076400001440000000053307675155323011431 SUBDIRS = include base filesystem scripting audio video input noinst_LIBRARIES = libNebu.a libNebu_a_SOURCES = libNebu_a_LIBADD = \ base/libbase.a \ filesystem/libfilesystem.a \ scripting/libscripting.a \ audio/libaudio.a \ video/libvideo.a \ input/libinput.a ## $(top_srcdir)/lua/src/liblua.a \ ## $(top_srcdir)/lua/src/lib/liblualib.a gltron-0.70/nebu/Makefile.in0000644000076400001440000002455207767023244011447 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ SUBDIRS = include base filesystem scripting audio video input noinst_LIBRARIES = libNebu.a libNebu_a_SOURCES = libNebu_a_LIBADD = \ base/libbase.a \ filesystem/libfilesystem.a \ scripting/libscripting.a \ audio/libaudio.a \ video/libvideo.a \ input/libinput.a subdir = nebu mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libNebu_a_AR = $(AR) cru libNebu_a_DEPENDENCIES = base/libbase.a filesystem/libfilesystem.a \ scripting/libscripting.a audio/libaudio.a video/libvideo.a \ input/libinput.a am_libNebu_a_OBJECTS = libNebu_a_OBJECTS = $(am_libNebu_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(libNebu_a_SOURCES) RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ uninstall-info-recursive all-recursive install-data-recursive \ install-exec-recursive installdirs-recursive install-recursive \ uninstall-recursive check-recursive installcheck-recursive DIST_COMMON = Makefile.am Makefile.in DIST_SUBDIRS = $(SUBDIRS) SOURCES = $(libNebu_a_SOURCES) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libNebu.a: $(libNebu_a_OBJECTS) $(libNebu_a_DEPENDENCIES) -rm -f libNebu.a $(libNebu_a_AR) libNebu.a $(libNebu_a_OBJECTS) $(libNebu_a_LIBADD) $(RANLIB) libNebu.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = .. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done for subdir in $(SUBDIRS); do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ clean-generic clean-noinstLIBRARIES clean-recursive distclean \ distclean-compile distclean-generic distclean-recursive \ distclean-tags distdir dvi dvi-am dvi-recursive info info-am \ info-recursive install install-am install-data install-data-am \ install-data-recursive install-exec install-exec-am \ install-exec-recursive install-info install-info-am \ install-info-recursive install-man install-recursive \ install-strip installcheck installcheck-am installdirs \ installdirs-am installdirs-recursive maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-recursive \ tags tags-recursive uninstall uninstall-am uninstall-info-am \ uninstall-info-recursive uninstall-recursive # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/include/0000777000076400001440000000000007767023545011105 5gltron-0.70/nebu/include/Nebu.h0000644000076400001440000000031107675011524012046 #ifndef _NEBU_H #define _NEBU_H #include "Nebu_base.h" #include "Nebu_filesystem.h" #include "Nebu_scripting.h" #include "Nebu_configuration.h" #include "Nebu_video.h" #include "Nebu_input.h" #endif gltron-0.70/nebu/include/Nebu_audio.h0000644000076400001440000000047607675011524013243 #ifndef _AUDIO_H #define _AUDIO_H #include "audio/nebu_Sound.h" #include "audio/nebu_SoundSystem.h" #include "audio/nebu_Source.h" #include "audio/nebu_Source3D.h" #include "audio/nebu_SourceCopy.h" #include "audio/nebu_SourceEngine.h" #include "audio/nebu_SourceMusic.h" #include "audio/nebu_SourceSample.h" #endif gltron-0.70/nebu/include/Nebu_base.h0000644000076400001440000000042707675011524013050 #ifndef _BASE_H #define _BASE_H #include "base/nebu_callbacks.h" #include "base/nebu_geom.h" #include "base/nebu_matrix.h" #include "base/nebu_random.h" #include "base/nebu_types.h" #include "base/nebu_util.h" #include "base/nebu_vector.h" #include "base/nebu_system.h" #endif gltron-0.70/nebu/include/Nebu_configuration.h0000644000076400001440000000010507675011524014776 #ifndef _NEBU_CONFIGURATION_H #define _NEBU_CONFIGURATION_H #endif gltron-0.70/nebu/include/Nebu_filesystem.h0000644000076400001440000000021407675011524014314 #ifndef _NEBU_FILESYSTEM_H #define _NEBU_FILESYSTEM_H #include "filesystem/nebu_file_io.h" #include "filesystem/nebu_filesystem.h" #endif gltron-0.70/nebu/include/Nebu_input.h0000644000076400001440000000020207675011524013264 #ifndef _NEBU_INPUT_H #define _NEBU_INPUT_H #include "input/nebu_input_system.h" #include "input/nebu_system_keynames.h" #endif gltron-0.70/nebu/include/Nebu_scripting.h0000644000076400001440000000014307675011524014133 #ifndef _NEBU_SCRIPTING_H #define _NEBU_SCRIPTING_H #include "scripting/nebu_scripting.h" #endif gltron-0.70/nebu/include/Nebu_video.h0000644000076400001440000000044107675011524013240 #ifndef _NEBU_VIDEO_H #define _NEBU_VIDEO_H #include "video/nebu_video_types.h" #include "video/nebu_console.h" #include "video/nebu_light.h" #include "video/nebu_png_texture.h" #include "video/nebu_quad.h" #include "video/nebu_renderer_gl.h" #include "video/nebu_video_system.h" #endif gltron-0.70/nebu/include/Makefile.am0000644000076400001440000000027207675155477013066 SUBDIRS = audio base filesystem input scripting video noinst_HEADERS = Nebu.h Nebu_audio.h Nebu_base.h Nebu_configuration.h Nebu_filesystem.h Nebu_input.h Nebu_scripting.h Nebu_video.h gltron-0.70/nebu/include/Makefile.in0000644000076400001440000002237407767023245013073 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ SUBDIRS = audio base filesystem input scripting video noinst_HEADERS = Nebu.h Nebu_audio.h Nebu_base.h Nebu_configuration.h Nebu_filesystem.h Nebu_input.h Nebu_scripting.h Nebu_video.h subdir = nebu/include mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ uninstall-info-recursive all-recursive install-data-recursive \ install-exec-recursive installdirs-recursive install-recursive \ uninstall-recursive check-recursive installcheck-recursive DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in DIST_SUBDIRS = $(SUBDIRS) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/include/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done for subdir in $(SUBDIRS); do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(HEADERS) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ clean-generic clean-recursive distclean distclean-generic \ distclean-recursive distclean-tags distdir dvi dvi-am \ dvi-recursive info info-am info-recursive install install-am \ install-data install-data-am install-data-recursive \ install-exec install-exec-am install-exec-recursive \ install-info install-info-am install-info-recursive install-man \ install-recursive install-strip installcheck installcheck-am \ installdirs installdirs-am installdirs-recursive \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-recursive tags tags-recursive uninstall \ uninstall-am uninstall-info-am uninstall-info-recursive \ uninstall-recursive # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/include/audio/0000777000076400001440000000000007767023545012206 5gltron-0.70/nebu/include/audio/nebu_Sound.h0000644000076400001440000000006207675011525014363 #ifndef NEBU_Sound_H #define NEBU_Sound_H #endif gltron-0.70/nebu/include/audio/nebu_SoundSystem.h0000644000076400001440000000233207675011525015572 #ifndef NEBU_Sound_System_H #define NEBU_Sound_System_H extern "C" { #include "base/nebu_types.h" } #include "audio/nebu_Source.h" #include "base/nebu_Vector3.h" #include "SDL_sound.h" namespace Sound { extern "C" { void c_callback(void *userdata, Uint8 *stream, int len); } class Listener { public: Listener() { }; Vector3 _location; Vector3 _velocity; Vector3 _direction; Vector3 _up; }; enum { eUninitialized, eInitialized }; class System { public: System(SDL_AudioSpec *spec); typedef void(*Audio_Callback)(void *userdata, Uint8* data, int len); Audio_Callback GetCallback() { return c_callback; }; void Callback(Uint8* data, int len); void Idle(); /* remove dead sound sources */ void AddSource(Source* source); Sound_AudioInfo* GetAudioInfo() { return &_info; }; Listener& GetListener() { return _listener; }; void SetMixMusic(int value) { _mix_music = value; }; void SetMixFX(int value) { _mix_fx = value; }; void SetStatus(int eStatus) { _status = eStatus; }; protected: SDL_AudioSpec *_spec; Sound_AudioInfo _info; Listener _listener; List _sources; int _mix_music; int _mix_fx; int _status; }; } #endif gltron-0.70/nebu/include/audio/nebu_Source.h0000644000076400001440000000211007675011525014527 #ifndef NEBU_Sound_Source_H #define NEBU_Sound_Source_H #include "nebu_Sound.h" #include "SDL.h" namespace Sound { enum { eSoundMusic = 1, eSoundFX = 2 }; class System; class Source { // an abstract class, the basic interface for all Sources public: Source(); virtual ~Source(); virtual void Start(); virtual void Stop(); virtual void Pause(); virtual void UnPause(); virtual void Idle(); virtual int Mix(Uint8 *data, int len); // abstract virtual Uint8 IsPlaying(); virtual void SetRemovable(void); virtual Uint8 IsRemovable(void); virtual void SetVolume(float volume); virtual float GetVolume(); virtual void SetLoop(Uint8 loop); virtual Uint8 GetLoop(); virtual void SetType(int type); virtual int GetType(void); void SetName(char *name); char* GetName(void); protected: virtual void Reset(); System* _system; Uint8 _isPlaying; Uint8 _loop; Uint8 _removable; float _volume; int _type; char* _name; SDL_mutex* _mutex; SDL_sem * _sem; }; } #endif gltron-0.70/nebu/include/audio/nebu_Source3D.h0000644000076400001440000000162507704041045014721 #ifndef NEBU_Sound_Source3D_H #define NEBU_Sound_Source3D_H #include "nebu_Sound.h" #include "nebu_SoundSystem.h" #include "nebu_SourceSample.h" #include "base/nebu_Vector3.h" #define USOUND 50 #define EPSILON 0.1f #define SOUND_VOL_THRESHOLD 0.1 #define VOLSCALE_BASE 1000 namespace Sound { class Source3D : public Source { public: Source3D(System *system, SourceSample *source) { _system = system; _source = source; _location = Vector3(0,0,0); _velocity = Vector3(0,0,0); _position = 0; }; Vector3 _location; Vector3 _velocity; SourceSample* _source; virtual int Mix(Uint8 *data, int len); virtual void GetModifiers(float &fPan, float &fVolume, float &fShift); // protected: int _position; protected: Source3D() { _location = Vector3(0,0,0); _velocity = Vector3(0,0,0); _position = 0; }; }; } #endif gltron-0.70/nebu/include/audio/nebu_SourceCopy.h0000644000076400001440000000074107704041045015363 #ifndef NEBU_Sound_SourceCopy_H #define NEBU_Sound_SourceCopy_H #include "audio/nebu_Sound.h" #include "audio/nebu_SoundSystem.h" #include "audio/nebu_SourceSample.h" #include "base/nebu_Vector3.h" namespace Sound { class SourceCopy : public Source { public: SourceCopy(SourceSample *source) { _source = source; _position = 0; }; SourceSample* _source; virtual int Mix(Uint8 *data, int len); // protected: int _position; }; } #endif gltron-0.70/nebu/include/audio/nebu_SourceEngine.h0000644000076400001440000000072507677616022015674 #ifndef NEBU_Sound_SourceEngine_H #define NEBU_Sound_SourceEngine_H #include "nebu_Source3D.h" namespace Sound { class SourceEngine : public Source3D { public: SourceEngine(System *system, SourceSample *source) { _system = system; _source = source; _speedShift = 1.0f; _pitchShift = 1.0f; }; virtual void GetModifiers(float &fPan, float &fVolume, float &fShift); float _speedShift; float _pitchShift; }; } #endif gltron-0.70/nebu/include/audio/nebu_SourceMusic.h0000644000076400001440000000143407704041045015531 #ifndef NEBU_Sound_SourceMusic_H #define NEBU_Sound_SourceMusic_H #include "nebu_Sound.h" #include "nebu_Source.h" #include "nebu_SoundSystem.h" namespace Sound { class SourceMusic : public Source { public: SourceMusic(System *system); virtual ~SourceMusic(); void Load(char *filename); virtual int Mix(Uint8 *data, int len); virtual void Idle(void); protected: virtual void Reset(void) { if(_sample != NULL) { CleanUp(); CreateSample(); // fprintf(stderr, "sample resetted\n"); }; }; void CleanUp(void); void CreateSample(void); private: Sound_Sample* _sample; int _sample_buffersize; Uint8* _buffer; int _buffersize; int _read; int _decoded; char *_filename; SDL_RWops *_rwops; }; } #endif gltron-0.70/nebu/include/audio/nebu_SourceSample.h0000644000076400001440000000102007704041045015661 #ifndef NEBU_Sound_SourceSample_H #define NEBU_Sound_SourceSample_H #include "nebu_Sound.h" #include "nebu_Source.h" #include "nebu_SoundSystem.h" namespace Sound { class SourceSample : public Source { public: SourceSample(System *system); virtual ~SourceSample(); void Load(char *filename); virtual int Mix(Uint8 *data, int len); Uint8* _buffer; int _buffersize; protected: virtual void Reset() { _position = 0; } private: int _position; int _decoded; }; } #endif gltron-0.70/nebu/include/audio/nebu_audio_system.h0000644000076400001440000000010007675011525015771 #ifndef NEBU_AUDIO_SYSTEM_H #define NEBU_AUDIO_SYSTEM_H #endif gltron-0.70/nebu/include/audio/Makefile.am0000644000076400001440000000026007675155477014164 noinst_HEADERS = nebu_Sound.h nebu_SoundSystem.h nebu_Source.h nebu_Source3D.h nebu_SourceCopy.h nebu_SourceEngine.h nebu_SourceMusic.h nebu_SourceSample.h nebu_audio_system.h gltron-0.70/nebu/include/audio/Makefile.in0000644000076400001440000001400707767023245014166 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = nebu_Sound.h nebu_SoundSystem.h nebu_Source.h nebu_Source3D.h nebu_SourceCopy.h nebu_SourceEngine.h nebu_SourceMusic.h nebu_SourceSample.h nebu_audio_system.h subdir = nebu/include/audio mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/include/audio/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/include/base/0000777000076400001440000000000007767023545012017 5gltron-0.70/nebu/include/base/nebu_Vector3.h0000644000076400001440000000306207704041045014425 #ifndef NEBU_Vector3_H #define NEBU_Vector3_H #ifdef DEBUG #include "iostream.h" #endif #include "math.h" class Vector3 { public: Vector3() { }; Vector3(float a, float b, float c) { x = a; y = b; z = c; }; Vector3(const float *v) { x = v[0]; y = v[1]; z = v[2]; }; float x, y, z; const Vector3 operator+ (const Vector3& v) const { return Vector3(x + v.x, y + v.y, z + v.z); }; const Vector3 operator- (const Vector3& v) const { return Vector3(x - v.x, y - v.y, z - v.z); }; float operator* (const Vector3& v) const { return x * v.x + y * v.y + z * v.z; }; const Vector3 operator* (float f) const { return Vector3(x * f, y * f, z * f); } void operator*= (float f) { x *= f; y *= f; z *= f; } void operator/= (float f) { x /= f; y /= f; z /= f; } float Length() const { return (float) sqrt(*this * *this); } float Length2() { return *this * *this; } Vector3& Normalize() { float length = Length(); if(length != 0) *this /= length; return *this; } Vector3 Cross(const Vector3& v) const { return Vector3(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.z); } #ifdef DEBUG friend ostream& operator<<(ostream& os, const Vector3& v); friend Vector3 operator*(float f, const Vector3& v); #endif }; inline Vector3 operator*(float f, const Vector3& v) { return v * f; } #ifdef DEBUG inline ostream& operator<<(ostream& os, const Vector3& v) { os << "(" << v.x << ", " << v.y << ", " << v.z << ")"; return os; } #endif #endif gltron-0.70/nebu/include/base/nebu_callbacks.h0000644000076400001440000000052107677106640015030 #ifndef NEBU_CALLBACKS_H #define NEBU_CALLBACKS_H typedef struct Callbacks { void (*display)(void); void (*idle)(void); void (*keyboard)(int, int, int, int); void (*init)(void); void (*exit)(void); void (*initGL)(void); void (*mouse)(int, int, int, int); void (*mouseMotion)(int, int); char *name; } Callbacks; #endif gltron-0.70/nebu/include/base/nebu_geom.h0000644000076400001440000000207607675011525014042 #ifndef NEBU_GEOM_H #define NEBU_GEOM_H /* some geometric routines always needed */ /* typedef struct { float v[4]; } vec4; typedef struct { float v[3]; } vec3; */ typedef struct { int vertex[3]; int normal[3]; int material; } face; typedef struct { int vertex[4]; int normal[4]; int material; } quadFace; float length2(float *v); float length3(float *v); float length4(float *v); float length(float *v); void normalize(float *v); void normalize4(float *v); void crossprod(float *v1, float *v2, float *out); void normcrossprod(float *v1, float *v2, float *out); float scalarprod(float *v1, float *v2); float scalarprod2(float *v1, float *v2); float scalarprod4(float *v1, float *v2); void vsub(float *v1, float *v2, float *out); void vsub2(float *v1, float *v2, float *out); void vsub4(float *v1, float *v2, float *out); void vadd(float *v1, float *v2, float *out); void vadd2(float *v1, float *v2, float *out); void vadd4(float *v1, float *v2, float *out); void vcopy(float *v1, float *out); void vcopy4(float *v1, float *out); void vmul(float *v, float f); #endif gltron-0.70/nebu/include/base/nebu_matrix.h0000644000076400001440000000162307705324231014407 #ifndef NEBU_MATRIX_H #define NEBU_MATRIX_H #include "nebu_vector.h" typedef struct { float m[16]; // column order } matrix; vec4* vec4Transform(vec4* pOut, const vec4* pV, const matrix *pM); float matrixCofactor(const matrix *pM, int cf_row, int cf_col); float matrixDeterminant(const matrix *pM); matrix* matrixIdentity(matrix *pOut); matrix* matrixInverse(matrix *pOut, float* pDet, const matrix *pM); matrix* matrixMultiply(matrix *pOut, const matrix *pM1, const matrix *pM2); matrix* matrixTranspose(matrix *pOut, const matrix *pM); matrix* matrixAdjoint(matrix *pOut, float* pDet, const matrix *pM); vec4* vec4Transform(vec4 *pOut, const vec4 *pV, const matrix *pM); matrix* matrixRotationAxis(matrix *pOut, float fAngle, const vec3 *vAxis); matrix* matrixTranslation(matrix *pOut, const vec3 *vTranslation); matrix* matrixScale(matrix *pOut, const vec3 *vScale); void matrixPrint(matrix *m); #endif gltron-0.70/nebu/include/base/nebu_random.h0000644000076400001440000000017007675011525014364 #ifndef NEBU_RANDOM_H #define NEBU_RANDOM_H void tsrand(unsigned int s); int trand(void); double tfrand(void); #endif gltron-0.70/nebu/include/base/nebu_system.h0000644000076400001440000000067707675011525014444 #ifndef NEBU_SYSTEM_H #define NEBU_SYSTEM_H #include "nebu_callbacks.h" #include "SDL.h" /* system specific functions (basically, an SDL/glut wrapper) */ extern unsigned int SystemGetElapsedTime(); extern int SystemMainLoop(); extern void SystemExitLoop(int return_code); extern void SystemRegisterCallbacks(Callbacks* callbacks); extern void SystemExit(); extern void SystemHandleInput(SDL_Event *event); extern Callbacks* current; #endif gltron-0.70/nebu/include/base/nebu_types.h0000644000076400001440000000053007731371321014244 #ifndef NEBU_BASIC_TYPES_H #define NEBU_BASIC_TYPES_H typedef struct List List; struct List { void *data; List* next; }; typedef struct { unsigned int current; unsigned int lastFrame; unsigned int offset; /* from SystemGetElapsedTime() */ unsigned int dt; /* current - lastFrame */ /* float timeScale; */ } SystemTime; #endif gltron-0.70/nebu/include/base/nebu_util.h0000644000076400001440000000060507675011525014064 #ifndef NEBU_UTIL_H #define NEBU_UTIL_H /* small utility macros & functions */ #include "base/nebu_types.h" #include #define COS(X) cos( (X) * M_PI/180.0 ) #define SIN(X) sin( (X) * M_PI/180.0 ) #ifndef M_PI #define M_PI 3.141592654 #endif void randomPermutation( int N, int *nodes ); void clamp( float *f, float min, float max ); void addList(List **l, void* data); #endif gltron-0.70/nebu/include/base/nebu_vector.h0000644000076400001440000000341507753205557014422 #ifndef NEBU_VECTOR_H #define NEBU_VECTOR_H typedef struct { float v[2]; } vec2; typedef struct { float v[3]; } vec3; typedef struct { float v[4]; } vec4; typedef struct { vec2 vStart, vDirection; } segment2; vec4* vec4Add(vec4 *pOut, const vec4 *pV1, const vec4 *pV2); vec4* vec4Sub(vec4 *pOut, const vec4 *pV1, const vec4 *pV2); vec3* vec3Add(vec3 *pOut, const vec3 *pV1, const vec3 *pV2); vec3* vec3Sub(vec3 *pOut, const vec3 *pV1, const vec3 *pV2); vec3* vec3Cross(vec3 *pOut, const vec3 *pV1, const vec3 *pV2); float vec4Dot(const vec4 *pV1, const vec4 *pV2); float vec3Dot(const vec3 *pV1, const vec3 *pV2); float vec3Length(const vec3 *pV); float vec3LengthSqr(const vec3 *pV); vec3* vec3Normalize(vec3 *pOut, const vec3 *pV); vec3* vec3fromVec4(vec3 *pOut, const vec4 *pV); vec4* vec4fromVec3(vec4 *pOut, const vec3 *pV); vec3* vec3Copy(vec3 *pOut, const vec3 *pV); vec3* vec3Scale(vec3 *pOut, const vec3 *pV, float f); void vec4Print(const vec4 *pV); void vec3Print(const vec3 *pV); vec3* vec3Zero(vec3 *pV); vec3* vec3TriNormalDirection(vec3* pOut, const vec3* pV1, const vec3* pV2, const vec3 *pV3); vec2* vec2Copy(vec2 *pOut, const vec2 *pV); unsigned int uintFromVec3(vec3 *pV); // vec4* vec4Transform(vec4* pOut, const vec4* pV, const matrix16 *pM); vec2* segment2_Intersect(vec2 *pOut, float *t1, float *t2, const segment2 *s1, const segment2 *s2); vec2* vec2_Orthogonal(vec2 *pOut, const vec2 *pV); vec2* vec2Add(vec2 *pOut, const vec2 *pV1, const vec2 *pV2); vec2* vec2Sub(vec2 *pOut, const vec2 *pV1, const vec2 *pV2); vec2* vec2Scale(vec2 *pOut, const vec2 *pV, float fScale); vec2* vec2Normalize(vec2 *pOut, const vec2 *pV); float vec2Dot(const vec2 *pV1, const vec2 *pV2); float vec2Length(const vec2 *pV); float segment2_Length(const segment2 *s); #endif gltron-0.70/nebu/include/base/Makefile.am0000644000076400001440000000021607675155477013776 noinst_HEADERS = nebu_Vector3.h nebu_callbacks.h nebu_geom.h nebu_matrix.h nebu_random.h nebu_system.h nebu_types.h nebu_util.h nebu_vector.h gltron-0.70/nebu/include/base/Makefile.in0000644000076400001440000001374307767023245014005 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = nebu_Vector3.h nebu_callbacks.h nebu_geom.h nebu_matrix.h nebu_random.h nebu_system.h nebu_types.h nebu_util.h nebu_vector.h subdir = nebu/include/base mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/include/base/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/include/filesystem/0000777000076400001440000000000007767023545013271 5gltron-0.70/nebu/include/filesystem/nebu_file_io.h0000644000076400001440000000076507675011525015776 #ifndef NEBU_FILE_IO_H #define NEBU_FILE_IO_H /* this is a small wrapper around the basic file io functions, ie open, close, read, gets */ #ifdef FILE_IO_ZLIB #include typedef gzFile file_handle; #else #include typedef FILE* file_handle; #endif file_handle file_open(const char *path, const char *mode); int file_close(file_handle file); int file_read(file_handle file, void* data, unsigned int size); char* file_gets(file_handle file, char* data, unsigned int size); #endif gltron-0.70/nebu/include/filesystem/nebu_filesystem.h0000644000076400001440000000101207675011525016536 #ifndef NEBU_FILE_SYSTEM_H #define NEBU_FILESYSTEM_H #include "base/nebu_types.h" #include "filesystem/nebu_file_io.h" #include #include extern void initFilesystem(int argc, const char *argv[]); extern List* readDirectoryContents(const char *dirname, const char *prefix); /* findpath.c, GPL'd code */ extern void goto_installpath(const char *executable); extern void dirSetup(const char *executable); extern int fileExists(const char *path); extern void makeDirectory(const char* name); #endif gltron-0.70/nebu/include/filesystem/Makefile.am0000644000076400001440000000006207675155477015247 noinst_HEADERS = nebu_file_io.h nebu_filesystem.h gltron-0.70/nebu/include/filesystem/Makefile.in0000644000076400001440000001362307767023245015254 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = nebu_file_io.h nebu_filesystem.h subdir = nebu/include/filesystem mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/include/filesystem/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/include/input/0000777000076400001440000000000007767023545012244 5gltron-0.70/nebu/include/input/nebu_input_system.h0000644000076400001440000000344207706272657016113 #ifndef NEBU_INPUT_SYSTEM_H #define NEBU_INPUT_SYSTEM_H #include #include #define SYSTEM_KEY_DOWN SDLK_DOWN #define SYSTEM_KEY_UP SDLK_UP #define SYSTEM_KEY_LEFT SDLK_LEFT #define SYSTEM_KEY_RIGHT SDLK_RIGHT #define SYSTEM_KEY_F1 SDLK_F1 #define SYSTEM_KEY_F2 SDLK_F2 #define SYSTEM_KEY_F3 SDLK_F3 #define SYSTEM_KEY_F4 SDLK_F4 #define SYSTEM_KEY_F5 SDLK_F5 #define SYSTEM_KEY_F6 SDLK_F6 #define SYSTEM_KEY_F7 SDLK_F7 #define SYSTEM_KEY_F10 SDLK_F10 #define SYSTEM_KEY_F11 SDLK_F11 #define SYSTEM_KEY_F12 SDLK_F12 #define SYSTEM_KEY_ENTER SDLK_ENTER #define SYSTEM_KEY_RETURN SDLK_RETURN #define SYSTEM_MOUSEUP SDL_MOUSEBUTTONUP #define SYSTEM_MOUSEDOWN SDL_MOUSEBUTTONDOWN #define SYSTEM_MOUSEPRESSED SDL_PRESSED #define SYSTEM_MOUSERELEASED SDL_RELEASED #define SYSTEM_MOUSEBUTTON_LEFT SDL_BUTTON_LEFT #define SYSTEM_MOUSEBUTTON_RIGHT SDL_BUTTON_RIGHT #define SYSTEM_KEY_TAB SDLK_TAB #define SYSTEM_JOY_AXIS_MAX 32767 #define SYSTEM_KEYSTATE_DOWN 0 #define SYSTEM_KEYSTATE_UP 1 enum { SYSTEM_JOY_OFFSET = 32, SYSTEM_CUSTOM_KEYS = 512, SYSTEM_JOY_LEFT = 512, SYSTEM_JOY_RIGHT, SYSTEM_JOY_UP, SYSTEM_JOY_DOWN, SYSTEM_JOY_BUTTON_0, SYSTEM_JOY_BUTTON_1, SYSTEM_JOY_BUTTON_2, SYSTEM_JOY_BUTTON_3, SYSTEM_JOY_BUTTON_4, SYSTEM_JOY_BUTTON_5, SYSTEM_JOY_BUTTON_6, SYSTEM_JOY_BUTTON_7, SYSTEM_JOY_BUTTON_8, SYSTEM_JOY_BUTTON_9, SYSTEM_JOY_BUTTON_10, SYSTEM_JOY_BUTTON_11, SYSTEM_JOY_BUTTON_12, SYSTEM_JOY_BUTTON_13, SYSTEM_JOY_BUTTON_14, SYSTEM_JOY_BUTTON_15, SYSTEM_JOY_BUTTON_16, SYSTEM_JOY_BUTTON_17, SYSTEM_JOY_BUTTON_18, SYSTEM_JOY_BUTTON_19 }; void SystemGrabInput(); void SystemUngrabInput(); char* SystemGetKeyName(int key); void SystemMouse(int buttons, int state, int x, int y); void SystemMouseMotion(int x, int y); void SystemSetJoyThreshold(float f); #endif gltron-0.70/nebu/include/input/nebu_system_keynames.h0000644000076400001440000000040507675011525016552 #ifndef NEBU_SYSTEM_KEYNAMES_H #define NEBU_SYSTEM_KEYNAMES_H #define CUSTOM_KEY_COUNT 2 * 24 typedef struct { int key; char *name; } keyname; typedef struct { keyname key[CUSTOM_KEY_COUNT]; } custom_keynames; extern custom_keynames custom_keys; #endif gltron-0.70/nebu/include/input/Makefile.am0000644000076400001440000000007407675155477014225 noinst_HEADERS = nebu_input_system.h nebu_system_keynames.h gltron-0.70/nebu/include/input/Makefile.in0000644000076400001440000001362307767023245014227 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = nebu_input_system.h nebu_system_keynames.h subdir = nebu/include/input mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/include/input/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/include/scripting/0000777000076400001440000000000007767023545013107 5gltron-0.70/nebu/include/scripting/nebu_scripting.h0000644000076400001440000000160307766301731016202 #ifndef NEBU_SCRIPTING_H #define NEBU_SCRIPTING_H #include "lua.h" extern void scripting_Init(); extern void scripting_Quit(); extern void Scripting_Idle(); extern int scripting_GetGlobal(const char *global, const char *s, ...); extern int scripting_SetFloat(float f, const char *name, const char *global, const char *s, ...); extern int scripting_IsNilResult(); extern int scripting_GetIntegerResult(int *i); extern int scripting_GetFloatResult(float *f); extern void scripting_GetFloatArrayResult(float *f, int n); extern int scripting_GetStringResult(char **s); extern int scripting_CopyStringResult(char *s, int len); extern void scripting_RunFile(const char *name); extern void scripting_Run(const char *command); extern void scripting_RunFormat(const char *format, ...); extern void scripting_RunGC(); extern void scripting_Register(const char *name, int(*func) (lua_State *L)); #endif gltron-0.70/nebu/include/scripting/Makefile.am0000644000076400001440000000004207675155477015063 noinst_HEADERS = nebu_scripting.h gltron-0.70/nebu/include/scripting/Makefile.in0000644000076400001440000001360107767023245015066 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = nebu_scripting.h subdir = nebu/include/scripting mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/include/scripting/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/include/video/0000777000076400001440000000000007767023545012213 5gltron-0.70/nebu/include/video/nebu_console.h0000644000076400001440000000064607675011525014752 #ifndef NEBU_CONSOLE_H #define NEBU_CONSOLE_H typedef enum { TO_CONSOLE = 0x01, TO_STDOUT = 0x02, TO_STDERR = 0x04 } outloc_e; void consoleInit(); void consoleAddLine(char *text); void consoleDisplay(void(*func)(char *line, int call), int height); void consoleScrollForward(int range); void consoleScrollBackward(int range); void displayMessage(outloc_e where, const char *fmt_str, ...); #endif /* CONSOLE_H */ gltron-0.70/nebu/include/video/nebu_extgl.h0000644000076400001440000065221307675011525014436 /* Small parts were taken from glext.h, here's the lisence: */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: This software was created using the ** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has ** not been independently verified as being compliant with the OpenGL(R) ** version 1.2.1 Specification. */ /* Most parts copyright (c) 2001-2002 Lev Povalahev under this lisence: */ /* ---------------------------------------------------------------------------- Copyright (c) 2002, Lev Povalahev All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The name of the author may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------*/ /* GL_draw_range_elements support added by Benjamin Karaban Lev Povalahev contact information: levp@gmx.net http://www.uni-karlsruhe.de/~uli2/ */ /* These extensions are supported: GL_ARB_imaging GL_ARB_depth_texture GL_ARB_matrix_palette GL_ARB_multisample GL_ARB_multitexture GL_ARB_point_parameters GL_ARB_shadow GL_ARB_shadow_ambient GL_ARB_texture_compression GL_ARB_texture_env_add GL_ARB_texture_env_dot3 GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar GL_ARB_texture_border_clamp GL_ARB_texture_cube_map GL_ARB_texture_mirrored_repeat GL_ARB_transpose_matrix GL_ARB_vertex_blend GL_ARB_vertex_program GL_ARB_window_pos GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_function_separate GL_EXT_compiled_vertex_array GL_EXT_cull_vertex GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_multi_draw_arrays GL_EXT_point_parameters GL_EXT_secondary_color GL_EXT_separate_specular_color GL_EXT_shadow_funcs GL_EXT_stencil_two_side GL_EXT_stencil_wrap GL_EXT_texture_compression_s3tc GL_EXT_texture_filter_anisotropic GL_EXT_texture_lod_bias GL_EXT_vertex_shader GL_EXT_vertex_weighting GL_ATI_element_array GL_ATI_envmap_bumpmap GL_ATI_fragment_shader GL_ATI_pn_triangles GL_ATI_texture_mirror_once GL_ATI_vertex_array_object; GL_ATI_vertex_streams GL_ATIX_point_sprites GL_ATIX_texture_env_route GL_HP_occlusion_test GL_NV_blend_square GL_NV_copy_depth_to_color GL_NV_depth_clamp GL_NV_element_array GL_NV_evaluators GL_NV_fence GL_NV_float_buffer GL_NV_fog_distance GL_NV_light_max_exponent GL_NV_occlusion_query GL_NV_packed_depth_stencil GL_NV_point_sprite GL_NV_primitive_restart GL_NV_register_combiners GL_NV_register_combiners2 GL_NV_texgen_reflection GL_NV_texture_env_combine4 GL_NV_texture_rectangle GL_NV_texture_shader GL_NV_texture_shader2 GL_NV_texture_shader3 GL_NV_vertex_array_range GL_NV_vertex_array_range2 GL_NV_vertex_program GL_NV_vertex_program1_1 GL_NV_vertex_program2 GL_SGIS_generate_mipmap GL_SGIX_shadow GL_SGIX_depth_texture WGL_ARB_buffer_region WGL_ARB_extensions_string WGL_ARB_make_current_read; WGL_ARB_multisample WGL_ARB_pbuffer WGL_ARB_pixel_format WGL_ARB_render_texture WGL_EXT_extensions_string WGL_EXT_swap_control WGL_NV_render_depth_texture WGL_NV_render_texture_rectangle */ #ifndef __EXTGL_H__ #define __EXTGL_H__ /*-----------------------------------------*/ /*-----------------------------------------*/ #if defined(_WIN32) && !defined(APIENTRY) #define WIN32_LEAN_AND_MEAN 1 #include #endif #define __glext_h_ #include #if defined(_WIN32) #elif defined(__APPLE__) # include #else # include #endif /* _WIN32 */ #include #ifndef APIENTRY #define APIENTRY #endif #ifdef __cplusplus extern "C" { #endif /* OpenGL 1.2 */ #ifndef GL_VERSION_1_2 #define GL_ARB_imaging 1 #define GL_VERSION_1_2 1 #define GL_RESCALE_NORMAL 0x803A #define GL_CLAMP_TO_EDGE 0x812F #define GL_MAX_ELEMENTS_VERTICES 0x80E8 #define GL_MAX_ELEMENTS_INDICES 0x80E9 #define GL_BGR 0x80E0 #define GL_BGRA 0x80E1 #define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 #define GL_UNSIGNED_SHORT_5_6_5 0x8363 #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #define GL_UNSIGNED_INT_10_10_10_2 0x8036 #define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 #define GL_SINGLE_COLOR 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA #define GL_TEXTURE_MIN_LOD 0x813A #define GL_TEXTURE_MAX_LOD 0x813B #define GL_TEXTURE_BASE_LEVEL 0x813C #define GL_TEXTURE_MAX_LEVEL 0x813D #define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_ALIASED_POINT_SIZE_RANGE 0x846D #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E #define GL_PACK_SKIP_IMAGES 0x806B #define GL_PACK_IMAGE_HEIGHT 0x806C #define GL_UNPACK_SKIP_IMAGES 0x806D #define GL_UNPACK_IMAGE_HEIGHT 0x806E #define GL_TEXTURE_3D 0x806F #define GL_PROXY_TEXTURE_3D 0x8070 #define GL_TEXTURE_DEPTH 0x8071 #define GL_TEXTURE_WRAP_R 0x8072 #define GL_MAX_3D_TEXTURE_SIZE 0x8073 #define GL_TEXTURE_BINDING_3D 0x806A #define GL_COLOR_TABLE 0x80D0 #define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 #define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 #define GL_PROXY_COLOR_TABLE 0x80D3 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 #define GL_COLOR_TABLE_SCALE 0x80D6 #define GL_COLOR_TABLE_BIAS 0x80D7 #define GL_COLOR_TABLE_FORMAT 0x80D8 #define GL_COLOR_TABLE_WIDTH 0x80D9 #define GL_COLOR_TABLE_RED_SIZE 0x80DA #define GL_COLOR_TABLE_GREEN_SIZE 0x80DB #define GL_COLOR_TABLE_BLUE_SIZE 0x80DC #define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD #define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE #define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF #define GL_CONVOLUTION_1D 0x8010 #define GL_CONVOLUTION_2D 0x8011 #define GL_SEPARABLE_2D 0x8012 #define GL_CONVOLUTION_BORDER_MODE 0x8013 #define GL_CONVOLUTION_FILTER_SCALE 0x8014 #define GL_CONVOLUTION_FILTER_BIAS 0x8015 #define GL_REDUCE 0x8016 #define GL_CONVOLUTION_FORMAT 0x8017 #define GL_CONVOLUTION_WIDTH 0x8018 #define GL_CONVOLUTION_HEIGHT 0x8019 #define GL_MAX_CONVOLUTION_WIDTH 0x801A #define GL_MAX_CONVOLUTION_HEIGHT 0x801B #define GL_POST_CONVOLUTION_RED_SCALE 0x801C #define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D #define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E #define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F #define GL_POST_CONVOLUTION_RED_BIAS 0x8020 #define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 #define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 #define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 #define GL_CONSTANT_BORDER 0x8151 #define GL_REPLICATE_BORDER 0x8153 #define GL_CONVOLUTION_BORDER_COLOR 0x8154 #define GL_COLOR_MATRIX 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 #define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 #define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 #define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 #define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 #define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 #define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 #define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 #define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA #define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB #define GL_HISTOGRAM 0x8024 #define GL_PROXY_HISTOGRAM 0x8025 #define GL_HISTOGRAM_WIDTH 0x8026 #define GL_HISTOGRAM_FORMAT 0x8027 #define GL_HISTOGRAM_RED_SIZE 0x8028 #define GL_HISTOGRAM_GREEN_SIZE 0x8029 #define GL_HISTOGRAM_BLUE_SIZE 0x802A #define GL_HISTOGRAM_ALPHA_SIZE 0x802B #define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C #define GL_HISTOGRAM_SINK 0x802D #define GL_MINMAX 0x802E #define GL_MINMAX_FORMAT 0x802F #define GL_MINMAX_SINK 0x8030 #define GL_TABLE_TOO_LARGE 0x8031 #define GL_BLEND_EQUATION 0x8009 #define GL_MIN 0x8007 #define GL_MAX 0x8008 #define GL_FUNC_ADD 0x8006 #define GL_FUNC_SUBTRACT 0x800A #define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_BLEND_COLOR 0x8005 #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 typedef void (APIENTRY * glColorTablePROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table ); typedef void (APIENTRY * glColorSubTablePROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data ); typedef void (APIENTRY * glColorTableParameterivPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRY * glColorTableParameterfvPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRY * glCopyColorSubTablePROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width ); typedef void (APIENTRY * glCopyColorTablePROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ); typedef void (APIENTRY * glGetColorTablePROC) (GLenum target, GLenum format, GLenum type, GLvoid *table ); typedef void (APIENTRY * glGetColorTableParameterfvPROC) (GLenum target, GLenum pname, GLfloat *params ); typedef void (APIENTRY * glGetColorTableParameterivPROC) (GLenum target, GLenum pname, GLint *params ); typedef void (APIENTRY * glBlendEquationPROC) (GLenum mode ); typedef void (APIENTRY * glBlendColorPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); typedef void (APIENTRY * glHistogramPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink ); typedef void (APIENTRY * glResetHistogramPROC) (GLenum target ); typedef void (APIENTRY * glGetHistogramPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values ); typedef void (APIENTRY * glGetHistogramParameterfvPROC) (GLenum target, GLenum pname, GLfloat *params ); typedef void (APIENTRY * glGetHistogramParameterivPROC) (GLenum target, GLenum pname, GLint *params ); typedef void (APIENTRY * glMinmaxPROC) (GLenum target, GLenum internalformat, GLboolean sink ); typedef void (APIENTRY * glResetMinmaxPROC) (GLenum target ); typedef void (APIENTRY * glGetMinmaxPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values ); typedef void (APIENTRY * glGetMinmaxParameterfvPROC) (GLenum target, GLenum pname, GLfloat *params ); typedef void (APIENTRY * glGetMinmaxParameterivPROC) (GLenum target, GLenum pname, GLint *params ); typedef void (APIENTRY * glConvolutionFilter1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image ); typedef void (APIENTRY * glConvolutionFilter2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image ); typedef void (APIENTRY * glConvolutionParameterfPROC) (GLenum target, GLenum pname, GLfloat params ); typedef void (APIENTRY * glConvolutionParameterfvPROC) (GLenum target, GLenum pname, const GLfloat *params ); typedef void (APIENTRY * glConvolutionParameteriPROC) (GLenum target, GLenum pname, GLint params ); typedef void (APIENTRY * glConvolutionParameterivPROC) (GLenum target, GLenum pname, const GLint *params ); typedef void (APIENTRY * glCopyConvolutionFilter1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ); typedef void (APIENTRY * glCopyConvolutionFilter2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRY * glGetConvolutionFilterPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image ); typedef void (APIENTRY * glGetConvolutionParameterfvPROC) (GLenum target, GLenum pname, GLfloat *params ); typedef void (APIENTRY * glGetConvolutionParameterivPROC) (GLenum target, GLenum pname, GLint *params ); typedef void (APIENTRY * glSeparableFilter2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column ); typedef void (APIENTRY * glGetSeparableFilterPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); typedef void (APIENTRY * glDrawRangeElementsPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices ); typedef void (APIENTRY * glTexImage3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); typedef void (APIENTRY * glTexSubImage3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRY * glCopyTexSubImage3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ); extern glBlendColorPROC glBlendColor; extern glBlendEquationPROC glBlendEquation; extern glColorTablePROC glColorTable; extern glColorTableParameterfvPROC glColorTableParameterfv; extern glColorTableParameterivPROC glColorTableParameteriv; extern glCopyColorTablePROC glCopyColorTable; extern glGetColorTablePROC glGetColorTable; extern glGetColorTableParameterfvPROC glGetColorTableParameterfv; extern glGetColorTableParameterivPROC glGetColorTableParameteriv; extern glColorSubTablePROC glColorSubTable; extern glCopyColorSubTablePROC glCopyColorSubTable; extern glConvolutionFilter1DPROC glConvolutionFilter1D; extern glConvolutionFilter2DPROC glConvolutionFilter2D; extern glConvolutionParameterfPROC glConvolutionParameterf; extern glConvolutionParameterfvPROC glConvolutionParameterfv; extern glConvolutionParameteriPROC glConvolutionParameteri; extern glConvolutionParameterivPROC glConvolutionParameteriv; extern glCopyConvolutionFilter1DPROC glCopyConvolutionFilter1D; extern glCopyConvolutionFilter2DPROC glCopyConvolutionFilter2D; extern glGetConvolutionFilterPROC glGetConvolutionFilter; extern glGetConvolutionParameterfvPROC glGetConvolutionParameterfv; extern glGetConvolutionParameterivPROC glGetConvolutionParameteriv; extern glGetSeparableFilterPROC glGetSeparableFilter; extern glSeparableFilter2DPROC glSeparableFilter2D; extern glGetHistogramPROC glGetHistogram; extern glGetHistogramParameterfvPROC glGetHistogramParameterfv; extern glGetHistogramParameterivPROC glGetHistogramParameteriv; extern glGetMinmaxPROC glGetMinmax; extern glGetMinmaxParameterfvPROC glGetMinmaxParameterfv; extern glGetMinmaxParameterivPROC glGetMinmaxParameteriv; extern glHistogramPROC glHistogram; extern glMinmaxPROC glMinmax; extern glResetHistogramPROC glResetHistogram; extern glResetMinmaxPROC glResetMinmax; extern glDrawRangeElementsPROC glDrawRangeElements; extern glTexImage3DPROC glTexImage3D; extern glTexSubImage3DPROC glTexSubImage3D; extern glCopyTexSubImage3DPROC glCopyTexSubImage3D; #endif /* GL_VERSION_1_2 */ /* OpenGL 1.3 */ #ifndef GL_VERSION_1_3 #define GL_VERSION_1_3 1 #define GL_TEXTURE0 0x84C0 #define GL_TEXTURE1 0x84C1 #define GL_TEXTURE2 0x84C2 #define GL_TEXTURE3 0x84C3 #define GL_TEXTURE4 0x84C4 #define GL_TEXTURE5 0x84C5 #define GL_TEXTURE6 0x84C6 #define GL_TEXTURE7 0x84C7 #define GL_TEXTURE8 0x84C8 #define GL_TEXTURE9 0x84C9 #define GL_TEXTURE10 0x84CA #define GL_TEXTURE11 0x84CB #define GL_TEXTURE12 0x84CC #define GL_TEXTURE13 0x84CD #define GL_TEXTURE14 0x84CE #define GL_TEXTURE15 0x84CF #define GL_TEXTURE16 0x84D0 #define GL_TEXTURE17 0x84D1 #define GL_TEXTURE18 0x84D2 #define GL_TEXTURE19 0x84D3 #define GL_TEXTURE20 0x84D4 #define GL_TEXTURE21 0x84D5 #define GL_TEXTURE22 0x84D6 #define GL_TEXTURE23 0x84D7 #define GL_TEXTURE24 0x84D8 #define GL_TEXTURE25 0x84D9 #define GL_TEXTURE26 0x84DA #define GL_TEXTURE27 0x84DB #define GL_TEXTURE28 0x84DC #define GL_TEXTURE29 0x84DD #define GL_TEXTURE30 0x84DE #define GL_TEXTURE31 0x84DF #define GL_ACTIVE_TEXTURE 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 #define GL_MAX_TEXTURE_UNITS 0x84E2 #define GL_NORMAL_MAP 0x8511 #define GL_REFLECTION_MAP 0x8512 #define GL_TEXTURE_CUBE_MAP 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C #define GL_COMPRESSED_ALPHA 0x84E9 #define GL_COMPRESSED_LUMINANCE 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB #define GL_COMPRESSED_INTENSITY 0x84EC #define GL_COMPRESSED_RGB 0x84ED #define GL_COMPRESSED_RGBA 0x84EE #define GL_TEXTURE_COMPRESSION_HINT 0x84EF #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 #define GL_TEXTURE_COMPRESSED 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 #define GL_MULTISAMPLE 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E #define GL_SAMPLE_ALPHA_TO_ONE 0x809F #define GL_SAMPLE_COVERAGE 0x80A0 #define GL_SAMPLE_BUFFERS 0x80A8 #define GL_SAMPLES 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE 0x80AA #define GL_SAMPLE_COVERAGE_INVERT 0x80AB #define GL_MULTISAMPLE_BIT 0x20000000 #define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 #define GL_COMBINE 0x8570 #define GL_COMBINE_RGB 0x8571 #define GL_COMBINE_ALPHA 0x8572 #define GL_SOURCE0_RGB 0x8580 #define GL_SOURCE1_RGB 0x8581 #define GL_SOURCE2_RGB 0x8582 #define GL_SOURCE0_ALPHA 0x8588 #define GL_SOURCE1_ALPHA 0x8589 #define GL_SOURCE2_ALPHA 0x858A #define GL_OPERAND0_RGB 0x8590 #define GL_OPERAND1_RGB 0x8591 #define GL_OPERAND2_RGB 0x8592 #define GL_OPERAND0_ALPHA 0x8598 #define GL_OPERAND1_ALPHA 0x8599 #define GL_OPERAND2_ALPHA 0x859A #define GL_RGB_SCALE 0x8573 #define GL_ADD_SIGNED 0x8574 #define GL_INTERPOLATE 0x8575 #define GL_SUBTRACT 0x84E7 #define GL_CONSTANT 0x8576 #define GL_PRIMARY_COLOR 0x8577 #define GL_PREVIOUS 0x8578 #define GL_DOT3_RGB 0x86AE #define GL_DOT3_RGBA 0x86AF #define GL_CLAMP_TO_BORDER 0x812D typedef void (APIENTRY * glActiveTexturePROC) (GLenum texture ); typedef void (APIENTRY * glClientActiveTexturePROC) (GLenum texture ); typedef void (APIENTRY * glCompressedTexImage1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glCompressedTexImage2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glCompressedTexImage3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glCompressedTexSubImage1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glCompressedTexSubImage2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glCompressedTexSubImage3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glGetCompressedTexImagePROC) (GLenum target, GLint lod, GLvoid *img ); typedef void (APIENTRY * glMultiTexCoord1dPROC) (GLenum target, GLdouble s ); typedef void (APIENTRY * glMultiTexCoord1dvPROC) (GLenum target, const GLdouble *v ); typedef void (APIENTRY * glMultiTexCoord1fPROC) (GLenum target, GLfloat s ); typedef void (APIENTRY * glMultiTexCoord1fvPROC) (GLenum target, const GLfloat *v ); typedef void (APIENTRY * glMultiTexCoord1iPROC) (GLenum target, GLint s ); typedef void (APIENTRY * glMultiTexCoord1ivPROC) (GLenum target, const GLint *v ); typedef void (APIENTRY * glMultiTexCoord1sPROC) (GLenum target, GLshort s ); typedef void (APIENTRY * glMultiTexCoord1svPROC) (GLenum target, const GLshort *v ); typedef void (APIENTRY * glMultiTexCoord2dPROC) (GLenum target, GLdouble s, GLdouble t ); typedef void (APIENTRY * glMultiTexCoord2dvPROC) (GLenum target, const GLdouble *v ); typedef void (APIENTRY * glMultiTexCoord2fPROC) (GLenum target, GLfloat s, GLfloat t ); typedef void (APIENTRY * glMultiTexCoord2fvPROC) (GLenum target, const GLfloat *v ); typedef void (APIENTRY * glMultiTexCoord2iPROC) (GLenum target, GLint s, GLint t ); typedef void (APIENTRY * glMultiTexCoord2ivPROC) (GLenum target, const GLint *v ); typedef void (APIENTRY * glMultiTexCoord2sPROC) (GLenum target, GLshort s, GLshort t ); typedef void (APIENTRY * glMultiTexCoord2svPROC) (GLenum target, const GLshort *v ); typedef void (APIENTRY * glMultiTexCoord3dPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r ); typedef void (APIENTRY * glMultiTexCoord3dvPROC) (GLenum target, const GLdouble *v ); typedef void (APIENTRY * glMultiTexCoord3fPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r ); typedef void (APIENTRY * glMultiTexCoord3fvPROC) (GLenum target, const GLfloat *v ); typedef void (APIENTRY * glMultiTexCoord3iPROC) (GLenum target, GLint s, GLint t, GLint r ); typedef void (APIENTRY * glMultiTexCoord3ivPROC) (GLenum target, const GLint *v ); typedef void (APIENTRY * glMultiTexCoord3sPROC) (GLenum target, GLshort s, GLshort t, GLshort r ); typedef void (APIENTRY * glMultiTexCoord3svPROC) (GLenum target, const GLshort *v ); typedef void (APIENTRY * glMultiTexCoord4dPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q ); typedef void (APIENTRY * glMultiTexCoord4dvPROC) (GLenum target, const GLdouble *v ); typedef void (APIENTRY * glMultiTexCoord4fPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ); typedef void (APIENTRY * glMultiTexCoord4fvPROC) (GLenum target, const GLfloat *v ); typedef void (APIENTRY * glMultiTexCoord4iPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q ); typedef void (APIENTRY * glMultiTexCoord4ivPROC) (GLenum target, const GLint *v ); typedef void (APIENTRY * glMultiTexCoord4sPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q ); typedef void (APIENTRY * glMultiTexCoord4svPROC) (GLenum target, const GLshort *v ); typedef void (APIENTRY * glLoadTransposeMatrixdPROC) (const GLdouble m[16] ); typedef void (APIENTRY * glLoadTransposeMatrixfPROC) (const GLfloat m[16] ); typedef void (APIENTRY * glMultTransposeMatrixdPROC) (const GLdouble m[16] ); typedef void (APIENTRY * glMultTransposeMatrixfPROC) (const GLfloat m[16] ); typedef void (APIENTRY * glSampleCoveragePROC) (GLclampf value, GLboolean invert ); extern glActiveTexturePROC glActiveTexture; extern glClientActiveTexturePROC glClientActiveTexture; extern glMultiTexCoord1dPROC glMultiTexCoord1d; extern glMultiTexCoord1dvPROC glMultiTexCoord1dv; extern glMultiTexCoord1fPROC glMultiTexCoord1f; extern glMultiTexCoord1fvPROC glMultiTexCoord1fv; extern glMultiTexCoord1iPROC glMultiTexCoord1i; extern glMultiTexCoord1ivPROC glMultiTexCoord1iv; extern glMultiTexCoord1sPROC glMultiTexCoord1s; extern glMultiTexCoord1svPROC glMultiTexCoord1sv; extern glMultiTexCoord2dPROC glMultiTexCoord2d; extern glMultiTexCoord2dvPROC glMultiTexCoord2dv; extern glMultiTexCoord2fPROC glMultiTexCoord2f; extern glMultiTexCoord2fvPROC glMultiTexCoord2fv; extern glMultiTexCoord2iPROC glMultiTexCoord2i; extern glMultiTexCoord2ivPROC glMultiTexCoord2iv; extern glMultiTexCoord2sPROC glMultiTexCoord2s; extern glMultiTexCoord2svPROC glMultiTexCoord2sv; extern glMultiTexCoord3dPROC glMultiTexCoord3d; extern glMultiTexCoord3dvPROC glMultiTexCoord3dv; extern glMultiTexCoord3fPROC glMultiTexCoord3f; extern glMultiTexCoord3fvPROC glMultiTexCoord3fv; extern glMultiTexCoord3iPROC glMultiTexCoord3i; extern glMultiTexCoord3ivPROC glMultiTexCoord3iv; extern glMultiTexCoord3sPROC glMultiTexCoord3s; extern glMultiTexCoord3svPROC glMultiTexCoord3sv; extern glMultiTexCoord4dPROC glMultiTexCoord4d; extern glMultiTexCoord4dvPROC glMultiTexCoord4dv; extern glMultiTexCoord4fPROC glMultiTexCoord4f; extern glMultiTexCoord4fvPROC glMultiTexCoord4fv; extern glMultiTexCoord4iPROC glMultiTexCoord4i; extern glMultiTexCoord4ivPROC glMultiTexCoord4iv; extern glMultiTexCoord4sPROC glMultiTexCoord4s; extern glMultiTexCoord4svPROC glMultiTexCoord4sv; extern glLoadTransposeMatrixfPROC glLoadTransposeMatrixf; extern glLoadTransposeMatrixdPROC glLoadTransposeMatrixd; extern glMultTransposeMatrixfPROC glMultTransposeMatrixf; extern glMultTransposeMatrixdPROC glMultTransposeMatrixd; extern glCompressedTexImage3DPROC glCompressedTexImage3D; extern glCompressedTexImage2DPROC glCompressedTexImage2D; extern glCompressedTexImage1DPROC glCompressedTexImage1D; extern glCompressedTexSubImage3DPROC glCompressedTexSubImage3D; extern glCompressedTexSubImage2DPROC glCompressedTexSubImage2D; extern glCompressedTexSubImage1DPROC glCompressedTexSubImage1D; extern glGetCompressedTexImagePROC glGetCompressedTexImage; extern glSampleCoveragePROC glSampleCoverage; #endif /* GL_VERSION_1_3 */ /* OpenGL 1.4 */ #ifndef GL_VERSION_1_4 #define GL_VERSION_1_4 #ifndef GL_VERSION_1_2 #define GL_BLEND_EQUATION 0x8009 #define GL_MIN 0x8007 #define GL_MAX 0x8008 #define GL_FUNC_ADD 0x8006 #define GL_FUNC_SUBTRACT 0x800A #define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_BLEND_COLOR 0x8005 #define GL_CONSTANT_COLOR 0x8001 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_CONSTANT_ALPHA 0x8003 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 #endif /* GL_VERSION_1_2 */ #define GL_GENERATE_MIPMAP 0x8191 #define GL_GENERATE_MIPMAP_HINT 0x8192 #define GL_DEPTH_COMPONENT16 0x81A5 #define GL_DEPTH_COMPONENT24 0x81A6 #define GL_DEPTH_COMPONENT32 0x81A7 #define GL_TEXTURE_DEPTH_SIZE 0x884A #define GL_DEPTH_TEXTURE_MODE 0x884B #define GL_TEXTURE_COMPARE_MODE 0x884C #define GL_TEXTURE_COMPARE_FUNC 0x884D #define GL_COMPARE_R_TO_TEXTURE 0x884E #define GL_FOG_COORDINATE_SOURCE 0x8450 #define GL_FOG_COORDINATE 0x8451 #define GL_FRAGMENT_DEPTH 0x8452 #define GL_CURRENT_FOG_COORDINATE 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 #define GL_FOG_COORDINATE_ARRAY 0x8457 #define GL_POINT_SIZE_MIN 0x8126 #define GL_POINT_SIZE_MAX 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 #define GL_POINT_DISTANCE_ATTENUATION 0x8129 #define GL_COLOR_SUM 0x8458 #define GL_CURRENT_SECONDARY_COLOR 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D #define GL_SECONDARY_COLOR_ARRAY 0x845E #define GL_BLEND_DST_RGB 0x80C8 #define GL_BLEND_SRC_RGB 0x80C9 #define GL_BLEND_DST_ALPHA 0x80CA #define GL_BLEND_SRC_ALPHA 0x80CB #define GL_INCR_WRAP 0x8507 #define GL_DECR_WRAP 0x8508 #define GL_TEXTURE_FILTER_CONTROL 0x8500 #define GL_TEXTURE_LOD_BIAS 0x8501 #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD #define GL_GL_MIRRORED_REPEAT 0x8370 #ifndef GL_VERSION_1_2 typedef void (APIENTRY * glBlendEquationPROC) (GLenum mode ); typedef void (APIENTRY * glBlendColorPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); #endif /* GL_VERSION_1_2 */ typedef void (APIENTRY * glFogCoordfPROC) (GLfloat coord); typedef void (APIENTRY * glFogCoordfvPROC) (const GLfloat *coord); typedef void (APIENTRY * glFogCoorddPROC) (GLdouble coord); typedef void (APIENTRY * glFogCoorddvPROC) (const GLdouble *coord); typedef void (APIENTRY * glFogCoordPointerPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRY * glMultiDrawArraysPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); typedef void (APIENTRY * glMultiDrawElementsPROC) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount); typedef void (APIENTRY * glPointParameterfPROC) (GLenum pname, GLfloat param); typedef void (APIENTRY * glPointParameterfvPROC) (GLenum pname, GLfloat *params); typedef void (APIENTRY * glSecondaryColor3bPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (APIENTRY * glSecondaryColor3bvPROC) (const GLbyte *v); typedef void (APIENTRY * glSecondaryColor3dPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (APIENTRY * glSecondaryColor3dvPROC) (const GLdouble *v); typedef void (APIENTRY * glSecondaryColor3fPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (APIENTRY * glSecondaryColor3fvPROC) (const GLfloat *v); typedef void (APIENTRY * glSecondaryColor3iPROC) (GLint red, GLint green, GLint blue); typedef void (APIENTRY * glSecondaryColor3ivPROC) (const GLint *v); typedef void (APIENTRY * glSecondaryColor3sPROC) (GLshort red, GLshort green, GLshort blue); typedef void (APIENTRY * glSecondaryColor3svPROC) (const GLshort *v); typedef void (APIENTRY * glSecondaryColor3ubPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (APIENTRY * glSecondaryColor3ubvPROC) (const GLubyte *v); typedef void (APIENTRY * glSecondaryColor3uiPROC) (GLuint red, GLuint green, GLuint blue); typedef void (APIENTRY * glSecondaryColor3uivPROC) (const GLuint *v); typedef void (APIENTRY * glSecondaryColor3usPROC) (GLushort red, GLushort green, GLushort blue); typedef void (APIENTRY * glSecondaryColor3usvPROC) (const GLushort *v); typedef void (APIENTRY * glSecondaryColorPointerPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); typedef void (APIENTRY * glBlendFuncSeparatePROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); typedef void (APIENTRY * glWindowPos2dPROC) (GLdouble x, GLdouble y); typedef void (APIENTRY * glWindowPos2fPROC) (GLfloat x, GLfloat y); typedef void (APIENTRY * glWindowPos2iPROC) (GLint x, GLint y); typedef void (APIENTRY * glWindowPos2sPROC) (GLshort x, GLshort y); typedef void (APIENTRY * glWindowPos2dvPROC) (const GLdouble *p); typedef void (APIENTRY * glWindowPos2fvPROC) (const GLfloat *p); typedef void (APIENTRY * glWindowPos2ivPROC) (const GLint *p); typedef void (APIENTRY * glWindowPos2svPROC) (const GLshort *p); typedef void (APIENTRY * glWindowPos3dPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRY * glWindowPos3fPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY * glWindowPos3iPROC) (GLint x, GLint y, GLint z); typedef void (APIENTRY * glWindowPos3sPROC) (GLshort x, GLshort y, GLshort z); typedef void (APIENTRY * glWindowPos3dvPROC) (const GLdouble *p); typedef void (APIENTRY * glWindowPos3fvPROC) (const GLfloat *p); typedef void (APIENTRY * glWindowPos3ivPROC) (const GLint *p); typedef void (APIENTRY * glWindowPos3svPROC) (const GLshort *p); #ifndef GL_VERSION_1_2 extern glBlendColorPROC glBlendColor; extern glBlendEquationPROC glBlendEquation; #endif /* GL_VERSION_1_2 */ extern glFogCoordfPROC glFogCoordf; extern glFogCoordfvPROC glFogCoordfv; extern glFogCoorddPROC glFogCoordd; extern glFogCoorddvPROC glFogCoorddv; extern glFogCoordPointerPROC glFogCoordPointer; extern glMultiDrawArraysPROC glMultiDrawArrays; extern glMultiDrawElementsPROC glMultiDrawElements; extern glPointParameterfPROC glPointParameterf; extern glPointParameterfvPROC glPointParameterfv; extern glSecondaryColor3bPROC glSecondaryColor3b; extern glSecondaryColor3bvPROC glSecondaryColor3bv; extern glSecondaryColor3dPROC glSecondaryColor3d; extern glSecondaryColor3dvPROC glSecondaryColor3dv; extern glSecondaryColor3fPROC glSecondaryColor3f; extern glSecondaryColor3fvPROC glSecondaryColor3fv; extern glSecondaryColor3iPROC glSecondaryColor3i; extern glSecondaryColor3ivPROC glSecondaryColor3iv; extern glSecondaryColor3sPROC glSecondaryColor3s; extern glSecondaryColor3svPROC glSecondaryColor3sv; extern glSecondaryColor3ubPROC glSecondaryColor3ub; extern glSecondaryColor3ubvPROC glSecondaryColor3ubv; extern glSecondaryColor3uiPROC glSecondaryColor3ui; extern glSecondaryColor3uivPROC glSecondaryColor3uiv; extern glSecondaryColor3usPROC glSecondaryColor3us; extern glSecondaryColor3usvPROC glSecondaryColor3usv; extern glSecondaryColorPointerPROC glSecondaryColorPointer; extern glBlendFuncSeparatePROC glBlendFuncSeparate; extern glWindowPos2dPROC glWindowPos2d; extern glWindowPos2fPROC glWindowPos2f; extern glWindowPos2iPROC glWindowPos2i; extern glWindowPos2sPROC glWindowPos2s; extern glWindowPos2dvPROC glWindowPos2dv; extern glWindowPos2fvPROC glWindowPos2fv; extern glWindowPos2ivPROC glWindowPos2iv; extern glWindowPos2svPROC glWindowPos2sv; extern glWindowPos3dPROC glWindowPos3d; extern glWindowPos3fPROC glWindowPos3f; extern glWindowPos3iPROC glWindowPos3i; extern glWindowPos3sPROC glWindowPos3s; extern glWindowPos3dvPROC glWindowPos3dv; extern glWindowPos3fvPROC glWindowPos3fv; extern glWindowPos3ivPROC glWindowPos3iv; extern glWindowPos3svPROC glWindowPos3sv; #endif /* GL_VERSION_1_4 */ /*-------------------------------------------------------------------*/ /*------------EXTENSIONS---------------------------------------------*/ /*-------------------------------------------------------------------*/ /*-------------------------------------------------------------------*/ /*------------ARB_MULTITEXTURE---------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_multitexture #define GL_ARB_multitexture 1 #define GL_TEXTURE0_ARB 0x84C0 #define GL_TEXTURE1_ARB 0x84C1 #define GL_TEXTURE2_ARB 0x84C2 #define GL_TEXTURE3_ARB 0x84C3 #define GL_TEXTURE4_ARB 0x84C4 #define GL_TEXTURE5_ARB 0x84C5 #define GL_TEXTURE6_ARB 0x84C6 #define GL_TEXTURE7_ARB 0x84C7 #define GL_TEXTURE8_ARB 0x84C8 #define GL_TEXTURE9_ARB 0x84C9 #define GL_TEXTURE10_ARB 0x84CA #define GL_TEXTURE11_ARB 0x84CB #define GL_TEXTURE12_ARB 0x84CC #define GL_TEXTURE13_ARB 0x84CD #define GL_TEXTURE14_ARB 0x84CE #define GL_TEXTURE15_ARB 0x84CF #define GL_TEXTURE16_ARB 0x84D0 #define GL_TEXTURE17_ARB 0x84D1 #define GL_TEXTURE18_ARB 0x84D2 #define GL_TEXTURE19_ARB 0x84D3 #define GL_TEXTURE20_ARB 0x84D4 #define GL_TEXTURE21_ARB 0x84D5 #define GL_TEXTURE22_ARB 0x84D6 #define GL_TEXTURE23_ARB 0x84D7 #define GL_TEXTURE24_ARB 0x84D8 #define GL_TEXTURE25_ARB 0x84D9 #define GL_TEXTURE26_ARB 0x84DA #define GL_TEXTURE27_ARB 0x84DB #define GL_TEXTURE28_ARB 0x84DC #define GL_TEXTURE29_ARB 0x84DD #define GL_TEXTURE30_ARB 0x84DE #define GL_TEXTURE31_ARB 0x84DF #define GL_ACTIVE_TEXTURE_ARB 0x84E0 #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 typedef void (APIENTRY * glActiveTextureARBPROC) (GLenum texture ); typedef void (APIENTRY * glClientActiveTextureARBPROC) (GLenum texture ); typedef void (APIENTRY * glMultiTexCoord1dARBPROC) (GLenum target, GLdouble s ); typedef void (APIENTRY * glMultiTexCoord1dvARBPROC) (GLenum target, const GLdouble *v ); typedef void (APIENTRY * glMultiTexCoord1fARBPROC) (GLenum target, GLfloat s ); typedef void (APIENTRY * glMultiTexCoord1fvARBPROC) (GLenum target, const GLfloat *v ); typedef void (APIENTRY * glMultiTexCoord1iARBPROC) (GLenum target, GLint s ); typedef void (APIENTRY * glMultiTexCoord1ivARBPROC) (GLenum target, const GLint *v ); typedef void (APIENTRY * glMultiTexCoord1sARBPROC) (GLenum target, GLshort s ); typedef void (APIENTRY * glMultiTexCoord1svARBPROC) (GLenum target, const GLshort *v ); typedef void (APIENTRY * glMultiTexCoord2dARBPROC) (GLenum target, GLdouble s, GLdouble t ); typedef void (APIENTRY * glMultiTexCoord2dvARBPROC) (GLenum target, const GLdouble *v ); typedef void (APIENTRY * glMultiTexCoord2fARBPROC) (GLenum target, GLfloat s, GLfloat t ); typedef void (APIENTRY * glMultiTexCoord2fvARBPROC) (GLenum target, const GLfloat *v ); typedef void (APIENTRY * glMultiTexCoord2iARBPROC) (GLenum target, GLint s, GLint t ); typedef void (APIENTRY * glMultiTexCoord2ivARBPROC) (GLenum target, const GLint *v ); typedef void (APIENTRY * glMultiTexCoord2sARBPROC) (GLenum target, GLshort s, GLshort t ); typedef void (APIENTRY * glMultiTexCoord2svARBPROC) (GLenum target, const GLshort *v ); typedef void (APIENTRY * glMultiTexCoord3dARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r ); typedef void (APIENTRY * glMultiTexCoord3dvARBPROC) (GLenum target, const GLdouble *v ); typedef void (APIENTRY * glMultiTexCoord3fARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r ); typedef void (APIENTRY * glMultiTexCoord3fvARBPROC) (GLenum target, const GLfloat *v ); typedef void (APIENTRY * glMultiTexCoord3iARBPROC) (GLenum target, GLint s, GLint t, GLint r ); typedef void (APIENTRY * glMultiTexCoord3ivARBPROC) (GLenum target, const GLint *v ); typedef void (APIENTRY * glMultiTexCoord3sARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r ); typedef void (APIENTRY * glMultiTexCoord3svARBPROC) (GLenum target, const GLshort *v ); typedef void (APIENTRY * glMultiTexCoord4dARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q ); typedef void (APIENTRY * glMultiTexCoord4dvARBPROC) (GLenum target, const GLdouble *v ); typedef void (APIENTRY * glMultiTexCoord4fARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ); typedef void (APIENTRY * glMultiTexCoord4fvARBPROC) (GLenum target, const GLfloat *v ); typedef void (APIENTRY * glMultiTexCoord4iARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q ); typedef void (APIENTRY * glMultiTexCoord4ivARBPROC) (GLenum target, const GLint *v ); typedef void (APIENTRY * glMultiTexCoord4sARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q ); typedef void (APIENTRY * glMultiTexCoord4svARBPROC) (GLenum target, const GLshort *v ); extern glActiveTextureARBPROC glActiveTextureARB; extern glClientActiveTextureARBPROC glClientActiveTextureARB; extern glMultiTexCoord1dARBPROC glMultiTexCoord1dARB; extern glMultiTexCoord1dvARBPROC glMultiTexCoord1dvARB; extern glMultiTexCoord1fARBPROC glMultiTexCoord1fARB; extern glMultiTexCoord1fvARBPROC glMultiTexCoord1fvARB; extern glMultiTexCoord1iARBPROC glMultiTexCoord1iARB; extern glMultiTexCoord1ivARBPROC glMultiTexCoord1ivARB; extern glMultiTexCoord1sARBPROC glMultiTexCoord1sARB; extern glMultiTexCoord1svARBPROC glMultiTexCoord1svARB; extern glMultiTexCoord2dARBPROC glMultiTexCoord2dARB; extern glMultiTexCoord2dvARBPROC glMultiTexCoord2dvARB; extern glMultiTexCoord2fARBPROC glMultiTexCoord2fARB; extern glMultiTexCoord2fvARBPROC glMultiTexCoord2fvARB; extern glMultiTexCoord2iARBPROC glMultiTexCoord2iARB; extern glMultiTexCoord2ivARBPROC glMultiTexCoord2ivARB; extern glMultiTexCoord2sARBPROC glMultiTexCoord2sARB; extern glMultiTexCoord2svARBPROC glMultiTexCoord2svARB; extern glMultiTexCoord3dARBPROC glMultiTexCoord3dARB; extern glMultiTexCoord3dvARBPROC glMultiTexCoord3dvARB; extern glMultiTexCoord3fARBPROC glMultiTexCoord3fARB; extern glMultiTexCoord3fvARBPROC glMultiTexCoord3fvARB; extern glMultiTexCoord3iARBPROC glMultiTexCoord3iARB; extern glMultiTexCoord3ivARBPROC glMultiTexCoord3ivARB; extern glMultiTexCoord3sARBPROC glMultiTexCoord3sARB; extern glMultiTexCoord3svARBPROC glMultiTexCoord3svARB; extern glMultiTexCoord4dARBPROC glMultiTexCoord4dARB; extern glMultiTexCoord4dvARBPROC glMultiTexCoord4dvARB; extern glMultiTexCoord4fARBPROC glMultiTexCoord4fARB; extern glMultiTexCoord4fvARBPROC glMultiTexCoord4fvARB; extern glMultiTexCoord4iARBPROC glMultiTexCoord4iARB; extern glMultiTexCoord4ivARBPROC glMultiTexCoord4ivARB; extern glMultiTexCoord4sARBPROC glMultiTexCoord4sARB; extern glMultiTexCoord4svARBPROC glMultiTexCoord4svARB; #endif /* GL_ARB_multitexture */ /*-------------------------------------------------------------------*/ /*------------ARB_TRANSPOSE_MATRIX-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_transpose_matrix #define GL_ARB_transpose_matrix 1 #define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 #define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 #define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 #define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 typedef void (APIENTRY * glLoadTransposeMatrixdARBPROC) (const GLdouble m[16] ); typedef void (APIENTRY * glLoadTransposeMatrixfARBPROC) (const GLfloat m[16] ); typedef void (APIENTRY * glMultTransposeMatrixdARBPROC) (const GLdouble m[16] ); typedef void (APIENTRY * glMultTransposeMatrixfARBPROC) (const GLfloat m[16] ); extern glLoadTransposeMatrixfARBPROC glLoadTransposeMatrixfARB; extern glLoadTransposeMatrixdARBPROC glLoadTransposeMatrixdARB; extern glMultTransposeMatrixfARBPROC glMultTransposeMatrixfARB; extern glMultTransposeMatrixdARBPROC glMultTransposeMatrixdARB; #endif /* GL_ARB_transpose_matrix */ /*-------------------------------------------------------------------*/ /*------------ARB_TEXTURE_COMPRESSION--------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_texture_compression #define GL_ARB_texture_compression 1 #define GL_COMPRESSED_ALPHA_ARB 0x84E9 #define GL_COMPRESSED_LUMINANCE_ARB 0x84EA #define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB #define GL_COMPRESSED_INTENSITY_ARB 0x84EC #define GL_COMPRESSED_RGB_ARB 0x84ED #define GL_COMPRESSED_RGBA_ARB 0x84EE #define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF #define GL_TEXTURE_IMAGE_SIZE_ARB 0x86A0 #define GL_TEXTURE_COMPRESSED_ARB 0x86A1 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 #define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 typedef void (APIENTRY * glCompressedTexImage1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glCompressedTexImage2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glCompressedTexImage3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glCompressedTexSubImage1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glCompressedTexSubImage2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glCompressedTexSubImage3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data ); typedef void (APIENTRY * glGetCompressedTexImageARBPROC) (GLenum target, GLint lod, GLvoid *img ); extern glCompressedTexImage3DARBPROC glCompressedTexImage3DARB; extern glCompressedTexImage2DARBPROC glCompressedTexImage2DARB; extern glCompressedTexImage1DARBPROC glCompressedTexImage1DARB; extern glCompressedTexSubImage3DARBPROC glCompressedTexSubImage3DARB; extern glCompressedTexSubImage2DARBPROC glCompressedTexSubImage2DARB; extern glCompressedTexSubImage1DARBPROC glCompressedTexSubImage1DARB; extern glGetCompressedTexImageARBPROC glGetCompressedTexImageARB; #endif /* GL_ARB_texture_compression */ /*-------------------------------------------------------------------*/ /*------------ARB_CUBE_MAP-------------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_texture_cube_map #define GL_ARB_texture_cube_map 1 #define GL_NORMAL_MAP_ARB 0x8511 #define GL_REFLECTION_MAP_ARB 0x8512 #define GL_TEXTURE_CUBE_MAP_ARB 0x8513 #define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 #define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A #define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C #endif /* GL_ARB_texture_cube_map */ /*-------------------------------------------------------------------*/ /*------------SGIX_SHADOW--------------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_SGIX_shadow #define GL_SGIX_shadow 1 #define GL_TEXTURE_COMPARE_SGIX 0x819A #define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B #define GL_TEXTURE_LEQUAL_R_SGIX 0x819C #define GL_TEXTURE_GEQUAL_R_SGIX 0x819D #endif /* GL_SGIX_shadow */ /*-------------------------------------------------------------------*/ /*------------SGIX_DEPTH_TEXTURE-------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_SGIX_depth_texture #define GL_SGIX_depth_texture 1 #define GL_DEPTH_COMPONENT16_SGIX 0x81A5 #define GL_DEPTH_COMPONENT24_SGIX 0x81A6 #define GL_DEPTH_COMPONENT32_SGIX 0x81A7 #endif /* GL_SGIX_depth_texture */ /*-------------------------------------------------------------------*/ /*------------EXT_COMPILED_VERTEX_ARRAY------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_compiled_vertex_array #define GL_EXT_compiled_vertex_array 1 #define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 #define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 typedef void (APIENTRY * glLockArraysEXTPROC) (GLint first, GLsizei count); typedef void (APIENTRY * glUnlockArraysEXTPROC) (); extern glLockArraysEXTPROC glLockArraysEXT; extern glUnlockArraysEXTPROC glUnlockArraysEXT; #endif /* GL_EXT_compiled_vertex_array */ /*-------------------------------------------------------------------*/ /*------------ARB_TEXTURE_ENV_COMBINE--------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_texture_env_combine #define GL_ARB_texture_env_combine 1 #define GL_COMBINE_ARB 0x8570 #define GL_COMBINE_RGB_ARB 0x8571 #define GL_COMBINE_ALPHA_ARB 0x8572 #define GL_RGB_SCALE_ARB 0x8573 #define GL_ADD_SIGNED_ARB 0x8574 #define GL_INTERPOLATE_ARB 0x8575 #define GL_CONSTANT_ARB 0x8576 #define GL_PRIMARY_COLOR_ARB 0x8577 #define GL_PREVIOUS_ARB 0x8578 #define GL_SOURCE0_RGB_ARB 0x8580 #define GL_SOURCE1_RGB_ARB 0x8581 #define GL_SOURCE2_RGB_ARB 0x8582 #define GL_SOURCE0_ALPHA_ARB 0x8588 #define GL_SOURCE1_ALPHA_ARB 0x8589 #define GL_SOURCE2_ALPHA_ARB 0x858A #define GL_OPERAND0_RGB_ARB 0x8590 #define GL_OPERAND1_RGB_ARB 0x8591 #define GL_OPERAND2_RGB_ARB 0x8592 #define GL_OPERAND0_ALPHA_ARB 0x8598 #define GL_OPERAND1_ALPHA_ARB 0x8599 #define GL_OPERAND2_ALPHA_ARB 0x859A #endif /* GL_ARB_texture_env_combine */ /*-------------------------------------------------------------------*/ /*------------ARB_TEXTURE_ENV_DOT3-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_texture_env_dot3 #define GL_ARB_texture_env_dot3 1 #define GL_DOT3_RGB_ARB 0x86AE #define GL_DOT3_RGBA_ARB 0x86AF #endif /* GL_ARB_texture_env_dot3 */ /*-------------------------------------------------------------------*/ /*------------ARB_TEXTURE_BORDER_CLAMP-------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_texture_border_clamp #define GL_ARB_texture_border_clamp 1 #define GL_CLAMP_TO_BORDER_ARB 0x812D #endif /* GL_ARB_texture_border_clamp */ /*-------------------------------------------------------------------*/ /*------------ARB_TEXTURE_ENV_ADD------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_texture_env_add #define GL_ARB_texture_env_add 1 #endif /* GL_ARB_texture_env_add */ /*-------------------------------------------------------------------*/ /*------------EXT_SECONDARY_COLOR------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_secondary_color #define GL_EXT_secondary_color 1 #define GL_COLOR_SUM_EXT 0x8458 #define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 #define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A #define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B #define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C #define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D #define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E typedef void (APIENTRY * glSecondaryColor3bEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); typedef void (APIENTRY * glSecondaryColor3bvEXTPROC) (const GLbyte *v); typedef void (APIENTRY * glSecondaryColor3dEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); typedef void (APIENTRY * glSecondaryColor3dvEXTPROC) (const GLdouble *v); typedef void (APIENTRY * glSecondaryColor3fEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); typedef void (APIENTRY * glSecondaryColor3fvEXTPROC) (const GLfloat *v); typedef void (APIENTRY * glSecondaryColor3iEXTPROC) (GLint red, GLint green, GLint blue); typedef void (APIENTRY * glSecondaryColor3ivEXTPROC) (const GLint *v); typedef void (APIENTRY * glSecondaryColor3sEXTPROC) (GLshort red, GLshort green, GLshort blue); typedef void (APIENTRY * glSecondaryColor3svEXTPROC) (const GLshort *v); typedef void (APIENTRY * glSecondaryColor3ubEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); typedef void (APIENTRY * glSecondaryColor3ubvEXTPROC) (const GLubyte *v); typedef void (APIENTRY * glSecondaryColor3uiEXTPROC) (GLuint red, GLuint green, GLuint blue); typedef void (APIENTRY * glSecondaryColor3uivEXTPROC) (const GLuint *v); typedef void (APIENTRY * glSecondaryColor3usEXTPROC) (GLushort red, GLushort green, GLushort blue); typedef void (APIENTRY * glSecondaryColor3usvEXTPROC) (const GLushort *v); typedef void (APIENTRY * glSecondaryColorPointerEXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); extern glSecondaryColor3bEXTPROC glSecondaryColor3bEXT; extern glSecondaryColor3bvEXTPROC glSecondaryColor3bvEXT; extern glSecondaryColor3dEXTPROC glSecondaryColor3dEXT; extern glSecondaryColor3dvEXTPROC glSecondaryColor3dvEXT; extern glSecondaryColor3fEXTPROC glSecondaryColor3fEXT; extern glSecondaryColor3fvEXTPROC glSecondaryColor3fvEXT; extern glSecondaryColor3iEXTPROC glSecondaryColor3iEXT; extern glSecondaryColor3ivEXTPROC glSecondaryColor3ivEXT; extern glSecondaryColor3sEXTPROC glSecondaryColor3sEXT; extern glSecondaryColor3svEXTPROC glSecondaryColor3svEXT; extern glSecondaryColor3ubEXTPROC glSecondaryColor3ubEXT; extern glSecondaryColor3ubvEXTPROC glSecondaryColor3ubvEXT; extern glSecondaryColor3uiEXTPROC glSecondaryColor3uiEXT; extern glSecondaryColor3uivEXTPROC glSecondaryColor3uivEXT; extern glSecondaryColor3usEXTPROC glSecondaryColor3usEXT; extern glSecondaryColor3usvEXTPROC glSecondaryColor3usvEXT; extern glSecondaryColorPointerEXTPROC glSecondaryColorPointerEXT; #endif /* GL_EXT_secondary_color */ /*-------------------------------------------------------------------*/ /*------------EXT_FOG_COORD------------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_fog_coord #define GL_EXT_fog_coord 1 #define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 #define GL_FOG_COORDINATE_EXT 0x8451 #define GL_FRAGMENT_DEPTH_EXT 0x8452 #define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 #define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 #define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 #define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 #define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 typedef void (APIENTRY * glFogCoordfEXTPROC) (GLfloat coord); typedef void (APIENTRY * glFogCoordfvEXTPROC) (const GLfloat *coord); typedef void (APIENTRY * glFogCoorddEXTPROC) (GLdouble coord); typedef void (APIENTRY * glFogCoorddvEXTPROC) (const GLdouble *coord); typedef void (APIENTRY * glFogCoordPointerEXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); extern glFogCoordfEXTPROC glFogCoordfEXT; extern glFogCoordfvEXTPROC glFogCoordfvEXT; extern glFogCoorddEXTPROC glFogCoorddEXT; extern glFogCoorddvEXTPROC glFogCoorddvEXT; extern glFogCoordPointerEXTPROC glFogCoordPointerEXT; #endif /* GL_EXT_fog_coord */ /*-------------------------------------------------------------------*/ /*------------NV_VERTEX_ARRAY_RANGE----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_vertex_array_range #define GL_NV_vertex_array_range 1 #define GL_VERTEX_ARRAY_RANGE_NV 0x851D #define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E #define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 #define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 typedef void (APIENTRY * glFlushVertexArrayRangeNVPROC) (void); typedef void (APIENTRY * glVertexArrayRangeNVPROC) (GLsizei size, const GLvoid *pointer); extern glFlushVertexArrayRangeNVPROC glFlushVertexArrayRangeNV; extern glVertexArrayRangeNVPROC glVertexArrayRangeNV; #ifdef _WIN32 typedef void * (APIENTRY * wglAllocateMemoryNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); typedef void (APIENTRY * wglFreeMemoryNVPROC) (void *pointer); extern wglAllocateMemoryNVPROC wglAllocateMemoryNV; extern wglFreeMemoryNVPROC wglFreeMemoryNV; #endif /* WIN32 */ #endif /* GL_NV_vertex_array_range */ /*-------------------------------------------------------------------*/ /*------------NV_VERTEX_ARRAY_RANGE2---------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_vertex_array_range2 #define GL_NV_vertex_array_range2 1 #define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 #endif /* GL_NV_vertex_array_range2 */ /*-------------------------------------------------------------------*/ /*------------EXT_POINT_PARAMETERS-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_point_parameters #define GL_EXT_point_parameters 1 #define GL_POINT_SIZE_MIN_EXT 0x8126 #define GL_POINT_SIZE_MAX_EXT 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 #define GL_DISTANCE_ATTENUATION_EXT 0x8129 typedef void (APIENTRY * glPointParameterfEXTPROC) (GLenum pname, GLfloat param); typedef void (APIENTRY * glPointParameterfvEXTPROC) (GLenum pname, const GLfloat *params); extern glPointParameterfEXTPROC glPointParameterfEXT; extern glPointParameterfvEXTPROC glPointParameterfvEXT; #endif /* GL_EXT_point_parameters */ /*-------------------------------------------------------------------*/ /*------------NV_REGISTER_COMBINERS----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_register_combiners #define GL_NV_register_combiners 1 #define GL_REGISTER_COMBINERS_NV 0x8522 #define GL_COMBINER0_NV 0x8550 #define GL_COMBINER1_NV 0x8551 #define GL_COMBINER2_NV 0x8552 #define GL_COMBINER3_NV 0x8553 #define GL_COMBINER4_NV 0x8554 #define GL_COMBINER5_NV 0x8555 #define GL_COMBINER6_NV 0x8556 #define GL_COMBINER7_NV 0x8557 #define GL_VARIABLE_A_NV 0x8523 #define GL_VARIABLE_B_NV 0x8524 #define GL_VARIABLE_C_NV 0x8525 #define GL_VARIABLE_D_NV 0x8526 #define GL_VARIABLE_E_NV 0x8527 #define GL_VARIABLE_F_NV 0x8528 #define GL_VARIABLE_G_NV 0x8529 #define GL_CONSTANT_COLOR0_NV 0x852A #define GL_CONSTANT_COLOR1_NV 0x852B #define GL_PRIMARY_COLOR_NV 0x852C #define GL_SECONDARY_COLOR_NV 0x852D #define GL_SPARE0_NV 0x852E #define GL_SPARE1_NV 0x852F #define GL_UNSIGNED_IDENTITY_NV 0x8536 #define GL_UNSIGNED_INVERT_NV 0x8537 #define GL_EXPAND_NORMAL_NV 0x8538 #define GL_EXPAND_NEGATE_NV 0x8539 #define GL_HALF_BIAS_NORMAL_NV 0x853A #define GL_HALF_BIAS_NEGATE_NV 0x853B #define GL_SIGNED_IDENTITY_NV 0x853C #define GL_SIGNED_NEGATE_NV 0x853D #define GL_E_TIMES_F_NV 0x8531 #define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 #define GL_SCALE_BY_TWO_NV 0x853E #define GL_SCALE_BY_FOUR_NV 0x853F #define GL_SCALE_BY_ONE_HALF_NV 0x8540 #define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 #define GL_DISCARD_NV 0x8530 #define GL_COMBINER_INPUT_NV 0x8542 #define GL_COMBINER_MAPPING_NV 0x8543 #define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 #define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 #define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 #define GL_COMBINER_MUX_SUM_NV 0x8547 #define GL_COMBINER_SCALE_NV 0x8548 #define GL_COMBINER_BIAS_NV 0x8549 #define GL_COMBINER_AB_OUTPUT_NV 0x854A #define GL_COMBINER_CD_OUTPUT_NV 0x854B #define GL_COMBINER_SUM_OUTPUT_NV 0x854C #define GL_NUM_GENERAL_COMBINERS_NV 0x854E #define GL_COLOR_SUM_CLAMP_NV 0x854F #define GL_MAX_GENERAL_COMBINERS_NV 0x854D typedef void (APIENTRY * glCombinerParameterfvNVPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRY * glCombinerParameterfNVPROC) (GLenum pname, GLfloat param); typedef void (APIENTRY * glCombinerParameterivNVPROC) (GLenum pname, const GLint *params); typedef void (APIENTRY * glCombinerParameteriNVPROC) (GLenum pname, GLint param); typedef void (APIENTRY * glCombinerInputNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (APIENTRY * glCombinerOutputNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); typedef void (APIENTRY * glFinalCombinerInputNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); typedef void (APIENTRY * glGetCombinerInputParameterfvNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); typedef void (APIENTRY * glGetCombinerInputParameterivNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); typedef void (APIENTRY * glGetCombinerOutputParameterfvNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); typedef void (APIENTRY * glGetCombinerOutputParameterivNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); typedef void (APIENTRY * glGetFinalCombinerInputParameterfvNVPROC) (GLenum variable, GLenum pname, GLfloat *params); typedef void (APIENTRY * glGetFinalCombinerInputParameterivNVPROC) (GLenum variable, GLenum pname, GLint *params); extern glCombinerParameterfvNVPROC glCombinerParameterfvNV; extern glCombinerParameterfNVPROC glCombinerParameterfNV; extern glCombinerParameterivNVPROC glCombinerParameterivNV; extern glCombinerParameteriNVPROC glCombinerParameteriNV; extern glCombinerInputNVPROC glCombinerInputNV; extern glCombinerOutputNVPROC glCombinerOutputNV; extern glFinalCombinerInputNVPROC glFinalCombinerInputNV; extern glGetCombinerInputParameterfvNVPROC glGetCombinerInputParameterfvNV; extern glGetCombinerInputParameterivNVPROC glGetCombinerInputParameterivNV; extern glGetCombinerOutputParameterfvNVPROC glGetCombinerOutputParameterfvNV; extern glGetCombinerOutputParameterivNVPROC glGetCombinerOutputParameterivNV; extern glGetFinalCombinerInputParameterfvNVPROC glGetFinalCombinerInputParameterfvNV; extern glGetFinalCombinerInputParameterivNVPROC glGetFinalCombinerInputParameterivNV; #endif /* GL_NV_register_combiners */ /*-------------------------------------------------------------------*/ /*------------ARB_MULTISAMPLE----------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_multisample #define GL_ARB_multisample 1 #define GL_MULTISAMPLE_ARB 0x809D #define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E #define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F #define GL_SAMPLE_COVERAGE_ARB 0x80A0 #define GL_SAMPLE_BUFFERS_ARB 0x80A8 #define GL_SAMPLES_ARB 0x80A9 #define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA #define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB #define GL_MULTISAMPLE_BIT_ARB 0x20000000 typedef void (APIENTRY * glSampleCoverageARBPROC) (GLclampf value, GLboolean invert ); extern glSampleCoverageARBPROC glSampleCoverageARB; #endif /* GL_ARB_multisample */ /*-------------------------------------------------------------------*/ /*------------NV_TEXTURE_SHADER--------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_texture_shader #define GL_NV_texture_shader 1 #define GL_TEXTURE_SHADER_NV 0x86DE #define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 #define GL_SHADER_OPERATION_NV 0x86DF #define GL_CULL_MODES_NV 0x86E0 #define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 #define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 #define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 #define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 #define GL_CONST_EYE_NV 0x86E5 #define GL_SHADER_CONSISTENT_NV 0x86DD #define GL_PASS_THROUGH_NV 0x86E6 #define GL_CULL_FRAGMENT_NV 0x86E7 #define GL_OFFSET_TEXTURE_2D_NV 0x86E8 #define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C #define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D #define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 #define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA #define GL_DOT_PRODUCT_NV 0x86EC #define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED #define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE #define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E #define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 #define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 #define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 #define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 #define GL_HILO_NV 0x86F4 #define GL_DSDT_NV 0x86F5 #define GL_DSDT_MAG_NV 0x86F6 #define GL_DSDT_MAG_VIB_NV 0x86F7 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB #define GL_SIGNED_RGBA_NV 0x86FB #define GL_SIGNED_RGBA8_NV 0x86FC #define GL_SIGNED_RGB_NV 0x86FE #define GL_SIGNED_RGB8_NV 0x86FF #define GL_SIGNED_LUMINANCE_NV 0x8701 #define GL_SIGNED_LUMINANCE8_NV 0x8702 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 #define GL_SIGNED_ALPHA_NV 0x8705 #define GL_SIGNED_ALPHA8_NV 0x8706 #define GL_SIGNED_INTENSITY_NV 0x8707 #define GL_SIGNED_INTENSITY8_NV 0x8708 #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D #define GL_HILO16_NV 0x86F8 #define GL_SIGNED_HILO_NV 0x86F9 #define GL_SIGNED_HILO16_NV 0x86FA #define GL_DSDT8_NV 0x8709 #define GL_DSDT8_MAG8_NV 0x870A #define GL_DSDT_MAG_INTENSITY_NV 0x86DC #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B #define GL_HI_SCALE_NV 0x870E #define GL_LO_SCALE_NV 0x870F #define GL_DS_SCALE_NV 0x8710 #define GL_DT_SCALE_NV 0x8711 #define GL_MAGNITUDE_SCALE_NV 0x8712 #define GL_VIBRANCE_SCALE_NV 0x8713 #define GL_HI_BIAS_NV 0x8714 #define GL_LO_BIAS_NV 0x8715 #define GL_DS_BIAS_NV 0x8716 #define GL_DT_BIAS_NV 0x8717 #define GL_MAGNITUDE_BIAS_NV 0x8718 #define GL_VIBRANCE_BIAS_NV 0x8719 #define GL_TEXTURE_BORDER_VALUES_NV 0x871A #define GL_TEXTURE_HI_SIZE_NV 0x871B #define GL_TEXTURE_LO_SIZE_NV 0x871C #define GL_TEXTURE_DS_SIZE_NV 0x871D #define GL_TEXTURE_DT_SIZE_NV 0x871E #define GL_TEXTURE_MAG_SIZE_NV 0x871F #endif /* GL_NV_texture_shader */ /*-------------------------------------------------------------------*/ /*------------GL_NV_TEXTURE_RECTANGLE--------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_texture_rectangle #define GL_NV_texture_rectangle 1 #define GL_TEXTURE_RECTANGLE_NV 0x84F5 #define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 #define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 #define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 #endif /* GL_NV_texture_recrangle */ /*-------------------------------------------------------------------*/ /*------------NV_TEXTURE_ENV_COMBINE4--------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_texture_env_combine4 #define GL_NV_texture_env_combine4 1 #define GL_COMBINE4_NV 0x8503 #define GL_SOURCE3_RGB_NV 0x8583 #define GL_SOURCE3_ALPHA_NV 0x858B #define GL_OPERAND3_RGB_NV 0x8593 #define GL_OPERAND3_ALPHA_NV 0x859B #endif /* GL_NV_texture_env_combine */ /*-------------------------------------------------------------------*/ /*------------NV_FOG_DISTANCE----------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_fog_distance #define GL_NV_fog_distance 1 #define GL_FOG_DISTANCE_MODE_NV 0x855A #define GL_EYE_RADIAL_NV 0x855B #define GL_EYE_PLANE_ABSOLUTE_NV 0x855C #endif /* GL_NV_fog_distance */ /*-------------------------------------------------------------------*/ /*------------EXT_TEXTURE_FILTER_ANISOTROPIC-------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_texture_filter_anisotropic #define GL_EXT_texture_filter_anisotropic 1 #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF #endif /* GL_EXT_texture_filter_anisotropic */ /*-------------------------------------------------------------------*/ /*------------SGIS_GENERATE_MIPMAP-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_SGIS_generate_mipmap #define GL_SGIS_generate_mipmap 1 #define GL_GENERATE_MIPMAP_SGIS 0x8191 #define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 #endif /* GL_SGIS_generate_mipmap */ /*-------------------------------------------------------------------*/ /*------------NV_TEXGEN_REFLECTION-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_texgen_reflection #define GL_NV_texgen_reflection 1 #define GL_NORMAL_MAP_NV 0x8511 #define GL_REFLECTION_MAP_NV 0x8512 #endif /* GL_NV_texgen_reflection */ /*-------------------------------------------------------------------*/ /*------------EXT_VERTEX_WEIGHTING-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_vertex_weighting #define GL_EXT_vertex_weighting 1 #define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 /* alias to GL_MODELVIEW_STACK_DEPTH */ #define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 #define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 /* alias to GL_MODELVIEW_MATRIX */ #define GL_MODELVIEW1_MATRIX_EXT 0x8506 #define GL_VERTEX_WEIGHTING_EXT 0x8509 #define GL_MODELVIEW0_EXT 0x1700 /* alias to GL_MODELVIEW */ #define GL_MODELVIEW1_EXT 0x850A #define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B #define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C #define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D #define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E #define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F #define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 typedef void (APIENTRY * glVertexWeightfEXTPROC) (GLfloat weight); typedef void (APIENTRY * glVertexWeightfvEXTPROC) (const GLfloat *weight); typedef void (APIENTRY * glVertexWeightPointerEXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid *pointer); extern glVertexWeightfEXTPROC glVertexWeightfEXT; extern glVertexWeightfvEXTPROC glVertexWeightfvEXT; extern glVertexWeightPointerEXTPROC glVertexWeightPointerEXT; #endif /* GL_EXT_vertex_weighting */ /*-------------------------------------------------------------------*/ /*------------NV_VERTEX_PROGRAM--------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_vertex_program #define GL_NV_vertex_program 1 #define GL_VERTEX_PROGRAM_NV 0x8620 #define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 #define GL_VERTEX_STATE_PROGRAM_NV 0x8621 #define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 #define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 #define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 #define GL_CURRENT_ATTRIB_NV 0x8626 #define GL_PROGRAM_PARAMETER_NV 0x8644 #define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 #define GL_PROGRAM_TARGET_NV 0x8646 #define GL_PROGRAM_LENGTH_NV 0x8627 #define GL_PROGRAM_RESIDENT_NV 0x8647 #define GL_PROGRAM_STRING_NV 0x8628 #define GL_TRACK_MATRIX_NV 0x8648 #define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 #define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E #define GL_MAX_TRACK_MATRICES_NV 0x862F #define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 #define GL_CURRENT_MATRIX_NV 0x8641 #define GL_VERTEX_PROGRAM_BINDING_NV 0x864A #define GL_PROGRAM_ERROR_POSITION_NV 0x864B #define GL_MODELVIEW_PROJECTION_NV 0x8629 #define GL_MATRIX0_NV 0x8630 #define GL_MATRIX1_NV 0x8631 #define GL_MATRIX2_NV 0x8632 #define GL_MATRIX3_NV 0x8633 #define GL_MATRIX4_NV 0x8634 #define GL_MATRIX5_NV 0x8635 #define GL_MATRIX6_NV 0x8636 #define GL_MATRIX7_NV 0x8637 #define GL_IDENTITY_NV 0x862A #define GL_INVERSE_NV 0x862B #define GL_TRANSPOSE_NV 0x862C #define GL_INVERSE_TRANSPOSE_NV 0x862D #define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 #define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 #define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 #define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 #define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 #define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 #define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 #define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 #define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 #define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 #define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A #define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B #define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C #define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D #define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E #define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F #define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 #define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 #define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 #define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 #define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 #define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 #define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 #define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 #define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 #define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 #define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A #define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B #define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C #define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D #define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E #define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F #define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 #define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 #define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 #define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 #define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 #define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 #define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 #define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 #define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 #define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 #define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A #define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B #define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C #define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D #define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E #define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F typedef void (APIENTRY * glBindProgramNVPROC) (GLenum target, GLuint id); typedef void (APIENTRY * glDeleteProgramsNVPROC) (GLsizei n, const GLuint *ids); typedef void (APIENTRY * glExecuteProgramNVPROC) (GLenum target, GLuint id, const GLfloat *params); typedef void (APIENTRY * glGenProgramsNVPROC) (GLsizei n, GLuint *ids); typedef GLboolean (APIENTRY * glAreProgramsResidentNVPROC) (GLsizei n, const GLuint *ids, GLboolean *residences); typedef void (APIENTRY * glRequestResidentProgramsNVPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRY * glGetProgramParameterfvNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRY * glGetProgramParameterdvNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRY * glGetProgramivNVPROC) (GLuint id, GLenum pname, GLint *params); typedef void (APIENTRY * glGetProgramStringNVPROC) (GLuint id, GLenum pname, GLubyte *program); typedef void (APIENTRY * glGetTrackMatrixivNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); typedef void (APIENTRY * glGetVertexAttribdvNVPROC) (GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRY * glGetVertexAttribfvNVPROC) (GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRY * glGetVertexAttribivNVPROC) (GLuint index, GLenum pname, GLint *params); typedef void (APIENTRY * glGetVertexAttribPointervNVPROC) (GLuint index, GLenum pname, GLvoid **pointer); typedef GLboolean (APIENTRY * glIsProgramNVPROC) (GLuint id); typedef void (APIENTRY * glLoadProgramNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); typedef void (APIENTRY * glProgramParameter4fNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRY * glProgramParameter4dNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRY * glProgramParameter4dvNVPROC) (GLenum target, GLuint index, const GLdouble *params); typedef void (APIENTRY * glProgramParameter4fvNVPROC) (GLenum target, GLuint index, const GLfloat *params); typedef void (APIENTRY * glProgramParameters4dvNVPROC) (GLenum target, GLuint index, GLuint num, const GLdouble *params); typedef void (APIENTRY * glProgramParameters4fvNVPROC) (GLenum target, GLuint index, GLuint num, const GLfloat *params); typedef void (APIENTRY * glTrackMatrixNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); typedef void (APIENTRY * glVertexAttribPointerNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRY * glVertexAttrib1sNVPROC) (GLuint index, GLshort x); typedef void (APIENTRY * glVertexAttrib1fNVPROC) (GLuint index, GLfloat x); typedef void (APIENTRY * glVertexAttrib1dNVPROC) (GLuint index, GLdouble x); typedef void (APIENTRY * glVertexAttrib2sNVPROC) (GLuint index, GLshort x, GLshort y); typedef void (APIENTRY * glVertexAttrib2fNVPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (APIENTRY * glVertexAttrib2dNVPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (APIENTRY * glVertexAttrib3sNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (APIENTRY * glVertexAttrib3fNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY * glVertexAttrib3dNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRY * glVertexAttrib4sNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRY * glVertexAttrib4fNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRY * glVertexAttrib4dNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRY * glVertexAttrib4ubNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (APIENTRY * glVertexAttrib1svNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRY * glVertexAttrib1fvNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRY * glVertexAttrib1dvNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRY * glVertexAttrib2svNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRY * glVertexAttrib2fvNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRY * glVertexAttrib2dvNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRY * glVertexAttrib3svNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRY * glVertexAttrib3fvNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRY * glVertexAttrib3dvNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRY * glVertexAttrib4svNVPROC) (GLuint index, const GLshort *v); typedef void (APIENTRY * glVertexAttrib4fvNVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRY * glVertexAttrib4dvNVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRY * glVertexAttrib4ubvNVPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRY * glVertexAttribs1svNVPROC) (GLuint index, GLsizei n, const GLshort *v); typedef void (APIENTRY * glVertexAttribs1fvNVPROC) (GLuint index, GLsizei n, const GLfloat *v); typedef void (APIENTRY * glVertexAttribs1dvNVPROC) (GLuint index, GLsizei n, const GLdouble *v); typedef void (APIENTRY * glVertexAttribs2svNVPROC) (GLuint index, GLsizei n, const GLshort *v); typedef void (APIENTRY * glVertexAttribs2fvNVPROC) (GLuint index, GLsizei n, const GLfloat *v); typedef void (APIENTRY * glVertexAttribs2dvNVPROC) (GLuint index, GLsizei n, const GLdouble *v); typedef void (APIENTRY * glVertexAttribs3svNVPROC) (GLuint index, GLsizei n, const GLshort *v); typedef void (APIENTRY * glVertexAttribs3fvNVPROC) (GLuint index, GLsizei n, const GLfloat *v); typedef void (APIENTRY * glVertexAttribs3dvNVPROC) (GLuint index, GLsizei n, const GLdouble *v); typedef void (APIENTRY * glVertexAttribs4svNVPROC) (GLuint index, GLsizei n, const GLshort *v); typedef void (APIENTRY * glVertexAttribs4fvNVPROC) (GLuint index, GLsizei n, const GLfloat *v); typedef void (APIENTRY * glVertexAttribs4dvNVPROC) (GLuint index, GLsizei n, const GLdouble *v); typedef void (APIENTRY * glVertexAttribs4ubvNVPROC) (GLuint index, GLsizei n, const GLubyte *v); extern glBindProgramNVPROC glBindProgramNV; extern glDeleteProgramsNVPROC glDeleteProgramsNV; extern glExecuteProgramNVPROC glExecuteProgramNV; extern glGenProgramsNVPROC glGenProgramsNV; extern glAreProgramsResidentNVPROC glAreProgramsResidentNV; extern glRequestResidentProgramsNVPROC glRequestResidentProgramsNV; extern glGetProgramParameterfvNVPROC glGetProgramParameterfvNV; extern glGetProgramParameterdvNVPROC glGetProgramParameterdvNV; extern glGetProgramivNVPROC glGetProgramivNV; extern glGetProgramStringNVPROC glGetProgramStringNV; extern glGetTrackMatrixivNVPROC glGetTrackMatrixivNV; extern glGetVertexAttribdvNVPROC glGetVertexAttribdvNV; extern glGetVertexAttribfvNVPROC glGetVertexAttribfvNV; extern glGetVertexAttribivNVPROC glGetVertexAttribivNV; extern glGetVertexAttribPointervNVPROC glGetVertexAttribPointervNV; extern glIsProgramNVPROC glIsProgramNV; extern glLoadProgramNVPROC glLoadProgramNV; extern glProgramParameter4fNVPROC glProgramParameter4fNV; extern glProgramParameter4dNVPROC glProgramParameter4dNV; extern glProgramParameter4dvNVPROC glProgramParameter4dvNV; extern glProgramParameter4fvNVPROC glProgramParameter4fvNV; extern glProgramParameters4dvNVPROC glProgramParameters4dvNV; extern glProgramParameters4fvNVPROC glProgramParameters4fvNV; extern glTrackMatrixNVPROC glTrackMatrixNV; extern glVertexAttribPointerNVPROC glVertexAttribPointerNV; extern glVertexAttrib1sNVPROC glVertexAttrib1sNV; extern glVertexAttrib1fNVPROC glVertexAttrib1fNV; extern glVertexAttrib1dNVPROC glVertexAttrib1dNV; extern glVertexAttrib2sNVPROC glVertexAttrib2sNV; extern glVertexAttrib2fNVPROC glVertexAttrib2fNV; extern glVertexAttrib2dNVPROC glVertexAttrib2dNV; extern glVertexAttrib3sNVPROC glVertexAttrib3sNV; extern glVertexAttrib3fNVPROC glVertexAttrib3fNV; extern glVertexAttrib3dNVPROC glVertexAttrib3dNV; extern glVertexAttrib4sNVPROC glVertexAttrib4sNV; extern glVertexAttrib4fNVPROC glVertexAttrib4fNV; extern glVertexAttrib4dNVPROC glVertexAttrib4dNV; extern glVertexAttrib4ubNVPROC glVertexAttrib4ubNV; extern glVertexAttrib1svNVPROC glVertexAttrib1svNV; extern glVertexAttrib1fvNVPROC glVertexAttrib1fvNV; extern glVertexAttrib1dvNVPROC glVertexAttrib1dvNV; extern glVertexAttrib2svNVPROC glVertexAttrib2svNV; extern glVertexAttrib2fvNVPROC glVertexAttrib2fvNV; extern glVertexAttrib2dvNVPROC glVertexAttrib2dvNV; extern glVertexAttrib3svNVPROC glVertexAttrib3svNV; extern glVertexAttrib3fvNVPROC glVertexAttrib3fvNV; extern glVertexAttrib3dvNVPROC glVertexAttrib3dvNV; extern glVertexAttrib4svNVPROC glVertexAttrib4svNV; extern glVertexAttrib4fvNVPROC glVertexAttrib4fvNV; extern glVertexAttrib4dvNVPROC glVertexAttrib4dvNV; extern glVertexAttrib4ubvNVPROC glVertexAttrib4ubvNV; extern glVertexAttribs1svNVPROC glVertexAttribs1svNV; extern glVertexAttribs1fvNVPROC glVertexAttribs1fvNV; extern glVertexAttribs1dvNVPROC glVertexAttribs1dvNV; extern glVertexAttribs2svNVPROC glVertexAttribs2svNV; extern glVertexAttribs2fvNVPROC glVertexAttribs2fvNV; extern glVertexAttribs2dvNVPROC glVertexAttribs2dvNV; extern glVertexAttribs3svNVPROC glVertexAttribs3svNV; extern glVertexAttribs3fvNVPROC glVertexAttribs3fvNV; extern glVertexAttribs3dvNVPROC glVertexAttribs3dvNV; extern glVertexAttribs4svNVPROC glVertexAttribs4svNV; extern glVertexAttribs4fvNVPROC glVertexAttribs4fvNV; extern glVertexAttribs4dvNVPROC glVertexAttribs4dvNV; extern glVertexAttribs4ubvNVPROC glVertexAttribs4ubvNV; #endif /* GL_NV_vertex_program */ /*-------------------------------------------------------------------*/ /*------------NV_FENCE-----------------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_fence #define GL_NV_fence 1 #define GL_ALL_COMPLETED_NV 0x84F2 #define GL_FENCE_STATUS_NV 0x84F3 #define GL_FENCE_CONDITION_NV 0x84F4 typedef void (APIENTRY * glGenFencesNVPROC) (GLsizei n, GLuint *fences); typedef void (APIENTRY * glDeleteFencesNVPROC) (GLsizei n, const GLuint *fences); typedef void (APIENTRY * glSetFenceNVPROC) (GLuint fence, GLenum condition); typedef GLboolean (APIENTRY * glTestFenceNVPROC) (GLuint fence); typedef void (APIENTRY * glFinishFenceNVPROC) (GLuint fence); typedef GLboolean (APIENTRY * glIsFenceNVPROC) (GLuint fence); typedef void (APIENTRY * glGetFenceivNVPROC) (GLuint fence, GLenum pname, GLint *params); extern glGenFencesNVPROC glGenFencesNV; extern glDeleteFencesNVPROC glDeleteFencesNV; extern glSetFenceNVPROC glSetFenceNV; extern glTestFenceNVPROC glTestFenceNV; extern glFinishFenceNVPROC glFinishFenceNV; extern glIsFenceNVPROC glIsFenceNV; extern glGetFenceivNVPROC glGetFenceivNV; #endif /* GL_NV_fence */ /*-------------------------------------------------------------------*/ /*------------NV_TEXTURE_SHADER2-------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_texture_shader2 #define GL_NV_texture_shader2 #define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF #define GL_HILO_NV 0x86F4 #define GL_DSDT_NV 0x86F5 #define GL_DSDT_MAG_NV 0x86F6 #define GL_DSDT_MAG_VIB_NV 0x86F7 #define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA #define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB #define GL_SIGNED_RGBA_NV 0x86FB #define GL_SIGNED_RGBA8_NV 0x86FC #define GL_SIGNED_RGB_NV 0x86FE #define GL_SIGNED_RGB8_NV 0x86FF #define GL_SIGNED_LUMINANCE_NV 0x8701 #define GL_SIGNED_LUMINANCE8_NV 0x8702 #define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 #define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 #define GL_SIGNED_ALPHA_NV 0x8705 #define GL_SIGNED_ALPHA8_NV 0x8706 #define GL_SIGNED_INTENSITY_NV 0x8707 #define GL_SIGNED_INTENSITY8_NV 0x8708 #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D #define GL_HILO16_NV 0x86F8 #define GL_SIGNED_HILO_NV 0x86F9 #define GL_SIGNED_HILO16_NV 0x86FA #define GL_DSDT8_NV 0x8709 #define GL_DSDT8_MAG8_NV 0x870A #define GL_DSDT_MAG_INTENSITY_NV 0x86DC #define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B #endif /* GL_NV_texture_shader2 */ /*-------------------------------------------------------------------*/ /*------------NV_BLEND_SQUARE----------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_blend_square #define GL_NV_blend_square 1 #endif /* GL_NV_blend_square */ /*-------------------------------------------------------------------*/ /*------------NV_LIGHT_MAX_EXPONENT----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_light_max_exponent #define GL_NV_light_max_exponent 1 #define GL_MAX_SHININESS_NV 0x8504 #define GL_MAX_SPOT_EXPONENT_NV 0x8505 #endif /* GL_NV_light_max_exponent */ /*-------------------------------------------------------------------*/ /*------------NV_PACKED_DEPTH_STENCIL--------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_packed_depth_stencil #define GL_NV_packed_depth_stencil 1 #define GL_DEPTH_STENCIL_NV 0x84F9 #define GL_UNSIGNED_INT_24_8_NV 0x84FA #endif /* GL_NV_packed_depth_stencil */ /*-------------------------------------------------------------------*/ /*------------NV_REGISTER_COMBINERS2---------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_register_combiners2 #define GL_NV_register_combiners2 #define GL_PER_STAGE_CONSTANTS_NV 0x8535 typedef void (APIENTRY * glCombinerStageParameterfvNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); typedef void (APIENTRY * glGetCombinerStageParameterfvNVPROC) (GLenum stage, GLenum pname, GLfloat *params); extern glCombinerStageParameterfvNVPROC glCombinerStageParameterfvNV; extern glGetCombinerStageParameterfvNVPROC glGetCombinerStageParameterfvNV; #endif /* GL_NV_register_combiners2 */ /*-------------------------------------------------------------------*/ /*------------EXT_ABGR-----------------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_abgr #define GL_EXT_abgr 1 #define GL_ABGR_EXT 0x8000 #endif /* GL_EXT_abgr */ /*-------------------------------------------------------------------*/ /*------------EXT_STENCIL_WRAP---------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_stencil_wrap #define GL_EXT_stencil_wrap 1 #define GL_INCR_WRAP_EXT 0x8507 #define GL_DECR_WRAP_EXT 0x8508 #endif /* GL_EXT_stencil_wrap */ /*-------------------------------------------------------------------*/ /*------------EXT_TEXTURE_LOD_BIAS-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_texture_lod_bias #define GL_EXT_texture_lod_bias 1 #define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 #define GL_TEXTURE_LOD_BIAS_EXT 0x8501 #define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD #endif /* GL_EXT_texture_lod_bias */ /*-------------------------------------------------------------------*/ /*------------NV_EVALUATORS------------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_evaluators #define GL_NV_evaluators 1 #define GL_EVAL_2D_NV 0x86C0 #define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 #define GL_MAP_TESSELLATION_NV 0x86C2 #define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 #define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 #define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 #define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 #define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 #define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 #define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 #define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA #define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB #define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC #define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD #define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE #define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF #define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 #define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 #define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 #define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 #define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 #define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 #define GL_MAX_MAP_TESSELLATION_NV 0x86D6 #define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 typedef void (APIENTRY * glMapControlPointsNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); typedef void (APIENTRY * glMapParameterivNVPROC) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRY * glMapParameterfvNVPROC) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRY * glGetMapControlPointsNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); typedef void (APIENTRY * glGetMapParameterivNVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRY * glGetMapParameterfvNVPROC) (GLenum target, GLenum pname, GLfloat *params); typedef void (APIENTRY * glGetMapAttribParameterivNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); typedef void (APIENTRY * glGetMapAttribParameterfvNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRY * glEvalMapsNVPROC) (GLenum target, GLenum mode); extern glMapControlPointsNVPROC glMapControlPointsNV; extern glMapParameterivNVPROC glMapParameterivNV; extern glMapParameterfvNVPROC glMapParameterfvNV; extern glGetMapControlPointsNVPROC glGetMapControlPointsNV; extern glGetMapParameterivNVPROC glGetMapParameterivNV; extern glGetMapParameterfvNVPROC glGetMapParameterfvNV; extern glGetMapAttribParameterivNVPROC glGetMapAttribParameterivNV; extern glGetMapAttribParameterfvNVPROC glGetMapAttribParameterfvNV; extern glEvalMapsNVPROC glEvalMapsNV; #endif /* GL_NV_evaluators */ /*-------------------------------------------------------------------*/ /*------------NV_COPY_DEPTH_TO_COLOR---------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_copy_depth_to_color #define GL_NV_copy_depth_to_color 1 #define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E #define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F #endif /* GL_NV_copy_depth_to_color */ /*-------------------------------------------------------------------*/ /*------------ATI_PN_TRIANGLES---------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ATI_pn_triangles #define GL_ATI_pn_triangles 1 #define GL_PN_TRIANGLES_ATI 0x87F0 #define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 #define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 #define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 #define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 #define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 #define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 #define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 #define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 typedef void (APIENTRY * glPNTrianglesiATIPROC) (GLenum pname, GLint param); typedef void (APIENTRY * glPNTrianglesfATIPROC) (GLenum pname, GLfloat param); extern glPNTrianglesiATIPROC glPNTrianglesiATI; extern glPNTrianglesfATIPROC glPNTrianglesfATI; #endif /* GL_ATI_pn_triangles */ /*-------------------------------------------------------------------*/ /*------------ARB_POINT_PARAMETERS-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_point_parameters #define GL_ARB_point_parameters 1 #define GL_POINT_SIZE_MIN_ARB 0x8126 #define GL_POINT_SIZE_MAX_ARB 0x8127 #define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 #define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 typedef void (APIENTRY * glPointParameterfARBPROC) (GLenum pname, GLfloat param); typedef void (APIENTRY * glPointParameterfvARBPROC) (GLenum pname, GLfloat *params); extern glPointParameterfARBPROC glPointParameterfARB; extern glPointParameterfvARBPROC glPointParameterfvARB; #endif /* GL_ARB_point_parameters */ /*-------------------------------------------------------------------*/ /*------------ARB_TEXTURE_ENV_CROSSBAR-------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_texture_env_crossbar #define GL_ARB_texture_env_crossbar 1 #endif /*-------------------------------------------------------------------*/ /*------------ARB_VERTEX_BLEND---------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_vertex_blend #define GL_ARB_vertex_blend 1 #define GL_MAX_VERTEX_UNITS_ARB 0x86A4 #define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 #define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 #define GL_VERTEX_BLEND_ARB 0x86A7 #define GL_CURRENT_WEIGHT_ARB 0x86A8 #define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 #define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA #define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB #define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC #define GL_WEIGHT_ARRAY_ARB 0x86AD #define GL_MODELVIEW0_ARB 0x1700 #define GL_MODELVIEW1_ARB 0x850A #define GL_MODELVIEW2_ARB 0x8722 #define GL_MODELVIEW3_ARB 0x8723 #define GL_MODELVIEW4_ARB 0x8724 #define GL_MODELVIEW5_ARB 0x8725 #define GL_MODELVIEW6_ARB 0x8726 #define GL_MODELVIEW7_ARB 0x8727 #define GL_MODELVIEW8_ARB 0x8728 #define GL_MODELVIEW9_ARB 0x8729 #define GL_MODELVIEW10_ARB 0x872A #define GL_MODELVIEW11_ARB 0x872B #define GL_MODELVIEW12_ARB 0x872C #define GL_MODELVIEW13_ARB 0x872D #define GL_MODELVIEW14_ARB 0x872E #define GL_MODELVIEW15_ARB 0x872F #define GL_MODELVIEW16_ARB 0x8730 #define GL_MODELVIEW17_ARB 0x8731 #define GL_MODELVIEW18_ARB 0x8732 #define GL_MODELVIEW19_ARB 0x8733 #define GL_MODELVIEW20_ARB 0x8734 #define GL_MODELVIEW21_ARB 0x8735 #define GL_MODELVIEW22_ARB 0x8736 #define GL_MODELVIEW23_ARB 0x8737 #define GL_MODELVIEW24_ARB 0x8738 #define GL_MODELVIEW25_ARB 0x8739 #define GL_MODELVIEW26_ARB 0x873A #define GL_MODELVIEW27_ARB 0x873B #define GL_MODELVIEW28_ARB 0x873C #define GL_MODELVIEW29_ARB 0x873D #define GL_MODELVIEW30_ARB 0x873E #define GL_MODELVIEW31_ARB 0x873F typedef void (APIENTRY * glWeightbvARBPROC) (GLint size, GLbyte *weights); typedef void (APIENTRY * glWeightsvARBPROC) (GLint size, GLshort *weights); typedef void (APIENTRY * glWeightivARBPROC) (GLint size, GLint *weights); typedef void (APIENTRY * glWeightfvARBPROC) (GLint size, GLfloat *weights); typedef void (APIENTRY * glWeightdvARBPROC) (GLint size, GLdouble *weights); typedef void (APIENTRY * glWeightubvARBPROC) (GLint size, GLubyte *weights); typedef void (APIENTRY * glWeightusvARBPROC) (GLint size, GLushort *weights); typedef void (APIENTRY * glWeightuivARBPROC) (GLint size, GLuint *weights); typedef void (APIENTRY * glWeightPointerARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); typedef void (APIENTRY * glVertexBlendARBPROC) (GLint count); extern glWeightbvARBPROC glWeightbvARB; extern glWeightsvARBPROC glWeightsvARB; extern glWeightivARBPROC glWeightivARB; extern glWeightfvARBPROC glWeightfvARB; extern glWeightdvARBPROC glWeightdvARB; extern glWeightubvARBPROC glWeightubvARB; extern glWeightusvARBPROC glWeightusvARB; extern glWeightuivARBPROC glWeightuivARB; extern glWeightPointerARBPROC glWeightPointerARB; extern glVertexBlendARBPROC glVertexBlendARB; #endif /* GL_ARB_vertex_blend */ /*-------------------------------------------------------------------*/ /*------------EXT_MULTI_DRAW_ARRAYS----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_multi_draw_arrays #define GL_EXT_multi_draw_arrays 1 typedef void (APIENTRY * glMultiDrawArraysEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); typedef void (APIENTRY * glMultiDrawElementsEXTPROC) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount); extern glMultiDrawArraysEXTPROC glMultiDrawArraysEXT; extern glMultiDrawElementsEXTPROC glMultiDrawElementsEXT; #endif /* GL_EXT_multi_draw_arrays */ /*-------------------------------------------------------------------*/ /*------------ARB_MATRIX_PALETTE-------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_matrix_palette #define GL_ARB_matrix_palette 1 #define GL_MATRIX_PALETTE_ARB 0x8840 #define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 #define GL_MAX_PALETTE_MATRICES_ARB 0x8842 #define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 #define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 #define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 #define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 #define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 #define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 #define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 typedef void (APIENTRY * glCurrentPaletteMatrixARBPROC) (GLint index); typedef void (APIENTRY * glMatrixIndexubvARBPROC) (GLint size, GLubyte *indices); typedef void (APIENTRY * glMatrixIndexusvARBPROC) (GLint size, GLushort *indices); typedef void (APIENTRY * glMatrixIndexuivARBPROC) (GLint size, GLuint *indices); typedef void (APIENTRY * glMatrixIndexPointerARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); extern glCurrentPaletteMatrixARBPROC glCurrentPaletteMatrixARB; extern glMatrixIndexubvARBPROC glMatrixIndexubvARB; extern glMatrixIndexusvARBPROC glMatrixIndexusvARB; extern glMatrixIndexuivARBPROC glMatrixIndexuivARB; extern glMatrixIndexPointerARBPROC glMatrixIndexPointerARB; #endif /* GL_ARB_matrix_palette */ /*-------------------------------------------------------------------*/ /*------------EXT_VERTEX_SHADER--------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_vertex_shader #define GL_EXT_vertex_shader 1 #define GL_VERTEX_SHADER_EXT 0x8780 #define GL_VERTEX_SHADER_BINDING_EXT 0x8781 #define GL_OP_INDEX_EXT 0x8782 #define GL_OP_NEGATE_EXT 0x8783 #define GL_OP_DOT3_EXT 0x8784 #define GL_OP_DOT4_EXT 0x8785 #define GL_OP_MUL_EXT 0x8786 #define GL_OP_ADD_EXT 0x8787 #define GL_OP_MADD_EXT 0x8788 #define GL_OP_FRAC_EXT 0x8789 #define GL_OP_MAX_EXT 0x878A #define GL_OP_MIN_EXT 0x878B #define GL_OP_SET_GE_EXT 0x878C #define GL_OP_SET_LT_EXT 0x878D #define GL_OP_CLAMP_EXT 0x878E #define GL_OP_FLOOR_EXT 0x878F #define GL_OP_ROUND_EXT 0x8790 #define GL_OP_EXP_BASE_2_EXT 0x8791 #define GL_OP_LOG_BASE_2_EXT 0x8792 #define GL_OP_POWER_EXT 0x8793 #define GL_OP_RECIP_EXT 0x8794 #define GL_OP_RECIP_SQRT_EXT 0x8795 #define GL_OP_SUB_EXT 0x8796 #define GL_OP_CROSS_PRODUCT_EXT 0x8797 #define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 #define GL_OP_MOV_EXT 0x8799 #define GL_OUTPUT_VERTEX_EXT 0x879A #define GL_OUTPUT_COLOR0_EXT 0x879B #define GL_OUTPUT_COLOR1_EXT 0x879C #define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D #define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E #define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F #define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 #define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 #define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 #define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 #define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 #define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 #define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 #define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 #define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 #define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 #define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA #define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB #define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC #define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD #define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE #define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF #define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 #define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 #define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 #define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 #define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 #define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 #define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 #define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 #define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 #define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 #define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA #define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB #define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC #define GL_OUTPUT_FOG_EXT 0x87BD #define GL_SCALAR_EXT 0x87BE #define GL_VECTOR_EXT 0x87BF #define GL_MATRIX_EXT 0x87C0 #define GL_VARIANT_EXT 0x87C1 #define GL_INVARIANT_EXT 0x87C2 #define GL_LOCAL_CONSTANT_EXT 0x87C3 #define GL_LOCAL_EXT 0x87C4 #define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 #define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 #define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 #define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 #define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA #define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB #define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD #define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE #define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF #define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 #define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 #define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 #define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 #define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 #define GL_X_EXT 0x87D5 #define GL_Y_EXT 0x87D6 #define GL_Z_EXT 0x87D7 #define GL_W_EXT 0x87D8 #define GL_NEGATIVE_X_EXT 0x87D9 #define GL_NEGATIVE_Y_EXT 0x87DA #define GL_NEGATIVE_Z_EXT 0x87DB #define GL_NEGATIVE_W_EXT 0x87DC #define GL_ZERO_EXT 0x87DD #define GL_ONE_EXT 0x87DE #define GL_NEGATIVE_ONE_EXT 0x87DF #define GL_NORMALIZED_RANGE_EXT 0x87E0 #define GL_FULL_RANGE_EXT 0x87E1 #define GL_CURRENT_VERTEX_EXT 0x87E2 #define GL_MVP_MATRIX_EXT 0x87E3 #define GL_VARIANT_VALUE_EXT 0x87E4 #define GL_VARIANT_DATATYPE_EXT 0x87E5 #define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 #define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 #define GL_VARIANT_ARRAY_EXT 0x87E8 #define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 #define GL_INVARIANT_VALUE_EXT 0x87EA #define GL_INVARIANT_DATATYPE_EXT 0x87EB #define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC #define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED typedef void (APIENTRY * glBeginVertexShaderEXTPROC) (); typedef void (APIENTRY * glEndVertexShaderEXTPROC) (); typedef void (APIENTRY * glBindVertexShaderEXTPROC) (GLuint id); typedef GLuint (APIENTRY * glGenVertexShadersEXTPROC) (GLuint range); typedef void (APIENTRY * glDeleteVertexShaderEXTPROC) (GLuint id); typedef void (APIENTRY * glShaderOp1EXTPROC) (GLenum op, GLuint res, GLuint arg1); typedef void (APIENTRY * glShaderOp2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); typedef void (APIENTRY * glShaderOp3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); typedef void (APIENTRY * glSwizzleEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); typedef void (APIENTRY * glWriteMaskEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); typedef void (APIENTRY * glInsertComponentEXTPROC) (GLuint res, GLuint src, GLuint num); typedef void (APIENTRY * glExtractComponentEXTPROC) (GLuint res, GLuint src, GLuint num); typedef GLuint (APIENTRY * glGenSymbolsEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); typedef void (APIENTRY * glSetInvariantEXTPROC) (GLuint id, GLenum type, GLvoid *addr); typedef void (APIENTRY * glSetLocalConstantEXTPROC) (GLuint id, GLenum type, GLvoid *addr); typedef void (APIENTRY * glVariantbvEXTPROC) (GLuint id, GLbyte *addr); typedef void (APIENTRY * glVariantsvEXTPROC) (GLuint id, GLshort *addr); typedef void (APIENTRY * glVariantivEXTPROC) (GLuint id, GLint *addr); typedef void (APIENTRY * glVariantfvEXTPROC) (GLuint id, GLfloat *addr); typedef void (APIENTRY * glVariantdvEXTPROC) (GLuint id, GLdouble *addr); typedef void (APIENTRY * glVariantubvEXTPROC) (GLuint id, GLubyte *addr); typedef void (APIENTRY * glVariantusvEXTPROC) (GLuint id, GLushort *addr); typedef void (APIENTRY * glVariantuivEXTPROC) (GLuint id, GLuint *addr); typedef void (APIENTRY * glVariantPointerEXTPROC) (GLuint id, GLenum type, GLuint stride, GLvoid *addr); typedef void (APIENTRY * glEnableVariantClientStateEXTPROC) (GLuint id); typedef void (APIENTRY * glDisableVariantClientStateEXTPROC) (GLuint id); typedef GLuint (APIENTRY * glBindLightParameterEXTPROC) (GLenum light, GLenum value); typedef GLuint (APIENTRY * glBindMaterialParameterEXTPROC) (GLenum face, GLenum value); typedef GLuint (APIENTRY * glBindTexGenParameterEXTPROC) (GLenum unit, GLenum coord, GLenum value); typedef GLuint (APIENTRY * glBindTextureUnitParameterEXTPROC) (GLenum unit, GLenum value); typedef GLuint (APIENTRY * glBindParameterEXTPROC) (GLenum value); typedef GLboolean (APIENTRY * glIsVariantEnabledEXTPROC) (GLuint id, GLenum cap); typedef void (APIENTRY * glGetVariantBooleanvEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (APIENTRY * glGetVariantIntegervEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (APIENTRY * glGetVariantFloatvEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (APIENTRY * glGetVariantPointervEXTPROC) (GLuint id, GLenum value, GLvoid **data); typedef void (APIENTRY * glGetInvariantBooleanvEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (APIENTRY * glGetInvariantIntegervEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (APIENTRY * glGetInvariantFloatvEXTPROC) (GLuint id, GLenum value, GLfloat *data); typedef void (APIENTRY * glGetLocalConstantBooleanvEXTPROC) (GLuint id, GLenum value, GLboolean *data); typedef void (APIENTRY * glGetLocalConstantIntegervEXTPROC) (GLuint id, GLenum value, GLint *data); typedef void (APIENTRY * glGetLocalConstantFloatvEXTPROC) (GLuint id, GLenum value, GLfloat *data); extern glBeginVertexShaderEXTPROC glBeginVertexShaderEXT; extern glEndVertexShaderEXTPROC glEndVertexShaderEXT; extern glBindVertexShaderEXTPROC glBindVertexShaderEXT; extern glGenVertexShadersEXTPROC glGenVertexShadersEXT; extern glDeleteVertexShaderEXTPROC glDeleteVertexShaderEXT; extern glShaderOp1EXTPROC glShaderOp1EXT; extern glShaderOp2EXTPROC glShaderOp2EXT; extern glShaderOp3EXTPROC glShaderOp3EXT; extern glSwizzleEXTPROC glSwizzleEXT; extern glWriteMaskEXTPROC glWriteMaskEXT; extern glInsertComponentEXTPROC glInsertComponentEXT; extern glExtractComponentEXTPROC glExtractComponentEXT; extern glGenSymbolsEXTPROC glGenSymbolsEXT; extern glSetInvariantEXTPROC glSetInvariantEXT; extern glSetLocalConstantEXTPROC glSetLocalConstantEXT; extern glVariantbvEXTPROC glVariantbvEXT; extern glVariantsvEXTPROC glVariantsvEXT; extern glVariantivEXTPROC glVariantivEXT; extern glVariantfvEXTPROC glVariantfvEXT; extern glVariantdvEXTPROC glVariantdvEXT; extern glVariantubvEXTPROC glVariantubvEXT; extern glVariantusvEXTPROC glVariantusvEXT; extern glVariantuivEXTPROC glVariantuivEXT; extern glVariantPointerEXTPROC glVariantPointerEXT; extern glEnableVariantClientStateEXTPROC glEnableVariantClientStateEXT; extern glDisableVariantClientStateEXTPROC glDisableVariantClientStateEXT; extern glBindLightParameterEXTPROC glBindLightParameterEXT; extern glBindMaterialParameterEXTPROC glBindMaterialParameterEXT; extern glBindTexGenParameterEXTPROC glBindTexGenParameterEXT; extern glBindTextureUnitParameterEXTPROC glBindTextureUnitParameterEXT; extern glBindParameterEXTPROC glBindParameterEXT; extern glIsVariantEnabledEXTPROC glIsVariantEnabledEXT; extern glGetVariantBooleanvEXTPROC glGetVariantBooleanvEXT; extern glGetVariantIntegervEXTPROC glGetVariantIntegervEXT; extern glGetVariantFloatvEXTPROC glGetVariantFloatvEXT; extern glGetVariantPointervEXTPROC glGetVariantPointervEXT; extern glGetInvariantBooleanvEXTPROC glGetInvariantBooleanvEXT; extern glGetInvariantIntegervEXTPROC glGetInvariantIntegervEXT; extern glGetInvariantFloatvEXTPROC glGetInvariantFloatvEXT; extern glGetLocalConstantBooleanvEXTPROC glGetLocalConstantBooleanvEXT; extern glGetLocalConstantIntegervEXTPROC glGetLocalConstantIntegervEXT; extern glGetLocalConstantFloatvEXTPROC glGetLocalConstantFloatvEXT; #endif /* GL_EXT_vertex_shader */ /*-------------------------------------------------------------------*/ /*------------ATI_ENVMAP_BUMPMAP-------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ATI_envmap_bumpmap #define GL_ATI_envmap_bumpmap 1 #define GL_BUMP_ROT_MATRIX_ATI 0x8775 #define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 #define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 #define GL_BUMP_TEX_UNITS_ATI 0x8778 #define GL_DUDV_ATI 0x8779 #define GL_DU8DV8_ATI 0x877A #define GL_BUMP_ENVMAP_ATI 0x877B #define GL_BUMP_TARGET_ATI 0x877C typedef void (APIENTRY * glTexBumpParameterivATIPROC) (GLenum pname, GLint *param); typedef void (APIENTRY * glTexBumpParameterfvATIPROC) (GLenum pname, GLfloat *param); typedef void (APIENTRY * glGetTexBumpParameterivATIPROC) (GLenum pname, GLint *param); typedef void (APIENTRY * glGetTexBumpParameterfvATIPROC) (GLenum pname, GLfloat *param); extern glTexBumpParameterivATIPROC glTexBumpParameterivATI; extern glTexBumpParameterfvATIPROC glTexBumpParameterfvATI; extern glGetTexBumpParameterivATIPROC glGetTexBumpParameterivATI; extern glGetTexBumpParameterfvATIPROC glGetTexBumpParameterfvATI; #endif /* GL_ATI_envmap_bumpmap */ /*-------------------------------------------------------------------*/ /*------------ATI_FRAGMENT_SHADER------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ATI_fragment_shader #define GL_ATI_fragment_shader 1 #define GL_FRAGMENT_SHADER_ATI 0x8920 #define GL_REG_0_ATI 0x8921 #define GL_REG_1_ATI 0x8922 #define GL_REG_2_ATI 0x8923 #define GL_REG_3_ATI 0x8924 #define GL_REG_4_ATI 0x8925 #define GL_REG_5_ATI 0x8926 #define GL_REG_6_ATI 0x8927 #define GL_REG_7_ATI 0x8928 #define GL_REG_8_ATI 0x8929 #define GL_REG_9_ATI 0x892A #define GL_REG_10_ATI 0x892B #define GL_REG_11_ATI 0x892C #define GL_REG_12_ATI 0x892D #define GL_REG_13_ATI 0x892E #define GL_REG_14_ATI 0x892F #define GL_REG_15_ATI 0x8930 #define GL_REG_16_ATI 0x8931 #define GL_REG_17_ATI 0x8932 #define GL_REG_18_ATI 0x8933 #define GL_REG_19_ATI 0x8934 #define GL_REG_20_ATI 0x8935 #define GL_REG_21_ATI 0x8936 #define GL_REG_22_ATI 0x8937 #define GL_REG_23_ATI 0x8938 #define GL_REG_24_ATI 0x8939 #define GL_REG_25_ATI 0x893A #define GL_REG_26_ATI 0x893B #define GL_REG_27_ATI 0x893C #define GL_REG_28_ATI 0x893D #define GL_REG_29_ATI 0x893E #define GL_REG_30_ATI 0x893F #define GL_REG_31_ATI 0x8940 #define GL_CON_0_ATI 0x8941 #define GL_CON_1_ATI 0x8942 #define GL_CON_2_ATI 0x8943 #define GL_CON_3_ATI 0x8944 #define GL_CON_4_ATI 0x8945 #define GL_CON_5_ATI 0x8946 #define GL_CON_6_ATI 0x8947 #define GL_CON_7_ATI 0x8948 #define GL_CON_8_ATI 0x8949 #define GL_CON_9_ATI 0x894A #define GL_CON_10_ATI 0x894B #define GL_CON_11_ATI 0x894C #define GL_CON_12_ATI 0x894D #define GL_CON_13_ATI 0x894E #define GL_CON_14_ATI 0x894F #define GL_CON_15_ATI 0x8950 #define GL_CON_16_ATI 0x8951 #define GL_CON_17_ATI 0x8952 #define GL_CON_18_ATI 0x8953 #define GL_CON_19_ATI 0x8954 #define GL_CON_20_ATI 0x8955 #define GL_CON_21_ATI 0x8956 #define GL_CON_22_ATI 0x8957 #define GL_CON_23_ATI 0x8958 #define GL_CON_24_ATI 0x8959 #define GL_CON_25_ATI 0x895A #define GL_CON_26_ATI 0x895B #define GL_CON_27_ATI 0x895C #define GL_CON_28_ATI 0x895D #define GL_CON_29_ATI 0x895E #define GL_CON_30_ATI 0x895F #define GL_CON_31_ATI 0x8960 #define GL_MOV_ATI 0x8961 #define GL_ADD_ATI 0x8963 #define GL_MUL_ATI 0x8964 #define GL_SUB_ATI 0x8965 #define GL_DOT3_ATI 0x8966 #define GL_DOT4_ATI 0x8967 #define GL_MAD_ATI 0x8968 #define GL_LERP_ATI 0x8969 #define GL_CND_ATI 0x896A #define GL_CND0_ATI 0x896B #define GL_DOT2_ADD_ATI 0x896C #define GL_SECONDARY_INTERPOLATOR_ATI 0x896D #define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E #define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F #define GL_NUM_PASSES_ATI 0x8970 #define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 #define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 #define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 #define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 #define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 #define GL_SWIZZLE_STR_ATI 0x8976 #define GL_SWIZZLE_STQ_ATI 0x8977 #define GL_SWIZZLE_STR_DR_ATI 0x8978 #define GL_SWIZZLE_STQ_DQ_ATI 0x8979 #define GL_SWIZZLE_STRQ_ATI 0x897A #define GL_SWIZZLE_STRQ_DQ_ATI 0x897B #define GL_RED_BIT_ATI 0x00000001 #define GL_GREEN_BIT_ATI 0x00000002 #define GL_BLUE_BIT_ATI 0x00000004 #define GL_2X_BIT_ATI 0x00000001 #define GL_4X_BIT_ATI 0x00000002 #define GL_8X_BIT_ATI 0x00000004 #define GL_HALF_BIT_ATI 0x00000008 #define GL_QUARTER_BIT_ATI 0x00000010 #define GL_EIGHTH_BIT_ATI 0x00000020 #define GL_SATURATE_BIT_ATI 0x00000040 #define GL_COMP_BIT_ATI 0x00000002 #define GL_NEGATE_BIT_ATI 0x00000004 #define GL_BIAS_BIT_ATI 0x00000008 typedef GLuint (APIENTRY * glGenFragmentShadersATIPROC) (GLuint range); typedef void (APIENTRY * glBindFragmentShaderATIPROC) (GLuint id); typedef void (APIENTRY * glDeleteFragmentShaderATIPROC) (GLuint id); typedef void (APIENTRY * glBeginFragmentShaderATIPROC) (GLvoid); typedef void (APIENTRY * glEndFragmentShaderATIPROC) (GLvoid); typedef void (APIENTRY * glPassTexCoordATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); typedef void (APIENTRY * glSampleMapATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); typedef void (APIENTRY * glColorFragmentOp1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (APIENTRY * glColorFragmentOp2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (APIENTRY * glColorFragmentOp3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (APIENTRY * glAlphaFragmentOp1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); typedef void (APIENTRY * glAlphaFragmentOp2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); typedef void (APIENTRY * glAlphaFragmentOp3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); typedef void (APIENTRY * glSetFragmentShaderConstantATIPROC) (GLuint dst, const GLfloat *value); extern glGenFragmentShadersATIPROC glGenFragmentShadersATI; extern glBindFragmentShaderATIPROC glBindFragmentShaderATI; extern glDeleteFragmentShaderATIPROC glDeleteFragmentShaderATI; extern glBeginFragmentShaderATIPROC glBeginFragmentShaderATI; extern glEndFragmentShaderATIPROC glEndFragmentShaderATI; extern glPassTexCoordATIPROC glPassTexCoordATI; extern glSampleMapATIPROC glSampleMapATI; extern glColorFragmentOp1ATIPROC glColorFragmentOp1ATI; extern glColorFragmentOp2ATIPROC glColorFragmentOp2ATI; extern glColorFragmentOp3ATIPROC glColorFragmentOp3ATI; extern glAlphaFragmentOp1ATIPROC glAlphaFragmentOp1ATI; extern glAlphaFragmentOp2ATIPROC glAlphaFragmentOp2ATI; extern glAlphaFragmentOp3ATIPROC glAlphaFragmentOp3ATI; extern glSetFragmentShaderConstantATIPROC glSetFragmentShaderConstantATI; #endif /* GL_ATI_fragment_shader */ /*-------------------------------------------------------------------*/ /*------------ATI_TEXTURE_MIRROR_ONCE--------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ATI_texture_mirror_once #define GL_ATI_texture_mirror_once 1 #define GL_MIRROR_CLAMP_ATI 0x8742 #define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 #endif /*-------------------------------------------------------------------*/ /*------------ATI_ELEMENT_ARRAY--------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ATI_element_array #define GL_ATI_element_array 1 #define GL_ELEMENT_ARRAY_ATI 0x8768 #define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 #define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A typedef void (APIENTRY * glElementPointerATIPROC) (GLenum type, const GLvoid *pointer); typedef void (APIENTRY * glDrawElementArrayATIPROC) (GLenum mode, GLsizei count); typedef void (APIENTRY * glDrawRangeElementArrayATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); extern glElementPointerATIPROC glElementPointerATI; extern glDrawElementArrayATIPROC glDrawElementArrayATI; extern glDrawRangeElementArrayATIPROC glDrawRangeElementArrayATI; #endif /* GL_ATI_element_array */ /*-------------------------------------------------------------------*/ /*------------ATI_VERTEX_STREAMS-------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ATI_vertex_streams #define GL_ATI_vertex_streams 1 #define GL_MAX_VERTEX_STREAMS_ATI 0x876B #define GL_VERTEX_SOURCE_ATI 0x876C #define GL_VERTEX_STREAM0_ATI 0x876D #define GL_VERTEX_STREAM1_ATI 0x876E #define GL_VERTEX_STREAM2_ATI 0x876F #define GL_VERTEX_STREAM3_ATI 0x8770 #define GL_VERTEX_STREAM4_ATI 0x8771 #define GL_VERTEX_STREAM5_ATI 0x8772 #define GL_VERTEX_STREAM6_ATI 0x8773 #define GL_VERTEX_STREAM7_ATI 0x8774 typedef void (APIENTRY * glClientActiveVertexStreamATIPROC) (GLenum stream); typedef void (APIENTRY * glVertexBlendEnviATIPROC) (GLenum pname, GLint param); typedef void (APIENTRY * glVertexBlendEnvfATIPROC) (GLenum pname, GLfloat param); typedef void (APIENTRY * glVertexStream2sATIPROC) (GLenum stream, GLshort x, GLshort y); typedef void (APIENTRY * glVertexStream2svATIPROC) (GLenum stream, const GLshort *v); typedef void (APIENTRY * glVertexStream2iATIPROC) (GLenum stream, GLint x, GLint y); typedef void (APIENTRY * glVertexStream2ivATIPROC) (GLenum stream, const GLint *v); typedef void (APIENTRY * glVertexStream2fATIPROC) (GLenum stream, GLfloat x, GLfloat y); typedef void (APIENTRY * glVertexStream2fvATIPROC) (GLenum stream, const GLfloat *v); typedef void (APIENTRY * glVertexStream2dATIPROC) (GLenum stream, GLdouble x, GLdouble y); typedef void (APIENTRY * glVertexStream2dvATIPROC) (GLenum stream, const GLdouble *v); typedef void (APIENTRY * glVertexStream3sATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); typedef void (APIENTRY * glVertexStream3svATIPROC) (GLenum stream, const GLshort *v); typedef void (APIENTRY * glVertexStream3iATIPROC) (GLenum stream, GLint x, GLint y, GLint z); typedef void (APIENTRY * glVertexStream3ivATIPROC) (GLenum stream, const GLint *v); typedef void (APIENTRY * glVertexStream3fATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY * glVertexStream3fvATIPROC) (GLenum stream, const GLfloat *v); typedef void (APIENTRY * glVertexStream3dATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRY * glVertexStream3dvATIPROC) (GLenum stream, const GLdouble *v); typedef void (APIENTRY * glVertexStream4sATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRY * glVertexStream4svATIPROC) (GLenum stream, const GLshort *v); typedef void (APIENTRY * glVertexStream4iATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); typedef void (APIENTRY * glVertexStream4ivATIPROC) (GLenum stream, const GLint *v); typedef void (APIENTRY * glVertexStream4fATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRY * glVertexStream4fvATIPROC) (GLenum stream, const GLfloat *v); typedef void (APIENTRY * glVertexStream4dATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRY * glVertexStream4dvATIPROC) (GLenum stream, const GLdouble *v); typedef void (APIENTRY * glNormalStream3bATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); typedef void (APIENTRY * glNormalStream3bvATIPROC) (GLenum stream, const GLbyte *v); typedef void (APIENTRY * glNormalStream3sATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); typedef void (APIENTRY * glNormalStream3svATIPROC) (GLenum stream, const GLshort *v); typedef void (APIENTRY * glNormalStream3iATIPROC) (GLenum stream, GLint x, GLint y, GLint z); typedef void (APIENTRY * glNormalStream3ivATIPROC) (GLenum stream, const GLint *v); typedef void (APIENTRY * glNormalStream3fATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY * glNormalStream3fvATIPROC) (GLenum stream, const GLfloat *v); typedef void (APIENTRY * glNormalStream3dATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRY * glNormalStream3dvATIPROC) (GLenum stream, const GLdouble *v); extern glClientActiveVertexStreamATIPROC glClientActiveVertexStreamATI; extern glVertexBlendEnviATIPROC glVertexBlendEnviATI; extern glVertexBlendEnvfATIPROC glVertexBlendEnvfATI; extern glVertexStream2sATIPROC glVertexStream2sATI; extern glVertexStream2svATIPROC glVertexStream2svATI; extern glVertexStream2iATIPROC glVertexStream2iATI; extern glVertexStream2ivATIPROC glVertexStream2ivATI; extern glVertexStream2fATIPROC glVertexStream2fATI; extern glVertexStream2fvATIPROC glVertexStream2fvATI; extern glVertexStream2dATIPROC glVertexStream2dATI; extern glVertexStream2dvATIPROC glVertexStream2dvATI; extern glVertexStream3sATIPROC glVertexStream3sATI; extern glVertexStream3svATIPROC glVertexStream3svATI; extern glVertexStream3iATIPROC glVertexStream3iATI; extern glVertexStream3ivATIPROC glVertexStream3ivATI; extern glVertexStream3fATIPROC glVertexStream3fATI; extern glVertexStream3fvATIPROC glVertexStream3fvATI; extern glVertexStream3dATIPROC glVertexStream3dATI; extern glVertexStream3dvATIPROC glVertexStream3dvATI; extern glVertexStream4sATIPROC glVertexStream4sATI; extern glVertexStream4svATIPROC glVertexStream4svATI; extern glVertexStream4iATIPROC glVertexStream4iATI; extern glVertexStream4ivATIPROC glVertexStream4ivATI; extern glVertexStream4fATIPROC glVertexStream4fATI; extern glVertexStream4fvATIPROC glVertexStream4fvATI; extern glVertexStream4dATIPROC glVertexStream4dATI; extern glVertexStream4dvATIPROC glVertexStream4dvATI; extern glNormalStream3bATIPROC glNormalStream3bATI; extern glNormalStream3bvATIPROC glNormalStream3bvATI; extern glNormalStream3sATIPROC glNormalStream3sATI; extern glNormalStream3svATIPROC glNormalStream3svATI; extern glNormalStream3iATIPROC glNormalStream3iATI; extern glNormalStream3ivATIPROC glNormalStream3ivATI; extern glNormalStream3fATIPROC glNormalStream3fATI; extern glNormalStream3fvATIPROC glNormalStream3fvATI; extern glNormalStream3dATIPROC glNormalStream3dATI; extern glNormalStream3dvATIPROC glNormalStream3dvATI; #endif /* GL_ATI_vertex_streams */ /*-------------------------------------------------------------------*/ /*------------ATI_VERTEX_ARRAY_OBJECT--------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ATI_vertex_array_object #define GL_ATI_vertex_array_object 1 #define GL_STATIC_ATI 0x8760 #define GL_DYNAMIC_ATI 0x8761 #define GL_PRESERVE_ATI 0x8762 #define GL_DISCARD_ATI 0x8763 #define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 #define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 #define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 #define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 typedef GLuint (APIENTRY * glNewObjectBufferATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); typedef GLboolean (APIENTRY * glIsObjectBufferATIPROC) (GLuint buffer); typedef void (APIENTRY * glUpdateObjectBufferATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); typedef void (APIENTRY * glGetObjectBufferfvATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); typedef void (APIENTRY * glGetObjectBufferivATIPROC) (GLuint buffer, GLenum pname, GLint *params); typedef void (APIENTRY * glFreeObjectBufferATIPROC) (GLuint buffer); typedef void (APIENTRY * glArrayObjectATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); typedef void (APIENTRY * glGetArrayObjectfvATIPROC) (GLenum array, GLenum pname, GLfloat *params); typedef void (APIENTRY * glGetArrayObjectivATIPROC) (GLenum array, GLenum pname, GLint *params); typedef void (APIENTRY * glVariantArrayObjectATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); typedef void (APIENTRY * glGetVariantArrayObjectfvATIPROC) (GLuint id, GLenum pname, GLfloat *params); typedef void (APIENTRY * glGetVariantArrayObjectivATIPROC) (GLuint id, GLenum pname, GLint *params); extern glNewObjectBufferATIPROC glNewObjectBufferATI; extern glIsObjectBufferATIPROC glIsObjectBufferATI; extern glUpdateObjectBufferATIPROC glUpdateObjectBufferATI; extern glGetObjectBufferfvATIPROC glGetObjectBufferfvATI; extern glGetObjectBufferivATIPROC glGetObjectBufferivATI; extern glFreeObjectBufferATIPROC glFreeObjectBufferATI; extern glArrayObjectATIPROC glArrayObjectATI; extern glGetArrayObjectfvATIPROC glGetArrayObjectfvATI; extern glGetArrayObjectivATIPROC glGetArrayObjectivATI; extern glVariantArrayObjectATIPROC glVariantArrayObjectATI; extern glGetVariantArrayObjectfvATIPROC glGetVariantArrayObjectfvATI; extern glGetVariantArrayObjectivATIPROC glGetVariantArrayObjectivATI; #endif /* GL_ATI_vertex_array_object */ /*-------------------------------------------------------------------*/ /*------------HP_OCCLUSION_TEST--------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_HP_occlusion_test #define GL_HP_occlusion_test 1 #define GL_OCCLUSION_TEST_HP 0x8165; #define GL_OCCLUSION_TEST_RESULT_HP 0x8166; #endif /* GL_HP_occlusion_test */ /*-------------------------------------------------------------------*/ /*------------ATIX_POINT_SPRITES-------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ATIX_point_sprites #define GL_ATIX_point_sprites 1 #define GL_TEXTURE_POINT_MODE_ATIX 0x60b0 #define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60b1 #define GL_TEXTURE_POINT_SPRITE_ATIX 0x60b2 #define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60b3 #define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60b4 #define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60b5 #endif /* GL_ATIX_point_sprites */ /*-------------------------------------------------------------------*/ /*------------ATIX_TEXTURE_ENV_ROUTE---------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ATIX_texture_env_route #define GL_ATIX_texture_env_route 1 #define GL_SECONDARY_COLOR_ATIX 0x8747 #define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 #define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 #endif /* GL_ATIX_texture_env_route */ /*-------------------------------------------------------------------*/ /*------------NV_DEPTH_CLAMP-----------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_depth_clamp #define GL_NV_depth_clamp 1 #define GL_DEPTH_CLAMP_NV 0x864F #endif /* GL_NV_depth_clamp */ /*-------------------------------------------------------------------*/ /*------------NV_OCCLUSION_QUERY-------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_occlusion_query #define GL_NV_occlusion_query 1 #ifndef GL_HP_occlusion_test #define GL_OCCLUSION_TEST_HP 0x8165 #define GL_OCCLUSION_TEST_RESULT_HP 0x8166 #endif /* GL_HP_occlusion_test */ #define GL_PIXEL_COUNTER_BITS_NV 0x8864 #define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 #define GL_PIXEL_COUNT_NV 0x8866 #define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 typedef void (APIENTRY * glGenOcclusionQueriesNVPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRY * glDeleteOcclusionQueriesNVPROC) (GLsizei n, const GLuint *ids); typedef GLboolean (APIENTRY * glIsOcclusionQueryNVPROC) (GLuint id); typedef void (APIENTRY * glBeginOcclusionQueryNVPROC) (GLuint id); typedef void (APIENTRY * glEndOcclusionQueryNVPROC) (void); typedef void (APIENTRY * glGetOcclusionQueryivNVPROC) (GLuint id, GLenum pname, GLint *params); typedef void (APIENTRY * glGetOcclusionQueryuivNVPROC) (GLuint id, GLenum pname, GLuint *params); extern glGenOcclusionQueriesNVPROC glGenOcclusionQueriesNV; extern glDeleteOcclusionQueriesNVPROC glDeleteOcclusionQueriesNV; extern glIsOcclusionQueryNVPROC glIsOcclusionQueryNV; extern glBeginOcclusionQueryNVPROC glBeginOcclusionQueryNV; extern glEndOcclusionQueryNVPROC glEndOcclusionQueryNV; extern glGetOcclusionQueryivNVPROC glGetOcclusionQueryivNV; extern glGetOcclusionQueryuivNVPROC glGetOcclusionQueryuivNV; #endif /* GL_NV_occlusion_query */ /*-------------------------------------------------------------------*/ /*------------NV_POINT_SPRITE----------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_point_sprite #define GL_NV_point_sprite 1 #define GL_POINT_SPRITE_NV 0x8861 #define GL_COORD_REPLACE_NV 0x8862 #define GL_POINT_SPRITE_R_MODE_NV 0x8863 typedef void (APIENTRY * glPointParameteriNVPROC) (GLenum pname, GLint param); typedef void (APIENTRY * glPointParameterivNVPROC) (GLenum pname, const GLint *params); extern glPointParameteriNVPROC glPointParameteriNV; extern glPointParameterivNVPROC glPointParameterivNV; #endif /* GL_NV_point_sprite */ /*-------------------------------------------------------------------*/ /*------------NV_TEXTURE_SHADER3-------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_texture_shader3 #define GL_NV_texture_shader3 1 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 #define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 #define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 #define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 #define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 #define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 #define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 #define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 #define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A #define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B #define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C #define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D #define GL_HILO8_NV 0x885E #define GL_SIGNED_HILO8_NV 0x885F #define GL_FORCE_BLUE_TO_ONE_NV 0x8860 #endif /* GL_NV_texture_shader3 */ /*-------------------------------------------------------------------*/ /*------------NV_VERTEX_PROGRAM1_1-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_vertex_program1_1 #define GL_NV_vertex_program1_1 #endif /* GL_NV_vertex_program1_1 */ /*-------------------------------------------------------------------*/ /*------------ARB_TEXTURE_MIRRORED_REPEAT----------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_texture_mirrored_repeat #define GL_ARB_texture_mirrored_repeat 1 #define GL_GL_MIRRORED_REPEAT_ARB 0x8370 #endif /* GL_ARB_texture_mirrored_repeat */ /*-------------------------------------------------------------------*/ /*------------ARB_SHADOW---------------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_shadow #define GL_ARB_shadow 1 #define GL_TEXTURE_COMPARE_MODE_ARB 0x884C #define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D #define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E #endif /* GL_ARB_shadow */ /*-------------------------------------------------------------------*/ /*------------ARB_SHADOW_AMBIENT-------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_shadow_ambient #define GL_ARB_shadow_ambient 1 #define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF #endif /* GL_ARB_shadow_ambient */ /*-------------------------------------------------------------------*/ /*------------ARB_DEPTH_TEXTURE--------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_depth_texture #define GL_ARB_depth_texture 1 #define GL_DEPTH_COMPONENT16_ARB 0x81A5 #define GL_DEPTH_COMPONENT24_ARB 0x81A6 #define GL_DEPTH_COMPONENT32_ARB 0x81A7 #define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A #define GL_DEPTH_TEXTURE_MODE_ARB 0x884B #endif /* GL_ARB_depth_texture */ /*-------------------------------------------------------------------*/ /*------------ARB_WINDOW_POS-----------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_window_pos #define GL_ARB_window_pos 1 typedef void (APIENTRY * glWindowPos2dARBPROC) (GLdouble x, GLdouble y); typedef void (APIENTRY * glWindowPos2fARBPROC) (GLfloat x, GLfloat y); typedef void (APIENTRY * glWindowPos2iARBPROC) (GLint x, GLint y); typedef void (APIENTRY * glWindowPos2sARBPROC) (GLshort x, GLshort y); typedef void (APIENTRY * glWindowPos2dvARBPROC) (const GLdouble *p); typedef void (APIENTRY * glWindowPos2fvARBPROC) (const GLfloat *p); typedef void (APIENTRY * glWindowPos2ivARBPROC) (const GLint *p); typedef void (APIENTRY * glWindowPos2svARBPROC) (const GLshort *p); typedef void (APIENTRY * glWindowPos3dARBPROC) (GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRY * glWindowPos3fARBPROC) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY * glWindowPos3iARBPROC) (GLint x, GLint y, GLint z); typedef void (APIENTRY * glWindowPos3sARBPROC) (GLshort x, GLshort y, GLshort z); typedef void (APIENTRY * glWindowPos3dvARBPROC) (const GLdouble *p); typedef void (APIENTRY * glWindowPos3fvARBPROC) (const GLfloat *p); typedef void (APIENTRY * glWindowPos3ivARBPROC) (const GLint *p); typedef void (APIENTRY * glWindowPos3svARBPROC) (const GLshort *p); extern glWindowPos2dARBPROC glWindowPos2dARB; extern glWindowPos2fARBPROC glWindowPos2fARB; extern glWindowPos2iARBPROC glWindowPos2iARB; extern glWindowPos2sARBPROC glWindowPos2sARB; extern glWindowPos2dvARBPROC glWindowPos2dvARB; extern glWindowPos2fvARBPROC glWindowPos2fvARB; extern glWindowPos2ivARBPROC glWindowPos2ivARB; extern glWindowPos2svARBPROC glWindowPos2svARB; extern glWindowPos3dARBPROC glWindowPos3dARB; extern glWindowPos3fARBPROC glWindowPos3fARB; extern glWindowPos3iARBPROC glWindowPos3iARB; extern glWindowPos3sARBPROC glWindowPos3sARB; extern glWindowPos3dvARBPROC glWindowPos3dvARB; extern glWindowPos3fvARBPROC glWindowPos3fvARB; extern glWindowPos3ivARBPROC glWindowPos3ivARB; extern glWindowPos3svARBPROC glWindowPos3svARB; #endif /* GL_ARB_window_pos */ /*-------------------------------------------------------------------*/ /*------------EXT_SHADOW_FUNCS---------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_shadow_funcs #define GL_EXT_shadow_funcs 1 #endif /* GL_EXT_shadow_funcs */ /*-------------------------------------------------------------------*/ /*------------EXT_draw_range_elements--------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_draw_range_elements #define GL_EXT_draw_range_elements 1 typedef void (APIENTRY * glDrawRangeElementsEXTPROC) ( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); extern glDrawRangeElementsEXTPROC glDrawRangeElementsEXT; #define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 #define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 #endif /*-------------------------------------------------------------------*/ /*------------EXT_texture_compression_s3tc---------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_texture_compression_s3tc #define GL_EXT_texture_compression_s3tc 1 #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 #endif /* GL_EXT_texture_compression_s3tc */ /*-------------------------------------------------------------------*/ /*------------EXT_stencil_two_side-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_stencil_two_side #define GL_EXT_stencil_two_side 1 typedef void (APIENTRY * glActiveStencilFaceEXTPROC) (GLenum face); extern glActiveStencilFaceEXTPROC glActiveStencilFaceEXT; #define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 #define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 #endif /* GL_EXT_stencil_two_side */ /*-------------------------------------------------------------------*/ /*------------ARB_vertex_program-------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ARB_vertex_program #define GL_ARB_vertex_program 1 typedef void (APIENTRY * glVertexAttrib1sARBPROC) (GLuint index, GLshort x); typedef void (APIENTRY * glVertexAttrib1fARBPROC) (GLuint index, GLfloat x); typedef void (APIENTRY * glVertexAttrib1dARBPROC) (GLuint index, GLdouble x); typedef void (APIENTRY * glVertexAttrib2sARBPROC) (GLuint index, GLshort x, GLshort y); typedef void (APIENTRY * glVertexAttrib2fARBPROC) (GLuint index, GLfloat x, GLfloat y); typedef void (APIENTRY * glVertexAttrib2dARBPROC) (GLuint index, GLdouble x, GLdouble y); typedef void (APIENTRY * glVertexAttrib3sARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); typedef void (APIENTRY * glVertexAttrib3fARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY * glVertexAttrib3dARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRY * glVertexAttrib4sARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); typedef void (APIENTRY * glVertexAttrib4fARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRY * glVertexAttrib4dARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRY * glVertexAttrib4NubARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); typedef void (APIENTRY * glVertexAttrib1svARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRY * glVertexAttrib1fvARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRY * glVertexAttrib1dvARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRY * glVertexAttrib2svARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRY * glVertexAttrib2fvARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRY * glVertexAttrib2dvARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRY * glVertexAttrib3svARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRY * glVertexAttrib3fvARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRY * glVertexAttrib3dvARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRY * glVertexAttrib4bvARBPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRY * glVertexAttrib4svARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRY * glVertexAttrib4ivARBPROC) (GLuint index, const GLint *v); typedef void (APIENTRY * glVertexAttrib4ubvARBPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRY * glVertexAttrib4usvARBPROC) (GLuint index, const GLushort *v); typedef void (APIENTRY * glVertexAttrib4uivARBPROC) (GLuint index, const GLuint *v); typedef void (APIENTRY * glVertexAttrib4fvARBPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRY * glVertexAttrib4dvARBPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRY * glVertexAttrib4NbvARBPROC) (GLuint index, const GLbyte *v); typedef void (APIENTRY * glVertexAttrib4NsvARBPROC) (GLuint index, const GLshort *v); typedef void (APIENTRY * glVertexAttrib4NivARBPROC) (GLuint index, const GLint *v); typedef void (APIENTRY * glVertexAttrib4NubvARBPROC) (GLuint index, const GLubyte *v); typedef void (APIENTRY * glVertexAttrib4NusvARBPROC) (GLuint index, const GLushort *v); typedef void (APIENTRY * glVertexAttrib4NuivARBPROC) (GLuint index, const GLuint *v); typedef void (APIENTRY * glVertexAttribPointerARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRY * glEnableVertexAttribArrayARBPROC) (GLuint index); typedef void (APIENTRY * glDisableVertexAttribArrayARBPROC) (GLuint index); typedef void (APIENTRY * glProgramStringARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); typedef void (APIENTRY * glBindProgramARBPROC) (GLenum target, GLuint program); typedef void (APIENTRY * glDeleteProgramsARBPROC) (GLsizei n, const GLuint *programs); typedef void (APIENTRY * glGenProgramsARBPROC) (GLsizei n, GLuint *programs); typedef void (APIENTRY * glProgramEnvParameter4dARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRY * glProgramEnvParameter4dvARBPROC) (GLenum target, GLuint index, const GLdouble *params); typedef void (APIENTRY * glProgramEnvParameter4fARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRY * glProgramEnvParameter4fvARBPROC) (GLenum target, GLuint index, const GLfloat *params); typedef void (APIENTRY * glProgramLocalParameter4dARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRY * glProgramLocalParameter4dvARBPROC) (GLenum target, GLuint index, const GLdouble *params); typedef void (APIENTRY * glProgramLocalParameter4fARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRY * glProgramLocalParameter4fvARBPROC) (GLenum target, GLuint index, const GLfloat *params); typedef void (APIENTRY * glGetProgramEnvParameterdvARBPROC) (GLenum target, GLuint index, GLdouble *params); typedef void (APIENTRY * glGetProgramEnvParameterfvARBPROC) (GLenum target, GLuint index, GLfloat *params); typedef void (APIENTRY * glGetProgramLocalParameterdvARBPROC) (GLenum target, GLuint index, GLdouble *params); typedef void (APIENTRY * glGetProgramLocalParameterfvARBPROC) (GLenum target, GLuint index, GLfloat *params); typedef void (APIENTRY * glGetProgramivARBPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRY * glGetProgramStringARBPROC) (GLenum target, GLenum pname, GLvoid *string); typedef void (APIENTRY * glGetVertexAttribdvARBPROC) (GLuint index, GLenum pname, GLdouble *params); typedef void (APIENTRY * glGetVertexAttribfvARBPROC) (GLuint index, GLenum pname, GLfloat *params); typedef void (APIENTRY * glGetVertexAttribivARBPROC) (GLuint index, GLenum pname, GLint *params); typedef void (APIENTRY * glGetVertexAttribPointervARBPROC) (GLuint index, GLenum pname, GLvoid **pointer); typedef GLboolean (APIENTRY * glIsProgramARBPROC) (GLuint program); extern glVertexAttrib1sARBPROC glVertexAttrib1sARB; extern glVertexAttrib1fARBPROC glVertexAttrib1fARB; extern glVertexAttrib1dARBPROC glVertexAttrib1dARB; extern glVertexAttrib2sARBPROC glVertexAttrib2sARB; extern glVertexAttrib2fARBPROC glVertexAttrib2fARB; extern glVertexAttrib2dARBPROC glVertexAttrib2dARB; extern glVertexAttrib3sARBPROC glVertexAttrib3sARB; extern glVertexAttrib3fARBPROC glVertexAttrib3fARB; extern glVertexAttrib3dARBPROC glVertexAttrib3dARB; extern glVertexAttrib4sARBPROC glVertexAttrib4sARB; extern glVertexAttrib4fARBPROC glVertexAttrib4fARB; extern glVertexAttrib4dARBPROC glVertexAttrib4dARB; extern glVertexAttrib4NubARBPROC glVertexAttrib4NubARB; extern glVertexAttrib1svARBPROC glVertexAttrib1svARB; extern glVertexAttrib1fvARBPROC glVertexAttrib1fvARB; extern glVertexAttrib1dvARBPROC glVertexAttrib1dvARB; extern glVertexAttrib2svARBPROC glVertexAttrib2svARB; extern glVertexAttrib2fvARBPROC glVertexAttrib2fvARB; extern glVertexAttrib2dvARBPROC glVertexAttrib2dvARB; extern glVertexAttrib3svARBPROC glVertexAttrib3svARB; extern glVertexAttrib3fvARBPROC glVertexAttrib3fvARB; extern glVertexAttrib3dvARBPROC glVertexAttrib3dvARB; extern glVertexAttrib4bvARBPROC glVertexAttrib4bvARB; extern glVertexAttrib4svARBPROC glVertexAttrib4svARB; extern glVertexAttrib4ivARBPROC glVertexAttrib4ivARB; extern glVertexAttrib4ubvARBPROC glVertexAttrib4ubvARB; extern glVertexAttrib4usvARBPROC glVertexAttrib4usvARB; extern glVertexAttrib4uivARBPROC glVertexAttrib4uivARB; extern glVertexAttrib4fvARBPROC glVertexAttrib4fvARB; extern glVertexAttrib4dvARBPROC glVertexAttrib4dvARB; extern glVertexAttrib4NbvARBPROC glVertexAttrib4NbvARB; extern glVertexAttrib4NsvARBPROC glVertexAttrib4NsvARB; extern glVertexAttrib4NivARBPROC glVertexAttrib4NivARB; extern glVertexAttrib4NubvARBPROC glVertexAttrib4NubvARB; extern glVertexAttrib4NusvARBPROC glVertexAttrib4NusvARB; extern glVertexAttrib4NuivARBPROC glVertexAttrib4NuivARB; extern glVertexAttribPointerARBPROC glVertexAttribPointerARB; extern glEnableVertexAttribArrayARBPROC glEnableVertexAttribArrayARB; extern glDisableVertexAttribArrayARBPROC glDisableVertexAttribArrayARB; extern glProgramStringARBPROC glProgramStringARB; extern glBindProgramARBPROC glBindProgramARB; extern glDeleteProgramsARBPROC glDeleteProgramsARB; extern glGenProgramsARBPROC glGenProgramsARB; extern glProgramEnvParameter4dARBPROC glProgramEnvParameter4dARB; extern glProgramEnvParameter4dvARBPROC glProgramEnvParameter4dvARB; extern glProgramEnvParameter4fARBPROC glProgramEnvParameter4fARB; extern glProgramEnvParameter4fvARBPROC glProgramEnvParameter4fvARB; extern glProgramLocalParameter4dARBPROC glProgramLocalParameter4dARB; extern glProgramLocalParameter4dvARBPROC glProgramLocalParameter4dvARB; extern glProgramLocalParameter4fARBPROC glProgramLocalParameter4fARB; extern glProgramLocalParameter4fvARBPROC glProgramLocalParameter4fvARB; extern glGetProgramEnvParameterdvARBPROC glGetProgramEnvParameterdvARB; extern glGetProgramEnvParameterfvARBPROC glGetProgramEnvParameterfvARB; extern glGetProgramLocalParameterdvARBPROC glGetProgramLocalParameterdvARB; extern glGetProgramLocalParameterfvARBPROC glGetProgramLocalParameterfvARB; extern glGetProgramivARBPROC glGetProgramivARB; extern glGetProgramStringARBPROC glGetProgramStringARB; extern glGetVertexAttribdvARBPROC glGetVertexAttribdvARB; extern glGetVertexAttribfvARBPROC glGetVertexAttribfvARB; extern glGetVertexAttribivARBPROC glGetVertexAttribivARB; extern glGetVertexAttribPointervARBPROC glGetVertexAttribPointervARB; extern glIsProgramARBPROC glIsProgramARB; #define GL_VERTEX_PROGRAM_ARB 0x8620 #define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 #define GL_COLOR_SUM_ARB 0x8458 #define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A #define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 #define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 #define GL_PROGRAM_LENGTH_ARB 0x8627 #define GL_PROGRAM_FORMAT_ARB 0x8876 #define GL_PROGRAM_BINDING_ARB 0x8677 #define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 #define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 #define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 #define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 #define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 #define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 #define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 #define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 #define GL_PROGRAM_PARAMETERS_ARB 0x88A8 #define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 #define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA #define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB #define GL_PROGRAM_ATTRIBS_ARB 0x88AC #define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD #define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE #define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF #define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 #define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 #define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 #define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 #define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 #define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 #define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 #define GL_PROGRAM_STRING_ARB 0x8628 #define GL_PROGRAM_ERROR_POSITION_ARB 0x864B #define GL_CURRENT_MATRIX_ARB 0x8641 #define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 #define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 #define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 #define GL_MAX_PROGRAM_MATRICES_ARB 0x862F #define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E #define GL_PROGRAM_ERROR_STRING_ARB 0x8874 #define GL_MATRIX0_ARB 0x88C0 #define GL_MATRIX1_ARB 0x88C1 #define GL_MATRIX2_ARB 0x88C2 #define GL_MATRIX3_ARB 0x88C3 #define GL_MATRIX4_ARB 0x88C4 #define GL_MATRIX5_ARB 0x88C5 #define GL_MATRIX6_ARB 0x88C6 #define GL_MATRIX7_ARB 0x88C7 #define GL_MATRIX8_ARB 0x88C8 #define GL_MATRIX9_ARB 0x88C9 #define GL_MATRIX10_ARB 0x88CA #define GL_MATRIX11_ARB 0x88CB #define GL_MATRIX12_ARB 0x88CC #define GL_MATRIX13_ARB 0x88CD #define GL_MATRIX14_ARB 0x88CE #define GL_MATRIX15_ARB 0x88CF #define GL_MATRIX16_ARB 0x88D0 #define GL_MATRIX17_ARB 0x88D1 #define GL_MATRIX18_ARB 0x88D2 #define GL_MATRIX19_ARB 0x88D3 #define GL_MATRIX20_ARB 0x88D4 #define GL_MATRIX21_ARB 0x88D5 #define GL_MATRIX22_ARB 0x88D6 #define GL_MATRIX23_ARB 0x88D7 #define GL_MATRIX24_ARB 0x88D8 #define GL_MATRIX25_ARB 0x88D9 #define GL_MATRIX26_ARB 0x88DA #define GL_MATRIX27_ARB 0x88DB #define GL_MATRIX28_ARB 0x88DC #define GL_MATRIX29_ARB 0x88DD #define GL_MATRIX30_ARB 0x88DE #define GL_MATRIX31_ARB 0x88DF #endif /* GL_ARB_vertex_program */ /*-------------------------------------------------------------------*/ /*------------GL_EXT_BGRA--------------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_bgra #define GL_EXT_bgra 1 #define GL_BGR_EXT 0x80E0 #define GL_BGRA_EXT 0x80E1 #endif /* GL_EXT_bgra */ /*-------------------------------------------------------------------*/ /*------------EXT_CULL_VERTEX----------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_cull_vertex #define GL_EXT_cull_vertex 1 #define GL_CULL_VERTEX_EXT 0x81AA #define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB #define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC typedef void (APIENTRY * glCullParameterfvEXTPROC) (GLenum pname, GLfloat *params); typedef void (APIENTRY * glCullParameterdvEXTPROC) (GLenum pname, GLdouble *params); extern glCullParameterfvEXTPROC glCullParameterfvEXT; extern glCullParameterdvEXTPROC glCullParameterdvEXT; #endif /* GL_EXT_cull_vertex */ /*-------------------------------------------------------------------*/ /*------------GL_ATI_POINT_CULL_MODE---------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_ATI_point_cull_mode #define GL_ATI_point_cull_mode 1 #define GL_POINT_CULL_MODE_ATI 0x60b3 #define GL_POINT_CULL_CENTER_ATI 0x60b4 #define GL_POINT_CLIP_ATI 0x60b5 #endif /* GL_ATI_point_cull_mode */ /*-------------------------------------------------------------------*/ /*------------GL_BLEND_FUNC_SEPARATE---------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_blend_func_separate #define GL_EXT_blend_func_separate 1 #define GL_BLEND_DST_RGB_EXT 0x80C8 #define GL_BLEND_SRC_RGB_EXT 0x80C9 #define GL_BLEND_DST_ALPHA_EXT 0x80CA #define GL_BLEND_SRC_ALPHA_EXT 0x80CB typedef void (APIENTRY * glBlendFuncSeparateEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); extern glBlendFuncSeparateEXTPROC glBlendFuncSeparateEXT; #endif /* GL_EXT_blend_func_separate */ /*-------------------------------------------------------------------*/ /*------------GL_EXT_SEPARATE_SPECULAR_COLOR-------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_EXT_separate_specular_color #define GL_EXT_separate_specular_color 1 #define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 #define GL_SINGLE_COLOR_EXT 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA #endif /* GL_EXT_separate_specular_color */ /*-------------------------------------------------------------------*/ /*------------GL_NV_ELEMENT_ARRAY------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_element_array #define GL_NV_element_array 1 #define GL_ELEMENT_ARRAY_TYPE_NV 0x8769 #define GL_ELEMENT_ARRAY_POINTER_NV 0x876A typedef void (APIENTRY * glElementPointerNVPROC) (GLenum type, const GLvoid *pointer); typedef void (APIENTRY * glDrawElementArrayNVPROC) (GLenum mode, GLint first, GLsizei count); typedef void (APIENTRY * glDrawRangeElementArrayNVPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); typedef void (APIENTRY * glMultiDrawElementArrayNVPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); typedef void (APIENTRY * glMultiDrawRangeElementArrayNVPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); extern glElementPointerNVPROC glElementPointerNV; extern glDrawElementArrayNVPROC glDrawElementArrayNV; extern glDrawRangeElementArrayNVPROC glDrawRangeElementArrayNV; extern glMultiDrawElementArrayNVPROC glMultiDrawElementArrayNV; extern glMultiDrawRangeElementArrayNVPROC glMultiDrawRangeElementArrayNV; #endif /* GL_NV_element_array */ /*-------------------------------------------------------------------*/ /*------------GL_NV_FLOAT_BUFFER-------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_float_buffer #define GL_NV_float_buffer 1 #define GL_FLOAT_R_NV 0x8880 #define GL_FLOAT_RG_NV 0x8881 #define GL_FLOAT_RGB_NV 0x8882 #define GL_FLOAT_RGBA_NV 0x8883 #define GL_FLOAT_R32_NV 0x8885 #define GL_FLOAT_R16_NV 0x8884 #define GL_FLOAT_R32_NV 0x8885 #define GL_FLOAT_RG16_NV 0x8886 #define GL_FLOAT_RG32_NV 0x8887 #define GL_FLOAT_RGB16_NV 0x8888 #define GL_FLOAT_RGB32_NV 0x8889 #define GL_FLOAT_RGBA16_NV 0x888A #define GL_FLOAT_RGBA32_NV 0x888B #define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C #define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D #define GL_FLOAT_RGBA_MODE_NV 0x888E #ifdef _WIN32 #define GL_WGL_FLOAT_COMPONENTS_NV 0x20B0 #define GL_WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 #define GL_WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 #define GL_WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 #define GL_WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 #define GL_WGL_TEXTURE_FLOAT_R_NV 0x20B5 #define GL_WGL_TEXTURE_FLOAT_RG_NV 0x20B6 #define GL_WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 #define GL_WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 #endif /* _WIN32 */ #endif /* GL_NV_float_buffer */ /*-------------------------------------------------------------------*/ /*------------GL_NV_FRAGMENT_PROGRAM---------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_fragment_program #define GL_NV_fragment_program 1 #define GL_FRAGMENT_PROGRAM_NV 0x8870 #define GL_MAX_TEXTURE_COORDS_NV 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 #define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 #define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 #define GL_PROGRAM_ERROR_STRING_NV 0x8874 typedef void (APIENTRY * glProgramNamedParameter4fNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRY * glProgramNamedParameter4dNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRY * glProgramNamedParameter4fvNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat v[]); typedef void (APIENTRY * glProgramNamedParameter4dvNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble v[]); typedef void (APIENTRY * glGetProgramNamedParameterfvNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); typedef void (APIENTRY * glGetProgramNamedParameterdvNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); #ifndef GL_ARB_vertex_program typedef void (APIENTRY * glProgramLocalParameter4dARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); typedef void (APIENTRY * glProgramLocalParameter4dvARBPROC) (GLenum target, GLuint index, const GLdouble *params); typedef void (APIENTRY * glProgramLocalParameter4fARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (APIENTRY * glProgramLocalParameter4fvARBPROC) (GLenum target, GLuint index, const GLfloat *params); typedef void (APIENTRY * glGetProgramLocalParameterdvARBPROC) (GLenum target, GLuint index, GLdouble *params); typedef void (APIENTRY * glGetProgramLocalParameterfvARBPROC) (GLenum target, GLuint index, GLfloat *params); #endif /* GL_ARB_vertex_program */ extern glProgramNamedParameter4fNVPROC glProgramNamedParameter4fNV; extern glProgramNamedParameter4dNVPROC glProgramNamedParameter4dNV; extern glProgramNamedParameter4fvNVPROC glProgramNamedParameter4fvNV; extern glProgramNamedParameter4dvNVPROC glProgramNamedParameter4dvNV; extern glGetProgramNamedParameterfvNVPROC glGetProgramNamedParameterfvNV; extern glGetProgramNamedParameterdvNVPROC glGetProgramNamedParameterdvNV; #ifndef GL_ARB_vertex_program extern glProgramLocalParameter4dARBPROC glProgramLocalParameter4dARB; extern glProgramLocalParameter4dvARBPROC glProgramLocalParameter4dvARB; extern glProgramLocalParameter4fARBPROC glProgramLocalParameter4fARB; extern glProgramLocalParameter4fvARBPROC glProgramLocalParameter4fvARB; extern glGetProgramLocalParameterdvARBPROC glGetProgramLocalParameterdvARB; extern glGetProgramLocalParameterfvARBPROC glGetProgramLocalParameterfvARB; #endif /* GL_ARB_vertex_program */ #endif /* GL_NV_fragment_program */ /*-------------------------------------------------------------------*/ /*------------GL_NV_PRIMITIVE_RESTART--------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_primitive_restart #define GL_NV_primitive_restart 1 #define GL_PRIMITIVE_RESTART_NV 0x8558 #define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 typedef void (APIENTRY * glPrimitiveRestartNVPROC) (); typedef void (APIENTRY * glPrimitiveRestartIndexNVPROC) (GLuint index); extern glPrimitiveRestartNVPROC glPrimitiveRestartNV; extern glPrimitiveRestartIndexNVPROC glPrimitiveRestartIndexNV; #endif /* GL_NV_primitive_restart */ /*-------------------------------------------------------------------*/ /*------------GL_NV_VERTEX_PROGRAM2----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef GL_NV_vertex_program2 #define GL_NV_vertex_program2 1 #endif /* GL_NV_vertex_program2 */ /*-------------------------------------------------------------------*/ /*------------END GL EXTENSIONS--------------------------------------*/ /*-------------------------------------------------------------------*/ /*-------------------------------------------------------------------*/ /*------------WGL EXTENSIONS HERE------------------------------------*/ /*-------------------------------------------------------------------*/ #ifdef _WIN32 /*-------------------------------------------------------------------*/ /*------------WGL_EXT_EXTENSION_STRING-------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef WGL_EXT_extensions_string #define WGL_EXT_extensions_string 1 typedef const char* (APIENTRY * wglGetExtensionsStringEXTPROC) (); extern wglGetExtensionsStringEXTPROC wglGetExtensionsStringEXT; #endif /* WGL_EXT_extensions_string */ /*-------------------------------------------------------------------*/ /*------------WGL_ARB_BUFFER_REGION----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef WGL_ARB_buffer_region #define WGL_ARB_buffer_region 1 #define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 #define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 #define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 #define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 typedef HANDLE (APIENTRY * wglCreateBufferRegionARBPROC) (HDC hDC, int iLayerPlane, UINT uType); typedef VOID (APIENTRY * wglDeleteBufferRegionARBPROC) (HANDLE hRegion); typedef BOOL (APIENTRY * wglSaveBufferRegionARBPROC) (HANDLE hRegion, int x, int y, int width, int height); typedef BOOL (APIENTRY * wglRestoreBufferRegionARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); extern wglCreateBufferRegionARBPROC wglCreateBufferRegionARB; extern wglDeleteBufferRegionARBPROC wglDeleteBufferRegionARB; extern wglSaveBufferRegionARBPROC wglSaveBufferRegionARB; extern wglRestoreBufferRegionARBPROC wglRestoreBufferRegionARB; #endif /* WGL_ARB_buffer_region */ /*-------------------------------------------------------------------*/ /*------------WGL_ARB_EXTENSION_STRING-------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef WGL_ARB_extensions_string #define WGL_ARB_extensions_string 1 typedef const char* (APIENTRY * wglGetExtensionsStringARBPROC) (HDC hdc); extern wglGetExtensionsStringARBPROC wglGetExtensionsStringARB; #endif /* WGL_ARB_extensions_string */ /*-------------------------------------------------------------------*/ /*------------WGL_ARB_PBUFFER----------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef WGL_ARB_pbuffer #define WGL_ARB_pbuffer 1 #define WGL_DRAW_TO_PBUFFER_ARB 0x202D #define WGL_DRAW_TO_PBUFFER_ARB 0x202D #define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E #define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F #define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 #define WGL_PBUFFER_LARGEST_ARB 0x2033 #define WGL_PBUFFER_WIDTH_ARB 0x2034 #define WGL_PBUFFER_HEIGHT_ARB 0x2035 #define WGL_PBUFFER_LOST_ARB 0x2036 DECLARE_HANDLE(HPBUFFERARB); typedef HPBUFFERARB (APIENTRY * wglCreatePbufferARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); typedef HDC (APIENTRY * wglGetPbufferDCARBPROC) (HPBUFFERARB hPbuffer); typedef int (APIENTRY * wglReleasePbufferDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); typedef BOOL (APIENTRY * wglDestroyPbufferARBPROC) (HPBUFFERARB hPbuffer); typedef BOOL (APIENTRY * wglQueryPbufferARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); extern wglCreatePbufferARBPROC wglCreatePbufferARB; extern wglGetPbufferDCARBPROC wglGetPbufferDCARB; extern wglReleasePbufferDCARBPROC wglReleasePbufferDCARB; extern wglDestroyPbufferARBPROC wglDestroyPbufferARB; extern wglQueryPbufferARBPROC wglQueryPbufferARB; #endif /* WGL_ARB_pbuffer */ /*-------------------------------------------------------------------*/ /*------------WGL_ARB_PIXEL_FORMAT-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef WGL_ARB_pixel_format #define WGL_ARB_pixel_format 1 #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 #define WGL_DRAW_TO_WINDOW_ARB 0x2001 #define WGL_DRAW_TO_BITMAP_ARB 0x2002 #define WGL_ACCELERATION_ARB 0x2003 #define WGL_NEED_PALETTE_ARB 0x2004 #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 #define WGL_SWAP_METHOD_ARB 0x2007 #define WGL_NUMBER_OVERLAYS_ARB 0x2008 #define WGL_NUMBER_UNDERLAYS_ARB 0x2009 #define WGL_TRANSPARENT_ARB 0x200A #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B #define WGL_SHARE_DEPTH_ARB 0x200C #define WGL_SHARE_STENCIL_ARB 0x200D #define WGL_SHARE_ACCUM_ARB 0x200E #define WGL_SUPPORT_GDI_ARB 0x200F #define WGL_SUPPORT_OPENGL_ARB 0x2010 #define WGL_DOUBLE_BUFFER_ARB 0x2011 #define WGL_STEREO_ARB 0x2012 #define WGL_PIXEL_TYPE_ARB 0x2013 #define WGL_COLOR_BITS_ARB 0x2014 #define WGL_RED_BITS_ARB 0x2015 #define WGL_RED_SHIFT_ARB 0x2016 #define WGL_GREEN_BITS_ARB 0x2017 #define WGL_GREEN_SHIFT_ARB 0x2018 #define WGL_BLUE_BITS_ARB 0x2019 #define WGL_BLUE_SHIFT_ARB 0x201A #define WGL_ALPHA_BITS_ARB 0x201B #define WGL_ALPHA_SHIFT_ARB 0x201C #define WGL_ACCUM_BITS_ARB 0x201D #define WGL_ACCUM_RED_BITS_ARB 0x201E #define WGL_ACCUM_GREEN_BITS_ARB 0x201F #define WGL_ACCUM_BLUE_BITS_ARB 0x2020 #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 #define WGL_DEPTH_BITS_ARB 0x2022 #define WGL_STENCIL_BITS_ARB 0x2023 #define WGL_AUX_BUFFERS_ARB 0x2024 #define WGL_NO_ACCELERATION_ARB 0x2025 #define WGL_GENERIC_ACCELERATION_ARB 0x2026 #define WGL_FULL_ACCELERATION_ARB 0x2027 #define WGL_SWAP_EXCHANGE_ARB 0x2028 #define WGL_SWAP_COPY_ARB 0x2029 #define WGL_SWAP_UNDEFINED_ARB 0x202A #define WGL_TYPE_RGBA_ARB 0x202B #define WGL_TYPE_COLORINDEX_ARB 0x202C typedef BOOL (APIENTRY * wglGetPixelFormatAttribivARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); typedef BOOL (APIENTRY * wglGetPixelFormatAttribfvARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); typedef BOOL (APIENTRY * wglChoosePixelFormatARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); extern wglGetPixelFormatAttribivARBPROC wglGetPixelFormatAttribivARB; extern wglGetPixelFormatAttribfvARBPROC wglGetPixelFormatAttribfvARB; extern wglChoosePixelFormatARBPROC wglChoosePixelFormatARB; #endif /* WGL_ARB_pixel_format */ /*-------------------------------------------------------------------*/ /*------------WGL_ARB_RENDER_TEXTURE---------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef WGL_ARB_render_texture #define WGL_ARB_render_texture 1 #define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 #define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 #define WGL_TEXTURE_FORMAT_ARB 0x2072 #define WGL_TEXTURE_TARGET_ARB 0x2073 #define WGL_MIPMAP_TEXTURE_ARB 0x2074 #define WGL_TEXTURE_RGB_ARB 0x2075 #define WGL_TEXTURE_RGBA_ARB 0x2076 #define WGL_NO_TEXTURE_ARB 0x2077 #define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 #define WGL_TEXTURE_1D_ARB 0x2079 #define WGL_TEXTURE_2D_ARB 0x207A #define WGL_NO_TEXTURE_ARB 0x2077 #define WGL_MIPMAP_LEVEL_ARB 0x207B #define WGL_CUBE_MAP_FACE_ARB 0x207C #define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 #define WGL_FRONT_LEFT_ARB 0x2083 #define WGL_FRONT_RIGHT_ARB 0x2084 #define WGL_BACK_LEFT_ARB 0x2085 #define WGL_BACK_RIGHT_ARB 0x2086 #define WGL_AUX0_ARB 0x2087 #define WGL_AUX1_ARB 0x2088 #define WGL_AUX2_ARB 0x2089 #define WGL_AUX3_ARB 0x208A #define WGL_AUX4_ARB 0x208B #define WGL_AUX5_ARB 0x208C #define WGL_AUX6_ARB 0x208D #define WGL_AUX7_ARB 0x208E #define WGL_AUX8_ARB 0x208F #define WGL_AUX9_ARB 0x2090 typedef BOOL (APIENTRY * wglBindTexImageARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (APIENTRY * wglReleaseTexImageARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (APIENTRY * wglSetPbufferAttribARBPROC) (HPBUFFERARB hPbuffer, const int *piAttribList); extern wglBindTexImageARBPROC wglBindTexImageARB; extern wglReleaseTexImageARBPROC wglReleaseTexImageARB; extern wglSetPbufferAttribARBPROC wglSetPbufferAttribARB; #endif /*WGL_ARB_render_texture */ /*-------------------------------------------------------------------*/ /*------------WGL_EXT_SWAP_CONTROL-----------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef WGL_EXT_swap_control #define WGL_EXT_swap_control 1 typedef BOOL (APIENTRY * wglSwapIntervalEXTPROC) (int interval); typedef int (APIENTRY * wglGetSwapIntervalEXTPROC) (void); extern wglSwapIntervalEXTPROC wglSwapIntervalEXT; extern wglGetSwapIntervalEXTPROC wglGetSwapIntervalEXT; #endif /* WGL_EXT_swap_control */ /*-------------------------------------------------------------------*/ /*------------WGL_ARB_MAKE_CURRENT_READ------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef WGL_ARB_make_current_read #define WGL_ARB_make_current_read 1 #define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 #define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 typedef BOOL (APIENTRY * wglMakeContextCurrentARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); typedef HDC (APIENTRY * wglGetCurrentReadDCARBPROC) (void); extern wglMakeContextCurrentARBPROC wglMakeContextCurrentARB; extern wglGetCurrentReadDCARBPROC wglGetCurrentReadDCARB; #endif /* WGL_ARB_make_current_read */ /*-------------------------------------------------------------------*/ /*------------WGL_ARB_MULTISAMPLE------------------------------------*/ /*-------------------------------------------------------------------*/ #ifndef WGL_ARB_multisample #define WGL_ARB_multisample 1 #define WGL_SAMPLE_BUFFERS_ARB 0x2041 #define WGL_SAMPLES_ARB 0x2042 #endif /* WGL_ARB_multisample */ /*-------------------------------------------------------------------*/ /*------------WGL_NV_RENDER_DEPTH_TEXTURE----------------------------*/ /*-------------------------------------------------------------------*/ #ifndef WGL_NV_render_depth_texture #define WGL_NV_render_depth_texture 1 #define GL_WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 #define GL_WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 #define GL_WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 #define GL_WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 #define GL_WGL_NO_TEXTURE_ARB 0x2077 #define GL_WGL_DEPTH_COMPONENT_NV 0x20A7 #endif /* WGL_NV_render_depth_texture */ /*-------------------------------------------------------------------*/ /*------------WGL_NV_RENDER_TEXTURE_RECTANGLE-----------------------*/ /*-------------------------------------------------------------------*/ #ifndef WGL_NV_render_texture_rectangle #define WGL_NV_render_texture_rectangle 1 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 #define WGL_TEXTURE_RECTANGLE_NV 0x20A2 #endif /* WGL_NV_render_texture_rectangle */ /*-------------------------------------------------------------------*/ /*------------END WGL EXTENSIONS-------------------------------------*/ /*-------------------------------------------------------------------*/ #endif /* WIN32 */ /* helper stuff */ /* I use int here because C does not know bool */ #ifdef _WIN32 struct WGLExtensionTypes { int ARB_buffer_region; int ARB_extensions_string; int ARB_make_current_read; int ARB_multisample; int ARB_pbuffer; int ARB_pixel_format; int ARB_render_texture; int EXT_extensions_string; int EXT_swap_control; int NV_render_depth_texture; int NV_render_texture_rectangle; }; #endif /* WIN32 */ struct ExtensionTypes { #ifdef _WIN32 /* WGL extensions */ struct WGLExtensionTypes wgl; #endif /* WIN32 */ int ARB_imaging; int ARB_depth_texture; int ARB_matrix_palette; int ARB_multisample; int ARB_multitexture; int ARB_point_parameters; int ARB_shadow; int ARB_shadow_ambient; int ARB_texture_border_clamp; int ARB_texture_compression; int ARB_texture_cube_map; int ARB_texture_env_add; int ARB_texture_env_dot3; int ARB_texture_env_combine; int ARB_texture_env_crossbar; int ARB_texture_mirrored_repeat; int ARB_transpose_matrix; int ARB_vertex_blend; int ARB_vertex_program; int ARB_window_pos; int EXT_abgr; int EXT_bgra; int EXT_blend_func_separate; int EXT_compiled_vertex_array; int EXT_cull_vertex; int EXT_fog_coord; int EXT_multi_draw_arrays; int EXT_point_parameters; int EXT_secondary_color; int EXT_separate_specular_color; int EXT_shadow_funcs; int EXT_stencil_two_side; int EXT_stencil_wrap; int EXT_texture_compression_s3tc; int EXT_texture_filter_anisotropic; int EXT_texture_lod_bias; int EXT_vertex_shader; int EXT_vertex_weighting; int EXT_draw_range_elements; int ATI_element_array; int ATI_envmap_bumpmap; int ATI_fragment_shader; int ATI_pn_triangles; int ATI_point_cull_mode; int ATI_texture_mirror_once; int ATI_vertex_array_object; int ATI_vertex_streams; int ATIX_point_sprites; int ATIX_texture_env_route; int HP_occlusion_test; int NV_blend_square; int NV_copy_depth_to_color; int NV_depth_clamp; int NV_element_array; int NV_evaluators; int NV_fence; int NV_float_buffer; int NV_fog_distance; int NV_fragment_program; int NV_light_max_exponent; int NV_occlusion_query; int NV_packed_depth_stencil; int NV_point_sprite; int NV_primitive_restart; int NV_register_combiners; int NV_register_combiners2; int NV_texgen_reflection; int NV_texture_env_combine4; int NV_texture_rectangle; int NV_texture_shader; int NV_texture_shader2; int NV_texture_shader3; int NV_vertex_array_range; int NV_vertex_array_range2; int NV_vertex_program; int NV_vertex_program1_1; int NV_vertex_program2; int SGIS_generate_mipmap; int SGIX_shadow; int SGIX_depth_texture; int OpenGL12; int OpenGL13; int OpenGL14; }; extern struct ExtensionTypes extgl_Extensions; extern struct ExtensionTypes SupportedExtensions; /* deprecated, please do not use */ /* initializes everything, call this right after the rc is created. the function returns 0 if successful */ int extgl_Initialize(); int glInitialize(); /* deprecated, please do not use */ #ifdef __cplusplus } #endif #endif /* __EXTGL_H__ */ gltron-0.70/nebu/include/video/nebu_light.h0000644000076400001440000000053207675011525014411 #ifndef NEBU_LIGHT_H #define NEBU_LIGHT_H void light4fv(float *f); void setColor3fv(float *f); void setColor4fv(float *f); void setEye3fv(float *f); void setFactor3fv(float *f); void setLight3fv(float *f); void setLight4fv(float *f); void setNormal3fv(float *f); void setVertex3f(float a, float b, float c); void setVertex3fv(float *f); #endif gltron-0.70/nebu/include/video/nebu_png_texture.h0000644000076400001440000000057007675011525015650 #ifndef NEBU_PNG_TEXTURE_H #define NEBU_PNG_TEXTURE_H typedef struct { int width; int height; int channels; unsigned char *data; } png_texture; extern png_texture* load_png_texture(char *filename); extern void unload_png_texture(png_texture *tex); extern png_texture* mipmap_png_texture(png_texture *source, int level, int clamp_u, int clamp_v); #endif gltron-0.70/nebu/include/video/nebu_quad.h0000644000076400001440000000366107675011525014242 #ifndef NEBU_QUAD_H #define NEBU_QUAD_H #include #include #include /* this file holds datastructures for quads they can be stored in Quad's and QuadBuffers for later processing and rendering */ /* fixme: this is all very obsolete, use vertex buffers instead */ typedef struct Vertex { float v[3]; float color[4]; float uv[2]; } Vertex; typedef struct Quad { Vertex vertex[4]; int type; int texture_id; } Quad; typedef struct Tris { Vertex vertex[3]; int type; int texture_id; } Tris; typedef struct QuadBuffer { Quad *quads; int size; int current; } QuadBuffer; typedef struct QuadBufInfo { QuadBuffer *qbuf; int *qIndex; int size; int *qFlags; } QuadBufInfo; typedef struct TrisBuffer { Tris *quads; int size; int current; } TrisBuffer; typedef struct TrisBufInfo { TrisBuffer *qbuf; int *qIndex; int size; int *qFlags; } TrisBufInfo; enum { QUAD_COLOR = 1, QUAD_TEXTURE = 2, QUAD_TEX_MODULATE = 4, QUAD_TEX_DECAL = 8, QUAD_ALPHA_TEST = 16 }; /* quad.c */ extern void q_setColor4fv( Quad *q, int index, float color[4] ); extern void q_setColor3f( Quad *q, int index, float r, float g, float b); extern void q_setColor4f( Quad *q, int index, float r, float g, float b, float a); extern void q_setTexCoord2f( Quad *q, int index, float u, float v ); extern void q_setVertex3f( Quad *q, int index, float x, float y, float z); extern void q_setType(Quad *q, int type); extern QuadBuffer* createQuadBuffer(int size); extern void freeQuadBuffer(QuadBuffer* q ); extern Quad* getNextQuad(QuadBuffer* q); extern int getCurrentQuad(QuadBuffer* q); extern int getQuadBufferSize(QuadBuffer *q); extern void renderQuadAt(QuadBuffer *q, int *index, int i); /* quadbuf.c */ extern int* getSortedQuads(QuadBuffer *q, float eye[3]); extern Quad* getQuadAt(QuadBuffer *q, int index); /* extern renderer_ lib must provide this */ extern void renderQuad(Quad* q); #endif gltron-0.70/nebu/include/video/nebu_renderer_gl.h0000644000076400001440000000171607731307744015603 #ifndef NEBU_RENDERER_GL_H #define NEBU_RENDERER_GL_H #include "SDL_opengl.h" #include #include "video/nebu_quad.h" #define POLY_COUNT #define RENDERER_TYPE_ALL 255 #define RENDERER_TYPE_COLOR 1 #define RENDERER_TYPE_NORMAL 2 #define RENDERER_TYPE_TEXTURE_COORD 4 #define RENDERER_TYPE_TEXTURE 8 #define RENDERER_TYPE_TEXTURE_MODE 16 extern void initRenderer(); extern void printRendererInfo(); extern void renderQuad(Quad *q); extern void renderTris(Tris *q); extern void clearState(); typedef struct GLstate { int tex_id; /* current texture */ int tex_env_mode; /* current texture env mode */ int binds; /* texture bind changes - used for statistics only */ int mod_changes; /* mode changes - used for statistics only */ int type_mask; /* which modes to change */ } GLstate; typedef struct Renderer { /* shows capabilities of the renderer */ int ext_filter_anisotropic; } Renderer; extern Renderer renderer; extern GLstate *state; #endif gltron-0.70/nebu/include/video/nebu_video_system.h0000644000076400001440000000144407675011525016017 #ifndef NEBU_VIDEO_SYSTEM_H #define NEBU_VIDEO_SYSTEM_H #define SYSTEM_RGBA 1 #define SYSTEM_DOUBLE 2 #define SYSTEM_DEPTH 4 #define SYSTEM_FULLSCREEN 8 #define SYSTEM_32_BIT 16 #define SYSTEM_STENCIL 32 extern void SystemPostRedisplay(); extern void SystemSwapBuffers(); extern void SystemWarpPointer(int x, int y); extern void SystemHidePointer(); extern void SystemUnhidePointer(); extern void SystemSetGamma(float r, float g, float b); extern void SystemInitWindow(int x, int y, int w, int h); extern void SystemInitDisplayMode(int flags, unsigned char fullscreen); extern int SystemCreateWindow(char *name); extern void SystemDestroyWindow(int id); extern void SystemReshapeFunc(void(*reshape)(int, int)); extern int SystemWriteBMP(char *filename, int x, int y, unsigned char *pixels); #endif gltron-0.70/nebu/include/video/nebu_video_types.h0000644000076400001440000000051507675011525015635 #ifndef NEBU_VIDEO_TYPES_H #define NEBU_VIDEO_TYPES_H typedef struct { int win_id; /* only the root visual has an id */ int h, w; /* window dimension */ int vp_x, vp_y; /* viewport position */ int vp_h, vp_w; /* viewport dimension */ int onScreen; unsigned int *textures; /* texture IDs */ } Visual; #endif gltron-0.70/nebu/include/video/Makefile.am0000644000076400001440000000022307675155477014170 noinst_HEADERS = nebu_console.h nebu_extgl.h nebu_light.h nebu_png_texture.h nebu_quad.h nebu_renderer_gl.h nebu_video_system.h nebu_video_types.h gltron-0.70/nebu/include/video/Makefile.in0000644000076400001440000001375207767023245014201 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_HEADERS = nebu_console.h nebu_extgl.h nebu_light.h nebu_png_texture.h nebu_quad.h nebu_renderer_gl.h nebu_video_system.h nebu_video_types.h subdir = nebu/include/video mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/include/video/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic distclean \ distclean-generic distclean-tags distdir dvi dvi-am info \ info-am install install-am install-data install-data-am \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/base/0000777000076400001440000000000007767023545010374 5gltron-0.70/nebu/base/Makefile.am0000644000076400001440000000021707702200117012321 noinst_LIBRARIES=libbase.a libbase_a_SOURCES = \ geom.c vector.c matrix.c random.c util.c system.c AM_CFLAGS = -I$(top_srcdir)/nebu/include gltron-0.70/nebu/base/Makefile.in0000644000076400001440000002030307767023245012350 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libbase.a libbase_a_SOURCES = \ geom.c vector.c matrix.c random.c util.c system.c AM_CFLAGS = -I$(top_srcdir)/nebu/include subdir = nebu/base mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libbase_a_AR = $(AR) cru libbase_a_LIBADD = am_libbase_a_OBJECTS = geom.$(OBJEXT) vector.$(OBJEXT) matrix.$(OBJEXT) \ random.$(OBJEXT) util.$(OBJEXT) system.$(OBJEXT) libbase_a_OBJECTS = $(am_libbase_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/geom.Po $(DEPDIR)/matrix.Po \ @AMDEP_TRUE@ $(DEPDIR)/random.Po $(DEPDIR)/system.Po \ @AMDEP_TRUE@ $(DEPDIR)/util.Po $(DEPDIR)/vector.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(libbase_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libbase_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/base/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libbase.a: $(libbase_a_OBJECTS) $(libbase_a_DEPENDENCIES) -rm -f libbase.a $(libbase_a_AR) libbase.a $(libbase_a_OBJECTS) $(libbase_a_LIBADD) $(RANLIB) libbase.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/geom.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/matrix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/random.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/system.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vector.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/base/geom.c0000644000076400001440000000427507704041045011375 /* some geometric routines always needed */ #include float length(float *v) { return (float)sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); } float length2(float *v) { return (float)sqrt(v[0] * v[0] + v[1] * v[1]); } float length3(float *v) { return length(v); } void normalize(float *v) { float d = length(v); if (d == 0) return; v[0] /= d; v[1] /= d; v[2] /= d; } void crossprod(float *v1, float *v2, float *out) { out[0] = v1[1] * v2[2] - v1[2] * v2[1]; out[1] = v1[2] * v2[0] - v1[0] * v2[2]; out[2] = v1[0] * v2[1] - v1[1] * v2[0]; } void normcrossprod(float *v1, float *v2, float *out) { crossprod(v1, v2, out); normalize(out); } float scalarprod2(float *v1, float *v2) { return v1[0] * v2[0] + v1[1] * v2[1]; } float scalarprod(float *v1, float *v2) { return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]; } void vsub2(float *v1, float *v2, float *out) { out[0] = v1[0] - v2[0]; out[1] = v1[1] - v2[1]; } void vsub(float *v1, float *v2, float *out) { out[0] = v1[0] - v2[0]; out[1] = v1[1] - v2[1]; out[2] = v1[2] - v2[2]; } void vadd2(float *v1, float *v2, float *out) { out[0] = v1[0] + v2[0]; out[1] = v1[1] + v2[1]; } void vadd(float *v1, float *v2, float *out) { out[0] = v1[0] + v2[0]; out[1] = v1[1] + v2[1]; out[2] = v1[2] + v2[2]; } void vcopy(float *v1, float *out) { out[0] = v1[0]; out[1] = v1[1]; out[2] = v1[2]; } void vmul(float *v, float f) { v[0] *= f; v[1] *= f; v[2] *= f; } /* 4 entries... */ float length4(float *v) { return (float)sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3]); } void normalize4(float *v) { float d = length(v); if (d == 0) return; v[0] /= d; v[1] /= d; v[2] /= d; v[3] /= d; } float scalarprod4(float *v1, float *v2) { return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2] + v1[3] * v2[3]; } void vsub4(float *v1, float *v2, float *out) { out[0] = v1[0] - v2[0]; out[1] = v1[1] - v2[1]; out[2] = v1[2] - v2[2]; out[3] = v1[3] - v2[3]; } void vadd4(float *v1, float *v2, float *out) { out[0] = v1[0] + v2[0]; out[1] = v1[1] + v2[1]; out[2] = v1[2] + v2[2]; out[3] = v1[3] + v2[3]; } void vcopy4(float *v1, float *out) { out[0] = v1[0]; out[1] = v1[1]; out[2] = v1[2]; out[3] = v1[3]; } gltron-0.70/nebu/base/vector.c0000644000076400001440000002000207740235523011740 #include "base/nebu_vector.h" #include #include #include #include vec4* vec4Add(vec4 *pOut, const vec4 *pV1, const vec4 *pV2) { pOut->v[0] = pV1->v[0] + pV2->v[0]; pOut->v[1] = pV1->v[1] + pV2->v[1]; pOut->v[2] = pV1->v[2] + pV2->v[2]; pOut->v[3] = pV1->v[3] + pV2->v[3]; return pOut; } vec4* vec4Sub(vec4 *pOut, const vec4 *pV1, const vec4 *pV2) { pOut->v[0] = pV1->v[0] - pV2->v[0]; pOut->v[1] = pV1->v[1] - pV2->v[1]; pOut->v[2] = pV1->v[2] - pV2->v[2]; pOut->v[3] = pV1->v[3] - pV2->v[3]; return pOut; } vec3* vec3Add(vec3 *pOut, const vec3 *pV1, const vec3 *pV2) { pOut->v[0] = pV1->v[0] + pV2->v[0]; pOut->v[1] = pV1->v[1] + pV2->v[1]; pOut->v[2] = pV1->v[2] + pV2->v[2]; return pOut; } vec3* vec3Sub(vec3 *pOut, const vec3 *pV1, const vec3 *pV2) { pOut->v[0] = pV1->v[0] - pV2->v[0]; pOut->v[1] = pV1->v[1] - pV2->v[1]; pOut->v[2] = pV1->v[2] - pV2->v[2]; return pOut; } vec3* vec3Cross(vec3 *pOut, const vec3 *pV1, const vec3 *pV2) { vec3 tmp; tmp.v[0] = pV1->v[1] * pV2->v[2] - pV1->v[2] * pV2->v[1]; tmp.v[1] = pV1->v[2] * pV2->v[0] - pV1->v[0] * pV2->v[2]; tmp.v[2] = pV1->v[0] * pV2->v[1] - pV1->v[1] * pV2->v[0]; memcpy(pOut, &tmp, sizeof(vec3)); return pOut; } float vec3Dot(const vec3 *pV1, const vec3 *pV2) { return pV1->v[0] * pV2->v[0] + pV1->v[1] * pV2->v[1] + pV1->v[2] * pV2->v[2]; } float vec4Dot(const vec4 *pV1, const vec4 *pV2) { return pV1->v[0] * pV2->v[0] + pV1->v[1] * pV2->v[1] + pV1->v[2] * pV2->v[2] + pV1->v[3] * pV2->v[3]; } float vec3Length(const vec3 *pV) { return (float) sqrt( pV->v[0] * pV->v[0] + pV->v[1] * pV->v[1] + pV->v[2] * pV->v[2] ); } float vec3LengthSqr(const vec3 *pV) { return pV->v[0] * pV->v[0] + pV->v[1] * pV->v[1] + pV->v[2] * pV->v[2]; } vec3* vec3Normalize(vec3 *pOut, const vec3 *pV) { float fLength = vec3Length(pV); if(fLength != 0) { pOut->v[0] = pV->v[0] / fLength; pOut->v[1] = pV->v[1] / fLength; pOut->v[2] = pV->v[2] / fLength; } return pOut; } void vec4Print(const vec4 *v) { int i; printf("[ "); for(i = 0; i < 4; i++) { printf("%.3f ", v->v[i]); } printf(" ]\n"); } void vec3Print(const vec3 *v) { int i; printf("[ "); for(i = 0; i < 3; i++) { printf("%.3f ", v->v[i]); } printf(" ]\n"); } vec4* vec4fromVec3(vec4 *pOut, const vec3 *pV) { memcpy(pOut, pV, sizeof(vec3)); pOut->v[3] = 1; return pOut; } vec3* vec3fromVec4(vec3 *pOut, const vec4 *pV) { if(pV->v[3] != 0) { pOut->v[0] = pV->v[0] / pV->v[3]; pOut->v[1] = pV->v[1] / pV->v[3]; pOut->v[2] = pV->v[2] / pV->v[3]; return pOut; } else { memset(pOut, 0, sizeof(vec3)); return NULL; } } vec3* vec3Copy(vec3 *pOut, const vec3 *pV) { memcpy(pOut, pV, sizeof(vec3)); return pOut; } vec3* vec3Scale(vec3 *pOut, const vec3 *pV, float f) { pOut->v[0] = f * pV->v[0]; pOut->v[1] = f * pV->v[1]; pOut->v[2] = f * pV->v[2]; return pOut; } unsigned int uintFromVec3(vec3 *pV) { return ( ( (unsigned int)(pV->v[0] * 127.0f + 128.0f) ) << 16 ) + ( ( (unsigned int)(pV->v[1] * 127.0f + 128.0f) ) << 8 ) + ( ( (unsigned int)(pV->v[2] * 127.0f + 128.0f) ) << 0 ); } vec3* vec3Zero(vec3 *pV) { memset(pV, 0, sizeof(vec3)); return pV; } vec3* vec3TriNormalDirection(vec3* pOut, const vec3* pV1, const vec3* pV2, const vec3 *pV3) { vec3 v1, v2; vec3Sub(&v1, pV2, pV1); vec3Sub(&v2, pV3, pV1); vec3Cross(pOut, &v1, &v2); return pOut; } vec2* vec2Copy(vec2 *pOut, const vec2 *pV) { memcpy(pOut, pV, sizeof(vec2)); return pOut; } vec2* vec2_Orthogonal(vec2 *pOut, const vec2 *pV) { pOut->v[0] = pV->v[1]; pOut->v[1] = - pV->v[0]; return pOut; } vec2* vec2Add(vec2 *pOut, const vec2 *pV1, const vec2 *pV2) { pOut->v[0] = pV1->v[0] + pV2->v[0]; pOut->v[1] = pV1->v[1] + pV2->v[1]; return pOut; } vec2* vec2Sub(vec2 *pOut, const vec2 *pV1, const vec2 *pV2) { pOut->v[0] = pV1->v[0] - pV2->v[0]; pOut->v[1] = pV1->v[1] - pV2->v[1]; return pOut; } vec2* vec2Scale(vec2 *pOut, const vec2 *pV, float fScale) { pOut->v[0] = pV->v[0] * fScale; pOut->v[1] = pV->v[1] * fScale; return pOut; } vec2* vec2Normalize(vec2 *pOut, const vec2 *pV) { return vec2Scale(pOut, pV, 1 / vec2Length(pV)); } float vec2Dot(const vec2 *pV1, const vec2 *pV2) { return pV1->v[0] * pV2->v[0] + pV1->v[1] * pV2->v[1]; } float vec2Length(const vec2 *pV) { float fLength2 = (pV->v[0] * pV->v[0] + pV->v[1] * pV->v[1]); float l = sqrt(fLength2); return l; } int segment2_findT(float *t, const segment2 *s, const vec2 *v) { float epsilon = 0.001; if( fabs(s->vDirection.v[0]) > fabs(s->vDirection.v[1]) ) { *t = (v->v[0] - s->vStart.v[0]) / s->vDirection.v[0]; if( fabs(v->v[1] - (s->vStart.v[1] + *t * s->vDirection.v[1])) > epsilon ) { return 1; } } else { *t = (v->v[1] - s->vStart.v[1]) / s->vDirection.v[1]; if( fabs(v->v[0] - (s->vStart.v[0] + *t * s->vDirection.v[0])) > epsilon ) { return 1; } } return 0; } vec2* segment2_IntersectParallel(vec2 *pOut, float *t1, float *t2, const segment2 *s1, const segment2 *s2) { // if the lines don't overlap, return NULL // else find t2 for t1 == 0 // if t2 in [0,1] return t2, t1 = 0 // else find t1 for t2 == 0 and t2 == 1 // if t1 < 0 return NULL (no intersection) // else return the smaller t1 and the corresponding t2 vec2 v; float t; // if the lines don't overlap, return NULL // else find t2 for t1 == 0 vec2Copy(&v, &s1->vStart); if(segment2_findT(t2, s2, &v)) { // printf("[vector] are not collinear\n"); return NULL; } // if t2 in [0,1] return t2, t1 = 0 if(*t2 >= 0 && *t2 <= 1) { vec2Copy(pOut, &s1->vStart); *t1 = 0; return pOut; } // else find t1 for t2 == 0 and t2 == 1 vec2Copy(&v, &s2->vStart); if(segment2_findT(t1, s1, &v)) return NULL; // if t1 < 0 return NULL (no intersection) if(*t1 < 0) return NULL; vec2Add(&v, &s2->vStart, &s2->vDirection); if(segment2_findT(&t, s1, &v)) return NULL; assert(t >= 0); if(*t1 > 1 && t > 1) return NULL; // else return the smaller t1 and the corresponding t2 if(t < *t1) { *t1 = t; *t2 = 1; vec2Copy(pOut, &v); } else { *t2 = 0; vec2Copy(pOut, &s2->vStart); } return pOut; } vec2* segment2_IntersectNonParallel(vec2 *pOut, float *t1, float *t2, const segment2 *s1, const segment2 *s2) { vec3 v1, v2; vec3 tmp1, tmp2; vec3 vIntersection; // compute the homogenous line coordinates tmp1.v[0] = s1->vStart.v[0]; tmp1.v[1] = s1->vStart.v[1]; tmp1.v[2] = 1; tmp2.v[0] = s1->vStart.v[0] + s1->vDirection.v[0]; tmp2.v[1] = s1->vStart.v[1] + s1->vDirection.v[1]; tmp2.v[2] = 1; vec3Cross(&v1, &tmp1, &tmp2); tmp1.v[0] = s2->vStart.v[0]; tmp1.v[1] = s2->vStart.v[1]; tmp1.v[2] = 1; tmp2.v[0] = s2->vStart.v[0] + s2->vDirection.v[0]; tmp2.v[1] = s2->vStart.v[1] + s2->vDirection.v[1]; tmp2.v[2] = 1; vec3Cross(&v2, &tmp1, &tmp2); // compute the intersection in homogenous coordinates and // project back to 2d vec3Cross(&vIntersection, &v1, &v2); pOut->v[0] = vIntersection.v[0] / vIntersection.v[2]; pOut->v[1] = vIntersection.v[1] / vIntersection.v[2]; // compute t1, t2 if(fabs(s1->vDirection.v[0]) > fabs(s1->vDirection.v[1])) *t1 = (pOut->v[0] - s1->vStart.v[0]) / s1->vDirection.v[0]; else *t1 = (pOut->v[1] - s1->vStart.v[1]) / s1->vDirection.v[1]; if(fabs(s2->vDirection.v[0]) > fabs(s2->vDirection.v[1])) *t2 = (pOut->v[0] - s2->vStart.v[0]) / s2->vDirection.v[0]; else *t2 = (pOut->v[1] - s2->vStart.v[1]) / s2->vDirection.v[1]; return pOut; } vec2* segment2_Intersect(vec2 *pOut, float *t1, float *t2, const segment2 *s1, const segment2 *s2) { // check if s1, s2 are parallel vec2 tmp; if( fabs(vec2Dot(&s1->vDirection, vec2_Orthogonal(&tmp, & s2->vDirection) )) < 0.1) { // printf("[vector] lines are parallel\n"); pOut = segment2_IntersectParallel(pOut, t1, t2, s1, s2); if(!pOut) { *t1 = 0; *t2 = 0; } } else { pOut = segment2_IntersectNonParallel(pOut, t1, t2, s1, s2); } return pOut; } float segment2_Length(const segment2 *s) { return vec2Length(&s->vDirection); } gltron-0.70/nebu/base/matrix.c0000644000076400001440000001065307705324231011751 #include "base/nebu_matrix.h" #include #include #include #include #include vec4* vec4Transform(vec4* pOut, const vec4* pV, const matrix *pM) { vec4 tmp; tmp.v[0] = pM->m[0] * pV->v[0] + pM->m[4] * pV->v[1] + pM->m[8] * pV->v[2] + pM->m[12] * pV->v[3]; tmp.v[1] = pM->m[1] * pV->v[0] + pM->m[5] * pV->v[1] + pM->m[9] * pV->v[2] + pM->m[13] * pV->v[3]; tmp.v[2] = pM->m[2] * pV->v[0] + pM->m[6] * pV->v[1] + pM->m[10] * pV->v[2] + pM->m[14] * pV->v[3]; tmp.v[3] = pM->m[3] * pV->v[0] + pM->m[7] * pV->v[1] + pM->m[11] * pV->v[2] + pM->m[15] * pV->v[3]; memcpy(pOut, &tmp, sizeof(vec4)); return pOut; } matrix* matrixIdentity(matrix *pOut) { memset(pOut, 0, sizeof(matrix)); pOut->m[0] = pOut->m[5] = pOut->m[10] = pOut->m[15] = 1; return pOut; } float matrixCofactor(const matrix *pM, int cf_row, int cf_col) { int row, col; float prod[6] = { 1, 1, 1, -1, -1, -1 }; int r = 0; float cf; for(row = 0; row < 4; row++) { if(row != cf_row) { int c = 0; for(col = 0; col < 4; col++) { if(col != cf_col) { prod[ ((c - r + 3) % 3) + 0 ] *= pM->m[ row + 4 * col ]; prod[ ((c + r + 0) % 3) + 3 ] *= pM->m[ row + 4 * col ]; c++; } } r++; } } cf = prod[0] + prod[1] + prod[2] + prod[3] + prod[4] + prod[5]; // printf("cf(%d,%d): %.3f\n", cf_row, cf_col, cf); return cf; } float matrixDeterminant(const matrix *pM) { float det = + pM->m[0] * matrixCofactor(pM, 0, 0) - pM->m[4] * matrixCofactor(pM, 0, 1) + pM->m[8] * matrixCofactor(pM, 0, 2) - pM->m[12] * matrixCofactor(pM, 0, 3); return det; } matrix* matrixAdjoint(matrix *pOut, float* pDet, const matrix *pM) { matrix tmp; int col, row; int sign = 1; float det = 0; for(row = 0; row < 4; row++) { for(col = 0; col < 4; col++) { float cf = matrixCofactor(pM, row, col); // tmp.m[row + 4 * col] = sign * cf; // warum hier zeile und spalte tauschen? tmp.m[col + 4 * row] = sign * cf; if(row == 0) det += sign * cf * pM->m[col * 4]; sign *= -1; } sign *= -1; // warum hier nochmal wechseln? } if(pDet) *pDet = det; memcpy(pOut, &tmp, sizeof(matrix)); return pOut; } matrix* matrixInverse(matrix *pOut, float* pDet, const matrix *pM) { matrix adjoint; float det; int i; matrixAdjoint(&adjoint, &det, pM); if(pDet) *pDet = det; if(det == 0) return NULL; for(i = 0; i < 16; i++) { pOut->m[i] = adjoint.m[i] / det; } return pOut; } matrix* matrixMultiply(matrix *pOut, const matrix *pM1, const matrix *pM2) { int row, col; matrix tmp; for(row = 0; row < 4; row++) { for(col = 0; col < 4; col++) { tmp.m[row + col * 4] = pM1->m[row + 0] * pM2->m[ 0 + col * 4] + pM1->m[row + 4] * pM2->m[ 1 + col * 4] + pM1->m[row + 8] * pM2->m[ 2 + col * 4] + pM1->m[row + 12] * pM2->m[ 3 + col * 4]; } } memcpy(pOut, &tmp, sizeof(matrix)); return pOut; } matrix* matrixTranspose(matrix *pOut, const matrix *pM) { matrix tmp; int i; for(i = 0; i < 16; i++) { tmp.m[i] = pM->m[ i / 4 + (i % 4) * 4 ]; } memcpy(pOut, &tmp, sizeof(matrix)); return pOut; } void matrixPrint(matrix *m) { int row, col; printf("[ "); for(row = 0; row < 4; row++) { for(col = 0; col < 4; col++) { printf("%.3f ", m->m[row + col * 4]); } printf("; \n"); } printf(" ]\n"); } matrix* matrixRotationAxis(matrix *pOut, float fAngle, const vec3 *vAxis) { float cosa = (float)cos(fAngle); float sina = (float)sin(fAngle); float x = vAxis->v[0], y = vAxis->v[1], z = vAxis->v[2]; float *m = pOut->m; m[0] = cosa + (1 - cosa) * x * x; m[1] = (1 - cosa) * x * y + sina * z; m[2] = (1 - cosa) * x * z - sina * y; m[3] = 0; m[4] = (1 - cosa) * x * y - z * sina; m[5] = cosa + (1 - cosa) * y * y; m[6] = (1 - cosa) * y * z + x * sina; m[7] = 0; m[8] = (1 - cosa) * x * z + sina * y; m[9] = (1 - cosa) * y * z - sina * x; m[10] = cosa + (1 - cosa) * z * z; m[11] = 0; m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 1; return pOut; } matrix* matrixTranslation(matrix *pOut, const vec3 *vTranslation) { float *m = pOut->m; matrixIdentity(pOut); m[12] = vTranslation->v[0]; m[13] = vTranslation->v[1]; m[14] = vTranslation->v[2]; return pOut; } matrix* matrixScale(matrix *pOut, const vec3 *vScale) { float *m = pOut->m; memset(pOut, 0, sizeof(matrix)); m[0] = vScale->v[0]; m[5] = vScale->v[1]; m[10] = vScale->v[2]; m[15] = 1; return pOut; } gltron-0.70/nebu/base/random.c0000644000076400001440000000152307675011524011725 /* Textbook standard linear congruent pseudo-random number generator (say that ten times quick) */ /* The generator returns numbers in 0..(2**31 - 1) */ #define PERIOD 2147483647 #define T_RAND_MAX PERIOD /* A is a "magic" constant calculated by IBM in the dawn of computing */ #define A 48271 #define Q 44488 #define R 3399 /* The seed of the generator, hopefully set by the user before rand is called */ static int seed = 42; /* Seeds the random number generator with the seed s */ void tsrand(unsigned int s) { seed = s % PERIOD; } /* Calculates a new random number */ int trand(void) { seed = A * (seed % Q) - R * (long)(seed / Q); if(seed < 0) seed += PERIOD; return seed; } /* Bonus function, returns a random number in [0..1) */ double tfrand(void) { return (double)trand()/PERIOD; } gltron-0.70/nebu/base/util.c0000644000076400001440000000145307702103041011407 /* small utility functions */ #include #include "base/nebu_random.h" #include "base/nebu_types.h" void randomPermutation( int N, int *nodes ) { int i; for(i = 0; i < N; i++) nodes[i] = i; for(i = 0; i < N - 1; i++) { int s, t; int tmp; t = N - 1 - i; // s = (int) ((float)( t + 1 ) * trand() / (RAND_MAX + 1.0f)); s = trand() % (t + 1); tmp = nodes[t]; nodes[t] = nodes[s]; nodes[s] = tmp; } } void clamp( float *f, float min, float max ) { if(*f < min) *f = min; else if(*f > max) *f = max; } void addList(List **l, void* data) { List *p; if(*l == NULL) { *l = (List*) malloc(sizeof(List)); (*l)->next = NULL; } for(p = *l; p->next != NULL; p = p->next); p->next = (List*) malloc(sizeof(List)); p->next->next = NULL; p->data = data; } gltron-0.70/nebu/base/system.c0000644000076400001440000000235707702103041011762 #include "base/nebu_system.h" #include "SDL.h" #include Callbacks *current = 0; static int return_code = -1; static int redisplay = 0; void SystemExit() { fprintf(stderr, "[system] shutting down SDL now\n"); SDL_Quit(); fprintf(stderr, "[system] exiting application\n"); } unsigned int SystemGetElapsedTime() { /* fprintf(stderr, "%d\n", SDL_GetTicks()); */ return SDL_GetTicks(); } int SystemMainLoop() { SDL_Event event; return_code = -1; while(return_code == -1) { while(SDL_PollEvent(&event) && current) { switch(event.type) { case SDL_KEYDOWN: case SDL_KEYUP: case SDL_JOYAXISMOTION: case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEMOTION: SystemHandleInput(&event); break; case SDL_QUIT: SystemExit(); break; default: /* ignore event */ break; } } if(redisplay) { current->display(); redisplay = 0; } else current->idle(); } if(current->exit) (current->exit)(); return return_code; } void SystemRegisterCallbacks(Callbacks *cb) { current = cb; } void SystemExitLoop(int value) { return_code = value; } void SystemPostRedisplay() { redisplay = 1; } gltron-0.70/nebu/filesystem/0000777000076400001440000000000007767023546011647 5gltron-0.70/nebu/filesystem/Makefile.am0000644000076400001440000000023107675011524013602 noinst_LIBRARIES=libfilesystem.a libfilesystem_a_SOURCES= \ filesystem.c file_io.c directory.c findpath.c AM_CFLAGS = \ -I$(top_srcdir)/nebu/include gltron-0.70/nebu/filesystem/Makefile.in0000644000076400001440000002020407767023245013622 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libfilesystem.a libfilesystem_a_SOURCES = \ filesystem.c file_io.c directory.c findpath.c AM_CFLAGS = \ -I$(top_srcdir)/nebu/include subdir = nebu/filesystem mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libfilesystem_a_AR = $(AR) cru libfilesystem_a_LIBADD = am_libfilesystem_a_OBJECTS = filesystem.$(OBJEXT) file_io.$(OBJEXT) \ directory.$(OBJEXT) findpath.$(OBJEXT) libfilesystem_a_OBJECTS = $(am_libfilesystem_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/directory.Po $(DEPDIR)/file_io.Po \ @AMDEP_TRUE@ $(DEPDIR)/filesystem.Po $(DEPDIR)/findpath.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(libfilesystem_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libfilesystem_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/filesystem/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libfilesystem.a: $(libfilesystem_a_OBJECTS) $(libfilesystem_a_DEPENDENCIES) -rm -f libfilesystem.a $(libfilesystem_a_AR) libfilesystem.a $(libfilesystem_a_OBJECTS) $(libfilesystem_a_LIBADD) $(RANLIB) libfilesystem.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/directory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/file_io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/filesystem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/findpath.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/filesystem/filesystem.c0000644000076400001440000000040407675011524014100 #include "filesystem/nebu_filesystem.h" #include void initFilesystem(int argc, const char *argv[]) { dirSetup(argv[0]); } int fileExists(const char *path) { FILE *f; if((f = fopen(path, "r"))) { fclose(f); return 1; } return 0; } gltron-0.70/nebu/filesystem/file_io.c0000644000076400001440000000157007675011524013327 /* this is a small wrapper around the basic file io functions, ie open, close, read, gets */ #include "filesystem/nebu_file_io.h" #ifdef IO_ZLIB file_handle file_open(const char *path, const char* mode) { return gzopen(path, mode); } int file_close(file_handle file) { return gzclose(file); } int file_read(file_handle file, void* data, unsigned int size) { return gzread(file, data, size); } char* file_gets(file_handle file, char* data, unsigned int size) { return gzgets(file, data, size); } #else file_handle file_open(const char *path, const char* mode) { return fopen(path, mode); } int file_close(file_handle file) { return fclose(file); } int file_read(file_handle file, void* data, unsigned int size) { return fread(data, 1, size, file); } char* file_gets(file_handle file, char* data, unsigned int size) { return fgets(data, size, file); } #endif gltron-0.70/nebu/filesystem/directory.c0000644000076400001440000000224407675011524013724 #include "base/nebu_types.h" #include #include #include #include #include #include #include #include List* readDirectoryContents(const char *dirname, const char *prefix) { DIR *dir; struct dirent *entry; List *l, *p; l = (List*) malloc(sizeof(List)); p = l; p->next = NULL; dir = opendir(dirname); if(dir == NULL) { fprintf(stderr, "warning: cannot open directory '%s'\n", dirname); return l; } while((entry = readdir(dir)) != NULL) { char *name; if(prefix == NULL || strstr(entry->d_name, prefix) == entry->d_name) { if(entry->d_name[0] != '.') { name = malloc(strlen(entry->d_name) + 1); memcpy(name, entry->d_name, strlen(entry->d_name) + 1); p->data = name; p->next = (List*) malloc(sizeof(List)); p = p->next; p->next = NULL; } } } closedir(dir); return l; } void makeDirectory(const char *name) { int result; if(access(name, R_OK)) { #ifndef WIN32 result = mkdir(name, 0x1ff); #else result = mkdir(name); #endif if(result) printf("cannot create dir '%s': %s\n", name, strerror(errno)); } } gltron-0.70/nebu/filesystem/findpath.c0000644000076400001440000000574507707043370013526 /* Loki_Update - A tool for updating Loki products over the Internet Copyright (C) 2000 Loki Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 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. info@lokigames.com */ /* I modified this file a little, removing unneeded features and making the thing compile ( Andreas Umbach ) */ #include #include #include #include #ifndef macintosh #ifndef WIN32 # include #endif #endif #ifndef PATH_MAX #define PATH_MAX 8192 #endif #if !defined(WIN32) && !defined(macintosh) && !defined(__APPLE__) void goto_installpath(const char *argv0) { char temppath[PATH_MAX]; char datapath[PATH_MAX]; char *home; home = getenv("HOME"); if ( ! home ) { home = "."; } strncpy(temppath, argv0, PATH_MAX); if ( ! strrchr(temppath, '/') ) { char *path; char *last; int found; found = 0; path = getenv("PATH"); do { /* Initialize our filename variable */ temppath[0] = '\0'; /* Get next entry from path variable */ last = strchr(path, ':'); if ( ! last ) last = path+strlen(path); /* Perform tilde expansion */ if ( *path == '~' ) { strcpy(temppath, home); ++path; } /* Fill in the rest of the filename */ if ( last > (path+1) ) { strncat(temppath, path, (last-path)); strcat(temppath, "/"); } strcat(temppath, "./"); strcat(temppath, argv0); /* See if it exists, and update path */ if (access(temppath, X_OK) == 0) { ++found; } path = last+1; } while ( *last && !found ); } else { /* Increment argv0 to the basename */ argv0 = strrchr(argv0, '/')+1; } /* Now canonicalize it to a full pathname for the data path */ datapath[0] = '\0'; if ( realpath(temppath, datapath) ) { /* There should always be '/' in the path */ *(strrchr(datapath, '/')) = '\0'; } if ( ! *datapath || (chdir(datapath) < 0) ) { fprintf(stderr, "Couldn't change to install directory\n"); exit(1); /* OK: critical, installation corrupt */ } } #endif gltron-0.70/nebu/scripting/0000777000076400001440000000000007767023546011465 5gltron-0.70/nebu/scripting/Makefile.am0000644000076400001440000000056507744242104013427 noinst_LIBRARIES=libscripting.a libscripting_a_SOURCES= \ scripting.c libscripting_a_LIBADD= \ $(top_builddir)/lua/src/liblua.a \ $(top_builddir)/lua/src/lib/liblualib.a # @top_srcdir@/lua/src/liblua.a \ # @top_srcdir@/lua/src/lib/liblualib.a AM_CFLAGS = \ -I$(top_srcdir)/nebu/include/base \ -I$(top_srcdir)/nebu/include/scripting \ -I$(top_srcdir)/lua/include gltron-0.70/nebu/scripting/Makefile.in0000644000076400001440000002010007767023246013434 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libscripting.a libscripting_a_SOURCES = \ scripting.c libscripting_a_LIBADD = \ $(top_builddir)/lua/src/liblua.a \ $(top_builddir)/lua/src/lib/liblualib.a AM_CFLAGS = \ -I$(top_srcdir)/nebu/include/base \ -I$(top_srcdir)/nebu/include/scripting \ -I$(top_srcdir)/lua/include subdir = nebu/scripting mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libscripting_a_AR = $(AR) cru libscripting_a_DEPENDENCIES = $(top_builddir)/lua/src/liblua.a \ $(top_builddir)/lua/src/lib/liblualib.a am_libscripting_a_OBJECTS = scripting.$(OBJEXT) libscripting_a_OBJECTS = $(am_libscripting_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/scripting.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(libscripting_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libscripting_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/scripting/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libscripting.a: $(libscripting_a_OBJECTS) $(libscripting_a_DEPENDENCIES) -rm -f libscripting.a $(libscripting_a_AR) libscripting.a $(libscripting_a_OBJECTS) $(libscripting_a_LIBADD) $(RANLIB) libscripting.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/scripting.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # @top_srcdir@/lua/src/liblua.a \ # @top_srcdir@/lua/src/lib/liblualib.a # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/scripting/scripting.c0000644000076400001440000000743007766302363013547 #include "nebu_scripting.h" #include "lua.h" #include "lualib.h" #include #include #include #include // static lua_State *L; lua_State *L; extern void init_c_interface(lua_State *L); void scripting_Init() { L = lua_open(0); lua_baselibopen(L); lua_strlibopen(L); lua_iolibopen(L); // init_c_interface(L); } void scripting_Quit() { lua_close(L); } void showStack() { int i; printf("dumping stack with %d elements\n", lua_gettop(L)); for(i = 0; i < lua_gettop(L); i++) { int type = lua_type(L, - (i+1)); switch(type) { case LUA_TNIL: printf("nil\n"); break; case LUA_TNUMBER: printf("number\n"); break; case LUA_TSTRING: printf("string\n"); break; case LUA_TTABLE: printf("table\n"); break; case LUA_TFUNCTION: printf("function\n"); break; case LUA_TUSERDATA: printf("userdata\n"); break; } } } int scripting_IsNilResult() { int result = lua_isnil(L, -1); lua_pop(L, 1); return result; } int getGlobal(const char *s, va_list ap) { int top = lua_gettop(L); int count = 0; while(s) { lua_pushstring(L, s); lua_gettable(L, -2); count++; s = va_arg(ap, char *); } lua_insert(L, top); /* move result to bottom */ lua_pop(L, count); /* restore stack */ return 0; } int scripting_GetGlobal(const char *global, const char *s, ...) { lua_getglobal(L, global); if(s) { va_list ap; va_start(ap, s); getGlobal(s, ap); va_end(ap); } return 0; } int scripting_SetFloat(float f, const char *name, const char *global, const char *s, ...) { va_list ap; if(global == NULL) { lua_pushnumber(L, f); lua_setglobal(L, global); return 0; } lua_getglobal(L, global); if(s) { va_start(ap, s); getGlobal(s, ap); va_end(ap); } lua_pushstring(L, name); lua_pushnumber(L, f); lua_settable(L, -3); lua_pop(L, 1); return 0; } int scripting_GetFloatResult(float *f) { if(lua_isnumber(L, -1)) { *f = lua_tonumber(L, -1); lua_pop(L, 1); /* restore stack */ return 0; } else { showStack(); return 1; } } int scripting_GetIntegerResult(int *i) { if(lua_isnumber(L, -1)) { *i = (int)lua_tonumber(L, -1); lua_pop(L, 1); /* restore stack */ return 0; } else { showStack(); return 1; } } void scripting_GetFloatArrayResult(float *f, int n) { int i; for(i = 0; i < n; i++) { lua_rawgeti(L, -1, i + 1); if(lua_isnumber(L, -1)) { *(f + i) = (float)lua_tonumber(L, 2); } else { fprintf(stderr, "element %d is not number!\n", i); } lua_pop(L, 1); /* remove number from stack */ } lua_pop(L, 1); /* remove table from stack */ } int scripting_GetStringResult(char **s) { int status; if(lua_isstring(L, -1)) { int size; status = 0; size = lua_strlen(L, -1) + 1; *s = malloc( size ); memcpy( *s, lua_tostring(L, -1), size ); /* printf("allocated string '%s' of size %d\n", *s, size); */ } else status = 1; lua_pop(L, 1); return status; } int scripting_CopyStringResult(char *s, int len) { int status; if(lua_isstring(L, -1)) { int size, copy; status = 0; size = lua_strlen(L, -1) + 1; if(size > len) { copy = len; status = 2; } else copy = size; memcpy( s, lua_tostring(L, -1), size ); } else status = 1; lua_pop(L, 1); return status; } void scripting_RunFile(char *name) { lua_dofile(L, name); } void scripting_Run(char *command) { /* fprintf(stderr, "[command] %s\n", command); */ lua_dostring(L, command); } void scripting_RunFormat(char *format, ... ) { char buf[4096]; va_list ap; va_start(ap, format); vsprintf(buf, format, ap); va_end(ap); scripting_Run(buf); } void scripting_RunGC() { lua_setgcthreshold(L, 0); } void Scripting_Idle() { scripting_RunGC(); } void scripting_Register(const char *name, int(*func) (lua_State *L)) { lua_register(L, name, func); } gltron-0.70/nebu/audio/0000777000076400001440000000000007767023546010564 5gltron-0.70/nebu/audio/Makefile.am0000644000076400001440000000032207675011524012520 noinst_LIBRARIES=libaudio.a libaudio_a_SOURCES= \ SoundSystem.cpp Source.cpp Source3D.cpp SourceCopy.cpp \ SourceEngine.cpp \ SourceMusic.cpp SourceSample.cpp AM_CXXFLAGS = \ -I$(top_srcdir)/nebu/include gltron-0.70/nebu/audio/Makefile.in0000644000076400001440000002105207767023244012540 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libaudio.a libaudio_a_SOURCES = \ SoundSystem.cpp Source.cpp Source3D.cpp SourceCopy.cpp \ SourceEngine.cpp \ SourceMusic.cpp SourceSample.cpp AM_CXXFLAGS = \ -I$(top_srcdir)/nebu/include subdir = nebu/audio mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libaudio_a_AR = $(AR) cru libaudio_a_LIBADD = am_libaudio_a_OBJECTS = SoundSystem.$(OBJEXT) Source.$(OBJEXT) \ Source3D.$(OBJEXT) SourceCopy.$(OBJEXT) SourceEngine.$(OBJEXT) \ SourceMusic.$(OBJEXT) SourceSample.$(OBJEXT) libaudio_a_OBJECTS = $(am_libaudio_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/SoundSystem.Po $(DEPDIR)/Source.Po \ @AMDEP_TRUE@ $(DEPDIR)/Source3D.Po $(DEPDIR)/SourceCopy.Po \ @AMDEP_TRUE@ $(DEPDIR)/SourceEngine.Po $(DEPDIR)/SourceMusic.Po \ @AMDEP_TRUE@ $(DEPDIR)/SourceSample.Po CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ CXXFLAGS = @CXXFLAGS@ DIST_SOURCES = $(libaudio_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libaudio_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/audio/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libaudio.a: $(libaudio_a_OBJECTS) $(libaudio_a_DEPENDENCIES) -rm -f libaudio.a $(libaudio_a_AR) libaudio.a $(libaudio_a_OBJECTS) $(libaudio_a_LIBADD) $(RANLIB) libaudio.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/SoundSystem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/Source.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/Source3D.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/SourceCopy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/SourceEngine.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/SourceMusic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/SourceSample.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .cpp.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(CXXCOMPILE) -c -o $@ `test -f $< || echo '$(srcdir)/'`$< .cpp.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(CXXCOMPILE) -c -o $@ `cygpath -w $<` CXXDEPMODE = @CXXDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/audio/SoundSystem.cpp0000644000076400001440000000370707675011524013477 #include "audio/nebu_SoundSystem.h" #include namespace Sound { System::System(SDL_AudioSpec *spec) { _spec = spec; _sources.next = NULL; _info.format = _spec->format; _info.rate = spec->freq; _info.channels = spec->channels; _mix_music = 1; // TODO: add 'master' volume for music and fx _mix_fx = 1; _status = 0; // sound system is not initialized } void System::Callback(Uint8* data, int len) { // printf("callback got called for %d bytes of data\n", len); // ensure silence memset(data, 0, len); if(_status == eUninitialized) return; List* p; int sources_mixed = 0; for(p = & _sources; p->next != NULL; p = p->next) { Source* s = (Source*) p->data; if(s->IsPlaying()) { // fprintf(stderr, "mixing source\n"); if(!( (s->GetType() & eSoundFX && ! _mix_fx ) || (s->GetType() & eSoundMusic && ! _mix_music) ) ) { if( s->Mix(data, len) ) sources_mixed++; } // fprintf(stderr, "done mixing %d sources\n", sources_mixed); } } } void System::AddSource(Source* source) { List* p; for(p = & _sources; p->next != NULL; p = p->next); p->next = new List; p->next->next = NULL; p->data = source; } void System::Idle(void) { /* idle processing */ List *p; for(p = & _sources; p->next != NULL; p = p->next) { Source *source = (Source*) p->data; // check if source is removable & has stopped playing if(source->IsRemovable() && !source->IsPlaying()) { // get rid of data p->data = p->next->data; List *tmp = p->next; p->next = p->next->next; delete tmp; delete source; if(p->next == NULL) break; } else { source->Idle(); } } } extern "C" { void c_callback(void *userdata, Uint8 *stream, int len) { // printf("c_callback got called for %d bytes of data\n", len); ((System*)userdata)->Callback(stream, len); } } } gltron-0.70/nebu/audio/Source.cpp0000644000076400001440000000235307700106462012431 #include "audio/nebu_Source.h" namespace Sound { Source::Source() { _system = NULL; _isPlaying = 0; _loop = 0; _removable = 0; _volume = 0.5; _type = 0; _mutex = SDL_CreateMutex(); _sem = SDL_CreateSemaphore(1); } Source::~Source() { // fprintf(stderr, "nebu_Source destructor called\n"); SDL_DestroyMutex(_mutex); SDL_DestroySemaphore(_sem); } int Source::Mix(Uint8 *data, int len) { return 0; } void Source::Reset() { } void Source::Start() { _isPlaying = 1; Reset(); } void Source::Stop() { _isPlaying = 0; Reset(); } void Source::Pause() { _isPlaying = 0; } void Source::UnPause() { _isPlaying = 1; } void Source::Idle() { } Uint8 Source::IsPlaying() { return _isPlaying; } void Source::SetRemovable() { _removable = 1; } Uint8 Source::IsRemovable() { return _removable; } void Source::SetVolume(float volume) { _volume = volume; } float Source::GetVolume() { return _volume; } void Source::SetLoop(Uint8 loop) { _loop = loop; } Uint8 Source::GetLoop() { return _loop; } void Source::SetType(int type) { _type = type; } int Source::GetType(void) { return _type; } void Source::SetName(char* name) { _name = name; } char* Source::GetName(void) { return _name; } } gltron-0.70/nebu/audio/Source3D.cpp0000644000076400001440000001303307704041045012614 #include "audio/nebu_Source3D.h" #include #include Uint8 tmp[65536]; #define USOUND 50 #define EPSILON 0.1f #define SOUND_VOL_THRESHOLD 0.1 #define VOLSCALE_BASE 1000 #define MAX(x,y) (( (x) > (y) ) ? (x) : (y)) /*! \fn int fxShift(float shift, Uint8 *target, Uint8 *source, int len) \param shift Shift of the frequency (new_frequency = shift * old_frequency) \param target Target buffer to mix into; format: Sint16 LR stereo \param source The buffer to mix from \param len The amount of bytes to mix into the target buffer \return The amount of samples read from the source */ int fxComputeShiftLen(float shift, int len) { return (int) ( (len - 1) * shift + 1 ); } int fxShift(float shift, Uint8 *target, Uint8 *source, int len) { int i, j; // amount of samples to mix/write len /= 4; for(i = 0; i < len; i++) { // LR pairs for(j = 0; j < 2; j++) { // channels Sint32 result = 0; int pa; float t; pa = (int) (i * shift); t = (i * shift) - pa; result = (Sint32) ( *( (Sint16*) target + j + 2 * i) * 1.0f + *( (Sint16*) source + j + 2 * (pa + 0) ) * (1.0f - t) + *( (Sint16*) source + j + 2 * (pa + 1) ) * (t) ); #define MAX_SINT16 ((1 << 15) - 1) #define MIN_SINT16 (- (1 << 15) ) if(result > MAX_SINT16) { result = MAX_SINT16; fprintf(stderr, "overflow\n"); } else if(result < MIN_SINT16) { result = MIN_SINT16; fprintf(stderr, "underflow\n"); } *( (Sint16*) target + j + 2 * i ) = (Sint16) result; /* *(Sint16*) (target + 2 * j + 4 * i) += (Sint16) ( *(Sint16*) (source + 2 * j + 4 * (k + 0) ) * ( 1 - l ) + *(Sint16*) (source + 2 * j + 4 * (k + 2) ) * ( l ) ); */ } } return 4 * fxComputeShiftLen(shift, len); } /*! \fn void fxPan(float pan, float vol, Uint8 *buf, int len) \param vol Volume (for distance attenuation), should be between 0 and 1 \param pan Panning, -1.0 is left, 1.0 is right, 0.0 is center \param buf The sample to be modified in-place, format: Sint16 LR stereo \param len Number of bytes */ void fxPan(float pan, float vol, Uint8 *buf, int len) { int i; float left_vol = - vol * ( -1.0f + pan ) / 2.0f; float right_vol = vol * ( 1.0f + pan ) / 2.0f; for(i = 0; i < len; i += 4) { *(Sint16*) (buf + i) = // *= left_vol (Sint16) (left_vol * *(Sint16*) (buf + i) ); *(Sint16*) (buf + i + 2) = // *= right_vol (Sint16) (right_vol * *(Sint16*) (buf + i + 2) ); } } namespace Sound { void Source3D::GetModifiers(float& fPan, float& fVolume, float& fShift) { Vector3& vSourceLocation = _location; Vector3& vSourceVelocity = _velocity; Listener listener = _system->GetListener(); Vector3& vListenerLocation = listener._location; Vector3 vListenerVelocity = listener._velocity; Vector3 vListenerDirection = listener._direction; Vector3 vListenerUp = listener._up; if( (vSourceLocation - vListenerLocation).Length() < EPSILON ) { fPan = 0; fVolume = 1.0f; fShift = 1.0f; return; } vListenerDirection.Normalize(); vListenerUp.Normalize(); Vector3 vListenerLeft = vListenerDirection.Cross( vListenerUp ); vListenerLeft.Normalize(); /* panning */ Vector3 vTarget = vSourceLocation - vListenerLocation; Vector3 v1 = vListenerLeft * ( vTarget * vListenerLeft ); Vector3 v2 = vListenerDirection * (vTarget * vListenerDirection ); Vector3 vTargetPlanar = v1 + v2; float cosPhi = vTargetPlanar.Normalize() * vListenerDirection; fPan = 1 - (float)fabs(cosPhi); if( vTargetPlanar * vListenerLeft < 0 ) fPan = -fPan; /* done panning */ /* attenuation */ // float fallOff = vTarget.Length2(); float fallOff = (float)pow(vTarget.Length(), 1.8f); fVolume = (fallOff > VOLSCALE_BASE) ? (VOLSCALE_BASE / fallOff) : (1.0f); /* done attenuation */ /* doppler */ fShift = (USOUND + ( vListenerVelocity * vTarget ) / vTarget.Length() ) / (USOUND + ( vSourceVelocity * vTarget ) / vTarget.Length() ); if(fShift < 0.5) { printf("clamping fShift from %.2f to 0.5\n", fShift); fShift = 0.5f; } if(fShift > 1.5) { printf("clamping fShift from %.2f to 1.5\n", fShift); fShift = 1.5f; } /* done doppler */ } int Source3D::Mix(Uint8 *data, int len) { if(_source->_buffer == NULL) return 0; if(_source->IsPlaying()) { int volume = (int)(_source->GetVolume() * SDL_MIX_MAXVOLUME); float pan = 0, shift = 1.0f, vol = 1.0f; int clen, shifted_len; GetModifiers(pan, vol, shift); // printf("received: volume: %.4f, panning: %.4f, shift: %.4f\n", vol, pan, shift); shifted_len = 4 * fxComputeShiftLen( shift, len / 4 ); clen = MAX(len, shifted_len) + 32; // safety distance assert(clen < _source->_buffersize); if(vol > SOUND_VOL_THRESHOLD) { // copy clen bytes from the buffer to a temporary buffer if(clen <= _source->_buffersize - _position) { memcpy(tmp, _source->_buffer + _position, clen); } else { memcpy(tmp, _source->_buffer + _position, _source->_buffersize - _position); memcpy(tmp + _source->_buffersize - _position, _source->_buffer, clen - (_source->_buffersize - _position)); } fxPan(pan, vol, tmp, clen); // fxshift mixes the data to the stream _position += fxShift(shift, data, tmp, len); if(_position > _source->_buffersize) _position -= _source->_buffersize; return 1; // mixed something } } return 0; // didn't mix anything to the stream } } gltron-0.70/nebu/audio/SourceCopy.cpp0000644000076400001440000000167307675011524013275 #include "audio/nebu_SourceCopy.h" #include namespace Sound { int SourceCopy::Mix(Uint8 *data, int len) { if(_source->_buffer == NULL) return 0; int volume = (int)(_source->GetVolume() * SDL_MIX_MAXVOLUME); // fprintf(stderr, "playing copy sample at %d, position: %d\n", volume, _position); int buffersize = _source->_buffersize; Uint8* buffer = (Uint8*) _source->_buffer; assert(len < buffersize); if(len < buffersize - _position) { SDL_MixAudio(data, buffer + _position, len, volume); _position += len; } else { SDL_MixAudio(data, buffer + _position, buffersize - _position, volume); len -= buffersize - _position; printf("end of sample reached!\n"); if(_loop) { if(_loop != 255) _loop--; _position = 0; SDL_MixAudio(data, buffer + _position, len, volume); _position += len; } else { _isPlaying = 0; } } return 1; } } gltron-0.70/nebu/audio/SourceEngine.cpp0000644000076400001440000000037507675011524013566 #include "audio/nebu_SourceEngine.h" namespace Sound { void SourceEngine::GetModifiers(float& fPan, float& fVolume, float& fShift) { Source3D::GetModifiers(fPan, fVolume, fShift); fVolume *= _speedShift; fShift *= _pitchShift; } } gltron-0.70/nebu/audio/SourceMusic.cpp0000644000076400001440000001104507702102757013435 #include "audio/nebu_SourceMusic.h" #include #include namespace Sound { SourceMusic::SourceMusic(System *system) { _system = system; _sample = NULL; _sample_buffersize = 8192; _buffersize = 20 * _sample_buffersize; _buffer = (Uint8*) malloc( _buffersize ); memset(_buffer, 0, _buffersize); _decoded = 0; _read = 0; _filename = NULL; _rwops = NULL; } SourceMusic::~SourceMusic() { // fprintf(stderr, "nebu_SourceMusic destructor called\n"); #ifndef macintosh SDL_SemWait(_sem); #else SDL_LockAudio(); #endif free(_buffer); if(_sample) Sound_FreeSample( _sample ); _sample = NULL; if(_filename) free(_filename); #ifndef macintosh SDL_SemPost(_sem); #else SDL_UnlockAudio(); #endif } /*! \fn void SourceMusic::CreateSample(void) call this function only between semaphores */ void SourceMusic::CreateSample(void) { _rwops = SDL_RWFromFile(_filename, "rb"); char *ext = _filename; for(int i = 0; *(_filename + i); i++) { if(*(_filename + i) == '.') ext = _filename + i + 1; } _sample = Sound_NewSample(_rwops, ext, _system->GetAudioInfo(), _sample_buffersize ); if(_sample == NULL) { fprintf(stderr, "[error] failed loading sample type %s, from %s: %s\n", ext, _filename, Sound_GetError()); return; } _read = 0; _decoded = 0; // fprintf(stderr, "created sample\n"); } void SourceMusic::Load(char *filename) { int n = strlen(filename); _filename = (char*) malloc(n + 1); memcpy(_filename, filename, n + 1); CreateSample(); } void SourceMusic::CleanUp(void) { _read = 0; _decoded = 0; if(_sample != NULL) Sound_FreeSample(_sample); } int SourceMusic::Mix(Uint8 *data, int len) { if(_sample == NULL) return 0; #ifndef macintosh if( SDL_SemTryWait(_sem) ) { fprintf(stderr, "semaphore locked, skipping mix\n"); return 0; } #endif // printf("mixing %d bytes\n", len); int volume = (int)(_volume * SDL_MIX_MAXVOLUME); // fprintf(stderr, "setting volume to %.3f -> %d\n", _volume, volume); // fprintf(stderr, "entering mixer\n"); if(len < (_decoded - _read + _buffersize) % _buffersize) { // enough data to mix if(_read + len <= _buffersize) { SDL_MixAudio(data, _buffer + _read, len, volume); _read = (_read + len) % _buffersize; } else { // wrap around in buffer fprintf(stderr, "wrap around in buffer (%d, %d, %d)\n", len, _read, _buffersize); SDL_MixAudio(data, _buffer + _read, _buffersize - _read, volume); len -= _buffersize - _read; SDL_MixAudio(data + _buffersize - _read, _buffer, len, volume); _read = len; } } else { // buffer under-run fprintf(stderr, "buffer underrun!\n"); // don't do anything } #ifndef macintosh SDL_SemPost(_sem); #endif return 1; } void SourceMusic::Idle(void) { if(_sample == NULL) return; // printf("idling\n"); while( _read == _decoded || (_read - _decoded + _buffersize) % _buffersize > _sample_buffersize ) { // if(_read == _decoded) printf("_read == _decoded == %d\n", _read); // fill the buffer int count = Sound_Decode(_sample); // printf("adding %d bytes to buffer\n", count); if(count <= _buffersize - _decoded) { memcpy(_buffer + _decoded, _sample->buffer, count); } else { // wrapping around end of buffer (usually doesn't happen when // _buffersize is a multiple of _sample_buffersize) // printf("wrapping around end of buffer\n"); memcpy(_buffer + _decoded, _sample->buffer, _buffersize - _decoded); memcpy(_buffer, (Uint8*) _sample->buffer + _buffersize - _decoded, count - (_buffersize - _decoded)); } _decoded = (_decoded + count) % _buffersize; // check for end of sample, loop if((_sample->flags & SOUND_SAMPLEFLAG_ERROR) || (_sample->flags & SOUND_SAMPLEFLAG_EOF)) { // some error has occured, maybe end of sample reached #ifndef macintosh SDL_SemWait(_sem); #else SDL_LockAudio(); #endif // todo: let playback finish, because there's still data // in the buffer that has to be mixed CleanUp(); // fprintf(stderr, "end of sample reached!\n"); if(_loop) { // fprintf(stderr, "looping music\n"); if(_loop != 255) _loop--; CreateSample(); } else { _isPlaying = 0; // todo: notify sound system (maybe load another song?) } #ifndef macintosh SDL_SemPost(_sem); #else SDL_UnlockAudio(); #endif } } // buffer has been filled } } gltron-0.70/nebu/audio/SourceSample.cpp0000644000076400001440000000341207675200466013602 #include "audio/nebu_SourceSample.h" #include #include namespace Sound { SourceSample::SourceSample(System *system) { _system = system; _buffer = NULL; _buffersize = 8192; _position = 0; _decoded = 0; } SourceSample::~SourceSample() { // fprintf(stderr, "nebu_SourceSample destructor called\n"); if(_buffer) delete _buffer; // Source::~Source(); } void SourceSample::Load(char *filename) { #define BUFSIZE 1024 * 1024 SDL_RWops *rwops; rwops = SDL_RWFromFile(filename, "rb"); Sound_Sample *sample = Sound_NewSample(rwops, NULL, _system->GetAudioInfo(), _buffersize ); if(sample == NULL) { fprintf(stderr, "[error] failed loading sample from '%s': %s\n", filename, Sound_GetError()); return; } Sound_DecodeAll(sample); _buffersize = sample->buffer_size; _buffer = new Uint8[_buffersize]; memcpy(_buffer, sample->buffer, _buffersize); Sound_FreeSample(sample); // fprintf(stderr, "done decoding sample '%s'\n", filename); _position = 0; } int SourceSample::Mix(Uint8 *data, int len) { if(_buffer == NULL) return 0; int volume = (int)(_volume * SDL_MIX_MAXVOLUME); assert(len < _buffersize); if(len < _buffersize - _position) { SDL_MixAudio(data, _buffer + _position, len, volume); _position += len; } else { SDL_MixAudio(data, _buffer + _position, _buffersize - _position, volume); len -= _buffersize - _position; // printf("end of sample reached!\n"); if(_loop) { if(_loop != 255) _loop--; _position = 0; SDL_MixAudio(data, _buffer + _position, len, volume); _position += len; } else { _isPlaying = 0; } } return 1; } } gltron-0.70/nebu/video/0000777000076400001440000000000007767023546010571 5gltron-0.70/nebu/video/Makefile.am0000644000076400001440000000022307675011525012526 noinst_LIBRARIES=libvideo.a libvideo_a_SOURCES= \ console.c pixels.c \ png_texture.c video_system.c AM_CFLAGS= \ -I$(top_srcdir)/nebu/include gltron-0.70/nebu/video/Makefile.in0000644000076400001440000002005307767023246012547 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libvideo.a libvideo_a_SOURCES = \ console.c pixels.c \ png_texture.c video_system.c AM_CFLAGS = \ -I$(top_srcdir)/nebu/include subdir = nebu/video mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libvideo_a_AR = $(AR) cru libvideo_a_LIBADD = am_libvideo_a_OBJECTS = console.$(OBJEXT) pixels.$(OBJEXT) \ png_texture.$(OBJEXT) video_system.$(OBJEXT) libvideo_a_OBJECTS = $(am_libvideo_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/console.Po $(DEPDIR)/pixels.Po \ @AMDEP_TRUE@ $(DEPDIR)/png_texture.Po $(DEPDIR)/video_system.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(libvideo_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libvideo_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/video/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libvideo.a: $(libvideo_a_OBJECTS) $(libvideo_a_DEPENDENCIES) -rm -f libvideo.a $(libvideo_a_AR) libvideo.a $(libvideo_a_OBJECTS) $(libvideo_a_LIBADD) $(RANLIB) libvideo.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/console.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/pixels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/png_texture.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/video_system.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/video/console.c0000644000076400001440000000412107675011525012301 #include "video/nebu_console.h" #include #include #include #define CONSOLE_DEPTH 100 #define CONSOLE_WIDTH 80 static char buffer[CONSOLE_DEPTH][CONSOLE_WIDTH]; static int position; static int offset; void consoleInit() { int i; for(i = 0; i < CONSOLE_DEPTH; i++) buffer[i][0] = '\0'; position = 0; offset = 0; // fprintf(stderr, "console initialized\n"); } void consoleAddLine(char *text) { int i = 0, x=0; while(i < CONSOLE_WIDTH - 1 && text[i] != 0) { buffer[position][i] = text[i]; i++; } buffer[position][i] = '\0'; /* fprintf(stderr, "added \"%s\" to console at buffer[%i] with " * " offset of %i\n", * buffer[position], position, offset); */ position++; /* reposition the buffer to avoid overruns - tim */ if(position >= 99){ for(i=0;i CONSOLE_DEPTH - 1) offset = CONSOLE_DEPTH - 1; } /* displayMessage post a message to the console and/or stdout/stderr. NOTE: Don't put newlines at the end of the format string, the function will handle adding them when appropriate. */ void displayMessage(outloc_e where, const char *fmt_str, ...) { char message[CONSOLE_WIDTH]; va_list ap; va_start(ap, fmt_str); if (where & TO_CONSOLE) { vsprintf(message, fmt_str, ap); consoleAddLine(message); } if (where & TO_STDOUT) { vfprintf(stdout, fmt_str, ap); fputc('\n', stdout); } if (where & TO_STDERR) { vfprintf(stderr, fmt_str, ap); fputc('\n', stderr); } } gltron-0.70/nebu/video/pixels.c0000644000076400001440000000404107675011525012144 #include unsigned char *scalePixelBitmap(unsigned char *source, int sw, int sh, int posx, int posy, int width, int height, int dw, int dh, int bytes) { int x, y; unsigned char *data; unsigned char byte; int i; int row; row = dw / 8; if(dw % 8) row++; data = (unsigned char*) malloc( row * dh ); for(y = 0; y < dh; y++) { byte = 0; for(x = 0; x < dw; x++) { int sx, sy; sx = posx + ((x * width) / dw); sy = posy + ((y * height) / dh); for(i = 0; (i < bytes) && (i < 3); i++) { if(source[bytes * (sx + sy * sw) + i] != 0) { /* printf("source value: (%d %d, %d): %d\n", sx, sy, i, source[bytes * (sx + sy * sw) + i]); */ byte |= (1 << (x % 8) ); break; } else { /* printf("source value: (%d %d, %d): %d\n", sx, sy, i, source[bytes * (sx + sy * sw) + i]); */ } } if((x % 8) == 7) { data[x / 8 + y * row] = byte; } } if(x % 8) data[x / 8 + y * row] = byte; byte = 0; } return data; } unsigned char *scalePixels(const unsigned char *source, int sw, int sh, int posx, int posy, int width, int height, int dw, int dh, int bytes) { int x, y; unsigned char *data; /* fprintf(stderr, "scaling from (%d,%d-%d,%d) in a (%d, %d)" "to (%d,%d), bytes: %d\n", posx, posy, posx + width, posy + width, sw, sh, dw, dh, bytes); */ data = (unsigned char*) malloc( dw * dh * bytes ); for(y = 0; y < dh; y++) { for(x = 0; x < dw; x++) { int sx, sy, j; int sx2, sy2; sx = posx + ((x * width) / dw); sy = posy + ((y * height) / dh); (sx == sw - 1) ? (sx2 = sx - 1) : (sx2 = sx + 1); (sy == sh - 1) ? (sy2 = sy - 1) : (sy2 = sy + 1); /* printf("%d, %d to %d, %d\n", x, y, sx, sy); */ for(j = 0; j < bytes; j++) { data[bytes * (x + y * dw) + j] = (source[bytes * (sx + sy * sw) + j] + source[bytes * (sx2 + sy * sw) + j] + source[bytes * (sx + sy2 * sw) + j] + source[bytes * (sx2 + sy2 * sw) + j]) / 4; } } } return data; } gltron-0.70/nebu/video/png_texture.c0000644000076400001440000001006607704041045013201 #include "video/nebu_png_texture.h" #include #include #if !defined(WIN32) && !defined(macintosh) #include #endif #define ERR_PREFIX "[load_png_texture] " #include FILE *f; void user_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { fread(data, 1, length, f); } png_texture* load_png_texture(char *filename) { unsigned int i; int bpc, color_type, zsize; png_texture *tex; /* the following is defined in */ png_uint_32 x, y; png_structp png_ptr; png_infop info_ptr; png_byte **row_pointers; f = fopen(filename, "rb"); if(f == NULL) { fprintf(stderr, ERR_PREFIX "can't open file %s\n", filename); return NULL; } png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0); if (!png_ptr) return NULL; info_ptr = png_create_info_struct(png_ptr); if (!info_ptr){ png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); return NULL; } /* png_init_io(png_ptr, f); fprintf(stderr, "png, after init io \n"); */ /* I need to do this, otherwise it crashes on win32 */ png_set_read_fn(png_ptr, 0, user_read_data); /* fprintf(stderr, "png, after init user_read_data\n"); */ png_read_info(png_ptr, info_ptr); /* fprintf(stderr, "png, after read info \n"); */ png_get_IHDR(png_ptr, info_ptr, &x, &y, &bpc, &color_type, 0, 0, 0); if(color_type != PNG_COLOR_TYPE_RGB && color_type != PNG_COLOR_TYPE_RGB_ALPHA) { png_destroy_read_struct(&png_ptr, &info_ptr, 0); fprintf(stderr, ERR_PREFIX "wrong png_color_type\n"); fclose(f); return NULL; } if(bpc != 8) { png_destroy_read_struct(&png_ptr, &info_ptr, 0); fprintf(stderr, ERR_PREFIX "wrong bitdepth: %d\n", bpc); fclose(f); return NULL; } switch(color_type) { case PNG_COLOR_TYPE_RGB: zsize = 3; break; case PNG_COLOR_TYPE_RGB_ALPHA: zsize = 4; break; default: fprintf(stderr, "unknown png color type\n"); return NULL; } tex = (png_texture*) malloc(sizeof(png_texture)); tex->data = malloc(x * y * zsize); tex->width = x; tex->height = y; tex->channels = zsize; /* get pointers */ row_pointers = (png_byte**) malloc(y * sizeof(png_byte*)); for(i = 0; i < y; i++) row_pointers[i] = tex->data + (y - i - 1) * zsize * x; png_read_image(png_ptr, row_pointers); png_destroy_read_struct(&png_ptr, &info_ptr, 0); free(row_pointers); fclose(f); return tex; } void unload_png_texture(png_texture *tex) { free(tex->data); free(tex); } #define TARGET(X, Y, I) (mip->data + I + mip->channels * (X + Y * mip->width)) #define SOURCE(X, Y, I) (source->data + I + \ source->channels * (X + Y * source->width)) png_texture* mipmap_png_texture(png_texture *source, int level, int clamp_u, int clamp_v) { png_texture *mip; int i; int x, y; int fx, fy; if(level != 1) return NULL; mip = (png_texture*) malloc(sizeof(png_texture)); mip->channels = source->channels; fx = (source->width > 1) ? 2 : 1; fy = (source->height > 1) ? 2 : 1; mip->width = source->width / fx; mip->height = source->height / fy; mip->data = (unsigned char*) malloc(mip->width * mip->height * mip->channels); /* simple linear filtering */ for(i = 0; i < mip->channels; i++) { for(y = 0; y < mip->height; y++) { for(x = 0; x < mip->width; x++) { /* *( TARGET(x, y, i) ) = ( *( SOURCE(x * fx, y * fy, i) ) + *( SOURCE((x + 1) * fx, (y + 1) * fy, i) ) + *( SOURCE((x + 1) * fx, y * fy, i) ) + *( SOURCE(x * fx, (y + 1) * fy, i) ) ) / 4; */ int sx, sy, xoff, yoff; sx = fx * x; sy = fy * y; xoff = fx - 1; yoff = fy - 1; *( mip->data + i + mip->channels * ( x + y * mip->width ) ) = ( *( source->data + i + source->channels * ( sx + sy * source->width) ) + *( source->data + i + source->channels * ( sx + xoff + sy * source->width) ) + *( source->data + i + source->channels * ( sx + xoff + (sy + yoff) * source->width) ) + *( source->data + i + source->channels * ( sx + (sy + yoff) * source->width) ) ) / 4; } } } return mip; } gltron-0.70/nebu/video/video_system.c0000644000076400001440000000527307706720761013366 #include "Nebu_video.h" #include "SDL.h" #include "SDL_opengl.h" static SDL_Surface *screen; static int width, height; static int flags; static int fullscreen; extern int video_initialized; void SystemSwapBuffers() { SDL_GL_SwapBuffers(); } void SystemInitWindow(int x, int y, int w, int h) { width = w; height = h; } void SystemInitDisplayMode(int f, unsigned char full) { int bitdepth, zdepth; flags = f; fullscreen = full; if(!video_initialized) { if(SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "[system] can't initialize Video: %s\n", SDL_GetError()); exit(1); /* OK: critical, no visual */ } } if(flags & SYSTEM_DOUBLE) SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1); if(flags & SYSTEM_32_BIT) { zdepth = 24; bitdepth = 32; } else { zdepth = 16; bitdepth = 16; } if(flags & SYSTEM_DEPTH) SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, zdepth); if(flags & SYSTEM_STENCIL) SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 8); else SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 0); video_initialized = 1; /* FIXME: bitdepth value unused */ } void SystemSetGamma(float red, float green, float blue) { SDL_SetGamma(red, green, blue); } int SystemCreateWindow(char *name) { int f = SDL_OPENGL; if(fullscreen & SYSTEM_FULLSCREEN) f |= SDL_FULLSCREEN; if( (screen = SDL_SetVideoMode( width, height, 0, f )) == NULL ) { fprintf(stderr, "[system] Couldn't set GL mode: %s\n", SDL_GetError()); exit(1); /* OK: critical, no visual */ } SDL_WM_SetCaption("GLtron", ""); glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT); SDL_GL_SwapBuffers(); return 1; } void SystemDestroyWindow(int id) { /* quit the video subsytem * otherwise SDL can't create a new context on win32, if the stencil * bits change */ /* there used to be some problems (memory leaks, unprober driver unloading) * caused by this, but I can't remember what they where */ SDL_QuitSubSystem(SDL_INIT_VIDEO); video_initialized = 0; } void SystemReshapeFunc(void(*reshape)(int, int)) { } int SystemWriteBMP(char *filename, int x, int y, unsigned char *pixels) { /* this code is shamelessly stolen from Ray Kelm, but I believe he put it in the public domain */ SDL_Surface *temp; int i; temp = SDL_CreateRGBSurface(SDL_SWSURFACE, x, y, 24, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0x000000FF, 0x0000FF00, 0x00FF0000, 0 #else 0x00FF0000, 0x0000FF00, 0x000000FF, 0 #endif ); if (temp == NULL) return -1; for (i = 0; i < y; i++) memcpy(((char *) temp->pixels) + temp->pitch * i, pixels + 3 * x * (y - i - 1), x * 3); SDL_SaveBMP(temp, filename); SDL_FreeSurface(temp); return 0; } gltron-0.70/nebu/input/0000777000076400001440000000000007767023546010622 5gltron-0.70/nebu/input/Makefile.am0000644000076400001440000000024107675011525012557 noinst_LIBRARIES=libinput.a libinput_a_SOURCES= \ system_keynames.c input_system.c AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include gltron-0.70/nebu/input/Makefile.in0000644000076400001440000001755407767023246012614 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ noinst_LIBRARIES = libinput.a libinput_a_SOURCES = \ system_keynames.c input_system.c AM_CFLAGS = \ -I$(top_srcdir)/lua/include \ -I$(top_srcdir)/nebu/include subdir = nebu/input mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libinput_a_AR = $(AR) cru libinput_a_LIBADD = am_libinput_a_OBJECTS = system_keynames.$(OBJEXT) input_system.$(OBJEXT) libinput_a_OBJECTS = $(am_libinput_a_OBJECTS) DEFS = @DEFS@ DEFAULT_INCLUDES = -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ depcomp = $(SHELL) $(top_srcdir)/depcomp @AMDEP_TRUE@DEP_FILES = $(DEPDIR)/input_system.Po \ @AMDEP_TRUE@ $(DEPDIR)/system_keynames.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ DIST_SOURCES = $(libinput_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libinput_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign nebu/input/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libinput.a: $(libinput_a_OBJECTS) $(libinput_a_DEPENDENCIES) -rm -f libinput.a $(libinput_a_AR) libinput.a $(libinput_a_OBJECTS) $(libinput_a_LIBADD) $(RANLIB) libinput.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/input_system.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/system_keynames.Po@am__quote@ distclean-depend: -rm -rf $(DEPDIR) .c.o: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< .c.obj: @AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ $(COMPILE) -c `cygpath -w $<` CCDEPMODE = @CCDEPMODE@ uninstall-info-am: tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic uninstall-am: uninstall-info-am .PHONY: GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic tags uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/nebu/input/system_keynames.c0000644000076400001440000000525607675011525014122 #include "input/nebu_system_keynames.h" #include "input/nebu_input_system.h" custom_keynames custom_keys = { { { SYSTEM_JOY_LEFT, "joy0 left" }, { SYSTEM_JOY_RIGHT, "joy0 right" }, { SYSTEM_JOY_UP, "joy0 up" }, { SYSTEM_JOY_DOWN, "joy0 down" }, { SYSTEM_JOY_BUTTON_0, "joy0 button 0" }, { SYSTEM_JOY_BUTTON_1, "joy0 button 1" }, { SYSTEM_JOY_BUTTON_2, "joy0 button 2" }, { SYSTEM_JOY_BUTTON_3, "joy0 button 3" }, { SYSTEM_JOY_BUTTON_4, "joy0 button 4" }, { SYSTEM_JOY_BUTTON_5, "joy0 button 5" }, { SYSTEM_JOY_BUTTON_6, "joy0 button 6" }, { SYSTEM_JOY_BUTTON_7, "joy0 button 7" }, { SYSTEM_JOY_BUTTON_8, "joy0 button 8" }, { SYSTEM_JOY_BUTTON_9, "joy0 button 9" }, { SYSTEM_JOY_BUTTON_10, "joy0 button 10" }, { SYSTEM_JOY_BUTTON_11, "joy0 button 11" }, { SYSTEM_JOY_BUTTON_12, "joy0 button 12" }, { SYSTEM_JOY_BUTTON_13, "joy0 button 13" }, { SYSTEM_JOY_BUTTON_14, "joy0 button 14" }, { SYSTEM_JOY_BUTTON_15, "joy0 button 15" }, { SYSTEM_JOY_BUTTON_16, "joy0 button 16" }, { SYSTEM_JOY_BUTTON_17, "joy0 button 17" }, { SYSTEM_JOY_BUTTON_18, "joy0 button 18" }, { SYSTEM_JOY_BUTTON_19, "joy0 button 19" }, { SYSTEM_JOY_LEFT + SYSTEM_JOY_OFFSET, "joy1 left" }, { SYSTEM_JOY_RIGHT + SYSTEM_JOY_OFFSET, "joy1 right" }, { SYSTEM_JOY_UP + SYSTEM_JOY_OFFSET, "joy1 up" }, { SYSTEM_JOY_DOWN + SYSTEM_JOY_OFFSET, "joy1 down" }, { SYSTEM_JOY_BUTTON_0 + SYSTEM_JOY_OFFSET, "joy1 button 0" }, { SYSTEM_JOY_BUTTON_1 + SYSTEM_JOY_OFFSET, "joy1 button 1" }, { SYSTEM_JOY_BUTTON_2 + SYSTEM_JOY_OFFSET, "joy1 button 2" }, { SYSTEM_JOY_BUTTON_3 + SYSTEM_JOY_OFFSET, "joy1 button 3" }, { SYSTEM_JOY_BUTTON_4 + SYSTEM_JOY_OFFSET, "joy1 button 4" }, { SYSTEM_JOY_BUTTON_5 + SYSTEM_JOY_OFFSET, "joy1 button 5" }, { SYSTEM_JOY_BUTTON_6 + SYSTEM_JOY_OFFSET, "joy1 button 6" }, { SYSTEM_JOY_BUTTON_7 + SYSTEM_JOY_OFFSET, "joy1 button 7" }, { SYSTEM_JOY_BUTTON_8 + SYSTEM_JOY_OFFSET, "joy1 button 8" }, { SYSTEM_JOY_BUTTON_9 + SYSTEM_JOY_OFFSET, "joy1 button 9" }, { SYSTEM_JOY_BUTTON_10 + SYSTEM_JOY_OFFSET, "joy1 button 10" }, { SYSTEM_JOY_BUTTON_11 + SYSTEM_JOY_OFFSET, "joy1 button 11" }, { SYSTEM_JOY_BUTTON_12 + SYSTEM_JOY_OFFSET, "joy1 button 12" }, { SYSTEM_JOY_BUTTON_13 + SYSTEM_JOY_OFFSET, "joy1 button 13" }, { SYSTEM_JOY_BUTTON_14 + SYSTEM_JOY_OFFSET, "joy1 button 14" }, { SYSTEM_JOY_BUTTON_15 + SYSTEM_JOY_OFFSET, "joy1 button 15" }, { SYSTEM_JOY_BUTTON_16 + SYSTEM_JOY_OFFSET, "joy1 button 16" }, { SYSTEM_JOY_BUTTON_17 + SYSTEM_JOY_OFFSET, "joy1 button 17" }, { SYSTEM_JOY_BUTTON_18 + SYSTEM_JOY_OFFSET, "joy1 button 18" }, { SYSTEM_JOY_BUTTON_19 + SYSTEM_JOY_OFFSET, "joy1 button 19" } } }; gltron-0.70/nebu/input/input_system.c0000644000076400001440000001026407705332112013430 #include "input/nebu_input_system.h" #include "input/nebu_system_keynames.h" #include "base/nebu_system.h" #include "scripting/nebu_scripting.h" #include "SDL.h" #include static float joystick_threshold = 0; void SystemGrabInput() { SDL_WM_GrabInput(SDL_GRAB_ON); } void SystemUngrabInput() { SDL_WM_GrabInput(SDL_GRAB_OFF); } void SystemWarpPointer(int x, int y) { SDL_WarpMouse(x, y); } void SystemHidePointer() { SDL_ShowCursor(SDL_DISABLE); } void SystemUnhidePointer() { SDL_ShowCursor(SDL_ENABLE); } void SystemMouse(int buttons, int state, int x, int y) { if(current) if(current->mouse != NULL) current->mouse(buttons, state, x, y); } void SystemMouseMotion(int x, int y) { if(current) if(current->mouseMotion != NULL) current->mouseMotion(x, y); } extern char* SystemGetKeyName(int key) { if(key < SYSTEM_CUSTOM_KEYS) return SDL_GetKeyName(key); else { int i; for(i = 0; i < CUSTOM_KEY_COUNT; i++) { if(custom_keys.key[i].key == key) return custom_keys.key[i].name; } return "unknown custom key"; } } void SystemHandleInput(SDL_Event *event) { char *keyname; int key, state; // int skip_axis_event = 0; static int joy_axis_state[2] = { 0, 0 }; static int joy_lastaxis[2] = { 0, 0 }; switch(event->type) { case SDL_KEYDOWN: case SDL_KEYUP: if(event->type == SDL_KEYDOWN) { state = SYSTEM_KEYSTATE_DOWN; } else { state = SYSTEM_KEYSTATE_UP; } keyname = SDL_GetKeyName(event->key.keysym.sym); key = 0; switch(event->key.keysym.sym) { case SDLK_SPACE: key = ' '; break; case SDLK_ESCAPE: key = 27; break; case SDLK_RETURN: key = 13; break; default: if(keyname[1] == 0) key = keyname[0]; break; } /* check: is that translation necessary? */ if(key) current->keyboard(state, key, 0, 0); else current->keyboard(state, event->key.keysym.sym, 0, 0); break; case SDL_JOYAXISMOTION: if( abs(event->jaxis.value) <= joystick_threshold * SYSTEM_JOY_AXIS_MAX) { // axis returned to origin, only generate event if it was set before if(joy_axis_state[event->jaxis.which] & (1 << event->jaxis.axis)) { joy_axis_state[event->jaxis.which] &= ~ (1 << event->jaxis.axis); // clear axis key = SYSTEM_JOY_LEFT + event->jaxis.which * SYSTEM_JOY_OFFSET; if(event->jaxis.axis == 1) { key += 2; } if(joy_lastaxis[event->jaxis.which] & (1 << event->jaxis.axis)) { key++; } current->keyboard(SYSTEM_KEYSTATE_UP, key, 0, 0); } else { // do nothing } } else { // axis set, only generate event if it wasn't set before if(! (joy_axis_state[event->jaxis.which] & (1 << event->jaxis.axis)) ) { joy_axis_state[event->jaxis.which] |= (1 << event->jaxis.axis); key = SYSTEM_JOY_LEFT + event->jaxis.which * SYSTEM_JOY_OFFSET; if(event->jaxis.axis == 1) { key += 2; } if(event->jaxis.value > 0) { key++; joy_lastaxis[event->jaxis.which] |= (1 << event->jaxis.axis); } else { joy_lastaxis[event->jaxis.which] &= ~(1 << event->jaxis.axis); } current->keyboard(SYSTEM_KEYSTATE_DOWN, key, 0, 0); } else { // do nothing } } break; #if 0 if (abs(event->jaxis.value) <= joystick_threshold * SYSTEM_JOY_AXIS_MAX) { skip_axis_event &= ~(1 << event->jaxis.axis); break; } if(skip_axis_event & (1 << event->jaxis.axis)) break; skip_axis_event |= 1 << event->jaxis.axis; key = SYSTEM_JOY_LEFT + event->jaxis.which * SYSTEM_JOY_OFFSET; if(event->jaxis.axis == 1) key += 2; if(event->jaxis.value > 0) key++; current->keyboard(SYSTEM_KEYSTATE_DOWN, key, 0, 0); break; #endif case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: if(event->type == SDL_JOYBUTTONDOWN) state = SYSTEM_KEYSTATE_DOWN; else state = SYSTEM_KEYSTATE_UP; key = SYSTEM_JOY_BUTTON_0 + event->jbutton.button + SYSTEM_JOY_OFFSET * event->jbutton.which; current->keyboard(state, key, 0, 0); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: SystemMouse(event->button.button, event->button.state, event->button.x, event->button.y); break; case SDL_MOUSEMOTION: SystemMouseMotion(event->motion.x, event->motion.y); break; } } void SystemSetJoyThreshold(float f) { joystick_threshold = f; } gltron-0.70/art/0000777000076400001440000000000007767023550007313 5gltron-0.70/art/Makefile.am0000644000076400001440000000002307675056047011263 SUBDIRS = default gltron-0.70/art/Makefile.in0000644000076400001440000002200307767023243011270 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ SUBDIRS = default subdir = art mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ uninstall-info-recursive all-recursive install-data-recursive \ install-exec-recursive installdirs-recursive install-recursive \ uninstall-recursive check-recursive installcheck-recursive DIST_COMMON = Makefile.am Makefile.in DIST_SUBDIRS = $(SUBDIRS) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign art/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique $(LISP) TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || etags $(ETAGS_ARGS) $$tags $$unique $(LISP) GTAGS: here=`CDPATH=: && cd $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = .. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done for subdir in $(SUBDIRS); do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ clean-generic clean-recursive distclean distclean-generic \ distclean-recursive distclean-tags distdir dvi dvi-am \ dvi-recursive info info-am info-recursive install install-am \ install-data install-data-am install-data-recursive \ install-exec install-exec-am install-exec-recursive \ install-info install-info-am install-info-recursive install-man \ install-recursive install-strip installcheck installcheck-am \ installdirs installdirs-am installdirs-recursive \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-recursive tags tags-recursive uninstall \ uninstall-am uninstall-info-am uninstall-info-recursive \ uninstall-recursive # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/art/default/0000777000076400001440000000000007767023550010737 5gltron-0.70/art/default/artpack.lua0000644000076400001440000000000007675152304012767 gltron-0.70/art/default/babbage.0.png0000644000076400001440000021563507313120370013057 PNG  IHDR\rfgAMA|Q cHRMz%u0`:o(IDATxb?(ţxdbbb`X@L b= 6b#4l*4S5fAi!$y&&T\g @ĺPwRU+ApPEbPQN  bf4~λ uB@q|E–\(楈(5/!YwGmIGO}.yv\ELpAw,PafCFM8b+] 7Eq6@OfmWMY##\yE?[葔h!8 ٳ1Fo)F @  NH4 t@lL;%8 Td$G ${CՀ2G$T (Yiį s`~te^AՁ .@)<ɴqď w2ȟ  kOavʐiݠ$n f+3@r("@AL[@nڃn? ;0 mح lB5(DɮY-$*\XF܈.\o/υ6nm`8*y7II*hơg6c'I& A)JyIʲyK,;fI}OɞNM4 @7jZX7]e^h*l4qmEqcaZ> r# =3M1 >eYaY׉ .ܟxD(nE4Ml2EQe=…}ٹoǶ,5'r]s&3ZHnTnTmx0Zw]p%1*J2`S]T ʊD~tA|8mۊ4Ma8C8h̝~/'\%eIaR ~Wh"+s)%C7˫`oݬ`iC LdEQ$<M0a@ۓcƬ BA? XG1@,$trpHl~Ƞ#k6."t*t:UJ],;B 8}ݻ R(Ϭ/yfz}XU՟Ol$,c|t}_RiOҹaE=w]WV+AVa}k2l lE 4҂jS<<KLC(muHEV㞸=7.Vha(R8~UEbWdk:A%Iu,wEmmN_,KQLD۶ mmK]5]a>w'= }Hm)J}%$=4EbEBYl,%{֮!EnV#H , BO7k?&6@Ls.ecH8㼮s `(?i=۝+:Mғ͆4Mm!b +aJX`oꃖ,TWώ>UIYJcx7 5<z? ƧKE۶e4 Jo_k AtC(\PPs "n!QJDebYg7ͺH"G C܋F"[wp&W'fNQy}6>K=m.1gfKVUe6,6y xB l0)-sT›85Y3;V /lܯ H+L,"u]+iׇa  l%7#'jf}?MAHϝN ~v+R6M=:L~@9g|F~CǺ&kf$itO$?>cBp # K_3{ 4v$*47$;ǏbtI(v  `D2y^$s˲WL2uItM,.@eNR)%p=oU&1HJ0`(q6rˆ`w \}B}Q5џa퍒ލEaU/h/ L3M2$k9mI1DZ44S-Ŗ 8Vk,LfռM=9H|޷i=`ȁ0 M='UU "UlY0 g]3V`*??l-k )B$}G,@A^=,Rf`@dug;,o@L0ɻX}V(&Re),4a5^xǜ{Zw I=d(; LٶNP" lb]_zim&S}r~U?[5tFoXpa~ִ8*k>.IW׵Ȭb{/ձCE6ϳ/y(cb, 2W(8 &0d~T踮 Q`UUi#@\*;N[v^5B ||KwqW,Jq`%%E @p\;u@ ,|pL Q$8hG~qgyR0 $%1Xn ÐU}”t'ּY`)dk>R3~{-Y(Q E@zEۋ\rO80H%(z\p~*rQT4Z'@ֶ-ˌN:<Æpv}QȲl 11M<=TUU׮Fh QEX2PtHTH`)w!Jrz"rsP(P㜛.5羿pH x!^47P심y7km؋Fn+B"Z7 ̭]`F1 Hi3N9|H-<aUYu,&_QT9AW gq` ɂӐ1:eGah-÷`0uA3Osy@O 9 `q(˲ۃڷ:n$ C{XVߥ_i]aU’ o@iUٌdrnjLER;7~:-5|W`h RJ#,~ѥm۞(5mէO7w#a Sx2Y#0P"u\Y6 .et`(H_?zy%ќ& K͙P5|j0lwNaYJPF ;בRȓp0A .<!|o(ë4L3NoTl"8`=jwWKpc9WirT0Nevkq^~-LG+KgZPj< EwG0E  AA=E0Hj?]XhBJlvv& b 6O 8gށiQ{O&IۍE-DUӶmPRhw_ٵ~ZxRJ$Aǩ|S'SD ADhRbgY2TSEuY_`o?D㿓Ab`PC=5٘ P7=` R(jg7J=%.FOŬ&^B3a聜)uJ*Cx yi'H^ #E$RJh,O ҢJI3tX拉k'n4g<'THlƴm79Du,{/ZYg󭭇gsRJζ C1S/4 :;\dE^\&`\1a50޹2/ZJsNev0e<^5I)K 6Cah- R`&`L9ܻaD=ǖRP8 'S}ׯHEpmh4jJM?ǽ]Z#yQb:m;6ژ8sPV[=@-4nJlt!,s$jN@_ eyc;b%1e%@zw|O9a 6x,Xr>܅pLƨJ0ҥ ' 0i?>oy- _BK䷿dEIEʱ:4(|Z+mۊ^iZ{F_,Ft 8)+BQBX:9Gm=o8>lpb \|¨;RhP}-h@`6%;g Da+)e:'pOpDC 'TBJʅ9Dt`%`{fŤ,B& jN CNn|`r T}poIQW!IcuG?iz mȠ]\gBv(vdo+.B>6Pu yũSeOUU-bڢ ,FyeOxN.mے@S jgo74>ĵ% m5̂ +=GQdʲ4y/=ϛcoq']/T)-Va'6ȯ1n@P\)R9Oq-;8ΕTQ(̳9-D]fwggzB$ W3QƕeU(Cjom&㊷PơUBR A7>o?w,EQla#}]a?;aw!FQ"I|6=7L8^nu˺c>򪪲 oQt!%!mE "w1@E9Tp ::{- D B 5dvg;w?,v&/u]r IQvu΍MX۶&X=sO0wHUUߋ2<>|S( O E?c.Ȁ9x<70(oe'ؐ8h%Xmr~. )%QR JzV˲\Be.r>6t1twWx(x9}d08wfd$57>9:}O߳RL>s6 Qr 7E|b 8-;2BAuܿs; w!@ rE `a`n(U9QhkAJ >쮻)뺆q.?7$[qp$0>۶5w* (l[ƴC{N$j޿)D]IHd]{r`@4,.ɥuy:ل**1IJ,mGdp}ۛUN9AcibUU1oX40ᢾ"}oitr]0~|& 9 px ]a^KH KVu@HTp8o C;2 Ah\b@C| v'ZR3 t.Gs<_kmKR2Ti S!h/G"o$e!+c !Xz8ӎy'd64Z@}^Ў1i eSlACZ9-=AkrP-h φ}Fg1TT4< 1GTa$τt*@ m݃ @|8@͞À۟0u)@g*w x@Pa 2сt 6`{jIڊNBվp] 5XA52!EA5'(3CA݂c@-/pA94Z ]Zd#7ЎCh0hUXn-&a bZZ :tH[O)jh h@tp9d$Av((Y {w0Q470?DxpKXZߙpWFh;ئ`Jy }ژ6ڟ d Qܳ qr! y#Zꘞ~9}Z~e@.A@ H0\J̠k@tӁA=-+V *@-N{$;AX` wdhi$7oX`tAg@g؁ GPaѮ( w8@\(,x '\C&hb4F-}ɖ|yI\3[}@EBsAK;T뽯s8V!kO&| LĘ[*'֚R*0Sh\ [LXc2DzcLAd^(~YSFA7Zk-)))E`&TR@5.(a@#rae6lo>ׯg}kF%{A Լ:s1EFF2 vaڤ : Tj&j%lP62rΝ :|*0w/..s rGkTz'BΝ;BNb`nd%6lϟ?ݾ}tK02إ=zq"5g@* c1 И gAw8 0MN]8AQ{9F\[Rń3UPBea1o$Z=ZYmslxk+I R59=KO^07,]V72026it9wc @0 At<*?PiY"M B3Hww@so- 9g@-'P2сB YUK^tG~rIUrt4 e0&٭RұkQXjlO c,E$Cht?Ĭirӓ @`.e/Ҫ/T# = IE-Z"@93<㷫5YƠ$]t)=8GTR 9{s-< $)RX_7A1} Jq>po KF!^> ޭ{@ P?Ξ=oǎ^\ہ'h폸f3x޴i]`LP+tfOp-^P34 jZ׭[>C; cʁA \.`7 4Ȩ G>> `ff4j5z@GSVG,{5hAӺ`H L6QTjXTnvP-+~o<2a-Pgjl>( ?PM jb ˳N: bQBB6 ꗁ]J }Rrʔ)\޽c,bv@7i` hph7s]]+P-[[[5APV0+=89s&L )))"PQQ! %%%{n h!Z9dݣ0QvHrTA*&@AKWξfF!=Lh^80"%BN X{~! a>Z]#59m 4M)S=nGD~tz*3Yn 8g˲\PI`aEO(d-26xRUY#k9m\)JS0J)ug awMk]gpJWۊW< 3DlԍoId%"k{ [!Z7ai MI|u]q6w- 9X``5PS[k}WT[|?\auGQ Z=(Ќ9`L<6MsNӴ/˲{?q|mVb`, "cF"J;N7B2ډ&SUU<%" X $I$ C}_4*Kz5&ug0 aйkJ!c삻.`CȒ/Es4\{J ǐB/m/wޗO&va۞7;+&=aVK`GG@BtAS\Q05΍&bOtmVN+j}3Q֕9ǹ=O^*LQȮr9sBM2,6DG/:ۓ`DQt]ǘXRJ&6jb6 _ #d9%C@XXųr>h``bF&ζ޼yŏQ#b#Bq1&/xKܥػ6i[+ص_Z[ ⇉rsTkP!yت DXu#A>BCvVCN1D)9QOՐ[D ),vCubIAlss%z7^Ckkx!qFRk) B53TcU 9c[K'F n,97ԫ LWBeO"3[Y[4w)Y` #5}B( QB 0fG9yܣb}>gǓUvVZfljxLPa68~yo.R;, k!]')m  nz\` ʓi L 2ZPHi"F؃<g1fNCVo2&wDWᴖ:QJycv3 |c u 1}O19g$XwJ)Y`^ڝii;%D\:^Zm&_^@L@P%0pq5>`h5wڃ:v1h@x{С̙r  5]WCph( Yooo]?%Ҡ>MA t0J̙3ӕ&O ZwZ4h U$ED@e^TPw8Pn؍pK\ `bn^82j֤&ԤM}1c蜛ĐrZp&mle@p]<4 x12\;(UN_s)媵0 <;N`-Qn)%UKߒax}{~B`Qh@t{WJ1]ι15 tRJ??cCކAH*e6el`)M*ϱJ {g{1>cm/V>8p_PPVI=<:=IljK O߻ |l(-`B{cX}_nMQ`Rг-2TbZɟ|.`ZJLRJ-sgl DQ$&`AVn\X! !X+K?wia(kbYC5R{iAq@d! kPjȔՈE,rAc<|3g0(s8w<`yrܸVڔ7Hwsqo,+1Ruv;a F +t52IFb^rpE?KgH ‘߳`8FA|$"̫@km1)VđAgm/y(j:O 3v[~LAdq@13n`b@ ] n.:\OҠ{M]+ATj@0xq)N 8q`/@MMP-8ďtB.y%%u Z-d,25A %7g] 7A53yL/Z/C >YJL'VtPK,$$v b'Ͽwb `/@v#+h%`x8{Gy6_?~nuPѩS^^p4΋P5d(@>h hlG+==!00a]\\Ձ |P!nƐYKٍ?>سg#`[.]>>3f0FFFVK}wg(.HNCf@in=# j}|ɺ JvH"Zk2`l rpMe;G6??d42 Xj`AfPW tS GƁ@igJ< E 1ECQu@5l`v_} _įKAcR baP+Fm %t) h=d^ (h0 --aȸh=l]:VZ& Z֩(帠E>ZMHuu!7J%h6{qa{uST?tW:FSK%<99QolIC|zE=/)s#kg a@DDmkQ+?rj KdĐ"'G=B<Cf f@0 LT+C0hyk~ԥաms}}E3'&1q$l֗] m:?3ȯ` HHN^Cz> Y+"ZNQu]uB, qmTdJAB-^mw;|@$=0LiX(zNG=o,2ٜ=l[DQD"{ϹXLN'fJ%4 8Nt]LSfc"HB$<, nd2fPHs~ C|uq6=V+%L"Nr ˉp8,;<*52"}{4l{37?)7rJ"xJuu*%1 bjx|tX: JhA%Iy[5{'OV>E? cv/ӷZ.0 JG0YmfzE>G" yd\ 1^/z"UG 7g>VS2 V+1 l6z.p8=ȘL/L_8b 껻xj$"&-mR)(X`+X`(b)" vfz H$ ;.Jd\F;n!_eBfi-<޿q":oa|w:㱪ĚL&n1L f3Q^QVl6\4Oj~WMA#X X,i>99xtb?۶PLFFgl6C8b@A&t:EۥN !g 14^ú$@(2#&Sq!0'Bفs|!e/ 12 s["^j5Rf~_KR;17 g2ʲĊ8v8P*?K';J1> zEQױ픞ű1Y [h4o \.!k@Ւi\1q"8' XBvz=,Q93e5?娫Θ)gg!D&2 !@µqa+.<y b_IH&NwUѪqxQ?ЮHcB۶EnS}{eObic?(ۅiS5!*C8/6YH*AXgc,ǶmHMzK-N,?+ VZ h^CP)!@.SУC$E/!2g 4M( 7 )um9y[W^֦JLus/`.TTZ}[HMTݮY8 e/n]W7MB˰{CALp"VUeL[Y4Fc_&YוU7MU;ڠi@;%ЁV,@2G H@aGP9'!gg!DHc%|^ )HL#nvI$[,=s Tٶ^gNr-.$Y]0E`2ѧ2[UUQ=)^,iF|B?{77d(60Z':1DîLY>g'؏#ఓl `t%di^<گGoAfKfkJ33}#:=4Ă]{q<ϱѨ-4ݜFП, _ 0 lJFkmLFcYPS:8;{ ;PrmM-ly߰ACM(Lpv[AW`P; rj OwQ-N+,q2P@)0CFxsY,q: 7#@.:X4hȑٛUw DTUU"$=8^2RE 8A8*rFZжm,5s C+s@$o_p)T>3B%%С b|fR:=g^;͵!0YıX R)~2 2*vg4MTu>:0zM @ CMOK+x=nW:oJ 8$/{ ^ e .E:}uJK89۟#O-]<|3 CPP- @Iz䵂1آ`l@@nޒI g_%_?rֆQ՜ogu΄`g|>OfdMB`Iwұm' Maǃ3Ũђ\1q! <tqK޼v5 4^B)Ͽu߂tIR "E w<@%!tOcn] ήB@:,IH~iQag<[J$1rYxe'~oׁ{`=4??{)_:S~zki{n}ch!rZ4M: eaA.M4D+:9]l J3f>ڶk 4%P-9V+ZCP})'0{)R "5_Gc+=C(HOTR"{`jĽu]c*#@@Iֻ8_n[b:<+ ~m9oF/wSiFdGZ4#yHtyvڴ,ˆЙm蝳wD]{\_I. 9Xrg%*#vGU|ADUH(f4뽥}0MSɋq3h8)Ӹ'.aJAd:fbu"$G~  "_ #gg0Cᩂ. ݩx׽Lo%^гBNM30jҙ%@(#i7\0+̅:B1SGB|3%Ca8 &n56 frqwQxRok솫M\ݺ`m0%!sowP h^9Е6I1UƧ7M^V#kڜ'2~eώ!sm5 bP!w3mhX/DJW Ht$ 蠦H\$]"YɼD6Li ,_Y{s]Ey&<"9Fl`?tZ(yn NO$ܱ=޳tg -Ӎ:%@mk7Mc( --چጠ88.2|P^a&A <a;4aPY1aG\/s aH7hӒH-J{8VHDY@%}5M@ `4n\{\{ccğ&nDB}.9٨rWwcPA-C (e,e3Įuz/mcGДL˔MUq+b Q.7 )oP7/,#}87Gkiz `#'6o}O8bbU%HQ̐WgL+:BJ'fZÚ2du=!M6 P Ή@fk@~! lT;m'>cg\E1Q$vVj?Jla)=x @٤0 Qnk9p˗7̈[&f~|9`iWF !<%=JJAtJDR.0)rJ/ɇDzXK`AHg 2S?J5YرAk?dvk3R4/= =𕝕v^' nTj$I%cE\ 9ө!Ml<8gMCA Eh;x7;G܃p)CMNBڔM3\jCkK6sBdijFs_VWs_<Bb/A9Dyo?pm:K)Z|LT٪RS` 1SHa 躬I0fʀH::X`Ec佣ZL,pIAqd$_Z*HU iU;gd7Hx'U€A=%!_v @l2kgQ0T(C52e1OjE(XԪZ>Fl3! M4 Yd$vBzZ/kig G@>ЃM,k3|?㿨'l t\<e\MU<;QeiT:2Xd%+\K?w;k@`(`eY~yna0bLuF6I}?ʞ% 4u]ǪSƗX&[E^eDiڶ$t6/,UfuAa xa_"[WGմ)`Q(,B [I)rBҤ/xsTD|2O ‚D7":,u]ϕJm2GڜEqw"Ǹ o2|,PUY4?E‹oYt@AMǁgg  C8kIc>3BPyJQ֯ h*'Р6yESq`\A`' 7H;{a #D b, kpt)rm9A@JA>6YK(xn_o4@IdsZKو_d랔VbP;D@ᤘMof sIFE^ԐE;ύ6 ;mIo~\QB˕& "Q$֟IǙD507M,>2CJPJ>ebcA85gyMyNrmA `gI]! ape;.%h;s͊zf|VB_jPM#J_d䨳M]| .RJ""JNŔՔR$ Mn9;!ۙܽ|^y&a?o^o'<`!UEՁ``K1RHW+mUxd*\VaZlJ_-馴I' ) pͦNFGOޚVUZ}we: r~ "rw,cg 2k" +4F;ClFbݔ^w?tYߞ_?B#pEg%h(+zK0^wq_O!\Oe/N%ⰖvwId29s5ЊnێyA*:婝&\_.}}6ż#`qa(+@ٛc/W]sCSSEShS"EQ| K;ra+]{c ;u R`n%BWn !#vk$ėu2I qt02ވ4B튱o3Y<)sZ>O,I1? )s=! a(a2N\9#5OY`DŽhz5HJt\ ?ߵڬwW!dz'XPU&)[%w$-rޔs9Jϻei׷kj ~:km43]Bsw ܀::7eِrHMV&A ¹ r.p r.PEFDjVq7E(Ex=y@"CqP~X}CHɤwn%.m9P 1@H\AjI]LőmO| 7{YRKx%:[eÅMLg1G7aYy㊢pep@^5 ЁJ4<)ˮ҆,Gh!qCC4g <|GH=A=(T>^-}^U$@Z& yɰ\u9w yqD'ZMӄ4.~}_O/; Bq#C$%ӺNrKB^޾%E7@m\e) @ ב^u-8H+*:vM(8yǹH~,8Ҵ0W ;j`Ŝ^Ƨˈ"P66mdkP'yM0 |&}a/C @1/#/cO*6[צ]rk*)x<O#C9pY1;'&t=j~.o. Yȱ&'6M ogy>S~j? y6]Uscl'0  ʛ˘-+g0 ?oCN| e+M$Mӥ#y}.ڌxOވiH斘yDgG۠8c[ vfp[5H /˺Fkztߝ ,ugݭ`UFP,/q }Ar@Wר`K8b<.M}g,I ]'ys [o/ii{oJ׍ayM JQ0  l ;fe@'g(`B.@htzN9Ak8AlкX(ARrM8@҃ 3d&xh~r7 P1 } >|_WRVYQwr@> 0 >/SLī'٫g6=6Kڵ;f8}6%bkR ^ls^:6xUP˄S\&ṢțMsk1`|¾q?cA\ͭkXkCovݺvsS,>qָgDoB?~IL=с>^v)@@{7k-.n{zy01jiՁO!m&I@/)MvGbKR@1@@6K dRSCz56QܻԦ tMf*nm",cG2:~ ,~hnb مZ@8ނN(M>sIux<62xs;@3\ĭs1| ©=m^zGe]k0/>ԇ^R 0F[X`@:!T(җ2e> >~oFйЖ$%Q9z!k4,MS .-t]qLN4m[L&dYeYVo6/-".֡.pKX,XETVjnLӤ$Ih^l6E(><^a-aax{>rd͆lFh_sF|!f VMϽIa;'f-P~[0Os B q/})DZT*岥iA"_Q~,$-Z*l AT=P8$H2] R>c̾s29%:U$M{jۿĻ*ttyt ?pv BQLҦ-Lu4ql:2hx| 3 $NL$)z~xYԤ71A{/|pwzط0bb%6ɞm!iL/tl:NQ@etD#'2z}Euh!lcx8Sˀ~=!k]EB7Mcl[SsxFP0@_wsÁiljeY&C8B6UI)=wN?\\?ca%e@K=?γpmQ֧|,1J0D7m6=}!>[%RI-0P h4{qh8k/d=W0f.YEQr (F>O&ql{X,觵Zӳܢ?pv CQ):+B&-s:dt)%+dpr' $ ҦA9=}"cwEQ}Fљ)mt<4L|sw4 67Ial ip.j"N]Q~8jE~o &VNރsƍR1v;p~ji $iA9(,Y7Ʒe7ҨuǏv)T_@TC$e{b1 . y#C_i:$I,dԮScA tEE#,qP. }+Bs044\WQ^IV:yVNi糽\.truɹ e}Z]|pNozdM `knu0RB'@ |]<(5<!ߩǚo#X;( VPP 8 8(djn (tNSҚBil<_h@+B;}}qϹQ]gEqzi_.y$XamE[F&qC TߒA(ܭKuM[*7jTr|ynOY=N&TƏL `zdSO )eJG:a'Ǖ{6 :1WoZ jtZn$[PmbWс(6 C;` dJ '_;]JQ f{gvc2H[74/xeZU3XG"~SoаIkqlFh j4)8D#qE d- 0:̗O؇@E£rzl? C j0 +e`0YD+S k7^#}k? X 4( @``!IMx =r\ \#H7d㮕Ae!dQMM`!.dfyy|"?A,ʋ 2 iWxtEsJe H%&Ti?mm(iFCP@E|k8@6R%:y|oAӿMC5lTV//hQEQ׵i˜2qL ʭ/~>dYf2)"nt n#nN!nE`8$nuXt@AC:2 <Gtf^Χ&zR.;1^'Lk9 m+;t]7(o1(6れ#~2Çǹc}]C:ҹI֭33z4ge73ˉ͑AGH9^eurs~ DQFn1g=[B=L<&n̪iv$馪^7f ¦Jыzo|@ւFUDҮS;u]g7PF;0`oǿ RH~ =cMLj̨e2&`e;Y#T, fJu*=|{1jhX(\tp' ÐO Vܴ> H\k}œei ~99f^S{(cLs>)|F?ɾTgS1{+k6|OHc܄ r2_3hP4V$3;D& 0,?kϟpX0yXoyoC97m[)E>Ӆ}'f!.f7PN#!'g [ kO.H# 'j ?$lF64PޗRB'! 'DEI4c>ґDſ͢P&n44VD4\u[g<责O|#B!\ݐE n(QU կ)r6?si;*)uEӒ: @=cK,C4Ey&qa p87@Bba@X_CR&ĎԿSӒuvB;-5GKHp8ڒuaEWBX%뤨RZ%NzO*؁ %c|K|2/4$S9tfr-,)խh"aD6܏zŸq>Υm۵Ox]aw+"DͻE0d͢&Ys§];iы Ř0/a$ ):V{" hSaYs]Gd;os:Gx3"N/UR:Bܒ8a =lԻ=_OX{܄ [Fq(\l%Wp}*"ka+ Bμ7},W_kڟׁ}׏EQ샚QF]ۮ"Є ל HGUBdڶ}iר/ɞ㷧,"QhQ) 4`V$K~-R0P]뮂v*&ût@ѧe[j}*a sCRL2AŷwoI A.oR!{@IЪcպܣi겋y\ߘwZ=>xFE6PD5DOɽ|h^r0 W<#p/ 7uJ$"G7lJ4y/#=9^0}-԰() ;H/BI@|gRh/I.Pdam6^f_V9$p(&}^P#nFf yP}ۄ.xp aʛOn_zb°s<)ߤkhUUi\rLZ/Xg|m*|ڶmVu,Bμ^3]CΆ 1y^N!bH[HJBUrS^@J~$}6QجYD&5@FpJz@i"i"}xײ y%7XZٙ73oG3o1&˲cp%6wY)!;~\ %Iצݟ%Y/N(<[Ӿ{ 4M}.zIAf2p!ʞigk\8dTecMa(xgE"$&QW+,jd(.w]ק :SӅ)=a˲@l qsB"j{k۶&-sL40|9忀rnR(rG`m\n' f`35v8L~ EcUU[ Ǖ+rEh?z&J-@Z'pG,~Vmp=c1 ȃ2a<t`5ϳ1ܭW(@5{ Şj}J`w;>»۵m[XW}-ǐ`)`2?,*<%$E5#` a_*5Ti^*CCWHgpG@YiPU>BRڹf7 ӚE刘{]zU/(M2?WA:LtNA TknbXsI&RtSaD@{kQ5y^ keBd|QE{A!%)|R1MӴ :^o'&:bld<+o8y8n?@n Hip"gx+9& 2sW$bB-|YPtSJ< OD ˢl @@>n?s.#^=gc@{ιRG>ӸT4Ӂ0GR*ȘU1n@E[)qCmz*n $1#%2v[K8-w83$I.BXX2 +?v".*z񼿩*th[`bkIg" )blBѷqr1%VZӡӣB{,ˎ^*b 7=η+ckzyeg˶m_0 ܀ 5GcޭWUU4MOd 8d3ͱoH8 ǁr u,Y } *U|!3ȷʲ싢!X#9O!Ng4\As|?['!`Q([Np)un7H9{TȂhAXafEq{giջ=] ( _k:EkGT\r[A5vHw,)㛶Uq=uɉ 9 lzB[う8o4g cXkߣ Q=pi=7P[ƪ18sٜ98< C'^}*8?Vg{Odn!:T3t^z80ݐ-UjrXt` hj##og Daե^"; R=P(|5jl@ fK&ORgٰpw7!.Ju@ͱw4P•pxC;/d@] I0(ir HP?(N< =BǍqdv>8wДro,ͱVZnʅ x w^)B~;l׀{ЇB&k]׉8&h/ xLv p[cbsڈ ܏vތ1 /4iC (tfՋyoI;v]>#K Zٍhi ߱vhgDBE7ME<0 q9!h;a lO#]z.BwZo b`]e~$:~+T  {kCVMA !V܆ޅk%@NLˆm[c a)?ۯ'_˜>4Ͼ\ہq~~W;"gdGabd dz9Nއ)xvg;{y&+9#_3(LmxH؅nܧM0 ! vG,pAºWpѵ c :f"!j'6t^xBR8afpL;96MsF4MW4auk7(971kրXċuYΟC^mN(;/ rkA|LeQ]܊X cEQk3OX/|cAeeÃAoE< 0WjneZJ:ễj<hcWVJ+`72k?7'c[|v_eo'pi] A&":Hch_C QƸ&hJ;vt'$QuޖLmڶ^oxyw!%l8I)5YHgWGюq ]"R*xg( P)TQj$OP*cP(H*B8?ȕ1e?:kjmmԆxW99՛n Y}|g]*1 EoŒ3 #WV7uTX%ꔡ,6 de.0K>㹔rӆfdC&>C*@H)Z*cY@bfái H!.q9?AOޒl1F~1mχzݧI4MA4T O: ۑ`Y0$R/\>ұB7F#q&7GWHV[kY=Ƅ/^PfnG ~'F@A]RGaT )P3lb? _@hLfk@-PԪ bg@Mr\3p2@K{CCq aF0 ܂gqΣ`!  ތ O#r?W0Q.@sA'NBfs1~#39V~\an?6r0P th1 oJF6"zX;{A {)BX H,Xϳl$H0p='Bդiޙ>ݐ-X 1~F(n k)\k]utFA$ڶ4=:%72"@b4?N/+Ͷ`ORw117gY6hx&tO:3yݏ`y$:mdu|ᣛ!o6%GXDhh[^EQX5M8ybm$4:-;zk9}΁O*iQCʮ0 [Y9ofPn3wDISw6(5+%%Mf[6ʒR,(R៘|h4s[=9.Iya&nSBl6>5ɐ'b4NI&FdeM ̷ݕt_EᏇA \*hX~!NI !EQjB}[l6^q8sE.\.D0o[N$(@o`@^W(8Rl FjʵZN'e ڜ27AYy4)>P wP8].׻fD"Mz>zpd H<̍ = jI0a|v;m* dX|>؃Ȩ_4x]9?aT|{[1f5n7R)L&$;W*3/kr$-(8YYwm{kq,?Z-U~lZ7),%|UUex<;r9DLO䆌w'} &Qؗ!p! $E@$6QH@AlN(oG !Xݙ7;w{$(ǔW0ƑY&jhݿjU~fGm5 $ /97} sݮ Idh4#VX*Rt6i?zkRGwNM x:ns$ c^k6)#_.GV\R_*9=T*b!T^ %녰p} I G }Gy_EX@oR3rtwy C>m8'K梒Gq9G<"H/赀h,,AfbaKvNGj5̻Sf9Ha* @x>f/plT.tZ\O%}.x^C> ub0fIwTuf萹b`P30x4R7s)"A 8w3OQc]Fa0 e 3÷mk|(SKVܓ\QŘiE;*J8A}I|A SէirURr.& ţ ^ݲ^x^w2qYpKhؙI吘bAf%M6Š>dGc|\tu3<.q{nug=B=D>9tz>oб%d4 5)9`콣϶m {g|wTӋ@B(\ϋ~^F4TkΣpDCq7gcv6; CAVFW(!qVa@ l6]xz>h7FMH@靹g;ҫ t(YEFYss]p u0W&ԣy,2ԓ~DZ"Bvd2*u9 Ԣ HJ0Pe%Ib+nJSβRx*cR -u'?y Р=o}LyK{(@/1:23)-Uӭjާ-7i hx(jLb.svr'dYlNnw_x{8 ^ Ï&⺍+SS5}CcPF;I$2 ǁq)UU)ȭsF1t[`lGu` | ٴ axMo *xuSH%4:!%wݙwt}AWg`Ud!JE @o/}5"좦Kb[UU Ez-TPƨq0`64ŮBFΣW:4P44x/ u[ቍ8ch9վؿۮlD;'Ps/lTQ#$2NTyvQG G@qPkqY XͰHZEAQQcc^wU&Ǐ¹qhu'f=nv=]Uw{yļk/ =*^%EʹE@h\\"~!XZ~)}9;{ ڀ*A_pv8@M(s9eAb+$.WnEb;yϛ$0vOr{ X.qm{է/}Λ6io" LȺ%e[r%]9zٜG bblH voxXټ<@r(ǽ}ʼnUi{Ch]ЃJĴqMd u~_RQ8zۜ㉶r ƙ0 j2☛p+ [/oeh"&p(G;TN._0v!?Já۫49.imW6>ZMMKK*U4MUFkrsJq<}4r !vOڏMn@ IRQsތc.+_lJӑg~ϓ/c'85Pp;L$|?>rGfU0kq}ej<9Q }\.sܺY)Z#0{ EBf^QTK_ 2б #(ǻ p:;^we)Jd>oIx8dٹᢹ CU۝h"*+~XSB0>I%ȵj/-iȬ/jT=w;]==έA [eʽTMӴ T=] e>[1@GQ00DU!iďN@O=+51V^qXPP:BKKyb|{ϘI.!G3 Yp4\d8K{\c08yaEQi Qea‹/_]1T=$OGtx h󰓢($TUL\y~S%buvל q"0NŢIG~i?6J}(DK1KIVIlRX D|.§@C DG8^=6oq[Z882&MOI>NIj@;`(d6ėOb??fwq cfglIazF(ƒ.MS-vd~UZЂk- Mq\pJ)8'mh,w Ѿkv*x^ pv:@okt\|:XoH+ FQ/14Ty@e"jq`6&t%%I4'6 Mh 1rhgfӂgbrmYޫr|O=7*8+H^A /0 "g^ȳD&An%˲Ƣ(<+E9)e :5 }P,7RYr#b/! !y|OS"@= Qs VGME#Xc5Pg/ ik/-<()?Y`4juPlo#cGѝh$`Q4y i[mk G:<nR(y.x Ǒ/?5Dcہ 4i;fޛi2.<,tu"(2AVuiRސ᠚LI(!IX.gqQnl2͢RH ]M}[Tʸ\fD<[7|7p;#>(9BbGjb׷yiDCObK;"]mgYRja~ϽM5tDk]Ɉj8socd(ZSWOWa\UDG3Ah KCsMsV=.<Wp쌩!y'ƅ L % D%ܑ՜s;kma(^:Hߋ3<  *(W? Vev0L8Z.XO& cʹ7B Y MӤm)Wn6s'89'xj o !@PBB62a, K{Pk`ڒlq3AhL\11#Wcd+`\q_mUPP46H05 @Ha)' &fvfwmZiqZ׶m(i4Y!GhC'Y9eVE ӊ|I6 l,KkfwTU+CY 5~6/i{k>ǩKލ㸗a1QRL#mty>S-0k0)  :a-u/yL'"b-2Ӝn80lF1%(?KV&A 0w\JI_hLRHG=(yľY*rGѹ<+^]G(}nLJ K]`W{D[l|ev_;Bra,3 \F3*yNe]Zp,~VDeJa 9=D,kJ P툷|R ӊ ᑚu ]k `8q;%.2p:הBZ?}g韡0 2GIi2MGV-mb߹ȅ/΅\lIC |^e5Uϭ3ʳMwJ7:z& QܧKD7 8dE:9RhحC;,TbFBf (ɽsܜ%qi=fYvpre YQ,` |{qS>oO':MSMSu;'EQ$lljj4 6ΛFV~\.#k˻ mBp8jAhcWFD ec3և2bOcKc;Z҉vUU$HF| *`l6- U}7ͼڰ?|՘[^v /c(4L4 @.p2'`^el]FoЫʕ7p.b<ùqepK"hh<]M9"]aw@=tab|yk91(L ?WN }hb''w/K>#WYf篟<`lrb0OUE%Q5R)UY c"EGB!g ZPn5L!tF Bᷮ~r,pr3Nc2` e2o][u3y7qzgQދT+e}N,4X~h}h,TN?ϳ|.\ֳlVhɇE{q첍[ix1%ڈiA80=-Nג~HDžiA>+ͽἣn 0)-y^dawMCSOŹ? fkNw($uϥd{j+gg0 ?> &iEPD;0u 3i##l9*L[Z( >AqFmKXYUt4{P#7.x''wDQ4;ov(ElAbGb^/~*=;PO>7?JS"LdVZ; $G8O{m 0 >x:ɋgO" o"?2pv+vY+4וaܯ)zڬ2<>:Z9~68*3Sg slĂFgd0S’U!h RF=tBL,HOkځ mMr'AhanAĶ"(DD-@NፂQ0 0` v6'0,-Ń(Uj9Ijڦ^|Wn9 紫n??{鯏᫇L,6K8fAx;!à y-y ~1($#5oRAr]5qPQ긑5X6\c:0w &Di\X̃έ un.ѫr߽ !U:`lR(ԣxR;wB+. _D-8\ә^L##+x ` #xi:Iu+=z{vmbķ?Z˘>.(E tB=V{3= #-cE,|C1O鍺mdD퓽ku:{b`~idQ Ȳ|}1 ' |+:1mk(IX梈)ƐǨ+u'kM8/n!dAatt'ƐUh]Al6! !!XE%(`g)-""بB3[$$q`fugfٽ{Øv|.'IVvP(DшáH$jJr(;ha0(+8jfT*rѐ~v) " v>B 7˞Ly<6LX6551ߊ>^Zv>Q@`78lf,fCBRqINs-7A'qZ1UUxϼ$>e2s0bcuelF|ްb!s!C?9o%NOGp@Ɔ@|ZӮ(e:J@8lkW)kg DM\ iR;Pɲl%Deٙ]i{~cs $h(܁0'v:7;?8sgf%);m̍~oN9,r1ʪ "Hq4y?~؍RtX ~+x`rO}Yu]PiN1:>T](λȈ i>C [!e!RڜK%[9i t!̻מ-#2DJyI4bOz/i$(Tuk?;hf]̙Fc`$R[c6qB,6 @ Q @ٿH)R 62V((H~ ~u@]-<8V[!˲,؉:A)2vEE6JU\2eBp;ޢj+[0X&zhZ+a8I+ZOetv0 |\UUiM0#zj4M9_jŭJ+^DV* lNtJҐ.z1LaُóH>-NL8h^אBqm37clMIS^"[M 0(\֝+jӸV I,m"(*$y3|Z Кsڶ53|1-I _q9uj-Ͼ8,6QTUu";EKL]xw SaFӍff2WxSpRmɱgDw  yc{|; K8V0'DigaP\:ѓF_7ZV*kZ\tKD:4ʲ$$1ڃ*B\߂dZjy #kg DC$N0{Na‘y,P!xL:ŶNbp]O~3cΔfy5Њ Bt6oZk.8˗2*rbFsNLQ0gzjԭۆ%Cg5]h[.U3ש \Zj/H)*h޳ԯk_E~D4c8M :0CF%Qczҳ!tK9 CްN}Z;^m&,ٹ4:JxŹkl,Mxo1= 1W`%"^*'H30{7쨫4y-6VM_.`cfVd0eo8ӽ8#@tkF6v)D}ac Vޙm>[[X-?T}t">ށ=r`Φ֪k*RJ?NGT%!+吠>?da() 1(|G TʨIcsWUˬ-Еݫ-|`Za S7۠`> T=NŴ%M7pNI.lwۻ˼g\L55yVzk۶^`k-s*~ZzKd%IgGk G՜umPF w5 Q4dz)/ӛ4POl66o*L4$kş5 RY)R3g 5EoTGIAؤKRو>XJ{8,KfN4s GbKReR{'V_h xxa8gpc0c X43o{ZMV D@N[7g $,e\ͭ)ҾI,8T1.}:5M$ Lp x6䖫YZ: El!,76w 96 f|*fHB\5[\qEt^~7GJ$QD_[)|2x%%%/v"0`'m>Em>Sv;P u ?{R@Ig> CAKԅ1]@"FH^Q!%$3Y @N1KX1u]_ιR,~rȮI&b #\vN矵m(x5yN'J"mOsEov۞AIjs&Pt 3::1c2ğ[3 Ok=I :x?Tb49f v!@;񈜷\iʃ`#hZ 5Hm(GON-mgs0 Ca1r(QrlلMz,ŸWi*!TEMR' ́EL/xA4 h֚}GʢyR(h_49, H#}3zԗ4p}L]-2sΦ#,BȃېޑpGY,Y(j"R,,d,P=>)\]71@/" &y=#/=R_MAV>ߔzF37zOGCb86xF=b&HM0>^D8gGap /ɇ >Ǟ"蚭CRj\\-Ւ@ {VC2 l<$f\sZywo,?=s40mLh(&VQ,gPxzߟ=*k6AҨs!|Y +UF^rmiIY';hc, `;ćކWH{hw&\4&sB<,ВGNrpk6ܴ۵ ڳf3͉R*Xl]=q((Cs C,MllL&*ՙ}ys,``tY=+"А#4k2߯>9w>Wl,ϑK+:H^*eLoj2|K3kVڱսBx\9*"lf2ஹ[Cv{ 0Y؉UUbWk^ Jl+tdylpMA+:HJo8 ( uq mp}j}=ðIpE o m͚f&Y8_X;A4KK ,ݢꭋt[kɁC,EIPBd  *)5I)%, {\k jRZ aFl S<֍Obx҅*/ʃ ^-{v:֝dM90zxGa 9 pR C2# RNơ?F0aI9(v`bR,X)i0u:Ġ?8d9mhOſQ7sAF~v7)@@PWvkBE1_Lj-A(?$7o~|*!Q5(Tx^AMx|c%ЬkwKaz , Hȭĥ8G3iNpT8GC4 AvQȓ´&Kw}/c2 +jl: Ҏťq`Q]XZ}0xM8i&"K۶4MMQ֝WywMB\zN!ԶS h)j8OB_-N~CL$BNw(RZU)7ܜ1Q H\,0/k\dsR3)b޹ƅgۄ>ݸBm?+auC0 &mH?&U7Hpvƺ @REjGXy &n0TcŐ!Jsb)vI(!D6>;ߝ(lH~ Y\gm4MC5MEA*n!"xN:ѡ)Θ,29Wvgx Az@J^E[09' _$WsT-g>q ^$\46U=bZ/e2w&qr5R.M4^]ױE.*A]撀/6J 8M;mx`Tm꿶LQ?P@ 3XUN<W~TUUponhMZI! 'm p8Msv:D@eYbr'5FI!~ FwZ<r.W2n2N 7PΝ锱@\ne_~%DZ_I( ׶-a:`fGS[֚TYƄf$"+?qՃ &꺎&ys䏾|% ʊ9˾Mc_fٛqc;jߴR~oڤ':NO1a! ߞݤ߷^.zV`|^¢ n״PNSΨa?7q8DepZ'[z*Z-=YKOf%ME3 D$RNéwQƎp}o/h~XVܣ;R`_C`|[FKDA7 ?sm93m_S,>Y./Tiy=|c7kI_&X@˾ ʡ_x7ha S1x Н>G_ћڑq<=Mvsu֐L5u>x(>bo?gP¬^/+GH;v+m7ߡԽ$?CE9|~z{pO=wz"o҉AF]#µX\zBHj,dz>aҎV%z1__ mŻT}(y nKۧB "nRceI:=)} "O){HSh=}4xW*gm9e610Iu\zT.=} ڽ a@Wp%\ C!)i B m&??i~sh$OsO+i&g*, pHlᅡ5T'u(&\Yy CW=c` mK`oFpehs@Y`_M lW# ,㸐HbZ\ۗs|j_a Y>,X^˥R# i?;uCC< Y{ ȏiӶxL~u$EyDx`+7J<. ^% T5)!_(7efG"+͐-}ɞu>К+B6VXݽqxg2RAQG?;4teO+hv(` 0 s|pŭs3P!$?jɗ n3=6*l~) vZؐ |wγF;xhf$`VR$fdUp,T*|!Wws>dԸ>Ĵ(.[jq6-cqUjFTj /H;a ĥWĭAXwR>$:@iھi&3@΁n,"ύ2jH_2Ѣp$vV gcM% <[-eI#d;jc^UПWb {ivITOKѵ| ~Ƴ Roς=9?O#Q'~#衍9Z~ä"0azQK~[,!_9COa|3LR,`#1-\6SDS ^O8}ua(GʳX !|tcC$* imao "B ƑNo3)Q,2p2D[{uwNrM^Xk&$#\R=x6γu|H(lE 2q-6L>ѿӖ~4F~x>٥+~#C^Ņ 2g }ip%>J;|V#sP`~V[9:w7lwgd™)Yp Hfw>0 _G| >0v6 A( Q@(B=Bk[)FY^SH€13;{aN ycUU}D!MӺ,K)bCA(Ȱg ]S#Ɉ(}0.d9]ַm'}|9A8bw B_ua &al ?,˨ ,`_ 恩U?̮|zJlblotGY-+>o8 3֔r)^NÏ = "nl,%ʒ6F3}㷵k=t5~b3V<|S-NҮ$a0M1Լ+뒎¼q,R vc{ ?|k`.ǜ VφwoO}N @٫&qvDX1!.U>/`mcg#X ~ϑ'9XNn3fE]xW^.zh޿VSPm[M|>׃.)^L,tj0M&%XlFzx<6ӛ&VUBu!1e8 ԩ,@"dސa1DG.=,#(R)AgF.Gy &IQ jy>l8ε`ZV+ j|Z/yygC/cX_fnpA6V:<#e|YB=/N` A\F[dQD|D"q/rY #܇o*wFFm4~ v%oD`ʂ;OT>K`G6)cw0 D ,@B ^6);pNIP@"dU6'ӔiǸx<>Epx;_J| 6aX C]!&)8)S C?9-R}.ZZiLQS{v0P1?bP#l L&7z6is" ,<&moyۏ,4+cરXhdt}(2:  Ể;X(ϹWP!MjDTE%JA`UnCߧ#u7qWr@CɆӝjBHyPYS>7aPM]/q>QAx+! H; 9(p8$/Ba\Zvi(  <7ki6?^~(Üzx洃 `jlUWA i$k$_/>ffL)KLR)wa"G\ZE_0v: P&? H]ȋ6Y(y 3f͖%+!$6J8QBN{}osb^!U ;1C˶R@|mkdH8XYk4&˲)jQ뺎}:pr(ڄ A}p{}be/: eWB7LIUU^]Q-oQMTITX‹;(ZCxT6a~6Ź1zN :ҧ1 _ *bo?wʮi;bdzz|?GpʛKz*= Mʲ}$]]惞jNwńesRX1>dϹFmo' KBv-m-͵K =٢ yEvTx=%gw Ctµ)"2h~ `u4n\B4<:Luxi9bhf<|5,4\vGD-u n$v`kF2!Ie⭭J8Kb_)^ \_PB=YעsmkF~O '1JMum>6'"Nh/1SyD>_WМR-AmEpƻF`npq9cchy6qQ鋐zUqڣ(-Xs3"%Tܰf:ys:UطM@F1^͜׸ѥʥ1nBMӟ3)PH,PA m" bK1ġnגY$!*N0v/7@@N\rA) q@B|YBol(QEP3`!rG)4|9EN);EꙦʚm.X{n~dWBЊ%bZA jMm:/}/iU0K пHJ ^S9:,H. G9_jL%k_[ċxog G? )ECYcb9 E~OISx,*w1ǶmYFLT$Gr 6l^v770+tNUWiʡr gnP& < ןMӴZ(ф 56rE b͞%W5CלcF|T^#H97YQpГK"ĠD[taew3FWe( ٝg)UR*.=aOTwyw1${ @ QJ$@ Å؀,+ ?.;f?w@Ig!>$]׭N<Oחߤ%ԈnQ'&~q<;2"!m0 Iq-6#|yzoQk6R ~B9ؾ3x`8?bHEJ;VY}''6: ,tQ?9ox9r\}LMӄ*& ,"aT19'1U׵B0#1 ~ @0Q+AAfg:v!"e)?tKHxEgϼ'iiTĂhuQ!􁧁FUwa/BUU1-x 214Uu 2劓{c(XsR7Pԭ7 S>R sΕ9$Y'{?e<׼VX>{I=HmcMSpsqmHY!,yCq~U1/M|}Uy`Z_n4`s{o !ZCv2cCϩ8R1*h W%mws0 C N:]t^Y3 _p "!,ҟg??=Rښ;PaII˺".6.|"iUǖ !H^L^w"fݸD&<ՓoNJ}BVɡR0rD\yiadS|D3 1'Ii>kȄ_G&w鯿q?LmIu&q6-@k'%/Kuh}vSuF0 9ښi? c'Ӷy4<`T}QrA0$&bҸKM#030J/֒*FuTXM1F RJRr"Wʈ=By#׻;+= 4A :2F,a)9!ʜQU1 >HZODnE: V@[u] klD2,gC,# Y ۷m뺎(8SVh.!t7{ͭ/lfϮϧ[ѳCX>v?@Qɵ8wS6ڛAgl]"$~uaˑ|fĩuvmq +v/03 $˞'(_TjwI_ːDz J.;q?o3ڟ+$)k "8c6 A,˲+:h2 x%y~5$qv4O .YCS_xٱT?T(j$obotه4MO?ɛ$}=LCTE-88Am>(Tpz$Y6[YVU! eaE`Y%֭K<-8*JG bDZbBu.; T/+_  (1y9oU}m`7% \R(^zz /1]tUJZxB .0e38fq\OUzh]#riEdADġ% HQX2"#P4MEs4U #È ͂}H>tAo@BၱP*[fVZ{ Q$ ;krx.q uhTSmiGbOO![^׸:c,qy9~Ȅ.Qt}YaYNKay0`χP0y麮Pcț{9cmS?Fſwis@,eS]TG@& QLq !n\3B7cnKCPΤԂ̝{o '(P3sz=TPa2Y@rLw@dr[;mE!,Sg2h4WPVYHD2j-^:-'u(z6f`89˥nGH̝Ar@C"]@]"=;l6a~/!b6UDF"iIe ksg*.3M7+^IjphEa</Q, P!ZPÊunڇomRRz5}{%uNM-?NOX;A sxc7%1 \4-MZ !QŀWAlWtO2$VK!vQ1i㤼`vbȖsc(ǫxNh;x" ƭ~Yp&O17^Q3|*y =Y943Yo8oha{>9b gB>m %&=TWj8%tÂw=ll<sǸo; A?˦z@57h%,!{laJ?R>@$,z - /E60A;w.Hn/ ^8QLj= 5f66?^)hW 3A 6RNGAn?ǒ&Pq"n r hzQ0 F0` h`̝K 0 {! .= C[lW$jGlϺ9)Sb;ŀTXxPaIfsRܫvi[ܝ}U5ܔ{:mzY i6{s8}Wd Qoy~w1ܻ1>פCg~֜?.ɨ~}bt -/qM 0\Ew{6%1 O7 1XMf(-`weYl`)6sftI}#k9#m0l̦݇!!ro K8y  +>L \ADO*(Spbn Oϳxe\t="$/x;a ZhKK{ZظE Kxҋ OZV=XX,d>9䟙c@(<猷EygbiVsuɩY<8F(cUUJ܅,<뺛0 NB{k/8ę˲T]nbi{w]3) $lNq1)$I4=k[(DWtKT(`q3':Xշ DK/sk1o8 ǒwLdL65,|MEQڶյb_d]~(Y>ds$~}cO{mA- uSB`]x9K;TvPMM ࠓN  88:1(VA2^ݻݽrw*髈ΕJE;Nrp8X,ƳvG 2RIlHn;ELߣd2]f3m:L&Cf3qs8[`ѷZ-M^'ǭkzjA̻",4Vx<t:i4QXD1$"!8?_y<3O&\\Z\g*ժ[,fj@ @BagjJNgs l^) |>h46+rONnWh4( r fR'D*Ţ Gd v}M,áJ(pL\V67L0 zc3 O, KFQbAG000 ekۘ8%Q%WYVE>` R(M3# d6! o K(BЍ 7JIaў%E&ovAE+ nX7GS醨cf -]? E: OܚS':tj{0PJAqĮ,jgMe!d(4cgFA{ D}#}V_/4},Pr'$k?'Od{Ѝ"mm׶u n0seE 4પr]9Iqq{S-kg Dᨅv^SRr fl$\Xا3f G̮ɾxaP] ]!asHz^>)o&ǭbX)fg-{ݓά+HGpޛ$HjO'ݘ4"[UO@n?WUĜbPTW|PſdY6[f4`R9/]a;gs5hSEQlT`&;Ƕm{/1X,"ۿe~' IT֑-uI {Lɀ%;Z8(|p3}T p)7x; oz?KRǰRUUO7d[*h7b d\>xPQ놆!B֪,˭|C\l]{UZ&?{lT`YW{]׏m;U!KLp(Q΋[;kQ@ԁkYX7a$%ow0DTvƵp<9!ºz6}L5X`*d /6Ndf-HKƫMEA$ki\h}D:/EM@Kq`H(-5*2`iDRvpX#6zԍje6`&:^ d|oFܨӾ޸o}r@AVtDZ@Q! ਓS{mDXc@8Fa#Ej+;ʚv;!Ud5Y@Rig͟U%@| 3]LUƼ! as+EFvb۶MQm7q_A P ¥]"hޕ7@M]Khߺv-ĕ i= ZD yog1Z˗5 Wx4|0x%#WZd6Z&dmHD 8$S)H( )AkL02ۃ"§@ A@}%6HϤISs \NZ:A!: 4j/{>e9}8F}t˯^]~VU Uz$*T 3 })_I3x·B ̠_Q:p8EM eKtRa]?c-e00˲( q8Z/>i0 @R }Pp!˅[߀P <]%HV&^~;%xaGD yٴ~>_wo7p`86-5dȕyេx~4M)6ކJYMtIiH?$ouKp9(,GG(0gju\ tIB x3c`v:ږJuȣQy. >y̟Iچ@¥ v닸\&hBM3Iݪs39Ύ ?s/D!̱jEgxZF=>JJ6'=E\8 ޤIGb!dLisYcu@ x*LӔs"yP xP*cel7ɢ9?n9'!JiA)dR .ow DTK &p@K=Rre[-ّ[Y2eS{3CB*8f[3>n46ĹA#7OV2SyOzg,oE)I@~ľg{)㘼>il6EL1cD,3Dmj R4E0ó !3gKq4)}0?NMӤy^BL}bF;-{ctP.iNNz@>Ϡo-4EY=8u# zMW 8],단b jC;& m}" ð;V *ջ97s0X UBQa34ksT@uXWKa(( \[%}TAH!t <]D#C2\>mG6gruqV:~23 C_rH632()y,Ct޲aj(EyPpOq8]ў=9ireև §L1e9| ԶmѪG@ ;M㺬9 }zuU5Ti|ww8 MAF╛iBx Xa[xo'۔9򾑣mHH'K\hM+I=67^ާD*<=8 5PxSNJLYMw-(uOы#:Ћ47sـՂ13HA(%ЅWqd}ZFD(݈43w̯*9ax٤Pt(*д /:8r6昈E`C{HljyסqSW_}O7AAv&e񔍏 |ƾ?b*u5!UHVh :)󦟁ƦPdEnM КyYC#)AR; Շ[<)oX Эrs16)ݩ~/Tu;ve 4P;A,Fiy& 6$LFa )w4QuV-I|JҾȰm);4Osq5G1)n:}q+]rKN2g#l6MLPe`EIJ%Y\%q\0/̻):D2O8!waK7YB]]ׯ[#eYS` KC2|Ü ?,[@fM!CgGuXBm/=9rae[2t: CC$\u?LY2?bXn)h(` pvTqgo⍁} Q0lCbȞS^@l9@C/P2x15JmOHے$zX=jmAY4iweXv!^X3orZf)#4 2g~T{ԽkYW?сϲlj zu%MAg_fRUAwsx}P#qLl9nM;(5\<q\ʃyYŀȮPzItri4Iy>#FդzӦEu- @P^aw'xcB1iycG?|ڶSu&B L[1GMO[f5a yp' Yg+vn B_B-BL\]|i): 's37|G)]w-?x{+u,NM al>!/粃0DQ'nqOp_Qs!%4QgSW.L/lNLG?@.m`403uI~«Znײx#&atN%~ Ǹb|NHcxl2B}Tw>`hK"G3Q,<[N}̃ `azy9&/W12ޱm[~63R!B,m ל̜K 0 D9UhoSh.1ɘ +Q#[qkDEIJxؼ#$KQ{O)e]9YϠ/zQ`ոoČgD|,|#8x6]~IENDB`gltron-0.70/art/default/babbage.1.png0000644000076400001440000011744607310447164013073 PNG  IHDR\rfgAMAlP cHRMz%$m_l<XJH IDATxbb`X2JAh6֘B~ 6&ov_4pHVe:I7߀9JGx0b.V_q&$ -^0 FW5^{u^ʞiYťe20c_Kv+w:g rAh?čK0&Fc"|oA?x^bb\ k0SLlH@ כ<-/4+ֳ| N7O<ot? $_~㖂AMk_fhb&KlI/AU0~wGPXB:| >!Z>(?T|oO!$ 7߷ $2|boN|ʤHB{I&rynhdL&k:&ftj(Nc?Z/r\j)8zyލ;b~/ )J^Kٔv\YVFpRL$oKj^ŌcaS]SF51Vr_I~!}>VM]4`g}Y.  qWVࠨS .`MY>e[8/QV\.[$ک Ö?_϶]V"SCAVC@*2vڶbWuy9+uf\D.׌CM I{7UԊ0mr@ `!MP+Blm|=,SZƴR'{ mRpϽ gs曹 " B6pNT]=܈N_0Yj]"/3*ۭ~CX$cHnb0p\Vl6:pr8cVݭ%{̿ \TA5Mq5b^rf37Lev sᇭwE{xC,.֢ZxB(FToi5_#TrX*B6VjCRZI9n!`ygrøt:yA>V'h4rGq k7Ft{{rw<=5+9ؓp8t#=)ytt:tO`|GlO.z5B _Ftxp8/O\r0\7]x  N% Gl W26 `D$00qk'tUwWU^\^Ϻn20P4m?6ʌl^ed* m>GoTZmC*/b J x*WqrkZ"WB+iUUSD@ QR@)RD5%#ٿOFbaF~KԗN`qFjz'TKj}zMu:eO3x>Fjo؇3 s|>ΡT*AQ/R64 =ss2!jlPMziXԯf^{ \ٮ3@o%pxgc\lgl6{?N֎۷Ԛ1 PD(),oD"a)u4ԹhJم(#{}ghB@ [5<'9c{ ݓqy6 }mwMяy@ht4; tkNi'^:Q:kLWp1a1ܚJ̺ 7Lz<,~ H˲ q2(`yhcԖ$L} ^s|>qqO1uTUcLEQ6L}@q\y;?ȗk>|R0>.(s Ox g č+Ɲ ߼ af`.3]Wٜ,)x?P.+~k07A.#8|Ul+RE(DZNdA( +1H?;so"?uQ5 @eHDG-E@6MSӶ-9Dj q($"!%=+` .H(w O>D3]dw'(,  ]C6SҟECUUU]'׊k9K\mӨ X ̅GQ8382x CEQԵMTiqxwdޟRT/C{V(1Ay>E0zzec"Fd^Gq~[FΦ,k g @30%h488i;AȰ r,q}'!7+ QҀ0.}|kCxiqy@ QxI&jAeG ^PP8ޒp>vl6&P3EG2LE`SUU+c󇽦;_lw9"Lt2Dz#rUs^;um]\k - o4m$K[gYF0Eq1haahy]Xl+P?b8F:f9w {;5D/ ]pysP&=geJ6ч)߆} ʬ 2I79H>Po6 @Qą,1 -%&a#&AR!AV$I<ɕ%ߝދ X< 5QC _S0 /1FuM"NUUڶU}'EQ$ Zz( gcdzU: H;fٺV 0gB?>қ{rD9GpDŽ'!}c< ZD=H.2c~ I>ZsYx/39"Cmf!w8iC>$r/~ϻ).fo0Ca,-i=Nv] @*Ws >sN&͟$$=_ `4 t,>Vc+_c\K[ZCj3%h(7eYNl"4Jx(Fcld{!I`4 ;Kƽ@G B0,>I{gHJZv= M67kg1s ܭ',/4u5:| @͹ Ats7܀#q/W+k(D}`Cb1RH_zgO g&X (YC.{֪C"E9v ApZRZ(6 [2 kٙMA}_:Y,: ռ;H8;XSW@ܓ4/cKJssm?Oh9a T!ekpa 6ʩ d(KcFP,UR*ng/#/)׋DDt866ql߂e,re/sqnf ن$Nx9̖yYa~{)pۛC 03NBv-y {ݧ$k B{M X}^>ܟb.缣IJi  IfV5oAzZfǵ[h5w;BvQ,eӭhooRf ߋ/}/=q0 VF1ҸYhhRqE\+Pp @Oq[ !KHn`dz;k6ҝ*]Hye4M:^N /:o*I2ok%.8`<9 ;r  1\Z0Ry{1x#\*! >/'Ho^38µ'՛+-玃 a 6҆q.lLh8 DoXglB԰/w?K09z@N5Mҫd+39 &ru]n,Mg>Cd%a0^aqdxpCAo2)ơ(Vn>+]劃ϭGq84Mvs$"4Rb n5O:K:]EL|r۹_$5R56uAMb GoĴE1}22;LYES;Ԙ?iY}Ƚkd 3}?MD]Z7a ھmS5 ߠ¢? j-ȕj.R}$.NfN8rB);۽l1p xFTt:TؤiL&&s4 j-4\/ nEQpD}־Ѫw#D$S.YnITfL\ӺrxqǣES Nd+ԩrTsy/aϞcΜzDxp?NVeϬDZ]6 IB,v= ,RhxQh\n)vWt뵷R"`l p8d#h;Ons5C٤hkIa_ W]*t(}є"PJ6Bgqf^ !<} aCt]~R|>Ǡ"C,~eXS:=v:%܄1ʂ{&/iB\ʱ;T-p$y3-ZH,&8ڪ4M%HZk۶x!2reZ!? 4N5LYɬzL)vg Y $(O .jDzia!Y^K^Sh+n;ma{ycaGFTJ0~d-SJ`ȥtL*{;bM6s> Z*v]Wx d%~L\w@QO co.柟!nPyZXUAT9 u^`A.[Pr!LФIE{}='ZO NރiZS'

<"\=DfhU}/?V\lqD/qYjqSk e euY},7\+ƅPVǚ-*͡=UR+ܞMcP`ydh=:'kTe .zVB 0P4^kqYWDkQAHL&3OO<K#ZJnQ?θ}w_K#J9xQ@θg\VN6ڬ5kYG`nR {)?e͟'LlF49o`iVpԽ`K<%w]q}`\V(*Xi]EKK 9:ܙdEnW(FQa2yg&}4ZFxNu2Fڗ́󛝣k?@ewe $yoBXNH8$IZ^ Ĥf1dVc]e$wo;vYa8zV -Eړ31id!g':p3g`A`w> }o]MQK&+$%}yC.0৳`^e9bOSUU#AybXsoO`S {ճ&kfD$M$"䰰IRNOBAb#"heccai'`cgcG 2O`0zoow7LQmzo!ˉ|>/5%Ib4L( QZnGt:J*r.ԐI秠@zd X|>vZ. p\"j="͹Fp.Hig@58 :l?1lFv.K(Xw7gZhDHx?T) vrl܋t:C@Qfr)t:-ánm.""v-l{qHP- 4ըB feY*bp:*'>sIffxܵ|>Z2Qd8]UUfVDŬ!8U$)<=[rߧ`ZÎ"TJk26z\*x R)p ܀C@>.mw0E%AP؎ ntOe䮜; ـkHbbIi<%I=J1ɞASC%,}3[zLFw B@TqcJu]ڼsAq"FȬ v;.ξcPF!߀+˲GYc'"Ϣz F=I8 .]=Mt:ov8R]Xus?ǩ=B<^=|H)]\u?v-ƙ)*=om[ A'}o q!og_TQW3(|?Gab"NUؗ=3ۻ /c9A$dfYq%b?U'2; -#:%%og D-vr#8KpA%i,Q"'!T?ɾ $:HG[)aBx$ZѯeYys"nL1DQtE>A G||hNSaR$t`2b5`mZ! O07}2X(N֡i0XչT}xθ3:#_^ v`:> v$P)&ɹk_t 7ww|ޤr 2 ,6T>T*3r|J$٦i $Sհ4MӼ%q Ts .HNBn4a2گ3`ln(Oѓ?)(`WQD2޽;[h5trO! pb9&e`   $#So.@Z`o >q * !`eS] Sc-mci9)Gp}V>UF.nÚW ?Ul݃GRi@/p 6Rϓ!0Xۊhe9Y slR?wf\Kìgz4<5g:.'@*>wx;a g#]y@r%ҙ:Vс.RB~^޼6ov1Zr vs3 yCȩ72p!BVPouEZz43W_wi3}CjGSecǨF#AjcbN:f-}sƧ9!c<'J)kR"K ! KLӴua0M'-dz[0rέ0>@G.~r@4෧z >\:= }Xffc' Ai1t=ou;AJ\"%b]8Kv+`_H@'!'g-iǜA ˈnP?4` Rxk^*=g^lBoдù8.ﺖAc8BrQGARMi &լ:)Fn*r_x-UڶAM-^ + ["OAD"^7A)ow0 E4 u\C;\D]B]uQN4'?P|}Pm{-=M5FyӋ xNᇲ1vs4?%Sq۶<(w]4Mkr>{u@)>~9{$}8i? ť H sXx$q/0yq/Ed"^߲ Ih[{:lP9Ω/jUr-T`!4Mk4<U,w݈Vm"-Q^~u=oP*pCUaI%6` el 2 sHX⧠{X%:*Ȧk]S 5w ;4 dD֎l7(jz; iQMpkE9!j:q77 08׉sVg^ilmTM}U8kX=U"J)F  -Tҽ)!B 68Ԧ s&) 数f{qp`h\In@@F }z"BSO_>N*^z (5^M)E?VgOH.qw0 D^Iz^Mׅ^kҘOEBO00@} ]0(p.9q 0qSW_c~i{ 0 Fo׮֦ia=ʊ,Kħ= -YX,Ͱēմ>%g|hxl@?9ꓐ1ߟL%IC .UI yyMgrQ^lR(L7Roх{{FE@}2QR@2731og1` \DRQ$vӹ:u9j3t⎡ ka}\WN1oMهZ$`NwKt#cm1PV,eoeVYVL3C\'D`,˅#|b5cr\6sS {w5J?6MjۖN>̐2<9T˕Iy4{0X 2f$Nca" /Q?wG90x@oKzy}uÁ$`| 1Fm]=B}a;(H^3_ 0-|'y3ԑ;L–ɂdj16jz)oeDkf[eC~6Q%47-dYԓ£MYhOd(e8qI}fߧiO0.u뚾G6f%QzAkϪ"%N|C޿S~\BE{X͸W yܴ! uoQE/ xQ2bԧ̝A 0E=!2 z^RH;dQ]BJT'3h" ܽ,5E"Uf9\Ux 8M:8z.jܗ(ָ H^~WRBirxpwFF-B!Ҭ;(Z= =H?+[ɝH + ԣf-уG'>=& L7V`J).$uk8Yg)GXU/tkZ,(knb/h}#cs3{jAhTav'CtDQ^mBߗ(]wcY]l9E2r=3^bDxg%X#+-S4jY,.{۵Úy/Tx@7c#;⑒>wRs~@[;mN1T7 P@EI֦i*3 ðH9s} oVu b43Հ) |񿧛{9Vƒkr,YC(,τ A> jV큿@=iܿ Nra(knq]T8 irTq;HS90=jdq{t1Pvo<@-PfY) J9cGn?R٧ͷi`PɢfV=9 c? QeM9b1 *UAR 4yҟ2֣]Gt2I`-pZm罀?6%I& YaD4%@i=> e~eyUYƞ A9cܝݫ ǂ~y_eRY$pR_!\A7|~Q0$e 6No`+ &il=$H4g% ";o޼͛C9(CLP\ERRZ,zL&2E0O` JC-(PW6|3| n6fz~o9K}\ )&ovivilkH:0 ֲAdBf]sZ)0+&jL9+.3eBG8Ȃ@P?өyH`~LϿJ"ojTqhAP1 &Ƹzu:vldh#as|9`RnAK8?3xLWXv]Y˩l w^ s0}v>QǷ<t^V*` tfFVlexٷ||o$|lV-{I[*rDyh۪T*"p^KܖG۟Kg5a y4_OQP»\ >C$CmbR9](%ЀCݙ7l6ࣆҟȥʻZ7x">sCStTm-Tq9_368 :!k`.@c&/89a ʏ`'{s.SMH7Nelcֲ4)G#xqvX[jo·5(zQcn^QO'x m<8x sV|j7'IF61QgRsL 0dK ~CY=[=/%wkq:Ѯw `SLeZvd+jwzVOJ:2q^k"  숅^׺s(X{ @ڹ HK"ZD?GZR4Iέ1;;e$"{'7oOdfۅٍ~*|!4D<7P2ʸtR@b3Yv !Ȇ%  7ws4BBaw%$+/zE^-:s&Pޱ-g2SȄGpe{igO >=ھ%keGjn^ Y($phFT ,#Bqoф(;ۙy3ofmچk Eȣ/sOeG~Ƚ˼߱f ^pѱ*6T! Mi#$z&šuIkHO7i'Ubt`8,֒(]C)naj/ldl Y>k|ٳ]3cKlmJt:غ#>sqkGUm"5;+-] #cd>. ~`%)W ePч !Т31 o]wD.Q|,J77r”)RbT 9=#<Y7YLQ,+d皜2G׆}K :.Lj N_p`!o){r^8w4' ck b Q0 F0Dlg-P@PPr/ H᱃ O" r@ cWHjwdot]gE.w !; f9t\;)a@ M{=A|B4/f7x@ڹ@430ѳXOdQ8Ŋμi&zbCK6hc↶';Tr3V<ˌCSdYA$J-؃u叮k@Z8q cRMT [hl(Aۛ8gwsX!gg0 DYx zMEƂW6Rfg5"/Q ~rkJ {zl5q[N-!h;k+y:~<3BR?yG7ƋU ;\ߪ,Р13yd3_143}'eǙ7Kt%c箚Pa(DȥJHH*/`K[ 6! X6"Y b4p83;; ;_=atRLSvnVp8F!VKժT*;s&YcNZD63d|>׶;DgYLFz#~ ̏o zO&NTRv~/NFQFǢn:O S&H$EafQwJ> P(8VA'F_3N5xjܹ Zl6xE`hƔbIa_>br-C tH$\. iW νC^j B81ʗ܎NIr/˩- |fY{r] b@&x;q48<2dL_b1MxRԫL% & Q!(-'c !!ا1YNAUE%o~ H',%: C)-DBEslp'}0)XπkI6=O=Q$p@>&λݮGPh9"Ø4*N'U\ Įn\Gq)Sg]h*X$hl6m؃# #2OX_jĤ=]}@qA1}?=Fr,\@8=+I@Erؤ.Q|L#hzj1dx3 !hD"$S^P=ELΥOXAzЄCifyT&e8ׇe_c?V{E銐J#AM.V)7[8(n]S$Z)2zk;_&Էlb$W~ |V0ԶBoPxAS /W˱/PPkhF ZBNf\uWgd Ez2TLO!>;p]wD gUJ.4!` BK0;s3!pЅb _tδ,Gтt:TzI%LHAe Aқ<ۓ{ V}\5ވJf,{^{K8Nnn[SB^й>ëAlf=M#ُ$IRI`J1&g "ktR]/m}?A17wq3{fB /'X?A6n:4m@E8u1 ٣6 QxA{ S$:: ] @ۖ o3K Hڟy3ZySE룐zE!/B^9A'*$ } ]s'pa-5 c + g2+LAG!!4hיijZA%}_QX4ND0 B\#=X±medI>m:\:\;;v/c]'DBOІ/K SWrE}ʥt;ڀ,ɞsuЦ;RiQUu]{̳g |۱`Շ&>Ğv[47R5Eɢ@7`ʛI5:(5c _zy;0ˠ#) P6r\Sd(Jن{(g,&uX%wab0F-% $pFBy'$ ];u]ʉ))&g[w&JDYn#\J[L-¥:R|#tRHOEa$h>Na#h% Yնl%\(Ć~s๵o:oDW!FqkdٵA Ag6PdmKL)Z/P8=xpA,`Ȫ&q9A%8]6@,P +hH)6b(O <ƔVâ(z zڽ@*:`̀77s/x ڦ; | cXRF tໜ|93a'!܇9ܢD5<YC)5*0l`!R7Go*L" \zP%wZ"\t}NcJ $ ^0v 0CR|_5ȏZX` ïx ;R oZ(ͺGB9ky_uSK,]sO77 1*/7MӉ&b*)J #rq|nqq]i{}JD aeA!` 氉QnRܚbu-xk GR oH;N^HO<@pU7y18Xji Idg *!ZF^=DmM\N'X;k%DJh,at*%b %EQy.,p7Au.\t,|;SQR r,;o|8(ɢc_V<{k{nnBY/ @ٝ CQ-X_` V"/!KlmaR{KIO-^Z%*b~yoݾ?KtŽ$fOWgR~/w .vn)@Ͳ-0ꛦYE.)2aэ ƛ9{d6hEnmGK\30,}sQeIGym 4 4#<X :m"i}Ou5i+Y봔m+g@\]?j#H55%w:nO PbZў Kadh{% tKRh)UM% E+xaH*o7}0R'!Vycx%JolNtY}_߈_'C|פKG& |sZFr<={bDB$qYS '9^ػjlNS{nSq1 5X/^2eZh梧u˶gTf:XYy<,>T2]0^yAcu#r6MFr<~ r( q\xo98gpo;GPHhҙm4`ЫݠXbA3l[* UUMT#wѫ B^lԻs4L>aR0{. P{}6#Q0D#M%079#ycb'D{ +so6T }9$#@J0Ћ=p8j9RhS5 4尜,V{)@9Ю82xTo3Pl/?/" yۏo3=Pr_btK/8\aznzތ;;D_vUgW+ϚsO=֕-Y@zl|/L3}+D& x @ Q-p8rk->ZhԴL˟%e )Ƴ &J†aS.UkFMC9Υ^r0Ecq8&7=ʫ *2Vx/hV bsH'15HMw+ؠ{{!1A0ʀ8`MRqMGKggٺsˇkp 2{˳g{egk 5Jb0|yMӌ/oa.$_^hZ7Rж=BAY)eg0Cafp Arv욙=SU` $,Q~ ={D{~^7*p~: R=ϨDӲ^E5 O?z$y$ E hΠ [C/5&Acmlv&P b$%22elm [ScDV n]!He|T!1<7a=Gl`i4~fqf}槠[S6]p22%u5=DZB.4p< C,K3B$|y~:_Oу;HBzL.zGQbJPI~LOXی3Go~SCUQ1PFBU∼g|z2ĥ;rHjkG5]it7FK֑`nt[Rs:V\-.F[h>j,ss(0a=h*En 2ڸKZq͸vzHlfj%v q6F bLO.D5)R얃a6u]˲8 d }k `\R0 ԅ{[z^#d[X] :_4К1'kir"<@b\ɛ*e&XĶ?8:F)lR0ysG̪+&ZjsN̟UӤ0́ -Qki4"?)8 ' z3@ڳP%*qqj p4MEWdBP zmC2_uy87&(OD[z/$1M nqpp0va7)gOB&U4 ! PXTF d,RX#äaj6KE>96@.JkŖ;.Q UxVb!3a[͸kllS, '} bnh -aR<*=`J$ >> p ¡'RX b_52J6,t6:5'fv6t! z"ʼ SyvEوS(F"!>c?u\j!5#ze%d+ͮ| 4Q6&Rԍԫ<&]+%$ܸqh? *F${3g@@@J]B1Mhj155 b0l\.1%|n]eY-Yl7fd>h)koa$A((*iF4Sv):0 oǹ0\=&O` $NI&ĢqoNKjtFZAr8J;֚鶴Ri7\i. 8Jj+M~`q0{sPpi\,ĽBGd*8E(|BH"Rd)ݝٙgqdLwǏނ8B¬8za(4eQSD<;p}"i3| #3ۈ}@[Z0ࠣƚcJ?o<+Sؘ'rWuzrUSG wҋsK! ]uYc8)_Evi}`MʎI>b!{p+{Uz.m_?&9ⲭuzеAmIdmWZN$eksc 8`@6 KY$&>TCώOHa ffDrMwDH1D$ XԪibx0e0A=Fpۛ+8)&,'.& cTbʗ ITm[&@9®-Ok=½x8gj,#߰g~q!S"%[bk+ka2y~k/`0,D6mذK: ǩi3Ԉ%! 8< 9 #[a(C'2AݢQ*HM,qd08 xo`ne Xrp\qԎC&-ڭ'ϵ N"IDƔ5.L4व(OZ/J|%|PBZvB ;rkļYr|w-8NIgsg+G2HCA]CI.8@Ĭ Z Z0 u `⠄1`9i>yo:3`L4YH4L~Т |'?${g"ٵ^PSd7h$n'd sr:@jYq!f:vX_<sŋ ٠x%j b7匂Q0 ! Bh wм3lDQ0 h-M`\ AG9֒= @K]A+TB-lrxh舔B Toͽ?dXԀ1&ԃKF(@;a xn wiRhՍyDA'!$ wl.PbV`q`޿^ ,*JV! z>g̓}Pp{!>b2FwUo \Y %<X#ka="qpzldWtt`Y<4W ' ĺ.VIo["l[lcxcګ/WxohV>ّA7O ^{U\>nٓ;əLdf\&zz_fA [(R`XW=SiijB!^|>OSw>;k0.,gwtf|3S' {ivXö?Պ<,Q<|a:X)YUN&m[%TdSI2@tsϼkuepzN|d zE"U%t:|5/X,X׻ gɓY`fl*-҉"C]: :@$cI>GaY#DްpJב)$cEa"P70d}?oZtÈض [ ">=H@hK,NDRɠEq A}:OHE*K7BŦ`H)6@A"7#y-!E^x03q^+, p9ER#& rh$I}>jW l^^| "G\ !aVw]h@xld XyVn7Ҏ08 М8'Z&Hju]犢gⓍf'Ŧz܁P;cٝ){zȌ`8ѩKa f Bٸ]A wu&ػ܍{gAhhq?n{Il5'NuT~ۋ,Rdx@I؆G昳1v]W%iuy#OX5l$" Py>0MuCMD@t,A)Ϻm[sVT(υJӦi"t'+_}UU}f(7~+Ů|`7QB$PD ~`7rQLcqPTKUڈ+4Cp<;bZAeqeY$I8yuN6OK g{z~P|7'u%G='%j #QJ(R7BvSIUUBp{o\okP!cmlT2) 4UXouL(s=u9dtmǷm@ pAʅpp}( (}ig% ξ[6pLf_܈)ڱUU@p5 h2E2W py{-?NMJ#e\0#i,Ik=֯6SQȫ}8cłH Iڶ\#B&yf7=8}E {X;DCѤb߈ACUUr:= "hڈZCQx4Y] DU<<σgS: ,kw6#i#a-M Ii(O0dy}f{kǹLvO.˲3_;31|_rDAz?7XڗSb;Ə)e Z7ұ`]SHqb0g(P!Co5'zYґTN@b m{I*#؟)@]L# <3w^"6ð?:E ZcxڢE [6eY gXM &Y$LMH@7l! J%")j5n#Zo孔q^1Cu͛}5?i$>7M`/W_ZÉz(1zG{l6',0X﫪Z8.ukƊ׹/@SEo8a Fta=ȅ8BYcC!D[91D(*#Uu23])75:euF0S.kWJ}#gR" Aqe'v/eoL؉l-u]yH)"Ŕ":`$=i\'\,0F.um,g >%8 O ~3+.i6tWHIX> jk DkbE 1O& u])0N>a}"WğXp9c)Ӿunʹj}ML`s2Dgj6 ip7iZSUU] pEC7YM9C 4V.4pQZOzqh)/H;{$a  n=(W ܁;PXRp ;~q"m,$l>K=:q技\j|a} tQu#Ǡg؆N(03@J `Q[x2 8U ?5C񺓢uh r$I(EeY64G MgXÐ?^J@;&(X;ke. 0tܩb ( h_E TI*Izԧ/&ǂѶ-;{gtC[*AA9%u]\i& iמ}m\8 t^5 7`mHrOj֐<^jqEEɔ9dYQ'!&e{ چ>Nv7[{o1dx%?>PH2> @DE ʸC3kc& Y,Uaȩ|w0 tةh=y | OZ~A8ňiOd\~ULq?b53&2ڴBI#9CG!fA~~ulr!܏L!K6#I'Rk(q %P(Kk@IQr8?W2x3?\C*9of76P[}LjLNĺ/(۞e26+{Q( \x]zwp6&ʳ RBߔ60DBΑ|Ft0|Ǿ| pvGrb(Vv])`K=z^2 n )MhufvzS:i/I7 ]Ko9웢9=+jC)ZS#AD3ݍbن6Ç!-eb^<25FLT-=>k OƲMȕ@2лc)吸HJLl~[ q0x~ 87d񘃿ip 9|ʽ]@q6#G_՟ ݱe&p 2EA-EA"~:(L/5Un}FlbUJC#&VA®[A,p sSe@5Vvǣ-!0'wab$+aD6BJcIiv>ª<Ϸj 6(x}7Ҵ˲y!Ԗ"jy]ם:71Zq89*Ih)5k!lb%@s,S,p|j@Z3N ΁r2hir ztaL6RymG~.Zfc^/[A qpqBjQ< 0pdJk*!AlҸJ{SwFD %F}6l?%07Ҁnx`&n'g~Y<ϟZmQ$0R'wm]iZE/=U{qnu0<`E,^E׹̊u!x![z=b뺶Zt dhk/;c @NlB `X)R)mՁh.~_؅(+Raw2?wic]:p %5pC~C%^Oỉu9Gfp8q+0I{kPIGܜE3jx#Mx W,UBtN~9SU_y܇gfC+!Oann6`/  c5%dh x D.c*it(rUz{3Mӌm[)xѨH\P*nmoC}~X1o}FVqPu-8L9*Fy ޅj7mltIN$pQ 4.8$=a#Dd [Βų{`W Fy󾡘H2q9o]T"yQ<ҭs|JD>4!.Aݮ!VHc#p;V*[e~9옛Ȭ@`EU9۹)*7\lǦiH[naS2{+38?|4=TpZ6p0kj!) /n xCJܢ͆Y͏~%!Ɣe4'𶲷Ey*r1nsߧwY'ڶY^guApq701qK\ p. Dv1g$.BڙM$'#e5)B OKИ'q 8+RT+ }-1B` J8# vϏngHodP]"A(Nuhvb>0p$fGZ"¹Ҁm!,( T5NHgY6R{m(G뺽O3"怊)sK-fG^K@2yR;njGF ud$Ʉ ,gy7'I4M(l-Q֏?ҍyxTz%Xު d٘z = 0\.u*J.u_ "MPT$BiiG79>7Jw-wЮFVYKx#$+5k `tIkm䆐ki1ȦN>cEzH'K>\) ,2G2u]~YQ!̏YL^ia `hRfDZβz3VAd +a#yۮZSUE闭̕LzM(TXX`\R0W W)T(ڀp ܻR7CZkd;ܑ ݛyu94*F| H-k JI%}vxHz'|1ȐG$8GQaz 1ofeM VlOcz h sv{NȈA[٩:sEW49kZ ٱ\..ujok h qR[[bfA(…,˂.B@ҽ҅o"ˬ1/M g bZw̽FgΜ;$RȍAսyS]X .O.ȱӠ.!M"bd }rt֙(hAK<}$q,<0 } 4M8(fTUuF\P;:F (Bz4d9ZW JcIL@lnz ȧ>8,7yij򻝌߅PM8kxnAq~Htv|HhU/qg_ieoOkJ#c]w*A"/\FBv^Ҹ72F,Mvvqhuz.(!ZT'΃JXbCaj}seHKDWry :\XDQg $X+ۅ`]QқBmmcmqEUKȁ.ʂlq5 8*UU7 ڋ2nQ56eӵg]daEDB lR%^H38AoA1bC4j`?k#1Ɔ05}4|+jϻ:؅oof=A^$<^?o_Oޮ7Bx Q#-%* HGIX))V%$E,Yxw޵Sflz蹮kX$2fX#g⺮0yM)x1I4^eZ%6L+4MiU- BN/0O}_=k`b2Ԁ&5 ȺqaQyN ^&PI}pn FSa lIo0NW&/VrGm0T+ q hVn 7lӭTe6y\h[%63&nlY*K,r:'n{ F!{׎ G ܃SpvA(P?(2Х rWRk#*+'zyv Ǵߓy<]hZzg˲tmapEQ}gBϚHȅBF ۫V?rRcN]dyndCic@l{nfxp4MVUʍQJq{1o+;izifKDz,]Ag'Ii/4M #@X]Jsx ߿1->PCoP#BɱY$#+"3D|K26OPOE8dZSr 4|'eV/dGۤτvܝ; >paϗ)˂SPs@5+M9PM+@rS um d6(уl= H?K@PeP; 3ŴA݇K X *A)NtУ``@|Jz*H@=Y/3 ND; 5ԝ/c[Z28b@3!WWAQ0@ `Q@c@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@``@(#h0 F4ZQ0@```(d@@IENDB`gltron-0.70/art/default/gltron.png0000644000076400001440000013206707226130364012667 PNG  IHDR?1gAMA a pHYs  ~tIMEt IDATxYu'9-w/ݍ  D4fHp4~<~2v8a;a;b^Qؖ&F"X 4zߖyɑIZne~yZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjZVjO ~'~MuOj?jOxgjD ?q>UMPO* EHϾwO<͏S  `&cTTA?uK=`1U_-EijnOd:|L RQ"ԗڧDDsQ>wfbޣݽ{y6>6137/xŠsFeݣ# EifŒUXbgmckރxRX1fkk{׿0z{G*X>P1ǫ[glݼpYw'GyRI|UUy> _n?sYF "@ӄ ZHyQy}(04ϊG{F!~UDJm%1J &*eQEy$I  IQw5@DL`l2WݞuI!0,:0guOfY(B' ~ "LN׾p>1{zyWw],yv[?SA}WI-4;g{(D̅/-ǃyS$&A8D?4zj;ΰ3%R3#=q*ߙL&7r5>yѓRI?q:}>`t4KRRZ<ؑ ުu!L%V%%b/tޝGwr*dzX,`H(Yv4luΣCd[0={bל R%3?-$Aw'U*$;(m۫+/,jD0؝0CJ'@;ˍfbƧ*YgHTDTb"dJ>*dpF_g+F̕#1)@rX\NC%JqܬBТ)SLtjP=Ef c-؋ϼ"OR|70\w=s[E2OymFkyi}}ܥD{tv\1$3$eͮVd6-8v[\xF>vf, āIT)TTy\ ` ^V~NNSLndz4tullwzrttt4 ދy^ED?Mp~'C ` \緛[[[_ɨYUEzVVRTJ 4FaffEQs>GۥRhcٵ܏Cudeeuuu^ru4>:=ǣ*TaH'iY UR lI`Q--k/:]C[q*""*qvxܛ<'Ѥ((ql6<ϲq{ώ͍s^~B7wg'UU)jmlk/tp{隝q'tt0Ibc85iҬ=Aff.n=WGnwUg U.@¼Bc~K6W'PltT<hPj7gwh6֮^nh4=:9N'eYű[][zx2>?899;, n4ܵ[~4&v>x O&ÒKkH yb?NWNdx^zkol_rg GGi}uɦ>zNs_|1[zw'*lq55޴+o\߼]Y%W |중V#^(ʜlGI^a֚gdGƳ_`X'ԣ'j>:ݾ~6YJJ'*ȳbMyϾwa*@HD*|Q۷mVh;E`5q<13KΘP"2HUJPtyu=2OF-΍GiLc<ɼxj2I7_xsqvrA1~g_~kοlw?7"g~D0m+Ͽ"/|fuQ{'RO,$̤cy=s{j?4eBrmtw>^ZKRdv>Z_yݻUU>$Iq5y6vKFEyr|p_]^xP (l<>9ؿ5}UzVWg#E T^bJy< V:(2¬q4t{-*Vu # ,0ڹ[k\:oo|wN^y&IZiPO*6;Gr8.~???n .^_Փ;7} <92W۳DTo$ҎKX RQ PUa$bP"hx$dj"ZZ`sl7hUxǃAT' ]5Ďi^PU2`[ M{00/Eg,Hg{I NW_ГDi<޻~>ZZF2~;RWW^lݸ\J) t]{cW{ޝN{/(nߜ̔栀 ֱ5쌍m29CVDEn>}Rhvbl-Y&hmvqJ^DwiG՗ڛSVA2Xʟ}V; T@L&^}|w?Cz̷z:lC! 76[狻,SkFm -j]\iDkbMø%1kt(nf7 Eˬ՘9{ڒ.nݼy:U"ŵmlgt|ڥg9Hf鮮o] K+>uzv%k`E'PQvȟ㛄+jwݸݽ;J( )-Iz[c\v{l8Ktfw0;;\hl s֡m;fm_Xj[M` hǽJbx<>- oB)@-b2Honn_r^|s~K˟t3lnL9JY{# o69jbg߉.tVRفQV %$mF.Eyܷq8pE^3]#^䊜hkyCHO >v*2t:9/Iۛ[Y:N QU<*ZIdK>?{1O`%eJBJ`v)1.[;vUBYD5x!& *"*{jɢڇֽ?}έ7G:>>.+/J C ^40sv[fIH~skƋco=] |vKQ "D5xC4zE5ì|ߦ;ðbD?'b3Dh~ӎ;Oyb[owpJTy/*ʢPUUƣtZlRŋ._{]gEQI %FD$Rq9١0w"/ӈ N܍ɭnye[o4/j DY تwM{#Zغ\}\wtyRAH! "Kl(QlDMe~Lp>(X>8s[-UqJ X $ HPZ]2/1L̓ϔ(I=|ۻ'j*\Aҽ:nVo{qRZ-DgS8b1D$ ˞Id0OsGEcJ"]Zjzf#I]Xr^.u`l4gﭛn/9&ygVeRhM>SW'؝*G%1qt:͍Ry>:_|};r$ڮш{ P4{>ѼhCӕN^m&&wTHРQ4w]ԧ]Ćmd*xqU8 R RZU*Rʲ "B@aPE.~)~}fQjkW5P؋ ^u,H$,:YJ*Zp l{ޗW~_P Rh,f4i_[5?fW|Lb ,Ð Y"S( e6/BΒILQLifkniիKh\65X }8˷n=}~OLI*ʫ+5+ݾ7j C08#"\s6#(fl 9 fݖC;68b:U儓fp6g6ruu<㢜2 Vq-F`D7OޞZeDU6fnG&a# 5M85jbJ /J ~J9x\}%(/G_* lTZUl6{| @L@Ex~gxBĆHEH L[VHPRx_@TFaRh5 IDAT:;zWߗ'@afQU60Amd`V"*l}=wTnL8(V{I4:ZM h1`ӝ8.۰W{/UF5 JQ#gE"F1!gl$"&& 3}^f>7ok%M"98>}`Ե/Rlpzڣd0"T׮sW7:IaW?g2;DXàHF}jO# f⋠Q-T|Q%T+jέ, PvP}4 ggeEC^3z=(~nS- 1!P(Ҳ#10?oD"$LT!%,sQ$X!Kj@I*-{xw$kN*+Y!O1X@VbR&!f(2@ܼթ A@BFpV!mDFh(2q+z@(` d3fFT(hDȔ&[iP"q E/+T, bCps&mHATLU!x-ĦѤiI){:KJb><x>n_lliX#:oȰ1I+ܺovDs UHgy5d$,TZjEI$HeYgΤ>$?lxOEW?==`8@,IםAo AD>P-by>R JETe%|Uy ^/<  Z5ժ<\E , RD&A(23 !"Y N %0c10iq31nHIq*@@ N/n,jV8\pzWC&j4 bNxox?93*$#Z (kuV xJV&QĎ$`2之ҹsG~Qdg7pf};_]M_}eoN1S:D%}_ (h9818v̑.NfPf/Jb5Kr`Zڪ!28 ">|Wy;NBs\{NFd\̦Uy!H * ":Ϭ5? ^EȘah(2^(D2y/A!z@*^楄XE}Jb Ek%}(Ub/_`AijbFgKg?:#.ͦ#kqz6ᙏˤȆ'.\owҕRBR#-f~zr{ԞJ+; Icow0@R p⳽\[2E lPk((㘡f|~]wnc 6{$ G'{NTi(S3ʤ&F[.u;NN !x_y16LgOeg<2$qJ-ٴ8eWT%ˆ}P1`Cl2hEb=0?Z/`0ϧ8Vl^Fa r6 0 &@ϚV|#ϓ!f8GQ8$vuqq#I-=`hti'qllw02<8%xbXЅ:U6g9vFAXABPchvt4"%B4zW+ ,3Ȧ1fQE8M1Ӣ'D;w&ƇGkG7ZK;y| cAj/+h^> @(NbPf%2j-Kƅ*5no]ntF+Ia*J ir̀"Q K,uģ R\Xg]0TUF yxwc祛Y`H>o}<[=>'C&[YdZg]d\d#uHҧ."`zA3tѨhjԄB0@PljgJ;=<(C2Y~DZa!2^oyъ- ^B`BU6GM&fL (T4+'&Z;J"|*<㽯JeHt^x !Xzݏ;[s׸% "U[eŴ4jw^;͚݉Kl2i6>ml^z6&;2 g^wP eQy*+ AռMP KD*Q b@Dˢ={Š%>8:ꭇMjfǬb5QYDi^gDB@85pc0<X` ]@ UGr7 L=|iki2`# F!vBroÔll=xw6+9|w&a@0TBP?97H08k Z1b%`#|$SA?CrYm^x%00f_,fEgigYyYU曻>(_'7ON˫e{  <ÓAH}ȆՐ]'Yi'nOJ5J^˽KOnLf?$郣tL7M l 5H"VcଵUB%X _4D(J_yxQW c97ONB!41D@FU"ab./1 ҍE޴$1 QF+I(rh-2y*?0_heR6Ab 2ZY#)L0P7?ITp+>}A/ w?L(3Rۊ[/f#*[ WYAL^57mF*|ɽ% 9kne&i'^siy4i$Y@T)č4iN/{NvH86  3CU[riҜ'(<(E8&rJ@‘.xML ئ+rrʼUxb AT)@)g!qS`a8vmTF}RYYe!䁊ࡡx|j 0D~ߎl~A(Lb v܅4pea R80sgOgb rY[k*,9 ~߸w?NtYTbcT1戕QD`LN4~ݛh8; l}ÇfgGV*xp ͙LDΤXK-bI@,b%ھIu~}G8)1i5$d qk30[b2 @uI U gd2fYe(K_Ѫl,\~;/5αiVT`iPti܌\RIf^d2ҽ^ZqqavO4FX-DEU#UE%PRjP)1)QkL4D.i&ń)YIU%gaY  y Tw>Ϧt h__4S@KUd-upV 01,BCИ|E&L L&5Ƌ(%3{K"g*0TUEƋhͩsWEUMPD(٫hB'qOC7e0#[.Р⫪r` g5O(+؁[(g1/?Eiҩkqty|`69$ԃ.+Q([c!kعsiDqliQLNI*"/#ǣѨJ "Ϫ|z06'>c~{z .&E0"q0 *Ev2f3~wI-W~/((Mx ~mokYv}kϹûͯz&S(iQ1%'$@#"NO p0D0"Dr,k(R$f챺w<{H-9x;[.[2 ̲i4%9jfaQ>mo9YeHI"yG_~=}7^+Y=O&;gXMyii?JrlG(K[糶 ""ܾ={=Y$'ur\J͙A!ԇ^\w^9 FJ&9srO] #RG5 0YXe `&뀭9ez֭Gn.% e/i> 9'j*TSUlc*{ٌp#3gj6[nݚ%e]8Nb֬Jj3)%3n[3rF66 rPr3Z˟zW:08T+K 1Q`O<3kP%.I)RMsJk:<|!ɑ9f Cr,BBDw'GF}r&DL.UT6\! !YL*GW~y#Ϯ yٞThf6r4mюGIMo9_llc!!EjyYr @FX/+iڦOůb~M֘ܶV7qApseݫxh6ZiW@l r-UHFr9U'Sh @u՛h31R?X3ŇRLr~]e`?6 cBN]# ,&:+ Uϩ%*q/Мs4)ѯ :kB]JiQ|pc[3^j)LMu@Ɲovh4ʍxkgg{\98<ξo|ȩzk[k]6mj8XLv'zg꧞+DH>)LȫxI+ ]UrZI^)"8:ah9Y:.z<(SƦ,ݝ$RqhƬ]$V}s/+psCg~sʖ3 95Jlcga:8g[RGXeD19vxak`YhD{<\<;O: ^՛fScVW(N"fLD)E(9Hb?]psNHMKͩI͋rXrq&)瘴+ ]2 :( J]%StmW 5l]7| HЧUS]q|f2^? 7ǣs,U IDATBPӺ&IӴsw_?O˳AȘ(Օ4XgFɗ0ޮ{2o 2Da3a|ـ(J")m~'XHmɈ!6u e?MN)$)Yüx6UcM7bWx{ط1(Թ?>DDŌ@ip=-*Ubk= UlV-cS­(3N,fA!`euq9"1\p}p>tBt_sd*I@*LՑ]VrYFs)͈ؓ+|/z` s &B|^ԓ;%TK8\?LawtҸ:I])@J`TlɬM݊73{x"#([W'ցuBއ~owseOi^ES-/Q^FPg4n]SߧH/4{=h3˹Bi0$ qά!>S>RR)Z+Id}~c}T C0镱# ʴP[7B2o;7]Q;9uLCNUe4qΒ3#mecUlu볆ԠX fc(qQzW/|9]D $YBe S4͢&IupU;)3iq7\nʱug"rJD}A(="(gR+k4jz&́Hf䲐&R.-` `JM FDff!3wʓ[_VUS;_La fv4m 7Fמ{Q_;i3ECNY( p"V+9+{ōyzރ-\bSC05`hЬX[;>WWО#OyVՋs(U93XkcE sޅnQ=2=oY8: uau^4G9K^ڨlm[woMQ$e2DWR*@ň4^`,f9Cb&Ebr~@Y\v2sT빰ơ/)9 hwsVƒ7O__,[Vⲙ,  V*Ш@3$8 4Qo]r=ąB?3πe\/{o͂jΐԔ|T.dDLuRVTac*@&DºWêoPE6b3UJaScSεɲfDk׾g?؏}9oKw^ڟԋe\V"VRZR6,QiZ巿q|>KofXf3wHM`w8\ 5n"b,' [;nF[em T$lJ-ٔu{p+̂BvK~gt_c! exvևws4+9m$$Ga5f"Q^N?@ΙʤEz5-Ɯ*wJj:?9dmmll_u[17yu~bj-+`u2sDMV3RIEE BR{VHUE1B׍%"Op 9*={<XZ;j1Oʭ'XUɼÑ [&mu"2^P@ @ViKDpg~'vyңpؑ_sP((~UKsȝHsp""?ep03Odr2Oro(XqkiU aJP etFm\!{ٳBkLd0f^|s'ʏ}>7ƛW%QmpqػE\M@lK/׊{̇׈\W*DdO۽Soo"9&X "%SF 0l"Bg-X pJ9IA"dL[Lez)&.z5Ƿۭj`$FSע. : ^ IQ3 F$9ECj](J<#Qmя~#{zgsw1ƖV4VwnMZû9&GI3!$/aMԻ!'\ݣ:v`#MMfnJ3=Hb0P/sm9w|6UA%y Mu}BP#P@ /oݼ{ʟ|iYve3ۗh7NĠx*:EF-#˚jMjRF{}rpP=wr kcHClK(h1^;w?hmDbhrxp\Otc6(~5Ŵ *ԑaD]M1@Ҫue *INӣW~M9cK&5bHEdv2̉L4v._zh4^>xK|'^}C.If.Ջ'Ӧ:2JsN;H$v\Q(Bj Dp9:vApHJz+>[[K4Ɏ5ffv1jd)$zgD=SZ1a Юe+piGȲqifZ׶ǟz={|mHRfe4YJ^.oTot]U-3Iqr;]vU[k)3dFfQc'5L}{#BYȩ3F爘(&ZRHV?,nһ^+ pmEx 39_kÍ͍ͭs{⽗cvv8><ٿsptp4.nc+"*:P[CFL hB^n+|Wի7bLzfMH4 qT䣃ッF֠gNcGkOȬ>**rU#7;ԓylf2hl~\;@ 0#ǎTԻ|!]H^A9L0&rSg~[x ˯iPrN *JRB+ tT;0L"CQ2x'bo]޳LʽgLTɤkܾ5RǚđIV?NCn"Z)wۦS>ZED"Smc}[r!.(wm{[;~܃jz:wCNub,}a ;gww3m]Ne]UmrdXO]T%3jxZiuիF{Ϗ>퍶^&7,kr1l adC}+o_s/n<ڇ??DϴE{3Q]:`Sr2`IQG 0f":sԭ886thyb%߁6 (O9T),o< "\l+&ɜJ[7bmLRZ{_y8V8:LV7/jKnzC@!oR4дUOis?~:SնicSWGc~^\%.am89{ʳg{-t6SJfg|wȜe[Lk/)G䓁_X,;|ёGH6)źME={pk<C9l6Vɚapwvgm.9 OBi_ul%hE4v4N%b5\8/_ 6{{N%cN19Vbn;c3QaX0 f$LCjSQ\xH0@F:NekgcB4vq:L\ܽo{0liSKZ}@Q~6jmó^~mx'Vi\1W2vS4h3:OnFN&B(hy̹?xB,t2ߟT;gNW1=noz73|Sskk7\.%K1=7Z%!,Xzc}/7iuhBú7CZV޸>k}fj4s@+bQ\m31 ᇆI^dj0^h&' fc!Z# CCT FRod JsΎwٜ"c˽FfUJT33P+"Lo–DCx{߼<1 )wfæZέcrtpګ1;α pk{sg;w噇ֆD4b>?LNfi>-|ŴV>W~A72`Vڒz*.I a&26D #SI16Dpf7<R:fdȨ,>\Mw<#=oYSBD :0X:\:J| j&DyNe(l6Jln􉒙Sp03au%XS,n8 ΋cH3`w.5JNo\n< 9E"jrr '5pdԲ\4y?TQ˟^ȷoϥ~}6'SJ+OJjE&  u)ubVtV;Kw:U W~sz4kÌ@`BL̸rTW(NLӝpf)uΝ/?h(6n^@Rg#:}ӟ_t}24% )*q7 d*CoT,N#J:ߟq߼tʎ_t.˲tY}o'%zfcdOpx,F^}:w̋hcay9iI,5fB%Ij%.k[USfNS vPvHP꧞*?5}L?/y[g>Գo\[,ݐ=vv;Zxdr$&wldG^2 K|+,JIXq;r__ٯ8ݽ7nd&X}ѭ‹$l%!+1R Q&2HE0&Yյ^$"UtHF_r=`/B=ifqYe ؤnLRWjݭz7:7x1c<sob;<"bYL9'M*K7)7iMsIrmf"ڑ\(ʵͶ7K/1i5VNAUXiYι} =3:/}oz݃jY ( x,G),dq|p29LբdMz5P3 *"niP[@-?ާZ.Kֿ3g:X)KzАBjJcJ#6y38 \ -Rlm PI&ۻ4g(WɻLsNUUwj0kTlHM[!mvj,t1 O|ou ػ@Pz{[fܙQn'Ҫ7Y墛j0Q+Y+h9CTV}ڕiu:V}KVF-t+'-U5TWfW҃{?H^_;w^;77r ͝ =:>;Iꜻuft{UY'o*_n_8O֜_"תOw_쁔OlT)+v jw@tN *-s$I#Q>ܗGM,f*ι|F6 efUS]69d,YԪ&+ ILrPdp޻xLOffRHѲF\PYO}W?>՞ +#RI $&! fȭ9UIpJLVc\o ܃հJA+s%Ӊ]rHoOQ?]MV9_ǟ3*U1Njw0S IDAT^x+?u󡧃o˺͖b4Gwo1;]ƣxv;mrV˺R9&2b(\c#_?^px2#?{{)pVҹ15]a D;⎚ QAp$`6f8&F1o̾$i[NW˺f9vsDB7a@BQ-֨ݢ53U!e#O>^\YsH5bhmY].Ξ b"SH4C65vf $D1K IRUl1啧&zg `{@ɺ懭%Pxţ; Q) t̮,O>O. h^ 0eԲu3l0keQ\+cbS%*))o^F&u{$-._Zۚkl]`*&rmzZp1f9pjLh3ԈCL}L$1"Ff,e\.fO@UeuffDM%^׬Ws &S5R6:0`1RvDZE,گxoW@'Svb%S@MdjS˘(yLD`8u4MC+L Eѽ^0i ߎVwE:=_)K"jmN17"bQ|G.aYYܸ}4=l 1fwxA͔!(YvԷ9)ZC{\ vC(()dryS:&U.;6%KM] *DK f"tV:0II'Ia.ݵufz|aJN%LMC@S;a `2J)`C mN#YaO'4AZTO"cJM[Ѳ,J5mHsɅ}bŠnv|23fuP5TLLЄLmLVV]^(듺I)Fr=vV7^x+'slw@ݡ½s=x;>Nm:+KWBj ic;_gC`O<}y <%cv2o-DpN 68)ɜS7V"S 3sl4!&bv(~VMvo;I:ފfU{W}ۢKuUO1plFf:r B,Q7\1Fd5KV&dP3Y;[jIޱz @(;&46 3fF̱msfk mb@;ǎ@Z-++ OK c,@tKIH*{X*F0@Mhb?{_͜ o&)ZClE 00$~ɳ86e%HNF8yK VHC!g8s.kUUj{3#ٳOW^,}-z-n vC!<uVU ːN&5citl*꺾QUpT}wK_J F{EnRLʚ6qBU,XFsڴL6JvWDD ̧P@9%H ]~THŃ4DHu놛㏩\~9h@ *̀A R'm02+G" 2q&PTϟ/Y9pHd}ni0oČ8xh`Œ[H).b Y96uhrTOf;* ElC98=O>{L]|?vߘaVC&ưhN$BdҶ|UTH\91D ! 2cF|4[\]/?zVY-xH1 [c,ƚ&jDڕsWDV9ȩ- 7CfUclChPסn={b!b×ect.Ҹ<~~+\ h o֠R&Eem_y^{ >bfՈ`68;J[.4<'9/>iI~bfAE!(ǣh~Ll.pJ݊f"F$vNoL:SY UP jAFĝI"jhij|@ Π1 :UE,zQ@qsPn՘hV8߮?3P~ޅ֛&qM۴u?yGz?u-<.+iڇ $* 2 H/|?~ٳ/xrqvt݋p/"cS[Ii#vX7=@ & ]6r:N BE9z-j|<Ip`& =}+D `:`"W-m`ĂSdr+1b**`AHJQbUQQUx2xR#Wz r@5lϞkeq$0M"EQl7[;Uy,3Dtn.?TO X/>~^ v[oˏ{ = 4?)8?pst_ hADS,.YNFxxpKKe}t./~YRlս@g\~y?yF5٧@w?<&jNU˷eC4F`A:^˳K_+R_1(j\rPIc&|3*Gt r͎%D1d:>}B(G^o'PcgQUA>|[w?z]zQHA"&OD=g"'P8GB$ɉFzqz^+K<|`%~|G,)cVf n'E}黩`#wN:T+TmMRJikflU'd6=:9qU 8*SN9'ǜBKy ZDŽjqWp"F,,d7*2(ꦼY*nf!t mhڦn6z\]/VWզʱ͋h\y(+ 9_n4, cQM>zN YonH"*?oon[ f6{:?|m@(೼ ,ZFPFa(,VUDP/oQQ5+w g.O.ku@ C$0~@G9AR,ǪѓidlyJϊhrz\R bCg&!)Z&:&d2$S Dࢸmnnnnia[V[Yײ ًuGU܄z^&鸜J̹2m,˛Wrlfmk#l6pPT * W9={X97FO+eC HD2ǵ;k}뷾;o j7Nl}GG7a*ri3Uи~"Qshu5b2a%R?tqF޿v`B̀c:IwY5ڙP2t;aEhlΔv0و#hddn:J?MԗD1= Z  _GjDPxBHHfz8sr`q,ٱ^i?ΚJfhٮWPwFCl׫ͳgO>y?}ZogQDDe5M}b&H7HDG9`4_K?jnD ighrjIDiu@n(0" 'P 0_3z ?ξ:,WL>.l2ݿC&z ܽ 21JJTis P󁪲c`Pr,f'eY:*3 mC } 7[%~z9PzZ\}FH,FUQƓ>|NNՍl>ԅ69[._o~GNU .պџNt|L@df6-S=2Jh(!Hn} AGB|kL3q/L^U7!aRpE4#Jgʂ=kcLL߰{K86P&NJD =|I U8=;r#/Q42+DP@qBfTjaICph8y1D'=tC( C(0Si* =ev 4vX4v:߹ΧET҄!Mk$f\?6j⺨*-nQ շ8o:Ol4HS^ɶ'.C>?}˙Z $~uVVEHY@#C*X6`[ @1v+闷Ϩx+'S#:pPC NZd1&5=vKOrNwn:@Em*`Q!)ʢ]UT*u`p *èdshI@na2;(n.w7ܣ?(]aBԌ$t!T5e= &BZn7 zsWPOfA.=|Ų(rI~\d69zq<^/W; om%Рߢ A) *@l& $y Тd'AJkl(\rp#)ij刈?y>=|N^*[u y0"mL4ibxxrs 2Eb@ s8+<},2yH%.pU`>!HHz}7X`uriZUp ).Q*[ϵ`N pNl+*l^jP -s z:^_iϷˍFnD_ 1r\\'v;T[EE( z@Ji`gBc*䤜!ԃԜ C`t<+mkBKD*,?BOOyRtt_XzVhqp~Kb08I/AOD$`+ ""7C[TܸO)RPT4rq hys9  Gj2ItmwNK0*AeV)G=Φ1NH~msssuyAܿ{~W>Ĩ C7v5:C3 b]/|?U@ D2)"-P=sD H$T%2NV8:w%ܝU ݩ4XR!87($EG ZZDP=^:;4wFCn<2Po^Ck)죐R;!>[mEUV/t>F9Z<#Ǥz D! PV$e (JCAP8(xwPzy(=JA|' h77˧r4ݹww>;"ZlTP3A$ Ӻ*K|pry͗˵s66-QZ+֠^թV&Q^LNyВ@ILEUR"7F@XDu — OՀV:*ȋVbӜ;׌s`N|I7'$QfwpwbL4bEQLfct0O= 2Z&V.&N+\% 8De0;aE ‚N  ;>O5iJJ:Kn P$4bq}y$j}~>މQC G]D*byw||uYC'"TBY#̋;6_`[n p(*RZ7@DDw^.|fT\EEUh5ՍWzpskAIJ\1DC>FݜKblԕjLvu6 7bTk *NPXUIT8z2O=A(^R-Vb, &ZCXxF t@ {BHEBdbTU G6ZiJJ7Q%P $BtMh\; IDAT~vuٓp+aQ&eQM&p0R84 ;Hkcwުf[`|Hn+u(3xwݿe`ѝ d,x0Ƀ dԿwMUXQS7mj! t1,aaJ J t{W^3 W |DTEIS[H}o=[,T"N]q%Wztvvzن"QE)WHjF ΣCBE⨈+" ~ϐ2S7ԃVD430-6; 54laGʼnдnc]9*u Q8+6]v6PrgFe{,bfe6ǫ^991DSQE QXH23OSWl6)}AD %%%=v-EzfTpSS "ϗ$I0 n,\8ٗQiVK1S,v@s&~wxW ˂u%ɖV R@MJ ]`vlǓ㣳mެmc ʈdXZ"oOd2BNs{xs>η6[&@PQ( Dvy.?d|w<ܿ`\+Y"Mlۺmpқ@;ޭuﰡx1ܹ5g륋]kOR滹-H#+x:MQ5GGFm[TIA ڱ΍:߇7 w뤣nNqfON#Bmqϡfv)ڢ@t=(mۮVv;9>fDBE 4FT!AR@R AP)iD!Ta$]޽;~Ӷ%cF% ( JE˛WOapqy QKZ1>2D$O *m=,vȆC:)WNvPA<*X-+ 1j\c?ܤg,E$Z[TUQ.^W<ĺDzk,i?ГDWK{LYcRkt=]:ARqf\^Ÿ2sQLV%jPOk۰Zm=]C,CfyAѽ}wכţͳ%t*!hB:gpؾU1g"[![d+Q5:$G9fM <#ґCr/ZgTElVM7e\_>f^m7zBj\'-vyrQxYh"!smVbJc " c,Y"h@ T*hv`X$kyp }<@>6 ;p .&dX+oOQUEYV$*AB[u鉜їQQeUl˛כvu6̩/ &܎ӺjD PHH@H˴sHHȥ-e(AyrιTs;9Or\&yM(؊Q(s10b[B[znzlv[o7ii6ӓW? ~21F+UFY$*3X\Z'OcL@znGjeMhGHhO(ݞGu fG<@=tH1ghk[ӪΥP4S&+@ sXWzn7%xkaRN|uY9\Enڶ;*"ND#rȑ#r9'G;H)$6 ƿKAM Y9~N,D8X/_1j!B1mmmb mb1lcئ&FnC˱m1Dnc,]Dh~O>/?}7 tlt4;!}4 h @$y"_7$܋P9W/ո&l\Gӓ|>{QUSlnVͦ]löc6C$r LC"$ƹ-<3,~@XA2_ ((* Sc`9238r;\1І6h#1r!ZU6`D"*VE9Xj3fcRUX @HT'~_}/__y97zLmDH1 UF_eVL=iAov:$IS@Gi QZL`r{iBJ$ hs',\4nQEjEMM24,g$`EH'[=v2[=-fw۳(N ؽC4묽{\wywW׾_o;){+(jgڃ`2Ś؋YqI[4 sZ%!CE)(O1*tW{OqfbRmyX|GgN"` I5/n[Q8RT% $=:ޕEi<;ώ,Yѩ+W%y mͶ^oVu4Mڶmu*V5f%a-ÿZ_\b1I(i$;p nz0~]6g#ojz?oW]Zw~vbϾhnlu Kle{s2&W-Ma63ƥI|CN4qnPIT쥉9LP IC U%<8ťd Ga~Ǧp0 @ѸrZ:sWU Lʣ84 `6n Mӆd5^A$Û~Hޛ[\=:,J3ib$O1˷_+?wz{?۫1^sHuLطVƘɄaΤ)9j%# 3Azs ǪL )=TTE&,ɘɠ&MF12re YKiQTc$khGRf`,QiћԍFx<T77]ob<HIlMP ,mK\<!uAl.[T!;7e7ܚ_;KoADՊ%.nV>x?{g_j??|G1,u>`&"H3ihmO&Q1U z$lPˈC {go4p` bN|&뙱XR_ON=ue#lb<7Ilchi8 _|3?o@mcV>5+E!Ê0;Qp<΂y{"`Tzq9:?@ n/ݍoޥi70H: uWeDz]O~&<",!mu83w4-* #jh=`-{}9go8u衉&49@g@tFU~rv DKASz"L*1w@C)']P zN7tOѥVw ă[ۧD-i=A " XXU[A 9dw+$G*'2eꒈOO.tm?";!HBɘIpvvVH%ώp#we[r6^r3ɜ.۬q/%"&*w^Q~:)Pw3ؤ"k>הP'}~l%\Ri݄VnWMPvƵ"UJ$_IݻZzB&iU<β?^lPc/AD ~%eJj 4i^wWb<ER' THt0yjLV ^r?ZޗgB\< 3/SOн꟣jf/ߧ|&!|a,W1V߱\TK/#?6y*/);A]C[ ZuJ~s@뗮1C\o @БC7%pK8C1#E\K;XkgxW]rd}- xh3n̐Ur3~A\ m&>̔^"mvIĖ6Qz[1@C 'a b LD|3{t nkם90˓1jڡQ~jޯ5l}ٳn{.?OB[$r" dKw[2)AO1F@Uc; ^:%X};B Rf%q根d+ԮvІd+`,4aэ& @ny*=W֭gnR>evsxxѠD&P1S 1ؒ$ )3$Xl7tf\0D9j9e۰%;Z)YJ-/R6y&u8U/0f] y3{@`0e{@A#;h0DH@gX,\\|nR\]6Ɓ:YXuծaQy{nsƸ:q (2dM!6f 0YOm72пj.2;g͟E%(ztM$R%̼jԌR<<,eܬSa=s(9O_.g\ -#@ {JdhU)dI5fw"^>*"hQYxiv(i} t^idiJUFܽB/iF+חni,kZc E4qA4bEA’U2]7tne|qYOi9|wdY$DS!ޭTn PyTQ [T,`!iAMN'Ћb%|Q C$d9Zzlӫǣwqz3Nb!a(2;7_\ 1GKg 4O?]q`M2Aj 6@B1@ 3e5\{fAcxP2|fl٨%Oˍ^ mK(9ETb6I c b4`s'R4$ fRY5f=4Nd$B,(cV/IOw DVʥg(z×"[d A"ļw\p w!LB(^> OJl_.rf/Bov•K}rUzzWf[qUR9%Cipg׃AT.j Y)aJjԠUOR+ lwc>W'GȻ2 P ̐+6X}H% "Y*vyPᩋЈPV3(&oߓJw;W]L ?ܠ 'N7dȶm|&jK%UŲ,sߜL $B"y Fr} KJbͼهYUr2k=?X8 Zz&",nfF+!籚tF?nV`=P[PH("moT*lDz8(%8ק-Ӻ]N_.AKR3zЕJ.7x : G U  1hFN(ZQ z~, ` sClNcB].MzVt|Foz YARbrU > IT!"J%uo"y:X#Wzd(;X=E?lx gZ\!. vaêHhMdzi֌!FZ+_Y-<|^!t:)a镮 {ۅ#E(=R`hANbS DDDhf9g!k.Hͮ==f3ǸSWO{cH^2h1s`y АJܥT5@0hҦ}Ccx|zHW{([m 3-{HqڈIENDB`gltron-0.70/art/default/gltron_bitmap.png0000644000076400001440000014431107264162424014222 PNG  IHDRd*1gAMA a pHYs  ~tIME  W IDATxy]Q'{߾K})lmʆ2cca0 =4= 340LCO1``cc`L]eUeעTڥT{{s"RRT*cKe{}'D_-la [)"@?`.WJg |6XY\oUc6Z@ޣ[ ""B+BNҭSu;X<~"o3/(Ljw?|=:p(S~sI/>}yέ,-s#_貦V0*^A*r {Z֤ A5ڵk:^?@i#Ǧ/m)0J1e ,-,W-,&:@_# @ `[Kp=+*<X;6vPh(MCigkOqrev= #]3MD6j&wsAEBdK`G2}ё|ϦTJcC44/_VN◚gCFK??pOiP9HN57_;ӟ/}KIxA5@2ѩ7HQ맚3W;3uPkမҒ/qwGxzMr5}=t~≷+M u{oVnzny- CJe_`@2%?;u*9|<)R HB$D(~җ+o_7OMPiO4SV@D] F82|? ؾ?᏾;ϴ_M)Z_(U,gr(أuo|ԯ ƛ*^\?wJt [׏;c+B$]ky%, `Y?Zc$$" YiIԨJA:ESGMCRDb yԢ86~_@&$ D*" !xw[g$|O%v?tϡC3lBbՋsE҃I}]IcGs諳|_]n?y 9X9p1p-5\:3w=2_?vGe讣?Ι3OeܕNG'l"Ex?m&/HM܇tm) 5Z= KN"!)Oڎӈ\: tWf>"# +/J{ϋNFO4@,$,(r="L~ۏw2nżn? g{/=t3'N[\9|kOp> 4) d}gT6f~/N}dcާlrů&{egחj6y:QB^]T$W3̳L%¤a$lB[ M_ld tV= y(CQk;]Gʃ=1rTKJI)S]YߘšЗu T4D:T4ǂhB(4wpmo٩+<>{d(y׫h& O8ʙ]}' H,@ pUic&l,?Ƹ+?1͖[-ҩT"+V"`35S_dS;i 5H̆KpMt_o"PvGWj#7b ϧ^Ugj 0Ѥ4 Nig?`'vg>ZwW֩BQa/}쿸'^֯EYw[YUG=ZŇ~->UTx', waо;_:s~!@vKm-a!1; p"C.B GBe4HvYVA7'7u$>R[ѥ'Ty':{b_~!.uUWq=叽,j/E+pB 丳*go :l8mK'!aqFZa:^_pb}EC@@Ro0tYlȜ[ H\ .Fg,ZA!G> 1 uC>B@@DABޕ%570x!?->'}E9\0lv5\=gI K'ktHc F +~PD!$ykCdٽ}ji|ۉP /AO |Al"G°7~7b&HKrxKgvn=Zp$nO򱕛)9DeЍ*1FڒȔf]Tv6̘S; ^ Rzexä:A"' N$ яb ܼM܎?lɋמI@7E&Ml GX+9Ɣ"0\xs_內w{Δ2IWwO~ݬp 0<p*HBZsZK0/r$˝-PD DbJLD4/k}_ K gng{Q.a`y> ۉ-|  8█"b/-lX#K T'.i%>fr0dQp9>fO\ۿ)֩Co`z~+ooZ:p{J8<\}Nl$AڗMt6 6X2(0lz4Y>Zk[l*V(g.co/h”@ 0 tmm㷡BD6bn(/6DIĆ7Y(֦3K -KY!Kml\[Z ,w| ?V/, 9bcv;L=c bTP~On 73 Q!Xf :5l$!`*,_F?؞{ݟQXhL89>' #A=BAdv¦Q&s`#w"0@D[bκIj|?S3'A> /L b-Kf :jWɼvر؈nƩeUkƫvl}#t, k05~²m翸t/㏿?={\Dm@ ;^$t/C,6Tą:"PıK~ չ<>`p<^Vzu&*_w-9lwCBw"II| )x=OY]8lB.bZ(6gD)NlUmS]\{}``jO]:G_W|{?HoQgOc9߼Lyvo]}.@t=;20i$f'I/,${`эN\]]J? %pN{l co(i+b "D$B@@AG&[B\Jxa Q\"6JhÙkj%ʶDsbxAwǭI+8mw} L ]l?c6pޱ <셠 񷾭? 3Kgs`YcqB 8_X3k9kcntבj=K 6sax% Quu@Rϖc;80257 (P^Co@Kr` Ŵ$nڨTVeʴ$8g+tXNm$\\kԊ.t)gmOܢPRh'ݰ;F4wf8nP[nRVV|ww`\xbilܣ+($!pțT@nF@DgBM ^~}Q ca6Oc^P`@᝻~ExDtV.ƕdѺal-8zX{^ʾnp ;KBvFʎMܻ?-\]8qԹS窕@{#KۀU-|܍0t=Nl maۤ cmF.6` 0tu`۵!7.~ډwa8{g~;>l;`L2ff/qfڵ%}?N=?޵?=֊uQq#ּaq(XYX D,gщ6O@$ʸt}WM(< )rܥK.^xe`瞗w<+FVIҨ}$e:K8n=_de;:  R,$+ZxNxOp18Ixsq"@_(i<~B% !ܥ5/{|񾿏.OvOOh-,"YD#lF(/5#pO-grzD[z Ob8:5ioz%˜ ;c1Qh4bo굆3zn-w+!vTg=E1|A<Pʟ#)ԓӍXTDQro89>~JVgŷqlnO|8LFM;Rۿ'δ]nmƑ,Tj>Z2FgF؄.^sc~=۾ 8?w3&+{~~7'F'^$]vk܌}+Te5XGq=w{b|mث6Ғד8KN62LQX똹$ vjy۶]qۤpM!x OII,Lu6 M/?ᥟv$׏m6 f9YOL Vb髩`Cox<|Fv;Q5锟2qJ *y9]QfIb2:2599h␁5}x/{IPwʟl5 TءJk@{LGiS9DcɀO_f .WZ_<*g1U:zg_cg:8ܑ:da]guR3=X|18~cZhǞI=35|z?s|0n5: Ba/yyx%℟ʬD#VC ]wuZVUKj͚M̰[T <#RgK"_l틑"aL`h&rώ@bsOAirPj:oۋv3dʡ c}hRUBi_DOTyk;G?_x@TXww?v@S}>^6@!.Jt1|I!z \3Kc#@L*3s^|㕕&uqϤ~S' 0 gf7BE{> LZMr.Pճ)93NbF/7]m 䥐<@`g%S鬞l>/?lkL̾y-RB}{nyd q%W-JXc b ] to|/Ei_w•pr]~"K:7Nu9ib?Q+Z1n'ҷ D isGbD )MoI A*0ua;sSV^6-;̅Kz8HݎK7VVJkW.+G.z>nYMv{%% q`6:%۸VK9b]/vG_q M/ŷƄCB^sN?=9ml. JUrBf.?{tQ7&Ylg7@%B{羗[^6tf6¶ِޘsoo t+Ҁ,RP!ivk ח%Ut?FLٳ]k.oTۭQ\,g @`}:??i58lZ!|LfL:D%*^.[GP[\!WtmD+jݲ u6lw:펋K1Ahf!BxױOv3.gP:I3Wta陖eom겅-|ա`^L`<褎U1XnWّmSc&^EQǑ5ފpφ`/DP(ڶ'5;YLH6>6} DvKfzA2{cFT}}{C5V5Ŋ5VK\lҦ{rl_!?8 :nK^`t bemjXYh+`4c񾡁lyZQ7"Da/6KC* 0 +@!rbMM'F@S'n1C7Ѯ("hz5b=bNȆ5]U[uÉ/O>kpx4Ik͸ct7088>$ =JV=z)8-OTIo1x` IDATON6&1L+^ VPdKAEd,RT4xuģ>TY_ @ AbOrx~$HPm͆HKI,ݬ8 B XY]ki|Jj-\tcS[\-(|g/YDEYuգǩͶ Au$AD M@  `[*I:b.Ka KwSk"LbZ|tsԈ| ɢ 0+E{dF-RT059gbd[.vb*-(ضw_i8;6=46=Xe i?PAh-FD " !#8B=6dTXnWgf.;m @@*Ax(Ĉl\̮^]\uSS:52a2BP(tgM=hU*84^ks;-}Jpeiu&jPC;K}S@KyD) ( ,  Dh$(;OWlYqD#*1ڃn؄VT5(X:3OTPH<ϐxdȤlj\iZ i_]UEX)~Udz :N7jpʕZ{$?,.=5&Q=4殗$)};RW229?p帊뫭v%ITPV 9J \:ן U0Ysxoc.ίΜo5O~)@ 2L`xdd؁i?/+X~#/^97cmiU:nˮV=D2"x@%*o/GKTi| HFh6\zXڱk]Fmyu%(vL6kF>O>sJ2De#w-$1Iйu68VL_ 9 6D!St+ 3;/y(iEN3{uS?޽w<߬uz-kUE ŲJla(kp" Q/\[Щ9<;G8`df6X[l`hp0K/]P?RC!W4)#"ƈ"rtNJ hYmvpd56r\(M4ktU -[Dؖijo~Z*+ څt>۳ot=D'>//U63 "){cpe)ۿYz;fSL}޶ŝӃPAͳҬ@R:{߷/{eN_I%I!Rm-T6*Lۿ(W][][3&|mеAPT(Qa^i{S"qRT80?X[] R7P;.N٬^J5Hi }}6Q-* Q@ABP,4ձJ#tY ϡb)gmD<ٙd-ꬮ\X,#ى{_{ށ C(۵crtȣ^[Y,lڱL dXK_8,"Q cǸJ\\\ҩRMe4'6qꪩYOًW/y\=Zŕu7JCToK`7 Žm1 qqrV>9/N;<9hy$Hefqxu# d#V]Ur ]"IGRBrcaKD<9F2SSr9w߹<](# /]{p;yS:3qZih#xlO?vlq^0TKwyFF`@i?h&vlSJu|$`qzDz8ܿw]NT:J˫C_Co> w _xvܙV:VbbDn "RoG?x'ۍu={12*QwS+HaݱNnA"ZPoA3덺s4g얙rId:(zҞe'ss碖KSas6ک#}ԝr;mc`@JS__06#?/T(1yǧ޵qq-,:ȞJ._GoB#@vijL J؊|I9"P(ͦҩZ_ tD @J1&b~SkTer6PQR^}ltp sy&"-T((fƚrܱ{z۶I) ={ >yꥋ]ҫy;^SڪR6XA)3l.A@l;݉jwN3> 5 3Qbx/+Z(BX<-(lZD040%cQfdR;(9fi8A"Ȥ!@ U,GGwص;cl:"/8<} JJHVDdlj!G ) 4kTZcz管S'6[z릩^t_Wdߥnokoi0Ĩpß#᱉۲H_gz*j6y/1DQ"J ѶlJfǀ]`U`Kʹn }=#KK`pU I`p8;=O+9TM @8lƏKSD \:i -A#\כ++<&4ZA5{Ό(LB"$:򵧃gK۶MmO֘J:7;{܅gfZ{ɍ;=hϠek$|X.e-3+ls q; Y޵iNGA]*y+@@$DN4'(:NXA@cg[{p }tvboRj9q #[1&f\tՙ33W.<.^T*,zjs++'d;:6sPk), (X,4M/_._BlD1 2cmBݦ$5ai6FގBFȕJwھsĶ|L^c]Sv|b0!DB4, ƱR*LbH xZjJfzg3͸H僟W4 ʻSL~(j%I]ℙcq + H})uR~Vg[&g,&( L^yXDu0(d€s3=2 &eK>T:|Omo9+L xw5sƓ=\,X,y%{ X)@DFd in8NT*MGv؆8@ +hcq/]y˗`S\PN L' ֫xJrraC|6nLRJͥ˥b1KkDhu7AF(a7ꈠJUJ#(ff$qgK 5Cd5PX0Ē (3]]_ͭi6E5ZT]:gN̚ɪ 9V;bQk7yi "DTDJtZR*_P- PٹZm-K! HzJ%5G#opȁz83hG)DzJRJ)y$eifR&5Qlx0kTM߀qhP49`@vOzgW>R@Z #? O:Afe!$!u밅A8+αILquj6i'&:;"_T^tU4@{2<3# HHű2"e j@P&v֚TQwt~Dh׏xλw\c6L$v W@@$?sok[v}c9Z?M*vEe-Q)Q$vW1yJy5(A`CHl((j@*KlDR,Ynvus1>u(*FRs=ךo' &?Cws7r3,y? L#j,/=i߹=;9/H_79 #)3y?ǯ}B~'"3ɈH"1ij>e=1qrv~l|qt/S3r9;狕v4NWcw __r2OgCl`e=؜XJ g]@(RgDhrS4BgM5/RWmSM[[[RJMD4Ď@Ҷ@ b8vI#S5):RbD e윷,! eIÍe1lC#ke5X76$(Q D VIFf qP^f), ^?(g-jbˣ]Tbm'bP!BmFJYFJrŦݕ+]Slڲ^ L0U΢TE) y]Oղ,{"o̒2p7ߢqyѳOW+O租V2d^:lpLm@t9,l233<EQRkMj1' A׫B¨d&y9;WcLYyXl۶m>0og ;~g1!;i5~xxqwur7|)^z7<2F(3Mzqͯ ",03=331shAEoB?!$xE_0CIC]Q)cе|K;i7=d9\ŦJ{7bbU{ 9 7^wS2Ur.gxARmEjhTE͘ZG%Ы &RX%lOO, qM"` -3ua]Ge ٨zh'+15vng\ˊ~FbrhlwOΔQb@:ͥ}k@0(ur%S#%3уl^~f2 0(9Z/g^1#(f{gUEݺ['̇.zo0zg 15gwKZ*y8:__fb߹|0.z|[>rE.lTƲi Wz\^466uJmcegStF:N`o(USWiXJ`̝`@;d{lfBbXy= Yؙfu"2,g ݔ]ai&b&'jeer6@6ʮ=/z#֮025wϚ3]_(\:KD 02C%^}HX[Ӷuة9^w' dY+Qg]s_/ >?[*\J^0! zusrygggf(d^-0[Urt45x53dMgλ͛AzsϏEphŒ"771311) Hb%Y'dpp|jPNˣwn63._~}@f,)rv6?;Zߍ, 608gPPEzd`2- IDAT RL|+:)λQL.(8V媙UU{拶?̊^n⪙Hg]>V4h-m7#{cGXV'.wgDB/1eV~\wM!C/9e!!v}se+-BMEy{EB\9}9/G4JDyE eGsQ6̹FzoSj^R#ΈdU Yx龳ʔ%1wlgv<+cg0H<qlw &!MnB`ݜ0ɥv \#ZSh%]͆DA P[U%dd;';(cHՑe0 YfĠmN.E(*i!-(r΅0s`mꪎ:XB`r$ ;KS2edn w~?TgrF5N_ "U]?iǎ]a9qp8-%+WpqR{lkLoRt,/g+N J_ ́97uv(#&2,Y$mooͫfh/{[^5,)g'r9WjhR>98|9pVNgtq7h<1dgrjNM,UhԖ_ ud! ̞U͹LLA>7O޿~_ӭCٿJíMpP%u>#l  &LB?/4  w~b]N*OnħA;UXT>Vm͂FAQx7+G_/&PPu*e_m9(01`og|:hJFv 3C `8&rDLl0cSQZԴD~SUjPm _3 2FDTRj[j뺉Mmj:$""]fZP@ (zZG{ǹ, "A~X'fqa\썊ɤo_쬦8Ӊ/v#}>M:ygv-ND8lٳ ԋŭJ/v[[D%gMUٴ1ĢO,k"%Qv.=Ԓ郋Ӽ_7U$8~.U"{# 9ވg8lF]~ >8B>䈲s\V̏rx0~6`X7oƿ}Ε`hdDIۅ<<,2 : c(Qp{^i$vHK覺gfff츫׬c.HH'jl`zvz`gwg2~Ȉ42ǽ,pk3LFp<EYV(LIf%bz"ddipL WZ!gKJٞRnpmQaHkxRu9+ ǁQ4FbKX-OSc{=`vdN^ӴU5lriBI x؛8 fhnfU$3 +oEkqw驪i3nwVZ/!/1@Um:)J-)_|E߹xtH_{8ir*\ "˽Q`3cZWj뺮Sh3C]Ոmho[O va?L6 eWs,GmEfDDV~oxero[{ۯv޿`ljjf!jWG#FDu78]{,l3_i/e4HV0K,.L&[dƦ,?ߵ~/ynjv4dz^n{DvA$$#)_0.=ߙޠ@@L;_W,PVBwD]$f6 cqYwV"=N\&vQJQ:suiiTӟ*)D]L&O,wqٴZ/J|"1w9CPdy2/< ٠}3UMM۶MXJ*WULQE5RZc/|'>ȇ" -uygK[40y6iY}ޟd/&ӻog7 mׁ fSrz^L'XMyKoAvdVsGJ{w7]~gnԺ"(2_5gK=ZL?a2`[E:JE{5UDz]9"ުlq}hsUZLJ_#@f&jF)=3Q8p-mc~;{ԓ#[W -XD5ƔZKJc2I1E1i*ZJUԄQ$g3, ?bWm۔,Wm""x]zktdʙFVa( ikyvY%WC/~jۋo[c_m|K{/G~̧G$9Y 0A2kZ(qyr֘`p^5p٭|>ocj`Ğ_p/_^[^ԩM0323?=vx>loG:u.ѣ 6)\~vA SC}3F~v#F\Z8j6nGJ dȈ$eDƭ#3gj6_wΣQ]m+NQt,f]ѝTJNא*LɌ25hy;n8 ;1ǔHiڶ2R%6:vӇ/g|u.&Sxb`:-ۣу[]C5ޙwv $|trzzV-TFJ$j֭NjwnEo,ǿ>~O~uݰ?av̖zݳna~r~EHtZ`"f&F|B6`cMJgUOR+4TN`ٟ_y֊trr6A`(1fI aM~]}c1H<8 F] k:16HLX4FEݻg `Ҝ 0p2#tQ"t]f CG^4_,y# P5iwwYj-Lș9$.K*09O`hJiuWOBovfd$YhI4U!ffFlurr8޵+WiVf9oY]Wl0Yf[bHd*|\t[ WZ쌆e;}sz.%KUKr:M{ONv*M `0%ԉ@ה"|QdAυ+sKoݽ_lzvC=S!ZΪpuɧSh" `<ڦ20Ȕ l?hvM 5fWvv};^2`6L;3S3sNDhR1KkTtW F i O0z [=TRtQ׿aQFNed `3[[]K&0$ր IIr~-&skm6ޤ}ZS 0H;Q'kuEdhfmj߻3{w_xȍ~oDpmgMSԐ%$hb J ַ3g~FY`X٪jct*x<+J# h,W"&(_p u)YBD#@ 6Qw%6u<::ggP`ٽShx=x^e;?? \ΰ ͚Z'0U\TUL;#d尸O6^Ua7 ;m:~ k!0㮕3b@(TɑUӤ $ƳY-^yvuaz[qz6/S횢j&J]ۀ*uvrZ.V[09ϳv7bQ.D ݋we߿P v;C>A&u_NzՋqDHcwAsαgr޻AN.S*9:bZTUc/d=n|Ykm|ߴ&K@1el M;3`ɋ|^dW5+]k0"2{rFT71&O}^ȎF45t/]I~n$"PQ$6 cqZ#k/?4i 2t?bǁX))H%];<Zld1UDbjz9CI,jj.˼>Q9.nA:,ܠԥP2Lv1A P Hu."˛߿FxuѧԴlZ b|_;GZ2ѹ1Qi5DYGŗp[>b:dczu@^?yf 9!#.j?ju9*B1"uĢ(͠dl桽($ @"_$MZ̊A6>{_3St<fYtMgR"#}*Q`LA;06(XYtEf<|J۰G`iEUv֔`4'^9P`DLrM&dݽˊZ4ŪdtR|O @BLtM3: S ]ؒYIofDF3Q(/댠pp噫Ody!e]./W)O}~q6JEc]%70d'(oݵo[[s*dkcYEV dc{\MQzѭ᯽WKmIxGߘ)<$(Ie] J=sx0_-kINI\J^5[$D62 @7]mHw5jjf A6{aцMEv*}zb"3Ki6=o%423OJ01&WsW~ܚ;yn0dvq?f5ky$*OBoe۔<Fui/ݔEf!3w ' NcDPU!Pb9Ѡ?l&[`yzv;QGoY^ZCIږөX,+'z5d8y#:r}XHX +Sz˲"y2mݷnMSU^LF6[od2GƾpPu7s_u}.!d<WΨ/1 3[@mLa)9UiGݢ`,N9H\$[G%fdPx2LQx:KzVSUirָȌ P*54A@|bjVսO!1)S:"Ndƪ"$1]WSy\ MQRS )/ɬ'ב^SYaSN!8 z_'kI ޠdԡ]A% %3}_{?^}I\5U\-`(UJUlkkO^yѠ"㢰uC2px' r)ԋ{ki3dE&ZU̘@&gbgHJdB[7RJ j^޿nuvdk1W.ee,;dÃHe@ JL)`27R{tlUlrqqf`LRKҶFX"5DcpJZ?Z d3f8xUK)uHZɡo$;Zʰ PJ@>QBͺ_Εs~r%(ALsw>" Y;- Pf7_Nss~}OF']ꪪ9yp^VdfTʨBwp?',D2`h;l &Ɖ)lnA6 Z%枊BumA.gv0JW%|HOBu#v}c:(V٥|Ci(@ƦFlN]K H9s${'vp]92&U\Φb^ƦY,z$Ñ ["kB%t{eZԆB(fuسG53%yvd.s íyxqDf!=9_?̵G;0tH2!-0cxs!tLrcW8&p]ُU} 6 @TU2z/\ۛOΎ޿{ӷxhd`4`fOvWgVv}ov[ l:?bL2` 568:;U۶*Оjqgܫ_^F80ߗՐ$Xʦn/<Jǎ 5<8:qv(ac֕Zi`ĈՈ,GdDp>s<}helVmSJjb[ir/{7Mۺv$51bΛ鑵3X ȥlSȠK]6YYLm4YMv "@!]ѹ&HŒL><m̩O>˟|?W>ѧ_zⱧm휂&6 Ⱥ\Dɓ9ct x'b#0:kQcGQcKvx3w͒bŪ!U9=}ͻ;:J电K3[ͷcWwFc]|5RdQ$TD IDAT/*lJDȜ<28)#8JL v$ GuY,)j6mLͷw{k.XOO Ǭ[XO}*mVm4mv7*3gDM%#Sp^|ї^~pw\,.Uh]PZijz[g3JPg-rZc)/]` bPܘN:&YXiTd8X++u:;e!,9:pyB}ídpoSW^xpD&f会2QZ(]D^סtI #2]UZR%"I|vֻ_W?mo?ceP-TDłsx5/>{A/4D'+czR%$4sDk\a7eYlDe1u;$os}9z1Djru͏DB3#̎ԝ7QOK֐'u]a@ 7 Xv9}O&B4yf2e RJe)J{x¤Zж']Ql똚(3݂vhEEɩ ##w.F!&37]dǴ= +M\6%U[L|W􇃭ן:xcV|y~zq|trvrjFDLIUҮXc $:}a&PU4#v?|{.)~>=sҶФQ ѠZe"qz>=??6H$daokj|f2ɀf4,ГdVxxh2pfI#*н:群*+er12@T ڸ<4;JiUw cMv]^3.:H@ZU);{Yihg%;KfGwv[u 2զ߻P{OQ2hk^cg5s h}pT}!@FӦBw!Ūb9=> t^>0(`kwe8|e<ɸ\|~r\lR"#Ⱥ(t#Jb 0.)I z?SboLoyyAY_4դ:exhztz7^|eoO|J2VEμzB w\ݚ0P3vrd4Y/f:5;3H25SG}~ٟ.J憧vلkjvӵItXml 0o‘ZUpkh3@ؤf7w[Hs꼝6V  6,Uivwv;fl&ul05zų_ehjS7m]gs\9za8nm>GEOVl6/:'U33crn dԒ-7ׂd/}?ٗ_~rNTbuݚ"٦55"j1/̾9Hղ<=>={p~r|:^VmDR,jWYٟ;7o4ƒ$933wwYUYW1GOOtZ j(B~ iC!w!@E"$H @.Y9$g<_"{3+^gav}fs) 7v'!twd pι1BU{y2 Fw1g{D@ t{;?89c%&L:3H,UV! w?u @hHwNqًϾDC,Gh\^x[%Qvocd@)!8Y"t3xA': b=t$)f(-tz2%{n2̣O>3OnY<^u|KwjdEP0/ɧ_ź.ã/>@ XX9)*:ˆ@!X*ÌsVN 6^K7I榈d:ql  BnF*Dv_?+E?͌\ XHR@&`Ҕً0IM,(mm{t-lYW ߧyQOBql"H@ADY|<}>]!"6StW776._8[}lyc_Y8r^/o~q5` 跉O,HpV"=#6{p>R8c18@OG7?u~ҳO_~nh|RK$~~ pa{bs hA0;,b͑gpH3u(d4LݬL@CI:XF75ǓI!R59 s\.Gt_ֆuD8Rm9|+֤4Fd4TJģqb?v?RGL[[6}j af0: Y Kssϖ9WE۲G +;勗yg^^xo?yOV<&ҖUH 3^t *b(zp5,*aa"n}ǾA30+<"6W?sϿwwހt+՗ DjUxf0 T3"BX]$d33ߞme hrD"JD"+H$DZ!uXϸ=AxCЈ"b͙.=#{^{,IZ\=E@jqc?To.Iؗ\^{גT$@B09*6az_uzrڞRC tN:x297t88ݽ{݇O%ӇvoF,=?)j뽇t\:K\xATJP@,P }|F$R!q 9g`<hzwO]xvt:{og|W u'W/|z9\"2(z?MN{p5>uf #`hr.M_;"dOg*yszaz2-Ҕ?97LvwwH3'{Wͻo>ܝʲsokFn8G,K.J 5%@̃>zP{( U#s/t#͓_{xJW* ʈ@`f(Z%9,iBo $ku]˚> G"y>"F6`&BDfTTG"Ho" K: g3C[HLgGW'jlC,z2ʽP@)%Ɩ +dk``.k=RE<(h_D&?)N6/ʆlԀN'ӃD*ӹz楗Q?uǣr:vÇ>w.'N[YY\;s♕ݢ.hp``x0J;*euPC X|(f%OP'䀂P+kg6P˄AT{ff/>΀@A3J:(@[QR=D qhq糝pp؊.>2p^0jFV4i /b&)"{Y[L/t֖䩮8`UxBGymHym1M& mNGov"K91&L,:Vl!$撈( '@{g؟3B˘bqYn뺮PaQ&ޛN ׍( %MMm2FP׷.+WV?w~StFx=f k GQbFť L^[YQw֕-K[V{{ @D*B娓lA'b m5V%BA_xӏ?~f3W{EOGAlԬ/szq9Z @(@ oPlM"3dKk+Ryizp^<3S<>cحx.bvTa*GؠH#! >5B=} (:! ,Y$zP5'`z"-BAcs4P]{pc36,u{U6>|<33D- .9u#}-2@k~Y^kv,ッ},ևޏmyVݠg+9ACPj@I̙/|;W]~f|f3ϝ?w֝kt‚n GucLA>$žiA܍ غM tX;1<#҅'Y:ܫg&ˌA"<Vs8a;/qi`@aT\Ć3mAOcAK1;~HOd:Cbazب VϽy%}WjGpx0 d:}89\tkV^9PR0;&$(څEijp0Z_= ƕGW d7>3#3?Gu(.V5 IDAT3W~-j< 0PV5jT-3=12Qz h?Q=)Y~t[7 E*é61% t%DN@2nv @DjB'n*S$[Kˌn0Y+~ nj.=T޻G0'!fGU13DP&3br(I(Pby􁓞ѱrϜ5=%00"@7$%[a*g_|_g`_-VV/>9c,zp>u,oO&bfmsmg@)aϬVw4d^x󮈷f e#"Axo;ܻ}"ZDTQ@e $Oy΢h!&Os @X%gsms8z:8>~~H3_}7̠ o(-A3G)DΨ6 $.*sb;pp "LK)Cʘl8<z=NP2=:#IHdj('N3v&7nNJQ^2R 1d/޳q~0ʚ@wn?7?Bm=8D E:ng}¹ǶXiCӃRo :C;;UZ)JJ,'b3 j*(Kc<{ ̿[TDTӊEC"_;w,RWZ _ v ubk̈@B Z*W}^׾>}מt6yV{KK++˪cn_-߯lD1HQX>& uW9|pؒF=X]]_|;0FSO&HRf+zV UDnrA86jZ$;w+Y[?\Ox;oti{ѺO2ArGyx !lHGjqoYs)B"xƕHz:\䣫+ 7_FAm w Fdزm5 <֭?>x;޼]Nʥ^my9Pyѽ~VPF:c*#ڴ(__{~w~q7rI\ <0b|(AĻ;e_Rbiu%rW:سAR6ݾhƮ>6*yt HcE$T$y8 "?|޻~_tv<= -3$c@iQ -nvu͊ c{sޣzTC 1W~Wo_z7~7a-'( rɖm \Œ"D@` +2OLnHW.\19Fjmr0<9e0)\ KW!Ifl'dfb``b9Na_YWUE1EABCt, Hsc$[lۺC# "? %J!I:(JAکh0.h7B"6r *Jla"(kׯW_J펏pfX\aA̵dJ'ޝ޺kyw7nub:.v:v}eAIUJ/{QȜiQ"TzmLF SE(,֪Q "P^tW;]\zq#MJN,'UDxӌðHǍf0/Sx3/w)*4;⽠df/6EҜAj4%HC, fgs QReEiC`t0(@w} ϼo\~ҰOd8'(r@PQ`H2vGkI]VG,˕*j֔/,(7$M?<~O98Q)!tCj1*%6N+s4ubؙ$CSΞX-4w(FW  0V~?Nx}ҨCZ,@6 MB~vӝo]u<8ʋpڡGTB)4Z+gR1I.;w8Os'\mfhkmr^[m մf_t37 FF:k1~tzY Ju=0tJn.T-?HA8$À(2!$ B-1{$6hͨHR@ P#7wT/}WVV֕F !'rFyƓq ҹ5#g*,5 F,cq&[x;+Z4F@-10 )>"Eed.Ӑ'[[\U<2CJ;QH :"x6B2?SLk#af4_$손"%I?]1cF Bz2vt^]R DPPN;%"D4+ iMif%FCc:OcIj13^(H$>5` A 50xǣw^޺՗oOo_V9+qY2z-Rީ3f+Tljo1\OUkGVʲVCڑ"؞=& b]҆$yF$ ͍g.zZz熇h"Yf6VGLBH%ZOa퉿&yœPZa\i1PTÒs iPp1c',[GFgEF;^u" <([f!sWOsꄔkkn 4L晧khQm# ̤bp-jM느r@hř8<>:{oq̗Ʒ^[Zj[Ґ)(uy4cg+E^Vu,Qii]N*qaH'o(0CVq\!4P뽝Ϯ|'Ǔ]beufk.--`\AހC{wQ.|Sj@4k܂Eq) l@D3\)x:1w<3\(K uRV!kk"K -J)9y2"[@̲'lxa %v&:Xb9$j"A2'[2Ԅ: q@1t*# T2!."y:w~/~a_sҪWtZ,WCUx \٣c\A~%pl^NA7uprQ%DG@jNI{01Fe*Wʈ]tM x i8SIC|c[~ ;GN iӆ4 . ˄0h  ֚22/vʣXg8`Fof[\@'jm$Üa- 5vۡ3uRRA堂9waN]|M̊XV PB`k\X%V#p(N ;yqoyce+>rP}P8RvqYN&¬-3ɴ̤ ݃ *#>fBE|"q";htOqB3jLI@9(,ȞC3T}蕕 d:N'WD޲g4]9=Mߛ3hC3SjlhX%2jtI`IKE?i+voޕ+߿qjL՟z񗞣\O#!p0$wI(+H`)J%OJE(A֊3k𨀼sx<=Dp,/{+U !(ː~dyj_z @Fm?mo8͡w$N,IXsRС0 go+\IcR3$ 91J/(@{u88i@IisNjJ͙8];G{Pv.1Hxp&;Ͼط3UiUA UKl(Af moٌO3:zB4h?0677W/ NpRYTǖRY$iq~aȌ p 9=.^褔 0? N ^<lŌ!#簲z`\[DDk Ѩ{E*T Ԭ@ NAjFQK 4[)j Nfu/3*j`n@$!Ith=;39@D%B Ьw|'_ҋd`4>?BO±;&'YjWAvfHs/벗Y ЀdlGӵlkJL]"I_ˊ+G";+{,㥔J6)kHl$=~A !^'.Q &bBN¼@ Mmq6,L:dFʄр1'HL+$ f|X=1?[Q #Av)[R ]O |Dh# /V M(F o}_z| }DD ?Szp8Ay͙SĆA9ɓc'19VBJH2lժ|UTaRhtك;ܜ#]ęn_[;d%%=\{{Jә3gV:Yeq»SDl "MJld^cdBO$ HQFmLI#x)0jxZC@4.,j'dj@;;ϼ_u~~MA &SuKł9oR[bf[>wo~qګJN:RkDh"QD2wʞ*iEVYm26Z!`rѝ{߹ƹէlucu\ֵEĎ殁BK@7BANLI;K[8lgʼn<..ZhWt6 mYER! !;FRgϩ.xtCi>4D 1A[O$$ 6)ETE(0YۤDhAo`hL8M$t+ A4w )ޭwo'>믿׿^7:jN-M Y`B)U nbp"vvז>ċ+K[hoH0 ;*+P:."+0(=NC-1Iy"2,{b ࣀ{9/FgYǠAtTFzȱH(%8a/laIV- ႶIpTL"cK(5ՒHH Vh_wkW^yO(Y.sÅLK(0 ؋4d #2HwܼNV={amke2)}3"5v |`;/}I۝}kOk y?Oͮ6eDY?BB>v% oØ%=;+tVh*&<8E= R8\`~0۹gzESmv)6[`&Ne- lA\w IDAT[h VL "D% 5[V>[}֣ϟyg^%Q}\[+BJ2Fa&xLIJKBA# G߼}}89ԅG;4+r@ZZu[}6 "1gP-KRaSӈspt ӀxG kԂ0CX+Fi2㒔f@ eHZV/_\ʑGM G Zqx+)Z|%CqapwEcd=ZLV(?C>-a!UF(J(`<ߺgx/W_W{8/(ŊL$`Z%Pe Pv_ 1 {pmw`Vמ㉥V]vZ_n;5 m(7>| a-֞<;CCw"h"H 9$|,vwa )D*K Vu >a9-uՕږ֮Yosyga2,V|IͬĞQBOf&rltmjmR짩ĭKr$9Ѧ ZӘ "ʌ2ףpP,Z@RyMzãx:帪+{F*5jB*Q5"$$BDBR(D TJ!!) $4)&TRJ+Q)M )E*RI-PQTE@ 0,-gsR[Wι:k]Uu孫uxnV^pդ {k=A<3E!F)>D3 A (g՜5G4sTKI>iQ1 'Ҕf$.pc$ e7"A%`aHJg}dSGVAiՈ"DuePV)e$xTMYs%[/93wh!"F8v8ǡE ~ ɶB$D,Hmf􏬪^fpN\TWWWwgf}DGۣQ9~`ߟ~}rCff `&D01?!TNb(0"Q .ݑ;G:2O%bS"Gi$UxjP~J2ACJi>0 izi$I_3&"zLn߹?x;?ƛoӇLh dfB0|4;8 w6X7WP1|YV횚nJS#>iGV˨1rY<F!liElщO07d VXi\BalGkO޽y㙧w''vb0s=pp>KJ*"f7LU s$Ͼ.DTDͻ!3>'&\i `zSPJ.4H! 8uJC?H iH|U*'ɷH4 3RJfD_ʟ9 ïo_~9sE ?D4-%=LD;=­GL`crz4B;'@V)A\Üpx)4t& v<_*Q+Cb .tt]xo7on쎮q!"H?~^&vj^A= фW Af9Xгdž5552Sdq$%KCI 0 "ɳ0`(D\L6%EE$"=/iC9cd_AR+x@\Q\c.Ly2e99afcCT@!T$x9)yUpD` b 8xvKm@גhdK?~ӽRNG rw{C\*ɅlփҐd$9Ӻ IN)0hJKNj~*u&J*mICΑYlS/)\X9~K;{_{}9"%RD@R'",d ܱ/MhQ#mxӡ.om& ŚdjG@C24C n}]CnƁ!DpPXՂq2aftPIB|&6lE]jzAz8R!ѐULTSI$ "2a$6@"[SԒ5kISqJB*IE "*ET jWME-8WSUS%rES;c"yKUJ) ťimef)vw /ҭOw?~zL# b&%:2"26T@P Y!41ވ.>W}n(>7%2(pF!xTfL:}$o)GBe <؉3` 5gN3țnSa8==<;=p~+^EtMIMRLROs$uJR1UIfIDhEJj$:KByEuOQMօ0yT6İy_~+W/~Д飳Y?$є4 *"9Ӳ9eѭ*pl 6cn_z" */`0"l;N=k}Ԡ8{̩c"u^ ɭ-o< /͟Wۯ?=H/ #`FFV͠>BjW2!dm0@? C? $M}iZ.6= ͆Q(؈S.ZƗZ4Nۚ<gyX@D߻;ϼo׾ow~W[=A]F8{=16!z~5V%dXFY0tlVgRd(و`jJ>blLlPS$!3AJBaLr T4nkXe)370V&˜jXcvLt|Vwt4~*In?n~ $)5ѢVp,|@Zү:/1r^˔u-ܚ{C{%jĝ0O2bz􋟽_oѿ^^{^۟s<@1@VE03Ao0k>z}6yJ#db.vJ=ꈺ ES[Mbo"Y691 t(Hoʊba빱P-#G0ʘcdr$ocg]wttt8>pC/"'iݸ 1Gv疁dˡO>^ٚDNS!ߋ&JqQlZlheX M ~t7xW:WUR!i_YWK"Ri)5@mUe֍Ŕ3V;d\v&d[3˵Jx?esFH*IS=ӡTpr( ?u)"M .D1N Nd&Ҙ3-&7so[ZJ'R0qrO1|A؄tX\{~C8wFVsI_BqQT@YI\% UUF◟ECyx5PkV^X(܇Ir=RoͻB`q@!~1c@ u|Tg +-h2eh?Ob~OZsJ׾LԠfby!)#L@ 8i)RuRc-Ś u3 >$\|EXDO~fs@7||&8p"3OOq `u,>[\x%[$͔5ڏ5)<]ѺڏBVsmc|gJ}#{oEӒ+dRpɫM>*hʄF;Rkz0l3ny40H@1D0 R x|깁`2彽Ȏhy9}"oɪj²ѮSgu|ku@^7Dk/deȐz!" Fy겄ZVPZHFI+Q[1&ۜR%Tkf%٩!JZ"uzp=00-ù@o]#훷 cK9'ŮHQO2)lh 2QM-D{M2.ԗUt5P+v4Kpi5_邻lqUՃge<~5t SbgtCO\Gm.Z.>(С;!!Z`tALOH;qwLE罏32/bj4#%() hgrtу\!2=_?.I53U~r9S:A}󍾃0؈c7nnw7@D> }ELt *G$<yE2hnY6,*U6q][z[/(ٶP'%8B:ֱFC-)ɀO٩*l^w0k+J~6c! 1v@'VtFdH> k^kafc[ZPԴ4?|܁XGqz_fDC0,ey߇d4r hye*U$㻓I!S(@F!@wENLBby 6$-Ux}K9gYTI|s0/F=C_u~ւ:$TD>j7BCe>^>u|~! a C37)H0Ҿyb:b]Zqʝ2co,GhUfRdmc_tMj\8jlnkȲ(^~K.5g?Zt_0 XRSFL!lnE "S}(?3fB)9&~{ͯucM4,瓹QE+'e/p=m+Ϟ,"1Y F DæBBa1s|Vv_P/AR%gBSPHa^01;>{&Chz*mBb͚q&Sf9 ye&v1b"ئ])_"IDLJ=)74f"WfZ;6T~%PSC4q(coyh:JoGRo!'.-K$)Ax`501& no2BkaZhOOtus>[q3fm&W ˌ EP1p[ V|9T./ʧQZ4᛹!B6 0q 6z)[ _B%pa4.PX5+gw5m0Z{Glsqwh֨eY-\d'[Zqf=tFaC`u]6sXCP[D kH收zak볌X% 2V^ bl.,zH yXYmW)SYE社? b1v&t1Gz(qìZ Bꜰl3)"cIDATl>S܆/5mWߒ'Ϙpv>.Ph~oQ̔L!t. 6ۄ#ew̞>dQobć%oւfNlk*8y~!{W J*Y*˚X])lBu9t.莢 ỵrjJܥ[J ic̹e4 +r6TX5+p+xʨ|PPAU,"`!.RFJd1o6"<)f(D[/'ër4;ṡ2L~)TCnHB!#p 6ykǚ\%+MsL ,=>9l4@YzMBv%% I:T6t&7S(9 dTuϫY5ƌ 0mTfձYKA/l#(ZhQh ?t6qj>\1Td͠J1b df"w݆ $9_3svі=孌]h8{KaԶGxZBcm<@2>P[PH39 `[k)0Ǩ0B` 7Dz8R̈eZ7aU~-@W W.lR P>LAU lf뻲|N$8?:CD!uC&N(Z$PK lvF[s" a-1LԌc(|Ÿt fffhF! na ]Ҩ^=r٘c4rWSv3E9-IENDB`gltron-0.70/art/default/gltron_floor.png0000644000076400001440000000214707264162424014067 PNG  IHDR@@iqgAMAlP cHRMz%$m_l<XJH IDATxbxO?0 Hєk"l *? ,, \  㝗^<|CU? ̀",=TA̅17/=@bw nd ßĤT00"z` y:(j|F$ p01F `D3 Ol J_?{y|>, !× @J! a@1É@eb` @4"x4"-@#2m4bVHMnb v C3R@L# z 6 ,@#200  yXaH@j  hwKT@#4  N9QRKp$@ @2`$2 Fd`Db|D. gw-A  !Y"B #D/Gx-# Ҡ,hD#gh 2 & Fj  p--c@!5Gf D;`6;<2@0@B@ x @!GhS MaƑ[ bL4 6'0RAMaBZ 12 MaKD+E adbd`a9 ܼJ :M !u.flfegf`ZF^ د0eB"W= ̓@e<2r2 \ ĸߟ>g;0AI1=J3`)?$3cyiimORCIENDB`gltron-0.70/art/default/gltron_logo.png0000644000076400001440000004725507666445302013724 PNG  IHDR@]bKGD pHYs  ~tIMEQ IDATxyeGV7/9SRTJ5P`\`0m0ll n9wpl"REjqo}YeLa-?hkG@iT*hCU/#h"uU*TXè7r*$CP#. [QL)SC}c3Q*Ɓq8ECvF;́&MQmm!]t1e``6Z_:bܟ4pLJ#ٱo}[/ޱi3T.K)D[H4j(]$ͦ^]XqOn޺yqEx>20 B™JF'D]o4cƖ*5JA*C냔ku*č:qB\eC Q$DV03-͏m}Rodh~w󽍃2 U9u`DNc"f4a`]Eqk]|m,yzrrZhndRa>_L|޽ s1" Nwz,m r-\K<7:MG;ͮQ c\+P+)cutݰ1Gfvb { /MoN^^4{upp( Fّ91eաL9%Bp W1@E+}+xTI{lG $,Q)_#R#nB)Q!~ 2P6:>#ԇi4 eJAETcKd)[!Bl 2` G=">(зwKgz([x[澾VʻϞN0AʔQBЀcpqg߮*~q~_y /}iڹgu`/dEkOҢh`X`o 'G<}ۿO*镋6r.,{7׃,bu[ *mz3Fʞ1ᑈCǦs%(7>%z> B9 AȽ]F7SvhY|E2z[_QE¬52,BY3qʚPNpRljD֞E 80CqfQq%JjL:@l](- H!&h'  [Q^Pr鱚uؼquSI5ccgu\&{07ֵk+\2H,/FrωQc{ou;^* |#A@>Dѷޛ{dƬVW2z>nz&{satuO1O)"ۤD01j[Dq)Qd"U.*h#Q+ƂAW{tKHW"qW4*hlnZpu2֗0}_ދlY3EGTAIᮩ3Cַ]>}w~>8%s4.&SNKىݷo;*oѥׯZ|j1(c:Kα?Iu [a,['EH"qJ5 t&H Ҏ߶vr|e48\ZB smR nO0a|u96W/\meG"-Y5ˠlʗf)Fi|o[Wh>+2lg>>j@{?8gū< ),з4?k>Ngqd pjEfaWPQ%AdK6xZҍgef {?(WbsMy8s,fL,YYjf~GfОG[)$c42&Sun5O`WS,z-dYDKBl7%bs6B)*2HjL#AcI.{S@!]TExz;T=):ׂD;W F34K >Z%:?Ao/i  "UmK-˨D&vq8.eMho}sY#E[$+az%$}} FB n˿) P> J% mpYY\\;󞽖?gL>(O~LrbjrY9F1y߄U:'?߳=0=EK=\?rp ]磷Wț cQwԪN?]U^s< =doO9T3Tx,E4G\ h&ö޸H/{sw"T; vğ"daTB6WIWy%Nfz6V/+[#pnW?L.?قM =h98 ' <|+5E\W9]%~nI:,/Z$nO(*f:>dҭuy? kw3;-xǒ{ap5p4%9A7.=*LBUīt|i7/HX}t/'>̻C{(K]8cu󾻔{c'X#?tdsW4h:J!h2{jeV66s>yʭxظp{Sb鼓n57tq2zK`S0F!c5禆ޓ%3ovWOxџu9s}t 1o8" px+jE 4h u5_^0qb59u7Zo|Zҩ;:^!iMpdki6G m4ABc Wܵ!۵ we_Zi<2Sq%bj/UdX=]Fs3@=C| 8XN1Q6L |w乵i׫fDCQ09̫u^w6ij卥Ћg?$^L1^17v4p9j\ r5RĥQeޖ%+QwM6^f7*y&þ5Gޱ tՅV`8*_MV.7 w@{]O䯐'K:"w's]^ބK)zêޞyg3L9<,~:4o_5(~:JSn8&f-ql܃#37ݻ܃*UQT Y*hfḨBb-QsWtPʙ>?$yfByi\;e ՑjPt  JǛ xPAQ.ظ%[ajfV>0)Պ̡ށA(y0\H>E} I 4Tp#jl#/l 溌Vs15p"JtEU4uzeZRKD4,XfQt>^ HvESA#k\=uJrrYRecKd;@=Kg2w cfbe?s; K\3yμ56NZƍl0ėY~W mfKz[O~/:; ;t?4Vp39\OK=YwRViߔ6F* zn)Kc!>h6մ7 Le:_g5fZ9d=#SңKhө:-lէS-ҿw G/mo*\qN@n c 4H5bx{{ga#!ϋ!>5i0ݻHh:LWm\_KL)vi wR{y~s]";m8(LNͷ+jC5snvO=&gÏDJYlڠgp" 6SUO/-JF}#c绪iw=/^i7 ;a_wd/2,:ͭDNG1Zk dzI̽՝1RU2X܂ rSMvzwݮ?b0H0\cR=mNx uNQesӑ%a%湰z2[>w=PZ}>ù"()9j#Fkz6~D YOܬ^>F({ ~>s[t9QZ١~=Q7(- ĩpWZ)Pt`̀S}EpKᰣ}1~-> @+`pjeF6 ~^=ּD  3%q0a()<^Hqe ƻty l֨!@s3LNq fMv>q~6bYmg\>,k}GOTs1Rc=Iu2[ Jj/hc3ARKӴg $o;_~2rKIFK݇[o{k gz1e|OZǀPJEi > l 0+<=fKG+ J(R8J(&Y6t>$ ^D[bg|H VQس?ҹ}ZF\1m낻<ӽf@*q8b@zU=hp8jJ u$C-WMyo \BM:ٮ? ^XD|>v4 \JqM6ש"@!5͕PiڮVaoWɁWԅPԿ] wT-Qez\ah|S&o࿋?)h>׊S.&업۽v_|ԇ$TfWjw9RKM7bQ A}uYuḴk_X^}cgi,K#'e5y O IDAT?|q1o:(CBv:ɸ~啟ڇ>R)9-Vwr{PBvHI>^ wŚv@Zh, ׍lէfl[9-iHuy29F>VINķ p ۗu'嵁U[[""*3we=;hlX Tŋ(PWQ%$\xRDٽ$w-2~䊌D+G7sd~S1t ۉ#/KNHaOCZ0XemW~"4끱a6 }0<|*mfHl!.ζ>||^wO"b y`ί;8|ɡG?)w &(G;dGMz1Gӵ>zQEVITLݕh[M *8o­euby V0Q ڪj Q(^O#>1*oR\a=x.GMF~|i&恿Rgɩ8[-_rLM!X` dqBy2;IЗ>hKO, S| 8D,jcEDErHx_P1|(&I"_jbbkil\c+f,MdыX~YmVoX-G ݧOG'~jy("˞<őnw hPQLQ@`Ҁz|o]9k)f(e z$yB|؇߯-zs拫eڃeX?')׽ǺcKf#@SDؚϭiNK3-X7Wq5|چ4gC}|/Ց+SÿzB˪lpX(!EpY7wE? @al xSX$Mse,8&l(r!tCַB^[ںڔ#2IEV ^b孬/1'իKkr={(bDY@̵}kl~ ?O~Ԙ}:SB~:!c0F@;8 Y/P:Y;o(l{_~|B+Gבf}}shF˶otlTF$*J+88Pqxq`uA}WwY~aq1W { `ℼ#>`QI3o./&II>agr9eyrux,?o}c8/3+QBOA_;eOk>c/xDTTQ}P1D xD.8mn$h;UF{7thz#CYԫxޤP Pp H˒L~m0“'mgKK޳gPjwL*;l+BA31W"7%~ː (^vC*3xyf;Qp=yeXh(X .v.(* Q01A% a&oz$g뵫Į&Ť\ͮ3k7/LνqKңujǻn{Od㑬>PIl D1 KpE¶Au3ءغYC'o6j^/5qUL/گ ە5U=>BD nBz=`$V4UJX*$x+%A=qMՍ5sC+%eCf rxQ FKخO]^EmMB-BE---, ̢7"!g9|B3鲢R8b)׿(hL?5BP's=y9uu{F&.wrzf*s` L; G>GXRM󰵤Vv׎®@ElQ%-f0VM947_4gb-'$Xlm܊6e&+z~7)+)@MtX3w.7[7խo8-YP+ZFK$;`FhK{#u3Iyc^`ڂt䙲g&"_WW駔EDC>_KӾ=#UZp˻PjA? eb#L )?<, _mӷNB9M!D#j\CBWsUXΕ+N.&XgdrT^x,TQ*E,_S>dg_KԩKЗ0y8ԱU$<^*>2-W-*087B 7ܖZ'DKT݉ZZ߻@ jL#*G'GaG)Bz:kA:"Tq꽊7 &߱YxJJRb3gB "1 fBvhң/}c+#'{ep|R䙒tW鵮]BD=Jp:T TI1lTj̾ب@z];]+bʥƖ.O>^j}]>G%T 'xkL'a`.^cHKs {5$Om2rھDV1+Wd|!Ju%2='~)?X%wj Nn߼9eiQQ߽A\!OS*B$4#GJyTbvۢ#^B_KKv^$ =Gk7#k pO2U|FjjRPLC6Igu9i7vWڙ>vB;*r{۟tnvG[׏¹+M謔Az ѡ[-) Î5{dA40s1osEխGڋO~ҼvsC'P^Z_'.~ d{⻼/VK}>E3.@ge!ȼn[z]z"!P'.&Jv9Tab;+y>{tw?/v=>_ ,!mKwV8Uܩ.Ѽs9D%Tk2$;+\\&2DvWZ[_!1t'gR9V+,Pu\kIzE /훩8.^zA_gg?*γ|D/#n#Sj\y:/fxs}ٌ ЅZ#n旊7CQutO} Jbڛ?Y9{?֯Gle'oȵ_UGV 4$D xHACFa>!.$kQ](6"y D]P7^maf#%лS{%q+sKI|Ƭb1Da}[,wO=wYGYRpuagOqJi2b6|o ueD5|)qcצ^n~L ?jhldψ=C3rKl":Y2CD}O4*ِ'Rԫ r  8j…SAUp

}+ $NINOݥ߿<;4z={ɁS:,EHCxLA EaQvS*SwL\%Ͱ߀VO塽Ց{\Ҽ -7*#RUސkճb-jPĹm .)>K0 LkbO+JJ9⻈ADa1m9] A[NKK4;W1s` ,/flJ굜Od;ܓsWl?hDɲW"SWn3^h^y{q KYJ̚{\uϥ'fEgCwx܄0ncs}wv<-\%Kd[Oz1S^ L/nLGkI\7Sy'c~g}|?!yΊ%áW6Z^$Wjܺi56VAQ2-q?9;Գ4ݚ5wb䜑NNM?_=0=G/ݯ})-e6׺M=ypxh2%ĺqoˡ\)c`Pn'Ur/oW8x]|r_.ti{Iս1fvÑPFQAK "UPVV@nȓFwy-ca\:TvyWͯ$ &N(ZO_e͚/8=_G\h.8%;Μ'~b$s/YvO 5]+mYZJoi-\2tweϑLJ̹;ՑOqXHt?ts%pUܟBˎ8P65i它ա}cGhP rӡ.<!i.[} f$s6:+f5J Uq`ׂP <@z5-FAR%[}q/C#lƟVd`GԡvxKY{i[*2-k"-e/;-Plp!T'%LCpi!kd1.]B's^ _txްrį+sfFQIZp|3c<9ԑw9e?󳃏uӽG?YT@x6ԯN{sQ֙7Ә;Hy=.8]>%{=?WOo'5N4{$ʆ39{{ 9vtd&<>}%2}ds.I2G=hb0;6Ijy>]<$MgZɩvvpྑ.V{FV۫GYӐgkv(\WWMkcӁ{fM\}|'~etm;M@t䝄'pTTzmIilFFGNBPwwK)yLS.[JQw=6JO?lH3m9/ˡT4pW ors sOγ(.}Hj=~ ɦSFFc_*?ژ<;Zanv;}a~AW}̔~w=?Wov,&D{HhKLEtƀ@MĶ݆AZjLwX4kW}G9JeW3NDxc}g7}o 5spՆ`~Ikl/oAahCk3LxlvX,+LҵҢѺžTd 6:8rc_ G*):>bOҾͯTkm?Lp;v\h\k|"[iN,{DC"bDUY=`d'`ڝ.?LH m%x5NF_\CDsQ; 5 *K m@n^78Z#(2<TNxY;/6>whol?EuZ2[ %;4ʌtw3VOFAY d R ;~nlXeBTFQ4*un]R[?F|^!@}ⵗ5GfO޷-)*;-&10O'CŸ&.~s"< \W#L<̐P<1ۿ\>3PUo 4aUD ^"`#L& SCSL?~JS2xi[ElZ|lc 1#Qؼ$؆̳@@fob[F@DDdt̀Uc/+OL_K?M+[)^{9E{nTg Ӛ[a;Wl9 g)4R0!LCp3Čt+eWHRKS2m?=>ކ^?ՠWY@O_nD R<6ׯaܨ;u_Qa0׊oM"p=@.р S@Cq *SYN@vDa|H  *ĭΩo0hn@l!Dwg\ڶ 0@M+v.I"MQ#u` >X ъ?̣}|/}tZ3,+Y-\NMq@%:m_00s:SzEP[NOj<;Ozܻ+T>~ZlISH}8'diP<#ê@BW;F^nDh)W byh2l 9/*|2H2`*@DېB>ߋ0'ؤPu۠6x*:Fۧ) he 1lֈ*8t/C ]m%^ P^Ƿݝkpsvw8䜆\ TG@l@= >Aُ+&T@<e,W"IDAT,d0jPVhW[w Ea$ Pzh>|.Ň5EpZ|^}4`mmp5fYcW I  &AzVa}r?>4&yߛ>mDfiʈ3Ma-e`q{쿤xU_aIx" U`|vt_AM~`յ.\rm!ăzyH@L%Lpi@% kUN:߁LzחIΧ.I*\##jWё׀@1j*C(*Xwwn!?KaA"F:j+;+W-ˉҾB+f I1|N{8tPA?g&8"ی-c:Ħ&1|O061Ko ].н8'BQ!zoQ:'SeX-QH` VM.L` 2D6P*Ow՗l2@0qe SQִa-vpUlRT`.WX7bA5q\**$$@% jL従7ζ ],sp.|${4_!*j3ZiK x h S f̌0R,P@0P.1/$|`uA8f:)f54|ڛ`NP"OFŭssuivlbX4,-RPMnN٩"3>ːl~}XH]@%˜Ij~~l;V,G@ EQ nT֯7MTrN($ aڅ7'i-i8_WM!ؤ͵W~&]WIfVrї2b(#oR5G$ F, uD ՛r3uN#Alܲ\mUՍ#"*(BYp@"]Dڜf ҥ0ܞsB &Iz`d*%Y<_8v^Sp?j('< 2]aV=@Ag"9¥(''F [OjglM(VRhՠZ>ț4([zV,3n6*5g k H5ۆ|s؟§+}MA-qťŀ3eA8 ߚ~5۾{Mi{兴*H8 kW[:Q*Mc aOs{?DŖ[s&JDM5`HR"Hf/X%['d`=~R 1t nIHlSp3/&\ݚ%l$C-QɈhmV jiݎdX,NZ\YuhfJcWrn[^<%hM>gP;2 Ь!m)-06;m6S\6En!WAl@q`ب5zVu+8 ,2_oHj % 8j#RN^q%߻]zp-"IdʹT U!Py./%85Ml;J\*{]Y99Bd15\e:;]Hm7=- pdwaP`6ŒG4 Erda 6V6X(|Jx7)3&~hDJ*Szޫ?preZ,--əuW YBitYHG8`({ ű*Fpd60aigqSHj`[K`ӂ(%#恤I S(\ccdL(Œִ*Dμw qs , ,gs /A"3,ͩiRV8TC3'Gqmח6_4M6u]7iǃ,G2F7!-JxH~Rb';=G~0Q$%rQõM ITy]|'[.Zj9m c! +p ;qy}F̀mC5E#ԑrelR\e&\Q7^* A'OC "8M`k0eظY8ł Rm̆fDkg^Y ,N6u볠F i-"ݓ ȰsÄdV,,` Q! j1܄M؅ݏT́$ݓvZ ð][=|uɀvʘߎc8J~ǡo\Go4JFLy"qQ[/R^V@Y6+79Lm;@WIH!1f'L | \gnwYn7gqjy p>"4:AgfüͩW\F7!'=ߍۧݽmwk7nwūw |0Бqa5Łu(@0㍐$RƢ`%teCcK̫ :d.f5`[ {-f<> <ԇ OHPÂy. `Y^>iPEr'+`!`j01PSJh(䷵Zg-ec젵6ĜxY*vv]j8炿5\r؛{'lzOP;ǂ~C ULH( P Iv1 Q"#H'iM ߄;V{~qm G{衇z衇z衇z衇z衇z衇z衇z衇z衇z衇z衇z衇z|ڳaIENDB`gltron-0.70/art/default/gltron_trail.png0000644000076400001440000000204007217527100014043 PNG  IHDR@@iqgAMA aIDATx훿oDǿ缑u.#RǪR+:0`cA; ;^!Q)4$v.f u~>=Ύl("s0 g!3)JG !PJ\3!@iSHZq_|VJ}VXR!HRsuU?ff㠔Z+!gh42)#E8`aoo/0R1ضӋq!_܉$O Bcݝ{VWW+ Csa`fɭ`!v-OOO5cիNNN&^$?_YYQ ׄah2^VEɀkj]44WҔ/MӞm +4M{bY7)0j7:bTUscȀTU}W*˪oN_WUJ*ժ,"8BEEaYj@InAX4BK-:E@)%#e8$]AڶMFb XEG>z{ ,y<;L[ $wT]S~LpS~L%v{ԏ)i)V50 + 0MsNr/`V,:Y8??zɵ,xlΜ@dE.e2@0f%w:NJ4r& QIENDB`gltron-0.70/art/default/gltron_traildecal.png0000644000076400001440000000034207224416112015035 PNG  IHDR@y)gAMAlP cHRMz%$m_l<XJH mIDATxb? 2RPb@#>h@4 F|Ј@#>h@4 F|j?FIENDB`gltron-0.70/art/default/gltron_wall_1.png0000644000076400001440000003665407264162424014137 PNG  IHDR@z?>gAMAlP cHRMz%$m_l<XJH =7IDATxbXr]?:mѴk 8s^BB澗?r`$}-Sg[Ĝߝ˯Z} }'` @ coќVhۗyݴTFEyoݖ3 r,Pew甙g1,񯪢.]l]#{n:D0qkiXZ`EDjzS>Zq0駤ؿη=>0rKYK37D.* `q(.?GVhffu%EB2@ddm$]-X|c5ZZ8 y9 }-SqiHIVX̹vzzf MUs*;Vt#`U缪 =\cR!`w#<aLee, <@ ~m+cۨȔE;oekY۲=GNS*c/$ѝl={œ3@2bJ3io0n&<" `ъ˩B.ȍ(L!fߧĤ@Ch8 `҇e[d1A9UE]GUvx_U7FD%%dL;v$_\XG? LRbJ5}K=liĚxY>D,y[M؛X ,xZͼD PH3!) ~KiY85OO{ؽt“Ȩ{ٙ.;|GzXPLb| @zluݰ`g^/^m:MϚݔɐހD2[p#2@f!I1%#䂕>ǩ)=.v6yhW_SS6c١_Gf^[tdom7e˹C_ѱw5ef:(v 471C=2B4M@i.Y,sddCHT,TB2\M=ӽen`ˀu} @<V7y-Ɔ{i˜u{D8U5jtqgԉ`zǛ5틤e"yy| L22fXYOy97LK‚ @~e`W?9b,VEj) irYrEJ*5-Z= `M犁G#4|NWҌ;}E]ܐ;OqR}cp82.6շʯpfj@$`fbhhӌ ?ZȈ)"2Y|g@)G$M.ˆ0cg!;$Du5Cc&o(7O9 3KZ"17>Wֺ&_R*#.fiSPd?{>?0")'q S={m İ%V8P 4ECzFQZzajZAJj>Pjj%GF8yjS(#$eb`S;'d;ڸF x^|\&=oa2+l`k恤~`+HR*:i ul#u-੢f gGĘX JĜ.yKuF3P( TT TюƦgfuLwk>b,9B7_?[m8UYllZTt&fSMy˴o|kY`6s*;S ;SAA&7[Pfsxg-os S6'%$$dg]A&Vg=<mLlm-cR6@&}m-ʛm{tE>{W]9 <$^GLԀA`@CI) 2s^k#p0K̔ UuAcE*ƶ)YQ97B3@mcve9-Yq1!9~1AY=}zؘؒA( ٲDK,2;fׇKog>nF:F@3aښSVrt@[[ml+fHDA@]8u+O[>}ȤoxةahhV R_ @E5߷fҦ8gNa كi&P~#`%ikn:DŽ3P P%P=P!hXqC 4w vv2pC !H_:}Ǜ)^a]ϝFLL<͖.%ZdcRXXKY+>>YOu C@ ?|:|"ѧ?WR20@Pwm){͝_L2DB?2v5۷< %Y-Q~b x T T\vѧt[Mͪ :!s7\9Xbؘ() 8Ys- 4]sKyT/go}MS`o!@ sTyqU|\zddAQQ)eg/Z{Ww0iWpb\@5(hR׻pФoNȓ@ ,5UxF3 je5my9%4 cٙ#ؙ#ay x4Ӳk_}]AY+$ìkw=MSPsP ]H #'pkݾy5k&}n_9髮4sC`i/)iEƺI֍fPutX}s?lLd gg(`6bKP럱˻Ώ²V{ '`O@ oQF\Oۑ\`Cb"Cl9-(/ii7 :3s-`ʧIr1NE-3Zs.05o4 ǟo~ga o;s0;s(,DpDXVO:MOVpvQ_(4 PÇ`D  A@4<8v;ASo0cWI_7Ȥ;`]yv^u~C'}= 8HLHXgm{ݿ ԔҹBؙpnhi.}Շ}\}Ոvf"^9 %g@@ Y|t5Ĕe$MAE熇v߿oT4twɹ1I_R!,I*YZU/;ݛ8XB`B,K+rNx H-+ L⢼@NDșlo4 쾏w!~`@@ "SITDS7 Iߢ~0@GIVSCQGMAd0m\&ܳǭMyQS0'kDocMӎ[m\mNb H/ƫ(ƫ&Ey0>?0`" ءN C~AI_oW5Ge kYm^lE;<@:d!{Su5<r",;IJ.w_XFO33-pid.ҳ km""5K}\X OONza`.kf)&MVnkoƅIߡ[MI٧sަ}/n=]<@<EAЋIϼo;e$13pSw|_XcgA| @ 0kz(.6#>6;>6+>63 ʀXCf$%N_wt^_wy˫*RSc2K#$w ;Kט(zMh:Z9&}n"hWF6 m0=-{ꚛv?mU2&}\klUڻnso IQEar3^ttfP L(%DZ<߯C>,"-za_r0= Z|DzEe #Vƃ~,cGaMT&}IĐ@&}SR$N LFSYw}YI}()5~yJ_ #HG r+O[` J&uM;f?qqV0هN;f|:%>}׃!?G@[?WЎTn CgL+~Mɘlh."9<sιhҗa! }aUϺ{ N~:goG[q6g˽@׽UKwkH)SV5/Ś|Ɵx3@1@ o'KGO ڇ ,'>gtO0@eymW;9!ml 1&}@k}'m8lReppf.P #물?_eW\,j*lUD@S3|6݃돆hFRd`kHK0zH,׷}ɷ_KK/4F7 ukz.ٵKowr8bkg>4 MvWr qDA2@llG,恝`i`p'رn[/oeoI;@1@AVywq&_k0Bs/7z;@" IE'W1])"ȍXײvS\7NNR]A GpK{n{wnWI$/Q]vѮS74<:eǵȰ`!D&bA,N*m_Ф,@_/5.4 l?(.:DJAFS|;"d@=C_@qN\,簑%͘^lx{UY*jRv^t6#\`rGCUm}oyZjЀe~XP̂cmVc+^wl&UMX<3d71)G~qxI_xnݟ SBBmLmmmLl- ,M`:p1Ȝ$~F/g/OgIv[Ƈ0ݩ,3CFUͦ;|kwkUWd4Y8*^2Z gسdǮ/U0?@W )8kCOpՏ40TJZ8Tw_ zI Gk׈gȤw-|y8'}{n} 7ion0ksmSWo]aސX+[`jE3wyg4nyo|,lʗǛyOu}w݃>p}aU0fz ͛'^u` 4ͫh:y:`CKW Y ,k2V^|yoq]4wN_vuhpmw'}k{mٱmWD40=#gښ[AқNrm;>?*;fz937z58\]rfV`#`!эJ57>su%C %lwTx9[AqHPײs=C"  zga>zmu`ɛl;.۶{\l\ u-P&}ofvX (QHn7O˓ӷkk^Ô53t$Pلǂy=1!@|'?y!3锝n`~Dv?Ս7Cy3%C#}#xtGmKcA1Ee[ pZ詪"k,~_wy[[dƸ7-+df`aDՠIߙ{nv^9Nh-AҬuG_zut2[XJqk7WS>XbCς<_dm>{׾am(:fƖ׿웰xMU }*f𤯖Gmۋmhw['}{knߞgldad#+*- ۵f1Wmmb v*`,eym=M6=GwګMQH(< IWeK i H&ie[qc<`TɊsծ7 h20XDrk409kSۘ)k_a&h R`Xs;?ot>4}do~Yۺ=_9>苝ok˝>wbR\ 8@.f;A'.964(N]IWDi@ab*[KŧaUAcK|++eOOlV I]is3~ ϒ!0/W/n(RI3bB1FyiV]w,, Ut^@ dV^ZD,'.:h{N+@0`6~"Fff;h2qdXҢظn]=GzuW{,YhAN23Ϋ} ڦŒ  (Яenm3V 5~U]uگOtY/)V]an`_b֞be{|K L߲{/_k_l 35(L͘=K`[h}7Z}\h(Qw~ g`+Hkh[:X8xDUN*?n6p/-Vߕ;>\UAZ]TjB@&}{Eu˭-s$$Ñ'}%$lrKVm|Xwq kr_(b[ͧv~4g +@t6'^(XE@Y٠4_ L7@l˚}mU""HY+_2wjv%C!F:bRՌ]~nU4^0̆f3ɋ|:yɢ7{A_ JIV-)s~Ӭ3\}#|۸/U_ǃ%X+bu5YZ{A;}%mJ'o/gu-UPAKYrӶ/yF'k'`o V1Yt+A[۴ݼ}+5Ǡ P( TT TOp*ҩG_wO}ە%7f12"E7ѮS7B My-&2TJNJ9fenI針m+1BzPt+[sXyͤꦮ+o_@TT->O?3-o[m^W낆A^|loh$o08x, d7!1oUФO[NLxYVۓ׻|~=lSUz <L< E6ȊnPE]2la?83^INK6| Y lQ/fߗO-7y夒 sݜcb'Tiy|ʚKk/6IX(K%w/Yj̗ YL;S|csȱg 25=w0S`NwfM^} xzH@}Ӝ-_XD`lұ`@$&Ӵ5Uej*G|M=0NJʛ}g=?adpip+9yrȒosmA Ķwÿ;~hPj8`ـ;BB$NY.UG=Ƭ$!oW3 0JoV;\PkذA|w ;=W>~"{)ux2雞]wmջ6M@i;:n}M*3ѳT4ճ(mW?$&dk:c0LYz+zꙓ: r9@]@gs >0L-c츶 <1u6@녰`+H)Pd{} w>f zB{5;߀@4<isghmE˜S de = xV˞StsvF[,EaODs|[`,='6 Siyk%xgq!yM}`W`յp|L ʫ*;x4O]u-'iRk$وG#͔W"Bn9xƶwlvX$G>1hɐƎC=So}ؽ^r郧Gt`>T СI\ B|10Oiq @|xS?h(c_'-sw-y&;&}堓۪;[fٹ 6> L6 (hұpPj?-4T SRWwu-W n/QmByCmӰɛz }CF%CRH quAyڊ\]]qǦ\[lIjFtw{t$DΎƝ̠ 2"dou+70q Z : ,'oS9>#?@+Pwm5ðE' :kNO-5,l+f؏ވ9xfXP {y`ۛ3w#/$/%Aj3Dm6ܕj__h SMCc&o8`ks,RI(f g.hċA;"o[ӏvnz 0쀥/x7qG2cw=z'}K_~"d/Z=!jgU^ĖgPZכYR5uMO<[ael+GF!`j!K:m)[<(tɐ.- Hy@ twƅp;s&PC1"+'m`XgwNX"Wr ze.hg?hGM'oy]|avQ#øjm,u4M@>~e.Ƥo8P(TTT |~Y`X,%NyeǛ{gy9W` $w2rkY4Gt0A*;Z%C+A U_=fOM|,F+V#|/z khfl,*J ڡ5lf}E4| X{{N,UioW٢"UQx&=Noo܌ K/ą|01 h_˓Ӷ.k5͡ܠPK-[Y.EE1өui` OY'€D]ߕgM3o7cҦ"0(ks08@AF_QVcgn!2uH]rl}WOz~'Ywnsl[C_jtv h7.*h)HA wh*fG#A'̸ }J%Cknuv>r>n__b.ѝzlU^x/}mgQز/`Kk۰บK<MmO]s Wj&ʝ3),/;yf\@T`2׷|oOu/KТ-o}o7=Kve5zX*_Lsv#??g{okEFv,=yͩE'_/ T@&}ex@L{nD[bD 6 v;-$!yM QЖ%wAƤabP hnއq'5J1mvҚ?;k,e%ՄI9!;Od%T5UmL# l:`??¯g?<|wKn *g E}M=mys ξXÌōVڦ ϓI`?/{#Bȕ(yűG~v lTSK @6P$(a{.Ԛӳˁ w~9\G=Ƃ<Kj0 [}3&2=ou$£v~^; 5pd( lK`zn^QQEum{~ɥOρ ]Pr IkZP;!5 >>#**-(0X=Ao`1mcRZ:cne\ jzv^pW>ooųmcCEBPVwu* ;ނU w!DdB'{DQv!`3}˚ˍEWg Yy_Et'+J,N54u-l<]CBcb23sfVw *gH0Aahej*Pt)GF`$4tùT+c,33!e}>U'2z}<+ m Ѿ0~v}?yY LF YZs`A.)Rؒ;q/änX)Av ii;@ąGiﺣ ؖK` &P3ѳ.nN`=w'2DcM0gAMAlP cHRMz%$m_l<XJH 6IDATxb"H(+Y&em=u??=uO;e{ٖ"#9N63n;ɇO=r#:`VP GWIqͱN> Pt<"q3/#+,4^KPBDQW$KTq ȧ=.Oa--&$"mnd+_o=yo-ye@T_?g惧_]$GMq`R^RWUYD99EUMӦ޺40y}30Bp(ZŤzҮWk_(&sW\R"P 23E_}դtoW_k7K{ c[ ' ঎g^;_e}0$F `k0a/M>5VdH0:`_ XX؆Ǭ5Ť9y[9XX?.2Xz{2e$GF$~܊Gk1wPVSDfQPѷt4o p@GZ: x%9-`ސPUPS31po|şc~EGJy)uQ~Y3]u?-"7q5I@t$Щ@ t<20 .,wB)ÂL5U q!# eym}ms'[ĸ ]mNFH!=&YxhO/>V @09XH7J=r?_C@JLX9Cąd4 y`ڢ׿8o03E `?o-0U S uL12ry@G3ZA Le9-SCP )BAUQX3#gef Tp␠}k%Y-1!2^N_VX:q `\d`[ r20(e4M--E[t50+PhkC:zԌBa+KPeq'b9  g^3th4 à]ό=g~o+Fdwo7?` L5i1)a 4D* KiP`1h&0%E-Kؘ JL,\ɧB@}3ifH`h > @C X agM Z`cVhRBK` @`] W<#`򢍾@4e`S"Zx Q #*&$1P` c63Ե"}k{kv됈Dr &h1pp.UrBxʈThbhh(h{/T63hB@!{o9xPa_ p#VSl6Be?0+U`$򐤨"0EpO/[ʀl4uq @53j:7?D,dGl_7"g_eD&։0i c}LA򡑶Y -DStsO|X=J7 wM-?qO? l0ySgcL!K2q+؀ZQQ75D`/آ@"Daqj2nP{)01M+$K@#4qiK,xػ?l (0l9yO}`ݞ˷MZ伹kLN/1wps4GHEh82`c;o` `D@bMӗn|'@Qa1ܪF&9ۺ٘;jvmhWYKp2LAF XP8N N@%g}P-GfBvi?U̇[N). Б@h[:SwXl3 Ot a("0 Ұ$/ ߐ"98qojh]Y bbcbR\EPk94< x>(rhO-viЀ` TSTTool ljښSy\x38;uD.mcacޮ~B?07$?<,0 (hp&7lٮsg^Ͼ~z>?rsym/2EJ4DQ-(0Mk` u} Z`lx'$dX5yunys֊]So( 򏲱p4 bzM" q`d6e J`CI+D%4xglbHJ̎IH 'k1!, "“(22X@}m l?d#]rr.{cn^F0#hxtC栾2虾 RI OX@g^H/F[VAr$0#*QYd,X6) m2~`J-"`bVw 0ր=1W ƣwÃG:]xɏݗ%$!>:&>A:@+{HZW+çn-D6LOn^fWhͼ޼?=l Q^ cij[^uSAw*@*8Uvۘ;ҷ"hy&x o¼Uobs?wbJrZfs_|F Ꮄ.z#F8G?`ht\F rhzD@g@54@@CZ&v Gz%^Pwqo.?r#@ N$40-"24)& U@]EYwD@将8`};`b9A/xە4P7tC5zQE`5T#tG"΀Ԝl |}-3wPpؕ1(bM5/~T :W[ː۟,'ItСɽyXBᠾ@Հt( DJX@[SJXcX٫*v0"qz8SX|V6t4Mfu%=]MS`++XaP0Cz H bQƺ @]Zjgt@(hEcyu7mm@kp0\-.vn@1wf֕BCq|Y :ɱ#Ub/` WAVZ[=l[h+#@bXG +t?$ᗅdKqЈxy`gE &/xqoxӖlx1W'-=}ODZ@ k`@0½ )%[h@M]v> MZV%}*+"',#uwJ`SQMIO2inl( ;@2+v2n at-D:g 树J2BQX%Pmal$cRpU& ?s_z3"Gjg/,&YL1*8 4\CQc{AK&m3/tD^Ѕw9u0ԕ@oM)g00? #ӈXN6n АDNe!+>KBF8.62"42\ ?`dZr 'Ҥ ݝyK_.:}_ı'c+6)l2K[8/fūwͬ^U985taS|Z foX='jcwІ#ҤT^`w pQ5=cL$!lL;ٸN^Z cOޗ4#] HEi6f,Ml]s=Bܿ}(?yD)h}4O J*j:]~.\;']-E%Y(E%KqrWko\Ar6v~t?2@ LǐÞOŁj*'a@I1cۤĜC+c н+#?90շT/ $u 0Y+\:ďڃ!PƃnU2:3 ,pXm3wGO`eWk]fwFIԆ U5X<~ߓLA}cXp%BOw pMm@~}?"8Pw2 Ln~W>[ALb:_ ׶4?@ `G!lLAg+J6v͍l3=yi򍻢y|ً|بXAhroYRcMp3l;hH?tߢ]|uh(g.$к?5e/?azPS p\ `mM~?j :n5P[q6U2Z?<%QQIAVB P2 YsB? R:Σ/Kl'6wOq4y'XAXZ:UԂf6lk޵gٵwև-1Rh-ЬܫeGDl(oWj#kgxvh"#@'6Ilh'UmWjht*Nwk)TImNU=9~6?(948Nf;Q@H^MQ`X+=Z'AVg /у',<]#lO@ZڃTv&=IMӁމ.`Z!q#9:8nstف-@@ ?9ߪ& b/K5JoOߧE;v= oĄ `P(hD.mDhw}tږ!/?}v`< D\2` 揣yD8g @is_ Pg:v&*5gw6}E`I_ ,MGrZ^DTwÀm,[ri쁽@G7OO_lw$ܸi3EXp܁; ばVj+th3HS}ڄHq\e$ _u- s<<%Q3n fOLr/9eal{oxXt_ÍoF4>,W.Tf,5ZKS[` Yüp3!ā͖.C@1w QIWKXX8:xy8xÎ re`L zZf)Yq 50ȮzԞPX(S6Oru`5lf< X4 )0`qqi4' @q[ 53R~ *4 7GЂSiAx/نY@Ķ}1b<ήD)g,; (r [`o$kA,|t$ G@I= ,{gfV8xcE]whP9 x1 F޸lp[ܦ5 l:Z%jlɺg@yomD`19y5r^+ V@^r4Cl#3zv8J+u, ,‚c~L5rhH7b>JR 6>sXj *ԦXCֽ)-8>A%AgK@尳Aϼq`P :|sE]3VbT= 6k؟qH ! (B@S@P[ G`:=0mA@3<0܁XKn`yhlM& b x,xşQ X;9A{yO[ݘnHADWGnn&Ϝz?1!ſagh`X9s A{$l%n& 3Л雹2%%/*2tBVdRU}\Яhr:44 ɩ*@votvL)?P_ ֡0Pt `@X8%%d}؅jj~>l7"BiǛ C:.vV >X^ilPϟ,HFNHE3Eus[XDL.| y/ed@Լ &2,ްt0N`4@-gA+]~ g[9zejJE?zS@ v\e?`xx2d TC@GkzdG] ,:ч?!YRBAUymORn1_z\'$dؘ k`c--h hrC 0o]!Ɣf7 bPiw4 ~#(&Z"qjdӟiƊ @MZ=pї?%ACI]g P4؀ 7w(^+"E{%<'^/hT&IDhf,0MRiNj//{vw734F_}t^3{52ox((? /hQ>-Zm[Z4 JO~O9+@kW`wLŕrRf6g__w覟W005Z;XPàq`ݵy^&Gh 0XtSN{]˞rx\\:[~H:! +!|O0VE.[O'`L $Yp6,*wȂ.ݭ=*h6h0݀"Z`nݗ'"bĕٚ;tO[~4!QI9Q;ັ, 4kAh$|qL o3`ijh cކkr#, MX1A:80z]BodfPdJb~? M6XK}4 q;,N 17E>w`e,&erh(C!hM0aJuxW7|ٳ x.6q ) u 5V*pl `&SX v j:@xsR@Ɇg^?oQy=*Ś ]k^NBmÿa2 zR6-]  La?hs00ſ'y׈߬ &аB9%`k-$Ly[DAe9 yX-Sfd#8 r0tj ̰#]KQ_o?FZIN /C@,WGpBO.p-A[g ^] )\l->y9L,< UChcU}?0!};Z, ,@x!$ ZS-':ظ'] ¢S-M=s{6L*B[::eÖ @ml~h:Gw-"?GE28(z2hϯ pv%uؚe]X/*\gQ@аŚԁf{+W`Qƅ? *邦Fҳ#t`ث56Q\ xzD~;A;@?k휬܌%^𿼶ԇpHQ>y ]lBkO?hMRVFy宋nhyOг&a&"UC`"4(vʂ'_uwZ:f&70xO5 KsD9qs}>,8؞6R@ dhi0#~]aѳK:.>dž^v#5qv;Y3nIAg2xstsRB=fȪHWl$Ւbx:'#L&K!d%d$T@K!LOˀ5ѷrq)ltO?Z`68b R A6H  ʀZځE`[G~o`nd9BƳ!] bF5^d[D" 04ί8uu``=d`sBKW%YcX8mmE&봥iMXj4t|&`Y3:_IUQؚHL L  j.Lln210fqob)4] G0S`cXžӫ@;*.U:RI5B>Ш) 7Ƥ;XX*DF|i =tDt_9-dcnoڠgk ZjAn>VhM&#]Mc=}XvZ8yFRGL~ض\?SV:O7-؛X/{`:}^Jr2PZԕec_ݗ[Л韵:#=OiYˡJdr@{A55W|: tX۠KNL<>:x$hxX$ $TTT|lhrqfx` IvF:ЍtCGt.@y|M%hh -x,G@U |<6s._-hvok_ *]=)!9)Lz𽧳?/#/<8 y{FGuVr 0@Q!X-o x={?N8,}gN) I}TT 4h!TW `:v7(V܂X$MS`pߓ:dϮ6޺O>{޷Ԕ|`2݌6o];N.Z`=sWD@/Ym귷tV'q& 3l XTY9K s]s繧_*z$5L0Ð4Z `6ֳ:Z؋ KLꚶ0śgؾܣ/rdnJ5C%HRB<L )yG<OfE~BtE[ۺZ'K`37 5q ,XcwKJF  yF >IENDB`gltron-0.70/art/default/gltron_wall_3.png0000644000076400001440000004461307264162424014133 PNG  IHDR@z?>gAMAlP cHRMz%$m_l<XJH IIDATxb╢6Îh`е"*. Sng/?v~@ߝ~msI-TїQ ^QY%Y-WGoӗ?[>7}O>}}'&fX+h u @ ` ȉ c]JLIZLYF\THEZ %E$ʀEe qvd*E]+̩6n"!@?`y]`H;$9bͻ^_ng~ D'umٓOoYkrt|)('HK*cn@F@Exx₫wمweA-dYƸ \3/Ye]7Ĵske9-1!2S?u5M\l ij1цߚϊےÆU3Rn?߾j30jK@ڙTA;LKvP@ ͿQE60VMl|B*;n[tߖ=k@C ?pC?wmͰ7_]m$` [Zf[ysSԱdխk=YV2, 7e>\+e7잹ΦV?VPiid l S1=p#fت{shbgmiab&eԼysӼnFʄZyu=_SUPmѾ_Qw>^{_pqWMSKyz_`C?wyalO^{V[L*߫߯CN?X;.3岞iAA16v XA"6(Lyhۿk|kK;9HhrlDJo(01mMmoQVgiOmŽI"5 ۲uX0Q%s5gTSi{{ﮍ?ˣ\5U @#x?Jwiki| |@O6xi169k/?ow?hw?`*.͂7#0ds"2r@!oUp. 4R5- VtԍAU[寮Z[Ez+%mm~ao᤮̮u'If7 `ֻU}Bl-- `$m=d̻66[?^VXf]S&^X"h :׭x™0Mh(oYvO[E{6;}jwʂ=? l3_#>R;(WlM.yPN8P忝S(V;XW4!%fl8o9˙:[CEyq*.Kwk_EHca2'kHAKD5 ]ˈyoŗ^ Tlbm`l&&/dIK&ؚ9+Q!s] Xxw @36]l= z L߳AM`8@BL72fۥU;g^hcjj #B=`Q"4oӯSnl X煖YWY|ro^5ѡJXxIvT_{&+pC"bnnK5u ׽WamllSgrh-ÿ5 V2~_~ӍK3@g6 \u6%}`lϬg%_8\-+`}M^GlM^돕f9xiIi=ӽ z6]3+0)އs%oBkԷd^0qA/W]?;* -`ms`sfd?v6+6`ؒ Y:y&f;-t`"2D3Zk~brK?/yZo P2tTAf΅[u[I\ @݉߳/Eu}Ìt,@CBTf"qayg)#n/r%6e7p~AkRԶ]v508z7\_L6SNykk mS˗v_pmemcd;*NsY:oσ!Լ2 k`cXgX Fj?~` >/aBKUo]9%6)eK=[n;R+Ik#l9b@oKa ƺCT9-s}+` >/qOF_UHߝy?[]|:K PF" dϱO[}1yv$g>P`@ PYE^~ ̱K>O΁MSS`Xce[ BV3Z}㗥3_fLޜvjG D6f˿O;3*jn@Z27r@}@#?Qf)*#j6򀪂z`F0X(P,Mb!'V{Sǻ S8MEkf T Tio(Kt/y؎;׽)/e o }6 E(+ڸk} JQ#w):o=z`?y&py~yBgyy8$ދ .^ysÿ+@š5\~98ܵQ{T@f j=EdW^ )Tq;eALg@N`Z߯hm7ds 5"ɗ6-^>ևIPڃeߗ{uܦ偶l܀8)kA˹klz7M>֞y:M}s0t/0GHK7[3?6~[kklP}‹< %jdR?k hݽGfxKNteh0՞aLgY"45$Y 0O$Ä}'~˗߾◎ho[+_u?ւ:_?@1?uti[Mqm3; 6/g{kOϪlN M*Ϋ神%od׋{;66d3az4s\o6I4FmoÛ3{WI5\{`V5i(Vg4;nMVlEO1юq 8rd:_dQ抖CDwv -%6vfzZ:FZjjFXB=?2g˞UA*w~ye 6-M!*wjK6T EbZfn Ü]"&EwE{݁ C֖zB^򐨀 0l=|:nfo4ѝ-6Ց}=tP`8Ǎ}~dUG׿5[a.*!`&#oÎ͚kv3ջkOGG[SSCM*C ؠ"ۻuK׿z @1hz9.wȀI kI l;;e2无^G/k 6 4U duhC U ؈&#] GkĬ~z M3<cYݺlW#*.랺MOt+x{zo"gxǓuEd-y=[<}Jy{l=T%Fkt'J`#\'yn Ŗ=-.Y M`JPn*_d/ԬN7J0351@ D\Qzܑ&ٹ1}_}[[JF!@1XtL߶ZNr߳ToؒN50Q&1Kc0? 5bw @yר++7_bs5MT^5u~lۅ;MZ!iɻb 5[2em|6ksLo`*yL=K,K_q{Vں+7-):Xt =v7ֱF&Y;\5D54؂!\ C-H5H=D4O?uVP#pQ`@ .4Ak97~Ac ([o>~hKB`X4Dƨh< La^.~ Vn6Ϳ?Tl)6}凰$`_䴀y,>5w=\E/Yƌ6ݻ*NimU%Sk#"LC7hᴶyhhRXs@ybJ=:33g p 0wꋛjf`-ھ6"`=f ~[9U=X*A%5#{ iLİ] Abmr;mm 4fSH+9hի?TeGl;$G|o}O!m9 XyLVP)NswV`G~o2k N_t{ϫm2O +{2b* R"?,dˀ cn`[7ߣ" x020'0s8=i ^v6<kҎrjQ S:GH 2=l㦦,%a;*S'5%vմY1`饦dҾb#صACЪ!3@-߽[ @cAJؽ0r^R|5Od;bDϸԛcyS] S9 PSO41stqsqw9ٺ;ٸY:Z,d~?gB Q +y2/rfy; )ٞs -L,,NS;o_뭛m(AVH sϞw.ɐWl jps`nK߶ʏW}=5U e-#bm-=01Yp+h&{Âr5jFv-K~6n՝/>׍} #,0.d_*&SwSō?@i h!-`^)O|ځS FhY}~Y!_`{تm?kս"-Q|2-偹N̳(Oha⛏@ (>߅!o>frfI_ylC0@1lh 9ݺhV4Zd5SBX?z"ŌhF>9p.7/`n@ča)92[XXTfUbV.5Svڵ=ưWb+gƅߓmyt g׿M.Yf mIi `?)`ioV t1k=Becڬsǟ`;Vۀ=oez`(: tCTt hLZc"ˠ "S _Mp*gӮ7-\ecbOpwzF.ҫ9WxbC-3Y'##XKiP!tiMy)u`Tl( MjoդY7!e8 IߧxO;q[CY_]YԮcF:3vZy:qNqb , eYT 9'< O{6 mTDa#Ly~>a|B2睹o?(`ف<# L QE`[8Ntwr`[°\ MLsS5gW΃C@bHet43۪EG&zi@!E0@1^l?` L}qWAZ)/&qu%]`٩ibefkaoek` l9P0eY~<(XZ5k9YOA34!oxk[e7{؞[v0ΡCɁ˞i*saXuW%>\+b7Yu Xكo/z vހ#`Ego~e^xsn{k7-u#`Dl}CRkf,҇V}߿oۏ;Pr:!t n=ٶoztB*\gsc{"@ǃܶa3 KX_s$۷_َŚMnLKgn]rc3k$K{̡- >_q!Rs|(mLr˖|ܭ63b`h+`g$Z6{٭`#֮` 3k >n BfKl.!b ۔HP$n(0ց^2{+W[3/7z;ߵ9?P!A,wrhfT5e^T\[$Ltm,vNo!co8u̓.*j-:M?u b\2; go ޷@cc4p( t?Qgc7xUdxqs`7!@;s ' n`4ECۊf̄ǃ͊$9 d\E'w`t! 64umucc=+3אΉ3O^\0n{ב;N:o@ cCh?h:[P?`fq]`lalgm̲``&0kyp[YCEڵqފo~G/ɎSg,7"Kuwf`imA0I V?{l 8rvLNsO5:F'=pc͟w?7NTY' 4ە{ שv_!e7(FUxw7+ΝET<ѵᄀu! Z,/fhidR5iޥۛ l\q[λ%. E :z$ >_t>#0?{WlϿ.op1շRWwp9> $ ҵvۖ>Z9F{ g6` Y c~=Nw#)@cd4l-8/:trc <:c]/}TM}蒁ϾNX(ܝ!r𗝒b;y3@- l+Axjz%mv8UY&5m߼[шcmb=M'W`ZعyZtU&v%3AZM?ŽYs bvpy{l像)b5z uà9n3dXMwXc3gȤy .Ztb09H17]9a wyd"vtT~QwX.ug&rh6{!JЪ8H Hk3^1b-Z-4tu! dPCpPL-`ڿC8 o`)J,:4@v?hFʗ&t52CY ySa 7ƨ.XAhtgINY}r`zA h`"6 <\r pqՔkaK!u~|ȟO. \Lb6O|V֖]~Ji|gfpge0ݞy3oBo{nm)f-l~96'AgCotA2s993:p>>9.ڗ_*ۖwD[n7/^AfzcJ/}b*Z}06 ;dJ)8 l "sY?o3PUČBK#"/,b3ճOv){E"ysb3&۲;u(^x|͇Q&zVӣY =c@}vzb׳v"?۝{n eMa-A  4pOtOIlxT娛A>zl/Sr-! E5Ȳɛ~Mv!dY< 0цa0FhW^#^rm DOmMm?Voќ#4ϕu3tyr.]gzQ'oKgt_ !luNUˆo}ÖAGs>^mP8{g߽_]M^ L%a]j6w-Γ4# xROFRTQSEʵv𮗿=RHufav}}Qz}5ֿ-!nYm`Cڸ6]t󆏿Zvk[Z¸ȓcIԊl5g]mmBvCuK +r ˍo^ϝЅx'@T$vA~Xk^Do?Xݚ?.]w .LA#?[|z$֌cRc`,Z J"wIY'6ljm:8LfЂ0>h֎Kfj}]5yӯ;l @bB`/Y¸؃}Itݵ}6Uï!dF}uݧ_i/ !j?-oڜ/^s' S@})e{R1Or66~ݻoB43,qg]$"Uk]g~y͋VظiB= ; u";Y7{/\_ ``ih[1a&hԓ{?Q59p~VPB[ITޯmÙu>DicabL4@^㩯ibghW9q+Ŷ.}@_[kbFviFvpA`T;Vmg֙ 3&9sO𕛘l3yf5[`~A.yAf0Ş\PR?@뛒~uۿwn%+Rí􂺿ػ@  O/qYA`9N?8Sbakj!yEJ斊60܁]_WƯ őKͿ: fDn߆fm3hköǨ,2ہ:?4Յ{RLY_v+AoR<@бL^x4ٷb5 y2/~7~|+Յ_q#肳}I9n)J4!؆YKzxUCdM#`Φm@H<_ [3yˁi~q:":9pm@G|{ 1ճRSĐsDpm65@lB;VnlgN<: ٠C|47U`kOTLYN˺'Y|U(%瀏GnӃy,.tdR6W Q5OR4 fРշacS"ԿćgEºJK.J`y`#`u,Y d<@`/9جcu A[`_ ć;bB@'9oORsʀv12wnL8R2s(h6Aé|l{Fvzrt^."z,/ Fsgy SYty hH$Y ,z6gV=\+N}R7DweZõ& bhs4:#ѭljy61aCv#XɈa掅 <t.@I$}YcwWQ Z0_g[h!\ngySA˧Yx ̎TSzMЙN]k> "^{`؋MYVz0I{yR7E}ԿċsyԚ|?^; 9j00l 2;8k⺿N^NSb/2 mP}٠,tUXU2hYuI~ߡ{ =A@ӢVF$݆]kmb_:5ӝ6zP<0lu7hM+|]3]lؽ3@~8[*>k //o0 ' Aİcѱ^bmG]<@Р % (j/{z# 3^u1mBJ^J]{:wCUV?Ԑ3NcN[>1,AI'AvS fu! w5Pz(:.:>}K_+HjKHFXi$`o#mbX̴g.9ޑANw0\|Y&\i'lgٰɁNLsܹ/sZ1wm#œse.J*lC7;eAC/~4\-<ӑǎa=tGY&4r̥wA;^Piah3H"Dwݻ+O%HtGttQ~ѝ~> i'dk ێ?:td!CVU}\4Tq;LGf`A;8kłO )uRS)9ZL v6M]+6ӑm-$[ b8ͅ}V Փ&9o񷸭ءTp!瞧wdf B+ ?EFİ=~}(䕻63MB:>wpm@vŧXvQGZ%:dyr+t3 BTf/_|vQjHjmv6%EͽgSMIph4q-D;Nl&.;X6"<)lEUVZ>x@`EORVh,|I3'N/0 OV:iFYsVXz4dk]фٕ3LQmgVXRl@ v ɫ׾LvS_ʰ$7Ӎg3L'Y :әs(˖-~ iM3"3\f;<lL_y-qILIN&9sMv=-@bNΒk}6~WlrwVԃHa.vmo~^jAz\!\6OxA^sF`4E't)-b06325"( Dzj ڠ04ǽ"5YM=5CCf.-/!.LA-&E-rޙlsI DdgDNpVjwN؄]ܩ t0ѵO^zٖzX&fa֬0ayJc4f.oJns=|àDxV: tEa) rxb~^O_1b8 :ԧ=-;n,ԃV=q_67u +BVl ^yOia `u~Ykӯ_}ϖ@$}ݿ޳Kc[V-Yg\1h0{6gWyR=@XƷOxIENDB`gltron-0.70/art/default/gltron_wall_4.png0000644000076400001440000004213107264162424014125 PNG  IHDR@z?>gAMAlP cHRMz%$m_l<XJH CIDATxb╢FCWQ 8dhVTяK/\׾/09(к6|ͷ8 %=1A9a'* 4T\X^RTIZLYF\EF\ R@@e@tN+|2bB&+A}<.K`AM&E"$‡j((E&f|qI+c6-EեakJQD`PP-e| Di)@.P(TTT HBBDQAZ]]NK_XX6 m33] 24єRE-O :dI1%Z`jR30u2sV3TU$4uBbҖ?}3l )>R%HOQj:gڲ WWf"?X>0)YxyF%dTMv:02\ P h(m$/#'jcY2y^ Afr0ZnѪū_lB;'?Y1eQ*x,B_?<)MSY(~`r74 I~ʴRrT䵁i<T ,ڂRd$'nkV+Flm.B=*S'./__D r20*'4P-*1l {-{n[?7G (**(P P#P;Q@(SfPLږ?;;;P\&8PFeitr߽҇y!0 Gcfѩ_yRTkkIR@'e':tY2Y05C9#]a', j I+XxyN9|zہgl5L]My~+rR@o~L= -ځ4h8 7@]AX;/}fϢ'B"t_M_otLSk9 5 3$]+ɘŷnq7LOb<@Z>ZԿ-o;OޥԙY*舋(S0ATTO~'n#G.;6 H)2R H Tt 4M=K.p~_zC.zB'M-%B@ JrYRu¼KKj4 h X@+҅ 0x@C:w.9qj?_CAs-(+P.5 @kl9MVd8u9?R_<JRU`P̼+weO;>@FE.[L0F (<{?aʹ,q"4CP$A kP*ZkFL #@~H g;0hi]` @ղje s. Ns?nܗ$R}\X/&`gno@.P(,)/71J}P#P;Q@ Zhjy!v# 7ZoU^coXp.*_K ` O\p0Xzb_杕7Eflk `I-XҌSW^t4VEO2US"@UN+02yOKξ7'-A^:]'a8y+Op{ꛉ;X@i[zB[7LMA iҺb=)'xgn`L薐JBFA+VbFv!@h:PS1{:%u13}r~TBFRVBMW? ʷk9gN*i7`~$U`_/|˛-+Dݭ h!mŝlL T50JzM;ue͇o>EpI-h'K>Y ٛ ^e*>/V,D rZ&">}Pީg*Mv/ނ (@@@CF  4h"u@KVSoU~m~ʮӎ 'D-`B(ӥGLm7O8+p"[tkegڍ7Ei)&zRT@FV\UKž ƿC,3gu_ϴtRWƗDdeu}K 'Gog_g' 7?_بooKQ3g WǿL4U/@WmI o>oRhNJ{L4h@@ÁV-Zh5@g |`iLzuJ7|ߵaG ]R`|ȈheXuG{ltr$LMW"P(x^hc.)q-n.=[m~g9A=`﴿~xd6MV\EIFSENKEHN ؞V76 s 0XzGzp\yX 聄YֽmM/(xu(L6glG xxm @83tN47|7yt~Z<  f@sҸ,־Q4h8 E@뀖: PRPR)c2߽Is@IAE~` ,YmܛG{2*<ʊH<{<]t@ӲbsʁO~-nMloCP7Z:urx'f`oƦ_ּQ-TyXXl٣1)yZR@3"0Xt)@&G`N`iA\V6{J`:.R@ UK P%"u@KVt1@'=Jv~`- +ϭ67qD"`QTSԳ3wlX}~ʙ8!`?!(HTSU.~̍l{1`EkE*,##<_@ݞkl,4;!M:@AZX^!/uIw=Ȱ[+32ȃfia܁Ԅ@(@d@APPP1P lh:@}@t I׳2PAÝn=N)3׳RUԑd`fibW5m>06|7QxalS?"ϐ;zu/=;X:[ bB(k VHk ƅk6)" #1?:7_$EhrS iM?O9pw>`[,fÊ;7W7g"’RUб5wlYa˿K[/7Ɂ{ rb;Bmj-m'.:}+nR@@e@@-@Zh5@gt*l6 ,#&IÝ:ಚ1٥ؘ?YTSǀ^<b=/|ʼMo7ﰳvT1PT-OG3u%=` ؂-R?j .Mx1(2EI Sd#p1b0m=8~&/?)c٢ _{O`鉵@@4fiZ\ߵ~֤ZTv?F2#58r}܋ˮ?7ˏR@@e@@-@RU:@::r ÝLO\ %oPH,Z7i43@0%mz߾i}tn94 g %= m`S ۯ ۀzCSae&'NS"`ں|ߠoaI@Cs_uC`8`u-@gPBQp u:0N;=h5k+zgnaos!LF|V[@.P(TTT 4h@4+: cN: <2Ý uoi"OL`imk ljT\)P`"] 0:z{M;ue`3}cYߌom`}F<70o?A[頁u_wL4;X _ CWX; P202DǢ{ 0W-<2e[ ؈Ҙ^s:hիm+7E%f:Z%:jv'D@ J5 4-@t I@GFCdxڰ34(կgں/6je&tPq`m{QG:X7P[9WUԥR_d@(<݃x}!JSКtim1ڎ~yr\ZlH* ւG$ԀR@@e@@-@@@CF @::HRXHÝ6U@}S9e U;q!0=l+nƴeRVX10ߐiyv!@-t I@t$Щ$uqfND'fk* * w&̦gihUղ_/Rh< psth{t~A`69ڸj;d Gߗ?3EF^2⪆&Ӂ5˄ 'ؒ@{Ef毥f@jG@@CF  ^6 vN{Ł4TIݮuy1;goiJN򀸰"|Rk׻^ɐ= L낰g͇oXK,~e͍l 7М=I_ZAFlvv֜kZK6 b;h0ܡgV$;H+=$r?VhI30h(@c@lce'g@L ;HăgӘV tm…7oi%6Oأ]veЖNЪY< de"`V\w|'/h<—ł: ،BL@ p\Ŋ۟]zG2jS^í+7ۚ:(hSPځ4h8 Z+$À:TfkYLtu̿t$5cXiE-/̗rȝwQ S?Y^x06{ hY U`p"ce<(?4qDW^I{,#&9̽jz ƅ3ą5ҁ`֎\?V"]`+RBZYJvd @+YaM#À:Tʼn E{Am=ߵzz w@gBwϿzD\y{[lӱzZ .7dk餧efcaajgeDffGN6nA6;COrf89*œm\+@s1*Mv.L {TYO=zƝcn_Yf`W  R3N:lV',  w=+8IzSL,L\y{G-`='x"X,?$@df h[_t茋[ݢw|oލGk΍茺6|`ʁ"VelQ, lwfl>{ʔ=*ǻvrr$U @ZLEOݰ{)Nv $lG Im6W6i9JhicQ1yֶc;л\r+{2Rb*@gU4җ>}s`9?]$zÝS57$;4 j<Ə۹JgDO&,Կ@v~?`bڼ-`ͧk쭏fn~8sOt-fm0Cl9@;}6?|dzݝgou~FJ@ hf y˷_=Rch3;9wt{KOӝl?1LG݈@5 *7?a) Fв۶_=g4l: =,r:j.[mW^w2wk3 t4`C 4qw Xp8w_x@>2J]l ln`&x9I Rmsf&Pn~s7-. @ lK3.`@x2kiBT0|^:;*8'k }{ 5M[w;Bcr "3vl?PW7V\&1fiܳ}'7ܴs6qpΩ>]}5Ah=ѳP @tm@ t[0e$@9z ?Yό]7o#'lGʝBKB7Uym{;OP9;zشM r#$A"X3e͉.n>޽P}=3M UBM  UYͤ/l=Ftn$#8^l9ؿDݢ&F3SӁ&0[:N_Æ lC2+?`규7_5ESA̍_qm'n9׿LߦdO|vsO^' ԩ4 lC*kNc'o; @WMvB;MCRvt̃B7ߺ7[]&RR2foo 77U;vK]пRcǦ=@ɽwoٶql߸ (عyODv9dՍ͌lm, HY[:YD IҚ-Zo\m-w^.й=A s=M_Z_ŶJ$t||};e$`upBuv[_RHf Fdcf[4u5]KjjbѲdz&k>;Gaz|a`Me}` e1F*^&e?x| go]6CΘkEiLl{Kh*߻ΧmU~1)yfzhg_{0P3(5N_8R7v.}B4tG@sy{M^xys)x u(u ?ֽi:Dޯ0<_kyfF@`?`ӱq%}; FfbhIĦhX^tO]yZ6rT]Gn_z&tO߀Vtqv'} ci@Rj xeڈ{Y˴*~sU_O xTL9HVj͝$Ԩ5)Rh0%~{I d:.zI߆t诛t1A`< M:V9^?%{k 9Wv,swښ+Sa&ֱ~'j_堒 h#*+m"Ѕ@w] t31u)| X)_Mj~LIЉ_ B4`ad+OwHtvADK6 :eh_}"x6-.`6~E4mL5qҁe3.0 j{9k+FlL\`'W HYi59@Ӏfx)>h .tU@]t'еlj+ٚ;\ SEI?P [ 53` n-}S]KKg;kw`hYp@FFx?oj{Iȍ\p_:^!-UشB`u1eE%@Xt!Н@݌ 4' :4Į{ʦ?hjדbsb'ُ{KjPrh`_Ɣ >{]SY)}ɇl;0q{s{]]tԌg]pU@4F?/5?am;M3̆/FA\~L$&(UϿ&5Y+ivH P<)}@n}[4m/@mAk]btЅ@wu}+#Ή<0E$SG螟0( h3m,7g%ry=dm{Mǝ[`lλrk݈HBi h @iM]py:h/oF6;^7gF?&u[Wnuj]V$6 Mkhђ{/br͕H\ _?5N쮓*Qk`oXO$U3s.'FE^\߲}!9g#gA@Ե ~3Fm{ͫ;ڸ"oD'+t[zћbܝ=C*]10,|AD hkD$M=r׽w2dj?BujykV> S4r0$Vmgaf2hcA@`!lS8eץϿz/26DBiqNi8BozH{hxCzD%/Srˬlu4-UC`m39`wmcel C¶>Z Iܲ7[vqBlmU@]/n]`ZRoWR0B:7Fd9?lwmo&hX z4â)fx.Ȁlq~_, Q @XDŤ.}j:x3dnuaSGT}m :ZkҾA1Zd^YlwO4ff_,1d`EW(N51η~ P <:0-`ex#Ł@5@@@]O܎SM=]tU@kYt-CBN6|RfLz،X kڏ} 8hUhPDcm`, cm|--p•3^!k}[!r>}@zU3 `W  +S_vY(?Y1o9`<ngk7~WմM;U_,3]r ک$DVt/;nkyM=ޞ6zՕtu$ ej*ꁺz&43m{ B\N/ieƣM_ 9cs7~,putoy}odlz_Zc9"шucʷ@tqzA0AKۊMvʨMꁙD"qS)8* d iM=|׾w2t B1POXߵU @ j HG{ ee-@^Z&pUuM6 .S{-A4M[|n_k) |&\0s36fol{ӗ}jF@b0oņ:&xt ܠF?hyܞI2O G~TQAV;au dVXW8*!srA xuZ2TUn?`shMӷ?ٿTײ@Ł@5@@@]@ h; K6R;0fXNÝ9SWwmV3V8jz0m,D# U*8:RՔf<`GRDQ4.koS͗ODx' (F/t859KlQÂ^~쁴 P\Y˵V໗}l< t,9{BA V륷_MtL5XlH66)[?uBDŁ@5>dPL@mQ nZ ZʡWq߽A+`x0 (??iZrfm)}Ljg/vB6|vؤ9V>{lN?~عK: "35!5cPbf4~F?)%jJYewνzoo>`a?ZYVKk <{1ܬ)if2tjGIA*>p2n- |-@6tdOWX~\ + ΁f8p0֣Ib'.. r0Oki`Qְ;`?{@d.T1= |VmqqTu,dFE|07`hlJʹFDN Z#3)lvϤ3FD܍~PSJJ"M)p3iW}Xhê}ܺ3[38+ѝFGkX)ă'hi@3& h#^@7i=1JNjӟ3}&GL{U~LF|0wSk}tG̏&(? M~=w e`h|iߌ ;UZY L6SF+џ>qҚsx==c` u맿Xvu٥y hW6•F&8HU\UKEٷu _7qTdeX4 h&d@[vmګE.=13mR$N#5]T'AM8doEp5h)*mmVƣo;7x,y,]2(fmꑳ^~83&) `#GOL@X{H>"!S=w[5a"`h@\[p&K$E:: ` 1tfkwS&f(Hf=Τ0M4 h&d@[vmT&mfRUIה_[,G ܒ&uҢ!ӠDЬ*Ww'jE'οw( zkFʈ]r\u t`1I6P%dMrj}@> 7~UE{F?094L翮N=_3§zNBQgW^e+WDJLغ2M+[xvڇ %7yg*śHECv tT TL@M<hF2~TVM;&mgsCVCfĀ(cR.-؆ѩy$.V 5£S0%{o[!/ЁYC5M@6I) 1<##"*?5?hk@ߠVoW\*NvF^HB/t@Tk?&޷ݕ`螺lLz!ZA\~dE@Y+8'<޶9l h2|#]i"d$'[VZU4S '$=MA?&5P˔+!QtWAyֿC?P_p~xt^@S@3#K o_4L M립Xj{y깉{Q>@R1.ݺOdriYBpSMNh?J!R>BD@8P&! ~Kk^}:74@KJvQ|l 6J/.rzKs,.! ໻>yXG8y wk-l  |`u$z³7A>P4&%`ig'v0S?$EՑ!6JmZvɃD D_~uvKs&'EEI (UBM4 h&dj]! m]X W?P(n Fd*Q)E7~͟/@gD3 7PIJGkF]юe^o T RW<{o5NJTBE@ӍOXfUss.^/ZtC`hej*o 04 h&uw< k,x7_5%P$.^5m5Cw{6ļrPU5@aKI$`YxyyHi^y~gn?IFϤӐMxHP57r_7m~&< .ȩ^T |vEE Ix :jF֮>Iy3-XB WA@8PKMQh7RNб1b]I7;qAkuM \1n_ ۍ=S? [Xx.Y Nm4'L P9=k740XLqr[n/w2WLsӕG@5 M/"< JlpRb໨4tTu 5 44M H@8P^ |D$$} ،eR+[L,@SsC-d ;JJex@r־~@p#g==hVu+"ו- _Wh7/l#jM?7{[)N8cW͙w%^s Zwks]߰hS=`ʖW!URHWoDh"e h *Z#’mnhӷh|˿u{sݛ_kA'2ZϦU\k &|$8{8yiw¯oCz{?? 윐"Їa9-W{ &6>D@,)?IENDB`gltron-0.70/art/default/skybox0.png0000644000076400001440000000012107264554411012747 PNG  IHDRQ9IDATxba```b\[! IENDB`gltron-0.70/art/default/skybox1.png0000644000076400001440000000012107264554411012750 PNG  IHDRQ9IDATxba```b\[! IENDB`gltron-0.70/art/default/skybox2.png0000644000076400001440000000012107264554411012751 PNG  IHDRQ9IDATxba```b\[! IENDB`gltron-0.70/art/default/skybox3.png0000644000076400001440000000012107264554411012752 PNG  IHDRQ9IDATxba```b\[! IENDB`gltron-0.70/art/default/skybox4.png0000644000076400001440000000012107264554411012753 PNG  IHDRQ9IDATxba```b\[! IENDB`gltron-0.70/art/default/skybox5.png0000644000076400001440000000012107264554411012754 PNG  IHDRQ9IDATxba```b\[! IENDB`gltron-0.70/art/default/test.bitmap.png0000644000076400001440000001414207264162424013611 PNG  IHDR\rfgAMA abKGDC pHYs  ~tIME/6IDATxUuLa}$׊mq9Yex%$_!!|k7@q=nU6v -_ێ cX؎uNZ?>GZhlQkt\[_|\=7oF٠pgL{yQ?=xNe[@<>nrynUoK9xookR(#>"_eBC'9]jp0-As*8|񡵾/d,\as ,_8*}x?0u?2n؆P.t?[}wWP?1~{kW׽v^'kV8l}{>{b~nݵ{rcoAq3|'| 2?M_&4Lt3n"{#[ڱlctQȭ Zb{ J4{ K`؆׌ho |̘D%*`n%?[yĹx`RݛyJ⺹|aG| 2 أ+9]N=hX >a>g߭@\1vą 3`ԲsYu'zs4\\.<a:䴖O%ܵL}~.,_RzYoߜQ(Z. 0{_<=c,rgoSJCO˷-oްe.JȑbAǘ`,˰9&)O9'k:8!g8˷?.M{@gƾ=a06w#70.wcpPQ:X,T|e|:rLm0$k[B8>ݫ5j|O=_DcⲮ8͉}6aqyNſa_Qf+Bg `3uq̢v#vl* {V{ <k&];Q cKpg1X"C-K:j o$MKAa`*eq kp#:68`-}Gf{7 t n@xGyPRaEԞs52uxi.],k_:.a=%KXB,n8nY ZޭypIYrdfˌ}yM uXۤ =JҧK b62o۰%eFoBA ȲK ,>P@~ 2獏<-k^ vTq>mc˕֟Fa|RrJ`?p<儺Xwc\Gnкd_"z)t$π"%!}?0-)i(3Gg_7G洼;zh?`wշMڐy >53;iȚĚ1 >cT-a[/?"DmDހB8F@B8F c$B8F c &5~ʙ[Zs+=GkS%*o-r 6'(r'm b<\lL_)+p:a0_ca5=V)JHƤ{|o1'/{gޏ!r%C"_ʔg}y jߚ9))2#P|KZS1 ܡ.n1A: ܛ X[K%,\йLg#)` >0Dg}0o9[}}Bt QN;NXfY :'D o 5Įf/ԓLs=8G.u_0Ec4Zt!#;|,b) Vb}x^`$<*0V|.&?%T :Dk;w)Ϳx@Zϟ46`H{`J{_?\,p|(z] -I1ZprnJ]o!Ehq ΁[ +OJߠiy?agg 1Pݿ%hY~`xh[g/L\s|S%!97OAПV%p~ۈ&CK<n/(DεOf-/|ȵFx޳ṇ%xc[& K1P.oB@p܁p@nj}w-)y.K1co5qss>c+7>֞x'Ww?{\gIQ[fnѵef v Hw8/Mk4%->S4~Lg]sasM?T 0#!WYsmKƾKc80\,߽icM̙ Nnā;,lOvgG \`tޛ|IkLcxcS9܈MQeÚN+{{m~KGN]%?5`) S"uOL\cὶ H\5jǫe,5xp5*! 봒w 7}g*2~Z/qrTR`-|xX,ea^О]V҇~r)ï9Swc?gG]ZFTjϴZ0 98!*Pq-UE)(R/o5Ҋu.Ks3L1_38;7tɖtm,sO"WKwm`3?rl0DbڣΝ}e}v0jݔ@*NӮM2)Kʗ,?)WnhR#^N eYz񵌵1>%WRɲtݹ1r=#7ҵoxNc|99]DI۩/`{-惟sJ6 O-~u"!P}]>qnwaq.>;0Vx kY>yDk%ưxM+`?_ϯ-Ol=ïesǥ[/clѽ~Vs 1s#ySA>.q3kQOq'e B>h}gϯK֖Kp0}><>ڥ)42"S'Nfbܸ;o+h@Yt }itKڧeY8u v7W_\!@3!ᘜW3Hn6~+G ^ꇝRt>^?Cnk[s] [fQ)%Ŷ˶;cG0$HZYY&NY9rVCeyc×KAρX}k[ Js>%+rYFMc7 .[q ?jI:$a0ƒ.}K-̬6!#Sc%;U|rek-H[ӂY8a$۞t ?fMXqGoϨ t]8xDl5G FL;tٙhEÐ3espC_Z\^CGLd&On Y3閻6nĵd1? Ʃƭka?na֡KO`rҲ-?]?z t=Fo:b 0CR'qzn{ [8 \GX놾הVЭcu5XL]M,K9:sLmSḳe&c8 pܶ[x-l݋9g M:N`Rc7 h{XyHpb0:B-׿r=.!JD/[s糶Kg&[6![7 yƑ^E9ܦZQQjؕׯMĻ\w8\pX'-φWW O>m.bM0`*FpfB8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F c$B8F cUrEIENDB`gltron-0.70/art/default/xenotron.0.png0000644000076400001440000003116607313120370013363 PNG  IHDR+ugAMA|Q cHRMz%u0`:o2IDATxb?@bdha laaa CGfH_jJ ^C r@ A_j@Dz#; K/, `p8~$`b䱩Gփ.or, 'pR;p @XKq@ xЀ; $5$RPCKD/)A@s84 qLl Xkx{/π @Qм)yx0hg@$01b7jd13Iߤ!4@ _A~d@ʒ47T~H J'V?szHf2Ј4 /@JyΡ0 l .-w'~\r F|)aہ!E @D0>=Q\a΂h#Ѐ;`1@ مy蚀Pt h\r !& GFc3.A wAvR;Da rK'( [[ca[b"l)  r; a@QӼ!@@vÀP;=@    @@ x? G* y6.gdddBB,;ܥw5%mD9 pj@ Pu|R=С$NwrW:a !9t5 Q$xS"g`[y lDSj>!P9P8$-?܆X.O4WAFQ':OpK!F~<@F@    @@ ql5,MÃ\3 (QO?6=D!ARWVO1,OTNi?- g@yj`KAl lr#   @@vÀPE _` E@Q34'&`@6(h04nP h7 (@a\B&y|qt -§r"؝D:<]Z'  |n0t~GWa.i$$]_Pv1@G%@lrǖ) !yX̣]@`b$cp 4w(X @Q< \؄҃9n%`;(}01R Mjhs1@ @ G>v T&ǵz= _|,Nho3>a ` $,䜌n1f').30A-T$]G(bz+x@#-X؏` @6X0B,hh4PK3E֋ TV`JI9r?3}DGRp#\v4@/a ]@Ga[%I@:ei|"/#/5'~Ed! `%"HTO0@`jI"A\~&~pfa ~(Ib';g+;vk?J*@R3_iP` F#@& ` F@ `X q7t\E09lZXaA6mau~lP U'z` .MhOP{nr)qOIg,AR?9 [Q#IOaoI1@L[Ex,Dͣ|c$tK؏k]T06I޿K4h4PK4F(%M#@n 9?"],t.r5Z [ިšz7 ft/0ĂA(Gc3R7" Zl @a$b HIHgbr 0c]:>5u:}0Q|~ {ءX'2`|\*I 'Z &X}O f3Hh8DJ\zF ?m= !5 F,Ȃ%be` 00D^ o9#lH9 Y/vS0@T7&z  hb9;[@j7Pd@'|9@e @N4n@ [F@Q09@e @N4n@ [F@Q09NE Q2O35&~Blga? b)NEncY~N6q0/!3'dU|@ccُ]X0D '|׾ ~qc§(Rs d6j&*RS+&r#'k01ӠzqEj*Ws)U@x;~qh`):QP,nz5ZՂ A3[uqz`v_D(Ur JlbLĚI â**i%<V6A" %k?I:/0@t()8ZX[$A8Z8R~Ulbȑ~t&1l:p~0hz@g Qh2  'h -`rv(h2  'h -`r dB|4EڏǓ4؂~&)jĄ̂f(ɓ0G҃m2~lx>4FX$G蘔C2`KII)ĘY r blc٤x )@6y@$o6XL&QͿpp1@d(k8 l Y H'T J,E6O@&W* p:,d3zD0&1G G`RV.>bEJ#^hC7I[˝л`HvOO~"_# ؍+-ir Ra@ [F@Q09@e @N4n@ [F@Q09@e @NDxb,7+őTDP0F19?R |v`'Ƴq`Šr";H : .=alEЀO3\7b?5gAVd1 +À!C:R8b%U 6K?BOa5A|<#^U;Fw*+c XEb(ٴ(0JySHy~l#Pd?1 .cC W%̈́KZ"q~lj݅5pkz>ۙC$91F0 -`rv(h2  'h -`rv(h2  '}''&@zqH΀'5Cd֑9"#;{W`åd&Z1Bt.@ *O͡,QG c!'Z'u2ةgbR)cH0lMrZэQԀ"0pb\F = %y%;߈X~\#{{{{ 'xb< k?&@9؏"&Pk=!\GJ V*I8ZU pS@Dxz1+I'H=+u:@g #h2  'h -`rv(h2  'h -`r F@cɸ#`ˆB.=tb~R㉱Rb?h= ΡT cw*6SOb  (ߎrGn`B *~lfn!H؊|,1@̃ċEVĨ#4Nj@z<搥?؏ 'B⑇h0Ѐ;`,w(X @QmূGm'8zC:cD?Z Dv@=D ]vX ѥ52q1ZDr@ڛNK0ЉͱC'u)1m |3 S&)\~D [@C$rD#߸"S-b+lr`{~4ZPh.5;1n[CT6Ā6P-`( 4 hvbهe'".[@C@{:8`3@?Ѐ@ `. F Q0 FVh0 F -F(![@(#`+h`l@``Dv"ZDd\3FeP죢XoAtC@+&~#]oJL\!%ab+ u:S _D+@2Is7@%L) Kd@5bt?G(u,@Ur'9Bjwp'' Hq@Z^MDZ%8^c+9RPR ηViJkf#ˣ4!.)McŕDُx~|m ~\+|]1\+"ك9.H \Zր,h@>R_hh(yaR~Z  K@$Ȇ f6:bJ@0 ]E2.Q-PZ?zc+ H,@<&]w. Ecc#0 K?6z# BvAp 4Q-COC@#ͧYVA@:?]Pw`K@ F(![@(#`+h`l@``4ZQ0B F Q0 FVh0 F B)ph" }z2Ct" (؏M&d:@[9kVB1-sbNdat񕴼4P:bBf`+Li?>N ~x:Ol&5#o>u*{jq( ;c?F:e~VF( @4 $Aet3p[;z+W\DW/ ]@lӞ@w,Gf "Ej@dnGBG x???bc+' ?ƛ1O @6 %k|58+Կ@0o޼9? ~4 *?Z 9N\M}- BBBjMb+hvPxFhSY햠&?$eFZvf/0@?4L@ $҄<K2e7 F2х@``4ZQ0B F Q0 FVh0 F -F(![@(#`+h`l@;\e'%ﱘIjDn%=L"jHRƒh6MRpLY-\0‘cыnpa)]UE_!?<DHHII}&d?=aZ *B:oK@4J!HYpt9G@%E{|Qyj?`[@dЌMc%l k>:b(݌~&.` 3j$F%1]! ': H.@M$\G b!R7ߐr   zqGv8L -4@v&@@,G\ @$HMF 8l28 ~Gɼ꒠ۏd4I l.{q68@AEjSX@<JJdx a0ُO? FQ0B F Q0 FVh0 F -F(![@(#`+h`l@``R"fڪ' D맦a;AZWF! jo%rQ 'J" g8a-aIDU| ,6Qw# p5`]JͤyPW _toU@r"#X u&0ZvTjG+0X9AO7`i7c`vJ3 \[x(I-V"ҺVh|B{Ԙ'&@Ozxer\a SCW rMt+lt \SlRr@r,@aţx @QCMj/ )Jގ /\i4yXUM C􋾀eړ4{<ʧ<£@; +/RAsyyE-O)aCAKި g]9 >m ,xګZuX9loΉ{9m=Tk.kn_ZäMe]CwŰxÓgh" ,^k8U:CZFj$!_}ђܐنZ= +8/Rx777?Kχ}>8rUɅ秥G\6" ;Yt{ bO?ez\S\W=IੇSrB)RϞ=;ԅמ=nK) )TB{6S;(Xl/!2P`|cm_$Sr~'z><ůRrh!_| k=xiYK V7x@˜%v/󗗗3'[75SNpy.΍:zTK\vwAT¨ϻ/3ϳ1Z`iG7u"ٷrO.!3%bW|i#!Q  6GkY<z>Yy)}:c2y Z C׋,NY(Fޛ-GF.q_>进Z\x[{=;'2]+C ۔+,o9x Z j龯0-6U_޽{/9>Ol8;[n,>}d)jˆ}ޅچs-fKGFK.I[Zs @{ß SKsq0=?2ݖ)yA_wE\G"MyMYs׊ ϡad7jNݢ @FMdl%-Go9dBC n[d| LJJ" ;2@lHS׫8[=ߟ%߷o޼oIy`|m>zO͇9c|E>gL-Qs#'tV A?d+/Ԗ<(n[ICcoNIlH\;fo8m~h+ g^H%~K%BTOHQ+WSh5QyQ^V8O-՗@5R)YqBc0]7|@F5^ GT2@t,f\?@W6-Ϸ)ʲCx_|Z􏣡Xdw=XcLcѩ}Oh"hЋC_kQpc"o c9Ek䓶#>7`u~=ȧt>+?wd c{q01`w^)۔OѨ6+XkDb -MҶdLvrWW;ȾBe%y[}ڈKfJP`W5/VJo55?^k]=6_ˬ%rX-o=sƶXؕj'{!SzL-LM?@=vu`IKkM{bznooʈ֊?x`G$15/,H^ axֽWJNޮ~dd|oh~`%@ɠ8g`O~UV3 !g(==N#{KЍRĝ};ۜ>& Kƌ@!j3 MEPRv9 بx+[H񛱿F?e[16Jޡ{f> ؘVUBʻ"P$WT[]]47kᒓJȏ|Kyϻٜ~| 77}533T[k;f}HZxhZ71*3v>?ѣQgSbrE)So+-S} XIk>u2g *3}o POExrc䬇ydS] -'Z0{`G~s1ˮК|||Ru=U@˖?CI>(V1V I'.'a>9Ye͛tӟO;fOsocG6RWz4=~|||X,{ըVBDgsl0w?J<H?$]#yqG6zޜ-roX|]b Ě=.gsFh%c,d|>ہa}O2@ثOyh^־-+2ݒߊҿm#Ą_pWIMNWrMwZ"|.\k}Y޸fƘ{4-ux *_c[ୌ j<~!kݛ"Xw )(Iu)*HZV:|򴻼L/Fo{==ϟ?ɡW Y?/Z]l)p ewGF,O/nԽL)<{ ?eNk/P#5:SyW2^SX.m[P)/4ǓMyuz~%YS9Ή%wүnRW1o kӤpiL֟|05X~ILZ#ƕcYH 1W3D`BFv5En4;Cg[GStknBwB]fYFεԫmĻjka߾}}SWt׿.ߙ=/DQY<|gggo:@NNN^lKwZhJnq\п21֠oRu3NݐѼ9SS?ٍ"}?u2"&f/7Hu4\Y,u)هPzZ]:KHHk˘GRJ 5U>jq1W?0ZjXP3Qe_ڨdhdL uyϤiُ[ǭyZPj؏?J;[~G7Y]_oSvfE+lK6%&xVa >^#%WԯujC`_:R뱺{Pj *@7!I{Al@v%.CiϹ^5XDZՅՕ: ] Do|zAOSq)ǖb|;8 m]{8r8g̚w}6G튖.{ PkCyKn.#=~D?/_2I02=z%]hÓ]l'm-$VeWN[+v}>|a4qH^7)L+u@wǿ'vS2qmjdetJWI?X:IAtL5P-뿙:3{3ÎŐ:<Q~kV\H*MS\.USY^Ya(?Vab!$@ CL&Zw!K? zIMg5]\\Ӷ|.Hb4~H~Wff34㶋 >==5X"zvxmpC1ϕBC̒d " EQ P3&"$6hTܘö($ēໄ撗5q)!GD D&<;?&f @̕1d] aŰ"SEx-2 CX,hȫSJY-J+Jf.yEQPNӪ(*s}||!SDxyu VUHD!!«[\ڕ_(l?snUx%?LɉNRʓR^/XVE""?u 1BcrFQc*!DCk%3/d̜-Bk]TUUq\N&}rrxcD)@k SJ (""o{B#^ !1fXlAD1ƒO )3۶ [,EUU<ˣ#v&@y<#f"hJ1f('F:'(fVB `f#ODeBƘ"ZRJכ+k1 3?XPyiR( ^YC"SJ1#{3GuNx̬HfJ fdƘ@bR3{DakXl.YOB}ZXar<y:rV["%@k%, 0Ƙ)e13hHD}fa}7B%jي@D+->37iBpYɲ(;E@s ,AMpT>c{<PywkE5Q{#"En&R6tEz\|nF+D3!37Y4yXopzB=cL,hbf00:Fno |:ifH :l1*"VU$~=%dY֗Rژ?PJd9$B1-"цC gc'fBTUIgZ$MUpgu#l6SiB"ZotƘ&=B'a9]cSX~=vT5yAD !4Mlfj @8>>TY`0R}c|@DD Ɲ=lo~׵.qcTR.}/}߯ʲA|{{'f/.. Qe9 3 !} &=wŻ}WِDdJ9֛ѭ1憈|dfy,Mj:==ը :==%B}{ m,|S^fkmtq=@sؐQDmS#C~WBy}cՌo$@@Z;]!]܄h6|fB+f7+fhGQ7{& N&@I"[A<~}qWMJ wxDc+:$"$@5W랞 *O)e3>iG kԆ!o `sB1fID"SJAT&B̪iSJ D~ ?xA늰m+w &AFD_&Bf+f5|*KܽL N p+`fiqG3o'<8v!HcwN5q (M`Tsj8Zlv q(e'ל[)RB_j`w[S鲏0Ơ*H[0C))%104C9|+\D󠔂Ms2L&899A$<a_(vN }߆k+3C);;C$x%8n\ 7rݬSq61"k ( DQֹ]f3cyuC"j[] ;GY30llo !8L9c6<a"䬫<yc2ls_="9 hhMZaCkpYPcKJ)E0 lx(Hj J)a'btKŢ﮼*f3y&< HeY"Ih}K핷m5$AYHAۻGjH1Es^!ᰉk[Jj ðy&Ic0$<7o޼ٺ̘f`f$Ifbh|>l6ǩW^m[{̌> ?~->}fƗ/_03>}[|WWW޽۷o7ƶspZYQw7Ļ^4|RaIENDB`gltron-0.70/art/default/Makefile.am0000644000076400001440000000065107600700375012702 dist_pkgdata_DATA = artpack.lua babbage.0.png babbage.1.png gltron.png \ gltron_bitmap.png gltron_floor.png gltron_logo.png \ gltron_trail.png gltron_traildecal.png gltron_wall_1.png \ gltron_wall_2.png gltron_wall_3.png gltron_wall_4.png skybox0.png skybox1.png \ skybox2.png skybox3.png skybox4.png skybox5.png test.bitmap.png \ xenotron.0.png xenotron.1.png gltron_impact.png pkgdatadir = @datadir@/@PACKAGE@/art/default gltron-0.70/art/default/Makefile.in0000644000076400001440000001400407767023243012716 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ pkgdatadir = @datadir@/@PACKAGE@/art/default dist_pkgdata_DATA = artpack.lua babbage.0.png babbage.1.png gltron.png \ gltron_bitmap.png gltron_floor.png gltron_logo.png \ gltron_trail.png gltron_traildecal.png gltron_wall_1.png \ gltron_wall_2.png gltron_wall_3.png gltron_wall_4.png skybox0.png skybox1.png \ skybox2.png skybox3.png skybox4.png skybox5.png test.bitmap.png \ xenotron.0.png xenotron.1.png gltron_impact.png subdir = art/default mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = DATA = $(dist_pkgdata_DATA) DIST_COMMON = $(dist_pkgdata_DATA) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign art/default/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: install-dist_pkgdataDATA: $(dist_pkgdata_DATA) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f"; \ $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f; \ done uninstall-dist_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " rm -f $(DESTDIR)$(pkgdatadir)/$$f"; \ rm -f $(DESTDIR)$(pkgdatadir)/$$f; \ done tags: TAGS TAGS: DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-dist_pkgdataDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-dist_pkgdataDATA uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am info info-am install \ install-am install-data install-data-am \ install-dist_pkgdataDATA install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ uninstall uninstall-am uninstall-dist_pkgdataDATA \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/data/0000777000076400001440000000000007767023550007436 5gltron-0.70/data/babbage.ftx0000644000076400001440000000006407065453753011443 2 256 32 32 126 babbage babbage.0.png babbage.1.png gltron-0.70/data/fonts.txt0000644000076400001440000000004507067762153011245 menu: babbage.ftx game: xenotron.ftx gltron-0.70/data/game_crash.ogg0000644000076400001440000010375207427244142012144 OggScbvorbis"VOggS1j 0Svorbis Xiphophorus libVorbis I 20010813vorbis%BCV@ ZkrBZk%Z[ZkZkZkАU! UQɜZkDdI Zk蠥ZLZkZkc 4dc1dRH!R1tQGvqh!Z-sι Y$8dX2$CS4T4]UBCV@ DQEQEQE<<<<<<BCV (!  ǐI$M,АUcH&Yiiiiiiie!CR@h*D9HANJH)  )Z[N1iZk-J5ZkZkc 2B+ 3JJ1Stb(1c%b-!b1B@h*@(HXei牪jiii& 1dQ!(c9Yfiiiiiii(!PqАU@(")9$Z@h*@MM4M4M4M4M4M4M4ͲАU@(8@h* @C1Œ,IDɳD 4d (9cihiiiifYeY@hJ cJCILxfb#/g{G+3#/+!KE zK=v^y{U!+2:M Dy<9v^yyo;GP{/Cd=uXIm{dz2 D8Y@BDFHJ@OggS"xs*dOHd[S~V~n̑u{?3;IǰX&\P 6M]@5{$R}+ThMϺΑQ3WtȲ b5lo9]DX秄d!<ׄ1O>LՑ<40Q&"evfK}lCi4m-b{,O]Oodczcwhu-=<҇=I{9'&)>OV4,6\Ǚ$ '{tJ- Xm:>̟Cd'u}J%m=uVL̰j0ְxDgmfdhVSUW[5"x>jL}=ЦG6,)p5# 8:q `0-nQ{XDӂbXMPVR%dK!ıUW ܤp4GvuLߺ^B:tg/.d P0yTἐ4~&ovqI=&Tbdϰ@ դl.)1sL2R& ]U>;%s*_nfw'tΎcV>'1,UJL9o;ҩw @^v/a?;\tQM3Q'3GYv_+a7ٷb^ aaznwQ iKe%Y! ji(xQQ!u8`;iژsQ+˸LInZ[4(aZD3[@vJYk,Ol ܕSjmdYNxU^X ETJ/"®3%)k+̇PZR=bɲtw.p:|7:6[o<5k6Br\ i1,;c˂I>= Tq ] #YsWwqiǏ|gnwHwĞ{+5Bs|d?OW#yяwM&-9KZ&/`mLϚXEޯC[!fz@Ig흅4X&.=`hLJގz4"lWPC! {;jȨbzr $I왪E_-g+Vӌ#i{?yE%=Pja80=֒k7WiZvvVhnYjNٝr *bZX,k5:O XP14MJ2[뒧 8Hb0L|xն^Zeq/.1㟟6'.kXp ^Bp<̕zY.of&_٘Gd12qYg[q:5-KmmEv@L%!TM 'ƙ@MĈU_uqQv߬2a\煾ւ]ܤ5UQ.ݖd^0_hW6u\`A O5)0x>vеBndBc1i尸iX-1'#Xb3qbö=M> ף<^di1869)d`sެ^0G  ݤ0-8 XZ`Ђak"fKZTE wwE"*jClttituD&b gVgž`fГ»_ S-lΜnr1ej&g?ĮTt6Z-V: 6oh#}0u1u CXFsܔWeB=DO0SJ7 {ֻ68ݏҟITM '*Fjo%o>"6*3D8ӣK<t),ajV.xcKO>?T=69Θ$+UZoy.y7j:uy<sTPrԁ;F[.eڷ@%`mEÆG7lk$`˗\ Aʟ%adc>餸6?u'OtH9}P@> ]LUcD]7>ȷ9IV6rֽ\}66 ۜٗdya]CItu9Qh~ʯorİiUve~mCuݸ]K>Pv$&.e$s߼N xN:Bm@t4l16PT@l+,P:D+c&Mc zx&Zqm= eDPTSQ-At3Dr!nȫuD*@U & " @yH4es=w#|;tkG3neOz|_xw\WI"Ϟ}|x]EF:۽qGJZ$/*W=q l<[) S9r` r!T;}Z^3ϨlGɓn<+))V1{_v*}]O .e>OV.7{z%؛4摙WO좿~1^'F9uj7+Wg-J""XNv~i70-6*X@$5Ef)ؤ,B0iMЦ]J |vOJy0 Gm0**X@@Ģ *b ;7B=4;_T|"VDm>L VA`ӱ^V[xyd\~k,_H]\2?蒽idwϙۇs w^/;DU)~r9WhRD.+(&W5–F = %ij Y .sӎ"^V16Xږ~|{":dؒ'S @[mv_梩[:Z} Q<_KV[fLxΥݼ}] ,XpgyKuM[Ͽgݶ~YFŒт9: ݶ[XKm;A ko0h ߠ$ {SyqJ1zR  t1"ڠP0"k8Bq)ӷRSQQ[D&()WgVd]- :( **(VD> E( QuNn'iٷ_,-U㵁S EOZ20vI|u$i_8Iɱ$P0ŀqMQdqFr& PX>k`8I$Zd뱁0+zh.N=]znCuٶR 0^;`B~1>_87ۿkT84F+n3*_2b `߇Q `?~G%a@"/M8:" j%7Lvs66Нҭbij*@l0n08SNYsڡf^Gl}JݩWtgց7BXڼs//oTs6U2u\ mtm^zJ2Lb= _>h뜇*׵zcb8,h OggSH+#(JCFIGCHͦR³];/%~z5Ba ^:H33N͍MLo^Gk^ʐIeLc{b+;+#4s \vzA8۽S_߿踓\l2q6ǹCĵt=o18g`Rmp8I2 9@Gf񨱈ބ*T8](eDna'\kDks}RzMD ]54]"JLSru{zO`}}՚w..]қ)kCϣҙ.2D&,Ä^f_Z yg֪Wmv/wy0yšw I??<Gw3H&=@5P`Pkt/;< S.ߋٺ8[^-iHfBQPЫG[YKt)X*-;YTo oSm1DTTբ( jػQJvb1@n)$b'xQ:=isXrp=6ȱ}pOVT023F2ߙM/K]膓 ; 7z_T9):Q_u+(d~ gcL㟯Yڸ $90"XɌ,^2n5[ަ,mq;<ۘEQX.s"+rs' ssMzrXq 'z z_kasWLy0qh` ^}oөߢ8VhON{HC$/.QtM3~ <*$cF=*8CB;|x` g8k]fyreOI @+JJLU Zv4Y#^^AVHsR.K(k8HZcKʓ⸟g[k(E; ޞ[c{~v}tܰD3+?Kʰ60|NkE$//ěV%@Y{I`c*w[;CN3um_ z[W=_cVߞ&lD ݯmm5C d$Vv%jgnǯF/W-˂1]:q$T{}+1qLoqg&\8~P>S&e뵟c?ۂ=l8 FKF51z@2/-QK72\^RiFEN8[a!Byk!"WHl; N"5̊nZi;2%8QC\ ?,Аhc֗| *<A0@dӣECZz5_n EH"^:6\+2&isS9C~\v6Ӆ.>(;]ⱎ[Νv=sC{>Zīq ;}%eNdi^ȎZ욏 [s0y5J҄'/hU`D h\KK A`iqcD{~}NƉU#ntzvދm2 n?1&^s*[O^U))R (\&\=\m*1u^[w/8pLۆg5 L٘^c#t8p`cU& X,/M3VM YF ܛ T*QJeޝ {hdQ3M_OjIND2ҏӨb ’g|ծKLqo^;2*MĭY=g$lDy-}s|a'y\Ƹ!}__1u771{naZ{c%j>@e_=Moeg&pc5+C˜_PiKVjH>\\r`eM~fC"/[1vźfGDy޼ gor]_N˻qZ_bfZs]g6gǒ'wjε9.±&L:C_#O6v~KyYkyNdsr\I9o^~{3-yE]5QDgAAY50hݕVR``;!$/o_D P=* p?-Yg+)ynVÝ[**mZŵ}Lv (R/s zy򢌘BY)~4ҍbDlt3D+sܣ7,h4QDQ`<}5ݗ9N_!e^y-4GtkÏqO4]kَbZ$= 0LDT.EV]bjzzF.~.rpnfO?/;y͖'~>m]reQ2Nx)L_yʾ%+va߭:?'[z`׶^;ӓGSnng3(SEiY^O_:HB5~~0̾PFi!WmhiRSKn0иۏfٿ@ }/X䜿7Upatoﱮqvjx IfYͮWUqT1;EY:.t{~˾+|iv O'4tô=9lie=a0}3ˊ8Wc=xwxX]'_Q=5}.6 {e:;#>7a|`97*XA~ o/YXkXdls5GH(VрiZL7<|obb+ LD`W(A>E^W{Z11#?- mH%w%:a54UVP0ai7!jњ(V8=jd }췈<SF%NGOyeǠ2:Q|^I5h^ϾfOyռ✱O|s+Plp+7$~A(\ݘEز^Q(9$AD,LQ>+McǞͯʕ'qΒwtzxfAwOBHWc<8g}9o?3u<7=갎eF{Na^sNG/nXcN&Ս<DŽ 47 ч$o~ yk ZHYyW,IFw5 iCM0Zݒ{F3sPM6cR@E<<9G%߂5ӢZԄK-eLGm 50O1Ī`|W~:=qޑU?+/o?xGܤ.ndmڗٶ-g/_iܵc\W&tLq궺[,:ar@?0;IVИSL(2M4ېu,qTY4T <~$dDràFvCFCf/7_w'F:lY<~yy.Ų :A'QRvĜ3lpc&nmg,k|-c3?iUlmX -{d97$ 6[Ik>LA.F[ L!$}|#XPEPQ%F\J."EԢayiUU @( vڙwAPT "(BKZyo"|ԖHOfq!OAVS^w{Ƶ}W9(` J)F_UY4ʃ[,lif`_;ޤu5U^hNG DmBF7H>ds <,ʄbH.2m9\^bҵHqgndz[֩$8,wruQsG Dx 9SEFƝ[]عD1[s?ӯT\z6Qem>X*svFs}nOSz^Ӧoך^0̏1km̝}e\k*rzô@+yӴ{M|a=nެ!m; ?G?ӗ}]?'Xp_YbX־kSV ^QQǴ*'Qe:bC6iZ"4P[bjlVcE+PG EFTpkX 53r}7VCE=DE \ilJ)m) jҐ6hu@@bA1 LmA0,ATt`݁W:0;3 S7zfHUW+BC::km@y ߓ츆#DsTe-O,:V{]=|bю?>S؜lG&YSC$j0 4mi,Anf)} /^s<]sVwoobu~yYwՇb酰@~p`oYp<[6|0{N׏&ko-Ǩsa:)`ZacV1D!y*yOʝη]+!AG{C=$V&8#n,4 %)0ha"*EjAQ*}s #w `Z5ޞj:ٻSs \ђAeiwӜ_1c=CpNGwLipcY?U)ݱXD FWZ3p=/cN~?<>V=G' ?ݔqxp̋pqޫ7uF=y s6xo3ަOtAlǓK=|}gPpLbs^w YqT[j| nX#$hT؉pF~Ob`#3=9 [t ()!bsELj T4`zz G9מ* UaQiFI-٪9^]XHEBDQ+b`Q6_W "XTTP"* XS0֞Y{~|`:{XZ*/PߞsUO e1]+/',e/U[ٔaֈX|ȧe 8XcXkRo2}4mnf;<'9zTJs zV$Ѽ!nd-iqFvW/~x>c=f|?_g/&}߾gS_ńz~LQ?5w"mS^\,a{|Zdm.?'kԷwOc_Z dA[ԧpb5zLD P^CB/X1__DTTgHO5H+?Y*_ u:پ,KHϋ]}GWM}y*<7th3XDH5o1Z _[ڽÚ:[r;횸(7CSq4Q4OBgbYn #"|,#GcwlCo8PAFb>lbDywo|LՐ)rwzHYSm-+1ΒQL&˙~=`]ܙp9i^zAf"9w$ωt"iX,@?mZ痌qJPNWS\@;~cPԤwQHrܢ 9䇗v1ܔwϷl=L\C KNWq:ޙ$YOm)gEn .%^Mgn3n%bW#^8AxD}4պIQfrow[|Q~&(.1iTn+ GF&#[aqrOˇ/}ZK>+v?~Y2L&~4νjэ_Nt*g.ir5r5Hߦ ߦ1m{џ=9}LE.NJ }0z|k=g~-{bR@-m)b*J'uÜBc3LU04,iڀ@rjb:UĊ!*v)bTg7v @s sR)6.5"i1-Q{\2ij[gNݩA' 0L5T6SUC*F[JoaœAvaFv*:z{&0n~k$#^2#640,L=u/ǥG$(ѯk}*Qŀ1ď] p-,7>፻VUH>аuo_>b29Y}f};.]WUQ1U]tVr6g3#@;ClCfnNYx[bX`:,mu117ӻӖY_ߝè_ւF~3:/3׹q/k/kyӴQb NFsMb pl)l-HZ!7WwŶf82_<88O ~;Ưaws0ʑH-> ?ԷX(m #-yM 1p~_;e)X5X!sf=0֐Gę'w&U5:Q05 hx3/?mFjG7)Ä6|WLt*$әԤ>Es ?e䪽c3ҍiѼz##&DX40dX&O}^/k}<\{K>{Wޠ۶p;kŽIX5<;ژNbH*5-kKږ8+~gUzyՓp~9z O?`ϴ@ÐzhXMk(P7˽2GaI+paOIc2b%ƈ'Zγȃ1p0C RC̐neNbSOGM0Qw#4Clĕ j5U@,Dإ U>)+ʖJkј=XD*3D,)b*@?L׭bj-uJWO}^NQvf;_ W-;>LtTJ~3/ZS[5-ߦC `zxe emk-(t;pw⫭W*ټG?8̉'k!77!?)vjE*(O a~ےKfH~ÎA}t7y̟}݌~{ᝩ~Zg߻ӻY,`3^5}3v  L0'~"lk{|MO1E_wVp |L(M\ho\|c%F|{nӴ&k]V1ce0J#^8nsOMϤr;mWnw+-11OW=z)]v_Bg*?z viد2375ewNPho?\qxdXw^U!-P]Tw͠pK:L;KLg<,K#9B)7?'8\o>>g&q(xSS`` j]ҟy}n Κ0{W=ֿkLYـaǝc7/Fr}۟^GU5d;#_/bAㆶv300Y0De354I̴m=,5_v Iݼv ؅EFz]]z]PLn=+ISm5[+N5TCPAJG2r?Q*YV"b*nsQ2ݎ~욠Up v|c`cvTltXwӹSc݆|4j+閭Ͽ`YqNz18H=o%[:?a $y|I @7Օyp\SwpNI $,-,E8/㹟3v{dRq`,9Zs1 ^V&oXDjrVeJkС`$'1g>2kEd?|.%zMK&E' 0<C=h)`zbՙwr¯ȱ3>SBN vXZ&K!Rgiy =Z+pqQp3DZb_aCĵLf" ks~{7ݶLeԝ/peYu݈Y &Șaճ<љ_rrˏl#҉ 2 ۖsuJ}G5O:>,WhY RF:x|,v9ca{}7;B~9A Wn1B\v0OggS JLHJEEHDIGJNHIIJGJLH }f|_xp[2qw0vÊ/o91Tӛk"yF>Ru!Ss r3/.3#]xAW _qmL碁 .|Jt}~):6O 8|?ݹyVۡEŸ\pY7tpBrpܔ{5Y{"%=st3$kzq뱙$+n@;]t wQ}OƐ-}w6a\qƃ9wM_>qݳ;9֐`Cȭ[⮬THfxuInwa4_(;+saĭeH*̙׳}|wK.ʞnjW:hZ0:R3\7Lʏw+! @ߕ\?l;Lc!ʋeU_LF7C0Űdߓtla ajz'Ly}?7ŏcŤ#O洩 ~Sn|| -wjhEa0gYU'އ}}n@ÊKȠk-{[HomV~Cpb-5EŁ#ᲁ3?>=.{l:WSg al|,bQ O [4Үқrt$&M9`9s|~CP%S^4_>Ԋu5"LeV{yIoYH!hd($g~~8]{۽_PCϲ06#xUBVU`] 8A&9*g]~:'1fۯDK3pń~DDiXA*{T23Rq&Vr`G(uerqq:>XM @\uMj#WnZ/=Q]a_粘RrqQ?Բ"aML[ݼ919?~M[cU۟n:Ɩ&w&GׯE] \.ڹm{HJ[^c?^K"v`>PrD6c:T:}h݃~ Wǝa{yf\skM pیgL⦁@+qIoa*E)(=8g|au!İ˥zSYmTD khN[ vf*\< GS^Q<: uŠ@0LC U Ў;TC=Zb<^ C\ <\q=ݓ/\{`eyӻSȽUaDq),cٍobq6ճn|I#(e}}'KZ_/\p+&P5ج 1󶩙t88s?/7ɓ,F閵LVe?ce֤qO> )SUlwWyvYc9\=w bqGQIs Z=ڥM]wCQ[='Fq3Qzo]8y|} p 0L#W^x ?ʺN\1Re @Y)vMӜ9W˗qƝ\|-nՂpwt|X 0 ѠKJ--qc,(XDzAh\4jGk?-gI>2vm]HEGCNd2ѯncҎu$*%ǞuOnو~t%5Ma>Ln}Ԫ8|qN`tb#HjYQsM}Im)K(UhS5 ֩ O !NceKR/1wHA*BRms}X6ĢVEr{ygZX0U@PP̣4eU9,炝v=MS<=S~)54=nn}:kt>s-HʈOWx߳K#VEʼ2].W&JwL}>p< %SYvfΨn_O]|oP^rDGa vA<1{/yr<ZsX>ZV]:,cUuQX$>ߣ#n.+fVOԜ7及a\̸j\Ufx͓֬}y'x>"{nsn{;Z{zڎm؀[aHܕF#j5dڸhC0adq&餁!,' xH&YƠݪjv nH 65~2e:srHJo=+&LwټS_KUZ[3_Y54)Ho- ZUU92{)b YwB~:c{r~>5.nBᇹ~U7=!=nUDs!?ϏcTFPQ? ]DZEq~>yk]{]lO^rkSa-bϐ^5qyܿw~}^oy<1>>eޔ>6LK=_Bll6h 4FZΉ+d-9SiF#wv;|SކˬL`ً5wu)6&;Tus,i5[A R^jcdDL or*&5yiՌ8u$Z4dgwHcU H$7Wi*SĊ)W(~TdDDUMU"""T>JZΪܬݧSRumD~aΐ=k V=xw9N+ST3yѵ^v¼#[G-4ԶȄsU}#\~1aZ5$ٕ}vխNj>nIr4R%U@&h9y͓%_J5b$])֙frskλ.|lݦ)~_Ob5sS.q][L<*.y0Lq"&V"Ww$R=(J!`naE4 ESA;=VS$ TѴeer("&XqQth|Bx݅5PQRjģGۥ^;?#Q?>{G{BHRҥ5*zVG[ek.:6J;~쉗Qf,p6]RrCfwҴ;?*Ӌa⻏0?yo%3el< wgk,ySQkWSNoOggS3^cPAQaj# / ^r#.~:S_.r 9ÛS3y^S35>y)}}ô{Z ; }zmjg=yǚ&W+w=K#îj]|+;.-CKp; +Gg h"E0eX\MM'5r,E9%Uܑ:f8ЇI>>GcW)*o'ΚcSe?9 !@@ UCD5TE빉Fc<ǟ5(USfbU2})Yqߒ} OKrOQ:25weo1,;]Zlj}2afy.;e=9>Tǀc~¨M؀z~#mU5w?>E%C nWҬ!Ccg/0ٮ \ހp<`=㾋w tnw߅?.ce2?yc]=goQOzE&ݖtw^L\<~[\<9|')Wt0BMuq}¹2ux$rQIaJ>W+dgl_׽?:?zYn,a]w7k-/3.br.?ghDdqLg[wFt(?lD ooI>>Vv ,((]n-PZTTZ԰8x 4e(R@L pSUôzAFD༲zĊG5,.xaD"?eVaO٦fc_I읦NgOn K^}y5l~^ؓ,*kM9yԟ[6<jl)dk"rp$7(Qm.KxߟNimwU<>d.V~gɥޛxEHKO~w64٩}kZ~ů4UN4v9"PhsZ}!i1-gAy>;Xފrrβٕ;22Qn}"䗘^~ OE#ieu6V`f^ VVbi'[|W+CS QvyG#6oAn`]pC<~!?nGwDl:~ >cgKYu_Jv?u/;IțT\L#zJrHY%OdA}'x`}ImX';]Y甏®~sm.Ns(1]@R LY&oo|Rմ-}L)Kk12%AQWט  |C ?X4f^kYa`l:wxOJ eVE7,QkyQkRvto3&woOn5cHS^+܂i1>~|[0'`c.G޿'=d2\zÿ:};CʧYۦ󑛭O#{b[f26:7ou&qv[:oq%qȞ̘sf>a- 08r;4p𑑑cc(ɧb,K p\6rDwV-)2i:q{P!ɯ,~l~l -C0 >]++ܻ^}&}Crvk6V>Rm|ZUK?lT/FݟR xȲ܋|kw%O ާޙ[_No~wB3ފ(fy9**I^EEblQ|>-Nwd̎w{wojeGFa|_9(u^Af1tYyn=+|MK _VygSK[hy'ueC˚wtã>kGC!\uW~C|f}ô9! L'>%Ҫ8quj1UlnSsSF ({fG:Ī@VD 0)ɗP* O5v~E֟͊|$l8)kW6ґo^.z:x`-tTaDA=&+}^Yܫw\nǏ}l>ꫠR!чX=K?XD_JԚLK+X֧۞gNN?a}}zSaν;o'nn[<%{q3K0Ic\%/g}W͸]5m&~띯 ?0,Rjn8uߠ!{!HS"~</2rnnnZ[ãOUMlhfu #qZfr)}CV/ӧuEPx(hdO32.sIQ["Vvt~$LbmG gyOT2=1>x'{a!m;E8Da6~ OpËX͟yH+Cܣ-ɇcl/ً^f""纣Yu^)}]굞q9:dmzzKd1ܦZ {>";/]?xZ훳 L/g?C9ی#{y=3ywqLp,}ޝ4[Nw @m!"R϶Sd 1oKFnu;>b1I!=&,? r4w@ߪ {r[Mh-9諃 mфz \W O5"R=nhjqg^( z5꾅kBECqQ0ڎ!G_!"[Su{%ߗ[!>dIE} i{Zy'feS?shmw퍇Tvcp`f^6ݜ=4;y^:geF]{@vp]Z+b ]3XwwHٮ$ko/OggSd>ᯛϬ$7%f1$dd>ioմxCO~|N~6ggͻXs-6<7 eЧ䌿zי|_~cKs`Vgsg}t/v ?U`c{ÜV~k}s>GL9i8|#_crtD?@E/SxGE\8$'ԛ .X9Vr& Y Ó5N_µ8<'9)O1f*ƥjHe:Z<Gɮg\ov&xluBdewJmSmG7vɌ]w%.>.:xrT3mwAe|ܺ#lw#qJoٙ˅Sϖ뭫-gbuVLu\3rr.;csl<s-,LC?"X0?QC>qP'K n^۸8k AB"I LZp<"5SF/2pjX$)-tnjh"*z7Es7n-ޮo9+jWA̔[eZǖbiP:5"5j8qr|F޾;`U}9"ݺW2s>uhu~gdtlǩx~g ųT S˫Wꢤ+6:` yYEMwTSqʔQE4|]<r 5[=j"-WYhkP& OQMZyh  6q1{W׆gzLmuX 5cc@uq&6uz]%g>O,G\ss嚲qh#r`h s&7Pﱤjaܺ 24iT0@}X=\j:'#n mz{%F^Qf[ZBN!*"LG ZSD+ ӼCSJ({lW2CBA|.L޴\Yʇ&29P w*MFq~cO }::lomP^ۙF*DApZʥ,38!m6]z,׼T[1b!EO$ }oAUDEDyhL &фS]U S xUS^꓈;gj-:D3  \iq޵՗ rg_Pߏ?^EI}>'|V3VOԞvv|X;>9;[ ]]8>W"G(پ -/z/݈G3׷U}mݵ:},o2'Ŝ8Xm0w՗g?p&L{JՇ}Dž9u27z3aX=?sUyIm,pu_s[aö`y< Nx7tC =*bBrh5R Րf7ƭOg.݈i|L0Lh*Q=>rkup,#2 ۩)P4DL" CDPUqyH][U:Kf}e&Eoe K*7 з[FyˁͧfwYKo?Ǯņp)m˘MfÄXyl?Ж9S̀d*:mz?ad߯,X>){<{ Z%%%њ x?{<^R ƶeݷNҕ_N:5jLIyIV&͎,1&c3ӝ@^LR3o }blu9}O]|WksdmgN}72Fy`ta9 O !u'IELK,|KVဣmjuLtN.IRq/pwbYG}9"VZD{[2&~PQT*kOTK-IcZ\ʮj`Sq~a%me~dMdU3+I'*w`|&xd2 j-#5F}<:rnޑ`ykvD#&ؖ6%3ޢ"s 5%5C. xix5{{<~,?^M<ܐ:vܻ˳k=ĝ~ײ{\szI}4m̯ szK0q|o%'/+\i7;^\p:޽xLX'|SZLSXLV>FF?1K`qGN'٦2ڼ|+JD>@0~;J}eڈɲ>ZnCNϖxV]U%%*"r5]+65LSQP Sҹle-N/H>b6~~w?@V飷ϴQvVL2۟*η]߸tƽk A ~e94ό(poĻyGeesK6gʮ~o^Q~zц8յ~-,g2h7s2nyӺZs+F^6r#Y{3͹Iyld>_;}upfn}ƵSڱc1auWspuSmk?oki,/N=ߵ0T_x"|;ܛWr-.0c8{!n| ڣ |MxGSBB=jQ2yIJBտu.6GALNa=b&PʩdqF9t4'XE3"vli7'.5ITr-+(PÒiDX+L22B_VGbHenk093wY>N֒l*x{s͞v&.7yϽ&Vt_T'AW2>ra_fuVgǜ^[9Us"݊IԪ`]o9_?ۛO77C>^״95m {-zQgsfr6_>L_?NUn2y^l^/Au82aƒsHRpjzmtٶܷ:=ηwـ}4lwBѤ@|D393B%)lF{)]#$H~=>gz+,ȡ`ȕATTMu̿ӂab>@~(]EEDE,"3sj_e>`şI)lDRl~z<7PBnNӐ(>e%a\73>o:kisޯ{R:̜9k 6[U?{׸NR|ؘ`܎=qŌR\Rw#}ݒǶ&88az^_)}SY6pX,?ӱ}3ߟvkH~`8!$NmUb=`=:ߎf%{fʠCk^_d, H?19 p{xa,wCHyi.j(ws"WՒPvz 4Ec2 gEUS*hć{k:i јۏW DMwmbsrеMĦ^75TYTس[ݥ7'[|{Xޢݸ%,8/ij@cxOޗgꭕǠ]=W活jh3e<6M~eM酐f1U(e A8{n{y;7\_kc;ᆍ^]4diI;XSwzg`޳R ֚cVHis/3g8i?rZ1- vbl֘&ysD\솯16ĸ `㊍2MD`x|st~rؓk%i;14d|.GQ.èL SX=;urjpCW {Ekuwmh7 S gltron-0.70/data/game_crash.wav0000644000076400001440000103672407243543550012173 RIFF=WAVEfmt "VXdata=*x#c!o ML\\  \_5*}7tBx%JSG/[4OZ/_I6I,1$Z**"19=)GAeFGIBK5F 3G&E@r-KL6rZ 5]?0j]i,)\:'UF6@%I.9:rX>LY!* 9@T<K@GJ^GNCBC;E9N|FOF>6+h:!J4p169Q!>$+Ep&IF )A+N4%@"b myL Oj p  E;݀οӺäRG홪`c̫Lw;elΒѲ˞ Vyx}PF0&,54 +g--OB(: R@ZGbC\AmY6IudF=`HdHdJ&ij1K#;l-\  q  ' B(3ޢA8D,?>p~6!'. S$}.n;.e`-i-,u4Ԭ'*&(5$F $Ms)3HTHyҋ!8+_ӚT d Q\ 1  " ?0+NZFL7[cBU<9RU>uVITH?&;06.H??.?27"5KCc"!41,V%h! *9P6+]AZ%j@sוO 5bg OK$  N H)6*݈@pf q S$ +&Z'n (T'{m!L66 ( ) #% , .HP;,8o!7&=*xC 86t-Ev8!5  %Dn/r*"r~)" " )s;[sd^"_#5@"K֌<F2&e -gX#%&;",I; mکei`T'uԀfмF ϪJ$pؚ<+i;m_ i >G eXP!+*,II6(H''C2+??$J8I9eB>OXWWKUP@XvIHWF4P3I Q( \/WH:uY|@FTr?[IYJLCtLpT$6l3==I 'Bb@XE9/i* q;lAĮٷnNд̳ȭ Vȍ$Fކ@ⴡr7Z ;3п,a++t.]& 040 3To?(?B4g01-4x7t.|N(VB1ig-a8ujz**g>]a, !r/"QWY#S %U"%Eo"%#˷gIY hA}& ݏq4Lܦs 1ڦ { Oc+ h RP+ <,"+##;-t/5V+>=4P0\):1MD-&d[ۘ# #K ٌ &Xȩ 5!\CNn m[Fգ(l ^ )5܂ "1Ksef2IbE+;Qk 9<">f*j+a8++Ub8-dL-o<_.$*+s[&_}-!6zĽcґ$N s'ZF$5v <=#(-N', / 5I. -@U@lABgc6e`8M(#עB;6Iw6 3z,1/k4pw؁ЛB ڍhƸ<(V/ (bգY|*T5 ^LhIr/hb- %^. &[2,8AR 0=4* /@+G .4 P = +6*r@ O,.#{'z&v eF1S &`I $jH& b `&Sӟџq n{Lj72<+q%\K&!n-$#|"_%|)/ nQ.C FS ѫ# {&M<ax ::4D<2ـ==5k$M: ;:<<$?/,(EQ 0%( 6,b c) V ,*5 V- X.a@Y@$|)?D &l2"'`p]%a$22h!&tJ+9aԈ߅ۆpڌe *| qUMy!;P >u:rNr)T4LYaS0 u5"0".J/%,#R ^ސgPm2g!t' -  k$ 04t3A$$+0M>:|N2V8 ~;W Z u_,C>O {͒ʰѴou Kʺ ~ݍ޼M0ُZ1 iF(:%k$T:n=.1\3ܑZޯզϓh7Ҕ麾&ҲU%?ϗHǃ&A //x\(H@!FJ'X@-rdVHLF68G-NA!HL>F5Bn6V8;?CTGfCKj AajV{LkZMGj9c)E7e+lh*"Am[?Z$ <_G_Zr#@.U!8+>l(7G A7޼j݄ޡ餕 džUx^`1<ڈҷ֑?x܀\ґV6 Ս*+ƆƢރvՁ$GY@ !D8^QRZjfOB!'դ=S\_ҷ ZK[-7xi1.144m%;%614:5AT5.+ ) 0&L, o= /%  * u9 ?c(v&*A>% !K&-(AC9/#0+]W!2 +C(q #C.F2.10C J2 CV(H4XD3 3/!'N? ODl'Y~ |Mkk O$Jt숿𡿟W}Ã0uW!yx-. Q%q7.M&. '2 + +0zG: '8>;@  ! "61)0}&;./r {:~޳#ߒެ_~ܫw>Ů&96$etŵȾh4όiЮRU ܨ%¯PڞwYfȠf19d~ūΌfՁޤ՝*Ϥˍ Rnߘ[ #9VN6ȟbئq  6o T  ! ?>Cf;.79"2 .*9%7=!+1%^hJFj C@UUcj7X|_|XQtSyP{OtzT&=Fe8b92v\(;i7Ka*I)@,0;19L77:M4&7Y+0bZ(k 0$$~ S I**!jIp&#l06K ݸ7`f*yQžl}@̞ ~BơЬJڒ5A vt :1 s0y$ $`&x[6wpEv dAf,r+L)H'3$,)a Vې&#ϻ|ʡ`R+/ŴiBK7Ѫ<GV];Ƴ\»TХYΏH%A4 ޷#,s:`9u6KD7h3B7*)2 bK/DS$Shڐ\w&$ *'R/9->?5 AW?[G`(B( //23<9?@E8AC>AbCc;E`/G#0>R,V%Y8e9gP6a04]^$hSNI8)&z/\@&ZG\)14'4 <=) 9I5%-w"O 5 4*+%ds%%^# ,f  ^ &ug 9"ْ#ҸVw+/)k8:*x^ n<ڦOU KIJpVx"ϸ?)y*Ҹ؎bM- {) & ]jLн8Աcb$!5B+R[Ԣ15~u4 5}&"j\"05 >P-}7<J7$~A)IH2,?eI#1-y37s#F:]4 /84$ w7"2r"*8/8@5z F`W08.%X D;89F7!.6շ$k6C#b( + #2Qj$QWVx/ ֱȹ"S۝n7WYתҢٔ%՜m d߉p p0'%,k"' GF#BjD'C2D!Y8]8[&d+[Z1yLs iy2%g 2mA &F }dNB6; {gr"&A22._5$ 52h0i')"/0$N7$FH3G35I%BXC~I%~?n8s-+p83Op"0 21*8$6C^O55?F@<&H1?C=N+AWKb8N?@C+/#)\#"$!=!0}:e(\"NQj9; 4:.<@E;+ U#%  qj Fiq \ X1A*:V$)i'V*3  (!_(e5%|EfC(f#|$.T' # ,. )V- * z~CU2 ˽Rٽnα!{5@!*dpݸZȒȬtU䲵N;G¬t4,*^;̣WU* 0?﮼\޸+~K߿>ƼYh ݴ P:]JN=Y "!RpA.8 jomhS'^ɅfU^ kLL;M4<91/8(&c->1}  ' $  ;׀<`r7EN/هۤ(=obS/=s (n ߼j7!E  'D3 W 9R{p#s0k h  )%/ z. p[W @Q[,E+Q[?[KUJeHR2-5#2=4v0=3%G)m $ P E< ?T Ϡ4dĭ(̠ߊey׋׏y.، l"XU'+W.6y2 1}2"$D%)%:9;2+6B:"5;0)E%D.o%s%`U B7ӭ%JϊG!Ǽ`ijP m\ QʸW:V<NB ٲ\C<<@v r%YUB]Փcٶײq'K TT/S)pr)f7G97l4 5v ^Vd:/A$!< = 3.:"vy/DE~pI ~XmFu@ %`!)"M'*!L2(=6 /EX5FBE0V Q ( F-Bq!*$z% 3  r)U*kS \) 0+<Y(BS2S@"rJKba.;`3:7>"KXm#;X#2JG.Q0"21,)X&BRg)*"V!/Y3oL2r4C12633,}2K$.v :m ^81s:s`HDa N|4劯Q~(ƀ|L kԗ's8S#c 'E'G).#"P4&eCCy ;y\*tP9O5<$) F!R*%/T"3#Z ,$; /x0pl2)*#B "f& B X-v!u9&L!Q/4&Y؊ ZB"+dӞ˔ŔBr#2'/jsTcX=Hulϯ',%FN/ n#B1Q$H1BH<'NP'[S(Lu"J[&9&>x+d_x#/:]O+T1 \bGJ,-$Fڢ>LNP OTvD*eE Y -\;}'6.N*E*I(S::C,kA6JeRCDYx/>O:-]'^ FRYX,S)Ejd:]AwpHRF~#@:K%`7=D;%#94=A5F&;= '/4%(H/z+25DXgf E`2`cKC;;,WK$YJ;`5K_P^7|C{U$\Q(b%o*q'?)>-(8=sHL-j1ba']B|18b2n9sEMsNL\p!HC@%0- 4= TY+P(+a2 !C) #t3;~ 9w-9ڪ;Fmc[˅i&Ƌ /F@3Y@s5\qExpyֵێ2qT /7;+rW*]R/[;q2f2j(4q0eFx3sT 6R,U.Xn2`R0F/EIcM\CHD>*3,1 5+*)l/ )ـ#֎қ'(e{&l;ӹ&hV fpIȵ(~mS(LӢW񞑏嬿?'ɧOxԺQh(֢i.NwѷJ_Ы Hto- -I-^r"T@-!E<$~6D;YQAV?P!IxP[ZIqGz`nhOk NLhNt[uQ(m`Ak?j7?il?*l7AnS2|FYQ{Kh59K"(Jl(d/ xP&R̦JՀM1=Hu ( 2(W1HNDv,#2 0;AlO<@\E>#LVhRveN҈6V*.wN;x7~59t*}&@ '^( +4( ( !$ ~N7>-(|  2U0..'$#05 *m')D.&-1,'" i f3 Z jx [:׻mڅH'k ^cR'0"1:#

g,> <#N8=;:"p]L*-)6):&T1v.0C);:>$=,Y#%%-D:w',2( /-J),,-H3*2`A>;+]9:1[34_/&r+ 6!F,ܮ,X" x"+$L!y) Z,`$(E)4& "+Q~p*#(&l&$!o*y(9{4 ! :q6'm%V),'6;4[GdW6z tf$6( ;(6f aڀ'`er]zJQ÷JΖb諄`䭸ĪMo?y۲n͙b3& 2j\WP r*Ž\Z( C ]29l&޹blnۄׄd/ݙ3tݎ|@ ns^BnvѼ 9ۢ!Wj`8 )41  1P3@ - S4y &( /%:2=t1'3q%,;"#=+F1C4>*AxBZ199/:#'+9 ![5}:1#5)C-rJGaE/A/FO)EH2aTDNFHzPD'l?5),7w&X)?P$J1CEe z>RB7+,r7#=P-G5LY9I5.;;D7EAZ>9J22O5Q-%3* $_C> ;N.F% re|E :h ww'` h8c` xӰ7װ=ϳdl]4$ޜC- |C   xoqAӓ6)l{M 6eGv! :.*6HJWjvHh]Hkι=ˀƞD|<,b-ǜQG??~̷N3~݀:x r8= /H ?h#6/U4&<Z'z1BtA M{'!r {B6( %r0*-4 .b'*( 'e/G1} #h\OdSo$M  + )/;)T0t5+ J{37b8 Q*W65%B'A=A04*- @0{+5 );}x;1 7*p "*;bT9 h; 9Aiv $vM!`8HF)DrN<0I+65,. rֽWC/ڟ^а<JWs&v@H  @, f= LN!|X [2#"!0 Us%q S . +(jL ",101%$,7z"" vB1 a7ܕ6t܀P E= e? j0r,D7h$$ i~F^wmX~M܈S ӝp[|nzѠ;Гo͎PG̓ÃǪTж+M"t B#v(% Y3;p3-B47#]WL$5 cxm(/r05|@y(bLwEnZat Z]! :!v-- w"o},J(@!1$>%d#/ :#XuL%-0kl6:3e=C!6)&750k5K 2*AK 3o6$I9Q!^J F?(?WU>w9(b >]UA9 14>*9T+[=J)P;S:A]U5Tg*UZdU]*o7tPY]QRecC~ Zq|db"VTZ|@C%;": ByY &  D lhZ 4 ^c;G&-J ն y3N{Tiݟٳ.Ӏ tϰ֓ۥ(^%΢ʺߘޒMْ:ץ1 YڬxÅH|`&0*4b9% LC+ %  YU$ uLsE&ԌКB'*bJR:x$* ) @BO1&ba$1W%kM+K0CA6<7:/?%BN2H'0L5{M2-GG"B0*H/]AYc`N@EL~M5<>8&(8Af=Fp=3.L9&3.=d7b%G 9:&  u ~|x7952aK *5M SE@k 7 >+G| B7i8";r†UD•gɄTȬ댳$Zɮsv&חۉ,`| aNI 7>ۀ| $X@M~8) AҨYsկz'wu }l JR{t36 <f!Xz()v k) k  W,Z&;  x#w %C( 8+n!0>%J/!M;_5@%*G3L2/%CL5_N8,'-(t/I&0!-5#V*k& (*)5 Z: ":w3g BQIACsK)@9+;3 (&541F#s0 *)N2v%o:I&+#$:E"%0; 0_k!'J"^F) m2fEұ؈`X +j'h!L 8%* ~-L7?7 7;~DN!O8^20Ql4N?a\)3I("I0R8aP1QN#8@M(=.;F>?G%( $5 3,2p .1BE1fv*l"̼ xѵꥵ16," a V΋r!P%%͒!͎ʞĵbAm%?5Fi#2 VEB!$J7[;YE(=C5Y3PFx,+M=k=^PPdK&H2J0D78,89),9*O9r1=; ;gIB~?@HAG\MJT:V~=Z;M"5N$E)F( @<LtAC1=';%>B!1A797?>2_ #=;0),[3>L+k,[KzN"xXGߦ}߮Պϱm_߃()M|ItȷZ˖:&,W׽ීÆ,Յ㭾~?EREVϬۘ2RP$_b",4:z04o)$ "O4Z=(.2++$.G&+b!z%3_1z)<#f)0|48!3&9,@*9:)H5{3.;~# ]bOR ?ZE(;_ s - ,^nZt8 s X ynB?j J  \ N% -<%} ږBx_cfe o " !((z&=' f ,K$&~ +P(0R +Q'"A;8 _ 9  (2&'g g..1c,)!);YXh,: {>dF^ŪU`/ŖNY˭HxװK1'ߩ-%?-''% e#%z"[ <7 )i=fKK㩬paŔ K4ND>ѕḌi2~ QiHav kba̙jsC)`q'"h $$8,8t3>+O2.$x: |!j o$Rf8/%FGY(t29e1=Y@@1<6 EqNDTSOzG( >:<&EDF :#A,C)"45 :r2z5\#+83 &UG"w p$&)~9* !'+){ J)v!qn n1ѺI} ?yV`=7'V5}, >eDY!@ E'&dl7,s2D48?1cKA;.5':*,'SL 6Fx(*J 1(WAzL  4 6)Z}@%{i#{zYj $N &x^%'E0QF?6z>')GXB<DNl+@CX4+* =<"58M>B"bA,b<5l2;$:o01zB*:,9.5vE.) *_c}yу=LQpC_"ԫ}-րؐeA߳wZDaر"ӹ֝,U$xôΉkӹҸV-+80KDCʁAԵPb6mbLQ5j:< \ !Um #cFr b u!z,E*AtH%PRNL[| `bGW ?z>#">D!DM6"^4d30n0pjD3b=MZG>Z:QD;DAh@U<%BCSx@AV6KC2B&K'V~$Y>_`j ye ee,:q"\KU2)j &8Z..47*-P՘ JxYBV6bүϛ`hņ"ɑށL GI|QM 7rVtDT->IVP l@";#i %U{<(&/T2n(8'g/"}2"D v B)ЁXyg,.d7(ڥȖ<"#txͅҸ@Yӎ]bی N_( Y!n1 " "{/+@/?-M)N7[>`B>f;{c;Yh2Y4WBc$3>./8*-$$,469["jG` H 4HHKFQ&`rX!fJ>.7' 5 7G+j%-2$ !Q v˩XRY^%mޯ$g,p] 5/V F!(j4(vl 0hvcuÅL׿lVdž.Ш2`k޶e⢫kd)o Bnmm ō c\ҧ 8FX ؉ :a7A% #t/s ?> 9AKI+!MANO"J.KWKS@nU8 P9H6bEIFYAFF}^/& G:$v1x'r/%.+6^'&-Q 0~ =ֵ01̍ʜ iˊ.E ]+0ʒƼ`ōjC`H f\mm(7fT3N[Tv t#%81 & \"AC'-=0l52 %-8C" +2'*0@1#~<39[@ ׍ އ.c$8/^ :ӄB ^ݼ%X_Q s`P2[ ' m7?]̢JȻII_5DZ ˔k[ۛErRo!]ж=amfץN&^QUB ES7''",040%00#g+!>()2r=$%K'$318*02T/9:G;=Z'+[ I&t$t&+-,$"&!%C41 xdk&!,H,.y3C)}N @*ڂ* H2&7 -7#\O^\+\p-+d+ #(h.3=<1:+$%2L"18OE.,[p+%~= Ds ) ,c+4$30N{TK?6SEH4J@9]N\?N>M3U@+UVS'#M7C8DMCCVDMCPKM(5I$ E#HCba#/@J^+Vpr ` , 9(!SX'kOCv $V-  N-,!=D &<(4&$$'6,3"G #*8+K9 #& g%f)L32,!%b'(?/1 o 00RE :-.4f(,m{W׻(*ۼ̼nh7s5z8'0/K?8\#[TQk&MLK]kUC3"B@&90N/<-B #^0>%0t(8K<7.Q4!0i ). /0$|Dw!]WXsK +#r/!i!<'xiL sn8  (?F9;/#M#X !,x9Do;YwL09UcJ @dk# dD%z'L"l  )$;" )O'%u0*R$)S#߮"*׌؉".V.xj  , i")(-r$** $!317=0?<6&>JR'G/;W+F6="U.;]P)T*3W18L5@EDY=SA4,*!P++-<#B ' /}% Z$z$J-e2 @$9$19*#S'',r _Txb|2   ;A)(n(V.#\fTTJڱa5?\jv A :!\+r-Fp w@%W-(#|@Kj4K ;ZOA=f#60q2((> $\,S=| bP~" JhAqN> ~dDߒ.ޡgϐQұȿz7:e1 qM/ܯh PbbwTqA ݯ]m&ddjXHv)`@>|w~<j!!;/83x*((.<'@s>)M&o)6(:\VEI 9O@JF1uF#Em)C=.B/yAL.?05OJ7M(66}C7A19A$AN;K%/'(M4,4<  ] |my E( =) vZ z9+. 'Hz&$^l$k   t* C CV  txް``ܫ4н(%ϾǠ$w#&ΰï[͵I]ܾGYVhQ׋ܖp%IyދϣjSve׼$'Uq   y 4A#;.#26T,3\(!`m "2!$c%% ( YN~ 1 E0  ?0 n _!_1Q#'B&M+Z ,4Huў ݱނ l; M 8&17$#(3jL*/+&@$-1#V! 4#'(:;?.j/:(>"*"*R*# %.MJ 7f"7''/1q[/g7 @r,9:"C@ %BDD9]EB/ 2HG_H8}5>-D.>4-)v,*.RD;i)%T(~'57 l -%A5h4r*.%*&Ξ O̾ - (sΘַsΙ`Ȥ(AċIׂG @pIOp(knbovx4 Q6)f~l./A8+7k(MU6/,BZO:Y2T'!f%0OkJ Q*crWe_) qqYOW_gKUpD k=57W6+$%$m"Sr y*>?/s?>7_> =؝ۤݸ)3vn -}nf# l =5Wk!!#"0$"-)7E)&FY oQ)2+|! (~K{La p ]OC &*Xĝ5{f&L7Bx,oؐkft wSp '%G%,'%$)O0f%*^5U] - sk6Oo<E!cv^*+KD6(+1,0ޒ8lZ [z u׷C+1"H 6}0}hKK&5^[X(F @uDeEjަsW` L-6WY3. . %f3tF P Z  rF p   y: d'iSf '{~ AY T"W" *!"W#.Q X36/. g3@ )8N3CE.q22g8,2Z*3.@d?O2v6P7:6":Y#?xC4,0A#H55.0IL@3.5S//T5/83+5|!(#W'N `W\$r= K+'%X*,d0_)s $iV 7fgb3}en3$YdYXNܹҜQ ¢Bļ̗ CFEawWУצ:ue=pn wm#B*9%"+ ) E0,S''SD!<K4k0?L&.~ 8&Ds(߬eݯS#xDfѻT5J$ۓЯx;.ڸx$pNDN%ZiZBF8zD/[3 8 ef*% 4.DAI0 +k,^26T5U-. G)nf&;"3F6%)Dp#5.<"$^%3#c2''K"&Q $ ~#]-b X J/ S X  eU(R  c3 .u + : 6+<:ZnsEGUdu 7P .~* ' {&3 l2=v o  tBO'g0  !Z Jb OLqQߐ!jZ?Huo]B~5q("$g-!\  >  i W  hd :{ &\ATC$' c!q;wB3C {+ >$ \RE %"$;[ d/ZU(>!v'xN+1is RW,;o'% l'z 5~3d s  .XwU=_ 5C`1 LO&hf $%R&"n)'1(D&(\$5 f#(."#;;M !$"$^#Z n ~$ u"NZH2%WY>Cޯ WؒR45pyMwP鵾N/ӭkԲRe ҔҒx#qF"Ŧw¡'e4T *i  y v!h9k"x >fS2 2,/-*)E-#5}(=*Ci'OD7<# $2DNIN G^T$UVZp]\ H` XH Am3:9y L3}. v#  &  wnV8f5^xf (Sz9g}`;V1'DfA w܌I  ,$ F[.7B PM`7[/ R   / /9$;@%:KB ;z%{HNvPUL E/Xepyz&ާ%e"}Z>KNɺ'QU}ha_'l&v(6"Pk.c B6lI &h fZ )"y&kơQƷͩ(iu03$ٲl@c jWv$7P:ؠ>" o 6 4 W3>B,r HC!"C. ,D 1'-5%DW3":"'$ w{ f1%$'*"B K0" 3+*P  n( 2' 6%0'5[~:u Di"Q}߄@4 ˓RȦ@MzB ]OIzKF$H3X$8@$BN0]MOGTZYSd$:Mg7J7qHq9b2v8(e*.m+<  /%6^@VJ=߼zpC3 e  9!)+/)FX&%'wc%1#z^ ' $ -}S-^M"~!&H3 \(o6#/h / k.^|*/ Gɨ辰^/ILd7 ׻~;(s}sAZ1 Vk p ?1s z% $Ag3 d&)<';\(H3MCa=Y;M(@Y!/.y-rh&1"2/ o#I(}30V,WH( $ ,t $T EU(8 J j ڿΞj[辉(\)`F}GXh$$=׃ksX$%^;:83 (5ߐN :v4OLfSS! I&d6 86 4,50S),%_8$ P03/!:0t!`$}(' ?[ (:j:KMԂA VL eJ$R$̩I`ǖ*?.$S~ W7K,  |I Q+G&%+'$(;AsH,E3N=k!* &^NN dC U fݐ~(Ng $dmC'{ߞw 0_Rg _ q$/]y^$.40&S'" $w!xGL# r +`U$"W?p#(f#-n  ,  K3 <4$^&! #| @H'0K 3: d/t(Q#x*-H$ diX F#JjtLz #cyWpuv @00 Q 45%+k̶̐pOdz՘DJe_:V7lњ|,9(\"Bo8$?x(m=i [ */n )4; 6*5)2;W6(1k, A.g1C*2.{;"""5("0Oi d qE 2^D ݅Il޶zj ` ۩>C(EjOY}YNܿ8Rϙ^ɋY>d <ӹ|ĕfvB}(@5*sƀɕ |BFGf % o$)C'l)G%4=#J!M1KFdH^#DC-?.JF8*W *`)i^|!_dXcv\9O7C[;)# 7I*7)Y4((%" !0>fU#'u # c{rOWS[~$, ApU'##BnCٳA$]H$dAaJ2qTԁԣүБȸP!8˛ՃhӞ߽.a=uݓ ;vFi${#wp w &l`+C&T uZ8 j DG]jN /"3Z&:+ _,%:{,"V4( "< { (' ;I@ /#* =1*602=/2J+G#w=[K6&1l- 4(| % V TK" F /@ F.$1/GFBZx k: *  h0 j_!V 5 R,SF dB H H %0;:?:8[B8wl.dZ$Y+3]r+G8 pc Sn -_X%PCϾ'fWϤ~Ҿȍ2pl..IE?,Om EsB 㹹zi­O/~xr2ۆd uxLآԍӰҮ]GdחHbQӵ֊ٕثv`"=UIHj"5^ d" آ Ұ݊04s|Nu< TU~Lk B bMk\ D k'#t(+(n)$t(Ho'2& c"> <RlS3%2 ?Xr?\  :"C)v21/-&G,))p+!%X)#%%"-/ ~/*U [!1!>"j$))( $).&7v8S1 ):b)8 )j%#T$" 3^&jO *\ߙu/.pJ9Up"]\ nDR kݺ 1 LbM(SP0 4 b "Os/U& t+PP- *dqܮP7`T*6xw;D4;bրғԺyڎ)~H1 q@m("a Q  Q(k*Y'>n& o B ?a P d3Yn$6#`:j1),6+21Z0K#{J6'1>a?5 , 4&q  $i #T^blZ L dw,$vI&&B/75!@(7L/>4//23/ \g  L" j %M%[6 51&:#A.C{$0"h'%q)x|u!&XA݋yF^<թ&ۉ6C|,W. d((:nxsd1I@Q W6v ! !? P/$.x+'PNN, &)M#z%T910)&"# R |3l< / # H7X.hlJ&uY "$L M_ s ! 1M ^* .0K'&Jo,la-C4-=*,0k&G-&w V%4yHh+ kYTT }> 3UvM 7 %QE0Df Yy Zlͤ& 9[Մp $' % Qz4az* s(@4 0j~{n(,},M6nh2wwzR%G!:;R'L+$)H"Q 5  Cjr%^)1 \FlMs {U"[f# ? ;@wgR % o & TF (X, *{;`75e ]:)79*# ) !l&G%51!)=66"/!6 8(T,X+4B#0- (B %Y( !GVd @ xh\ " 1/mi Y M kXx| S#3" d$K$5 4; (h 3_Q , "`     ` S 5 (v$S% ( " eUVdg,?W/d\|L؏:|O3f̕oݎE-~4N[!i̚βR|PMԢصRzt@F7-# "^'U_(E$ i"L$/$2(X&v*'*i(:-v'$+v%z"!m*@.0X1B/-'%+.!Z,5 $*!,3&66 8#5:X"5>"^(($!s5(;68Q847A:./=$\91K1/ ' O}U\ y ; (0E Y\a,=2!|PZL ONu$: F3#&% < n   " v%_H \(!Cy[M w '&  4+ DK)S%x>n6H&qfv~dzJN @F|D ^>El:вVrӧdu}"'ޜO1+T m  H3? ' Zx & 2&I#?$u $#X(&(%70`!^+,$03r0z"X)_,_l!)&* {+ D-m +648y./K$;)!&?.6L;&2+p$){~#r(#*.k$|6']" .!imkYspOl[J[=rE%!]B7 @ 1 <'x[J  ^Zc 1P ,`DX ) B  ܠ׬-"zRJypӶнۿˉ”ϥҏѪϐ"jTl7 0 b z5@ v[6" /,Cv i\ E) |R  {`$* g'W %`B k!$pO*-)O%^%$c1>KCu 6m'"$"6$D:*0 7):-8,p+v+r65G92L2N"@<B%J&D(>)d>O!n;p>=\ > =$FI,p=k*U2$&T,'E17,L"GF k  v6#i   s$'E" T- / x(\< &#~ W  E6' TWv-  r:T s*mjU }OfI5n  j zbN ' ) o!]"u_,z*\ 1c-' " */N8TH) Fb : >6 6>+; 3OL*m'(\z#)x(G:  ]Y4?Angؤh( Q$ ߋ;5Ie%? -zK Q77) r @ ."":#SD"i')z-s5%'$$b%:*"L.#8[/b)&!"&" &X)'/ L.,+'(!-O* | n  FxS wv 9jZ:^n(KI  -a(7 % k  j|8W>7| JAT}? Bg~| P Hi r* dd q^81 r u0MdRvY}P C8 T U+H  91Hg q a hTR1 I Vf Kb }|a "%A#G, _68 [3+'$(5 4#8s)}7$+3 2+"6M AS%VD4_)@$'.-z+/Q .%,)|0 & x ,(+ 0 A I ,O' QdsM9"BO[7pf"$*  mp;( Dh/'  4 '  G;z]d2 '%$!;dji! 4)'E's" VK \=.4*$Nt}  |h Bz  \/EH7 1h*(6 S@LF&k%F g Y$[!g(`!: B#f#=0t"n$H',/ M 8 c &w}FQ}q## B$e(|$ BD C x,<  i - L[װSXp-]&;rJT_Dn) mx :J%f~ 4V `#I at!!u"'(M4'8 %3  u,)&!8 l  =|"@ ,X".(.'P*)`* t%z Q4   ;bp `& 9N; 8 H"\. 8Z. p 34Q{aM?Y:  X v/  "#| +  R(|%\ )@i % J + Dqd Qx  ZEM+ SӃڍ _qmClTa^ \k   P JZm q !  * !k" <',M#) r*8$:3+.(B&._ 37-$ ( #)6 e \= l l  f?J% 83   { KN$  ".P [b,wl|:{*en * VZ;vh! ;u ~:Cp4 \Fu z 0*g iLxDJ w""?k0 V|!w5g1 } n  C  % V Hx ,H   7Oq0 !">1O b( G  U!!9 x' ޜ)`_#nD;)&]tW:osG ]39 JNs^ $;/GuI} Y':  * %f("|!8Vc  "`*Qu,dzL'W [NjT5 @I|  Z}"TJ"p!X . !i0 -! $ _ N,>4CqpBK B:^[X  v  @ W n]޴R N0DsukJ-N@^)  B^Q1d+ d-M \ Q `dw gD  3 p   5T00)N2(/a- .[/'4:6t64/l}^'%K4 s9u)1 Xh%1 ,5-L* ,r3\7]1 \w"|n $]   B X *Qcibx'.d B u  `/_urF\Ex2#: L^!z )M!n@$?$)"q&#-&(*'l f<)7 ~&q"`& V' I'$!!g$& %/yK$ Qo d1 i ^  2!  . 3dQ308LRz X( Z  c) v K ?IkV 0grzyUK,$pNZ T` ~ < t<!zSs> T8 $ yUj *"f,{^*^*xVOblW\DG  !5 &-t. ,+V+C), . 5%^ul2HX 0;]  1@ P h  #{3:[1&XS%+,"G+' !!  !z' (P$ %{8,1+) B,-{$"O }"}\ Aqqj\1!~ ޚBDVTZ ݣ"0s(:baY z$Lk6c<,   L Xr~ GQ Q/X c@ 5Jm4 =$H,f"8k,=(3 )2)b5-(`7/F?*g3.A7/=t)=^%8H   ==! EW 4 X ;/ q .bex8~o' %`wDCr'  Xl5] ' "  M$f'q EhjIlD q  P"ߓE< f ~~7 > z  p, PRV ns )^WK~d-zU@6 /  fk  -  Rf3 +4 M H_1l * 2*5^$1/1.,&"F(8z=.B"=z#+)*$#6A8 pX + j`E+',V%LH5 %|) ,:)   #J;1C741*%-h"/!+*! %J'" 01V'|&),k#% P#w++#7%4),/Y+/,%,06'`2-%l.$+!##E$)L6": ) z m1"`O  \ m-l?6$2GO$ݟW݈rt8RNHtܣھ܄9sڸz_#Q :߀QJlCr j z 7H1H",6 B ]$ 6\oA # 4@6N22L*O)*.f,M ',\"- ,1H+$ i '} d  L Wy"57n G s  ' o  6  1~}b"< I  Um6%%\;t68R}Ch bu03/[9cU JSZU@1 <p1 /H L ((h7TMG  Pm .A/ r: >w pWWj.Lpx OoCN &OFx|) CO@ #v R 4 ~C3"@+{ 9]:#i YQCAS P 0%@T , 2 | 4# ~TY/%# !*t'n2K#'$f(6!:*N)y%o%I#z&'J=Ut! v ^|-oS4> DU Ur  $ %/_Kg)Ek_ P F%4,8d&4$&#`xM('+#%!# T3d W b  V4' T@flc7Y&~"QyI  ; @ !w~% " / K>,}8YR W~yk=1'dF  ^Y3]1]f]q p nQFQgN J}W BF!! ! N0g0  g. ^ h  " b$:!'{Q- V,E0 {:G*wA-P:09_2p@+=(R=&8%H4.=0'9j04/4?.I6;08n-3L32}8/=L598285?3s9L13X(/)'0(!yhH Wx ~ -X/,&=LH_64M3$k>`KPUYmkVD5a&N޷ r,8.ݸ.ހ "ITfiwfj!l*ZEaP"cI V| 3Q9Q@v ] > =7HP. $ 2 ns m!f "_*e +x%cXj!V _-Q (W I qO(}() fwJ["V@rK#q-OU$d z =A] {_ "O#)G'q'(n] KsuX\t-cܭAL-:#@ *b~B  Q N ( * B@] !|3{#M$$a, (6 )' N$$/ "q&P"sW Gu @ . BSr^ [ZHy,wp!k" n| "~%_v #W.7 ("E6 2W![ [hC - Y T  s  , v87"M  '''-AE "{r"!d Jw` gY5IY  X"x'&<"A D"H g$_kf:i uT@fvTyem<|*0"O-   Qi|P,! V&B B&" ^ b#j|* .'z! Z8 d_c $ !!Ce * ] 7 pV) vw/ 5(@`&JQ o &q NfL^ b 4 <2<"b C  # F: d98c: &i ^vev]  =  H@s$5& r / 4 H   Q  K #wg); M&Y(,%}(N) *&+%!!qN H! k  H;* Cc  m$@ڭUjB}>9QXܳnJ=l-yE}Na+tah^A@sD~* r,'^9r Q?LE iqDB, LO7VK|$)   ! ~t I.%` A &]| !g+-A.d/7eK9NB<B@AJ? 6 8+/ T&0  Z D S4  64WN@sT J1 K8d $6+6T"#+|5r-NHG% Vcz &K NycR]:M{ wN 5=^ _AB!3kO$~{?YH lWu%6 =&ir  hB/=7l! Z g O }  H r0"_b :""m 'f+&(u$&"($2!5 \5 #5M/]5&.2m3-O&M/(\+x(L)o&)5%gJ*\,X #! ) VONf8AWCAl)$_#b:S fkg-q ( K. > "H M#$@"y# em#K(0!fv2 g ),eWF! K w u @ io r M ?.v_n" MF  !  $+&&d o>  {'Sp($c 8 !% .^/ 58 -N   bD8q9p^5;ߋ*mӚfC! :ZܡbhCOXb#LnT4^$Le60W} :BMZ>q# G - $4( =3 l9 G) >IHS3{Lp | B &  Dh ^ So.(`;B=?r(W& I 2x: : g]wu^X+$/#2%+b$2&s1-*&+/*--(.MN,+c *&67-e+\!1B#)"$SB&N!*F!Ptt e^fR d  Fi Z J  B =`l K&'Z%Nh Pj!N#2  fh[GNp% &h<f]  i K R  ; + sL$ I R Rt9,Ns w:I  d;-b1`  M K G }p%Gl?. 2YJE"A~ _r|z3~d*< ~ -@w$nDltJ4 (pZ9P.O;+b) <(  x1$ D!R4{(* !Q%so~#T% H  aS  Q(/(re&'*P"a-$-"o'5;#uv M :$R/S.7!!sX c>r~yC}DH$ ~K$# |# % *( "'% )'v&$V|+\v19:yizD79F $8u  _ V$ p P\Nj fP\z3Ad" C !B u 7 aV wk D">J&0 * :$*.^=!! >.Y %D +A# #,I Z ^ EeVw [ P MR_ݞ:.Qߥݬ߉_u#|zLO 9{ Ejw&>~HS w3@u#xv ) f" &i 5+h<$D!&(m*#'("'2Q%$3 ZO # ! D$ $Q!K%%*((* "* - 0s$g%\"I)! \4 ) o X Yft 7~@ >n d>E"#(9=$`"a# u & HZ{F"\ :^;X !  - 5> !k  b2#W P %N` * n:  X] a   ? b4    :a6 *q@ l< ~e w6S?|&e  4> 0 %DkM6 j +2 + !   u  <0[\ DV 38=r 1{^>}"{ <p+_ T g \ [ WN4o^+ Z &!w" ! d PZN9g$$%Q'o( $+.I- 8DK\z"&YS=^~*)SkRJ7}"aa<0~}Q!?V;MVfg95Nu ?l4~n  :RgJ r) Vi#&$#] { 7"rm"._rAP: @ C &^&s1F5k.44<m/6C97=29>r4n9 C9A%6(2I &0/(2I$S h| x(nu k~)e  g@ FcpWp5,9%$ "R : S> 67i! F  oX k[~ 7c rW ux"Y P) Oeefo  0 |Z l2(#`&d 0 ! c}nK $ A&L_ &z \@mTg4 v/x!+'&>#A RV? z Z O Q  , _ 4Ec )[(d\ < ~F@$}J?J@BWXOOr gel3cc5Q0`C'>%iy|i*$ uu <`?,H>7`:F<Ycu ,n {[uOhe |Q> ! E"Zr!XD4. i 5 ( 7 ~p vq ;n M *i(bmZbu]t+  8 ~v{%,rJ/f ,L!n"A"u|U.@j k N B f    ~ TbS..(  3`` A:   r ` U ] NYim6 ~ T  + 3 &^ XPkD  ??L Q $U+R+4 e*m W(#0 -`"1H"[/"0#51 3 1$!x0U"d/[&:#(&&+($X)#d!7"<#$`#[*FFw&,*TO!c # zK( REڰוLyA?DŽl5͛aQ,SiK7$ x?>(|H ^$k#9wi &.1e'! w!b$@%0-6",b0G.j%+' *]UJH #W&\ p+},? 48C#2b  e ) -J \W B (f "Q !i (G wO fXRe  'H% c 9  L s;HKe (3 2xNxD~|KKVe5|axsZ8>2BSdwc .D,2Uh'cߦ.4 q 1' b j9LS fK 8( Tson 7#5!"$ 4.(8vi-b2o-Z ^(/!% x(%1 v] K ^] )TUu &~})* VSVK:  {$Z'gG& r "O!!^#CD%Gz'M @! $ " v% ' # (\Nz  %:l#'~( ""| (y.303!) +) ( #G y!C|@WqHe)[QuZ \\ z p vBMB z;N`>adOޝ>np}LݳOnpo_ =mO & mH G x !6/2  6K zGV|  u p P w P{ 6  u1 hqu5K T ` = rF@= ~3(OM l m $ D h , Z H%r*-)uY6  EI)_)$"j t @  = EP-tzW"g 63; k 2^  " " s"t J!Sn .a / I($k~9t HT.J1YD ֈO )>6vW l&|35&H( T F -ߴ;QD 7J6f H sxjz2 ic p$@A- F # g$(!W+ ;0C -;}  s J #).(' g&|*%c-b+o'bD e&+x-h6*O@ A8b `1 f 8 0M~(&H A.?  B I-ksIB_#P`  K z]N*)W+Qt2 $/v{- 0:*K,>V,(++`$'$Jt gz K  z9 M],V ~;3<LH3_`^QXB"ui N  I d=$%%$3$-"S%X)o'!\e.4l8 m " l*  Xki^Z  d$I!%"&N@ rmGm ^P1bb; du;F\M~s{ 98 k < PEg    r i   aCek ~  r "{!V N$p "$* !" :7 q !|} hZ xg 2  x!P"8e9E;bM@6 Z $ pTX4u   /D I `aO@{Qh _VO^@G%$( Qg @Պ%ׯ?چUE Vi L2`%' TUE$x:,(w.y0L361|m0Q&"h $:x j WZ ;  - T c pHE eC GavU\rBB RS*FwYmHg LC   T Rw* M -S i ` "b) Z-V@SQ[y5  p `2 J K1 f5j~F +:$  )H5 !  M* Fs$v'P(c) !ze@ u  JA  .N> : e EO Mw%S  % I  /S4   S &fvQIvUH"](, "X#E~%+,#(#)7)T&J^+S s [6[ ~mzl^ އXBx8t Tg6"^V ,CB- $ 3N .QF  cD \,Q ;   jyPtH5P p@'lC  ! `&5 S|X <S %B( )i"Z%>;B  \ 5 'FpjJ<:  |y'|mc'M9 #&%('2H#HK(D&Y|%d8&Y<q%K" (\&O*g**i)"',"& &!4( c%(q:%9 F)~ |:0P -PJݦ&۱7@H;F;58+W| p/jy.t*/ * I i  @ boQELs i 7 :@D J!!t6b 3~gU< ` ?{~=!+) $!7##b#"H!&$U& *d#! z6w:% CCt %kB"" `% !f 4u p G%oLP 6kjl =0P  7 5 h&  \T '?=c C g * fG I# d ><  # V#6 2 b `V +S|5 ^Sxs u ko<+S_ \o^S >jq}| G o8  16'}LCIHPF` :p"`337{ @ < { G2!qV 3  4vq N S-bLg? Fo) 0z??K#A   ,K.T pO-/5Y a>&K-~4  &&h0ryQ\T> o   D$: &3$<]K %Nf7* ytf3O- z @q1  ` Lrf9 \S .IO:Dos (h5  de C`:LV  eCm;z !'6)Q $ + F*(+*'.-a&  E*  BnA  1 [7 H {,gmz. ; x "P3R3|5hSJXb-U6>yFn&^\p  I- / b'%ku ( i Wd 0)  d| n1s) tXoM ( |l-kg Edwj0FGR @3S$3 @ K ; o   { IW^ M  4l Ke)   : j   B    / Z4 r:-?`qU i$H V W x XD^2_H7| , F f0 S Zw! $) !!zI~ *>@JHb?j/mj*MQ #O)&r'!$!O!wO  D +xf mww| L m  iLRR[S~7\Q D>@ LRKܩ8z62$7 5 4 (< z r v  @1 S  I  k> 4x'G> TU yv v S!\ - 2QO \ { dH4Vr \ 7 mA M1U SvS<nZ2*[Tc-<q Y ]-T<0 'u(Ce&^ '&%d 0aRV   0* r#Zk Gew bi?N~ o%t! 79 Tr< (.  5 WK7D 9Vy R 2dyF#[>lssr^cs8K S' SW 1 z?[Z q  o,)?G_xnN6$W8 ) -- "  W! Rf6Bq Mw<8='CP&+ G 6\qM=~ nQS7 xMI"9v?Z4ޑgNMQ>mvQlt  0 qxYz/!r?`w ,"3#s'%")2$"&H !h!.Pp !8%x,&_(V &xg`K 4 | 1 6 5zs \ gN>#P5 oA(j  A V  7|"f#5X+ P"|E$ Ju"}(1%))# i  | m UV    0% (  / \ y&*`s4`f P| s [ : J V +g $ {u M 2.~PH  ! \ |r @ B a\w'pI`>/&(՘T޵l#.h fCbksyޚKRZa!Mhޅ8_!Lc1-4{e 9 ^  `  XE/<x r [{8j/J}mux:t&5u6Q  CMPAwm   r X |&SW~9jSx\zk@.u"sQ^kj`0OV&`L : Tb&)PO  t #/ P"_N^{ k ?o ` D`'c@|L"NYtu%u]*& {sw;O|>^p  :  4Su)UpJ'  s7M hfHBb3s' V ^ L) Q $JNS&0W\?qN W Q i M{WY5@7u%I tf7+  {h  4 a! #= [ sf M !  $ t` \^V; i$e+,i 0|,YQE z 5w + z2  vQ ^yX`(*:5j= V 44|) $Ah"+  ZgdNt -  MS9aq    [  Ci gUB z'3&jUj&H^` X\nr  @c2"\1$K0s W:p L :jM! 2 ]<L.(p_?Ja5m,}RLs$CdZE m  hoX@"PZA^b/ݼ\B8s>" 0\ W6yo:\ BY8W Fz90>Ov | +zp2SG (   8   Wh!"i!X. 7!`L %G E5k@2* ,^ . Xg6& J?\+y=7 /DP17rSI}2v4Al$E":woe"=f3TQD  DM nNW x i ` #BzQL _` *,#d ^ U|>l|oOu ~Q~P~cl*p iH`@fJ)$ov lkl}kh'FqnLFIy4cQY:*  0 *jZ-r A3 ~^";\!(j,"~ o##$_ 3V A p4 XI  \ H ]  Mx:H z " ^R S U  H^d: 6     >6r8^ F4 [Jk PpK /=stJzXYeAGorIC(ܐ \iڶ`o@v,J(o"| KkP{Yl~4$~:7] Q{ H URwE 1ROMn  $'I&D! & i b  > @  #$#r!"6 "- $ ` ^s<^P  ^ } R3G5tx \-wu%ޗyaݍި + 8 P sd*JR?h- fS> H+ R B~! jH 1|l P &nj9} e- ,  2l=~  q u o D  ^ @  {#E$6m=ZY3 aI"= ! B -s<^o'{*$_B+Y+t76-6q7 I -  3 \qq mK f < rp 3 cv LL 1iFaFJdTArWBS{  o T T ao '   g   ) o   \ gI-V c,$QIc 9   &b  2u] A?89@o48 @ P v jx o 6{P| [) ] X b% K w<"  XUN N4d0d1P}H*@tXJdxN ux42#6O"Z  'c /s7HJOD ".' D]v ! Z t*CS}y=5fPz<1["7s'zW 9B)l_+ * yj< V q hf A"}9 m{'I I{=D6/R)K)-Rxk )]5 iEB  EB  ! ?EJrPRcA(4 ' #4!  % -3  6 M  %z  bo 1bR2 . &p =*  \ "   jX D =  : bD0|@ F z Vj ^ @q@J3 Z(x 3 m7\880ll $bOP}Zz*HI$7osfIK3f Ooo+ Md~vM v*7w' dX4k  &D{C.aYFN'h,v*(#1  qGQQ\ /d: )  bz 5Q !)0K}#  4H5 $ i?|' ~ o G S z >  / ^c0o*b0=no)*#pm\.8">&s"&b*=-&9j.*Fbp5 ?x nZyz`" :QN$Km?Z-K , 5Z`> rKV 7v0& 29d\- s\ ' + p" k@i`qeF!Gn (*8H?7s{i~sV/J 9  Q>K- _ \V $ 1 h[f$6xOizOG\'` *  -  v4=X  -    @ ! \ Zq / gnq nF(."(XLoq&2gfqn"`D}r<`~IFX@mbl3WjdQ$^Qp +5U`S  t4! :$&% +T ; 3  # !A 45`  ] (R Y ~h ' > B= : b K> D FR | *8 FQEG= Q0|sod= @dp !G{=5)bN>!  g 9 a *v\71edW@dk3 z  q > ZKIT 12nn l A2  P+e f|Z P; 9!0'Z*o W}%J6d3w,*pEf"AH;S3VS'\$: M )E l B1: I M߾ ޸ݠSQ*O($]T5g O # 4 O  WF GV."l( ?~b8 "Qy @d  o qv &xL:vI80f ! D`"d  r'% : 8 Z p9 ]ޔ(kcl-eVc"A@%)y a &' &b& 4'-\1$I) (+",8$ W iP5:j 2F{o!` X b$&\#,o(jN-{^Nl  qvd pG#x'p@< (Oz3f o^"J  v~ O5~ ^L e  WP6B NYH=9 o \-  t i)bYh\<:5I%`$2M: h3} v{ ]g17U FU!--GLI\)^5F W  n"9YmW bjTcR?Vz5k > U- : \:KhH=| 7 k MgL#  Z:P>se\hu4WO]Kk G:zoI' l| 7   ,KSq < f<d"K3k\V `&v $v 0&1  x `/1)Zi"zD W Q| S ymY[]QT87fdF ~ = z(G35)>2 X>eY Z/GH g=) (P@DISMSg51 pF0@   tH-U 9 8" j| [d$C>L#g 9  k 5D E$& $UT j; l V  , h.4  m  0r@Ssvx >.41"8&GnG  8W> T  FHN GHb7) ;"@GVS-&~x | >^ d P j m mk     @?r90E )z "d4 " 6W/;!Da*~m %62Xst8waU* u Gi% s S"M Iu | 4v tvu6mZFi*U96$! %rel 1|'Im-8| " YG> |i6{x:_iw S@lE g G N`I5w5|  &"=^' Z(z C( ' A2 K V" "$O ( %^h}$!K &C%!-| sZS9\"5!S@  ! pv-T"`zn  Q: Mz tsr z}n\m Vai+PU[;G Zn~ 8G+Li bgz  M9hK8jHd  ~x  g :$-' < e [' YgG-IFKL3 <> - xMKT% `  |  [ 0-:*" l1ig bn 431NZWcLs$ ~ = 0e | nV8- = zO &g H 4y@|MD- ~x+ ,Y(*YC$#"@%<`9FYo$I a>^\ jqXM 7 *HG]"ftZ ! Q3 lq 02&Qihhagw"O"/ &*` } 9M P j I}I i`i &  {f H#-! Z38Qn1F4J J 4% k[ = >  &Y &T\2+p; yxRM 6*5%R% k C 23oK1:8q-WB r":v] Y\ ^L^b d5  fo r& ) Du&DM :P 5 -k cA`3 T 6H  E1 :) J8e 5Q F< ] +fni ) T W kG $" V 4 u5o 3/ ; BO  +S Pp< GtJ *C  8|~^d\/ eF u 3Of> /D  (Z#S~#Z\ ' ;  m1%5g>TtT(myDwj/w_ yUN~'LqYx*XUK{O ZOz@q:>U!g"1J2on(%(}H\n >&C7~{ 0#ry&r y\  @h ~v 34 `s< -e+ M  if 7"I,&& 0@@O>HiST"'4Ii`CN2  6V  '  ^ %  \+06 A JaO   5> Xr -ZgxH@QSd N! D &\ [z/yl x~   '      (Q :\o dU) ~ ? t: LU QFyZo Y ` :rb % "J[LN& B \T* s/g )3} [ - V|}mUv& 0[ q69[9BU- * C 7 ^  k2M'$e: \bDu Ub  / p k F M { K [o+{ '\n"xH0aUBT<qN_/; b*xvH :C{v>ei3  &ff@} k>19O\YP~F)] Z &B dD 1=RB'N K rk W    :E   - T }' 6` @C>y8sfb T$}H`[  ^ Pc p  D *hC+XN=^2&}J !"a Z&I iwufJ Q  ; y r 4 A vzK9g+w\a g|:T  DM~IUy&D#Rdr-CSO19l3JU_};lOS` <  *k'"T 7;| xV 0 6MKF Ng c E  m D " z @ ; T J\ ;rC [o ^ pzv G0~~ ^ \ L? PE ^q I,' y P vG 7 e Z O uf 2k = (g o  ]~sQL^"la^KS]eDVR-sY,C|3zZN_HXDZp_4,Aye^@ f \A$if}k7O:  /j< *}]F| > Kl~; M h  [!!O_ q ku?^ pc psU` 0WjZ-  z ]e '  \"muU^< F  \XV\5W5IF (UMMW\&t- Fa6R*f. v$Q9+~>]+gD^QNh\:-tSy> b ` &LTF(Qx-q  \ ]LC  J  LR B   e G K x^Q)`78J' kDQD I : k&9zmp' <X "o>r%' N- lb ' g-Mj7_e  ~  7(x C g \ BdZ 3~hI&lbxl  RGNJ&!  ^  s,g  % #*:oY d 3 8bC}kl` | dP+VrX :q-+<}- W 5O 3> + lr ' )'/ 1 "   #H | n !p1 % & g  " "uHd 5 s @- @ dp WYKq8Jb  'Aa}NEK S-A11\slp3*:G  "  NJ9X  ,1U$pb[;^ "hv q X5O4 h97G/ipR{gmr1S(<I SK 2A*y #R dU 9v@Q . .S  ( iO  k 1fD Dv Tu $ i(6JJ^   0Vyf L*\/kBu _V  b 4 L SQu 5*V x 5 1X r i   Jcc  c Z >F$ &, lpJ^ n-ݐ/1AY  >B  S 5zGk__Z%J  1 q*" hKq=wUR" bg "N`=+,_z"6!a! k/  ipW p &)ROM e ^ R} v= S$ m s   p &m? k '  "l4L1 ]P V& 7F Y& \ "   ; '  |T1  7 wQ0AN4ۂ?IQ+ ]YM|D . r J     m  Z c>v T:VdVg%xH*5bwJl >Lv8>~p܂p"Av@ߗfݽWadav; 7.bYh\ @ P x@  }' 8 y8 :Z,h* uM'Z`K IUm s pUX5 p   ~%Z ,9"->+c)$ ` - ^  SSfY!L,D  S}sJpI @@$ m g " g s  u uE  ,,N`[0T  K=]S5U >_^ " J Q@ 2! !*H a[ :I 30   KXm]vlR gZ&\IT Q"~, D,XLnK  gc*%g7 `"(}FHZ>9l,?Z -qkFfG )  x!UN _ 3 R8  \5 jy_f d  VfI?lK` MH(O / lKHox3 e v. x]y"Reg qZD_E$Y5,tyJw9,$u`|E@ -z +~ e _= j [] T A }>L+IJ1 s#g% =|' 3v" Ll q53 y V .xPvW}=FE -Q:up : M<IB$ 5o: gGT "  O z]JwJ4  T >JrmdEL"k an+j|r},l17BP33KO;l6``<' KV i c + N 3EDu@eFp?Wlwdh RbO$6M4  ` k'Qc*X a > | FWNI4pg #R/,G^e?G58 X{  7t l5(0 &+2,*|Q( I$# s _ GR'& C ^) />%g'$Mbu5u\f 1 $y$Z$I#q~%g u$  !JX  v"!9{4' *^ ~7]O p_e w@}f N7ze*O"! }Q < ' Qba|9  *{WW+bpCQ3ln tt` kE Cx.`[~c  J&VfZ   85 s7.-c ) bw  5x  xx D KQ ^EyM8 U&  " p  w\6+\r 8I+@7Hg NM ` z K  #P 1=)  ' K S4 z = F $  Q(^ 6> ~ {d7Ep u<dD M   [;:kcUra0s"* 6mi  ' J 2w^7 + /"vYj Nb XUn^ S 1w*8ZaS9 STf >  ! m{+Ed ^_Q,5!YvFh v,7Nj 3 Qk^j" \{r1?$,?lTGa tV2!#. ' @koW YyDDL t  V 7 A e!: H {W z   3+`DymvcJXWg X~u"k# RWdO @+  4%z/,G"N/v}[$,&%'<*S'$/$# / 1 4Harz8Dn  N_ <}@F" \<Z(VJIScM @܊ f\~ W !A  g * $}oC.(8*qc-)mOWhve u  (L  10m G`` })Z4[i D9.Yb ^ukj%t@gP9^` / X#   @ :~*/ h ynR La}`- [~]Y!n2[ ]V= ==9 @N  *ud>DG&^I .v"   3B s7  SF3 #(!QV  GpXN'x vRbDt 4 m1x d    B } B wk  Yzn7l  %  3Dq] M>`& b2{ASMMeJ 6 Pu@*-j;: % :$I 7 k' Fz |lo5 ?6  3/*L>D>7 D  B@7 T 6"0. E  } {Z : \p W0Bs TkN-4s N4, F Mb A  V<7q! MQ. _;Zd; $bB?Hx C xX+ Il:dW^~ w8(|)(/qZ]uvX " ^AS"M '4~ Xj  XQn H1$i2>F.CjDjW \  AW U` q qt +/ &$ < o[  & T   9< , 3^LB/L\gF#Pm]dL1HGm| s *K 9GX Y  d : ^~pa>j II iD b $  A { 6l " QY+=sUt1(b/VF i&h Q@YF;Doc D z;bHNo/+|uLS!4:Z Dt <& oy R dD H \ B f zK _Dg DN O] oc e~ ^ N@  QR  I  Z B  *z =.Z) c*R jny<8me i "/&s n*hs "{"8cmr77\KL> *  2mW Zx^W 3 n  1 c<  9 : ^ ^  [| _F  <]Q j  * ->1(/ mV V < Jn> cZf03 ZDmVLKBJ{ ^= 8M  U jBbpuv5^ G -na|x KB.N. U Q :k :I@f< 1'u^$=O.,,n q b 5  m5 3 Dh E\Vi^ENur^t!M5uZR hEX^-DF'Wv6Z W8a i # 7 + Yx | &1Jj`j,lk1 fuJf>t"I^.F(BM^  K %~ PG x   f6 K )LzV;&~ q*5i}2l2PQ8 $fb7&~%zSIC@^S6y\g=L #y.5`x{Y  kH$QeMs s4s%$ (3 ) $O/ mnf #> [e (| $I4sas"8Ir]d&[-hgU baB G[e 1+ ^bU{&d^l 9 | s^:m=  X  c z   E b ` ^q B7 & Q }+wM^ SY6kgo *   [  !ZgD x(C(  4S h}_d&1" zdw~ MDBDB>qf hoUD O  \j!sZS  I  Y 9  ~dZ;O      )'P^ 6 me$1l6Ms#'GTr4N$= BT) h RYE!jIR): LF{Bdfu  J OiK WNoW ctr F`Kv\J  h7*Q|>\ ~?B[.T)~}  1vD@n eZJ5;olm +\I:-Ss`Rs::q< -Kz MhL .WLpLh6!"~~fY9}]*2!2Vaz_"rW`\ C$7${<E7|d?U4 ev jd0z4 \ RsHP92]%$o\ &ZF qdjG ^JQJwj &1   Z  &1s]4  @ + * P - t' y  U FVK2;(7 ~D1 d[,+WQfd"*{&$?8MS C.W&s9]T:0@|R/ Um*e#S'+$DzLlH 6i&k  r   q^>w QZ5>%*6pZ 2 # D S *U /rD$[@lZ T * K u1vkI:@J;6 KYT~ae^} J[!}6  $w`S<" `@ Z-mDz a (UT 71:dkA(ydxsdbR> K uz @  2t n  %I     OafbJ=Rr=f$lD$f)O +/ " @wWbW`X4{F[F_F-sZ<7i %eC0-/ _:LB-i hT!4`7^abk?1DFMQ # xr v  0 r{J3;k@ q%`l O3K3/ d q=P,I x a ~5OeEg+ 8 cu T${ : ` (L r M 1 P V q1~'I%%4*AV1b |gV(X#JM2Y!Q(d.H pjx'7F\(s|9ٶEiO<KntvS Z&D$ {`J0f% '* @fTHDlxF|"~6Aclv-COMD[Ksq ri +3(?~3GC. g :F. 1ߩͮE0=МSֽ"yK$=JM b<1 acl"=L7@ 5s$)uqf\=n's$s` p8|t!YW !-!$aaV+  eeQe8uFWm' k , 9~ Z  t ~1  < E e w Gh0^ 6cI9q&+QyLV%~ G 6 / _ !qtZ @ D xsa ^ b4 n *  E f 2 & Z` ] 4  l Cc V 3wX _ Xb |s\;1;` D]!'&Gߦ 0B4 $& QV^Is5w g p<xu:&"Gy' t 8 G x  ) 8) cN0 p  & 8  s V u" o 5 ' (Tj=QYuPgI pF-8C{K|& $$'C`(% A% zX@.2 Y e Q $r /w  ,(  `FJ25fk  D !66p j + > B | y h| 5  9  2x  (ki  4^ +79 -sn J 7{\<1{JNx&gIkt} >Sz O ~o5u_b& t (*BtT/#3 X+!$ /R@jCr|[ K" .> O"#A Ao~ Sfn [cQ/  +z`  2=O:%K c* *$= g _} < +    %" | u  / Q KYl[[ w| _$En,V.N/i-*w&2L71f sT fo]+VKeW  dPKhi7Z'c"$*{K< % CSY!f9 ,  ~  >&aF.H> a %|4ME h{, J "6ui  ^ K r' ]G  P   S6" sd}ng= =F;h1+ Uu2:EB $N ^O D^  + g E iz  O $  o 1#l9.X (@6  S#z' m ; p|  de d4QS2(aD8-N *~ ~b F  H4d-JL  B! W U {ML V)g-z-0J b g^h g!) WU,]p   A R' U 3r  3 NG x@@O F &%jrf =Zt'k _Xy70 ` V D T S b  4n=H = z gs 6 'B7di   M t8~>1^ qb s G >S H 4 f z>2O b  w 1 #   b Qh - I` .l D C D  3Y FsQU| @. [[S $ -  * b (  w G [[]Z%',8 /\8 r qx KM  > g8 S : J t<[ bI  o g *YSjm M    R r i G 1W 8 [E <  8K1 ^ 1 j Z]sQ M}^ ]D-8 O &vAd  [7Qer!    U`g J<E D! s>+ %-I-)k i oBjo % _ g- < x    v7 Dd91 r:J    8? . |  JC    6+ VD S 4 c |   c  f   z0 @gr ~BD" &F&{A ] m )|6,K 5G M6 !|{ V =EI X>uegvg | { . PK!  0  > Z !j<5 [>>P  )x Y/T u6 e +:M ' fu G] ^ f41`-5  2   ? h:(yM  qm  }Y3:LTN>66hb0#6UjQ^=rG :S   Rb D s7/2  6F y1T B k N2 b K  >  z   0tb H j f 7\! FK  + `A* c c  0gXQ(s^+H;dD;H`X^ph:0n3d3;"Hd [ 3 M# W ! [r&(g()q&),x/91V2R3@.- )>:"M&! *f@ 9z} 6:  g $ _` d oM h K B,mG{Q C  x0 Fj)  @t>  o  aB 8ih J  } W i 5 x `/w f[X:'|' '   4 ! q  an ^   l Vm  qZ \ :JK RX~2 R@ .F7 ) o  0G+_@+5A   tw    5  A  fF ^  <\-j  ='"G `  'f KHI]]{~ K4 :-WJ  x_ s   .  P 6=f D{J| I#vp&]k  I6~kL$&I:MvD 1 jT>s| xo{o YF J5 D F"d 0 +} 5  )  dpD  <   3 [ 1"_&  a Z \ mV N b Y   31 M ZB1^VHD- jlP <Z n q # . z  g  S V & ~ ) ~O    z  {1 3If*y.Ye.CB/N"Mb M m   * C J  e N y    b ivCN  K 1`vk-BrU?WW-R@d_/ ^1] ) r wg . ) Cb %  ]R QX 1- J H,i 5" ^u % 02H:  9 _  0  k1  & wFd Q  h z M =; -B\ HiD 0lZ! X K xS LD / r D C Z> H8 U Bl82jL8 7 %  % ;# UAdm; N : 1 3i + \qoS M ,WoK< 2n |e5 = S1 ugG~ 5uWSDKl c ]Z ` ) i%@8 *]H ^" -:$] 5 F"mB c kxf h gg    @ : b  ' <rDDF7x. (. G$[K^mMl GA ?u)B'ECT5:(b_#!4G v mB @ 4"VY$2 l  d_ 0zO uU  DP!H*d.2!< a  `"! >   ( [ * l \1jn Xd- ]< IJZ I&B2 8 OLp"gJ$[ z) < wIU 9 M\   c !SKK T6l kC  U@ h\.i~\!  6 /;H +]2 DFx Rg  8 4E X ` @  p ~ ^ .) ! ?%X- v pc b dFM|  W0   :   <> I;3 ,xc & 1o O`>IUlh:  3.  T R- y(xa;; H    G k_: i  z q )T7t y 6kdo> M rY `  ( 7  w [b  fQS ` nB1    4Zf  ; m J ]= S   8T X )1+ &3W bK  B97b x/\ W!k:V 6Ez US n[4z:"wF^S' 5 5`  ~1    *z I-  +zDz M\j r' J9%B |BH uU u gipHW$  L    X9  ;@ C G  |   Q D   T  d= - \ ~ W ) @ -  Z M % Z Q 9/K'|kS:7  K3qz zUs>  OZ :R  =  .\ Z ' C5l8 U-NY~+8`KS=QapR&b%`ZO ~~1L> Y : V E rf    0& K6m \ T  I Zu 8  @ x z:lc 1'3}[{wA4V<.Sz{Z x74,&Ml@ { 0 8 _ c K ^ 63 t : b \ E G  I:dY/dom.W<DG,&dTt k_m.KU~^Ksg%rlW^t=WBS:y)xo:h9Qm $}|  gx&(\~ o]0&f'cud~B |\[ZF-X ^ YpI,$ W Z |  V - % |  k( R F :N nh KC o8 27i e  % .) 6 M%J1&YvU/SDqFbWxI|7:fzd5S&$s6 QO`5Q/.Q/-~ M~]G*y  9bUQo(9@F/  ,   g / )JFt =#E5&yTf/q,= <"(F@ Uwx  x m  % "fVZdI+H`D PI `/] !DD> SxXs;HW/ VqH g%Z7d]vl huO  c & b u9D kOS%QRgFwJr6wfp@ylk&/MIpwGD7GDTo{1k7`^K KZtZr9zDF  @MQ*NI )   N4   8q X   X = y8 Y$ sS4I  8 + ) V I  b^{kq2-:QVY@z#bu`>dJ-okD}/OCYsnZ# 2i3><%H]16UoQv3N^-SQ&3Mt^ b 6N<~.:z)=. uQp4w+7, X I + K / P HCJ`F joo(xY/ t ST   <h+] < | S [ M1\osjF3FQ%u-8!utx=6\$1L|%wK4z>G!^ dL E*OVdX's"6q?by s4*qZAo8|VwmbmXvFuH| O8W@5)8F9s )uzbZ  e  ^ " G8H$~    [ 8SRUW w!2`zSFFsQQ<v#zbD~c&XmSd (@v (   ' )`~p`.+-  uwc WndMF2-sL3rol k  / B8 r- 8 6ke3@eUF' WIYg3&M`s8bCt8Mb6/`Fd[pp( ^X|&Xy;]w^M m O v ) #;WN]D2F,  .b M.6NNuEfm:>< s^7Fs&=#*Lzn|k'V ~)bi3 /WQ |FZ@ E~ S > s< =1B3"g ` vB3-vke<6e]kd 0:!fO;KQ&V({+bT=B@o$vVQ~b`zzSj T V&C  vPo]s\ kcqO4VOgU<0!"bCV  S   u\ w 6yWQ[~^@~\0%7ZDxIpIzGA/4Fn^4*=L=^6v: v]~~@ B 5u mhr^51Nza1'pG F1|/o0SI` o  z(*9 \>P~+w " D  G <8  * kpM w\#@ cFF}+poMb HF0q@bJp 6fo~@<m~ ,@f0w-h"r'dy/u_9, Js8K/}^B36b8+Mb}j|D1 m)$6#\Myiu-)to((TF/ Pa @Z U ~ 7 - f R !   8  d  N &Y`p jJq9Dw7=/]kYd 3' 5dO)X }1  :+$75km0\OjLSzw Hf JZN)3*| 6v@0K7[ 3$6. 7 )  NS3dw c  f8  '    6G ) g g ``>lQ\H1BkDT3/Sd/^D vSFoJ|qk{#p6qHv@9`~> R 6*  @ 4 p :@   w~Q.z Dg Hf3bj{dQ`dM,|qZ~P=z52F o{(T_P<y.Z ]9  X S|  ~ e b * &e rm t7^`[z[,[ (XWvv6mU?@-OAoGb> ;^* K8iOUv*/   V 3MF FA Igq`js d386/>[<g@|c Xxf#  [vU nr OOZ1(KY5,2D f J I 7 |D Qd5  -d" # ~l*'P Yd $5 o6ynB T^ DUU& km P+3uy1 VjNn PW-zZHYY  mG W d9i$C^(IJ`g<Q3s*S`G'k/3  jZ}5 L;l[X%*W|3@-h-|M4CCkk\<\^wS) aZ MRZ I sh*tYK('VK< XQ$KdS2."QgqxcA\ 6n |\H/tKdJ%NjR@Y`d[ G ad@I/|*0)FZGV s m  K< b" l: ` * Sv QZ  ~R">0>ThXJlY~3[9;Yy 3dlzD&:@^D$ oFpug  K (umHH O x;kk2 F b #b !~M$QJ\5z>! _}r3PDwd`yhp2~P$$Ih sR462Yb b*rg7yP5f~N <  ^  X W  91OH  WJ s  S D OB     h jcO =j?jV^cL+lsPgj sQ z |9=P'N:38/ pQd p2j("+$6{bF#c~@-G 6 z ] @G{=x>6Q(wjB7>6 S" ]0^k 0>M:4-f`?xv-~$ |Uk`)Xb"N^v\Tn4/u&ifL> H  >  +/ B+-~=Ly yZB ]e+|XI "^J VI{2"'UUwgq<I}5hd@0:H> m+jQ(_l\5HoH\I+M c/E_mo QT   h 1 F @ b  8v 4G66IxNS~YIDrYRdQUnS$g @I ~$Q <[eS@U$+VN"s) DGHIG4 Xr: U i ~ 5 D .\t2!6'4z{* &{U "b{S tfd17j=:l8Vo ~ cwk) F/ bNq8&g|dF$* ] ?(+Ik#_O  n B. }76,)-K@Hc*||0GQNP|N5b2k0 / =Kvks8lKr[X<6/qOsWB' z#z v/Cy~r_bl 4JT LlT"BE9  {  G w& a m^ o  = /^ o z * i6< E t /$@_q  3inm[w}*3&;lvS2-$\Ppx$T6Le v8y& p u;>0ZI %=M SO.`4a  Uq 5 l - - 1`z  g KO ;H-SvOmMno)?77`~uM= C cA  F ^'Fdju('<|&MsT9* UvE|4 S KN$m43mV iB #T k |e'2zC \yF3^ AwMf tI >g 2 Q  d { pe 3c z \  uQ,hW'-1=jpAye3\bZV 3X@JkuO ,g= | 1Kv@*x  xw/ 34 }FBfb` `5M.*BA/j  $wTFMhVF( .(t b4x  & lZi8"6{zdly_!>1  . xqslbLjFJRs -LMXO~1i1w$  A u :=RjO\J 6Weu}G@ ! * n R S A {V l gQMf8QzWhvmocn*OPB&gU)H%<<{WvB16  u7.h1|:~ =UJowRgj 7&< %mF|u*4&sSD*qqos7"@FN`dP"| %" q x' id@Hd6) 0v^Hz::$zcQ        19o/DTYxEGb5S @2$~8I2mJiMjLm6wsf|dUO= K"A pt)RToz: `]WNL7] ! 4  MG _bg$" $Z @+al:}tgf`y;wD(F5ny!^" ,zmVs~WoVogR&n^t G^vK$|M \   zsCz     i^ \9@m'B2n}>jFH7qY'"e~v  -]@ -lJz }wGKXzSd2>Aob\;c slM` bMC 18|S   O$DvS-`~Axn { T<='}9H : V e h @   * m  xo >! kpQRwK;X99Sw4"~J|PK_{gy+ t9v:`^WUD !9G@ O ?,  -  XV h qe  im - g&$X1"tj$x-^4d(Dbwk3X-SzM@De:<I[-&6 VzVb% H   !4$`%x< EGWh?{  >{^@ P  Zs w W5 ] (q   uF ~ -   s  "H   A  D` 2} F<?+6l< <h]g <5$XX+.:N!|Y^10 tHZ\@*C '7{ZFKy$? P B  83ImtT*" F"OV O8p P ~ | . |    = ' g " Y  T|  /6 mV's"lZVX]`wn=V"[@'^=3^Qe E9Sk{  (bV+0p\EWz c\ X> n`1 T\%q"Sw>Hzp[h7*mUc}b&Is`JLU"=[4u:^NO^(=sZHD  zFOdKy vj,pp_H E ]O Z # x  vM \ > Z  xCc  Z3 8 71,c xhW*dPb/JqPod`@M`:! `&LH"m [@K 0Hzs*+*5#D\7BbxY@Y;1 J*   N"35iZ Z @ ^I  i:m"HY'xCz1Vv"Lx,,2j|>\-d(:>j(NB 8\trP 4:|Lf9cj 3SvcIB#0ouY/.l?p* SL/]~sA=M`$/ OQ:  Fgvgg- Y gM" C\A$g@:d!u77B4h } +ub(^i0 /b ]M$UQMn-D#K/dmQ~*+4n; T*P&N-Xg # K 8 53 4 Q{w7/~cN dD6V 8aI}hX"2Rf"^fb Azz S}\! S;*t kUY_n6 G"Z d>:ZsO6-95 GV$EG<$di (- p ) zb i<< hq<\E/lQJ`$T:|$bB BW dbdtfjUS @ ~ :D7jlv~  y B +  UU  E @  M  pm,<x)(WfziuKz`7>11U:"J:[ 4-nu=&{z7 j#wrQIP,dgfo$\F#> Q) }Qiz@M3lJ`R#8 Wb zmcS,Dl5gI-iJJ{/ZzltI/V`s  *+ &Z X zm 5x N K ~ j t 0 `~ 71~": ;@IPLpSBQ10 [(3c1 w(/jox<@~OMwcM ,i(`QqPCZ 9KG;. LuSSB^.O>k3`Z6 DO]F99UKqC QoPP eYLdPD](WuI22 (N| s\Y(I 1|-s(p u^- Q z$r`6X[ DG q m_Sp Q  ~"*7}C@I3:Iv9 Pv>!IsJj32BPmqX  *m 4h\ M 6(:i  { uR^XB}"nS!u> gWZtVUJ5N m  b[ p  {'0y{x<^ s"xQb(:R f:J&%QJ^Uq` "|SFOc $b(nnxuP/ISQe 8O<H,Hyff  S  - TU<fxvKP:  1  . r):Q+."{-io *4S&Q X g jJNwWT}(YM@ % ^ Zu^h0rg/ K>k4SW \|<6Bm 82^fKyMQFE[USWylN~ uv Gng0)s@HfoD;$[( ` / , C \ <  C +V  vDTku w &3[|o:^I $XWy+` >>OhsU2HS;>LM- H7"iH_ z \ayta G  O  x  /@ G  >  #m + w#O#S:/?>[+1/OT(l0SMS 7* $ut1]> "$)@n*dl$\ Ygf[z >XZ^\6o z7I6 g|t /sbtyPyGR@^f$z ~`7:uo`}<4XbT$8 X $k+lwmek&~98sR HKdp=rJJejwp3 jz/%/O`4C'&]u I- ZA '   / @9^ b18gY*Wfi[,@ t 4K   d ^ R@`;<V: 2$x:i1,4LY1> 5|yS1 xU`au&~%G-Q, Qix3 `mxHFKO,fYF <{ o}  W` .dxiz xdJS hWW$Ng Zd3p>dk:P @z bAZj\  = c@"7 IxZGp^ ]sj=ZHSA4h$T3wz$Y@D6YOi~BjnS6 3^+f:*t53@myf-y9|_SCmbmW9;={oD/$vp5MvFI v 8@ b  K JE  s127^t-,=_]J ~*i*vYl)nSJ6A#~LV7H"lF7PLH3%2-,fgKZOd;`n"3lb-W01Tq &t 8 }TX06 / *lVwBg$dQ)GC>km~kia;BMNpPBD)&:/:l`jGY">?\TGP6b%ew}^`-$l@Jv$s{ $s 0"}{3K-&}8W|sX34/kdF k)^GJ{9:H `{y8>``Uz=0 4^]1!"Ll`snbo,W4Q' eK&YT0/*JZONw^IiXO6bB-zLY7/ %f*7?& d[&/MM  f+z7=dpV:~ xd": n'^ nJF&b > , dO &@3vyd`WY<oZ= 3Q&lb7oz+n`' Ax # Iv  b  ` 4 O;D)ZWw8SRDf@$p kW9&f/?yzdxc~%R8P-75 * @ &9 u q - oBE M //   P  p X  $A#z g-2,m@=m8E&^W#jd3 rS< &wG4@J };u#T`K5K} HiQ*mnqICy[*@~pQD-'q_,h:{7&f,8pzp)v]JTvm>qZ7m\VTqFo6V`pBc\TFm|H}wt" \ M 4zdIs8V^/oO )  / [,A n $ Q/wU(<(O7U,pE G F ' z V f | + < z $ fb ": P&<(BAKv,0nfz"z'@IzMI ,lyFD@ Kt~MQg`8Z4xM|+"v ~$I\p'\prAvry@%l%2c8 1/`y3~\zI<fJ<uFdD  8C_ i s\ p> 1-3g7pzzH%YwD8\N! g1@'|jQWUdDL|>2KoBsU0JrhQ8+Z?183K$ ] W 7K8#^oT\` K)G$)3&h mT \ E  oX`6:389m~W`w|/8)^Bg5Hs||OUs&M( .$gUkw:"nI  x,Fnso 3Vxui o  iU`J|8`fK`M+ZXJ/-TWFQ#mf"x+\%"lq}$,w^EZHq>3947Lj:fl&*%dV"yRQPBz-Pi0q:I^D ,5K Q&$$Zb>N4SW) @c'J`$ s@dtzf&**oF"*SF4;g]lOZzZ D} @&_ EUvZ 8{G><>:g:Z3"z-"T m1ol@n PY8u<bS-`&7wl#S$~uy5uQ8 '|1>$ .mm S  /^ n }J$QC;`Maz-&oD"bPk ~8|v=k3,#\s`u%y"^`9fDO01;W$ D3QU :@ X ^b 5u@<plibS-NcuRmJ$SF:`)-@H> #<6#7Jv.*p?>M4Md"S"8c ridX[N5  <P w 2* >O+1! ^(Q-fSy:uiOg>{bfJmc1<<3\gKmMMOz\   Z  0Y;,SPbN2GymVqWd{i!l@I"N5 **>=GDv &o'Wv i~_n#; .@#w|WwM^HV x w.z8Sq/Hv^[4m(Oe#otk/Z7m17SC>D1:y&S J) ; v d G Q LK)x:lD;c@h&`6,)tMs7a&  Wt $ V E >3-U^ UADP2`YD1 @?Q4-O&[ioby>{q  x-/LN\g<0`v)/MB:}(^|-K@{G/{E|I}p7W$^Q|,$a3   d    4 J# G ^,q"tDs hS#-R/B ju* kLk\3uWy(kV+q|k/`,W4:+"k ZQkN&yi&h,5o@vDsJ~JI>:/`JSOuz6,+ MV =f8 ~T L\  "Cb)= q*Q_WU F F I h d - @ - \ -g xq%5acJpo u M -QDxjwr~&mjf1`&&,o5 3('vK"l\$nU6n- (9*-Gk-=6qd>LQB$41/;myhd,| -d ^1K D Ob5W\`~ &xSzQ:c=f35OhQn@2.6L],Lr^XmHsj$ 8`b^1 "[q ` . T % s:B   G  ) S A j   -< 4 F{^]1x[q4WVs([}{>kAlF-BC + ku$x    #(&Hgn{tvyJ?&2$$( fb^>xhucO| 5|8dQJw*Q[]yoFodbuc:nI1F3< k(jwPQlw>(yw@wGS0&o {LB`S5Ue7,QItm%ddJ:&CK8mJ:0mdqssJz7Y<Tb!@ I|U&q3Ku @ ^5lo3_{ nz/'O~WqL%DS7  x_s6|bg7bz)|-1>7^"t'"3mcJE(wBWN7IFWa`U$\wy)S419F ;d{N Zw%%$\XSz|\u\ I|O_$Ei  zx\gD B9,qZf4R=KIs6sW+uq8IF5u:@BO$s<Nu|n)5xjos7&Gq5Do h^~m,9g3OV  W    K FS>b(}_ (Tlg:&U#pfT`>Ek7K+8C.~q{qbfV!8C~d^nU$ P l U@'/K0X\m$K/VC9dy,u`(56 z>`DGVo AQvv`S$C`~Li:#W ; l&F (sfm )St.z4n 3  [  uG\@1  " o G S T(LgFvB^55.DKxg U FEm,@|"~: @Ssv" {b&CQQBo}1oTg!"JZ@\ j>c, ~;zi ek%%v"{2@lWO(,L^fg- dD l{2:} 1 }~ 9  M H + v H M g D Q CH Z  ^)".~|x  `P  : ^ W5f<@' b)QT59 g ] z~-<  ml - ! / k3 i m& & k8YV 3 1SwUU}D3o DBJ@\u= Fq<& 9"u ;O Od\LUgO%Q2CO  3SIAui V +d@4@\7JmF57UjP^Qs'JS\$u Y; %(u,uZpbD3~vfb x[ &Dw/uv&Z-zp^6lwYdGACh r@rHb =j@VBiS6`rJ_;y|i\!1Xy0\3LsW32 6DiFg^VRJXMk 7|=S\9mxP "  j   8  [ vxC(ddl&/;^Df.M/s{ &MK&U#]?Q:68($P`:FgW5iF8 wDN :>+u-% fV$ZMq3p55_ tvXHhvI4"{QnJK5&ZST@ 1U><uWb`ID`HQGivFtBBCbW'11vuGdnd=c k Pz^gZ|,P1K `Ir^m"B,<FfYLTII6vNn3" \-VeXwgJ<2D3x1uF*VSGq9307d|1TkCV1hoF.}lH=3D7*`czf@^q378 ~R =&!yDT8`LvS\`SoX ni3|u" }u\\WWMh ^g =p-e1Soru;N_ Ust>Ukjzt+Z"el]F ~BXH(rj1vw 3 i  {4Jx \f OC 7 r  sG ? o P ( -$ 8::0_ |l3zASdu&~XG4>/lrS`Y6j9jBu:*d<~x)T xY>3(mxa11 Rs )$QcCkV?oZ1Cu>dlB`p%8%XC n 3w"^l$R` 433jq=l&:f @35G-z_ pUx*V 1 G  ?6 v E   1 '$ \  bk `~<;   -BJ/6S"QPbZZtZ jbb KIv)) CQ^yF.V@h}yD L><=Vz$j(M+- Yjb&&8OQ$|FD DEB}'jOE 1Z8e>P<0 `/ \v~>^2m"yM m@^DD m(t  Y Z D  :   zZ*82941qkDi` 3MkF(Pd/|v~YyB:ze m1u$llF-L reW(fe"O3/UJQIao\p41&s`Rhq/ySQw3[.Az:lqv/\8S39i(s.W&:p~D`BW>VDFD{P^++V/oA>0 Mn^\D> ^-dW  =/>;l"D,/HC\~s wQ8J=9]kE#1$ *x#Iwzf/?O7sc`5&~q6JAX^Y3H&f(P>Q2s0\-2@~JB&Q0 $K  lHN9\ Ws8~\BvS^= ES>8L? )^m`*F5n;&`N w<"``=b'J2+7$0  HH)$/@ 8 V ZnDu#* Q14c NsKv|/"ZPD36i%L/%bH*TK}2H}Rb *yF(lGyfNd]R`p m! (tF s& ] l 9-@ys(WB5F7bog^wBOsa&o -HW} D`Or1,`@b  \4~:I) !q")F@<\*Zlfwp7OW~~lW7exux."gun:+zLvCk#/(MCMz O-me#) ~)d\ixU`_^7ObH Pe = + T R: g  ^( OBt,}$l=L>sfjXmx4K@ VK  "2  kYd  ,1^m2ByIYMz= 1*9PD9}S4'  q-eI((vKI$ Zs t6,B#[{/*d\Nh` W s 3w.n w E f ` )FS`gX    + / K ~ x` q8,q-MV B  d3z^-XL1V`Jf3g"]&n+*J;ug Of-7s/| h ^=%e"$h-o|O| {s-B-$x) UDo^B/Dy)v"xUHBKm\N:i O"O iZm+3*X.|`O4/`Vn( y@' "p W W -   /  . < 2 3Z~J&p$" S{d HlfA(&.G "UM6 }wzZ4 E>~  8II]k.,(Uq7DNf:hhWW~<b  s^ \  G d<m    , lK^gz1~W$rq-+UWim#&1=~NG>t_F("Jfy. 2SVy~(J"wlTq% ,[gB^kM@<Gm0QX8s0D;S$mkT 7 + 'T u RY<O$l")F"`1j0nFq;,J~s1^NVI&9|hOfPmm:b T8xk: pY\F@1Mp$ P ^ Gj 4 C \ 8T k . @k @ ` o<x ^P#}o3o @m> -\%_Effybj:nb<iZWx xI\m  i =/kH[a`d#%q <o]u83`i j \ `dHJhjfH3w   O  s^ Iz&.&+o#M_1^/q<&q j~ K|/IBnfU3!REqZY$_s m?+k6OuE t}&`r*^FZ"S~^S*TjL(fP F\w&H#>JStyBxOxm  /usD@Ug3, zgs-/f0f*>&p3U+  2`*:4iTzJ~"/%$A/vp>WSVK<Z8H}nhW+~sSb -bU ^^`r;@x vI T A  a R O   A T >M  k  & mj : + W MbVtM\-k{Kv<&<1r{B7 "Z n>\X`-Upys'Wgb8$Q`/L "~Uuoa<$s L5#b1:q O"BuOQZh~D@ ?Q6Z^qif"tk@dHIbOWT W[7Ss RMvdN*)B+<^qph5bv 6^i y)C cuoF#:az,b E@7 .Ow/#>d\UguQNGxHMb v:k ^u  2 ^o@Q<= P/KGKFE[l qjxyi'$V`kNk> %:G( u 1@LJ3,# ; $(y4q*gM`(zVqxQx]   gD u j mz G szs/ &,7(Xd,>ZW h50S|m7**b@)L |7yuaL&c %3aODgOd-M[{Q sQ>K 4t / r sRxBzFP|(ox&}K;-x:m  K)  +vNq5zL"(/b<m14x +d N ShmCq- fP:CR]OW4d  dn `   Ogks DyV5]Fszoz$;8Bg1 C4|iV3wSNb\M"@2b}@^; <KDes"HB\-F+WkI:-Ge<^iNuLz*Z* "< kOf  w 1kgSOk[G3,O X$Z{ BTx)BiOX&\L Q:"3A9C&o>-_~t3 i',"3z,6:7 2wvn8# "u5qQ=Ef b+ GGoq98bN   7\[ [- K 8 w^ L  s1 dwzmTAF3+uZa"Plj(\(;F[*I<R/DYwzJ`9zDH}X)---PD\ie|_a i V&C+ ? - i' {kf7iC* 9! { 1  *      D { w q      kuBbVIXKxe_?wS1$*{T< :[~BMFo3ol%C7*,5~|hYl0I5( I(6aH3qNT^t@Q m]=1PP)5{r Qc`jC:6(Z' LB-icf7s*UxD7-=JSS@8"2;)!^Kx8gvGK cj:e*4HIb1wRA_i7n3@ ! B  b ZlQ:.&3z @,smzcK"0!EZTh2x Z G6~MG?7/Jv |iT$W{*UFW "i0`e!F\ify6jdFwmC`.@pklI3BkHRfF>C6 (DXNI ( si67lO$@Ihz1Cd0c/tE@g)J&Fg-I 9i^m.+c ) Bj <|/ G+BsZq{&5 ylRfp>rqz5BnvhW Ly`aMjx&0Jy /.hs," ^2Wg0 % o  5 [ W +D /*l> ) j /A + V ^ QU v IjGmDD$Gd4<  :(M$dPmsQf\|"~7= )t TS'!=4CIImb6@$*Q o=u //L 3 u O  FI l H B J | S  H   v 1 8  ^ p T : <+ u  ss:^.7I 6bF+. !8~ 5q\6 v%31+xL)WN WR8X S\"<kS;xG@3(@`{[sC XNV^`mdm A c x :x s  H )ZTxRR'}$AQu + iD&\q>C|IU,sI N@"6dfuZ"Q"2s}!lOq @ ? v uUT1v>L`   MZO@L//kB,fFDuh Qd d 9V`KHDzQEYOL:# E6X'++^l;CV | C/ &SF{W\PC-F3V -A' G e +* \s 8O "  !  g4:@WYq j p l g@t$ U3*  { 51mBQJ\7Fy Sy  v  xfyUhdC>>OPYb oj(Ls#)I%k(z):a dY$F(;oYq`*)``I7bw1t`,eYx \ > @ Z  Je @ rQzVO U-7!SJ1N fUdP2:YDdij/a S ) P e | D g 4 @  6b` ^OOo~o > Wb[$,VD?SX`S9\o(QIFQ`^9"[IDt5.&=t2iK~Z (ZuoDSf/ynzAPHg F`|xq   1?m?Bz\`:$Y>ro He~[!`91->E/)8i8@->|K)  } K<M( H W 5 3>@ upsEj-K7v6}`S&MZ$UMVC~v$GF`+$6DD 5EGVbwW-%>D/ww *(`}cdqZwb.;k9<`+o\By9[-h2k9,Qn g;#e,^ m w s ]) q g 5 $ D`K%G{( d 3[Ob f<)lD1b> 1M   & ^  :S&Z/xfDIsUlh/OS{4RbSwD?mYoo^4+I015/K0<:uf} b : ~s 5K I <> ` x F|>[c;&(wj u J4 HY ( U D Z q v %+ ITmx|(cX"1 P[b,R"*z e \/ c x I"ZT C`$\Sf;Tm Suvd>VDgs\-<BM$w8Bck  1 Or g B[ Gi-KrJY(Xq4u2 h3g,I9b6qY - ON|(8EP.1 bV@\&` J  H ""1V~r^#  + 4 { QcO(Gxoc`~4+ qRKK\z?>zcZ '>O f7s !J]1h&8)}^\U=Y[SV{eCIl[$@  o2 >`  T |F++^   8  | 4  ~V K  g.0hu`ZK&96I*gIIb*#Nb Ri{5LK`.4jJPWB`tLtS"F9?KL=@ ^ L~S1 |$UbRw]&Ff5Ni <~bL6xLR.0o#{b  N%I(W?* 1<q`2m &SXQj}7[ h8&pCHQNX `S,WE(o kF>Fm zq=kb 1ICw]8L@FFp'`%<{1fD$v S7>|$dJCI]34DYm6H"MBkq$C*/U $GB`Ft)w~"-wzo Q'dm:W~q6:iz  Z   t / j C{z{ixRw(SbS}B/{fd c o3&h<@oEzZv~O^,)kGOOO zw>i d ^ { 'hy(fB/sT&kYWk48  ^wW*W BS j>qb1`@,x vMn ~Qr8Z'Fdm7t G69p h" hf ZP " eBTt k 1 & > `p \EByYu@q:u99{I_$-uHS7&9{6M<j-x'qAkPo }sgb @{*uK "p U / "4}aJgw"=`HsBS:1g@BU[ 2?\u}3|F3w I4+|qA6o}S @Gj>FQQ+`w- [^ du- ^  ] -boz@M2xn$(MJA@2`l9JP)CX1lSVJu~wwpeuSvzd0Oi6<2dfuuw@17DN  Xa(q p X3]})x ^ 0u`&$ < X 1 A K q K < & 1eu:$W\&P/F _3ypV%V;mMr#L 5 JFf0p*(6cR7,\v!MM"ml/D3>si ^ Gx Z#b+Q[4N8lx=Wd q  +  o O\  `dM$vcv!N&B9,enQi|OO<*^6"<Rs1:C[|2`#wM$"%:(Q ov e4%GbX$ 6P RQ6)|3~Ov`*1 *x Mf!88 [ ~ @ s9d9k~'<1|D%U5 jlj9hMvxerv|uP@ &S H]U 3 h 6 =B  c Z"j z:3 8^d2mZYlj`H| a^}efyPWSsndu sJd1?qa1/ \ hC/R3M PW9S:U0kz X * 1 D v /"ib~A u   : @4 = Q 1  O Uw  \U$\wMTn) MS,0_A&M72{7]t}8sd5B mJ@BvHd0yos4mouoTM5y3@*xj"]rb&<t/z `G*u&-pMqiM;`:0gp007|GLJ uW@xf]F&8FOO$n=CoD"mii_ C x@ R  M B g P D :"6Yo~C4GD^d6O<oa[ X(  *G |'-:\c~ Qazuh8|$/_@ XjB^UI,)1Q=o T D A [  \Y Bi It-$M`}Y|CShQeW/"7nZ++O^F&/M Z}yf\WQS* N l  > mOfsUD6*$_JM 3ch 3J 2  k~7L m =   \9 y   @ o ]  ^d}X&#K9GBVNWu6V|3$ TzEmn)zj>;uJ-@ i  8 Z )  s s q I7B7rD X^ ) `GAX^`#M@M[J$nm W^)^XSKMVU]G`:oEO@S":K27~f^O< 1X " l  9z  *I b o Wj &   G BdksU-\zQ>qdZpE= N >  B1$~IaxC-(>uB z  F< 2 = e K b  |${&WmuuQ[QuQmnpDm `K@:DOMo6('^q,z"8B'u gi3If|/ddb$\5T~z>^V"O`6`0ssdMY5Uj$[?5F&HDV9L`xi *|^d*L :W*lgFvn @XsO/s #I,:(l3?* ^&u~QDhOQYjjH#Z@se4t@*3JBzP~Zg :l q  L U8{=$?ib =W  h: < ~ CK`ff`&J>}$nF)d("WiH*|tv :A7x~u-xTgs8 7qw2L"Fs)$5  J t3q q  oauw:FM-SHSYf74VeMC d~S&iGg7g9D ~RNo|ZC3+i'VZ}1BR  #@t>'G|gi6sa H  * O ~   Z ,psYt`1LOD`:'!\BBx: g1u3e| dS"x|spDftE `ZGX`>b>LW\e0||OL,^blD`/uDNDax<"*^r,uXokk.M&> KV p  8; | 5 -}"x4jO>r s ?>+UiZ )We#Nb*Jom10T@5^^Z8$rw >Nk M C |  @, F 4  Df q D qk"i]7<FB1wB J  Mtv2+{ UWlo7\ "US}Me+u ~q -FoM\-Z|Dhns6/rb~pK 3d&q|wlYTw*$ \  ! * / v T i g bZ4dxDy8UV` bhf-uHd~Z3G;%6@YeT76/g ) F ~{#z)i @ OC$wCMppJvNMQx)~5(n"YPtV{m28=10  | w* >} V o? f 3$ R@)xmsN e g /\  3 >  w 4;SY"&Q^7h\?dCm@~HU&$1/kW((<R8Fm;  mV{g'vm^:^/g^ BgKwtg>g5NL83lwf   I UdK * 4 *w`J8dW;`U&Q~"6Mm$8XbeMCc:o1S+d ^UD+iD.l9~"cp c     |  I ^  &R~j^5 ?y~Sj @V.B|(=r/<9)q$0#ZX81YJr$Hr9%QKv z t6J:CW&<   Q  ` [ F Fu W! ` `5~I<v i ; H ' ^g6[d-b>5,2jp't/xK*gN5vv|dI(VLyOC-Zno@M3P vssb  x   { Jk   H  \ b @ O 4]l2ue`F=d\Mo6hDL[IEtku\O ~]~ryg =9; bJx ^zud 8*\4`]1x^lAh:c|dZ0WpY~K4LWYLUd->CQ=o<W8&#kFa_dXgjq/U79;W"IK\5\~@72;*y\YV4 3|@xOcAdJq0<Be:pQB $UMq;. ~=S~0=JJn:@l`K FV|pf3vB/BF 0>-}Z>v~< B g  \`S  x m 3 t x  FK;K-3Bet  = ^ ~~gMtW 3"^F /mkm $ H Z+7T;PfkBuvrXmY9N 7ZHP3\wyO M7-H_so?mm3ly M<=O7e-!8 5eM/%L>& Qj s5 =[#m;+(m]hFso(fAqD,+.{+ )"zo#d\8vzO OS]  z & 7mnON dm5as b/unN`,GVG:/ b Q t e  4\MM:sH-MNr>M~}5V/  R2W^wf{q&beeQiq@ F-c~(UJ4]Zj^& BO (J7{% U n [J/u^ BqK`> ta~(J &l]H {>/B81vV~L&V 58]B ^{+tF9q1b[Bd* ( dK ^1@-/6g  z i l BM    (- S ' &@DOO&`[,`Z"ZFw NV}dT-+L - sf/^  ufu7 fPhlOAhF7 =  A mOO >E Y ( < ^<dHN}nx~'?vx}_ :tT+ZK=6M:\:M$]bZmQi](Hiy)9}W,=Fb$h:j1H VW X   * < @^\yDr]BX1~jt>d^;s7F}77FF7oFyGwybF#U7tSJc||mp C>,jPS=Zv<&2GU<$OA DNZj-F [ {> f gz ; >  FX [@~}xB@1\sS{"G c` zLO\6j-9u .St< E o<-z>~VHv7:Mzv`D`{7v2_ES"q?9   P 5 ^   m =~FS ;*B< "3yuyq9WhJL"Gj#/A 8~9m 9%(8T>Lo4\t 8 X \  2 34 b %q#6I%~#bMfN :-BbC|$pt#K"pE[|h|[&mf- ;u6j]7s"D- 8b4z;U %k1/ ~@z^^Z)N<.-{g,6?{ \o-d-[oF`chA[K{ o*F^ U_7nT}Uc >|`O7^cUKo^p$xDDK ^i:6`F` Aj7JVS J   A - D  K 7 `  z k w OAfG&.U 1YP7 gV.^JC4!c0KzUWZffU G8B6BO7bnK&d3y>y h|BF"BOjj8 @Q2qwsojeSJM 3DJ$J>|j1O\?<M0NFF LG1R"4s k5xH4/M]=6uE Vu5YP3=&L6Sk&h\3`@\ Z^(t/G[Yv* /   1 ( M / pM aypf>~AmN',ys y_ J3"9HubOFb 7-1Y~"(u" 'db0\n:ZjazD">^$?~#>ng  p543~ RGZ tRq)O \8nY1/|W~c"%-LE  wK P Kg*[ V"I+tS @Z K [ N W ]< ,S o  *E@*-$-O/FpV!p \PvUH1y@F\;6  Yh9>,hzoqo\|/jQ^ =iZD l >  2 mV\n |& q? eD 4 BCwi`-XVJcO|:VTL>QTl T?~y|B, 0<*SvjL9P@KHN$FdyCh8eOC6G^.`I79+W8)v% x)`q@Qm"+iH[wj4 ' ^x $sWw=d'OcFIWol-OxUum\Hc>Tqr3scB1E1+nsH&:Q|lB ,xrX VF%&mm&  5  z  W`1o+~NoBV > m  x@qv*zN b\En%v { jDuFZyEb,Q3 ~ )  .  OD  | M F D b s^&6=&/Hto Hq=\lMc6O^ 6M/^?LKw)E"ZV.Vg4  BFsQ&d/KsT1fD"\1}ab)SRM 5(D-B[z`<pl&l<3t3dSH1*3$(VQX< ]@j c621W1(OeMSg3Y+-M"M=$6Q\MdlgVj)Zmr6x~-Ai:t1|cE>OP&|-A3"m5 ]}U|I-z(PbQgo#}v^%T<Qo?/"A `eq:% ." 5H[l\k^_2Q)pYs^F s  i f>  K Z 5 I 4 C=LdOw=wyu4b$5C[:&OjG9Q6 .i YZ;I;/ 6cqnjP4*L+-6CM>e-kQ:@JD$ 9js\~"+t+\sddkcMJEk l%#cK<$uLZV1iY4\v\4/* SK "us(*!be\$33NUNU| Tr$xkyfE0Pd63bf1 zi(u(ZW   4 n n " I l x D %   ) < ^ ] X  : mI:[99&K>mK8oO,ERiwh(kp:.MOY5zdMM7w@MIPU > q$/o7-bw-"U{s7xw6\lQj-y-FQ!Lc}Ij=9PP*\N/O\ ^- 1LeDdFBRUK~w @1h`@7j`1QZ V o  $ &N + i4c|h/eBhDxd:YmnxI4r=hStYQ*xsZy*I~K4-VRuiF JVMSM7%\VSmJMVDU8Mw(/ N     @  "  * jv A   T   1   ^|B&Xb\-{%4zQ `InM Sm 3XJk~8ett 4w: $s ;B&.)e/c3 T8bmMkxswU -5B+TKt0eL* UxSt>Q|DfyDZ$  5kwb6a=@ JD .-us|7KF*\z[=@m `?1 (h3o"v>/'QtO2+]/<'q/ ~O:/|ku i:l`>2(_Zy1bU H xU+99dl/n{lnZ7(=! a  uXXH1D J > uI=3ZJE=R-6 j|d5 +&tr#vv+^.OnnVBwrMq3B!+|d CIzbFIs(vz7sZ[p,m7JQKkF\/'1::Ig8S +m<d UwU-Csl "-N`R  49n  2#$uI "X\nTq@m1Peoh_ aS^r6s (jX`NE{7Md1`+o/zOiS>QR  - O5 -L Bu ~ ) l[ P B "  1  9Y3Mu(s{*efW*\xc=.i"2I~$I/xqW3u"$frQvU:94 ( BM9*W)c\XVYV~ i jC>dC I P7U4Zq &XD 581D,<BzSm'g;J"xxs(2wZ+ywL4/~b"P( 8~-F>  VQQOMuysGvzmZ b6/q :o8I~?K8:!xX}g_^)ikq s nol7-b  hl *Z{gU5&hx |?7>~"jY4-LK I>`^yt$ ULI8^}$T6dxf(oBZmT Dh<8dHwLO+,bND^hJ  W4 ` yj o ^&k^WZ$u0b @ I c>6 C`HTywiZ  BHMpq2Fw[I-xCv @I"^.bV v iysF>; lrD[wp hZnn:.2<n<T*@ n Ch<H`aw[c$3UdM)X+V=E @`:~6(7yirEXu@# +$ -,<:$i >    ^ ?  yasa&U`F1!"4*b}} = /O zk5k49$9,Ll~^cWEGI$woS8>73= _ J << ` Z Zo t{ 8  Z_#i  0  =tT}3c3vh &u 8`(~,GIJjz6hDA8+1O&c`</\  l j   L   u6`;( [j1oQ    9 ~S5  yV ~LWu#$`8^pxz^lg@G, @O8 B@@Dqu<6Bsk33\  S ) q  4 5 p  1 m   C | $  :s)(jHn |b61g7<Vzk-*r@ ^B"q!kq-*b>~5` KyUQh7-*Uy}B R ~P]z`n4 h  F 2 +fp@ :C>Fg/soJE f~wFKbX#:ox$ }%n TBLDhrUv*`uPwV S:fd/r]X9W0o1_;sH`wwX ,Mq3:j8:XG[F5?MzQ8\b,3{[D &L^V:3yU9Bu  SL < T ;6  @ =QUyGk0/\39OfFfj)u5DS  5Z/9f,Or f8Is&6: 1_ &(" :P[;1@xJoS G=+ ptw ) 9b ;  0S   oV   xJq4Si(`f"$*@Tjmz{d(494Uzn\b?kdz7Yw:EJ]  *  0 s 7  o `]Odw]576dVcS `dB`u`/Zgg2dx*B%Q9Vu:D6Qf+UIf:VsIQc*9fq" ($su/8UN  oFk:!X)'lHGM0 z k 4 dsk4TI+@)4x0 Qo|6E4>MAW7PS+~"&j ]kx<7:ONhjQ'P j[Q1ay^w.I0z|'LYb~uj@ S(ms DI/Z^X8*z^j kI& *\y- ndS M: *"idn3dTkU:fHb R`"D Sm& j> Z893t9'1S`$ Z,qJSbYriddKdQ~(z\T@@hA[J7j-DJ$Rxw{  F^(kG TU d~ R|:OF\\\KZ>6^E@' Yom(G"h   \8   ^hGZ B b?qvZ1!8(lEiqoU}|jP R:}}<&T| 6[ P7h+wt3X- B kq u D b[ U7Z:#z[^{3Q )|S" `kr+ ~Lu(<?WjF i|"-O1mMbM~>/fyS*Bb@d:mFg  iM,- 4 <JDmW(M x e g    F H      DB:q\f|"$bm%/`=v{ZMZe-K`i-*d$?> 8 8 P  ;z ;T@q$^Zb@<^ "T    <M = z   7b q W $<]#^j^jj/VcX)/UjSd|7xV1m J5j"FY0Q/6 @sQ B   ]ZtW H H m"MFk  <T&-jKTs%|bZh 1z0* g>x> ahff3JLfuwZ v~Ekt`-m:1/2 [kk\WW P: ze`?W(*C aMo<^@T5<SD62zf`gZeV6Be"#m#uP'd~SkN"/P-0 4 f M |& t V- 8C^K x  zc ~  r 8B c Z MS1e_r  7AFbzw5 $zP"J$"Fb>lD b//!vE`>g:jba HZtI baG~,>oNb^dvJK$[<a p 0 Lf;]mssKfF?hV7` f"$rP`80_m CS}s}O+ p[>*`Q&=B"^(Z Y z{F>B>0d\7  a 9w  @! &xJ$(~!e~-fGV~ODdq|S-hu#mRZ70S sm:o`L^G":-TUak q: :   v @       Sg,DtS."XLXi)ODR$Sm{5C-V +$Ou]W qKlB-UqkHv`c4$jb` K B %qd|^M|.o@ J -_q2E(> OmJaqd1{i>Joa*3D7bsFfP(  SqQ|" b,c@<ldo( tN96Kw| >s bYc q:SB[S>w<z3,l  ^ o$Zkp#Q:J3#:Ac/VBIO`+<\)Qm; wW;[Ucx K/I^s2`9_9 ^ [B`pP.g@sL 8 K X`dDmSs H 8 i wV2H^HH l#]2wpdO9~TQZH l+F ^/;RVR,Q}8 \CZ5(5 Z  Q"Qhk: \.   \ b z Bb `E `,cD-,~J,oU|9yd)ctYC.$9DP}}>,K)+p v -  ;@+/>nX >4 U S@B"Yqi-)I"R-lS d\I 55>;|FJ3sdDogkb\DMl>/#R)fgWb1d~  +AI8vIKnBmSX'~  [ 5&{6@ gicZM\iz "x[XLYwsdy M]_yY?@k[O:jF  ;dFd(3IT&< G],y+&;$B5 7 @t DAtd  L Xz [:g [pBkmK 0g-xy$Vm"O)flss1-${ f v`*q bZr|o6mB56b`Z|(Co LU7 "  & M@bF*@7^hF< 8 ^d9:MMRMPJx8Dw,4z42T<3AO\`zy7S"jdd / f", i Z  m  { V k6/ f::E6 \@D\1^sO Sj7y  y\uQQIfSdS(!rZ t'EnEe&kbOfb q z d k0ZFK+[vO| JbBV :pvCte#"7brBFC}p ;uAj L=lc&38`t,\s7BwI;}u nM+  1>"Yv/$F^3 >1iLhlh_bs:`Xl@Z//~B#]xSg 1epZYg6KVi3 ID -0oIoxzZj\b6 1 [  } IY eDB&R3%`?k@_uXG*&f+Q(jR <-S< 4nq 3 NB |M) |"{qz.S 5.  7[?.H{[L1~-[W(0uZ&TOy 9~&5]N/@shzsjSj3`2K5N&4 r n W $ j \ B*  H  FmS! 9X Z i   % o 5<@{B` GAdvE r 01SO$ }bN/4bwm $Y \| b! 16Yu5 *c  1.  ^  B:FD0  K&z5+J  ` H| 7j|:)Vfu<^k\L<)"OQmgvNRVb (S 1    p &    >CG Ni622ZSNB~cj"8)b/p/Ehi\$G3Ec&dw"-//  brudZ ?m|5 5Y +7@k$VV~xVr{,1lhL;9 Ev WQ"9d }c}*"OF Hv@V.]uij\$2=Z 0uF\? KlX/ PM N $~ EZX\  6]6"( ( . YI-z% TDE"S,ptaIx>{Q6u,o/Kbx|2 $yuXq>7tVt|BS )6b`4X3t= ZXT` 4]qBO  j h s;  Ok    QzyKeUm-F$A1f$ ]qjyMmxXO^1iJmD<^^: @ZF`p&$ 1 db<~5pg1$D  ~3>+@C3pxx*F`r.k\j4Q>$[H(&oHf+>&\fb$yduEf()&#*7}9/ 4k@qVx SSTnC  51/:R w K8 ^ jz38w~V:1y[(@yWF( * S7Od_6<FS:{qwg vMqp4QG@'S2 uSf"~ev<'''4:vV.[`5(] ^D M  3%S ~H n    Y>`kP$ uRB`]6X6<8~ 8 *-sx78<j`$~x$Qb$Q^D;( ~Y)d\9|z \ TI|LK\E< 81 T 2|Xg~  zx 3 qQvB)$,!bBOQ c l  <  fwM$` P h(e&dwYr,&?{ m?SP@^ -j1&0Ux4FR=ktVe2g V)IcziVK# KK $rV'<9 O K +/6u em dV'@(]7 >W59$)H-- _ u]L"shW{hM lq hW h1^H Ss )  $b ' F m|  t x N `@ s B     5\  F O $  z 7* L w 3 L z oq&26~uCNC`z6JkEQ)S ~VcJN ,Y[& ^iW 3UUuF$ N Mz @)|Bsh ' p s { B< QLbd*:?-=4b8*&U LHqy 9 vn``m95=YEg@9~5Zr>`ld1m4wZ4v3x`} U^ "  2  H]  j j B U7"D!`J(QW (JSbG:Gk]SxIq9q(dl@!+ ~b[B0g35K  N GZomAxZkZs/D@v+`4'WC{ =W-l9Qd:"k 91z-N6 & izX lR.o`-F9A\'e- IveLB(r/u"L&Y7b&jV^R4`igdP d6QX5gX>`vZJQvN:/8Q &`qV6^"+b33 $ zVY=_*Y"d(F d+w-|(@({vm`)MmUM[)/9(G{*:&xB iuS "V7Sbh)HuMIPOB~f%|=COc{$7>oHY3LH@UMGrb 1r$cb8-38=>b~*U(4MS&`DnX99)~F< m!|I%[sK MP~)q iZ :]BV^@*;S_+<Y&s 0hIjsf`u=k]DfQ4l|$tb6 $OW6d\sk4@*:&K x , = |  q bT^q7O {s&M/L"WS G  F.  P R Bis<cl3W3vbvpI1\z$shxX~$hl{ 6@^1@QK* ( J $$ 2 h O | T5 +Ix/blc/_yXbJ" t VI+- A  X& Qk( X*Cy7_mr@uu(TwOT2Eg">=YL$|je4U>s Bz1C&&u LawuD{H7;4` 5   q  l@ Y>z3 -) $l0}*}|u[FT<Zm~ !IL _ /gb 9 +B2vFMI_o1g,n&~:mXH(Lmw PdQ{J H$ v]5t  V   o . X d42  &7&bqr5*eOOzcdv "IiKz?G||I~~:)Zq q \ : > q N |1 \(~7wy pjU7=7P{` >9uki"}y\;5IVto)1{nz6b6oi C-SIS=v\\}om-\K[q?MG,=,A;D={y;8E"zd:Vp<(q8 u  j  K  $ A D -X$]zT|Fv)|j9b8\U!Z fuf,)`65&b"z |mNqPsB;#CWS ~(r 6S/E,Jf WzQM&1npzYQ4s[YSR$BOb~o *>/,S@R=xM7dMjD5Q6P.2*4Yo:T i + J`? YfbxVuzM;~ddT'~ ~IV@it EMY"\f"qi2%y Q  S=W/fe|^}s5}w>hSf7FXp7C^ WBnK l%rMVV/%wbX`>z$DdC)zs!o>?~nV1U"\M * %' ~ lRVH"z @;DVjj<`"D^l dP HCSOkjmJ`3 /9D7D^R7.;1=7cxVME$exQ:x N@ $Wpq*z-8yzi gajOFn+XgKr@*bxHm EpBK HYbkfOCj1Vf V)s'g^z\`01JY\<\ vnboE(S33?o kH   * r cx * Q %<@.k W j  6U(oU%$@3d ZBw*Z~^*&`@( L9^#|Nc G4+>^|[KOw[D f,q(u=S 12b~*l*1$h]oTIC< pKC8>6\mXJ)Y)6t^,|Q[b 9C[&@ FGHY  V   - {2 j9dj *\FJ|B  @F[[So3F>JOPd+`ii4\\- 8zexm%v8  E | o  b ~h\'G*ST"?' 3=4CIQT v(kD#^Y] n`ldwd.$fnbvAPr6'Jg^^$zP>A4'`{vpS>(f9$&F@g8@0t}z\*I^i7q3g6{QD39jQ|6QV kd/H^ux~I5qeS OP-s6S(1 Z? 7D7Z7g^ vpvQ{2*&B; s9sgMi-`j>YX*q1`BJ&`` 1|"fK g c mt1\zV/*pbzs`:"kVfmV` g>U&Aw*($ur^owSU74-ZFzst%|f5< ,  {@~L C S 9@jdl 13GMV|j^n:|qo`J/| i:SWB^%@~YQ.KvRG(z9i{d$ *3s*hT<&0yP(vH{nwwZ{DY / >buYY] /{  M | "B <* l}@m\*;U`=7 -C''@;b o;lVcI g * q+KTI'] &J s  f/bX`zlz]5~[x&@1O,7OZ Okw'*r`1)M`v)Jjl?*&W V Tx  , m$ C, H E E  | -p H;BBSXzwCc"d@d("l;-2JV5c.F>s 7 -M`}O C"b$L66gdV$9aj> 0 J <  m ` (  g s}A;"s* yf]jEQ"e/*_@; 1P}H6$>ogd, QObctPbf`DD2)^#tG> @ G yw|`Z:*  z m 7 f u tE R Vg `N}<_Qdnd`b^1FJ  \0s J[tjbLwPYf0Y{j{!jojc{wdJz":Z&,$t@. $88Tr-  8(xD=3L fLZll[(4V*>(A;*rQz^N|zi{44I)>OzGiMcdH0v]dW|-> };blqm% *@ySTBzV"K  + h a Jz 1J39ne lQMV]C-:]TTE2`>;xz3S6H$*aF 9G Jg&V9IW&jFuuu*&1'+$}SR"<, L Z (V Vm e r 4|  ]h u }$ Sh@8l0 Tc ffgXTFfCZ Wy;W;G5/iO(Rx|3 g+gg Dj6)6Vssbz7k tTMKv voUH-Abf@&0 - u W z  (3LUO;X73  {?Ja&2_1o,1 )I:cXW[OTAYbpv{V]@QG ] ` 5$ -`v [ _&9B7^;]=O9D16]Yz&s& =z* TFa~ hIrW>:QOT:9oB;H & 1 d,#B*w3u^j IF/9zkRcT fG l]5f[ L`_`W&M,MPBFZF bC*r[1bzt `! @ z ` *2 D =, "~1FJ3Ef 8~zt* kiz1RILXgqW"JFOMG\hNhQ`:V$~3FF* =,lZ)X? :IVKZ  WEBs-#!#(d]&Rv[C3"8X 9> (LB]jsy.*Hw'WP*?5> x6 Hmio|/ '8VGga7KT9NNS~Nh~@,v- /zQ`b{Z~vYZ# 4H{L~rxz=# rEh-mN/"`t6: d>xCezg3E D6/JS= h<`jl]9p}Q.l$0tt`L_~PfDU1   g  =.  r FV  dDUBY3 u@P@Q:vp $c M `jt*XG@QD C{$@}|6PvN RV/ 'i<TKoLy0{QQ8Uw`h =P`*d>f/@@!NVuh@Yg24fV7L(xEzOz)08TH`v&&vljOPL]GV~zjY)D6@^(VCxt`x)J!  q(H`jjJB,"Lw|EWV+b!8Dz`CK`*B(*>-9>3Plu V5o l,w1 `>Glm9FNsd=2S;'Z Cm-0 EV4dv ZL+4oJ7d&N`vAx/t\{J*:%lQ``i^az&E $tG[ $jI &fV {uD|.Q$ 3[u. Y}sM:y#fQN* N6, }~PNU.%3-7#;1*r&3(qth?@V@ IQ c7\S^Co0K),r(AFDJU~.vBD`v$"<u!=VdH]f`7]|,@/ A=&"#z]}0{yzu Q=0*cp\K0k/ I T q~hk H*1d, 3: =p Uudc(DS1rk^Z `imBZC`+b ~z#P2Elrx&Q@j{(^veV%[ >@d=jgr _k%`F@o6r^R T(vdWy$  3`}~2e$@Rjp]l=p9doj;l-2d;A& F;T6:&3X<)b98Pmn >xgPev Wb7$S"TQyNPb!' T(MC; s@)$*ITwA,CmoK$ 2$dVp,B':g&`wy~[$\t? H?QiWmPK:C'p 5F@~Igs/%'oc8|4z:b chZ$|/`W^UDBQ*w[dqy`&SLN&be@WHWJZH, l { Z7^ @7X/ *6P%Z}) @`z J0lrF .0"DuVlJ.$B5n{$j:x8^G+>G(7 951g7`#70BIhd[DWe(8M-v8@s4>:iQC#Is^qOkJ@/C~lx 1b(L1wHs`Qj.(KHBoD}bQNWg3`Qir/v0gTV\@le<UzpmFMQT\,OC/61l\TSHh+j/M]4o4/F"YsUzj'"F:l7ZSLio-GU v8@KET>A]eAv5mm>*N9JDhH]$*B vtKc>*i#XF8d971djq15(z*(N |LO$}:L H]]S3vLg4z /4cgJC ?U >J8@'$Hd@_9Y\qs3L`C:Il@2:k:M iGj=`0A@Ly* =gRZgeCplj99. Kkk``ip+ 3qp[s5|$j nB/LiwUgbUw=3 c".@3$00$1s@Bu+`ble$*TnY->>B'h3B1xtGUg  "xx7sW"7&(" r/x ~ &LwZogb}[aqx2J#  4u6w6FeAu$(^brF4xJ0PZ/s$w>:o J`)3nFU*`LZ Q3Y]WJL=.`35(o3;`Wsluw}`NW* 9LqZjlv0vn*`t C=N8buM?u3:kq* VBrK:T"LDl`?C`{& $"jUEE, |pM.'#|:^$V&bh{t[7o(*9L%;%*HAgg&Z7QL1\PAikK;R -}MPdC!&e1Qy(qd3b`on70U}*30bjVx*tJ1~o = M Se+d\GSG2n't@z\{_Wf'Z-< gTW9}1T2^SfG`V9]+pq hTy ByS87GG76lj-1 $DD]UN=Nq DL!ZbS]}uhlH, f'Z`}Ia#^$ gEW.(fZZrs Z lR&-u(&CBIU;h* !Z (..;{0lf`Y[YlL8DL3A?$`F ZpFxmbV=C ufi-G'Cpt`5cz-ip1@V5VCJ4>L>Js/] }LY}&cC &(,(X7WCfz(j~ S.L1Bjjwvf$c}Jo*$`fYLL;3XLKTi>` GQee\Q4t)Z p|I+2!j) z (e+ <4RB`.xrgRO:6:G$g5QW3Y=@@L]Shlz`>H'=JfnC!3:f}hWS]>j7 `$hj_pgSPI06" "  I 9PIx mlE>c9|f{MqBT0X^"("Wi*M=c5J@od%W]1UW9Y?Y}`h'N;~v{f;L7hB($0fjP*4-|6q`ZY/B0 DW%CC*%4O4CVV HyBz u3}#p IUIUl7!S:]L`tnyynib?B" \2 m6*u\A>AWw4 G}V8bW TG|R0 66 Sb-FN&@f%D` :pBw0$Fo O[v xM# @&Fc 6n =; dvB93/(Zm>/4zIcg\zI+-Mid *.Nh6b;Pr9@ ~0T9GJZ;**"'6GWz}+2KooOx< gg`(zg\)Ygg*`FH7 & n=ut0l7Z2we 5Q olLiV9./,= / DyyJF C P=fjSi1;$\/(4Y%o7f{b;|^ZHSiGZiiE/:?26oqx| ,;:x-N q|$fh5/53]=$ {4ocw*SPF <7J[N.fM\6-Ekz1mVXKj~vb.f* c>,*DU( 4p.Uj.FVd#],C|:itfh|T~Z|.igd&4d 5!g /n`_hQf_x ="( jl-3 e(` uJj`Xvi4?tSZ>zhoT%&c;uH' WRrrIeE#  -N"-Z 6rojlW&lqzy:s*ST i[ t/*==C#OVc^\J d ""$ PVIj\,#36L3P;( .{_`W]  $ nSL@*p:N9*=pwsW'-PPjW@AGJ^`^A*7dV+Bq.qOU D;AFY[J:?3l*Ym$v\z27`Rc4TW-u(jD4  oK?`i'2=~l{bsWFS Uds}n [l`$^nYhP{N$FLV ?Tm@nV$7 e-d6*4#EO(XKI{Mc(/A dy~gF$/`y2oCOd$p(pHad0 F(C"=b9dv7A zJ~vt-:/-!L\Ps7a(k `".H=Hd?g~~{Y.k6#%E$eKkl\sKUK v""g`y~re2iUkgmbcpe\m#3ZioR::CR8k^ ,PcV.M~t^z+%%V zjT(\dl:NlnqNYWb}6` ,QO{v..B*PHvC,|8~O^'C22#&$"w.9z5vVRZim{rzlN 1{Ns#Q-*&,0Iww|{, f ;\rYz pz0TCEXqg6~~oY`\Xv+`[XVJBb8b!w16!,5  /~LVQB@zi|lDo,bdH&*"k M-"t|ktzxrkk x 4E`1V`v&~F{xeG#Qivzzl)o|oeeF-'#ilKUn }ss!/#   (=?Uelqwiy?o[Fs0{"s9y1U~ _ W'$ 0G \ rZ <r\fk>L dW:lfSL<DmHF1 j^ZP?7,({ }( ,1MKd=Hi 0ze^O,GO.:FYWy(NQK,HYlZd;(,$CDNWPWNSC>.,%?lmH5(27xQfhf``6YQ1TY+q3cI`NP Z4PRez}^::^r ~`8 L' z>iMi`R3AW6]$;$ '" Q'R@f{@szW9@/*,?#]D"6#mrE:.%+ mI^\IE-CCyK0x| 6 g ~iT@&/ -V:=7+eZ td '0@y &vj$ 7Q\Wd$@wJQq|e8$*5(:jN tf$6pr Y,DJN5$RBj~R!Z rQT+1Qll\jvS($SljsF]2b @L;PhJ@@=7FN]yPt[AX>5D:nTK ^6Gn2]zqQE^Qim6k:mcJ-8/8eq 4e`~<3RPVc\ZtEw %jg(L!l/~-){ Y/sHuu^"wc//Pbl#GwT;-9P>U`\@#K @m\"@NQgL/@55@D@F\L>b0n"Ap0ny /9B\J(U]d[OLIL`FQD5yqj;n&yD6~pvrwB77$o219j(NFTdj~4y X s @`*ObC2 2%gOiot>lV:VdN(}HT `" T **J{bWPq003LQ:JWW{ Vj(   7d@/jFUoUq/`2sbSFF;d -u*bS,~Mv4o-a "`:66Jj`i4P`P}4KM(#so JpyDOKs~jv[d(G/ImD4.h"7 ( D|oAb=Y:$NWgg@!O`0&^/`CKg,@nXVECZ>6+1xyPFPj~@I '<Xt EcX;FUN,nrM:V-F4FKNk\dy~oK~:gI=v&J9ALSSs+Zl,`"NlgKlcZKKcgc2c\Fu,m62cg&&Sw@H3{I}lFYD1P,Y`lhF( : FF@`mmtmvm]t3o rtz27=4*`0$$Y *$H2U\ob/@97*/5*5&39l`@f>Fbu[]s5VVdF/]5 Qvlb\bedv{OkxZdn=30C*$C{WFgg\I24MfQ5tg \MZg> \>CVc\4^IkVNFKGn:U{ xTC/)Vp,K=qFd=LbJd5/N|$84t`Vet .&k||L&` 4 yV=$J`3 6^z}}z`FCz%\ O{v&B6=(7f5 7vVJLD8.#]#8F?f?o/F~j>;l=:IPZK:Uu=/lll.gg_CF2*G=d=*ij?y2o,Z/kL^iV]4:~PG  *l"Q*:JQ/ckq|1UnO`sh1e?Qb*Ybt(`G- + G(^Ftjc-`C 4  Zj !M#~cvndK$7W &KK3oqK2$s5&2FN\yi)Kx`on:p&xvldz_kSkPzUdv- E\r:Jd`'F"J":335?L3JY5`!F ulyDe Gf~lf/V5OB;`+ (dB,q?UE \= XpF#eAd @GIGET|+V3u1f`@W.*&&.&@CJdYQFu +y0j.qyf&zto]FHljS9v$Z2hSn9I3&&gR`vt7:v 0:$E&6 #  4Vv$I{3d3D5'sWvFy7v&s{llnnvv`I:' bC#>i~=Nqsn:l#`S%9<P\jvx9h $$  $:K{Z;jy bv |V Mz^m6m^TEzCQC::3G8M:>Nez:8xl3=xt`7^ .y$02 $FYhW* dDY=*N"l *Mjy}f@$  9 U&bVqyfCJ*#q15`M~M4<\O`4i ZNbgNF=4 $24 0/+f7Ts[hD( ,244@&I;ULZWZY\dK`IWC;II\pvN{:*, 3(.d x7^ZX{m#-5#} H@d:` .(3F.t^:%2EI~:j\P\\p`GCQp /5C] tvocVD/lF2*CZio|F,LL3 &,$ rOXTekmk|$V Nl{;j =f{;`b,p`oI70l@3*b,F$U//d3f&7VyY4536wcIR|D$ZvsTgEvC^5]\:nUvNT[2{"@D9F~Uw]3!  &Jnb0h[@yC vgjd~a|ajs? =y 5Vv55v,]"A"3,/B5b:/'u BKV&Uu{d@0`ogPtx\^SEP+Ua#s:RoCp1`*K`ls{}[SdDly $8@B664f0B$c?/xCd=cOC@{@GIK$MN^l|{v{KtlNo*@ \=2:F V/VtPKKK;FS2} 5Yfh[I`~d02& odYf*[K@nyqu3vUw0fL n`bjv; H:NbF{9~C\*zt~+^\0M 9 /5Ss Q 2IZ(-C { 8ewh[F3F sK$l"tke` ^^7`WI{:% ~v^`QPXWm`xn|yk^vZ\q:+g|k{%dV\p/~;jh`Zs{SC@dFSdhqljnnbN; 'Nt/qoVc5^`emmvd+bGdM\-K4#EVyOb:P7 02+O2x::=g:E:<(^ +N?hbs{   `9Iy4$  3@$;(/7(FVp~`7q;|~~4bomm8XloltZR5Z~s&bNK`.WCdvyybI* 7}lqns&\$KS ="s`s]$yvlsF{e \Ie*8 :.AYA{3#`!7#! b9,SSBsb\\bgs=v ^@:8K:' \@I~+ iZE- $+02006=`b23gW}# sdgd n  ;SW=nU$n4u}  l\; U~R+ pzC%GmN; D&,Cgh1P Lyy{&Nlyypsb`NJ41@0qF4W s -OqW*:mV&.y7 Kp*7Kb3i}@{]!y]7,&&&7@Hy@j@n( r\O>/  %%y+g\\Z\`VPNPP,N`K{F=74uIg Cp "1Qu{s`[ygI2 hQ&4rC:KUPg=:4+06VotxpV8FRCM=/2 zT>G=cbE2Nl@w/Xv5QJBl&Dv: $$&,2:ClCQ=]&YshZ=?(&+r='Nd-sMdg`\d8dP2CmCg*ShS90Nl&FN3kR{lgy;[&DWn{C ;YdjbH3&@Ub=nv{yy`sbgSK,,rMOvgK4^&:  (4Pp@cP73]LlZec]]XXVN5AJ'LLB dF0W, *4@C:2 ^@:8KV\&t,Yw{[B (CVbpV6&&/z &. CyW4$JhnfL$~xcctot0z70 vjd5`[`j`l`}bs7f @Zv`3/@SQvHb3UNWlvP sL111&g6~ ~8:4' -@RX> :Tekt  $*02:@CFP\p{xc{vvnlp =]ys[*yP$pK0 $+t&k eigK'x} \ Ks& $*.CFZbnsl1dY`]ZFPNKK}FyFCCyInP[bdsw}`[WUJ9mskbWI7 1 337Fb]F5L}~vjj j p y7[oywbH5* h:$\sZ=, zrcG4 :Zlv s+nClXbePx7|5Q[`UN[F`ydTKFC=40&$  +7[K@d" 4I\n{jbllW,sIZ=&z|oK  +Cm vxqvbTCPT\bd`VKFF9KlVgy5f$Il $/79*;}=xsmb|UKIC=0 B`nnq{$,242h2J0U2U7Y:h@dChNjWblppppndS\N@477770*  ,F[`]UQB .yf" *00& &=Jb~{({U~o~~~"$1&,0B2222I22*   $z,x0~0*$ / Gc||xgXZg*.73,(&:N`nv"s@lY\UULI9C$=0&*Lq yQ,{vkct9Sw 0@Ph\;`bb\WxU>NF7&-x(Nn{u}0y:nILUWWUNKIgNGN#P PKF=+4M0Z*v$~zBHB   . .W 0:FF@45*; (&4FPZ`\UF4 }WNNd *{*${ d]J &   xV>2M3Yu1]oYF D0F7H:9=@FKUbZSb@l1v(sr`zPF= 4.*FWl [L;7$0i:I:T:o2 zM:@OeRC >Zvk^ICK`|FjY9(, Ly $&$ "LfhJ nB7[qL59FN;  (@L@  *4zC^P:Z `\ZNC4* #\ ]nfL3    ,Ss  y ]F$  *[}}qu ,SjwldSB@Lfj@d3 &04:g=@=::4 0*&  z cVe $: K ZZT\ v,d ]5$$&*.,9292S00,*B$ylQ37syWF@3M-)EI: 28@ -' *,,022220,'*6&2 + ':M^\co@s"*;33591(  (Jly]@ wS*r`gr|o`K@6 /44</ ) - O * L ] h h$`$N&9$ O6 <G`v~zo|vgOERMRMZoN}*blbO/w`s7;SwjJ19W`n@3FN@o+|^MIc'Iro`^g~JyFls`W]`q}hS1&5QSSQHF="n"CKgltron-0.70/data/game_engine.ogg0000644000076400001440000006646407427244142012321 OggS%B[q]vorbis"VOggS%B[q)Z 0Svorbis Xiphophorus libVorbis I 20010813vorbis%BCV@ ZkrBZk%Z[ZkZkZkАU! UQɜZkDdI Zk蠥ZLZkZkc 4dc1dRH!R1tQGvqh!Z-sι Y$8dX2$CS4T4]UBCV@ DQEQEQE<<<<<<BCV (!  ǐI$M,АUcH&Yiiiiiiie!CR@h*D9HANJH)  )Z[N1iZk-J5ZkZkc 2B+ 3JJ1Stb(1c%b-!b1B@h*@(HXei牪jiii& 1dQ!(c9Yfiiiiiii(!PqАU@(")9$Z@h*@MM4M4M4M4M4M4M4ͲАU@(8@h* @C1Œ,IDɳD 4d (9cihiiiifYeY@hJ cJCILxfb#/g{G+3#/+!KE zK=v^y{U!+2:M Dy<9v^yyo;GP{/Cd=uXIm{dz2 D8Y@BDFHJ@OggS"%B[qu ED&QP6):s-J13 jd߬ՊuN0#߭sggQ} <ˁ;Or -\U> FkRmѳjh> -MNU)}~ @vbG90y.'[Nb3hi+ YKY]B, H1[$j3, "U@'CƎ)M[LQ4P(`^!{ gc]ecޢR.^K(X-@2zT%) Vq?TLlG9TqiQ`FGW=aq?WOŐC.v/ PL*j 2ffDP0` S*j5N)<*z7@DTECTT.TUY9l eIAcHܒ;RӊI VIK*s{!DE2ujtN dER(=]OÔnE"-Q`R V L5l~b5Q-TELVa FP{!w~E6#jy¨giZ(j +([T@S(&,јؒ7TT'22eio-Z=% *"aؚҲ %P]o1k5-ϭJޕ%Ejy43gjm |W‚0'[d5SpzMm=mۺFxXheuw@"08JMCYE;ƆpСjE, Y,Atb3MS !%bޝ)@ 6@l(+ٸJ PH E*;_Z1}Q7jv=w^SYtEavFasŷN)!H-]{ (T4H 9=rBqO6|㔭:n鏵d̂0pnT-GDAX⺀kyv܁DtQLYW8m>g)q|6-*j|jj) A0M@[Z.᪝*:sbat8=zBĭD @Pm! _)X@jXAHjz+vyak(a!CCz?ܫ6Ej m(|W/TӧpuDYdƚ5OS%d[x`GB>iR 3,_lh !-EhG4b5۰ Pq[RlD5>Nyxj)ǫѭ)j'FOSuK=Ħ^O`\蕗̔]|hᴢ;(Kci>j t 0 X˝Pۆ3HPZԐa")(GA d `!A QBRKd8t[RTD!fA!9V.Lt0vZk(?3U=:(HBQҍjt)FfF5Jz m?Rfm%Z9nLi ,BݘzzCaǟ_(עuS%d$Ou! r9w.v,y̒^C ˟ba-- "Z" (yJ 5+9uhcR8xV&2G4 3sePJNc̖+ݪd J4 k!i3ȬsR5ߋ\H{(簻6+h^L%*EEGaiZeհ4I*2 \Ze aX-AhAB# gHآ"F"&9bgTO[ϼ%EQ#>Hr)$W'5 M3T|H+|'HTM3:z{Hh.6e DQ#7?= Vk#)T}Gp։C dR}'8v1a:~LTۨ.R&J^WF_]1VY&m1kuS@!# Ɵj 3+ؗI쉛G1 ?jrDͯ(jf~T*"*b"οxA*u(mak0rz;) ĦL-U7ɓz2,FbZLTGXOT|3eBJ ~5Y" lņ=5 "3E$y*S #~CTNЬ< (4PD@`DR攈 4MbʢEobK\y9#1fM'~xW-XԐDmX)ҐO$.Rv ! Ӯ4A] oO N|75 M,qw>@eo EaبCbb 7)AMѥ]M,&KT5;SD\g~td;jMoM4*Y 5W伄n;݁ݰǃeR@O"TQ)?G>Y!r6/->…bED봯T CL?MBoK )Lӫ@Ӊ8ˆNO OZ,)9T";2 _1tZҏ ]8GaN}`7u'y`(|JA1tF&=̰^e*IWRQ$"TZ#J'55 `8W1TPPXSt6htP9⢅nS$6Ŵ<)PFUar(%Py::3\g..ZLy8TE Fvnmb(S:TDHxDp{%T!ĝimV鲜ezUN@(^?{Tɢfki  x)yI)*DQ邜Li[tAʞ׹XAr63db:jf>ITȋY bCÜD ټ@)VY(2Q If6]LM  舡dWCPI 9CKi/*hPAtfUnػa{7Z]Kc!]!UN'ml4iE-m0_.m霽%R@DH#t+Q+h10BoPcuz-aqDB`1-<$@pw[ȚMݭ샢\=XA6D/]J5R U""!NL W#ipLeo],dFw f=VrYiUj bH$HU$ѸrMfr\shlԘVG+לG;W~^>>$b#K[6k%UKB~E4!â8bCY̋KHQNB6IS@QCtͲ`P(RV> @H綢 WjFinfά*#_f"h3AR@dty;jK)D*+jƟXhDӳj6c$6[.,[2$`y_NA4Ll`t|mPDu>G&w4őIW ^U2<}],AAL*';ڥ"i؂ !E-m1Y1ylƄVq1j'1cX]-hE68L~<흪ENzaxKkY0LZ\'Su%Dӓv[/4KgV]Rfc#o+Cv2USZ/k)^Ԝhy뢂j1iADdqU*@F:V-6  HxG $@T$ZPoz&%RH'1ޥ$RɢP41R#S(j}4DiiiD8rZb 0qQzyӽJiUأ: RG{9ᰀR5g4 k-TP2JJRE[^8J|%y/H򖱀*(*CC _EMH?%ŦY1;2QvlkY'IfтO5Re+!ͅKBUs7۶4MYdK-J)%c~(.E@aYďE"Ҭe4۠!8h-gc..Aƍ5po jHD5E ѰK*@R"@m(eQi!%m`H!9"@[5{O^ k랰^:^+zf1^ yZx dK$3D Fʴ`b4PiPLf;EKi nMdC?U(6Zv<~c`IxaA4Rj=[U(]_֙hIH,AWu;ҞPl(wk', aTdSz $E7Kby7\MwkO'!ZU$Z[)XA6W9ޤ{C-,0]l^[~+:1FaC $Q̺$hцt4$"h f)I~\.pH/0,I 'xj[5%nHhhH.n,h 6DB-9JdK%"j5' =xD@.OS,E˛+A*/,^ۙ3ݓld pC+.ICݖ&]a QN xl`JLoaM3Lcs;:[mǠx`lxM? 4p&#bBA4Z 3(}b[QUELytܡYu~|"- Wc5w 6Ymv[#SO1(6؜hsmFʋjG4zx51)RתlO] ."/JV/bwS6R0OTU塦** uΙNK\kD#αvJ\bR ;zd@%(*#9GӨS0- )BM.ryhTHS32]tc\EQ2LKC~ -Jb# y744&*Bb4Z @8V7b( _8Nj4VĆp㞚zl+Ì_K$Av)c)mAU4qwFIK#ݝK)_Oqw*8Ki# cߑR0p &k.=~0۰Iaɒ]G +|~LPED!b sDt)ah$BrcYQ A 䭙Ag^ " '4^0n!\LaKx5QΈ\ue ,rG>]|08T B# )VX$9A1QYQM m3K{0b S_oܺ^ k<HveyNi2ecr _wbV`|V FU~-#|+yJDFV"J; Y 3 OWPP Z5l0P0 /(`HVL%^$,Co\x9 {ȞL*Kv!Qi)Ҷa9ڰmbbDE,EQi fK_gN2 |XPo TЩ=:tWڐјzl?l0p(5|1 E1\JO;]L BA1ayg4 5,9ZoTKUxQؼI, [nTı!\8悯M0 j*k>h<\%մzRp ҦDF9`3,H"%/.Ua [M=Mjʴ!E\M.DD"~5]/Kq6 H"ȦĴ") A&5m(,х(PdP@ttw1]@!CD@p3oHQ3kfX# ] A&?,[JEPR[\ PüW!eHBڛ~KXC}ͣAbqB#'Nb_OLl+&a[_ҋk&/2 P*""ҢbiPTY.EvD&wYE̥RJ~ݏ-Yja`L,:Xfm(֐[Tp;)R;6F&CÀƮ4Rɶ,f%Z@ƪ=_xcG493ÀCxmzb!P=7׬œhn]vZrFE<}oE >wɀ e\aQ*TdudE @IePU*CL*]ek;a)vgFk6o@.@*Dc0dyf®?[ -y7RSu>@K`O>JI-8q1Fri`lQa 1 ;}h~2j 1w}](.@{| K0o VAa>y/*hi% \ӊ(Z%&~DTQ5U#DAA5 5* "`|"(%"bd})%B9|{&YY0LLDkTPS;ԬB!}BOCSZ Bx`pwܬlMS~X xթǞ_z\" nzE>9&#(Q J"eieF0l07V5${PQârMh`5T hA7@KrC @64gNu~IgyjA}z69U1͛FV +h=cJ鰥$!P-!P,iUZDn1Nfvyl CQˌ/eL'$mQP,l㠠Bͣؒ5 ?߇'&(VViNUunᨼj0ą* CU*fk!q%*(wU0ﶀx#(TdUQcxkN pcyv F(rzyic{)l*}~b" BcFGudB/A!:gr;nhs"Q/!''("DJʔ5Y:,O@, $'VxD3yYZ@]\?Ͷ6,B:&љ?;+fxLQćj>X協Zp锑yNc(OL̾UpxXy|]K |@EZT10"PrZܽ+v:OggS%B[qqn˯~*f=S>"ja"b ̯F4}/m/{9m6T;RH1dfT+" hi.6L-G*Ff14a尬@Gb<6xӽMLܷg6XShcfX(țJ8] L/'/W&bC4LDIPHF" F$6@L"KAjʏL@!Ѯi&U k@ DͣՌ#=Dz!64k BNƒJu]@n[*DiShV EK*8OU lOJWoTfx ⺣&2gB-Ir2T^~9@ 5PuūR#|1MEUCu L&b y;nLaWK@P+jGDU+`Q[E'[RADEMU0wtpHb3 RXL?E5Ɗ4E:0OnҞyƦEBd>Իzǝ>l9)uX珴*+oZ'm-Hm";sۜ.Rj _!aH/BEaDd1IQV@atYS$?A@p} "TT Z9$VL-=C5pם# GlB3+ )𘈖#N p.@~䐠ҐdF۫ݣݭpQAGq[P˴ eƷ.w0@ %nKj=Z>a㏶|/4wGb}IM "0;W);~V wUQۋPCDL5A՜4PTET-QUUC? xrТܖlF5(m MF2p aj< ":B͚t!JNԁ-g5gYNNѭ﫝9)W0rvb؞[K1[@MJi ^^~w%NiNde!-&wE;}Օgyy%⻬L*L1]ej *r7Ma #B-A1T`CBT\'KPq)b+ ψF˻5-Q`u8ݪj,6z,-pA\Ra#-%B1BQ˜)H=";?y>ɷO16eaj&Pg抁Ë>llEf^|p}~O \(_E]$3@P 83L ')O^@hKSOs}s@S{e4WBH̀4*< xZՖ|NAMҾ@BJ4FG`i1Ñ^c@XӠ-1QXCa QJM\3-cL05!rP/-ntq?97P9Sk.&Z LD k.S7e;I{{oUEM"< Q1 Ul/0 4,dXGH0<&Dh)YDP0:(U%u_ fE5A5Qf%IjELΛ&ڔ3dbgnPeÔijqC0CaW93Q:9~louJ TXdGd,q WO,? O?ˆeR@I!T笲Hh - XZ  r/`<]]⚛{M-KƌL |*FپdAH2FNUZatexapb{X1}iѹ%84$!:,.B&twjSFc`q6$$PJ(Kؠlzgs٠PLŸ"ꂠ(*_UY:\^"Τz%׻M|j~}İQ[QL5mS|XPTMUQT@;`&=-`8 w?rR>ApI16?e>,JpDQ*#s0<'ǪG= Rf%r*TU j ',A˕54n`O45_-Bi-(#RMY P iQ]!Pgn" P^d` b殥zȐ6he3en8H: 5,(0U ZY+b܍{.EXJ$jj5ԃLRT7E%-.ǣzo's GJGzf?ꊁw1LrӠiJw.h"zwjy]QQ;Q51("=R5 &y`%%NFV!#`p,Ǒ! [d[F )6ԼN3]-e Q:]i%ּN4-zRřz1+j2Zα ֐1#8~=(_+)"2zI݁5HDPK?"N}2P]& &\V!w6M0ٌ/ɽœڑ_UP' &`"^UKjpH\DzWKU^aTL*HbbUEDDDcHQHʳ}@IQէ:dwKW"*PɠZT+!BѳZ>` 邱XO?,\aaLm(e$|B)QK~y[:&Y='(9,6^[~_ z. ,Z%\ꨊ!wA"K˨ӸՁ%m1_\j9Z+`X=]&TKE0U@܁iN+)c$ ;|,O6BѸm 0u)aqR[@M'gHsvߔR3TUid[oyC Vs=F吨%sCnts+wg-QTOggS%B[q}؛ 5Y!A OX5Ȇ\Hr8%k*i"vv JvЂ xc7@ W)H * )a pI.LC ͬ(FA$I&hĂQeF0l%a3Qcą#!Փ:}}^Ș|AQ 躘G1}tubt.&wF՗,Tn{X 1 t[b (_AEF!jo>K5GT27"bSE1 ya j @4B7hl$m dѾT)=TZIZqu.M gN3g 蒙ȚR@noI ?nj|oOKY׶x~V5͌ZY,tX8ņ2fA%fWV"Ia" 8)$#I3*zY0\36e"N CV8[^>G:Z&nz*Cgڍ@CTx@S7TAj ^1r0-miWe="K[_ +S܌oϊM>)ig~UT_WeNXũBsN[,6 @p |ADPUm)ޣb |QgB !B|PPY@Q5Գ"0C%j"$r`92f $D<[\EW$>SF~)d\%&dBMBUVORU; xgJط.oҴj:BQ,\3_lhrd Q$"2]U=EM$pd& jj! V M} I`:jHYZc*a%6|@ =(QV(1n#{itiZܽe+]{+ k !JEB08$6 m@a+E^a8iPj mYNɹp?ҧ;0d)Zv>0 0ED"Q䮆*(j*i V*0O* әjc~iVv-)q.)dt IP o杢ňR6Y!mI I1}~+K\邦$Df*ٸGXA~Gm[+*XtGͻatk~U5 &1TuQXT+)@(#TRP(p ؙN hא]s6M@ 0S0vI5 h! ZnQ 7WQu5>J/ N@J`%'m `5h jF[հq}lFX( A;@,LC}I6!VEBdb>:&mZɰhD8O[7˻AǸAU K-&PU@1L/"d!nv?[MtI<*w4TzMC* Ї"("b=GW '"F w=gj<4EE*S9@X+wT%JB3qhAcrޢM:)M{ҶHd$})Oa@B0.:wVRJ` 6ؗvI9'UIIm\c/bUoʼn!j4rp0莏0nI%m1*_4(2vAoVu5H]-_UE=KO,1,`1j jXEQEUDETnr]^ 걅pԵy. G-d=Hu3yIFSQZjH'T ^YGmV5E55\G8>ttِ`B{ÈO4U\2z_AS י/ 2ǪH` k(O IE*@!EW[24A 'QpG"ͼ3jb1Hvno,vĉxZU*CCZ4`+xVZ[gJ 0AXXDrA(fP7Y;`ÂZFCj1~;[ u5O7K(>f`gt"@t]ZMb`&1TQx鹯hqPTszL׶ *ar7a DTDPW |*Jy)KP9GJqְ4i JR$AoBtf*;}=ǤkWy`,ӡ^Q~gy!"ITކڀf*-kB:Ee#dU`~%1-p GBIF֫Pa4Qimi:eCswMLma.PF߸"bj薨x %B38 !s+ƨ(a* fb`4=͉4;5'Lxk"&1.r,|O:D,%E/Sio F m֋Xdsusΰ7s8 T"ߨ9*6(bPaEFa jj`0ìY ӎ7Xq1 U5* ?%Drm-}K*SP24}8R* UYdj=w~-ԩK-* D8t,j]Kgua^L5F]6j2aU5d }( xd8V,jVhE/;!(j]W\x؝*(RH 8ֶB&2bl4n\"ai0,r"0$b5"I^Do|V&|R<>gwc`=ax74uT0 -OwO˪+"q;*ʠV/-Q_o5?S"QTTD]uw- ڳ#y'Wx`T. pVJ{i7fva9iRf$xHۜye΍C "?Q TP_MleD5~l1n9MAN':K27Ҟw,~-&E (̈@8W_EU+$0O@R@;86P@э]#df[cS!$s]?TIKwYDռm]~uHS;؍ʘHh $ㄙ'EM6 -:@KW\ÒڒZGufH@izL"-G[jGHA^BWpfTifMOi'>5ѓY h3򙂘SA"kz=і]V-ATD0PSikPm3USvLXR[;ҟ(gGntjJuE))KAږWv @D UHuJ9ˬ]7`g`niDeLλ-[,8>4Y%ÿ!EPղUSaN4LVP#C ԧQ]!Dlݴ¥FcN1*exP٪ƀuq1N֢2ˆg( > R`* 7(^Q HVC?A'B,]`pxTeeb9Fjʼníf؎oުop6lc1  51 '> pWPQnMOggS%B[qLL@BH+b|0DeI=H"B跚,#C]0LT 3E=$^[%B[ $3.eP`&cS37AVkL5 MT%.$MhPI1M@m" TRSO9%.Sp#dWLWT>j% ΀DRFl@P!U2xe ((B;^Ъ&X@MVIl@8 \d<tH0exy TC[DUm 5ƿզbth)UB8df4%__MDXA3("%>vll īS%&2R[u=¿HM9VT_e]_/^2ܘhrqGE [ U#sH0Ul.TZ y5^Ø5ժUPR.V{bT{4BihWT4L7Th-|#Kcp%Rܩ~J68Fbj(x\lhLȔ(BdUCސaPOAi!X3-DQe&o!\^9{D5m.4Jh3$:JQ b 7X `'%2z3vHA5u: M ,o8i qb *ƭ|;QlWGtrMiv #@iݲX;zeܑ귨EϝQV2ĹuHF1Qx'Q}] UETSԴ.^!;u)J\}!Vv]y3]HtʭXd!^rNN`kH_)I뵛Bm1˚i79+>}b<5En*Y /rli e1Ybô DLȍ qDj h:;GDT ĬLzEn(1t*2ʂt:h_3JD 䨼=4H̩L(K[N,\o(e16K#fku@}mb4W GE| b+ð6cl d۴^ 4ߍ% lk(·C030Hb _5bގQ&&QKVR g۪_ɮNUSs ҉(C Nd5 @TATP} 267XQ&gXq+Y ]UtAYo;a)TR`A`NjHSfӉ(a H:pAz`w#R!VʠXڅ=h;1' Anݰ~*(|%_^h(P]pM(a÷?XkMTQQFlQDE>G{m_k{썣PAdh|EeQUTl\ہ6gOH[:[6}%`J*!bר:4F".S4*0<ߡj3nK]{mfTu;xurmqa^0*rY:@bYBGWl(MD42v, 2S9/RVnh$ P*(lSTILɪHv-$w-r`?GTG. U.a塴HW2MFxE9xp%l8(6:PT:UILfAB!>܈!Ҵbc q/DޜvP礈.5m5J*~\|yF,IV䤠 Ä0s %N MH" E0_l ZL STU@짘a(*r}k홥N% 33veӽQs- @" ]A'rb9DʢaY.LZeJPDVmyngK_>}NC-Hjv#Dق'[;3E!.WE{MB*5VtefUv" V !mJ 6 v]ڒ~+94j/@J!f.Y֑\N34AR\[F:áAȠH$ђj;0PB6V20 mMBF#!2Vݓz0nviˆ*8ܪmu"6ZGk!7j&Lb ETUwNoV0̽P+ynG-D)ߢ*VCDF)AAԆv@0/F*|e1m]S[qP =>Lfuǵ-p-QvFKXdmeFkSe`ή0$ !; &S1Y,| )֋X#LթSKnguc4mpr⡛|<4;S5RTݫQG\6H$Tۺۤ܋G,8iG <   `5 ! q"!!a JyJFJ@* . '  k37ZmRg&+`v * NA "8!eh;  c?*k.aH3>Bc:[+If1p5@   dGP~!_"$#%c$A&$}&#%%a"3%#$u$.%b%I&#^%+$%$")! `!pXn hSP9sD9L'32hS i :}6U1L0UXXq xT2 c&8& RYF}M R u#RG!PwAwj *$)5V!#f$"z$ "X#H !NA 1i&4E \5]x  # 1$,R oua"Pz;K 5}(%D20dݦFCߍsE[sLAd]u0lsQIx@K/k@T?X> a H / o  u$`V _ U  '1[V; q m $ L   kR_ 5 ] Q 5 Vmw~C~*z#1 6zێ۾3GߨC )O{  ]p_ & /_aS:6I[%w\ T:?7n % $ r :!#J$$N%z% &'3'$" ! ): _<LQ9C}@sYF޺ݞ ݾ\{ޘޫR?N TNM9=[z ? YBi7)?m^  H+CWMW6="k&o20Z z : K ; <Z~j KF>]{j/W`rXP#NN}b@V ] 'S us;?1`W7  B  `Y U[v@-= Q$ihm%".y4P3/oyl 4 j ' YW0q3Me>XV 0QXH  U %zLl#N#&y',+/-+S/U0101/-{.+*7'N&!  &Ib@T>8+{$.`}|?_,H\S `C; { h#sKoL&\_eEC=E Pc  3- ~# &A#k($')$&$?'#%p! "{ F4E+ t D 5; mߎڮ>Ѳ,Qj[Ԉ!׉ڳ= Y`kc6 ' O;b6*3z@B!Z!n"B""!T"6!p 0gR/<|ev wY W  jUJ 6 pad?@^wni R(QSY8ޫnzY3Ec: E X]Q 1 > dJ<Sj N|k\Zvrr?D zuJ LZi0,L^wqt0J_ߒ\ߙiND!@Wo8{-b~ ~Do;icE~m+ҠԏԜY-ؔ ۍ #gG'.b& } *FErT%{~ t a?"L[NM?J;bi)x! 2 Q EY d f#$&%(+(V('&%$#C!0RV; } r.+L8WVY޸ |ؤ!٦g ;XT6ԑHܶ;8Vph 9v^=! J! +G " R#S!{$!#"#i!#!#,!!: y%]}  p41Fi[EF)%.!vd:$TynT+vfvKM`W'G50BO1 T > .XW     8 IZi"xf | I/ xp8muoaynRLX("FL-aNM}97DPR xC` |EL/GQN;e,1mA] ߌ)_LErFJL[m,8 RM  Y]8Xk O%+3QRK x[-@ z &9&!!U"#"\#!7"h : Z  \lRt[ >M> 7fG }ֺ%.9F1N8;V{ }" M  ~   { 7t3rjm~[4GR X `wlv#WFo $%&&'(&'&%#"Q [k  9S]OY/z"vݼݡqZ@-!Woo>t/  :Pl\ipV ! T_ 7YFD/ujb~ '[gL /#!h%*#@%""!?J3zoB > v{b BXg)Z%*j݌ݥߪXoP  IQ6;s 7Hq94? M jVtG)De.+3( L q  L T \ (LDD.Om+4vuu ;> jmL,+/ k  0 XC $ n JO7L_? u F ry.0{D g]*LD$X=q|f$7.3O  n TIl~LOPw`>q< rJw|^Rd(Δ#.l˼L7IzсiQ۴[߹=o7SpB+s6Po~ wYc SCLZ6u ;HB!N<RLHEh4hY m_db3/ ( ' G@, ! !! ! nvF^   PV]?13Ct(m~$jBB_4]jWTLV  ff  Cj*4:  Immv/cNd 9FCBT WB# y x**1%0}6W5X9U8;9 ;9=86}40.+(%wd1W`2g6(IONdՒY\و.֏.[CR6*lk~؋gTXmFL q3<wtau a p4 Jg5"_Og?py4>m w> "!6%%'%&v&([&o'%&#"s"!l*|Grh *G7S[2قڠx0ԇuT~ؼbۊ27-J V D   !!"r##$;#$#?$"#!"Z!!G4J / t8`Q!tv/5D I i qz8_c[QMwW) VvK'4}c4fZ0 IJ6iGy  = [AjTqqM T  {E9  Z >sZCU/?!4'+0lA/*QuaR+NS1ssR Zj(D cގ8[֍zԛqԼԳվb $yݢwt;I0L>li 2 Mc~Slm@ da !j% PpDM15IC!a(,R - YcxPUJ"v"m$$%$A##! Z <MJQ#ZAL]$s% c7rr|}W i&v(5zGNKfFpQ @ 1 bZ&?&M.* 1/7\6*:F9(m6[߃EK߽څ۵zךJ؃Յ֞էlEؤݶ}cyKB C '  wj tj{ Ht.h  DM '3LBvL]c""!(5)-+n1/536~6I7564%41//[,)?&%+""c >Nf܍Ֆb-ҁ\%Ҝъӳ*ׇىHܞ_]57( 6 E#R4Bi Gv M#;!w#!" ; -GW K b c # B3 / l Y  = (;E9q)==Yek[` - 6dcnO\8wݓu}ܗڮ?ҹ bqWGѐЕӟUا߸, o  qi"$"'"%'N$ 'V#%!# rD\D!Sy JL d  CJU JZC"NBW]CW-? " ]v_ sneݹۿRr"~OvyՑӵեPEn_e%.] !S #r"$Y#&&2('T(X(&('$$"/#!~_r D \Qq)C1A2U|}Bj:cbCT  ^TuCY.i ~f4{BjuoWXH] $ Ia^ ? jnak;@&2M^v  LCenR1HEl]h2#*mr"2#S> ?+ITl  @t2I: zH%pqcGzޑH֠I֖׻׸ݟߴbL)6 `FL.Q5a :ZR2H,N1b\DY 4q & ' @ r M     s p kV.zNg!.-plF q ^p[DHFZOK+h=OfHA&}e <-:;dZVOgxm1BQw=CH D m6p_)3At:`q/ X+Z!v 8&&+',8*/,1T/k2K053410-+'&+"n pE)&:_u֣2'!=i:˷2͹Ѕ"ׯnڭe+WM5e)n C }   t"f4~ V~%"* G xpQ )& k 3 % - Fy4-v "%s& %&O&(j'(&)U'#(%&#"r(% {g'I]`t St,{4ҽ.ѓ?ԈԴԣ#VFsHFjDe L X  IV9N5 H5  x!_vmC j Uy]b{| 8Kn ^)`]T  d I r%Qu^yI D d G9Sb~`if0 p2YWSv/$K_R(7 b:2  `6\4[l[ '6UV\7iYIc^0  %"< Y p ='_Et `y%RhޮܥIFہ޵'Uf-]+N`R"a6 W } HMfu/1x 4fvD{EHa<_oYmU=c' ,Pk'"U #E!}# !4qvev J Q^[X8iXR%qhFJcB#CbPe0JL`h/j]Axj~T%![~*[vGIC@ pi6 n 0&%f+([-+0].$1.3k0_3/1`02r/0-~,'&e"$ <j,M?wDYRR8Ӿ(ɱɄ_Ȩ ɕ̭`=IaR7x1 2Q,Yr|H8 !R w"c!"&! #" $7"4!-D}ZO$M4$ f < % ( n __R.0+5&c.ZR~/\  7WX2## `Iۻrј$;͗lF ޜmnf- p' t J4'$!1#!&r%'$%$$!!Y!"&!/Kbs6  h   M  H -1gs|2cU/U"A$@V\O}/Dm dMQ%$V%U,\T 5 l Q)(y X@|W$sc M*ߝa j/p?($j+8q.! :xH 7 zOX<N{wpa~%vCF0Y6Y v6d 9 g2 { s)1\c/[ } ~a?&u+Sr2 odyEpGW-n(Nx6G/Am\ ~W~p< *  " : z k )DRm&!%)(003u0R3 1302o0.+U*%%!_ dG0]'g"ܳmt~ .WrŀF*+T:ҲhܰK<:>h< ! l /Bn q 8$#&&(4(*)r+f+-+-+D.S.,*{)w'('%$""o UmR @*DXgO N 8Z~ /-jyr1GtܚUܕy٦։҆>ΝΟN\#C͑ф^ش:w6+l] ; h\ 8#1")'-,1.13t3455z2t1/f.V,*(%%!tH!8 K$|&3|w}N=`Lo&<9%}d?s)_   K 10R$z )~|+}*;8jbWq.5#fGCl)\~!c_spPq2ߓ"&ݽ/pܤQ(ߠLW0>F!  wf#6$X)'O,*-&+.L.h0. 1/0-,+i'%("[  K dE#GdFC_ޱ>ݻ7ht:}.r}\Bgm}`8F'5v5wIuM=mKk=E{ MI`A;Tju;#"7(%'$'$%%G#"P!(2 S 2+I( R M2Evsp )0^x&' jVqrNn jn V    s U g@ #iR"?# '%)$+"'+')%<& J#;:ZaK  (rE6`'664# ف՘0^jΨ8j <HHt & Q&3  4 ##&{&)*J.u..n..z/-+((&%&#t#(P8q    G X l?5$Z  [ n:5/viy=F^~7poۑܘה؄ӤgΤϚτI ׳ڡ(o KbB<aQV $ P; "=#-!4"""":"! Nu J bPHv|&5=g{O._A 4*TS=%EfJm #z\A0cf_{Sa ZZ#t< %5t~]_ "&g_:ihJ1X = N W 3 f~bF#>Gzy%>{W3!Rb %&;z>Ca ;qNV !! 'nNP l QJ0#L0$2XfjO-JsUMCT~$" * An  }  n` 4E%4L;FH$'A V U5[[i  =  6 D & {  sQ\z]B2=HOYpw d(Er Y }ul)  * dA{zR92x޼ݑ'۞ݪCF*h<diDY+P ' ) /   B | /j+Xp!xYx~d(x BlN{xoM4C%(-9%ݴܸ\-Kad Jy8G@e '("$&a& '6'((>)L(S)''%&""m#V! B$9$&3&A(')&$M#Y"h L+fK i$mSyzKF!Vu&ۡvuѦδˇSɼcʄu ѐ֎TNG>**)L&   %!"#G"7"9"! "!!!S!! So 0; u 7 u!Qh !^@N-r & >cR'Y99-X=c)nkhCZ]*&BO2,*L#W W]]QQ(ol#;w.wt1"1[5.Au^S H,T/8xS-#O#Q!e"Ud;26V IBj4  B ~EhT#p  |- K&>4\K!gA0D=.c0"T|oTytCr ,  ZnbHl " h  [  T/4-GL"n" $!$evx 9^^bMh]\?&+0}LnA[Mmj&XW]ܪ߱ߑPm7[Tq8bKqmjk ,h-'%%*k+^0H1647.5}8D6846+9,6846|23e0 1u,,(%!I@E0oa Mo8 )% (?IeO`jYEBa[;K۾9%]CFڙߴ/[yVJ n  k@(Hj.Q#Y#"&&**$-,,2--#-,-q)($# F4%* .rmgP 7#u/ 3pQ_߁KWbg>7D-q0S3I/\L})M |5 ;1=mj9r  @c r<F"cUF<gqKJ) W۵s;3,`IG%vBereKE%0H1 c v *ZfA Qncf o S!eRXN|Y(g0n<+? <}p?4pl)(nYq4,~628e ?`q>c} g ,M~rIT  P k7}P s, 3 E {gJu } []+"e8>I } >1ZP=hs  FAG F/4a.CXo"iX-,7p!m  ?_s7d$  i , Q b g 6 \  x | L & [  -Zr[:=;W  Wm&_*>9Hmn.p<[+KZ&+ {X&l ##(+/c-a..0.0 012092/0$.>.+,#)'#"S 1}`5nqLl6M U`El FYRr'sVt3k5f_AECݐޠݑڭ)Q9+o)6&7# w b+qRH.vahs?iF}7}D vq"H_ 5lG{N~FdBA_Ntoa N*%+8,:X]_pDB F1nKT!~5L.|p3Mq}Wa+gaU}-L:H۽jԏww T,>/=Odh j w n /OgO&1: Cn A#$4('K*2)-+0-_1./l,a0+,((?&'#$ +"jH&B)B 3@>nC5:Hw.EQ}YClF4:PEJ840  % P `4i  o n= ' FN \E+> OE1+j{U$9|uI1'b]?EsA Tu${Zpg] K'N y i | y1_0B#  d C  K V  "{HbU 2qc/%mvk:BuXQ']>mF y 23#?;l K] \m&AC_pwn'qDgo^T- Zc+j 6VrJ0%I7Nlc6A 8  . Y )hs]TW % J  T y7B0l=cK$hTr z ~/ rz*?-dg~w*pb!:F / 1 I%o0L`Fyݏ,ܩک۬ݑ0+/:b6 ?3 j  ,cpd !:MeOHu|\ 0~ X d H 6/o  x 9 P5<w1Tgv))$&)de)6  K>< )!M$$''++.-Q0c/i0.v1/+0+",+ -)(+0))&&$b%")#! qTrn+! % $eu!Ly+߯K|݀ܞOQwޒޡapV޽2-Hؽ۱#)ڴ 7".S@5 aC$Ip !X! !e W!9,!s: \v  )"##t#$#$H$"_!,Us{ > M| {.1CmiV{"@6q~Dz Y|p(y8IR&GFiqBOX 2L5: AqRz  6g4n 6yBrjO M/%I/| r jkYPl֙Mωc.Γ aяЃվ+ږ݋YTc^0;zsf  7 J7t0o {/)HmGBvP+|;'+;~;]5'+=+D"0#H*,U{!^!j2B)usn0ZWQxHU 3 B w b } / y b }  pL  l  K k / Z  @n#zf}PEz.4  Z Ef-UOn\ Ek(K  ] + fkDJqڹq {0wa#/-Q  > %x:C@w-5""4 M!Qi-JD_   5wU 3 0k81* L  ] : P N  Y / =NnMr^bVj~S+v8gf~73L~\z oz#6!'#+&/*!2+2/4(/ 5/3.1{+L0){-(+&(T##$b  [  C,Ob6 wyqߘgBٺ:wV\_-߫Wd`mz]PU\MY}' a :  .4zxM !!#>#%%T$Q!T!!^!I )N_pdf`` ( ,,<Kcyq;: \l,GR`Zv5 @G~7L.$ie=D?2wfD!GnCmqR X;  R G CI R~;*_/' s L  &Z ' q&V\w9cI&0p Ў8=ւۭN޸w(V+dN g 0C-a/ &d*8*D RcxULCrvrgL$(Qp (W|u*]v4+;yW3> _+<cGM) 'R ? 5 r  z. YI)~Y nl o `M_Y-E]B&^t+ttLf " [ 24I N*P A !U!\  }  7 m o R@[<@Y3OE>hO|( B = @='?  3 V O2FTH&yEXExa'P`V P f e e/<M^ |F'/uQf F F vT2w#W$o!?'I#'%,)=%)i'P)-')&@(e%x'|$&o## Y g/ P)44$_W>96G|(KOJ0am$|t* ] @ o|9.={enjd7bv 5 R7& {Y5ll]&F( Paߨ+2ba~R=fs8%f1r- >dj",c\{pSJ!i55cu*gBFT } - N  o h ; 4 O  "e1OFQ<0۸dٳܪٷ۹_,Iw_%TD7g <'#L<Y_Nl UFUl\;&6HI)~/KyEUNx2ZQ|30Gsw16Q @G2- 1t%|]`@a^?M J[: & ; F4Kl 3nXW {  ' _ +U/ .k+JA21v1h X  zuf%Wp*Pp S/]mee` 2s(kNSa*l]/Kװci۹p)CYޛ8P:R)9q1P = u@$u"&$%@$&($">j6 x p;NQZ8%u $ }  $|'7@M+tw /4Dz  W^&8D 5ix߽&j$`U9SD  j + 6( PO#)&# +Q&}.@*1 .U40526273k62412f1SZ&?Nb ; O{ (~ N;A&O\@A}q\ $/$4nAns(RbBn*e7$Y<'f^`jmaq] [YDpk)S(\ _]Md tGe# 4 btq. Կ֝*ҘՄӮևXٹ ؘF!]`؇ܳن'lU`| (1 GL}22 F k<__MMMMWZubK1fD'd<l\O^OC}z+tlh/,!-8ݔ߱ ,cM(9u61S  idEe   % , ^ &  p p JT.o2~GT{K 4 '9J01, I   X  Y4 Y = //B=i'Z>JSfs3<1 p3o|lW  *[k ")#$$$ !x=@ $%Gg~x . b E/  .r_|4|*<+ 38"5.96:968\67r586(43"1/R.,R*#"( 0Xv*REe K܅vܧ/UOێ޶J5b$g7eXa!a* } IiWN2zta #}!$"$#Z#""^ (Bs EG5EHWUWh\+rtW$W۱ݝ٨؉ۀqޟgei39U) \  ` v= d h = xX dP{nZ O^5jNCMh e 7CBIN*{Oުޟٲ~}=4ߍW.WaH"[ K Z QH U @ ^ G w38{ a9vq2-_ LdOk =? C#5lOtKF]ܺ'Iut6QUd`7 O  V n " % l  F X v`ji*DeoD h h3eJZB* 8K)t} t   } ; TV S ? p O *  C i r J <H ( w (O   +Z7#peK['9oE$zsFj(OP ! D (/(+Y|ShZ/-)YX4Ky ="|- niU`(J_@ S52eY7 <  dE?}oL/k,Y\=G Wx v bKH~)xi4@f|&Y x"N!%"'%)(|+y*,++9++*(%"!5PYP 'dhpփN.Hܷ"A*\gv]5h0U Z 8|jk !m"R#,"$"*#dhY9shU * mi:tlbC9khX?aA3 bU5r"OD!r- G&./G0v\Op5x u 5 { \  T) U a?l!= P hSnN/u3o^rѲ ˯Mͬ/J9 ګ$(Dz`=zm *g _""$#%#:%!+#G*Gu 6 1(1y@;^;Z#i7|oy9.(XA#>hkh6kRoe<)߆-rE`ެER`_Y~7x$6v8s4R@Kj7v7 I @ . 75 +Y  2 d`m h4<5[_z~A)W(3t!1_Rp [ 0 ,),RK3Or 0 * % }8S!8~8ydl114< fO{=`BMW8 X(||NxQS$ Vb'z] i~CN_   ---1; ]QV;F 9 wqVvaw`Ssgi V2 g g  ,  b3  ?4 DJTRr! #(#$#Y%x$%$$ vrZg~&>&s5gN>CpF5hoC*F4RiC* UlEvx)  , H 5 l K 4   6>lEqo.R fb"  F   %@|DfM*Cy;  ]H X e  @mf1+/y VPLA ϟ!qԒԟ}-ep]qsxA9oe7i|`Br{Rt_ 0 . {>;<(D S_cjs+:  * b E Js r;~|S_<ڸPv`؆ݫBm>XsGu R  D> CnHGjDLI] G "H$,1Y,b s GOV' )q v ~FJT3s] !$"!G"38H)  >' R4aA&8X>Z==%urKH=! I{WKq dCTCO'WguLrbA)Cy-x5C$< b u 4N QYT1V0A/ .V h 1 rCh2R8\A, ? ! %/%'Q')M(*+J,)*-),)( %$` \2 QfT*ߌ79&h׍ڑםا@jBؔ=ڍx^Di^6Uxs l  }x9F_bmC8\0L5rez/ aj^ n0eQ`VQI}wL26`KraZݟ ER{@v}Qw=1)!<n |T6Xt,TwYV!s`q 8 c vR "%&)'+'+i%+&Z ^ AL݌v?ЕVjRΰ6.Կկح׵29I{RD8R$Aw@<_8 : ~  *  O dZEP@C.  &OS\Jm s  Jk = ~d,/bޔظ6Ԏ7 ΅̍eJ'(` II&gu N .1 k 1  O k  `<),` ! 5:1[ stnSFi^8] , ql {X0sNoh:D vT3q[[> ! e / ?B8({? I T I 9  U } +.!4_   H}+QV_x_#ZlCih `A2P~`qnjAx[36a*E_) >  2EsM!$D# &#)*-+*+*))'('&#""I!RJ5\}p<+ lE9_Pd!pFH'(J#*\ma ޮߛߧL߆09 "Ot6jk T Sd GtU[2h$g(l6 U+A&  ]ruJ'G)\$LEs+W31F5Z +cD'5r HkZGStbZ r O *  P\BG'  6 r Sb)  v  z   r  pTبTԡպӨ]I4ܝVoߠ{:69, ~C )_-`jgr g Z  + DZ!PtOOO{.k}YVvA   ^ :  T;lAu)02P8 iiFt2)>E) ޭH~`u ߲:Fe40 t + p`R7\u  3   q " x,Uqtt);3%$v< KaQ{x;mf d k " :  L7tm;B\#O!S0Xuy>1V`Cni{, TxG \()  ?NC168EAw0Z}RT$^G"S\ZT."w'#)I'nu zC4{"k H3a|y#h!&%D('((('2(''',$)#o!!!  l 1 _f\\<K/jbL , < > w -  F  0 ; T & F % C I{6xo8%$Es { J]en"GK&[K~ 71S'SVqS[RFg6`"kN5B S 5oXv2Tp+޽jNۑޘ{k4*ߚ.Yh'cvlWiVh" doZ6b \ w ^ /6_tLspYkLRAq\ 5& 0 m^ k/bEv`iݡ=yBRU);72"_"4\: h,e gi r'A(vsOo<frq: YZ'v{Q ltyOz7X/Kwkf"rd K{f- #drXORf<^t Lt}H9K2Jt;1BpT K, :ec$  1 6    &(BY]U8$ hgseR~{@ Y;r6*  +Y,P<l;@m6zd SiUr6 tm2[Qo9u B6|NjgYRx ( SWr!n+G\7Q0Q2}FS:>fq o:a]gloCg : W;  5#q% T  ~ l | w`AM'iܿcܚ/TlۇځڐڧbAi۹Z}ݲ} :_' ?&!j!! $C!" 1"!=" m SE5BM\ c YCM4 =m#>aZys0}"[yNF7KC8I{^TboV7y62U.-c nw xL  P  Y]M#LE)xD! n%jB'3ް|e|;x9[նl ١zR{[Q)< (7lnF&s?I'%6Y '| $jla 5k6&wgyY W Y+Q(ic_AFqFp/; h^A_ OWA;:?mU(<Q}||* i `} dV vxy = 3>zaA Bkc  \ 4   # 4 1 ' $ ~  I"  y )] . aR \ w K LHGo  R a hPphZc)y  0  eqb; & n5t2)?!6tFK;'sI pMl7 d#%(`**,a-r1090.x..h/r--+~.*+('%&%&! | r T" kc! 8m9|eBDj k 11,f{i-!KvYc5-Rۡ&ۋۖڴfڜ۲܅\j (`j+9$brqX: rD<[q@R6! 8" !#$&&( ((&~%$$!x#"4#k!" j- S <b8IO$ ZݑۂZ,߹ڱ߲|Ja.ڵ*ۢ-Dܟބ[/ ~Qa=1Os[5wM#TMAq m sJ~I$"Nv3AoF O 0 eJi x~gWQ>:tXހJ߰UtKn1k$pD*fv}G Uq.=?zY 'iC7 9eUC"yby3E )  -6@Z M \H&#&{PpYw F2{ ^n/ #JcYKKpAk;ZKdu zS {/9yh\QC:T n)$$? Kj   j>~a-o1D~u'/o)d bC;adt(e W q w5yN !T#,%!# !,*PFY: M 'IH <iGEDDG*}iao]?-;6s_kbs.g=] x'V%$a)&+(,o+0S.2/2.F1B-.*z,X(5*u$'$',$R%a"$ "Y  O^ W#t!~3nlmKg"/(O@(+zr));x$j1] If % ] L<C+}>j_?Kr|qr?lJ e 6O;Q4ys{$ryF4\-oDue>#QG 5C04whS!V\x7[z:YJ9NNT~W^oe 6 ( x'y U O[.__2|Gxz5{?:G\y1HZ&:W{oJ1 o gh   @07iu %dq,2.YWd@nu UW36% # $7mnM Kh0X^-gt6F~(]=}H(3i[)*00li `n?mK:NpYO n8=kceO' BDQ[QwA,w]SORF E F+ ! u"%!&6#&$'$&(%?&5'$Q#!U)i!{ 5 F(kHBP#2~^ %}./N++) t G  1 O p h uxY6r|k@%[x? 9 :#7"+e*3/-l2p125288(;c9;9:{7`8351h1,}-)e)o&B'$" bT6  M+2QBj P;lZ;+_hh2#tFhXPGL'3iR[C<\}wOXk5L | (x !&$%$h$$$#Z%#j%c$%#6##!r  X}3 @ f7~=4:->#=:0WٴA. UՑ.=ݵE,߉28N/4~j&J-%.pAi\Q)u\Q@Q F=BV ,WgDC{z <Z9,F 2=a/B@zt6+`Hz&<>cf^Slx0wcv oS:ڂ۽[GH`$1C< I r  n 6 o  &kh 'z . S{>:K# XqSjs[N.m~Cj&1\ > @%XhB5.dPMmTv<{zT ! ` 4_ ~E)&u% 7 H6Z:Ojygx_"RiN4jJ \ 1 e&x$?&$l($6*=')=('P%$! =p X  @nOIE2b}|e _^x0L3\dl~IlSD 3c ݭ߿8OlW~H8?  lN"?'I#K*]&`.+2.40.617;2~50T4~0*2,-(+$&E"F$ Z \K0G> 5 V FN7&1"\6g5IO4kDnv&s2bq޲5ޜqߘ)8:`'Pg~  Y  Ae2/ =Y#"d&2&H'&`*)|--I-a. ...w.-./--* +(Q(f""Pw2 d^Y w+}u_k4x0?a^ؒ-سܵըWE8KܔX< V5$"8{5&4;.Rz g``F")Ik:Uh. .)6d$]#*),+,++*'L'""v l<A{!{8aNs4ܷJ}ޡ,Dmu%iD$GjA.{J  :RbPr*Qu%zy#{ >u6&>f.X3 ) c    h X +N 0sp?XS+)(n%^S@ E_FUe|u{PFyL:'0|fZ s 6!\J ' = Bv3/d@G~ PPS:S<9*63bJ#s.RxCi a x]Af" #(&)(G**(]({&N(#&w#"H XS5 A)ky99CG~@R PORp/^D , $ r E!8c4> -D0Xv61u|EKy|Z I@ Yt#e 3($,*H2-5094=6<7?";>7r<6n82_4.=1X*\+#%w'#"!%K f \=]WmCrp>^uv!kd=UTre781 $=e6cuqh7}\ 5 g=}-J!q:O4-74`4H7yo:@wh RgCJs4H]~3~,ߒtޣqdے Eݍ֜:s֏;%Լ^&װSSs$pc-F Dv@&W qHC%Ze& $>4< B"QQ`-9"JP io0}ޠ-rSn%lE[ukcjtl!sz4yHX*axFH^LUzCNE?QH6v{e - / @& y |:>DVi3luai14[~TH9*:X]MK _k.  {!NDQ:V^^z#0R }fgiId<R6 S,^ .qA AA'&K*sM7%v6 e& p3 1 Wz  | 3*Xa t =('--.*-/-0./.-+O*I(z%"#`f'p \ p-|Ad["si) wxLy$;--7coWf4'v9 < Lu)?w4-DrW*akBm  ' q/#'$r,(n0h,40z7186=9>9<99{662&3X/.R*x)&# - ! A+"s ]39aroIe7"vwnYYTTJU"SS{o;_N=` Xc jc rHsa P&^? =! @JB `! jYEo}c{918۽gZh,܄:i8uzLDmL1 + ?TMq]~VI}z}$$m'o`&TQ"F(T4Oi D9R|:D9 [Y G m :S:A0E=L' f (1Cf?P} r J   /5}S)6K!15؅nfXԒ$ӫԡ\%hC 42Y/pUc@k ]  hP ,' Ns\{HS,^Jdv,2 F  C  i =0g"'>CPfh~4nLW/{'0s0 = egC.- G+`Ri5 | :0f1Rhss k  X p : m 'u#[5zk "$.&^*]+n.,///c/l/.y,-*)K&%f#D!R&-NOi {FQ2"d% gF4,k%j+O5t4}-4W2&Ύ̙ψ48Dܿ3jfU j `?!6&!)%-+4 2n95<:A>DAE@C?@E<=89"5.4o/-v)((#!cz 5(UWj*ledGvyzCNc]%HF/o+!   94Uw9_a9i#ElbY}\@eWr  .^'s gh$+ $""%F%(%($(%A'#,%q* D?784mZQ&y%idܚއX޸<$ߩ{"xݚܕآնx>'?Ԩ;[פ۟ݧ?_6O,@@'M[z5@d$+P4Mq c 7#7^} <bv wbbXjz P o. w 4~I uO- GZNYW8K<6936 12,+%& z<. F T }o!.Czbus?I9Z:9LL.WBcs[ z5uQ "~!L#@"[#"e$"q"j W!<C ! %#%%x&1&9)&(W'('^)%% jRsKc sCs=~5ޒ1evоfD dχԦ/Ոڤfc?[Wsڡva܍oڹ۠ݫރ{N3NDFk SPv"fz|.pk|Mb8*c(Nk rk+ M h i?5Ef h, U | - 3 s    -g=m! )&.:-2-13/5%1c62624Q00F,n+& % d1 ` $4WO \'b7b+v*3VQb/hpo=5kzvy)ߙ޺,_EF?W k]zax$i!')($,*F3.3"0R85 :"6r=:B>C<>C>_C,>}Ce>DBk>$?g:;861o/+(%!  W|13YvE9#kfWzSb@~jv0 BB\#M ]zJHc\eD?|_C$H  %E  J t ]a $ b} A'(K_3BFpٱ, ڬzۖݍfu vuld=oPaP wC+MzziH&Hlm`cd#f}IE2R33 9 7    f k ) m 6  xLuANFC$+Cmkm]Iv&=M><)mF~GTp9rXL` $Cmv7l!WT:  yd|!i . H :]^L7m)x ^LR)\#\V]E   M  #Vq\|NbmX}`߽L]+C^(TZ.urVJD ' Fjq)5\ GkP t8 > ! / l [^lj Y!CTw@q :e = +1 >X]^Y!#!$:"4$ 4"dL<|7q   AXo6 ap Q $D.ON9FxnhS}r 31<w#2rV(d59a_y  B oa!$")K).,+44s8Y47494Q;o9<:<*:<9YV+s-";   i)T$a$ސ@Pݦڝ܊kکI#ޑX\&*R^=gt5b>U_'gGYT+'Z { ,nkC #%&(+,,-++;'%!&g_1Cg6"AmtQK-Pܭkف'Gշݽj>l`l\Egf%RrJQF;3:q. @[+&zw \ }(+`W "^q F^Z #aE}MH's>3 1?n*p3^/[FPS)M:92\8l0,:dD-T=!= T 2($4A] 6  H\_nzbv`!.~ *<r+\"gsmr. H n0"#!" ^ D S^ G G   W2!)Cl9[   7K7ky3\[ }+n8Eq+b9'eo6+C 1 f!")&Q-+4'3q738@5 ;8Z@?ECG,ESJ|FZKGJeFE)ACAB@e@y>N=$:9I7X641q/],E+o&#&z c j? a  #|js;ڋ߉ޣXUM/ TK ;D\ W2GQ  g }O o W;%8KmV!o}=e! d.%7 t +  {Lrc7 P ZVM JٲBX! -жӟe̙͸Sч= ;IaGܽ X~7`YyImQ==0 6&z} @{o x - {  AZe X,l6 o5| &QdbMzeh}  O M htKB{yAan{` >>PJZJr]E` JG.K'=t 4,lCS~*I ^1.BL[W+ ^  qS"M U!1"'&c,, 1&132t448[66'4P42 2002/21041T/N0+?+k''#W$:&!  Q=}Q&' M2X~@Dߢ>Lߋ):YN QR4 ES   [ $  +KSM,X8U( ti~xL 4 <VZ/6 2 lCB=`POߓVs߮4܁Mٖք؊ ؤ۲jcߟz+P~s)*f p/`z0@lW-&KP5g_SI- R g~sbM4#4 / 69-Nfo'/#?Im@ ;;&=)-lNc ;{HI  mN P UE L {HnD[dQD4.3q&ާ"ڀ[Oߝg:^otv0w#0>,2v||$ YZRN ?oBRh74'Q}$1u#xZ\gY}5|`E9<_=idG\ 1 ,]  L P^*3}cAr@  Q LdlbO?6aj=Sbo   Ua [b   I 5 a s s jS||""m(#&P$($Y'$'#&!B#DHw ]  j /XGd51`|1uz{߇gbf/qԎ*= }pJb4PQ]:k#&D! " &(*/ .114D3H6688J9R65}3o511.^/ +Y*' )&'$#D Wn7`MU ]  E bfl&OTpJ W B|5 #XmX|`[Gt DA g0Y_Lb^oP! #9#&$% "$ 7kPx B&$l4_Aiߟ p3ۯ֚JԜԘ ! Zp* L&Y7b8*!߿ߚAAk޴7z^s+";dGX(H <>Bzly{y)iU  /j{(\ e{j3\s@{4_uv((+l`M+B.)RZ3E?AHI;g P1SiU?^/P);$0oQV#pq.(uOb] 9 [ ( 6 s $ %+Cz+:4\ m?i\SSPC"-;x-uo+YwHL  i 4 d f+( <S4+rm0C, Ri^\ m#l7G Z9 amG _j5y!"I#X"  NTC I$!(&,L*..1..++('%#~!#.Gu 0C w%D%b1#XRZNoءJKMG:? # 4oV;_"_0;J} !T(~&**2.2D14B4=84859'6@95K9l6834-10,.[*+%('F%#!:d^7Iv q 9Z 6HPRiݪhsۏݹߚiߐM'],GoR'q 6d* :g(57=BQ!$%%z&%&$ &%%#1#!!]s.m(H 46/Ke#07)Qs4'ށv%upxh>U zWcE=vߦgAIQ25=$^!X.8q x + l 9tEci77f;\44{MZng& 5PI"\p .: T`m,C%^ J$0$ &%%%&+&N& $s soC i+\~tRaػh֋ת,؎7׵CڵI,w ^؆ٟNX{tymg$^V">ij8MY'i{!:H0C>MW`#Bq9t>X }WJ F P #pG;zL K2-6EOCeBlW2%nS# v-0c.G_q_kh!4|qFq5>$@z!-j -tH~3C<;"^DP)avN #k[>J+$] + }Jc=   V \ o<8X@vzS;V2GuU>)w4_ld@W7lm F HiC|cf   E_PYk  1 r qj PUBq=o @ =  ] wMg5(3emq*Y;  &xLC} ta!#&/&o&('(''&&$#"g V P &  MNaFIZtE.v A^ܨݒҿk&ʆʭ??;ݱ['H " . /P G$!R($+'//*1.3./0+.*7-*:,(*''$%m!!E8Cdi{R/wu?JVv4 u usio g%=u~HeݬߣP߬dOބa_ߓ^(]x\LlK,}&V ! M=o 7&&-,10%635q4H645j4431w0J-+*''$w##_" !%!}!! $?*W\jwD ]d3-jd2ݫR߄ې~l ܸQ ap9,݊Aڎ۟@$}> `.o 7U4P ޙ7dmadgm zH ks_  v  ]I~@<K E + t  oUN="NGEݨ,O ~0e+KYGpOO`[0GMF>-s wG , miaW!21%+ *&B"?%p!\No =amfg ^ r    Z`LthwDeDK'-S*m*9F {u8) KOT=T1kT;XBtLo8]v<i@TtG%Ig`E}dj1o<kp  E  K   Fs W  3)n;( } K t iWE>uM$ $'(--2023P21:0.2-A+)&#v  x| 4_(Uv-~>N7zىԒ Ϻ}ː[ɴC#ƃƑ+kքبUc  P87#&!(L!("+s%+%Q+#(,(2m.40718595d8>3=73-7X1,3/^0,u-)*L(e(%?!PrRU  R w  ml`q^g;Wk C'+xt~H*(^_;A&  C8N "~ %#&%&&'$S'y$&$N%H# "3x1!u8 EK9 /W)/5Du svr |ߐQjܰ6ݎ۶J'l݉U9{*fIIj~ 76X*0 ~@A\[MYKwGY gc{ZTxr8fcvLWl%LVBtX?'jjwg!3l( xN'YmwZ^ w O  GiOn'\#d<.D!l۽ڋ(w؞ُYހC#D8hP^]>hjpYe ~ Q \s<E EH yOSa8<S6I>!!<Bzeif ^ <ORWAl h < 8  .+d+UP  @ IAK9 2=n9Vw&;l^[/p Wi@o  gm a]] ! #&c#b( '3*()C'P(&'#g#"! "/ p  ,x^. |Nئ׽ՊDxہ]:3% S7v0b7"R"(:&+'r+f*-*,R)+2&L(%+'&$%%&q$%x%#!| K<PXKb 7 DV7 V6{X Q ? m  5 p iQ4 L%" 6Oo%0(?OukbOMI"$4#(=&*P(-*-`+- *,(+(*&'X#B%##"Y V]8Ph " ,sVqa҆9Ϫg˒,˙IIМb8հq= 8 j R=6d"~vihJl%,T>NkRQHW&hD2u'{Vd  \c@!@B}  ` I {` T"}}CDSMZfNA._'.;+E*76o*!g0Ph [ (,}dA K bU%4M(xmu# 1ڿj(rֶ֢.V[ڻ8(631} g 1 R E + = U " . >  GN "J Y}k{ߘ;ݴ{ ߘޡ*:1Y}1JUP/Z    k .  G[ZL18CRFHk,"B!%$3&;$&l%&!%$!$&#$"D"*!"jLMXf   U +BHL=:=Fz9 Sv   8+9 %Ovp~$C\)Z; a I'2xN.s^SRjI29 m  W !)##'0'd'(()R)'&y&'%=%$$ tfvJ.^d 6_  Fny@v  p lL: V# F j  [Y37kXz?F#R^2@}Y~DsS!:Zl"#&'+,.0n0d0P00O/e.--*(&&%%!#!_Pg*\  Z  W !G49fyGrVDJ[z$}|5)y&S(F+eߺCZ݃>|گܺ1eU'gq&&a+Ks{C[\$%Ia*AOs(PRT[QukK791rI u%u,L"LE5;R4f 5:1%DjWsjY"i;:A_s{Zo<ޏ`"ڣڭNW"T9EZC  ; 7L     e  d l  " Z sDa!,HW" d + 6 \fU>])+,%8x669B2lw|4L+G=u]Ar c 8 } g   ?V I  & I 9 b  x   + . a DD~  vV;s4STTY  W?xqf#Z%!(M$G)d%)#O*D&,','0+&)#&"V&" #uGzm g 0MVG*S8ֶ=:x]d/1 2 K4^/a[  v $!$$["'#h&#z%o$a& #&a## x!#O,{K j<ܢٰڛ %Bޡ{![l*;q e 34$#<,*U10d63U:y7(<:88731,,&"%Q G{*JPH݇ظܵmoy̴ɍ̕˧Efϻ)֩YGNߩyue7k\hs6N= }geo!(h0v;d  O P m TP7 s)rRncz3qKIK-Y1p}"1/l E 7aOfK > .\{hM2^ikPl]E2Z:JKAV fn ~WZ:tVM}u["` Z [  &FXC<;E>A R %R@D2,)GQNZ;Os-^i l)9=,<_NQk r !;pvRH{r:5PD o *4A]-G1{C q 9Zbj | Z\#R/ M shJ( yH `qR4@Isp8q i %w!M 'C'v**,,/.-A03S23/0-H*5&E$K  }uGD75Xm ctG#n#  ]  J)g!dKYk('g )h&E$uQGVq!C7{gyNvWd1aY|2@j K?+]  o h=#!j#G gvg@ i_ ](e^&/s`T-sf,C;R&2@Te%  o ;lrtop\OYrVR~  = )s;>?`z2^a EW){42q2-: m fPN)*$-ySKy0  O w 1Na`KRsxU]nlvv^ 5{= m  ,)Uz33&e`Hf3T`  _ AJ#*z%"'$t'$&"#y>: V D,TP&Q!YH_   PO!!I# "$N%&''^(''#$  5Sq 9 @!xKf2/5_xv(N t &a\ , w"y"$#%$#&#$=$&%%[%k%'$! Ny.,%۞?=Rبլھm~j]r" 3e" h%s/q 5> >7z CGJ#,x58* 5L]Cd{$){c%ZM>;Jxo,rD AVRd4Q*6T@z-$c8k 4 * | ! g  > ~YP ch|RbK'JXMR[d+oP +'_$Q3k|Uwgs6j%Ql+2c62*g)H %rnCVdE W 4: ZPR$hf Ah>fl>g{_Qqt%  Z   , ; y   lv1{(x;NWV%M(]& z H u6c$"!h! #  F&libfq6G1 o ^Q9x^CY2EgY Q c#t$!7 !s# {#!# !V Sb9`@ Jk]Ei#*+D g  S;iY'X$*)G0/;3 3 76;7662630_-M+q'%P IKn I O1fSL<5"LR, = ' W   3,,V+vYx6y  xF}$n V2ݮI&z9x  ! L#"$6$#"f!c"#"##$"r"$"4"<c_K- Wi/6"?b r%*`&ߵRd49dfR0n}pB^޺3lؑ՚ռҒ֨س ޮ*:vD\& Xs#RL(} C>B |9I Z 8 o *[{\d0[U%?G%U)Yg}qAR22cB0iH{aM@G9&,Qjs0A?j=@9 Ecw d M G /<Uc *WY-&"]4 jY oG( ޚ!!4oܷMݹ:1v,wntGq4Zyo0yg>   7 P  { 9 ur  \2 *m ?wZYyb$ d#u $d%*)- -/.///-*(y'j$#*"8 Lva;B  <c K$lH3HH/-<W!yg e  _ ~Fww  4U8k9}B RC_,DEc ZX.@"I "Q!&%%)'|+)+( *T(+*-*+*Q, ,)b)&&5$}" sR  E&nڮzDېt.8۵=߯8i!v&hFF+h"g!' Rr&JRN_? @C4qV'I&c;bO08R:Eb5spfdt3PAE2Z*TD9HI\rtW;J3DM:M V :hmM^G 7 vYznDz&k<KP|el{.H *߳.nޙܹ;<\ܧיbPj/nL,sxn*6" S ~ Q(  7##hsu`ܶۆݯؗڥզ%Fӧ%|gpEA6gQy)+[h QWE![ i M bORc) j4J\( H*6xQEr%KCo_R|EQsc[ ! Y - wrO k^ [Q$_n2FJNF"\zN9 Cl]3Iup% zL$<7z-Xb\I]1KU.I`m& !mdxhR9 2 5=gvE*FiLOjLuc Su/   l   (F?1j 43 #S5tG3 [1j-"#e  3XE  ZC sb LuNj$Z Xx!x?S,ms _ =  > 8 F N#pKy(C !6$##!#A"!!!X!D!  63)n un4} v  b+aR9DaypuG > "*^}:j Z@ # MEijfF>@wBG kq A{nk&I d8/uXJN@/,Hx szU lFޟM[HBJnt"$$Ur^U [}0HO' eTߓHaמׅ+UAV.+-nL>uJ(I 5P x Mf-uc S ! XWxS(Zk^H/-[7OF=:ay|a+En{  >k 4 &P{Wij9P^#orR&6#`tN9(q۞| 3{Z-[y#&68J5 ! x  - 3 Rx74  - I v  lP n@.qb\d>wG:G9T9E)q GH V <#@| KVK Y    " x & b  Wr|w ( We  lBJ_c=VgLJcCbr<c$bl ^  X @!Gw9t8L K A `Qt#3 M  V   %#  P V P`@I   L  ]5  Xib0tT6@qbao@5J<^J7* /2 - D|z(P|!X!v ; (k i!&l4S  s$ZX !to< _  V(.  zKoE7Kx{!R܎""ػچ޷ܢ0g H{f( v+QwwOGp!sqqt6MEdkO<qi&S{ 9DTo9g9?yT9]?RnްeNJV(. &yc+a#l?w1| y !a)MWa/{ le_Et >3Uc 'X P* (4 A]2Rlb,hv5H ߂46z8w } Z W9`DY(5 >h N = W T]  T 6 H,s5U_?V; hhh8mE<5N ,ne +  IcBcAD N W z  = g 2 6 o  Lmy{A,:7ej lGZzP^!P  2.gi}{ q!Jhdu H   |T>h+"p'#)%+'+3(,)W,()')%~$}"!s[A@zTFX R~,Ogfhr~22U^IT   f  #}@,~`"E v<w3~gI] p 4 e;lj)  Omz+Dga%^ E ^ T lQ Y UX  E zU ?2hw0$ܻ1ڂJذ܊{Mr>0Y NHf6w98@%) 8jJz9yKH"p} 1k^QVq$ l?=+"3oD v  ] X k m ) D c 'aNQ@j+Rqcn.LihLXV"r 0d^SsQ:hR7B8 (4zFl_xH>1yf@.AL6Sw/E1,%z  { G  'JDx 7  5 3loS kq/*I%?hmQ51uLr[pb _ 4   \ ? L  M v $2 EN><^C[5cOF:/L\ D :~L<ypM:ohr7p>wdG{s 5 }]3!mN`"l$4" '^#$O!~" 1  czpC  p { < -\z0Rat.  8Ak}{] O^N_Ei U    Y 5 q AglF-* /G1E&h  wi&l Y}:e0wVi Q + f P ,$f{iX77hi{U>6eP8mizy39Wl@(gdU>$:I-Yi~x0=^Q30kW}BI(/^DoJ,eIT=  / p LV l+<}NKހ N܇wއb^2.B+KDH' ) J " D x r e 3 |  A aDq m8JK@%"@ Js??o#>+3U^pDޝݳܷک{bF=z}h4z4xs^B 2G      +  X  i c   w JUL5V`Xz,L l+Pskc$\^Sd F8 d  g D l|t{ ]  G j s " # I %96@A ^6G y!m%#'b%)&((j$%j""\ JTp' v .!vrZ{`1Z;cKD%v!9 ! 197Oc 9c%:$o'e$ 'Q%&j%&$l%## ";wr T [ xxH  ]  xYwRAN"N$3Sgjg? L 7 / f    6  < n " 8 6EJA0^ g>?'8jO | ] , 3 / j Q l4}Hv?:6b W p '&_2\@q(+q\7wDRY-g@?ja:3, }ZRl)#/M-;Y__NpF۝:3 Y6 ,kFk=f4eXh6]_YYB30ܬZڈ֠?Ԛӳҁ۹ߝ^'H*bXX a ( h  I > ) w fj B-  g  t3i(`dE]M)$ػٱۺssykےܴfRU _ Y j*gk!W"&'%]!M=B_3 uTWU 2dU7Wc { OD&   W w  _ 1 Y a  ( I  (&%r+:Jq1Xl([s. H wA '; _  F" "!W"g! A  Mfep9=8;673}4E/>0+)I'%$!'  hQ / dIcPx[AL-`n!l7.H;u ,v8O;DaJDny 5    S(,*3brp* ylwS?7SX / " |n5{swvO]MEZlT[!, HV>1.e|SWbJ$@owa@&?AZ$Q=%~=OVT>xvhr{+n?'\ys2+ijBai{K:dU~ A { /wL"a"$=&&y&"K" O bbN9 s >e4d^CO}."EY}j >   E ct 1 Sa=/r  EN%G C-dR!jEIKP  T &r s&2!##o%v$)^(+)-*y-'-/.,W**'O%$`  ?:-B= @89+{^K~Vmv , n 't%-+30g74;8<8:6|94 7#33'/L.*`(#!H  JH7Vw_ J owk!^vtgS iEj$wJ J A sv2 a 9 ]ddjFJy3Kyh  ) YuQO- ""&B#A$"6#i!!]f}I]U5t$U NN  'nY!SS]Mv1W-6AB#XA.'*f Jb@ ,+%a^Q݆HOI B[eTg!DHQoq i[Uh :Dl~|ܞ C_}ۗ{6[̌͑̓͹ͱku+&%Y"3 S M !G!|!!g  jI3?Qwa 9rK\|xe@TfdUz=|oWmi~=ެ?c۷ڀܮݝGboߏAj z)Xp4   +eN; "x! d! 8 F n 6 Q g de\B'(W9; @n\fAo u 3  G gGU>Co*m}YBBYz  m  P  3 b MH, J9%#Z(&*z(+*+'(%Q%!=")@ I I_RRp1 [8%{>:|,d}  G@-w" (&-+f1/64848573410x,6+&%  &z k*Sa' pUjZ  Xz | r}0'Sx8oeD.'?bkI  [ 6U@V \R !z$W$&( *N+-S,/,,()f%x' p" )1;~   , I} pYgl(&w',UYD6Zj# B} Dy)}8-mkccߪy #ߞh#d߫L^X{y܎ޞ uBL*_r9_QCC_ZX_3%(  X .7N9z'n bB{9_h0]ߪI[J=|߹pU*N9"]R|G!9"    dp / S ([s$j[*y-D!Sfm v z i1kyN (  rGG-o|5vEbߒAڤ3ޓl ކH|[`d3u AC V&n. 0]&z%  /_l}{c_1(X][pDG 3J 4 > ;EB'q#b0' KUw(DIS';Fo:( 9p v`IM  ] #t6'")&,,:'_+%*%'#9$ipc UM(Ma6t`Nc&{AY>-?:<;U56T024,-(&!!I G 9$ h Ic :={ a {x%>$?j|yUjKK 9 t     /sL!hE I 0 V ! M#=yenH 0WI[][~ xG| y  ) 2{  ~ 4%=":=_@'/- v.0:n? m,}Ycytm z DmPQ9M`SQJ!if/jeW@VCg1  [ ZKcD U)lP}oqݒZ۽dU#WrK^Qb,L Z!T w 1(E6 D $Teb|gy{T{tLsj7<yw&>mC_&N[pTk dR%8CYQmB#(0c Wm u$Y&Pnz4' 6 NC(V;!=#E}#ms/v a3! Hks[UH8 Y<$N F N7 , #=d } 1S "!$!f&M",#(!  D:!Ns2L { s ` n:2#%"w*?(l0+.5d2:8@P(?;^=`:N9?6>40.u*)$"i^3 I m tn?+(),Vl~MI!6"9JcJ1[q'  `    \ $ 7   1B 4L&n    K # H  < Y N 8uw{^ !$O$j%&(<)'&g%%$#;"Y W" I mi\'k`G{n5XfyFv܌ۜۃQۦH=7N;"qA`. [*CcBL`YJR^E:N)=5 cR 3#2vu1\3M47 wHlbiG5Gc6  y#I}> z u T&T[אcӧ-E:ќѯp}lWv:@mOeo%2X Q  n>gn</p//E$@@No\i$3@m_# P{lgGb2pTYb 8  \M N s> \0:B݁$Л˔˞͐e͖ϡP*Ҏ֌65N>+!|i9K:jwul  7"ZO a % D)j"lG#$7Y ?  ua e` 5  l P  D y  ^  Hz;Y>jP7@E g ]UYp=I)s hW7m `8DcR3)r  Z &[#'B%(&&#$u !]c~ * lmDl]?'==pJ~y}5 gFFV~ 5 ic")w)1!0V4328S4;98=9=_8q< [&Jmv7Rlz98.jK%dg+ZQ* Lu}e7o g L@!#-%"#"#p"!p  _F  XDb jI54@,u-y3z05fjJv$;)Y"!>[XTVWaSD*\tZzvH}T$2d_8,G`44si[| GdY~ r V  OK75 C\ߧ'8Wl؄kֱؐjآݘܣ߇ |iz|wXgx1ew%  G $*s/.c H # -hPq[ul ,E7_HJEiS#c}ߺtn|, ۷܈Rm&l m`Yi 4, 9 I=3g""" )SQq 1 { o@zOLT ! @S/v}#=m:Q{a!#y< z8| |-!QJ[eCT aoXE^ q[ | | h  g RzZk! Bt'I$&A9is?LvJkN"e%0$<)'_+(I+)4+()>)`)&='#?$J ;7`{' K j h/0K\Up? +*pk9'O,ac7X &ub /m26b@cW7%]/8,!=u1w}UrxW$9\Flo ?|*X R c  k   W}x[8NX|ڈ֗klђӟi-ӒՑٙapK^V8$RbY^:&* I * Uj !b%$&)'+(*k&y)#&y"5ux H@#)11a < (gg.*oeNC 6_o.[FL'Cdbz|0@ڠM9N6݄rCmpp#epZ3O/-$b;q2) zrwdWIx[ fZ,>T   K `   rU)B6DzVsg"% X1  j,M qR a0^/sKdp0i ", >  n &9j f O <  | c  n`uOe$vB@w `Uieo 4 u  ' ;   L U.9-dUVoeR ##N&m'()+*-- ..F.-X/B-0~.".{.+*)(*(&v'%'% &$$"O# G ?` #$P, bf F%:pU(K hQ]jF3jh~#F ~ 1 O z$GR!$0$; c&#(&j* ((8'`%?&>&i%%a$"W"U>22  WbkW^w9e+a kPDPl}'CF%hTXz֜אךڞr ]u}0Etyf/B"&y 0g M  S )= /  kk @aY?zM}07eHe]1Ny`BK!$7H)+"8g> Fx j|8 .Bs%yq_q J3E' Z\ V4B1DWvQ/j`,5/2.Y^)~ikHLJ4*?]%   ;  /Ct;RYt_8ey C,<8V ] p   P @ 6 E  6 7   &gZ( v  CB-*=g{%3m$XmQ~! 9#!!uA<$%#{ tphVD*[YK &yufvr_VVa  ; 5 :=4`fk75g]. -y>! L YP 2!!""###""! ~ZBu (q sC:7@72El4h[.?pWIGJR4.znmEDO0/tlE_C2VKަ<27ۨ1?9oک޴܃ڝ,ۯ-q8kޫcܞ3bRwP, SA]?qDFo[KPt{BI<10#q5mZlrI x Z m } X&  <4_j= :*I$L.rBR NM߫69@g,9n"?-w'^t|meAkC0AV^uetl0 z \|x%8 r 3!("N$2Fq:a" lc#*< |  73 a9%    .!  y  C C U r # # qk^YO%baL/2  DP ]?F}I0Wk I Zja:!f ! " i3TG.@  ;*Z1? W '^5ehP  /W - I6B]L #"%S% (''%%%\""R ](*i\"<## A!3 sGY=: W/ @'Fx?|]DJ@?bMzuE1Cs1V"L Y $   $no'5-!@ " " "' ##~ "X!(!?U1^P~zA.sF)vY,HHߣ޸5HOG75x*y(&u(l.=-?!G9MIlIBBzUuMf6  N  OJ9  C x![W{w;Y5-Af-YY&!p@xyV gsB{II"`,f96@mYNKvz%cW  Z$7g)+1?jgm4uFQQ +z P wi9YH~Yے|ܱp@S8E:+ T9]tm;_c&8*j1UN ;,lCY2x qj9U)spo% ]  q * %L V " ] w  n 6H t/A.M3Q<_ݔkݸg| }T| GM~3S Ay8#l8 LzPaE|al@ro k mGT$f $;$R*(n-)30s,/,-)**&' 5$ !U:X!g/yFv   T\9""_vR2cXX9LtCK5T  d  2X.V&B Y s-au2MQ ? 9  *r6#n#B4| , |e^`lq O n 4  \? w ? 2 d t 5    RT D!i| ! n" #!$!"-"!IG;S)n] < A H;*2u2M~elj*.6]k*v%wZ$$PIV2|~e x b e F YA\a\@!D!# |V D|)0k ( lGG^%=^_ާm\;bu 6r=hC8mqu ; N_e2VzP&| CdB&uh6#H?8>:y  U}Hwnh O PgZډJj bC ,oC%-D~7u}l]Vy0s"\$x OV4B/*+?>U*"XNh$f=ڝ֕юҵѪΫΫdu[516"+TLDZ[&]BVpUgY=5X{:_es =@7#,Q  "PR #$ $ " Xq; J x # d R%^1m7#,`WBqP Z  \J+DgCA^n\<ijJ # B < 9V ? * |  39tf@0j-x j I ?JMeB-   0i 4 ? d p ^ x >  C  e? *$"+''*%)+),*,+M,,++Y+7+)(f(& &$# MC7E  HN}(jf2 SRlO)z`buW Wn^T'pO <>   7 #  Mp t)E!mpMk."'POqMz  ,"LMEyr ELPcAV(lh],*BS~?P8#Q=.{%*"BPggYX?K(Lx'dbYQ%[>PH4_'UJܦ+> ̣ˈɈ~ѕ@HjP"\c5Z3ml1nv!V m Z Zc`vt  *N"Kܠi׷ = =P3V4djBtoW<0p{{mMdPJgAGO\D؊;yӛҚ_ըؖ.YO *L H e  cI0]Wx  H LX#x0o )f\S5A2 E+< 4 x#W!z'r$'$)!'+&)&*'Y*&v' $%#" E]{n& ' z 's S[T00CV1" -fEj^ H E .  JK bR EH f B   I 8 ] h,`6d= E ]CH,!" (w"{"0"vxXaG;0 ~ k 7 &Bw60[k%*S< >F+ DNkT8yA4$M$$h<w 7 " ~ " WLhGE5a p T $ 6  6(]`EA=`+.PSM Ce -$  #0v ETKmL` X d ~=;f 8D!""  (D*T1tuHQ   Do O};14if J Bq b 5$  8 e T |q #J'" t 2 tE:12q!VP[;[=/:ny0   ,@]N" #$R%%'g)x'*a&m*i'G*%@+$'6# (K%!l7*D? C\O=?MXs 4o?42TKG x @  Aij\k   "G"Z\='&֕֬;L(Թӽֲ(ٲq`ZO? 9'1 >f3_?u O#Z?s\$ޝٸyՏw~T%ߛT9  "t<c [ T4~%(gU&D~evԦ؋nqyȌʝb́\ߞ.qݎ O;%n[c1}'9% p^8Wv5sId "aw RA4ZWg =;=R6KM9"$oC/IUig}R|ZN x |c"$"'%$)'*5*++*+4+,e*+(+)*$)!#%k"4* k ? / ?   y a   u5 0K3Eff*$  ~8 t *I-&,U>-0#  q ' Hh  ()o |) - u ? Z6t-',{)O <N`wIX  C  W+kh &KI}&Kwik3/u H<Ra H Y!K$%P{$3" 5T CB he/*]bhT04|#4nigd [6goy/|um2 Oxض)V׭ "M;W dFAR]9~*N %AwRw +O&l\P$ $y `d|h=A " FUECi.dqMR@bޑ۶,ٕԑ)m Ҡ͹͟Тև= Q^NfT tZ2O=|}y^32CW c5=^ޓ9݆ ATݙݎlhCކ5^2q*/4)* 3 s #y|-: R7 !" y"yf <_ Y Z U8 Ok^jQ:%-xb;gbxiboA(g7t@B.MyeDkLT  \ G8'`u!x !!!#!L$!" !H!  Y" U   4n % F   m Y 0  P  6/4] @ ~A^89 - fI&:mK @ W< j +vHT>  : iY.8t^!  J yC/`O0R'#~=:5`K y Jq yn  OCYv #,#U%() ++,.$+=0(:/'+ !d' $m"B2IBIDZ#o8-'k[X8 2VI|(#|J'*l&߿߲ߌB=r;xXe0>0%~qyq  4 k { .  ~ E    C c y <  x:lX!sSXZn{UL qNtciC)|9*yK&!8d:kM,\fCk])._ۡڨ\ٿe`Cz\RM| K J @g[9I[9\{ m/0h;6Rkza >:YP0mKo BJY'=jZ3C6Tz.iIMBVd.d i0  ) +{5Qm5-)C  (j ?$F"- Dsh_N@fq &W ^ \_ L  KJD 6H;@:1Xp ! gRi}A!!b$/#o$U&$P's%&%v'$D($)!'{# . D ^ k0&k([fkSK  R! -%#&%('`$@'a"$C!8O,A _2 ; : y g  ,U$gB?ao  phwmD  # M ~? B txwu._`>ET}zJ5Y  a v k oqBz[6 ~%# *s(Y+,*.<).N(-$F+V )p" r |=`6q&%X-J,4_}4y 3_TP uU`$x|!;Y5SmTP;BY6L{}$@}VhcX(T S/TS:AGR n} '-[X qqxrwT{J5-QC\xl$f2R:Nc/TXN]zLs>e q<  mT<9e>AF U / !vc" Pb>#o8]MMS`,LC:~!)\a49S~x#'icl3t1 ob ݵX"ܵ#5Y8-[IIR X:`. I  :y9AE$/y h!e !T " # " _""_ gd%P j  a  Y_QfDy9GaM}FW,KPa;@qUk<5 *RZ1= C1k*lTa^Q !#" $!/K[s,  %$ %G$A&&&(#&!#H"I*C, v |  ~ y , + W k ) w  pw\o  CVM' X!,"  d!N L;s<  Ol<+U -  kE$nyM^ xO   B N 4 `  z "  ;  c HJ& [1T e y.h %%+YmV m,A@~#}_,]U-7C }^rCT W>Kf`5ZjrwyZt#gFm9 "AM /RA|A].QElN?:ken9 mDaH.Qߡ!:# #"%#%&'+'('(*d)+6)+ **f),((&%#'a] ?mD Dn?  t'  L:I(SH TPino70P$E.hlRjrW ^C!S$D\ s H#!(&,y* 0-218\5<8 :8N889c268\,3 */(-'&*2")C 7'<#T!, yw #7 q+P(I77ckd 3Z ( rB<`jB;EO ]!#!#L"Q$#]&$j'9# '! %$!!= s  h}BG / b \WTef2BWp;NEsQ$bS,Bs_H,F;v  V 53 ~  I8% . Sks> a /e`+Lp}a&/ jXgH=2jk% M$Nq G {/.7ld["w!V@q.8JT^w$ACUlf3Pb 5; HR!z3 \ `z ,R_8d6tdJAqbtT:nظ~ i?ހؒ0Ej[ v    ?.y-)d y [v  o4e`t>BGt|GԼ . z#MڧM\L4}~}4 &5{m<2w(H5Qtv{LD~X[mp uye 1&@& ( / rvj7!\"!####"g#[!("!x!;9## Eho `Is?CL?)#FC|   Y r;YcEeDi7G>|,tfk%;&W> q  *s 9!!#% " t u|0L }n4|eL7\)}3BI)6w :  E < o j    N< ? )  a  } &,0JVz!c<mCHT |b B \kv<)>WD4- K> t  L b04  4% ;^ I_xvd/Nn[ <Qi! ~t  M u]E @Fe>!8MMq{e{U?bN\,*82 ~TqEw,y3g#!.4W[ QWwqSn5s#}Xi4-{^B^w(Sh#rMUcnI#S?FkV<- ^d$^,23b/ m } V / 3 at[Va ?0_0$o"OGUb#qjӰޕ~8HI?g^1g:\,yr/tdo^|osIV g(z>,J}B|uf$vDd 0 L j$ . # $6$&x%%%t(&d'_)u%*"+'O%" &  GvP'X;g3x7'sKXc*'p`_sr76'~NTS!]A$iT!HSzP|/ <Ygb u "]9$!%$#&$'&(Z%M(((I*,0*.\,-/?-/c...-+-A*E,(W*%P'!:%! C1k4Cl !   # @ o  d `  N u  5 u- & ~ 2(iP"7qAD C2 * - O  P 0 M;  ^ y X  - mUH\/nCFN@.qt{  dH/    KV*ug4$'v {   N  O d T  %%y g i/p9p ) R:G)I."g&tJ E?YAjSo_ݹ`٩Kh</ߤ_ nF>/DujgD`-7]$2%epxp( ?Jp$(!4*f%W+'*(&&#]#]*t@  )kQ;WIZ$3*ۘ׌K-Ј:fӟ\r)=nb^v /  i & Ut/9?9_ Tk6F% LK|Q޶ߵݚ@~pV -9RF("FCSJ7/(-)F Aw8 6fUlHq@A?jOO3I޴|A߶8J .o- slJ! o p )[+&+""2%+&{((()))(,D(*%E+2" 'a$g b #AiO2+S^#9i#3-DI i G A  N . {3=4KuF[0m {`  YK <0\s!$8"&[%('*^*+f,-.\21t3#558698P;h8;P6;3#:m0~7-4%. +($'* 5C@y5 *KXgm'MWa/uNuPcO5#>B 8 V"^!%%'(,,).&+#(L%# !\E| HY j AVsR8r@'"uA2MQc9f`L5EXk 0usKQ+v| !_]o.xQ;[  ^0VyX  S z 9 a ""!N!S#$F # bN$?^i^"adr{?م5߫IS2l{1*x YBxvu8`Xp'qNF?{~?Rd+ q'L?,RP  ^ |cdekP"%Zg e  VE@f.dsJO[~RtI(ܑI׫3׀֌E~,Gމ} +$QfU,] z w = }]J[4z~ }$~Q:\t::nTz =80*[I{#b]Q8UI޹1rD:nt2x$ `VqDI('(R71RgU ~8Dqp e N_"!m]si r#"!##$D!#e fe9 ! e 8 NDa>eO< WrSDT'<xpN3g!@ gk-SWW}oB u ` `k !##S&&()@-J+ 213066 977;+9P=v9==6<3]:$15-3#?.&w UJ _x18kLS(  x|25/' 8ZS>Wa@"<#%<%&'R#(/#q' $}:oH iyk'ps_ioNK*ky;@u!t7vq:=  4Xd>8 c C T  1 ! `   / J |\` 8 % b ` xN:fj X  ;+"]WQLX }uT$!.cݒ$&?ΫγYV@͋̈*۠Օ\p iH [ <K%ZjQ +  2<k?b$Yiy[a<;vyQ* j.3Y :jT ] `m4A. 5 #wYT}g7\#qҫ{;wXѭ":IϽqѭ؃ջ_N'8;Bv yF G v>$  *{z PyTS{9G,] | 0 s W ! _YkR&6n-VB ! (<3`"w'%J-+3K186:;=j?;?c5>.0X7++3%2-(!!{8CK  9 D % i_6WPG 3ciKs[ 21O"!l"Y$&"*!=F | HO/m S   d   xpY)"=4)iy Dk 7 8$bx#"x:9e6 u Rw3S%UvSZ 3Rt[1%NY ^a\/E@x  < 4'%N>78)w\$$(62g_[WOzh+u*gJN-8h.O~Pj8) C1KuT0 l ."29x8V + iq` 5j6ޠݏiۗݔݢ;rޒG~߫x&u 9  A T /EGto/[K  X <XnspN ݠ܉ ޘ ݙi a:"+$"kRi%v;KU]^`IHH^QZvqG[^uGqKmw\cUs \ F _ x  i /QV*HD~UG~ wX/E7qP 9,1+ J  z \ X f Q{ "    m ^  tRS*GL* 2q%`uDis  HEn %#**-0247O9=a=>@8>IB5VRk0K0bVn4ݸQM_,4ܶ:Itd3 >*y @ , 4Z!$d.MgvI,MNgE6SRe-/k,4W9  L$fnm   {@w_,sULrUߍ>hdNdxUk+N,FXt;'uaHN -V  4. F(nm!{y+ E6qceۄjܒ߶X2G`߸I:C}jYXEk-s`G_fOA4,<_Zmd;%g;}8MM~|DJ t @ W   _ &$*)"*'i/*.-++'d*%&""%I!]{K.L+?&  Tf R0n88O2&Vb2 *3% ~ ~ x  { i 9 F;tZ*^uBh/&R`~TaIM}~T o . \a#")d(C/!.233o65I848/29-3E)/#M+<%c   zP_b}{`F SQ4b@ b;R 3% ##'{')))-^'f*%d)!&"  1k  w [ p s  d V + )  6y!~ia]h"$c/  o*,r;e[S|@#a. 1lfCx)i$# D a 5q Is !/!^!! " %Rk ~  I - ?Jvo1[U߁ߪ NُۨۄYݍ 8Jlc;iY.fmRo7 SASu+o&xOHxi  g>Hyyz e Z " I3 '  v F s4,C{Hk4mj>V7_ Gy?w5? Q]Z3826*lVD6 t w l &Y%,'+810>455#8~7r:8E;6{=39f.5(0!5*t>$I.K   vG]!T`Z(q(P8?9A5Q> QpI!&"()'S,@+..+.:*-(,W')+!'m$F#;v+ z N ( C/ 8 5&+$NU{\T D* JU2S  GN p) H uKZ vATW#Jd1:Z?f)TF4|;yy*%  Qp!#!'$#S&!#{ %   >j !*}(Hj) Zje$h߽]BAgF4f`"% d}:$7[.)o\dbpߕ;lmJ#;W'z=T^ @  T9 ^cN$H  \`%:j>z}_+JbbCrB Zj2 FMjiFhMi.\BB:ciiKhRo{ջ׬+-oU1k|S H&A14Y@53:)aIW$}2;]{3~uXl Y3[?_B6S&=*M[($Mt('J e 0 c {I?-"'PA 7AmBm0AW M  ]u  \LQB>V9\BZ,lTRkS-NNf$csVMO$Aj]3Q x e!n# "5*&Y-'-125689!9=< :6>;>9>6];18+e3$3-U"&oB$ 'cg B~ `$%)zY+Q;+U  h v u  s 9   H m E=s$   V    3 &L&(  _%qvN) # RHs3fvVT/3vd^cWbX*6d  wJdM9$~ X  3 6jk?[DLE} k`T5F6 r2݉BA'yg >CA3.{\muZ^>)F?bIx=Y\F{ݛ*ݑ0o18) ܅ S|W=N`K?  -Yg(c'S!"H"C  h wA H1+L81"m9Kڇ-MVݺݤ08rn=Y^vx`I d : # +   m:}RWڄkA#֙b-bFm!G^F 0$=D1$5D<vN2+=eT[O<pLME>EM[wr>8/_g"Y  Z h Z '~tK{;)F)%u).(?:H;,   ; /*h1zTb9|5nK2Z[vl%uOHW0D >cjzb k 6jkL;H e f 1 R" &&,+>0$/3x34}6V58696:38/F6+72u'+ 't*O"(Y%4oIa 3  ,gehGSD;+UW[G+A $ sAO w!"2 "SA!8l  c~Ik XO B\}9L*_ebs>{uq aXo*  H|1  $1 ~   y >l Og"qe)hBDpK> P*`s q#V$!X l3  !8 ECu!n]x-ePMC6uaudON u,xys9L` {J&/_JZq5$  H  uo ePC[J + X  @  QR<x$K w|3Rxq> y B \ c f  D J t - o 1 &  & f t +@y/eF3VzUga4 }   ~~D([+  , YF so]](6Vy!"#C$C$V%O&M%}&$I'$&,"5'Y#YH D   !nnP *b+#0Fb;7UUKnj C * }sJK !##h&m&'/*2$( "I'C#!x@(*yujpqq.H*` h  Y U )  3 K  bF G %  { /  xM+m.` %FP44x.tjS t r  P     -  ^ s w  y 'kqx<4;Rޕۊڞ<~߶K1:oHDn!*cjO  F    $m+O+!UXMw%9 i x  f*4z?7(TC4f%+.o' @   H1op}S J # ~1CO:% q L :m  0. Z 1sbc.\Zt. *6</ iXLCd~*q@mf  r+ /'  > < \ " B 5 !  4$ b t O-%-G;"P? q>9   W x Db 3S ' o  "G`(dlo @D V 1#  | a?/EI 9g H l  , ^ t / &Vn7J _*-7{{`Ud fw8L> z 6X \h!E e#"u''W())*(,':,'z+$+*!)  %n{  kv 0L - i yb=m!Ds)EXV5 } 2c QeQd 6_>aS{ \v.`s4-  :  Z     t  !j0n>  R7PR #o5uk1l8Z$p`]>IA&w2 @ @ 8 ;   Tuu3Sg9NC0 9 + ?pL~t\T288=rt B7 xP <$\YlDu'UD[W}&= 6ghd/:Nl5f~ P /p W=^43u'   0 P3(j]~/6<7M6mNeiJlq)3g| *]J$~QK!"3~tMWq _LXW8H,U~ݼED٦٢ٴE1' gOt O }Kq  dDu>DIv < ;Z!RQL^ek V 5hi  !q $u2   -W a 8w-ecMK53Go 5%Za  f n'y_deVLpc`&8J)hy"?u/8x h* P ( R &Am P t s c P2|  =c hMwd$7U [oh l-*On]o{], T F ` /m3X {GQ  G9C US   T ^ S Ol erexPS{3E@/+`Jܦ81iJ;mU$&;ycZN\.U$Zcm7Y T   i  x$b>Ioxh8=^#*LX c]<^ihH   d~;{@{q. R MD!RA&rqP->V:mܘ݉2/KבZ$ܕTF4>M,Ff+s o0WI,VY%D)#]>Uߚ3Si'>eu  !  41}2&]|p  |8 =9 K3Sc(cU.5No7g5zyX + %I]%@+VUi(4  p`DUBk MnhC qr @>g   LwV1XN*eM9 o ! !!"!"A"$"g"r#  ZO"u$ ? 6 s G  ) + DV_U m LY(SjE .T N,*D i n ` L/nf4$XZEjYf61I#u n: 4V@e` ^ - P VC 4g  xLIVc/hoj .3 [p|%6_|wTh*zo1G">ie9PK`j W}#N#=d ;z[nR?W3"Ptr}P=!*<\2$8jXEFV>{cXFg;2 q  d   XKy34(Hh6I X{AeyvR   = LHP]LG o \T`h3>?3xbB d~\ ֠Sٲ&xޔno;XF|9aE@hgFp}`[rC,ߗޓ >>{}'UF#  @y u\q .+6tf | * xHHq_%X;L[VI`Pp Z` 8aw.%c^   Y _jd.WuVFw1w;]'75!\^()azW[ DDjf``-/%! t R < : q6  h 5,}gTgWEW4VB g ' G 3 $ {   43 P _q/JN g%Fhq d  l OA! n "~k!" 2{GDnD   I$9] oK+Jd g9 D%  b  Z W4!+P~ 'fRT/%,WZ9Y3JTmc_5 Wx4 + } T\gS ~g)Q*FM A %}5h߆ۯܡ`vްڀ7as۾kRhJ5]Ap.wjWdAs " Au ?:!mW$' I =9~[7bhzB&P'm[[5Q`3LQ4"u=l8fC"0.4W x wDNZ\g cC;xJ)%O($={[/9Hf߷pwړߑۼQy)D$#Xށ UBqU  {|$e!'%*%(++*+*,),'`*)*(+j&*/#) #!fX% T < m(UEoߞޓi/ߡCr? d ` _"S  T  u.|oSn0&RY5jN=}inF !#!&%*(u/^-.60-/D+K/v',M"(P "5 C$" ! t"|  , 0zI$]@a&]5Q|i* C  Vw7aL ! !  aAF)bZ2X:LP#M\5H78  * $ 0 ; f F\F  H  Y `~`4qFNT8]K-%4L#+OS(anLsyx |LZT-:?((,<@il@+=C*%Z?~,t@"Pp5dkqbu' B5%0Sq=qۍ|ZR8ՋڼP]ܳxމ0Sܫ  igc |"mT%:$J%%%j&#%$~%$#&#%!#D!&1  X@<i;`sp7/ B %?v"&p"-(b%(('$'&"%&"# "4 )+3-   m @ P  fV=QbLL pv `F m_! A#I%$&8$'!~&[# Xb u  X' 8Kh Q~>O'.t%c1WiM # n #0-<!a-SI5Sj_kBj d e } 2 Yu9@YQYG_2.[g  apA5^dP\G3jzc?[} b6 t Wl{R q>>FVR2$ T1E9|bo)Qxwj+Ebn{%<l" <ly"!"y!Kh   1a$io+SSFڮRthYݔ 9ߏ޵T.*sZVvuzN8Y1#23v ,^m-892x}u_6dlt]4l]#XX0?/3fK~(MNjY,X5_|7qq!/m9qifq&Fb(:>"*`]$~SKTPtK6 |?hQ+1 @S@6 W}?BznfnVݲڅ8-ؖ߶ڼX I 0 E~j'Z Z 5  _! ^##"%#M$%%!$&%%$S$ "Ubs  '6 A1FU]k@,9  Q  hYS>zX>`o __ |  > 0! ,TbU+D/MK_fPc > &#!*&o/-}0t2d23.n2-e/f+.)+#)3$],M S \Yw=0[s* mH'4 u w o3MVd3   D!* 0 . b':du$i f~m > 1jYS70IPg j2Y6 43 9 bSL%i3+CT~1'YSE5c=#>V[057Hs;g"6-TF  XW  D  =  m  =AbMpq' 6"RSlUL>!Y>;Yb])lJoy>' qa(rieX;2> n$Z_ x^L\.RRWXY@8Z]<{?s;.FB'*1yOp=W0`OS>< n$ t  ' ^m6@5ip} SSWlݹߠI27XAGbyޗ݋.SQҊ1n(̓{əѸW Q!k|Q 8 f8L!(!.S*4/85&" 0&[E";YS. qt   6[{ mWG}rC . /%+kO"yQ.q3.c ~o e:  .S y.D@"I=aOq h 6 c" ` 42<Mu9 YE!V, Fe'i6[of q d  2 nkE Yg.s*~CV&h)%8Y.Kc&ѬϚѼo_)ފ0 Q ]"0=\?f 5&Y&  R F >  4F ]>8flHA {=nj!k{g7~wA1$SB|r Q]  1 X z ~ 3 :LI1i:u824cX;ap B/e]^s\,5Yw3AJ43=%OdL??5H.7ڕ"gۚ^MئӴe}׀m.W.@;2ap+ m> C3$)$-(0.203V241745 7555=40+3(|ݜ{cڲ{ۺVCh*G6KhvOQSulDc@GP{}'iHR~[f15F#ft !WzuKb>jJo[0;&H$B9 j41}mgsK{w]>u6-P3c= 9 zC*WwM(ߍ6Yr ޭwctݞ1DISZ)J#"JQa?$TUx{ %vsUnߊQ]q&gK~5   pmatSNd# '#&&f+(-~,/p.0000//.*-U%<)5 $X_9 p ,w,\f{Q^g8#=M@-Vu+G9m l $ = /  v 5 | 4 ! \oAv!!^aN 5QVO5;+ 1"(H%1#&D$&&[(t&Y)(')#''%&!K" x&{$rh`([{[.,&<_ |?nvl,\h)` AT 7'yIi'7a1p -lc  E N <gkT"c!7#V#1"%O##%%$&U$4&#&# ^n ) m'*\{ +{fy"|  U Q u c !  am?U9H& ^<;( : }@*]݀ݶQg)/t"  4 Oo   # \VU / f # ` > 3c I (   vdeoq֎X8#[׈aܞ޳ݻߨ4E_/ p9s4,n=  4%I>8`g ? s <  $,*TK1]p12B'939*ms<Kxn ? :G q Q $Ldtc`! ^;8u%Uy"&lJ7M4}Bp4~LZ3n+u::6r%@"ߎx >MPРi] vʶ 7,8ܰX@~N vxh q +!(!#$$@%'!)'X+m)`,*-+-)-&U,G%) &~$B  qChVnQYa 7o|^s10~8S  Q + 7 i ; l |  #&HjCu<av$ e  VlKn0=A $!%k%$%o$'+&$v')$v)()),*,)-)'"+$)A%< /q R :oD٫C6ִ ׶گ*'j v\> B@Y_=, e  Qf}!"!P%0&&A(u((;(*$)"':# z` RJA#gCM  daK!gQ#;gK > 2Cj#Zt  v  pEKY;p]  V  + {`g!0 o  }\Rve,/L8""wuF+x.@btAo:a\ iK   z,#c 8  % ;[r]LhzJG(JMLހ$+ܽvAkp.=[?yK0ZjTt._aO} S] 7t{  r#T6G.lJQVksR*DN(("O5ueo\"-,G5^{O  v2cxnM r"ZJ y_#( OS8;[)XAS= H] o-2 g|Y78D'gh05@ ^ fTAߡ3>CgXD Av$; aXJ [ !( #$4$%$9'%@'9&'$&8"%#m!{:Z^7<:$8D^^kd]mug [%U^mx5 R_Q>  r/ N & j bZ} lE" '$()+ ,W./012427;476i93|91q8/&6b,3"%/l$*s&4,W$5+f!*!'!'/%Oc!6:~ 1l\ӝ'΁rȞn`)?ʩ_֭MKgy$k~ am z ^jd# ()', +m/.2+11 3/3E+e0&W*3"K&^! }F d%  4 ` LVt XB +M E 2 }  9 e 1M_4C.lT> EB \enV5a"B$[h!J4ElZ 4TnpG2i(%`rvXD3T#t% 1L[I]%">Rv^ mYc2 %   N a V V ` m` LjS@n|+3,f#tHy;Y~+ E * Uy4J,vz`4"[{j:1E~ ; 29iސڌۢU۟ZO Eg97?(3 $okS!` n  %K @  #, c vGDM~K߿lh.ٲ86= 1F9j0ݵۊ'#ڼݢ}ۖޗ۰L ܓ{zwz  - T- &!! !!!N$Q#W&$)|)-+v2|/W43\455636m3I6i.3p*F0")e#   ~(NLdq[%9}#XWTOߴQTGf+QBD~ S2 fnl[3w- iw##%%()C)+*,+--A//16,2)0>&,#)m&"ZC7<J nN IAM<^XqɞBB ʰx4'|ԗّxX+':<ALzJ  Q! DuM!%!o'$/('(''9'%0&> y$ ` < ;8U  a#gDu?r8Y  44 N k c-\=Bhrp   m uwh b N{FWx7| D ]S;8,r;50c~"1AA|y%-e߱Bay$0CQ!": < p a! c  us.Aw pbb ,vM*9z u(*{.CT FAu'x_#@{T \ \%`wT?@W$u SH3GcZ*RA^0pfdu.C]!ITH3W{C e5  eg : j ~y` ynIVa|#{Sc-*\S5V d6lxK$Fy"|h]-!so6 7جׄjQZפMַgJLCT׬ؗ׻لܐ>2m*2+ 79 eU-"%B#&['&%r%$&l!%+! ,|,)/*  B Y _t*hhJ5E1nxCQS&?`B1&zg%XVc!J1'A  k v +  o hI!G%$(),+//-1\-1-0.1r,2'.&?,!{(2$F a~"vT& M&P UZ~B#ؙfpFҞ|$Vx CQ/' ZB2H#D  5 %l)!Jp'i$*),e-i,.,#/V+]/(.W'!+ '!d! _ ,  x e :R>4Lu $[u Q oi fM O v  f`.N 00Sp ]8qDB| LUm<E LZ Ko7\ k9iE uI(FEOt c#3LO0ns  ]&%gfb 2~ NmA^&/l<?N1*j9dIh4OTo7w~tU5(kz 7ՖԶռԿ"؂{݊ >!2}(mo9@{<`QH7Y &0,$6:QIC#?Jt!Qi   S y H W?bpob*"qj8 HOP/D+J}x9$O5!hOpDYD2$Mݠ6ORYٗw- `ZY[yycNbY P T rd [T ni"$ "%&d%I&$%%v$%%h!#m qmTax^.ST/rBMۮ۩ۅq܍Dړ?iuh[1   cd#!4'%()+@-..>2\346,6958694&94836/3-B3'&.l%)`$|`u0Z  8 =?&d:.?~8&Sp{nR4Xl /VLy; S } #!&%*)--/0^,0x(+-N$*}&2"\$'$k|S`E !D#""h!@s N hoZq{dV !M'9 olA8C`xm!rw? ( 8 8  ZH{3Y?B3w><{/,~p{ \5{AK = #   x N \ T ZGBZ+Dq+!^A` 2 G[< =   w r *H2Qo#v"R!,&%7'(((,u-/N024458867:4d7H25k/2-e0% -#<#_m  NUpm.YM$!x'lՋ+[c֕~=m2TY52-1M ` 8 CNs$8[ !"$%$&$['$}'_#'$A'9& ~3F [ vO >X; ? v  M &-4 ] Mb1h%j3D$nC 2  v-,DEG<'2-  z <W7TMV6UdH  ;A6~+IMTBvT/12r|XL<9Qz4/09CW-EQ)Kj{+^?GcV $_o %=B~r(&ݕ޹ۘO Y2Xs:IO/Q)BJ  ^-  R$ G H{m[jZLc5&}JINwwJ1{@'< | FAV  %>bee6&{)-[mQ?;%n9$Kd*f S&Mcd\ ?og2"ڻק֮؞թ#Nڿsv/*,K ] .+>AH``MLI KE9F( .  h Y _ b2B~H^Yn1K!ߖ(39/0sCFbh,& B]| ^T"[%!)%-.).1-k102$102210S33`5457^3t6V23.S2)(/E%6*# D"!Xt l / >- ,]4|5NbM|d.hWQLOO6| fq)"9Jl 'MP"!$"%!%I#<#!z !F; A K c/FtB8(hU\p$"{?.mF 0FaP/3o v "Jqb .\#N) ) i>!"5 5 *+nj0T  l $ S{Hn 6b!XdޠX#+i_pcsn 'ChKVHMu8 "RX#TT(|*)*uA  VK  ) y { 3k ES4K{XfZL!Dusg[ {dV+g*LBl  ; 6  |` ZwB;11Q7QS=b:8h0dv]3kHz< ^y@( ԁl`Ђ=˦ӕ{2ff >1UWH8=oHPE$AQ = )cjL// V   | |& ] [y\P6Z  ~ $ C( $k!if[iE.R8 $#ߞP lZ\ < t(#T(#-m)r1.648{78<;? ?@A@C6CC|HHFKEcKWDI_BF;C6;=m4948/g6(z0%-+F,& g: r jLEgZtX|*uGm'Ttn\J; tOQ h.5XK2 n , o6IF#9 r T @ x  {c|4 s!! #BW# Bn0{ 0r ^W A4+8`LA(R8pX04!&3bV@  : zq bwb[yF  =F #p2ZW[rqG]RT:L?"K!z9fN( )ZB+*eZz>OV[&.N3K>X 7!b@)xAk %2 b>Q"fRmC3=8^3*tnGFFaFX=STD"3߃։qظ,۱ܘlnu J [$1Cn* S eNh"%)o$-)-^,+,'(#*%T}y  U2J>1D=sv9m`^EM+.7#4&&DR-F[xkZ6: [sܟܩpٍUھ&܂(6_ H/  J0?C= o@ Ef!ys>]2\_ [ ! dOv{ L@&jyR ` 9IVFy_hT7I?USCqJuphB+pS  ~"Z' %-i*2n1649<9o9d<:  W]L  p ! #J"8$Y N$z"{i  u  X=O3P )O@^WdwUY fH(- 3 v .K%H/ k%:: s b/=D,&tFeR*SHfG߂}:=8=9F\# O 2 <  J C80[]b& -&]pxVUX?B u= r2o /  2Mh T}C+-U'Tq fi;(gp%.5KN[P,m%nag_KOOu;yx['/4Gg#  p    NwhG}|?H~{<}+F-Ps<=\+!Gp?{j=%0oKf~sߖG`e'u 6 {(9hK ) E c 1V 9 D $  o p @ 4SQ Z4Fj=]{"N"ZJ7ySFL >i+3l1T Y S-z'f &( 5H"t(W%i.,583 9i9@[>`CD>=Cu>CT>CyemC kaG &R ; r:l#"")D(.O.\122u52/606(.4o.2)%1$$+r&5 ~ r N q ^ p Ti3vvn G} ZD,|BM e  R)H8E apTgmC J'I$M 2Y`I[  1REO  J 3?GW=VX^p!0b{@'6Tcpz K A Ow  t<[Sc.o%4d52^O)12m. yB~/%kf=W>7 ZVE) &  uMD /*BWvRs[ I&_xoX 6gs{i+ xSQoca:lw.x(rjr4݅۠E"ڗؖ`٢W(_( [Ͽ'ЁԻfSԭ٬F`bI 9#'"[)M'D(Z') 'k(&$% # !O #`!#"x#f""!!!% 8 .E=)&9\?vA 6 YC8(c9)h1::zJ11NIa\  ) X$i$ #z#((//14587:8=9>q9s?T:?8?4;0h9X*2*&0(]/'*"),$*h"&g#"L.?0-yF~* ߲zvn%_bVI(`h$ 0KVt,> Wޭݿ݇%7]J[Z G= G u 1 9 ;OX q" &&+*.1..0d.O1+/&X,n!Q(n"O5 N_ .m825"CLu  ,BV.Qi:KL, J X7 #!> $z$"/"8i  Y?< 7rc[U0 O\@_H\gJU R Y]Eb # k >rz9:~ =Ftw'h+x| G@ m y4c%    U"Ox[)rݗt۬ީM9 KݎޢyޏrU?;q b3'BCvK/QU&+n,ngTY7,"cEQUyu " ;  q$('(b" L?c2= LX $;LN`gTv(%AQr)RZ2ۄ_^RRԳצ[اcY߫ܨ[ߏܤoV޼kc 9߽q]G.6 M `u.#l&"'($(J%K)3%8'%u#=$ {!W)^p-^i a e k >]e(!3_ ~[A>dWHN_  c3   Q\W%El:&`6+g{f?*#|;ugh%  h%&p$X,%+207s7l:<>>@NBqAgD@GF/`7(1#\+ (#%  F5~/ߡىޡ٬Ԙα|΄cW͹yω,{MEF vwe?%b^0 o  YDf+X&R  0^!$#''-+^/.H//"./,r.(%-$'l#vJ>  bb   ;P  + ',EtAOf^ E=!z@ ze (t2{ a u zeV3!Vi+Y>ichky 2qP"  D?f    ! S i 4@s]F?JCfS%: Q D =3Gf6$mhME۵L;҅? Miچfog{# S K   n4eA[c_mm[y|gV6[&ys29xK8' % L0$v@_}dV}  "_9IB9=$/FQ#6#}E~{dMh&E y2u, ݫݮ;cqiڹQ-(H@t48 i3N7! L{C;2pylPm%0ugR0 P 7e)^>,L{!w;L%:WitI9UN 3V;07.61*\2&.!$*p$J""Lw ' hx@M]O@12mxlkBlm"5W}XbfAa/kx$"%RVX@ga  M%8"r*(,0,..I./0-0v-.+O/ $*$V &  T kB % .4 x U7,o2}&"kez;  5|KQ9[W#KhTX ljx9Y#JS7zL+qa f'WV2 C K   `w\8J en Cfn{[x)O: kWn Wut; B 5 _ V  O/" U^ %zE*k[}r :ݲ^P۶ޢ8t _=#aU+j_h^FWjEN$W[> 0bveF"GqNhVh2>{8oln t   {*:4 xV>(QL5)/OowuR/&"VvI,zڑsi֡НׁVӅa'L2N@u!YU76k k EQjNr>Gns B>N #,H U 7.4BjX% XnBn_ EJ%Sm0~E{&cP?XC2Dz B \q&!JK$&s'(,._024=67:+9i=#:@I6=6=?2<*/7,3e'0q"*u&P(-  GN*- q%K.u:|7a h  Q z .$!hixVC] `1,IjdowiT. Q  o|" ##%$(C'"(@)c)M'O*#%)&? W @ 'D/0IT%2;<=~>$[QG{^[hsA >E 1~"wV'51+bYC I '..;l5j  k nEzkgimWP>R+}X_V;B&i,eoNgv[P%Eu Lf;+F n } Fe t ## e  q   )$Lq5y'T)w dt-b^iRJ_-   ? ]/_@7fEXteid.*@D!Tf!FDݽp[ mc; "  d#d) %*+**+x,+v,z&{, &`2"a _*u0?Q4:^}PK6xDYMIL0}8 k*,L:5~PZ]ޑܯnۡGXHO 9 ~uo|RM6 u xo%`*%Z,).+?.-}.-4...z-+G-',&( %& .%!)A  ?O\,S; ݕ@< 2gF".0T6[{^$xmfp Um;s7    }!c~F#W!#K#$&W){*--I//5041c4*26916L05-3(1$+!F)S% | 0 s 4L,8{ueݐj l@? LfhI M7F?_ 9"#5>N:^'I&` Q # x = 9r)0#"&l&L((%8*$s)$'"'"Y` b5J ITY{) h5.x BuhgR]AHco8   R:b= P2M  2  qd % kd \  ;?M LV&zr )eySB (R]:'pVXF0s|d 6b  V@y 8 O  "   D A qR {t Hݬ"ܟ {bHl 7)^{ 3HnE8'=u_VjNhk+^8]t7_@T#'87Ta+ SlY!kH H [>aH~M)Y }$8BL$i /o;!K`% v8/>xy;[S%ݹ9(c( 0 :rg^|C#2Y.(s>  8 m r /  @qTz.BwR7 oY29[ x,[8/3 / Yv!& %"h&&$%$'#&"& =&iM$!`=Uuq#u \/!'> $;bf~aj :UYH { hLFY;= R x ]>=w9Wm4<p4Ov>.FJ_eD_<5#d10mirXV7J;bG@  IUcv<$ ~] OD EjM~vxH % Ivh`xfZ [bw,$-W o CP | x d( }qxZ\q TEVmCrZ>>FC@M J8Ro> g^ 4>   <2L-\|{x h/V?]NGu;;i6_}(4 RztWv?B-AD:m4^Sh2&0q.#+kS. 2= U ^ NM({ZbG{i 9h6^(: K Coc Oa]=yrmI-cfk\>~Pyq4(jAIUlG6@Z3 * zIvS ![!"$!# %B%&# (E&b()++,-(.0/ 2//v2-1W).'5,-&*".(hL"*  /DQE-sH8,{)$n%_l.&|(U<E1jQ> /4pi+p  q`/ !"U ]$$"m 4 .g%N E yd 9pPV+hra6Z*gC3 cgC X l @ '$K h2HdZZ.+@ ] g(jHi~5J9M%tpw?qK- ,pe]NCI #Z+tlp;[~99Lgoީ-HnE,soR5)/?M ^- K : t~+Z|1ZE5UB$ W  j *\A.OZpdT5N@ct/]= sߒRMَB > @GvTE8 ] *br#%l'!" $6"")" %Z#&%)7(&G'"%!!! Q b,]1Xi!  (_ay2}vE@TB߳ݕ~.&{ۤ Nڙێj޲ pJa1&q% R.zGQ P <wS9o( NN.C! ; ~ + #$H%'&' *):+-,>.-q..l/0./2+.m(4*!&A8 K k r(kFdAY PiA[&{<T8\  /  n 4AV   6)  uCSW1`E7S-o*m=BG l K l3 C W " I < " N  ^   k E xD' z  m_ Q  q Q w  1 &VpLR:Lw|$V<@ j u    J@ QIzf%_aOL q=/?aG Nck%kOuIWa@JwM[E 2\x"f W l e^H2YkiA ;b wj3;EH/lu' -j$`F5yix`C7B*-<3u ڃM0Ք *PyzFKޠ&F~<'  ,[XJ\zM;K(Y  oI   ~iE1i=I HH&t5[p 3|*b . hbpM6on< ۣqښd9 ܏*:hH- ܿzG=o&UhL3I^ Yv d4 2 - '] N  ` sK<2U$Bo#av [jy}>= 0(C~Lv n7zljM)%   ^iH'N^'6gaPaL$dK4,Ga5>u M U o2:S}%1{ fU  0B|f<aY ?Fc[I rO]p ?  p A  4Gx97 ;bE\"Ju|aSdwF/1qojM/N,_r+^K7G a (2<e3'x,{v3,vyC arB hY1){?g&YJAD<=.SwcQ^i(ND@ޮݙ4b!Jl  $  _^t   5S_6N,4]wbO%"SF   ^ Sa+ # Q  Fms`Q:5 ,ܒ;*!ۅ\m_Fq^`  h*fE,*DoAgMGz'xV o * Igw,0v+'dMH3AM 1ox&\zM hC: X g1  c q ! T . :  { ;  C } +  $pU qspg-+{i v!:!X""% ":(&j'(L(f('(U'(#'ID% Q ! ';W-A$ 44a2a =a65R@%}$w|H]s1-+5r4Q:wKI*a`N J W }M" UA $%\SNgq E   n . } _; -P . t@FN]u y>O|8UvUS{3q, = 2 d D%% v! } !l@m]H 7ߩvD ؁۪HKP]Gܲ/;kr9e@ZU0mL'4{r/F  T  i E  )7 s _kxiAB&PPsT X`/mP F V V% Y # A2e}Jo,V*w-3Dd$gsޡfdӜ٬YYYۏ_M":B 6  0Y Q #I   M    PVW Y ! + ' ts\v Q@E+ߵ3^*ZFo&m*&@ߞR rq9;  qi_0ZGMJ1y7MoTN!Z" N SYK*AZߗ ߸Xs߰`xLNxs$g-o15  C 2 - u|Ou{x}  !$"6'u%(o(**+*>,,&-'#&!%"7 j5M {u G SK=eQ/W^@WvPlW6^ Q$Uh[@7I{MTEiM e  aD-I 5eg<g  4 f K ;s <kNUx m 1 H^ '_FTp%_G)#MqS%kv k}WfaFnWk6,KH-<yTzHS (#n4} 0 g  p |f/),1a  < E V G |  tz  +:@=QE0vr\ݐp΄ %Ω=hvd7)ҥBx`oz\XBf'0|  ?= q-_~K Y 02=A-j1<+YW[  ,  l =  s N Fxz~) b|}۔tס_CϦ͟ZΊ7HL8.V3Mo #)W!D,'*'''5#$W0 KR|    [rL00 V$h*0?QI$cW/MAQOO  [ M7k+mXfc%o*Rf5-J֝I dXϞB'ʂtݙڠ- r TUR ;~   !  ; MB u "^2l$% } +-/7rbhDY<qkvhuzA~Et;C{.|"^cR^/;KEFM)@cCj) k u { ] ; & q 0   99G%=>nc { 7PB5X*b7!9+o vO1.UE|NOrj+}{;H2=  |/"+$$$%#$!"$"' cs>N]M< R  ; Q  OHa(K+Yoq].yoRE 8 c =[-- Q ~ #ww"T   qmt0fO/o@\*)A % LSp41 0 n|ZTs}F x8v4 ]wqH- 0 \ RD~{8FM q l x so_^F%5'l.;{Q=+%#th~s m B    W GDF,ZIv e`[f3N] /GTݮܯyދ^_C\D|E/rH[bL<B#(YDn^ R1!pZ& a[Z gh!T$%"%##o#V!!L#h x6O9\uYNy&Go4߾ݟێ`޿؄r- ԋV@Ц̎zˊ&.ދLGfN k r~ It  G!>: c?v   ~B2^j;m U # 0 i l h y X4rn|>V?tA3AYP|Y.YR]K8T\ Sf<nS$uLx h"gv ? ]  ~ ?J6 8 ~   7jfX( * C+v\~ /TVoܱ۝څ>Wt.'wܥq݊)zU[&nw&1gs  F"cV"!(#)# $$!$H $ |1y   15" s4Eqk!ߗ۵ڭܘE(gk܁O,2ܶo+SN>a [g&=-(i/F.2146567&6#868I67949w270 6O.3&z0!*& T%v!2^ io z Fl9,S>N6+s+1F7!VN { u#FPT   ;0 K""$% #X"N c*(9 ATooH3#lPURm>Ad^qnocX ##5$f> $   q %=cYMo2AWqFB s1 mD;,u]qF)eJ  G | Q @  [ F  7R04 d32R}Fx2;)Gۤf܂*߶sD1F+JQtZ9( kT 9p\YON/BIlF3uw pn%ZVBj Z  XrhIN/cq@pK <6jJ"[ݱ6NV؈ٴ֕ ,ػ5&֖N^"5ӅإիNa 0,|y e VCyv=z_X Bw *m bx9 c|zTI1VZk/:ON2"d6ae"4g yJ`GY+G(6fYhuD-wP[Msh :&^~P9 0!j?X_WU'Bxsl*%q D ,RGPUwsg; BGܨըאV>DCzއtP9..GKZ_ +I y!p'#.+221335X362S71y6/>5V,\3';0%,w ( Q% Y fx | FvA!+PSh~gd j fm tVr]/uSCA  iV P y 6 V KJX4O  z9*: ! E c uuHIGD8(&m jT_{hhE;ruAEpKo* nTN sV?O  QKA5(@h <i < #@1 Nj;A[|iٲhڞ2f3ur^z q   G  w , R Ld i :]8v{X9|!^]FX%wiMAzcp[dRP > 5BVYD߄0S+7\IKPnU0%  G\ `BJa|OcAflCL  U:/r0m4('fHPx V1R 3y;eq;b#CB +Xp j5 n-&Qz"M!$N%$&%'T&(')<&a)%)#Z("'2 %n$!"f33L  S ~z%\%Qvg`6e`} fB L  ,  =5MKGiNFVqsYG|# K L  p}g= @gu B   z&)U[zjEC=\DDENG>X!wd3$1 Q#}p5  # M!G i (2 {U jI  W  j3~q| n~dE+e~)R  !813U_9fk ? w m E | 8$O2qp}7;XgAm*) &;46:is+;sW3IFW2D1 'A)]G; O =X}] dp w  P{+2_{%ݷ 2vӂ+=/vL?@V]A t  $  C : -%| ( :  y 87 =&dMnp([1EQVFrOBk'<60J?v^X@{KZ3X/q]g'*4iE!Hv.  e ] hL %_bp3 '1 '!K!! !@& $Y$=%""[ !n_c   - [47c?` /`FB޴܎Dۧ*[.lK.shs3T|[~Z   #Q|!"$&Z'*I)E,+*4/@-1/2u/5o/4,4+ 2(R1K%b-"*j%>V!o  O Z6=3x^IM=y:ZmMuk5E9  8D n A / & # x g;D*=N 2 7 mSs  ]"" ?yy\-u vl  $ c(37'G "V7j fܫݓ`ڌ (JjT\'I?I {  siMI !T<\:6?  s Z%uk>ljG4 u  8  G  n L  J  _ @   L*Z/6;ߔa6mWMLa%j(CtK)iK7rXZ\TQ46Q NC{"  6P!&<w   ] ( K#G G߃CܛӣPϣͰȓ9jʲ~76Qb ,!a>bO];Ze|  \?gDl TOf( ?IO-<UVCW %#x"xrZHu ;e(2aG%v b [P\"T!$ $l#$#]$!#` ! D b O! _!!!+!|d \-T = "L ~%@58oڪ\ڰO ؙڶz%ޒzޘT݇߁rK "`)LFaf   yML P"!_#t$%+&(4()z**+*7-{.-/1.0//0,/)]-%)#&L"81L 9x   TfssyS3dj* $=+>lZ 3 /   C4*,}L( 6a~]q[qRGHo{o"F  W_   b \LAW~t-`Tߔ܆ܨBV۞ڮڎ3;Z' - Er)8=@4u*. rzL a. O ^u~ g`CbFH V #  ] B cfS)}j~  R u   |oG?` R6HQnYJP V1QLToMhAP 'T_,I1)xDZAG^Hl!Bf.$ߑZ`Yu=)Na>C*N  {rs?\a %R5/f.}ۃٺk0+2  j  e r0  Y)(=6, M w  Q  F ` . H A7 CpfJ:lT 4. f%{E)((- 6 @  [ d Q J0&yt$A&|e Y 2gq Z8UqPAgB 0 W  ] isSjqY 5 L  q) B ,o"d4 P7K]j9CMprOX)IV ]B,|5yޚSHb\#p1`Vq7"}'"f*(* )9+B*F(E*&n(#1&Q A#eDY x  +  '>{)=Djݳtϲ ,,. /KD)_mhuPxo `,<,d?6pSBr0AjK[ *\}l H0::`rv,tw1Q$E>?)vHb/nS1M ~  uPqL?Ia?[yte-uNU K &Bt,.}ވ~ܘ7ؖkM܃ޫ N+Ym ob|NgG- R-NwDk%UK+< z &$**,0->/e/01602T/\1.0,c/-@/;''-!i%!|.W-  [ aaV- rn+4[b>.} Q[k;2W 7 T b |f FdUecY: d < r     + * ` | R+vQ6N^=+]/upJg#ZX_GM$No C:ZP$OL$f  ^Hn* Y&pe #o,1K2QF5 / tq.U6) 9I Z %km d  8  1O;,&u_\SI 'Z wWjnI*jxsf!^n}N_@2d1ED8  u! +T8C  U8.bj=(&y2/bG ??ۙ܌+a*֨޸D\Fߖe,Q|#`N?;hl+ nLW!B## 0_4i l | ? ] 9j~sL]7 !GZqXmbەIڋڼۈڐA.9pd7p@(8}-zb~N4 szW u G   ; #$J; vHLzx !!#J#~S![w a 8 ~BnnF)vv?o9 o>>K UZRc7{7DmQ<_WR"]T:'H`H#"ߣݷlۑ3&<2;!~{   2$2!(%e+(,+-*,%U( q# QAz  S' )ICFۢ{҇%ш϶M߼>gsUSVa x  ` 8mQ+t  }  u@'[ky><:df@7c*DGTUgyTVq7yUPn'B7)|  Y e (  t  AJ wz:qx^}6   B&Q F!Z!,"!! "!!"a"! " #$!5#`P56 bG  g  p9 j)aօYѰA7ʘˠ<b^}зߘOTG;dX),   (om" $#~(5'&z)%P'l"%"7 h.S. $!%&&-(O(I()q((%''& $uv   $_cTzQ~rsCi%35Z\Lܘܚ޲|I%Nc~TB%"6qxi !H!6 j G q(. \ V " L bir  { g e6w2 r }lj;Ck( ޷޼|ݙHovF܄H~m%'D  | > NL<m/F %  b7V @; KzQ5i<"mxx d ^ b    gF)4 "+B<x3bePE ce R; &    ST@;-nEHc`EUt :`At#'GK,X @ ! #! I.P X D/@T~%$iqO s! [*x9Z&~T}eF 4 ^ 2 " Z  LN&~@U"\dCFd]~|b``kVwA]I]d%9nDH(qqd|qy8%e'@\ .Rfw j 'I0 !T ,"!i""R"!!#B"M!OU Cg >N1 z,Q$BiyN ا1իNϟαϗՁџ^bDKS@%ApG | ZLiK  ^z  V } ] O ;pcy!j$ ;'%9*'-*=/./.-0-/c(+Q%n(!v%^"W8Ia/ J ~28{DOTԕϙEΎ&xqRGص:2QEJ[6>*v  /  b&Q!N#x$5' ('*%+$)#)%"W   1 r8f?<). + m U J)n^cP`P}M0"hO 9P^_Y+3>{>5X=r % V a"!W$r$3%&$2($-(%% I/ aC FYQ7Z NY'[7C[)F (N'8_)$#h^ ?lLug~D&ߢߦa da ~{n l I #($,)n...:1/0>,/8+:-;)-e&* &'={*2H*WY2ݱ܆ݻl|P%߉D \uA*awPNkP1?Ob3O>gv&T:8@c GzuV|;zY& D >%  j aaP5~bm]vQ?cP')[?F ]r T7 }B"D'H$b*'[.<,0004[3b4U5224/2*/%+&4  @U ]:0 u{_:M̲J>ʚ ϊҜSjЬ?0Kں~Y4'T yTdA / 4  G/Sqgk!k} o a#".&#s'''{)-*a--*#.+-m*,(*y')/%'V"%c") Tf $ o +1+m ֆwϭ.#:8ƿz^_1 c#dX(  ^ 5Y&$U"k(u(.E,00030302,o3&,#m(B" I  _  _    . +L~N!V eupk\g1Nvqw`F)w#?@4;j~G6  = :cG@ cZreOk.t; 1  N&<pcG\;hs yz!mM5i] "qg?\/l6HPm1Xp\{)A,fD,,I]mM Puz>.Yf%e#  ?" 7y A D 6 76uhg&A59!cWkT.<}.@a$^}A*]0u  g( lS,$HvoKaf.oi=f(fjhR*F"O9k"PP;j 6J^kf { @Wp\/De< 7]9 7 s    ) * Z <ncDfA"! "##$%}%$&#'Y $"#O-. G npG' vcz 7؜sTWͪ8͸jỹҭ@aٸLAE3h5o6d Ix K%#{X=r/\ a&8L   K J8&=\U!A G#""#!"!"r("=,!cA^ m 6$tQ@tZuȮkȝ-ɞ@вˍPՈ٤O ,d!6x   ;b1!"l$<%U+ )./01W/20G2T/.4.E2&-f0);/ ( ,~"e)w#]e p: h>xeyb/58'!;]"&Fw ]41.<pB2 #?3a$,bYyxAuBs# 2Te )VVD =!" #An# 5b`V^U^ jJHuO3GGKyfu @v)  w  | %gw'Gb K O sXL ^8nDL`JbB ېz,QtV=|j1R=i1yJ  c iM|] 4w8Qr}|gn);D9vDL6a2epboH|ww JFo*, #[L0 dY{hCB|  ( - 6FR/6  h }JMgSW%j 1 W-YYx{l5l tC d0i[uAm^YS|HF&u,Y6Jpuu`}+7p"(8 ? l#5W{)4? k@ \ nY V   *jG0Vu'6w8-`= t$Sk[oh]P n&)_[G5Y-i2ݽ_yܮ ׾ծء޶Xg#y*  )3  82z.M;#D\ } k + J? >T@~&Iw^i1Dw\&t}UjC-q x 2 x UA c YKLLb^a081rprK&\|$q+kn|KLAw:C%ZlX07 _9AS   Wz!q R$n"%b"(A''m(`'($'"$ u$"xH -( ],+tݸM}>ՀӖ*ڎנםNؐwD.Ft#;b`,Vs C !  \&m fGD 7~P r (5 a-  T E @Vs *uT/~!!Q"$#m&%'$'&0#Dl!M R < w3~.ݴյ6у} < .AL#W'$O-(60U.32B5567:5726,~3*/%*& -rT\:x C   sMn0bcSKhV  ~ & g " ; h 1 &tWh2%v`wk׎<(zڏt]R^yWDTK Wqe#v+B(t0.4489":7<:K=7;Z4L9,35)0^"#*&!rI:L = B # /$/xmG{ OT7VwpGzHMvs1bFaA).4J_9>>Yrk(%4  ToPi!$z"$>$#$ #&!% ; vCoA}@n 4!2=B)0 Yy'1dx > h}nS{EMI rWj~-P+oԺ9\WRD%# )MbUf/TJkapa!Q]~ YlU,_ > a >- QS  |k {I"&o 4 r r = Xc8jx;HML:^uX1e\j4;%*J,Ys :: " f ^ m;u.<LF)n>|2  d7<OV !"!N##8$V#$j#%##!"A q!$  7@  WiVZ=ۉ{UӚ՛ґ,ԏnڠee^>R @/ ; B!d"w"N%~$&Z'&(*&''%4'g$N&.9$?! V ([uoI &"?!B>S*wq  =P Sm UX  j'B&DN tYԄظ7ҳXb 8 vP'Ҵeڭکնޱ1jڥެ: wp %!E)$'.+32869:X9;6:38-3%C/ $  Jg&En8}Ksskb&n*e6< _Gab0jl` a C =0UI\|U T bhh k& ~Ed N(!~!4! !x C!.\'KT  H F:   W!KeN$(*GC6S|[To:   [$~IO! l X 0',5D:ybm  ZLy~&c"CgS e_  S DwR 7!JAD~4tG/(Pq[q/J4r T 0 ,<${ukG 6 N ~   +&Mtzq%Rj+VsyuS~? 5 +  K[LyCL 1tka U A * x`zao:.$^8p.&s[R> \ 5 H@J݄ ޴2(`xLd;IaKo3|1 "( )@PxU"!^##{"%N (%!{ s:oQ_ :kN`Ld9eQCG'e5v^ W)8eG\d0_\m  *fg2LoT0m!2 ( uyhl9C"7] )GJ!fi$>"&%F(f&]('%'$& '>{-n9 M@ U tW'4mGk j6 ^/ s  ? tR7BxOבZ$ճr.5"ܻ߅,JkjH@};Z!$"Y!#6"8#"] !`C;,!r?  P J \Nz5e mgS{;JTs.   FH {s0v y: 0'>\j!wbSF s`ma47Z;O|w 1b{;oQdT# jdx3Sw9X_%wH.xb0YYmh _*yLZy%$ Q z I U 6C ' ( D;G >|@Ob&,w۬?ءէMҹؠ.۠C`D}ގ_HH.*@B    (C;!$T#&%''_'($'!V&!"9  [3lG-,}hBqX7"e  , t`oO * Xw_78O}@ةxؔյg_MKׅEx9S" cQq $:%(+m&., 0/@1#2p1V201`/^1B,/'',#6(M!^!x'3t S& h/ sCOO07 MNM>4-b  ~ # } ( % d*34[ If q++>2 -Gz7JeBB P=!L [gjN  odw/g6j AnmKL+6gDwcxR J' d   8&9^J$[UW U*yG^ )XF\QdBhk9v5hD _}KEz5QT,v2j-hVpqati q{E`=1& " 2$ &r z8jEqm2 ( + 3; pZL$ hwzb = TdKe&A1/4%n]>ZD Mn1h .  'h    'ds AO # }3h!!E!A"P""M ! lc17`5YPd nH=]$z \a Si[~Jޘ`ؗo&ԥK Բܼڕ0߿@:$jS  vqX,""$R$&#&$'$q){"e'-%i"!/A Gj%) hwj-OpYtcE,n |a4  # Za 7 g H s0?dO *(ro"C{FK6F8 P S>G.%)p!$g!5(8B Io 9HE@-&/ F|>a4fg   Z / @m k)## NU=j1&2$$BLdI>ok&12h  'KfE 4[9mo Z5 V(`Lot?[") tYuK$9:Z) R 6 : G 6Z  b k6fAPQWbYV]|7NX#ߋߚވ!pTdh3!$s?F#d')==p`|3P'f_st 'xN) d] " "x { =~SmeHS]Q& P J 8l6i Xrׯӿ!+хؤU4ږ "(UkM$Ia~  , - F  ij T O [u'"|g{ PA 6  G] h u = stS2  a D^'TGBeێHoՉ:GO]َ:lDjtp #Y-  _4]"P(%*A*I+,_+-d'4,U%r)"!K'O!%)#k{ b]F2AC_)|d,b'rBI~ae ]K;i \J =ordߌvU,uIߏXUߊ9W)[M !T"> $!' 'W%&%$ #${"]3( E V`D;xrpoi(&n>"%nRe| +    *   O 5[C`]ێܪۃۣkۭޅ0H. hPQ\>s%Cf d  [ : *1   b   m g|jj{ :  8HM;&aHE?NK%wxP59.   H   N :B^z#v9u \yeRtm(l.߁ޣv"#$!4 / F * 4"|Mr-/wsFcm9?He4{;FvK t6 DT6OVJ AtaD T-0!5F7g4( x'! a$ "%$%#%&$a$$%d$$"q&#Q&%3&$$2$"D#jK!w v^  bvp[5Db({ bmؖKwP<-[h?C @ h ZK "!^S S8z > B!A=T0;;  < PAb[2W! !"p" `J 'P SN7 #/5ݏܹAdNڔm!eBx;J"3*Y  k/dU . L""!# }$gX"   ^  ?.k8LE{@zeN*"]M C Rd V 6 Z ] : }\cB4Agj/](9~F gltron-0.70/data/game_recognizer.wav0000644000076400001440000140321407464000070013220 RIFFWAVEfmt "VXdata`X J+KNk2:o4'aAF$0+J\VNcK[4xVWّ ׊ ֋TBg|!z0> 3WAKB]dG!e_:ZE& W}Kj6=KCN@~esf/DkiY?^%>C"[6P?lBe '  6 ] \ Q  wu^)j5vyW# <8T3V4 ` 4 { ? JP VVX 5    *  *X 2 @ $  VG 0K Q=voG K"K]:@TP?00t  9 .  d    H 6 ^ ^ Yf vP~\NU  !"=#m"@"#"!1!W"#c#"o@"!b"h"wD"q!fu P?~iES# 4 q 0 n  l ~@8l8P BuWGtVAI'=' j %{1OW}S_2K `"U$$2g/>&1Qt5޷$0ގ6s@+M^PJJee#3{WvcANq*4R/{}m /yN-9O`5!:"|GZl1h\d'QY84`%d3Wu}=Oz9~ 3j# ߊE2h sH=|#/$!A1g(X`-B7qG 7;2&[,YS<@b5j$:,f a ;_0    7 J V K k 4 ^ D7?^gf pb$   s:;"1K00,qn@WW V  e e B Gv  E   JmmD n2Nk{>?upH+KOV'jv VC 1A  9\ /  w= R^   < wCp  zv 4dLEQr- lml9]4|~h!(1,Hb uVWJg=i.txpK    , b L Q^ % z}[WVkvJD8 Zd.f)%o]`RmMg7GVdbA_JvGrd/xE?r!yNj?X} EYUD.4\ zVrS1'vNd u?z_je]4tWhu0]Q aL1YLcS)X!~}i+(/n, ]A0^'g2-yf`ZUo*w=PB jhEQ{i pj/Y\*wRdD7TRa,  .It;VU3Z;l AC y  )  h%" B    (WD6XGIK T!S""^"6!e [ (n!:"""i!t ] bp1A| 9yfnpsj=Nnty$}wKRWpq@rUA SZP* x }p C F A q@ f  p !  w Q* E u 1/?-d}#0PB2mbovUxAOR]:/  ? 4 u ( h  & 1YvQ[eMJEF5]XS4R7%<&W&57@{;{4"ߨ3 Y:<&ߥ2Cݕ^ݤkIqߟX#p.X%,E6m%Dwr .5KlwYEvk+Ei)$/yfE߳"os!nw } _$udxxLz1G+CbVon;ObTlir bLv(VF?N4r]'߿2?=k9V[ ohS[~" PsNuP .})VnJ#9T'3E{09RW ?"}A[N!}a6bH0 . ? )   [WWk[Y !!}!L!eG"#$Q&U&&/%)"c Bd8J   b  v k K 7 V 0[ >^KP,i2[ |EUw "%(HG*E++h)+'8#f% f G ~   8 dC p QO 1 G o *W0. !JQ""~#$`%&'M(J)y/**++4+X)R'[&&&$"- zDu)5J[])lEl8 QL F  4 ;| pIR|cIj*9 .. qCh :  B U  <u t^w]@Xva)Myx?pjh3yn!E,~0gХo*Ez5( 0?`!,)i ^0wiMaLCc`(,Ѵ&c~ Ws5xU4^r4+}.JF]h4\O(2߅, a,^+*($/!q@ = }N r c 9 X Y N  C u5cSY-G(|(O  mAS " ""f#)%&'M5)))H**Dq(W'-&%(&6#!u m  !Y0" siR  w  G T@ Q ksXC<}c /_@W Q=,bLh|% w p   XYQeW$}mk2=-ayLH%)4qظ) Bڦ=ڰ:k\jLfifcKVnW5qkޢ"&I&U܉xԩ-ܧiЍ5* YV.>%>@1PdHF.6-R|X~pK 8X`ttqB؟נڰ@۶,f; 2ݼ=H ޓF$A{(mc+x[r `w86!!D:.B, ap0 : g V D l C n noz=3jL M${ Q  ^r/'Js'+u5F~   0 :  Xq   9DX'AP^.x +e5F$ }t"%-('1$ [3lk5$ Pg$a?F? C!0 I"J#$V&MN'7(("'/Y''H+('i$} \i #G1&Z@=t~P|@ u U  -  U`f< \Lu \    uAV{` X O,Shz; j    'O!     | [M%Epot@RO.!GHO BBeX1WYe ;9 =Wj 5iTf)skv j6&(%P1$u}bE!Oٹׁ|צRlَD"EسVCO"݅*ߘ\/\6(M@cR߽iL:n1Tx>5"3?`f )bB(Iujg:jN-4Z/HA_7}$yXN)bnL &pAfJCe{'-7izon#Z g] D E X_q    !  c| @ jT  ^  j@ c  a bz x . B,GdY )4DHCaRQfp !)#1~#+#=###w"!# Io2" ~s$97" |6q%(WKki c!$#&$c$$}$3%u%%$6"tv $,x{iN  )p I  _* ] v -f>(2U  su  w( ZTzmWDt'5 ~e    3 ` U  , % &;> b K-  C*e&F|Nrw !r^lMJZ@ /d9\;qk{NS\ N CV K)g\z*[hݑx)s&Qڎ`/1 b'( T;h@/G  Yl .xg O!# %YU']*f -I.C/.q-C +!2+^"+!P-P!-c!,"*f"h)."?)!) )x)c('X!'% $r"U h=<gf f Q BH A   )  \ ]  vIU4\F_2[u:3r]aJob&I%`Vl  1   ){-EA#ddlX:F&ט 2&ErQ!ދ JWPJiعFH֝l4*M8pBְwb w͖޲3"݃%̻$rϴ ߠ-ג&W5t @3Q#x!a[e_7݈݀3٘-[%uײSe%׸E;h$ 3ρtjЇJ-?LѶ2,&qA٦. `y,g ;R%^QL5(Kym4C+ KL lX KK~A>7 *OF8,$gRBs & YHnlf. x  i Hm(c] -oN< /B "9&)3+,;--j,Z,+3*(&&(=*JU*^H(&&M(g(4(j&$^$$%[U'c*P,FS,w d+ 0,a /, D2 "4I"4$3A%4F%E6%7$ 83# 6L!*29[."G+)t)*C*Y)9&!eZrd      BhYw5!L%Ln'q(P(fj()-U'/.,b(<'y:'_D(s$(h'NZ%#*#L$$# ![ 5AM9n*r  Q  h X f d { !? X.XfIekX=  <)F_;'?1^*f&Q_x@~sk4W+<;V&LH+['6vC,T`UFS߃R]m nYcYbppZ_׎&ւaz/ԈD$6z0-A{uϡޥU:tZ[ߙ͠ߞ͔V+͑,F='޲jSBԝ7ե57`~]~~O$l 2:U?!.v i cg#"\wݻqۨ6*0*p`o؋f7ެK߉E9w-IzT&Jc . 0">V5O%qMsCCqfV@Fd?tMqR$IA t v  ^ { ,  {   I~  /  BqN ? 6}8 } o y 0= Gb  ] {<  6 m e;  } ) u f d N [ ! %)9+8u*(m-(})<*);))P)[*X+[P,g, -X.r-+('Ha*,Y,+` *a q,-'.G/km0Ad0/>/1'33 0 ,Z!) (e)*([k&;%:$$$Ti$f"n8or">g5?>z|LQ$$L=TU|<F-vWfVR~MGx! nT g & wF 1 Z ' _ hdg 8L~AFJYtR8p:o*rzUK<0$57arj 7;g%oc R%H[$'fn+s\n[6MkVB[#0< JnO!رUNۭ ܛBpTn߹ߘ۞و3Ӎyt[dm+]4ʈ܄!ٿdѮoۆm|&=ߊDБ]Z4C֞ec׉PT "dE ['Ay;bl%0.CuG2@U2ewM 9y2thtS%s:Tc5-5bd`6)w35zgh%2^y1 mTf?R E$5]$   tu  4   r? : % (   W a DIOI0PD3E{:H 4V    ?] $ c K? |@ f6 {IJi  q ,  v)&8`\wrR:  <L"_#r$F$#4"#$' *)''%A?&)(Z+z7,i+$,./2;5C6-6!4+#I2#/F#/W"1:!3 w1 .- c*))+)(&s&''<(7(!M'%9e$9m" a Fz #jE*bLWY-].7/Cj @IQ>T2r0&8Z; k  f: L " 5/  " Ao)8UJqCqcM?M( *j! Ur3Tcw(uTIA tl-&+, m#o AYFCYT5iSZ={z،H{t3;eenȄ^u|ܯ ף\=e0ʥKƳnɛޑ̚zͪͻ`axڎaޗlqHU|ݕ[c{e{ߘ(:>w.H/A.y[0Vߐ}/2܌}ݖfpvp E<a}8zܷ[$ߓb'VVx Fu54Me9j[)\hk4KV+<$57B3S(8#:i-48KO5Ojkv  m { 6  zy J >th    y= kV=%KZyO24R E>  R U Uk dL2uYl #^'+./ l1x122| j2"0f%.'-}(0(5])z9l* :+O9,9+U;m)!= t: 6 j2 /],'"3 ]!!j#*&>((X r' '),-*ry'$n)#! DU: 5ceQ "#z$#" #&#**](2"%"G"$b'J&" "D$Z5$O!m m !{x!^ Y %AJx^4ml R  y  8  l  R A 8 "    /&YAFCW  ltN.$\o(ws Q c/^c4 c5a$-)<&1W&\`boW \Wjg}7֎-ξΠٹ+ٙT?֗լHҘ})϶LˬX˿|ρw\Su s:ҥՀ(y\u&\Aѕ[ކЀy/ٔܘܩ%"_<?R BqZCc h'Yٮ; +;G:;9 a[GSf`+BUܗO{ߗWL;U >Mj5kYTj[ WwUSQ2dB}Um+)4\Ef+UCbZ NM4!y!|K3 ) Ru 3_  a,  G b  i,]K*"4%7%P# ( h$.1?q$|1-  f `    * o t  V 7c# (`)3u'D!&#o*$0%4~&R7'':(=)&?)@()D)Je+DM.M0N28Nc3M2KJ1FV0C.>Y-90,y5S*63'73%O4 #5!O4i 12/./L0;09W/!-$-%-%Z-8%Y,B$5+V#.*!?**^*v8*( &[#"@}#/#!{Dc% J!#o%&Y(?'%%9U(**.")p%">  @!c!b ?!Bo7J   ?   1 ( =  !+ r = O a:]Wo3PmI(U&jslxvfYDYmkv(Q,V9ސ6Lw߭5XVQJsP-|I #@M1ZY]46KR@;!+S I֠Y73ݙgڙ֞ńӝḃʹș g²ǔyb·u9Wםŕ ͭl+ۥΪt۶UH3?2gi݈-fɾX^ԫ/At*t&IXkH ih"Apߝs>L,Hh2MDD O{Hx*7=L+W[o[x0 Mb`Y*TM}X7[~CZN5{Dh/-*0 gn Q} .Y *s q  I : a D y s|   v M>   N  eYXI?d r=!{H t"{#A"  v! (# 9! b KNN! ]M#tUi ZK5" u!^$'9T*v,/Z")3$L6' 9&+a;.sDF.)T"CrT*7%e !sR8W8~#qzsH1޴ܚH()=?@`R8TIN\ Qc}V>l@|RۣoҚ4/81 %0՟ ľ˚f˰`|^(͝ΤbѶV ɷcՠF?{DKrɰ̽ؾ6k&_&̾7u9'јwwLeMzR>ce"8ޘl )\ WI%._F)Q(<BxM>a;a/TM&Fy PXS;wj O@ k  h9B7U   ! L  h ;   I 1EpW (H  @ X %(dJ)()\,v`-*A''d)@+L@+)%{#H$$!G8iBn^-gSOMu(e$g#M'i*+-"0 %3'4+)3k*4* 8+;+=+?*@)A)B)Ar*@l*?&*?@M*=@+?,?-@H,@ ,?>,; ,}:X+;Z*D<*<* ; *9&);:'a<%>$4~"q4 "6!5!D3 . (&%%%%b%&#uh"]"#+#`!l"Q!V,`pyeh'a%+<9P@k  ETd-% z d w M) dwpQqf?VQd s]^{~b3BHTpt7Ru6r~=wC)BR{LߵVjIKb?֛.փu9H fτE|K_ K|A-1V#d{cgCfZnRdݾؠ8&VzٗIW仝zҨBT@$PEYШuηjw9LΥ2Øp:ͺج*أJÚ-ѿOٸ%rRֆWyi}X)Mkaxֱو=ݎ ߶WگvmڊPR"Ck'>]gݧ53+cwگ<&߯;+;sfmMrb)e^Zfn3S2rX8 4 v IpMo.AL'w  P I 3  L HL\A " 8 {  3 + Q " v Kf   Q Z$&1h%Q" "$U'i'(+..){^#uF %<R ewMIFj h  M%);,A0"?8&A*`G-I[2J=7L}:P;T ;UF:oS9 Q8P7&R4R)2Q0OF.N-L-JK.%I.aH#.G-FT-qE-JE-F-6G|.E40DC2Ai3HC4XF5KJ6M7O6O4M72K!0#K .Ie+fE (>_%8Y#4!1!- )3 7% " =!V!s#w%Cl%W #{"$v&&(%q#@"s"#l##+$B&x%K!Q [% &!t<2VHp/     h 2 %     >u8M1DV-t|`Ddh/F=NI!ocT^gZ}82M/k8͞iS1\ۯ̱ņεNc|_5!O `< -,:WtdxnNרC|2AUKZl!a >fojǰ(Ѫ8xEͨ5~,ТBEA8;feyɵ_β3΅@Ϋ̄"˴1ǶłÖuC6 \C#l]ځTݝ]׈ځڕW ڎn41zHZًTufCG2ؠ ^T?6e;X@|r)شx+$;fEhFFh Xem9I6BZ+dabAn / ,<KP8   >  A J  7?  A  >M 1{W_YPa$+01+4248q:8!T8z!84{,%C#"P !9 | r? x",?5# Z?^*?^><^>S]>LZ9>X<=Y;P\N9]6v]4[h3UY2 Y3OX?4T5PT6{N6Mi7PNi8N93N:N):YQ8.S7T7T7jV6X5Z%4$[3Z4[6a\9ZQO=I;F8FN4 Ev0>-6)+1j'F0l#Q/G,($$_&>;%g!+/}T l G_K*9!"D"d"(m""!65R2W6fJ?  . G  w e&o'rs 6r&:JE@l^)qt#RTb0QX#5|=>#ZuwL0۾nϘț5๽6)KE }ut\SOߛ7Ib>(eZ=% >ڵ)$ɑ'=ːʣm꭮Э(48cX͓̻vB\[ˎ2ʑMƖR:IɑSʯ̀ϮA'͠>N,Ș*q9ʸCY,Ĺ#c֡Z0߭ׄ0>߰q6b_(r2tN=FC>KWGJetM#r44-Y%,EU0ry&`[BOY2d u Qy  D   b lRvIVH  '   4 E P 7  b WEZ ~{|au dGSH H%(7)&-\#"&A`+T-. -2"5#7#R9$:?$9$7$(5#4!3271//)&+6$7s)    `Jy2 :m!!]*3h 9`9"8q&L9)=+T@-B\/Ed06H0H1YG3F,5I4"N3oO4M5~K7'M8uS7W6'W[6T26Sj5S4S4Q6M18OLh8M 7 Lz6I6RJt7Lp8MF9L%9[M7N5NR4L,3vK1L0Kd.Fd,iB)g@'1={'L6(^.()>%S*!/,*>$+2@ S p[l[%Y$RN   B0 Di  j /9 76  o G 2  xX T15[StK`PC0>@G=!\0pRe@n\1k5 eBGe?݌߸ &>=U) oؔYӴ`Nߵ˨.wl۽ϸڞg˝ۍۚܢ6n҃8QΓGd !ܬrںIV9!WNB6`36c#݇^jԪ5_ϣҗ/UعxgJ*lh53E5DvԇKRϸjɾ2pHK˳lo͐%KoԄkS?G!9tΤбЁnr!+!,HtwEܻw_(iUڵ]Fqɦ moޤ4٢}Vكܗ*%3JKSlbkfAbFWUM~{.fVvHQ%Bnt}F: s  WO  -  G i< J   ?. % +Q X  <6  "?Lv2u e-M;~f "b$"=b1/!'z({&X%hh'*,, +j,\!0!2!@4!4"s4$3&3.(4%( 5l'4g'+3=(4M)5)6(6%]6#5 2.% +m 4*0 *wy'$$&& `e7!$c$7$_'o*/+*r(&'+/ 0/$2."`- c/#3%6s&7':)>+%A-Cq.7Fq.CH.F40'CR2HB4D4Hs4K2M?1`M<0L21K2FL94L4L 4M3M3L45J:4H83I1G0D/Y@.;D.9,:B)<2%(;'"r7` 3B/xm+5&$2$#]y,~ , Y4  d' ?  Z :j)  w[f"k{4%6}cPXB4d-NZ*#G$nV?0@LJ*G:Efc<id2w`jF׻U$2<%_tV,FըkB}ƖmS~SҖ54.QOo%l كSMm[u*//3Q{ғVIIwƯeڲXtʏKŅE_A’0gö'Z4ȿɕԬH2 Ϫv&ō_Ҭ,ʏLG͢T΍XɾPپƕ%]qۇՕݯ|HvBC3f d#qKV'% aN;,$RQ;Rt_kauzUIDFu)\h=F-\ sc8 Z z G = j $    J Ft `x<O  N  I'/6ef   2   Ye5=Mk 5$)K<.2C{7'?;< ?9}490+G(W%~^"$bRGF7'D S b H#a ##i9Y')x%(P% !!!' .40.. <-!1"8!>!`CJ"E$D)bB6.@(2,Wi;XV8MTj6Om4IG1 DZ,?&$=!95-/!)+#$F2~8*3P 6W{E,Jz2.~B%hM.{ q ]# Zc  Z D "Y &juxVG."7Pt"N+RwQD}5^xQaZ9ջ`'۬ջ98 ИzrX_ԑ(j-ʚIbz=ϺUjqƎ Wá)o)-)*X)()\(.()S*k(D%*(m(b&(0ɻ^k}6Ɉ#U֫Cܿowygf6{BncߎMA oJ]/}ٕ1v R_T@ۨٔ٤! J1X-37@m"'YeXIM*B ,0.UE>M@S P! wM0R@Y 8 K D   /  @2 j  6K0 v s\2}R!Q!q !$(,1_5 6%c5&2'1%4#8e#<9K$60%1l$S.l!+-(#]{ y 3 9 5'V"$;$Y$ (&g055_!2".(#7,!5,-.U,((,_0O3=)4y3h"5p%(;(6@D*C,YEO0-G$52Js9N;DU;][x=}^@8^B]B]@]@]B]D]nD]C]B]SD]F]rH]^I]I]G]:F]?E]E]F]&F]hD^B>^~@^?X)<4U6R0IO,J(Cf&9$,\#!!qf!#'!=of1TwqEoWP""4)p{"XI&/ n=    , L UBNq 2 n ` n);)b0f'_soC4&Y7duS:$`I/0SI i{"S:TݨT 6ڤiЯ -CP׭ (nڿ0q d 4sLֆ'ծԼ?0Օdߗ $ZBJKb݋t_ٙ?آġN:o/k7?ڋޮf߰nGھߝӞ߄zʏI wj#\'B8.X͉ɨަ ĐEءݾd)(m()"v)n*)2(E)ֺ*S(Ҿ)+)K;{6¾¦'ȯcëҙо_ƄJΖzһԗ܁r:g?LdJFqswK $P0m>iBhE1o_RDXEHbW 7*1{I@.*Db;k>_|6{ JZO X  , O }ykV~("K"![Vp X# ">#0' (r&":!$f). 3. 4"|3$2Z%4$9#I<"k:#>5L%I2&3%6#9"V8#5$2S&0-&0#//M/'.&*(M*h --p,d*!*D#W-,"1 W2p i0"-$,g&-%D,q"+E,T/41l2100P T/b#]0V&J3'6(8h'.9j';d(?*%E. G2E'5F5Mg5Wy6^[9^x=%^-B]E]F]E]E]#F]xG]G]`D]A]B@]PA]B\A\?\7=]:U^w9w^g:[a<S =M9N5O0lMQ.G,EA)=#a;T7/Q&f"\!d<$)  #  wix+3hVY) aw%c|@RR|_rG%K97!c5ai=w|N ?]_%^i~Mڣ'W),}s& դ_vݴݧ} ^ԁ'ς˞ߍ{R2B.%1ʰӧ/גoըv׏zڬ|P)ƾ7]ۧ]ٮ1%!дuƯ1Ҳ?^āYAostO_7 ǡfƶg# g9R},ʚ݃̏4ntY-f[?- 5\EUe< vK7l 7R#?9fnp[V*+]# !m?m}` 1n iM R; ^   -3oH"{ "+:J6 #U~$]!\BR p$,)+k* '.%& *W,R+'(8%n E%(+?\, *").#+"k/4[7y7$ 6"5#7 #88#\7$K5q'5C)6)X7F*6*4*2z*W4%*7F*8)7{'6w$6l"7!f9]"9"u9n#7J$4$35%L38$4 #}3Q#1$C/:%s/$/N$g/#;/_#/-"Y//`1*0-V*+9>..-g+H+X.T:0- )e!s(n#+#'0#R3o#Z5#6%j6'7D*;*A)D)5DD+C-D/Hr/L#.uN.-N2aM6N9N_:Om9O8Ou9O;@N;"N:P73T25T3P*3KP2G1F/E-A+?(?&>&9&1$Q+ '%#ESm 1? V S K $wt 5 - 2O \)>B2XfHWAVfA)i=VH8 q@mqFU9:ܰD%ۜT(}ui iG%;>SE\ۯ/eޛ֛ x~hudXкԛmֵ١c_@w'g`ΩdyшHʹL!_^"^߆ܐ%otR;: ?˪%>~yhޗǀǂȺG;=}ϧ]BߓgݧRݤ[ҿwηNF $Ȩv Eͨߎϣ3܃OMAjA#+3DsnsW5x/O^;p  p:K X.*]A`w]adItFxX X     X i&2 ! { OfV'iQQlnu!O$&w%4t##& (&$f$#%'oS(H(+t/(221 #.!,!+!+ +M D)%#$'*>)'&({,03 4"a3:%0& 0c&X2$y4#M2e#,"?)!]+0!H3BX0G+'*Q,-,i**+ -T/g 0"2%5&7'8@(7(9)L?*D,Fl/FK1OH{2L3Q6U9{W&]DBy]D]}E]fD]UD]>E\#EZCt]}@^>?5^?Z?uV>"V>YXN>]Y>WV=U9R4O0J5X@`Z\D[F[G]F]4F]mE]^E]E]7F]XE] D]C] E^8F ^-F \DXCSAmR\AJRARA2R0@PF=PO9OP4N0IU+Br&:!E2 )V"w }y$0 Y M  W 9!S4  Md  F j w i i 3 #p0 Y d 5}l >\ prC P@tJhSf#vp&!:H- aߙMF^rg=w7TMעitב1tGр=xC (ţߞېُ ۗ.`uiݦޓO4 ޵}/#csHcS vx ]佢/4&˸jԳ׋D)7~Ҥ:Uکeׄ/ŭԨX3vӏa53u֛#߽Ҁe|TH[ӥфΈ ǣ㰍d # TeZ Ԧ~W~ ɾL@~ î%ð0MǶ=sE;SM(Çګ{n@LI@* b >YQL\8w&?NWtw L`,|%7~u Cqq9y ]Z( , ] / ZL |$Xiuo@2|?##JgQ$A DS Xn;$U*v)I$# UI!|s%)$*)S))$|*  *4D(d&"6&/%(k&.-S&2Z%6$6o%{3f&514&2%5I%6;%5%1z%.c%+%Z,Q%/2%p/%6+&]&'L%'X(&-%!2 $6W#:K#(B(B.) ?*:'+7+=7)8d(7'2'.%;+#+!.215*77w5 )2$A1A'k4(S9(;W*/:-78191[?0C0UC2?4x=3R?i1C.Gw- I-H.G0F3B5@7B7/H6J77G7C7C5NHV4_K4GJ4G4Hg0K+ML9*4G}+YBH-Co.:G/E2>4\8694x?{2AA1=t0}8. 7)7&.7'#X4 ;02,$'s &%7  %  R  /@=*UEU<q~ E=>&BZItsb oi7 Cw.GdXxykRfcܴP(_c%Dً׏-mtނbޟ'bԥЄ>͢?̵ΡХ|aʲR̪ۭk{*дصա֏O&لЗ=Chxܴ X̚ ȜFړCֻʃgXҥόK Rx@Լ&Ռ[ծv2&$͒&̽'L|_&޼͜ЊҢOӫH}lك+>݌Zs6X۝=HƈҀ˛Љ\BaŪzù4׌ƹğS‰=ܧfې&٬7zˤٯ1ee;ۆDԈTa9Ee'^PZ$Hf (x3s]\r~2b)ob7%Mm  _ Z j E &^ - \ @ 0  l  `Z@H> "+DTk"$@%&4&a%$"b !"C[! &!!= "%+(,>1332T242#14./[!,i#+%,&O-)++&*,L+Y+.)1$)0s+$0I,[3k)9#>=h 8^$6&88q&9%71&1(.q)0)T2*90d*,$*-$(1'4'3)=2)3&x7t":495@!03!!2. C1/.E/i.+('OF(T**(YX'!(2!,/|.0/}!/"2!46Y!d8@"S9W$^9)&9's:(8w*36+3e,L2,3P+5*6z( 5{'B2&0x&J2&!5{&k6&5z&5p&6V&8&G:p'9K'9%;#e<]#9R%^6~'^6(9'-<&9(L4:+1C+3H(=5%Y2!% .$T,h"-E,)#!8Y P   J  )C= 9[I;Y*:? ,vv|4j_V'l$pp:KOc<M &n}ݍ,whn Fu׌GתpVԧ0їϥ%ݟвܓ˜ߚ̨@L+Ӕ٨P!uݤӶ{ߟ޶֍ޅV-;+t_pxRӗ"Xq ڼY̚FـV̶̋ʻu5۔4n5ޘSͩtϯEڊx҃Ժ %7߯ zN'|<ũĕkܪ۽+^AٶȪ"Qvʙؗ͸{Hǔt4cȞXh ˏ_^y[˝ۭz1ڰ#٨׎k/ֻHP׋ ׹Zç|r>iՂ؛5X X{ 9D)#OSCo''YwqJzC}cu:yrVf`@@ s{M|}H. 5 e   k   Li 8 @ F u  q  # Tb$DJ>x'#%}I$2Q"z"V$%&1'6'w'&%!&H%T*&-'!/T&_/$x/ #P/h!. ,{ )x(z')%Gg" |?0!f%)()G"'(F#4)*!- 1b0C- ,^"$0#3$K4 &2'+3'5&,7%4%. %*0#,) *z,*,1/*<)*,vL0!4#8':-M<36A6K6aS6}S7qL~:Ff:F72K2KA/G-A+?(A&A&=(G9)8j(9m'8)T5h,4-8\+=x(d>(:)m8):(+>'6?j(}>)?+)Cg'tE&C(?,^>'/@0C1Cx3A4?'4h?+0>+<эNߘӻFQ+bl<\\ۗMѰ.ȉܝL߰%ӜBwӷj ̦6ƛ֖Kȓ̡VW**ݛȶ̃*Ϸ|ξ54֝wFЧṼȤă\¬ oԮƖڵ{͐ \ggBtLt9cֳs5ѵ V>Bӹ`w̷8x/٭QϰP볓Ť|nƖʨ3!=PR/g Z?;@J$={*7-6+8'S5$q,"&1M&{% '6~i*7] 0 ))!2d"X7$s5G'~0`'N.#.-)%S$R~$ #m""3$%b+'4);+=.>1A1B0@q/k>-; ,9-*:(<(:)8d*8*:*;X-:2t:>5>5}H5Q8Uc?QTCFATHWGYDYjA6V>P)?)>(9)'5,L7-=m/0A1[?2l=1>.@',;*/('"3&''z#YBl n w _ - 4wLl.  n#(   ( U D D o 0  fJ6wb n / R)W nOm=wh oo Tjz:N3"t[L>Q0-sB4{1%/H>UՄW\3&Kmْڅ:af{%f^8*(׼YDTҭX ڼЋ)٩fXfڏc۬ʬHɾPg\X͘ǝ׎2QΓ-z( ̆$sb&ՍһxRӐÑҦ!\XU ǰ=[ƥ EɲMz˱=̺a>3Ȃԃxپٷbۗڈkʵݻ.{ئ0/ʻ؎Pؐ՜}ӋʑVWLJKa‹3-Kڇܿbߍ"8RA.#po&IS@@'p`AU,?-n ]8ZiyF79PwjHE'O@I   - fnt\+"vf"z  ri u=!b"$%D$y] s"z! #>''0)))0)f'&'**+fE+g+>-HZ0S 42I#1+(0,/g.`/-/+0*4&p8"k7 U/!&?!$(X+*9%(()) *!-"0$50% ,L&q* %.>"o6K:7 )1 O.#o/1+4U6T6v43"/0'/b){3D)8)Q:+V7P-3-n3J,w7)~<(> ):)5(3'3'2't4&7%9;&B9)T6-w5 09r/0A&.D.C/BC1pE31mI/6K.3J8.G,*E+TA)<* :):(:&!:r&(5'-)*)(-&3 "l885_l2KD1,u0//W '0 '/",%+'h-&1q$3#$0&'*K(H(%, 0'1*$x!vK T\V   y $ >TpUU3JPu_yiP3Zc+8|2oTv{K)Y^6uc5m)}O$p7)u "=N/"~?ߔْ(ߚs3ϨۆΪؗ"ؓhٺ۬{vK̻ܔp܉̻x ۬=рQ$͍Dݶpڑ2ܙƅ iߒБ;Cc ΑܽrۭΐMܽ҇۸p۸'ρ<P;ޤ޶ı݋,s٥D1,8[Ғ3@ǼȀO# g҂ϐi_uǿC@/ܟƗʏ׾) ˈq)s2]5ճ̋ˋAD^|k 9ѳժR֭?^]:\ݵEޚZI(P<בٙ/ۖmjY<>ߏfPP '`M*\(i &Ho!tu9O7D Qh D d7 k > i a4 pD T U@ S i ]  ]] / g xdYx 6[k2!s +##8%#Q""!&")$`*{()-(%26(3c(2$(2&6":{ v:!4%n/s(/'5%8$5w'.>,'x0"$H2)%0S(-+)B-@%.!//15p1A13>7f6J1!V-0%p/$4\#48&-E+u'-'>,,*0%(2%5!9!s":'8u)7*78+6-2./..),0(T3$/8 <=aI;\9;I??=!S;$ ;s';8)9x*a8 ,N7-_6,e4+1*a0u'*2B#6/;I;6,3n3s65m3~1a0"-=%('%'4'')''O(&%r&&_"\,'00-=l+J+ )J&#0!6 PW  ` D|  b @>K {d8k N9~,1w- [vM291i!vZ]fv/FhcQ)yF gmՙo1=٘ԉ ͚ߴ͐Eۘɵ99ǗзCYQk@c:݅J۾ئIܗ[ߧ`ϥ?҉ou5zEaHہڋEܛ,Jۧ܈+R]@6ڜAԶъj ̔PɹEIJzͳl<ćK}ٖȾ $E\ƀ2[?AiߩePʘׄƲ p,fIJձ+\`ēKV;m#he׏Uמlt<GGE| / etF,u-%yQ#F GOar3Mf!RY5s '^.+ p 2RgLaeq : b TNP! Lot!!$'(C+/O1t. ,!/!Y2o +2 l.!+!2+G(! dS| X!r$m&'S'J((&%n$ %>W%# y$ e#'{+.|/G"@/3$W2##9a yAJ D$CU+CQ0Gl2N4 P8NF?!A=?><@?8gB3LAY0<4-:K);$> S>; 8_N63a#h3T%X6&9):/97j9<;,>4@n `y v A    NeX w 0 j   H@eAGV U' 08&Ni"s$ #hL!vN$i,4R; >q!=&8(34{( 3&03#/!$' Y X p$<''& %%?&Q$FMmlfou\N"',\W/x!/.$1$9h$C&G,D54x@Y9VB;JT>KR\CIUHVGK[mJ[^H)^Hx[Ed[@]8;[R7Q4F0D;*J$@N"GIR#@\$G:%9&;& <&0:C'7^)5?+]6c+8*;*A+HA-M/M0eK.0J`. K,I+hEG+_>+6A,f/*F,'V,#,| +('''`&z(/Q-N/xZ,&(*V2l9G:$&8)6+g7+7*=6>)3''0'a)&"`#  f )G 1)VHIw2 ( n   $} q%*C~" $a%,&#<,"8Gg EX= i kR:U\L z <DA5@6M$PWP*WB BL=^vޜ5˨ݳȄCߎըݬX#$Uu(BJ]| ٙH }/w'15݈{fߌJ۟]ك+ 1ܢgtӓxqڸ͔'˘aȴ"auɹ MЭ]NƟ2yt[ˁњs.pmɞܨͯ *0ȧw$͇|ϙ0:f@1 @eohYZlSJk8ٕ>`| ׵)ٓ'Y@Clݗ(hn/dұּ-r:$-,02,|{)[8-=47 6<%A4)|4 ,8,~?J-D.D2@O6>_7BY6H5L5M6M7tMS8M8M8^ME7L5CH5B5>3>E.A)B(='-6&L3 $(6!f8a!6!=5 6-9A:N :;%<::v!8$7/%l8g$:"%'H)-$i, + ")=&')&)$()1 P*h+[)u:&%2''P&~''L%cu! c#b!"# a$ #\"}$"u(W!,)$/~11c1a{2m/62S:; _)?d-B1F'4I6J82K:N:UR9QU7W4WV3V3T4 R3Q1Ru0Qk0ZME0I.9G/+E'C%?&8'3F%3Z"442/*`(!(4"*!*("'e!&b)m,;./K.b*,Y* (w(('C.$OhWY~,PK  Wz<5 u2| > J L  {  7 FhTC9DNp T M} 9 j VHo o6 qG k ' n  y  Z Wt= o;)`:j[6 ަߨOyb tv#$b_֫u -_߆gۍ۔5ao5-:CE9| oh*=FGЁgɽhIO,rk6&η\ҌR߯< ԰1.ȉ澏3'wȁ[KQђֽkؤغ#Z/َ آTٕ!^߼ٮm z٬ܮ\Qy\:bʴP vՖu*jܶ=@ڶ{ڣوٸOڅ@d+ ^#&R; A~+'d^(nӕԜbۯ <j"sfqM a_uPVRT0wO\ ijcK M b& M"t %"^!"'+!cobZe~va5rg F0 , >> k  i3 , `k l ( %5+!0%4'E;('CQ&J!(2L-cI3G6K5Q4T5*T^7BT8U;VQ>+X?^Y?Z>]\p>]7*#4Y#2#4~"8 9C7x6x6rL656!C6}33,^&=#$$ Y % lo~  4 0` |&olf :`35Ia&ud")!\ kwrN!9D/|uD`~dOA ?0*ͯ$ɭڠÊ־fûJ߻˻$êĕF˳&ų} ӱ̿Uư& 4bXI6ůX\ |lB.^woJmA+THGی׽sر.\#[V ʼd89Pʳ%m۪͚҂GDbZM- +M)sXڣ8كcl&n_F|ޫF/bO9ku50"ڙذR(ڻ١$˾YȔĥH2_ۄÀoȼЗPΔ̾ɹ֭ڗKܰ1>.ow`;~IRP4 x0^*$%}x=&F* AD+s D *3 m=#r&e+0 -3 ,0 ( P  o' va n` 0   C BT3 5)XET #'$/(3..5\6q5\-:W4Q/I+B2';$b3!* ":/00 c 2!9M J"i@%H''')-!Y4';-=2;5:V4=_3=i2903T,F0M%F1cB20Z,('!%&A)T*)>)K(% "  j/   w  t  b ( 35aZK#%&q('"(p"1,".$K/[&/&/%0L$0Z#T1|"}3!4!3 2 1 0131`-^+j, -P*#|#=| A #~zF@;= px]b/2~OS}19[W!Z`_]S6ih4k!ߥϙƊCNq R[>/[/Jϗ݅ٙJaoU˼ Κ>Ξw6={ЇdMֿL97ݴf۞ޤaCplLWj< F|rR % 5Bm j"?% i"!:&)^)N(Z*)))`%5j c  Oj Y Pdm  e[ ]T<C& q@b!~@%%4%-$+K%.*;.r2,9:,=-7>T/?/CE.JH-Qq/P2L4ML&4P4T-7%T:DQ;N0;Ν6M=zJ@0H@JI|=rI :KF4PX.S,P$/L1LY1tL5/J-D.r?T294R532//+-K)-',0&+#9)')l,- ,# (%W"ee)!! %n;*Q_+,uw0498&g9 8E "6 351A2/D+%x 7@JO( g q )d,yDK10 iR *   E6; Q h "5ky\Z>36 " #w$BXG  {\@- & xlP~~ Uy"w-`|A,'yG>S893x\Jv;=Nw e6J:M ߋQjcqw\Dwz;7+ʯ72~ЫnŽުܭԿ 뭞8׾ݱg* %ҾyZҽaD7qg cӇ`>ٔ۸=,26aLRX=)|5KHYtxOOQ;պі>x%]RΔBcc$m&z#|84yqݞG۽<Ֆ'YmH2Ř5Ń Uʦш{?FY Fչ02WBPЁӧٙwC$r#,+7f -8N.7a 7o 8z*7 1Z Ni A@mr < A  Kz "7&. )%" /!94a"[8@' ;.j< 5=7?7A*8D9G =`ID@I B6KBMCNDN%E*MfEMDNAOOf?C@CG=0H9TJ.7H!8F9-G9}Hb9I8Kh5M1N/I/p?-5'2 v0O+$!wf vDJ z M ?-8A!s%&%5%g$(` +&*-&0(/ 0 .:/A76ZD<Gd?zK<>=N+;)A**E?*I(fL) L-IN2G%4F3F2G0G0E0QB2}>Q4h<2:].i8(25Y%3#3!3 0{4,y(9$$A; -nhB O?5 6uf4 z {:e fZ } s  V^ m5wR vsmQ aֈßɾiK{:Զ5*<1yնٲ{X#4ӭ,Ի&T8F2f+ŀP‘llJ º¨5Cw3u׌{ʻۛKjˉSIs/Ҹyv'Be z,  ~. OMRGfGnC  D~i n S+y!>  }=Yt]#^"2('+,\.2/90I?3 A5=A7DB8QL":2Rt>|RBPME)QFUS(IhSLRHNQ M~TJWIVW&JTJR&JbUGZDD_^@V^ =^(< \>'F+?"1:1C<%1&=284>25/s2./W.Z,,' -_",M("W!% +(B-& 6 DBR !#$# &D!'$!B'&$0"8~"8$2t(d/+3o,:-A\/C2,A`8:=96?8;>=H;M?9 8P9-5p(.(_$*y)#m 37n3L F  v   Z E 0M EYp8 :}Z"R#'J6(&!&y!'8('!&" &"&!X'K'>(&!'*}*I&$>2%K' h& R!1 b [ q7 4 " 628/Q ] jp$$j (H6cFJgAV#) n yQ҇mљmU {`ȴuǛ3\2hEHRdjht>ٽfn܆+۽G؊٪-,D<6XkױnAJa\>͆RݵȢhލ;~72ܽ1R¹`ޠ(5iם+{H35gg zR15tyZ S :cؚHqNQ=Cn۟ yܹ,pghP9dBR%m#ZOU  J  ' ZrB  D uJvgr" h" +{/T|gl-!ph% %&$(W%!p('+,-2-50r667:9:=;NB+7CGg39K2)M4Nz5N`3O0bQ1Qg7P?KH%G+PJESHSoMQPRMSVI XIHUNzORI5UEcVD/WDWBDWCTWAUSBSDPHdM!LJuJHKCN:O56WK5C5>S3^ } a CI WK G ^ m&v  W8q[R ;T!Q :<X B S B 5EoEoF-  v s7a<GcP9   Zr  -3?Yl o_kPцoѲЬͻϖ:<«T?~ȭǁ_ţĤ&龇mxKݳik.crNJD۷@k!3 T%ѐPͻ01lBƛ0?΀ǭ1#H mՒ˭ڣ۠״n޺^7//N.bvRBڦp [ƏdXµ:˧j <\)͇εYVBIɴݸтֆڡi-}H%rsy;3ߺ@Ն[jւT@]٭ܑھ1ў˪:s^;2GP;%)܀ߜ`ivX='`HrTu~ Chtc tA,r~Y:L (K 1 (J1w"8&w:Y-:2; 7<=P;MC?>?Q:><:8?2RFQ.zGv.ZAZ27l52+4T60J>.?81;84c/p7,6042759:6,;9l;=: !6!m1 &1/ )"L!P#40$b S BuY!7$z%%&).A3!6$7&Z9';*>s/C3BJ6O9P+?WNEJjHDICI`:H1C,}:*/ %'(B%k" 7$( A L  gT  G #X !A#L%!s(&R,r+/{.01.0U6-<+B!+E"-F2E7C:C7:uD"9*E8WE8F6?KV1N*-L+ G*B)^B%6@:3/.u e)i &#uv8 <G ]!$%(),,0-v4-G6,5+3'd1#.m +}R&8O  $m e+^[22>O$ďlaFuIJFȦ˨쬥.{}ox$k;@RZ۶h ȿjs³.ȩd‘"QlbϗVvy|k3ׅL=!͡Fʣp5i2e]S;vvחκϥb֕rM 6]Lyn؋:"9ԨЍ.'#ٿӿOρQ~]m7_(AQJiN+tvTɽNL٥SrXv9( .zaGY,ےlް׾}k r ҌXђcΖ.I?ȲMȵ ۵lŷָ-OζV9reQآ0~}[ ׶kرix  m*| lEքGZȅ+ϖg( ڙܰ$a9I;  s  #t$2&E,b*0/33577 ;9<:>O;D:JU=IAF,BFb?J:[Pm8S0:}Q>vMC%JEID9KByKBGDCG?Gm0>,B'`H$K$J)*C0;37}3_7b/Y9_,88-1340(: : 3&~*{.$2#1%1&4%M;&@{'OB(+(Z(y$"# >D  * Y ;_*?P" "#$ $!'$])%,&0_%t4$R8q$;' >t,?0A2/D3I6P;W@0^C]^oG^qJ]K ^Gk^hA^:H\O4R,H#G>%2im'G  Z w B ! a>! O%oU'nP)K$-&r4'z:*;u.:2(=7B:{G<>\Jd@WLLAOCQjFpPI NJM9HFMBzN=M:H7A4:g/5(2!O0%+1#}w".q/4p2;U31A3*B:4;?4;19{.8J*6&./%#i#/  x@u]٪ׇ^-{Iȿ_ʺӶF߲ؿ~6yrJR'HӽMc*|Vȱ^ɂ kaֹtŠ+ǧm|ƱWrY˿!VVY_r`-.Y˄Ҏ̏з͕*Νz^χMJ^ǩƫϵLԣqjȵrr'-|ݢT4k0myKeӒҀmǏLƕԹUρj@ǐpģ.Ss ,%% Ŵߤ 0ȷrSҡܯ#ow6ߗ{RE>ߨL%>l޲0:UUԞSa©Ӹo&)ӸӭKƽN@3P*èN̿AUȀ~Ўt4mv 4[$#+,Us9xGeTe&,I?h֬bܓ4B{8fg; d #&kc+^ 3 Z;#>{)>.)A 2EU5G9EA P=.L@zDCC>C={A>p>q?g:@7B6FA8?h9K>n8=w2?X)C"E C$|<@(%7)5?'6!'5%+X01)4'31*-0&6($7%Y5)=3,Y3O.4V,9q(D>%(A&@?)/9-^2./)]/4$/"^,T%%'d'$@~ 3@@ `hPn!k'''\ !1 R$d4%$<%1)&3,(0+`2?0Q09*B'Fs* E+1CH5I4To1I\1^\q6~V;9 Q8bN6KK?6mD7:/6S323./f)+!X(#e{<DV + `m $)"r%&G'{'?%Y##'4"*!-y"0`#4T%6h'6n)6,d5M?WL lAF{oE\<EmJUF( A2{-> !.% (=#C)7(),-Z*1c,-5}80A7Ca5D,3,D"3DS5G9H>3I@I@Js=Lr;M;Ke<:I3;Iw8K96K5H64C9?<>:>Ap8A6@@7?:?2=A3>Do=8!0#.,f"-2w4n0'"Gj" \$]y''#okl#%I& e(*+ P*)!!*$),$-n"7/!/&-/J,3,<2,-9.`+$0+1,1-0t/-K/*,((#'qP) ,+ % T ~ a#< B h2`kNn |"FsJX""$!$d'o%'E~#%2&##P%(+b.* /+O) d+."{1 6%{61 *8b( )(%+" "!Kf1EQ`ZJ2q^َБ+ֿ_̹/EùEfxdпu͸kacԿxĈVBŷ9ƈk9ď5ӚԸn`֚ʜζZj}Ԫɕt.]ۨݏØ@}{ɖ׻DR4igڃ<0J@j.84%!C*n kxQxֲ{)k-c`h۾Qժǔ3+纅`(߬VYܻש}֝~`oͲu4wqirσXҩ!Zd +h;\sUp̸ʏ+2OhEړ" Dڨ͏pN͘YN\AXȄ%ɨCѩCٿҜ-ъrVըVֱ,׻ߡɅ s@5aīX>=ѳ6 i˞3>Pq6`duQ#e'Q")%/'8X)5A/F8I]?GKAAM*&7*h3Y,3T*6g'7'3++/& .((.#2"/&B(,@!S/ N.-%+)3))(y&)!-2 3\%0_*-*k-r&.w#A*& +U/[-&,#  g v v(\j]h } ? ?!%+y *3e$:f(1?-?4=nA?EK>H:J9HZ='BB}:8E-43D/?.,:(_6\"Y52.+N'C$!uGj y^z   %8l!='5*y-W3j;i0A!8B&3A+)@.?1?3;831=f+m>r&'= $9$5(k1E/.5-v:/>s0E1M4MT8W;vYC>[A]$G"^L\NWIPRRMSF S?tL%?ë“ּw7O~žR@)ѭiCG]̭YH҅ڢv 6m5 m"U' "(,'D3'7*=%.xB1 Gn1K.MQJ.UW1T5?S@8XS9S:R;O/;L;ZHl;EQ9C5@2=+-;=(:%8b$6$4&$^3M#&2;#1#0Z#/"."+#}'$m$d%$%&s&%(") '!!X#" "P" $%%"!F !F$s'(l'?&k& ))&="8X"~'!`.(!3Y-5G/d7-`6*t2%D-o(~\$ 8 t !  m<  $Z&d4'3#J%*N"2 :,# ?*@0D-6L=TDY,KJZsNWNTMBQKcLGFB@f=w@*#A[?!&7u,/#<]6^ " %C$u"&a)5, "i+F&&'.@!F8>,#>( <,9/80t70w6/5.2-++1%'%$F.&9-Dc6mN=ZA^D^F$^ K]+O]R]U]tW]}W]U]QP^FM^G]BS_=.I7A1&=+77%Z0$' Q R FO/hiާ[ڮ}O(٨=Ւ=zPѹ9mœ1]יEMLٔ,͚nې֧ܴ޷94S48l~$ڐݻun۝ZDݪVٻIspnCٞ#{ݻq`y;n*ԩ޽ҘSEڇʅ^ǘ@Pd͋Tݛrw0hW2aR(aj`VܧS}W@UsmԮ`ڵԑd҄(;Qҿ췄&%IjLnqƒii/JjĽ2 ʊδSΞڱӞBgLݑߧ߰޺D/aMՖ۟1a6>ō>ݾkPɦ dVǹЩ"-׷ؗ5%g۪رI˪־R϶=ٷϷݶgITцfĠHր+a@  ")-/T"2'k7v-";34&&(# J " U# C" zZD^\v\ !""#% +/&0/Z)-*8) ~(. K& "J o  @R<r<_,S,n^"$%1&g' (&),h,}22518P5{:s4u:4:5;H5=&3=1;/P7=.:5o,V5*t6)r6p*41,2-G/Z.,-)-'z.$.!.X-r*=%!6 uf1!"G$>"D( d! :"Z#x #*qq0"1u'3H(9% C(&J*O)3TQD:mR<T8{X3#]2]6HYw8ۈֶM@w10Ӕs0 a׮, --½؇Y7D)/[?MѶXq uȣʃ}.[RM2P763W835?5121.r3+4t)C6-'7$8 $6$5,$5"{6D Y6E-5 74 46&Y707q6?5!4]"22_4z96<512R.0c.KD/E/- *}'%3!$$J`%C*%"6 G!"$E(+E +!( "f')i,-.,)!'"'= '$ #4$]"{ta( D-}C4>\R0 X$ v$"x ##j!$"o%0-23(03 /< d-2,* ' %j&s' )6) ' F% $/ `% $ "ae_8L.i={,^[{v7 -  V!# z\ #&r'+3w86h-2#u > ) : ci >yt: |oTn "hV#u  +(3._=3F7@K7LM6J3(GM1C.?+9H(1$`+ !;*_-/Y'-<'sX#_%,13U&3S,5.:-=(=$68".p%qg(5&;+ap #"%3,-AL6O8<[@_UE^I^dM]Q]U]W]W]ZV:^iT^Q[ NUH;N@2Gu7iB-s?%[;*k3*j$& !u u G H ~ ڇ8<5e!Nۑ@+H о1qтayUJw*Tr>ղBn'KCnd(1\t9c:ܨey`m7`3#'%x6Y;.B(N!fCO,*߀*߿I-P˚mۛ:B;T\ 7yTQ35sS$h9PB߬ʂ~cK5 +nPɀɋ\@$̩$Q1kH7 fΓQ@ׂ1S1=*պt![*͐ظ'Vpɹ|ӹ#=wPeVbQA8i&3ۃ*٣VmEd 7 nhHnvKt!&))x (;"'H#$@$ $7&$q /QB  $ -p   = + %i&"$["&)#4:$!7'w/q/)1z*-/&4"~4 0Z M* &=)/:4 5?3/+.X!5!9"7D$1d#+`?++*( w#% xY[ r! &I"'+t(1,S221618477077<9{4$<1;2w74u26[05F1,2r2-0*+* %)K!(2$-* Ub}rTQAl(mCRGI!ߝC 2*ߙ߷$$ e R'0پZڷ~_ly~3;'KT%+p:Va{}il6"?U?6Q_qF(AM[3o6QlHs#tf"hXB"ͦ ՅNczo_ކ5`"(YicgB(Gv3k$WEߚjC]݉\֯C0m߽ٿ pVWMWfڧpMݳ_+z-˖jgʹ5l$D~yCBדܩ(y/ݾ OIQ",%pVh%!Lؘّҥ/ُvӎb߀\saOfe`cX? !C0|E& o=@5!k$$3#!"F%&<&(+,T.3. N-,h->,#)%(' )))+)+)^+++6)-e$0 3L30x/0721l+0#Qa!Y#)$$7$# H#!##!}!"1%(&$b#i%'$AZd  !A#% !RW(/FT7=*l (   ' p0  E  ', k @ K !15WrNdZ h<  5 6 | 7hbb N-  D T le  L~ 8Z ] 9i+ `!i^#<)+*) '($l"Lu0fK   R 2 wK;7T!_!#B#V" $N% % s%l $q# x|hcb!`qz SRP 4z jM9 5 ) nX+OQZ ^wgޟٯע%]TK_NIځ*(ٸވ"aho9ou?fzO(R*އyfG<߁cI+1,ޤtJm w5Sj ߈)ڞWs==D&F'Y+ 9a/ڽތ;wmCkk 2lu(C%D$He\޸6>oݸEvz"-&5^PJM:/8 L$۫܂c@kBT ia# R@oJtZN3AIBV۹_ܚ9yoۥ!GЧ {.ܶ4NVUzT3e4-  mp#%o %^u$e$* !c"&,h///&0C .(]%.%_';%  r# !%\!%!6"!H$%$t"5>!! SlrSTg%Ae nJF2 6( I   5C/ B)  w Y]bQ`  ` l K p {  \ 1 q a9 - E )<a2}CE_J  V k/ / 3 7 / 5 c [R g $Q o%d%%g&Z' \(O'Q# dNX  EPC#"R ] M  " 1 ! '(m*E0 |6!8U'6-~6F3K:7V=d9;a956316.v:*;%9765\R0))%$i J 2  ( \ |E*2 hM7v-HH}mw ^zO [-~7ߏ:E@il[uE=|=r0OO0WsGgMM;c'mhxP/CݮF5غ`>$VПb#ۨ!(}`%&'jOܧحW؋׻ֳWND^)~=? )MkTooQ&iHKB1׷v $.x ~uvnDRn)`ґr3 SߚHU(?G==0 1Ukw~9 ~v| !j]RD Z 6 qHDK   gx  ~5V!Riv   j[ tq <    ^(-c ,q*& {t  T6Hmp9   ArK!&)Y3#5:m*:X.5.0`--k*,2&l-!,4(V#O8![ M! "NsE' b ( =/rX !+4-b7;7ALF[H_pJ@_YL`]4LUH0OBTJy;tET5>81 6B/,-$[*l7#"T ) k//QFq\Fe`JEbOpd!)CdptsZ*R2m"ބB[>t<%hmiKrf/MOI U][29P6SPDHqW=Q6LJ9kf_yf]qj49+iչ Giدَ ^<زZ#@nz{pfGz^h$2}`)HR=c5ٞI>٧<-Gb3VV9rJ;j9\^U>! /T/㖾^޽]Wp?ϲر~Tֽ ׬Al֬8֢2ܜ[`_Zbz5Q?5E  " v# v P9"D # !  q  ( CjS%I*g.L022#32t . %}HeC _ E g; L t,{7 @Q B{W !0[o! $*#| l3("X#."? !2! V M"1")flf9'@/ 31Q+s%L" c x , x'#Nf  7 k* ! & ( (&#fi]=> YMBx Z[ K` q r d  @@8r;T!lA&H&" ]  | }_tq+@  2B~m$%-))E7,>/CV2I5rM7O6Q2"T 0S0M4C4;/ 8M&|6 1&Lx0 ]"W v0$BJ bZ߸+ncܮ-Q'pAP` nڻ`7)XH'soFAo*2+GHc-J<tUr]5+YoUhP2+IyOIdwrAt {P"dPXA~(B,vT'v*81Z<@ b!Y:MvIZ߄stה#d"-sjy< [w@;-TK)Rk#':k6Dm|*@]x;' I@ݨm?t֊'vUFѦ ӇUE v+qΕՂ$^׸,(;w8M"3  " 3>  zr ^ 6CO;h)& $*(Z M"F M ` T& & YZOZ A$2![<oU*!% &U'&+ A"&a 1m G &] ' $!#!#Oa&:'3'#>#BR((y&%3&$ h) f  p#r pW x % vI_iX>w}7uc Jr{7 E;` 9 z * 1?4 K#a E N[.W i   Z5  ^ y T P0Y]M  \ s,'}C3:E  | . ? Uw^tp 8 cY3   \  ' >NK  ?#q)&l TWN!&"(&'X)%n(&*"-o3E5Z/0'6"J!{" e!  |     &`E"rb9`,hTd"f*;C6-hgWX!-^U<O9_ajv_*TC|!.>P u V.V FG#RQj82"14ڴjp>ϕIVͪʩ<7x ǐ`/*(ESAfK{W2+o T{[ 8 j |; )iYE'?'^v $0 "7 & [a #&7%% %!W(\X   2 / ~IY  DY`8s <e Os_ wg"Cl(\=O} 0 N.wX  e_[kI  BW B t  |  ? j  ^ o1@OLNI3I p !, s , v hZ $ T nN &K ewSI) v @}#g#' % ++ -2E,;*C+G,3H+RI]%jN S!S(xNV/H3DA4B3p>37O4-3!+1k,+s"# [mMha ߣbBݚݟt7\Ԝ HI(~՚1ڗ>ދr"Z jp61$1@khC m LDCIz q|7G" H)v,a^w0Sgo -AgR| wG yRH.B+ { +G99}&Vy%ߝ۾*)1.}߅; Z!p/eܭO1ojه&cZ^kJ2}y 3F;rl_ \.Gw.5(p30Y.as`   j 6o)&-ާTuҥDߖݴ qܼ%q1,n*ΪwB7FB.1CE'C#?C"BEDD'A:.7F }1<PҲŻ./]!,_:ΩO΃1փ@S%U~gyx\4UB  2X  Ck 55_ A[W; ~H rk/| '  |I: hRXeC.[g)Bx28B%>_Zy5,z>lQ k*A(SZ:@@3e&݃.%j>LӢWapb݉LriݨOt7!:X\T,y]l2S*W~*8pi]d-Bzg!(tg-*v +-ܤt׌3d@lu̇ ޵BE~n1+δ˥)SÉs7;ƜͬTƉӜp^ Ajp$d!>(A$,{$ 3h$8%!<6(Q<,O:?16&3G311//,+,$-,1'AtPWqe6 wF}1gL #%p;sNsH*ZD  q` mt! %e @ 5 ,  .Zplg  is@  6  R  B   SeM . :Ht X R  ~  v'W2wIo- G8VA?S& y  |i }@H:/R U SxV X  )YB-  a T.l2)w!O."0= "0C Q )$ ;& v(x,0.*#_%'(J"() w'- $( b!ydgA7 Cd++{  .K&;uTU(z޻}[ޚڻ<(Gkg_ޡ݈ ],Wg'q]%s ` @ _ @(  M  C {_ Ek( 7f%> !  EDi+bbl'pm5PC5> ]/LyX/1O` esC%2Wi+fJߒg;Ab޳)*xޖ4=Zh!RmM~ p##$ ~t/bhDa5Mw2a %v(~)p^B,"0ZR2|W`j(u?9sH!vnLp}9dXHcцҦx[dl% i\[C[VUu =-Q.0p%X(u'&'d*y+D-T14n6A%A2)f-M+*P)*$u+!.)!!O#4 N Z 1 :  y  s. Ez ` v  ~1`C U/>r7bd9Y@7I F7^],Phs}.DsVOx7 GJ8 F:e ]X 7F1&E y 4`\lc  ,(&V, Y S(i<i<\    s \ 3 k M NAQmUrzozNx&:~M~sYI7Kpi,a  ;lIi ()Z"["  W#& ( +(<#d&%"%y'$1'd%J$&L')'*(% %'q!;- 1*f]Z @ B 1`3xT55Wd!z.ߋq]Dhߥ6|2PHc,3P$1T{ M " c7wq]< Pb 2<&0D+W0P(5IwW0f/ujn%_'T<=''AD"FX{?7S"'8k}f?EJaT'Xy(nwHdfX6f+n'! Q]Cc.-=$}s1M_C%: | ] O}sLW-AARme?i\e*$xwIcq.O n j Kkb5^  + %  ! a & )  p'Ou4 C 1 O/". .$|!Q Y o  - |(7Ycvj hDYoQ! ^ " M ` u /# Z . Mp&" .(?40p75Q98j<*9>u;>>W<@o9'A06@2>.Z9,-3**#/$* %<uiX7 & c cHRHvo/wT\iUd\H&s߁Yȴq?{d ڕi#9(rG<-O DM! S@fM&b*)w$#!@y D I Iz # X   Kh Zp XXtKOKnwX=G*w!l12+Aw'zFv d2^JGkKt_ObzXV>6H/QBZ۱?e}cLL qw>?QG.I dfXe LY!6nfm! f} 1hJ] @<؎w,ѾlȽʭX΄J|82OVEEh1٨U٪S4g% ) AV6H^hv#{ G%0c:r=!F=I$<7#>xAB{R</!#$5$I^1=( a@ wz G&!b\G|0on[24]|?RM)eL[p'1svu>jLgPgQm-'Hzd  -   ~ Myvg 4   u  {  } 4 Q 7 @ h U q x B EP;eA 7{  # # e Zy |Z  ! 3 ; < u$h& O&^z&&?& !  s W r7(`(2I ;# pG''t!"/&T86 d & \")6/g4x5.%1-a,:1*/./d/h0v,h2~(n1%+$ %& %# !  P r s [`tMLL [ 5MB , KoA/Q߄% \{k1t7 .SZ-{Tyl ;y Y +J9FlC`  k- :QK:Db6l[ b 0>@ W] b uwp+ D? +2OQ`%}kYL(qML V*:O 86GroT!lp7tQW3W;d"Z*& XQH˨>љus%ޘB@9^~&s6(u k szr4 F W|jb A;7`z |jBb[.!V Hެ9\bJx<rۭȨW`/TPȴånP0vɍLʃp͂ǧP ه: z:{ЧZ<جK".: HR i|!\#s&( -*%3+4-01[*5:$8;;<}9511-,j)3"z \"<=`Gl.yfQfG=K-EpoaWh J / g GrQR $' $8$ $:0=l^wJ=V?} F=f 6dr  E )3&GO4!""%&'G)*4e,./,3!&"{!a!k"- =!T!WN0: a C!0  8( O L%kSo \fyS rI,u`=@{ =YFU  ^' S "V e  ~th 2zoi Eq-&bUi  3b  7 {2O!|$cO/ N]d iW."JF0C;U&sbH@ G n6 -j^,,~qT.W@=wM=֌DC.QHF!O G%&xEX\c`\FjcB bln1{Zw*"lv$4t!AQ)0HinTJ.Azm1IY:p6:nR2y<@{orJI b? 0 T f >L ~zxPoT{:q;- 9 ?BZM)C{0"Yw>>8%$C8'Hf.H=eAJ._N`l,@%%g 0yvN#{sQ[5$ [p|F  ;@-^^   5 J M  "!: "D!oe = %6(((vy&`%, #c !!!x%8iG6  k=x@w ;- $[ J usi C  vt  zK)z -N4%qK X l + G  x Ec 8  9: b E "EKx[W5? * q)5F}Q a j 5ck7HM @(W QN{ >[l (  @L  5 Q !Z*  k UAq2?4 k8 >[n/ _YN _shkDU1"HJ6]"u~ah&,>\;?'ߍ(cdrNFO m.0%* `R_ :5@ EJUsHH/,6` K~3& tD|7,8Tbgl6p Dly~TlO*  $ O qy    E ? C X'yv i  yb9 "  G f 59= r  5H|d5  :B~ X  rhIz)[ Q G'5 $?KG!S@!S !m [" O!56S s ;  - Yf| !=(S seS  4 a{UP?  n  wd2"9A&B'j!y !<4DY59;lfa-k'P!Dx'Ul  #,%D#&&M$-%-</!U(O' )G#)"|'4&L%(`"Y*S*g%"#M 0# !Ir "2"[0 8 4hOl!,v] rAc%aI3SMRPlt1.r!OU8*oCT2izGXi{Aaz@z~ۿުHU  ]7m 9tr@^ڬxe[8* 4 y   rrO&ߞЖwȺ8~?L۽ԞڽY@xxۏڐϰΕ˵χ VPHMlA zU<7~^7jrUfj+_m /I .G"KPAL=g .TnzϬ|2ZEYMxڇZr&fdDWQY6  B&1@zML]`}74x J3$ d+ S - EU m` lZ `S5w  X   S   W ~ I  (&o|>0un_ c*z08 a F "c&"+~5{8U52 23@ 5f28+ # * U'Vi}Nw& 9 s(DT[*G [h % :& '"OZ *K)y"$ (3, ,)K&4# !\$@*j. .2)Z#H!%x (f*i*B*)D$y%)V~%<-}5 <">&[<&4S$')#U#$ > U JiDR6N#N^LH =,n z bN~pB{ > FY  t]/  D  *W X? < M .g 'Gej ;<V.?GSeE/"adet',]ZI;wBD&[ bNymrk )]fs(:>jރ4vLu zpAFz_P3"@6ޝbnmzW r?qf"I6k A z 2RX. x~Htrߚ, ؛ټTL݄r$=x'Hڂ}ܴٞMTތU I8al l;oVx:l ucO3[M R m L \ B$I[>; L  8ZH*"IGO9,?@jڗݬ}\6ڹ~vk2W:նׄwmxo L(z\>h hcu D ^ q  WOn C! @ C  *$ S  ;Z s ZWWwz $)HS,- {._!/!3W!6!5"2k%f/G('-w*+Q)+s%+"5*"&h$b#b#v#$-#GghN  h 5 dF ,4p 1 rm :O \v<'`C_N'tyHP,7nU b c9 /_h@ch"#G?\H 0%%! T L 3  kQ  :ls,?hS` ,`h w BNp/d}f #  BFe% e 9 tS zaN|@ Rk \h_ qV{ s +VR0h/bD7to?SZ|:-bjUh&"Y2"D~J GGK,Cnpu`v'31'ތ@|ة'$k ڗ@iی؆Զװ")EM*BHHBJNg(<vt)t[ m)/-mAW߱2W!+s2f YY (<0>bP?-Ft7 6fU0UgI vu|< oY  = /C 8"6(|^ ZO* >&mA8\YbiG^tN,Lz,SJki"[6W. rAf}H "   ~ G %[ ` ,  ~ L G X11V-b  J ` #9[Mt  J o 6&F i*, -e 7/?'%//.6/8 1!8/6+,5'i2 &,%%%#  6= ;t  H3iiJQ0 S8!Ev-xqb?j(;!/x C k &O5 jO ? P\+i /O  0W"`7'"L"K8!U(Y+)(E&h')'#v # a("*#O*",2!0 2#0/&O'B'rV&% %8#99*~9U M B. w f}AZ 8`? #<$,"] }!b#%'~' e()'*(v#JQ % }/= 1 -  IkZqgv}L S p%$c[RH lU@=?[܀U-ݘj.6#Y<4='/k#/lZɤ~̔2ľj+rݬΜj~DE>5 Yp? H m A&" * *T $vA \ m w9ۂ]J+6ۺևԺܶRoqָ:U; )MʻYΌԎHRh{&TA7pn fvN&A` <[@.w-4Oh(AHX {j -P /C I14 d&8F?/\Qaݐ .}-X՘ڴ׬א;Չ&؊jnվO۶`=MkQ(i C _ } ^F'<qqdo!q"Xm8j MIi\ { $\(d&4.)96f)<'?%?$4?$?-"B bFy"E9&#@u&K72-P  M I +  =  >3&**ez#nC/   YUc)_|1~k3y1".+X.1o0\4N63=1,@N1=3L:c596LJ8\3!* a QeN@Aq܈DS42cֲH܏,_8^Ҍ,jٖXD5 hۨދ&X7Slh.]j(r ۻ{\ښo^Ԁn8׌E]^n ,( : L ]" ~$t>YUUA)f&TֈO`[ӖGB3E2AQ0<^,8c(U6#4 3/K+(2}%@T",%q"l(#BD"6n0,$  q:A{S~ zS@T ~4Xv8|2 ^<  *#(O++Y *''/$6X";:E!o;"(;$;&J;x(i:)T8*p4T./0&-F1S.//w-1X+!2*1*/1w)1Y%5`6=MD&EA 9^5$9~c=o=9%k4D-)0h2!/3113.C1,*~*P%[$"6$#G `#!UC\ [*6& =fR  'fjH*2'B $ i lp   0W !h\" #i- LN 5k *  W?=| U)ta>Q <&?B1?S=6"ZC>]"h ]%dن؃"o_hXZ:+vrr{w.]D1Zծ ܲ5A$ jʤ9۽ֺڸ{,ے."PUteGpf>1A<pj.(| U$/cd&NEL')? YP$e׸#$չ֣׉FZXi˶m[ݭm ӛK׈>ї:=ʍg9цkq׊2p۽L )زG5ءTW3 b-yG|$SMaA;P|  )hC t SA U1 ) % k  #$g#Iak hLk7s <+H(L8":9N@Ej'& cw}f\D= $)  m` c + ~   ]_H  tJu 9x o ]R ' by r,>_Ltpe #hC'm) !h*\#<*$+#V-$,'A+,)-)P+-1'C3$4&.'Z*&)&)$'!)`.0V,~(R(*[F)#R=: a (|\}"St O[O4a}" `HC  Kk_j_"Q" ' !?'!+Q>.2:-#,$/"I5} :C>>#:)w5z+3 *6'9D(9*7T-=5-4+j7*8!+7-l52Z25(040. 5%8l N7j1!x*)!c&v%2$C \8>T  6    pExN 6y{P y3t u E j   *,b v ( J:)k)U$Bh(xj>/:o +aTW8qzvH-pXA_Ex P *rTN~>9SsYؽ;Kw6ӋՋӦ(ӢK! ΰ}̒ @϶HQKݥ?vQPd}FZQ A-ep1 S$ 6pR 2bm/`pU2qX)|XdStڒڔݏjԹE@A/N՟ ْ8@*zה8h^ר]ae'a9ݐ#ދQXoNNg`"oLk,K12hKs OA ^ a  2 Z Z mr LRDHjp ] c=\Kggި,CcD~5. u 1)-${v\bz \ C & zr'{ E  H  -P nnC ; x"}&{)g-!71p'5-P8172450-2-p3*7(9h%9d*8"51)+ $X|T? $(!&'%(('6.X'|1(1,?0V.0,0 &-'_" e3 qP?ۅ=۔:DJs1 } RE"P$2!O-M3"5,35/0;-q<-q< .?+F%O T:!yRC)Iq3*Ai8?@v7 EJ7F;>B+6H0HJ0F4 @8893 8.U7q(7;_ AxFD}=24/!+W$)%&(#C. 5=F@-)=%BC;|r.<$&"? | Hl. %!o%!-%)4%;"? >!b8"t25e0D,$ U="rK3PLָ|aC̱UK].$G?B R C$&%*,/2429 20A0G^1M4R:V?XC[bE3^G^I]K]'L]I]E]^B]@7\t>"Z:M[6D]:3].]*['fY'+V)Q+M+/)Gt2@3=0; ,:(7'2$0Cp0?/&,+,/c0.)]$2(7)*|-,2`')8 9-2&0 3 pW0`SI2;8^7g2x , o >   Te ?oG3&+~/_1 t2617.( !& )L3&B G \ / 5v/ ?U K&T {F  A9%Q'F-pq,,3TNy8R^f ߦ [ܬ6{k /ЇDfk/TP %h[җ`%G;Qz߻uvGjUC)LQ;/c @/,$)D--+(_1  '&H+L0R$ϦOĒ/$rښ j+t|MFoۭaۼ[EkxȽŭ*;9MġDɓ;ȥ9)5hSH]t@Q֢߾ˢ߻]Xlɗ/pr!؎޽:$.4r3. . NGD R O "M )+Y)#SP TpI$fJ:r3c|C( +jގ_ޢuu:aA!f{?sTNPbtvF>XVBl] ?gb m7 N $  S   t W ,"'*+#-%t/#2i 68(:8!5$2%.0S'?-Q(M*(&K'p!! ]"$ K Z hY` E >]$~T%v'#2-!$-(*/(S3(0)H+=(+'K"{%Vb#^T  k9qk`Զ٨*)hyy? !P o$",l2&302:0lC. M;-U.Z2[/6S]T7]7]9]<]?]@][A ^;A'^B<^CXDUATF;V:3]X+Xr(V)QP-G 0A/@/?\2;5543:/7|*E:<)79\+4g.&.T/*-T+ '.%!00|.)X"~$+% !$#!z 3@ aZ& ?  L[d>lee7~9m&9f'[laBYMd,Vg 5O IJ pP C X E ` #D  vy Z p{` h K}ZO$G r~W8eI F ٩"N5}ζl":.#aVL ˭Ժ0ڈ?܅_~ݤݴ_yA)*ޫPsZSz,j )gX9m!OUk G:`"ӷǕҊ`so{b_6Ѻ:ψvЦ,gB Օ֎06ê2OӄCbשŜP%2ٺ`?a٧ڊ܉SZoߪxN YY[H*u0yGK=81j>hvE m 'G  F j  2 $ {SzjJE_J Qzi}Xg5NwLUf1_Ebz{{n-  7zI7u3 &o QbDP tl Za"!#%V"3( +063 596Ax8+86P20.O!m+!) *,!*$''%&w%#&& 'O+04N30S,H+"+%Z*%*T(.'m0Q)0,q/.@//j/$/!.R.*L.q%,-!O*e'@'$ :M  > ?$ -$Pi *DUBt8Dkf tr A g)Q _3 o= CvsD@(=Q0>2ID5?H;wFCnBJ?L@hKBI`DGFEG?JY5N*R$R%N(YJ,Fa/^A(1;27U6J4;/A*C=')@&8r&H/)1'-"S. )G%Mg%) *A&8!%Wj #" KP f 7  GMm.zq+JzM`$+ZRkP}B+n(cP \sTS[S " l`  _s  {5 uRB[k%4 Y!cx | $&NyJCP%صvSYύOԢ۰dtEgjXɝҢ؟a)@ %\s}+֗ܡކaѧ+} קz!5Hc o}%$6Y&U"+ EI \EZ{x37 /Z QD\>ZiZyT\RHG߉d 768^+&XqTJ\' ]he!)vT17g6:;9#@6g)3,3.3/900i*@.'))X$--j(c/! 91XaCRR Z*f *hh'"D|'+em0O5o99("8.)+;;.6B1oJi2N3KX4[@*40@0/!y(6~&^,p:NvuƊqX׵a2ǯiDuߪdxU{y1R'17!H<&ZB(iJh*pQ,V&2Y9\C<\M[SX1W,X]XYX[XZ[T [M]F ^A&^q?M^>[C>Y=V>Rc=PT=P >O?|L@>I@uF@C@? >x<&9<:4%=e0;.~8x-!6t+5)F3u'z/&)$&!'0)*S($! ) ; ) d;$"'s))/)/&",!$$ : Do>J@GAM-)۰OZ=o()/?` a8 X  mN0'3[P wK x  ,_ 0_+ \ Td 7 =5o >EJկ=ݗq<åTt4bݾݖ7Aq6kjC.)5G7Z   _  fuߚѹ;bԩ8 ꪇF"WԷ'ɕg:MGD*$n"  qh =_e9&a[:W>}ˬƴͶO cž_DѥdH뼫g_kZ߿LVV廞ݼ7=µELȒ0ʾ^s˔u{ՠجtٵzK ,ݡ}9ڠ܅ ިۍ3ޏnlAܬiw@eԺ̱GֆCN"r H Lg  8 M MQNkVqZIdHW;޳uAeޑ} 72AIwQ_ REs< >kIT;O + O%06z96=CHF!?3%9(6U-1/2)6!887@B3+T$[)ig*7  (,> | A l q"Q-# |<"N$>&)(0)+9l(?%D"Fx$|E$(C-aC4\Dm=3G>DL_HSHWDUX='T4Lu+Cq!9L- P;.CuN 0ޛfO@X Aw _"(#3*?Q1JE78Gw;J=Q@[C^E]^zG ^H]H]I]K]O]P]P]RR]eW]]]^]?[]XT^[ML^uGJ^PECYXFRFNB_M cfD  O qE 3kAiۀ׫V .~Yduο5۽BfssعԩB՛WNڰ:$R>dO A- AJ e:&2Kٷuߑڭ"PѯhѭO1'\EVU)JԄQVY y [&=*WoWݵK =Ѿۚ<VĽÕ̱)Zlü$u [ìMfl9~.X˷vV%†T߹֖ؼBݕ3è۪#ٌ7ٽ\2רΝތ nYғ#ֶߝٞmMb7` 8d  P1*e&^,=/-k*!'&5"$!%hL&$_6 n41 T9   71@,e [b  ~Jds]%#nETpu.MuC fG[ t ~$]'& 'X"O-#2%4&v4&3%1%.'x* )($&) Z-A ,W&"!]$b#. dF!#_ !K$p>#~H  i X?UHr V%8z.3f4w36Y:. ={"<-#:"x9"K6$02I'3.) ,(?+&#*$&# #!!,#?1 N -$7 eE q _  ee 88 ~,e!S%l%z$9&+*80\/^4b283;%6?9-Cl>MF@F/BFDEXFDG#C8I>L9RQ5^T>3SD3\Q5O8OM=M@ICdGEFHFHGGaJEKBdI>aF9Cb4@/P>*;& :j!\::JJ8)1(*G$;!]"2""N[!)xET}]< g ~` <Kt^I rrP ~Tg=nhE2֡UAE݌N٨.Uչ׾JB.xW}$)>NOsU>Bq)B|Ro"hCFm;( u lDAz0b Gf|ٚٔFٍ3ّΊ 8#q6kj0LچX$ޒ\, <N1iC&tZW=P[dT"\iSϭ֫/o&jǣdžX:nѸbgG)ƍI/tҔ եn…uĿ~.b㳞)ص{PDL`^}Q^:n5ڍCܶ߸;ߪ@#HMjpJ(K C&Y & [ 5S$Y&ye(h+0`R5k6l 2c*% j&]*)m'G_7:.J>! d  de' XK B!0E6J*#LH #S)5 $^ zl$G+E0145uV;@iB?Q$8'U46*1+n.,f)+$%$lw(Y'$ ) K2ZY^ [bn  ># $$z&*],!,<'t+*a,,-..70S003- :*8@t)Bn*B+pB)E$I' I~C"7X%,%7"%o#g %[P6 AUbtYj pi\"}(*!8*.")9)A0+:ȦBԕ8O i $V"!([!S( &2 a$Z$XI%D*$\C)sgX'' ٺU|ޕ .µDH}Ϩvۯɭ{Gܡ}ycš˺ p'CWɯ `'*RŅͧ9ٍ˿'* Lϳbl߾FbLgekNft7Dr@!2h߯oڱkP -Q6%+X!v-D$,%+#*+s-T.^, &R,'  {#D:#fsNXHd3f. QIY$$%#].!4o 8H9D7_#3&N/%0"3 92I#*&"'# ##n<"l >%=l+ A[KG(}4C -Za+! )/38<5,=-;%9H*8+71+5+3)4('o8P$E;#:%6F(0(-w'r-'.*1 24:?8@/?CH DN4@NH8E,7's ;LT$Ht? 3;Ӧo]Zfu^ 8E |2- 7;f=&A3E1?YJ[HO)OTT@ZYr^]?^3^ ^ ^]]]^]$^]?^]Z]-V]ER]P]O]P]N]xK]F]C ^Bg^ C^nDAY-GQQJLKJHKAuL;H7+A6 :"3"8E+:!a D  ]{Y"uE"e S 3h\zJ ڹն) լI%`ZHM| uV߳2:N%6bqk<-. + i8I_\+WQ % ƞs Ͱءz֡2Q@iʖ4 ` wzF vBW R<^Dݐ0 ;ڮWЁƊLԶhgۨP_=߭E"!Z)&*A)Ծ(ٻ)顜);ëPٱNe?Π Nf}W}1NÞk!"ڀrU۱Yީ;|5!wvSgsz>*e`POW* V yWx;CC puU6" l' *dJ.!3%:? ?d&:2-%5 32O63u7+2[6)/34X+r1',$#%#3b% & %"8 2+/LSDAQ)AH tp@N VS8) u*bNj1%8*x+)%ak"/*$VR# J  7L  F   ~u@J *" T9](I ,`5o =(O!#Y$-$-%@4F,74;9::8>9A 8D5GO3`I0;J/J!.Gh-Cs,~@Z+ >*<*5:-i53/;9$,>i*>),n8$@6E3eH$/_Ge+SDR(]A%?x!<5G-%7fb 5-@ zTq5  '  : (-/'2-7;2>6IE;Kv?PdCSSEZot\+`'F(ދڦ '+D OwޝfL-\ _ky޻"wR}OMXB9Bv/xvvt{߻_3A@ V ŷcۣ!ʽ>]3ÐȞ34^g{ZɻA=K\$2^trP_p [LlLttߑޭf+Hϼҗ҆Mâ鿀ƀ:l;1N˳@yJ Y/SƵ ʷZfؼʂ ڷ>y%Șǔ{ʨL0*^ޒ^Xf׷c;ܟ l? Qn p{VR =  b<0  w ]  }"9 &B($  " %"+&&$)")_%'*e$0!454p#3C#2$3_ 5;7/5"B/%)%V&#P$!" %"""U!N f" # # #1 E%( (!!# !5 x{g& %t(O('z,) &,++(8$ X"W"+" "+'!#$/( h c"  @ t `lO $&c'4) ,00/$T-M*A+-b){0:'1%1h%\-O&'( .3y8::87b7: 8$6)G3,R/.>,{.)>.'|,$)_"%sG%n?  vr`  a w  ,j"D4##o! !r W%!}&w&n%+$. 'x/d+|/. 1-A4,35/0G3B9s0BC/I0K2L7L">KWDJWGI_GJFKGxKHJWIIHFFCBVB>B}:.E3J,"N}%aO /NKIwG"B3(9--/j/(+/(%E.y"-+'} :p  X m u d$Y  =4K @ T9(+l/x iwx|a 5QאXVΠѠߋ֜Pka(K+B_JƄđ;?eKuŗoA.8 4hdB KouD&d 10-rߋ(gL=4]uoS/?\kB>,=:;6ؚRԅی)Wik2. Lߛݝݽ%`/ 7؞Uϸ8ڹջp$-Pn`mBd-|h7 7J5 L v> @0jc>rؙAp7ÛÀK*"Y&ϗ\롮*'ӡơs;U9p876Y&2M.V/4&.8$0r8U4(88&729Q5892h8$/68+l7&4Y e0)7!c l [ 6Ef ? |OP9l   $$"(w0-;2 C55H7QN48V9e^m>^E1^L|\N]@N]PN] Q]T]V]V]T]%S]Q]O]M]J]E];@^D>D^y>%^?X7@5SO?L(=E :,?W6;14A7C8D:E-;H9K5 O0Q -P,N+K)J&J$%G$^@>%^9 %5#x5"5T!4!S1!-!+f ),~/73!W6k(80:7D=;?&09x0:3- .e),.$-j.v,$!W >": x' z]p H=2hYq,o=_&HtyI 6P0E/nՉMvZßԿeԒ`MD2e_[HKM'AlB,lٌMՎߡ6ͅQC_zϬϠo \% }&-7pl18T` o rSU/ U  r%&N  t 1m ) >?nJb߭Tָ%#Lƿ̾FaƈP; 7X3S1.g(!b / d 4!A=  J3.Szu;isR 3e24$4q ` v   p6 P2" !#(#$$ $(d!+/59;; a9%6*5/5 1V719'2=;v2:28817]/7|,8(8$8 9::;!'<$;)j:-]:0J<2?3Be6mD8LDj:,DN;C:BI9?6-@-OA0@3dB 6D+6~G4OI3@J3K4L4SOC4Q5XO8K+=H;BsGFGDJ@J,;F8@9:=v5?0A*-@J)b=%S:"7h!_5!1" -#&#" !13 wZ: ODZG;!nbls& L߹B,jQ8,ܮ8HsRY5%=n.ԍp8QWדA[ߙ %͋kr9Ƴ # cuŸٲdE;ٮb.o\(mաfءڇ5XǞ N=ژxM,ݴ3]:AR&LcB&xN#i.vGT0<h{%)~жzgl}5íݑSuBƌ6IZ4oӔ(WԌօO48ō^ 1oҧܮF:i(arPA^x7PqKU߯V8N8+ۯ\ю'ņ|ïP>œM ڲҽ =D#WѺEf{3L#: €*Ķͥ Lݘlڎ|K7)p^y8_ N=_+t  K i#r# q-!##_! P.A~9!O:"kl! ")4^/1 "/)d-.!. .`3*uACC c@#@=$D;'9)6t,2:-.Q+e/()1'q1&/%-l%o,.$U-"/!3h 28 : a; 8@ 6z6 7$"5"2".#.+%((&F*%^*$'"#7!Z n@X]c\E~' F qG "u\<#)&L(y)@!U*(w)b1t'9$S?{#%Bp#D$H2'NS+SM1U~7TN>lQDO5JAQMT NW{MPWMS7OOQiMoQMOLLKIqHFeDCA>=Bt9D!5TC_2?/;,9R'9"9!7G3,N#%%*%k#q8 > a`;\&][nWFߊ]}ڗ,ٹ֜ս^CԊŹBBA/̢ʨXOƋסֿ$)A+)!)p)(#rڡ5九CW Ï'[RJXļSƖpL5JB@S߆ވ@H)Q Ha*  ; J)M{"y[#! # ) U.*,.*'hQ' &< Y [mAvW'a7 &q!-e)U/4S/i?.mH/,N0PG3dP)5N4N*2P0O1Jy2E#3AW2>/;-8v)6&35%s2#z."*6u) /++,e+8'a#H"q&,/w00h1-#D6 'O@,LL56Up?WIR-NJLhCE>,<933,-(*&'H-}'3'9;%'%/D&&B$0 Q= w  :^P# %) (z2 *E;0-B0I4hN8S;\Y?2^;EA^6L^8R]U]X]Z]\]?^]R^]7]]![]X]S] M]F]B]}@^?=^T?D^#?Zk?T@M6CEeE>E9Bs8A?U6;I2R8-Q3+.+ *+w%R, +*(#A  e} jdO\|nf~_Bܥ}|{14Y6wФѝӦ q&؎W׽ڿ]cPe 5 `E=R'zsӠp4ۡ[%_*.ӺUf:];] ?]}C'^HIx^CM^~OWObOM:HIBECM>::04'.V(5$ 1j] u}3[^:Em>ih5=aU7 c&*(-1/8--@(qH""NQ O$BL'J(Hd)D*,>0#8s52z61j3&2-1)0'/3$O257Q6679B857} 7$6(94-/2+C6+<7.531[8/=.wB/II1O 4T4Xw3j[s2\3Z6W9T|;N;^H?86Bn.9B)?@x);*]7'5!6i:7540*F&$R&((7>&C%(/p<57#f7(74,;+C+*L *Rn-S\3%S:_S>,V@@[Bu^Et^K[QWVU WIVVOVVPT0W-QBV"OSNPOFLOHMGWIF}COF2>De:@t7+<482&6.3{*0?%- *e'k#]} 3  T c<CoW 5$;l8,4oHц϶ό ׅVՈ"ԐΦ͎=̊W^QK&®d; 3\'+MKtG-R*ݍZDלҗ{'r`3(ضͧFïӪͮ񲿽ܴ"͘YYJǿ)͐ԃ܄Q)Ox%#ecWz(Z4l9 )9mk&xbf1ԻfAe AĚ4 rd#ٽ EbڵgEF.RjӪϏ+xxê˿>ڻU) ; ōvƏrf$7QQҭٸB٧eտY՗|](H3`&ٺɐ[%m%ž/2є@̯zǗrģfܻݬ簋~eYTCL0m3˵̴'Ãy@FЙsrՕw å8wjWNWi޴ڇy l=j)0x"a%ne >W@;*=7 <1p=*?%NAm"LA`!A!@G @?M={ e9($<1(',+A.g-k+q(d$U &"#Z#M#{%),%,"1)'&.-'C0,02f07'091d;S4=B7A8&Gl9JA:{L;M.>N@|Q1BSoBTAT@RAQPoBWOApPg>QT:O<7J5C&4 ?11=-8= *;([7(1 (, &)!+)' #]kb g&BI`A:\:6*QoS-jۏI،A΃G˙k͇2͈ʦ`OȬR͟Ӣ٦Yt'}3ƑlMu݅%$kˤ;8ňs*ӾV ԡW02%u[SpEYAŀ>Οaöp˹CpѦ\R]#W` YE-16`?q/SM k o| x t`obWT[s8ˠ]w}ɥ;NJrWߔоëTq!7ӎҺUcuЅ˳̓ϬԕlQp-v|\`g\EטOڐ J \t޵ۢbMo޹w4L{ ߆R$61\,ϹFΖ͛Ѷ8þ#w-1ќRJѱ ¯;+O 㯝ش ~e W Žǭ >IɡEXѶ*_ĩrx!ވg]0ka}Wrr4sO<7^` i1J F"i$fx$^$ $$Jb#1!%'cO%'"y)$G* . y2[7 )={A E$F*G0D6@:=:=8|@.6`D4G4I3 N[1QR.BU#.U/Tl1T1U73pS5PX7-M7I8CE8@B7Z:h54u1z0,#,''#! ] L c7)< LW:QAL@ =";F%:x(7,40j/3B)3#0 *!#Y%)=,$v,+, / 0j n.,)"T t!c #m!""!?&-6{m>BBDo$H,M$6yR?wTGSeL.RoMpOKKHHCF=+Dr6A-<%7:V43>#7D9;= :'>6-201 0x2-0E*,m''&#"Q!   Wy"%M* 05X9`9#9R+;0?&4Ea76J};M,@nOBDPCPC@RIESHCUL~VM7YL\#K9^$K^kM]9QR[SZRZSMZqHuXPET DNPCfLAI[>Fa9VA5b;'26132=0>3-42*Q/(,&R'%!,%" giU 0t;#q1݌ݔiF{Gݹzڝ8Z`ݯH$Ԋ͕(ޫ»/ֵ έmI2s\ikC6E0/S Bɏ'U[8L뾳̆n)_R̓@Ҡуӎi,Dajr| :uS+rzXt Q } * La}!#f vCNrɧĞ5< Nr5cRHAǬtÕڒò܃{PʱNtzSb qʐϛѿTό07߹Ľx/ָ &̳FjW_Ϛ%(wޫNY ѡmF5[sikâr$Ѽ칻dﻓJUAɮQ}ùܺf(eJX ޡ)((V)$ (( %ئ$'KۡiЧ0; 8_§}vֳp.ь 4xDsλЗ^B2{ $V!  (b < I jH$(+7+h,pC- .Y.+.'!:rrK s e3  w"R-8StArG($L[*OQ /VU2WWv6hV0:vS>O_BMMCDL?JKW9GN0}@%:7j/)I& %c %&(%~)*x$<-{+/0/s3S.4-R4+.m19/+0%{0/ -)-&x:&Z&c&% " X  h J ( . C&7rT C.6$M-a5W=AAs\?m Z<#9z&X7)3-.20y*1 )p1+.;0*x5f&8#9]!67 5S 4M 3.j(!! $[I%I&'&:(&Z*%e$#!'#'!"1R 9 = >F#>u&Y<*9 /`84F889:";B<^C]VB]AU^m@^L?_w>[T9=I:P@7 :=543.~3+A2-223 86;\9]=L9d?!7A3 Dx/E+~DB)?(59Y)p4(3'3j%4h#3!3 43?"2%1(0-Q01(338p5>7CF;(Eb@FIDTKDRBT[ @^>X^&@ ^C]*F]G]WH]H^ J']L\ZO8XRkVSTRQPN#N5LJ(JG8GWDB@=J::1:Y):;%"s9.4l.i(n$/ hms3W>X:  9Z w0G}ܵ+9ۖ?أ@ҺP˰Vj7ߘ}`D"K; 9#y!ϰڍָ4d;2&uËq&(KX\ɒOC% f(op݆԰2JUʈnJί 7緓8͵ʶQុuxQpݔNRԊ ۪ݭߺ 67N.Rr.R^url*t.ۏ.YZCa͜˛ʋȇϱσΪ]gػݧ{e3Yo 5L'γ\0ȃ)г%ȤLS?YB1|ֲHWjթySw+ ](B0bܼ,od2PГבfհWH՚ʡO׍]DzfYÛ¦)ԧZωrϼЂ4 T*|Z(еužmzàÄjO;)_ٺʹlϪcN©i{ܦh$6lɭ(Ű- D@ɱ|LйfϽpi>ĄΞ#'&*N ++_"u+G$,+&,Q(%.l*.+o-+H+)P*J&*#*n+3,,r,^+~)x&(l'#K(%R*&,%U/P$0"2!3!H4"3#2V#n31"5a 9v=LP? =D&: +(9U,=;*"@(3E (I9(LX)4NV+M-MQ0M]2Nf3O64Pu5M7Jz:Ee;D8F?4XI/H,Dh+?+<+R;*$;{)9((27'y4(2*2a,l3,4w*4(3=(1)W.+8*w.'k/(B-+)%-&,%*s%)%($')%('W%*[#h,#+&s))2(*'+'*-(0(3)C4,1)//1/233/7<2S:_0{̬bfHMˬ̹Rђ,VRA01B])3T, ުNF۔8 !m,}cZގn8 ןE^,L (bxzCd`bv߯ ʮʧA0Ѱ];tبuFھڔCcʋL~zޞ_0yys-҆BЮ͌͜$5Йл,20ʪBh2TY(8y?|<Է:#X'ٻ0؍V}[k#Oжu˼iݠʤ٪ւҨY؎t ǵEiΛϓҏHӍQ#σΫ1 ϮѠp0ϲƯƿ^ɥ{XhBGNP|Q~ [. `gfAP5!" K  VY px#c"'(,H*2(P:Q%B"J!P"S#T$~T'S9-RZ3.O~7{L8MJ9Fk:C;@=>|?=>>h:?3@k,@U&>l!:"7e4X0=W->'*>&#W"{R$'-a"1%`5*7.93n989:9;];8=4?/A?*<#95 1-]+g++,+_#**(/)1,O0/,0<)2&4%d5%5+&x3%O2J$ 22#k1# /k&S+*o'V-%-')'&<&#""  `0 !03g>j" &n c'. % "$!#g(+Vj-,+*)j%o$+& *w/fH3B 7v!7/y8=.~0-2(l-W!+DJ'Z#S! ; " )04c4J1!.#. %N.$--#- *&,!. !~<#u$ Z%#1&"'t"4*"],_%,)+.)5' M3?*O?M@J@8I?J;=M:M7 L 49J0Hw-F4,fB,<.(6000-.**'%$x "6 #'lqO4IsW&hv._S6a9*>T|QøZ{©IY̴ŜwP#ɢ/9ӽ$M;U%ȯKҒPfևe|٦QڅM[0W@?|:ޮܪxҼB7 Ǻܸ! Ɓݯ\U3.GЕ_ WUQyN.(ڤgӉayX>|sYǹ,~ѠL!"O^5\͟nk&q/Ӑ֍A`e7;L#)U (;ߵt}bij߉9ʼ־aգßհʼYڋtjJ?\iqǡ*‰͓^ Ѻ`(7δة22[3`?̰[ˑ(ɐkHlEHs\^lr{%̰;͡/棾«ȻʫK9Qˈi˷n̿|ʛ8Z}׿tIDI3m"]!v^L, + Uv  83z6}_ Z%T+1$9+AB1H5LE9Om;S<7V=3Z=<^:g^6^"4^3Xz6P9J:G7G2YE.@+:(+94).'(%!$m#(!yu   kf: C%u#Q%*+l0>1336 3i:Z/a>)@#@<7n 2!-e6': "_"=J%+&27.27?4|:9;;<<>:A38VB4@/=)"<"<%;z716+&$"<"$! ewW, Q!?Ab! %)D'A((&%!%$G'%+z&,'+m*)j-6*/v-;0120|5J.6:`,O?+D2+F -H0G'6H=MDTK\+O^\M^H^A][;Us5_LR0A&,6F*,)%4'#"$r)+:e+'|)[* :1 ;&DH-LO1Qw3|R3Ol2MH1J0.F/g?.8-:4B,2*74)6(8?'9'F:))-<+l>n/R@ 5@;9@hAA+EHFGIJJ-NrJP,KVQ NP+QNU M_W/JYEZ@Y\;[9Y9T;;N=G?B?;>?;<:99J56M0Z4*1d#K.Y* $#U'1 @  $eD thG[ul^ z,OУlk#½ȈnĔ|U,o D ɵΜңYսcXKy&j܎ضțӱ҈C:~ּޱn5HI[Ty {W&e m$_YϋWТc՜ϲ\s_}WF]+кQҁD1 > Y ֆx Ӣ8s pĹb՟F'ׅ$vLMl;ػV4S[cE^$HY܆g߾gHʐȪ,3|K?tVžqN\ɶ˧iNHIK_QF?LӶTĻDZ0۪Cb᧾̌AɃZW&°,9б-DŽ+š˭οD5dWѵ`KȳxgȱӯƱ[hHj?5ϕ2BCR͖ MKLc-r/L@K G ;H $ e"+zo!&#0&7*;2<<;G8vQ4X0].^O-g^.d^0\2X3#T4,O6I:Cc?=qB7WB4?4:]6@3p9L*\+=~94P1p.~,(7$2JLS> F  e 8 f +(/4d8 =@%B!+AG/4@1=/3=;2c:1:m1-2@j2C,2hF2J*3/O/5S7Ya:\n<%[>VAPGiINCMS@S?BQ=M;YJj:F:@8;;;4:k-;';!<r;w8sv3', %:"i4%){&fp%"{:<9YN % &!] !f -C0 ?$!1(!+4!i.{!1#4(8/R<4?87C*0B2C5 B9?);5?:2A8Ci6HE!5#D$6 @#8@;88d794908.m5+,g2')1 &3@$G5[$N6%50(}2)2{+5B-9/<ȄN4߮Rf" 5xaN(/)kc/u;Tvr,׫|-ݡԒ#ןИڈU ?Zݽ͈ڋ1Mn ׋كףDOzՆl\ԁ<+Fwךi؜׃￈ͳUJZFˉȺALggv֓ÇYMpm܌=G۔_ׇԩԼcԭӌϥGJւQ߼սݯ-oӲ̟_cUd^RҒsSv`׮K֪FkvJc Zl y%L  _ v>)5m#+1o/6 9M#:'=G+@).D0GL3GP6F9FS= Iw?tN~?TFZ9E5D2MA-1`>0;/F8.05-1+n.(++^%N("&-#Hz!LuR9   \ 9 ? z  ^A :  z g8!F3 I=#n}%%j!#$%!.*=/3l6 8#z9':)<4+>o,u@Q-%@!->,M<,8 ,3o+2/)k-w&l,"*+h(%^w#E("R!! %!o(%()-'-%0#0 $0%/(,*)t+(*(()h*(+r'`+5')'''%(#7)=#'G$0"1'y-*5++`O*'&$/#!#"#%%(&+e&-&.5'-'+&''#*g+, A-,+B)0%-! l"|$~-&@'&%"V[U Z P :`DAZ&B! b JIT&KѠȞ/5ղtZҶ}ϡ6uաͷ ε}i.I޺¾^&gYX弇Z9V0xO=➿$(Pb͚ko(N [U4,ߖMH*ܻU/egӭ֕Ҋ'ҍ9͞OˆxX޸`HӣUÚMx)Y%ܡҬ!@f $'R`ʋγ僺 іQfA1!v-#FTlG>Lf '=qݾc+ѮΪMΌЄxԨ[j //߮uSo\NB[݊ γAKٙA/6̂ίόtϊ# MĦ;ŗɎ͒1ѓhӑډՊGؐWں=)қD ʘҽ;ЂcV2-~U2;Tb7Q=cLcEEK*@M=AI=A?{8XA/|C)C#FB?<:G9U6h3t|/ +%E$ !(*-V)#%" A&B)h,s.;.- -5-D-?-k*j$ #(A"Q')V,303y;$$I-&b)P#-*329:Z?BEFM8GSCY?Z:cXi5jS1BL.D-]ݬiمa٪>ְ-el--q9b /mفܷ.`zf@Գ!iȊ:󳶼zeݰ٬!t)((ס)")*bΡVСjײ·LJt?ϳިД6շM-as31NaXA N ^ 9 v t >F[m3,sau!@|7Yo^ϭ̳7Ɂh ͽ2;BѸN,t& ֓\ؽ2X|ՠiҘ-i Y 3ڽ\IJ^ӡ]7S Ph_fd"Y͋ō{?ȇ̼ʟF[ǔ ǥś :¿ȉQʕмн4ƵdM>ųǝU4H" ¤ײMˍнSײ,bU۔k/Ap4Z|o6 wq}# f0;;0E!M]$@T=&:X'ZG*%[-Y1V5O9=F:M?N9<5=/?Z(A^!BHB@<853:32/1.d*% 4k}&,0 0 B. -"/"0O#0#>07$=0 %V0%M1%2@&73&i49(5{)8~*Q:*:5*e7'0i"/)!"fw, %\, +;1K::Y[CY_L^U.^\]^]=^]^]]]]]]]]]]]%^]^]^]9Z]!O3^Cx^;J]4V?1NV.Dl+"UyA YxD1[CG^@"^;_^n7^4,^3 V3pL3C2< 261/1(0$G-+$(,&w$(p"*#.+$+&7.L'3'j:)?-@B}4B[;B@CKCCC5BB>GA:?7=6;5:39q/u8,6l,1., 1h(*2R%0#3/y!-+)?v&P $;"9"$!f' )u!+'#n,&,t*5--y-0,3*\7';9a%R9"8W!6r4,0*+E$ek)Knl , w!W r k  3'WSvbƱs^ޅ=ݝ t֦ءzqy7X㦭ċf"?b}đTʵ%Қ֞z9dd^aƞN-nͪs,ϛN. lԬϢ҅"c%ۭ9ىƎ\I$u='r }mƔ”>Ȱ܆NͤͣߚD׾n(c} } Jx$^,, Z6P!ZA!^J#AO&dP+O0P1,S1U@/Ws.U/QW2kM5yI@6Fg6C5rBJ3Cf/WE+#G(CHI'H'iF)B+>,w;U-l8P.5@03,2242o30M6D.7,Q8[,7,7-89,S:o,:,:/-9-8,/8/8h/8/8092<1?(0B4.D,D2+D)C{( Bv(?);*7-21C05/R8n2979>L:E;L=T?\@~^ @F^A^8F]L]T]Y]]^]B^] ^]]]"^]l^]^]+X]JP^HC^A^<`[9U 7O4_K1G$/+A,9>, 0}-1&N/8/j,|&_ \1 Z n  | 0 f z F 1 > yHN$ `'(  r a"6@'-, {0!2$f2)/x.."0]/b.Q3*D7 (9c&9%8%8&w8'(8'7%977#6 5]6u634a/g)%B"9[Aj[*   _  D~!T& +1z&5F8:k9X7$5*w0[0)5Q"N95;E<P;$7 P2c$*(","!011 1 /m , .)&N"eH!J$;$\!NM[[ U- #5 0 ) W A 0  X >R Yh+p#fۜ҅OſJ7٣|W;с0ȪǪ}1;ľr2ƀɵͯcR:"e% ڶ3wO΍0׽"\Ց>ؗٲ\ڰĀِ&'֗@ךo[6סͅdɪ7 BLW0ټ$=>⵳*ИWy&q}gm.̊mʢQԫĺơ|͡ϯګx*m(j()) )С*&)¥()Ʈ 顰á ǦT5fn Yiz9֭ڢlޞ,Dr3bA:; 2kLKKG>*gm,iA($x%ݗ(yڃ!ܷV -d&6@'; Θ82^ٓE܃-?8LU g|ݠLѺ<_۽1ϋ![ Β+αќ)տWweD@)o߼,$=i6OTy' Zgy \`")[/35#7F%;%?%C#Ge"%I"I[$H&RG(mFV*E*ND]*Bg*?*;+7,|3+/W+,)+&E,#,)-b,-/34 7>9: ?;';FC:q"7P'4+/X/,1*2+j1./]2.5,$9+;)>&A$C+$Er%E&fD(6B3)=3+ 8,2-/s.:/.1/3Q/4.05$2g64F8Z6F9B2N>\); "73.2&+=$ F@ . GVLA K V  C 8 Um\ #   u   )7 z  WW $5 \!!!'!."u5%95*r;B.5;V091 6*415,5'2"-T'W#])p b\ k 8 K:k#"*%.*82}168:`?=C>A$ECC#Ew@E;E5E0 D,l@*<\(:)%; <;q781*[%]# "& ()0'"n`( C" $_'+K 1 3X1+$9;?;[!$Q%%7$~m"aHy Z7VSZm_}ȴ,ၼشחQ3Cՠ'ٸҏ\mdÔŗ:ʞM_UѬѤF3{ѝWӂ.gI%;jiو Es͜ːP*B?؏ɽ6L ڹz %э1=ѾBŨIƹÑM̲W֘"\ut,IȪ}÷h &qQ&)''(())**(('&*(ȡ(y!ˣmYYQH{t ǐ g"j9VrT p{ #   RBzz 3>|qc QL?1P#Hۦv+M7ݧ-L\7'Ys a/۞IScҷpNڡZ 8(ۼ\dnɯrV/1?ּE,Dܐҟ؆37J^9ΜeXuڰ͹NQפΉРќ ܓ>>ˡO7طNˎl9Iu7Z#6X*2 #'!)+-601r0,V)&$B$G%$ #< | ! $H(@@(9%"d  y\,?  !#>%|$u"u") U/ 1t"2#2#w68#:#0>#?:&>* =.;628;q4<(5?3D1G90JG/D0?b0#9.N4*[2^&3c#c6#9'<.B2K5#UH80\3<^GAc^E]G=[6GaZD[C]YD]zH]O]5V]\]^]p^]*^]Z]W]_U]NT]/S]Q^Ok^M^~LZKQJH6HNBC=XA3B#u>hmq|I3z}ωȧ)IJB;Ͽȿk U~;"׿ږJޮt~!7#/@a))=b'Z#Kج:@ʹбī>VUay3r÷50P;ɶHϵvNԱ׷+ٓғڦt؆{ڨ{24~nAR:Կ$RҀ֖ܔz6p>i +9W t3 #Z%xr&'Y!)"*#+;#v, -K01!1.vk)%q/$$%XQ&S&I%-# *"X#" &"()"Q+#+&)K+'/#2 3479;\=>@A#B(5>>(?=A=<*D;E9F6EH]2!J-;K*.Kg(2J(-I]+]H.IGq2JG7G; J|@LDPFTIXLZP[rTT]-V]]U]R]vO]K]I]G],G\FR[~F[D]B]A]A]RD] G]I]K]N]Q]T]WU]U]S]Q]N^J]D\v>QZ9?Uy4yN?0F?,J?(8&3j%-k$?(!"%#!:N%9 C^ JX6p  [T$Q# [sq/N!<"7S#!$E#$%*k& 1a':6(k9+:.X0?. >-:4.3q/,/',.$|*T#!&!"$ yJ!"!& c s#X$$%$ #'$ .&4)Q7G-8//S;/@0E1IH4J 8F;A=;?4A.A)S@';(n4)j,.)^$'bM%f"!cjn Z\ F  S%^VQ-t 8+?l[  & ߁!$г:">JUp -֓&S!ոr-:ۍSǣr+JmTBзv_ɹ x0ɐ;*Gļ+ק\moŐ.ؽ>򴒭 櫧|޷¹ /f69mBPN"%+)J(6({)ֲ$(E)*_(7 Ź@¥nJiƂ۸컹d ն5ՋEރڌ O= g6IxncL!vxgY_jdp8c#6 R9[Bgw^[aW 7UQt1 4GIc.lɘxFȴ-DžEƋҩƚ@ŗȆRpesڻ;hxf\eZܕ^q~}]0-HWx?YG+;" lm_"%"$XC$ !F l LB+! v#x"Q\5} R !`500   : D9(#),.02J579+!w:W&8,7r285<6B5F6Ic8TKT:M:LQz9T 7W5 X15V6T98QaWL@mLcBSxCmPGLHIZGFEDnD(AD=jC\:?K878,9 Q;L:f7-.2} , [%X  &  LN iJd7 f J e> X O r v .n"?! rH\%|*!d/K3W 65 3#>.g%($##j!M=p k:.  H&Y! 1%$ '')(%(),j(2'x88&=$<@$@G&Q?(s;, 5n/i,d1$1^{0-)V$   .:  > m% e 9qN! 3|dB%y Bg& ڤIlS{4ZA=X{\t?F'FRMZzD%1or۵ߴQ?ШJҔɳaŎйԴ 䰤yٯmү/Ƃnɮؾ"xsjJ/ìͽ)x`uQ̪ǾL>(H>񡓬[C)X()*آ(~)r+A!$\ʐi˧WɗWƅsQ[}GK?iM>N<"O:N7N3N.NS*M(L*dN,Q/V2[7M^<"^B]%K]R]\Y]]]R^]^]]]]]]]^]]]p\]5Z]VZ^O^OH\@S9-H4<14Y-c/(. %/"1"G3$ 4)3-q51f7487,:=:;;>;BB9E7lF6F4E3Bk2>%0:-5*3'1$|.V")Z!"k!!'R<\ck{ R3  Pz [bWBGQ{G]%tzq 88#z$$%4!%'V&/'J6+A;2<):;;>96?s/= (:E!G6D/&R;Ly u? CfyM R\   ' !%x)',-/m%3,75;?^AIGQL6VPVSS=SdK RmA OT7I.`B': '4`/[*#u ibR!j" !j }7! p! j pcVb~v)ژhh\ܖbޘߚ,%-9fg|V]49[2 nmGC SpY:Lh_n @>{ǧ!Ѻk͒S~3/n鰘̍`(ǥܫI 'U\(fhc̮ǰָG=£`!ϫ&֤!vͪԥ(\)p ) *)(@ZDaAIAGMbC[MGILuA3R8mWU/?[)\](](\(Y),U+P0XM!8J@I(HI7N LiRqPUKVWr]pW?^U"^Q]>O]mN]_N]dN]kO]Q]*V]\]7^]%^]]]]]]]^^Q^6^^n^\*[,TUKNP@$Jl6xD,?#:o4."+y&e+),--2R.70V:a5: ;":?9'B9kCz9D8aFM6JH2dIv./Il+F*lB+=-:/8/6/4.2y,1)/L%. -8*&"%  O    Y8 z]58 @ u&zPFM^s!#%#F')#(.(1);4*4+3Y,/{+* )\&&!&#$& -@GI  K# T' { z fL 44[&$)* /R$3H*w6~1k:U8>=B@~EB2FUBF@MF/Og !C< soOJ}to)E 0C p]:s  ,,"Jt3U w~ HV-#,d鍾酽6ܾ}v ̼͑Pʺ٤Ѽ|Xá(((d*(}' סgueATXT #g'*ʮ((p*)¡)֡*)%(() (()u*^ѮڶPžŦdשZ2שɥ@$pD% ӌbҿlЇ=}5֎d:!МՈ֥՞ -/l/zXwe'uK4AwWl;>B+[J r O9 C, 5%  oMDj b:"UBxݓlٚ (q`˷4 Ü ½⿬ʗ̡6Tfzӹp֬Ğոh0ϕ?ԕvr1=r=g\Rs9 R  ck;p= 8w[.f8!?di Z7  j \ P w) X"0"(!5*XG2P8 yTs9!XV5tZ2Z 3Y-5W8NUg< SC@QsDQGTrIXzJ3]cK-^K^9M]LO]R]V]Y]>[]Z]'Z] Z]E[]\]~]]a]][]X]2S]HM]F]A(^=d^<&]&4A/C^-B+@+3>C-#;F/18050Z3H0V1G//.-2/)/$1/6-)a$-*6-u ,(N@ 58 %0 * k  %$N'? CZ)N*!l"J2# " $ L[  J  j ! h   o  5Xjw"H }  ESuvF$!*>%1(i5F,70 9:38:69691:)2>'+2w!G`2U~'=/d37K±|m}U1ۺ o8A$5€iŃ 4Rǵť߫bXۭzE|¨4dGӮ $7ʰlOҳڶZ'7*V)QM)**(()ԡݡ R*6X乞\ҎآS:%!IԨז0Ѫ^R֐ԝEKuÈ ѐ—ΨL̵̼}z?ZbߍRR+Wއ"ؿ b!O9Ē ][~Ws麶Dz)̷b++Nur Ҽ'@2=I"#& b%,"-@ ]r ` MzofT3S"eW6t4#y)])h7 xK  "    K# ]&Q 'R~(c*. ?1$3j)L5-7u1R:39=6?Q7qA7gC6"F 5H'3KU1aL~/OM6/9L0/_J/SH/Fj/[F60XF/2F5FJ:G|>I;AO}C=WEv^WIg^N%^(S]^W]Y],Z]Y]eZ]G[][]![]DY]oV]S]tR]R]R]BR]fP]M^K]WI[FW$D6ThAP|>AN:Lx6K0IB+D&;"b21$*6 $bVF (wob"!'0&-;*y4|.924xL< KA  G F m z N! {"F!Yg $#&&y# T |    4 a q "& l- C Pe H C; X  $  b$e #Z$z'&z*Y',2(.)`0b-12D39'4@5nHD6N7gR>:TyF(  }*  % J X ()HL[ e DXv;t,Ӳ^Ssbs:߉§ԏWq`׼V.j! ĬŻ9ߡ.V·Ƽ̬ȷXKǬ_Gۻ(ġ'֡Vڦ**()*( )+ ) )*l(()Q!_y3иݬļjg JW˿A$i 351{էTV1Жʹcrʜ\lIw͎ˎ3ׅϊaѿg6QF1ݖv5oZDFB%T*[v{׮zܺ Yx mt   7 j s/owE]Cm1׏ݮ~ؙq>)iɶ8~mPrūʠJ Pήp_,sѦSn& q( g 7%6*-/!/~,R(-"w 5L( ('Nh kF+C"r7y %|7IM- # & G  #l)T/4b8;!=&?g+@/?@,3@5A7C97E9;G8+I8KP8kO8mSD8V6`X 4 Xf2EV2T 5SP8jT;V>ZiB]fF^J]{P]V]m\]c^]-^]]]]]]]]]]]]]]]]]^],^]4\]X]U3^T]^S\SZUPP5L ME^K?H:D7?5;1v:-p:J)9%7#*5a"1"-4"<*) 9&#"JE s${O  $Y&fF'&G(-)34*o:+?-WC/E2G5HU8LI:H =EV>jCM>SB]=fA;I@p8>G6<3?;0:,x:"(29#5 }0g*##w45sY 5 A o k - t B ? . N` vN iWc! vt"j$&") f o N K} ;[' iNF>4  *B* *%+303z2%$1*02#2l;06C;KAOGNSI-U=JMTG3PC,H=>34G'y+3!6 i{NފjIВ|܊ٲBд>?θČ*6N փwֳE=vz}68[5#/1hdJ & (n*)()*()+2)i!))((6)#Ү 7%򰩣EafWrUg"̍hŹׄoMӜ(.:?sC#:֙tBќһӝʎՇČ eO!^շTs (;Υô>fъF֕ۿJՃuvFܰ@ޅTINj6:L(k>M P![ z    QJ Hh 9Fo5upXz &Za NڼԢāͽ>i1屇徧JUW€k%TZ%08|OC S #C (`Dt  A" a[v&'e9*)r*)oL?|?'] j _ ^ 1 " $$$ #%(0",&70,z2184q6~6?9:9O@<8F?5K2O1CP0=Q=/;R9,zS(R'O(^K&,"H/F2HD4>K56N9P@RFUHL9[NA^JP/^AQ^vR]?T]V]Y]]]^]^]]]]]]]]]]]]]^]G^]^]X]WR]L]8F:^5Bk^?l\?Tk?N>I=EVF p"LI/i 7   ( j/ 7 D A~l&[6yBK.N9M[J5Mb/8ں.AvնYϫƹАRCnh"ЊjƧʖ=x<Ƶi㽳ڱBES-@ŵOƦNġo7)ڴ*)^([)*(&)+)#=)ҧ)B()з)ֹ!(v;?ԭ嵚,trU JDZÑ[Yԃ8?4Yzrx;&z,b gFm Hn(6oí,Szƣ<ɟ/ȓ`I`<ɁRʖɋȍMHԮO<.A߰~gݣ$rK8Z[Aa >  "dyPE , g-!@= R٩5( pєՠGl+S(Y'Wv :{,=5FGn'n  . #u H !T ^pZdUf߻O:83z=q<+[c$ (6wXa!$#0*&n.S)1a+3.13/9,=*V@i*A*yB+B,GD-D.Cz/1C.D .0E-F.GB/I51 L3N6R9XT=@^17325.;5S-3,/l,+>,Y%n,( E, \+*#*3)(%IP i # H`?N$1*/657;!B@z%TCy)$D:.C2iC7B6@A6B~6C6C6Ai5@G2?^.aBW+0F*Jb,OW0S!5gX!:]*?<^C^H]KN]T]\]]^]8^]]]]]]]]] ^]/^]]]BY]T]OQ]O]KP]4P^Of^N^ N(YMQMJhLEHSC@C/71C.dB(@a%>#<#}9 "b7"5)"3{#0?%,[''$)p$ *")#'n$$%!8'(m*)*'G$?u  n"%(r!+(.008n2@3KH5N9Rl<[U>@UuCT{ESFeREODKCF@T@(>S:3:541..0E'/[!`.@+'t$7"T+ui \O$:'fr }TD2t ]  / 6 *  ,  cWm*h'{-sG( j w|]?&e~*37"7M&3'/y'+'%'j $ !7x,)6!$ 'g&(3' b#Fs 9QXW` Y'r^T 8f@7xEw  p02o 4  "d[| n NWgI){!0%2ckE;ҭ̊p5_^Ȍe@(ĹjV; Mwğȿɶ?ɣ1ȍ> VHw2ݴ񴄡j*p(()(ѡ()**((&&**((ޡ*))Ү*Ṻmºc"޺E\WX]ڻҰܣsؤI&(0nzy0@ky(߹ޔHq%L W;vw Aa/MHʾ;+*A>NǹT'Ӻr5^$M]H^^h}2wE;O/_K t e> w !V""{$$'a&`+('.p,%001(445996?5D5Ho3K1LJ0GKq/&I5/HN/II/M0Q3rU7EX}>Z[E#^K ^eQ]{V]s[]y^]2^]]]]]]]]]]]]]]]]]+]] []kZ]Y]7W]GT ^PH^N^L[=KTJLH8E4F>C9L@51;4O4T4,5%a6!5 ?42"E2$|0&/'/M(. *Q+,&_/"&0 .w+(d% >#:!$k)gs-.(Y.,+)g%hL J q!" LW#&= N*!/l!26$ =3CMH"wJz'K-I3J9wJ?dIDYGID"J$D+H5D{CD=D7E0D3*A$=!8U4.'! $U(}, . ->*6'/ S#+7:  $ <2  6 ; O2,zGrl#݊ۅܥt.XEw" 29@aH1) <Nm\ Q i    OM @UN " ( - 1103d4D5"&5.554Z=N2fCp1G2F6VC:=>6B/GG(K1#,OD"cQ&Q/cQ:R5E1SNGUUX~[\^7^A^^^]]]]]]] ^]^]\]Y]W]W]X]:Y]iY]$Z][]s\]w[ ^W]rS[OXJUETw@TT:USY5P/'N*\KG%I@!GzD? %;"z7$r4?&D1&-+&+$+", .80R0f/DV-E,E ./-C* &##%F"&f!;%!m"!,!!<M "7l(@L,"U -*Y#0$&3) 5/54586{;74>7@5B2D/NE,.Cj/x?2:.567[3>:/;,\<(;%9@!372AT-'`"Y _ w ^  k eU"Z=p #'ls߀!3 b֯VThY+f |FKc >c]CKPbR 3 7t .*$V& &!'%Q"t""W |"" W & $^ < OuZ,{qElgMdm!4%<#r# LBO! v݋(euAYȓ4UjƖfll̙ AʆȨiǰIhʡeTֲ@ȗw49uپD˸ѡ˰è #(ԡ)**(())*()ա+)`)o*0( dZƤ۶(Q%Ë_6!ђxaALCդGپZf~Vg=SXVc1rډ6^Տ,v۩[jG 6 o\,Nzk/?/Gd%yǺM*漂 `Ī˵Zbmٔ7&ף՟ @e1Xu-!L!)!}" '$+4.^/O11R0<e.i!2-$+l&*>)),~*/N-21577n>:;C?HEPN:KEU P,\S^V=^dX][]I^]^]]]]]]]*^]6^]Z]V]fR]O]`O]O^UO@^NS^MX0LRIN8FKAJM;WK4KE,K%QJ QGkC?N= ;5G5M6cQ8Qd;Q=R>Sa>Si?N@&GWB?B7?3R:)2-2a1*.6$+.)&$"\.>fM"  iJ mNC MOeܜ`rۢM/$܀ 2N/x\HfJx)[*T( b O%S,&10 49s4>2GA:/)B*A)%>M:3+#.0w0/ YwKDijZlsb%#ZVg g$sQ?Jۨ)="HֲGL)өͼ6ΕTɃ|Uzƹ6-Ąljʊ8ڻӒNרڿҳIwh5ζܯײ34t͡͡(*)E()(* (!)+)ϡ!))(&v)b_åe5d˪̋M&АΞКPҴ]Tݮ] .ΩyZt:Ҝg. GOhISڲmHbMldʧ˱))!Џԣڪm}8X36qׯAԞʗẈ̂7T4iղCL@Z$G4 tJȦ@\3peԔ D̠Ѝ?'ԣ"#2t(y  ~dk!^%/(:,+**,/K!2#<3$w11&.&+&(%O%#w#!N62  =A+Q ksjٿN.϶bݺ ѴόdC(v֍xIlMyB|pJ # u2 B  I q Q 4 K .{  -  z#&}n'&&q#!+"' R, /" O14?K7R%8 5O$1&=.'s,&^+&)'C))**`.8-0307N6v<<#B`CHIO)MXXP^Rp^jS^cT]S]"R]>Q] P]O]P]R]}T]U]W^.YC^eZ|^ZXXTUQPPK+PDNF=N5oO,P#ZQFNIB#0

3C.7G:IR>I@IA,IXAH?H=F;'D8bA5=29-6)n2% -R$&# L"' @j8 e, un C{(mRT X0 TݡNاڃ7oϫѧф,6 Ӓ%_~ ! 5 !'/!5%:+=83>o:P>[>=q?t:>5;p08*4#&0b(_  }I8F.2ZOe 7ܘܣIuV_<b]8X|ݠO @ee3#ؚΊ[̍˙̿ӼaB"+M(>`=3zٛ[}-مN˱Ƒ;acҡJ)˩()-*ۡ()+))"ˡ))((έ)󡑮ZʪiWѲh7z§pĝ͌NҞQx &V2؃xٽwOکiםJ7{ܶ$M+f۠ۖ\ہܫ@؍ԥӭGlhK26O`7֒lf |0 @q¼ǃˉHپ#(^oÞͫOdͻͺlAdSݬzO)X&Q'6 &\2G<C!I$*M(0N},L@0J2,F2A0>f-r<(S:$6 10v,(u!%3 t'j Rx=| eczsKiØYm([ٸf6?TBsqsR n.3t  m  Tu "" b(z>gT!> $'5)y( 'A%#rM!<#$K$"#\&R!(H)*j+,.o:/ .s+(q''>+()",,'/-'43:9A=I@QCtXD^Ff^I^+K]N]P]S]U]W]Y]\]^]^]]]]]^]0^]]^gZ]UZ%PWIU B~T\;R6:Pj3LB2Gs2B 3>3;p383c533:1%2-0*/ (Z-%Z,#+#)W%('&+#0 O3!5g5{6{7j7 6#3/&D1(-**,4(r-'V-(,(+ )*')c*)(6*L&,#o- G/^/X/yk/V.\,*$& % !##"x"X"o""F"1/##E$(J%-b&3(.9X*<->L0>2E?5>7=:<=9>A5oD10#F+TF(CX'?'I9(612)()(!v(&$ #C# 0!+R  3yip tR%uݖNۍ6ϵ̵!œIѺGKϦW}Vڛ:@!ۈ(Jp\k $')!p*)*0,;6]/9N4:<87?2@+BB$B A;3*!L|[ ;7 G{;z\s߀6sނ0ߒ]TG`/+- ٤>2 ؘ"؉ r۶ޜ٭ (= مkD8όڰͷnJȠܜȉ۰ټsת ̖ ̯ˑ@@¯ō9@fuBx]С⫗ڡ5(")ͫ+V)#!*(F(%ءТ͡lӪ\ܬME^z4AʙFұփ|]ݔk޺3zѿڳq۾ب۱( 8ە_ܛrޗ` neֈ=ٙZާݪ܃[ہ ۟pڄg]p%٧ֻp+qcݻڏgݕJn}EB-dqܬ4-Ԩ|ȥաl1<.\HǫA˹~M *7WÌÆhɃШf! {)O3!)<*OE 3L95R?VC9XFX9HXI}UJQJL$IG4FAA0pߏqM`jE0¤ê :2ܸ]G^GD " vV"%'-(e`'3%%%B#&(&%& $u;$$[%'h([!)'.%!> OmiF(*H O+MH0 %Q)@"x. *31939*@?&~(=)Y**( }%",b"h*(Q Y.v"v3$8&>X)B,E0^G4G8FX=CB?E,u 2"v6$^9]&;)9=H,r=#0!<:4::D8P9r<:x@y] ˭XO?՞cw&csDwӁ֮U؏^#Z Vpm Lbވ@UٚӺ' GK,ڼ󷈿S$x; -LpE޷wF F*d"B7(/B9LATH9[N^ S^U]SZN|W0HVS@N 9I91E)7>I"5,%# =y D>2Bxwl\؎ew"Ϩ=5΄7p̊ƹKWO@4C]Ws 4H ift #|!&$)&+,Q(5.(/k)/ )4/()0&1$T3#)3$"1!r/ .7 ,,4,!+\)Y'\$8"n "p#Mr"#&K(('k % ! ;   hu#('*J(.140:\3251f607-7++7(8&8%7%r4L'0)-^,+=/+W1,2/3142-5'4V44K16,7J(8=%8#O5z"L0*$,xn'v! !&&+-145;<)7D7L6Qa6T6wUT8U`:!T}I79HH5F'3B1|>33:5V590g=',>(=%8$/ "3>Z_:-Е7qNסev͡6|EgӰ9ܘa\ߎIC; s I'=.!3t'S6j+8>.90t9J3P855785Z: 5;5A;73;&:C<<`=?=kB=*G<&D:dAf7~>3<0O;V,9)8s&7#6{"65!3!2i!1'" 0"-$<+%a(=( & )'%'&/%&"(' ')H *{*(,",&",+7-.o/01v2B33k43546A472~8/I9,9#*7)5a+1,".{-*.}(`0@(a2t)3)4 *4*3,}2.1/#1q1.2*3m'n2h&_0y&.&G,W')(%M*"m*('O&%#T!& z2%M}p p""$N('.(^2*4/56*6<6?7@D8@8|@8A8FA8DA8A7BZ6B4A5U<45~3.0%(6sd KK>O,HگVP"oۧolNj=ÑKѺű ˰}5dv{j{w8 vE  "g (2*,C,,U#,',*,*,*,5*h.2)0M(63o&G6%8"&999M72_+#L .کQZ:~A@*tȸ˂|,"iݹ:öڊڐ ?pȂ(տ&~߃j.>)^Նy؉t-J.ք=ֹ m φl)[ȸJĽ3ҡ=)#eɢإ٢c+[ +ҥޣpҎb_ϱ̇/ifw{e̞$c<ק0уp6І@҉߂E׶ց#۪ϊqKڬM؃^O3})¿xa=ӱÃiD˭ϼ$ѻŁ$`Ғ:֍nA"ʖ~ʙ{˶>ގ M_Pه)eܶQb@I-ܻUϻٝD|#bW޾޾Ϳe˜Əmص΃7cBAߣWtd"e< ) %.#'7(t>,HE/J*2M3O3Oe2lM1H30CA..>+7&1 :+e$`K; t@Olj#Nd|KfNobp[ ؐ-بaBQ8g<> &+c!^/<)203'75;6;![82#4$b0%+%&#o"(=SX t, $ S ;"$'!,.(2/C75;_:?>B'BDTDE|E GFZGF5GF4GEHDVHCGBEf@Df>VC3xD3J2QD1(/-"@,&*J) ****-O+/,1-4.7.D: -s>*B'FV%H#I #dI#sG& DF*,@-=0-2>0=/-;/6/n2..-<,5-1*f,(*'($'+&&$$;#T"-!/V 4w CA!!+$'@*N,["C-(y---3,:P-A/Fz2J7K=~^؍խ8ffγPrΝC;Ɉ5[4ɶaLzӱA8\7C(6i=eV#II4^!T /TDX)2:$A},QE>4G:I}>J?M>OUv:Dr;H<'K;N):HPS:P};O=_L@(H]CC D@=C=tA<'>:J9H;3V;!.d;):$9 @63T1,'x"aNew">$q$#! G#&I)j,9- n-Y,*t* *W))")&))S*e-+0F-a3.P5)/66`051433440351 7t0d7.F8-o9 -S:,N; -<.;0::2m:4:6v9T:c7=5@1AD/@-f> .O;y.7.3m///w+1'2B$@3!3l 4|!5#6&)6)%5-3m/m1$0~0/_/.!-+O)c(W%$!If 2%)//t5 ,<)B1K:T%B[G^K^zMw^7MT^JXEF2R:AJ8;C4>.8o'S2 *)m; e'Dl!lpUћο ,ă ÙgóNfoʯ:ҳ ׽fۆĭ߻}^|RXA  <"I $@(~**w'd$" #`"[!- /itn"! g  \7ޝϗ:^4![ı^!}ƺ -v `žÙ:7U+uӐ$D|xJsգV6d$L&oڇ܃ԻBsǐn۸ʮȹ_fɡa(δsֲMӧK&1ذ\?Ǿs:x)N|݈h Fک6ڎ;]ݮ~N}t $ӦQңcոEׇ΄بɏ؝q9&tʡșVʘ9Ȋ8~cAlqˠtPˆͩ̈́cǚFXΝʐз}05w?%pR b; jDWɫUɻɓg˟*%0MυНѼѭՓь+ܷӮGּgxr܈-+*xӒM |#Q+J}V@&3 p ) ceQn-(Y;(pu , 4    I}W%A#5=rA+@Ex$B'*Ugv Dc !$)'1*9+*A^.G)14M34yP"6R7DTu8Tl9S>:Q:O9M7Km6Jo5G4D4QA2h=/49$,4(p/%L)"$  I`I#w'TK,/2!3$7(:+=d.@0C3LE6E9E3;3F:kG9H7XI5\Iy4G14D4l@3=2<(17;/09.6B. 2,F/*.'D.p$."-!F,~!*!)d!) '!$"!$d&4'&O%",iff!j#&()#*M+#,U'N-,(-_/-1%-f3,4+5*56*A5,24/22016m/9L.=|.kA0HD2E6$E":D=C/A^AD>EF<Ew:C9_A79]?9@={9;9998I8&7E7S5_73728V1:/ <,<);&9x$6#o4l$@2V&/N(P+2*l(+&_,h&F+#'Q)('Q)d&(O$S(M!'T&6F$u #"#-%g(**,!-U%/j(0_+/-`./,q/*-l(*l(~'($(~"L' _$/vj w D;]٨2ղX"pTͻL ~څ(ެAes$-`? ` 2GJ Y )K n   S E 5 - }6+ 2 dwjq1F[oݕUݢe҄dnt>CӻuӻMUڵ͵~ȉ'˒6 Xһ$Q>Ŝj7LΟ0,5/&5g]|#89ՇqDKֻ$+^DbⷹWpo'LԻư>Y#[^ǾQAQ]k,ҍpϡ3ҘHZ$CK*#׹׎rKWٽܱ!ߎ?Dڜ  ݍݒvȓo֧4%',eu;ںȬ?ú4/v+fؾ9ƻΞюOҽ>ig£WƮA͸|#Ayο$,5zLاЁު͇W.[oý\$cxiց-ތKtc'A_x#^wzoސ_݋NIz$C@p _ B` w . Voq=~]2  p     -5;IdSw   Q  fb  64 7 |;Guz$:k)x.!Z4s$C9y'&>+A[1ND'7dF<`H@UIODIFIGHFGIdC-K?L:L5LJ/F *B$>y 95fI2/*!-A$,',)-*|/P+J1*3*W6*8*t: +r;))='?&vA`&B'XA)?*>y*=)E<$) :(,7)22+-,*v-(-&-$,!*&%>" !k*#"p!*Wl arI+ H r XA$%$# (i ,,# -[.//j01Y"L2(/2Z.03/#8/:0<1t<3$;6997/=6W@53B%5gC;4D3 ET3EZ4E 6E68UE:C =QAE??AjS $7iW{Z1Zz3L ; oco`%[&)u{w@k+3ג<бpBý|Mtɯ ǔt\ǰBraa۬0 ĵM.͸ҵ˨؀p1tT`^߄ݫڊLا;ռ߷it΋[MǀĉH迴ؾ 7Fͽ&Ä5ªA\/D?[H9ZLXM]W NTK7RFN?KK8I0qF(D CqBs@^=:87W!-7i&6+K624892 ?[0C4/E.D9/B71@>O4&9?8 3;,>>&>!=9{5Q0h)T!c9o ![r##y"y   >V 9Cb^Hb6 x ( o H= a L 2W[ ;! %*/2[6e8!:#"<%<'=)2=+<-;%0:P2:48:t6:65?5d@-6@6O@6?Y6>L6=m6 =6(<6<7U'.sNdS.n$nWb~,+2$Ys?EVKn_Yi&-& 'm~#R+&qMF%[ޑ>@1w[ 0t:ףϢ]]|HXH9U1l w[GӲxfRldUMl}|2T Hڔ˓eTXȑIJ|@ DνwȀ%ʾcȀvΡRw*ǃDD|̐lՔC+G1Uq:\0#2ߨHv* (GtSSs%ݙێk[ώ\54TtоדKr0ҕŕ\g@uiʹƳŵ\ńx<^{nj5́wѼgȃâ _z`ѴŒǢ8ˑ<йҽ6_,ӪF Ή˽4إG݌{V.'.Hk|" n: 4c h-O] ] k Q[dԢ_АՆkhԧЧ!ِ3Pbږz܎ݧ"t݋Mhe[J2HHp }wK6<r  qTH?N F#h ' *,`R.- +(j%Ql"]zO!]""#;$?O%$  $cz"#} ,60@AH"GMQ'DP,Q2R:QAO'IM.OJ3SFyTBR>L^;-D 9N:-706>' 7h 7/8X7p6H54$5>*6178<8+@*8E8>G":6F*=?88ZA52"A+?$=):s6 1-y)\%A2"=%6( N/_F,S A  = E Y  h IU tw7 5W#-&(2*PH+d"n,m&,-*..&/2l0!4s2X5457353;^4=3@2B1E1yF3@G5Gt7F9EE>JC>b?-@:,B6Co3fD1D1+D_1CCW22A2?36>5J<%7B9096:63:1:.99-r6.{20/4h,6o*:)-@(RL;,LM9KO7J6]Iq5H`5gH26G7F:4ExC@DAE@GL?uI=qJ;K8M5"O1P /OH,Mj*I)UD )>(8&L1$*"#!Yf=b* J : '  <  xd`NRge}hl_ NOeb8w7 #:jP G!n##&L*sc- 040 h8 $<#"D?2$BA%Bw'C*C-Cb1CB5Bw8B:bBY3<5 <6!<7<8J;_7d;67:4B92:9b09W.:",;k*;G*G;{*:+;-<1;4M;A7:8}:r98?9O6723/.s+(&F" "0m 8  /zfeG5[yb's %E+%/+1'0z23o251}6.6+)3#(.D$(4!g ZUKaX:3cߞ7%, 'GY nܬgP _6cPך+0'Ԩ|`]ߐtqmڍ2hqT'@ݙwo @8xNV䳄[|_G@FV>+ys͛1ӌֽ=؁ Td=tqϩƫ jȝ›>lbe]cîoB)1E[>5_l"zNsEY#N+&(nX/a$ll?]L!?v*d\*<( ]M`#ΆA&7SҰ6^3zҕҩ"!V$ƪҌXfq"/4jН忓yd¹R@67c@Og#,7rMˌ$D٬oݎ˼Owߖ۴ߔ  !,6\y)z2OEZDnZ6 Vi`T9 b x  WhC',.r|DH$>( -n@1496 6G6#.7(7,x70736655O7578=474563191:/;.c;+:0)8 'B68&"3%/$R.$N/#1$X4&6)o:R-]>1AV4D6H8BJ9`K:Kz;J=ZH?EA*ECEBGcAK@hNK@R@eUHA*YBp[C[uEOZFjWQGTFR\E#OcCKU@vH<.$>+?-)?}'c@&@(L@*?,t?0?4>9=l==@a=?9Ah4B0C.Ce+D)C)C*C-E13FL6F;F@C D@Dؤv@C,oU4]nb iMI)=t ݕ!{v+ς "&+ ) +~_pd^'r/D8tcUzs<6` < _ w &`7%)-70 G3i"4#7r#V9"?F"@R#A$&A'?*>8-=F1X<#56;?8;B95~=3i:f06\+2%m0P!W.-W-6."!C0h$2'6(,9;0;4<8<;>2<@;jD:H:MU@YB ^>D ^F^DH]J]{L ^M-^N[,O+YUNUqK_SFAQ.@N8K1zGQ+A%: 2B)@Z q zM9 ` {Ji* h71^pQ-G(@ T' ,b GAO * Z!H*#j#X" !#!P$$$6(%G+&.;'2)u5~+n7-I9/;Z/l>d/A/B0Bc3@6=]:;=:3@:B:YB3;A<0?=!=`@;)B9C8IE7HF87F7E8CD:0A; >=:?6B4eE4^H7'Ki<MANE0MGGIGcCtF&| S Z!44C aE  k>"!#(*.U1~36:697:k88K85b705*2$/l*#uc  % ra?J6~g/CXII cFΈ@mUmTo(CBڷ_FE_jM:a='֪̾6!̓_إIvٮЛ6ӥN"tz׉ݭס݄55ۑ?@*{ދ߭>ԺеɳCƝ4pqD76þ…\()X46o _ }rgsah Y^7?I \ 5 f: @4$@(^*a,$-*q.-0002\2333Q537393;2=2>/3>-4?5@7iB5:CA:#AY7>q38;/7- 3*M/d)\+])|' *# +?!+ M-E!/6$3('7.; 5:@;DBIHN&N]TQXCTb]"V8^W^0X]V]T]9Q]vM]I]E^AV^v=]9wX6Q2 J/6B+L: '2R"+$5>/  d@"NT>"q3B+\D $fSJ09oil* e   ^0o7"J"B%1%u'q()*7,+.!,,1l,2,d3,3,4,@6Z->8-:.1=/F?0@2A.3Bk4C5C7WD8D8kD8Cx8SB7LA6@i5@4 ?3=2/>11?/B6/C/E2 H4I 7J8@K9@K9uJm7^HN5XD2S>.7*/% ') ] p/@_q W  i V U aoV2$%<??"5&)* ,7".#/\$/$d.%,&(%%$k"D# y Too VqT mp0-Q 2 ];ޝfxպ-ҝ.ϐCGuդ<эfϿW%Γ)$TȍѸƈAėw>ū- kΜ\LP (D1ד֣fԸi1zο{ D|@NJbTs9ɅqƼO,C3 ' /_~>#bmFo}ӯWw .dwZ}.0@,4N5/MoO7 7 k} Vw:aS,: 3J &? *?O<'(*ںׂwޡWۧ%#Z(ҙ'.GՕkzt؂oNӈРԷa0Ϸk^UoZ0/ONdݼLUz̟шjs_ v'rk$;w#9K2+M p"٪iMقs\UFj˽ˮ˞ +ؼK[Fy7 c  is  VA H "}+0 o}qiGl !   qgO#)) .H1L5579#;'U=c+e?A0@n4B73D7yG7J%8L8N80P84Q8Q9#Q#;yPH<O=L=OIT=DI<@9|<5871}4E,J0Y'M-7#+C ++t+}.p2$ 7M$<)NA1~F7L=TB\Ey^7I=^5L]N]O]P]BQ]yQ]O ^KP^G^CgZ@T=WMi:F5z?0b97+3J%.P)9# 2& nO } P? <`2Pd*:K }p|>S|<& De Vy z{f!$U!&$^'''*H'-&B0&2&4&7'f8(9b):*W;Z+;,;g.S<;0<~2;5 9&67>6 8X4N91:./<,>F*>+(@'6C'E*G0*Hh78H>G~CEFBoGU?Fz;D7g?39g/3l*-S%(r #Oz u~^&+ q DG<z t t Jpi)%!#&)+`*(wR'%V$|,$#"", x--<+I< % ^ ? 3"yN=PUx*Mp8)#^nuCpt$0҆8r Ц.ogzk*Dž"߳ߠ޹ĹwƦײVet Zͧ=ҏ̔c#1J]w&Ќ R܂ ^jIg߀udއ ޫKٍqȹ²Vؐlh[ɪ缪Ƿ̡x4"4~ n̡7S.(-鶁8 *֋'HI'L m ' f [ U9d]u 6  ; K  ^2Bj x C6i_8<a,5-#?*nI"3CR;ZRC^jJi^P^U]Y][]&\][]h[]fZ]OX]zU^QZ^Q7I1@6,6&,G!#;S vFMJ^PG$hs90~d~GQz`r4cPkzP e U 6 \] `   c 1#{ %\ 'U(I)=7**;!*'*.*2+6-71745n6>28. ;*H=+'1?$@0#SA#MA%@)|@A-k@1?q6>;W=@t=uE0@IYDMXI-PNPQfO3T;K-UzE TF?Oj8I}1B):"2H(l**LwbH7uM=  RY #"W#g$$& $E,$1%5&~8'9(8d*6+}3y-f/.*/S&0#1z#v1#/'$+#K&!Z` 0c<\P % +)ge :m-sEf9ioڤNVݻٖiڹD3 VЎ՘_ӜЃӶά5Gf!Կֈ˦/hl'Ͽ5}3*I^GM:κ@ƲҋB!~ȑJߔg7@v6` 9F֓/.)ܷ6uMࡊ)󯱡˴z !ſhMf0νeԬ'<[)[rVq , ( <bb,WE n 9 w!zAX  JD$ HB.B':dp]I{G'ߤfӤ0Q*ֱ'7ʗfȦ ESȓ7uDо !_~yuCӵ{f[TξeYݫeo ܁2KzT'eNJ.ki!C yLYT,ݟo@ lc= '7G8C\ ؟dK/6ځܣڄ٥-++ҖϬAܝ+QBƖ+MF9R+YӍΞԿǡxŰîHb„àľ ˖V׋ ߴqDwFZ޹Ը`Klj|XXMHeí0$ *M(oZ/REQ~ąb*nׁWRP?zL= L;q e' j"C$ %l% %%&$# ->p  : / :P~#O"d@{:nUV[C-^vTNJiW|vYmխU@Dtaƅѫ-g[~جɀF@صBǬ[LԆoȍќhυʎ4ʦȈHɃz.ʥA$ʼ?˨`%Տ۾<(eL=* $@"*,C5,$;(>@+"C-E-]F+E(CW%V> 8R1H) )F "f X MPr*vmiL l@ /:j$@ +"0'5 .8C3^; 8>;uA ?CrAEBGCHD8ICQIAH"AF@D>B<>A(:@6g@*4@2 ?2y=3<6;:;&>~F^)GZGR>G!IEwABC4;f>672/)/(*%7rqDlto 9PpsPQ\ۙbٜزEڜ!.$`EzG/]4  H  oM(" #%(E+-QT0a1+2w"1%U1)18,U0/-00011p1s2t0"4|.8-=+BU+vH,L-7O/Qd1R2P4cL6Gm6@_69|50[4_(2E .*Z#@H0 iV%%Rz5 4@ C|P5!z&+C0479` ;"p;%9)37.410 5;-6**96(3&0%,<%(%w$A' )+-z--=f+& t' z}`ֻκήmC؇״Cׅ#ه (ߨ5d,O?+7l.tFU"[<5hZ*pEڒis+ ":}م+مȧ؈׆֧đͯɤJj Ġȼ]Ы]1'φՇRrH2@h-ׯWQb^4v%ۡ'($桊Q ӴŭRq3[aǠӶSyW-k) /H  b C YemN}B&    _3!jQmr+b;e1Mt<5Cܕpܞ۫0wqAɞ71C0C„ \x\zۺ6WB!hzDO13U$=9Pߨٿ?٪d#@TRšá0 aϾҼSo\޺ 5UşšaLSȵʴKˬˬ~(նзM҄Ւҋ[ӽߎ׉ }+`M_ o $#,.*41<8aC= I)AMBOBGP @N >s@=@<^>;6<997 87.7668 6:5>v5@4~C4EA3HHL3|J5}KH9tL=NmBQF!UJ@XYN[Q] U^W]Y]Y]W]5S]*N]H^/Co^)?^ hڥ͡#$((è)Сz+"zP纏 ıd,ҍEd%TH/tA f)  NHDL E   wYFm  nsrY?  H94$VUip\%s8hޝڮ]֥K%}" ڱTp׹@ձ4xC8eGv:L;hS[;tZZ<^=N^>5^?N^4?^>M]`u+C@*4@*?*>*P?+@)/B3Cl9zF?,J\FOLT~QhZmTg^T>^R^O]0L]I]F]E]iF]H]K]yN]Q] U]0X]Z][\G\[ [LZXpXTU5N SGN?CJ7D;/>&7j/73&P| {;x0uHTY9MM|iidE@5)WC "? Yr 2  TV   SL a C- 9!""7%$'W%'`((>,'/&4&":8'B(K*T{.Y1#[4PY465U}7jN8E&7:^5/2'- 'e@!0bmZ oy *v P n /kV!"#"':"-!3="8#=>$A$FB%Jl'K@+K90RH#5 F*9(C<@?^ 4-z`##]Eխ]`­*R ͟#˲̺̂UCœĨɡqGW^˧ֺ͇hsK߷J &O{ "#6MD FO c*$*"0m)5.:2I?4CG6%G#8I:JCSf?T>T;Q7N3DJ-C(;#2q']% rl=Y>EVsyra B XRI!;$.!&,$[(''%,&1%8$'@%FC)KM/?O6Q>TDZ5J\^N:^dR ^,V]X] Z]TY]W]QU]R]6O]tL^~J\I[IXZH(YHXZGYLEPYCX@;X|?V>fT>P<Mf:2IL7E3@0:R+4%.z )'Q )Z 3 P pCWOM x+F[Y< I'n8057 } N8j  M cr p vC h !u"o#C%\(!+R'V/.144q: 7?8A:Ax(?*@-?0==3:g69I787867/56+26.4H+'4'2%/5#Y,!(%2"n  \[u n. E /  ,q L O 3 -"4uOUL5X{[ЉȮ۬fo&RK ©=U]M.dݑ0,Q> ,WwXw@U15ګ]]ѩVhξ̴`̺̖ψ(ˆi<D[ǟmdܿa*E㵕a&&ܸd "ʶ뾷,eCU*ܳ3eܻ˵ ^-89tQĭ,7oVGςܤ65Qs? {  f   -  A  l5   h~UtW"'.k' ,| '  h[+GZM/cQٴՅ2nWq} ALGRM ;wJ^ }`:\Y3*FoY|iޜXi yЍƱ ޽Oγ.] ͶӺhlqR̔A ԨĐ+jtԣ;ӂOLO dot7qH#Kg d N tt#+02Nl7";(?".B4 D9C>JEBF~F"I_JJMLN^NMqOJhNFK?I7hE$/@&%;4.j' g9"v XDEpgFe*zV ]S  Xy5 " 5Vn$(.* #/*l327;;E>$PfAY]E^Iu^-M^O]-R]S]oT^S:^Rh^Q[QTO PNL:L/J KIIInGCL7DHOBQ?R4%z0!+0'E?$!_ CYG m$O3v9'jzDH Ai '.n ) 0; # ; S  k J L4& k o!O5#8`&4(&e) .*2z,%5.41235/3!+2&/!,"*6'r" y;  @,C8?5u"v!&M$b+V'+/*2,v6V.9_0JQ5>6)>5=5>05?5s@6cA8,B;B9=BX?A@~?@>>==y;:8#7N6c3\3./)*$[&d"l6   3V : [\\5gze y pUxzc۳تӂШɭȿppbٺʵϨ޲r'zBN1ȦxԌ#0~Cy ;d Z   V0_1` PxPES Pk߅V5>ܶd~ O޲r\ҩ.Ճ4=EDm޼-ynҊ̭jƎ= !ԭлxBOhnŧFs¬óĵ!ۺ6L {sn,\|ɺ𼍻2ÜǰRH7eClڍNalsv % A YkhM F :1=9;J P  W IM NI -N41lۭܨVsՃ חH@u+܋;vQ-%"_|m݈r}F<5_ ̿ɢywǀ5R/دHĬJg'BsxJ(ABձڱz𱫼SʶG^ąE㾾ͅ7?$mȰ͞طg؜ݍ݊w0XV5LJ /On@Y@4 P"#L +$K3(<,CD1H5K7NO9Q;(R>O?LO@I?F=C;BQ9C7D7)F28[F(8~D5dB/5@(^;!2*YF![ R l 'La%Q(i $v_t'B z8-'2y#;6-D6M4@@VI]Q^X4^?^]Q^]^]]]]],^]k^]\]WO^O^GI]s@S;I8l>75y7"18.0;C,z>_+A=-}B2C6RB::?=ik&?{)A,B0 B,3^B>6YC89D:$E`Zt=KPм@Ƙ/iR \L颺š֡zơϧ@;ų͙24U r .`OU * 2M PN : "\f1VFF0=Cj.f?h>z( (DH!F7B?[h=vڡ׾ֳҟЍ̩̄F> Poǃ"a_XLĸ)pNpȡFɴ]:-dxޏpoIPؐEWDff#llc.D K`?#($+Z+/I043g879;E:&=D;+==;@3:&B8XB6&CQ4C=2C1B|3A6!? 9> :?9?7=>4:/ 7)3#M.D'_H v@ `.>iA">#IUU: n?!}I)%0071;?C]InJSOb]^T^WM^Y]Z][]d]]]]\]pY ^wVO^=S^;O,[AI)TB1M=E9k?6L<1<->+>c,<.:'0 ;A1;2;4*948O48383 8S3718-:(;$:p 71!+%v!r nSm Z ] v^~yy9{9M6.KtXp  - x S"X&(T#+&=.S( 0'/8&k-"+,)D$kA x)~hMO 3! y+k$ (X"+$,(+X.)I4_'19H&P<%i?%B&ND(D+#EX-Fv/"I1hJp3!K4"K3#L2K1OIU1E0A/>.:.O6,2*w.(*&t&##] H9)  _  (t wCJ8QE)OI+=Eruڹ8Ӷhr R ;Cw2&,,) L q & iBqBR@f:yp)$ѷ#Ô60 !k /ǡǡЪ6ҺGIҾ@H?]gӘDך iׁ1ׯ׈ɋ1f"j8[N)Sl/(dMMs  M+g | y 9>:<maPjOi ySDX >  @Y  R <JG$NI&H?}tPԚ,nϋiNJƚClWľ<@ټ7Ȼ…W$ƈɔL6[sOۺct YًۢD9.@HO'>1n 6$2W\ !I0 ' )X"J$';+7,>2/881=3A5'FE7H<88J8J-7J6J6I6 H6 F6'C6S@7=8 <9 ;9:p9;7=5=3u;J07+O3o%.)#- hWb? vjQ\%Vvq&WK  *g(2A09&8=?UBDnFyIILL OOOSOWMOZN\HM]JO^G;^C[?W/;QD6M2F1"?2;7a31"3=.2+1+w0*-:-~+0Y) 4'7%;a$B@$CS&D(CC+AA-?.Yx(~ A@+/`ha d & i=k\ |H|Mq}hz f mMIdc# $!c*"*/%3E'8) <,F<0F:;588;899:9f;9;: >q d 4 t \ BdYi JP qX3EߣY ՝Εх\ÿ-Mʻ*TD-I2LK7DM;M >PN>RNN>pM=`K;I7|H4{c/6 " d)-6/84 @}9E.=wIR@KCLF>:861Q2*-&'""X . A"!G$$B'B(+,-/71)3t58,8%>9W:W|  V MN(xr>?1@;xT Ey HJCY/! z ]?xFTga9 KuQ  +:"sa$ &!n*$.'-2+4B..7(//:Q/<0>X2?3A4Bc6?C]9aBG<@f>j?>;?>/>V>T;=L9k<8+: :7:593G9d09J+;&K;5#a8!C4 0>,8) %"( % m#$  vc V   +wdES$suYZ.^}<FHsqڤٳE&ΘMƟťLKŜ#ƺإ]Ȱ1} .qIq'Yx,u//G/0T1\/z+:&/W"# =Inкpǥu}롇!!u)*)Ʀ'NۮE Q4+켠ЋƦ>P ON}ng߯ܨ^WVՔпףZ2\a`8^r)|PzMs>K <^Zgv z 1d#+n3Z";'"Ag.CA3bFi6J8?Mf;JMH>J?H?iG0>;F<[DM9,B5@0 @f+=($;$k8!51-*v*_+cV,g,+($87 }f݆֬ڄr-+o߭Q*0'T& 1}%+;*B.3H1N3S6RV:U=T0?U?EV@TBPSCKCG BC@@>>; =65;#1,9v*6[#P372/d&+y(9'}(y)O+Ul/*!A4$7A(:,_=*1@4yC~7DT:Ea2S:/5+0'H-$) O%ix z $6L ~O/AgK c ,Vt 0r Optr [$l],NRZCT[&:%3 LNe*rA!'- 35^77##7&9*:Q.=<1=@4h?6d@X:w?F=>>?=Af;D8 E5$D2B-@*L#&$U-$3#8": :p7 2t)bV sUdI̯ў$'dų׿߯N/s=а 'ԡ8nN .zjØȹxҽ 323gv2)݌U۾7ST`Aݽ[ڧj Äإ\~PsT^[FޜE|!qs k  - >~S4 nw< 3C' FYpyOU2}fyڵOtCnPSMҁº3¤Kl;H̿~ɌƥdŇwG8SƐ7ưc9ȗ͓O)B֮ي ݀ؖCoVis!u1-^8ORj'GfM@ N;+ {.1n >v .(#0)@7/k<|4-@9[B?4DDE GFHFJEL-DMBK@H?EL>$D=Ai<> :;58?1_6-2*y-' )"'N()U)& %W)%("g}xb;L x8 - R KON` S" #"W8!;!3##('-@*1+4\-50"627634213.3,b2*.)b+9'*$s+#Q+# *o"( ), .!@/!/- 1g47z99<}@uC/"{F&G*9Io.J1K5K9JD>A=\>;e;78h5A521g0D.-)H+Y$)&"SI*K {4 7-}!$ A  is w (< 3"!']RSha[  Ze~s C$- R'o"($K)3'$)1*3)-)0k*x2*W4P+5V-n5-04I230!4f/4-R3,0~+f-ۼN<^ʺxja֭ٛvkɇZ֘)ޠu+[PT  G &0-16: @;#7$2#, '9a  $viބ1ЦmY JaBiEQ\™ XĬSʏ ӓܷ֜-߹k:U}X`sݽ&H|~i֠ɸׅر/۴W͠f΂:aѥ/ܽϬٖ,٩0aQ.LVq Q ?IJ g z!#$$N$o"2 ) M3 B|*hRܜZ{Kϲ+Ήʉʉ3˾&ͽ.6ԓa#%ե]Ҁ[:a=ιܚϗA u oKx.5J} Ju  OK$B k OKOfB= V P=&t"S,(2^-8%2Z?5E8JJPv?R@@RAPB`MBMKAH@D>@?;;;77 2O4T-0),&'6##-`LZX-;} @ Bx TCdԼ-e[yW=ԯ~*l۬aJNl1&GBk` # FHN"!l%n$r(c&J+&p-)'T/c(0)1*0>+0,0-[1.0//A1.V24.3-2Q,$2+r0|*X.*+)+)( ''$& %#3cI    SA y( 2Q'O>LQXJ^d[#8vr;iYr @.ۇӭU6&rbh߼vRX_Ur)ƣ]ˎλt A9v+,91ب]$ t I:@%(G*m3.92:39.D:'83* F e# KgbߞkӰR>Ȼ-ECwwQWxwԼRǰPZЧӬT8YGF.Q%hhWj΅M#>Œývb,޷D "߼SV.½ǧֺ.ę*̡ iUvn^ 2"V+1*3;!5#'7#75"*6 1, )7$Z O wX% 5,mk֕߰Ԁsߝ-ݸ˚ٿj׾xȄ~Ω.+ʽ8t}ƣͣEv/Aϵѐp-ՑץyF>imuuIeL]? ? N ` * V ooI J"  p j ! i  {ydf*  Q#2(`."24r&0:])>-RBh1dE+36J$4NR5MP6Os7M6=L5TI14\D4<25}// +~*%% Nri  <1oxwVwa+% +fr# 0# z$"#"%d=m    b : L  3 N s  r  JL& lx"%')+-y12V2[ 1k 0^/+-O,-0"4':,@1eG75O8X=^Ai^E^3I]L]P]R]S]T]ST^0Sp^RQ^O YN?PKGG%AdC8:]?l3X;.7-5?.4+.4 .2l-.V,+*(%"S`WG! (\ + ݼ)7$IۏĽzߌ"$O^d~n9 I 0s"i&p*#V-.(/+,1/K1x1j1@22H1.6x/9,:*:h' <$="=H!:Z!5n $2QZ0,!'t#F"#$'$Y%&_K$ Px<  :Dr'fZJaKbE;j0jx}/toa6ܭǷCdnӭg0:R~{AFߠQh߰] XYi<  W&,!S-u&/*/+/'M0"g.)e$ 4+k mHSW'9,CD+^ Ok碿,rH½pMƈӌ+>ʆKX_!ҩkWa<>Q ]JPuUoqƦ[o~ѬkϤtѭln5sB+˗;q9NZ Z Z<R%}dZ\l 4b A"f7 aX|ݬ4nx!ϧDhʂ݇n ~gɺԆYWJՖu^sڄؑnڻ^_O*;1uh^byQ*?j2u4by /b Q  F    ; _ 2P  2 X"   j } 0 q; ( q o0K#(-"-(/.&141:?2@2G3^K6L"8K:J";;I;RE;?9:7{5S513+2$g.(;#TPZ JF\XJGjq?J  ^"z%C#{(&*m))*''%1#S$N") y~<* B D=D`$  o\ tP zZH{ !9"!!# #!###&%*'-(M3);(-C\2JK9UP?jTEgXfJ\O:^*T^W]oY]IZ]z[]'\]ZV\iV#]QR]O\LZJYUHYFVFQFKTCF?>??964+-j!R%#:A? ~Mfm$2Oߣׂ A۳hީ(\fj j roZ!QZ##7$# '%('d()&*&)'-()% *#*!* d*U)w&"V O/n7 !|"D"t1} <iz o Vy.>P.]Q4U`0}/ bVnu`-c'=n_Q?!s:7:n/w>)фѮ^ϕmM5EB@ǶϹQ"ODZlѷB JűٞʴUն׻بݫxހ2RrX// gA  9S'} FrGfa>ICRcrf!5!Aߤ.hݞ ݭ<ڰxۖn! ^e޷ڨaح՚̘hϻ̰SstUGzkuǟpȳ0tۺŸȇψӦ4ޝz9ksF 2Nht/[ mc18|Hcm^jX.@F7UqP-DcNk܎ܩޠذ؍ؿޘړBEp:1' ^6Z-jG[#v Av}R/D+] V y a KG  ~u!w   e R=ow k  / % LF=7 J #nt1\ %sl)xf,s=0"q4&i7*8d.707+2r973:4-:6775653R6/O4,1(D/$V,= 'A+!y1 qIurf:(I  [  `1("(.&2):5-+B7k+^7)5'2m$/j,xA'l?> Vi' 1Y R,%H g@ "#% (O!X-"1#6%;) @.D3H7L;`Q>*WB\CEU^uH"^J]N]R]V]Z]>^]^]]]]]]]^4^h^^^^bYUQQLUI@@H55*z+Z!#"Fr* G p?(/~eNxٞAPmX4~qi d > =96 +" $n6$# v#)!#!#!"p _!}DF_\`_{] W %V ] }  T}W.mHHChm'TGz76TYC'f4+Tu`!|iQZ Uw@:|dJ3k)ԷuV љyuo>jĶ۶)k焼ZV;ɡ ey]j- K@)P$J>rVwLeYb\G8 p >BC5 N;7M31<]{GsR~(ޮَ| a)/Қp}Z-d٨B\jW2򴋮⪙25&AmI۹Psut׋WqFA!&8$qC_o>6"z=:`fXob|03'5lv'ܲ;(oߣ\H1<")n!Cn 7 FC. 8EaIo ,Q\Y ] szo t C ,  ) 4 ` = *N<4"S'4EV   !A-91jP>#Er?:iL B ~9$/-6!u<%WA(&D@+Ex-oF[.F.E/C/EA/=,9*4(/S%+i!K)%_!'  E+#%&yL?n   3 r !5!#'d',+1.74243z2"2//',V'J! ; uy8q"ߏsum۔ZK S9t37 6J eV8&Q.5; =>x-@R8A@!@&CN,HI 4oN@{2!5}')c m5 3{l%&}GhH ,st | ;1z jG #qncc O"BR#W"!+!x s)TYy x [  @{} mj @ ';z 3 5 yYg p)[Ztb% % q8flvC}$DOD}_ V;A:yVl<6U"e \+E ]qա, ϔVϽS%+fqUX۱8^C=# U8}9'| p   zn e;`t8:)jje׬ܘz-xݘݐ#*  TJ( 8 s  b  6 c =VpD/JB\Oة?AXӝm^4;E1зmԞpMU)ʍ#>򩮾saĺ`༶޾lMZlqθ-qRyΣ֔o ؋ٟ3i=H/[SdJvd*vj.hKp;$N#'= X5f wZM 9tzsaJU 7 sKJqympz7~!($56+Og=hvf|c{ `B1Z $] V qddHH7aK o MZ,r@.3B{   N;'/V4i8=3!B$C(CV+CE,D,C-BA.8?,q=)g;& 7T"%1+,o& 'E =p  P  ur; !&!!#&'B*-!.#.$,#&!" pt N`brEܪߓOۢ-]ZPJ@hR+#3l)r. _+"~@ q&+/w 1I"P4$&6&9(<*B!.H2`N;7T;^fB`^|J:^S]Z]^]W^]^]]]]]+^]i^ ^]`^W^N[lG+S@Ia:S@2=9)1"(wj o w b |] (>is/  ; Mo++Ye|3}4WD8Y  lA > OS H 8 * vaaH{-b/EtZ8.2Vh] zBޤۦڎlr2ڦ׺۲ ]hAp]Cp2A@:a݌CwKp6&"+'Zt"  P8(;l L/fP = bv%թߏp1` -fҿ&Ҍ[jУ+J͠!RFu!cCtFD<5.k ŷJξ ѕ3B*Py>Ц%ѩbѶN, Aܸ>vkS#UV^4=2a# 7 W#KmD[]K-! |kn"4S@ Z G /: s  dN^@ A  y 9L^U#= uK  /Y V@D>f   Nl A  &JaSR[ppb *!v&+P/kK24>)7 8#68&7)Z5-(2.-.){-%* H'<"?& ])I7 Pi ^{;|o!k# $ " $ "|N ^  # */uS1n  0$2|z=VUd1.|s3xKSlb. ^H 0C " &D( -p1.5"q:o%@[)FI`.LS4\;^@T^QE]H]L]P]U]]X]Z]Z\]}\][ ^VW-^#S\NYJLV~FRAhOy  Y Ox oWv l O b W @,   } }   1m c ,  < p  W =8  k >*AQW[c|2`VR&t!&07tC%pa=E "k+}c.xBx$RJlC hPkTIήٯ͕̗מP)Nעխ ݨkn߬H>g+6 A@)n2); } _A^[4V$fmF.ߣBlO48~:' m?v#$"y$8#$x#f##"" n/ R <z6q+/8D_E\~ȱك­чU’A8Nˠ fF3u$Ϩ},9ǜO޻ٽ:Ż2۸嵆/ &=pG.r¿glʭnҼl*կş@ʾjҭթ( D`)Hxw:m]^hj[(= q   7[ E  ]PdCNVm A^   )  F ; z   E X=  3 \Fvbri5 g,  h& xJf'vs u   F ) P;rD 9 ^ &[XX( =D',d 0#4':6J)a8J+8-7.3l./:,|+'%#2~s !mQ2o$u q 4 r :  Ga6 do   tl  <sA9%E z^  ' 2.*^C|ޕC8GC.ۈݷ=45h&p9 4P}w  pHfK )%&),k-30;4Ax9wE->JBoP?FQUIXKZsL}]-M ^M]kM]K]lJ]I]/I]IG]D]A]D@ ^4?r]=[O?OI=WD9;U? 8:3V7#.37(6#/6 5967676942. *m!?%!!!}O]g [ @ >  < {=  I=a& xDkm7Nvg7C82F6EU\2(TXst;NjIޞu*|hJZMZ?XylN4 mp](-ddeT|WnJ%y!ڛ0b)rp%׬{| &NԆ,[Lt m9[BGp3y{ >\s*cLsfaF9KJ0q= v;%!*'/4,)3.5.7-8,58*5 )80E% -N!&)s#A$[ 3V; W0;ir Ãg~npdW.ɠnqF Gh?@@Y?M٤Ѱ&")|5:YZpˡ&(())**((&(̡硟š"Rgv 7;4rn ȈLS ֕vTGo"@F = ';i Z `v! d  NBm r['EuP : ; m( & z \ J  J4U_  ] , , o  ] hPlf   [ ?  '  Q A 1;  [SYu5a YlYx, "[#A(.b+#,v(+R.T*2"(`4%4 3?p1d,"$VQH'pr { 8!D#'%b5''n|&#Q ! q  J  z7BO+,A0~/  6c,j |v/+KNY:J5`F0[CZ+A'G=$8!3r{1.*%e! o n g 913*>:!id VFN>{Z8B9qbZCW A@nT/rSt4yKkr<#KRQVA Pxf t; O_"K B%9(. * +!*5"(5"-&h "b7#V h8]ԣ҅^j%ӑH#Pב޷|@/MfFT!I婿O z<Ǵpϡi()(++)) ))))(((()(%͡9=t0ʭWѪڲۑ+lMwu D ( POf%KT_|"$$%L'*\,r+))6(&&WB&7%V$%# & % " ! !Z ! \"T#)$]%1#["j K] x b   2 V il W f  Zo ! ( dkDgr Z+S /dX~  F eapmW#  M$T*2S/Kin\0/ r3 :wT`4t-^PnI%f: 2s McFXJ@0qNj5\MX):!Z~5 "y5 ZM%#*T*-f0A0H4n161+605.4-z2+.z+)[+%4+p#n+"9,$#-#1/& 0+12489??EEiN0KoWP _+U^Y/^\] ^]^]]]]]]]]]]]^]$^]]]Z]5V^Q\&LrZGW B1S #S%B&p*'( (Z '@'|'@''mB&&(B+-%1X45~/5<42;1<.B,L( &Ov%"Klz(e ^cOJV  XN   Q,  ZXIHQ9'(Uz*@i  + (([2AokSETx "'# ,%"%#%&&(' ((%:)#<(\#&#I$c ."Qbda J KNE@#Y7S=dd~a(_{$C tD6A2/* ee}A !%"{C$M=%%;%M$7#t"3 g  ~ /"(N/ 6X'=0~F9P4A[$I^Pl^W^\]h^](^]]]]]]]]]]]]]]]]]]]]]]]]]*^(^d^l^[z^VVQNMEvG>A(8 :04i'.X)4"Tx ~B !iUu|45^Y*׼V֥ѿDw9tߟ^c0[mӌtYxٺضֲV#tp),\-ߡ1;u,L u+jaB/G`9VbGU,SXR?L o  >o M- 4XxyH) lUۚע|׈\\;ܸ`߇\hS zZh g\!O9 r\1&?tU|j (QtqS1j* K  uU     !J  Ws8   U+-2} MS;   ^ ]  ^ d   V  jQ%ҀmE-͓/€@/*fտZNT0ޡ*(ߡ('))))))**))(())**(()(*($nƤ6G餲3@6񿋿WLlνtYAZj*@q_ , 7?Lye7!Hj!t"i#%&&'(()$*<)d()[)G!?(#H'A%_'%'%!'R$s&"& &nX&%%>$7$5/#7 5XfdUu 5JC-J }EPQHE"r 5 }8Bp} '"/nsy ;- wDB!h#i&h!q)#*&2*Q)'b*%#*#(!&9k$ **%g X- w@0.Sg߉ܙf%ۼvr]N+n;߆Հ<יh zF |_5  : %#)+&/(U2W)5*8D+E9+8b*7{)5'g3%/#* E%/W [Q$  sf[]rW>$k_;@0e"߆ty( 7imV 5 aX#} O#&n!)q!r* )'&!%p# v]y]W qed^;Tc,?c  G" K'(.079VAAOLKXzU(_q^^^=^:^]]]]]]]]]]]]]]]]]]]]]]]]]]] ^]T^^^I^u[^S[KSCKɻi PYЛaT*75"F]ۭ.ܣܰۍܤR۴=Yܛn9Sڢ yiZ2"U`c'`\%@"uY;,-R : u r F  W l5W ~Nm \l BA%$vOH>ZS/P!s"#xFCE + J n 7 ZeBTkCQ,P_b '/p~,]w  CoR1   X `;   %?el-ܟ*̃v\ԟ$uzC۷^ʯ"3(Ρ(ҡ)$(())**(())**(())++)) )(*('E9KHɰCRڕ2zEZ~m  | <"$!%#'6#=+$,&-(-G(/'@2(3){4*|6T*8*9*7#*6)O6)4)1*.(-&.$(-"**Qc*B)68&#"w"!=  4Jf~?z6p0O  k  WKp [  RLi s jUM`[r;dd)O}K   "#{)/j2ws5C'7 7!H6#4#2"0!, (#W=D  \ , Su7J~-̸1CΆX-N8C2H:+2%) "9 - T G@*DZy!*˙hDDȹ6+ǟ@6^E’5ngC֙ŸDÒ}Â9rjkƝ ̱ ^Ѳ}mڬ[dޤ tzO A#5"klqEFF+mn8Ef+6 Ok o }nk%kd2!kO?A^YSkܶھ+ܾ݊mܦJܡz޸ i0}T@  s _ [^NZ @ "$T"#$!1$"#$$#~$"0@ j?PPK*"  TYU,=! &j#J+H%,%+#-R -ut+^&Hf sO MwWm';bֲgơ%(R()ɡ)!)&**))(())**(())++))""))))((١)UekO֦տrFkܺs޵.'`w( O &g#4(+%-{0e4H6y!+6d#45$5z$T77%l8&7N'7'>8~(7i).6*3t);2^(v0' .&,%+"J*` c(|&S~$#@<"l4z) C r#.[0 #  < ; /  ] LG^9Lhdq x8cXUf d Vrm&9!.('4,:0?2IB5+C27LC6eCM4C0nCU-ZA)g,5,20+-p(($ >2 aTaR1@ Kg1-3 b/K" *&&0+o5;1A;"6B:Km@T G^O^WB^^]|^]+^]]]]]]]]]]]]]]]]]]]]]]]]] ^]w^]^]RXY^P^In]"ChQKId Ҁ..UܾśſهƆ){m˱?շBR{6״KPg4̿. FihޔEEpC_?;~[fUx@uRs{q] [ WZh9S[ +NX^k}r^ܡ~է6Ў:ŴϾ, TKΫѸOpөpڲ^2"  q " #U B'#*%-&/^'`0(/).*,(9(_&!#Hrs!4 &T> >0 pJXH L  "R#I"u .QVf'| 8lE= +B׀i+.Fy2ס&n&*((&*)))))**))(())**(())**((%%**((ޡ(⡤ʧ;_84{!ήҚlU+C R ~}]i! %4(Z[*)"+%",*(-*.Q,/0-u1.2.4.7,9A* <'='>r&>%s?%?P%>%zfi{ h2  [ ,  9     Lawe &E[S-eMMdoN?ޗڮ݌ڮ;@$hkPO&0*9L%?),C\1G4Kz7#L:Ir{jwF f 2h-T ^)KD '!E%I%)*v-l10 82>5YCp8F;)Ju"q  !3#?%2)+,*\u(&-# 2\,4un *!qQ"K!B  8 #Z-)zC~;v~QTC:ܢ&ٯbOԌݗ#.ΗiɴɾúY˽1V@TH=m)*(()'(ס)*'((((**((((**)))*͡ סA׫r6GEеi ̥Qj\eoߐo]*P W yT &*, -"-^#.$/$&/'/\)/(+1-1.2/2/3/4q/48.h5,5>)>6&6#5 *6V6;=502F111 /V-*_)y&'e$M#@j"v!S O!% r 9M{ U)5^R YDZg:;??1\E)5>17?9B@=DAF)FJKOQTVY[^^K^3^^]]]]]]]]]]]]]]]]^]W^]^^eY=^SS^M*[FU>A4N;F&6I@G0u:+=3%),|% >x WD Td_0#7?~LނՏ3?t?ܨ 4;Օ +d?;,F֖zܕ¦^ju=ʮ΁Nڝk`)AlڡHz*۸ہە)8 z}K{\oJ>[tR_}"KTXm ?  %   IY Xz7m=+f JՆaI׉۞LIZ ?ߌb/ c?~~ S 1 sh A$_ '(t3)('&$&& V'(&s&N\&`&&&7 &x!)'"t'y!"' %}"m/cE |u4Hvv6Pb>U|{;י$Rl=jO׭= g̲ƒōc5> ~L L{0ҹjK?ɰӮۡ= k)ӧ) )*((:d顮áft e1{s'lT7Tz{s} w TR &++/g11V4Es7 8"8e$P9|%:i&c<'E<(:)9!*6;*n<++<-:B.:.E:-:A-Q9-5.2 .1,05+.&*+{()%R)N#R(!&2!"* t9ax \   q   ~ m`7G>dT܁ݺkf! F wf,'%A.,2{347`7}8y; 8P>7>>7;6 94961$2--)&$ O ;g x\ !- nQ]-{9V}tӢҗĻk"Hı9 Uv09ѡN^S޷/sz:k[wR2C+iD^FwO'" L U7$"5)9!..&33)p7T*:*=*o>[* >U)I=T(/<(95)6(5'4(3{*&2+l2j,5,&9]-;-|<+=K)l@N']B'Bd(BA*B,E1?G7BG>>HD>LIROXjV\[t^]^!^-^]]]]]]]]]^],^][]W]sS^FOP^K^OH\2DeS?K:B5:=123+2+]&" dm3 n&8ep_#4-zpl:aDÈD#@Θ΂;ќҡ[ һpizߨCDiC4ԭnٜu\ xN%F[K}lrp )j&oWAKyZ  L|9 }j yUlWռ֥͑'"&\ϹFKϭ4VC֢әQXGc*s  #$w6*`,C6./11 /-Z.0.3 C6#E:&>)C.fE2,F<6hG8H;IA;B ؽϻȜ%ĖOew+hŴApÿuў"B˷HXsĸE@ݫٽdL9ڿ_F0NvcⴗϿKrM`ݨݤUڡ£(+)")})' ;ftԐ'ٟr!%m 7Q `@"7"$#'%)'8*+o*-D,d...L/.@/-?/,/)+/)..(9-j'I,C&z+%*^$(s$'#y&!%!k$"#"`#g"D"" X#,#!_igOpm"];Cy5 :  % b LJNn76 cܓ!+TZݞq9l ,U8'B0I/9M?QgB#T;DS'E PDKAEFj>ICES-JD\?M^N^hOS^N^L;G;YC9f@6>I4<&2;~0a;x.;u,<*<)X;(&z9"7u64O4y W6$9*D>2C:IBsP`JWQ^cVe^Z$^^]6^]3^]?^]u]]'Z]ZU^O\^IR^CWC>P8EH12A+n;$y4]B,e$#H. #]c}s6l(oL`x ֗Ҍ9hshV״רٓժ0Tփ ֻmi۞GQ~Ҧܠރ}ߔتY ۶A 6_^_hLg4)EX \Yk'SgX/%v / hw[  Qw:#j(&,\+;-u-1++%&}? = ;dyŸ3Թ1ݷָ޺R:4̀Ӿ=w;t%  ] _6 B; s" "7&E#*k(/ .4484;A<@?JD,B~FKC0HBHI@;H:>D;Z?79Q23-:-I(%]#o B>d Wb ̾ܚ-Ʒ?Oء졍⡨6ǹT,čQƽȓz˴ˉŶ ̛2׾3[ZcTaYʌRUςIѠ ` Փ/ίB_˲B/(ѢGܭ)gfBN濃RJsL~HٵP22LncvFyU 1 !3Z G#& )"*#V-#01#3"m53" 7 9L::76 66P5 3G!60$#I.#-#,#*1$E)#h)!*OR*E)'#&&W% -"yL!Kq+ U :   E H {W H z[|0{>U =@:LZLfWGSCO>5J9eDE5>j0M8+91+&Q*!"5"  -Bt'Ai,|C0@E`5E8(F;LF>TE>|C=@;='9G843/Y/)*!%i  ][2J`-ފˑ ļ㴡ɴ&MĬZ,ꩦZYfDSݸ%9c־̚ħ`Ǯ˭ЀS͂C,ϒԒ֒Θ]nUonwd ՌA9۶tĠI59ޭe^âF>#;vο3ڤ68T f  Sr9a46!"%')):***k***T*)(>)e)b)o(D&C&}''&@%/$#F'#!? %&L_D7!dO ! h b*v|&hgpgO0 2 MJ rq$=(i**#-$^2$o5 &;6'5&5.$6!5l3#/N,+(##' B cOq^[|gjHF.؇؎0S]u =gWbJ'Ӌ0oOϞYf̛̿.پݡ V)L " z,"d&F$*)R)+-9/22g8}4?7Ek<J*ANCSUE[F]I^]2J]I][Iq\IWeIQGMLB"IF=.F9A4=60:-+$8v&.4"0<. -2+p(&& '|)+ %z-*0I0356 ::=@?EFBIEL`GOGSFeUFVE"VBU?LUi-q6*U.&'n""i7=eI; ztV #iIG9~֘[q5џFd28F`n<$fKޟYZ1ޟދ[]E ߘ` A4hmyM/RtDsMPjf? NB V ]  )750(US O7 Zaxml9ՀpQӢSŗʣj8͋AЦk?j[5|ڌ_ h%q($vo ( 8v!w'-& 4${:)?.E3J57O5;R>T,@TAI:E6n@1$;C,X6K&08e*"0 Zk{O="[ٽ6eԘZ̿ˎڲ#&<ӳ"+n%"Mʡ.G%Ų3̣rєv=Qò3NyV͟+DjϢlю(Ӆz҇&яދ΍[o̽=طr䷩#ʬ~e@B"zDѼ1-΄{̓׬J C+;4oBq ??V@'#'%,Z.g/ 0z 2454D5n565B310.T-t!+"m)" )W!2(;!& A#h!jV ^7FY+<! X 6F6  c _')Ot3 Ola *__} \+Rc!`$='@),6-0/l41L6G3 53221//1+l+r&& /",-J{ EVO$u}ݪ+<>X=]݈vX 7gNޒXW%)Ӟ  ˅OЄU>Cc+԰)֎_؋KڶF0b-9  e#)!]/% 6V(>+EJ0I5LB:Qi rnN9cr$$l*,V0'45e<:xC?rHCKFSN0HPHRoIQkIVPHN]FL9CIw?F:*B5J>0:+k5@&y/ )%$1? ) $F(p:F L:nI{ۮ{.סݕ׊cڹڀفۑ۵/[F47g\ZI*c^,_ %A%b8VIx~8?|>~_{^q k<E4VG" iFw2ZژGExЙ1͙=ﲊzKa=θAhjKNY"3*V_v9 ySg$"*&.29Y9.D~@MfF0VKn]]N^|P8^R] S].S^RT^=Q^MXUIPLDH>A2881_09+'$aLKjt  p|e,͟8yI⾗˺bɡ: HD@;ɩozꡔi"ǣgoDɰ&ןC7^YU:4=Md=Y= ޜٱ_1"Ƿէ9ux֡rz)*S'ݡpEu>I_ۺ&;kQKcg$e g$w 5J !M#\ \###%$u'&('*r'*()*~&,<#H-4./x/,(R%7c#mP`3; EC&/ BE h6b 8u*%l @ e) (\,T/[.PcAdv" W 9B S  $ F}!V!&$P,f' 1+)4*W6*6n*5)42"(/7%u+!u& -D 71M]8ߜ=چ$K#ܥE8QfDNT_v5ٸpԫCcoƩXpOlؽB7߿(̽!6ɵP99;v* WK$&-z!o4&Q:y,>~1$C5F9JgQ?3VAUYD,[;F^\;G^F]F]E]E]cE]E]XH]L];O]Q]S]|T]RT<^WQ^ M^^G VAM8qD/( 4Ej9Kl>P!BiTEDVHEWEuWEWCU@R[=M9IO62DQ2W>-8)o2K%u+ !f#F R  NVڕx.~|ՈҘY %klʲʞnjl(ɚ[pևxD/C[vJ57$5~YTf4~?.=R,K!S%pd ?f .O 5 i 8P D8 .  c R7MiG5~1Gٛz׋ѩ ӳNԙr՝]قlݦߊtCsXaA- %n ib$s- "+7)?0G6Nueiuqp E{agF, ̃| ͥκEgӃh)vq p mrZ ~ Cl & "+6&J.)42.+6,M@NkBMDLyEIMEMEvNFmN*HMJ/NJ QK$TLKUKVIWGW-EV/CUR A.Na>IE;C7<35//+\)'"q$PG ^= e@  O & l>!%E+$0)4.81b3+C4F56I6,J6Kn5K3Ir1 E.@+;V(6${0 )"P 8 Lpd5֝G|CAϊ/k}Vм̵޸ iK5lؖJޘ"תq Jm\KsMH=x.Cl/U:39ͧߟ`՚ϓ3{ŜC)27>EoSD›~:gváɆpϣݐիfOfso)&   K>E(72 e ! F !!-$!w "/##! !H"`J!wQ-{flH  q ckD= 0w.# 6  v  :: f i`SqZ1 o G<~sp;J*  ' `?A"\? #~r"j$֍~jԱ ӾsЩUK˺[λa!ʶ8̱ΑAҎ̗*fzJRmcM X mD"*02?8U!:<%Z?C+[B'0E4H8J+<L?yMBN0DOeEQ&ERCSq@T;,VP7W4Wz1V/T/S.Q/O27M65L:IM=N ATNC MDlLBPKI@hH/=>C7>e1:*5#10PR)hT \q +6 Vm+sXri &"B* 0%4*8.;I2>5@*8As9A:?;sۿF߷װpΡʡ۰A纩N wh؛Q__7hk 2  W&h,D \2#7(<>-A62E6I:aM?OzD RHSnJUKkWK7YJ[>HF\E\#CW\@[?*[W=Y;X6;!VL;S;Q<4N"p:|4C-'# q=L [  +?ljm+xU+ @})[-uC|OgTlmi8OKX,vYE jIW7 , TlH&{ާZkC}cl~i9ظZԕݚ 'ׄw"6xϚ׶߲YEVI M,.;(];\1]Fe9'O@UlGp[jL^N<^O^NO^MY^J\~GXGDR? N:H4BR.g<~'H5.!%NOv -?]ܐ[R΂=XaFgJ lˆhʰQka⻥˺,?ʅ) 4 .ɜ_dP`/ÀĆŷ-ƋϊD AњЋ{BκI6Ǵ`%eK׿݅RKO,p   [k qHS gJb<ީU[rNxͥkԧޗAۡ<ȡ^º=ogҰL'ZDoIڥG:5:[5e g F [ B  "K f .a  } w'l8@  Y1O+ACI \"#a%v%&%G'$V$x"!wj { NP  U 1%p^     ~H     f +-/m<ڿ2`ʾԡϡ4M^ҸȿxƁԋ͘]֘^8,& D'$[+"X2D&8*=. CT3G7K:N6L.4,3*2[)T0='a.$W,4"*&C"t2 AD w {zaoCZRyu91xf5 ;zLXRmrh<X kF3 PnrD--02(brc3 gذ+Q;-^ړt@YsC M ?F."'$( /-r52;6X@X9NDo;F=H=oJ=JL=II /}p(ng}܈d֥k$z 2ƥ4$%*N#ežH ^ ΞtسbwY|j3xwM x$ }5  e* ^Z_t{QiI> [Q  \ o  m  z  y K k  8p_\!!f9!e ,3DNKK_$ >.kc%tP& l )L~+a OX#۪&S,ȳbdʀɤV~ZԽ~ ;˧þIJќ'лՖފt?M(Gn 52k#' s,d#r1%6(9+<.?0A3%Dj65EH8E8F8G8OH8H7JU6(L55Lh5hKJ5]J5I5H46FK6D7B81A-9@39?9>C:< :|<8<6=x69?6@4+B|3mC2Cl2}DR2}C1IA0[>O09.5,0d(*e$#Y \lS %^5n*l^{x$ <O wgY" &!)6"W+",1$,%x+ 'f)''(%)#* *(7%"5  P3 b^Spb" QvT7} .DQ>!;cLx1R^/,d8Vw[?vuFRb|{Su޶H`&ܶڮ؍&׹jZѩAU͜hư.?F|;Rn  G eQO  $V%'v)*#-+0K+3*v6)6'b5$3"0j,L)n&.#{))l2! 4 } }a-;C Oc!s;4P5<ى?ؿ ^׭ݩp٥ҿy#0ֿr>fտϙ͇61ءɒ&1cٜ‡A'՟aӈNXə"\(έ_?O+ƣ IE{U`i// Z  9u AsִϚ۾Er3Ŀ=BLa{'Rcd9|#8/Ҭ֥y754tI 8\ N   p j_   {U 0" . ] E -,  A+,  |s?$FP'A"U)G%+&,','*H&;(#&# p n} + %' $! !J#y$J$!@- HoK00 %ڼσ<ɻͪ̾T[[8fcĂUƻ_jҲ&עLۖ8C@7)R(v ^ d  kg"#U"k$&p%*C(l,U+--/x0133R54658X7;8=i8x=N:=;-=<<=:>O8?6=?O4> 3?1=/9d,2U(+#M%&Ch m0D^ .>3!2?v{y _"*28|;>=O"[?Z%@7'A()A*@),B>3-;#-8O+6h(4v%15".,)&#"A   k ?  p O\S4F qt:|)NkKxWCC-%*8w)|1" n  PHI& 70Hf a6۱ReKߕX rxgjM5#~"XX2p@_<-A ?!h%($\+}( .O+E/G./0\/2I.}3,83,1+/).'>,% (\$Z#R" yOb*  i;dXO45n_4yؾ|pR3ިڔ ز*֍_՜wBJKPBۚշN޻XΒ.Kf̼Dͷ, TrA6V=kF?`I`ٮSպƳќ%5CʈϟsǦѲa(~y*/dC  /Y ` D;D 3=[$X=𬡼ʤb3y(((=4Zkx \!&_*#2-(>/i+0,0----w++((%%K!u } X #dݡ2mE( u W""Y&%"g&QC"/lw} +4`-%׫ͼ?bȵIŗ*x-#L4I0Ѽ-ײ.$جۄ3|cR9 =C '# (.38J;\= g>!j?o#~@<%@&@g(?)>+p=-;-;\.;#-&=+=*>)?(@'@'I?'=(Z:(8(s51)h3)f1)^0)B/b(K.(}-+(;-Y(L-'-%/"1L21e100br/|j.,<)S&E$E" Cx!%w*y#.&a3(5(3&n0"x*G! V+/$ kɑ:,x4ZX #1%*-0355;Y8?;A4;]28@/\6,&3).K')$%_"q D@ t ~qj ' w S x4 g.i(Rj|X$FN W \ o uIQ:<ߘJ^==~hgG)U7n: TCz ? wEBB!"#c$7%%&~&i%Z #@j 8A<f5G  &F q}XNUhD7<'eQ-4H٠+ԁ Y, ]Т=Ѕځ؝sv/j`'X/~ӊDz8HBͷQtܹܩDΉ @|ԩҎվѱռ{˒ Ą[*fʔi"ؔe^YW[:  / :" BH E9o>w %x+7<" mW;Φ6h2ɩ:J:NNJZDSÎϪV V+K,'\}pQ#\ l-$"q Nl -9 n u x    n H}"& N*,!."30"/}",R *)C% 5 _`bF9^+[w wRXJ)|??X ,ٺ^ܧӟ>Hψg9 lܱ=ߘӟ~d#ߝk]mjuv TB3 q yE+$H@ !"#P%#&E&'(D(()e(**'+f,?*.B)0(2(S4m(w5'$61(6)96C)6)26~(4z(L3N(24(:2o(0(R0'/&/&-&",&*k&c*& *%`)&(y''(&(<%_()%v'm%& &<%r'e#(w"I)-!*,:. /.ZL.0l2E3 {4!F4o#2Q$/$+3!'{X$* 4[ ]@DD 8 w1y8w } @ G$( -c1 l5!99r"V;#g;$: &9'V8(N6D*3V+l1+}/+-*E*)''4$$!!vtdq10> ]   h   ) $ dI I E AzI%@&6gsY4 - %+d#S@>X+<ہLM|שm vx7=W `H U3_ Q  Af   U  ^  n  hH 2 4>|?6gg6FmtlMkgYO_bP>wCOr:~7 IEi *vSmrݶIdާ **C=ڠcژ ބ߿Zߥ^к͇{rۈȏցJѪLѳѠ6c՝ۑߝ<_D}V7R{e^R C`ۛނTۣѯה͢f>s̓ďĽȒ?Ȱ6sz=B̚h;EȍC˟Ҟzpֆ ڲo~>yE3&%UF`JA3y3;c k  $6[. "c %!E)i"~+".#/H#e/}".!-,4+&H!Q%0t B ( "* $g K*jq{?FPvOJxMBva/ WD Xw -Ee4SHFOI^+.   op < ^" F!##$ u$%|&&'P'X'&0/&%OX&&C&(S%[$a$!X$?!$ w% $G!#!#!R$f!$ $ %%%A 'i ?( (!G(##u'p$'%&'%&E%%$$+$&$D#6##"b#""C"!W"""&#t)/$<+f%7,&,'+'.)%%6"!76v ^D% {qL9B , xSeyX" %!'")";, #B-#;-"-5"-"q,$)H&&&$3&"%%q$Z"HLej_ 3w I[Fm S*  X-p-l;xt,v t-RF}9;E&H[՟ ںЈפD88<ݶ׳5 5 ",%(K*I,..0/0W/_0-t.++((x%$ "q!sB*fT)  0pb. 7OcJO(&V-"9Idx"tTydl*Z!VA < yrI]VGXv=v s BޱW|Oٌ uo߮f8ݘ(w[:y5}؏ي֫Ҫ-Eci@zٺڙē٭Uja义tQնh˧wϔ˪Ҝڣ0["> + !/"!#1)}A8|~ϒĮ!ýɮѮ蹟f!/STΔ͊`P{CB?Ph$dI 9O1svGWL #u'#'#)(K++d,-, .*I.&,$),#& #JF .F ")`izs-2PKdx/Kݓ+3z, J-9zJ1O}cWR9K9^ao-u $ V W  [m ^g2$ pL&Vb89mFy C\!D!!a!  y8lts>4{pV?<0  !*#$&"(:)P,~0"$5(i9N-$\# x% s*$ .&.&+y"&=8 fDݏx$nt˺Gƃ2г|$;s)VQ$&98mKGYQ_V$_V^R/_LX`CYO:~D0H9&M.n"'A ;FF-FY =~yyK L Bx* TBVn=?8'Y#ym:pJJ'q1(0)/j(/='/'{/&.&&Y.%-$,(#+G"*Z )'$!\  O   C $ R )~'3^ w ! P-; ,  |;DSyvAֈޑӧ8PڇXܡmt? < ! ',47@A J=J,QOnUPR5VRBTOOKIJFqB?;62H.>*4%|" = s>YESw&bV!-  X vo!"x[##`"q "0!j <0[W ' ] XRkEcFߓUʐ؞T֭ŃXJչչ՚ƠZ|̚>o:&ܔAAAud m(rX=e:r w  ^m N ~  lx  M   tD      +2n'e R @\ ~ 5 ; P  s p  E   \ k T { h  x  1}S7\G43D#8_uN $!-~#%?%e%%%5%@%w#eN!3c 2!W"#$ y$'s#!pY#\X J< d   3 .  p S o.Y:^_3` n7!"#$N(8*O*++*)'H='&%=$#"'"6!!J""HL"d"m"4#"!1K YAhv'\k?9 F  ~z=~eU?B  @ j"T!(~$,'/*0,1Q.11/]/.-|-++)''$%%l!A"shM A q(^:A!+n#AH3U&l4}q'+w(1*aK2bC/it5iuq_LxM1-@KuoSS[ReWqg`jվՠTu؆dږu<ݽ!ܓ܅ѰگϪ̠؃HDȲ X˺ܵji؁y@8&^6s+f)f3,B*~wxޯfٴPBX{ϖͪ̍Vșˆ6$R+Yp?8п͊tЃ#3NJ vr{[\}} 1x  P!"!s\Zihbbz] F  -XſA߾ զ֑ƽgF5:uփ>.45K5 G x"Z$dU :  WQ   c ]   r X " 2 ~Y67Y`vF2%x_X fwy % 0 c  O|   / /  w$ O h =E  i rL1;s  G  l2 F   L~z~ +GWM8Xh!!9g!Olt5` ]R  WQ2Ft  _( 6c$TC3!a  0-!6!%! !!!]"!"!"g"!1$H!v% %N K&&2h'' (#*&,)/Q,f0].D// -).**`'t%"8.6HY tCOߔmOߛ;߁h&'Kܞc8 b{$>$.+-Q156=G7=#03'U(  &A(PV3߲7]5ݼd a#A Q]" ?I   8  7li5JP\ Le 8 B8o)zN`i[[ ! _7B( k`}TNIiL4/dC[*ާ{-51ڥHؿ4r:ςԯѹDٺv, Oi ^! " C A rA^!0-R"ʷ˿ Y`-Õ¾U&â^04,5Ǟ zܵ%W5պD q   jB-b!]X~ A ^ p _ H O?d tNjTڅiü!YgMs}u.m}g`R\(>d8S0  YR #X;&'H('Py&$-" _ ?  H h e#ii; Mj!O~5EKQk3{j=j[p&{}jCS=V6^Md;ug,  0 b  v w q 8 0 OPT=h{u@5< a T} C1Y| DZG iXDvO0:Q!&&+,r,d, )v%a"q  0 )  9N)%efk !!e#"$$%&B&+)&+&-%/k%U0%L/N&-',^(+(|*((T)%*#T*"!)!m(!L(7#)',/1G85?7C6B3>+Z7#-i"O D;Qi<څԡ2Zٖo` _-%k9r.3D46"L=RCEVGXJFYMXP#XRXS\V^X ^!XO^T^Mx_^CWm7sK~*<J,Pi #g^L+C&~шM͓j+P6ѿ˚ӛp$֛ںlJ jMsw N Rj25!a"W%$&,~'^'t'7&${"t\ L  * - ?a  pi\!ZyHb% AMuW!cqy.2S 'Q ރ*yݩ&y~ϡգȌЋ5*Πe±1xh0 c  e.jQ}֜Iһ7YaòÙĂŔ?Ǿ$6c7϶ҽZz_ȜΤmPeC  2IN !v! ap@0g6*Vku h@ OdUR>_+Tr̡)*y %گ{21gƾ! 4C="!&$8*a%,+&-d&-M%~,#v*z!'$ L /W& ?riB{%[5Mak(%h %d3ilsKI]t@M>=AUQ|eڒ8Aҟ\y˼̤=/ϓ؏Â6ϹN@U]x M;:||x$  ]  C ap ,Q@ܹէΝȿ`ŅfºV@<4kVUOpєU/_[3o l 7>o e2b`lDl,2 O  [k  S { sODra%@v30}zyw+a) (J x ! "<M#7##TJ"R!+16d L_Kjs}+:P3!d%(")F% *%%)$'!Z$s ' C M*&G c1 [#<(i%v-.063=)6 C8&G:IJK@JAIMBImBjHBfG+CFnCFE6HFJHM HoMnFLEB/I;}D_4=+|4")r . zݳXּqܾߨ5T?HpD2v t2 !!&!y+?".#P1S$2$4#d6"6$!!5`!Y3!+2S!02 /,*( &#5"I!po z.  owfiVeU9TcXIZ|=T'@~!a7uU8=Lir'Q5 U7aG% e{;bzsԔ̽wC[ r  ,Z7 (( FPe*M.xLL$ͅXD0=N:K7\a   B   n- o؎)оU8Х[Vέ$ (())%!)?*(&>ġ5 je7ƴbI8 %Y$- 4$&9j*<,<-;^.r7%.;3,.*+&&<"#B[x jF He(/չ6?ϭcK̸̠ٴ ͆IΆ*ϐSdٓӭcܾ4ݪאfسpw{e;">GP2If}!SepJ8rkT=qp`m e}z2 L3^pKtD4ut~mM V E   ?B    .* w <%o."U4#6#T7!4` 07+& <r L  .    _  P =*1"/!)%.K'4-&'"/vH q/:Z8k}##΁ٮI MX %,k.7J5#A;lJ`@RC[YxD]ET^iF^MF]E ^D;^YD]XCYBTZAN@H ?D=-@=:<7S9r5&83N94=6C7G7pH3+E-==&12%  S z,XcE7ۧ7 Ҫ]mأ.޿m'r.D>4: ~ 5$I|_$ ' +#.%0'31)I5*{7+-8-7.o6/W4010L0s/n.U-,<+e+o( *S%@) "('&e$#o"vXfh =@ ]N ~  d 4| q Z&\q=.FE 5"618{p ),mRuQVAs;GnzډL/EthyPy - '  / F`-1 zz]/S ۡ ܬ5Ρqvʰ఺Գ-ص_fIƃ˧9D٠ܶcBiJ.Q Vok&U/ 7$==(KAB+NBG-A-O?-<,9(4p%-t#& b W! | /yHr7K,ޒ#ި4 [s׎#dG֩yT;#T6F_%+68D&.S{T4y(d1;a~m:j>gkR%vWUl) TC Z^Q     ^ u|B%u'Bx>[*CZ]   {R #$&i$'((9+(,(x-t(`,'z*(&j(:"0(}y'6!&RY$Y##"3"m%!7p!{G s}IxCxZe")}} Yr uC '#/'78+??-E/K_1=Q2#U4vV56V7T19S9O9Ko:F:AE:<9@7N8q37,15/3>/x1~/I./*P0&/"- *%>&1#| -/3g1pDZt4Y#Ud{9c_/FH0r&[ \ P1Y#')@+u-g/9 0 0! 0!/b!d00(0./-+'*)('Q&$#!<)<D=Y3B   nD '  nO sNP%oOu(U (21iId_pc{uMiEPWi4W~u0Z ,[BY 'b'4wۂoUL"ނ V R4?@jV n|fB g$h]P$F U H!0DzN.ڷ5zƇǯֹӼ%5Uj|гv5k08wr(    [K!c~"i"Q"-["v!1;A7! j { u9R9TdVW|!8r2ރ^Sلx؋=H^ٱڡ5ݳV^sI#Se)E߉.(JKaCPrrK/l!iO`nq-)}|4J!?[(]*v 4 * > V~,>u46 4I P  n jG y]  (  \=  Pnjw\UJ  "+X","!<0" s*)tA TH  UW^kWC2mts X #w  GG-4" %#)%.'P1(3*7+8+:+;n,:;4-:-:.;/k;.:]/890 7m25241201m.0,-;)+& *!'m% "af+&  !S /H;hx#hQtZ >x~5 c!-^4!O#A& E(!#)")T#)#(8# 'w$%%z$%%$&z"&!b&!%W$" E'pLaU   3 }o jV!yaQrStl.D

P9Y[5z|JBDI-B]}=N1O߻ݶڛR3QQPpv%njlA4w"!8$J]j 3UG6l+CU]B7:n $ҁۯEi'rgis%Lͫ:ƫ9~Ġڰ[Ӳ{9A7MO  Fb 7 j S/>f Rs} r%)9*72V-9x.>.0A.A-6@+=*;*;(:B&B8"2,",d1"X҆[ցzeםLߪF}|[ {I$f+o37! :w#!?%`B(D+N6@m5@2*>/9)2")$, " %)< $ O ;(<99 8M754311|/l/,n,"*(W'%#|#!!R2AKQHoq(   m ( y uZ9y !>T`xGV Y[GUAkvs`rA?}_9eUo rJ.kD* ڑiد4#K5|Oэ΍ڌ$u k\f r t+&!%lZ(p!+)$/>)7y-H?/C/A@)9)+D ϰ%TƓKfӡ';(\):*UҵڡY:}1"bhԋĒUܥѧ|r߂UׁތѩF=G8tBh1V) |4#<'AA+? b W\'hx8G\d=>3wzlxW*[T ]tQqK=sDX} *clӞ̯E8n[7g7=2`c v2@q!S!(%U/*5.V80815R.@/(% $ NR<)U;p"2ţ-MjȰ/hEhߤ'q?! kjRRiX  np m A%p*I$.0SM23Yt3 1.+*UX%A  8KW }E!ߵzO7pPl>0hʏoOYˠlɕ[.Į"*ʥ ̵ʶR2Ζз;Ղg$ɗ]!̬wѽ۹#7"lofl' !%$S) ' 1 L> ;_ r@ et%-o 5 k ;dA38   z j #  UG[T  #  3q(h Q i$#G/,8j4W@~9D`!+u$S. (0*2i,C4T.5I06172[92:A1;"0f=&.<>,-?v*m??(c>@';d'9&5%2$/#U+K#?("%e ?#i Wm<b>P  C   & 2],TO.EuIl&:&sQ"W8ay}ydiT݆R܂܊0,8;ܠ۾<ۆٵAZ#ڱ?ZچX|AW&0ChJp | c  `g H T  Qu:* MQD(+2λf+U:pȎ;iǻt*}I †R_ΨDŽS˘7sХ9ӣֽcW\5&'w-)ydD|[2~_ f0 .?xpKj[ 5 7Jhj TuPKDLMܘ0Sd2)qZ?рϪiہˑʂݧ̺Vq2 p׮cװ!׽2>\.ڃxOu_.ZhO4tr/9g$>)w";Y  G v jF C> 0V ;$     7Dn  q   %  @ W fR kvj!(#C$;I%L%% &K%#`!h"x]l ,Y   0     ^  5 D  Ff=ptJ!kI$J%O!k&N$%'%|*&,a(K/)^2+g5,?8,^:b+;:+| } |(uvQ~kjM4G5@ gSCS><#$Ow,n{ץ"ۇd  kFvp~gC=,+ n S u ~ R 4/ޡhЌ cUŵԽ vv֞ciVӺRԣYh؃2!۔ܤL1Lbϯ F}ػڼp%M߰>-Y Y : u.f!/$ D$]$$-"7 u . rUDoU7'֘Eһhۣʥ٦ǼĉԠkӏ\ ( 漆z$=bը-BŤQ*8ـrA!PVa$B4*_E,EF,{D*A';$P4" +#y  `Ss:=J2ABDUpu.o'c = A hbH '$g'-+@P/ s1#2'4)6w*8,:;/?,3G7"OL;W>`]=^;^{8Y4dRJ/WI1(=\!P1%YP  [W=A!vo e& k3b""'(+,01l5q58::v>O;iC+:G9K8M8Nw8O8P>7+P7N8L8vK!8xJ6SHI6E5B 4?1=/9-6*3'0$-"'"#"ZF ]SlL075  H/ Iw 2xY   $ j]Q DfPw0E!Ls2mLlOw:K|P0R"jZcO=?p9?c!اPh -M%6&6".V&"  Ao - 9}ҎdȚ7ʭxë]j6³ӷPq7 ؗٲC<ٲpB"q*dA\ksu|'F8֡EVڀ V15 p#|+d 0k2e200%,h&@= F_ /' JR7!(ٕߍҊE؋ՐDuHkǪ|𽃫skWHmo_q7iAv7]` <3vjՊƑBe,?ߥӺbkSEg׭ <܂)QQp #t>[\\4`sW$]!f-Y`$YE~4_cv[mTon'E m@Vb >WM nF L 4D/Jy;i[C_wGy_FN_'BT[x: QO1D'7f*DGkV;Pg1- L :z> Z< #3&(* .#0&_4'7):+A=@-@u.XC}1aH'7PX=h[dB^Fw^1Hy^F^9A^9vV1bJ(8<! -p *+|0 TB:qP yf#H o*8#0S%76(u<*AR-/E/H1HM3P4R7S:U;QW:W:&W;jV;U%;"Ul9;T}7R6P4N33Kr1 I/.F-Bx,C?L+;^)8t'5%1)$-V#)"%@!!WJ98y  @ (NcZDUF?z0Bw-D`1Z H{U0Sl5;a߫E fVԶ*I5%ρ"NSn)a(:w2I: Sl=1U;O2C6'2-KD |EN "2 ੿&ijGш2mĬңOҙZ=)IʄڹN;ӗh H]HfOAwo,~EiK}w2yIM[gӸna(G6 A  :Tc K J `u*o`rcO3р˱ 'Mܴ8ΖѰOȾ.F1K 5Mk7fM7Kl6H:3D/[?+7'n/#&r nEI i2&dTzJ{WK)Eb Rck"&),"K,%D/0*3.73;+7O@?:tE;Id<)@+t&($c&! $OA!cVg4E E b BG{D pY,NXBBvZ}lG^- LK14[Z#'c[hRHW!LX޽/l]1B%h:E <  ! `)(M5ݍC3&R}۟<Ƚ*ԽaЗςp 88 Ƣ٢ʩαҿ dۀ(d2UX]Ne:L$Vc !|i Ww<: O sL#M@jg ?55$[McHaykl?:\ [0UߣiܤcWwԐL>]lʌ!؃D״4^iֿEռB=՝sַCp؅zlzǒ7͈wЗI{ՎFVOىMi@#8_+\qJ|za-(z}lj @m hWr{{7&\*    8   @' |J}fRrLq.#'*.!Z2e$06/&9';:_):.+:+;<'+|<+):(7D'36%?0!),y'"_^jD  a 39.\Ilvd1=~T( V J 2" ' ,"0"2#h4A$t5I$6"8 987q5(3^1 u/k,):i&E#+! /  "}  K  9 !x0#%V'5){*+3. 0u U3 5!7!8!t:":#3:&U:&t:&K;B&:&:' ;(k<(=(3=(c<(:(i9R'8w%7#;6 3i1/ , (.%/"g I^G<' I \ H  4{/T &;a\br57 1"K-r741P4\Oۏ۩ݔߎ`0yY9 # Qe4 !! >z +it?t ͌ՐͨyƋj˵šlK "Ρ޷(? ӹ{BVSO*Rjo-Am  ; i   O1@qX(I-"6 W l 6 [ Q  QM/0Brm*gg?ԃsΨ7Cڴl!?7̈́Sɜ% m`ǯЯ'-dLª*ʀ$̭ڻ΁eѣ&=Ǖ-־؞FGӓ~ِ=ۡ-bޘpC -C:J 5p2$ w"Abvd9 5 >   C n  [  ~ >tQnA*   CymN!& WeM N*F&6, Be3M9W=^>\_x=]:9V3%f SC}7αhșӚҰUԹJcDž˯ϒNRk+IZ $J L| &,!52&8^+?1F:NBW$H^`J^J^Hv^SF8^1BWd;^N$3FE*q;%#P0.%`  -r2hm   CF$4)!/j4_:b"?$[D'gH*OK-M91P4BR78TQ:Uy;V Sv<2R9JQq6\O3L2zI0Fg.:Ca, @*;)7'W4$d1!}- *t'J~% "q4 M4@vFO 4 O e  Es1x!}&l\fdu~k+]9#XJ QL߶1YMġڝězs2t)-Fl3S8}Z 8*Z1RY)GE(!4%crm& 5,,ڹQwµti[? / +H"#k"m Mv "NnG!b!+28=q$Dr*pO18[8^S=_=@_9^:2TS(C1Fc U.״܈"jȇ«T@ ,Ŏؘڬ׺Xm|E }m #$+N52Z'8]>#F (Qs/{]p8^?i^SD]E]DF^B^T<_4VE,IP$;.$+Z <y U  q ;/ " wC?"(R./4*$B9@( >,pB/F1+K3O5S8V9sY:[;\<]>]D>]=]=]=]<\;[:Yq9)Y6V5S48P4/M1J.G,D*@)Y<-(7:&x31$/"+, 1)&j?#B`9m 6> .x > V P [ k iO?wxKohe@3z]|D&U!^H7֌O<+޹f{t Hau+!7%>7'@&&?#:Y2H' uI wh22fn)Mq_ȡ֣;+Ѳ3`('ج1^ 8*խ3 gz|<;"F*]1 7 ; 1A21D1F2RH2{I3J3J3K4M3YNq2 N2M1L2K}1J0I]/G/CF.C-@h,=*:(7%5#3!v0 ,2)L'|o$!?wH#   AMW Rp'8 [ ^H!\kd2M'c *[bL7jpvl!~;?F@f>jie+d ':HEL kܿ<2BԦeВ؅v{ƞ4A0ѽ@f'/}0'[sޟѻNݖ\Qs fm/ @e qG;Wxr_[YXZ L PK>dhqwmsoߤr'CCc}; PkI6{5k k0 U w%  K  Z   ; w ! w  !# 5  d#@(\t-  O     -t+!M$i'1W)U+,m V-0#7.%O/ &0$1"0!. ,*(+%!{/s> b Rf`zoH T7 =5W Q*6 x! %)**,v,.d;0112211$ 0Kt/. .NE, ?*C)m(5L('&'s($*yr-/31\35V7 9!O#L@+%_B &C'E(F_( H(7H*G+zG,AG?.F,/E/E~/ E/D/-D.C_-B+@)>&;%8"%26b#Z3!/ +s '- $x{"; &5Y)a% 8S # [@ 6i49~ +VsWhkdyb6#߈%Y =P *| >P  x@(nB T-ޝ?Fr~C64^;ԼmpJ#d~՞ԣӍ]Uȳדt4A/ڵNLj Q!ew& x*,G!-a"-",|"*!(%D]"-&   o]gCy}q i3 UlupJ{@sV@p;Ռ˚H¨62ӵ׮3ɻŃ9^7?^@] A]:B]B]WC]%C]jB]B]A]@]m@]?]?]?]/?]>9[/:sa$r:Aj@E۲s  #3,@2F4F2Bd-9&."q \ OH]r!1u8& h +PLGPRuԴiּ{@vДy!J l%2 =%E)K,N-1Po.jP.UQ-0ZT\3Y@8^;(_:^7U0G&,7 $ .Tm=Ѷ4׾ ɹFLǹoǺ0Kv#sҥɚxb :O\ 1b ZE+U`4t_x9D_:^8^4W/N(D9":J1)g2$!Q""#&,*-#16u;#{@q(bEu-sJ2O7TH;YE?]DB,^C ^D]D]|E]WE]D]@D]C]C]*D]D]B]GA]e?]=^J_-#E0+e@(I<&8$4$1#i.#+#)#&$$#j!#w#6"x qb3[ J  sE Ce o XV=<uj*Bgԗ)c #!_)(e3-7G/n7-|3*,$$$W }Z{*S݆ڈؼ7Hc6۹0ߑ]vu ;I Evk&-(+Ԓ)#1J* :R<_eβf> &3 =%E )K+M+M,qK,G,qA+:)3%,C!#30 1OCߒЇp|ϓFՇ9wuKEn5*!3}3]gC&<գ6ƨơoľ6ۦ@"kx$/*(S(A)()!Ҥ)*Q)(4)*g(7))͡7!!|”aaѹ>⿃Ș0˃ 4Pמn&Iureڟܞަ{/[7qPc<$IW336 tRiIPS@&~ {@_ &$`*/^2 !2!2K!0! /&J,'"I15 , C7dJG$+6 /, qpӲӁ{ b[QY !+)2/3"7&<*@f-rE/*I2$L}3NK40P3O0K-E)>%n5(,!|  D4[L =9& TڻXV_ %$$4,;2{7 _:!\@^B]D]D]TF]WG]G]G]G]|G]G ^CG&^)F\eDjYBFV|A S? P0>LiPp 8*)&V_#K32o%9~W T8NecqmG|eF|187m],P *qla`#f.{AC"Ц(͹yWۆə(ۛșߵ0E1@sp~ CBf  D ^ ST T # 9 a%?e I]Yy[ TcjKa|0/ص7Y^֑X4LҪtۮ%`(˺bΥ)Ž ))l3~ѣ?ijĢרƆdž9Ȱʝʼ˩>Q!͎̌׀ڔLЃ"^sյ ېh5r;Jy5!fRprm@79I;? G E V #H'9;COtm   N^ ^l3[D0VS^@>S [ c A# F.w>p4?9_Q>+5< M  a U["'!,,$1&5(?9:*;*=~*?)>P(=>@&<#9+!R5C1 -'D"K V(P Xg1'd?v"~Mq-I   hED} $ ^< 21  u  [ 6$"()&p-)>2,7/<0"AS2D 4G5~JP6XM6O7VQ9sRA<7S=SZ>T}>Ug>V>hVQ@.V@U AV@!X@Xx?DY|>X=X=V@=#U=S5;?3I9l06$./4+1;)s.&*$v'"$G!*X[  - 38{ C<\;\q\N,'A`^G@B u!, ?}I&:ۦؖ։&{K4Րܫ!yޠhP 3i7K 9z(/iZ1ҿڏUvѣԗ_޴e2gTyvVX V o F  =  [- zi ,#~VVy,_bK} K3;hkxFHϤޘ%ڦ۹´Gɒ ̡fס?!(ս()Ǻ*A('*((*ǹ)K<ޡ"# QÁĘf L`»Խ0fQ$}өJc\َPێ&݂}߀#\??)lNgBm'2>$V~iw 6\0 1&<+.a//c,')"Np W  O;V\4wڄmڷgjeI&wnn(5A0Y,n'm9l7 0+9&."5>'=)Cp*I*]M*N+L),RL,M,O4-yQ .P.M~.dH+@'V7!.+/i<V?߿hǧv֘Á(Z9:WWw u q"%&S% #O P!1WWTg x ' 4ub% ,$f4(;=c,aF0"O3 WE7:^:c^=#^A]E]rI]L]N]P]R]T]U]V]=V]$V]=U]S]R]2Q] O]nL]I]G]F]E^D:^,C]AX>R;Lw9F7u@@5,e8*',$ bf8 a a CtV% ^)"+\"h /W K\U4>{g{;BImBZsl] d OpIv^ "m)-A*j$S Me[kbQҬt : ѻUEÇLNk`O]| 29   (+T 9,$C+)L},mR/T0/U30S}.N*rGU$;J7*L.g=C3zp$ 84@@K^(Jo iM JڮE ǓaôͫTOh˵S(R$*(()ǯ)!)թ*é)H(٪)**<()ԯ+b)δ#R)&((ٻe*ߡ2Ćyl$˟<Ϭٵ+}[űbs˯ܔ ު/޲w3 7:Bݳ:~P tg&x܇S]ze{zwR;2(N5`l;~`<_8F])2N(>-I }!G-'Mj+Q.^T/`U.U-RX-_O,aK*mG'B%>C#;i#j !-4C%a js2R&O1'%Wѐ۰0}1#S-'14/vi+]%T > dZQB  % ,3 ;$C)K.R3wY?8^u+53&*<Z0 _<RJ {    WD4ۊ6e]'IAá(!)ɰ)((J)n#(c)7)(V)*$(æ)+) ))A(()ڶԡ¹/Ɨ`˨%)ҨvӉ3xs? ؅ڞ<ۅV|c8CzI@1d)Z׿PڪP$ ZMs*6?DF;D "?x7 .%eX&.g٦0XHإ ٸ&u0ݪӌ)\//<(-]smCw_ohu )'C08"q?(DE-I1NN447Q5gR47R7Q>8O7GN5L|3K2KB1SK0JY/$I-4E+?( 9%1 (n &7k rj٢֖OX ij:[A ip g    @ \!(/`g6"Z<'B-?I2/P/6-Wl9]<`^@+^C]E]G]GI]$K]4M]yN]O]O]QN]3N]M]L]rK]J]J]fI]G]lE]{C]>A^>)^<]j9Y46U2148"='&wB)F-J1N5R8^W:q[=3^d@ ^B]D]D]JE]F]G]G]QG]F]E]D_]C\'AT\ ?M[<~Y8:W7lU5hS4wQ2aO0FMP/|J.G.C,?+<)L9(F5'0&.#+ \(4$, _s1Ozk6a(  F (>I27Nyj R L xZ b+ ^.zB}v| v3IishS8xea$4 pE#2W[h^<^9m] 8Y5U2FQX0WM[.OI0,E)A`'9=%m8M% 5?#1!L.D +5V*1($!=>|~EdKnlk} } >L{T (O i V Rx  $ ( l  =  Y n M  7sQBdWu   w ^v  N NM S)!&(=%R  QHn$pW˂۟.فךg0GYs59rZڼuU{"/ 'C-p-*$(l&'+PV2=: !@%[F)2J~+L+IM*K'qE$}>-6T,g  VV?:9צ] uԴˉindض)z*()+Ѧ)!)¢)(!()\#C(*~)\(#)*l()-+)!hܡο֣z-œ6`1ɹbľg_u'ҜƎԛ:Qǫ8TkEt(r6 'ؒ!=kO 7/8!E]+W1`2`/?W(F3e N-L0vlʶ ˲^WuƺSfUo_O0Ȩ˚Εdb×yˬL;׉݂:& !Gx^ /: Q cG5~"r t!(/g]:#&B(G,,KW.TLp.K%-J *I,&lG5"C6>8^2P-'b!U J O  m{(g-+ ! 8C 4ϳ͵Нy`~.Ye<leğ/vԐZƞ۴͗|{}(Ld $0*!=B)I1V7_Z=^9CF^8H]L]P]FT]W]Y]Z]+\]]]]]]]]]]]]]-]]\] Z]W]U]^S]eP]L]`J]{H]F]fD'^AA^m>[;W8+T4yP1_Le/H-"E(+tBH)?(<'z9('6>'3'1(E/(}-'6,&P+P&-+&},c%s.#.R!-*&u6#Mvf1  j^ N q_ g 9 Z   Oe <c(a+Nn k j l "* Qll#?1n6zpi " u n   =    FS Bi  d 6  %O'$0 ^;lHpTS_%µ߼vަVK0M:\Ihgڸ};' Zh6 ! T >#F%)/6z#?)Hq/O*5LV8Z9[U9{Z7U4N/F;*Y=#2' Wy x$N֘Eτ[.h١ %() *ˤ(B(*((++))))'*(()q'()ݩ*(o(*(ܶ% r|V ᫽ȚSʤĶv͹ЯKCQnɚXշ .⼜6Ηa& rs՝>#{F X*7<%A'wG&G#Bf:.)!q %7r&޴whR΂.GXlʴEN6͔>Pcħɚ։MәڅbPPp_/Q#}#@,Mhf-8 Ik [O +_ eNqQWE) F{T $,05;nA>-ECGyGtEA<>9U-51v7,r~' "JER!""D  z] %G pm?$|t~Ȇӫ\LN, "2[ %"k-P%8* s9r %,R0Lh-   ~&kx1}'W ddiYZkٸe`ގ]#C$t9}?k&0 Z 3 |DDl=j8Q>wo 6 W. z!$u'SM*,0/135J8\:;V u^@]C]IF]7H]fI]J]J]K]K]K]L]uK]J]J]nI]H]H]F]F]]<]:(^8U^s5\2W0R.M,*H*B(=&X9#5O!,2P/d,)&#,!3;P N  y . -U    7n=sWvc{rX)zLdC1^I^Ih );5fU,xPKY(~7{7xt;F/ .#?ܸ/3أӍ 'deqޯIǶMƄ=וLqIJHHՊ.ۅ͗f׾~ }' T s%^Z,e 245r5%4o1d-j(## jBn BO Z7ScZcN9[݈_SBY=&ʖ^)/)"!)[)(() "z).*L)()a*(q)+)N!N)H)h(%(+¡}ӢĘcyj#&.z.л|l  U  zj%TvdKٗkүݗH٬/tÚ翧ѝj껦͏Ͷgw_XӧƼ*̃n EؑܳWEt+MT937xrK  #p  V  J u?Um ~"S)_W.F2d7D9;<>&@,Ay^A?m=9u50_+&-"i X  qY0P  q d H' k"~{"Bk%Ol\O:Ȝ*ƹ[Z\ڔx׾ry%ړHN#^ @1P(G>z0VK7IW>J_JE^KB^UQ]U]'Y]s\]3^]^]]]]]]]]]]]]]]]]]]]^] ^]\]Y]V]S]^P]2M]J]KH]E]rC]A]@]@]@2^X?^;^07=V1L+A%7/'"4 u. ( ]  Y O,b?O=(u "/#u&$$B% %%K}% $#{!&Rj^sm  P p1 o  l p f R E k Xs i >  O v7 Pw  F n  ` l ` " p&Z!(G,-+y%6p I;Pթbë?z@Dn͓K'ȘŁp¨HR5OH5 f"2+.F9YC_L^|QD^S]@T]R]O]J~^tD_2=_V5?Q'-A$J0V }DVu ?ͷuvͯO`{ *(Ǫ)+) )*(&())%%()*(/)*(Q)+`))*0()(̶)&(P)-oנvVGϮC٫]F"pc5 y $0*89Dl40(y g8E&^ՙΡ&/˜Ľ()Ӹ(()*ʼ֡54Zŕȭ[awÄʑ:Xh_m#!+L*  l   k  Yq Z < Q:~\ܚӿүݨD^8oy{ &x/$6N;>?{>$<683 -0'J HF p] Z \:k2 fM'H N![2~i_Ն"Ɵ)ٸ$(P((pT ^ȽO\ۡ 8L 4 U13B<)Q2|_k;^[Cj^J]2Q]eW]]]]^]&^]]]]]]]]]]]]]]]]]]]]]]]]]]]^]]]Z]V]ZS]O]K]H]D]B]?]=]]?]D]+J^?J_jB`4/Q"$2g ovD _L;#r*, 0~4f"O8#;$K<&<(qA\/r! 8M wS " w^a LZ m QA%93#<&?*%~;$!0hj"; !~q覾BʼnT (W~:*$#lȩ=H޴wK`݇q q(%SC4[KC`O_Y;^^]^]^]s^]0[]Uo^M_E_ =zT~3B})f0 @ eרJƺv:*ˌB,a%*W(()'( ))*((''**((((**)))*?)()(()*&(=&*((顋een^b-=ZHC5}| C K(+m*k#b.Q) a Пd)t#ĵ*V(()) ѡ˜tnʗ'΁MmڜY߭6pSܗGex0mx m3Z|o C  = [v+X No A/OWQF1)!vSp ']< } &'* ->/"/>.-Z+(%)!% FIad IAqJ#Tr7 5#I Z\c!; Ǵ "|0۶xO >?L.'i:t[ $3 jB%P-],6^>o^E^aL]GR]2W]U[]V^]%^]]]]]]]]]]]]]]]]]]]]]]]]]^]^][]Y]X]W]rV]]U] T]TR]ZO6^J^lDK_=W5LL.N@&5 -&O!f7O+ #3&n )O",#+/$0%h1&(2%2$82#0#.F#},"* N(V8&D#J!#k 5t   % :  9{ Ff _$1H(}T5dvQ$u7e (  v %z{ L }Hr>ًlמ$.t~'֛׵1X׆|W\[ζ̃5sϟlܢ{]& \*-5 t@Y&IIl++Q/V3+Y4Z4XZ3T1O-dI(A"86."5~ ; qYXġ޸9}~(c')[*()n+V)#*h(()\)!)j*͢)@($)Ģ*_()W+m)" lt51ǭH34 gIQ|;95aݣ6fީ]ךY֌4(ҧѱ>ъ,Ч8* 7ՓϤ0Yۻaߖ߻x*E>GL t    &4>  LvV3uh/u~hQ 0 w  n 9 n  /N#-Ql[ o5  Q"' u*| 3-4 .S//#0rV00.00VW0Q/D.+2)'& &*>%}#!S UV  GY &@ :w9#q!^_6E&օ׽;ٴn-(p6O. .9)`17!>&F*M-T0E[5^9D^> ^)B]D]F]6H]I]?K]M]N]O]fQ]R]R]Q]P]P]=O] N],L][J]H]BG]xE ^>C-^@5]='YL:T7P4L1mHV/D,A)>Z';%8#6!50 32W1V00C0U/.H-K,+)U(`&{%n$"Bor A W = p e G ! Ui q|_C',]bShMABi^I^h"ccuva`ORCnQZSl qDD& ~oqZ w{nj&QĿ# -"L>GԨAߴX/[k&9Z #1 &h)o+ ,-<,M*z]&j""WH ( =T/.sBlD>Ʊ߶Ӗω˕ǭ硁*4(b)+.)*!*)!)(k()r$()| С Åb|2TײG֝Yܴڭܩۼۿ@ْ4NԙK!Eʦ:ǹ?̵˵tGʴϷ)߷fA4꾩 ¼ٹ(8r& cE1+ zFs w I V     u4   & ! LRN  W/*j9 K2 sv R Ri$(]-M13567M7u5p31'/H.K,;*t'z%$#%/&(T))(% 2 %dz B)[j{tްҩ_"ѡ ƣtNjYɣsiﲾuvrr<G z';3c>"KQ(V.._+5^:?^?]?D]pH]jL]SO]|Q]T]W]Z]S\])^]^]]]^]9^][^]Z]T]M8^F^@^M;%W6KM-1D-=*73(3p&91%0%&E1(2)6*Q9*u<+?f,5B,UD,WE-F.kI.K|. N-N-lNx-L-8K-DI1,-Ge+DJ*A(= '9O%H4#.!b( J"% Z~*"b  7 9A dz><?}_rJVNG6D ;VL{J \ d   P U V M  0B62!S$H&uJ%"2x)=   I^eX@\Q,ϩ n ӈKӢѤZJ$-aFTpU"t4"TE*S73B_;:^?_^C]F]G]F^C~^$@^y;[5%P,fC#5J&} w5#$"!̾Ҧ¤nl(&װ()f*((*a((*))))*(()#!ʾ^ih7Kӂ*h)(b9G~ m] w*3Μ8aԠ]_iۡ( )ӫ*έ)()(ζ(⡱fD#!wҖցSx<ߏRI(X<i  , 2 7 : " Zg j   ,  ^  2 z 1o1Gz{0:<ѵPgچ%NS | '+5O/m{1P2kZ1[0-j*A%  N M=Wngo   2 - 9z4IҡLa)*E(>)y+D¹.yNd!|3GCa$RZ.b_6_Z>m^E]QL]-S]X]\]V^]^]]]]]]]]]]]]]]]]]]]]]3^]^]u_^Z_G`3XNk"(.lw ~  9%3m#OA(L|.V3#_6^9=^<]>]>]>].?]>]V>]R=]-<^:;D^.;"]:Wi9uQt72LQ5G2GBn0x=-l8*3%(,3&'"e#jF z1R 8 B  t z P9 7P 7/ X* y ) N rS ;4 , 6  s 8 Q  8 ]r  Y4s]e  ~c+";)!G*GHr(>Z#05Y F Y|zoRˎsfeBVjv-ͲЍ6@We$޻˥ݠ6FV  \."E-[7_A_ZI3^N]Q]YQ]N]:Ji^"E_l?_&8S/C&2 P!1 Zȓ钷 t˱"߿().*Ȱ(&w*#((* )))**))$(ѡ)p('Cxī fS݇։@ߡQ'@hr;o (I/Մ)):T R    dZrg-$[gmcPo״lxg q,! %g &( 'c '$ % " Z 9S%: [ m`M.% ?  g)de:TWֵ̲w3Լ$#˺̡VyķʞD]0CMS(C H0-s@JP%1^, _b3^8]=]D]YJ]N]R]U]QY]\]4^] ^]]]]]]]7^]^]W_]W]Mq^A^5._*iR"rCk82o2#0=1zf4: 0:s$@L*{G'0N5T:Y?]UC3^F^G]I]SJ]J]J]6J]EI^GA^E^DZBT@O>Iu;C9!>683 30-.M'R-"*'zS$V 0u|  X 1Od N P/`|jq)>b$aBg/Bt<b?v3 0S5,Sm w )U   wXH  B0gatohކ ֖so?rmE.kLX Bͨ͊6ѻ/Fj|v`;y !( )3:#;'C*IZ-nMM/EO0CN0M.J+Gw'A#:2D)!t# O]۠=۬nꨇ΄9ķL%)!*e()+)#͡)()b())[!m)7̡=y=q2)ZخVh(ߛV1uYL;\Ę_JÏ,ơ(!))( ()$J(Oϡ›NbqͷN}ɓgߌؼH{y) uX,  ` "r%'*r,L8./m80</..F-> + +)j % E" C  ZI C {Dwk . ` )G|zIgo+v 2{6~= Z (  b c X     y .}zw  }xNbB߈c. (V.!R.Lτ;hչL1 }hV#; --66?I'"iS'])-^2T^#8]=]ZA]E]H]J]ZK]K]L]L]>K]1J]I]I]I]I]G]G]GG]H]H]I]J]3L]L]K].L](L]J]gI]EH]G]F] E]C]C^A]c?[=gX+:;(8O&3#.R!`)+x$G C*JI> X \Z0>aMOu]bkJEGap^M>"1s<^b2s#)}.EA(prMUO ebYm "cQxr6| bϭZΘx6T | m)6z.G([V!r/m%P+W F im64sb(k 6^'ׇRI˪u2fߌUǯە髞QJo= ?[ZԬ԰4 ҈!t9Lʭ la&&()W*((*(m(|("kաRūƭU9ʨ|ٯ2?{̸ vTr\"- &f .KH!U2? S!! 7" <# #` # *# |"[ C!   =   }f XV:]- *vzK ab  1 \ u"$&f'&u&i%q&&&&&%Z %ej$. z" Bx[aT (h,hpo%p4JJs9 |҂~܍G(w^t a !5,7%B5+M0uW65._8^;3^>]H>]y>](>][=^;%^9[ 9MX%8V6-U 6U5OWf6Y7P]9^:] =]t?]A]C]dF]H]wI]J]J]uJ] J]nI]H]E]C]A]>];]9^76^5u^%3M[1$V,0aQ-K+E6*>'9$4!!/Lx)$D   0v 2  nAbEk?! nU S?7TD? wEmO4)i9 v  !P ju c S  ]x{f<-CK>aWKj,gź~ݍ+ݕzߐCgLgիBGgZB    "&(,/nA6<A"G$L%4Ot&Q&Q $(O!JDW=40C*  b/fLp?bɫРf Ɲ@&(z)*i(;н_ | X3q.Gϖ2:ʵݪjp͈?h))7*)h()V(L(')*(ի&*'ԡ rGנ*Dp#4ګ̬luxtkFc2e #[uUBn?cTN%}:`nVq:E ?  MmC+VJJՠjJZ ݐ|({@9 i  < R B h   ]53hM  X~@zdm Wэ~ŠٕVSx֬ٿĽʮ0oZGɟٿy+akfƪ# t. 1))" 8E,J5]AB_N^X ^^]^]^]^]b[]T^K[_6@_4,N*,;&0%/O'67,C3R:/_B^Jj^Q]AW]<\]n^]-^]]]]]]]]]]]^]0^][]X]bU]R]N]J] E^@L^;^6 Z2S.M*G6'B?#<76/a)y$W )29  ;   O 6 < K c t  < 2 _ x  To V tD ;- ) o   s/ v  C Vz #pHUsn _ 7 = 0d"{"1':&,9n"G0(n"NAPϲɍe_$ęݞė5r(C:s CחNKmڻ^LP Y/ ^C% iS&^+_,_,*_V#:O8*Yj&l+Z4@$#M'{V)^\*]*M[(aUM%L "B5'|:v 8wgjtG#IaYt)(s%Cąǒs˹ΚԳVч5+5|q^ &\Gg/>W O0K!(!())!))**)) (ߡ)*(~)N+(ԶơVi P"LbƝذϵ׎BYd$& ]B)( Ye,TmtFx5s"z   _GF.>v+FFQHEP mSANVA% _I2),rA!™Xe8:~}w_  l#y ?*l/L22`0-(#  /j gh0< B Dl%xnPW]BѠbmQ$\kf]~ݦV7kՃ۠e l9 /%&E92a]0=_F^'M$^P]P]fN]PJ7^D^>_6gZ._H'8",g f)o!l-?$7)Fp1~X88_A^IK^R]sZ]^][^] ^]]]]]]]]]]]]]]]^]+^]6^]Z])V]P]K]D]>^;9d^2^,ZW'#Ri#]Id@|8/M(m!t T   J,*m=}]-<:e}h!8w Ig4> 2q8s6Zh\JJ3J!(z6CP ( \kq B R e!1/CmcS.5͐ʷ|@M|Nͮsb J s'H3"<%'A'"Bu(.?h'9%2"p,)'#g!  p !&!##n$9D$2!&  O s\˳ѮȬkͭ"ӯ׵ Lb:A|*լp} vTjԲKӣTȡܡ)*])h()l*(¡)+ ) !))((k)#((;[@ĖϾulh"\TD~=A EN " +E QL a <qg]C( ] 2 7I^H n NP<'ZK: $CQr<F-^NHش՞/8y׷70ޞ~Qr!Gm"eigq _ dI&p#g)N/48 !>"=?D#@$C%G (L]+S .Zg1^5R^: ^?]D]H]M]Q]BU]W]Y][]=]]]]]]]]]]\][]GY]V]S]P]L]bH]E]C]W@ ^(ϵf aڅyN?;t}zC&6)CD/Q:Ea:[asXv}E!;uN*zӫ\I3\ma~WҼBɲ ν˹W̦ZݡB5(ξ)&?()*\((*(y(*D)[)*(()'H(eɸ7deӪw'ἤߟj5ײ5J/{M~P RB % ?oi /";\k_:.   C _RE n1  - }Nq s ug  ' xq M%    o 6 m yJ yOLO(5t "C%K(*,g--"f-T4-NE,y*+( z%[ ! ef q !&,!G9yRb$s ?If~;! ~ a  R  4 NHOY  ")^C23:0B$QK)T#.]h2^6>^:]=]@](D]F]G]I]J]K]L]K]YJ]I]H]:H]H]G]F]E]fE]E]8D]gC^vA_^{>^:4Y6$R2K.D9+?'9j$5f 1w-'j# a V- I  [ `^>G bnioHrx*w.!0zC7xqQdJK|_sF#7SWw!|Da8=*;iS 3$RZ0|;c؄foa7dQ_$+竼һ!腼"e|xdռ1ޏJ-PL`R S #""!|6. \>E6)"z 'V*<D pmyߜeFtvF`v35ŝǾo)+)*(()&((())**((&*((*)ӱ(Ρ_OѠC űUCSwlhJr.RE8@ Kn fA\kL!shLnSz  D  &  UbyS@Gig*g6uh( &x~OrP;іA\3^rvM a X|R!V%!'"))= *)Xc)<+)^*%,./b. Y+% 5(?E0c)tޫ\N'!^~#٫B>͍ϪS-ۦoX!Es) .' m/ k- x( 6!d- m-n1=zټTpN`6MU'`2_E>^"I]WR]#[]^]f^]^]]]]]]]]]]]]]]]]]]]]]^]2^]^]tY]S]N]9I^Dk^+@^e;Z6KQ2H/?4+8'2$- "' $F i } ?d[ K NU ^>SA*qWJPa[ cP\PW%&Dj]%=kI "  ^  g  3 A + l K z1 l v Ej%0476U0F% Clm:7ʶRڻܴ s0O js䗻dІ5+I "3aA ?Mr&]V*]r-^-^,^*;_(Y&YP#D44#?; ᧲Ѩ:>)дn L) 8`GCIxKH *A6>*K ncq˄Vv;BؑcJiС((V)) ))**))(())**(())(+)$e*d($(&8^B`ѠApˎԇج J P# G,\8 Hh; 4  }BQ t2O-*FX6'mLTQ?a_RVxI )Vs =s֠|g` V} uV 2*!k27t:y;Q:t875Q13+&" !z'j197 K-U @=ӐY˲]O'IáϾ(sz⡀iנ)dӻفt=?w W*qQQ+a3 a4`0`i(Q9R! B |ۄ@ǚ',¿d~N )xG9(1aR69`C_O]\Z]_]^]^]]]]]]]]]]]]]]]]]]]]]]]^]A^]^]X]9R]L]:G]A%^;v^6^61W, Ps'G#? 81*u}#o;|JNdX 6    <  !b(,uJg>?";i:= ? i ^  z$ m " Q  L w 1 _qI# pRQr;m:! 8 ^) "  0 a " o " V< A Z D,c  \ )kc/Z-0 f+ #k2 8 }%D5njῶG,-;ӽ)¡bف[1qp C-:40E$LP)QZ,T-U-9Sz-PL+!Ks'|D"#9^(CGe1I.=T5^n G*x]4~9s;:D950\}'6 ,* 5jZ;ϫ:I撰ދ2z 5)*Ʀ)()ܡ*%())++))!!))))(((()) #)*)(̱4^Q|x>֛ցBMޥ6rF | n%f OG8.91L=Cp  R >O K9iB>D_*x4Rtm(WA*meI&%ao\T 7HX' _j ! & * Y- .R/ 0J1{a344s4F1K, %N_%r,A_2Ա6jÊEڴJԿ"iŷ#j֠m, |#@" )7 t,(-z+ E&G \ 7\Q[_}'S 8 ET&v6FU!W(u_/^6Q^;]A]G]dL]O]R]lU]yW]Y][]d[]Z]Y]X]V]U]PS]aQ]N]5L]%I]F]D][B]?.^<^9_.7Wk4Nb13F-n>9*7&2=#+ &"dL@.2Q kV  Oy7 9Tj - RR q [R)*.43Vj?]-AuZ]aeh[ZObPs <"ACE-!I;T@  9 6vy+ZJj "իΏ!z@RЁdOݡD>{RD` soV~j+f9%Bq0>%^  XgxS$- $p#3nk(ھT>Ń>䡟)(+(z)%C(8)%*((*((|+)kŬ)*O(()'-ԡƤ\A^߾3Ɗ޴c?֥[V-7Yy(32E1fO 67 U&/V ;4   K E     Q  %e<} 5+  : R5 'h^ T 6  ~]%6Ll>&To}q_gWx J@!tL H )    F }Z  ; - S [] Q8  4@dSZP7~zqb:snIG \_\3!B5C S  "U(D(.m39>P E`#yK$&R(Y:*^+U^'.^)0]-2]Y3]4]n6]8]g:];]<]=]>]?]@]@]}?]>]=]Z<]d;];]x:]9]7]6^4D^3w[3Wv2QS2O1GL0HV0D/~@/<;.9-6z*2'3/$ ,h")%\#w!_f: n  b^|C:>l5k+H5uy1\#8q(<6J)J|<_ J N9BRSA%'mٔv՞ddXUnKȽvA<&֖|?QU# ;b_: q ` "  4   5 8 5 8   Gt^ng J\<3Uv^NJ0hod-qۡ&)(@(o)*('*J(i(*))3*)I( #ќ;XT؄ݮܵNÍ<1RwTz=qN(+%o=@6X= HC70X7jNr> ^(l;eK_w^#do 'eQgBs`p Esdo !u & +%:1S6;FF?@?;=56F-.g# g WYAM9cbo >S\pͷ]ݧ,ʉܜSFOQ2I+l$%=X(]( 6CP ]&&^r,n^3]8]>]B]F]H]K]tM]IN]N]N]L]K]vJ]sH](F]C]A]?]G=]%;]39]7]5] 4](25^90q^-\W,U,+GO)RI&(BD%d?#~:! 6 18.n +R'M$!|0Q0bf+e83v9")8Qty[. i E k   K ~  d 9 zF 2 & / m R-!$ g@%E7'< j} oa Yc # % # % m)(*"_"ٹԠޣ †>ԗ26 %<%!yL Dh(N12 y<F!EO4$U%vZ% \$bYc!GR{*F3 E @ta4p?  IF4^Q܃.BBԠhŸ8(`)f)W )*8) (2)٤*()Ҭ*L($* (/ءț̻4ЀӪy_ڱVqpЬelߵ7 SKzJ&{^d?}D>DMlH'|DL&y(A icc% ]pc|ddp{*[ U=$y+H)`HL*F*gHތ>uHu䭽.}@ e@R*5`<&Aڭ&ᶾW1cykTԚ϶]@]A]\C]D]E]cF]F]D]B] A]>]<]:]f8]Q6]3^14^/-].VX-S-qOG,K+G+ C+?)O<(9e(7`' 6& 5q&4%J4B%3p$ 3I#2(!1F10.N+(k$&qL$h""W"*t"""#{$y%t%A%e$C$J#7"(z!X -W h  d zY~#  J r  af  / Nh  j #   n u  jB T ?dMtD C  ^U+(s.s,# ExL2Oʻ.Kɜe.9yZқde ke jq LN a #1yEA$P!#]&^(~^*^*])Z^'^#^SeG 8(_{9FAбF_J{ΩU()!)*Ժ)(H)*M(!)@+Q)"))?(:̡ Ҝ: @#ݓk f؎ft~ ,.BAJG0L!KQ#U$VB$[T!}N5_Ec9, ,uN>}fZ<Ӻ+`KtׂѡrӮ{S+ݙ~vC{/;T#`6,_2^*8]y<]w?]@]L@]{@]@]v@]?]??]Z>]=]1=]B<]3;] :]8]=7]5 ^ 4,^2s\/Y,Vi*pT(UR5'|P]&N%IM%K$=K#I"G"E!C"A"y@"?*">C!= I=8

Y=eY    i! $4 & c( )* *e)(j&{#S< E W + IO2~fg^!ݝ۝bx *8MIln.n  $8+P1H8Y#?&F) M*,R.U/X?0Y0l[1\1h]1]31]e0\g/}[.Y-X,VWV+3U)*R{)6Q( PU'Np&^M%Kp%J#I"H!G~ ED}-CL8B]Ac?m>|P=ea=V==r=xrݩaUye y/VCH ' /Xo 0U 1d@)etOXjV}_d.NBdNF763\LUq( HiSB!~ aa 3 S'6\/su5B:= cA"iD"wE!D@:2v)D  J94({=v椰㌨߬܇&ԡd롖חhVh6&fV7%(:P!}`*n_/2^8]=]jA]C]D]C]A]@]=]4:]6)^2^x/^q,Y(O$F?!=5g.e )@%o"  u !"$''U*d-l0S(365zq7Q:=?_B/C\D5EEEGGG3FWE@&DWBT@>q=3;g8"52#0h//.-dm,p*d( "& #0 !X     I  -s 0'   H r @ n t C^ d = k\ o-"p6 AC}03[7Oq@Y5XJ  _    ^ Y Qp -ꧾqHݿv̠|ӆš}z][u[%t\ ^+B>ZN%$[Y)0_J-^/!^`1]1^0^.'_+FZ'LO#B5)  qUt<<&.#<_*DG;){()(()*[($V=.4\r4b:]*n&F2;H2 xi~8H1iC+&Bގܵ׶ҖfeЂO|ϲNϮ@ߑ9dϛv[z ri]4 6. L-7%`<ߕ7ސB;ޕLp^w`3q~ bdeGGFIB~NR,mX;ަrӏR䌿7LSBC l'F5:BN!#F])^/^o4^7]E9^N8_93D`%*`EI#ww-풾~ßàġ(s()((h()*b"+FύȮEєy"V;'Z3'`w2_;d^C]I]O]U][]^]=^] ^]<^]^]'_]0W]L^A[_472`-TZ$>@* YEh8;[4S+qFS}H# *b/Ca6V:(603_0s-j*(gr%"u &V;@Pw)7Z}Y F   4 lRsu) - . =N jK%zMXFz{;&3 )=       .(iw, 3'?\&5;s6r'o<Dbq>Q7̯A)cџQ 4L }_S(_#.^2]6]7]17^15^1_-w[:)=O $AyR4n&  #O~=|}^MTRlDδuɺ(Q*))(h)*_()R+ ľ{ѩҼb%&1 RNyB*Py k@jDV0G;PiW,ҏQmLp$ޙUtqhPĴBLŘ m NMA@[v@%(\C}x,\uY@RjaPg>CZPd>`-_K~GdcT)%k}nZ MN ) WZa eA nՂԾ2qr5 9 'Z6IFX&R_/^$7J^<]]D]H]NL]N]P]MR]0T]U]ZV]U]^S]O]HK]D^<^4K_+A^#Hb3 ~ vuR{P=!Z:݃A.hu,O:,/i# {)+/4A9k>BbF I"M$\O%P&~Q@'"R&R%R$JR#Q"{P* NYCL;IHG2DbA>95qd1a-) B&"# J ] ! m  6M7w{  i ~ @fDmE2+3a&FR`DY\M I;`:x lCLSM*RZ" 7  # aGS}Of瀮<丫牷v ܊eGy 4Oh*q]3:4@#B'CZ}A=992^+pO# z ev 5o4M4. M΢PH֘G+O)!I))(7()7#GAŗ  Ҭûʍ٭6+0 Q"M#`"!]bG< ? kw; o^/)ӝXKń]+$"~KȒ|YΟ;Ϛl#ԺדSقjKݽsQ|5= ,Ecu Zvu&:nX&{Tp[RO 3I TpbC ^a{cE!Sl5gc'@#`' P<B0 `%C,"=4:*?%ABBd>8T1 m) XdX!?y{@ʒZƱ$(o_*<3ǢTGxlx$q0@&21 <1xF|OrW^ei^P!%^W%](],].]30]1]2]1]0]/].]j,]*.^B(r^=&^n#VC NF@?a6B-q$b N J0 > v6o_wAYu .  Y f H  & )!P$u')x+<L-m.<04111K1141&h11!p0T0C/e-lk+/)E'%@ "D20e> s | u  } wR H -R "'VW##,& NXu}YRZ5h*^.{TDz&j s9cfv%8|8ܹك؂cدxmr1C }a 9qh,<lMGj]Cn .c?+`b܊W Eچ|ع; WߨןM&I#[ڿ۝62ί³㾷嬼OJqɔXͼ-`/;u"2"MZjb"WN u,cQs`)7YpU[h VJM.RߜeJ-~)D]/z}ՋD{+דekBT0&fH[#x y-96ut?sGANT! Z$S^''@^A) ^*]],]-]A/]0]1],1]0]/?^<.^,\+U'L$C!:1(} 5{=PQsj!6o4_) a w  V(%|Z*|.p[2yD69d7<,>@BCkMEFEESEfDCAAKk@>_<:8263Q0w.z+(&#`v ]" O (& x6o{ k  D ' b PdU,1wHMtgC}c[\!/ :$$Z5\VyWHr' 6X){.PVT " 7 %AU-nL!'cU&⣶ ':֟V)6*(S( )((c)!]ңQXޚtNR ' a'=0|7<?@@s>s;n6G/'  C  aB\aqjݡ 5=wuTcwव޽"CfU݀ޖ8U❷')xF b ueΣS9א6\PXVF,yܝ>-tzk/SxeB@MCH ) o! +4;Cn%Kp UQ#VV&uZC)+],3^].^<0]1]1]1]e1]!1]f0[b/CZ;.!X9- U,wQ7,zN;+K)hH)D(A\(?'=R'; %W6# 4l"D2D 0J.]-L,}* )A&#4h]YpJ _   + Y 9 &zu=n) @y,)ZfGZ- ,%X'RD^)N a0JSH2 d   L k"~ 1% )&G +%j!#St mh) By@jXz4偫ޒؠSԀ'_(|%*_((/)) ӓBجQ& N⢻!X9 seC> 2#GW_#^&O^']+(]'O^4&^s$\!SI}9?/4w)v /'6иA‘&㰶TvWp֛g֬JgpՉebڦ;:׍ة] be,4>ߠWƅ8ʡȒW`ϏnW14fE}؃ڭs69S|9 m\TrCr D.t [Jz,>*8-W( { ?K>$Ua  N(C1:38.V`#t f4F`5X_ݐ6ßFٔæFʊ " r&/: M%]Z*M_.^1^4]5]5]4]4]h3]1]Z/]L,^(M^%^"W-hP2HPAf:4 - ("W+8~!( -_ + h%hC };M-p䙷jߵ⩸ZZ0ݙBpg .AhF!p#*2+;1B:#`H%M'%R)5V+Y-\.1^/^/]M0]0]91]0]w0^/\/'[c.&Y,V+Ul)R'O&^L:&H(& E%A$=":!S6 2'.:+'5%2" :7[  &~Q   ?=$/N( ,[+J2JRTcf-kh;VfgPݑT S 3+) 4H;; 7 1)Ey!h  qUzmX180)\=&! T$r.Ǻѥr"ۡ()!B)*"ᡀ֚[119 _ǿ;ԙ~c,84 T-**D4 >#_F& M(Q*:T+U*HT)Q'M%H#z@q 7 / _&CI "x_֏Ϸ ɂýH3狳Gt"ߩSϨnUާޮ]5=ᗯZذR|Zcp[ߕޟް߰p߼,ICͬИ1ԣiޕEsa1&e(4qcsf; #JlwG >PAh F5q UCp cB } D `x  *  :  &lL5YtXKl] $ '+2p9?0xDGHqKL5LMMvMLKvJ<GK6FHDA> ;8 x4N 0 (-V )FL%:"]+.f .NmO$`a ;?3&AL>`"LV=N[v k`v  r!u %V)n,2o036c79]X;M<-=>u>G0>&J> )> =3!">s!= != =D n= Q< E:3 a89 64=3V14/v, +\7)?'%" Eb  M  _I _t  ?+W#+Jlv Q#yLZVASq$"94,/oU}J.g\OGd#;J2 0(L)R7"P!} x3vi'4ԨEэd hg:柿ݼ场尸%怷4!M炴<+醴Sj?|\b'D‚a2ɏ>A;Ӛ-Ete~IX/+, &3    Bh -  i = Q{  ! <#/ # N# !) X s ~ r:?&E FxN3rݞoOJ@Dr}ϩ8k̆w//$̈ͫΗέN7ϜbКUzؿocjY'n.=Y  P>3  %6 6 )# & WL eEpbb?a d  I  eA 3   &  sl% G e Tf ; H v#j%Q'S){+x.X12rl4I5"6[8(9999f9.8zC75'452M0P .+)'%#K!1JF* e f  o>nSd  * ,u_CgX*8rI?k- v d ovG7 T#% ')(**PX+k,y-.o5011F2_3 4q4q5Z6m$6fo6Q65`42cH1rn/-6t+k( & %G P# ! 3 4 #/L!B m  \ nmC/g]QXq@H) >  g {MmF;e;  =57^KrECMJ4άQɣÂ.zᆮQêwХ$xًi1ِ;ڞ[q9Ѹ$~q g.kU0uV$FE-r ?u Ec EH%),ZP27zD<?9+BTC;IC^B@>::61;+{$ ` o Q*q=  *!c {& (D `'3 "+L-q WHu6|[yhMQ4A[ a $! &Q+/~w3h.7:n?>)3BHFdIK*M N$OreOZO_N M'JCH<%FC8A?@ +/ l    } Q >7  _ }  JVm%X ( P&07<@;??=:5:#.$L T   W Cp4q< WVބ) ". t:,cf P x(5@!|I$QO]&RY'Q'N%'I%B-#W:b0&D5?N \ Vsأ4Ѵɔv`Ͷڱ⣭ݜwڹ٩o!,׼ײaɫ,7,RP ͼ?ލrY޿>hYN)Lߋn4H(e%\4|@[d@b5!AC iDF #/7'3k%-/b oef 'L[$ͫr^ϟ3CBvǰ'%dBW0ZPJq O1-zn]L K4]"v-G8hAI"pPL%0U'W3(X(W(|U.(oQ&Ml%H$B"=x!8h 3.'\!lQ >[  $ C Nt"b<t4aKiI(K!u~ F"dr1}!9y7z.! #p0 Ȇ9̔ѤNޟ+c4=%&1- e4 ;DBGKANP 5RkS`TQTiT1TSCRdQ#QON=MK{J{GlaD5A `>r;)`8W5230 -L*d{' $ Jz*k? ,    -= O$ً׃J' Wy ~(]36<BFmHHzF|/BoO1#qλ S)PAQ⦕fӤܦ뤰ۡۨus٪kݧ ڳ'"@bᄼϾq:rĠ'l| NsҰ'\ߧxwh|S0 C>#>9y/aPv4 |ZyNk WR4.AJiUč5M:hlŝJذ+(~ _"f*(2 D9"?$Er'K#*O+S-Ux-W-Y.xY-Y-VW+T@*/QT(Mf&Hk$C"J>p8J2#,u& gT  NC6(<^V N_.<4QxvjF (8;o %' ' z>_ (p B"K}@E#g)!U/+ 3 47I 9;<?%BDRFYGB HG;G6-GGwFcDhCEB|@Y?>OX=(G;&85 2 /,2t)&(# UL&9|<Z= p Yekz QetN=u %/z)5 x v ",$*U{  k  eIH@26?W5~t aHr;ժfp„ ι俶.L]D7hέ~v@4䑷ռ%ȭlTh.X'߀&:w8O\T!| M`-cI < 6     z U  @  2 y c  $r  h = x qh   /   b   mfn[Mz C}^ /;av|p1MD݁^ڗ$׏)@c/APCɆynƟucyd櫿Q\3*>䧾LAȾs:ID7Ɩ@ʅH@>-:;ۄE37 _/mBxx)5[ zif@bQOZ hdHuT~g~t  - Q 3 d ! m  ) J" %[),c/2D5{7j888I98-i8v7(Q76W665X3!0.>,,*W(F% E"7   m 7 Z|    {al*D; 3) +  WlAsL%cK~N&[ G r h QO ?  b q- UI\ Ybg޴r(GYRX@ߦ?M0Bt䠿8rȴjp v`5ody[)BBg' Y57oO8jh u ps|x q} v  &]W U6k 8JqhYWeW/O,#i =eU#'T%á= ʣ13tAs?J[QzkKI&ZmKV R]*oًx6mgה3wvnJq . '1J:eCeK#QN&Vu(mZ))\*3\*<[9*Y )U`'P%1K#E{!>Ef813++S$J/$-i Y  S=[77}@@4&@pGsbK kQG"X#f =[S< !i 'Q + , + ) $cJ 8G;BqbV+u=I &D13P 69!1% ))4-H14' 8E :n <@ t> U?r (@- L@??CB?n>o>=Y<<";o988&6T4q1i/2,) N&* !] K3 /2 -8e"I#  T zq!(G8.C2O#567Z7O5I30,/'!CQ+ <  O}&S-w(Gſ)c&\+ ~T $ , whe iZe-ɧDᄠcH`ǡ(](ڡم=. "b,ds% `f 8 #).E2Q69s@AHBxAT@=N:62 Q. %* c& " O:;c@8%bx'[ fV%+0 9220{w-("  Y)&E\1(V`짿{wjOL1哲 ^î#n{6\ᗲ⃴;U㾷No 購蛿ů}i1^҈%H \U _6 r!y  4Kڭ~ζ/9̵Z; 詻迚/ŝDˀeMoDD9PR7IXL%C8^&"_~'_*!^,]-]!.]X-]f+^(v^m%^!ZyP5-F<3+ #? 4 H|ZG@g?zߤ )יӿ1и߈aЖеҶӋՃי(ZޫlU%+pl` "S nuSktN[ mNn A#s5gHT!Qq"7Nq @-  relj֎s]dyQ5C&ف-ކ%{yS  =O4$f* /x48i;kQ>@:`AB(DEUwFRFbEgEHDoCcA@H=G:WR7A40S-)&d#;a!d 0X }@'W sL: G /t;lD, K!O"Qk"O"L!G B#;Y4,o$ R 3V}E qvӲӟիI=d5U߯/n;1Ksc_7<&0b,oR 0 H"h O H }' +-\+' !, M 62r.-<._pC{x%O:CrEa ^~ %o +1Y6-;G]?CEDHItJJ KaJI)hHxFD=A#>/: 7 4qd0 ,&F   U   }  ~!  wC"('n+/1 3#3~42b0,)$l H s615 ]b%1^l#ϭpȱ½ʾvj"{KtJ"q4w o!Jdj 8/J͛EVᐽlFჺjξ£7)̿\rzA t=  B6$s)k-03m6*898: ;Q:9L987w5 3ai0-,*&lG#_  ] q)5]0T.1#vo/ZT{40n?L 4 <! G  /7{CCIY}lӴςC0ŰjﯿJ?չ 1^G|2G㼄"}.ØƘT=ZDԅT!ۂC߫vy@@RwZow06%F*?%v2;cg0/=UH]& QHr!2 Z& 6+ 0 6:?;VC G.KN$P?=RSGTT%S'RYPgN&JlXF;B ='~82t, & !MGA <.=oCS11#*8^XSgU1*J0=2T*hcqd-@BDFHJ@OggS0*.J-/#00 12 103-"/0.$0(.11(0020 .-*00.'.'422(4431,/.0,/0+1'3/3*0,'020$)"p7 T)Y!qH<č!qI%Al&$;5Mvk$+Ƅ0 e̘Ce P&c‡4בt|&S|&SEClNd=\p I2 Cd P}I> )D\xId/k셓yMpn$[3OAiM$W /$!M +)z, R=^<@iT 톌lR5rfF4rfU5%I[bQTPT@( 0aXUUPEPP0͕FdKCJ\%HU˲i#i2!΂i Ϟ*0L)$xFP#tY7Rx8 s00<`g8 @`c^zc0PPR2 Qc`PI* lĤLL' *t&Jꔡ&T%BՖ U4E<]dBA[ޔyQMlMLMXA45ai]Rl"Nvdq"RĽ1)}pZdD3Yh&p^ )\ }5,&S&S( #F a"Ex46 4K8Y$YǽfTDCqxDa,Iٵ@$eD*bd/a(1 ahH6njT0u6p^D0iT&LUY:A4UekP"F7g5&2 n@PH {d},dt D3h&Sp7DA7B,1) L^)4R=!1t6A+4ҩ _ WhӎZE)KYԨEᠩ "eYA*bX bв,"(UNUݩUuJ@L²,2[Aʲ,,^UQRĝ՝5 b"vn^vnX0 0 0 Ð0 %D bX,bX,b0 ) 0 0 Pz฻M ftI&Ii,f0#;ln2, ꀀD5,`ґnJ!BH$x(" %(f(<Qx"5 YM Ō!(ҀX (G숙 0K4KM|y q҄xz/ L,E=Ax) a0 ca0 caL c>Tee,+e%p7DAaHCȞ>3C!B)DIJ)b8*P\4LM\A05qi$ Ov3&|hH,a(Ї!ݑڌ I24|擏r^ʀxxS M` ,C\A qi]("n@1C!*OYdGy!`< `< `'o\H(d?xP wCx<$  0 `<$TI 4ARX fЋgs#$ {뽔uBO6% :tSܹw!xVaqX܀$L"EĔIE}2 @ s'T> 'y &B/XBBe bi4343R&[`qיu+L䞸1R?jt43zPj=P5 lꎬ)f,@@&N|uk;y)"NclU=mU=Ef|dTJ Oz)"L嫗J'L5fSp7dP cfমh0ݐ3SL*ca iTL/0JIR \RVYj٠(G-2jqA *Ԫ*Sby噂A/XEa4TLQK5ZL1 ST)U22S< b02Šey0b1 'eRUҝ=wJܑJT$ɋD,ۣn팘#^>AMh4iFP0$)bg۽bv;b1K"D/Ka(ôh4x$ 1Mw;4 H쎃q@@ @AIat *tӨ : BU).x = ]l* ø7 fx@"6(ZEK`1T'$$ .1B&/‹xҚ2F$쀟$p7dI3ɔCc"B7y/_Q\Xb<3^Z3㥵RdXȖW"4 >TXL|(%a#Y @/ ܥ (x`C)x) DHQ@t \ p"(`qoɛ| LDQC@"^3`@qq$q oJ@L5Y&5d`q: 0aޛ>%RSݵSݵݡijJ&a 'y &B/nd0)dB@35njvMkjqqxx<7Ǎqx\'a 47?%hn~K"RVz>> > eŇ6`|n[pS-w)`'@Tq= hT;jgS6P Kq"LB Ƽ&6GVјLU^KU^K %Pu <%|? Q>bUql OggS_*e I/&/13,-21/(*&,01.#,!210**/-,--0,1/20(+-./1.,-%021*/04/%01/2-00-1%/14-wŻ.pEAe cdwO>O>n>nq0 ME|Ex+oosQDR4 \OXځJ5X ! n1 q|"X(t:TQ:@¯[\ C RK艓p>-*T^1<@%:ETCQKrFX"M*pʋEȪ;U ˂=*X,&qUUI+dUUUb> Pa,X,KVݩJTXL@b$Lˋe 0 %b0 %X,F1R,0 IXL|J"b 00 %b R,0 ) !b1aAwpww tdP)46fQlƢ `QtfbQҼ:젳eAgهp&Z3, !(E<) Ka&:IuNZEX'E)0&RP qb-I& A"L5)0yE$o /4.Iq &b4MٵpӔ];,`\5`@KD<qTDD1YQvV+e*, Lb< E ' )Dh  \) +SpgUlt=I HԄq/ 0ɀ$BpQ`4tITRH@$$?}QyQ| 0d2H>L"`Lt@qy 8E7hl?XKJ,d)tT W2@ĕ"0MG l9\-Kp R¼0)x ׋xH2$=}% 0BlS\Z ڦ@t"c4 ya܋IB \+$ר!HduZ:Q-E  &Bˍ)0L^) 15xp<8wQȞ*0&(q*؀< ](UX g IQJ)IJ@!(TU)w5y&/`q!> @l 4/ESp$A e(Mc>ĘCSPb"TƄw@?Y^ :~@TVDP o(SLCĄ2%mK`# %ꀡ$Sd b1 Cń7 1]A$ :zt4j+2ê2 @FnX@aC' aŖctlkD-STVEdH)TR"q&$4Ms'4u^!Fד7$1| 1045G{:075Ad  Q/ҀP}I$^% Ib Q$=\Z Hz@p/I=S$e@$`II4rjl`DI^A%yi]))TĽ04 ¸Ҁ$˜LTLT52ɞ2fyI!@F&[dK*bc(LR F&O\I$ h#TylE7Jyb^ދKT?]ZK p7IT$dW$(qo@@+MTT7F$+2Pl~Li2>4aPP6 TSٹ+¯d+3hRb"@/$R$ @%dQXځϢHVS,YuOLbxÐd,FX ,L54Qbk, .  I$#p \'ɤ0`zV) $$&)РCY`!+p?cs^D1ox4t=ꀮSpgҀ$tFÀx{a܋^Ľ"E} j6=^ 硐$#<) cҀ$LE+d@L´\pAlUXZ ڪ@t<q#SJqS${ HR\-3S$u#ܭ|ԺV>Q &왐1$$: I[:!iKgCtCLJ'" H&/<0I =( \\kkam V0LPz! e,`iLP#Cj `dQYo>;] tD<{tx<.c@HJ<},LMZA45iqW e0Ybb1d$2mBbYrnV2CJf. %D-ՐrCc,jJL)!G0 S@ j ŚZLCQ4L0b{=Qٝ{ܣPUUKp˲W`Z^a$ ò,0$q=* ܣdU 2 |(b@h.:NgS b0 0M)!EE{tF CBwHw3Hܝ 0 `$I41i it*IL̢` )t  @zd(d&ʘ@DPTa17z9boE@ G+d$>y$!s[S'clDy sw <,7e#4cP<94 w)AYb0<4D/˜d=GSJ V1X$}L "n@19},l;mSp (LRɮ0BE< x)Ҁ\Krj,MZ=cgWnȨ̈H(Ȩ! FA#aŴX,)jb5TaQ1 0@$, z SI/eɮ0$S6RA )UVd0q BaT ,2bJ\ ^j#kb"z Mb4tv"@॔ҋ$b${/=xI=IA bBBO">@H$@"C"\$=(9 4#Na!`800IΠH6&ASL: v }9W8*6CftGh,C)ѸG dӠ*dAKPE U@p#eSE(,ňyBd2U'AZ)+bY2Y B -nJL* $*T)va(cP1|(A@1RK/)e A!)F"P#JHHRbDeFLS۠4 (46, :F%:U0gF9zOggS*,/521-0//&22.0....3'.-01000).011 `^aW0QB,@ H, P*C/يhj(" ?[9A0lkRT5Ǎqxx<7Ǎq)@e$A G r| d]aR) zQJ)LRTDj$,!Z%D 5 '<5Zɸ)!B} DO\A=qykVQL`;%b1 PR,&> %b]d24K^A,yy]T\dt">@A<xs E$3Z`W2 v}KmbIxIQ40 \uD\uD  00JtdSص ®a 왹yv3R!TXh,-KB@dU\AUqi]@L7g5&>x@PZY.P,Z=cz~%8nQKhѴ +iQIEDMUִ8@Li50,"UT" V0PTAPQ$Ht &XLj *UUdU,xi*Rj@15 Hq@5LJi"D2C" )fؓCyRJ<%"INjD C` CL Ie2(t$f@c"IaIB($} 5I߯HTk2dI66D"dM0jXEQ+U@* @TjU*y&,="D܍@xV$@F3S q((eaFוaY%1/ c c"a0E) /P#`;/Ma$b"R"$0gqvpDB   LDE2ILbM F"IBP (5I)S01AvG 11 c9n&$:4ZOC/j*Iד D2ż4J!JtZFhİp&™klMUxx<xQ"1/QqL@0Z0Z& !Co@qƑހ$S̠B":C^^ :@VQL`;%b1 PR,&> EbvH$bY Aڽ@4i+`ԸdOa<$.7 Q'1x //"%S"1% 25xy"&"&IpO#IDy|w #aW  PD0 :\V2 sYk""L#*Ī)iS QUVLU[5EQSՊU@UjAUML5e3pJhI8Ly6e0J7R0 hR"Ca4X)œ'  Oƒ"H$dC ="!Hą'q|( !RBx X@$0@@@ b_1 *N4Ie( 6 ) PNeR4`2$! 2"5#d$M"T( ϐN:%jCDT `Z (XqlJG@6!eE@j ȞM d @^< *XT@1PIxl   3hД@MX},&)bQx b1Ah{9P$RL@<K'F) 'N,;0 $0J PE5R06]-4]-贊%T.hlR.jmԠ2a4xExʠlZ d%ȪjZLA STLiNQM,2+H‡a+/ ePvnLT{T!WKPn4{G(FJP!b$ K$a(X,X / !&H1> %DÐ n aP1' X$dt% tIBUW*X`eWR+ ED,I@X) 01@)D2qқd:M \:?t7t2 ř넧)I0yhhL ϩOy(K,]@RЧ`#+@+@a )X2d2 `HD5[J`Td:%yQDHDHvbD)CJ:`DL9Z)GKpRzBPVCU1 SPC%Ui$( j@LQB0H$B e{8L/^QPX^Ad-YF IJ)5`uф<1B{@J46%$LK @JP&v )CD(c %1b"!N`pl N"& 6d١CP1kOggS*F:/. /0/ 00..131/4,1(0//1-.1(1/1102'/+/1+,/.0/0:D/V1P `< q& B*He(R0@RDF:b 0b YZ.Jd@D^ -A "CDb)`!d4 dB:ˍ `itg+!p% `Z4&T@"IH$4QV@AȮCA@a.  m1)Ѐu8O(IՀ:@])^$u;uI".}"b)<(A!` `"4 рt*E@HLUMaFiFl(r2$!$3jdf UӆU E5Mj0!(B5Dm`*ij&@LTZDQ1 0DU UY7eB& PnLi^HE&Hi!*IȸL$fj#@C$ɘH$ /$!B0$$|BxBH$A"b@b00``3 ͠S"CmJltՒ֋%QPvC(O͇tC(O͇*DFFU v0LHTJA%tĬV" xEbeBHL L˒XAY52^X4("$&A$$%aHyJCa0uvMhth 2$@b^phCkE;1JP $@x|b t( N(9Q Hj7\ nAtP')1qbj̧e,(D&K}9h ;ZZ v@t7JuHW`S^AR< F$C^ځO$ NKq II0}@T34($|_8hz/`0qhXSUÆbUPa)6DDF)C"i0 `5U" Lq,!& 7\:)S-Ө0p! ȪW gJPx6bm1LaL2|' {@8$19 H2 hG;#:xB=c15P` ŨۍUa^LӠ4gt;0tAM#3$, $ BPEQaUQ,X 5TŰE԰b@P1*SN6Ѡ `bQpS0*HCK ^px&eOIYLx!!@"0YF@A0`!јt*Be@%HbUAJ:jH\]eKrBIA 22LSBb" A/-=^,/nG%a &MbPUU=&ŠW D&,wL U=$L YU/2)iWUA!% 6X,:d AH(c1A1c!Ly p6u" 1AJHJ'b 0 04, @@`:EF34d) D$.%) A4J M(%O2AA1u1o=X=L^+,^+,ܥq`).K=!dbRJ@\B #$)_HRT7p^, eTDPbX5[4&*^E;;lM8@84@x)>GA0T9iUo+ʑXL1}b0aCE3IaT7ZFKp2&LCt+ݺ6 E\^phX 6|~S _Q0N1D&'%!0,CڹhD_QF̳ܹa<$>OB襌JZ8dQ̋\-p b}@2E2qJOfc\SZAtMiiݤH^0Ąa^&IezDT<O*BZR_ @K}%H5,ИATD\Ҁ6aXE+`jˀbVQ EM1PC+뤑Pxj)T#S HAA!BA "jA1@$)$(P*b )(J #1Z{ٍS#b$ Ä1|J! O)IxO1O1SaO^)DKLBHl F`a`M#4$ $&EmSRն)lv](~I9.eCcD RFKa(Ѩe^pHw//eU;\٠eҝ{ d՝Մw*xepSi^,$aSVqwj^d%*D2Ĉń$P12d,z|ŠaHHXPRX BRbBa( ! 1N1a(Aچ;10Y@G1$1 Ic3, bɦiNt[l$,qHp&%&"0p1QBHM ͠ u`XE'nqOL1%EiW&RiDbD"AZ^ *@t^RIRx2@c% IJX,+eSp"yjFHza;%1Jc" M1*c5b.Ql`OggS*Q0//0/0*0233.2*!2),0)-4/2/.501./)'2)*0)22002..021/0(1&)2)10.*211&0")0,,3.10./,y8"f4Z bV0݌$0La\od:,f[uX(9v7ɤJ n2O) HrĤH:5VFp^*BJ$0!LD|J'e+X AYZ *@(‚2 ". qo@^'$D-G5ӈt4~z yQM"La<)(It$/iҖ7MrE0Da2%qaDh<@DJJL ̤D7S2T`(\Ivt847  RU`SXLQ94)*gF$UwX,+c11 Ì!X,3&uwS4,GXr]R0SדĀDM" +E'0HL?^ZK p&ƥ0}". HqoKHq El&tSܽBMqZ ]D9<[ H/|P2ż!1Q{(P,+ޙe;3RC$ ^#e$q MFeQl}@l}@ܥ"x lWXA]ai+ Vg9BHƔBH圬0Ed:ju2*p^ `5@(Ht:dZށ͚{ A S,&N La)0 hblSڵ`Үw)8u"^&qrL$l/wyQM"L̠; yʘ0DxL T:\|pmkQDĽ)@ Cb)@ļ)@Rx)`\QyʋLbUUxx\"`@@@6T1b2Uq7ɤD5 0 C0 0KX,]w I þl82 DX,R-EY2F30SD5Q\V=[2Eh)1)8iPpgzU8F hɤEA%-WK%-B5-Y5 w$n)TӠLZJZUxjZTτj$n2P2iY*,1hS$BMHc"$D#`tDSG/ۍԎpg4h|D(c輴N"ڵn4kJIxL$P3} Y<Fa t̢Ѐt*b`iTbHŢ 6B(XU삎d :ZyA X7!x^ 11/ؙЌ@FeXa/ʰ}5z$^U z lawCd<+ƺi Tĕ:Y$) E{Ď=ab!UUqq 0 _a0YL,t,tM2QX,3Ōb1cX 0 sv6d CTPn>k(UEL^ H0d@dxBHQ @R1T5_+P|i]\'K`E{D\R\ q zG$dQܵo(7DEԈ$ɘ%&Bea(SLK:M@$5\KpjPq|"C0P4\u |:Q>}bdrBIP/P3|=^z47pQ;Sd X) ."|2  [0A\Q.Wk-`]@ PHgǍ%0!d4Z'hp^* >^ yMb1$&,lUXAUai]`ШH 0Ž0.q/ʀ$4b&,l%?[OyQ hPƄ!1I4*l5 E%3 ;L1DbX }$vG@S,3yp<8T`U>yEB1LC&E_Bcl??O5]FR\v%T }0.}@<Td\9+Gp)Sa2&Bi,Ce, }b0LvtLL`¾de%좱,(KY.Ȑ T`0 L5TҋBLA UQ,b^1ZHd r^ɪE(1 4(+1 hP&-PMld%BlP6Zn+Tϖi^z܁ba#BbaRFGL1&km0:kMHkD`C#( bFv#ڣ4uO1/) b>B#|=a 04Lcfc6X$i$lˆ(:tk(EĀiP8b H`0+B|b wͥLE1c02Nq"Vt($1c>S:NPh AZZ7!@RqqОiLj-k`A!˞RHJMLSZA4MiikR`AŘ1;Ș>.BS"4 +V7y &D|P Q>wQi8H(l&|[|[GQDt#ݑC%@ lUصh®DEX\/Ⓓ4D2 "H# d-Ywy K<1L&&S\M߽5}]*𢀅rcJC1&c^OŃI2hdUZAUiiPqBq}@0ހK@M%փtAlSuMu]xE2Fʠ >X Ð1Ú F`0L6zPjE X<¸H˜H1c>L=F Fe0 \I+4 \I+4E+ SR{ǔ>M$ˌ  +UWJwyH11&| obBd2E*5LD1!68X q4Ap q2麈+D0 %$))EvZ0$p7 3)N)C Hֵ"$&  NMCOggS9*B#1/*$4,34/00/2.0*)3+".3.0/ /////1- /1L3\+0p+Ɇ )1b^a2eL^DK& ,~s,~sG ROS#Čɤ /L`\0JT=Eb'S\Sص@® ^C&gJn > )R\/ހ$>Z&\:9ׯNNygY5L%e\xeDBJaLؘItڽ5kEgɄ;Sa2dP^b>lG4N\UٵWUv-k`ݤ3^be0.q)Lq$&X|O/7ipG9Pы1*c"T&) S  4C< + aUQe@*(LO\:t^ʈX\̍7 Ed0.R-t\C_kKp7I\'Ȟ1j0.q Lq$N)Ne t=X@׃ ܥX0)BS2a2ḋt;Mf 45ѡijC[$L > @{!A(4\w A^ I1}ԇ0`dSܵ@Mqy!׋xȤLح{a$e@Ed@sG˅i@T*wyQCW 2ҳtrPC|"E2r$ߗD.YD-5jdciiiQDEL)Ȥ;"ܹdJHKuijzEȤ ^ 4"TҴd= wJH TU,4"dx1HbjZ;$d(1=d0L12(􊅗h#:L®é#ab2vhm{MvFj'FSf i8kؽvv;0D&0$a!)L1w1ݐ6 `'@$11l6X A%$4 )]k#}-p^)ḟX0ń$&>b2bor, l6ZhhK+jU&$ٕʀ7IBo< @<:P$)a4) m h$l:P؆Zyj[f:m Z CKpF}@uy` HJD\DEs:4A?MO;yQdxܸx}x\"%$Tb b Ȅ xmZPDT&AS%)S0&\%N&I@v77 ]'JKV@ƥL@!\N&ˮ$dn ݤ:Yٕ,5`0 E"@$ I^@\$O\ <GHR$IqPK⤸Lq$ xe$)N\$qD`f0|"*t{AI&l"t H4jVB'S(PQXNaI*NR* #EAJNDLPb 0&a("j b1uTA-i 2 j@P" jUQ"`QP(EAPâ(na*@hpΈD{qv18Jq) $c"D @#$%  0@@$SL:tBEL l$֋!SJ*IX/&)P7] @B- B- *E-RT͔H;0 p60`kAX-jPLC2 6TPQ"ZA*N A*iQ n$JAZ X*RPZdS5Id1<#T%*`yc8%DOB p'1BNIH#BF4ABó!vhj7C)|Q|1A *b* J$CUSMePnb[ Aat3$_ f/RIQC4MV(j1 -KVQ5SӰZT7e/^Y )!-X,$PQ@ /^a(c"$ e R0-1\4єH!B FS =FF#p MDE@a43X /1:g'%"x6N8FLJa2ILJP %-a=vP%쭨Y&|Q) &c$!P>i1 A4RRXJ C! CJ@JH(qIO|?7F18UġNfӨTJ($RK4av,^FR4Rt l,#HYY`%t bVCD-J\P"a *`U1/F׭j(V3 j@Ui]7X"$(]pJY:ՄEJgZYa0@iP z2% ;fR0 IJ/d2D 1/HJCҋx)!b1@@RGA"B0&T:B,6m^-&4i#9fmH)4cc*jRȠu`8GPR*P1*P@EqxqJr/[0-dU˝ *,Br( -\6δ`YLXRE)"vbG$i>aaLh6:R!ab|H4pZ#8 %BF410 AP$E"HktRPʰ@TZ B*I $+"U %LE q).^p=Ng ,?UwA~ (E0SPDD7@ƓI 2>"1X?ݵDE0 cg'  #IH$[jACڹ@t iyBL¼01k2a@R$i@^^"L`4ͧ/yR:4!!SL +[`հ VEdP/d]<2ÀD$/ЉIeaLSv]*bPB#ḋɘI#Tb>sP00DOٵ(zʮD!>^#]W7@ĥ>2 w*I< 1T=|PT=|Pܥ$,L1BL@!:=C]g+R2ˆ# 0mbؚQaj*" @A@&J˳QU@*, bz )[ZCUIOA(0MY*X=ICB)q< >@"4ARC5&BSDjY'<^2@$l)`, !Gèū8t bQ1j^-U %R ,I&`BZ 酴I(Gjl"`P6FF  x(Cڊ*PU" `ZS,%Gg Ŵ(^H UQETM +" 2 F´H@F;%#iR0&| 4S"  &H" x0M0EPifE H6vXOR.jdNl03'b-BԖZ -Z-ZLPdf1%=qDQ + ue܇dĔ$H=t4Y iAp"y0L"$CS˘P&!%  *00E$Rd]J!Q"> BJ$ f :>5bOf]@iO7QaRz^(!5FBC3f!Z7BU祚Lq B=8$0$)x5D1X *6WAgEb0L`bN)Ɖ+LJ6<:vk'EDG`RdSXAMai+`1`>y6BĭSE@x%7$:-\Q@ir:R-%)h,eEHe  +RҍjQb"))jC-&U4SM ˒ U$-/)p#Ag$$T՝!$aWH2AP*q#a EH0q+ T&aL\> ;4 S ;4eZ1%A!\W۵u];&5Ȯ#}8qީGTlCݵPw-PAPp&c1*S Ð1Bi O@Gl*$7[ $7[ [+qY:u׋7}R$I0y)0DK>(ZDTPʔi+^ 镄&" :1t96нT]J\i*d[(q`@ʠadU9O"ʪrjDJEeD`apG6 Ҙ"$1 %eG/dc ^Qs {Eyt>(2jM%"Hܠ)ijQPP0VCD 0A Ӣ a@AEEwJT@u;4-+, NL*ibbeP!D U%M`y  aAvTwjPg'nF#6$bbjS#mb@,F1!!PB$@,A>LN;@nmwibfH:AH &I`Pj 5 *08'3tp5PP12%AT 1񞤦g2c&f|.9[B%gKh{gQSe\ )=B:ܠ\LRAJE"SRIq 0 Ph=A$ '_ʀKp7Hg*4  01yz"N5LBAZZ 8@61 ʔDeW)n0 6$IZZ $iikH6T`J`PfuQ/sKƼL O*+ I>$OsI_v. Jb@$aEQ:R0%S"хM"dd!rCs^DHJd/ (iT;j'S`K`R\ R\D2w*"6IdS^ Mqz+e! t2@`\jIS^S$ IdUZ^ Uiy+e qJg2Dz") HqޕAX|a EH I1&c^&'E3,$;:ɎN-]T<5*qW$S< 8"(d~~f~~QnȔDD(M>DBx^|PDAabtb+ pJS$u"I^`TU[Z @d1E F^D7e02aa>Ԥx6 \UZ |Uiiɢ ERz#z0$!1 Qsww  tWun+:7票)BW{Hc1b"T7>$h7a¤D"iJy3DJ x@@e%\ꀢKp^"3 ;+1!c/F l!ߔMQD̛<1L5ZFKJ5Xˀfzt݀x\@\ўAE L' S 6P"NVe "",DGص@ay!&"< VsD\/RdIzG5W8TPh <:9ϭNNyQC4e,+Dha2e %'`8y("ETaqo< ) 2Ǔ@bPԦM+7p^drg=A|Z1YV βwܑC% Jc$i\2bUqlY$ $ &!,nP0fuɷ20)T pIb$ H޸O$f\/Z EKJ5XˀٕCƄKD+hI°\Q\Z |Eqi+2XL1tf@̸IR}ȅ, ^QN@ ^QN@RE$Y*KR-jd@,0 A ;%Q^xE jiX @q+˂NUx1ePݩJTR, ȇaJbX,C Ð0 %˲ ZTUU´( |bXbabX ȇa(baHaHJXL0X,0 CRba(bAaHb10 %b0 ݰ;swp>40$6@#0T6 A$LؘJa%ٲ0U`0U`M% ,7C4(HX jE"w[wh'ۺCww&Y`xCT^7IF2 "045@s_7nqa'{$D, L,[c jSCdq`@cq%)zx2: -Je3OggS* C//,+1//'-&10-/1010%2-)-11)/%21-)-/+*0(10-.12(11&0/+1&/\O^Z |=yi]D0Da'oL i@'x@PHEܧ2+r2bt))nt;6sH 4$+57p]dB$x$+%ހ!OP @4%hJ;(p7DY:ҍ)qG Lh/$`QtVkwIr Hq&K)i@, H2@h2 \U^ vUiz]0BØ|hLX@2f@Ri)R$(L\I١ RaJ ^!7)RD& lGX=I'p7HJT0 0TbbX,$ úi7`h4+~D4+~DV10J$/pPi,LX2KEq 2&C`?Rt{GsE)  6dSڵ@Mi+`Ը SCdLqHqoqi@@K-S`P lS\Axw!xQ c xȀ 9"k0B%^dd+ .jR*EUZʢFFJF SL *jbjQT^YLJܝwJx6 ,@)㦪0- @b$X,&D!0 e(R,,SJTey(XbJˊbRbv;T)> Cmv{, !0PJK@kjj #cvm4L =)Ra00&n71`XΤQ,E%,&T  $EIsU,y U%jpal< @6RHHRKxQ1 $8Yq2J,2'% B"%%n J ` n ݥ"xMa"d/ bD$R Awԡ2"[$SD0 h, 08$ @*dUP*FQC!I6;ܵ@Tp]eE< 1J< H^HʀTH4] @ L\Z87pGܙg J 0|򦀸P ) ca* 6t]\i*R,K^dMTQڹ@wI0$! w&B>)L"GF6HTA,W bU_)SCP)\wM#Bx=9$I4% żq-yZ,p^ԔbbLx݄3aH)L4'?]P1OT] aB)dO]O@^  N$% D]҂I1L 0 Ä4#|S/|dBH`!ߔx:MGQD}и$lUص`®TEP2 !>@8x\#N 99ܡS7X"3cҀ)ޘ c7d2I:Z-]<2H2ݕ#K!UZ˔D\%ܩlzP4TS@ȔQ)WCĪ`QDIӲ2(q%n I2Cu#)UU³I n ҝD%AnгIA$;CeaaR%a4RӐn3(>a DX"I/P%%K^0Csbƈ1 ! t &4 $i EhL:$ 2t0/6^2aiXߕyE$oܧ0FaPdW:u ҩTEdk27w*" h\3ZkF p^Rxg7f*1H P(&b!8S,40$Z5ӽ9C^!톌$j6-2k*Bfɍ4R%PLTEUSMaCŬ U`HJ]xExDa*ʪ;% HRXT!(0DTe&NFu„9#x/C)#,(=!>H9G Ž^1@ǥ<)%<2@%I$ M1(TTtf0h$-ɀX ü9)ys.64YjlREHJK hIx1(+b `X 1iTd%$,r bD!-pLZ8ѠF `X It3ʸ XJz-* /DIw 5gLN5; :m4z 1%/1I$ODX%I>B !y$aAI%I$Aqiv8 $ @lBt dѨ$6Ijؼ N3  x9JE"3]"2^ BDtoLQ QZꀠUKp7ҙJ$ CHL`"HwXl p kVZEy) "@/"*Lab,,% ,% "" Ta, 0R}<47 IE&5h:L}WL}W*"4P2d%1/c"H44?yzE @:B4IY^ j@2¢zx6a1^ĕ)nS.!),:|rM}-pQg]) P&h*<d|u |:wP>D I  `2i$<0@<]dP51LMDP'W)@/HAy(l lQ^Z ڢ@t"PR`F F阧 m\B*")HqrLc!| gLDI>%yIRtFD+0.}ĥ7@x@c! ]j;y)0I* 8)Nk ¤S);"^#I#I&/IBS(@RtMݽ໦^S(  $"4 K)"L P$tf p^T$0\3ݵ&5]k&Ԩ xD2. 0x\ߔ@ P$ II!:dY/$1(Bid;%1Ce,4 <%|?Q>ExxP4DI\Z @t"cdC\OҀ}L0yd@Vk$(\@z $6`R|HA^q& :dyڤ%+&-E  ðs0o+,0=%4 G$ i b,+ ,+ &S01ϔe$BeLxL1mjyXmR `<5EOqM%pyQ)(!L`.>2]|:(d~G$Ck$\1% @4IYwQ$$$+d  )xSЀx\Lkvw jb#{1CPbb 7 C.ܦECl2nC)_j(DC"B D2H *X QS1SUaݤ3 H*LCd ҙ!2aHJg (#qd@2*OUI" @X<&\'(eX2<DLLD(c0|ḋIqL1/cO"D&IJ@"L@2   !) hD%f`J(6:IsX` 9ݹ!;{^d! 59 '@2@HSB-Us@f(Yi>yQ3$^)0v+s/D6d܋@%`̢|=wW.pGᙀg aaa0>a` :DDL<|q<|qD=UL"`q`4/[eKp7J,X#˜aI|''},+ʲB TzdTzdܥ"B h$Z$ZB0H:lU޳O!تgBpYL.ʀ> IKD\  ||ډwP> &JE1B@ \~\~Ex,Kuy]v 2YMUxx<7^`@@@TUED,5M^ +)bbX,f,t41Bgl"Kq|إ8Ex8FR>i,y)LKStd\7TɖorlPB#d2CP%F0IarpT.KȢ V1L1" EP5DwSb*x6e+YPbѠ,c^„L)cPMB5I2eL1&ƑżyIFI1/caayba0 /cX$>ży !!$# <$OѨ$Q 46H:FE$F":&YFrdkdk 0 a@AХmPX9^[9^[%CS,b^ f45BK D@k3<!<!7!`< {M+$ $l+,l+,G X<.&x\@\lܽ-syQxd/Db"4L1a2#MIP|IiJh r&T$|x$|x "(L>`< q!2t,GZZ Z@t7Di@\HA5Mqa0dҘOWl*L~Zp7xxqx$ XXBtd?Sp^R\/&t&{׋xh@x裏dunI)yQҘ1$Lx@`Q(LL'8(P1Da< `< SLI7DS{ +5A `lj|{ H<RUTT*D1<Q O5]/XLg!X,f,&Їa vwTT|bKqz1ܥ8Ex@!"A106*x%rk@kw)3 Q|"XUx@SĀaǥHǕT(<7_ZK p7^ ;%13!b1"2"[qzح8Ex@0Y’&d^%M"0b)=x!BcJʄ1# )yAH<>恈H"@JAb2A;%| bI'd` :B$fB1tPOggSo* $,cX/*0'0,$00"'2'/'-0,100,,/%2'*.)$6.$(,&3'1('1+.+(,3$2,(5'2-$33,/)52(20'5&./%3/ %]MCI@]jayEc^ @+I5*@t4zIͪ^+ &/q@< @1l\ Ld;\lKp!I8sT)H" E<)FrA!l |Q>gTO`R4'x4'xMCdOS &+ZbEKpP dٕxD<.qoH*S`" T;Tw/Yuań2J t@q|8q1c3 UDkx8xh@ ItUؽ4 FVQX^20 C%43 SiPld 8٪n(yPx Q \뼹5xȞ0=&DG=BZ E0(lcWƼ4e̐W /SX DeDeMCx&/@0|ulI)y)BL d?ZGKJUEL>&Ix@ קP(⾵ b!'LP>g"jEhT6$1~q$1~qM2xxMH$X$XМj2 <5*ƥG/RzQ ,$Uw/2, 2a%aʘ> QAy*,DDEa7^np^D)x@<)R$"* xIa4&W3J*> tSD#xx)yK" 5L ɢl By)BۀIX"A%JO2&%Nm ̢wA]Lb4K^L1qq(. H z0PWRlUPqa,{h@2!$@ ,Q/L%ȧDt5P8+M):5Ā›BHY @c`D0 Pw("@6DNB%Nl@q|8q Y@lAaQlAaQUUeYʀx<˨@0LtCX^ tCX^ MD5 0 CbbXLpaaXtIT)8U(P! BdKƵYRqyT7xxY$ ɀ$ LU$ndH8IzHz$"! Hң)4!I@ @@ !B  < $ @ NQi4ΠQ)L jIQ ĚX@ŚX@b(p a:/R @HJ 4`$Ivvk$^yCo SBXL'RBwF! \F p^*BT 2 D^p^*B ̤lA}@_R>[PЗy)SbC0 Cb1cu"4)x4)x " Q@%@t,1رK v,+"q^qq })}@+J8 ` M , ]޽}-DwQf„4c) B)XbQf |E RD%D+?Oy${nZa< A@bb G-]D>; .0Θ2f>I)aC*DM^A5yyk"YE1b1. %Ib1Ceݙ@(t"t"✗0 {{ Wݵ6dkmpe(e ȭǥ@qJAݗ we,&eƮ*Anyu bZa ) 4 _ D$Eڵ6"ZwB0 @ 1J@@xܸ$)'T & D5W 容w)2F)f,&0 C)XLJ6|Q|Q78qqy"%TY4C5W7C5WQK<RIJ^!=ƽHwjQ,7ف_n"C-@RX1MDL %.!P LD|qP*&勃R1%!.H!q( l |Q>wi@12tqJllYZAeiiݤґ|\ƼT)@ BƼq&|ertЭyQP I \ڵpj>]dEq$ǀ Q`%jKYB(u>cLI(^̈! aU'D3hSHX̘a(1 PI,fL6@$At@qU8 EY<,wDE d'{7. 0@7. 0 xoR7|W]AUvPkXLC% CXyeI C)0 NP(TL=}IL=}IBq`2D1Z D1Z E $/^E|72 IE\Dd <9X>9X~(` FPQH/ a)dDL:$⼬dhe%Rӆ(KEf"E!TJqѠJzQ(=^)pi镌+B3t#(ܑ.^w%BIFܒI/ մܑ"TܴdҋB5 w%+\5-wpg4(Ĵܑ& 1/c"LḋI񘗱0(1Db^D"Ǽ0P|HI)eLI2)0żI2F^D1&⋏SŇ 6@Bc *McH&B &*Clc쪹Us!}G9(%s'&'|'`+A̮\ ]Ap ʆadϊW2 "%"0!EE !stzϹ:PPE7.I\7hb~yRB)J0(Y@(Y@R VDA@I5$Ћ8W@N E# 1ՁbJEcQ0n0Hq >N$R@4BH*4zq4zqܥ(=IDI`T3Zw3`:3Pf(lW8uN"ڮpDJ6Tܙd I0$¤c^ҘK  d(i(]@I(P T @)n\@?@G$0I(LWC"1E CPbbX,0X t@t@7!`qt|[XAmai+`1DL'Hq> J Lq+#(&|I>$wC żXLbE@ T'}dT'}dB tLcG_YR&H@@'> @A . q H+$"It[ZZ 궴@t7)Wy4(+c"T|hyi4FH/ŋFdl~ "iVDp5PJ!qL2ILR!4 S8Y f м&l 0܌nFR/)H =IY ԞjJAIwA a@%ѳP@\@L[ NC$[* R-U`1P2!z92!Jx<0b*,& OggS*vU.-.0-)4**/3&/1!3.0$2( .-+0(*/2'1/#3-)!4('0/'01'1-.2/)...'3-#2-)3$(20'2.2/*02(/,)2Yf " eLUbR0ĀaHLBe 1 Npj00#='R!PɧM5 $[ =kRT5ǍqJ^_(Q*BtvB]`$dLa:!=!KĉsM4J $Y``,T!"bX,6v@/ 04 C C$rm D|U#W9yE$oܧ)AlW\Ax¯*L2Օ!M> ID\ ⾚9:`v0V.p5j${!Bi̇ɘIe@e3LzqLzqBȞ*B x0 ,A[*"#mA"SZ2f(Ba(B^@@Py2Ab\1^㥾 EQpd i+ZLjIą2RtjTLlJp QA 0BtG_Kp7N `"KgE\zRD\RRRI]^DTvyy_]D Yv'c0L|(Pb>)ktl 8[n(]`2#DKXށ75xkyQq<4cDtYص®Dw)A> Ie<&<2Xd0ER/+t\.p^ADɘ>LW&B(LIRR_$ԗ9R9Qf#30 IbQ*ibJN6+0 ZTD2RIV4PIJir'{&ҍ4 B enJiRe$pS)[H Bd6P)EBF^":H)n`R;F:RBz$0LH@b#@L@0@B"*b)lSh,HmPm[`R뱩&} ! ɸ4.}{I ^oBNO 4D"wk&&'+q'X)Ba^Pzc*%L&\un8kvmrEɛH"`@L)Z )EKp^bR/IE+ 0rE#Ae\+1/c0/(1DI$L4zQ4zQBȞ*P$$  ;Y;YEF3a>+Wē4^xO'N*xND1:5btj/pJER٠Sb#a&A)B0 e a21dv%p^DEE5w.p^ad׉W`dxt[ڵҮDwH1lzy0>bĄ>S:&h d 8٪n(]`x@S q`HqxD H LQڹ;Ȱ b1c!- JS,aH2&|$n)9 $-HZpCʀx`'o1 @$[9 ԭ/*X`@@@x\^>* @̤6MW,<[d c B'M(Y$IA$Z $Z ,*JbYqaޘD(AVt0y# .u4oĥ.r^!yS@ ɞ āĔ|"# $<31?\^ :~@t<}LdP" j!\`4`k1X(w^dB(a L A,}7eFp^DDSR@!$%좸(.v+eXDl b'$<^#cH$C^:A yk(2CBaļ2xS$hL FTbp`x@DݔO;Q] D ! 7N@x\|@x< 4l=Z] DUX,ab,&0 e20$u"TT||S> P>wCa L^Zv3$pOI0 84Q*EI,7Z~b_).`)LLH$%M %DQ*wy HL P0 12C"| Ae|[ڵ+Dߖv ]&3=U qoL$d@\/dIxE_X |Q>E >d )P<IeD5qD5q7DFؕOg E S sݔ "ERJaX8'݇#0ׄׄEX0>4LO!$"PTP:<xVEp^*Bs0Y4OggS*J`\)-.$22$*-+*1$2.-/6/*0/*1(0)%1,$(1(01*2(2+'4-#,,(4)/.(0100/0+0(+3,%1-#-1% 3(2,!3-ڄu |:P>gP<7}q<7}q7##`< @T0 ?'.]=`RÒ4y!2ˤG (=l1 PSX,&@ L'|? Q>wC: Tq{GOe O$MT99E{H) M1h4" & D.k ]dx@&,d<5xfk"p^ H4H$@<@%:z:z7Ȉ{X{Q2&FPbq }~PBgR$E4+o50B0@9$ӀŔ6(1lpE0D!"+2h\B @@zT}^!@6pPƐDh B(xE +9X IMVSx\b@@@Ǎqxkb1h eu$i,R.Rמ2Q:C((S\JJ@ TLw(2x@\J!)AP duة8Yiv*yI&1\Oܵ@t=qy)B${&y7  RHE ɛ|-_, 4 ll@1,+xò8MCdOe@$t#Y b$Kp7d2 řtDŽ{E\^a gA0d,ΛòyD@ uJKBdzh$Eh}S1osQ$, tU>'*ǥ7 Bqx7 IDl1-p RX,3Ōa.c0 C@쮻=@% T =U*oHP! q)L:NS4Hٕ @kKH@C,/pcḋẊʘ S CbPƺD`1LzQLzQM"000 RHD|u| q(`: |W]w"DtEH25)xX'7@ Ҳ26@a,I})vIK1 I `␔$@Dt*45D'0|0jF }0Da< @6D %)B2% Gl`De,JT =(Q58TdO$%L^L')\^e #| Q( b1rb@)d,${q(Eӧc0T,'QTd9K !^a_Rg"j0 )ǺA`Pt|(Pp@yC0 {(c< %lAٵ@Pe HFɖ!¸q{E a@\d5Wsi` 6\a}>%20R SɏbR(I 0 &'<78Eq<4.l |Qߵ6_w 5P(Ǻ'> @AǑ ֿl:d1],p&˘3GĢˎ7 C L1hL\~ 8W(]00 $9\Z$K p7ҕ,K'q ).$(R\,,IٵhIʮDI$+҇2>TXL1 T|(U)D(ݤ( *f$ e`,GZ^ Z@tϤ) {*^Ľx@LId@O L\Ǯ)+ؕ7%sQ",y !|\(%N`t&Sqyܩ8E@<4lK?/ Uޗ*Q d<EǍ  K*@`6<#\ gp&WLxY bbX,0&AOAA)(*)j4"DDkj11 Ө"bJa";%DE" *b*L2{HKU- Ą‡ȤC y!dҔU!Hb27 / <ɇIE R IH@&Bʘ bȔ /c$<$§ I$ )$ 4I  Qi$ 3v购*[jNOggS:*vSY00 4(!10&!0)1'-'0.&/'%02$%2(1)1(23,,+13# ,(3)' 5( $.*1--..04-(,**1( 0- 22 203Z3Z%SY1e@ q3"ya< I}΅@D0[tQ$`x!>&2 *<Qt)St)SQHl ,lM=/ᷦڗQ >, !}"ō ō{ Ϥ :&lV+ Jj#Tb1Ci%BT~ 8թ(]B(x$Gڵ#AݯdUHde"K K$ oBR4Eڵ@ikl `QXLPI,f0TukX0\z|S=P>w"00N)|XR>g"*@)q |Qߵ6_w ]A cd72aR1y0L^vAe &(k `Mp&<9q]OdOh4*fu{5(Sx\ x\J@Tp7P^)&z Nr{}G)87*ʲTPrQ@0Ad(%+1 J4L5Tb{Q4H(1UϖP)-B%a0.pYeK&δdҤw%AYiJppGZJZ e$L˘Jȇ)%1O“y)Hx $"@O )Y ifF6bJ!T'aҖ 3v]`lB2n¸'mxy{\pÈB yC~2w2@)qd aF+! yZȢB<KO|(E&o< ^4@C\}w־;w)AEbLUFpJB) ]W <"($-5H-04 uq|BR i Pa \~D\~D7!`< `<@ &WM`Ms&""qP$ɢ|<} =6y1Hd%d/0)$ 1yiLȘ"L, v>6p ,JD|dD|d"RxSE<' 641[&fK(XUĸO!P0ĀO1)$o TRd\fEp^A=UM>E@%)Xp+p^(IlM?7ح{ TKH}0 P8E` t$ީ|~T>%!a/YUbPI!`\wQ1D2@)$ $)Y6HRmTq` W*\i@x::|dXJTbbXLC0 PfX_ E-EK)d8)ib1 5 P5LJi)p%&4H( #c;ҒU/;ҋL2$ẋI2F$Bb>)ʘe$c>L"1/eLļL"$A>y<ą$xH@$!R SdPT Q6-^ `M2Ha{a< L $Y7ID$aF1&4ФW{yQL7 1$ `Pi,,`iwQ$B=u] c  @@*@@&j<X&f0  c$7Dt: ?[鈲=l#kR0 04 0`Eۍb1cX;A`Ly3FLy3F7)B<x$ t&St&SG9H%t\:+U7p^!(e ^D,@lf p^AwQ1P )R@4K۵p];jxy^ eJrb.Q&ToM}Q )8> @A+S($aDIݽ(JDwQO)H@<(eOP<($, 4\s9`RwQ$h\T DK^h JT> xx<ƥTUEE?&1L385W`E-cbdbaJHbؽb$uwt |$Aq~8ED$0\O޵{=y] KٕyLx\@ܸxW H&IT!X* p Oa1% >& S1I723f rsrshڤ\K"pQEbXP1"`C0L 1EZ0EXUugZ$n*T$I PbAMӝiɤ ҩFBF&c1&200.|ܒU J K ,d50P ".d!O<>!H@ 1B !F%iTb ̦2FT:UUU')OggSj* >,1100),1**01!4/0/)211 /.//&+2$2./0.004&01'10+)0&.- &8]Mp{^dFKPz&yżK@!)hCLҙ|@5g T9ߥBz<ٝRƓ2xR0Gh$Ig:h^""y=,IMȘ0cIW~bO,Nl.@.@5$ OU+͸ 'I*Q6Ã$9 Jr:At$S0LhH<@!=J')$^􉏨 3LUھ*m_@E `1/Ӄ !$`@R/du)Ѡ!"M Hh"ACYZ :@t7DFEd 3L>1o 0B|U/KPB0TP+yx2 .qPFtvnUNp^T)`"yj$ˮ$q Ł@g l;]ko;]k?.CjJ $" $HIDQ`PtQ=uo]TOy2F6H20$ḟP" ;pt fdy "iNDp@I@%иYtTKܽVWKܽVY,Žfq  ǥ(Hq_U)6"I/RZphDM2 hXRlhԴI9%EJ"% J XP5ņV5E1AS TSPL,j tG)*b }0a)5H!8nt%`%˞ dq@ K6Ma Iz!$O>$"BxRR!@AI  ` BT6F `Pi4MX4A%HR.aftH[:)R R RԨ,$a3dL 1i)Vi`ZLCEUMba5D QD EѳI*(N* J'[e4;"ȔC!pB6-h ; hAv'H^jATU3H{8 2y4A!Œ /Zk#xّ|"F(ExbBjbx2s 06D @Ŧ(4 P[oBDVEp^!`< `< .Db$@0DIؽ%a]b4Ǎqxx<7Ǎqx`b:$/`V fV`&&S ] `^^BdFlOߵP] uEW>L12NL|bL$|.M9F0\ ZڅQ-E R@M%I,I۵@xIڮwC"BA< x\0%T tDGuu ]dBA0$fLАS0TX,iEtu%¢<+.k"jg CJ!h,L ")eLlG\oG\f33]) H"4EĒKY% Aat]m.Fy"BṠd/BiL!@A4:D:V2Rs^"W=IJʀP4KYZ j@BPXgPEyi˘>.B"L"/+6l0Dl0DE`a* ^W6ppJEq"8`@@R!@q(HPS($<;5W+$.ͤD "%DBX2jTMݳBT5uϾ +`1XJ&+1c0&BeLM1/PvxT0hlDJBF6p^ R$CI$`R E۵Q];b 0 ť>@č Lq S0T|h_Ck$y)ew2fL)&!I0R$# A!ly ճ)8T]J(z!ȞՀEH DO[Z =mi^T"d0L`N 2"< bFSEEM2T3j&Ryj$(=F".^ asbjQ;]H 2"B)& eJeLRE`tʰ!㐠C`RL,/eSD2&BI!Ƽ)$ e+c"4.詠:!_OxUEHиi l?XKp5HG2q}H ;34X@\5쀫p^0Jgt0$aB0yBP.ft:]d`ŻB9.jj(j4REL2hx1hP&W[LC-VC 5LQ!)**jQLLCS&IU;7R;Rx&(x,/D, 1,/&aд,,TCd+L2-ey@Sm44J=nIzeK ؉=<2a> ^$gwv;GsPc2X)&O n;1`MD@h(@gSl * L: a#bېthdd "R,DJ"` P)****&bZƪbV5(f`(2I^,jUCEQTdJTXٝ+%XLᅂIXpSbZLA,Y $xL ba4:j8b΋@Rb>" A& )II|(cIE$CI =R؉6;BRKH hv#6&! L6ɢ#RhkiCu6L\#Ў04FņZX- +7%&a(;LBl%/{A{LJzB&b>La D()& $$L1/! 0 !%2&BIB QڐPgltron-0.70/data/lightcycle-high.obj0000644000076400001440000050573507735315037013130 mtllib lightcycle.mtl g default v 0.273865 3.451810 1.481210 v -0.293908 3.451810 1.481210 v -0.000798 3.451810 1.551250 v 1.083190 -2.294590 -1.004510 v 1.174230 -2.294590 -0.550090 v 1.083190 -2.294590 -0.066475 v -1.080810 -2.294650 -0.066399 v -1.171850 -2.294650 -0.550014 v -1.080810 -2.294650 -1.004430 v 0.434769 -2.965110 0.879098 v 0.750321 -2.965170 0.879098 v 0.434769 -3.398560 0.879098 v -0.750320 -2.965170 0.879795 v -0.434768 -2.965110 0.879795 v -0.434768 -3.398560 0.879795 v -0.552989 -0.046829 -0.405302 v -0.489927 -0.138082 -0.407085 v -0.492252 -0.042175 -0.371121 v -0.491956 -0.072407 -0.502362 v -0.555379 -0.062665 -0.468814 v -0.765426 0.857927 -0.959692 v -0.854535 0.856904 -0.765733 v -0.767463 0.853919 -0.533109 v 0.558915 -0.046950 -0.405302 v 0.498178 -0.042296 -0.371121 v 0.496648 -0.137495 -0.406907 v 0.497881 -0.072529 -0.502362 v 0.561304 -0.062786 -0.468814 v 0.771352 0.857806 -0.959692 v 0.779443 0.852508 -0.532277 v 0.860461 0.856783 -0.765733 v -0.544976 2.521220 0.337415 v -0.608399 2.530960 0.303866 v -0.543325 2.461850 0.232742 v 0.546007 2.521160 0.337334 v 0.546813 2.461540 0.233014 v 0.609430 2.530900 0.303785 v 0.252258 3.181190 1.420540 v 0.141074 2.771630 1.228700 v 0.257039 2.811790 1.105020 v 0.449688 3.181190 1.200710 v 0.293407 2.811790 1.028410 v 0.508876 3.181190 1.028410 v 0.548442 3.451810 1.028410 v 0.486245 3.451810 1.235730 v -0.497545 3.451810 1.235730 v -0.546568 3.451810 1.028410 v -0.510744 3.181190 1.028410 v -0.461941 3.181190 1.200710 v -0.273868 3.181190 1.420540 v -0.269292 2.811790 1.105020 v -0.162684 2.771630 1.228700 v -0.295274 2.811790 1.028410 v -0.000934 3.181190 1.481210 v 0.548483 2.891820 -0.192291 v 0.548483 3.135100 0.057695 v 0.548483 3.451900 0.151337 v 0.548483 3.451900 1.084660 v 0.548483 2.822140 -0.521823 v -0.546186 2.822030 -0.512824 v -0.546186 2.891820 -0.192291 v -0.546186 3.451900 1.084660 v -0.546186 1.825790 1.084660 v 0.548483 2.903480 -0.829070 v 0.548483 3.144320 -1.059490 v -0.546186 3.143510 -1.058950 v -0.546186 2.903480 -0.829609 v 0.549202 3.453240 -1.161700 v 0.548483 3.455560 -1.571460 v -0.546186 3.453130 -1.571460 v -0.545467 3.453510 -1.161440 v 0.548483 1.566400 -1.565410 v -0.676956 1.426180 -0.923380 v 0.679253 1.426090 -0.923929 v 0.679253 1.502690 -0.968153 v -0.676956 1.502770 -0.967603 v -0.676956 1.349590 -1.056050 v -0.676956 1.426180 -1.100270 v 0.679253 1.426090 -1.100820 v 0.679253 1.349500 -1.056590 v -0.676956 1.502770 -1.056050 v 0.679253 1.502690 -1.056590 v 0.548278 2.836660 0.592582 v 0.723279 2.856050 0.525728 v 0.548111 3.451870 0.903784 v 0.819480 3.451490 0.794665 v 0.617091 2.538280 0.278425 v 0.781827 2.885110 0.407483 v 0.908592 3.450470 0.600709 v 0.751699 2.918300 0.284572 v 0.860883 3.447070 0.402437 v 0.607041 2.546730 0.240274 v 0.683428 2.934270 0.220732 v 0.757213 3.446750 0.300198 v 0.586818 2.550280 0.219000 v 0.544504 3.448210 0.236618 v 0.546683 2.942970 0.181952 v 0.546304 2.551390 0.206089 v -0.000934 2.771630 1.263720 v 0.834473 -2.294590 0.298371 v 0.788952 -1.774170 0.185737 v 0.494714 -1.774170 0.394516 v 0.494714 -2.294590 0.540647 v 0.664592 -1.063780 -0.121979 v 0.494714 -1.063780 -0.004720 v 1.004350 -1.774170 -0.129311 v 0.788952 -1.063780 -0.300982 v 1.083190 -1.774170 -0.550090 v 0.834473 -1.063780 -0.550090 v 1.004350 -1.774170 -0.941669 v 0.788952 -1.063780 -0.769997 v 0.788952 -1.774170 -1.270390 v 0.664592 -1.063780 -0.962676 v 0.834473 -2.294590 -1.383020 v 0.494714 -1.774170 -1.494690 v 0.494714 -1.063780 -1.095460 v 0.494714 -2.294590 -1.640820 v -0.722248 2.856100 0.525809 v -0.780796 2.885190 0.407563 v -0.616060 2.538340 0.278506 v -0.750668 2.918350 0.284653 v -0.606010 2.546800 0.240352 v -0.907558 3.450520 0.600787 v -0.859850 3.447130 0.402518 v -0.818449 3.451550 0.794746 v -0.547247 2.836710 0.592660 v -0.547080 3.451920 0.903862 v -0.682397 2.934330 0.220812 v -0.585787 2.550340 0.219081 v -0.756182 3.446800 0.300278 v -0.545652 2.943050 0.182033 v -0.545273 2.551450 0.206170 v -0.543473 3.448260 0.236699 v 0.675151 0.262355 -0.690755 v 0.733698 0.291443 -0.572511 v 0.568965 -0.055403 -0.443454 v 0.670262 0.338418 -0.409517 v 0.500152 0.242978 -0.757607 v 0.499985 0.858191 -1.068810 v 0.498558 0.349298 -0.346981 v 0.496378 0.854533 -0.401650 v -1.001970 -1.774240 -0.129235 v -1.080810 -1.774240 -0.550014 v -1.001970 -1.774240 -0.941594 v -0.832089 -1.063850 -0.550014 v -0.786571 -1.063850 -0.769922 v -0.786571 -1.063850 -0.300907 v -0.492333 -1.774240 0.394594 v -0.492333 -1.063850 -0.004645 v -0.662211 -1.063850 -0.121902 v -0.786571 -1.774240 0.185815 v -0.492333 -2.294650 0.540723 v -0.832089 -2.294650 0.298447 v -0.786571 -1.774240 -1.270320 v -0.832089 -2.294650 -1.382950 v -0.662211 -1.063850 -0.962601 v -0.492333 -1.063850 -1.095380 v -0.492333 -1.774240 -1.494620 v -0.492333 -2.294650 -1.640750 v 0.555527 -2.965170 1.132750 v 0.434769 -2.965170 1.158190 v 0.657899 -2.965170 1.060320 v 0.726302 -2.965170 0.951910 v 1.017830 -2.208930 0.879098 v 1.196560 -1.365100 0.879098 v 1.138590 -1.365110 1.132750 v 0.973451 -2.208930 1.060320 v 1.259350 -0.444873 0.879098 v 1.196580 -0.384063 1.158190 v 1.017830 -0.323215 1.441480 v 0.973451 -1.365110 1.394480 v 0.750320 -0.284385 1.630760 v 0.726302 -1.365110 1.569350 v 0.657899 -2.208930 1.394480 v 0.434768 -1.365110 1.630760 v 0.434769 -2.208930 1.441480 v 0.434768 -0.270147 1.697230 v 0.434768 -0.444873 0.879098 v -0.555526 -2.965170 1.133450 v -0.434768 -2.965170 1.158880 v -0.657898 -2.965170 1.061010 v -0.726302 -2.965170 0.952603 v -1.017830 -0.323216 1.442170 v -0.973451 -1.365110 1.395170 v -0.726302 -1.365110 1.570050 v -0.750323 -0.284385 1.631460 v -0.434768 -1.365110 1.631460 v -0.434768 -0.270147 1.697920 v -1.017830 -2.208930 0.879795 v -0.973451 -2.208930 1.061010 v -1.196560 -1.365100 0.879795 v -1.138590 -1.365110 1.133450 v -1.259350 -0.444874 0.879795 v -1.196580 -0.384063 1.158880 v -0.316211 3.307550 -0.247251 v -0.316211 3.196870 -0.357936 v -0.201011 3.156410 -0.334590 v -0.201011 3.284190 -0.206818 v -0.316211 3.156360 -0.509137 v -0.201011 3.109650 -0.509137 v -0.316211 3.196870 -0.660334 v -0.201011 3.156410 -0.683679 v -0.316211 3.307550 -0.771018 v -0.201011 3.284190 -0.811451 v -0.316211 3.458740 -0.811532 v -0.201011 3.458740 -0.858225 v -0.316211 3.609930 -0.771018 v -0.201011 3.633280 -0.811451 v -0.316211 3.720630 -0.660334 v -0.201011 3.761060 -0.683679 v -0.316211 3.761140 -0.509137 v -0.201011 3.807820 -0.509137 v -0.316211 3.720630 -0.357936 v -0.201011 3.761060 -0.334590 v -0.316211 3.609930 -0.247251 v -0.201011 3.633280 -0.206818 v -0.299662 4.381530 0.023643 v -0.299662 3.991530 0.413664 v -0.400593 3.371470 -0.357976 v -0.400593 3.307570 -0.421862 v -0.400593 3.284190 -0.509137 v -0.400593 3.307570 -0.596407 v -0.400593 3.371470 -0.660293 v -0.400593 3.546010 -0.660293 v -0.400593 3.609900 -0.596407 v -0.400593 3.633280 -0.509137 v -0.400593 3.609900 -0.421862 v -0.400593 3.546010 -0.357976 v -0.427666 3.430160 -0.459631 v -0.427666 3.409230 -0.480555 v -0.427666 3.401580 -0.509137 v -0.427666 3.409230 -0.537718 v -0.427666 3.430160 -0.558639 v -0.427666 3.458740 -0.566300 v -0.400593 3.458740 -0.683679 v -0.427666 3.487320 -0.558639 v -0.427666 3.508250 -0.537718 v -0.427666 3.515890 -0.509137 v -0.427666 3.508250 -0.480555 v -0.427666 3.487320 -0.459631 v 0.402890 3.371470 -0.357976 v 0.402890 3.307570 -0.421862 v 0.429960 3.409230 -0.480555 v 0.429960 3.430160 -0.459631 v 0.402890 3.284190 -0.509137 v 0.429960 3.401580 -0.509137 v 0.402890 3.307570 -0.596407 v 0.429960 3.409230 -0.537718 v 0.402890 3.371470 -0.660293 v 0.429960 3.430160 -0.558639 v 0.402890 3.458740 -0.683679 v 0.429960 3.458740 -0.566300 v 0.402890 3.546010 -0.660293 v 0.429960 3.487320 -0.558639 v 0.402890 3.609900 -0.596407 v 0.429960 3.508250 -0.537718 v 0.402890 3.633280 -0.509137 v 0.429960 3.515890 -0.509137 v 0.402890 3.609900 -0.421862 v 0.429960 3.508250 -0.480555 v 0.402890 3.546010 -0.357976 v 0.429960 3.487320 -0.459631 v 0.318508 3.307550 -0.247251 v 0.318508 3.196870 -0.357936 v 0.318508 3.156360 -0.509137 v 0.318508 3.196870 -0.660334 v 0.318508 3.307550 -0.771018 v 0.318508 3.609930 -0.771018 v 0.318508 3.720630 -0.660334 v 0.318508 3.761140 -0.509137 v 0.318508 3.720630 -0.357936 v 0.318508 3.609930 -0.247251 v 0.203307 3.284190 -0.206818 v 0.203307 3.156410 -0.334590 v 0.203307 3.109650 -0.509137 v 0.203307 3.156410 -0.683679 v 0.203307 3.284190 -0.811451 v 0.203307 3.458740 -0.858225 v 0.318508 3.458740 -0.811532 v 0.203307 3.633280 -0.811451 v 0.203307 3.761060 -0.683679 v 0.203307 3.807820 -0.509137 v 0.203307 3.761060 -0.334590 v 0.203307 3.633280 -0.206818 v 0.301959 4.381530 0.023643 v 0.301959 3.991530 0.413664 v -0.345585 4.007550 0.441443 v -0.345585 4.409330 0.039680 v -0.299662 3.458740 0.556424 v -0.345584 3.458740 0.588499 v -0.131138 4.749900 0.236311 v -0.131138 4.204180 0.782016 v 0.001148 4.229370 0.825638 v 0.001148 4.793510 0.261496 v 0.133435 4.204180 0.782016 v 0.133435 4.749900 0.236311 v 0.347881 4.409330 0.039680 v 0.347881 4.007550 0.441443 v 0.347881 3.458740 0.588499 v 0.301959 3.458740 0.556424 v -0.299662 4.524290 -0.509137 v -0.345585 4.556370 -0.509137 v -0.131138 4.949630 -0.509137 v 0.001148 5.000000 -0.509137 v 0.133435 4.949630 -0.509137 v 0.347881 4.556370 -0.509137 v 0.301959 4.524290 -0.509137 v -0.299662 2.535950 -1.041910 v -0.299662 2.925980 -1.431930 v -0.345584 2.909920 -1.459710 v -0.345584 2.508170 -1.057950 v -0.299662 3.458740 -1.574690 v -0.345584 3.458740 -1.606760 v 0.347882 2.508170 -1.057950 v 0.347881 2.909920 -1.459710 v 0.301959 2.925980 -1.431930 v 0.301959 2.535950 -1.041910 v 0.347881 3.458740 -1.606760 v 0.301959 3.458740 -1.574690 v 0.347881 4.007550 -1.459710 v 0.301959 3.991530 -1.431930 v 0.347881 4.409330 -1.057950 v 0.301959 4.381530 -1.041910 v 0.001148 4.229370 -1.843910 v 0.001148 4.793510 -1.279770 v 0.133435 4.749900 -1.254580 v 0.133435 4.204180 -1.800280 v -0.131138 4.204180 -1.800280 v -0.131138 4.749900 -1.254580 v -0.299662 3.991530 -1.431930 v -0.345585 4.007550 -1.459710 v -0.299662 4.381530 -1.041910 v -0.345585 4.409330 -1.057950 v 0.875216 -3.546010 -0.357895 v 0.875216 -3.609900 -0.421781 v 0.916234 -3.508250 -0.480471 v 0.916234 -3.487320 -0.459548 v 0.875216 -3.633280 -0.509053 v 0.916234 -3.515900 -0.509053 v 0.875216 -3.609900 -0.596323 v 0.916234 -3.508250 -0.537634 v 0.875216 -3.546010 -0.660212 v 0.916234 -3.487320 -0.558558 v 0.875216 -3.371470 -0.660212 v 0.875216 -3.307570 -0.596323 v 0.916234 -3.409230 -0.537634 v 0.916234 -3.430160 -0.558558 v 0.875216 -3.284190 -0.509053 v 0.916234 -3.401580 -0.509053 v 0.875216 -3.307570 -0.421781 v 0.916234 -3.409230 -0.480471 v 0.875216 -3.371470 -0.357895 v 0.916234 -3.430160 -0.459548 v 0.747363 -3.609930 -0.247170 v 0.747363 -3.720630 -0.357855 v 0.747363 -3.761140 -0.509053 v 0.747363 -3.720630 -0.660250 v 0.747363 -3.609930 -0.770937 v 0.747363 -3.458740 -0.811448 v 0.747363 -3.307550 -0.770937 v 0.875216 -3.458740 -0.683595 v 0.747363 -3.196840 -0.660250 v 0.747363 -3.156330 -0.509053 v 0.747363 -3.196840 -0.357855 v 0.747363 -3.307550 -0.247170 v 0.572820 -3.458740 -0.159966 v 0.747363 -3.458740 -0.206656 v 0.572820 -3.284190 -0.206734 v 0.572820 -3.633280 -0.206734 v 0.572820 -3.761060 -0.334509 v 0.572820 -3.807820 -0.509053 v 0.572820 -3.761060 -0.683595 v 0.572820 -3.633280 -0.811370 v 0.572820 -3.284190 -0.811370 v 0.572820 -3.156410 -0.683595 v 0.572820 -3.109650 -0.509053 v 0.572820 -3.156410 -0.334509 v 0.800063 -3.961360 0.361511 v 0.800063 -4.329300 -0.006434 v 0.800063 -4.463980 -0.509053 v 0.800063 -4.329300 -1.011670 v 0.800063 -3.961360 -1.379620 v 0.800063 -2.956120 -1.379620 v 0.800063 -2.588170 -1.011670 v 0.800063 -2.453490 -0.509053 v 0.800063 -2.588170 -0.006434 v 0.800063 -2.956120 0.361511 v 1.078580 -4.007550 0.441524 v 1.078580 -4.409330 0.039761 v 1.078580 -4.556370 -0.509053 v 1.078580 -4.409330 -1.057870 v 1.078580 -4.007550 -1.459630 v 1.078580 -2.909920 -1.459630 v 1.078580 -2.508140 -1.057870 v 1.078580 -2.361100 -0.509053 v 1.078580 -2.508140 0.039761 v 1.078580 -2.909920 0.441524 v -0.913936 -3.515900 -0.509053 v -0.913936 -3.508250 -0.537634 v -0.872918 -3.609900 -0.596323 v -0.872918 -3.633280 -0.509053 v -0.913936 -3.487320 -0.558558 v -0.872918 -3.546010 -0.660212 v -0.745065 -3.720630 -0.660250 v -0.745065 -3.761140 -0.509053 v -0.745065 -3.609930 -0.770934 v -0.570522 -3.761060 -0.683595 v -0.570522 -3.807820 -0.509053 v -0.570522 -3.633280 -0.811370 v -0.797765 -4.329300 -1.011670 v -0.797765 -4.463980 -0.509053 v -0.797765 -3.961360 -1.379620 v -1.076280 -4.409330 -1.057870 v -1.076280 -4.556370 -0.509053 v -1.076280 -4.007550 -1.459630 v -0.377029 -4.949630 -0.509053 v -0.377029 -4.749900 -1.254500 v 0.001149 -4.793510 -1.279680 v 0.001149 -5.000000 -0.509053 v -0.377029 -4.204180 -1.800200 v 0.001149 -4.229370 -1.843830 v 0.379327 -4.749900 -1.254500 v 0.379327 -4.949630 -0.509053 v 0.379327 -4.204180 -1.800200 v 0.771511 -2.791400 -1.664910 v 0.771511 -2.302880 -1.176380 v 0.771511 -2.124070 -0.509056 v 0.771511 -2.302880 0.158278 v 0.771511 -2.791400 0.646801 v 0.001149 -4.229370 0.825719 v 0.001149 -4.793510 0.261577 v 0.379327 -4.749900 0.236392 v 0.379327 -4.204180 0.782099 v -0.377029 -4.204180 0.782099 v -0.377029 -4.749900 0.236392 v -1.076280 -2.909920 -1.459630 v -1.076280 -2.508140 -1.057870 v -0.769213 -2.302880 -1.176380 v -0.769213 -2.791400 -1.664910 v -1.076280 -2.361100 -0.509053 v -0.769213 -2.124070 -0.509056 v -1.076280 -2.508140 0.039761 v -0.769213 -2.302880 0.158278 v -1.076280 -2.909920 0.441524 v -0.769213 -2.791400 0.646801 v -0.797765 -3.961360 0.361511 v -0.797765 -4.329300 -0.006434 v -1.076280 -4.409330 0.039761 v -1.076280 -4.007550 0.441524 v -0.797765 -2.956120 -1.379620 v -0.797765 -2.588170 -1.011670 v -0.797765 -2.453490 -0.509053 v -0.797765 -2.588170 -0.006434 v -0.797765 -2.956120 0.361511 v -0.570522 -3.633280 -0.206734 v -0.570522 -3.761060 -0.334509 v -0.570522 -3.284190 -0.811370 v -0.570522 -3.156410 -0.683595 v -0.570522 -3.109650 -0.509053 v -0.570522 -3.156410 -0.334509 v -0.570522 -3.284190 -0.206734 v -0.745065 -3.458740 -0.206656 v -0.570522 -3.458740 -0.159966 v -0.745065 -3.307550 -0.247170 v -0.745065 -3.609930 -0.247170 v -0.745065 -3.720630 -0.357855 v -0.745065 -3.458740 -0.811448 v -0.570522 -3.458740 -0.858139 v -0.745065 -3.307550 -0.770937 v -0.745065 -3.196840 -0.660250 v -0.745065 -3.156330 -0.509053 v -0.745065 -3.196840 -0.357855 v -0.872918 -3.546010 -0.357895 v -0.872918 -3.609900 -0.421781 v -0.872918 -3.458740 -0.683595 v -0.872918 -3.371470 -0.660212 v -0.872918 -3.307570 -0.596323 v -0.872918 -3.284190 -0.509053 v -0.872918 -3.307570 -0.421781 v -0.872918 -3.371470 -0.357895 v -0.913936 -3.487320 -0.459548 v -0.913936 -3.508250 -0.480471 v -0.913936 -3.430160 -0.558558 v -0.913936 -3.409230 -0.537634 v -0.913936 -3.401580 -0.509053 v -0.913936 -3.409230 -0.480471 v -0.913936 -3.430160 -0.459548 v 0.678787 -2.157460 1.583380 v 0.678787 -1.124810 1.718380 v 0.570366 -1.142410 1.806670 v 0.570366 -2.185810 1.668520 v 0.678925 -0.004852 1.752320 v 0.571394 0.029453 1.839210 v -0.576122 -1.142320 1.806380 v -0.576068 -2.185810 1.668520 v -0.576162 0.031290 1.839230 v -0.676490 -1.124750 1.718120 v -0.676490 -2.157470 1.583260 v -0.676490 -0.004764 1.752240 v -0.676489 -3.394600 1.190930 v -0.576068 -3.436350 1.270410 v 0.570366 -3.435550 1.270680 v 0.678788 -3.393800 1.191330 v 0.678788 -3.414540 0.649185 v 0.678788 -4.117340 0.793210 v 0.570366 -4.270450 0.820601 v -0.576068 -4.270450 0.820601 v -0.676489 -4.117260 0.793321 v 0.678787 1.397340 1.509670 v 0.570365 1.449700 1.591280 v -0.576068 1.449170 1.591280 v 0.570365 2.482670 1.157560 v -0.576068 2.481860 1.157560 v 0.678787 2.412520 1.086860 v -0.676490 1.396850 1.509640 v -0.676490 2.411800 1.086810 v -0.390239 3.054810 1.114590 v 0.393454 3.056720 1.117850 v 0.394025 2.865050 0.797334 v -0.389665 2.863190 0.794059 v 0.393454 1.789460 1.687220 v 0.394025 1.652670 1.352160 v -0.390238 1.787550 1.683970 v -0.389665 1.650790 1.348880 v 0.393454 0.746772 1.948920 v 0.394025 0.702910 1.594350 v -0.390238 0.744859 1.945660 v -0.389665 0.701024 1.591070 v 0.393454 -0.270583 2.050400 v 0.394025 -0.270750 1.687430 v -0.390238 -0.272496 2.047140 v -0.389665 -0.272636 1.683990 v 0.393454 -1.790790 1.943920 v 0.394025 -1.736560 1.567550 v -0.390238 -1.792700 1.940660 v -0.389664 -1.738450 1.564280 v 0.393455 -3.710610 1.388340 v 0.394026 -3.516190 1.083290 v 0.394026 -3.038430 1.243490 v 0.393455 -3.208800 1.591400 v -0.390238 -3.712530 1.385090 v -0.390238 -3.210710 1.588150 v -0.389664 -3.040320 1.240210 v -0.389664 -3.518080 1.080020 v -0.389664 -4.198040 0.807570 v -0.390238 -4.551950 0.870578 v 0.393455 -4.550040 0.873829 v 0.394026 -4.198100 0.807540 v 0.678787 1.492600 0.504637 v -0.676490 1.492600 0.505176 v 0.678787 0.970042 -0.110846 v -0.676490 0.970311 -0.111115 v 0.678787 -2.156480 -0.109958 v -0.676490 -2.157020 -0.109958 v -0.676490 -2.646060 0.507118 v 0.678788 -2.646330 0.507387 v -0.676489 -3.413190 0.648916 v -0.546186 1.566400 -1.565410 v -0.669225 0.262476 -0.690755 v -0.563039 -0.055282 -0.443454 v -0.727773 0.291565 -0.572511 v -0.658281 0.338200 -0.410347 v -0.494059 0.858312 -1.068810 v -0.494226 0.243099 -0.757607 v -0.492632 0.349419 -0.346981 v -0.490453 0.854655 -0.401650 v 0.678787 1.500410 -0.676226 v -0.676490 1.500680 -0.676495 v -0.676490 1.307820 -0.738178 v 0.678787 1.308350 -0.738447 v -0.546185 -2.809320 -1.565410 v -0.543761 -2.809320 1.291700 v -0.546185 -2.265750 1.291700 v -0.546185 -2.265750 -1.565410 v -0.495675 -0.368304 -0.567460 v 0.494302 -0.375000 -0.569196 v -0.434768 -0.444873 0.879795 v 0.847058 -2.208930 1.260630 v -0.657898 -2.208930 1.395170 v -0.434768 -2.208930 1.442170 v -0.316211 3.458740 -0.206737 v -0.201011 3.458740 -0.160047 v -0.427666 3.458740 -0.451974 v -0.400593 3.458740 -0.334590 v 0.402890 3.458740 -0.334590 v 0.429960 3.458740 -0.451974 v 0.203307 3.458740 -0.160047 v 0.318508 3.458740 -0.206737 v -0.268325 4.126070 0.646720 v -0.268325 4.614600 0.158198 v -0.131138 3.458740 0.981761 v 0.001148 3.458740 1.032130 v 0.133435 3.458740 0.981761 v 0.270622 4.126070 0.646720 v 0.270622 4.614600 0.158198 v -0.268325 2.302890 -1.176470 v -0.268325 2.791410 -1.664990 v -0.131138 2.713300 -1.800280 v -0.131138 2.167590 -1.254580 v -0.268325 3.458740 -1.843800 v -0.131138 3.458740 -2.000030 v 0.001148 2.688110 -1.843910 v 0.001148 2.123970 -1.279760 v 0.001148 3.458740 -2.050400 v 0.133435 2.713300 -1.800280 v 0.133435 2.167590 -1.254580 v 0.133435 3.458740 -2.000030 v 0.270622 2.791410 -1.664990 v 0.270622 2.302890 -1.176470 v 0.270622 3.458740 -1.843800 v 0.270622 4.126070 -1.664990 v 0.270622 4.614600 -1.176470 v -0.268325 4.126070 -1.664990 v -0.268325 4.614600 -1.176470 v 1.078580 -3.458740 -1.606680 v 0.800063 -3.458740 -1.514290 v -0.769213 -4.614600 -1.176380 v -0.769213 -4.793400 -0.509053 v -0.769213 -4.126070 -1.664910 v 0.771511 -4.126070 -1.664910 v 0.771511 -4.614600 -1.176380 v 0.771511 -4.793400 -0.509053 v 0.771511 -4.126070 0.646801 v 0.771511 -4.614600 0.158278 v 0.379327 -2.713290 -1.800200 v 0.379327 -2.167580 -1.254500 v 0.001149 -3.458740 -2.050310 v 0.379327 -3.458740 -1.999940 v 0.001149 -2.688110 -1.843830 v 0.001149 -2.123960 -1.279680 v -0.377029 -3.458740 -1.999940 v -0.377029 -2.713290 -1.800200 v -0.377029 -2.167580 -1.254500 v -0.769213 -4.614600 0.158278 v -0.769213 -4.126070 0.646801 v -0.797765 -3.458740 -1.514290 v -1.076280 -3.458740 -1.606680 v 0.548483 1.825790 1.084660 v -0.546186 3.135100 0.057695 v -0.546186 3.451900 0.151337 v -0.546186 1.192800 0.339252 v 0.548483 1.192800 0.339252 v -0.676956 1.349590 -0.967603 v 0.679253 1.349500 -0.968153 v 0.434768 -1.365100 0.879098 v 0.434769 -2.208990 0.879098 v -0.847057 -2.208930 1.261320 v -0.434768 -2.208990 0.879795 v -0.434768 -1.365100 0.879795 v -0.299662 2.925980 0.413664 v -0.299662 2.535950 0.023643 v -0.299662 2.393190 -0.509137 v 0.301959 2.925980 0.413664 v 0.301959 2.535950 0.023643 v 0.301959 2.393190 -0.509137 v -0.268325 3.458740 0.825533 v 0.270622 3.458740 0.825533 v -0.268325 4.793400 -0.509137 v 0.270622 4.793400 -0.509137 v 0.916234 -3.458740 -0.451890 v 0.875216 -3.458740 -0.334509 v 0.916234 -3.458740 -0.566216 v 0.572820 -3.458740 -0.858139 v 0.800063 -3.458740 0.496190 v 1.078580 -3.458740 0.588580 v 0.771511 -3.458740 0.825614 v 0.379327 -3.458740 0.981841 v 0.771511 -3.458740 -1.843720 v -0.769213 -3.458740 0.825614 v -0.377029 -3.458740 0.981841 v -0.769213 -3.458740 -1.843720 v -1.076280 -3.458740 0.588580 v -0.797765 -3.458740 0.496190 v -0.872918 -3.458740 -0.334509 v -0.913936 -3.458740 -0.451890 v -0.913936 -3.458740 -0.566216 v 0.548483 -2.265750 -1.565410 v 0.548483 -2.809320 -1.565410 v 0.548483 -2.809320 1.291700 v 0.548483 -2.265750 1.291700 v 0.834473 -1.063780 -0.550090 v 0.664592 -1.063780 -0.121979 v 0.664592 -1.063780 -0.962676 v -0.832089 -1.063850 -0.550014 v -0.662211 -1.063850 -0.121902 v -0.662211 -1.063850 -0.962601 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn -0.707107 0.000000 0.707107 vn -0.000000 -1.000000 0.000000 vn -0.408248 -0.816497 0.408248 vn -0.848288 0.094287 0.521073 vn -0.000000 -1.000000 0.000000 vn -0.408248 -0.816497 0.408248 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn -0.754321 -0.068901 0.652880 vn -0.445037 -0.323865 0.834897 vn -0.527233 0.115337 0.841857 vn -0.395397 -0.658416 -0.640429 vn -0.390421 -0.761869 -0.516843 vn -0.419048 -0.688095 -0.592388 vn 0.000916 0.999967 0.008092 vn 0.009063 0.999914 0.009438 vn 0.000982 0.999955 0.009400 vn 0.464512 -0.226171 0.856198 vn 0.424747 -0.170979 0.889020 vn 0.445625 -0.321265 0.835588 vn 0.425020 -0.669655 -0.609032 vn 0.397857 -0.650766 -0.646694 vn 0.389595 -0.763709 -0.514746 vn -0.001396 0.999948 0.010110 vn -0.001702 0.999921 0.012427 vn -0.016165 0.999789 0.012699 vn -0.659913 0.146362 0.736948 vn -0.391785 -0.670624 0.629895 vn -0.850572 -0.151956 0.503426 vn -0.343995 0.184236 0.920720 vn 0.368844 -0.805765 0.463353 vn 0.053442 -0.321688 0.945336 vn 0.573700 -0.352310 0.739423 vn 0.720911 -0.444686 0.531547 vn 0.721044 -0.481883 0.497880 vn 0.721044 -0.481883 0.497880 vn 0.837571 -0.337150 0.429889 vn 0.573700 -0.352310 0.739423 vn 0.837571 -0.337150 0.429889 vn 0.721044 -0.481883 0.497880 vn 0.805416 -0.493713 0.327952 vn 0.805416 -0.493713 0.327952 vn 0.897518 -0.315285 0.308313 vn 0.837571 -0.337150 0.429889 vn 0.941092 -0.150684 0.302720 vn 0.822020 -0.187372 0.537749 vn 0.837571 -0.337150 0.429889 vn 0.837571 -0.337150 0.429889 vn 0.897518 -0.315285 0.308313 vn 0.941092 -0.150684 0.302720 vn 0.822020 -0.187372 0.537749 vn -0.165814 0.276753 0.946527 vn 0.573700 -0.352310 0.739423 vn 0.573700 -0.352310 0.739423 vn 0.837571 -0.337150 0.429889 vn 0.822020 -0.187372 0.537749 vn -0.909818 -0.159491 0.383136 vn -0.965187 -0.127769 0.228229 vn -0.910634 -0.322586 0.258233 vn -0.910634 -0.322586 0.258233 vn -0.805803 -0.341943 0.483484 vn -0.909818 -0.159491 0.383136 vn -0.750937 -0.189443 0.632617 vn -0.909818 -0.159491 0.383136 vn -0.805803 -0.341943 0.483484 vn -0.805803 -0.341943 0.483484 vn -0.391719 -0.357797 0.847666 vn -0.750937 -0.189443 0.632617 vn -0.805803 -0.341943 0.483484 vn -0.802701 -0.496831 0.329894 vn -0.556594 -0.493693 0.668184 vn -0.556594 -0.493693 0.668184 vn -0.391719 -0.357797 0.847666 vn -0.805803 -0.341943 0.483484 vn -0.910634 -0.322586 0.258233 vn -0.828954 -0.483527 0.281137 vn -0.802701 -0.496831 0.329894 vn -0.802701 -0.496831 0.329894 vn -0.805803 -0.341943 0.483484 vn -0.910634 -0.322586 0.258233 vn -0.165814 0.276753 0.946527 vn -0.297338 0.070244 0.952185 vn 0.082760 -0.359348 0.929527 vn 0.082760 -0.359348 0.929527 vn 0.573700 -0.352310 0.739423 vn -0.165814 0.276753 0.946527 vn -0.297338 0.070244 0.952185 vn -0.226235 -0.229008 0.946770 vn -0.391719 -0.357797 0.847666 vn -0.391719 -0.357797 0.847666 vn 0.082760 -0.359348 0.929527 vn -0.297338 0.070244 0.952185 vn -1.000000 0.000000 -0.000000 vn -1.000000 0.000000 -0.000000 vn -1.000000 0.000000 -0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn -0.000468 0.881581 -0.472032 vn 0.000107 0.999682 0.025207 vn 0.000022 0.999760 0.021922 vn 0.000022 0.999760 0.021922 vn 0.000000 0.880872 -0.473354 vn -0.000468 0.881581 -0.472032 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn -1.000000 -0.000000 -0.000000 vn -1.000000 -0.000000 -0.000000 vn -1.000000 -0.000000 0.000000 vn 0.000357 0.862030 0.506858 vn 0.000041 0.515343 0.856984 vn 0.000007 0.515153 0.857098 vn 0.000007 0.515153 0.857098 vn -0.000249 0.862850 0.505460 vn 0.000357 0.862030 0.506858 vn 0.000357 0.862030 0.506858 vn -0.000249 0.862850 0.505460 vn 0.000022 0.999760 0.021922 vn 0.000022 0.999760 0.021922 vn 0.000107 0.999682 0.025207 vn 0.000357 0.862030 0.506858 vn -0.000987 0.999997 0.002369 vn -0.002220 0.999981 0.005665 vn -0.000987 0.999997 0.002369 vn -0.000987 0.999997 0.002369 vn 0.000246 1.000000 -0.000927 vn -0.000987 0.999997 0.002369 vn 0.000269 0.314008 0.949420 vn 0.000303 0.313901 0.949456 vn 0.000007 0.515153 0.857098 vn 0.000007 0.515153 0.857098 vn 0.000041 0.515343 0.856984 vn 0.000269 0.314008 0.949420 vn 0.999999 -0.000575 0.000909 vn 0.999998 -0.000573 0.001786 vn 1.000000 -0.000230 0.000364 vn 1.000000 -0.000230 0.000364 vn 0.999998 -0.000006 -0.001755 vn 0.999999 -0.000575 0.000909 vn 0.000382 0.500012 0.866019 vn 0.000384 0.499991 0.866030 vn 0.000382 0.500012 0.866019 vn 0.000382 0.500012 0.866019 vn 0.000381 0.500032 0.866007 vn 0.000382 0.500012 0.866019 vn -0.000381 -0.500049 -0.865997 vn -0.000384 -0.500006 -0.866022 vn -0.000381 -0.500049 -0.865997 vn -0.000381 -0.500049 -0.865997 vn -0.000378 -0.500091 -0.865973 vn -0.000381 -0.500049 -0.865997 vn -0.000317 0.500024 -0.866011 vn -0.000315 0.500006 -0.866022 vn -0.000317 0.500024 -0.866011 vn -0.000317 0.500024 -0.866011 vn -0.000318 0.500042 -0.866001 vn -0.000317 0.500024 -0.866011 vn 0.388275 -0.533900 0.751128 vn -0.343995 0.184236 0.920720 vn 0.053442 -0.321688 0.945336 vn 0.053442 -0.321688 0.945336 vn 0.348897 -0.489634 0.799080 vn 0.388275 -0.533900 0.751128 vn 0.350033 -0.426337 0.834095 vn 0.388275 -0.533900 0.751128 vn 0.348897 -0.489634 0.799080 vn 0.348897 -0.489634 0.799080 vn 0.335901 -0.432246 0.836860 vn 0.350033 -0.426337 0.834095 vn 0.870721 -0.390240 0.299261 vn 0.868350 -0.495846 -0.010225 vn 0.904767 -0.423597 0.044305 vn 0.904767 -0.423597 0.044305 vn 0.853677 -0.409241 0.322115 vn 0.870721 -0.390240 0.299261 vn 0.869700 -0.318678 0.376916 vn 0.860743 -0.318436 0.397139 vn 0.870721 -0.390240 0.299261 vn 0.870721 -0.390240 0.299261 vn 0.853677 -0.409241 0.322115 vn 0.869700 -0.318678 0.376916 vn 0.959193 -0.135293 -0.248283 vn 0.922172 -0.251029 -0.294251 vn 0.842752 -0.158568 -0.514417 vn 0.842752 -0.158568 -0.514417 vn 0.814623 -0.040776 -0.578555 vn 0.959193 -0.135293 -0.248283 vn 0.922172 -0.251029 -0.294251 vn 0.904767 -0.423597 0.044305 vn 0.798570 -0.345018 -0.493203 vn 0.798570 -0.345018 -0.493203 vn 0.842752 -0.158568 -0.514417 vn 0.922172 -0.251029 -0.294251 vn 0.814623 -0.040776 -0.578555 vn 0.842752 -0.158568 -0.514417 vn 0.467668 -0.007511 -0.883872 vn 0.467668 -0.007511 -0.883872 vn 0.509357 0.059781 -0.858477 vn 0.814623 -0.040776 -0.578555 vn 0.842752 -0.158568 -0.514417 vn 0.798570 -0.345018 -0.493203 vn 0.563478 -0.143681 -0.813540 vn 0.563478 -0.143681 -0.813540 vn 0.467668 -0.007511 -0.883872 vn 0.842752 -0.158568 -0.514417 vn 0.281460 0.105563 -0.953749 vn 0.509357 0.059781 -0.858477 vn 0.467668 -0.007511 -0.883872 vn 0.467668 -0.007511 -0.883872 vn 0.274094 0.022582 -0.961438 vn 0.281460 0.105563 -0.953749 vn 0.467668 -0.007511 -0.883872 vn 0.563478 -0.143681 -0.813540 vn 0.346237 -0.128948 -0.929243 vn 0.346237 -0.128948 -0.929243 vn 0.274094 0.022582 -0.961438 vn 0.467668 -0.007511 -0.883872 vn -0.391719 -0.357797 0.847666 vn -0.556594 -0.493693 0.668184 vn -0.057018 -0.467356 0.882228 vn -0.057018 -0.467356 0.882228 vn 0.082760 -0.359348 0.929527 vn -0.391719 -0.357797 0.847666 vn 0.082760 -0.359348 0.929527 vn -0.057018 -0.467356 0.882228 vn 0.209831 -0.459380 0.863100 vn 0.209831 -0.459380 0.863100 vn 0.573700 -0.352310 0.739423 vn 0.082760 -0.359348 0.929527 vn 0.655933 0.214536 0.723689 vn 0.720236 0.295104 0.627833 vn 0.546074 0.321198 0.773715 vn 0.565986 0.222872 0.793718 vn 0.609777 0.404101 0.681816 vn 0.609777 0.404101 0.681816 vn 0.553016 0.498604 0.667508 vn 0.546074 0.321198 0.773715 vn 0.879518 0.186437 0.437823 vn 0.915805 0.261785 0.304581 vn 0.819488 0.432449 0.376069 vn 0.983442 0.171805 0.057655 vn 0.965198 0.252041 -0.069766 vn 0.942837 0.329236 0.051596 vn 0.866060 0.270364 -0.420527 vn 0.859541 0.413243 -0.300699 vn 0.932390 0.178928 -0.314060 vn 0.660593 0.305327 -0.685852 vn 0.716478 0.380032 -0.585009 vn 0.753287 0.201691 -0.626002 vn 0.575470 0.314569 -0.754904 vn 0.584483 0.450862 -0.674613 vn 0.590680 0.218857 -0.776659 vn -0.872664 -0.408805 0.267086 vn -0.857498 -0.378128 0.348878 vn -0.904780 -0.423574 0.044255 vn -0.904780 -0.423574 0.044255 vn -0.863446 -0.504297 -0.012018 vn -0.872664 -0.408805 0.267086 vn -0.933198 -0.226312 -0.279148 vn -0.792292 -0.133218 -0.595421 vn -0.795941 -0.350374 -0.493676 vn -0.795941 -0.350374 -0.493676 vn -0.904780 -0.423574 0.044255 vn -0.933198 -0.226312 -0.279148 vn -0.933198 -0.226312 -0.279148 vn -0.963533 -0.137611 -0.229495 vn -0.903855 -0.089875 -0.418292 vn -0.903855 -0.089875 -0.418292 vn -0.792292 -0.133218 -0.595421 vn -0.933198 -0.226312 -0.279148 vn -0.869716 -0.316640 0.378593 vn -0.857866 -0.327658 0.395862 vn -0.857498 -0.378128 0.348878 vn -0.857498 -0.378128 0.348878 vn -0.872664 -0.408805 0.267086 vn -0.869716 -0.316640 0.378593 vn -0.350271 -0.428291 0.832993 vn -0.354120 -0.522931 0.775334 vn -0.375915 -0.510275 0.773503 vn -0.375915 -0.510275 0.773503 vn -0.337220 -0.424870 0.840100 vn -0.350271 -0.428291 0.832993 vn -0.375915 -0.510275 0.773503 vn -0.354120 -0.522931 0.775334 vn -0.391785 -0.670624 0.629895 vn -0.391785 -0.670624 0.629895 vn -0.659913 0.146362 0.736948 vn -0.375915 -0.510275 0.773503 vn -0.792292 -0.133218 -0.595421 vn -0.423369 -0.011407 -0.905885 vn -0.563474 -0.143683 -0.813543 vn -0.563474 -0.143683 -0.813543 vn -0.795941 -0.350374 -0.493676 vn -0.792292 -0.133218 -0.595421 vn -0.792292 -0.133218 -0.595421 vn -0.903855 -0.089875 -0.418292 vn -0.572191 0.046097 -0.818824 vn -0.572191 0.046097 -0.818824 vn -0.423369 -0.011407 -0.905885 vn -0.792292 -0.133218 -0.595421 vn -0.423369 -0.011407 -0.905885 vn -0.274091 0.022586 -0.961439 vn -0.345767 -0.132147 -0.928968 vn -0.345767 -0.132147 -0.928968 vn -0.563474 -0.143683 -0.813543 vn -0.423369 -0.011407 -0.905885 vn -0.281462 0.105567 -0.953748 vn -0.274091 0.022586 -0.961439 vn -0.423369 -0.011407 -0.905885 vn -0.423369 -0.011407 -0.905885 vn -0.572191 0.046097 -0.818824 vn -0.281462 0.105567 -0.953748 vn 0.872671 -0.408797 -0.267077 vn 0.857499 -0.378126 -0.348878 vn 0.904783 -0.423566 -0.044258 vn 0.904783 -0.423566 -0.044258 vn 0.867974 -0.496501 0.010408 vn 0.872671 -0.408797 -0.267077 vn 0.913187 -0.192097 0.359427 vn 0.899138 -0.176078 0.400683 vn 0.874858 -0.379655 0.300808 vn 0.874858 -0.379655 0.300808 vn 0.904783 -0.423566 -0.044258 vn 0.913187 -0.192097 0.359427 vn 0.913187 -0.192097 0.359427 vn 0.940561 -0.099962 0.324580 vn 0.929127 -0.101256 0.355627 vn 0.929127 -0.101256 0.355627 vn 0.899138 -0.176078 0.400683 vn 0.913187 -0.192097 0.359427 vn 0.869719 -0.316637 -0.378590 vn 0.857873 -0.327650 -0.395853 vn 0.857499 -0.378126 -0.348878 vn 0.857499 -0.378126 -0.348878 vn 0.872671 -0.408797 -0.267077 vn 0.869719 -0.316637 -0.378590 vn 0.350254 -0.428292 -0.833000 vn 0.354095 -0.522927 -0.775347 vn 0.375903 -0.510268 -0.773514 vn 0.375903 -0.510268 -0.773514 vn 0.337207 -0.424872 -0.840104 vn 0.350254 -0.428292 -0.833000 vn 0.375903 -0.510268 -0.773514 vn 0.354095 -0.522927 -0.775347 vn 0.397857 -0.650766 -0.646694 vn 0.397857 -0.650766 -0.646694 vn 0.425020 -0.669655 -0.609032 vn 0.375903 -0.510268 -0.773514 vn 0.398048 0.010553 0.917304 vn 0.343373 0.022160 0.938938 vn 0.424747 -0.170979 0.889020 vn 0.424747 -0.170979 0.889020 vn 0.464512 -0.226171 0.856198 vn 0.398048 0.010553 0.917304 vn 0.381577 0.114576 0.917209 vn 0.343373 0.022160 0.938938 vn 0.398048 0.010553 0.917304 vn 0.398048 0.010553 0.917304 vn 0.416387 0.126561 0.900336 vn 0.381577 0.114576 0.917209 vn -0.848288 0.094287 0.521073 vn -0.890803 0.265942 0.368435 vn -0.967615 0.252362 -0.005935 vn -0.982603 0.172140 -0.069707 vn -0.892694 0.267635 -0.362586 vn -0.883348 0.185477 -0.430459 vn -0.942836 0.329239 0.051597 vn -0.860329 0.411331 -0.301067 vn -0.819954 0.431559 0.376075 vn -0.538006 0.353935 0.765036 vn -0.553029 0.498570 0.667523 vn -0.609777 0.404103 0.681816 vn -0.609777 0.404103 0.681816 vn -0.679284 0.301085 0.669269 vn -0.538006 0.353935 0.765036 vn -0.565135 0.222296 0.794485 vn -0.739072 0.203308 0.642214 vn -0.700903 0.301029 -0.646619 vn -0.675682 0.211421 -0.706226 vn -0.716474 0.380035 -0.585011 vn -0.585117 0.449199 -0.675173 vn -0.580837 0.283248 -0.763150 vn -0.589889 0.218297 -0.777417 vn 0.112224 -0.208505 0.971561 vn 0.185006 -0.441095 0.878184 vn -0.562510 0.539646 0.626390 vn 0.628880 -0.429097 0.648372 vn 0.112224 -0.208505 0.971561 vn 0.674021 -0.565733 0.475017 vn 0.806355 -0.429611 0.406480 vn 0.628880 -0.429097 0.648372 vn 0.674021 -0.565733 0.475017 vn 0.872359 -0.413032 0.261522 vn 0.806355 -0.429611 0.406480 vn 0.674021 -0.565733 0.475017 vn 0.942934 -0.244816 0.225699 vn 0.965993 -0.134612 0.220764 vn 0.933511 -0.136716 0.331460 vn 0.933511 -0.136716 0.331460 vn 0.880464 -0.272086 0.388269 vn 0.942934 -0.244816 0.225699 vn 0.971682 -0.064883 0.227211 vn 0.895317 -0.063191 0.440925 vn 0.933511 -0.136716 0.331460 vn 0.933511 -0.136716 0.331460 vn 0.965993 -0.134612 0.220764 vn 0.971682 -0.064883 0.227211 vn 0.895317 -0.063191 0.440925 vn 0.672865 -0.061227 0.737227 vn 0.760964 -0.137604 0.634034 vn 0.760964 -0.137604 0.634034 vn 0.933511 -0.136716 0.331460 vn 0.895317 -0.063191 0.440925 vn 0.672865 -0.061227 0.737227 vn 0.332532 -0.060624 0.941141 vn 0.456776 -0.139105 0.878639 vn 0.456776 -0.139105 0.878639 vn 0.760964 -0.137604 0.634034 vn 0.672865 -0.061227 0.737227 vn 0.382728 -0.283149 0.879401 vn 0.456776 -0.139105 0.878639 vn 0.203521 -0.137467 0.969372 vn 0.203521 -0.137467 0.969372 vn 0.196533 -0.301522 0.932984 vn 0.382728 -0.283149 0.879401 vn 0.332532 -0.060624 0.941141 vn 0.203196 -0.059330 0.977339 vn 0.203521 -0.137467 0.969372 vn 0.203521 -0.137467 0.969372 vn 0.456776 -0.139105 0.878639 vn 0.332532 -0.060624 0.941141 vn 0.872359 -0.413032 0.261522 vn 0.942934 -0.244816 0.225699 vn 0.880464 -0.272086 0.388269 vn 0.880464 -0.272086 0.388269 vn 0.806355 -0.429611 0.406480 vn 0.872359 -0.413032 0.261522 vn 0.112224 -0.208505 0.971561 vn 0.382728 -0.283149 0.879401 vn 0.196533 -0.301522 0.932984 vn 0.196533 -0.301522 0.932984 vn 0.185006 -0.441095 0.878184 vn 0.112224 -0.208505 0.971561 vn -0.003722 0.977054 -0.212961 vn -0.001301 0.977669 -0.210146 vn -0.001846 0.978119 -0.208037 vn -0.001846 0.978119 -0.208037 vn -0.007444 0.976700 -0.214482 vn -0.003722 0.977054 -0.212961 vn -0.001846 0.978119 -0.208037 vn -0.001301 0.977669 -0.210146 vn 0.000030 0.979157 -0.203106 vn 0.000030 0.979157 -0.203106 vn 0.002663 0.980330 -0.197348 vn -0.001846 0.978119 -0.208037 vn -0.647413 0.395458 0.651513 vn -0.188043 -0.409168 0.892872 vn -0.500383 -0.186140 0.845558 vn -0.647413 0.395458 0.651513 vn -0.500383 -0.186140 0.845558 vn -0.729775 -0.184172 0.658414 vn -0.647413 0.395458 0.651513 vn -0.729775 -0.184172 0.658414 vn -0.866273 -0.187057 0.463228 vn -0.647413 0.395458 0.651513 vn -0.866273 -0.187057 0.463228 vn -0.749475 0.338260 0.569093 vn -0.672879 -0.061227 0.737214 vn -0.717794 -0.138636 0.682314 vn -0.395860 -0.139986 0.907578 vn -0.395860 -0.139986 0.907578 vn -0.332531 -0.060622 0.941142 vn -0.672879 -0.061227 0.737214 vn -0.332531 -0.060622 0.941142 vn -0.395860 -0.139986 0.907578 vn -0.203968 -0.111570 0.972599 vn -0.203968 -0.111570 0.972599 vn -0.203165 -0.059321 0.977346 vn -0.332531 -0.060622 0.941142 vn -0.924922 -0.284564 0.252076 vn -0.749475 0.338260 0.569093 vn -0.866273 -0.187057 0.463228 vn -0.866273 -0.187057 0.463228 vn -0.887014 -0.272466 0.372784 vn -0.924922 -0.284564 0.252076 vn -0.961462 -0.158112 0.224927 vn -0.924922 -0.284564 0.252076 vn -0.887014 -0.272466 0.372784 vn -0.887014 -0.272466 0.372784 vn -0.914247 -0.137638 0.381063 vn -0.961462 -0.158112 0.224927 vn -0.971681 -0.064882 0.227213 vn -0.961462 -0.158112 0.224927 vn -0.914247 -0.137638 0.381063 vn -0.914247 -0.137638 0.381063 vn -0.895314 -0.063189 0.440932 vn -0.971681 -0.064882 0.227213 vn -0.895314 -0.063189 0.440932 vn -0.914247 -0.137638 0.381063 vn -0.717794 -0.138636 0.682314 vn -0.717794 -0.138636 0.682314 vn -0.672879 -0.061227 0.737214 vn -0.895314 -0.063189 0.440932 vn -0.635871 -0.400458 0.659774 vn -0.635883 -0.676686 0.371144 vn -0.374465 -0.758591 0.533212 vn -0.374465 -0.758591 0.533212 vn -0.374364 -0.390356 0.841115 vn -0.635871 -0.400458 0.659774 vn -0.635883 -0.676686 0.371144 vn -0.635871 -0.771610 -0.016909 vn -0.374486 -0.923557 0.082477 vn -0.374486 -0.923557 0.082477 vn -0.374465 -0.758591 0.533212 vn -0.635883 -0.676686 0.371144 vn -0.635871 -0.771610 -0.016909 vn -0.635865 -0.659788 -0.400445 vn -0.374487 -0.841071 -0.390332 vn -0.374487 -0.841071 -0.390332 vn -0.374486 -0.923557 0.082477 vn -0.635871 -0.771610 -0.016909 vn -0.635865 -0.659788 -0.400445 vn -0.635848 -0.371168 -0.676707 vn -0.374406 -0.533232 -0.758606 vn -0.374406 -0.533232 -0.758606 vn -0.374487 -0.841071 -0.390332 vn -0.635865 -0.659788 -0.400445 vn -0.635848 -0.371168 -0.676707 vn -0.635850 0.016919 -0.771627 vn -0.374357 -0.082495 -0.923608 vn -0.374357 -0.082495 -0.923608 vn -0.374406 -0.533232 -0.758606 vn -0.635848 -0.371168 -0.676707 vn -0.635850 0.016919 -0.771627 vn -0.635837 0.400454 -0.659808 vn -0.374347 0.390370 -0.841116 vn -0.374347 0.390370 -0.841116 vn -0.374357 -0.082495 -0.923608 vn -0.635850 0.016919 -0.771627 vn -0.635837 0.400454 -0.659808 vn -0.635834 0.676714 -0.371178 vn -0.374325 0.758622 -0.533267 vn -0.374325 0.758622 -0.533267 vn -0.374347 0.390370 -0.841116 vn -0.635837 0.400454 -0.659808 vn -0.635834 0.676714 -0.371178 vn -0.635828 0.771645 0.016912 vn -0.374277 0.923640 -0.082491 vn -0.374277 0.923640 -0.082491 vn -0.374325 0.758622 -0.533267 vn -0.635834 0.676714 -0.371178 vn -0.635828 0.771645 0.016912 vn -0.635850 0.659785 0.400473 vn -0.374299 0.841143 0.390358 vn -0.374299 0.841143 0.390358 vn -0.374277 0.923640 -0.082491 vn -0.635828 0.771645 0.016912 vn -0.635850 0.659785 0.400473 vn -0.711778 0.351190 0.608307 vn -0.375614 0.463375 0.802619 vn -0.375614 0.463375 0.802619 vn -0.374299 0.841143 0.390358 vn -0.635850 0.659785 0.400473 vn -0.990580 -0.112030 -0.078748 vn -0.990580 -0.124212 -0.057646 vn -0.990580 -0.078748 -0.112029 vn -0.990580 -0.078748 -0.112029 vn -0.990580 -0.057648 -0.124209 vn -0.990580 -0.112030 -0.078748 vn -0.919306 -0.209306 0.333267 vn -0.919301 -0.347909 0.183970 vn -0.635883 -0.676686 0.371144 vn -0.635883 -0.676686 0.371144 vn -0.635871 -0.400458 0.659774 vn -0.919306 -0.209306 0.333267 vn -0.919301 -0.347909 0.183970 vn -0.919298 -0.393289 -0.014653 vn -0.635871 -0.771610 -0.016909 vn -0.635871 -0.771610 -0.016909 vn -0.635883 -0.676686 0.371144 vn -0.919301 -0.347909 0.183970 vn -0.919298 -0.393289 -0.014653 vn -0.919307 -0.333264 -0.209309 vn -0.635865 -0.659788 -0.400445 vn -0.635865 -0.659788 -0.400445 vn -0.635871 -0.771610 -0.016909 vn -0.919298 -0.393289 -0.014653 vn -0.919307 -0.333264 -0.209309 vn -0.919310 -0.183937 -0.347902 vn -0.635848 -0.371168 -0.676707 vn -0.635848 -0.371168 -0.676707 vn -0.635865 -0.659788 -0.400445 vn -0.919307 -0.333264 -0.209309 vn -0.919312 0.209302 -0.333254 vn -0.919317 0.347877 -0.183952 vn -0.635834 0.676714 -0.371178 vn -0.635834 0.676714 -0.371178 vn -0.635837 0.400454 -0.659808 vn -0.919312 0.209302 -0.333254 vn -0.919317 0.347877 -0.183952 vn -0.919318 0.393243 0.014657 vn -0.635828 0.771645 0.016912 vn -0.635828 0.771645 0.016912 vn -0.635834 0.676714 -0.371178 vn -0.919317 0.347877 -0.183952 vn -0.919318 0.393243 0.014657 vn -0.919316 0.333254 0.209284 vn -0.635850 0.659785 0.400473 vn -0.635850 0.659785 0.400473 vn -0.635828 0.771645 0.016912 vn -0.919318 0.393243 0.014657 vn -0.919316 0.333254 0.209284 vn -0.941313 0.168761 0.292318 vn -0.711778 0.351190 0.608307 vn -0.711778 0.351190 0.608307 vn -0.635850 0.659785 0.400473 vn -0.919316 0.333254 0.209284 vn -0.993545 -0.065225 0.092812 vn -0.993546 -0.102889 0.047744 vn -0.919301 -0.347909 0.183970 vn -0.919301 -0.347909 0.183970 vn -0.919306 -0.209306 0.333267 vn -0.993545 -0.065225 0.092812 vn -0.993546 -0.102889 0.047744 vn -0.993545 -0.112987 -0.010091 vn -0.919298 -0.393289 -0.014653 vn -0.919298 -0.393289 -0.014653 vn -0.919301 -0.347909 0.183970 vn -0.993546 -0.102889 0.047744 vn -0.993545 -0.112987 -0.010091 vn -0.985454 -0.139028 -0.097729 vn -0.919307 -0.333264 -0.209309 vn -0.919307 -0.333264 -0.209309 vn -0.919298 -0.393289 -0.014653 vn -0.993545 -0.112987 -0.010091 vn -0.985454 -0.139028 -0.097729 vn -0.990693 -0.057297 -0.123470 vn -0.919310 -0.183937 -0.347902 vn -0.919310 -0.183937 -0.347902 vn -0.919307 -0.333264 -0.209309 vn -0.985454 -0.139028 -0.097729 vn -0.990693 -0.057297 -0.123470 vn -0.993545 0.010092 -0.112988 vn -0.919313 0.014636 -0.393256 vn -0.919313 0.014636 -0.393256 vn -0.919310 -0.183937 -0.347902 vn -0.990693 -0.057297 -0.123470 vn -0.993545 0.010092 -0.112988 vn -0.993544 0.065233 -0.092813 vn -0.919312 0.209302 -0.333254 vn -0.919312 0.209302 -0.333254 vn -0.919313 0.014636 -0.393256 vn -0.993545 0.010092 -0.112988 vn -0.993544 0.065233 -0.092813 vn -0.993546 0.102893 -0.047737 vn -0.919317 0.347877 -0.183952 vn -0.919317 0.347877 -0.183952 vn -0.919312 0.209302 -0.333254 vn -0.993544 0.065233 -0.092813 vn -0.993546 0.102893 -0.047737 vn -0.990692 0.135582 0.012110 vn -0.919318 0.393243 0.014657 vn -0.919318 0.393243 0.014657 vn -0.919317 0.347877 -0.183952 vn -0.993546 0.102893 -0.047737 vn -0.990692 0.135582 0.012110 vn -0.990694 0.111365 0.078253 vn -0.919316 0.333254 0.209284 vn -0.919316 0.333254 0.209284 vn -0.919318 0.393243 0.014657 vn -0.990692 0.135582 0.012110 vn -0.990694 0.111365 0.078253 vn -0.988595 0.075286 0.130428 vn -0.941313 0.168761 0.292318 vn -0.941313 0.168761 0.292318 vn -0.919316 0.333254 0.209284 vn -0.990694 0.111365 0.078253 vn 0.919316 -0.183932 0.347890 vn 0.919312 -0.333255 0.209302 vn 0.993547 -0.092790 0.065223 vn 0.993547 -0.092790 0.065223 vn 0.993547 -0.047744 0.102887 vn 0.919316 -0.183932 0.347890 vn 0.919312 -0.333255 0.209302 vn 0.919303 -0.393279 0.014649 vn 0.990696 -0.135556 0.012105 vn 0.990696 -0.135556 0.012105 vn 0.993547 -0.092790 0.065223 vn 0.919312 -0.333255 0.209302 vn 0.919303 -0.393279 0.014649 vn 0.919305 -0.347898 -0.183969 vn 0.990697 -0.123441 -0.057286 vn 0.990697 -0.123441 -0.057286 vn 0.990696 -0.135556 0.012105 vn 0.919303 -0.393279 0.014649 vn 0.919305 -0.347898 -0.183969 vn 0.919310 -0.209306 -0.333256 vn 0.985455 -0.097713 -0.139034 vn 0.985455 -0.097713 -0.139034 vn 0.990697 -0.123441 -0.057286 vn 0.919305 -0.347898 -0.183969 vn 0.919310 -0.209306 -0.333256 vn 0.919318 -0.014637 -0.393244 vn 0.995265 -0.008647 -0.096813 vn 0.995265 -0.008647 -0.096813 vn 0.985455 -0.097713 -0.139034 vn 0.919310 -0.209306 -0.333256 vn 0.919318 -0.014637 -0.393244 vn 0.919315 0.183940 -0.347888 vn 0.993546 0.047747 -0.102891 vn 0.993546 0.047747 -0.102891 vn 0.995265 -0.008647 -0.096813 vn 0.919318 -0.014637 -0.393244 vn 0.919315 0.183940 -0.347888 vn 0.919320 0.333243 -0.209282 vn 0.993547 0.092802 -0.065213 vn 0.993547 0.092802 -0.065213 vn 0.993546 0.047747 -0.102891 vn 0.919315 0.183940 -0.347888 vn 0.919320 0.333243 -0.209282 vn 0.919323 0.393231 -0.014663 vn 0.993545 0.112985 -0.010093 vn 0.993545 0.112985 -0.010093 vn 0.993547 0.092802 -0.065213 vn 0.919320 0.333243 -0.209282 vn 0.919323 0.393231 -0.014663 vn 0.919322 0.347869 0.183940 vn 0.985459 0.154136 0.071505 vn 0.985459 0.154136 0.071505 vn 0.993545 0.112985 -0.010093 vn 0.919323 0.393231 -0.014663 vn 0.919322 0.347869 0.183940 vn 0.894128 0.223900 0.387819 vn 0.988597 0.075286 0.130412 vn 0.988597 0.075286 0.130412 vn 0.985459 0.154136 0.071505 vn 0.919322 0.347869 0.183940 vn 0.635844 -0.371168 0.676710 vn 0.635864 -0.659790 0.400442 vn 0.919312 -0.333255 0.209302 vn 0.919312 -0.333255 0.209302 vn 0.919316 -0.183932 0.347890 vn 0.635844 -0.371168 0.676710 vn 0.635864 -0.659790 0.400442 vn 0.635870 -0.771611 0.016903 vn 0.919303 -0.393279 0.014649 vn 0.919303 -0.393279 0.014649 vn 0.919312 -0.333255 0.209302 vn 0.635864 -0.659790 0.400442 vn 0.635870 -0.771611 0.016903 vn 0.635882 -0.676686 -0.371149 vn 0.919305 -0.347898 -0.183969 vn 0.919305 -0.347898 -0.183969 vn 0.919303 -0.393279 0.014649 vn 0.635870 -0.771611 0.016903 vn 0.635882 -0.676686 -0.371149 vn 0.635869 -0.400458 -0.659776 vn 0.919310 -0.209306 -0.333256 vn 0.919310 -0.209306 -0.333256 vn 0.919305 -0.347898 -0.183969 vn 0.635882 -0.676686 -0.371149 vn 0.635844 0.371156 -0.676717 vn 0.635848 0.659784 -0.400478 vn 0.919320 0.333243 -0.209282 vn 0.919320 0.333243 -0.209282 vn 0.919315 0.183940 -0.347888 vn 0.635844 0.371156 -0.676717 vn 0.635848 0.659784 -0.400478 vn 0.635827 0.771646 -0.016918 vn 0.919323 0.393231 -0.014663 vn 0.919323 0.393231 -0.014663 vn 0.919320 0.333243 -0.209282 vn 0.635848 0.659784 -0.400478 vn 0.635827 0.771646 -0.016918 vn 0.635833 0.676717 0.371175 vn 0.919322 0.347869 0.183940 vn 0.919322 0.347869 0.183940 vn 0.919323 0.393231 -0.014663 vn 0.635827 0.771646 -0.016918 vn 0.635833 0.676717 0.371175 vn 0.552770 0.416654 0.721696 vn 0.894128 0.223900 0.387819 vn 0.894128 0.223900 0.387819 vn 0.919322 0.347869 0.183940 vn 0.635833 0.676717 0.371175 vn 0.374405 -0.533230 0.758609 vn 0.374487 -0.841073 0.390328 vn 0.635864 -0.659790 0.400442 vn 0.635864 -0.659790 0.400442 vn 0.635844 -0.371168 0.676710 vn 0.374405 -0.533230 0.758609 vn 0.374487 -0.841073 0.390328 vn 0.374483 -0.923558 -0.082484 vn 0.635870 -0.771611 0.016903 vn 0.635870 -0.771611 0.016903 vn 0.635864 -0.659790 0.400442 vn 0.374487 -0.841073 0.390328 vn 0.374483 -0.923558 -0.082484 vn 0.374460 -0.758591 -0.533216 vn 0.635882 -0.676686 -0.371149 vn 0.635882 -0.676686 -0.371149 vn 0.635870 -0.771611 0.016903 vn 0.374483 -0.923558 -0.082484 vn 0.374460 -0.758591 -0.533216 vn 0.374368 -0.390360 -0.841111 vn 0.635869 -0.400458 -0.659776 vn 0.635869 -0.400458 -0.659776 vn 0.635882 -0.676686 -0.371149 vn 0.374460 -0.758591 -0.533216 vn 0.374368 -0.390360 -0.841111 vn 0.374349 0.082504 -0.923610 vn 0.635851 -0.016917 -0.771626 vn 0.635851 -0.016917 -0.771626 vn 0.635869 -0.400458 -0.659776 vn 0.374368 -0.390360 -0.841111 vn 0.374349 0.082504 -0.923610 vn 0.374330 0.533233 -0.758643 vn 0.635844 0.371156 -0.676717 vn 0.635844 0.371156 -0.676717 vn 0.635851 -0.016917 -0.771626 vn 0.374349 0.082504 -0.923610 vn 0.374330 0.533233 -0.758643 vn 0.374294 0.841143 -0.390363 vn 0.635848 0.659784 -0.400478 vn 0.635848 0.659784 -0.400478 vn 0.635844 0.371156 -0.676717 vn 0.374330 0.533233 -0.758643 vn 0.374294 0.841143 -0.390363 vn 0.374275 0.923642 0.082485 vn 0.635827 0.771646 -0.016918 vn 0.635827 0.771646 -0.016918 vn 0.635848 0.659784 -0.400478 vn 0.374294 0.841143 -0.390363 vn 0.374275 0.923642 0.082485 vn 0.374324 0.758624 0.533265 vn 0.635833 0.676717 0.371175 vn 0.635833 0.676717 0.371175 vn 0.635827 0.771646 -0.016918 vn 0.374275 0.923642 0.082485 vn 0.374324 0.758624 0.533265 vn 0.375622 0.463380 0.802613 vn 0.552770 0.416654 0.721696 vn 0.552770 0.416654 0.721696 vn 0.635833 0.676717 0.371175 vn 0.374324 0.758624 0.533265 vn 0.990579 -0.112031 -0.078748 vn 0.990580 -0.057648 -0.124210 vn 0.990580 -0.078748 -0.112030 vn 0.990580 -0.078748 -0.112030 vn 0.990580 -0.124213 -0.057647 vn 0.990579 -0.112031 -0.078748 vn -0.571184 -0.671513 -0.472038 vn -0.571023 -0.345609 -0.744639 vn -0.571083 -0.472062 -0.671582 vn -0.571083 -0.472062 -0.671582 vn -0.571257 -0.744501 -0.345521 vn -0.571184 -0.671513 -0.472038 vn -0.571023 -0.345609 -0.744639 vn -0.559283 -0.214554 -0.800730 vn -0.559259 -0.214561 -0.800745 vn -0.559259 -0.214561 -0.800745 vn -0.571083 -0.472062 -0.671582 vn -0.571023 -0.345609 -0.744639 vn -0.571889 0.704307 0.420587 vn -0.571901 0.399645 0.716389 vn -0.354603 0.537690 0.764948 vn -0.354603 0.537690 0.764948 vn -0.354567 0.848143 0.393619 vn -0.571889 0.704307 0.420587 vn 0.354575 0.764955 0.537699 vn 0.354618 0.393618 0.848122 vn 0.571894 0.420587 0.704303 vn 0.571894 0.420587 0.704303 vn 0.571883 0.716398 0.399655 vn 0.354575 0.764955 0.537699 vn 0.571196 -0.671510 -0.472026 vn 0.571028 -0.345595 -0.744642 vn 0.571095 -0.472055 -0.671576 vn 0.571095 -0.472055 -0.671576 vn 0.571262 -0.744503 -0.345507 vn 0.571196 -0.671510 -0.472026 vn 0.571028 -0.345595 -0.744642 vn 0.559283 -0.214559 -0.800729 vn 0.559263 -0.214560 -0.800743 vn 0.559263 -0.214560 -0.800743 vn 0.571095 -0.472055 -0.671576 vn 0.571028 -0.345595 -0.744642 vn -0.571212 -0.817550 -0.073004 vn -0.571184 -0.671513 -0.472038 vn -0.571257 -0.744501 -0.345521 vn -0.571257 -0.744501 -0.345521 vn -0.571212 -0.817549 0.073014 vn -0.571212 -0.817550 -0.073004 vn -0.571892 0.820240 0.012091 vn -0.571889 0.704307 0.420587 vn -0.354567 0.848143 0.393619 vn -0.354567 0.848143 0.393619 vn -0.354588 0.931316 -0.083179 vn -0.571892 0.820240 0.012091 vn 0.354585 0.931317 0.083178 vn 0.354575 0.764955 0.537699 vn 0.571883 0.716398 0.399655 vn 0.571883 0.716398 0.399655 vn 0.571893 0.820239 -0.012092 vn 0.354585 0.931317 0.083178 vn 0.571217 -0.817545 -0.073013 vn 0.571196 -0.671510 -0.472026 vn 0.571262 -0.744503 -0.345507 vn 0.571262 -0.744503 -0.345507 vn 0.571223 -0.817542 0.073006 vn 0.571217 -0.817545 -0.073013 vn -0.559414 0.586112 0.586112 vn -0.571174 0.345531 0.744560 vn -0.571210 0.472008 0.671511 vn -0.571210 0.472008 0.671511 vn -0.559326 0.586162 0.586147 vn -0.559414 0.586112 0.586112 vn -0.571174 0.345531 0.744560 vn -0.571037 -0.073026 0.817670 vn -0.571082 0.073024 0.817639 vn -0.571082 0.073024 0.817639 vn -0.571210 0.472008 0.671511 vn -0.571174 0.345531 0.744560 vn 0.559407 0.586116 0.586116 vn 0.571175 0.345537 0.744555 vn 0.571205 0.472016 0.671510 vn 0.571205 0.472016 0.671510 vn 0.559315 0.586152 0.586167 vn 0.559407 0.586116 0.586116 vn 0.571175 0.345537 0.744555 vn 0.571039 -0.073031 0.817668 vn 0.571083 0.073023 0.817638 vn 0.571083 0.073023 0.817638 vn 0.571205 0.472016 0.671510 vn 0.571175 0.345537 0.744555 vn 0.571039 -0.073031 0.817668 vn 0.571106 -0.472049 0.671572 vn 0.571015 -0.345605 0.744647 vn 0.571015 -0.345605 0.744647 vn 0.571083 0.073023 0.817638 vn 0.571039 -0.073031 0.817668 vn 0.571106 -0.472049 0.671572 vn 0.571275 -0.744488 0.345517 vn 0.571206 -0.671499 0.472031 vn 0.571206 -0.671499 0.472031 vn 0.571015 -0.345605 0.744647 vn 0.571106 -0.472049 0.671572 vn 0.571275 -0.744488 0.345517 vn 0.571217 -0.817545 -0.073013 vn 0.571223 -0.817542 0.073006 vn 0.571223 -0.817542 0.073006 vn 0.571206 -0.671499 0.472031 vn 0.571275 -0.744488 0.345517 vn 0.354639 0.537681 -0.764938 vn 0.354578 0.848139 -0.393618 vn 0.571898 0.704302 -0.420585 vn 0.571898 0.704302 -0.420585 vn 0.571909 0.399643 -0.716384 vn 0.354639 0.537681 -0.764938 vn 0.354578 0.848139 -0.393618 vn 0.354585 0.931317 0.083178 vn 0.571893 0.820239 -0.012092 vn 0.571893 0.820239 -0.012092 vn 0.571898 0.704302 -0.420585 vn 0.354578 0.848139 -0.393618 vn -0.571906 0.420583 -0.704297 vn -0.571884 0.716396 -0.399656 vn -0.354598 0.764948 -0.537695 vn -0.354598 0.764948 -0.537695 vn -0.354649 0.393613 -0.848112 vn -0.571906 0.420583 -0.704297 vn -0.571884 0.716396 -0.399656 vn -0.571892 0.820240 0.012091 vn -0.354588 0.931316 -0.083179 vn -0.354588 0.931316 -0.083179 vn -0.354598 0.764948 -0.537695 vn -0.571884 0.716396 -0.399656 vn -0.571037 -0.073026 0.817670 vn -0.571100 -0.472052 0.671574 vn -0.571009 -0.345595 0.744656 vn -0.571009 -0.345595 0.744656 vn -0.571082 0.073024 0.817639 vn -0.571037 -0.073026 0.817670 vn -0.571100 -0.472052 0.671574 vn -0.571264 -0.744501 0.345507 vn -0.571201 -0.671507 0.472026 vn -0.571201 -0.671507 0.472026 vn -0.571009 -0.345595 0.744656 vn -0.571100 -0.472052 0.671574 vn -0.571264 -0.744501 0.345507 vn -0.571212 -0.817550 -0.073004 vn -0.571212 -0.817549 0.073014 vn -0.571212 -0.817549 0.073014 vn -0.571201 -0.671507 0.472026 vn -0.571264 -0.744501 0.345507 vn 0.847543 -0.250540 0.467868 vn 0.847549 -0.450909 0.279894 vn 0.985852 -0.137134 0.096386 vn 0.985852 -0.137134 0.096386 vn 0.985851 -0.070557 0.152049 vn 0.847543 -0.250540 0.467868 vn 0.847549 -0.450909 0.279894 vn 0.847551 -0.530442 0.016963 vn 0.979568 -0.200315 0.017889 vn 0.979568 -0.200315 0.017889 vn 0.985852 -0.137134 0.096386 vn 0.847549 -0.450909 0.279894 vn 0.847551 -0.530442 0.016963 vn 0.847553 -0.467850 -0.250542 vn 0.979572 -0.182413 -0.084647 vn 0.979572 -0.182413 -0.084647 vn 0.979568 -0.200315 0.017889 vn 0.847551 -0.530442 0.016963 vn 0.847553 -0.467850 -0.250542 vn 0.847547 -0.279896 -0.450913 vn 0.968051 -0.144189 -0.205151 vn 0.968051 -0.144189 -0.205151 vn 0.979572 -0.182413 -0.084647 vn 0.847553 -0.467850 -0.250542 vn 0.847545 0.250523 -0.467873 vn 0.847557 0.450889 -0.279903 vn 0.985853 0.137127 -0.096386 vn 0.985853 0.137127 -0.096386 vn 0.985851 0.070557 -0.152049 vn 0.847545 0.250523 -0.467873 vn 0.847557 0.450889 -0.279903 vn 0.847558 0.530431 -0.016966 vn 0.985852 0.166953 -0.014911 vn 0.985852 0.166953 -0.014911 vn 0.985853 0.137127 -0.096386 vn 0.847557 0.450889 -0.279903 vn 0.847558 0.530431 -0.016966 vn 0.847559 0.467833 0.250552 vn 0.968059 0.227428 0.105538 vn 0.968059 0.227428 0.105538 vn 0.985852 0.166953 -0.014911 vn 0.847558 0.530431 -0.016966 vn 0.847559 0.467833 0.250552 vn 0.804826 0.296732 0.514010 vn 0.974949 0.111202 0.192636 vn 0.974949 0.111202 0.192636 vn 0.968059 0.227428 0.105538 vn 0.847559 0.467833 0.250552 vn 0.501504 -0.422652 0.754890 vn 0.501512 -0.743471 0.442420 vn 0.847549 -0.450909 0.279894 vn 0.847549 -0.450909 0.279894 vn 0.847543 -0.250540 0.467868 vn 0.501504 -0.422652 0.754890 vn 0.501512 -0.743471 0.442420 vn 0.501494 -0.865086 0.011397 vn 0.847551 -0.530442 0.016963 vn 0.847551 -0.530442 0.016963 vn 0.847549 -0.450909 0.279894 vn 0.501512 -0.743471 0.442420 vn 0.501494 -0.865086 0.011397 vn 0.501496 -0.754883 -0.422675 vn 0.847553 -0.467850 -0.250542 vn 0.847553 -0.467850 -0.250542 vn 0.847551 -0.530442 0.016963 vn 0.501494 -0.865086 0.011397 vn 0.501496 -0.754883 -0.422675 vn 0.501497 -0.442395 -0.743496 vn 0.847547 -0.279896 -0.450913 vn 0.847547 -0.279896 -0.450913 vn 0.847553 -0.467850 -0.250542 vn 0.501496 -0.754883 -0.422675 vn 0.501503 -0.011401 -0.865081 vn 0.501508 0.422630 -0.754900 vn 0.847545 0.250523 -0.467873 vn 0.847545 0.250523 -0.467873 vn 0.847546 -0.016951 -0.530451 vn 0.501503 -0.011401 -0.865081 vn 0.501508 0.422630 -0.754900 vn 0.501517 0.743464 -0.442428 vn 0.847557 0.450889 -0.279903 vn 0.847557 0.450889 -0.279903 vn 0.847545 0.250523 -0.467873 vn 0.501508 0.422630 -0.754900 vn 0.501517 0.743464 -0.442428 vn 0.501493 0.865086 -0.011399 vn 0.847558 0.530431 -0.016966 vn 0.847558 0.530431 -0.016966 vn 0.847557 0.450889 -0.279903 vn 0.501517 0.743464 -0.442428 vn 0.501493 0.865086 -0.011399 vn 0.501498 0.754868 0.422698 vn 0.847559 0.467833 0.250552 vn 0.847559 0.467833 0.250552 vn 0.847558 0.530431 -0.016966 vn 0.501493 0.865086 -0.011399 vn 0.501498 0.754868 0.422698 vn 0.422312 0.453196 0.785026 vn 0.804826 0.296732 0.514010 vn 0.804826 0.296732 0.514010 vn 0.847559 0.467833 0.250552 vn 0.501498 0.754868 0.422698 vn 0.258423 -0.000004 0.966032 vn 0.576377 -0.000000 0.817184 vn 0.422312 0.453196 0.785026 vn 0.422312 0.453196 0.785026 vn 0.258457 0.482996 0.836609 vn 0.258423 -0.000004 0.966032 vn 0.258423 -0.000004 0.966032 vn 0.257464 -0.555652 0.790546 vn 0.501504 -0.422652 0.754890 vn 0.501504 -0.422652 0.754890 vn 0.576377 -0.000000 0.817184 vn 0.258423 -0.000004 0.966032 vn 0.257464 -0.555652 0.790546 vn 0.257428 -0.876509 0.406771 vn 0.501512 -0.743471 0.442420 vn 0.501512 -0.743471 0.442420 vn 0.501504 -0.422652 0.754890 vn 0.257464 -0.555652 0.790546 vn 0.257428 -0.876509 0.406771 vn 0.257412 -0.962471 -0.085958 vn 0.501494 -0.865086 0.011397 vn 0.501494 -0.865086 0.011397 vn 0.501512 -0.743471 0.442420 vn 0.257428 -0.876509 0.406771 vn 0.257412 -0.962471 -0.085958 vn 0.257447 -0.790528 -0.555686 vn 0.501496 -0.754883 -0.422675 vn 0.501496 -0.754883 -0.422675 vn 0.501494 -0.865086 0.011397 vn 0.257412 -0.962471 -0.085958 vn 0.257447 -0.790528 -0.555686 vn 0.257461 -0.406778 -0.876496 vn 0.501497 -0.442395 -0.743496 vn 0.501497 -0.442395 -0.743496 vn 0.501496 -0.754883 -0.422675 vn 0.257447 -0.790528 -0.555686 vn 0.257471 0.555638 -0.790554 vn 0.257427 0.876509 -0.406772 vn 0.501517 0.743464 -0.442428 vn 0.501517 0.743464 -0.442428 vn 0.501508 0.422630 -0.754900 vn 0.257471 0.555638 -0.790554 vn 0.257427 0.876509 -0.406772 vn 0.257413 0.962471 0.085956 vn 0.501493 0.865086 -0.011399 vn 0.501493 0.865086 -0.011399 vn 0.501517 0.743464 -0.442428 vn 0.257427 0.876509 -0.406772 vn 0.257413 0.962471 0.085956 vn 0.257465 0.790515 0.555696 vn 0.501498 0.754868 0.422698 vn 0.501498 0.754868 0.422698 vn 0.501493 0.865086 -0.011399 vn 0.257413 0.962471 0.085956 vn 0.257465 0.790515 0.555696 vn 0.258457 0.482996 0.836609 vn 0.422312 0.453196 0.785026 vn 0.422312 0.453196 0.785026 vn 0.501498 0.754868 0.422698 vn 0.257465 0.790515 0.555696 vn 0.944532 0.188860 -0.268683 vn 0.944532 0.297903 -0.138251 vn 0.944532 0.268685 -0.188857 vn 0.944532 0.268685 -0.188857 vn 0.944533 0.138254 -0.297899 vn 0.944532 0.188860 -0.268683 vn 0.944532 0.297903 -0.138251 vn 0.944533 0.327115 0.029212 vn 0.944532 0.327118 -0.029218 vn 0.944532 0.327118 -0.029218 vn 0.944532 0.268685 -0.188857 vn 0.944532 0.297903 -0.138251 vn 0.944533 0.327115 0.029212 vn 0.944532 0.268683 0.188863 vn 0.944533 0.297899 0.138254 vn 0.944533 0.297899 0.138254 vn 0.944532 0.327118 -0.029218 vn 0.944533 0.327115 0.029212 vn 0.944532 0.268683 0.188863 vn 0.944533 0.138256 0.297897 vn 0.944532 0.188861 0.268682 vn 0.944532 0.188861 0.268682 vn 0.944533 0.297899 0.138254 vn 0.944532 0.268683 0.188863 vn 0.944532 -0.188858 0.268685 vn 0.944532 -0.297902 0.138252 vn 0.944532 -0.268685 0.188858 vn 0.944532 -0.268685 0.188858 vn 0.944532 -0.138252 0.297901 vn 0.944532 -0.188858 0.268685 vn 0.944532 -0.297902 0.138252 vn 0.944533 -0.327115 -0.029211 vn 0.944532 -0.327117 0.029219 vn 0.944532 -0.327117 0.029219 vn 0.944532 -0.268685 0.188858 vn 0.944532 -0.297902 0.138252 vn 0.944533 -0.327115 -0.029211 vn 0.944532 -0.268682 -0.188865 vn 0.944533 -0.297898 -0.138253 vn 0.944533 -0.297898 -0.138253 vn 0.944532 -0.327117 0.029219 vn 0.944533 -0.327115 -0.029211 vn 0.944532 -0.268682 -0.188865 vn 0.944935 -0.163628 -0.283414 vn 0.944935 -0.163626 -0.283414 vn 0.944935 -0.163626 -0.283414 vn 0.944533 -0.297898 -0.138253 vn 0.944532 -0.268682 -0.188865 vn 0.313734 0.546024 -0.776807 vn 0.313758 0.861268 -0.399717 vn 0.313753 0.776795 -0.546030 vn 0.313753 0.776795 -0.546030 vn 0.313721 0.399726 -0.861277 vn 0.313734 0.546024 -0.776807 vn 0.313758 0.861268 -0.399717 vn 0.313744 0.945743 0.084471 vn 0.313744 0.945744 -0.084461 vn 0.313744 0.945744 -0.084461 vn 0.313753 0.776795 -0.546030 vn 0.313758 0.861268 -0.399717 vn 0.313744 0.945743 0.084471 vn 0.314906 0.821964 0.474562 vn 0.314873 0.821974 0.474566 vn 0.314873 0.821974 0.474566 vn 0.313744 0.945744 -0.084461 vn 0.313744 0.945743 0.084471 vn 0.314856 0.474563 0.821983 vn 0.314837 0.474574 0.821984 vn 0.314873 0.821974 0.474566 vn 0.314873 0.821974 0.474566 vn 0.314906 0.821964 0.474562 vn 0.314856 0.474563 0.821983 vn 0.313743 -0.546015 0.776810 vn 0.313763 -0.861266 0.399716 vn 0.313764 -0.776790 0.546031 vn 0.313764 -0.776790 0.546031 vn 0.313727 -0.399713 0.861281 vn 0.313743 -0.546015 0.776810 vn 0.313763 -0.861266 0.399716 vn 0.313742 -0.945743 -0.084472 vn 0.313745 -0.945743 0.084461 vn 0.313745 -0.945743 0.084461 vn 0.313764 -0.776790 0.546031 vn 0.313763 -0.861266 0.399716 vn 0.313742 -0.945743 -0.084472 vn 0.313762 -0.776796 -0.546024 vn 0.313756 -0.861270 -0.399713 vn 0.313756 -0.861270 -0.399713 vn 0.313745 -0.945743 0.084461 vn 0.313742 -0.945743 -0.084472 vn 0.313762 -0.776796 -0.546024 vn 0.313732 -0.399715 -0.861278 vn 0.313745 -0.546018 -0.776807 vn 0.313745 -0.546018 -0.776807 vn 0.313756 -0.861270 -0.399713 vn 0.313762 -0.776796 -0.546024 vn -0.985850 -0.166966 -0.014912 vn -0.968054 -0.205143 -0.144183 vn -0.847548 -0.450912 -0.279894 vn -0.847548 -0.450912 -0.279894 vn -0.847552 -0.530442 -0.016965 vn -0.985850 -0.166966 -0.014912 vn -0.968054 -0.205143 -0.144183 vn -0.979570 -0.084649 -0.182418 vn -0.847543 -0.250540 -0.467868 vn -0.847543 -0.250540 -0.467868 vn -0.847548 -0.450912 -0.279894 vn -0.968054 -0.205143 -0.144183 vn -0.847552 -0.530442 -0.016965 vn -0.847548 -0.450912 -0.279894 vn -0.501512 -0.743470 -0.442422 vn -0.501512 -0.743470 -0.442422 vn -0.501493 -0.865086 -0.011399 vn -0.847552 -0.530442 -0.016965 vn -0.847548 -0.450912 -0.279894 vn -0.847543 -0.250540 -0.467868 vn -0.501502 -0.422655 -0.754890 vn -0.501502 -0.422655 -0.754890 vn -0.501512 -0.743470 -0.442422 vn -0.847548 -0.450912 -0.279894 vn -0.501493 -0.865086 -0.011399 vn -0.501512 -0.743470 -0.442422 vn -0.257426 -0.876509 -0.406772 vn -0.257426 -0.876509 -0.406772 vn -0.257412 -0.962471 0.085956 vn -0.501493 -0.865086 -0.011399 vn -0.501512 -0.743470 -0.442422 vn -0.501502 -0.422655 -0.754890 vn -0.257463 -0.555652 -0.790547 vn -0.257463 -0.555652 -0.790547 vn -0.257426 -0.876509 -0.406772 vn -0.501512 -0.743470 -0.442422 vn -0.944532 0.327117 0.029219 vn -0.944533 0.268685 0.188856 vn -0.944532 0.297903 0.138251 vn -0.944532 0.297903 0.138251 vn -0.944533 0.327115 -0.029211 vn -0.944532 0.327117 0.029219 vn -0.944533 0.268685 0.188856 vn -0.944533 0.138252 0.297900 vn -0.944533 0.188858 0.268682 vn -0.944533 0.188858 0.268682 vn -0.944532 0.297903 0.138251 vn -0.944533 0.268685 0.188856 vn -0.313748 0.945742 0.084462 vn -0.313758 0.776794 0.546029 vn -0.313765 0.861266 0.399716 vn -0.313765 0.861266 0.399716 vn -0.313744 0.945743 -0.084472 vn -0.313748 0.945742 0.084462 vn -0.313758 0.776794 0.546029 vn -0.313719 0.399720 0.861280 vn -0.313734 0.546022 0.776808 vn -0.313734 0.546022 0.776808 vn -0.313765 0.861266 0.399716 vn -0.313758 0.776794 0.546029 vn -0.253207 -0.967409 -0.002630 vn -0.253209 -0.836488 -0.485977 vn 0.000004 -0.866027 -0.499998 vn 0.000004 -0.866027 -0.499998 vn -0.000001 -1.000000 -0.000000 vn -0.253207 -0.967409 -0.002630 vn -0.253209 -0.836488 -0.485977 vn -0.253215 -0.481421 -0.839116 vn 0.000005 -0.499997 -0.866027 vn 0.000005 -0.499997 -0.866027 vn 0.000004 -0.866027 -0.499998 vn -0.253209 -0.836488 -0.485977 vn -0.000001 -1.000000 -0.000000 vn 0.000004 -0.866027 -0.499998 vn 0.253202 -0.839114 -0.481431 vn 0.253202 -0.839114 -0.481431 vn 0.253208 -0.967408 0.002630 vn -0.000001 -1.000000 -0.000000 vn 0.000004 -0.866027 -0.499998 vn 0.000005 -0.499997 -0.866027 vn 0.253205 -0.485976 -0.836490 vn 0.253205 -0.485976 -0.836490 vn 0.253202 -0.839114 -0.481431 vn 0.000004 -0.866027 -0.499998 vn 0.609521 0.455887 -0.648576 vn 0.494350 0.365937 -0.788485 vn 0.514692 0.661554 -0.545378 vn 0.514692 0.661554 -0.545378 vn 0.609508 0.719109 -0.333741 vn 0.609521 0.455887 -0.648576 vn 0.609508 0.719109 -0.333741 vn 0.514692 0.661554 -0.545378 vn 0.609513 0.789633 -0.070522 vn 0.609513 0.789633 -0.070522 vn 0.609512 0.789633 0.070528 vn 0.609508 0.719109 -0.333741 vn 0.609512 0.789633 0.070528 vn 0.609513 0.789633 -0.070522 vn 0.609509 0.719112 0.333732 vn 0.609509 0.719112 0.333732 vn 0.609514 0.648580 0.455891 vn 0.609512 0.789633 0.070528 vn 0.609514 0.648580 0.455891 vn 0.609509 0.719112 0.333732 vn 0.609522 0.455887 0.648575 vn 0.609522 0.455887 0.648575 vn 0.609529 0.333728 0.719097 vn 0.609514 0.648580 0.455891 vn 0.042838 -0.706456 0.706460 vn -0.000001 -0.866026 0.499999 vn 0.253206 -0.836489 0.485977 vn 0.253206 -0.836489 0.485977 vn 0.309938 -0.582026 0.751787 vn 0.042838 -0.706456 0.706460 vn -0.000001 -0.866026 0.499999 vn -0.000001 -1.000000 -0.000000 vn 0.253208 -0.967408 0.002630 vn 0.253208 -0.967408 0.002630 vn 0.253206 -0.836489 0.485977 vn -0.000001 -0.866026 0.499999 vn -0.276655 -0.528532 0.802568 vn -0.253204 -0.839114 0.481430 vn -0.000001 -0.866026 0.499999 vn -0.000001 -0.866026 0.499999 vn 0.042838 -0.706456 0.706460 vn -0.276655 -0.528532 0.802568 vn -0.253204 -0.839114 0.481430 vn -0.253207 -0.967409 -0.002630 vn -0.000001 -1.000000 -0.000000 vn -0.000001 -1.000000 -0.000000 vn -0.000001 -0.866026 0.499999 vn -0.253204 -0.839114 0.481430 vn -0.609523 0.455886 -0.648575 vn -0.609510 0.719107 -0.333740 vn -0.551475 0.657999 -0.512750 vn -0.551475 0.657999 -0.512750 vn -0.495833 0.439294 -0.749114 vn -0.609523 0.455886 -0.648575 vn -0.609510 0.719107 -0.333740 vn -0.609515 0.789631 0.070528 vn -0.609516 0.789631 -0.070522 vn -0.609516 0.789631 -0.070522 vn -0.551475 0.657999 -0.512750 vn -0.609510 0.719107 -0.333740 vn -0.609515 0.789631 0.070528 vn -0.609516 0.648578 0.455890 vn -0.609511 0.719110 0.333732 vn -0.609511 0.719110 0.333732 vn -0.609516 0.789631 -0.070522 vn -0.609515 0.789631 0.070528 vn -0.609516 0.648578 0.455890 vn -0.611054 0.395787 0.685541 vn -0.611048 0.395794 0.685542 vn -0.611048 0.395794 0.685542 vn -0.609511 0.719110 0.333732 vn -0.609516 0.648578 0.455890 vn -0.313737 0.546023 -0.776806 vn -0.313758 0.861272 -0.399709 vn -0.313756 0.776799 -0.546022 vn -0.313756 0.776799 -0.546022 vn -0.313723 0.399718 -0.861280 vn -0.313737 0.546023 -0.776806 vn -0.313758 0.861272 -0.399709 vn -0.313748 0.945742 0.084462 vn -0.313744 0.945743 -0.084472 vn -0.313744 0.945743 -0.084472 vn -0.313756 0.776799 -0.546022 vn -0.313758 0.861272 -0.399709 vn -0.313746 -0.546014 0.776809 vn -0.313763 -0.861270 0.399709 vn -0.313767 -0.776795 0.546021 vn -0.313767 -0.776795 0.546021 vn -0.313729 -0.399706 0.861283 vn -0.313746 -0.546014 0.776809 vn -0.313763 -0.861270 0.399709 vn -0.313746 -0.945743 -0.084461 vn -0.313745 -0.945742 0.084471 vn -0.313745 -0.945742 0.084471 vn -0.313767 -0.776795 0.546021 vn -0.313763 -0.861270 0.399709 vn -0.313746 -0.945743 -0.084461 vn -0.313763 -0.776790 -0.546031 vn -0.313760 -0.861268 -0.399716 vn -0.313760 -0.861268 -0.399716 vn -0.313745 -0.945742 0.084471 vn -0.313746 -0.945743 -0.084461 vn -0.313763 -0.776790 -0.546031 vn -0.314863 -0.474567 -0.821978 vn -0.314867 -0.474562 -0.821979 vn -0.314867 -0.474562 -0.821979 vn -0.313760 -0.861268 -0.399716 vn -0.313763 -0.776790 -0.546031 vn -0.944532 0.188860 -0.268684 vn -0.944533 0.297898 -0.138253 vn -0.944532 0.268683 -0.188863 vn -0.944532 0.268683 -0.188863 vn -0.944533 0.138256 -0.297898 vn -0.944532 0.188860 -0.268684 vn -0.944533 0.297898 -0.138253 vn -0.944532 0.327117 0.029219 vn -0.944533 0.327115 -0.029211 vn -0.944533 0.327115 -0.029211 vn -0.944532 0.268683 -0.188863 vn -0.944533 0.297898 -0.138253 vn -0.944532 -0.188859 0.268685 vn -0.944533 -0.297899 0.138254 vn -0.944532 -0.268683 0.188864 vn -0.944532 -0.268683 0.188864 vn -0.944532 -0.138253 0.297900 vn -0.944532 -0.188859 0.268685 vn -0.944533 -0.297899 0.138254 vn -0.944532 -0.327118 -0.029218 vn -0.944533 -0.327115 0.029212 vn -0.944533 -0.327115 0.029212 vn -0.944532 -0.268683 0.188864 vn -0.944533 -0.297899 0.138254 vn -0.944532 -0.327118 -0.029218 vn -0.944532 -0.268685 -0.188859 vn -0.944532 -0.297902 -0.138253 vn -0.944532 -0.297902 -0.138253 vn -0.944533 -0.327115 0.029212 vn -0.944532 -0.327118 -0.029218 vn -0.944532 -0.268685 -0.188859 vn -0.944935 -0.163624 -0.283416 vn -0.944935 -0.163626 -0.283415 vn -0.944935 -0.163626 -0.283415 vn -0.944532 -0.297902 -0.138253 vn -0.944532 -0.268685 -0.188859 vn -0.422313 -0.000003 0.906450 vn -0.258413 -0.000007 0.966035 vn -0.258431 0.482987 0.836622 vn -0.258431 0.482987 0.836622 vn -0.576382 0.408556 0.707718 vn -0.422313 -0.000003 0.906450 vn -0.422313 -0.000003 0.906450 vn -0.501501 -0.442400 0.743491 vn -0.257469 -0.406781 0.876492 vn -0.257469 -0.406781 0.876492 vn -0.258413 -0.000007 0.966035 vn -0.422313 -0.000003 0.906450 vn -0.501501 -0.442400 0.743491 vn -0.501496 -0.754880 0.422679 vn -0.257452 -0.790525 0.555687 vn -0.257452 -0.790525 0.555687 vn -0.257469 -0.406781 0.876492 vn -0.501501 -0.442400 0.743491 vn -0.501496 -0.754880 0.422679 vn -0.501493 -0.865086 -0.011399 vn -0.257412 -0.962471 0.085956 vn -0.257412 -0.962471 0.085956 vn -0.257452 -0.790525 0.555687 vn -0.501496 -0.754880 0.422679 vn -0.501502 -0.422655 -0.754890 vn -0.501504 0.011393 -0.865080 vn -0.257464 -0.085973 -0.962456 vn -0.257464 -0.085973 -0.962456 vn -0.257463 -0.555652 -0.790547 vn -0.501502 -0.422655 -0.754890 vn -0.501504 0.442382 -0.743500 vn -0.501498 0.754871 -0.422694 vn -0.257460 0.790517 -0.555696 vn -0.257460 0.790517 -0.555696 vn -0.257479 0.406771 -0.876494 vn -0.501504 0.442382 -0.743500 vn -0.501498 0.754871 -0.422694 vn -0.501494 0.865086 0.011397 vn -0.257412 0.962471 -0.085958 vn -0.257412 0.962471 -0.085958 vn -0.257460 0.790517 -0.555696 vn -0.501498 0.754871 -0.422694 vn -0.501494 0.865086 0.011397 vn -0.501519 0.743462 0.442429 vn -0.257429 0.876509 0.406770 vn -0.257429 0.876509 0.406770 vn -0.257412 0.962471 -0.085958 vn -0.501494 0.865086 0.011397 vn -0.501519 0.743462 0.442429 vn -0.576382 0.408556 0.707718 vn -0.258431 0.482987 0.836622 vn -0.258431 0.482987 0.836622 vn -0.257429 0.876509 0.406770 vn -0.501519 0.743462 0.442429 vn -0.847546 -0.279898 0.450914 vn -0.847553 -0.467847 0.250545 vn -0.501496 -0.754880 0.422679 vn -0.501496 -0.754880 0.422679 vn -0.501501 -0.442400 0.743491 vn -0.847546 -0.279898 0.450914 vn -0.847553 -0.467847 0.250545 vn -0.847552 -0.530442 -0.016965 vn -0.501493 -0.865086 -0.011399 vn -0.501493 -0.865086 -0.011399 vn -0.501496 -0.754880 0.422679 vn -0.847553 -0.467847 0.250545 vn -0.847543 -0.250540 -0.467868 vn -0.847546 0.016951 -0.530451 vn -0.501504 0.011393 -0.865080 vn -0.501504 0.011393 -0.865080 vn -0.501502 -0.422655 -0.754890 vn -0.847543 -0.250540 -0.467868 vn -0.847545 0.279881 -0.450925 vn -0.847559 0.467835 -0.250549 vn -0.501498 0.754871 -0.422694 vn -0.501498 0.754871 -0.422694 vn -0.501504 0.442382 -0.743500 vn -0.847545 0.279881 -0.450925 vn -0.847559 0.467835 -0.250549 vn -0.847558 0.530431 0.016963 vn -0.501494 0.865086 0.011397 vn -0.501494 0.865086 0.011397 vn -0.501498 0.754871 -0.422694 vn -0.847559 0.467835 -0.250549 vn -0.847558 0.530431 0.016963 vn -0.847558 0.450886 0.279905 vn -0.501519 0.743462 0.442429 vn -0.501519 0.743462 0.442429 vn -0.501494 0.865086 0.011397 vn -0.847558 0.530431 0.016963 vn -0.847558 0.450886 0.279905 vn -0.885418 0.232376 0.402537 vn -0.576382 0.408556 0.707718 vn -0.576382 0.408556 0.707718 vn -0.501519 0.743462 0.442429 vn -0.847558 0.450886 0.279905 vn -0.985850 -0.096387 0.137144 vn -0.985852 -0.152044 0.070555 vn -0.847553 -0.467847 0.250545 vn -0.847553 -0.467847 0.250545 vn -0.847546 -0.279898 0.450914 vn -0.985850 -0.096387 0.137144 vn -0.985852 -0.152044 0.070555 vn -0.985850 -0.166966 -0.014912 vn -0.847552 -0.530442 -0.016965 vn -0.847552 -0.530442 -0.016965 vn -0.847553 -0.467847 0.250545 vn -0.985852 -0.152044 0.070555 vn -0.985851 0.096382 -0.137141 vn -0.985854 0.152034 -0.070550 vn -0.847559 0.467835 -0.250549 vn -0.847559 0.467835 -0.250549 vn -0.847545 0.279881 -0.450925 vn -0.985851 0.096382 -0.137141 vn -0.985854 0.152034 -0.070550 vn -0.979572 0.200298 0.017888 vn -0.847558 0.530431 0.016963 vn -0.847558 0.530431 0.016963 vn -0.847559 0.467835 -0.250549 vn -0.985854 0.152034 -0.070550 vn -0.979572 0.200298 0.017888 vn -0.979573 0.164513 0.115639 vn -0.847558 0.450886 0.279905 vn -0.847558 0.450886 0.279905 vn -0.847558 0.530431 0.016963 vn -0.979572 0.200298 0.017888 vn -0.979573 0.164513 0.115639 vn -0.974949 0.111197 0.192637 vn -0.885418 0.232376 0.402537 vn -0.885418 0.232376 0.402537 vn -0.847558 0.450886 0.279905 vn -0.979573 0.164513 0.115639 vn 0.635886 -0.167840 0.753311 vn 0.632162 -0.048570 0.773313 vn 0.634498 -0.074622 0.769314 vn 0.634498 -0.074622 0.769314 vn 0.635636 -0.168166 0.753450 vn 0.635886 -0.167840 0.753311 vn 0.632162 -0.048570 0.773313 vn 0.637837 0.053263 0.768328 vn 0.637312 0.054487 0.768677 vn 0.637312 0.054487 0.768677 vn 0.634498 -0.074622 0.769314 vn 0.632162 -0.048570 0.773313 vn -0.000069 -0.218081 0.975931 vn -0.000258 -0.079615 0.996826 vn -0.000136 -0.079599 0.996827 vn -0.000136 -0.079599 0.996827 vn -0.000000 -0.218015 0.975945 vn -0.000069 -0.218081 0.975931 vn 0.000003 0.038918 0.999242 vn 0.000062 0.105891 0.994378 vn -0.000136 -0.079599 0.996827 vn -0.000136 -0.079599 0.996827 vn -0.000258 -0.079615 0.996826 vn 0.000003 0.038918 0.999242 vn -0.660298 -0.059808 0.748618 vn -0.663773 -0.183793 0.725000 vn -0.665801 -0.140612 0.732760 vn -0.665801 -0.140612 0.732760 vn -0.665034 -0.059360 0.744450 vn -0.660298 -0.059808 0.748618 vn -0.660298 -0.059808 0.748618 vn -0.665034 -0.059360 0.744450 vn -0.665143 0.052740 0.744851 vn -0.665143 0.052740 0.744851 vn -0.664726 0.051479 0.745311 vn -0.660298 -0.059808 0.748618 vn -0.663773 -0.183793 0.725000 vn -0.665341 -0.293954 0.686231 vn -0.673683 -0.289338 0.680026 vn -0.673683 -0.289338 0.680026 vn -0.665801 -0.140612 0.732760 vn -0.663773 -0.183793 0.725000 vn -0.000069 -0.218081 0.975931 vn -0.000000 -0.218015 0.975945 vn 0.000037 -0.361843 0.932239 vn 0.000037 -0.361843 0.932239 vn 0.000037 -0.419120 0.907931 vn -0.000069 -0.218081 0.975931 vn 0.635886 -0.167840 0.753311 vn 0.635636 -0.168166 0.753450 vn 0.636855 -0.278577 0.718896 vn 0.636855 -0.278577 0.718896 vn 0.647848 -0.320198 0.691207 vn 0.635886 -0.167840 0.753311 vn 1.000000 -0.000123 0.000749 vn 1.000000 -0.000042 0.000091 vn 1.000000 -0.000059 0.000305 vn 1.000000 -0.000059 0.000305 vn 0.999999 -0.000160 0.001225 vn 1.000000 -0.000123 0.000749 vn 1.000000 0.000002 -0.000069 vn 1.000000 -0.000059 0.000305 vn 1.000000 -0.000042 0.000091 vn 1.000000 -0.000042 0.000091 vn 1.000000 -0.000000 0.000000 vn 1.000000 0.000002 -0.000069 vn 0.647848 -0.320198 0.691207 vn 0.636855 -0.278577 0.718896 vn 0.653707 -0.361903 0.664600 vn 0.653707 -0.361903 0.664600 vn 0.669832 -0.357950 0.650536 vn 0.647848 -0.320198 0.691207 vn 0.000037 -0.419120 0.907931 vn 0.000037 -0.361843 0.932239 vn 0.000062 -0.474589 0.880208 vn 0.000062 -0.474589 0.880208 vn -0.000000 -0.474523 0.880243 vn 0.000037 -0.419120 0.907931 vn -0.680196 -0.350698 0.643695 vn -0.693722 -0.341867 0.633938 vn -0.673683 -0.289338 0.680026 vn -0.673683 -0.289338 0.680026 vn -0.665341 -0.293954 0.686231 vn -0.680196 -0.350698 0.643695 vn 0.650694 0.212380 0.729035 vn 0.651099 0.212601 0.728609 vn 0.637312 0.054487 0.768677 vn 0.637312 0.054487 0.768677 vn 0.637837 0.053263 0.768328 vn 0.650694 0.212380 0.729035 vn -0.000060 0.281420 0.959585 vn -0.000130 0.281514 0.959557 vn 0.000062 0.105891 0.994378 vn 0.000062 0.105891 0.994378 vn 0.000003 0.038918 0.999242 vn -0.000060 0.281420 0.959585 vn -0.000060 0.281420 0.959585 vn -0.000273 0.387136 0.922023 vn -0.000226 0.387180 0.922004 vn -0.000226 0.387180 0.922004 vn -0.000130 0.281514 0.959557 vn -0.000060 0.281420 0.959585 vn 0.650694 0.212380 0.729035 vn 0.647965 0.292843 0.703124 vn 0.654527 0.291677 0.697509 vn 0.654527 0.291677 0.697509 vn 0.651099 0.212601 0.728609 vn 0.650694 0.212380 0.729035 vn -0.678882 0.205267 0.704972 vn -0.664726 0.051479 0.745311 vn -0.665143 0.052740 0.744851 vn -0.665143 0.052740 0.744851 vn -0.679557 0.205346 0.704298 vn -0.678882 0.205267 0.704972 vn -0.678882 0.205267 0.704972 vn -0.679557 0.205346 0.704298 vn -0.682904 0.281892 0.673928 vn -0.682904 0.281892 0.673928 vn -0.676515 0.283204 0.679796 vn -0.678882 0.205267 0.704972 vn 0.000075 0.858283 -0.513177 vn 0.000043 0.858248 -0.513235 vn 0.000075 0.858283 -0.513177 vn 0.000075 0.858283 -0.513177 vn 0.000107 0.858317 -0.513119 vn 0.000075 0.858283 -0.513177 vn 0.999999 0.000559 0.001462 vn 0.999999 0.000481 0.001514 vn 0.999999 0.000644 0.001420 vn 0.999999 0.000644 0.001420 vn 0.999999 0.000631 0.001404 vn 0.999999 0.000559 0.001462 vn -0.999999 -0.000561 -0.001468 vn -0.999999 -0.000635 -0.001411 vn -0.999999 -0.000647 -0.001426 vn -0.999999 -0.000647 -0.001426 vn -0.999999 -0.000483 -0.001520 vn -0.999999 -0.000561 -0.001468 vn 0.999999 0.000315 0.001566 vn 0.999999 0.000236 0.001575 vn 0.999999 0.000481 0.001514 vn 0.999999 0.000481 0.001514 vn 0.999999 0.000559 0.001462 vn 0.999999 0.000315 0.001566 vn -0.999999 -0.000316 -0.001571 vn -0.999999 -0.000561 -0.001468 vn -0.999999 -0.000483 -0.001520 vn -0.999999 -0.000483 -0.001520 vn -0.999999 -0.000237 -0.001580 vn -0.999999 -0.000316 -0.001571 vn 0.999999 0.000155 0.001582 vn 0.999999 0.000150 0.001573 vn 0.999999 0.000236 0.001575 vn 0.999999 0.000236 0.001575 vn 0.999999 0.000315 0.001566 vn 0.999999 0.000155 0.001582 vn -0.999999 -0.000155 -0.001587 vn -0.999999 -0.000316 -0.001571 vn -0.999999 -0.000237 -0.001580 vn -0.999999 -0.000237 -0.001580 vn -0.999999 -0.000151 -0.001578 vn -0.999999 -0.000155 -0.001587 vn 0.999999 -0.000199 0.001513 vn 0.999999 -0.000283 0.001476 vn 0.999999 -0.000116 0.001536 vn 0.999999 -0.000116 0.001536 vn 0.999999 -0.000110 0.001573 vn 0.999999 -0.000199 0.001513 vn -0.999999 0.000200 -0.001519 vn -0.999999 0.000110 -0.001578 vn -0.999999 0.000116 -0.001543 vn -0.999999 0.000116 -0.001543 vn -0.999999 0.000285 -0.001483 vn -0.999999 0.000200 -0.001519 vn 0.999998 -0.000729 0.001606 vn 0.999999 -0.000559 0.001515 vn 0.999999 -0.000536 0.001456 vn 0.999999 -0.000536 0.001456 vn 0.999999 -0.000554 0.001370 vn 0.999998 -0.000729 0.001606 vn -0.999998 0.000734 -0.001619 vn -0.999999 0.000557 -0.001377 vn -0.999999 0.000538 -0.001464 vn -0.999999 0.000538 -0.001464 vn -0.999999 0.000560 -0.001525 vn -0.999998 0.000734 -0.001619 vn -0.999998 0.000734 -0.001619 vn -0.999999 0.000560 -0.001525 vn -0.999998 0.000929 -0.001775 vn -0.999998 0.000929 -0.001775 vn -0.999997 0.001257 -0.002051 vn -0.999998 0.000734 -0.001619 vn 0.999998 -0.000729 0.001606 vn 0.999997 -0.001241 0.002025 vn 0.999998 -0.000921 0.001757 vn 0.999998 -0.000921 0.001757 vn 0.999999 -0.000559 0.001515 vn 0.999998 -0.000729 0.001606 vn 0.002238 -0.180193 -0.983629 vn -0.000051 -0.175278 -0.984519 vn 0.002238 -0.180193 -0.983629 vn 0.002238 -0.180193 -0.983629 vn 0.004528 -0.185104 -0.982709 vn 0.002238 -0.180193 -0.983629 vn -0.000295 0.534751 -0.845010 vn -0.000336 0.534707 -0.845038 vn -0.000363 0.626487 -0.779432 vn -0.000363 0.626487 -0.779432 vn -0.000304 0.626140 -0.779710 vn -0.000295 0.534751 -0.845010 vn -0.000011 -0.762599 0.646872 vn 0.000257 -0.762307 0.647215 vn -0.000011 -0.762599 0.646872 vn -0.000011 -0.762599 0.646872 vn -0.000280 -0.762890 0.646528 vn -0.000011 -0.762599 0.646872 vn 0.000099 -0.000327 -1.000000 vn 0.000000 -0.000284 -1.000000 vn 0.000099 -0.000327 -1.000000 vn 0.000099 -0.000327 -1.000000 vn 0.000198 -0.000370 -1.000000 vn 0.000099 -0.000327 -1.000000 vn 0.000140 -0.783539 -0.621343 vn 0.000312 -0.783723 -0.621110 vn 0.000140 -0.783539 -0.621343 vn 0.000140 -0.783539 -0.621343 vn -0.000033 -0.783355 -0.621575 vn 0.000140 -0.783539 -0.621343 vn 0.000100 0.000567 1.000000 vn -0.000198 0.000664 1.000000 vn 0.000100 0.000567 1.000000 vn 0.000100 0.000567 1.000000 vn 0.000398 0.000469 1.000000 vn 0.000100 0.000567 1.000000 vn 0.000019 -0.191248 -0.981542 vn 0.000159 -0.181763 -0.983342 vn 0.000087 -0.181640 -0.983365 vn 0.000087 -0.181640 -0.983365 vn 0.000004 -0.191146 -0.981562 vn 0.000019 -0.191248 -0.981542 vn -1.000000 0.000229 -0.000361 vn -0.999999 0.000381 -0.001186 vn -0.999999 0.000574 -0.000903 vn -0.999999 0.000574 -0.000903 vn -0.999998 0.000006 0.001754 vn -1.000000 0.000229 -0.000361 vn -0.664024 -0.483565 -0.570295 vn -0.873120 -0.290925 0.391183 vn -0.904786 -0.423561 -0.044249 vn -0.904786 -0.423561 -0.044249 vn -0.853715 -0.409217 -0.322042 vn -0.664024 -0.483565 -0.570295 vn -0.906996 -0.183115 0.379246 vn -0.904786 -0.423561 -0.044249 vn -0.754321 -0.068901 0.652880 vn -0.754321 -0.068901 0.652880 vn -0.603162 -0.049281 0.796095 vn -0.906996 -0.183115 0.379246 vn -0.906996 -0.183115 0.379246 vn -0.603162 -0.049281 0.796095 vn -0.756654 0.217919 0.616430 vn -0.756654 0.217919 0.616430 vn -0.933101 -0.090247 0.348105 vn -0.906996 -0.183115 0.379246 vn -0.664024 -0.483565 -0.570295 vn -0.853715 -0.409217 -0.322042 vn -0.869719 -0.318669 -0.376881 vn -0.869719 -0.318669 -0.376881 vn -0.860752 -0.318427 -0.397128 vn -0.664024 -0.483565 -0.570295 vn -0.664024 -0.483565 -0.570295 vn -0.335894 -0.432240 -0.836866 vn -0.350013 -0.426336 -0.834103 vn -0.350013 -0.426336 -0.834103 vn -0.355807 -0.508774 -0.783933 vn -0.664024 -0.483565 -0.570295 vn -0.664024 -0.483565 -0.570295 vn -0.355807 -0.508774 -0.783933 vn -0.395397 -0.658416 -0.640429 vn -0.395397 -0.658416 -0.640429 vn -0.419048 -0.688095 -0.592388 vn -0.664024 -0.483565 -0.570295 vn -0.603162 -0.049281 0.796095 vn -0.754321 -0.068901 0.652880 vn -0.527233 0.115337 0.841857 vn -0.527233 0.115337 0.841857 vn -0.358498 0.022042 0.933270 vn -0.603162 -0.049281 0.796095 vn -0.603162 -0.049281 0.796095 vn -0.358498 0.022042 0.933270 vn -0.393856 0.112626 0.912246 vn -0.393856 0.112626 0.912246 vn -0.756654 0.217919 0.616430 vn -0.603162 -0.049281 0.796095 vn 0.000100 0.999977 0.006726 vn 0.000198 0.999978 0.006614 vn 0.000100 0.999977 0.006726 vn 0.000100 0.999977 0.006726 vn 0.000003 0.999977 0.006838 vn 0.000100 0.999977 0.006726 vn -0.000030 0.306414 -0.951898 vn 0.000250 0.304631 -0.952470 vn -0.000030 0.306414 -0.951898 vn -0.000030 0.306414 -0.951898 vn -0.000309 0.308197 -0.951323 vn -0.000030 0.306414 -0.951898 vn 0.000085 -0.880404 -0.474224 vn -0.000081 -0.880553 -0.473947 vn 0.000085 -0.880404 -0.474224 vn 0.000085 -0.880404 -0.474224 vn 0.000250 -0.880255 -0.474501 vn 0.000085 -0.880404 -0.474224 vn -0.999997 -0.002230 0.000424 vn -0.999990 -0.004459 0.000848 vn -0.999999 -0.001115 0.000212 vn -0.999999 -0.001115 0.000212 vn -1.000000 -0.000000 0.000000 vn -0.999997 -0.002230 0.000424 vn 0.000019 -0.191248 -0.981542 vn 0.000004 -0.191146 -0.981562 vn -0.000063 -0.192585 -0.981280 vn -0.000063 -0.192585 -0.981280 vn -0.000061 -0.184106 -0.982906 vn 0.000019 -0.191248 -0.981542 vn 1.000000 0.000013 -0.000070 vn 1.000000 -0.000059 0.000305 vn 1.000000 0.000002 -0.000069 vn 1.000000 0.000002 -0.000069 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000013 -0.000070 vn -0.873120 -0.290925 0.391183 vn -0.809035 -0.562434 0.170677 vn -0.754321 -0.068901 0.652880 vn -0.754321 -0.068901 0.652880 vn -0.118434 -0.962411 0.244415 vn -0.873120 -0.290925 0.391183 vn 0.000916 0.999967 0.008092 vn 0.000982 0.999955 0.009400 vn -0.003158 0.999968 0.007419 vn -0.003158 0.999968 0.007419 vn 0.000784 0.999985 0.005477 vn 0.000916 0.999967 0.008092 vn 0.118425 -0.962412 0.244414 vn 0.118425 -0.962412 0.244414 vn -0.605565 0.333937 0.722341 vn 0.874858 -0.379655 0.300808 vn 0.810531 -0.560415 0.170217 vn 0.867974 -0.496501 0.010408 vn -0.001396 0.999948 0.010110 vn -0.000784 0.999985 0.005479 vn 0.005988 0.999943 0.008816 vn 0.005988 0.999943 0.008816 vn -0.001702 0.999921 0.012427 vn -0.001396 0.999948 0.010110 vn -0.860329 0.411331 -0.301067 vn -0.631964 0.523631 -0.571342 vn -0.646196 0.488040 -0.586727 vn -0.819954 0.431559 0.376075 vn -0.900284 0.435165 -0.010921 vn 0.819488 0.432449 0.376069 vn 0.582743 0.570477 0.578763 vn 0.712414 0.497493 0.494941 vn 0.859541 0.413243 -0.300699 vn 0.896680 0.442545 -0.010920 vn 0.584483 0.450862 -0.674613 vn 0.644013 0.493272 -0.584748 vn -0.077055 -0.972195 -0.221134 vn -0.036029 -0.979683 -0.197292 vn -0.036029 -0.979683 -0.197292 vn -0.345767 -0.132147 -0.928968 vn -0.458030 -0.261883 -0.849486 vn -0.795941 -0.350374 -0.493676 vn -0.117904 -0.962463 -0.244466 vn -0.117904 -0.962463 -0.244466 vn -0.077055 -0.972195 -0.221134 vn -0.795941 -0.350374 -0.493676 vn -0.850572 -0.151956 0.503426 vn -0.863446 -0.504297 -0.012018 vn 0.000095 0.999950 -0.009979 vn 0.000841 0.999985 -0.005481 vn -0.004637 0.999956 -0.008180 vn -0.004637 0.999956 -0.008180 vn -0.008649 0.999905 -0.010694 vn 0.000095 0.999950 -0.009979 vn 0.000095 0.999950 -0.009979 vn -0.008649 0.999905 -0.010694 vn 0.004826 0.999919 -0.011777 vn 0.004826 0.999919 -0.011777 vn 0.016835 0.999773 -0.013043 vn 0.000095 0.999950 -0.009979 vn 0.798570 -0.345018 -0.493203 vn 0.459803 -0.252519 -0.851361 vn 0.346237 -0.128948 -0.929243 vn 0.036235 -0.979551 -0.197905 vn 0.036235 -0.979551 -0.197905 vn 0.077360 -0.972115 -0.221377 vn 0.868350 -0.495846 -0.010225 vn 0.811440 -0.559195 -0.169902 vn 0.798570 -0.345018 -0.493203 vn 0.077360 -0.972115 -0.221377 vn 0.118307 -0.962446 -0.244339 vn 0.118307 -0.962446 -0.244339 vn 0.004652 0.999956 -0.008170 vn -0.000804 0.999985 -0.005481 vn 0.000638 0.999965 -0.008332 vn 0.000638 0.999965 -0.008332 vn 0.006946 0.999882 -0.013672 vn 0.004652 0.999956 -0.008170 vn 0.005364 0.999872 -0.015079 vn 0.018117 0.999605 -0.021500 vn 0.006946 0.999882 -0.013672 vn 0.006946 0.999882 -0.013672 vn 0.000638 0.999965 -0.008332 vn 0.005364 0.999872 -0.015079 vn -0.000363 0.626487 -0.779432 vn -0.000502 0.710919 -0.703274 vn -0.000427 0.710257 -0.703943 vn -0.000427 0.710257 -0.703943 vn -0.000304 0.626140 -0.779710 vn -0.000363 0.626487 -0.779432 vn -0.000061 -0.184106 -0.982906 vn -0.000063 -0.192585 -0.981280 vn -0.000046 -0.175681 -0.984447 vn -0.000046 -0.175681 -0.984447 vn -0.000000 -0.175321 -0.984511 vn -0.000061 -0.184106 -0.982906 vn 0.003736 0.977052 -0.212969 vn 0.007474 0.976696 -0.214497 vn 0.001850 0.978119 -0.208036 vn 0.001850 0.978119 -0.208036 vn 0.001300 0.977669 -0.210148 vn 0.003736 0.977052 -0.212969 vn 0.001850 0.978119 -0.208036 vn -0.002673 0.980334 -0.197328 vn -0.000036 0.979159 -0.203097 vn -0.000036 0.979159 -0.203097 vn 0.001300 0.977669 -0.210148 vn 0.001850 0.978119 -0.208036 vn 0.880464 -0.272086 0.388269 vn 0.933511 -0.136716 0.331460 vn 0.760964 -0.137604 0.634034 vn 0.760964 -0.137604 0.634034 vn 0.696291 -0.277814 0.661814 vn 0.880464 -0.272086 0.388269 vn 0.696291 -0.277814 0.661814 vn 0.760964 -0.137604 0.634034 vn 0.456776 -0.139105 0.878639 vn 0.456776 -0.139105 0.878639 vn 0.382728 -0.283149 0.879401 vn 0.696291 -0.277814 0.661814 vn 0.806355 -0.429611 0.406480 vn 0.880464 -0.272086 0.388269 vn 0.696291 -0.277814 0.661814 vn 0.696291 -0.277814 0.661814 vn 0.628880 -0.429097 0.648372 vn 0.806355 -0.429611 0.406480 vn 0.628880 -0.429097 0.648372 vn 0.696291 -0.277814 0.661814 vn 0.382728 -0.283149 0.879401 vn 0.382728 -0.283149 0.879401 vn 0.112224 -0.208505 0.971561 vn 0.628880 -0.429097 0.648372 vn -0.385052 -0.283448 0.878289 vn -0.500383 -0.186140 0.845558 vn -0.188043 -0.409168 0.892872 vn -0.188043 -0.409168 0.892872 vn -0.199130 -0.258182 0.945351 vn -0.385052 -0.283448 0.878289 vn -0.552780 0.000003 0.833327 vn -0.635871 -0.400458 0.659774 vn -0.374364 -0.390356 0.841115 vn -0.374364 -0.390356 0.841115 vn -0.375617 0.000007 0.926775 vn -0.552780 0.000003 0.833327 vn -0.993596 0.000000 0.112994 vn -0.894127 0.000000 0.447813 vn -0.941313 0.168761 0.292318 vn -0.941313 0.168761 0.292318 vn -0.988595 0.075286 0.130428 vn -0.993596 0.000000 0.112994 vn -0.993596 0.000000 0.112994 vn -0.993545 -0.065225 0.092812 vn -0.919306 -0.209306 0.333267 vn -0.919306 -0.209306 0.333267 vn -0.894127 0.000000 0.447813 vn -0.993596 0.000000 0.112994 vn 0.941321 0.000000 0.337514 vn 0.995911 0.000000 0.090344 vn 0.988597 0.075286 0.130412 vn 0.988597 0.075286 0.130412 vn 0.894128 0.223900 0.387819 vn 0.941321 0.000000 0.337514 vn 0.941321 0.000000 0.337514 vn 0.919316 -0.183932 0.347890 vn 0.993547 -0.047744 0.102887 vn 0.993547 -0.047744 0.102887 vn 0.995911 0.000000 0.090344 vn 0.941321 0.000000 0.337514 vn 0.375619 0.000004 0.926774 vn 0.374405 -0.533230 0.758609 vn 0.635844 -0.371168 0.676710 vn 0.635844 -0.371168 0.676710 vn 0.711779 0.000000 0.702403 vn 0.375619 0.000004 0.926774 vn -0.950405 0.254446 0.178853 vn -0.950406 0.130926 0.282110 vn -0.869389 0.233353 0.435557 vn -0.869389 0.233353 0.435557 vn -0.869389 0.419868 0.260524 vn -0.950405 0.254446 0.178853 vn -0.869389 0.419868 0.260524 vn -0.869389 0.233353 0.435557 vn -0.571901 0.399645 0.716389 vn -0.571901 0.399645 0.716389 vn -0.571889 0.704307 0.420587 vn -0.869389 0.419868 0.260524 vn -0.571901 0.399645 0.716389 vn -0.624264 0.202197 0.754593 vn -0.345186 0.242915 0.906553 vn -0.345186 0.242915 0.906553 vn -0.354603 0.537690 0.764948 vn -0.571901 0.399645 0.716389 vn 0.354618 0.393618 0.848122 vn 0.345178 0.242914 0.906557 vn 0.489242 0.225733 0.842429 vn 0.489242 0.225733 0.842429 vn 0.571894 0.420587 0.704303 vn 0.354618 0.393618 0.848122 vn 0.571883 0.716398 0.399655 vn 0.571894 0.420587 0.704303 vn 0.868652 0.284895 0.405313 vn 0.868652 0.284895 0.405313 vn 0.868654 0.449383 0.208554 vn 0.571883 0.716398 0.399655 vn 0.950406 0.254443 0.178851 vn 0.868654 0.449383 0.208554 vn 0.868652 0.284895 0.405313 vn 0.868652 0.284895 0.405313 vn 0.950407 0.130925 0.282108 vn 0.950406 0.254443 0.178851 vn -0.824631 -0.399988 -0.399991 vn -0.869388 -0.233356 -0.435556 vn -0.571909 -0.399646 -0.716382 vn -0.571909 -0.399646 -0.716382 vn -0.489249 -0.616697 -0.616700 vn -0.824631 -0.399988 -0.399991 vn -0.869388 -0.233356 -0.435556 vn -0.869392 0.015691 -0.493874 vn -0.571908 0.012087 -0.820229 vn -0.571908 0.012087 -0.820229 vn -0.571909 -0.399646 -0.716382 vn -0.869388 -0.233356 -0.435556 vn -0.489249 -0.616697 -0.616700 vn -0.571909 -0.399646 -0.716382 vn -0.354639 -0.537686 -0.764935 vn -0.354639 -0.537686 -0.764935 vn -0.345155 -0.663658 -0.663646 vn -0.489249 -0.616697 -0.616700 vn -0.571909 -0.399646 -0.716382 vn -0.571908 0.012087 -0.820229 vn -0.354628 -0.083183 -0.931300 vn -0.354628 -0.083183 -0.931300 vn -0.354639 -0.537686 -0.764935 vn -0.571909 -0.399646 -0.716382 vn 0.345198 -0.663641 -0.663641 vn 0.354649 -0.393615 -0.848110 vn 0.571906 -0.420586 -0.704294 vn 0.571906 -0.420586 -0.704294 vn 0.624252 -0.552404 -0.552412 vn 0.345198 -0.663641 -0.663641 vn 0.354649 -0.393615 -0.848110 vn 0.354628 0.083183 -0.931300 vn 0.571908 -0.012087 -0.820229 vn 0.571908 -0.012087 -0.820229 vn 0.571906 -0.420586 -0.704294 vn 0.354649 -0.393615 -0.848110 vn 0.624252 -0.552404 -0.552412 vn 0.571906 -0.420586 -0.704294 vn 0.868649 -0.284900 -0.405315 vn 0.868649 -0.284900 -0.405315 vn 0.861982 -0.358460 -0.358460 vn 0.624252 -0.552404 -0.552412 vn 0.571906 -0.420586 -0.704294 vn 0.571908 -0.012087 -0.820229 vn 0.868654 -0.044075 -0.493455 vn 0.868654 -0.044075 -0.493455 vn 0.868649 -0.284900 -0.405315 vn 0.571906 -0.420586 -0.704294 vn 0.571908 -0.012087 -0.820229 vn 0.571909 0.399643 -0.716384 vn 0.868651 0.208561 -0.449385 vn 0.868651 0.208561 -0.449385 vn 0.868654 -0.044075 -0.493455 vn 0.571908 -0.012087 -0.820229 vn 0.950407 0.178846 -0.254441 vn 0.868651 0.208561 -0.449385 vn 0.868652 0.405310 -0.284901 vn 0.868652 0.405310 -0.284901 vn 0.950405 0.282113 -0.130927 vn 0.950407 0.178846 -0.254441 vn 0.571909 0.399643 -0.716384 vn 0.571898 0.704302 -0.420585 vn 0.868652 0.405310 -0.284901 vn 0.868652 0.405310 -0.284901 vn 0.868651 0.208561 -0.449385 vn 0.571909 0.399643 -0.716384 vn 0.354628 0.083183 -0.931300 vn 0.354639 0.537681 -0.764938 vn 0.571909 0.399643 -0.716384 vn 0.571909 0.399643 -0.716384 vn 0.571908 -0.012087 -0.820229 vn 0.354628 0.083183 -0.931300 vn -0.571908 0.012087 -0.820229 vn -0.571906 0.420583 -0.704297 vn -0.354649 0.393613 -0.848112 vn -0.354649 0.393613 -0.848112 vn -0.354628 -0.083183 -0.931300 vn -0.571908 0.012087 -0.820229 vn -0.869392 0.015691 -0.493874 vn -0.869388 0.260524 -0.419872 vn -0.571906 0.420583 -0.704297 vn -0.571906 0.420583 -0.704297 vn -0.571908 0.012087 -0.820229 vn -0.869392 0.015691 -0.493874 vn -0.869388 0.260524 -0.419872 vn -0.869391 0.435553 -0.233350 vn -0.571884 0.716396 -0.399656 vn -0.571884 0.716396 -0.399656 vn -0.571906 0.420583 -0.704297 vn -0.869388 0.260524 -0.419872 vn -0.950406 0.178847 -0.254445 vn -0.950404 0.282116 -0.130929 vn -0.869391 0.435553 -0.233350 vn -0.869391 0.435553 -0.233350 vn -0.869388 0.260524 -0.419872 vn -0.950406 0.178847 -0.254445 vn 0.314856 0.474563 0.821983 vn 0.313724 -0.084465 0.945750 vn 0.313721 0.084469 0.945750 vn 0.313721 0.084469 0.945750 vn 0.314837 0.474574 0.821984 vn 0.314856 0.474563 0.821983 vn -0.609519 -0.789628 -0.070523 vn -0.609524 -0.648572 -0.455889 vn -0.495825 -0.749119 -0.439293 vn -0.495825 -0.749119 -0.439293 vn -0.495828 -0.868401 -0.005885 vn -0.609519 -0.789628 -0.070523 vn -0.609524 -0.648572 -0.455889 vn -0.609538 -0.333723 -0.719092 vn -0.495823 -0.429103 -0.755003 vn -0.495823 -0.429103 -0.755003 vn -0.495825 -0.749119 -0.439293 vn -0.609524 -0.648572 -0.455889 vn -0.495825 -0.749119 -0.439293 vn -0.495823 -0.429103 -0.755003 vn -0.253215 -0.481421 -0.839116 vn -0.253215 -0.481421 -0.839116 vn -0.253209 -0.836488 -0.485977 vn -0.495825 -0.749119 -0.439293 vn 0.253202 -0.839114 -0.481431 vn 0.253205 -0.485976 -0.836490 vn 0.470717 -0.483754 -0.737840 vn 0.470717 -0.483754 -0.737840 vn 0.512772 -0.760719 -0.397958 vn 0.253202 -0.839114 -0.481431 vn 0.609517 -0.789630 -0.070523 vn 0.494350 -0.865817 0.077326 vn 0.512772 -0.760719 -0.397958 vn 0.512772 -0.760719 -0.397958 vn 0.611033 -0.685550 -0.395803 vn 0.609517 -0.789630 -0.070523 vn 0.611050 -0.395792 -0.685542 vn 0.611033 -0.685550 -0.395803 vn 0.512772 -0.760719 -0.397958 vn 0.512772 -0.760719 -0.397958 vn 0.470717 -0.483754 -0.737840 vn 0.611050 -0.395792 -0.685542 vn 0.609525 -0.455884 0.648574 vn 0.494353 -0.365936 0.788483 vn 0.494352 -0.711151 0.499881 vn 0.494352 -0.711151 0.499881 vn 0.609520 -0.719103 0.333731 vn 0.609525 -0.455884 0.648574 vn 0.253211 0.481425 -0.839115 vn 0.206084 0.691924 -0.691932 vn 0.514692 0.661554 -0.545378 vn 0.514692 0.661554 -0.545378 vn 0.494350 0.365937 -0.788485 vn 0.253211 0.481425 -0.839115 vn 0.000005 -0.499997 -0.866027 vn -0.000001 -0.000001 -1.000000 vn 0.253206 -0.002627 -0.967409 vn 0.253206 -0.002627 -0.967409 vn 0.253205 -0.485976 -0.836490 vn 0.000005 -0.499997 -0.866027 vn -0.000001 -0.000001 -1.000000 vn -0.000002 0.499995 -0.866028 vn 0.253211 0.481425 -0.839115 vn 0.253211 0.481425 -0.839115 vn 0.253206 -0.002627 -0.967409 vn -0.000001 -0.000001 -1.000000 vn -0.000002 0.499995 -0.866028 vn -0.042847 0.706455 -0.706459 vn 0.206084 0.691924 -0.691932 vn 0.206084 0.691924 -0.691932 vn 0.253211 0.481425 -0.839115 vn -0.000002 0.499995 -0.866028 vn -0.253215 -0.481421 -0.839116 vn -0.253205 0.002624 -0.967409 vn -0.000001 -0.000001 -1.000000 vn -0.000001 -0.000001 -1.000000 vn 0.000005 -0.499997 -0.866027 vn -0.253215 -0.481421 -0.839116 vn -0.253205 0.002624 -0.967409 vn -0.253204 0.485976 -0.836490 vn -0.000002 0.499995 -0.866028 vn -0.000002 0.499995 -0.866028 vn -0.000001 -0.000001 -1.000000 vn -0.253205 0.002624 -0.967409 vn -0.253204 0.485976 -0.836490 vn -0.283741 0.678043 -0.678047 vn -0.042847 0.706455 -0.706459 vn -0.042847 0.706455 -0.706459 vn -0.000002 0.499995 -0.866028 vn -0.253204 0.485976 -0.836490 vn -0.495833 0.439294 -0.749114 vn -0.551475 0.657999 -0.512750 vn -0.283741 0.678043 -0.678047 vn -0.283741 0.678043 -0.678047 vn -0.253204 0.485976 -0.836490 vn -0.495833 0.439294 -0.749114 vn -0.609527 -0.455884 0.648573 vn -0.609522 -0.719101 0.333731 vn -0.495831 -0.754999 0.429102 vn -0.495831 -0.754999 0.429102 vn -0.495831 -0.439293 0.749115 vn -0.609527 -0.455884 0.648573 vn -0.313719 0.399720 0.861280 vn -0.313726 -0.084468 0.945749 vn -0.313723 0.084469 0.945750 vn -0.313723 0.084469 0.945750 vn -0.313734 0.546022 0.776808 vn -0.313719 0.399720 0.861280 vn -0.004747 0.355586 0.934631 vn -0.004692 0.299929 0.953950 vn -0.004787 0.409826 0.912151 vn -0.004787 0.409826 0.912151 vn -0.004793 0.409829 0.912150 vn -0.004747 0.355586 0.934631 vn -0.004553 0.195837 0.980626 vn -0.004475 0.147666 0.989027 vn -0.004692 0.299929 0.953950 vn -0.004692 0.299929 0.953950 vn -0.004747 0.355586 0.934631 vn -0.004553 0.195837 0.980626 vn -0.003443 -0.241254 0.970456 vn -0.003437 -0.241257 0.970455 vn -0.003634 -0.184745 0.982780 vn -0.003634 -0.184745 0.982780 vn -0.003815 -0.127425 0.991841 vn -0.003443 -0.241254 0.970456 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn -0.000468 0.881581 -0.472032 vn 0.000000 0.880872 -0.473354 vn 0.000000 0.589268 -0.807938 vn 0.000000 0.589268 -0.807938 vn 0.000000 0.440579 -0.897714 vn -0.000468 0.881581 -0.472032 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.440579 -0.897714 vn 0.000000 0.589268 -0.807938 vn 0.000000 0.283463 -0.958983 vn 0.000000 0.283463 -0.958983 vn 0.000000 0.283463 -0.958983 vn 0.000000 0.440579 -0.897714 vn -1.000000 -0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -0.999999 0.000381 -0.001186 vn -0.999999 0.000381 -0.001186 vn -1.000000 0.000229 -0.000361 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 -0.000000 vn -1.000000 -0.000000 -0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 -0.000230 0.000364 vn 1.000000 -0.000230 0.000364 vn 0.999998 -0.000573 0.001786 vn 1.000000 0.000000 -0.000000 vn 0.000002 -0.002136 -0.999998 vn -0.000000 -0.001069 -0.999999 vn 0.000004 -0.003205 -0.999995 vn 0.000004 -0.003205 -0.999995 vn 0.000007 -0.003202 -0.999995 vn 0.000002 -0.002136 -0.999998 vn 0.000318 -0.500036 0.866005 vn 0.000318 -0.500032 0.866007 vn 0.000318 -0.500036 0.866005 vn 0.000318 -0.500036 0.866005 vn 0.000317 -0.500040 0.866002 vn 0.000318 -0.500036 0.866005 vn -0.000066 -1.000000 0.000000 vn -0.000066 -1.000000 0.000000 vn -0.000066 -1.000000 0.000000 vn -0.000066 -1.000000 0.000000 vn -0.000066 -1.000000 0.000000 vn -0.000066 -1.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 0.000059 1.000000 0.000000 vn 0.000059 1.000000 0.000000 vn 0.000059 1.000000 0.000000 vn 0.000059 1.000000 0.000000 vn 0.000059 1.000000 0.000000 vn 0.000059 1.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.707107 0.000000 0.707107 vn -0.408248 -0.816497 0.408248 vn -0.408248 -0.816497 0.408248 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.848288 0.094287 0.521073 vn -0.408248 -0.816497 0.408248 vn -0.408248 -0.816497 0.408248 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn -0.697855 -0.278214 0.659996 vn -0.729775 -0.184172 0.658414 vn -0.500383 -0.186140 0.845558 vn -0.500383 -0.186140 0.845558 vn -0.385052 -0.283448 0.878289 vn -0.697855 -0.278214 0.659996 vn -0.717794 -0.138636 0.682314 vn -0.697855 -0.278214 0.659996 vn -0.385052 -0.283448 0.878289 vn -0.385052 -0.283448 0.878289 vn -0.395860 -0.139986 0.907578 vn -0.717794 -0.138636 0.682314 vn -0.395860 -0.139986 0.907578 vn -0.385052 -0.283448 0.878289 vn -0.199130 -0.258182 0.945351 vn -0.199130 -0.258182 0.945351 vn -0.203968 -0.111570 0.972599 vn -0.395860 -0.139986 0.907578 vn -0.887014 -0.272466 0.372784 vn -0.866273 -0.187057 0.463228 vn -0.729775 -0.184172 0.658414 vn -0.729775 -0.184172 0.658414 vn -0.697855 -0.278214 0.659996 vn -0.887014 -0.272466 0.372784 vn -0.914247 -0.137638 0.381063 vn -0.887014 -0.272466 0.372784 vn -0.697855 -0.278214 0.659996 vn -0.697855 -0.278214 0.659996 vn -0.717794 -0.138636 0.682314 vn -0.914247 -0.137638 0.381063 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn -0.552780 0.000003 0.833327 vn -0.375617 0.000007 0.926775 vn -0.375614 0.463375 0.802619 vn -0.375614 0.463375 0.802619 vn -0.711778 0.351190 0.608307 vn -0.552780 0.000003 0.833327 vn -0.990580 -0.057648 -0.124209 vn -0.990580 -0.078748 -0.112029 vn -0.990580 -0.012183 -0.136392 vn -0.990580 -0.012183 -0.136392 vn -0.990580 0.012183 -0.136393 vn -0.990580 -0.057648 -0.124209 vn -0.990580 0.012183 -0.136393 vn -0.990580 -0.012183 -0.136392 vn -0.990580 0.057647 -0.124213 vn -0.990580 0.057647 -0.124213 vn -0.990579 0.078747 -0.112032 vn -0.990580 0.012183 -0.136393 vn -0.990579 0.078747 -0.112032 vn -0.990580 0.057647 -0.124213 vn -0.990653 0.118130 -0.068203 vn -0.990653 0.118130 -0.068203 vn -0.990653 0.118131 -0.068204 vn -0.990579 0.078747 -0.112032 vn -0.990653 0.136406 0.000000 vn -0.990653 0.118131 -0.068204 vn -0.990653 0.118130 -0.068203 vn -0.990653 0.118130 -0.068203 vn -0.990653 0.136405 0.000001 vn -0.990653 0.136406 0.000000 vn -0.990653 0.136406 0.000000 vn -0.990653 0.136405 0.000001 vn -0.990580 0.124213 0.057647 vn -0.990580 0.124213 0.057647 vn -0.990579 0.112031 0.078751 vn -0.990653 0.136406 0.000000 vn -0.990579 0.112031 0.078751 vn -0.990580 0.124213 0.057647 vn -0.990579 0.078748 0.112033 vn -0.990579 0.078748 0.112033 vn -0.990580 0.057648 0.124213 vn -0.990579 0.112031 0.078751 vn -0.990580 0.057648 0.124213 vn -0.990579 0.078748 0.112033 vn -0.990580 0.012182 0.136394 vn -0.990580 0.012182 0.136394 vn -0.990580 -0.012183 0.136394 vn -0.990580 0.057648 0.124213 vn -0.990580 -0.012183 0.136394 vn -0.990580 0.012182 0.136394 vn -0.990580 -0.057647 0.124212 vn -0.990580 -0.057647 0.124212 vn -0.990580 -0.078746 0.112029 vn -0.990580 -0.012183 0.136394 vn -0.990580 -0.078746 0.112029 vn -0.990580 -0.057647 0.124212 vn -0.990580 -0.112030 0.078745 vn -0.990580 -0.112030 0.078745 vn -0.990580 -0.124214 0.057645 vn -0.990580 -0.078746 0.112029 vn -0.990580 -0.124214 0.057645 vn -0.990580 -0.112030 0.078745 vn -0.990580 -0.136395 0.012183 vn -0.990580 -0.136395 0.012183 vn -0.990580 -0.136394 -0.012180 vn -0.990580 -0.124214 0.057645 vn -0.990580 -0.136394 -0.012180 vn -0.990580 -0.136395 0.012183 vn -0.990580 -0.124212 -0.057646 vn -0.990580 -0.124212 -0.057646 vn -0.990580 -0.112030 -0.078748 vn -0.990580 -0.136394 -0.012180 vn -0.894127 0.000000 0.447813 vn -0.552780 0.000003 0.833327 vn -0.711778 0.351190 0.608307 vn -0.711778 0.351190 0.608307 vn -0.941313 0.168761 0.292318 vn -0.894127 0.000000 0.447813 vn -0.894127 0.000000 0.447813 vn -0.919306 -0.209306 0.333267 vn -0.635871 -0.400458 0.659774 vn -0.635871 -0.400458 0.659774 vn -0.552780 0.000003 0.833327 vn -0.894127 0.000000 0.447813 vn -0.919310 -0.183937 -0.347902 vn -0.919313 0.014636 -0.393256 vn -0.635850 0.016919 -0.771627 vn -0.635850 0.016919 -0.771627 vn -0.635848 -0.371168 -0.676707 vn -0.919310 -0.183937 -0.347902 vn -0.919313 0.014636 -0.393256 vn -0.919312 0.209302 -0.333254 vn -0.635837 0.400454 -0.659808 vn -0.635837 0.400454 -0.659808 vn -0.635850 0.016919 -0.771627 vn -0.919313 0.014636 -0.393256 vn -0.993596 0.000000 0.112994 vn -0.988595 0.075286 0.130428 vn -0.990694 0.111365 0.078253 vn -0.990694 0.111365 0.078253 vn -0.990692 0.135582 0.012110 vn -0.993596 0.000000 0.112994 vn -0.993596 0.000000 0.112994 vn -0.990692 0.135582 0.012110 vn -0.993546 0.102893 -0.047737 vn -0.993546 0.102893 -0.047737 vn -0.993545 -0.065225 0.092812 vn -0.993596 0.000000 0.112994 vn -0.993545 -0.065225 0.092812 vn -0.993546 0.102893 -0.047737 vn -0.993544 0.065233 -0.092813 vn -0.993544 0.065233 -0.092813 vn -0.993546 -0.102889 0.047744 vn -0.993545 -0.065225 0.092812 vn -0.993546 -0.102889 0.047744 vn -0.993544 0.065233 -0.092813 vn -0.993545 0.010092 -0.112988 vn -0.993545 0.010092 -0.112988 vn -0.993545 -0.112987 -0.010091 vn -0.993546 -0.102889 0.047744 vn -0.993545 -0.112987 -0.010091 vn -0.993545 0.010092 -0.112988 vn -0.990693 -0.057297 -0.123470 vn -0.990693 -0.057297 -0.123470 vn -0.985454 -0.139028 -0.097729 vn -0.993545 -0.112987 -0.010091 vn 0.993545 0.112985 -0.010093 vn 0.985459 0.154136 0.071505 vn 0.988597 0.075286 0.130412 vn 0.988597 0.075286 0.130412 vn 0.995911 0.000000 0.090344 vn 0.993545 0.112985 -0.010093 vn 0.993547 0.092802 -0.065213 vn 0.993545 0.112985 -0.010093 vn 0.995911 0.000000 0.090344 vn 0.995911 0.000000 0.090344 vn 0.993547 -0.047744 0.102887 vn 0.993547 0.092802 -0.065213 vn 0.993546 0.047747 -0.102891 vn 0.993547 0.092802 -0.065213 vn 0.993547 -0.047744 0.102887 vn 0.993547 -0.047744 0.102887 vn 0.993547 -0.092790 0.065223 vn 0.993546 0.047747 -0.102891 vn 0.995265 -0.008647 -0.096813 vn 0.993546 0.047747 -0.102891 vn 0.993547 -0.092790 0.065223 vn 0.993547 -0.092790 0.065223 vn 0.990696 -0.135556 0.012105 vn 0.995265 -0.008647 -0.096813 vn 0.990697 -0.123441 -0.057286 vn 0.985455 -0.097713 -0.139034 vn 0.995265 -0.008647 -0.096813 vn 0.995265 -0.008647 -0.096813 vn 0.990696 -0.135556 0.012105 vn 0.990697 -0.123441 -0.057286 vn 0.711779 0.000000 0.702403 vn 0.941321 0.000000 0.337514 vn 0.894128 0.223900 0.387819 vn 0.894128 0.223900 0.387819 vn 0.552770 0.416654 0.721696 vn 0.711779 0.000000 0.702403 vn 0.711779 0.000000 0.702403 vn 0.635844 -0.371168 0.676710 vn 0.919316 -0.183932 0.347890 vn 0.919316 -0.183932 0.347890 vn 0.941321 0.000000 0.337514 vn 0.711779 0.000000 0.702403 vn 0.635869 -0.400458 -0.659776 vn 0.635851 -0.016917 -0.771626 vn 0.919318 -0.014637 -0.393244 vn 0.919318 -0.014637 -0.393244 vn 0.919310 -0.209306 -0.333256 vn 0.635869 -0.400458 -0.659776 vn 0.635851 -0.016917 -0.771626 vn 0.635844 0.371156 -0.676717 vn 0.919315 0.183940 -0.347888 vn 0.919315 0.183940 -0.347888 vn 0.919318 -0.014637 -0.393244 vn 0.635851 -0.016917 -0.771626 vn 0.375619 0.000004 0.926774 vn 0.711779 0.000000 0.702403 vn 0.552770 0.416654 0.721696 vn 0.552770 0.416654 0.721696 vn 0.375622 0.463380 0.802613 vn 0.375619 0.000004 0.926774 vn 0.990580 -0.057648 -0.124210 vn 0.990580 0.012183 -0.136395 vn 0.990580 -0.012183 -0.136394 vn 0.990580 -0.012183 -0.136394 vn 0.990580 -0.078748 -0.112030 vn 0.990580 -0.057648 -0.124210 vn 0.990580 0.012183 -0.136395 vn 0.990579 0.078748 -0.112033 vn 0.990579 0.057648 -0.124214 vn 0.990579 0.057648 -0.124214 vn 0.990580 -0.012183 -0.136394 vn 0.990580 0.012183 -0.136395 vn 0.990579 0.078748 -0.112033 vn 0.990653 0.118133 -0.068205 vn 0.990653 0.118132 -0.068203 vn 0.990653 0.118132 -0.068203 vn 0.990579 0.057648 -0.124214 vn 0.990579 0.078748 -0.112033 vn 0.990653 0.136408 0.000000 vn 0.990653 0.136407 0.000001 vn 0.990653 0.118132 -0.068203 vn 0.990653 0.118132 -0.068203 vn 0.990653 0.118133 -0.068205 vn 0.990653 0.136408 0.000000 vn 0.990653 0.136408 0.000000 vn 0.990579 0.112032 0.078752 vn 0.990579 0.124214 0.057648 vn 0.990579 0.124214 0.057648 vn 0.990653 0.136407 0.000001 vn 0.990653 0.136408 0.000000 vn 0.990579 0.112032 0.078752 vn 0.990579 0.057649 0.124214 vn 0.990579 0.078749 0.112034 vn 0.990579 0.078749 0.112034 vn 0.990579 0.124214 0.057648 vn 0.990579 0.112032 0.078752 vn 0.990579 0.057649 0.124214 vn 0.990580 -0.012183 0.136395 vn 0.990580 0.012182 0.136395 vn 0.990580 0.012182 0.136395 vn 0.990579 0.078749 0.112034 vn 0.990579 0.057649 0.124214 vn 0.990580 -0.012183 0.136395 vn 0.990580 -0.078747 0.112030 vn 0.990580 -0.057647 0.124213 vn 0.990580 -0.057647 0.124213 vn 0.990580 0.012182 0.136395 vn 0.990580 -0.012183 0.136395 vn 0.990580 -0.078747 0.112030 vn 0.990579 -0.124215 0.057645 vn 0.990580 -0.112031 0.078746 vn 0.990580 -0.112031 0.078746 vn 0.990580 -0.057647 0.124213 vn 0.990580 -0.078747 0.112030 vn 0.990579 -0.124215 0.057645 vn 0.990580 -0.136395 -0.012180 vn 0.990579 -0.136396 0.012184 vn 0.990579 -0.136396 0.012184 vn 0.990580 -0.112031 0.078746 vn 0.990579 -0.124215 0.057645 vn 0.990580 -0.136395 -0.012180 vn 0.990579 -0.112031 -0.078748 vn 0.990580 -0.124213 -0.057647 vn 0.990580 -0.124213 -0.057647 vn 0.990579 -0.136396 0.012184 vn 0.990580 -0.136395 -0.012180 vn -0.950406 0.130926 0.282110 vn -0.947510 0.082751 0.308832 vn -0.895153 0.115372 0.430571 vn -0.895153 0.115372 0.430571 vn -0.869389 0.233353 0.435557 vn -0.950406 0.130926 0.282110 vn -0.869389 0.233353 0.435557 vn -0.895153 0.115372 0.430571 vn -0.624264 0.202197 0.754593 vn -0.624264 0.202197 0.754593 vn -0.571901 0.399645 0.716389 vn -0.869389 0.233353 0.435557 vn 0.571894 0.420587 0.704303 vn 0.489242 0.225733 0.842429 vn 0.861981 0.131208 0.489666 vn 0.861981 0.131208 0.489666 vn 0.868652 0.284895 0.405313 vn 0.571894 0.420587 0.704303 vn 0.950407 0.130925 0.282108 vn 0.868652 0.284895 0.405313 vn 0.861981 0.131208 0.489666 vn 0.861981 0.131208 0.489666 vn 0.947510 0.082753 0.308832 vn 0.950407 0.130925 0.282108 vn -0.950403 0.309787 0.027667 vn -0.950405 0.254446 0.178853 vn -0.869389 0.419868 0.260524 vn -0.869389 0.419868 0.260524 vn -0.869390 0.493877 0.015687 vn -0.950403 0.309787 0.027667 vn -0.869390 0.493877 0.015687 vn -0.869389 0.419868 0.260524 vn -0.571889 0.704307 0.420587 vn -0.571889 0.704307 0.420587 vn -0.571892 0.820240 0.012091 vn -0.869390 0.493877 0.015687 vn 0.571893 0.820239 -0.012092 vn 0.571883 0.716398 0.399655 vn 0.868654 0.449383 0.208554 vn 0.868654 0.449383 0.208554 vn 0.868653 0.493456 -0.044071 vn 0.571893 0.820239 -0.012092 vn 0.950404 0.309784 0.027667 vn 0.868653 0.493456 -0.044071 vn 0.868654 0.449383 0.208554 vn 0.868654 0.449383 0.208554 vn 0.950406 0.254443 0.178851 vn 0.950404 0.309784 0.027667 vn -0.947510 -0.226082 -0.226079 vn -0.950408 -0.130927 -0.282106 vn -0.869388 -0.233356 -0.435556 vn -0.869388 -0.233356 -0.435556 vn -0.824631 -0.399988 -0.399991 vn -0.947510 -0.226082 -0.226079 vn -0.950408 -0.130927 -0.282106 vn -0.950408 0.027668 -0.309772 vn -0.869392 0.015691 -0.493874 vn -0.869392 0.015691 -0.493874 vn -0.869388 -0.233356 -0.435556 vn -0.950408 -0.130927 -0.282106 vn 0.947509 -0.226083 -0.226081 vn 0.861982 -0.358460 -0.358460 vn 0.868649 -0.284900 -0.405315 vn 0.868649 -0.284900 -0.405315 vn 0.950408 -0.130927 -0.282106 vn 0.947509 -0.226083 -0.226081 vn 0.950408 -0.130927 -0.282106 vn 0.868649 -0.284900 -0.405315 vn 0.868654 -0.044075 -0.493455 vn 0.868654 -0.044075 -0.493455 vn 0.950409 0.027668 -0.309770 vn 0.950408 -0.130927 -0.282106 vn 0.950409 0.027668 -0.309770 vn 0.868654 -0.044075 -0.493455 vn 0.868651 0.208561 -0.449385 vn 0.868651 0.208561 -0.449385 vn 0.950407 0.178846 -0.254441 vn 0.950409 0.027668 -0.309770 vn 0.950405 0.282113 -0.130927 vn 0.868652 0.405310 -0.284901 vn 0.868653 0.493456 -0.044071 vn 0.868653 0.493456 -0.044071 vn 0.950404 0.309784 0.027667 vn 0.950405 0.282113 -0.130927 vn 0.571898 0.704302 -0.420585 vn 0.571893 0.820239 -0.012092 vn 0.868653 0.493456 -0.044071 vn 0.868653 0.493456 -0.044071 vn 0.868652 0.405310 -0.284901 vn 0.571898 0.704302 -0.420585 vn -0.869391 0.435553 -0.233350 vn -0.869390 0.493877 0.015687 vn -0.571892 0.820240 0.012091 vn -0.571892 0.820240 0.012091 vn -0.571884 0.716396 -0.399656 vn -0.869391 0.435553 -0.233350 vn -0.950408 0.027668 -0.309772 vn -0.950406 0.178847 -0.254445 vn -0.869388 0.260524 -0.419872 vn -0.869388 0.260524 -0.419872 vn -0.869392 0.015691 -0.493874 vn -0.950408 0.027668 -0.309772 vn -0.950404 0.282116 -0.130929 vn -0.950403 0.309787 0.027667 vn -0.869390 0.493877 0.015687 vn -0.869390 0.493877 0.015687 vn -0.869391 0.435553 -0.233350 vn -0.950404 0.282116 -0.130929 vn 0.985852 0.166953 -0.014911 vn 0.968059 0.227428 0.105538 vn 0.974949 0.111202 0.192636 vn 0.974949 0.111202 0.192636 vn 0.991056 -0.000000 0.133449 vn 0.985852 0.166953 -0.014911 vn 0.885421 -0.000000 0.464789 vn 0.991056 -0.000000 0.133449 vn 0.974949 0.111202 0.192636 vn 0.974949 0.111202 0.192636 vn 0.804826 0.296732 0.514010 vn 0.885421 -0.000000 0.464789 vn 0.885421 -0.000000 0.464789 vn 0.847543 -0.250540 0.467868 vn 0.985851 -0.070557 0.152049 vn 0.985851 -0.070557 0.152049 vn 0.991056 -0.000000 0.133449 vn 0.885421 -0.000000 0.464789 vn 0.985853 0.137127 -0.096386 vn 0.985852 0.166953 -0.014911 vn 0.991056 -0.000000 0.133449 vn 0.991056 -0.000000 0.133449 vn 0.985851 -0.070557 0.152049 vn 0.985853 0.137127 -0.096386 vn 0.985851 0.070557 -0.152049 vn 0.985853 0.137127 -0.096386 vn 0.985851 -0.070557 0.152049 vn 0.985851 -0.070557 0.152049 vn 0.985852 -0.137134 0.096386 vn 0.985851 0.070557 -0.152049 vn 0.989636 -0.012774 -0.143028 vn 0.985851 0.070557 -0.152049 vn 0.985852 -0.137134 0.096386 vn 0.985852 -0.137134 0.096386 vn 0.979568 -0.200315 0.017889 vn 0.989636 -0.012774 -0.143028 vn 0.979572 -0.182413 -0.084647 vn 0.968051 -0.144189 -0.205151 vn 0.989636 -0.012774 -0.143028 vn 0.989636 -0.012774 -0.143028 vn 0.979568 -0.200315 0.017889 vn 0.979572 -0.182413 -0.084647 vn 0.847547 -0.279896 -0.450913 vn 0.847546 -0.016951 -0.530451 vn 0.989636 -0.012774 -0.143028 vn 0.989636 -0.012774 -0.143028 vn 0.968051 -0.144189 -0.205151 vn 0.847547 -0.279896 -0.450913 vn 0.847546 -0.016951 -0.530451 vn 0.847545 0.250523 -0.467873 vn 0.985851 0.070557 -0.152049 vn 0.985851 0.070557 -0.152049 vn 0.989636 -0.012774 -0.143028 vn 0.847546 -0.016951 -0.530451 vn 0.576377 -0.000000 0.817184 vn 0.885421 -0.000000 0.464789 vn 0.804826 0.296732 0.514010 vn 0.804826 0.296732 0.514010 vn 0.422312 0.453196 0.785026 vn 0.576377 -0.000000 0.817184 vn 0.576377 -0.000000 0.817184 vn 0.501504 -0.422652 0.754890 vn 0.847543 -0.250540 0.467868 vn 0.847543 -0.250540 0.467868 vn 0.885421 -0.000000 0.464789 vn 0.576377 -0.000000 0.817184 vn 0.501497 -0.442395 -0.743496 vn 0.501503 -0.011401 -0.865081 vn 0.847546 -0.016951 -0.530451 vn 0.847546 -0.016951 -0.530451 vn 0.847547 -0.279896 -0.450913 vn 0.501497 -0.442395 -0.743496 vn 0.257461 -0.406778 -0.876496 vn 0.257463 0.085958 -0.962457 vn 0.501503 -0.011401 -0.865081 vn 0.501503 -0.011401 -0.865081 vn 0.501497 -0.442395 -0.743496 vn 0.257461 -0.406778 -0.876496 vn 0.257463 0.085958 -0.962457 vn 0.257471 0.555638 -0.790554 vn 0.501508 0.422630 -0.754900 vn 0.501508 0.422630 -0.754900 vn 0.501503 -0.011401 -0.865081 vn 0.257463 0.085958 -0.962457 vn 0.944936 0.000001 -0.327255 vn 0.944936 0.000003 -0.327255 vn 0.944935 -0.163626 -0.283414 vn 0.944935 -0.163626 -0.283414 vn 0.944935 -0.163628 -0.283414 vn 0.944936 0.000001 -0.327255 vn 0.944936 0.000001 -0.327255 vn 0.944532 0.188860 -0.268683 vn 0.944533 0.138254 -0.297899 vn 0.944533 0.138254 -0.297899 vn 0.944936 0.000003 -0.327255 vn 0.944936 0.000001 -0.327255 vn 0.944533 0.138256 0.297897 vn 0.944532 -0.029216 0.327117 vn 0.944532 0.029217 0.327116 vn 0.944532 0.029217 0.327116 vn 0.944532 0.188861 0.268682 vn 0.944533 0.138256 0.297897 vn 0.944532 -0.029216 0.327117 vn 0.944532 -0.188858 0.268685 vn 0.944532 -0.138252 0.297901 vn 0.944532 -0.138252 0.297901 vn 0.944532 0.029217 0.327116 vn 0.944532 -0.029216 0.327117 vn 0.313732 -0.399715 -0.861278 vn 0.313725 0.084474 -0.945749 vn 0.313728 -0.084471 -0.945748 vn 0.313728 -0.084471 -0.945748 vn 0.313745 -0.546018 -0.776807 vn 0.313732 -0.399715 -0.861278 vn 0.313725 0.084474 -0.945749 vn 0.313734 0.546024 -0.776807 vn 0.313721 0.399726 -0.861277 vn 0.313721 0.399726 -0.861277 vn 0.313728 -0.084471 -0.945748 vn 0.313725 0.084474 -0.945749 vn 0.313724 -0.084465 0.945750 vn 0.313743 -0.546015 0.776810 vn 0.313727 -0.399713 0.861281 vn 0.313727 -0.399713 0.861281 vn 0.313721 0.084469 0.945750 vn 0.313724 -0.084465 0.945750 vn -0.495828 -0.868401 -0.005885 vn -0.495825 -0.749119 -0.439293 vn -0.253209 -0.836488 -0.485977 vn -0.253209 -0.836488 -0.485977 vn -0.253207 -0.967409 -0.002630 vn -0.495828 -0.868401 -0.005885 vn 0.253208 -0.967408 0.002630 vn 0.253202 -0.839114 -0.481431 vn 0.512772 -0.760719 -0.397958 vn 0.512772 -0.760719 -0.397958 vn 0.494350 -0.865817 0.077326 vn 0.253208 -0.967408 0.002630 vn 0.609529 0.333728 0.719097 vn 0.609522 0.455887 0.648575 vn 0.555150 -0.008788 0.831704 vn 0.555150 -0.008788 0.831704 vn 0.609528 -0.070528 0.789621 vn 0.609529 0.333728 0.719097 vn 0.359112 -0.241557 0.901493 vn 0.309938 -0.582026 0.751787 vn 0.494353 -0.365936 0.788483 vn 0.494353 -0.365936 0.788483 vn 0.555150 -0.008788 0.831704 vn 0.359112 -0.241557 0.901493 vn 0.609528 -0.070528 0.789621 vn 0.555150 -0.008788 0.831704 vn 0.494353 -0.365936 0.788483 vn 0.494353 -0.365936 0.788483 vn 0.609525 -0.455884 0.648574 vn 0.609528 -0.070528 0.789621 vn 0.309938 -0.582026 0.751787 vn 0.253206 -0.836489 0.485977 vn 0.494352 -0.711151 0.499881 vn 0.494352 -0.711151 0.499881 vn 0.494353 -0.365936 0.788483 vn 0.309938 -0.582026 0.751787 vn 0.253206 -0.836489 0.485977 vn 0.253208 -0.967408 0.002630 vn 0.494350 -0.865817 0.077326 vn 0.494350 -0.865817 0.077326 vn 0.494352 -0.711151 0.499881 vn 0.253206 -0.836489 0.485977 vn 0.609520 -0.719103 0.333731 vn 0.494352 -0.711151 0.499881 vn 0.494350 -0.865817 0.077326 vn 0.494350 -0.865817 0.077326 vn 0.609517 -0.789630 -0.070523 vn 0.609520 -0.719103 0.333731 vn 0.611050 -0.395792 -0.685542 vn 0.470717 -0.483754 -0.737840 vn 0.494351 -0.077332 -0.865816 vn 0.494351 -0.077332 -0.865816 vn 0.609535 0.070523 -0.789616 vn 0.611050 -0.395792 -0.685542 vn 0.253205 -0.485976 -0.836490 vn 0.253206 -0.002627 -0.967409 vn 0.494351 -0.077332 -0.865816 vn 0.494351 -0.077332 -0.865816 vn 0.470717 -0.483754 -0.737840 vn 0.253205 -0.485976 -0.836490 vn 0.609535 0.070523 -0.789616 vn 0.494351 -0.077332 -0.865816 vn 0.494350 0.365937 -0.788485 vn 0.494350 0.365937 -0.788485 vn 0.609521 0.455887 -0.648576 vn 0.609535 0.070523 -0.789616 vn 0.253206 -0.002627 -0.967409 vn 0.253211 0.481425 -0.839115 vn 0.494350 0.365937 -0.788485 vn 0.494350 0.365937 -0.788485 vn 0.494351 -0.077332 -0.865816 vn 0.253206 -0.002627 -0.967409 vn -0.492000 -0.124204 0.861690 vn -0.495831 -0.439293 0.749115 vn -0.276655 -0.528532 0.802568 vn -0.276655 -0.528532 0.802568 vn -0.359111 -0.241557 0.901493 vn -0.492000 -0.124204 0.861690 vn -0.495831 -0.439293 0.749115 vn -0.495831 -0.754999 0.429102 vn -0.253204 -0.839114 0.481430 vn -0.253204 -0.839114 0.481430 vn -0.276655 -0.528532 0.802568 vn -0.495831 -0.439293 0.749115 vn -0.495831 -0.754999 0.429102 vn -0.495828 -0.868401 -0.005885 vn -0.253207 -0.967409 -0.002630 vn -0.253207 -0.967409 -0.002630 vn -0.253204 -0.839114 0.481430 vn -0.495831 -0.754999 0.429102 vn -0.495823 -0.429103 -0.755003 vn -0.495828 0.005883 -0.868401 vn -0.253205 0.002624 -0.967409 vn -0.253205 0.002624 -0.967409 vn -0.253215 -0.481421 -0.839116 vn -0.495823 -0.429103 -0.755003 vn -0.495828 0.005883 -0.868401 vn -0.495833 0.439294 -0.749114 vn -0.253204 0.485976 -0.836490 vn -0.253204 0.485976 -0.836490 vn -0.253205 0.002624 -0.967409 vn -0.495828 0.005883 -0.868401 vn -0.611052 -0.000002 0.791590 vn -0.492000 -0.124204 0.861690 vn -0.611048 0.395794 0.685542 vn -0.611048 0.395794 0.685542 vn -0.611054 0.395787 0.685541 vn -0.611052 -0.000002 0.791590 vn -0.611052 -0.000002 0.791590 vn -0.609527 -0.455884 0.648573 vn -0.495831 -0.439293 0.749115 vn -0.495831 -0.439293 0.749115 vn -0.492000 -0.124204 0.861690 vn -0.611052 -0.000002 0.791590 vn -0.609522 -0.719101 0.333731 vn -0.609519 -0.789628 -0.070523 vn -0.495828 -0.868401 -0.005885 vn -0.495828 -0.868401 -0.005885 vn -0.495831 -0.754999 0.429102 vn -0.609522 -0.719101 0.333731 vn -0.609538 -0.333723 -0.719092 vn -0.609538 0.070523 -0.789614 vn -0.495828 0.005883 -0.868401 vn -0.495828 0.005883 -0.868401 vn -0.495823 -0.429103 -0.755003 vn -0.609538 -0.333723 -0.719092 vn -0.609538 0.070523 -0.789614 vn -0.609523 0.455886 -0.648575 vn -0.495833 0.439294 -0.749114 vn -0.495833 0.439294 -0.749114 vn -0.495828 0.005883 -0.868401 vn -0.609538 0.070523 -0.789614 vn -0.314854 0.000001 -0.949140 vn -0.314852 0.000002 -0.949141 vn -0.314867 -0.474562 -0.821979 vn -0.314867 -0.474562 -0.821979 vn -0.314863 -0.474567 -0.821978 vn -0.314854 0.000001 -0.949140 vn -0.314854 0.000001 -0.949140 vn -0.313737 0.546023 -0.776806 vn -0.313723 0.399718 -0.861280 vn -0.313723 0.399718 -0.861280 vn -0.314852 0.000002 -0.949141 vn -0.314854 0.000001 -0.949140 vn -0.313726 -0.084468 0.945749 vn -0.313746 -0.546014 0.776809 vn -0.313729 -0.399706 0.861283 vn -0.313729 -0.399706 0.861283 vn -0.313723 0.084469 0.945750 vn -0.313726 -0.084468 0.945749 vn -0.944936 0.000001 -0.327256 vn -0.944936 0.000000 -0.327255 vn -0.944935 -0.163626 -0.283415 vn -0.944935 -0.163626 -0.283415 vn -0.944935 -0.163624 -0.283416 vn -0.944936 0.000001 -0.327256 vn -0.944936 0.000001 -0.327256 vn -0.944532 0.188860 -0.268684 vn -0.944533 0.138256 -0.297898 vn -0.944533 0.138256 -0.297898 vn -0.944936 0.000000 -0.327255 vn -0.944936 0.000001 -0.327256 vn -0.944533 0.138252 0.297900 vn -0.944532 -0.029214 0.327117 vn -0.944532 0.029218 0.327117 vn -0.944532 0.029218 0.327117 vn -0.944533 0.188858 0.268682 vn -0.944533 0.138252 0.297900 vn -0.944532 -0.029214 0.327117 vn -0.944532 -0.188859 0.268685 vn -0.944532 -0.138253 0.297900 vn -0.944532 -0.138253 0.297900 vn -0.944532 0.029218 0.327117 vn -0.944532 -0.029214 0.327117 vn -0.501504 0.011393 -0.865080 vn -0.501504 0.442382 -0.743500 vn -0.257479 0.406771 -0.876494 vn -0.257479 0.406771 -0.876494 vn -0.257464 -0.085973 -0.962456 vn -0.501504 0.011393 -0.865080 vn -0.804832 -0.000000 0.593503 vn -0.422313 -0.000003 0.906450 vn -0.576382 0.408556 0.707718 vn -0.576382 0.408556 0.707718 vn -0.885418 0.232376 0.402537 vn -0.804832 -0.000000 0.593503 vn -0.804832 -0.000000 0.593503 vn -0.847546 -0.279898 0.450914 vn -0.501501 -0.442400 0.743491 vn -0.501501 -0.442400 0.743491 vn -0.422313 -0.000003 0.906450 vn -0.804832 -0.000000 0.593503 vn -0.847546 0.016951 -0.530451 vn -0.847545 0.279881 -0.450925 vn -0.501504 0.442382 -0.743500 vn -0.501504 0.442382 -0.743500 vn -0.501504 0.011393 -0.865080 vn -0.847546 0.016951 -0.530451 vn -0.985961 -0.000000 0.166975 vn -0.804832 -0.000000 0.593503 vn -0.885418 0.232376 0.402537 vn -0.885418 0.232376 0.402537 vn -0.974949 0.111197 0.192637 vn -0.985961 -0.000000 0.166975 vn -0.985961 -0.000000 0.166975 vn -0.985850 -0.096387 0.137144 vn -0.847546 -0.279898 0.450914 vn -0.847546 -0.279898 0.450914 vn -0.804832 -0.000000 0.593503 vn -0.985961 -0.000000 0.166975 vn -0.979570 -0.084649 -0.182418 vn -0.985851 0.014911 -0.166957 vn -0.847546 0.016951 -0.530451 vn -0.847546 0.016951 -0.530451 vn -0.847543 -0.250540 -0.467868 vn -0.979570 -0.084649 -0.182418 vn -0.985851 0.014911 -0.166957 vn -0.985851 0.096382 -0.137141 vn -0.847545 0.279881 -0.450925 vn -0.847545 0.279881 -0.450925 vn -0.847546 0.016951 -0.530451 vn -0.985851 0.014911 -0.166957 vn -0.985961 -0.000000 0.166975 vn -0.974949 0.111197 0.192637 vn -0.979573 0.164513 0.115639 vn -0.979573 0.164513 0.115639 vn -0.979572 0.200298 0.017888 vn -0.985961 -0.000000 0.166975 vn -0.985961 -0.000000 0.166975 vn -0.979572 0.200298 0.017888 vn -0.985854 0.152034 -0.070550 vn -0.985854 0.152034 -0.070550 vn -0.985850 -0.096387 0.137144 vn -0.985961 -0.000000 0.166975 vn -0.985850 -0.096387 0.137144 vn -0.985854 0.152034 -0.070550 vn -0.985851 0.096382 -0.137141 vn -0.985851 0.096382 -0.137141 vn -0.985852 -0.152044 0.070555 vn -0.985850 -0.096387 0.137144 vn -0.985852 -0.152044 0.070555 vn -0.985851 0.096382 -0.137141 vn -0.985851 0.014911 -0.166957 vn -0.985851 0.014911 -0.166957 vn -0.985850 -0.166966 -0.014912 vn -0.985852 -0.152044 0.070555 vn -0.985850 -0.166966 -0.014912 vn -0.985851 0.014911 -0.166957 vn -0.979570 -0.084649 -0.182418 vn -0.979570 -0.084649 -0.182418 vn -0.968054 -0.205143 -0.144183 vn -0.985850 -0.166966 -0.014912 vn -0.004382 0.099255 0.995052 vn -0.004381 0.099255 0.995052 vn -0.004475 0.147666 0.989027 vn -0.004475 0.147666 0.989027 vn -0.004553 0.195837 0.980626 vn -0.004382 0.099255 0.995052 vn -0.003815 -0.127425 0.991841 vn -0.003634 -0.184745 0.982780 vn -0.003979 -0.069871 0.997548 vn -0.003979 -0.069871 0.997548 vn -0.003979 -0.069872 0.997548 vn -0.003815 -0.127425 0.991841 vn 0.999999 -0.000363 0.001464 vn 0.999999 -0.000363 0.001463 vn 0.999999 -0.000283 0.001476 vn 0.999999 -0.000283 0.001476 vn 0.999999 -0.000199 0.001513 vn 0.999999 -0.000363 0.001464 vn -0.999999 0.000366 -0.001471 vn -0.999999 0.000200 -0.001519 vn -0.999999 0.000285 -0.001483 vn -0.999999 0.000285 -0.001483 vn -0.999999 0.000366 -0.001471 vn -0.999999 0.000366 -0.001471 vn -0.002602 -0.450380 0.892833 vn -0.002599 -0.450380 0.892833 vn -0.002928 -0.375103 0.926979 vn -0.002928 -0.375103 0.926979 vn -0.002930 -0.375099 0.926980 vn -0.002602 -0.450380 0.892833 vn -0.002602 -0.450380 0.892833 vn -0.002263 -0.522582 0.852586 vn -0.002259 -0.522579 0.852588 vn -0.002259 -0.522579 0.852588 vn -0.002599 -0.450380 0.892833 vn -0.002602 -0.450380 0.892833 vn -1.000000 -0.000000 0.000001 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 -0.000002 vn -1.000000 0.000000 -0.000002 vn -1.000000 -0.000000 -0.000001 vn -1.000000 -0.000000 0.000001 vn -1.000000 0.000000 -0.000003 vn -1.000000 -0.000000 -0.000001 vn -1.000000 0.000000 -0.000002 vn -1.000000 0.000000 -0.000002 vn -1.000000 0.000001 -0.000005 vn -1.000000 0.000000 -0.000003 vn -1.000000 -0.000000 0.000001 vn -1.000000 -0.000000 -0.000001 vn -1.000000 -0.000000 0.000001 vn -1.000000 -0.000000 0.000001 vn -1.000000 -0.000000 0.000001 vn -1.000000 -0.000000 0.000001 vn -1.000000 -0.000000 0.000001 vn -1.000000 -0.000000 0.000001 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000001 vn -1.000000 -0.000000 0.000001 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000001 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn 1.000000 0.000000 -0.000001 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000001 vn -0.999999 -0.001115 0.000212 vn -1.000000 -0.000000 0.000000 vn -1.000000 0.000229 -0.000361 vn -1.000000 0.000229 -0.000361 vn -1.000000 -0.000000 0.000000 vn -0.999999 -0.001115 0.000212 vn -0.000000 -0.001069 -0.999999 vn 0.000002 -0.002136 -0.999998 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn -0.000000 -0.001069 -0.999999 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 -0.000230 0.000364 vn 1.000000 0.000000 -0.000001 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000002 vn 1.000000 0.000000 -0.000001 vn 1.000000 0.000013 -0.000070 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 0.000013 -0.000070 vn -0.715905 0.490013 0.497360 vn -0.585117 0.449199 -0.675173 s off usemtl Chassis f 1//1 2//2 3//3 f 4//4 5//5 6//6 f 7//7 8//8 9//9 usemtl Window f 10//10 11//11 12//12 f 13//13 14//14 15//15 usemtl Chassis f 16//16 17//17 18//18 f 19//19 17//20 20//21 f 21//22 22//23 23//24 f 24//25 25//26 26//27 f 27//28 28//29 26//30 f 29//31 30//32 31//33 f 32//34 33//35 34//36 f 35//37 36//38 37//39 f 38//40 39//41 40//42 f 40//43 41//44 38//45 f 41//46 40//47 42//48 f 42//49 43//50 41//51 f 44//52 45//53 41//54 f 41//55 43//56 44//57 f 45//58 1//59 38//60 f 38//61 41//62 45//63 f 46//64 47//65 48//66 f 48//67 49//68 46//69 f 2//70 46//71 49//72 f 49//73 50//74 2//75 f 49//76 51//77 52//78 f 52//79 50//80 49//81 f 48//82 53//83 51//84 f 51//85 49//86 48//87 f 1//88 3//89 54//90 f 54//91 38//92 1//93 f 3//94 2//95 50//96 f 50//97 54//98 3//99 f 55//100 56//101 57//102 f 57//103 58//104 55//105 f 55//106 59//107 60//108 f 60//109 61//110 55//111 f 62//112 61//113 60//114 f 60//115 63//116 62//117 f 64//118 65//119 66//120 f 66//121 67//122 64//123 f 64//124 67//125 60//126 f 60//127 59//128 64//129 f 68//130 69//131 70//132 f 70//133 71//134 68//135 f 68//136 71//137 66//138 f 66//139 65//140 68//141 f 68//142 65//143 72//144 f 72//145 69//146 68//147 usemtl Hull f 73//148 74//149 75//150 f 75//151 76//152 73//153 f 77//154 78//155 79//156 f 79//157 80//158 77//159 f 78//160 81//161 82//162 f 82//163 79//164 78//165 usemtl Chassis f 83//166 35//167 37//168 f 37//169 84//170 83//171 f 85//172 83//173 84//174 f 84//175 86//176 85//177 f 84//178 37//179 87//180 f 87//181 88//182 84//183 f 89//184 86//185 84//186 f 84//187 88//188 89//189 f 89//190 88//191 90//192 f 90//193 91//194 89//195 f 88//196 87//197 92//198 f 92//199 90//200 88//201 f 91//202 90//203 93//204 f 93//205 94//206 91//207 f 90//208 92//209 95//210 f 95//211 93//212 90//213 f 96//214 94//215 93//216 f 93//217 97//218 96//219 f 93//220 95//221 98//222 f 98//223 97//224 93//225 f 50//226 52//227 99//228 f 99//229 54//230 50//231 f 54//232 99//233 39//234 f 39//235 38//236 54//237 s 80 f 100//238 101//239 102//240 f 102//240 103//241 100//238 f 102//240 101//239 104//242 s off f 104//243 105//244 102//245 s 80 f 6//246 106//247 101//239 f 101//239 100//238 6//246 f 101//239 106//247 107//248 f 107//248 104//242 101//239 f 5//249 108//250 106//247 f 106//247 6//246 5//249 f 106//247 108//250 109//251 f 109//251 107//248 106//247 f 108//250 110//252 111//253 f 111//253 109//251 108//250 f 4//254 110//252 108//250 f 108//250 5//249 4//254 f 110//252 112//255 113//256 f 113//256 111//253 110//252 f 114//257 112//255 110//252 f 110//252 4//254 114//257 f 112//255 115//258 116//259 f 116//259 113//256 112//255 f 117//260 115//258 112//255 f 112//255 114//257 117//260 s off f 118//261 119//262 120//263 f 120//264 33//265 118//266 f 119//267 121//268 122//269 f 122//270 120//271 119//272 f 119//273 123//274 124//275 f 124//276 121//277 119//278 f 125//279 123//280 119//281 f 119//282 118//283 125//284 f 125//285 118//286 126//287 f 126//288 127//289 125//290 f 126//291 118//292 33//293 f 33//294 32//295 126//296 f 121//297 128//298 129//299 f 129//300 122//301 121//302 f 121//303 124//304 130//305 f 130//306 128//307 121//308 f 128//309 131//310 132//311 f 132//312 129//313 128//314 f 133//315 131//316 128//317 f 128//318 130//319 133//320 f 134//321 135//322 136//323 f 136//324 28//325 134//326 f 135//327 137//328 24//329 f 24//330 136//331 135//332 f 135//333 31//334 30//335 f 30//336 137//337 135//338 f 29//339 31//340 135//341 f 135//342 134//343 29//344 f 29//345 134//346 138//347 f 138//348 139//349 29//350 f 138//351 134//352 28//353 f 28//354 27//355 138//356 f 137//357 140//358 25//359 f 25//360 24//361 137//362 f 141//363 140//364 137//365 f 137//366 30//367 141//368 f 7//369 142//370 143//371 f 143//371 8//372 7//369 f 8//372 143//371 144//373 f 144//373 9//374 8//372 f 143//371 145//375 146//376 f 146//376 144//373 143//371 f 142//370 147//377 145//375 f 145//375 143//371 142//370 f 148//378 149//379 150//380 f 150//381 151//382 148//383 f 152//384 148//383 151//382 f 151//382 153//385 152//384 f 151//382 150//381 147//377 f 147//377 142//370 151//382 f 153//385 151//382 142//370 f 142//370 7//369 153//385 f 9//374 144//373 154//386 f 154//386 155//387 9//374 f 144//373 146//376 156//388 f 156//388 154//386 144//373 f 154//386 156//388 157//389 f 157//389 158//390 154//386 f 155//387 154//386 158//390 f 158//390 159//391 155//387 usemtl Window f 160//392 161//393 12//394 f 162//395 160//396 12//397 f 163//398 162//399 12//400 f 11//401 163//402 12//403 f 164//404 165//405 166//406 f 166//407 167//408 164//409 f 168//410 169//411 166//412 f 166//413 165//414 168//415 f 169//416 170//417 171//418 f 171//419 166//420 169//421 f 170//422 172//423 173//424 f 173//425 171//426 170//427 f 174//428 173//429 175//430 f 175//431 176//432 174//433 f 172//434 177//435 175//436 f 175//437 173//438 172//439 f 11//440 164//441 167//442 f 167//443 163//444 11//445 f 160//446 174//447 176//448 f 176//449 161//450 160//451 f 168//452 178//453 170//454 f 170//455 169//456 168//457 f 170//458 178//459 177//460 f 177//461 172//462 170//463 f 15//464 180//465 179//466 f 15//467 179//468 181//469 f 15//470 181//471 182//472 f 15//473 182//474 13//475 f 183//476 184//477 185//478 f 185//479 186//480 183//481 f 186//482 185//483 187//484 f 187//485 188//486 186//487 f 189//488 13//489 182//490 f 182//491 190//492 189//493 f 191//494 189//495 190//496 f 190//497 192//498 191//499 f 193//500 191//501 192//502 f 192//503 194//504 193//505 f 194//506 192//507 184//508 f 184//509 183//510 194//511 usemtl Chassis f 195//512 196//513 197//514 f 197//515 198//516 195//517 f 196//518 199//519 200//520 f 200//521 197//522 196//523 f 199//524 201//525 202//526 f 202//527 200//528 199//529 f 201//530 203//531 204//532 f 204//533 202//534 201//535 f 203//536 205//537 206//538 f 206//539 204//540 203//541 f 205//542 207//543 208//544 f 208//545 206//546 205//547 f 207//548 209//549 210//550 f 210//551 208//552 207//553 f 209//554 211//555 212//556 f 212//557 210//558 209//559 f 211//560 213//561 214//562 f 214//563 212//564 211//565 f 213//566 215//567 216//568 f 216//569 214//570 213//571 usemtl Rim f 217//572 214//573 216//574 f 216//575 218//576 217//577 usemtl Chassis f 219//578 220//579 196//580 f 196//581 195//582 219//583 f 220//584 221//585 199//586 f 199//587 196//588 220//589 f 221//590 222//591 201//592 f 201//593 199//594 221//595 f 222//596 223//597 203//598 f 203//599 201//600 222//601 f 224//602 225//603 209//604 f 209//605 207//606 224//607 f 225//608 226//609 211//610 f 211//611 209//612 225//613 f 226//614 227//615 213//616 f 213//617 211//618 226//619 f 227//620 228//621 215//622 f 215//623 213//624 227//625 f 229//626 230//627 220//628 f 220//629 219//630 229//631 f 230//632 231//633 221//634 f 221//635 220//636 230//637 f 231//638 232//639 222//640 f 222//641 221//642 231//643 f 232//644 233//645 223//646 f 223//647 222//648 232//649 f 233//650 234//651 235//652 f 235//653 223//654 233//655 f 234//656 236//657 224//658 f 224//659 235//660 234//661 f 236//662 237//663 225//664 f 225//665 224//666 236//667 f 237//668 238//669 226//670 f 226//671 225//672 237//673 f 238//674 239//675 227//676 f 227//677 226//678 238//679 f 239//680 240//681 228//682 f 228//683 227//684 239//685 f 241//686 242//687 243//688 f 243//689 244//690 241//691 f 242//692 245//693 246//694 f 246//695 243//696 242//697 f 245//698 247//699 248//700 f 248//701 246//702 245//703 f 247//704 249//705 250//706 f 250//707 248//708 247//709 f 249//710 251//711 252//712 f 252//713 250//714 249//715 f 251//716 253//717 254//718 f 254//719 252//720 251//721 f 253//722 255//723 256//724 f 256//725 254//726 253//727 f 255//728 257//729 258//730 f 258//731 256//732 255//733 f 257//734 259//735 260//736 f 260//737 258//738 257//739 f 259//740 261//741 262//742 f 262//743 260//744 259//745 f 263//746 264//747 242//748 f 242//749 241//750 263//751 f 264//752 265//753 245//754 f 245//755 242//756 264//757 f 265//758 266//759 247//760 f 247//761 245//762 265//763 f 266//764 267//765 249//766 f 249//767 247//768 266//769 f 268//770 269//771 255//772 f 255//773 253//774 268//775 f 269//776 270//777 257//778 f 257//779 255//780 269//781 f 270//782 271//783 259//784 f 259//785 257//786 270//787 f 271//788 272//789 261//790 f 261//791 259//792 271//793 f 273//794 274//795 264//796 f 264//797 263//798 273//799 f 274//800 275//801 265//802 f 265//803 264//804 274//805 f 275//806 276//807 266//808 f 266//809 265//810 275//811 f 276//812 277//813 267//814 f 267//815 266//816 276//817 f 277//818 278//819 279//820 f 279//821 267//822 277//823 f 278//824 280//825 268//826 f 268//827 279//828 278//829 f 280//830 281//831 269//832 f 269//833 268//834 280//835 f 281//836 282//837 270//838 f 270//839 269//840 281//841 f 282//842 283//843 271//844 f 271//845 270//846 282//847 f 283//848 284//849 272//850 f 272//851 271//852 283//853 usemtl Rim f 285//854 286//855 284//856 f 284//857 283//858 285//859 usemtl Hull f 217//860 218//861 287//862 f 287//863 288//864 217//865 f 218//866 289//867 290//868 f 290//869 287//870 218//871 f 291//872 292//873 293//874 f 293//875 294//876 291//877 f 294//878 293//879 295//880 f 295//881 296//882 294//883 f 297//884 298//885 286//886 f 286//887 285//888 297//889 f 298//890 299//891 300//892 f 300//893 286//894 298//895 f 301//896 217//897 288//898 f 288//899 302//900 301//901 f 303//902 291//903 294//904 f 294//905 304//906 303//907 f 304//908 294//909 296//910 f 296//911 305//912 304//913 f 306//914 297//915 285//916 f 285//917 307//918 306//919 f 308//920 309//921 310//922 f 310//923 311//924 308//925 f 309//926 312//927 313//928 f 313//929 310//930 309//931 f 314//932 315//933 316//934 f 316//935 317//936 314//937 f 315//938 318//939 319//940 f 319//941 316//942 315//943 f 318//944 320//945 321//946 f 321//947 319//948 318//949 f 320//950 322//951 323//952 f 323//953 321//954 320//955 f 322//956 306//957 307//958 f 307//959 323//960 322//961 f 324//962 325//963 326//964 f 326//965 327//966 324//967 f 325//968 304//969 305//970 f 305//971 326//972 325//973 f 328//974 329//975 325//976 f 325//977 324//978 328//979 f 329//980 303//981 304//982 f 304//983 325//984 329//985 f 312//986 330//987 331//988 f 331//989 313//990 312//991 f 330//992 332//993 333//994 f 333//995 331//996 330//997 f 332//998 301//999 302//1000 f 302//1001 333//1002 332//1003 usemtl Chassis f 334//1004 335//1005 336//1006 f 336//1007 337//1008 334//1009 f 335//1010 338//1011 339//1012 f 339//1013 336//1014 335//1015 f 338//1016 340//1017 341//1018 f 341//1019 339//1020 338//1021 f 340//1022 342//1023 343//1024 f 343//1025 341//1026 340//1027 f 344//1028 345//1029 346//1030 f 346//1031 347//1032 344//1033 f 345//1034 348//1035 349//1036 f 349//1037 346//1038 345//1039 f 348//1040 350//1041 351//1042 f 351//1043 349//1044 348//1045 f 350//1046 352//1047 353//1048 f 353//1049 351//1050 350//1051 f 354//1052 355//1053 335//1054 f 335//1055 334//1056 354//1057 f 355//1058 356//1059 338//1060 f 338//1061 335//1062 355//1063 f 356//1064 357//1065 340//1066 f 340//1067 338//1068 356//1069 f 357//1070 358//1071 342//1072 f 342//1073 340//1074 357//1075 f 359//1076 360//1077 344//1078 f 344//1079 361//1080 359//1081 f 360//1082 362//1083 345//1084 f 345//1085 344//1086 360//1087 f 362//1088 363//1089 348//1090 f 348//1091 345//1092 362//1093 f 363//1094 364//1095 350//1096 f 350//1097 348//1098 363//1099 f 364//1100 365//1101 352//1102 f 352//1103 350//1104 364//1105 f 366//1106 367//1107 365//1108 f 365//1109 368//1110 366//1111 f 366//1112 369//1113 354//1114 f 354//1115 367//1116 366//1117 f 369//1118 370//1119 355//1120 f 355//1121 354//1122 369//1123 f 370//1124 371//1125 356//1126 f 356//1127 355//1128 370//1129 f 371//1130 372//1131 357//1132 f 357//1133 356//1134 371//1135 f 372//1136 373//1137 358//1138 f 358//1139 357//1140 372//1141 f 374//1142 375//1143 362//1144 f 362//1145 360//1146 374//1147 f 375//1148 376//1149 363//1150 f 363//1151 362//1152 375//1153 f 376//1154 377//1155 364//1156 f 364//1157 363//1158 376//1159 f 377//1160 368//1161 365//1162 f 365//1163 364//1164 377//1165 usemtl Rim f 378//1166 379//1167 370//1168 f 370//1169 369//1170 378//1171 f 379//1172 380//1173 371//1174 f 371//1175 370//1176 379//1177 f 380//1178 381//1179 372//1180 f 372//1181 371//1182 380//1183 f 381//1184 382//1185 373//1186 f 373//1187 372//1188 381//1189 usemtl Spoke f 383//1190 384//1191 375//1192 f 375//1193 374//1194 383//1195 usemtl Rim f 384//1196 385//1197 376//1198 f 376//1199 375//1200 384//1201 f 385//1202 386//1203 377//1204 f 377//1205 376//1206 385//1207 f 386//1208 387//1209 368//1210 f 368//1211 377//1212 386//1213 usemtl Hull f 388//1214 389//1215 379//1216 f 379//1217 378//1218 388//1219 f 389//1220 390//1221 380//1222 f 380//1223 379//1224 389//1225 f 390//1226 391//1227 381//1228 f 381//1229 380//1230 390//1231 f 392//1232 382//1233 381//1234 f 381//1235 391//1236 392//1237 f 393//1238 394//1239 384//1240 f 384//1241 383//1242 393//1243 f 394//1244 395//1245 385//1246 f 385//1247 384//1248 394//1249 f 395//1250 396//1251 386//1252 f 386//1253 385//1254 395//1255 f 396//1256 397//1257 387//1258 f 387//1259 386//1260 396//1261 usemtl Chassis f 398//1262 399//1263 400//1264 f 400//1265 401//1266 398//1267 f 399//1268 402//1269 403//1270 f 403//1271 400//1272 399//1273 f 401//1274 400//1275 404//1276 f 404//1277 405//1278 401//1279 f 400//1280 403//1281 406//1282 f 406//1283 404//1284 400//1285 f 405//1286 404//1287 407//1288 f 407//1289 408//1290 405//1291 f 404//1292 406//1293 409//1294 f 409//1295 407//1296 404//1297 usemtl Rim f 408//1298 407//1299 410//1300 f 410//1301 411//1302 408//1303 f 407//1304 409//1305 412//1306 f 412//1307 410//1308 407//1309 usemtl Hull f 411//1310 410//1311 413//1312 f 413//1313 414//1314 411//1315 f 410//1316 412//1317 415//1318 f 415//1319 413//1320 410//1321 f 416//1322 417//1323 418//1324 f 418//1325 419//1326 416//1327 f 417//1328 420//1329 421//1330 f 421//1331 418//1332 417//1333 f 419//1334 418//1335 422//1336 f 422//1337 423//1338 419//1339 f 418//1340 421//1341 424//1342 f 424//1343 422//1344 418//1345 f 393//1346 425//1347 426//1348 f 426//1349 394//1350 393//1351 f 394//1352 426//1353 427//1354 f 427//1355 395//1356 394//1357 f 395//1358 427//1359 428//1360 f 428//1361 396//1362 395//1363 f 396//1364 428//1365 429//1366 f 429//1367 397//1368 396//1369 f 430//1370 431//1371 432//1372 f 432//1373 433//1374 430//1375 f 431//1376 419//1377 423//1378 f 423//1379 432//1380 431//1381 f 434//1382 435//1383 431//1384 f 431//1385 430//1386 434//1387 f 435//1388 416//1389 419//1390 f 419//1391 431//1392 435//1393 f 436//1394 437//1395 438//1396 f 438//1397 439//1398 436//1399 f 437//1400 440//1401 441//1402 f 441//1403 438//1404 437//1405 f 440//1406 442//1407 443//1408 f 443//1409 441//1410 440//1411 f 442//1412 444//1413 445//1414 f 445//1415 443//1416 442//1417 f 446//1418 447//1419 448//1420 f 448//1421 449//1422 446//1423 f 447//1424 411//1425 414//1426 f 414//1427 448//1428 447//1429 f 450//1430 451//1431 437//1432 f 437//1433 436//1434 450//1435 f 451//1436 452//1437 440//1438 f 440//1439 437//1440 451//1441 f 452//1442 453//1443 442//1444 f 442//1445 440//1446 452//1447 f 453//1448 454//1449 444//1450 f 444//1451 442//1452 453//1453 usemtl Rim f 455//1454 456//1455 447//1456 f 447//1457 446//1458 455//1459 f 456//1460 408//1461 411//1462 f 411//1463 447//1464 456//1465 usemtl Spoke f 457//1466 458//1467 451//1468 f 451//1469 450//1470 457//1471 usemtl Rim f 458//1472 459//1473 452//1474 f 452//1475 451//1476 458//1477 f 459//1478 460//1479 453//1480 f 453//1481 452//1482 459//1483 f 460//1484 461//1485 454//1486 f 454//1487 453//1488 460//1489 usemtl Chassis f 462//1490 463//1491 461//1492 f 461//1493 464//1494 462//1495 f 462//1496 465//1497 455//1498 f 455//1499 463//1500 462//1501 f 465//1502 466//1503 456//1504 f 456//1505 455//1506 465//1507 f 466//1508 405//1509 408//1510 f 408//1511 456//1512 466//1513 f 406//1514 467//1515 468//1516 f 468//1517 409//1518 406//1519 f 469//1520 470//1521 458//1522 f 458//1523 457//1524 469//1525 f 470//1526 471//1527 459//1528 f 459//1529 458//1530 470//1531 f 471//1532 472//1533 460//1534 f 460//1535 459//1536 471//1537 f 472//1538 464//1539 461//1540 f 461//1541 460//1542 472//1543 f 473//1544 474//1545 466//1546 f 466//1547 465//1548 473//1549 f 474//1550 401//1551 405//1552 f 405//1553 466//1554 474//1555 f 403//1556 475//1557 467//1558 f 467//1559 406//1560 403//1561 f 476//1562 477//1563 470//1564 f 470//1565 469//1566 476//1567 f 477//1568 478//1569 471//1570 f 471//1571 470//1572 477//1573 f 478//1574 479//1575 472//1576 f 472//1577 471//1578 478//1579 f 479//1580 480//1581 464//1582 f 464//1583 472//1584 479//1585 f 481//1586 482//1587 474//1588 f 474//1589 473//1590 481//1591 f 482//1592 398//1593 401//1594 f 401//1595 474//1596 482//1597 f 483//1598 484//1599 477//1600 f 477//1601 476//1602 483//1603 f 484//1604 485//1605 478//1606 f 478//1607 477//1608 484//1609 f 485//1610 486//1611 479//1612 f 479//1613 478//1614 485//1615 f 486//1616 487//1617 480//1618 f 480//1619 479//1620 486//1621 usemtl Hull f 488//1622 489//1623 490//1624 f 490//1625 491//1626 488//1627 f 489//1628 492//1629 493//1630 f 493//1631 490//1632 489//1633 f 491//1634 490//1635 494//1636 f 494//1637 495//1638 491//1639 f 493//1640 496//1641 494//1642 f 494//1643 490//1644 493//1645 f 497//1646 498//1647 495//1648 f 495//1649 494//1650 497//1651 f 497//1652 494//1653 496//1654 f 496//1655 499//1656 497//1657 f 498//1658 500//1659 501//1660 f 501//1661 495//1662 498//1663 f 491//1664 495//1665 501//1666 f 501//1667 502//1668 491//1669 f 488//1670 491//1671 502//1672 f 502//1673 503//1674 488//1675 f 488//1676 503//1677 492//1678 f 492//1679 489//1680 488//1681 f 504//1682 492//1683 503//1684 f 503//1685 505//1686 504//1687 f 503//1688 502//1689 506//1690 f 506//1691 505//1692 503//1693 f 502//1694 501//1695 507//1696 f 507//1697 506//1698 502//1699 f 508//1700 507//1701 501//1702 f 501//1703 500//1704 508//1705 f 509//1706 510//1707 493//1708 f 493//1709 492//1710 509//1711 f 510//1712 511//1713 496//1714 f 496//1715 493//1716 510//1717 f 510//1718 512//1719 513//1720 f 513//1721 511//1722 510//1723 f 509//1724 514//1725 512//1726 f 512//1727 510//1728 509//1729 f 515//1730 499//1731 496//1732 f 496//1733 511//1734 515//1735 f 515//1736 511//1737 513//1738 f 513//1739 516//1740 515//1741 f 517//1742 518//1743 519//1744 f 519//1745 520//1746 517//1747 f 521//1748 522//1749 519//1750 f 519//1751 518//1752 521//1753 f 523//1754 517//1755 520//1756 f 520//1757 524//1758 523//1759 f 525//1760 526//1761 522//1762 f 522//1763 521//1764 525//1765 f 527//1766 523//1767 524//1768 f 524//1769 528//1770 527//1771 f 529//1772 530//1773 526//1774 f 526//1775 525//1776 529//1777 f 531//1778 527//1779 528//1780 f 528//1781 532//1782 531//1783 usemtl Window f 533//1784 534//1785 530//1786 f 530//1787 529//1788 533//1789 f 535//1790 531//1791 532//1792 f 532//1793 536//1794 535//1795 usemtl Hull f 537//1796 538//1797 539//1798 f 539//1799 540//1800 537//1801 f 541//1802 542//1803 543//1804 f 543//1805 544//1806 541//1807 f 541//1808 544//1809 545//1810 f 545//1811 546//1812 541//1813 f 537//1814 547//1815 548//1816 f 548//1817 538//1818 537//1819 f 546//1820 545//1821 548//1822 f 548//1823 547//1824 546//1825 f 549//1826 550//1827 516//1828 f 516//1829 514//1830 549//1831 f 551//1832 549//1833 550//1834 f 550//1835 552//1836 551//1837 f 551//1838 553//1839 554//1840 f 554//1841 552//1842 551//1843 f 555//1844 554//1845 553//1846 f 553//1847 556//1848 555//1849 f 555//1850 556//1851 549//1852 f 549//1853 550//1854 555//1855 f 557//1856 555//1857 556//1858 f 556//1859 504//1860 557//1861 usemtl Chassis f 558//1862 66//1863 71//1864 f 71//1865 70//1866 558//1867 f 559//1868 20//1869 560//1870 f 560//1871 561//1872 559//1873 f 561//1874 560//1875 16//1876 f 16//1877 562//1878 561//1879 f 561//1880 562//1881 23//1882 f 23//1883 22//1884 561//1885 f 559//1886 561//1887 22//1888 f 22//1889 21//1890 559//1891 f 559//1892 21//1893 563//1894 f 563//1895 564//1896 559//1897 f 559//1898 564//1899 19//1900 f 19//1901 20//1902 559//1903 f 562//1904 16//1905 18//1906 f 18//1907 565//1908 562//1909 f 562//1910 565//1911 566//1912 f 566//1913 23//1914 562//1915 usemtl Hull f 549//1916 567//1917 568//1918 f 568//1919 550//1920 549//1921 f 569//1922 568//1923 567//1924 f 567//1925 570//1926 569//1927 f 551//1928 552//1929 569//1930 f 569//1931 570//1932 551//1933 usemtl Chassis f 571//1934 572//1935 573//1936 f 573//1937 574//1938 571//1939 usemtl Hull f 557//1940 504//1941 505//1942 f 505//1943 508//1944 557//1945 f 509//1946 492//1947 504//1948 f 504//1949 556//1950 509//1951 usemtl Chassis f 20//1952 17//1953 16//1954 f 16//1955 560//1956 20//1957 f 21//1958 23//1959 566//1960 f 566//1961 563//1962 21//1963 f 28//1964 136//1965 24//1966 f 24//1967 26//1968 28//1969 f 29//1970 139//1971 141//1972 f 141//1973 30//1974 29//1975 f 146//1976 575//1977 686//1978 f 147//1979 575//1977 684//1980 f 107//1981 576//1982 682//1983 f 111//1984 576//1982 681//1985 f 116//1986 576//1982 683//1987 f 122//1988 129//1989 132//1990 f 132//1991 34//1992 122//1993 f 33//1994 120//1995 122//1996 f 122//1997 34//1998 33//1999 f 125//2000 127//2001 133//2002 f 133//2003 130//2004 125//2005 f 125//2006 130//2007 124//2008 f 124//2009 123//2010 125//2011 f 92//2012 36//2013 98//2014 f 98//2015 95//2016 92//2017 f 37//2018 36//2019 92//2020 f 92//2021 87//2022 37//2023 f 96//2024 85//2025 86//2026 f 86//2027 94//2028 96//2029 f 89//2030 91//2031 94//2032 f 94//2033 86//2034 89//2035 usemtl Hull f 516//2036 513//2037 512//2038 f 512//2039 514//2040 516//2041 f 508//2042 505//2043 506//2044 f 506//2045 507//2046 508//2047 usemtl Window f 193//2048 194//2049 183//2050 f 183//2051 577//2052 193//2053 f 183//2054 186//2055 188//2056 f 188//2057 577//2058 183//2059 f 167//2060 166//2061 171//2062 f 171//2063 578//2064 167//2065 f 578//2066 171//2067 173//2068 f 173//2069 174//2070 578//2071 f 163//2072 167//2073 578//2074 f 578//2075 162//2076 163//2077 f 162//2078 578//2079 174//2080 f 174//2081 160//2082 162//2083 f 579//2084 179//2085 180//2086 f 180//2087 580//2088 579//2089 usemtl Chassis f 581//2090 195//2091 198//2092 f 198//2093 582//2094 581//2095 f 583//2096 584//2097 228//2098 f 228//2099 240//2100 583//2101 f 583//2102 229//2103 219//2104 f 219//2105 584//2106 583//2107 f 585//2108 586//2109 262//2110 f 262//2111 261//2112 585//2113 f 585//2114 241//2115 244//2116 f 244//2117 586//2118 585//2119 f 587//2120 273//2121 263//2122 f 263//2123 588//2124 587//2125 usemtl Hull f 288//2126 287//2127 589//2128 f 589//2129 590//2130 288//2131 f 590//2132 589//2133 292//2134 f 292//2135 291//2136 590//2137 f 292//2138 591//2139 592//2140 f 592//2141 293//2142 292//2143 f 293//2144 592//2145 593//2146 f 593//2147 295//2148 293//2149 f 296//2150 295//2151 594//2152 f 594//2153 595//2154 296//2155 f 297//2156 595//2157 594//2158 f 594//2159 298//2160 297//2161 f 596//2162 597//2163 598//2164 f 598//2165 599//2166 596//2167 f 597//2168 600//2169 601//2170 f 601//2171 598//2172 597//2173 f 599//2174 598//2175 602//2176 f 602//2177 603//2178 599//2179 f 598//2180 601//2181 604//2182 f 604//2183 602//2184 598//2185 f 603//2186 602//2187 605//2188 f 605//2189 606//2190 603//2191 f 602//2192 604//2193 607//2194 f 607//2195 605//2196 602//2197 f 606//2198 605//2199 608//2200 f 608//2201 609//2202 606//2203 f 605//2204 607//2205 610//2206 f 610//2207 608//2208 605//2209 f 607//2210 327//2211 611//2212 f 611//2213 610//2214 607//2215 f 320//2216 611//2217 612//2218 f 612//2219 322//2220 320//2221 f 327//2222 326//2223 612//2224 f 612//2225 611//2226 327//2227 f 604//2228 324//2229 327//2230 f 327//2231 607//2232 604//2233 f 601//2234 328//2235 324//2236 f 324//2237 604//2238 601//2239 f 600//2240 613//2241 328//2242 f 328//2243 601//2244 600//2245 f 613//2246 614//2247 329//2248 f 329//2249 328//2250 613//2251 f 331//2252 333//2253 614//2254 f 614//2255 613//2256 331//2257 f 392//2258 615//2259 616//2260 f 616//2261 382//2262 392//2263 f 414//2264 413//2265 617//2266 f 617//2267 618//2268 414//2269 f 413//2270 415//2271 619//2272 f 619//2273 617//2274 413//2275 f 617//2276 619//2277 420//2278 f 420//2279 417//2280 617//2281 f 422//2282 424//2283 620//2284 f 620//2285 621//2286 422//2287 f 390//2288 622//2289 621//2290 f 621//2291 391//2292 390//2293 f 392//2294 391//2295 621//2296 f 621//2297 620//2298 392//2299 f 388//2300 623//2301 624//2302 f 624//2303 389//2304 388//2305 f 625//2306 626//2307 426//2308 f 426//2309 425//2310 625//2311 f 421//2312 627//2313 628//2314 f 628//2315 424//2316 421//2317 f 627//2318 629//2319 625//2320 f 625//2321 628//2322 627//2323 f 629//2324 630//2325 626//2326 f 626//2327 625//2328 629//2329 f 420//2330 631//2331 627//2332 f 627//2333 421//2334 420//2335 f 631//2336 632//2337 629//2338 f 629//2339 627//2340 631//2341 f 632//2342 633//2343 630//2344 f 630//2345 629//2346 632//2347 f 439//2348 438//2349 633//2350 f 633//2351 632//2352 439//2353 f 449//2354 448//2355 634//2356 f 634//2357 635//2358 449//2359 f 412//2360 636//2361 637//2362 f 637//2363 415//2364 412//2365 f 523//2366 521//2367 518//2368 f 518//2369 517//2370 523//2371 f 527//2372 525//2373 521//2374 f 521//2375 523//2376 527//2377 usemtl Window f 542//2378 540//2379 533//2380 f 533//2381 535//2382 542//2383 usemtl Chassis f 45//2384 46//2385 2//2386 f 2//2387 1//2388 45//2389 f 44//2390 47//2391 46//2392 f 46//2393 45//2394 44//2395 f 55//2396 58//2397 638//2398 f 638//2399 59//2400 55//2401 f 55//2402 61//2403 639//2404 f 639//2405 56//2406 55//2407 f 639//2408 61//2409 62//2410 f 62//2411 640//2412 639//2413 f 57//2414 640//2415 62//2416 f 62//2417 58//2418 57//2419 f 62//2420 63//2421 638//2422 f 638//2423 58//2424 62//2425 f 56//2426 639//2427 640//2428 f 640//2429 57//2430 56//2431 f 641//2432 67//2433 66//2434 f 66//2435 558//2436 641//2437 f 63//2438 60//2439 67//2440 f 67//2441 641//2442 63//2443 f 64//2444 59//2445 638//2446 f 638//2447 642//2448 64//2449 f 64//2450 642//2451 72//2452 f 72//2453 65//2454 64//2455 f 72//2456 558//2457 70//2458 f 70//2459 69//2460 72//2461 usemtl Hull f 73//2462 643//2463 644//2464 f 644//2465 74//2466 73//2467 f 643//2468 77//2469 80//2470 f 80//2471 644//2472 643//2473 f 74//2474 644//2475 80//2476 f 80//2477 75//2478 74//2479 f 80//2480 79//2481 82//2482 f 82//2483 75//2484 80//2485 f 81//2486 76//2487 75//2488 f 75//2489 82//2490 81//2491 f 73//2492 76//2493 77//2494 f 77//2495 643//2496 73//2497 f 77//2498 76//2499 81//2500 f 81//2501 78//2502 77//2503 usemtl Chassis f 117//2504 114//2505 100//2506 f 100//2507 103//2508 117//2509 f 114//2510 4//2511 6//2512 f 6//2513 100//2514 114//2515 f 152//2516 153//2517 155//2518 f 155//2519 159//2520 152//2521 f 153//2522 7//2523 9//2524 f 9//2525 155//2526 153//2527 usemtl Window f 168//2528 165//2529 645//2530 f 645//2531 178//2532 168//2533 f 646//2534 645//2535 165//2536 f 165//2537 164//2538 646//2539 f 10//2540 646//2541 164//2542 f 164//2543 11//2544 10//2545 f 647//2546 181//2547 179//2548 f 179//2549 579//2550 647//2551 f 184//2552 647//2553 579//2554 f 579//2555 185//2556 184//2557 f 185//2558 579//2559 580//2560 f 580//2561 187//2562 185//2563 f 190//2564 182//2565 181//2566 f 181//2567 647//2568 190//2569 f 192//2570 190//2571 647//2572 f 647//2573 184//2574 192//2575 f 189//2576 648//2577 14//2578 f 14//2579 13//2580 189//2581 f 191//2582 649//2583 648//2584 f 648//2585 189//2586 191//2587 f 193//2588 577//2589 649//2590 f 649//2591 191//2592 193//2593 usemtl Chassis f 581//2594 582//2595 216//2596 f 216//2597 215//2598 581//2599 usemtl Rim f 218//2600 216//2601 582//2602 f 582//2603 289//2604 218//2605 f 289//2606 582//2607 198//2608 f 198//2609 650//2610 289//2611 f 650//2612 198//2613 197//2614 f 197//2615 651//2616 650//2617 f 652//2618 651//2619 197//2620 f 197//2621 200//2622 652//2623 f 652//2624 200//2625 202//2626 f 202//2627 308//2628 652//2629 f 308//2630 202//2631 204//2632 f 204//2633 309//2634 308//2635 f 309//2636 204//2637 206//2638 f 206//2639 312//2640 309//2641 f 312//2642 206//2643 208//2644 f 208//2645 330//2646 312//2647 usemtl Spoke f 330//2648 208//2649 210//2650 f 210//2651 332//2652 330//2653 usemtl Rim f 332//2654 210//2655 212//2656 f 212//2657 301//2658 332//2659 f 301//2660 212//2661 214//2662 f 214//2663 217//2664 301//2665 usemtl Chassis f 584//2666 581//2667 215//2668 f 215//2669 228//2670 584//2671 f 584//2672 219//2673 195//2674 f 195//2675 581//2676 584//2677 f 223//2678 235//2679 205//2680 f 205//2681 203//2682 223//2683 f 235//2684 224//2685 207//2686 f 207//2687 205//2688 235//2689 f 583//2690 240//2691 239//2692 f 239//2693 238//2694 583//2695 f 583//2696 238//2697 237//2698 f 237//2699 229//2700 583//2701 f 229//2702 237//2703 236//2704 f 236//2705 230//2706 229//2707 f 230//2708 236//2709 234//2710 f 234//2711 231//2712 230//2713 f 231//2714 234//2715 233//2716 f 233//2717 232//2718 231//2719 f 258//2720 260//2721 262//2722 f 262//2723 586//2724 258//2725 f 256//2726 258//2727 586//2728 f 586//2729 244//2730 256//2731 f 254//2732 256//2733 244//2734 f 244//2735 243//2736 254//2737 f 252//2738 254//2739 243//2740 f 243//2741 246//2742 252//2743 f 248//2744 250//2745 252//2746 f 252//2747 246//2748 248//2749 f 588//2750 585//2751 261//2752 f 261//2753 272//2754 588//2755 f 588//2756 263//2757 241//2758 f 241//2759 585//2760 588//2761 f 267//2762 279//2763 251//2764 f 251//2765 249//2766 267//2767 f 279//2768 268//2769 253//2770 f 253//2771 251//2772 279//2773 f 587//2774 588//2775 272//2776 f 272//2777 284//2778 587//2779 usemtl Rim f 286//2780 300//2781 587//2782 f 587//2783 284//2784 286//2785 f 300//2786 653//2787 273//2788 f 273//2789 587//2790 300//2791 f 653//2792 654//2793 274//2794 f 274//2795 273//2796 653//2797 f 655//2798 275//2799 274//2800 f 274//2801 654//2802 655//2803 f 655//2804 317//2805 276//2806 f 276//2807 275//2808 655//2809 f 317//2810 316//2811 277//2812 f 277//2813 276//2814 317//2815 f 316//2816 319//2817 278//2818 f 278//2819 277//2820 316//2821 f 319//2822 321//2823 280//2824 f 280//2825 278//2826 319//2827 usemtl Spoke f 321//2828 323//2829 281//2830 f 281//2831 280//2832 321//2833 usemtl Rim f 323//2834 307//2835 282//2836 f 282//2837 281//2838 323//2839 f 307//2840 285//2841 283//2842 f 283//2843 282//2844 307//2845 usemtl Hull f 287//2846 290//2847 656//2848 f 656//2849 589//2850 287//2851 f 589//2852 656//2853 591//2854 f 591//2855 292//2856 589//2857 f 295//2858 593//2859 657//2860 f 657//2861 594//2862 295//2863 f 298//2864 594//2865 657//2866 f 657//2867 299//2868 298//2869 f 302//2870 288//2871 590//2872 f 590//2873 658//2874 302//2875 f 658//2876 590//2877 291//2878 f 291//2879 303//2880 658//2881 f 305//2882 296//2883 595//2884 f 595//2885 659//2886 305//2887 f 306//2888 659//2889 595//2890 f 595//2891 297//2892 306//2893 f 311//2894 310//2895 597//2896 f 597//2897 596//2898 311//2899 f 310//2900 313//2901 600//2902 f 600//2903 597//2904 310//2905 f 314//2906 609//2907 608//2908 f 608//2909 315//2910 314//2911 f 315//2912 608//2913 610//2914 f 610//2915 318//2916 315//2917 f 318//2918 610//2919 611//2920 f 611//2921 320//2922 318//2923 f 322//2924 612//2925 659//2926 f 659//2927 306//2928 322//2929 f 326//2930 305//2931 659//2932 f 659//2933 612//2934 326//2935 f 614//2936 658//2937 303//2938 f 303//2939 329//2940 614//2941 f 313//2942 331//2943 613//2944 f 613//2945 600//2946 313//2947 f 333//2948 302//2949 658//2950 f 658//2951 614//2952 333//2953 usemtl Chassis f 349//2954 351//2955 353//2956 f 353//2957 660//2958 349//2959 f 661//2960 660//2961 353//2962 f 353//2963 352//2964 661//2965 f 661//2966 334//2967 337//2968 f 337//2969 660//2970 661//2971 f 346//2972 349//2973 660//2974 f 660//2975 337//2976 346//2977 f 347//2978 346//2979 337//2980 f 337//2981 336//2982 347//2983 f 662//2984 347//2985 336//2986 f 336//2987 339//2988 662//2989 f 341//2990 343//2991 662//2992 f 662//2993 339//2994 341//2995 f 342//2996 361//2997 662//2998 f 662//2999 343//3000 342//3001 f 361//3002 344//3003 347//3004 f 347//3005 662//3006 361//3007 f 367//3008 661//3009 352//3010 f 352//3011 365//3012 367//3013 f 367//3014 354//3015 334//3016 f 334//3017 661//3018 367//3019 f 358//3020 359//3021 361//3022 f 361//3023 342//3024 358//3025 f 373//3026 663//3027 359//3028 f 359//3029 358//3030 373//3031 f 663//3032 374//3033 360//3034 f 360//3035 359//3036 663//3037 usemtl Rim f 664//3038 366//3039 368//3040 f 368//3041 387//3042 664//3043 f 664//3044 378//3045 369//3046 f 369//3047 366//3048 664//3049 f 382//3050 616//3051 663//3052 f 663//3053 373//3054 382//3055 f 616//3056 383//3057 374//3058 f 374//3059 663//3060 616//3061 usemtl Hull f 397//3062 665//3063 664//3064 f 664//3065 387//3066 397//3067 f 665//3068 388//3069 378//3070 f 378//3071 664//3072 665//3073 f 615//3074 393//3075 383//3076 f 383//3077 616//3078 615//3079 f 618//3080 617//3081 417//3082 f 417//3083 416//3084 618//3085 f 423//3086 422//3087 621//3088 f 621//3089 622//3090 423//3091 f 397//3092 429//3093 666//3094 f 666//3095 665//3096 397//3097 f 667//3098 433//3099 623//3100 f 623//3101 666//3102 667//3103 f 665//3104 666//3105 623//3106 f 623//3107 388//3108 665//3109 f 433//3110 432//3111 624//3112 f 624//3113 623//3114 433//3115 f 432//3116 423//3117 622//3118 f 622//3119 624//3120 432//3121 f 389//3122 624//3123 622//3124 f 622//3125 390//3126 389//3127 f 392//3128 620//3129 668//3130 f 668//3131 615//3132 392//3133 f 424//3134 628//3135 668//3136 f 668//3137 620//3138 424//3139 f 615//3140 668//3141 425//3142 f 425//3143 393//3144 615//3145 f 628//3146 625//3147 425//3148 f 425//3149 668//3150 628//3151 f 669//3152 635//3153 434//3154 f 434//3155 670//3156 669//3157 f 635//3158 634//3159 435//3160 f 435//3161 434//3162 635//3163 f 634//3164 618//3165 416//3166 f 416//3167 435//3168 634//3169 f 619//3170 671//3171 631//3172 f 631//3173 420//3174 619//3175 f 671//3176 439//3177 632//3178 f 632//3179 631//3180 671//3181 f 672//3182 669//3183 445//3184 f 445//3185 444//3186 672//3187 f 672//3188 449//3189 635//3190 f 635//3191 669//3192 672//3193 f 448//3194 414//3195 618//3196 f 618//3197 634//3198 448//3199 f 415//3200 637//3201 671//3202 f 671//3203 619//3204 415//3205 f 637//3206 436//3207 439//3208 f 439//3209 671//3210 637//3211 f 673//3212 672//3213 444//3214 f 444//3215 454//3216 673//3217 f 673//3218 446//3219 449//3220 f 449//3221 672//3222 673//3223 f 636//3224 450//3225 436//3226 f 436//3227 637//3228 636//3229 usemtl Rim f 463//3230 673//3231 454//3232 f 454//3233 461//3234 463//3235 f 463//3236 455//3237 446//3238 f 446//3239 673//3240 463//3241 f 409//3242 468//3243 636//3244 f 636//3245 412//3246 409//3247 f 468//3248 457//3249 450//3250 f 450//3251 636//3252 468//3253 usemtl Chassis f 467//3254 469//3255 457//3256 f 457//3257 468//3258 467//3259 f 674//3260 462//3261 464//3262 f 464//3263 480//3264 674//3265 f 674//3266 473//3267 465//3268 f 465//3269 462//3270 674//3271 f 475//3272 476//3273 469//3274 f 469//3275 467//3276 475//3277 f 675//3278 674//3279 480//3280 f 480//3281 487//3282 675//3283 f 675//3284 481//3285 473//3286 f 473//3287 674//3288 675//3289 f 402//3290 676//3291 475//3292 f 475//3293 403//3294 402//3295 f 676//3296 483//3297 476//3298 f 476//3299 475//3300 676//3301 f 675//3302 487//3303 486//3304 f 486//3305 485//3306 675//3307 f 675//3308 485//3309 484//3310 f 484//3311 481//3312 675//3313 f 481//3314 484//3315 483//3316 f 483//3317 482//3318 481//3319 f 482//3320 483//3321 676//3322 f 676//3323 398//3324 482//3325 f 398//3326 676//3327 402//3328 f 402//3329 399//3330 398//3331 usemtl Hull f 531//3332 529//3333 525//3334 f 525//3335 527//3336 531//3337 usemtl Window f 535//3338 533//3339 529//3340 f 529//3341 531//3342 535//3343 f 540//3344 539//3345 534//3346 f 534//3347 533//3348 540//3349 f 542//3350 535//3351 536//3352 f 536//3353 543//3354 542//3355 usemtl Hull f 541//3356 537//3357 540//3358 f 540//3359 542//3360 541//3361 f 541//3362 546//3363 547//3364 f 547//3365 537//3366 541//3367 f 557//3368 508//3369 500//3370 f 500//3371 499//3372 557//3373 f 497//3374 499//3375 500//3376 f 500//3377 498//3378 497//3379 f 557//3380 499//3381 515//3382 f 515//3383 555//3384 557//3385 f 555//3386 515//3387 516//3388 f 516//3389 550//3390 555//3391 f 555//3392 550//3393 552//3394 f 552//3395 554//3396 555//3397 f 552//3398 550//3399 568//3400 f 568//3401 569//3402 552//3403 f 551//3404 570//3405 567//3406 f 567//3407 549//3408 551//3409 usemtl Chassis f 573//3410 641//3411 558//3412 f 558//3413 574//3414 573//3415 f 558//3416 72//3417 677//3418 f 677//3419 574//3420 558//3421 f 571//3422 574//3423 677//3424 f 677//3425 678//3426 571//3427 f 679//3428 678//3429 677//3430 f 677//3431 680//3432 679//3433 f 642//3434 680//3435 677//3436 f 677//3436 72//3437 642//3434 usemtl Hull f 551//3438 549//3439 556//3440 f 556//3441 553//3442 551//3443 f 509//3444 556//3445 549//3446 f 549//3447 514//3448 509//3449 usemtl Chassis f 681//1985 576//1982 107//1981 f 683//1987 576//1982 111//1984 f 684//1980 575//1977 146//1976 f 685//3450 575//1977 147//1979 f 686//1978 575//1977 157//3451 gltron-0.70/data/lightcycle-low.obj0000644000076400001440000002602207735315037012775 # # Wavefront OBJ generated by GLM library # # GLM library # Nate Robins # ndr@pobox.com # http://www.pobox.com/~ndr # mtllib lightcycle.mtl # 91 vertices v -0.675745 -4.181760 0.828977 v -0.675746 -0.260560 1.854730 v 0.677798 -2.070860 -0.100226 v 0.669888 -0.260560 1.854730 v 0.669888 -4.181760 0.828977 v 0.203011 3.536160 -0.847399 v 0.203011 3.851470 -0.511977 v 0.203011 3.207430 -0.525406 v 0.203011 3.536160 -0.150241 v -0.200718 3.536160 -0.150241 v -0.200718 3.851470 -0.511977 v -0.200718 3.207430 -0.538833 v -0.200718 3.536160 -0.847399 v 1.257510 -0.361758 0.887388 v 0.610035 -0.187286 1.704330 v 0.610035 -3.311140 0.887388 v -1.257510 -0.361758 0.888085 v -0.602038 -3.311140 0.888085 v -0.602039 -0.187286 1.705020 v 0.571984 -3.371230 -0.150160 v 0.571984 -3.692720 -0.507515 v 0.571984 -3.054550 -0.512684 v 0.571984 -3.371230 -0.847315 v -0.569690 -3.371230 -0.150160 v -0.569690 -3.054550 -0.512684 v -0.569690 -3.692720 -0.507515 v -0.569690 -3.371230 -0.847315 v -0.675746 2.560710 1.165440 v -0.675504 1.051360 -0.101380 v 0.669887 2.561520 1.165440 v 0.677798 1.051100 -0.101111 v 0.301519 2.480440 -0.547424 v 0.301519 3.536160 0.565185 v 0.301519 3.536160 -1.562820 v 0.301519 4.538160 -0.493712 v 0.002783 3.536160 -1.987540 v 0.002783 5.000000 -0.491226 v 0.002783 3.536160 0.989902 v -0.299225 3.536160 -1.562820 v -0.299225 4.538160 -0.493712 v -0.299225 3.536160 0.565185 v -0.299225 2.480440 -0.533995 v 0.002783 1.978340 -0.547779 v -0.545389 1.646580 -1.553560 v -0.545389 3.002350 -0.509387 v -0.544671 3.530940 -1.150170 v -0.545389 3.530570 -1.559590 v 0.548401 3.530670 -1.150440 v 0.547683 3.532990 -1.559590 v 0.547683 3.002350 -0.508849 v -1.074710 -3.371230 0.597294 v -1.074710 -4.529150 -0.143543 v 0.011553 -5.000000 -0.143341 v 0.011553 -3.371230 0.989982 v 1.077010 -3.371230 0.597294 v 1.077010 -4.529150 -0.143543 v 1.077010 -2.298130 -0.853935 v 0.011553 -1.807680 -0.867211 v -1.074710 -2.298130 -0.853935 v 1.077010 -3.840490 -1.664290 v 0.011553 -3.840490 -2.056980 v -1.074710 -3.840490 -1.664290 v -0.545389 3.529330 0.160689 v 0.547683 3.529330 0.160689 v 0.547683 1.646580 -1.553560 v -0.389670 3.132820 1.122540 v 0.392881 3.134730 1.125790 v 0.393451 2.943360 0.805744 v -0.389097 2.941480 0.802474 v 0.392881 -0.187721 2.056980 v 0.393451 -0.187888 1.694550 v -0.389669 -0.189631 2.053730 v -0.389096 -0.189771 1.691110 v 0.392881 -3.121660 1.598650 v 0.393451 -2.951540 1.251250 v -0.389669 -3.123570 1.595410 v -0.389096 -2.953420 1.247980 v 0.392881 -4.460940 0.882128 v 0.393451 -4.109510 0.815935 v -0.389669 -4.462850 0.878881 v -0.389096 -4.109460 0.815965 v -0.545389 -2.722760 -1.553560 v -0.542968 -2.722760 1.299390 v -0.545389 1.273530 0.348329 v 0.547683 1.273530 0.348329 v 0.547683 -2.722760 1.299390 v 0.549168 -2.723830 -1.553400 v -0.545389 1.905600 1.092650 v -0.545389 3.529330 1.092650 v 0.547683 3.529330 1.092650 v 0.547683 1.905600 1.092650 # 161 normals vn -1.000000 0.000043 -0.000164 vn -0.695529 0.228198 0.681296 vn 0.999989 -0.000698 0.004692 vn 0.999989 -0.000071 0.004740 vn 0.999985 -0.001397 0.005339 vn 1.000000 0.000000 0.000000 vn -0.727607 0.485071 0.485071 vn -1.000000 -0.000000 -0.000000 vn -0.762493 0.457496 0.457496 vn -0.816497 0.408248 0.408248 vn 0.755312 -0.165813 0.634042 vn -0.650458 0.433360 0.623782 vn -0.751311 -0.166972 0.638477 vn -0.689812 0.328116 0.645368 vn -0.870411 0.348168 0.348085 vn -1.000000 -0.000013 -0.000146 vn -1.000000 -0.000000 -0.000191 vn -0.000037 -0.008133 0.999967 vn -0.000143 0.237274 0.971443 vn -0.000071 0.237306 0.971435 vn 0.999990 0.000592 0.004441 vn 0.999988 0.001182 0.004837 vn 0.990735 0.135771 0.003072 vn 0.990950 0.134093 0.006023 vn 0.991671 -0.000341 -0.128797 vn 0.990653 -0.000193 -0.136404 vn 0.989251 -0.053024 0.136276 vn 0.990060 0.038876 0.135166 vn 0.988948 -0.142679 -0.040308 vn 0.988451 -0.142925 0.050369 vn 0.718758 0.502329 -0.480679 vn 0.739721 0.481013 -0.470574 vn 0.697080 0.523144 -0.490306 vn 0.728037 0.492626 0.476741 vn 0.706889 0.503081 0.497209 vn 0.748475 0.481689 0.455807 vn -0.722445 0.499236 -0.478369 vn -0.743007 0.488333 -0.457681 vn -0.701182 0.509654 -0.498594 vn -0.716825 0.501381 0.484540 vn -0.694993 0.522259 0.494196 vn -0.737935 0.479999 0.474397 vn -0.989280 -0.052461 0.136279 vn -0.989474 0.041017 0.138778 vn -0.988451 -0.142924 0.050369 vn -0.988948 -0.142678 -0.040308 vn -0.991921 -0.001821 -0.126842 vn -0.990653 -0.001044 -0.136403 vn -0.990692 0.135907 0.007691 vn -0.990815 0.134357 0.015289 vn -0.734282 -0.467560 -0.492156 vn -0.709626 -0.491743 -0.504598 vn -0.757948 -0.442747 -0.479052 vn 0.740924 -0.460565 -0.488786 vn 0.722193 -0.469473 -0.507969 vn 0.759063 -0.451290 -0.469212 vn -1.000000 0.000107 0.000214 vn -1.000000 0.000176 -0.000228 vn -1.000000 0.000267 0.000534 vn -0.999998 0.000006 0.001754 vn -0.000984 0.999997 0.002385 vn -0.002214 0.999981 0.005674 vn 0.000247 1.000000 -0.000905 vn 0.000017 0.771683 0.636008 vn 0.000348 0.771406 0.636343 vn -0.000313 0.771959 0.635672 vn -0.256207 -0.536497 0.804070 vn -0.227626 -0.524786 0.820235 vn 0.002409 -0.555019 0.831834 vn 0.002659 -0.571153 0.820840 vn 0.260864 -0.535801 0.803036 vn 0.231834 -0.524251 0.819399 vn 0.270297 0.756003 0.596153 vn -0.082418 0.775548 0.625886 vn 0.107381 0.774012 0.623999 vn 0.214051 0.785420 0.580773 vn -0.281550 0.752851 0.594933 vn -0.335186 0.757543 0.560159 vn 0.261686 0.468109 -0.844034 vn 0.002771 0.505124 -0.863042 vn 0.002409 0.485013 -0.874503 vn 0.219633 0.453754 -0.863637 vn -0.257025 0.468725 -0.845124 vn -0.215624 0.454170 -0.864428 vn -0.249256 -0.857477 -0.450116 vn -0.147496 -0.900986 -0.408006 vn -0.105259 -0.870728 -0.480367 vn 0.074871 -0.872314 -0.483180 vn 0.282281 -0.847936 -0.448689 vn 0.373382 -0.845068 -0.382683 vn -0.613902 -0.614155 -0.495921 vn -0.660614 -0.603626 -0.446346 vn -0.564274 -0.621767 -0.543140 vn -0.826467 0.357975 -0.434519 vn -0.863654 0.374751 -0.337140 vn -0.780066 0.337209 -0.527055 vn 0.613898 -0.614158 -0.495923 vn 0.660610 -0.603629 -0.446349 vn 0.564270 -0.621769 -0.543142 vn 0.774472 0.417297 -0.475454 vn 0.831994 0.298993 -0.467322 vn 0.703497 0.528353 -0.475326 vn 0.620156 -0.494198 0.609241 vn 0.791443 -0.284296 0.541104 vn 0.400472 -0.665533 0.629832 vn -0.782366 -0.365083 0.504597 vn -0.840669 -0.393338 0.372237 vn -0.707072 -0.328899 0.625998 vn -0.828812 0.471259 0.301639 vn -0.872628 0.354766 0.335650 vn -0.771197 0.579907 0.262607 vn 0.828809 0.471263 0.301642 vn 0.872626 0.354769 0.335653 vn 0.771194 0.579911 0.262609 vn 0.000152 0.785917 -0.618331 vn 0.000304 0.786038 -0.618178 vn 0.000000 0.785797 -0.618485 vn 1.000000 -0.000267 -0.000535 vn 1.000000 -0.000105 0.000137 vn 1.000000 -0.000048 -0.000251 vn 0.999998 -0.000006 -0.001755 vn 0.000060 0.858295 -0.513157 vn 0.000037 0.858270 -0.513198 vn 0.000082 0.858319 -0.513116 vn 0.999999 0.000437 0.001549 vn 0.999999 0.000446 0.001573 vn 0.999999 0.000428 0.001526 vn -0.999999 -0.000439 -0.001557 vn -0.999999 -0.000430 -0.001533 vn -0.999999 -0.000449 -0.001580 vn 0.999999 -0.000245 0.001547 vn 0.999999 -0.000244 0.001521 vn 0.999999 -0.000246 0.001573 vn -0.999999 0.000246 -0.001555 vn -0.999999 0.000247 -0.001580 vn -0.999999 0.000245 -0.001529 vn 0.999997 -0.000888 0.002087 vn 0.999995 -0.001081 0.002875 vn 0.999999 -0.000695 0.001300 vn -0.999997 0.000899 -0.002123 vn -0.999999 0.000699 -0.001307 vn -0.999995 0.001098 -0.002939 vn 0.002240 -0.180194 -0.983629 vn -0.000049 -0.175279 -0.984519 vn 0.004529 -0.185104 -0.982709 vn -1.000000 -0.000202 0.000424 vn -1.000000 -0.000404 0.000849 vn -1.000000 -0.000135 0.000283 vn 1.000000 0.000116 0.000147 vn 1.000000 0.000124 0.000520 vn 1.000000 0.000232 0.000294 vn -0.003720 -0.154342 0.988010 vn -0.003714 -0.154344 0.988010 vn -0.003726 -0.154340 0.988011 vn 0.000000 -0.253076 0.967446 vn -0.429191 0.320573 0.844410 vn 0.000000 1.000000 0.000000 vn -0.004658 0.269870 0.962886 vn -0.002503 -0.471736 0.881736 vn -0.002507 -0.471734 0.881737 vn -0.002499 -0.471738 0.881735 # 126 faces (triangles) g default usemtl Hull f 1//1 1//1 2//2 f 3//3 4//4 5//5 usemtl Chassis f 6//6 7//6 8//6 f 9//6 8//6 7//6 f 10//7 11//8 12//9 f 12//9 11//8 13//10 usemtl Window f 14//11 15//11 16//11 f 17//12 18//13 19//14 usemtl Chassis f 20//6 21//6 22//6 f 21//6 23//6 22//6 f 24//7 25//8 26//9 f 26//9 25//8 27//10 usemtl Hull f 1//15 2//2 28//16 f 28//16 29//17 1//15 f 4//18 30//19 28//20 f 28//20 2//2 4//18 f 31//21 30//22 4//4 f 4//4 3//3 31//21 usemtl Window f 32//23 8//24 9//25 f 9//25 33//26 32//23 f 32//23 34//27 6//28 f 6//28 8//24 32//23 f 34//27 35//29 7//30 f 7//30 6//28 34//27 f 35//29 33//26 9//25 f 9//25 7//30 35//29 usemtl Hull f 36//31 37//32 35//31 f 35//31 34//33 36//31 f 37//34 38//35 33//34 f 33//34 35//36 37//34 f 39//37 40//38 37//37 f 37//37 36//39 39//37 f 40//40 41//41 38//40 f 38//40 37//42 40//40 usemtl Window f 39//43 13//44 11//45 f 11//45 40//46 39//43 f 40//46 11//45 10//47 f 10//47 41//48 40//46 f 42//49 41//48 10//47 f 10//47 12//50 42//49 f 42//49 12//50 13//44 f 13//44 39//43 42//49 usemtl Hull f 42//51 39//52 36//51 f 36//51 43//53 42//51 f 43//54 36//55 34//54 f 34//54 32//56 43//54 usemtl Chassis f 44//57 45//58 46//59 f 46//59 47//60 44//57 f 48//61 49//62 47//61 f 47//61 46//63 48//61 f 48//64 46//65 45//64 f 45//64 50//66 48//64 usemtl Hull f 51//67 52//68 53//69 f 53//69 54//70 51//67 f 55//71 54//70 53//69 f 53//69 56//72 55//71 f 57//73 58//74 54//75 f 54//75 55//76 57//73 f 51//77 54//75 58//74 f 58//74 59//78 51//77 f 60//79 61//80 58//81 f 58//81 57//82 60//79 f 62//83 59//84 58//81 f 58//81 61//80 62//83 f 52//85 62//86 61//87 f 61//87 53//88 52//85 f 60//89 56//90 53//88 f 53//88 61//87 60//89 usemtl Window f 24//91 51//92 59//91 f 59//91 25//93 24//91 f 24//94 26//95 52//94 f 52//94 51//96 24//94 f 57//97 55//98 20//97 f 20//97 22//99 57//97 f 55//100 56//101 21//100 f 21//100 20//102 55//100 f 60//103 57//104 22//103 f 22//103 23//105 60//103 f 27//106 25//107 59//106 f 59//106 62//108 27//106 f 26//109 27//110 62//109 f 62//109 52//111 26//109 f 60//112 23//113 21//112 f 21//112 56//114 60//112 usemtl Chassis f 50//115 45//116 63//115 f 63//115 64//117 50//115 f 48//118 50//119 65//120 f 65//120 49//121 48//118 usemtl Hull f 66//122 67//123 68//122 f 68//122 69//124 66//122 f 70//125 71//126 68//125 f 68//125 67//127 70//125 f 72//128 66//129 69//128 f 69//128 73//130 72//128 usemtl Window f 74//131 75//132 71//131 f 71//131 70//133 74//131 f 76//134 72//135 73//134 f 73//134 77//136 76//134 usemtl Hull f 78//137 79//138 75//137 f 75//137 74//139 78//137 f 80//140 76//141 77//140 f 77//140 81//142 80//140 f 80//143 81//144 79//143 f 79//143 78//145 80//143 usemtl Chassis f 82//146 83//147 84//148 f 84//148 44//57 82//146 f 85//149 86//150 87//151 f 87//151 65//120 85//149 usemtl Window f 76//152 74//153 70//152 f 70//152 72//154 76//152 usemtl Hull f 4//18 2//2 1//155 f 1//155 5//156 4//18 usemtl Chassis f 88//8 45//58 44//57 f 44//57 84//148 88//8 f 64//157 63//157 89//157 f 89//157 90//157 64//157 f 88//8 89//8 63//8 f 63//8 45//58 88//8 f 50//119 64//6 90//6 f 90//6 91//6 50//119 f 85//149 65//120 50//119 f 50//119 91//6 85//149 usemtl Hull f 72//158 70//158 67//158 f 67//158 66//158 72//158 f 80//159 78//160 74//159 f 74//159 76//161 80//159 gltron-0.70/data/lightcycle-med.obj0000644000076400001440000017100507735315040012735 mtllib lightcycle.mtl g default v 0.573174 3.629760 0.222566 v 0.576971 3.633620 0.924858 v 0.956433 3.632150 0.605824 v -0.572089 3.629820 0.222651 v -0.955344 3.632200 0.605909 v -0.575885 3.633680 0.924943 v 0.520762 -1.119790 -0.031480 v 0.830493 -1.119790 -0.343341 v 0.520328 -0.519352 -0.622885 v 0.830493 -1.119790 -0.837051 v 0.520762 -1.119790 -1.179650 v -0.827986 -1.119860 -0.836972 v -0.521774 -0.520112 -0.626004 v -0.518256 -1.119860 -1.179570 v -0.827986 -1.119860 -0.343262 v -0.518256 -1.119860 -0.031401 v 0.598923 -0.058320 -0.493314 v 0.524409 -0.044523 -0.417172 v 0.522798 -0.144734 -0.454843 v 0.524097 -0.076347 -0.555324 v -0.592685 -0.058192 -0.493314 v -0.515724 -0.145353 -0.455031 v -0.518171 -0.044395 -0.417172 v -0.517859 -0.076220 -0.555324 v 0.715018 1.420550 -1.138740 v 0.715018 1.581810 -1.138740 v 0.715018 1.581810 -1.045640 v 0.715018 1.420550 -1.045640 v -0.712600 1.420650 -1.045060 v -0.712600 1.581900 -1.045060 v -0.712600 1.420650 -1.138160 v -0.712600 1.581900 -1.138160 v 0.577320 3.633560 1.056050 v -0.575347 3.633560 1.056050 v -0.000840 3.633560 1.606420 v -0.899529 0.902023 -0.832563 v -0.516277 0.899655 -0.449309 v -0.520073 0.903506 -1.151600 v 0.526311 0.903378 -1.151600 v 0.522514 0.899528 -0.449309 v 0.905767 0.901895 -0.832563 v 0.214012 3.457120 -0.244219 v 0.214012 3.322610 -0.746188 v 0.452599 3.588740 -0.592542 v 0.452599 3.610770 -0.510344 v 0.214012 3.640850 -0.929925 v 0.214012 3.959100 -0.746191 v 0.452599 3.692970 -0.592542 v 0.452599 3.640850 -0.622627 v -0.450184 3.640850 -0.622627 v -0.450184 3.692970 -0.592542 v -0.211594 3.959100 -0.746191 v -0.211594 3.640850 -0.929925 v -0.450184 3.610770 -0.510344 v -0.450184 3.588740 -0.592542 v -0.211594 3.322610 -0.746188 v -0.211594 3.457120 -0.244219 v -1.325660 -0.468298 0.899609 v -1.071430 -0.340234 1.491590 v -0.457660 -0.284371 1.760810 v -0.457660 -0.468297 0.899609 v -1.071430 -2.325240 0.899609 v -0.891658 -2.325240 1.301220 v -0.457660 -2.325240 1.491590 v 0.707462 0.031004 1.909540 v 0.706189 2.613390 1.192000 v -0.712364 2.612540 1.192000 v -0.712481 0.032937 1.909560 v 0.578119 3.635070 -1.249380 v 0.577362 3.309880 -1.141790 v 0.577362 1.648880 -1.674350 v 0.577362 3.637510 -1.680710 v -0.574187 3.635350 -1.249100 v -0.574944 3.309020 -1.141220 v 0.577362 3.056360 -0.899234 v -0.574944 3.056360 -0.899804 v -0.574944 1.648880 -1.674350 v -0.574944 3.634950 -1.680710 v -0.574944 2.970620 -0.566337 v 0.577362 2.970730 -0.575810 v 0.577362 3.044080 -0.228927 v -0.574944 3.044080 -0.228927 v -0.574944 3.633650 1.115260 v -0.574944 1.921920 1.115260 v 0.822993 3.037020 0.402424 v 0.575468 3.097930 0.165022 v 0.649583 2.671930 0.266574 v 0.575068 2.685730 0.190430 v 0.574757 2.653900 0.328584 v 0.575604 2.591150 0.218772 v 0.577147 2.986020 0.597273 v -0.574383 3.098010 0.165104 v -0.821907 3.037110 0.402509 v -0.576061 2.986070 0.597355 v -0.648497 2.672000 0.266659 v -0.573671 2.653970 0.328670 v -0.573983 2.685790 0.190515 v -0.571933 2.591480 0.218486 v 1.140230 -2.415400 -0.096486 v 1.057230 -1.867590 -0.162631 v 0.520762 -1.867590 0.388777 v 0.520762 -2.415400 0.542603 v 1.057230 -1.867590 -1.017760 v 0.520762 -1.867590 -1.599900 v 0.520762 -2.415400 -1.753730 v 1.140230 -2.415400 -1.083910 v -1.137720 -2.415470 -1.083830 v -1.054730 -1.867660 -1.017680 v -0.518256 -1.867660 -1.599820 v -0.518256 -2.415470 -1.753650 v -0.518256 -1.867660 0.388859 v -1.054730 -1.867660 -0.162550 v -0.518256 -2.415470 0.542683 v -1.137720 -2.415470 -0.096406 v -0.000983 2.917570 1.303750 v 0.308856 2.959850 1.056050 v -0.310821 2.959850 1.056050 v 0.772330 0.306789 -0.629165 v 0.524808 0.367690 -0.391761 v 0.526487 0.255771 -0.824008 v -0.766092 0.306917 -0.629165 v -0.518571 0.367818 -0.391761 v -0.520249 0.255899 -0.824008 v 0.140461 5.000000 0.222243 v 0.140461 3.640850 1.006940 v 0.317858 3.640850 0.559210 v 0.317858 4.612230 -0.001623 v 0.214012 3.640850 -0.194985 v 0.452599 3.640850 -0.502283 v 0.452599 3.692970 -0.532369 v 0.214012 3.959100 -0.378719 v 0.714528 1.021120 -0.143193 v -0.712109 1.021400 -0.143477 v -0.712109 1.376680 -0.803557 v 0.714528 1.377240 -0.803840 v 0.714528 -2.270020 -0.142259 v -0.712109 -2.270590 -0.142259 v 0.714528 1.571190 0.504697 v -0.712109 1.571190 0.505264 v -0.712109 -2.785380 0.507308 v 0.714528 -2.785670 0.507592 v 0.706189 -2.300900 1.729860 v -0.712364 -2.300900 1.729860 v 0.714528 1.579410 -0.738342 v -0.712109 1.579690 -0.738626 v 0.706189 -4.495300 0.837298 v -0.712364 -4.495300 0.837298 v -0.574944 -2.957240 -1.674350 v -0.572392 -2.957240 1.333200 v -0.574944 -2.385050 1.333200 v -0.574944 -2.385050 -1.674350 v 0.414171 -4.789610 0.893328 v 0.414772 -4.419140 0.823549 v 0.414772 -3.198420 1.282450 v 0.414171 -3.377750 1.648680 v -0.410785 -4.791630 0.889906 v -0.410182 -4.419080 0.823580 v -0.410785 -3.379770 1.645260 v -0.410182 -3.200400 1.279000 v -0.410786 -0.286843 2.128420 v -0.410786 3.215650 1.146770 v -0.410182 3.013940 0.809358 v -0.410182 -0.286991 1.746150 v 0.414171 -0.284830 2.131840 v 0.414772 -0.285006 1.749770 v 0.414772 3.015900 0.812803 v 0.414171 3.217670 1.150200 v 1.135370 -3.640850 -1.717790 v 0.842189 -3.640850 -1.620540 v 0.842189 -4.557250 -1.091450 v 1.135370 -4.641490 -1.140080 v 1.135370 -2.640210 -1.140080 v 0.842189 -2.724450 -1.091450 v 0.399299 -2.281710 -1.347060 v 0.399299 -2.305490 0.202052 v 1.135370 -2.640210 0.015344 v 0.399299 -3.640850 1.007030 v 1.135370 -3.640850 0.593059 v 0.842189 -3.640850 0.495805 v 0.842189 -2.724450 -0.033283 v 1.135370 -4.641490 0.015344 v 0.842189 -4.557250 -0.033283 v -0.962058 -3.692970 -0.592454 v -0.962058 -3.640850 -0.622539 v -0.600562 -3.640850 -0.929834 v -0.600562 -3.959100 -0.746100 v -0.962058 -3.610770 -0.614478 v -0.600562 -3.355270 -0.790732 v -0.962058 -3.588740 -0.532281 v -0.600562 -3.322610 -0.378634 v -0.839770 -2.724450 -1.091450 v -0.839770 -3.640850 -1.620540 v -0.839770 -2.724450 -0.033283 v -0.839770 -3.640850 0.495805 v -1.132950 -3.640850 0.593059 v -1.132950 -2.640210 0.015344 v -0.839770 -4.557250 -0.033283 v -1.132950 -4.641490 0.015344 v -0.839770 -4.557250 -1.091450 v -1.132950 -3.640850 -1.717790 v -1.132950 -4.641490 -1.140080 v -1.132950 -2.640210 -1.140080 v -0.396881 -3.640850 1.007030 v -0.396881 -2.305490 0.202052 v -0.396881 -2.281710 -1.347060 v 0.602980 -3.959100 -0.746100 v 0.602980 -3.640850 -0.929834 v 0.964477 -3.640850 -0.622539 v 0.964477 -3.692970 -0.592454 v 0.602980 -3.355270 -0.790732 v 0.602980 -3.322610 -0.378634 v 0.602980 -3.640850 -0.194900 v 0.964477 -3.640850 -0.502195 v 0.964477 -3.588740 -0.532281 v 0.602980 -3.959100 -0.378634 v 0.964477 -3.692970 -0.532281 v 0.964477 -3.610770 -0.614478 v 1.325660 -0.468297 0.898874 v 0.457660 -0.468297 0.898874 v 0.457660 -0.284371 1.760080 v 1.071430 -0.340234 1.490860 v 0.891658 -2.325240 1.300490 v 1.071430 -2.325240 0.898874 v 0.457660 -2.325240 1.490860 v 0.577362 3.300180 0.034222 v 0.577362 3.633650 0.132795 v 0.577362 3.633650 1.115260 v -0.457660 -3.577510 0.899609 v 0.457661 -3.577510 0.898874 v 0.140461 3.640850 -2.131840 v 0.140461 5.000000 -1.347150 v 0.317858 4.612230 -1.123280 v 0.317858 3.640850 -1.684110 v -0.315440 3.640850 -1.684110 v -0.315440 4.612230 -1.123280 v -0.138043 5.000000 -1.347150 v -0.138043 3.640850 -2.131840 v -0.450184 3.640850 -0.502283 v -0.211594 3.640850 -0.194985 v -0.211594 3.959100 -0.378719 v -0.450184 3.692970 -0.532369 v -0.962058 -3.640850 -0.502195 v -0.962058 -3.692970 -0.532281 v -0.600562 -3.959100 -0.378634 v -0.600562 -3.640850 -0.194900 v 0.317858 3.080040 0.408931 v 0.317858 2.669470 -1.123280 v -0.138043 5.000000 0.222243 v -0.315440 4.612230 -0.001623 v -0.315440 3.640850 0.559210 v -0.315440 3.080040 0.408931 v -0.315440 2.669470 -1.123280 v 0.577362 1.255610 0.330603 v -0.574944 1.255610 0.330603 v 0.577362 1.921920 1.115260 v -0.138043 3.640850 1.006940 v 0.577363 -2.957240 1.333200 v 0.577363 -2.957240 -1.674350 v 0.577363 -2.385050 -1.674350 v 0.577363 -2.385050 1.333200 v -0.574944 3.300180 0.034222 v -0.574944 3.633650 0.132795 v 0.399300 -5.000000 -1.347060 v 0.399299 -3.640850 -2.131760 v 0.399300 -5.000000 0.222328 v -0.396881 -5.000000 0.222328 v -0.396881 -5.000000 -1.347060 v -0.396881 -3.640850 -2.131760 v -0.138043 2.281720 -1.347150 v 0.140461 2.281720 -1.347150 vn -0.000743 0.999985 -0.005492 vn -0.000743 0.999985 -0.005492 vn -0.000743 0.999985 -0.005492 vn 0.000718 0.999985 -0.005492 vn 0.000718 0.999985 -0.005492 vn 0.000718 0.999985 -0.005492 vn 0.625342 0.472460 0.621071 vn 0.640959 0.435546 0.632037 vn 0.582743 0.570477 0.578763 vn 0.926572 0.376118 0.000000 vn 0.937603 0.347708 0.000000 vn 0.888463 0.458948 0.000000 vn 0.663704 0.446610 -0.600030 vn 0.672304 0.416744 -0.611826 vn 0.629779 0.528402 -0.569359 vn -0.664629 0.444103 -0.600866 vn -0.631966 0.523635 -0.571336 vn -0.672877 0.415054 -0.612345 vn -0.927460 0.373922 0.000000 vn -0.890631 0.454727 0.000000 vn -0.938148 0.346235 0.000000 vn -0.595900 0.540059 0.594339 vn -0.582777 0.570411 0.578794 vn -0.602443 0.527301 0.599180 vn 0.687853 -0.174024 0.704680 vn 0.688418 -0.131265 0.713338 vn 0.662389 -0.272918 0.697679 vn 0.591628 -0.598810 -0.539818 vn 0.594001 -0.570891 -0.566787 vn 0.551741 -0.692780 -0.464368 vn -0.647689 0.392907 0.652781 vn -0.661032 -0.277461 0.697175 vn -0.691881 0.136840 0.708926 vn -0.592769 -0.574790 -0.564129 vn -0.552189 -0.691885 -0.465169 vn -0.588582 -0.607244 -0.533690 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn -0.599914 0.000000 0.800065 vn -1.000000 0.000000 0.000000 vn -0.811111 0.324440 0.486660 vn -0.811111 0.324440 0.486660 vn -1.000000 0.000000 0.000000 vn -0.816497 0.408248 0.408248 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000699 0.999985 0.005480 vn 0.000699 0.999985 0.005480 vn 0.000699 0.999985 0.005480 vn -0.000698 0.999985 0.005478 vn -0.000698 0.999985 0.005478 vn -0.000698 0.999985 0.005478 vn 0.673354 -0.714121 0.191377 vn 0.673342 -0.714136 0.191363 vn 0.673354 -0.714121 0.191377 vn 0.673354 -0.714121 0.191377 vn 0.673366 -0.714107 0.191390 vn 0.673354 -0.714121 0.191377 vn 0.744592 0.333728 -0.578108 vn 0.744582 0.333755 -0.578105 vn 0.744592 0.333728 -0.578108 vn 0.744592 0.333728 -0.578108 vn 0.744602 0.333700 -0.578111 vn 0.744592 0.333728 -0.578108 vn -0.744573 0.333738 -0.578126 vn -0.744563 0.333722 -0.578149 vn -0.744573 0.333738 -0.578126 vn -0.744573 0.333738 -0.578126 vn -0.744583 0.333754 -0.578104 vn -0.744573 0.333738 -0.578126 vn -0.673333 -0.714140 0.191382 vn -0.673321 -0.714146 0.191401 vn -0.673333 -0.714140 0.191382 vn -0.673333 -0.714140 0.191382 vn -0.673344 -0.714134 0.191363 vn -0.673333 -0.714140 0.191382 vn 0.002331 0.977460 -0.211106 vn 0.004663 0.976965 -0.213351 vn 0.002331 0.977460 -0.211106 vn 0.002331 0.977460 -0.211106 vn -0.000001 0.977946 -0.208859 vn 0.002331 0.977460 -0.211106 vn -0.903985 -0.122696 0.409581 vn -0.799352 -0.228167 0.555856 vn -0.903985 -0.122696 0.409581 vn -0.903985 -0.122696 0.409581 vn -0.902264 -0.121393 0.413744 vn -0.903985 -0.122696 0.409581 vn -0.394098 -0.121856 0.910954 vn -0.398634 -0.123259 0.908790 vn -0.490719 -0.192101 0.849878 vn -0.490719 -0.192101 0.849878 vn -0.389551 -0.120450 0.913095 vn -0.394098 -0.121856 0.910954 vn 0.000043 0.155041 0.987908 vn -0.000160 0.267717 0.963498 vn 0.000109 0.267854 0.963459 vn 0.000109 0.267854 0.963459 vn 0.000097 0.038651 0.999253 vn 0.000043 0.155041 0.987908 vn 0.999999 -0.000576 0.000909 vn 0.999998 -0.000573 0.001787 vn 1.000000 -0.000230 0.000364 vn 1.000000 -0.000230 0.000364 vn 0.999998 -0.000006 -0.001755 vn 0.999999 -0.000576 0.000909 vn 0.000271 0.313993 0.949425 vn 0.000307 0.313878 0.949463 vn 0.000007 0.515151 0.857099 vn 0.000007 0.515151 0.857099 vn 0.000039 0.515343 0.856984 vn 0.000271 0.313993 0.949425 vn 0.000357 0.862030 0.506857 vn 0.000039 0.515343 0.856984 vn 0.000007 0.515151 0.857099 vn 0.000007 0.515151 0.857099 vn -0.000250 0.862853 0.505454 vn 0.000357 0.862030 0.506857 vn -1.000000 0.000230 -0.000361 vn -0.999999 0.000381 -0.001187 vn -0.999999 0.000574 -0.000903 vn -0.999999 0.000574 -0.000903 vn -0.999998 0.000006 0.001754 vn -1.000000 0.000230 -0.000361 vn 0.000357 0.862030 0.506857 vn -0.000250 0.862853 0.505454 vn 0.000024 0.999759 0.021930 vn 0.000024 0.999759 0.021930 vn 0.000112 0.999682 0.025216 vn 0.000357 0.862030 0.506857 vn -0.000467 0.881578 -0.472039 vn 0.000112 0.999682 0.025216 vn 0.000024 0.999759 0.021930 vn 0.000024 0.999759 0.021930 vn 0.000000 0.880871 -0.473357 vn -0.000467 0.881578 -0.472039 vn 1.000000 -0.000001 0.000000 vn 1.000000 -0.000001 0.000000 vn 1.000000 -0.000001 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 -0.000000 -0.000000 vn 0.702281 0.081388 -0.707232 vn 0.704408 0.082984 -0.704928 vn 0.700899 0.011030 -0.713176 vn 0.700899 0.011030 -0.713176 vn 0.694295 0.017206 -0.719485 vn 0.702281 0.081388 -0.707232 vn 0.700899 0.011030 -0.713176 vn 0.706112 -0.073321 -0.704293 vn 0.696019 -0.059397 -0.715562 vn 0.696019 -0.059397 -0.715562 vn 0.694295 0.017206 -0.719485 vn 0.700899 0.011030 -0.713176 vn 0.999969 0.006812 0.003820 vn 0.999969 0.006812 0.003820 vn 0.999969 0.006812 0.003820 vn 0.048781 -0.973335 -0.224140 vn 0.048781 -0.973335 -0.224140 vn 0.048781 -0.973335 -0.224140 vn 0.616527 -0.455030 0.642528 vn 0.621990 -0.495190 0.606560 vn 0.609092 -0.504148 0.612243 vn 0.609092 -0.504148 0.612243 vn 0.607610 -0.415188 0.677073 vn 0.616527 -0.455030 0.642528 vn 0.610395 -0.364234 0.703386 vn 0.616527 -0.455030 0.642528 vn 0.607610 -0.415188 0.677073 vn 0.607610 -0.415188 0.677073 vn 0.595417 -0.376139 0.709928 vn 0.610395 -0.364234 0.703386 vn -0.702286 0.081394 -0.707227 vn -0.694300 0.017208 -0.719480 vn -0.700905 0.011032 -0.713169 vn -0.700905 0.011032 -0.713169 vn -0.704413 0.082990 -0.704922 vn -0.702286 0.081394 -0.707227 vn -0.675829 0.082684 0.732406 vn -0.595409 -0.376159 0.709924 vn -0.607634 -0.415185 0.677055 vn -0.607634 -0.415185 0.677055 vn -0.616553 -0.455024 0.642507 vn -0.675829 0.082684 0.732406 vn -0.616553 -0.455024 0.642507 vn -0.607634 -0.415185 0.677055 vn -0.609116 -0.504146 0.612221 vn -0.609116 -0.504146 0.612221 vn -0.621991 -0.495204 0.606548 vn -0.616553 -0.455024 0.642507 vn -0.048838 -0.973348 -0.224072 vn -0.048838 -0.973348 -0.224072 vn -0.048838 -0.973348 -0.224072 vn -0.999740 -0.022606 -0.002949 vn -0.999740 -0.022606 -0.002949 vn -0.999740 -0.022606 -0.002949 vn -0.700905 0.011032 -0.713169 vn -0.694300 0.017208 -0.719480 vn -0.696027 -0.059400 -0.715555 vn -0.696027 -0.059400 -0.715555 vn -0.706121 -0.073324 -0.704285 vn -0.700905 0.011032 -0.713169 vn 0.704251 0.190559 0.683899 vn 0.688965 0.275729 0.670299 vn 0.687040 0.278466 0.671143 vn 0.687040 0.278466 0.671143 vn 0.704711 0.191809 0.683075 vn 0.704251 0.190559 0.683899 vn 0.687040 0.278466 0.671143 vn 0.688965 0.275729 0.670299 vn 0.640959 0.435546 0.632037 vn 0.640959 0.435546 0.632037 vn 0.625342 0.472460 0.621071 vn 0.687040 0.278466 0.671143 vn 0.708345 0.274442 -0.650330 vn 0.707541 0.272475 -0.652030 vn 0.672304 0.416744 -0.611826 vn 0.672304 0.416744 -0.611826 vn 0.663704 0.446610 -0.600030 vn 0.708345 0.274442 -0.650330 vn 0.721616 0.188328 -0.666185 vn 0.707541 0.272475 -0.652030 vn 0.708345 0.274442 -0.650330 vn 0.708345 0.274442 -0.650330 vn 0.720830 0.189714 -0.666643 vn 0.721616 0.188328 -0.666185 vn -0.721590 0.188506 -0.666163 vn -0.702755 0.303219 -0.643579 vn -0.712532 0.245132 -0.657425 vn -0.712532 0.245132 -0.657425 vn -0.721174 0.187288 -0.666957 vn -0.721590 0.188506 -0.666163 vn -0.702755 0.303219 -0.643579 vn -0.664629 0.444103 -0.600866 vn -0.672877 0.415054 -0.612345 vn -0.672877 0.415054 -0.612345 vn -0.712532 0.245132 -0.657425 vn -0.702755 0.303219 -0.643579 vn -0.679692 0.307884 0.665752 vn -0.595900 0.540059 0.594339 vn -0.602443 0.527301 0.599180 vn -0.602443 0.527301 0.599180 vn -0.694780 0.248012 0.675108 vn -0.679692 0.307884 0.665752 vn -0.704225 0.190745 0.683874 vn -0.679692 0.307884 0.665752 vn -0.694780 0.248012 0.675108 vn -0.694780 0.248012 0.675108 vn -0.705059 0.189329 0.683408 vn -0.704225 0.190745 0.683874 vn 0.642677 -0.271201 0.716531 vn 0.659250 -0.292887 0.692537 vn 0.642677 -0.271201 0.716531 vn 0.642677 -0.271201 0.716531 vn 0.625255 -0.249155 0.739579 vn 0.642677 -0.271201 0.716531 vn -0.681198 0.128774 0.720685 vn -0.667586 -0.262122 0.696865 vn -0.644017 -0.283982 0.710349 vn -0.644017 -0.283982 0.710349 vn -0.619666 -0.305497 0.722970 vn -0.681198 0.128774 0.720685 vn 0.700903 0.011034 0.713172 vn 0.694302 0.017207 0.719478 vn 0.688418 -0.131265 0.713338 vn 0.688418 -0.131265 0.713338 vn 0.687853 -0.174024 0.704680 vn 0.700903 0.011034 0.713172 vn 0.616534 -0.455022 -0.642526 vn 0.607620 -0.415184 -0.677067 vn 0.594001 -0.570891 -0.566787 vn 0.594001 -0.570891 -0.566787 vn 0.591628 -0.598810 -0.539818 vn 0.616534 -0.455022 -0.642526 vn -0.700904 0.011034 0.713171 vn -0.647689 0.392907 0.652781 vn -0.691881 0.136840 0.708926 vn -0.691881 0.136840 0.708926 vn -0.694303 0.017206 0.719477 vn -0.700904 0.011034 0.713171 vn -0.611277 -0.439211 -0.658357 vn -0.613687 -0.431178 -0.661418 vn -0.592769 -0.574790 -0.564129 vn -0.592769 -0.574790 -0.564129 vn -0.588582 -0.607244 -0.533690 vn -0.611277 -0.439211 -0.658357 vn 0.927362 0.282840 0.244951 vn 0.909349 0.208015 0.360297 vn 0.909352 0.208014 0.360291 vn 0.909352 0.208014 0.360291 vn 0.927365 0.353545 0.122473 vn 0.927362 0.282840 0.244951 vn 0.786773 0.088571 0.610855 vn 0.786775 0.088557 0.610854 vn 0.744591 0.333732 0.578107 vn 0.744591 0.333732 0.578107 vn 0.744583 0.333755 0.578104 vn 0.786773 0.088571 0.610855 vn 0.000086 -0.880405 -0.474223 vn -0.000078 -0.880553 -0.473947 vn 0.000086 -0.880405 -0.474223 vn 0.000086 -0.880405 -0.474223 vn 0.000251 -0.880256 -0.474499 vn 0.000086 -0.880405 -0.474223 vn 0.000100 -0.000327 -1.000000 vn 0.000000 -0.000284 -1.000000 vn 0.000100 -0.000327 -1.000000 vn 0.000100 -0.000327 -1.000000 vn 0.000199 -0.000370 -1.000000 vn 0.000100 -0.000327 -1.000000 vn -0.000011 -0.762599 0.646871 vn 0.000257 -0.762309 0.647214 vn -0.000011 -0.762599 0.646871 vn -0.000011 -0.762599 0.646871 vn -0.000278 -0.762890 0.646528 vn -0.000011 -0.762599 0.646871 vn 0.000099 0.000567 1.000000 vn -0.000199 0.000664 1.000000 vn 0.000099 0.000567 1.000000 vn 0.000099 0.000567 1.000000 vn 0.000397 0.000469 1.000000 vn 0.000099 0.000567 1.000000 vn -0.000189 -0.301605 -0.953433 vn -0.000000 -0.301668 -0.953413 vn -0.000189 -0.301605 -0.953433 vn -0.000189 -0.301605 -0.953433 vn -0.000379 -0.301541 -0.953453 vn -0.000189 -0.301605 -0.953433 vn 0.000099 0.999977 0.006723 vn 0.000195 0.999978 0.006613 vn 0.000099 0.999977 0.006723 vn 0.000099 0.999977 0.006723 vn 0.000003 0.999977 0.006833 vn 0.000099 0.999977 0.006723 vn 0.999977 0.000111 0.006741 vn 0.999993 -0.001036 0.003532 vn 0.999899 -0.000597 0.014176 vn 0.999899 -0.000597 0.014176 vn 0.999964 0.000006 0.008458 vn 0.999977 0.000111 0.006741 vn -1.000000 0.000025 -0.000114 vn -1.000000 0.000101 -0.000249 vn -1.000000 0.000024 -0.000251 vn -1.000000 0.000024 -0.000251 vn -1.000000 -0.000014 -0.000163 vn -1.000000 0.000025 -0.000114 vn -0.999997 -0.002230 0.000424 vn -0.999990 -0.004460 0.000849 vn -0.999999 -0.001115 0.000212 vn -0.999999 -0.001115 0.000212 vn -1.000000 -0.000000 0.000000 vn -0.999997 -0.002230 0.000424 vn 0.000139 -0.783537 -0.621345 vn 0.000313 -0.783723 -0.621110 vn 0.000139 -0.783537 -0.621345 vn 0.000139 -0.783537 -0.621345 vn -0.000035 -0.783350 -0.621580 vn 0.000139 -0.783537 -0.621345 vn -0.000030 0.306422 -0.951896 vn 0.000249 0.304639 -0.952468 vn -0.000030 0.306422 -0.951896 vn -0.000030 0.306422 -0.951896 vn -0.000310 0.308204 -0.951320 vn -0.000030 0.306422 -0.951896 vn -0.611277 -0.439211 -0.658357 vn -0.595416 -0.376148 -0.709924 vn -0.610400 -0.364238 -0.703380 vn -0.610400 -0.364238 -0.703380 vn -0.613687 -0.431178 -0.661418 vn -0.611277 -0.439211 -0.658357 vn -0.700904 0.011034 0.713171 vn -0.694303 0.017206 0.719477 vn -0.702287 0.081390 0.707226 vn -0.702287 0.081390 0.707226 vn -0.620937 0.478256 0.621054 vn -0.700904 0.011034 0.713171 vn -0.000989 0.999997 0.002367 vn -0.002222 0.999982 0.005661 vn -0.000989 0.999997 0.002367 vn -0.000989 0.999997 0.002367 vn 0.000243 1.000000 -0.000927 vn -0.000989 0.999997 0.002367 vn 0.000078 -0.189427 -0.981895 vn 0.000157 -0.189364 -0.981907 vn 0.000078 -0.189427 -0.981895 vn 0.000078 -0.189427 -0.981895 vn -0.000000 -0.189489 -0.981883 vn 0.000078 -0.189427 -0.981895 vn 0.999997 -0.000888 0.002088 vn 0.999995 -0.001081 0.002875 vn 0.999997 -0.000888 0.002088 vn 0.999997 -0.000888 0.002088 vn 0.999999 -0.000696 0.001300 vn 0.999997 -0.000888 0.002088 vn 0.002240 -0.180192 -0.983629 vn -0.000050 -0.175276 -0.984519 vn 0.002240 -0.180192 -0.983629 vn 0.002240 -0.180192 -0.983629 vn 0.004530 -0.185103 -0.982709 vn 0.002240 -0.180192 -0.983629 vn -0.999997 0.000897 -0.002119 vn -0.999999 0.000698 -0.001305 vn -0.999997 0.000897 -0.002119 vn -0.999997 0.000897 -0.002119 vn -0.999995 0.001096 -0.002933 vn -0.999997 0.000897 -0.002119 vn -0.999999 -0.000439 -0.001557 vn -0.999999 -0.000430 -0.001533 vn -0.999999 -0.000439 -0.001557 vn -0.999999 -0.000439 -0.001557 vn -0.999999 -0.000448 -0.001580 vn -0.999999 -0.000439 -0.001557 vn -0.999999 0.000246 -0.001553 vn -0.999999 0.000246 -0.001580 vn -0.999999 0.000246 -0.001553 vn -0.999999 0.000246 -0.001553 vn -0.999999 0.000245 -0.001527 vn -0.999999 0.000246 -0.001553 vn 0.999999 0.000437 0.001549 vn 0.999999 0.000447 0.001573 vn 0.999999 0.000437 0.001549 vn 0.999999 0.000437 0.001549 vn 0.999999 0.000428 0.001526 vn 0.999999 0.000437 0.001549 vn 0.999999 -0.000245 0.001547 vn 0.999999 -0.000244 0.001522 vn 0.999999 -0.000245 0.001547 vn 0.999999 -0.000245 0.001547 vn 0.999999 -0.000246 0.001573 vn 0.999999 -0.000245 0.001547 vn 0.000068 0.858280 -0.513181 vn 0.000032 0.858242 -0.513246 vn 0.000068 0.858280 -0.513181 vn 0.000068 0.858280 -0.513181 vn 0.000103 0.858319 -0.513116 vn 0.000068 0.858280 -0.513181 vn 0.276120 0.480561 0.832358 vn 0.276099 0.480569 0.832360 vn 0.276120 0.480561 0.832358 vn 0.276120 0.480561 0.832358 vn 0.276140 0.480553 0.832355 vn 0.276120 0.480561 0.832358 vn 0.276120 -0.480561 0.832358 vn 0.276140 -0.480553 0.832355 vn 0.276120 -0.480561 0.832358 vn 0.276120 -0.480561 0.832358 vn 0.276099 -0.480569 0.832360 vn 0.276120 -0.480561 0.832358 vn 0.424355 0.905469 0.006912 vn 0.222955 0.974714 0.014962 vn 0.217367 0.976023 0.011403 vn 0.217367 0.976023 0.011403 vn 0.413949 0.910300 0.000000 vn 0.424355 0.905469 0.006912 vn 0.424942 0.460043 0.779606 vn 0.210670 0.504682 0.837206 vn 0.217679 0.500158 0.838128 vn 0.217679 0.500158 0.838128 vn 0.437882 0.449514 0.778586 vn 0.424942 0.460043 0.779606 vn 0.276123 -0.480561 -0.832356 vn 0.276111 -0.480560 -0.832361 vn 0.276123 -0.480561 -0.832356 vn 0.276123 -0.480561 -0.832356 vn 0.276134 -0.480563 -0.832352 vn 0.276123 -0.480561 -0.832356 vn 0.276122 0.480561 -0.832357 vn 0.276133 0.480557 -0.832355 vn 0.276122 0.480561 -0.832357 vn 0.276122 0.480561 -0.832357 vn 0.276110 0.480566 -0.832358 vn 0.276122 0.480561 -0.832357 vn -0.592861 -0.402613 -0.697437 vn -0.592873 -0.402582 -0.697445 vn -0.592861 -0.402613 -0.697437 vn -0.592861 -0.402613 -0.697437 vn -0.592850 -0.402644 -0.697429 vn -0.592861 -0.402613 -0.697437 vn -0.579401 0.283342 -0.764207 vn -0.547283 0.216647 -0.808421 vn -0.579401 0.283342 -0.764207 vn -0.579401 0.283342 -0.764207 vn -0.607210 0.347931 -0.714311 vn -0.579401 0.283342 -0.764207 vn -0.558077 0.817334 -0.143232 vn -0.515165 0.827873 -0.221884 vn -0.558077 0.817334 -0.143232 vn -0.558077 0.817334 -0.143232 vn -0.596448 0.800143 -0.063414 vn -0.558077 0.817334 -0.143232 vn -0.938657 -0.059429 0.339692 vn -0.941089 -0.311026 0.132716 vn -0.942176 -0.242620 0.231169 vn -0.942176 -0.242620 0.231169 vn -0.943068 0.062854 0.326608 vn -0.938657 -0.059429 0.339692 vn -0.941089 -0.311026 0.132716 vn -0.944792 -0.292057 -0.148560 vn -0.946228 -0.283369 -0.156057 vn -0.946228 -0.283369 -0.156057 vn -0.942176 -0.242620 0.231169 vn -0.941089 -0.311026 0.132716 vn -0.276123 -0.480561 -0.832356 vn -0.276112 -0.480560 -0.832361 vn -0.276123 -0.480561 -0.832356 vn -0.276123 -0.480561 -0.832356 vn -0.276135 -0.480562 -0.832352 vn -0.276123 -0.480561 -0.832356 vn -0.276123 0.480561 -0.832356 vn -0.276135 0.480562 -0.832352 vn -0.276123 0.480561 -0.832356 vn -0.276123 0.480561 -0.832356 vn -0.276112 0.480560 -0.832361 vn -0.276123 0.480561 -0.832356 vn -0.276121 0.480560 0.832358 vn -0.276100 0.480569 0.832360 vn -0.276121 0.480560 0.832358 vn -0.276121 0.480560 0.832358 vn -0.276141 0.480552 0.832355 vn -0.276121 0.480560 0.832358 vn -0.276123 -0.480560 0.832357 vn -0.276143 -0.480563 0.832349 vn -0.276123 -0.480560 0.832357 vn -0.276123 -0.480560 0.832357 vn -0.276102 -0.480558 0.832365 vn -0.276123 -0.480560 0.832357 vn -0.421090 0.460858 0.781213 vn -0.222555 0.503321 0.834948 vn -0.215604 0.500339 0.838556 vn -0.215604 0.500339 0.838556 vn -0.408117 0.456462 0.790622 vn -0.421090 0.460858 0.781213 vn -0.424356 0.905469 0.006912 vn -0.413950 0.910300 0.000000 vn -0.289033 0.957268 0.009935 vn -0.289033 0.957268 0.009935 vn -0.148207 0.988840 0.015179 vn -0.424356 0.905469 0.006912 vn 0.592844 -0.402620 -0.697448 vn 0.592855 -0.402642 -0.697425 vn 0.592844 -0.402620 -0.697448 vn 0.592844 -0.402620 -0.697448 vn 0.592832 -0.402597 -0.697471 vn 0.592844 -0.402620 -0.697448 vn 0.942184 -0.055334 0.330497 vn 0.944062 -0.306537 0.121578 vn 0.944512 -0.233903 0.230622 vn 0.944512 -0.233903 0.230622 vn 0.942465 0.072251 0.326404 vn 0.942184 -0.055334 0.330497 vn 0.944062 -0.306537 0.121578 vn 0.944935 -0.283415 -0.163629 vn 0.948164 -0.276399 -0.156807 vn 0.948164 -0.276399 -0.156807 vn 0.944512 -0.233903 0.230622 vn 0.944062 -0.306537 0.121578 vn 0.592852 0.402656 0.697420 vn 0.592850 0.402659 0.697420 vn 0.592852 0.402656 0.697420 vn 0.592852 0.402656 0.697420 vn 0.592853 0.402652 0.697421 vn 0.592852 0.402656 0.697420 vn 0.592859 -0.402619 0.697435 vn 0.592850 -0.402644 0.697429 vn 0.592859 -0.402619 0.697435 vn 0.592859 -0.402619 0.697435 vn 0.592869 -0.402594 0.697442 vn 0.592859 -0.402619 0.697435 vn 0.618647 0.276224 -0.735511 vn 0.598890 0.350685 -0.719966 vn 0.618647 0.276224 -0.735511 vn 0.618647 0.276224 -0.735511 vn 0.634583 0.200056 -0.746513 vn 0.618647 0.276224 -0.735511 vn 0.558076 0.817334 -0.143232 vn 0.515164 0.827873 -0.221884 vn 0.558076 0.817334 -0.143232 vn 0.558076 0.817334 -0.143232 vn 0.596447 0.800144 -0.063414 vn 0.558076 0.817334 -0.143232 vn -0.744580 -0.333764 -0.578102 vn -0.744582 -0.333760 -0.578102 vn -0.744580 -0.333764 -0.578102 vn -0.744580 -0.333764 -0.578102 vn -0.744578 -0.333769 -0.578102 vn -0.744580 -0.333764 -0.578102 vn 0.744582 -0.333763 -0.578100 vn 0.744583 -0.333766 -0.578097 vn 0.744582 -0.333763 -0.578100 vn 0.744582 -0.333763 -0.578100 vn 0.744580 -0.333761 -0.578104 vn 0.744582 -0.333763 -0.578100 vn -0.002331 0.977461 -0.211103 vn -0.000000 0.977946 -0.208858 vn -0.002331 0.977461 -0.211103 vn -0.002331 0.977461 -0.211103 vn -0.004661 0.976966 -0.213346 vn -0.002331 0.977461 -0.211103 vn 0.903987 -0.122696 0.409578 vn 0.902265 -0.121393 0.413741 vn 0.903987 -0.122696 0.409578 vn 0.903987 -0.122696 0.409578 vn 0.799355 -0.228167 0.555852 vn 0.903987 -0.122696 0.409578 vn 0.394098 -0.121856 0.910954 vn 0.389551 -0.120450 0.913095 vn 0.490720 -0.192101 0.849877 vn 0.490720 -0.192101 0.849877 vn 0.398634 -0.123259 0.908790 vn 0.394098 -0.121856 0.910954 vn 0.610400 -0.364238 -0.703380 vn 0.595417 -0.376147 -0.709924 vn 0.607620 -0.415184 -0.677067 vn 0.607620 -0.415184 -0.677067 vn 0.616534 -0.455022 -0.642526 vn 0.610400 -0.364238 -0.703380 vn 0.700903 0.011034 0.713172 vn 0.704412 0.082986 0.704923 vn 0.702286 0.081391 0.707227 vn 0.702286 0.081391 0.707227 vn 0.694302 0.017207 0.719478 vn 0.700903 0.011034 0.713172 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 0.000000 vn -0.000023 -0.229526 0.973303 vn 0.000043 0.155041 0.987908 vn 0.000097 0.038651 0.999253 vn 0.000097 0.038651 0.999253 vn -0.000000 -0.229513 0.973306 vn -0.000023 -0.229526 0.973303 vn -1.000000 -0.000014 -0.000163 vn -1.000000 0.000024 -0.000251 vn -1.000000 -0.000034 -0.000302 vn -1.000000 -0.000034 -0.000302 vn -1.000000 -0.000041 -0.000310 vn -1.000000 -0.000014 -0.000163 vn 0.999977 0.000111 0.006741 vn 0.999964 0.002719 0.008010 vn 0.999981 0.000929 0.006048 vn 0.999981 0.000929 0.006048 vn 0.999993 -0.001036 0.003532 vn 0.999977 0.000111 0.006741 vn -0.799352 -0.228167 0.555856 vn -0.657213 -0.322117 0.681404 vn -0.490719 -0.192101 0.849878 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn 0.490720 -0.192101 0.849877 vn 0.657216 -0.322118 0.681401 vn 0.799355 -0.228167 0.555852 vn 0.927360 0.070710 -0.367429 vn 0.927366 0.353544 -0.122474 vn 0.927362 0.282839 -0.244952 vn 0.927362 0.282839 -0.244952 vn 0.927359 -0.070711 -0.367430 vn 0.927360 0.070710 -0.367429 vn -0.927360 0.070708 -0.367428 vn -0.927366 0.353544 -0.122473 vn -0.927363 0.282838 -0.244950 vn -0.927363 0.282838 -0.244950 vn -0.927359 -0.070713 -0.367431 vn -0.927360 0.070708 -0.367428 vn -0.786765 0.088575 0.610865 vn -0.786769 0.088585 0.610857 vn -0.744575 0.333741 0.578122 vn -0.744575 0.333741 0.578122 vn -0.744567 0.333728 0.578140 vn -0.786765 0.088575 0.610865 vn -0.004657 0.269868 0.962886 vn -0.004650 0.269867 0.962886 vn -0.004657 0.269868 0.962886 vn -0.004657 0.269868 0.962886 vn -0.004664 0.269870 0.962885 vn -0.004657 0.269868 0.962886 vn -0.592847 -0.402624 0.697443 vn -0.592837 -0.402606 0.697462 vn -0.592847 -0.402624 0.697443 vn -0.592847 -0.402624 0.697443 vn -0.592856 -0.402642 0.697425 vn -0.592847 -0.402624 0.697443 vn -0.944935 -0.000001 -0.327258 vn -0.943065 0.314284 -0.108873 vn -0.943066 0.251426 -0.217742 vn -0.943066 0.251426 -0.217742 vn -0.944936 -0.000000 -0.327254 vn -0.944935 -0.000001 -0.327258 vn -0.943067 0.251424 0.217740 vn -0.938657 -0.059429 0.339692 vn -0.943068 0.062854 0.326608 vn -0.943068 0.062854 0.326608 vn -0.943065 0.314286 0.108870 vn -0.943067 0.251424 0.217740 vn 0.943065 0.251427 0.217743 vn 0.942184 -0.055334 0.330497 vn 0.942465 0.072251 0.326404 vn 0.942465 0.072251 0.326404 vn 0.943065 0.314286 0.108874 vn 0.943065 0.251427 0.217743 vn 0.944935 -0.000001 -0.327257 vn 0.943065 0.314287 -0.108871 vn 0.943066 0.251426 -0.217741 vn 0.943066 0.251426 -0.217741 vn 0.944936 -0.000003 -0.327256 vn 0.944935 -0.000001 -0.327257 vn 0.990652 -0.001821 -0.136404 vn 0.989439 0.110987 -0.093238 vn 0.989438 0.110988 -0.093238 vn 0.989438 0.110988 -0.093238 vn 0.989851 -0.040223 -0.136296 vn 0.990652 -0.001821 -0.136404 vn 0.990251 0.132327 0.043505 vn 0.990251 0.132327 0.043505 vn 0.989438 0.110988 -0.093238 vn 0.989438 0.110988 -0.093238 vn 0.989439 0.110987 -0.093238 vn 0.990251 0.132327 0.043505 vn 0.786773 0.088571 0.610855 vn 0.779424 -0.162161 0.605146 vn 0.779423 -0.162166 0.605146 vn 0.779423 -0.162166 0.605146 vn 0.786775 0.088557 0.610854 vn 0.786773 0.088571 0.610855 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 0.744586 0.667526 0.000000 vn 0.744586 0.667526 0.000000 vn 0.744586 0.667526 0.000000 vn 0.744586 0.667526 0.000000 vn 0.744586 0.667526 0.000000 vn 0.744586 0.667526 0.000000 vn 0.990312 -0.026241 0.136360 vn 0.990312 -0.131214 0.045453 vn 0.990312 -0.104970 0.090907 vn 0.990312 -0.104970 0.090907 vn 0.990312 0.026244 0.136359 vn 0.990312 -0.026241 0.136360 vn 0.990312 -0.131214 0.045453 vn 0.990312 -0.104970 -0.090907 vn 0.990312 -0.131213 -0.045454 vn 0.990312 -0.131213 -0.045454 vn 0.990312 -0.104970 0.090907 vn 0.990312 -0.131214 0.045453 vn 0.927366 0.353544 -0.122474 vn 0.927362 0.282840 0.244951 vn 0.927365 0.353545 0.122473 vn 0.927365 0.353545 0.122473 vn 0.927362 0.282839 -0.244952 vn 0.927366 0.353544 -0.122474 vn 0.000000 0.499992 -0.866030 vn 0.000000 0.499992 -0.866030 vn 0.000000 0.499992 -0.866030 vn 0.000000 0.499992 -0.866030 vn 0.000000 0.499992 -0.866030 vn 0.000000 0.499992 -0.866030 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn -0.927366 0.353544 -0.122473 vn -0.927362 0.282840 0.244952 vn -0.927365 0.353544 0.122474 vn -0.927365 0.353544 0.122474 vn -0.927363 0.282838 -0.244950 vn -0.927366 0.353544 -0.122473 vn -0.990312 -0.026241 0.136360 vn -0.990312 0.026244 0.136359 vn -0.990312 -0.104970 0.090906 vn -0.990312 -0.104970 0.090906 vn -0.990312 -0.131214 0.045453 vn -0.990312 -0.026241 0.136360 vn -0.990312 -0.131214 0.045453 vn -0.990312 -0.104970 0.090906 vn -0.990312 -0.131213 -0.045454 vn -0.990312 -0.131213 -0.045454 vn -0.990312 -0.104970 -0.090907 vn -0.990312 -0.131214 0.045453 vn -0.744582 0.667531 0.000000 vn -0.744582 0.667531 0.000000 vn -0.744582 0.667531 0.000000 vn -0.744582 0.667531 0.000000 vn -0.744582 0.667531 0.000000 vn -0.744582 0.667531 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -0.786765 0.088575 0.610865 vn -0.779422 -0.162171 0.605147 vn -0.779421 -0.162167 0.605149 vn -0.779421 -0.162167 0.605149 vn -0.786769 0.088585 0.610857 vn -0.786765 0.088575 0.610865 vn -0.990652 -0.001821 -0.136404 vn -0.989851 -0.040224 -0.136296 vn -0.989438 0.110988 -0.093238 vn -0.989438 0.110988 -0.093238 vn -0.989439 0.110987 -0.093238 vn -0.990652 -0.001821 -0.136404 vn -0.990251 0.132327 0.043505 vn -0.989439 0.110987 -0.093238 vn -0.989438 0.110988 -0.093238 vn -0.989438 0.110988 -0.093238 vn -0.990251 0.132327 0.043505 vn -0.990251 0.132327 0.043505 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 -0.000000 vn -0.000331 0.550533 -0.834813 vn -0.000332 0.550532 -0.834814 vn -0.000331 0.550533 -0.834813 vn -0.000331 0.550533 -0.834813 vn -0.000330 0.550534 -0.834813 vn -0.000331 0.550533 -0.834813 vn 0.000002 -0.002133 -0.999998 vn -0.000000 -0.001067 -0.999999 vn 0.000004 -0.003200 -0.999995 vn 0.000004 -0.003200 -0.999995 vn 0.000007 -0.003198 -0.999995 vn 0.000002 -0.002133 -0.999998 vn 1.000000 -0.000000 -0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 -0.000230 0.000364 vn 1.000000 -0.000230 0.000364 vn 0.999998 -0.000573 0.001787 vn 1.000000 -0.000000 -0.000000 vn -1.000000 -0.000000 -0.000000 vn -1.000000 -0.000000 -0.000000 vn -0.999999 0.000381 -0.001187 vn -0.999999 0.000381 -0.001187 vn -1.000000 0.000230 -0.000361 vn -1.000000 -0.000000 -0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 -0.000000 vn 1.000000 -0.000000 -0.000000 vn 1.000000 -0.000000 -0.000000 vn 1.000000 -0.000000 -0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 -0.000000 -0.000000 vn 1.000000 -0.000000 -0.000000 vn 1.000000 -0.000000 -0.000000 vn 1.000000 -0.000000 -0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 -0.000000 -0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 -0.000000 -0.000000 vn -1.000000 -0.000000 -0.000000 vn -1.000000 -0.000000 -0.000000 vn -1.000000 0.000000 0.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.988716 0.149803 0.000000 vn 0.975375 0.220553 0.000000 vn 0.975375 0.220553 0.000000 vn 0.975375 0.220553 0.000000 vn 0.988716 0.149803 0.000000 vn 0.988716 0.149803 0.000000 vn 0.975375 0.220553 0.000000 vn 0.975375 0.220553 0.000000 vn 0.937603 0.347708 0.000000 vn 0.937603 0.347708 0.000000 vn 0.926572 0.376118 0.000000 vn 0.975375 0.220553 0.000000 vn -0.988719 0.149785 0.000000 vn -0.969791 0.243936 0.000000 vn -0.980397 0.197034 0.000000 vn -0.980397 0.197034 0.000000 vn -0.988719 0.149785 0.000000 vn -0.988719 0.149785 0.000000 vn -0.969791 0.243936 0.000000 vn -0.927460 0.373922 0.000000 vn -0.938148 0.346235 0.000000 vn -0.938148 0.346235 0.000000 vn -0.980397 0.197034 0.000000 vn -0.969791 0.243936 0.000000 vn -0.599914 0.000000 0.800065 vn -0.534458 0.267274 0.801822 vn -0.408110 0.408276 0.816552 vn -0.408110 0.408276 0.816552 vn 0.000406 -0.000000 1.000000 vn -0.599914 0.000000 0.800065 vn -0.599914 0.000000 0.800065 vn -0.811111 0.324440 0.486660 vn -0.707132 0.000000 0.707082 vn -0.707132 0.000000 0.707082 vn -0.534458 0.267274 0.801822 vn -0.599914 0.000000 0.800065 vn -0.000406 0.000000 -1.000000 vn -0.000406 0.000000 -1.000000 vn -0.000406 0.000000 -1.000000 vn -0.000406 0.000000 -1.000000 vn -0.000406 0.000000 -1.000000 vn -0.000406 0.000000 -1.000000 vn 0.000063 1.000000 0.000000 vn 0.000063 1.000000 0.000000 vn 0.000063 1.000000 0.000000 vn 0.000063 1.000000 0.000000 vn 0.000063 1.000000 0.000000 vn 0.000063 1.000000 0.000000 vn -0.990312 -0.104970 -0.090907 vn -0.990312 -0.131213 -0.045454 vn -0.989851 -0.040224 -0.136296 vn -0.989851 -0.040224 -0.136296 vn -0.990652 -0.001821 -0.136404 vn -0.990312 -0.104970 -0.090907 vn -0.927362 0.282840 0.244952 vn -0.909348 0.208020 0.360297 vn -0.909351 0.208015 0.360293 vn -0.909351 0.208015 0.360293 vn -0.927365 0.353544 0.122474 vn -0.927362 0.282840 0.244952 vn 0.000000 0.499996 0.866028 vn 0.000000 0.499996 0.866028 vn 0.000000 0.499996 0.866028 vn 0.000000 0.499996 0.866028 vn 0.000000 0.499996 0.866028 vn 0.000000 0.499996 0.866028 vn 0.990312 -0.104970 -0.090907 vn 0.990652 -0.001821 -0.136404 vn 0.989851 -0.040223 -0.136296 vn 0.989851 -0.040223 -0.136296 vn 0.990312 -0.131213 -0.045454 vn 0.990312 -0.104970 -0.090907 vn 1.000000 0.000000 -0.000000 vn 0.999977 0.000111 0.006741 vn 0.999964 0.000006 0.008458 vn 0.999964 0.000006 0.008458 vn 1.000000 0.000000 -0.000000 vn 1.000000 0.000000 -0.000000 vn -1.000000 0.000025 -0.000114 vn -1.000000 -0.000014 -0.000163 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 0.000025 -0.000114 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 -0.000230 0.000364 vn 1.000000 0.000000 0.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn -0.999999 -0.001115 0.000212 vn -1.000000 -0.000000 -0.000000 vn -1.000000 0.000230 -0.000361 vn -1.000000 0.000230 -0.000361 vn -1.000000 -0.000000 0.000000 vn -0.999999 -0.001115 0.000212 vn -0.000000 -0.001067 -0.999999 vn 0.000002 -0.002133 -0.999998 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn -0.000000 -0.001067 -0.999999 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 -0.000000 -0.000000 vn -1.000000 -0.000000 -0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -0.000467 0.881578 -0.472039 vn 0.000000 0.880871 -0.473357 vn 0.000000 0.589260 -0.807944 vn 0.000000 0.589260 -0.807944 vn 0.000000 0.440579 -0.897714 vn -0.000467 0.881578 -0.472039 vn 0.000000 0.440579 -0.897714 vn 0.000000 0.589260 -0.807944 vn 0.000000 0.283473 -0.958980 vn 0.000000 0.283473 -0.958980 vn 0.000000 0.283473 -0.958980 vn 0.000000 0.440579 -0.897714 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -1.000000 -0.000014 -0.000163 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 -0.000000 0.000000 vn -0.002501 -0.471734 0.881737 vn -0.002502 -0.471734 0.881737 vn -0.002501 -0.471734 0.881737 vn -0.002501 -0.471734 0.881737 vn -0.002500 -0.471735 0.881737 vn -0.002501 -0.471734 0.881737 vn -0.003719 -0.154342 0.988011 vn -0.003718 -0.154342 0.988011 vn -0.003719 -0.154342 0.988011 vn -0.003719 -0.154342 0.988011 vn -0.003719 -0.154342 0.988010 vn -0.003719 -0.154342 0.988011 vn 0.437878 -0.449513 -0.778589 vn 0.437876 -0.449512 -0.778591 vn 0.298698 -0.477170 -0.826492 vn 0.298698 -0.477170 -0.826492 vn 0.149350 -0.494389 -0.856314 vn 0.437878 -0.449513 -0.778589 vn 0.437875 0.449515 -0.778589 vn 0.224685 0.487216 -0.843882 vn 0.224682 0.487215 -0.843884 vn 0.224682 0.487215 -0.843884 vn 0.437870 0.449513 -0.778593 vn 0.437875 0.449515 -0.778589 vn 0.276157 -0.961113 0.000000 vn 0.276157 -0.961113 0.000000 vn 0.276157 -0.961113 0.000000 vn 0.276157 -0.961113 0.000000 vn 0.276157 -0.961113 0.000000 vn 0.276157 -0.961113 0.000000 vn 0.437881 -0.449514 0.778587 vn 0.149350 -0.494390 0.856313 vn 0.298700 -0.477171 0.826490 vn 0.298700 -0.477171 0.826490 vn 0.437880 -0.449514 0.778587 vn 0.437881 -0.449514 0.778587 vn 0.437882 -0.899032 0.000000 vn 0.224686 -0.974431 0.000000 vn 0.224686 -0.974431 0.000000 vn 0.224686 -0.974431 0.000000 vn 0.437882 -0.899032 0.000000 vn 0.437882 -0.899032 0.000000 vn 0.276157 0.961113 0.000000 vn 0.276157 0.961113 0.000000 vn 0.276157 0.961113 0.000000 vn 0.276157 0.961113 0.000000 vn 0.276157 0.961113 0.000000 vn 0.276157 0.961113 0.000000 vn -0.592854 0.402655 0.697419 vn -0.592853 0.402652 0.697421 vn -0.592854 0.402655 0.697419 vn -0.592854 0.402655 0.697419 vn -0.592856 0.402657 0.697416 vn -0.592854 0.402655 0.697419 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -0.592859 -0.805306 0.000000 vn -0.592859 -0.805306 0.000000 vn -0.592859 -0.805306 0.000000 vn -0.592859 -0.805306 0.000000 vn -0.592859 -0.805306 0.000000 vn -0.592859 -0.805306 0.000000 vn -0.944935 -0.000001 -0.327258 vn -0.944936 -0.000000 -0.327254 vn -0.946228 -0.283369 -0.156057 vn -0.946228 -0.283369 -0.156057 vn -0.944792 -0.292057 -0.148560 vn -0.944935 -0.000001 -0.327258 vn -0.943065 0.314284 -0.108873 vn -0.943067 0.251424 0.217740 vn -0.943065 0.314286 0.108870 vn -0.943065 0.314286 0.108870 vn -0.943066 0.251426 -0.217742 vn -0.943065 0.314284 -0.108873 vn -0.276158 0.961112 0.000000 vn -0.276158 0.961112 0.000000 vn -0.276158 0.961112 0.000000 vn -0.276158 0.961112 0.000000 vn -0.276158 0.961112 0.000000 vn -0.276158 0.961112 0.000000 vn -0.276158 -0.961112 0.000000 vn -0.276158 -0.961112 0.000000 vn -0.276158 -0.961112 0.000000 vn -0.276158 -0.961112 0.000000 vn -0.276158 -0.961112 0.000000 vn -0.276158 -0.961112 0.000000 vn -0.437882 -0.449514 0.778586 vn -0.437881 -0.449514 0.778587 vn -0.224686 -0.487214 0.843883 vn -0.224686 -0.487214 0.843883 vn -0.224686 -0.487214 0.843883 vn -0.437882 -0.449514 0.778586 vn -0.437883 -0.899032 0.000000 vn -0.437883 -0.899032 0.000000 vn -0.298701 -0.954347 0.000000 vn -0.298701 -0.954347 0.000000 vn -0.149350 -0.988784 0.000000 vn -0.437883 -0.899032 0.000000 vn -0.437880 -0.449513 -0.778588 vn -0.437883 -0.449510 -0.778588 vn -0.298699 -0.477170 -0.826491 vn -0.298699 -0.477170 -0.826491 vn -0.149348 -0.494390 -0.856314 vn -0.437880 -0.449513 -0.778588 vn -0.437876 0.449515 -0.778589 vn -0.437872 0.449513 -0.778593 vn -0.298696 0.477172 -0.826491 vn -0.298696 0.477172 -0.826491 vn -0.149350 0.494392 -0.856312 vn -0.437876 0.449515 -0.778589 vn -0.149350 -0.988784 0.000000 vn -0.298701 -0.954347 0.000000 vn 0.224686 -0.974431 0.000000 vn 0.224686 -0.974431 0.000000 vn 0.224686 -0.974431 0.000000 vn -0.149350 -0.988784 0.000000 vn -0.149348 -0.494390 -0.856314 vn -0.298699 -0.477170 -0.826491 vn 0.149350 -0.494389 -0.856314 vn 0.149350 -0.494389 -0.856314 vn 0.298698 -0.477170 -0.826492 vn -0.149348 -0.494390 -0.856314 vn 0.943065 0.314287 -0.108871 vn 0.943065 0.251427 0.217743 vn 0.943065 0.314286 0.108874 vn 0.943065 0.314286 0.108874 vn 0.943066 0.251426 -0.217741 vn 0.943065 0.314287 -0.108871 vn 0.592858 -0.805307 0.000000 vn 0.592858 -0.805307 0.000000 vn 0.592858 -0.805307 0.000000 vn 0.592858 -0.805307 0.000000 vn 0.592858 -0.805307 0.000000 vn 0.592858 -0.805307 0.000000 vn 0.944935 -0.000001 -0.327257 vn 0.944936 -0.000003 -0.327256 vn 0.948164 -0.276399 -0.156807 vn 0.948164 -0.276399 -0.156807 vn 0.944935 -0.283415 -0.163629 vn 0.944935 -0.000001 -0.327257 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn -0.909350 -0.208016 -0.360295 vn -0.927360 0.070708 -0.367428 vn -0.927359 -0.070713 -0.367431 vn -0.927359 -0.070713 -0.367431 vn -0.909351 -0.208014 -0.360293 vn -0.909350 -0.208016 -0.360295 vn -0.990251 0.132327 0.043505 vn -0.990251 0.132327 0.043505 vn -0.990312 0.026244 0.136359 vn -0.990312 0.026244 0.136359 vn -0.990312 -0.026241 0.136360 vn -0.990251 0.132327 0.043505 vn -0.000000 -0.499998 -0.866027 vn -0.000000 -0.499998 -0.866027 vn -0.000000 -0.499998 -0.866027 vn -0.000000 -0.499998 -0.866027 vn -0.000000 -0.499998 -0.866027 vn -0.000000 -0.499998 -0.866027 vn 0.909350 -0.208016 -0.360294 vn 0.927360 0.070710 -0.367429 vn 0.927359 -0.070711 -0.367430 vn 0.927359 -0.070711 -0.367430 vn 0.909352 -0.208015 -0.360291 vn 0.909350 -0.208016 -0.360294 vn 0.990251 0.132327 0.043505 vn 0.990312 -0.026241 0.136360 vn 0.990312 0.026244 0.136359 vn 0.990312 0.026244 0.136359 vn 0.990251 0.132327 0.043505 vn 0.990251 0.132327 0.043505 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.000000 -1.000000 0.000000 vn -0.149350 0.494392 -0.856312 vn -0.298696 0.477172 -0.826491 vn 0.224682 0.487215 -0.843884 vn 0.224682 0.487215 -0.843884 vn 0.224685 0.487216 -0.843882 vn -0.149350 0.494392 -0.856312 vn -0.148207 0.988840 0.015179 vn -0.289033 0.957268 0.009935 vn 0.217367 0.976023 0.011403 vn 0.217367 0.976023 0.011403 vn 0.222955 0.974714 0.014962 vn -0.148207 0.988840 0.015179 vn -0.224686 -0.487214 0.843883 vn 0.298700 -0.477171 0.826490 vn 0.149350 -0.494390 0.856313 vn 0.149350 -0.494390 0.856313 vn -0.224686 -0.487214 0.843883 vn -0.224686 -0.487214 0.843883 vn 0.217679 0.500158 0.838128 vn 0.210670 0.504682 0.837206 vn -0.215604 0.500339 0.838556 vn -0.215604 0.500339 0.838556 vn -0.222555 0.503321 0.834948 vn 0.217679 0.500158 0.838128 vn -0.000023 -0.229526 0.973303 vn -0.000000 -0.229513 0.973306 vn -0.000000 -0.376771 0.926306 vn -0.000000 -0.376771 0.926306 vn -0.000000 -0.376771 0.926306 vn -0.000023 -0.229526 0.973303 vn 1.000000 0.000000 -0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 -0.000000 0.000000 vn 0.999977 0.000111 0.006741 vn 1.000000 0.000000 -0.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn -1.000000 -0.000000 -0.000001 vn -1.000000 -0.000000 -0.000000 vn -1.000000 -0.000000 -0.000001 vn -1.000000 -0.000000 -0.000001 vn -1.000000 0.000000 -0.000002 vn -1.000000 -0.000000 -0.000001 s off usemtl Chassis f 1//1 2//2 3//3 f 4//4 5//5 6//6 f 7//7 8//8 9//9 f 8//10 10//11 9//12 f 10//13 11//14 9//15 f 12//16 13//17 14//18 f 15//19 13//20 12//21 f 16//22 13//23 15//24 f 17//25 18//26 19//27 f 20//28 17//29 19//30 f 21//31 22//32 23//33 f 24//34 22//35 21//36 usemtl Hull f 25//37 26//38 27//39 f 28//40 25//41 27//42 f 29//43 30//44 31//45 f 31//46 30//47 32//48 usemtl Chassis f 33//49 34//50 35//51 f 36//52 37//53 38//54 f 39//55 40//56 41//57 f 42//58 43//59 44//60 f 44//61 45//62 42//63 f 46//64 47//65 48//66 f 48//67 49//68 46//69 f 50//70 51//71 52//72 f 52//73 53//74 50//75 f 54//76 55//77 56//78 f 56//79 57//80 54//81 usemtl Window f 58//82 59//83 60//84 f 60//85 61//86 58//87 f 58//88 62//89 63//90 f 63//91 59//92 58//93 f 59//94 63//95 64//96 f 64//97 60//98 59//99 usemtl Hull f 65//100 66//101 67//102 f 67//103 68//104 65//105 usemtl Chassis f 69//106 70//107 71//108 f 71//109 72//110 69//111 f 69//112 73//113 74//114 f 74//115 70//116 69//117 f 75//118 70//119 74//120 f 74//121 76//122 75//123 f 77//124 74//125 73//126 f 73//127 78//128 77//129 f 75//130 76//131 79//132 f 79//133 80//134 75//135 f 81//136 80//137 79//138 f 79//139 82//140 81//141 f 83//142 82//143 79//144 f 79//145 84//146 83//147 f 1//148 3//149 85//150 f 85//151 86//152 1//153 f 85//154 87//155 88//156 f 88//157 86//158 85//159 f 89//160 90//161 88//162 f 88//163 87//164 89//165 f 91//166 89//167 87//168 f 87//169 85//170 91//171 f 2//172 91//173 85//174 f 85//175 3//176 2//177 f 4//178 92//179 93//180 f 93//181 5//182 4//183 f 6//184 5//185 93//186 f 93//187 94//188 6//189 f 94//190 93//191 95//192 f 95//193 96//194 94//195 f 96//196 95//197 97//198 f 97//199 98//200 96//201 f 93//202 92//203 97//204 f 97//205 95//206 93//207 f 99//208 100//209 101//210 f 101//211 102//212 99//213 f 101//214 100//215 8//216 f 8//217 7//218 101//219 f 103//220 104//221 11//222 f 11//223 10//224 103//225 f 105//226 104//227 103//228 f 103//229 106//230 105//231 f 107//232 108//233 109//234 f 109//235 110//236 107//237 f 108//238 12//239 14//240 f 14//241 109//242 108//243 f 111//244 16//245 15//246 f 15//247 112//248 111//249 f 113//250 111//251 112//252 f 112//253 114//254 113//255 f 33//256 35//257 115//258 f 115//259 116//260 33//261 f 35//262 34//263 117//264 f 117//265 115//266 35//267 f 118//268 119//269 18//270 f 18//271 17//272 118//273 f 120//274 118//275 17//276 f 17//277 20//278 120//279 f 121//280 21//281 23//282 f 23//283 122//284 121//285 f 121//286 123//287 24//288 f 24//289 21//290 121//291 usemtl Hull f 124//292 125//293 126//294 f 126//295 127//296 124//297 usemtl Chassis f 128//298 129//299 130//300 f 130//301 131//302 128//303 usemtl Hull f 132//304 133//305 134//306 f 134//307 135//308 132//309 f 132//310 136//311 137//312 f 137//313 133//314 132//315 f 132//316 138//317 139//318 f 139//319 133//320 132//321 f 140//322 141//323 138//324 f 138//325 139//326 140//327 f 138//328 142//329 143//330 f 143//331 139//332 138//333 f 138//334 144//335 145//336 f 145//337 139//338 138//339 f 138//340 142//341 146//342 f 146//343 141//344 138//345 f 140//346 147//347 143//348 f 143//349 139//350 140//351 usemtl Chassis f 148//352 149//353 150//354 f 150//355 151//356 148//357 usemtl Hull f 140//358 137//359 136//360 f 136//361 141//362 140//363 f 134//364 145//365 144//366 f 144//367 135//368 134//369 usemtl Chassis f 121//370 36//371 38//372 f 38//373 123//374 121//375 f 121//376 122//377 37//378 f 37//379 36//380 121//381 f 69//382 72//383 78//384 f 78//385 73//386 69//387 usemtl Hull f 140//388 141//389 146//390 f 146//391 147//392 140//393 f 152//394 153//395 154//396 f 154//397 155//398 152//399 f 156//400 157//401 153//402 f 153//403 152//404 156//405 f 156//406 158//407 159//408 f 159//409 157//410 156//411 f 160//412 161//413 162//414 f 162//415 163//416 160//417 usemtl Window f 158//418 160//419 163//420 f 163//421 159//422 158//423 usemtl Hull f 164//424 165//425 166//426 f 166//427 167//428 164//429 usemtl Window f 155//430 154//431 165//432 f 165//433 164//434 155//435 usemtl Hull f 161//436 167//437 166//438 f 166//439 162//440 161//441 f 168//442 169//443 170//444 f 170//445 171//446 168//447 f 168//448 172//449 173//450 f 173//451 169//452 168//453 f 172//454 174//455 175//456 f 175//457 176//458 172//459 f 176//460 175//461 177//462 f 177//463 178//464 176//465 f 176//466 178//467 179//468 f 179//469 180//470 176//471 f 178//472 181//473 182//474 f 182//475 179//476 178//477 usemtl Chassis f 183//478 184//479 185//480 f 185//481 186//482 183//483 f 184//484 187//485 188//486 f 188//487 185//488 184//489 f 187//490 189//491 190//492 f 190//493 188//494 187//495 usemtl Spoke f 185//496 188//497 191//498 f 191//499 192//500 185//501 usemtl Rim f 188//502 190//503 193//504 f 193//505 191//506 188//507 usemtl Hull f 194//508 195//509 196//510 f 196//511 193//512 194//513 f 194//514 197//515 198//516 f 198//517 195//518 194//519 f 199//520 192//521 200//522 f 200//523 201//524 199//525 f 192//526 191//527 202//528 f 202//529 200//530 192//531 f 195//532 203//533 204//534 f 204//535 196//536 195//537 f 202//538 196//539 204//540 f 204//541 205//542 202//543 usemtl Chassis f 206//544 207//545 208//546 f 208//547 209//548 206//549 usemtl Spoke f 169//550 173//551 210//552 f 210//553 207//554 169//555 usemtl Rim f 173//556 180//557 211//558 f 211//559 210//560 173//561 usemtl Chassis f 212//562 213//563 214//564 f 214//565 211//566 212//567 f 212//568 215//569 216//570 f 216//571 213//572 212//573 f 207//574 210//575 217//576 f 217//577 208//578 207//579 f 211//580 214//581 217//582 f 217//583 210//584 211//585 f 55//586 50//587 53//588 f 53//589 56//590 55//591 f 43//592 46//593 49//594 f 49//595 44//596 43//597 usemtl Window f 218//598 219//599 220//600 f 220//601 221//602 218//603 f 218//604 221//605 222//606 f 222//607 223//608 218//609 f 221//610 220//611 224//612 f 224//613 222//614 221//615 usemtl Chassis f 39//616 41//617 118//618 f 118//619 120//620 39//621 f 118//622 41//623 40//624 f 40//625 119//626 118//627 f 81//628 225//629 226//630 f 226//631 227//632 81//633 usemtl Hull f 142//634 65//635 68//636 f 68//637 143//638 142//639 f 139//640 143//641 68//642 f 68//643 67//644 139//645 f 138//646 66//647 65//648 f 65//649 142//650 138//651 usemtl Window f 62//652 228//653 64//654 f 64//655 63//656 62//657 f 223//658 222//659 224//660 f 224//661 229//662 223//663 usemtl Hull f 230//664 231//665 232//666 f 232//667 233//668 230//669 f 234//670 235//671 236//672 f 236//673 237//674 234//675 usemtl Chassis f 238//676 239//677 240//678 f 240//679 241//680 238//681 usemtl Hull f 160//682 164//683 167//684 f 167//685 161//686 160//687 usemtl Chassis f 242//688 243//689 244//690 f 244//691 245//692 242//693 usemtl Rim f 245//694 244//695 197//696 f 197//697 194//698 245//699 f 186//700 185//701 192//702 f 192//703 199//704 186//705 f 170//706 169//707 207//708 f 207//709 206//710 170//711 f 179//712 182//713 215//714 f 215//715 212//716 179//717 f 126//718 246//719 42//720 f 42//721 128//722 126//723 f 247//724 43//725 42//726 f 42//727 246//728 247//729 usemtl Chassis f 128//730 42//731 45//732 f 45//733 129//734 128//735 f 44//736 49//737 48//738 f 48//739 45//740 44//741 f 48//742 130//743 129//744 f 129//745 45//746 48//747 f 47//748 131//749 130//750 f 130//751 48//752 47//753 usemtl Spoke f 233//754 232//755 47//756 f 47//757 46//758 233//759 usemtl Rim f 232//760 127//761 131//762 f 131//763 47//764 232//765 usemtl Hull f 231//766 124//767 127//768 f 127//769 232//770 231//771 f 237//772 236//773 231//774 f 231//775 230//776 237//777 f 236//778 248//779 124//780 f 124//781 231//782 236//783 f 235//784 249//785 248//786 f 248//787 236//788 235//789 usemtl Spoke f 234//790 53//791 52//792 f 52//793 235//794 234//795 usemtl Rim f 235//796 52//797 240//798 f 240//799 249//800 235//801 usemtl Chassis f 51//802 241//803 240//804 f 240//805 52//806 51//807 f 238//808 241//809 51//810 f 51//811 54//812 238//813 f 54//814 51//815 50//816 f 50//817 55//818 54//819 f 238//820 54//821 57//822 f 57//823 239//824 238//825 usemtl Rim f 250//826 239//827 57//828 f 57//829 251//830 250//831 f 252//832 251//833 57//834 f 57//835 56//836 252//837 usemtl Window f 58//838 61//839 228//840 f 228//841 62//842 58//843 f 60//844 64//845 228//846 f 228//847 61//848 60//849 usemtl Hull f 138//850 139//851 67//852 f 67//853 66//854 138//855 usemtl Chassis f 71//856 77//857 78//858 f 78//859 72//860 71//861 f 75//862 253//863 71//864 f 71//865 70//866 75//867 f 254//868 76//869 74//870 f 74//871 77//872 254//873 f 81//874 227//875 255//876 f 255//877 80//878 81//879 f 75//880 80//881 255//882 f 255//883 253//884 75//885 f 84//886 79//887 76//888 f 76//889 254//890 84//891 f 83//892 84//893 255//894 f 255//895 227//896 83//897 f 106//898 103//899 100//900 f 100//901 99//902 106//903 f 100//904 103//905 10//906 f 10//907 8//908 100//909 f 114//910 112//911 108//912 f 108//913 107//914 114//915 f 112//916 15//917 12//918 f 12//919 108//920 112//921 usemtl Hull f 29//922 28//923 27//924 f 27//925 30//926 29//927 f 29//928 31//929 25//930 f 25//931 28//932 29//933 f 31//934 32//935 26//936 f 26//937 25//938 31//939 f 32//940 30//941 27//942 f 27//943 26//944 32//945 usemtl Rim f 249//946 240//947 239//948 f 239//949 250//950 249//951 usemtl Hull f 249//952 250//953 256//954 f 256//955 248//956 249//957 f 248//958 256//959 125//960 f 125//961 124//962 248//963 usemtl Rim f 127//964 126//965 128//966 f 128//967 131//968 127//969 usemtl Hull f 132//970 138//971 141//972 f 141//973 136//974 132//975 f 140//976 139//977 133//978 f 133//979 137//980 140//981 usemtl Chassis f 257//982 258//983 259//984 f 259//985 260//986 257//987 f 253//988 260//989 259//990 f 259//991 71//992 253//993 f 148//994 151//995 259//996 f 259//997 258//998 148//999 f 150//1000 254//1001 77//1002 f 77//1003 151//1004 150//1005 f 77//1006 71//1007 259//1008 f 259//1009 151//1010 77//1011 f 261//1012 82//1013 83//1014 f 83//1015 262//1016 261//1017 f 81//1018 82//1019 261//1020 f 261//1021 225//1022 81//1023 f 225//1024 261//1025 262//1026 f 262//1027 226//1028 225//1029 f 226//1030 262//1031 83//1032 f 83//1033 227//1034 226//1035 usemtl Hull f 133//1036 139//1037 145//1038 f 145//1039 134//1040 133//1041 f 156//1042 152//1043 155//1044 f 155//1045 158//1046 156//1047 usemtl Window f 158//1048 155//1049 164//1050 f 164//1051 160//1052 158//1053 usemtl Hull f 168//1054 171//1055 263//1056 f 263//1057 264//1058 168//1059 f 168//1060 264//1061 174//1062 f 174//1063 172//1064 168//1065 f 172//1066 176//1067 180//1068 f 180//1069 173//1070 172//1071 f 178//1072 177//1073 265//1074 f 265//1075 181//1076 178//1077 f 181//1078 265//1079 263//1080 f 263//1081 171//1082 181//1083 f 181//1084 171//1085 170//1086 f 170//1087 182//1088 181//1089 usemtl Chassis f 242//1090 245//1091 190//1092 f 190//1093 189//1094 242//1095 f 242//1096 189//1097 187//1098 f 187//1099 243//1100 242//1101 f 183//1102 243//1103 187//1104 f 187//1105 184//1106 183//1107 f 183//1108 186//1109 244//1110 f 244//1111 243//1112 183//1113 usemtl Rim f 245//1114 194//1115 193//1116 f 193//1117 190//1118 245//1119 f 244//1120 186//1121 199//1122 f 199//1123 197//1124 244//1125 usemtl Hull f 197//1126 199//1127 201//1128 f 201//1129 198//1130 197//1131 f 191//1132 193//1133 196//1134 f 196//1135 202//1136 191//1137 f 195//1138 198//1139 266//1140 f 266//1141 203//1142 195//1143 f 198//1144 201//1145 267//1146 f 267//1147 266//1148 198//1149 f 201//1150 200//1151 268//1152 f 268//1153 267//1154 201//1155 f 200//1156 202//1157 205//1158 f 205//1159 268//1160 200//1161 f 266//1162 267//1163 263//1164 f 263//1165 265//1166 266//1167 f 267//1168 268//1169 264//1170 f 264//1171 263//1172 267//1173 usemtl Rim f 182//1174 170//1175 206//1176 f 206//1177 215//1178 182//1179 usemtl Chassis f 215//1180 206//1181 209//1182 f 209//1183 216//1184 215//1185 usemtl Rim f 179//1186 212//1187 211//1188 f 211//1189 180//1190 179//1191 usemtl Chassis f 217//1192 214//1193 213//1194 f 213//1195 216//1196 217//1197 f 209//1198 208//1199 217//1200 f 217//1201 216//1202 209//1203 usemtl Hull f 252//1204 234//1205 237//1206 f 237//1207 269//1208 252//1209 usemtl Rim f 252//1210 56//1211 53//1212 f 53//1213 234//1214 252//1215 usemtl Hull f 269//1216 237//1217 230//1218 f 230//1219 270//1220 269//1221 f 270//1222 230//1223 233//1224 f 233//1225 247//1226 270//1227 usemtl Rim f 247//1228 233//1229 46//1230 f 46//1231 43//1232 247//1233 usemtl Chassis f 113//1234 114//1235 107//1236 f 107//1237 110//1238 113//1239 f 105//1240 106//1241 99//1242 f 99//1243 102//1244 105//1245 usemtl Hull f 268//1246 205//1247 174//1248 f 174//1249 264//1250 268//1251 f 205//1252 204//1253 175//1254 f 175//1255 174//1256 205//1257 f 266//1258 265//1259 177//1260 f 177//1261 203//1262 266//1263 f 177//1264 175//1265 204//1266 f 204//1267 203//1268 177//1269 f 142//1270 143//1271 147//1272 f 147//1273 146//1274 142//1275 f 132//1276 135//1277 144//1278 f 144//1279 138//1280 132//1281 usemtl Window f 218//1282 223//1283 229//1284 f 229//1285 219//1286 218//1287 f 220//1288 219//1289 229//1290 f 229//1291 224//1292 220//1293 gltron-0.70/data/lightcycle.mtl0000644000076400001440000000101707735315040012207 newmtl Hull Ka 0.0813 0.0813 0.0813 Kd 0.7813 0.7813 0.7813 Ks 0.6813 0.6813 0.6813 Ns 5.0000 Ni 1.0000 illum 2 newmtl Window Ka 0.0000 0.0000 0.0000 Kd 0.0000 0.0000 0.0000 Ks 1.0 1.0 1.0 Ns 30.0000 Ni 1.0000 illum 2 newmtl Rim Ka 0.0000 0.0000 0.0000 Kd 0.0000 0.0000 0.0000 Ks 0.0 0.0 0.0 Ns 0.0000 Ni 1.0000 illum 2 newmtl Spoke Ka 0.0 0.0 0.0 Kd 0.0 0.0 0.0 Ks 0.0 0.0 0.0 Ns 30.0 Ni 1.0 illum 20 newmtl Chassis Ka 0.2000 0.2000 0.2000 Kd 0.5000 0.5000 0.5000 Ks 0.3000 0.3000 0.3000 Ns 3.0000 Ni 1.0000 illum 2 gltron-0.70/data/recognizer.mtl0000644000076400001440000000036207427244142012233 # # Wavefront material file # Converted by 3D Exploration 1.3.00 BETA # XDimension Software # http://www.xdsoft.com/explorer/ # newmtl Hull Ka 0.2 0.290196 0.215686 Kd 0.14902 0.458824 0.164706 Ks 0.898039 0.898039 0.898039 illum 0 gltron-0.70/data/recognizer.obj0000644000076400001440000005055307463057664012233 # # Wavefront OBJ file # Converted by the 3D Exploration 1.7 # XDimension Software, LLC # http://www.xdsoft.com/explorer/ # # object Middle Bar mtllib recognizer.mtl g Middle_Bar v -140.483 5 32.6104 v 139.517 5 32.6104 v -140.483 5 42.6104 v 139.517 5 42.6104 v -140.483 -52.488 32.6104 v 139.517 -52.488 32.6104 v -140.483 -55 42.6104 v 139.517 -55 42.6104 # 8 verticies vn 0 1 9.53674e-08 vn 0 -0.969869 -0.243628 vn 0 0 -1 vn 1 0 0 vn 0 -6.35783e-08 1 vn -1 0 0 # 6 normals usemtl Hull f 1//1 3//1 4//1 f 4//1 2//1 1//1 f 5//2 6//2 8//2 f 8//2 7//2 5//2 f 1//3 2//3 6//3 f 6//3 5//3 1//3 f 2//4 4//4 8//4 f 8//4 6//4 2//4 f 4//5 3//5 7//5 f 7//5 8//5 4//5 f 3//6 1//6 5//6 f 5//6 7//6 3//6 # object Shoulder01 g Shoulder01 v -150.491 5 90.6522 v -10.4913 5 90.6522 v -150.491 5 100.652 v -10.4913 5 100.652 v -150.491 -55 90.6522 v -10.4913 -55 90.6522 v -150.491 -55 100.652 v -10.4913 -55 100.652 # 8 verticies vn 0 1 9.53674e-08 vn 0 -1 0 vn 0 1.27157e-07 -1 vn 1 0 0 vn 0 -1.27157e-07 1 vn -1 0 0 # 6 normals f 9//7 11//7 12//7 f 12//7 10//7 9//7 f 13//8 14//8 16//8 f 16//8 15//8 13//8 f 9//9 10//9 14//9 f 14//9 13//9 9//9 f 10//10 12//10 16//10 f 16//10 14//10 10//10 f 12//11 11//11 15//11 f 15//11 16//11 12//11 f 11//12 9//12 13//12 f 13//12 15//12 11//12 # object Shoulder02 g Shoulder02 v 9.56645 5 90.6522 v 149.566 5 90.6522 v 9.56645 5 100.652 v 149.566 5 100.652 v 9.56645 -55 90.6522 v 149.566 -55 90.6522 v 9.56645 -55 100.652 v 149.566 -55 100.652 # 8 verticies vn 0 1 9.53674e-08 vn 0 -1 0 vn 0 1.27157e-07 -1 vn 1 0 0 vn 0 -1.27157e-07 1 vn -1 0 0 # 6 normals f 17//13 19//13 20//13 f 20//13 18//13 17//13 f 21//14 22//14 24//14 f 24//14 23//14 21//14 f 17//15 18//15 22//15 f 22//15 21//15 17//15 f 18//16 20//16 24//16 f 24//16 22//16 18//16 f 20//17 19//17 23//17 f 23//17 24//17 20//17 f 19//18 17//18 21//18 f 21//18 23//18 19//18 # object Chest01 g Chest01 v -27.9831 3.17897 67.8053 v 27.0169 3.17897 67.8053 v -39.7688 3.17897 88.366 v 38.8026 3.17897 88.366 v -27.9831 -52.2233 67.8052 v 27.0169 -52.2233 67.8052 v -39.7688 -50.0614 88.366 v 38.8026 -50.0614 88.366 # 8 verticies vn 0 1 -3.47874e-08 vn 0 -0.994518 0.10457 vn 0 1.37709e-07 -1 vn 0.867575 1.32036e-07 -0.497307 vn 0.867575 1.95589e-07 -0.497306 vn 0.867575 6.84837e-08 -0.497307 vn 0 -1.43301e-07 1 vn -0.867575 7.7119e-09 -0.497306 vn -0.867575 6.84837e-08 -0.497307 vn -0.867575 -5.30599e-08 -0.497306 # 10 normals f 25//19 27//19 28//19 f 28//19 26//19 25//19 f 29//20 30//20 32//20 f 32//20 31//20 29//20 f 25//21 26//21 30//21 f 30//21 29//21 25//21 f 26//22 28//23 32//22 f 32//22 30//24 26//22 f 28//25 27//25 31//25 f 31//25 32//25 28//25 f 27//26 25//27 29//26 f 29//26 31//28 27//26 # object LegA01 g LegA01 v -138.604 -2.5 44.6729 v -111.604 -2.5 44.6729 v -138.604 -2.5 89.0729 v -111.604 -2.5 89.0729 v -138.604 -47.5 44.6729 v -111.604 -47.5 44.6729 v -138.604 -47.5 89.0729 v -111.604 -47.5 89.0729 # 8 verticies vn 0 1 4.29583e-08 vn 0 -1 8.59166e-08 vn 0 8.4771e-08 -1 vn 1 0 0 vn 0 -1.69542e-07 1 vn -1 0 0 # 6 normals f 33//29 35//29 36//29 f 36//29 34//29 33//29 f 37//30 38//30 40//30 f 40//30 39//30 37//30 f 33//31 34//31 38//31 f 38//31 37//31 33//31 f 34//32 36//32 40//32 f 40//32 38//32 34//32 f 36//33 35//33 39//33 f 39//33 40//33 36//33 f 35//34 33//34 37//34 f 37//34 39//34 35//34 # object LegB01 g LegB01 v 110.638 -2.5 44.6729 v 137.638 -2.5 44.6729 v 110.638 -2.5 89.0729 v 137.638 -2.5 89.0729 v 110.638 -47.5 44.6729 v 137.638 -47.5 44.6729 v 110.638 -47.5 89.0729 v 137.638 -47.5 89.0729 # 8 verticies vn 0 1 4.29583e-08 vn 0 -1 8.59166e-08 vn 0 8.4771e-08 -1 vn 1 0 0 vn 0 -1.69542e-07 1 vn -1 0 0 # 6 normals f 41//35 43//35 44//35 f 44//35 42//35 41//35 f 45//36 46//36 48//36 f 48//36 47//36 45//36 f 41//37 42//37 46//37 f 46//37 45//37 41//37 f 42//38 44//38 48//38 f 48//38 46//38 42//38 f 44//39 43//39 47//39 f 47//39 48//39 44//39 f 43//40 41//40 45//40 f 45//40 47//40 43//40 # object Bar02 g Bar02 v 79.3256 -7.83574e-06 63.0187 v 106.326 -7.83574e-06 63.0187 v 79.3256 -7.42305e-06 73.0187 v 106.326 -7.42305e-06 73.0187 v 79.3256 -50 63.0187 v 106.326 -50 63.0187 v 79.3256 -50 73.0187 v 106.326 -50 73.0187 # 8 verticies vn 0 1 -4.12693e-08 vn 0 -1 3.8147e-07 vn 0 7.62939e-08 -1 vn 1 0 0 vn 0 0 1 vn -1 0 0 # 6 normals f 49//41 51//41 52//41 f 52//41 50//41 49//41 f 53//42 54//42 56//42 f 56//42 55//42 53//42 f 49//43 50//43 54//43 f 54//43 53//43 49//43 f 50//44 52//44 56//44 f 56//44 54//44 50//44 f 52//45 51//45 55//45 f 55//45 56//45 52//45 f 51//46 49//46 53//46 f 53//46 55//46 51//46 # object Bar01 g Bar01 v -107.292 -7.83574e-06 63.0187 v -80.2918 -7.83574e-06 63.0187 v -107.292 -7.42305e-06 73.0187 v -80.2918 -7.42305e-06 73.0187 v -107.292 -50 63.0187 v -80.2918 -50 63.0187 v -107.292 -50 73.0187 v -80.2918 -50 73.0187 # 8 verticies vn 0 1 -4.12693e-08 vn 0 -1 3.8147e-07 vn 0 7.62939e-08 -1 vn 1 0 0 vn 0 0 1 vn -1 0 0 # 6 normals f 57//47 59//47 60//47 f 60//47 58//47 57//47 f 61//48 62//48 64//48 f 64//48 63//48 61//48 f 57//49 58//49 62//49 f 62//49 61//49 57//49 f 58//50 60//50 64//50 f 64//50 62//50 58//50 f 60//51 59//51 63//51 f 63//51 64//51 60//51 f 59//52 57//52 61//52 f 61//52 63//52 59//52 # object LegA02 g LegA02 v -138.604 -2.5 -108.936 v -75.413 -2.5 -108.936 v -138.604 -2.5 -90.182 v -111.604 -2.5 -90.182 v -138.604 -2.5 31.0636 v -111.604 -2.5 31.0636 v -138.604 -47.5 -108.936 v -75.413 -47.5 -108.936 v -138.604 -47.5 -90.182 v -111.604 -47.5 -90.182 v -138.604 -47.5 31.0636 v -111.604 -47.5 31.0636 # 12 verticies vn 0 1 1.52553e-07 vn 0 1 6.52712e-08 vn 0 1 1.08912e-07 vn 0 1 2.16305e-08 vn 0 -1 2.03404e-07 vn 0 -1 1.25115e-07 vn 0 -1 4.68262e-08 vn 0 -1 -3.14625e-08 vn 0 0 -1 vn 0.460093 0 0.887871 vn 1 0 0 vn 0 -4.23855e-08 1 vn -1 0 0 # 13 normals f 65//53 67//54 68//55 f 68//55 66//53 65//53 f 67//54 69//56 70//56 f 70//56 68//55 67//54 f 71//57 72//57 74//58 f 74//58 73//59 71//57 f 73//59 74//58 76//60 f 76//60 75//60 73//59 f 65//61 66//61 72//61 f 72//61 71//61 65//61 f 66//62 68//62 74//62 f 74//62 72//62 66//62 f 68//63 70//63 76//63 f 76//63 74//63 68//63 f 70//64 69//64 75//64 f 75//64 76//64 70//64 f 69//65 67//65 73//65 f 73//65 75//65 69//65 f 67//65 65//65 71//65 f 71//65 73//65 67//65 # object Lower Midd g Lower_Midd v -31.9831 2.44438 23.265 v 31.0169 2.44438 23.265 v -37.9831 2.44438 30.6854 v 37.0169 2.44438 30.6854 v -31.9831 -49.7811 23.2649 v 31.0169 -49.7811 23.2649 v -37.9831 -52.4122 30.6854 v 37.0169 -52.4122 30.6854 # 8 verticies vn 0 1 0 vn 0 -0.942507 -0.334187 vn 0 3.65214e-08 -1 vn 0.777605 3.33431e-08 -0.628754 vn 0.777605 4.37232e-08 -0.628754 vn 0.777604 2.2963e-08 -0.628754 vn 0 -6.95395e-08 1 vn -0.777605 3.33431e-08 -0.628754 vn -0.777605 2.2963e-08 -0.628754 vn -0.777604 4.37232e-08 -0.628754 # 10 normals f 77//66 79//66 80//66 f 80//66 78//66 77//66 f 81//67 82//67 84//67 f 84//67 83//67 81//67 f 77//68 78//68 82//68 f 82//68 81//68 77//68 f 78//69 80//70 84//69 f 84//69 82//71 78//69 f 80//72 79//72 83//72 f 83//72 84//72 80//72 f 79//73 77//74 81//73 f 81//73 83//75 79//73 # object Head g Head v -26.0768 4.99999 104.591 v 25.1107 4.99999 104.591 v -20.8268 0.818023 119.111 v 19.8607 0.818023 119.111 v -26.0768 -55 104.591 v 25.1107 -55 104.591 v -20.8268 -44.5524 119.111 v 19.8607 -44.5524 119.111 # 8 verticies vn 0 0.960938 0.276762 vn 0 -0.811715 0.584054 vn 0 0 -1 vn 0.940417 -1.97673e-08 0.340025 vn 0.940417 -3.95346e-08 0.340025 vn 0.940417 0 0.340025 vn 0 0 1 vn -0.940417 1.97673e-08 0.340025 vn -0.940417 0 0.340025 vn -0.940417 3.95346e-08 0.340025 # 10 normals f 85//76 87//76 88//76 f 88//76 86//76 85//76 f 89//77 90//77 92//77 f 92//77 91//77 89//77 f 85//78 86//78 90//78 f 90//78 89//78 85//78 f 86//79 88//80 92//79 f 92//79 90//81 86//79 f 88//82 87//82 91//82 f 91//82 92//82 88//82 f 87//83 85//84 89//83 f 89//83 91//85 87//83 # object Chest02 g Chest02 v 9.50792 3.17897 66.114 v 9.50792 3.17897 52.5693 v 65.8137 3.17897 52.5693 v 81.2614 3.17896 88.9498 v 42.0824 3.17896 88.9498 v 29.1534 3.17897 66.114 v 9.50793 -52.4011 66.114 v 9.50793 -53.8253 52.5693 v 65.8137 -53.8253 52.5693 v 81.2614 -50 88.9498 v 42.0825 -50 88.9498 v 29.1534 -52.4011 66.114 # 12 verticies vn -1 -1.69442e-07 9.0208e-09 vn -1 -1.67299e-07 5.88969e-15 vn -1 -1.71586e-07 1.80416e-08 vn 0 0 -1 vn 0.920458 1.32055e-07 -0.390841 vn 0.920458 2.6411e-07 -0.390841 vn 0.920458 0 -0.390841 vn 0 0 1 vn -0.870205 -1.87175e-07 0.49269 vn -0.870205 -1.87083e-07 0.49269 vn -0.870205 -1.87268e-07 0.49269 vn 0 -1.37268e-07 1 vn 2.37897e-08 1 7.8056e-08 vn 3.56845e-08 1 1.34686e-07 vn 0 1 1.11409e-07 vn 2.37897e-08 1 2.91848e-08 vn 0 1 -3.52046e-08 vn 6.79452e-08 -0.994518 0.10457 vn 0 -0.994518 0.10457 vn 1.01918e-07 -0.994518 0.10457 vn 6.79452e-08 -0.994518 0.10457 vn 0 -0.994518 0.10457 # 22 normals f 93//86 94//87 100//86 f 93//86 100//86 99//88 f 94//89 95//89 101//89 f 94//89 101//89 100//89 f 95//90 96//91 102//90 f 95//90 102//90 101//92 f 96//93 97//93 103//93 f 96//93 103//93 102//93 f 97//94 98//95 104//94 f 97//94 104//94 103//96 f 98//97 93//97 99//97 f 98//97 99//97 104//97 f 95//98 97//99 96//100 f 95//98 98//101 97//99 f 94//102 98//101 95//98 f 94//102 93//102 98//101 f 101//103 102//104 103//105 f 101//103 103//105 104//106 f 100//107 101//103 104//106 f 100//107 104//106 99//107 # object Upper Midd g Upper_Midd v -61.7065 3.17897 44.7497 v 60.7403 3.17897 44.7497 v -64.9831 3.17897 50.8321 v 64.0169 3.17897 50.8321 v -61.7065 -54.6475 44.7497 v 60.7403 -54.6475 44.7497 v -64.9831 -54.008 50.8321 v 64.0169 -54.008 50.8321 # 8 verticies vn 0 1 0 vn 0 -0.994518 0.104569 vn 0 0 -1 vn 0.880381 1.58182e-08 -0.474268 vn 0.880381 3.16364e-08 -0.474268 vn 0.88038 0 -0.474268 vn 0 -6.67058e-08 1 vn -0.880381 1.58182e-08 -0.474268 vn -0.880381 0 -0.474268 vn -0.88038 3.16364e-08 -0.474268 # 10 normals f 105//108 107//108 108//108 f 108//108 106//108 105//108 f 109//109 110//109 112//109 f 112//109 111//109 109//109 f 105//110 106//110 110//110 f 110//110 109//110 105//110 f 106//111 108//112 112//111 f 112//111 110//113 106//111 f 108//114 107//114 111//114 f 111//114 112//114 108//114 f 107//115 105//116 109//115 f 109//115 111//117 107//115 # object Head01 g Head01 v 19.2607 2.00002 118.603 v -20.2269 2.00001 118.603 v -11.1143 -6.31388 145.091 v 10.1482 -6.31388 145.091 v 15.3119 -46.6 114.103 v -16.2781 -46.6 114.103 v -16.2781 -3.39998 114.103 v 15.3119 -3.39998 114.103 v -20.2268 -52 118.603 v -11.1143 -26.7259 145.091 v -10.0512 -27.0406 149.972 v 9.08504 -27.0406 149.972 v 9.08503 -8.66976 149.972 v -10.0512 -8.66976 149.972 v 10.1482 -26.7259 145.091 v 19.2607 -52 118.603 v 12.2744 -30.1023 147.813 v -13.2406 -30.1024 147.813 v -13.2406 -5.60795 147.813 v 12.2744 -5.60794 147.813 v 12.1079 -42.3555 128.711 v 9.58973 -32.7047 138.825 v 9.93852 -34.8278 136.6 v -13.0741 -42.3555 128.711 v -10.5559 -32.7047 138.825 v -13.0551 -42.2632 128.807 v -13.0741 -42.4313 128.711 v 12.1079 -42.4313 128.711 v 9.58974 -37.1741 137.868 v -10.5559 -37.1741 137.868 # 30 verticies vn -1.71999e-07 0.954108 0.299464 vn -1.72822e-07 0.954108 0.299464 vn -1.7868e-07 0.992766 0.120065 vn -1.81468e-07 0.997549 -0.0699663 vn -1.20756e-07 8.83031e-08 -1 vn -2.41513e-07 -4.26527e-14 -1 vn -3.19895e-14 1.76606e-07 -1 vn -0.945609 -1.78141e-07 0.325306 vn -0.945609 -1.7672e-07 0.325306 vn -0.945609 -1.79561e-07 0.325306 vn -0.293234 -5.13759e-08 0.956041 vn 0.293234 6.089e-08 0.956041 vn 0.293234 5.32787e-08 0.956041 vn -0.293234 -4.56675e-08 0.956041 vn 0.945609 1.4888e-07 0.325306 vn 0.945609 1.2104e-07 0.325306 vn 0.945609 1.7672e-07 0.325306 vn 4.63837e-08 -0.640184 -0.768222 vn 1.2369e-07 -0.640183 -0.768222 vn -3.09227e-08 -0.640184 -0.768222 vn -1.1596e-07 0.640185 -0.768221 vn -0.751644 -7.2877e-08 -0.659569 vn -0.751645 -1.3009e-08 -0.659568 vn -0.751644 -1.32745e-07 -0.659569 vn 0.751645 2.37581e-07 -0.659568 vn 0.751645 2.25932e-07 -0.659568 vn 0.751644 2.49229e-07 -0.659568 vn 7.50588e-08 -0.627548 -0.778578 vn 5.62941e-08 -0.627548 -0.778578 vn 9.38235e-08 -0.627548 -0.778578 vn -1.7728e-07 0.967966 -0.251083 vn -1.80898e-07 0.967966 -0.251083 vn -0.788013 -1.50336e-07 -0.615659 vn -0.788013 -1.47268e-07 -0.615659 vn -0.788013 -1.53404e-07 -0.615659 vn 0.788013 1.34995e-07 -0.615659 vn 0.788013 1.47268e-07 -0.615659 vn 0.788013 1.22723e-07 -0.615659 vn 1.00538e-07 -0.576393 0.817173 vn 8.61753e-08 -0.576393 0.817173 vn 1.149e-07 -0.576393 0.817173 vn 0.560687 1.01873e-07 0.828028 vn 0.560687 8.73199e-08 0.828028 vn -1.11309e-07 0.576391 0.817174 vn -1.07719e-07 0.576391 0.817174 vn -1.149e-07 0.576391 0.817174 vn -0.560687 -9.8235e-08 0.828028 vn -0.560687 -1.0915e-07 0.828028 vn 6.22973e-08 -0.723497 0.690327 vn -1.17426e-06 -0.723497 0.690327 vn -7.03585e-07 -0.723497 0.690327 vn 1.95224e-07 -0.723497 0.690327 vn -8.38773e-05 -0.723492 0.690332 vn -3.04282e-07 -0.540835 0.841129 vn -2.37337e-06 -0.723497 0.690327 vn -0.000140798 -0.723489 0.690336 vn 1.07309e-06 -0.574707 0.818359 vn -0.000209962 -0.723485 0.69034 vn 6.56878e-08 -0.867253 0.497868 vn 1.31376e-07 -0.867253 0.497868 vn 0 -0.867253 0.497868 vn 0 0 -1 vn 0.964211 0 0.265138 vn 0.964211 3.06608e-07 0.265138 vn 0.970348 -0.0137885 0.241319 vn 0.980307 -0.0413331 0.193105 vn 0.97313 -0.0206848 0.229327 vn 0 -0.209306 0.97785 vn 1.98166e-08 -0.209306 0.97785 vn -0.952257 -0.0639002 0.298534 vn -0.952254 -0.0639105 0.298543 vn -0.963611 -0.0426831 0.263879 vn -0.968654 -0.0320246 0.246339 vn -0.981172 0 0.193138 # 74 normals f 113//118 114//119 115//120 f 115//120 116//121 113//118 f 117//122 118//123 119//122 f 119//122 120//124 117//122 f 121//125 122//126 115//125 f 115//125 114//127 121//125 f 123//128 124//129 125//130 f 125//130 126//131 123//128 f 127//132 128//133 113//132 f 113//132 116//134 127//132 f 128//135 121//136 118//135 f 118//135 117//137 128//135 f 114//138 113//138 120//138 f 120//138 119//138 114//138 f 121//139 114//140 119//139 f 119//139 118//141 121//139 f 113//142 128//143 117//142 f 117//142 120//144 113//142 f 122//145 127//146 129//145 f 129//145 130//147 122//145 f 116//121 115//120 131//148 f 131//148 132//149 116//121 f 115//150 122//151 130//150 f 130//150 131//152 115//150 f 127//153 116//154 132//153 f 132//153 129//155 127//153 f 130//156 129//157 124//156 f 124//156 123//158 130//156 f 129//159 132//160 125//130 f 125//130 124//129 129//159 f 132//161 131//162 126//161 f 126//161 125//163 132//161 f 131//164 130//165 123//128 f 123//128 126//131 131//164 f 128//166 127//167 133//168 f 128//166 133//168 121//169 f 127//167 122//170 134//171 f 135//172 127//167 134//171 f 127//167 135//172 133//168 f 122//170 121//169 136//173 f 136//173 121//169 133//168 f 134//171 122//170 137//174 f 122//170 136//173 138//175 f 137//174 122//170 138//175 f 139//176 140//177 141//176 f 141//176 142//178 139//176 f 133//179 140//179 139//179 f 140//180 133//181 141//182 f 134//183 141//182 135//184 f 141//185 134//171 142//186 f 133//181 135//184 141//182 f 133//179 139//179 136//179 f 137//174 142//186 134//171 f 142//187 137//188 139//189 f 139//189 138//190 136//191 f 138//190 139//189 137//188 # object Head02 g Head02 v -81.7331 4.99999 104.591 v -26.4755 4.99999 104.591 v -13.6081 -6.46815 144.624 v -11.9564 -6.46815 144.624 v -81.7331 -55 104.591 v -26.4755 -55 104.591 v -13.6081 -26.6205 144.624 v -11.9564 -26.6205 144.624 # 8 verticies vn 0 0.961333 0.27539 vn 0 -0.815805 0.578326 vn 0 0 -1 vn 0.940083 0 -0.340947 vn 0 0 1 vn -0.348607 0 0.937269 vn -0.174303 0 0.984692 vn -0.506639 0 0.862158 # 8 normals f 143//192 145//192 146//192 f 146//192 144//192 143//192 f 147//193 148//193 150//193 f 150//193 149//193 147//193 f 143//194 144//194 148//194 f 148//194 147//194 143//194 f 144//195 146//195 150//195 f 150//195 148//195 144//195 f 146//196 145//197 149//198 f 149//198 150//196 146//196 f 145//197 143//199 147//199 f 147//199 149//198 145//197 # object Chest03 g Chest03 v -66.7799 3.17895 52.5693 v -10.4741 3.17895 52.5693 v -10.4741 3.17895 66.114 v -30.1196 3.17895 66.114 v -43.0486 3.17895 88.9498 v -82.2276 3.17895 88.9498 v -66.7799 -53.7851 52.5693 v -10.4741 -53.7851 52.5693 v -10.4741 -52.3759 66.114 v -30.1196 -52.3759 66.114 v -43.0486 -50 88.9498 v -82.2276 -50 88.9498 # 12 verticies vn 0 1.33934e-07 -1 vn 1 0 0 vn 0 -1.37331e-07 1 vn 0.870206 -3.38307e-08 0.492689 vn 0.870205 0 0.492689 vn 0.870206 -6.76614e-08 0.492689 vn 0 0 1 vn -0.920459 2.61733e-08 -0.39084 vn -0.920459 5.23466e-08 -0.39084 vn -0.920459 0 -0.39084 vn -1.00186e-09 1 3.99743e-08 vn -6.6791e-10 1 3.83844e-08 vn 0 1 3.93208e-08 vn -6.6791e-10 1 3.70123e-08 vn 0 1 3.52045e-08 vn -5.11222e-08 -0.994631 0.103482 vn 0 -0.994631 0.103482 vn -3.40815e-08 -0.994631 0.103482 vn -3.40815e-08 -0.994631 0.103482 vn 0 -0.994631 0.103482 # 20 normals f 151//200 152//200 158//200 f 151//200 158//200 157//200 f 152//201 153//201 159//201 f 152//201 159//201 158//201 f 153//202 154//202 160//202 f 153//202 160//202 159//202 f 154//203 155//204 161//203 f 154//203 161//203 160//205 f 155//206 156//206 162//206 f 155//206 162//206 161//206 f 156//207 151//208 157//207 f 156//207 157//207 162//209 f 155//210 151//211 156//212 f 154//213 151//211 155//210 f 154//213 152//214 151//211 f 153//214 152//214 154//213 f 161//215 162//216 157//217 f 160//218 161//215 157//217 f 160//218 157//217 158//219 f 159//219 160//218 158//219 # object LegB02 g LegB02 v 137.638 -47.5 -108.936 v 74.4468 -47.5 -108.936 v 137.638 -47.5 -90.182 v 110.638 -47.5 -90.182 v 137.638 -47.5 31.0636 v 110.638 -47.5 31.0636 v 137.638 -2.49998 -108.936 v 74.4468 -2.49999 -108.936 v 137.638 -2.49997 -90.182 v 110.638 -2.49998 -90.182 v 137.638 -2.49998 31.0636 v 110.638 -2.49998 31.0636 # 12 verticies vn 1.61194e-07 -1 2.86615e-08 vn 1.8838e-07 -1 -1.04875e-08 vn 1.54557e-07 -1 8.62018e-09 vn 1.81102e-07 -1 5.73231e-08 vn 2.8257e-07 -1 0 vn 2.11928e-07 -1 -1.57313e-08 vn -1.85156e-07 1 -1.77574e-07 vn -1.84875e-07 1 -1.77169e-07 vn -1.85249e-07 1 -1.09206e-07 vn -1.85437e-07 1 -4.09729e-08 vn -1.85437e-07 1 2.75297e-08 vn -1.85437e-07 1 2.75297e-08 vn -1.20735e-07 -1.02348e-14 -1 vn -1.20735e-07 -2.04696e-14 -1 vn -1.20735e-07 0 -1 vn -0.460093 -1.53271e-07 0.887871 vn -0.460093 -2.28537e-07 0.887871 vn -0.460093 -7.80051e-08 0.887871 vn -1 -2.54313e-07 3.14625e-08 vn -1 -3.39084e-07 6.29251e-08 vn -1 -1.69542e-07 -4.66745e-15 vn 0 0 1 vn 1 0 0 # 23 normals f 163//220 165//221 166//222 f 166//222 164//223 163//220 f 165//221 167//224 168//225 f 168//225 166//222 165//221 f 169//226 170//227 172//228 f 172//228 171//229 169//226 f 171//229 172//228 174//230 f 174//230 173//231 171//229 f 163//232 164//233 170//232 f 170//232 169//234 163//232 f 164//235 166//236 172//235 f 172//235 170//237 164//235 f 166//238 168//239 174//238 f 174//238 172//240 166//238 f 168//241 167//241 173//241 f 173//241 174//241 168//241 f 167//242 165//242 171//242 f 171//242 173//242 167//242 f 165//242 163//242 169//242 f 169//242 171//242 165//242 # object Head04 g Head04 v 80.7669 -55 104.591 v 25.5093 -55 104.591 v 12.6419 -26.6205 144.624 v 10.9902 -26.6205 144.624 v 80.7669 5.00002 104.591 v 25.5093 5.00001 104.591 v 12.6419 -6.46814 144.624 v 10.9902 -6.46814 144.624 # 8 verticies vn 8.44784e-08 -0.815806 0.578326 vn 0 -0.815806 0.578326 vn 1.68957e-07 -0.815805 0.578326 vn -6.80931e-08 0.961333 0.27539 vn -1.36186e-07 0.961333 0.27539 vn 0 0.961332 0.27539 vn -6.90348e-08 -6.35783e-08 -1 vn 0 0 -1 vn -1.3807e-07 -1.27157e-07 -1 vn -0.940083 -1.78629e-07 -0.340947 vn -0.940083 -1.77951e-07 -0.340947 vn -0.940083 -1.79307e-07 -0.340947 vn 0 0 1 vn 0.348607 1.15039e-07 0.937269 vn 0.174303 3.29944e-08 0.984692 vn 0.506639 2.38474e-07 0.862158 vn 0.506639 1.67189e-07 0.862158 # 17 normals f 175//243 177//244 178//243 f 178//243 176//245 175//243 f 179//246 180//247 182//246 f 182//246 181//248 179//246 f 175//249 176//250 180//249 f 180//249 179//251 175//249 f 176//252 178//253 182//252 f 182//252 180//254 176//252 f 178//255 177//256 181//257 f 181//257 182//255 178//255 f 177//256 175//258 179//259 f 179//259 181//257 177//256 gltron-0.70/data/recognizer_quad.obj0000644000076400001440000004301307463057664013236 # # Wavefront OBJ file # Converted by the 3D Exploration 1.7 # XDimension Software, LLC # http://www.xdsoft.com/explorer/ # # object Middle Bar mtllib recognizer.mtl g Middle_Bar v -140.483 5 32.6104 v 139.517 5 32.6104 v -140.483 5 42.6104 v 139.517 5 42.6104 v -140.483 -52.488 32.6104 v 139.517 -52.488 32.6104 v -140.483 -55 42.6104 v 139.517 -55 42.6104 # 8 verticies vn 0 1 9.53674e-08 vn 0 -0.969869 -0.243628 vn 0 0 -1 vn 1 0 0 vn 0 -6.35783e-08 1 vn -1 0 0 # 6 normals usemtl Hull f 1//1 3//1 4//1 2//1 f 5//2 6//2 8//2 7//2 f 1//3 2//3 6//3 5//3 f 2//4 4//4 8//4 6//4 f 4//5 3//5 7//5 8//5 f 3//6 1//6 5//6 7//6 # object Shoulder01 g Shoulder01 v -150.491 5 90.6522 v -10.4913 5 90.6522 v -150.491 5 100.652 v -10.4913 5 100.652 v -150.491 -55 90.6522 v -10.4913 -55 90.6522 v -150.491 -55 100.652 v -10.4913 -55 100.652 # 8 verticies vn 0 1 9.53674e-08 vn 0 -1 0 vn 0 1.27157e-07 -1 vn 1 0 0 vn 0 -1.27157e-07 1 vn -1 0 0 # 6 normals f 9//7 11//7 12//7 10//7 f 13//8 14//8 16//8 15//8 f 9//9 10//9 14//9 13//9 f 10//10 12//10 16//10 14//10 f 12//11 11//11 15//11 16//11 f 11//12 9//12 13//12 15//12 # object Shoulder02 g Shoulder02 v 9.56645 5 90.6522 v 149.566 5 90.6522 v 9.56645 5 100.652 v 149.566 5 100.652 v 9.56645 -55 90.6522 v 149.566 -55 90.6522 v 9.56645 -55 100.652 v 149.566 -55 100.652 # 8 verticies vn 0 1 9.53674e-08 vn 0 -1 0 vn 0 1.27157e-07 -1 vn 1 0 0 vn 0 -1.27157e-07 1 vn -1 0 0 # 6 normals f 17//13 19//13 20//13 18//13 f 21//14 22//14 24//14 23//14 f 17//15 18//15 22//15 21//15 f 18//16 20//16 24//16 22//16 f 20//17 19//17 23//17 24//17 f 19//18 17//18 21//18 23//18 # object Chest01 g Chest01 v -27.9831 3.17897 67.8053 v 27.0169 3.17897 67.8053 v -39.7688 3.17897 88.366 v 38.8026 3.17897 88.366 v -27.9831 -52.2233 67.8052 v 27.0169 -52.2233 67.8052 v -39.7688 -50.0614 88.366 v 38.8026 -50.0614 88.366 # 8 verticies vn 0 1 -3.47874e-08 vn 0 -0.994518 0.10457 vn 0 1.37709e-07 -1 vn 0.867575 1.32036e-07 -0.497307 vn 0.867575 1.95589e-07 -0.497306 vn 0.867575 6.84837e-08 -0.497307 vn 0 -1.43301e-07 1 vn -0.867575 7.7119e-09 -0.497306 vn -0.867575 6.84837e-08 -0.497307 vn -0.867575 -5.30599e-08 -0.497306 # 10 normals f 25//19 27//19 28//19 26//19 f 29//20 30//20 32//20 31//20 f 25//21 26//21 30//21 29//21 f 26//22 28//23 32//22 30//24 f 28//25 27//25 31//25 32//25 f 27//26 25//27 29//26 31//28 # object LegA01 g LegA01 v -138.604 -2.5 44.6729 v -111.604 -2.5 44.6729 v -138.604 -2.5 89.0729 v -111.604 -2.5 89.0729 v -138.604 -47.5 44.6729 v -111.604 -47.5 44.6729 v -138.604 -47.5 89.0729 v -111.604 -47.5 89.0729 # 8 verticies vn 0 1 4.29583e-08 vn 0 -1 8.59166e-08 vn 0 8.4771e-08 -1 vn 1 0 0 vn 0 -1.69542e-07 1 vn -1 0 0 # 6 normals f 33//29 35//29 36//29 34//29 f 37//30 38//30 40//30 39//30 f 33//31 34//31 38//31 37//31 f 34//32 36//32 40//32 38//32 f 36//33 35//33 39//33 40//33 f 35//34 33//34 37//34 39//34 # object LegB01 g LegB01 v 110.638 -2.5 44.6729 v 137.638 -2.5 44.6729 v 110.638 -2.5 89.0729 v 137.638 -2.5 89.0729 v 110.638 -47.5 44.6729 v 137.638 -47.5 44.6729 v 110.638 -47.5 89.0729 v 137.638 -47.5 89.0729 # 8 verticies vn 0 1 4.29583e-08 vn 0 -1 8.59166e-08 vn 0 8.4771e-08 -1 vn 1 0 0 vn 0 -1.69542e-07 1 vn -1 0 0 # 6 normals f 41//35 43//35 44//35 42//35 f 45//36 46//36 48//36 47//36 f 41//37 42//37 46//37 45//37 f 42//38 44//38 48//38 46//38 f 44//39 43//39 47//39 48//39 f 43//40 41//40 45//40 47//40 # object Bar02 g Bar02 v 79.3256 -7.83574e-06 63.0187 v 106.326 -7.83574e-06 63.0187 v 79.3256 -7.42305e-06 73.0187 v 106.326 -7.42305e-06 73.0187 v 79.3256 -50 63.0187 v 106.326 -50 63.0187 v 79.3256 -50 73.0187 v 106.326 -50 73.0187 # 8 verticies vn 0 1 -4.12693e-08 vn 0 -1 3.8147e-07 vn 0 7.62939e-08 -1 vn 1 0 0 vn 0 0 1 vn -1 0 0 # 6 normals f 49//41 51//41 52//41 50//41 f 53//42 54//42 56//42 55//42 f 49//43 50//43 54//43 53//43 f 50//44 52//44 56//44 54//44 f 52//45 51//45 55//45 56//45 f 51//46 49//46 53//46 55//46 # object Bar01 g Bar01 v -107.292 -7.83574e-06 63.0187 v -80.2918 -7.83574e-06 63.0187 v -107.292 -7.42305e-06 73.0187 v -80.2918 -7.42305e-06 73.0187 v -107.292 -50 63.0187 v -80.2918 -50 63.0187 v -107.292 -50 73.0187 v -80.2918 -50 73.0187 # 8 verticies vn 0 1 -4.12693e-08 vn 0 -1 3.8147e-07 vn 0 7.62939e-08 -1 vn 1 0 0 vn 0 0 1 vn -1 0 0 # 6 normals f 57//47 59//47 60//47 58//47 f 61//48 62//48 64//48 63//48 f 57//49 58//49 62//49 61//49 f 58//50 60//50 64//50 62//50 f 60//51 59//51 63//51 64//51 f 59//52 57//52 61//52 63//52 # object LegA02 g LegA02 v -138.604 -2.5 -108.936 v -75.413 -2.5 -108.936 v -138.604 -2.5 -90.182 v -111.604 -2.5 -90.182 v -138.604 -2.5 31.0636 v -111.604 -2.5 31.0636 v -138.604 -47.5 -108.936 v -75.413 -47.5 -108.936 v -138.604 -47.5 -90.182 v -111.604 -47.5 -90.182 v -138.604 -47.5 31.0636 v -111.604 -47.5 31.0636 # 12 verticies vn 0 1 1.52553e-07 vn 0 1 6.52712e-08 vn 0 1 1.08912e-07 vn 0 1 2.16305e-08 vn 0 -1 2.03404e-07 vn 0 -1 1.25115e-07 vn 0 -1 4.68262e-08 vn 0 -1 -3.14625e-08 vn 0 0 -1 vn 0.460093 0 0.887871 vn 1 0 0 vn 0 -4.23855e-08 1 vn -1 0 0 # 13 normals f 65//53 67//54 68//55 66//53 f 67//54 69//56 70//56 68//55 f 71//57 72//57 74//58 73//59 f 73//59 74//58 76//60 75//60 f 65//61 66//61 72//61 71//61 f 66//62 68//62 74//62 72//62 f 68//63 70//63 76//63 74//63 f 70//64 69//64 75//64 76//64 f 69//65 67//65 73//65 75//65 f 67//65 65//65 71//65 73//65 # object Lower Midd g Lower_Midd v -31.9831 2.44438 23.265 v 31.0169 2.44438 23.265 v -37.9831 2.44438 30.6854 v 37.0169 2.44438 30.6854 v -31.9831 -49.7811 23.2649 v 31.0169 -49.7811 23.2649 v -37.9831 -52.4122 30.6854 v 37.0169 -52.4122 30.6854 # 8 verticies vn 0 1 0 vn 0 -0.942507 -0.334187 vn 0 3.65214e-08 -1 vn 0.777605 3.33431e-08 -0.628754 vn 0.777605 4.37232e-08 -0.628754 vn 0.777604 2.2963e-08 -0.628754 vn 0 -6.95395e-08 1 vn -0.777605 3.33431e-08 -0.628754 vn -0.777605 2.2963e-08 -0.628754 vn -0.777604 4.37232e-08 -0.628754 # 10 normals f 77//66 79//66 80//66 78//66 f 81//67 82//67 84//67 83//67 f 77//68 78//68 82//68 81//68 f 78//69 80//70 84//69 82//71 f 80//72 79//72 83//72 84//72 f 79//73 77//74 81//73 83//75 # object Head g Head v -26.0768 4.99999 104.591 v 25.1107 4.99999 104.591 v -20.8268 0.818023 119.111 v 19.8607 0.818023 119.111 v -26.0768 -55 104.591 v 25.1107 -55 104.591 v -20.8268 -44.5524 119.111 v 19.8607 -44.5524 119.111 # 8 verticies vn 0 0.960938 0.276762 vn 0 -0.811715 0.584054 vn 0 0 -1 vn 0.940417 -1.97673e-08 0.340025 vn 0.940417 -3.95346e-08 0.340025 vn 0.940417 0 0.340025 vn 0 0 1 vn -0.940417 1.97673e-08 0.340025 vn -0.940417 0 0.340025 vn -0.940417 3.95346e-08 0.340025 # 10 normals f 85//76 87//76 88//76 86//76 f 89//77 90//77 92//77 91//77 f 85//78 86//78 90//78 89//78 f 86//79 88//80 92//79 90//81 f 88//82 87//82 91//82 92//82 f 87//83 85//84 89//83 91//85 # object Chest02 g Chest02 v 9.50792 3.17897 66.114 v 9.50792 3.17897 52.5693 v 65.8137 3.17897 52.5693 v 81.2614 3.17896 88.9498 v 42.0824 3.17896 88.9498 v 29.1534 3.17897 66.114 v 9.50793 -52.4011 66.114 v 9.50793 -53.8253 52.5693 v 65.8137 -53.8253 52.5693 v 81.2614 -50 88.9498 v 42.0825 -50 88.9498 v 29.1534 -52.4011 66.114 # 12 verticies vn -1 -1.69442e-07 9.0208e-09 vn -1 -1.67299e-07 5.88969e-15 vn -1 -1.71586e-07 1.80416e-08 vn 0 0 -1 vn 0.920458 1.32055e-07 -0.390841 vn 0.920458 2.6411e-07 -0.390841 vn 0.920458 0 -0.390841 vn 0 0 1 vn -0.870205 -1.87175e-07 0.49269 vn -0.870205 -1.87083e-07 0.49269 vn -0.870205 -1.87268e-07 0.49269 vn 0 -1.37268e-07 1 vn 2.37897e-08 1 7.8056e-08 vn 3.56845e-08 1 1.34686e-07 vn 0 1 1.11409e-07 vn 2.37897e-08 1 2.91848e-08 vn 0 1 -3.52046e-08 vn 6.79452e-08 -0.994518 0.10457 vn 0 -0.994518 0.10457 vn 1.01918e-07 -0.994518 0.10457 vn 6.79452e-08 -0.994518 0.10457 vn 0 -0.994518 0.10457 # 22 normals f 93//86 94//87 100//86 99//88 f 94//89 95//89 101//89 100//89 f 95//90 96//91 102//90 101//92 f 96//93 97//93 103//93 102//93 f 97//94 98//95 104//94 103//96 f 98//97 93//97 99//97 104//97 #f 95//98 97//99 96//100 98//101 #f 94//102 98//101 95//98 93//102 #f 101//103 102//104 103//105 104//106 #f 100//107 101//103 104//106 99//107 # object Upper Midd g Upper_Midd v -61.7065 3.17897 44.7497 v 60.7403 3.17897 44.7497 v -64.9831 3.17897 50.8321 v 64.0169 3.17897 50.8321 v -61.7065 -54.6475 44.7497 v 60.7403 -54.6475 44.7497 v -64.9831 -54.008 50.8321 v 64.0169 -54.008 50.8321 # 8 verticies vn 0 1 0 vn 0 -0.994518 0.104569 vn 0 0 -1 vn 0.880381 1.58182e-08 -0.474268 vn 0.880381 3.16364e-08 -0.474268 vn 0.88038 0 -0.474268 vn 0 -6.67058e-08 1 vn -0.880381 1.58182e-08 -0.474268 vn -0.880381 0 -0.474268 vn -0.88038 3.16364e-08 -0.474268 # 10 normals f 105//108 107//108 108//108 106//108 f 109//109 110//109 112//109 111//109 f 105//110 106//110 110//110 109//110 f 106//111 108//112 112//111 110//113 f 108//114 107//114 111//114 112//114 f 107//115 105//116 109//115 111//117 # object Head01 g Head01 v 19.2607 2.00002 118.603 v -20.2269 2.00001 118.603 v -11.1143 -6.31388 145.091 v 10.1482 -6.31388 145.091 v 15.3119 -46.6 114.103 v -16.2781 -46.6 114.103 v -16.2781 -3.39998 114.103 v 15.3119 -3.39998 114.103 v -20.2268 -52 118.603 v -11.1143 -26.7259 145.091 v -10.0512 -27.0406 149.972 v 9.08504 -27.0406 149.972 v 9.08503 -8.66976 149.972 v -10.0512 -8.66976 149.972 v 10.1482 -26.7259 145.091 v 19.2607 -52 118.603 v 12.2744 -30.1023 147.813 v -13.2406 -30.1024 147.813 v -13.2406 -5.60795 147.813 v 12.2744 -5.60794 147.813 v 12.1079 -42.3555 128.711 v 9.58973 -32.7047 138.825 v 9.93852 -34.8278 136.6 v -13.0741 -42.3555 128.711 v -10.5559 -32.7047 138.825 v -13.0551 -42.2632 128.807 v -13.0741 -42.4313 128.711 v 12.1079 -42.4313 128.711 v 9.58974 -37.1741 137.868 v -10.5559 -37.1741 137.868 # 30 verticies vn -1.71999e-07 0.954108 0.299464 vn -1.72822e-07 0.954108 0.299464 vn -1.7868e-07 0.992766 0.120065 vn -1.81468e-07 0.997549 -0.0699663 vn -1.20756e-07 8.83031e-08 -1 vn -2.41513e-07 -4.26527e-14 -1 vn -3.19895e-14 1.76606e-07 -1 vn -0.945609 -1.78141e-07 0.325306 vn -0.945609 -1.7672e-07 0.325306 vn -0.945609 -1.79561e-07 0.325306 vn -0.293234 -5.13759e-08 0.956041 vn 0.293234 6.089e-08 0.956041 vn 0.293234 5.32787e-08 0.956041 vn -0.293234 -4.56675e-08 0.956041 vn 0.945609 1.4888e-07 0.325306 vn 0.945609 1.2104e-07 0.325306 vn 0.945609 1.7672e-07 0.325306 vn 4.63837e-08 -0.640184 -0.768222 vn 1.2369e-07 -0.640183 -0.768222 vn -3.09227e-08 -0.640184 -0.768222 vn -1.1596e-07 0.640185 -0.768221 vn -0.751644 -7.2877e-08 -0.659569 vn -0.751645 -1.3009e-08 -0.659568 vn -0.751644 -1.32745e-07 -0.659569 vn 0.751645 2.37581e-07 -0.659568 vn 0.751645 2.25932e-07 -0.659568 vn 0.751644 2.49229e-07 -0.659568 vn 7.50588e-08 -0.627548 -0.778578 vn 5.62941e-08 -0.627548 -0.778578 vn 9.38235e-08 -0.627548 -0.778578 vn -1.7728e-07 0.967966 -0.251083 vn -1.80898e-07 0.967966 -0.251083 vn -0.788013 -1.50336e-07 -0.615659 vn -0.788013 -1.47268e-07 -0.615659 vn -0.788013 -1.53404e-07 -0.615659 vn 0.788013 1.34995e-07 -0.615659 vn 0.788013 1.47268e-07 -0.615659 vn 0.788013 1.22723e-07 -0.615659 vn 1.00538e-07 -0.576393 0.817173 vn 8.61753e-08 -0.576393 0.817173 vn 1.149e-07 -0.576393 0.817173 vn 0.560687 1.01873e-07 0.828028 vn 0.560687 8.73199e-08 0.828028 vn -1.11309e-07 0.576391 0.817174 vn -1.07719e-07 0.576391 0.817174 vn -1.149e-07 0.576391 0.817174 vn -0.560687 -9.8235e-08 0.828028 vn -0.560687 -1.0915e-07 0.828028 vn 6.22973e-08 -0.723497 0.690327 vn -1.17426e-06 -0.723497 0.690327 vn -7.03585e-07 -0.723497 0.690327 vn 1.95224e-07 -0.723497 0.690327 vn -8.38773e-05 -0.723492 0.690332 vn -3.04282e-07 -0.540835 0.841129 vn -2.37337e-06 -0.723497 0.690327 vn -0.000140798 -0.723489 0.690336 vn 1.07309e-06 -0.574707 0.818359 vn -0.000209962 -0.723485 0.69034 vn 6.56878e-08 -0.867253 0.497868 vn 1.31376e-07 -0.867253 0.497868 vn 0 -0.867253 0.497868 vn 0 0 -1 vn 0.964211 0 0.265138 vn 0.964211 3.06608e-07 0.265138 vn 0.970348 -0.0137885 0.241319 vn 0.980307 -0.0413331 0.193105 vn 0.97313 -0.0206848 0.229327 vn 0 -0.209306 0.97785 vn 1.98166e-08 -0.209306 0.97785 vn -0.952257 -0.0639002 0.298534 vn -0.952254 -0.0639105 0.298543 vn -0.963611 -0.0426831 0.263879 vn -0.968654 -0.0320246 0.246339 vn -0.981172 0 0.193138 # 23 normals f 113//118 114//119 115//120 116//121 f 117//122 118//123 119//122 120//124 f 121//125 122//126 115//125 114//127 f 123//128 124//129 125//130 126//131 f 127//132 128//133 113//132 116//134 f 128//135 121//136 118//135 117//137 f 114//138 113//138 120//138 119//138 f 121//139 114//140 119//139 118//141 f 113//142 128//143 117//142 120//144 f 122//145 127//146 129//145 130//147 f 116//121 115//120 131//148 132//149 f 115//150 122//151 130//150 131//152 f 127//153 116//154 132//153 129//155 f 130//156 129//157 124//156 123//158 f 129//159 132//160 125//130 124//129 f 132//161 131//162 126//161 125//163 f 131//164 130//165 123//128 126//131 f 128//166 133//168 136//173 121//169 f 127//167 122//170 137//174 134//171 f 139//176 140//177 141//176 142//178 f 141//185 134//171 137//174 142//186 f 133//181 134//183 141//182 133//181 f 142//187 137//188 139//189 142//187 # object Head02 g Head02 v -81.7331 4.99999 104.591 v -26.4755 4.99999 104.591 v -13.6081 -6.46815 144.624 v -11.9564 -6.46815 144.624 v -81.7331 -55 104.591 v -26.4755 -55 104.591 v -13.6081 -26.6205 144.624 v -11.9564 -26.6205 144.624 # 8 verticies vn 0 0.961333 0.27539 vn 0 -0.815805 0.578326 vn 0 0 -1 vn 0.940083 0 -0.340947 vn 0 0 1 vn -0.348607 0 0.937269 vn -0.174303 0 0.984692 vn -0.506639 0 0.862158 # 8 normals f 143//192 145//192 146//192 144//192 f 147//193 148//193 150//193 149//193 f 143//194 144//194 148//194 147//194 f 144//195 146//195 150//195 148//195 f 146//196 145//197 149//198 150//196 f 145//197 143//199 147//199 149//198 # object Chest03 g Chest03 v -66.7799 3.17895 52.5693 v -10.4741 3.17895 52.5693 v -10.4741 3.17895 66.114 v -30.1196 3.17895 66.114 v -43.0486 3.17895 88.9498 v -82.2276 3.17895 88.9498 v -66.7799 -53.7851 52.5693 v -10.4741 -53.7851 52.5693 v -10.4741 -52.3759 66.114 v -30.1196 -52.3759 66.114 v -43.0486 -50 88.9498 v -82.2276 -50 88.9498 # 12 verticies vn 0 1.33934e-07 -1 vn 1 0 0 vn 0 -1.37331e-07 1 vn 0.870206 -3.38307e-08 0.492689 vn 0.870205 0 0.492689 vn 0.870206 -6.76614e-08 0.492689 vn 0 0 1 vn -0.920459 2.61733e-08 -0.39084 vn -0.920459 5.23466e-08 -0.39084 vn -0.920459 0 -0.39084 vn -1.00186e-09 1 3.99743e-08 vn -6.6791e-10 1 3.83844e-08 vn 0 1 3.93208e-08 vn -6.6791e-10 1 3.70123e-08 vn 0 1 3.52045e-08 vn -5.11222e-08 -0.994631 0.103482 vn 0 -0.994631 0.103482 vn -3.40815e-08 -0.994631 0.103482 vn -3.40815e-08 -0.994631 0.103482 vn 0 -0.994631 0.103482 # 20 normals f 151//200 152//200 158//200 157//200 f 152//201 153//201 159//201 158//201 f 153//202 154//202 160//202 159//202 f 154//203 155//204 161//203 160//205 f 155//206 156//206 162//206 161//206 f 156//207 151//208 157//207 162//209 #f 155//210 151//211 156//212 154//213 #f 154//213 152//214 151//211 153//214 #f 161//215 162//216 157//217 160//218 #f 160//218 157//217 158//219 159//219 # object LegB02 g LegB02 v 137.638 -47.5 -108.936 v 74.4468 -47.5 -108.936 v 137.638 -47.5 -90.182 v 110.638 -47.5 -90.182 v 137.638 -47.5 31.0636 v 110.638 -47.5 31.0636 v 137.638 -2.49998 -108.936 v 74.4468 -2.49999 -108.936 v 137.638 -2.49997 -90.182 v 110.638 -2.49998 -90.182 v 137.638 -2.49998 31.0636 v 110.638 -2.49998 31.0636 # 12 verticies vn 1.61194e-07 -1 2.86615e-08 vn 1.8838e-07 -1 -1.04875e-08 vn 1.54557e-07 -1 8.62018e-09 vn 1.81102e-07 -1 5.73231e-08 vn 2.8257e-07 -1 0 vn 2.11928e-07 -1 -1.57313e-08 vn -1.85156e-07 1 -1.77574e-07 vn -1.84875e-07 1 -1.77169e-07 vn -1.85249e-07 1 -1.09206e-07 vn -1.85437e-07 1 -4.09729e-08 vn -1.85437e-07 1 2.75297e-08 vn -1.85437e-07 1 2.75297e-08 vn -1.20735e-07 -1.02348e-14 -1 vn -1.20735e-07 -2.04696e-14 -1 vn -1.20735e-07 0 -1 vn -0.460093 -1.53271e-07 0.887871 vn -0.460093 -2.28537e-07 0.887871 vn -0.460093 -7.80051e-08 0.887871 vn -1 -2.54313e-07 3.14625e-08 vn -1 -3.39084e-07 6.29251e-08 vn -1 -1.69542e-07 -4.66745e-15 vn 0 0 1 vn 1 0 0 # 23 normals f 163//220 165//221 166//222 164//223 f 165//221 167//224 168//225 166//222 f 169//226 170//227 172//228 171//229 f 171//229 172//228 174//230 173//231 f 163//232 164//233 170//232 169//234 f 164//235 166//236 172//235 170//237 f 166//238 168//239 174//238 172//240 f 168//241 167//241 173//241 174//241 f 167//242 165//242 171//242 173//242 f 165//242 163//242 169//242 171//242 # object Head04 g Head04 v 80.7669 -55 104.591 v 25.5093 -55 104.591 v 12.6419 -26.6205 144.624 v 10.9902 -26.6205 144.624 v 80.7669 5.00002 104.591 v 25.5093 5.00001 104.591 v 12.6419 -6.46814 144.624 v 10.9902 -6.46814 144.624 # 8 verticies vn 8.44784e-08 -0.815806 0.578326 vn 0 -0.815806 0.578326 vn 1.68957e-07 -0.815805 0.578326 vn -6.80931e-08 0.961333 0.27539 vn -1.36186e-07 0.961333 0.27539 vn 0 0.961332 0.27539 vn -6.90348e-08 -6.35783e-08 -1 vn 0 0 -1 vn -1.3807e-07 -1.27157e-07 -1 vn -0.940083 -1.78629e-07 -0.340947 vn -0.940083 -1.77951e-07 -0.340947 vn -0.940083 -1.79307e-07 -0.340947 vn 0 0 1 vn 0.348607 1.15039e-07 0.937269 vn 0.174303 3.29944e-08 0.984692 vn 0.506639 2.38474e-07 0.862158 vn 0.506639 1.67189e-07 0.862158 # 17 normals f 175//243 177//244 178//243 176//245 f 179//246 180//247 182//246 181//248 f 175//249 176//250 180//249 179//251 f 176//252 178//253 182//252 180//254 f 178//255 177//256 181//257 182//255 f 177//256 175//258 179//259 181//257 gltron-0.70/data/test.fbmp0000644000076400001440000000003607125165026011167 256 16 32 126 test.bitmap.png gltron-0.70/data/xenotron.ftx0000644000076400001440000000006707065453754011760 2 256 32 32 126 xenotron xenotron.0.png xenotron.1.png gltron-0.70/data/Makefile.am0000644000076400001440000000051707675152333011411 dist_pkgdata_DATA = babbage.ftx fonts.txt game_crash.ogg game_crash.wav \ game_engine.ogg game_engine.wav game_recognizer.wav game_recognizer.ogg lightcycle-high.obj lightcycle-low.obj \ lightcycle-med.obj lightcycle.mtl recognizer.mtl recognizer.obj \ recognizer_quad.obj test.fbmp xenotron.ftx pkgdatadir = @datadir@/@PACKAGE@/data gltron-0.70/data/Makefile.in0000644000076400001440000001362607767023244011427 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ pkgdatadir = @datadir@/@PACKAGE@/data dist_pkgdata_DATA = babbage.ftx fonts.txt game_crash.ogg game_crash.wav \ game_engine.ogg game_engine.wav game_recognizer.wav game_recognizer.ogg lightcycle-high.obj lightcycle-low.obj \ lightcycle-med.obj lightcycle.mtl recognizer.mtl recognizer.obj \ recognizer_quad.obj test.fbmp xenotron.ftx subdir = data mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = DATA = $(dist_pkgdata_DATA) DIST_COMMON = $(dist_pkgdata_DATA) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign data/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: install-dist_pkgdataDATA: $(dist_pkgdata_DATA) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f"; \ $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f; \ done uninstall-dist_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " rm -f $(DESTDIR)$(pkgdatadir)/$$f"; \ rm -f $(DESTDIR)$(pkgdatadir)/$$f; \ done tags: TAGS TAGS: DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = .. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-dist_pkgdataDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-dist_pkgdataDATA uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am info info-am install \ install-am install-data install-data-am \ install-dist_pkgdataDATA install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ uninstall uninstall-am uninstall-dist_pkgdataDATA \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/music/0000777000076400001440000000000007767023550007645 5gltron-0.70/music/song_revenge_of_cats.it0000644000076400001440000233612007464332564014307 IMPMRevenge of the Catsi5< 0_O> (4 /!5@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  )*( 44&; )*,7-+/''9.3356889:%$$!!"  #,V!#%%J&&&:'''*(z(()j)) *Z***J+++:,,,*-z--.j.. /Z///J000:111*2z223j33 4Z444J555:68{9R< @PDHKOQUZ\^Kawd8gk$n5qCuzX~uÖsϥ٦CǻXG('+%i8"7u;9"'9"n<9"ݘo>9"j9"3:":"u:":"NQ:"Q;K:"iR:"lB:"Sm:"ZsW:"v:"}g:"Q:"6F:"&9:"ա0:"Ц-;"!x;"HD;"z\{;"[=O"G{@-Q"LT"'dkZ"p^Ga"vY\b"^(e"10h"pj"܁/=k""C\Kk"k"k"a-k"q"n&5q"CK`r" I_v"rX{"H**"a) "ɨ@"R($"UP)"Y"e"7."'g"Jg""X6"M}d"b'"fu"d""J0"z#"^L"N@"ߗ"*2"cg"$"i"x"Yd"ՒlS""1I6 Howdy there. I hope you're enjoying this assembly. I put quite a lot of effort into it, actually. Check out my homepage at http://isis.yok.utu.fi/~skaven email: skaven@isis.yok.utu.fi skaven@remedy.fi pepaha@utu.fi This piece has admittedly plenty of influence from a very old, somewhat unknown song made by Fleshbrain, called 'Timebandit'. Unknown, I assume, because it was not included among his songs in the Mods Anothology CD. His 'Timebandit' was one of the truly creative classics; it is very old however, born near the very beginnings of the Amiga tracker music genre, so the sound and the instrumentation weren't among the best (the very concepts were being built around that time); however, the mockingly cool melody and well made, working structure make it a true delight. My regards to the old master. Other influence that may show in this production are from Purple Motion, Captain, and of course the amazing Mechanism Eight by the even more amazing Necros. :) Plus, of course, you may notice it has a rhythm structure very similar to my earlier releases Rama Gardens, Omniphilia and Data Jack. It's starting to look like a real series now, isn't it? Eh. Either I'm still 'refining the concept', or am just plain out of ideas. Hopefully someday I will learn how to give a song a real STRUCTURE. During the making of the song, my friend came to hear it and said it sounds quite a bit like KMFDM's new stuff - and played me the CD. Bleh. I thought this kinda music was something new. :) Later after that, another friend of mine told me it reminds him of Power Rangers. Aaaaaarghh!!! NOOOO!!! *ahem* This is not a 'real song', as it doesn't consist of parts of equal length, repeated in a correct sequence, nor a 'base theme'. Rather, it is a mere random sequence of rhythmic components. This has always been my problem; I tend to come up with a shitload of loose ideas, but cannot arrange them properly. Check out the loose 'bonus part' for example. I simply couldn't fit it in! Necros's Mechanism Eight is, in my opinion, a very fine example of how much one can build on a working basic theme; the simple three-note main theme repeats through the whole song, but the song doesn't suffer from this at all - vice versa. There is enough variance and the rhythmically correct sequencing which keep the song entertaining all the way. It is also fine example of great mixing skills. Sample credits go to Purple Motion and Edge's Korg 03R/W for the ultracool IMissJimi guitar samples and the PowerRock blast, Groo for the Bass Grind and MinorArp, HeatBeat for the hardcore- ish Constructor techno drums, Travolta for the organ chords, Bruno for the PetraSnare, Necros for the KorgTotalkit.snare, Airwalk for the CannedSnare, and my larynx for the screams except for #37. :) The rest of the samples are sample synthetized, or from unknown sources, thanks go to whoever they are. Special thanks go to Liam the Lemming for coming up with a divine inspiration for the name of the song. It's now been changed TWO times. :) Signed, -= Skaven 05/27/1997 A.D End of documentation. Really. Hey come on, nothing to see here. Honestly! Go away. Wow, you've found my super secret message! Giga-Ultra- Interactive-Cyberspace-Multimedia-Internet-Connected-Surfin' -Totally to the Max-cool! Too bad I don't have anything clever to say here. Go give your mum and dad a big hug. :) IMPI< No instruments used.  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvw@@dddIMPI< I don't need no   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvw@@dddIMPI<stinkin' envelopes. :)  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvw@@dddIMPI<  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvw@@dddIMPI< (well, maybe in my next  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvw@@dddIMPI<song... )  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvw@@dddIMPSSYNLEAD.26B@@Tough Sid.leadp!"vIMPSSYNLEAD.27@@BassGrind.lead00 IMPSXYLITOL.5TH@Q@Xylitol-5thsR\R\"IMPSTECHNOBD.4 @@Constructor.BD1M`1IMPSTECHNOBD.5 @@Constructor.BD2M(EIMPSMETALHH.1 %@Constructor.HH1P VAXIMPSMETALHH.2 '@Constructor.HH2VAJbIMPSUNISNARE.16@@KorgTotalkit.snare(2)C=^vIMPSSLINK.3 @@Tambourine.3 *xBIMPSCYMBAL.9 @@CrashCymbal4gVAzIMPSSCAN.2 2 @@CannedSnare(1)2&IMPSJIMI2 3@@Jimi-5thChord| 6IMPSJIMI8 3@@Jimi-ChugD >IMPSJIMI3 3@@Jimi-Chuga* IMPSJIMI7 3@@Jimi-Hard2 "IMPSJIMI6 3@@Jimi-NoteLoP+ ^>IMPSJIMI5 3@@Jimi-NoteHi1B iIMPSJIMI4 3@@Jimi-NoteHi28* IMPSJIMI1.WAVAV@@Jimi-Squeal16 IMPSJIMI9.WAVV@@Jimi-Squeal2 VxIMPSMUAEOW.WAVV@@FretSlide.1>9>lIMPSSLIDE2.WAVV@@FretSlide.2  =>IMPSTINBASS1.WAV@@TinMan.bass.1 h)IMPSTINBASS2.WAV@@TinMan.bass.2 h){IMPSTINBASS3.WAV@@TinMan.bass.3 h)9IMPSSNDTRACK.16@@MinorGliss=#IMPSBIGHIT DP3@@PowerRock.blast,>AIMPSSYNTOM.14 @@SynTom.toughIa5nIMPSORG1.RAW AV@@Arte.Organ1 "$IMPSORG2.RAW AV@@Arte.Organ2"$4IMPSORG3.RAWAV@@Arte.Organ3"$IMPSORG4.RAW AV@@Arte.Organ48"$IMPSUNISNARE.12@@PetraSnr(3),xZM IMPSMETAL.113 @@MetalHit.4 w+9IMPSSEARLEAD.WAV:@Sear.lead 1tYCIMPSSAW5TH.WAVV@@Sear.5ths >x{>~OIMPSSCREAM1.WAV@@Scream.1.Waaayyyyrrg\I) IMPSNOOO.WAV@@Scream.2.Nooo/>k IMPSYARGH.WAVAV@@Scream.3.Yaargh&">* IMPS@@ IMPS@@ IMPS@@ IMPS@@Composed by: IMPS@@Skaven / Future Crew(?) IMPS@@ May 1997 IMPS@@ IMPS@@What a mess. IMPS@@ Press SHIFT-F9 for IMPS@@ more blah blah. IMPS@@ IMPS@@ Contact me for business IMPS@@ or pleasure: IMPS@@ skaven@isis.yok.utu.fi @B# DBiD)D  B# BiDiD   x<   xx%F !F iG)GaF!F aF%FiGiG aFaF       %;!; i== %; a=   @  !6 T08 8%6  Ta8x R   W V!W VCW)RKVц7 0< @ TaW@ ;(;(   @TD< : <? $ <'='<8 T ='xR T !MZx)ORR T ZZaMR iOZCT aM W iOR CT ZKW R !TZ RKW aTRR aT!MZR )ORR Z)TaMRiOCR aMiTiOCR GiT< @<0T000D)$? 00< GGTR' RR !A !TT YRR VKRT aTRCYKRVaT CT CYV8CT R R  BxR CR xCR >>@ > >)<<@V> < 3T8!? )V @VT< !3 xiV>K R !? !OZ@3 )QR!? V> 8aO<  iQ@CVx>!QR )O!MZ@ Q)ORaQVO>38aMQ!? iO@CV< !3x>KR !?!OZ@!M)QRV>)O8aOM iQ@CViO< x> R MZ@ XR V>3 8CM!? KX@CV< !3x>KR !?!OZ@3)T)QR!?V>8aO<  iQaT@CVx>R !MZ@)ORV>38aM!? iO@CV< !3x>KR !?!OZ@)QRV>S8aO iQ@CVS< E x>)CR  MZ@ XR =@V F<P D#P# K )R@iRiF V 4P P#OR : iRP iR HZ0@ )M )JCO V PJ p< CH0 iMiJ@T CV @p0:)VUT @ RTiVF< UV R@ p@)YRM ] : Y Z@0 MiY!TZ@M XC]p YVZJ 0<  MaTT KXp@ CV@0 : !KVT  )M @ O p aK VF<-MK--AiM R@ O@ piMO :P@HZ@)JCOV PJ p<)PCH0iJ@T CV @piP0:)VT @R iVF<KiP?)O R@p@R !PKiO] :Z@0!TZ@!K XC]pVZJ 0<aTaKT KXp@CV@0 : VT  <@( CK  @ 1  3,K@HJ ?V F%?"!F)V)b<"@@,%W(31  0JV@@%3"K%? VbCC @@K,< 0)J")V"%?"CW%3 <@ @ 3,!KK@@ @ %?"%?  @ @ 3,R3<?CW%? C ,K3="? :(8, F(:= 6,!N8<8: @F%3,K60H%?"8 !FR,aW%3@< %3"K%? C 4K,< 8%?"CW%3 <3,!KK%?"%?  3,R3 ?CW%? C  ,K3 ="?  8,  :=  6,!N8< 8: @ @V F<A>  K @MV 4AOR :PMHZ0@)JCOV Pp<4CH0iJ@T CV p40:)VT @RTiV<V R@p@R] :Z0!TZCA@ XC]pVZ0<aTT KXp@CV0:VT @p VF< R@@ pO :PO@HZ-P:@)JCOO4V PP.p<CHO'0iJP!@T CV OpP0:)VOT P@RO iVF< R@p@R !P] :Z0!TZJ(@ XC]pVZ0<aTT KXp@CV0:VT @CKv@V F<P D#P# K )R@iRiF V 4P P#OR : iRP iR HZ0@ )W )JCO V PJ p<!V CH0 iWiJ@T CV @pRaV0:)VT @ MRRTiVF<V R@ Mp@R] :Z@0!TZ@)T XC]pVZJ 0<  aTiTT KXp@ 2CV@0 ( : VT  @ !P p )R  VF<-MK--A-P@  R@>%P@ <iR piM : PO :8P@ 6HHZ@ 4 )JCO 2V PJ p< 0 CH0 . iJ@ ,T CV @p *0: ( )V & T @ $ R " iVF<KiP?  R@ # p@ & R !PK ) ] :!R Z@0 !TZ@)O  XC]p%RVZJ 0<aTiOT KXp@CV@0:VT  7@2CK -@VV IF# << F 8 <   @A Cx<R  A  !># @ < $%&(<A V>Y@< ZA YCV<ZYTKZ҅@CVCYZ<8CT<  V@A RCx<R A @@<  aKiH<A iHY @[RPZ҃%L2I<>I0CYY[@C>!!TCP@T3<3T D> G NP< @ CViZ)Oa[TN ZCV iViZiO Za[>  ? Z? iZiV4  a[Z)< Z iViZ Ra[!: Z iZiV!Q [R)OCV30<QY 0RiZ?aQiZ[iOa[CV!K3 QZR?C?iViZRZa[aKZC?iZiVa[ZZiViZRa[ ZZ iV K[R CT T DG !SP VZ )T iZK[ a[CT aSZV!SiTiViZZa[ ?)OZaSiZiVp L> a[Z=iOZiViZLRa[!<Z!<iZiV[RCV 3>!O 7RiZ?)QiZ[Ka[CV !?3aOZRKC?iQiViZ?KZa[!3a?ZK iZiVC? a[Za3 Z iViZRa[ZiZiV[RE@V<P @ < C Fnb< .@8-R ?  >V%H =x@ <R V ;!OZx< :)QRR H 9VZ@ 88aO!R 7 iQ$ 6CV'aOaH 5x)iQ@ 4R ,CV 3!MZ/x< 2)OR2R H 08aMR / iO .CVaMaH4(4( -xiO@ ,R CV +!OZx<   *)QRR H )VZ@ (8aOR ' iQ &CVaOaH %xiQ@ $R CV #MZx< " XRR H @ !VZ@!A? 8CMR;  KX7 CVCMaH4(3 xKX@/ R CV+ !OZx< ' )QRR H# VZ@ 8aOR   iQ CVaOaH xiQ@@ < R CV  QZx<  RR H VaPZ@ 8aM0R  iO- CV+aMaH @ x(iO@ 8aOR  iQ< CVaOaH xiQ@8ӈ0@E R CV MZ x< !  XR R H @VFII# << F8<   @A  V C  x< R A  >  @ < #% (+<A V> Y@< ZA YCV< ZY TKZ҅@C VCY Z< 8CT<  V@A RC x< R A @@<   [ !OaKiK< iH !\PLL00 I YMII  @K(YM <QMMOiM>)QK <CiM >00  < C >O  aH<0 >8aH<Q> )D <G!C >  < E >  <0 00 > <Q >    <  >00  < C > <!L >I<M>  I<> <G E> !E<C00>G 0@T FA << )V @<  ҂T!D< iV@!R Z F0R  < YX!T)VKY@!XTaT< )ViV!T0VCT iV@0 ҂aT!D< V@!R Z F0R H XE()TQ!VKX@!iTTQ< )VaV!T0VCT iV@0 ҂aT< V@!R Z ҅0R @ Y)X< TV KY@!iXTT< )VCV !T0VT iV@0 aT< V@!R  0 @0[ !K!A> !\C[ L00Ta\D$@V3,K@FHPR(= 8%?,!F!R ,R3<   %3,K%?VC 0  4 T K,< x0 @  %?,R%3R<!P @ V3,KK@ R @ a?%?CT  C3R3<P  ?%?V C RRKC3C=?0F8R =:C=!P6!N8<RV 8:@a3K60FHP (%?,8!FR,Ra3@<  %3,K%?VC 04 T K,< 8 @ %?,R%3R<!P @ VC3KK R @a?%?CT  C3R3P ?a?V C RRKC3C=?0F8R>!:C=!P6!N8<<R8:@@Q.,F@MHRMM8%:,!FR.<  a.%:QC 0!K4O CDR< x0a8a.R<Q.,CD@  Ma:a8CO  BC..<A :a: C RC.C8:03R !5C81K3<V 35@p10FHPaR= a?3!F!RRRp@<  a3Ka?CVC 04T CKR< 8a?Ra3R<!PVC3KCK Ra?a?CT  C3RC3P?a?V C RRKC3C=?08R A!00:C=!P6!N8 > R8:@T :$@.#@> V < ? @ F@??? V >> >== =<<T @ <;; ;::KV < : 99 9 88R>@ 877 7 66 655  5T44 @8 433 3)V22Z  211 1T 00CT>4b 0//@ / V ..iV<  .--@ -,,CT @ ,++  +**KV ц(F @ *)) )Y((R>@@ ('' ' X&&Z  &%%@ %T$$Y@ $##@ #)V""KXъ "!! !T   CT>@   V iV @ CT @ @ KV ҇ A     R>@@   @  T @  @ )V    T CT>@   V iV@      CT @    @   KV F    @ R>@   T@  M@@  )OT    @3,K@H%?"!F,R3< %3"K%? C 4K,< 0%?"R%3 <3,KK@%?"%?  3,3<?R%? C ,K3="R? 8,K? :R= 6,N8<8: @>%%3,!K60H%?"8 !F,R%3@>%< %3"K%? CK,< 0?%%?"R%3 3,KKBA%?"%? < !A3,3?R%? C 0,K30="R? ?8,K T8 0;   :R= )V0 0@ @6,N8O< -A08: Q@  @TFAFT#)VCViZTa[iVZ RiVZ   iZ a[T ZViVO R PCTTViZ)VO[TKP0CV)VCTRiViZCTa[iVZ RiVZ H iZ a[T ZViVO R PCTTVZ )VOK[TKP0CT )VCTViViZCTa[iVZ RiVZ H iZ a[T ZViVO R PCTTViZ)VO[TKP0CV )VCTRiViZCTa[iVZ RiVZ H iZ a[T ZViVO R PCTTViZ)VO[@TT > < D1V8!= V )V@!F?T< !3 xJ>?K CV !? !OZ@3 )QR!? V>8aO<  iQ@CVE x>R?R !MZ@)OR8T> D18aM!=V iO@!F? CT< @!3x>!?K CV !?!OZ@ )QRV>8aO<  iQ@ CVE x>? R MZ@ XRT>1M8CM!=V KX@?CT< !3xCM>0KCV !?!OZ@3)QR!?V> 8aO<  iQ@ CVE x>? R  !MZ@ )OR T>1!P8aM!=V iO@?CT< !3xaP>0KCV !?!OZ@)QRV>1 O8aO< != iQ@?CV!3xO>KR !?MZ@ XRS@T3ZD< P CViViZRa[CTHZV-O(iViZN<Za[JHRZH-ONiZiVON  a[ZNJ4(ZJH4(iViZH@ORa[O=N ZN9J iZiVJ5H[RH2O CVO.N RiZN*JiZ[J'HCTa[CVH#O-V(ZRONT<iViZNJVTKZa[JHT-VZHO VTiZiVON TVCM4(a[ZN J VT-RZJ HTVM(iViZHOV1TR< MRa[ONT%VM-RZJVTR MZ iVHT VM RK[ROVTR MCT CV O*MRVZ TR MiZK[VM Ra[CT R MZVDM RiViZ)FR( MZa[J!DaPM RZKDRMiZiVJiFM Ra[ZFJ   M ZD2K RiViZF/J MRa[J,FZK)DiZiVJ%F[RF"JCV DKCVRiZFJ-Q(PiZ[JF O<a[CV KD Q4ZRJF V-Q4(iViZFJ QOZa[D KOQZFJQV iZiVJFVQa[ZKDQ4OZFO,Q iViZJQ#VRa[KVQZQOiZiVO Q[RQV @T3VIDT PACXiZiZ[Pa[T4(C ZCXA iXiZ4( KVa[0 XZ  %HiZiXKAa[KVpZXiXiZRpC CVa[IAXZiZiXR(4[CVI%HCTX0A!XiZ#iZ[PD%a[CT4(C 'ZXA)iXiZ4(4(+KVa[0-XZ%H/iZiXK A1a[KVp3ZX5iXiZRp C 7CVa[I!C!OA9XZ;KV iXR(4=[CVI%H@CT X0DPAVKV iZ[a[CT 4(C ZVC,#8#AiViZ((Za[0-.2F-:2RZ @ @!HiZiVAa[Zp HZiViZRC Ra[IAZiZiVR([RI!HCV 0ARiZiZ[a[CV 4(C ZRAiViZZa[0Z!HiZiVAa[ZpZiViZRC Ra[IAZ<  7  <iZiVR(`[RI@O [ ?? @K HRFKN8D!F<"DP0K 4 , 80@KC < 0  <p@!PB@  )D <0pF  C  B4KiD F@ p  <P@  @ 00H!R !F  @< 4p C 0@<< 0<p!8!,!P@O [    V J F0p  C  4K @  p!K <P@  @aK @K W ? @K HRI4@!F<"@L0K 4 ( 4G0I@KC < 0  <p @!P@   <0p  C  4K @ p<P@ @ 00H!R !F 4@ ;@< 4p 6 1C 0 +@< &< 0 !p  <p   !P @        T H D0H pIP 0 8   4K  @ Cp<P@ @@MQ ] <  @M HTK#!F)M<"0M 4 !K!O![!>0 0K# iM p HHH !M!Q!]<!R @      <0p )Y  C    4M M     iY @)Y pMM<R @iY @M 0H%M%D%00H!T((( !F @< 4p  C 0 @< < 0  <p   @     !R )K@    H  T0p  K  W C  iK K4MH T K@ W p K  <R!M@ @ 5@K W ? @K HRM4@!F!N<"@L0K 4 M ( 40M@KC < 0aN  <p M @!P @   <0p  C   4K @ p!I<P@ @ @aI :00H!R4 .!F  ' !@< 4p H  C 0 @<  < 0   <p  !P @     T H D0Cp   4K !E@ C pA P@ @HL X < @HOM#!FM#)O<"04 !F!J!V!>0 0p iO  p HHH !H!L!X<!P  <aR )[ O C   M    i[ O p   <R  )K@ 00H!T H )T!F HiK@< pC 0H<iT< 0H <p@KR!R   00 @@ PPp C    M   p    <R  @  @HL X < <HOM#!FM#)O<" 04 0p C  8H0iO  p <<0 )^  O (aR [ O C i^MO      [-^( O [2 p)R O ^  [<R-^ R [ O@ R ^iO [H0H!T^ ^ [ [!F R R O O@< p ^)Y [C 0 ^W< [ < 0 R T O<piY R2!RW O( T MKRFp R K   000 C  O H@@@PPPM M FE K)H @p H  F 0 <> RiH  '@,,<K KRFN   %8"< 0 0 0@ @ @,,@>"0P4 P P` ` `%,"%8 Kpp0 p p@  D,0  %8"%, p0p0!F@@@,D<<(&!P<(&<(& %8%8  <( <( <(  ,,,0p8%8 ,,0-K(&K-F&-N(&6"8 p@1,Hp36 /,1<0P@13  p%,,/0!R%8"1 ,%,@>"0p%,"%8 Kp0@D,0%8"%, pp,,D<%D(!P%I(%P(@%8"%8  ,,,0p 8%8  ,,0K 6"8 p @1,Cp 36     /,1< P @13  C @T3VDP CXiZiZ[Pa[CTHZX-O(0iXiZN<4(KVa[JHXZH-O  piZiXONa[KVNJZXJH4iXiZH@OCVa[O=NXZN9J iZiXJ5H[CVH2OCTXO.N XiZN*JiZ[J'Ha[CTH#OZXONTiXiZNJ4(KVa[JHXZHO 4(iZiXON a[KVN J ZXJ HiXiZHO CVa[ON!C!OXZJ K\iXH[CVOCT XDPVK\iZ[Ia[CT ZViViZ4(Za[FRZiZiVa[Z HZKiViZ Ra[Z4(iZiV[RCV R RiZiZ[a[CV 4( ZRiViZZa[ZiZiVa[Z ZiViZRa[ZiZiV[R%@,H D,8,#3# @@ (      8+@       @   (  "@K @(   @  @   @  K@!O4@   @((     @   @@   ((    %I@M@    ((        Y@QMA(> MK(iMQ@  K R>@iM   @0 >4 E O @ F CO >@ @8Q>Q Q@ GR>!@ CG@ Z>pG@ F >@0@8@T FA << R F M)V @<   ҂T!D<  iV@! R   Z F0;& ;& R  < Y;&X!T)VKY;&@!XTaT< )ViV!T0VCT iV@0 ҂aT!D< V@!R Z F0R H XE()TQ!VKX@!iTTQ< )VaV!T0VCT iV@0 ҂aT< V@!R 0Z ҅0R @ Y)X< TV KY@!iXTT< )VCV !T0VT iV@0 aT< V@!R  0 @0[ !K>> !Y I8!A0<Ta^D 3@].,Q+<M MTHP<    8%:"< 0 0 0@ @ @,x.@0P4 P P` ` ` %."R %: pp0 p p@  F,0  %:"%. p0p0!H@@@[.,COF<8&!R8&8&Q@@@@]%:"Q%:  8 8 8 @@@!`.,aT.0p ҂)_:S%:  [,CO.0-M(&!M-H&-P(& X 8"L : p @] 3,Q Hp 58  1,R3<0!R @35  p 0%.,p10 T %:"3  ,%.@0p  %."R %: p0 @F,0 %:"%. pp [.,COF<%I(!R%K(%R( @]%:"Q%:  !_.,aS.0p H҂ )[:O%:   ,R.0M  X 8"CL : p @Y 3,M Cp  58      1,3!P< P  @ 35 M C   @H(MA(>QMS@)TH > @@0>4E@ F >@ V X @!V8aI> @ aI >!@@ >pG@  SF >@0@8@ V     T)VT V Y XT)VT V  T)VT V TM)Od@].,Q<M MTHP<    8%:"8< 0 0 0@ @ @,.@0P4 P P` ` ` %." %: pp0 p p@  F,0  %:"%. p0p0!H@@@[.,OF<8&!R8&8&@@@@] %:"Q %:  8 8 8 @@@.,.0p:%: ,.0-M(&!M-H&-P(&8": p @3,Hp58 1,3<0!R@35  p%.,10 T%:"3 ,%.@0p%."%: p0@F,0%:"%. pp!M.,IF<%F(!R%K(%R(@%:"%:  .,.0p :%:  ,.0M 8": p @3,Cp  5H8     1,3!P< P @35 M C @,,<K KRFN   %8"< 0 0 0@ @ @,,@>"0P4 P P` ` `%,"%8 Kpp0 p p@  D,0  %8"%, p0p0!F@@@,,D<8&!P8&8&@@@@%8"%8  8 8 8 @@@,,,0p8%8 ,,0-K(&K-F&-N(&6"8 p@1,Hp36 /,1<0P@13  p%,,/0!R%8"1 ,%,@>"0p%,"%8 Kp0@D,0%8"%, pp,,D<%D(!P%I(%P(@%8"%8  ,,,0p 8%8  ,,CK 6"8 C A @1,p 36 <C    /,1? AP @13   @V F<T3FM K CV@iZTV 4a[TOR :ZA!)VCV\PiViZHZ(0@Za[i^)JCOZV Pp<iZ!QiVCH0a[Z iJ@Z aYT CV piViZ0:R0Oa[)VZT @iZ)QiV WR[H RTiV<CV iYV R@RiZp@iZ [Ra[CV] :ZA!RZ0iViZ!TZCA@Za[ XC]pZVZ0<iZiVaTa[ZT KXp@Z0!N  CV0iViZ:Ra[)DaV)KVT Z@Z iVpK[4R  VF<CT O   R@VZ  @iZK[ %W#  pa[CT " O :Z0@ V !PiV>iZ HZCD@Z! @   @,K3E  @   @@="?  @   @8, >! @  @ @:=  E  @    @6,!N8C A!    @@8: C      5@O 8 KK@?H3$M'$=$   @<@ @)?  @!MR0@!K @ P ?@!DK0 ? @8M0 K @KO ?  <0H p M00 K   KK0 ? MR K 0 00O0!KH!?@a=0M 0I0 IMi=!I0 =K I O IH = K<0 I I0 =0 KM I0  00%A O0 4 !I(H!= 0 S@Q.,F@MHRMM8%:,!FR.<  a.%:QC 0!K4O CDR< x0a8a.R<Q.,CD@  Ma:a8CO  BC..<A :a: C RC.C8:03R !5C81K3<V 35@ FJ 0FHP@ < 9!F!RR@< KCV0< CRR0!PK R4(CT < RPVCRK0< A!00!P!N R,@M? RI@:HF$T< !TR0!UA$iDW@F:@!KR0 F@?T0 R@RO F  <0Hp T!P00 RUI 0 F0R M0!T!PO RRH F@0T H  TK0 RT    R0 F  TO R  O  RH F  T0<0 R  RK F  0   TO R  C0    00OM#0  !RH-P2!F @V8 KK<?HTM'$=$ 84V @)? T !MR0R!K @ VPpx ?@!DKC0CT ? @8M0pKV K @!MK< @R ?  )OG   VM<HaM K  8G piO T KKC!0CV ? VMRpx K < 0CT pKV !M000R0)O!KG p!?VM <a=0aM8piOT MM0CV KM Vpxi=KC0CT ?MQpKV K !O< 0R )QKG p ? VM0A0aO K 08KMpiQ ?@C0CV C MQpx K!10@  < @ 00<0@0!KG !?< @O 8 KK@?H3$M'$   @<@ @  @!MR0@!K @P?@!DK0 ?@8M0 K@K!O ? <0HpM00 K KK0 ?MR K000!O0!KH!?@a=0M 0KC0 IM0i=!I0 =KP4 I p!O IH = H!MA0 F 0FH :D =0 >HMC FA A [00A 04!F(!:0X@T :$@.#@< V < ? @ F@??? V >> >== =<<T @< <;; ;::KV < : 99 9 88R@! 877 7 66 655  5T44 08 433 3)V22Z  211 1T 00CT< 0// / V ..iV .-- -,,CT  ,++ +**KV ц( *)) )Z((R@! ('' ' V&&Z &%% %T$$Z< $## #)V""KV "!! !T   CT   V iV  CT @0  KV <   R@!     T 0  )V  T CT   V iVE(     CT      KV    XR@!  T  OX<  )QT  @.(3,K@F:#JT   @@@%?" V   ,3 -Z@@  @%3"%?  T %[@@ @ K,< CV Z@@  %?"%3 iZ iV@@ @  3,0K@%[  @@ @  %?"%? Z  @  @@3,3< iV -Z @ @ "@%?"%? $$ $%[@ @ &@,3(Z( (Z@ @ @@%3"%? ,-Z,'-V@ @ &@K, 0%[0 % @ @ $@%?"%3 4Z4 #@@ @ "3,K8-V8 !-Z@@ @ @%?"%? << -[@@ @ @3,3!@@R@V@@ @ %?"%? <-Z < R@@ @  ,38i[8 -Z@   @%3"%? 4CV4 %[ @ @ @@ K,< 0R0 Z  @   !@ %?"%3 ,iZ,@-V" @   #@ 3,K@(a[( Z   @ $@@%?"%? $Z$ %     &@@3,3< iV -Z'    @@%?"%? Z %[(@ @ )@,3Z Z*@  @+@%3"%? iZ iV@ @ ,@K, %[ -@ @ .@%?"%3  Z R@  / @3,KiV  0 @ 1@@%?"%?  [2 @ 3  @X H<R F#R# M )T@iTiH X 4R R#QR : iTR iT JZ0@ )Y )LCQ X RL p<!X CJ0 iYiL@V CX @p T0:)XV @ ORViXH<YX R@)Xp@TR Y_ : XiX\@0 TT!VZ@ Y Y ZC_p X XX\L 0<  T TaV Y YV KZp@ X XCX@0 T T: Y YXV  X X@ T Tp Y Y XH<-OM--C!W X R@ T@ Y piOaWQ :R@JZ@)LCQX RL p<CJ0iL@V CX @p0:)XV @R iXH<MiRA R@p@R !RM_ :\@0!VZ@ ZC_pX\L 0<aVV KZp@CX@0:XV @CM@T ? RI@:HMTH  V ч<шiO!TR0CT !UA$iDWKV ъF ҂@ !KR0R F@ т?T0 R@ ҊTR0O  F  )V<0HZ p T T!P00CT R V чiVUI 0CT F҃0RKV  MY0R XчZT!T!POY R)VRHKX FT @0CTH  V ҇iV TK0CT RT KV Ҋ  R0R F TO R T!<O  )VRH F T T00CT R   V RKiV F  0CT  TOKV  R C0R  T M00A O0 4 )O!R(HT!F 0 @X H<V3H@ O M CX@i\X 4a]VQR :\A!CXRiXi\JZ(0@Za])LCQ\X Rp<i\iXCJ0a]ZiL@\ V CX piXi\0:R0a])X\V @i\iXR]H RViX<CX X R@Ri\p@i\ ]Ra]CX_ :\A!R\0iXi\!VZCC@Za] ZC_p\X\0<i\iXaVa]ZV KZp@\0 CX0iXi\:Ra])F)MXV \@Z iXpK]4R  XH<CV   R@XZ  @i\K]  pa]CV Q :\0 XRiXi\JZCF@Za])LCQ\X Rp<i\iXCJ0a]ZiL@\ V CX piXi\0:Ra])X\V @i\iXR]R iXH<CX  R@Ri\p@i\ ]R !Ra]CX _ :\R\0iXi\!VZR@Za] ZC_p\X\0<i\iXaVa]ZV KZp@\8 CX0iXi\:R0a]XV \  C i\iX  CM]R  @V8 KK@?HTM'$=$ 84V @)? T !MR0R!K @ VPpx ?@!DK0CT ? @8M0pKV K @!MK@R ?  )O<0 p VM0HaM K  8piO T KK0CV ? VMRpx K 0CT pKV !M000R0)O!Kp!?VM @a=0aM8piOT MM0CV KM Vpxi=K0CT ?MQpKV K !O0R )QKp ? VM0<0aO K 8KMpiQ ? 0CV MQpx KY<0R X< ZT00%A @CY04V!K(X!?<0@V8 KK@?HTM'$=$ 8<шV @)? T !MR0R!K @ VPx ?@!DK0CT ? @8M0KV K @!MK!OR ?  )O<0H p VM00aM K  8iO T KK0CV ? VMRx K 0CT KV !M00!OR0)O!KH!?VM @a=0aM8iOT MMC0CV KM V0xi=K0CT ?MQ4KV K !Op!OR )QKH ? VM0A0aO K 08KMiQ ?C @0CV MQCx K!1A@@ 00A 004!K(!?<09@M? RI@:HF$TH < !TR0!UA$iDW@F:@!KR0 F@?T0 R@RO F  <0Hp T!P00 RUI 0 F0R M0!T!PO RRH F@0T H  TK0 RT    R0 F  TO R  O  RH F  T0<0 R  RK F  0   TO R  C0    00A OM#0 4 !R(H-P2!F 0 @V FF<:HR.8!8< T 3FK0XCW0 VKCV@@!?CKC0x!:@30CT p).@!O< !OKV @)QpG HR!:VK<0R@@83 aO0@T ARC0iQ!0 VMCV @5< 0xCT @!MA0 !OKVp!<@)O5CHR 0@V6pF<0CR!18aM@T CFK0iO W0 VNCV@@!BKC0x!=@60CT p1@!O< !OKV@ )QpG HR!=VP!IA0aU@@088aO!?@ DaI<0iQ 3PKCV W@@!=Y 6C0xKR !XAN<!OZ Z <@5G HR@@@V8 KK<?HTM'$=$ 84V @)? T !MR0R!K @ VPpx ?@!DKC0CT ? @8M0pKV K @!MK< @R ?  )OG   VM<HaM K  8G piO T KKC!0CV ? VMRpx K < 0CT pKV !M000R0)O!KG p!?VM <a=0aM8piOT MM0CV KM Vpxi=KC0CT ?MQpKV K !O< 0R )QKG p ? VM0A0aO K 08KMpiQ ? C0CV MQpx KY<0R X < ZT00<@CY0V!KG X!?<@V8 KK<?HTM'$=$ 84V @)? T !MR0R!K @ VPpx ?@!DKC0CT ? @8M0pKV K @!MK< @R ?  )OG   VM<HaM K  8G piO T KKC!0CV ? VMRpx K < 0CT pKV !M000R0)O!KG p!?VM <a=0aM8piOT MM0CV KM Vpxi=KC0CT ?MQpKV K !O< 0R )QKG p ? Y 8M0>!10A C KMp0 !X)LMQ00p@@ 0< TH00,@!<!K<t@V @F<T3 F M ?K CV >@iZ=V 4a[TO= YXR|LҀ "'+//1o6; a[VzZҀ  &+/035LD< 4XV~ZЀ  &*+,/1a; ZW~{Ѐ#(,- f x_|{Ѥ "',-039 }t{9Ѐ $%(  yr{GЀ "&'"  !"#$$$###"! bzzU%ր $  "#$$%%&%%%%#"ze@у  !#%'())***)('&%zg7Ѐ #!ʔ6"#&)+,.//000/.-,*(&hz?Ѐ  $%ГB%&),.012333210/.,*(5zHЊ#$ꇸ.&%+,/134566655420/-+7zR΀ !%)A(,1146799999875420./z`Ҁ$(M,3479;<====;:975311yz͢ !%;A<>@BCDDDCBA@><9741}hр  $ыU<@ACEEFEEDCA@=;855|{| Ҁ "ё`?CEGHHHHGFDB@=;87~[2Ԁϙ6RDHIKKKKKIHFDA>;9^TԌ 厽^IJLNNOONMLJGEB?<azlր 㛴rRTUVVUTRPNKHEB<bW~׀֘3jTWXXWWUSPNKHB>cX~&Տ 揺 j[Z[[[ZXVTQNKEAeWNQր 嚲 {\^_^]\ZWUROIEiX7fրې 8y_bba_^[YVSMIjX6\-ԡ䋺 !(wmiigec`]WSOJf<Fցޙ $)/kkjhfc`ZUQLa3A׀öㆾ %*05lnliga]YTN`- ) Ҁ蹶≶ $,05uzppmjd`\WRa- < ڈ墵ޜ$,16:tsqnhd`ZUd- 7 ܀㈽$-27<=@wuokgb\WU8 ܁ޘދ%-27<@@tutnid_YH7 ؔԔ#,48=>ACztslga[Q/ ∪Ԑ ",17<@ACDxsoid^M& 䅱ˎ㔹 !*27<=@BDXuqlgbR4 ˓ɆР !)15:>BBCDzuojdZ- 鏰ƌ #-28=>@BCDDCrmga(* 퍵 !+38<@@BCDDCMmic/. ꏺԛ'.69>?BCDDDCB~uje)0 횱բ )27<@ACDEEDCB@lg// ؖ #,48>BBDEEEEDB@?f20 璂։'38=BFFGHHGFDB@>;e#𐀀چ!*38=AACDDDCA@><97kL,ц*19<@ACCDCCA@>;964C# ä &27LQUVVVTSPMJD@;6/% N!G M揹ǵ);JPTUVUTSPMJD@;70) P!(Ӏ,@LQVVVVTROLFB=81& 3B7DʛԘ 5AMRTUUTRPMJD@<70& K( '[㐯݀'9FMQRSSRPNKHB>94.' T#:E; ݆-EMNOPPNMKHE?>83.(k= Q;" ڂ怀,9EJNOOONLJGD>=72,%a,0_5ڃ̀#0BFFGGFECA><960tN(- b8)ې(3:?CDEEEDBA><96w^:(_:,ݛ#/6;?CBCCBA@><:rhL) 2?Q<- ς禀 )27<@@AAA@?><:YsQ152Z=2Ⴉ$-58<=>??>><;8bL( *hB9'Ȍ%.27;;<===<:I~_H$ :_G=2 牫ŀ  (-389;<<<;:h`H'=0^@7#䊱᳉ #*.3789;;;:d`J-<jD;+Հ%*1569::::~kdY?$, TP>-ƈ"+/3779999kbO/?hMC5ˀ  )1599;;;;lbM( ClLC3ʀ '.389;<=<neN**) qKC3ǀ!*27;<>>>}rfO,?%##qKC%.69=>>?shV1H$RBb '059=<=<<a@H')'@ &,26789h`B@*(&$$! ã"*.23;`]I( ,2&%-#" 昼%*.2eaZJ/D%J#%#   &*>}`]WM9! L*+)'$!"*-1sk_V<W5630.($  񐸀$+/33~g^F`<=:71-)$ Ě#+3456~eU$(0TAA?<62-("退*15677~eDbLFEB?950*#蛀+26799eC zLIHEB?83-#獀&16;;;;9J UQOIE?3! +6=>@@?to16TaSRLG@0 댸%3:>?@?^'2#uSSLG<,똰ŀ".6;??ys["<xTTMH=)뎺ʀ (47;<hZ)3vTTMG<'댵π",47;ng\;* zWTPKD6#臯π%-}gcaYR?%獴*PbSOKE:,熯ϑ#vc^\VRK?+拱)kTPKF?/ 烱لl]ZXVPLG@4$拯' oLLE?5&݈cUSSQOLFA=6*爯% .`FC>7+ ̎Ӑ"TQNNMKIF@;70% 鉱& lJF?.爪 oKNMLIFC<70% ȗ) fOHB1ˏFQGHHGDB?950* 폴! PQD>-艭\>AABA?>;82.*$ 㚻+ b<9+Ęͫ'D79;;;:9752/)%!  Z62'񌶸F/024555431/,*$#0  S/' ?313555532/-*'! 5 W2)-/,./0110/-,)'$! 8 <>+ ="&)*++++*('%# 8 N3(>!!#%&&&&%$#!6 R,$7 7 J3 C Rڢ#:&#"  N0* J$&%#! +B  G**)(&$! W  "?-.-+)&#! T,+ Q4420.+%! N Z8:8630*%8 b>?=:71,%>Q gBCA>72+FN5 #dFGD>9.#ID6 ;aLHC9) \' rNKF6# FL<7 hWMG175  !"uSG& LY660 !"##jYJ*W:71ɫ!##$##" nCU960%ƪ ""$%%%%#" n/Y74/$ף!%%&&&&$#!e@Y42-&ˣ  $%'((''%#!1LW30,&ʠ #'')))('%#  E4 ^86, %)*,,,+*'$ ?J:4.$#(,,--,+(%J$S/,' ߐ$)../.-+(" E'#E2,'!ڈ #+//00.,*#(7%!O(&!ن&-12320.(# N'% P73.#ʁ (255530)T-+% ZA;1Λǀ)499985.  O0-' 铿& eGC0 앷À1;>=<92$;=3-"ģ5oNJ'+7@CA@9-I93-!,%uTKក/=EEDA:)U41+[L7CIIG@/^60{'2CLKIB1Y95$o.CJJGA.GA6+Er‹-AJJHB7]62 gQϒ)9EIGD=*V84(MOEЏ.ADDC@6$J<4$ 6gHLӫز!1;==;5+N;1!  6gJ)@Ҧޡ$.78871*R6.+jH&@ͩ)03320*S1* ,jG&A',10/.("Q.' 1gG&-,"*-,-+)#R,# YZ4H &,+,+*$F0' rHG$#))*)'$ L%ħ@d3>+!"&&'&$! L) pJ,2%  $$$$" /5 7i6M  ""!  P  !oD۸  G. "#oI   `##kN  \; !%aX4""##"  *W-Ȩ$[_%C$**+*(% c9 !Aj2­EA9:82$  H# !"jE`AA- ʥ"##" F'  !r0kGB!%$$# G' FbdRC$%&&%" G'  lK =hDî#&&'&$ I% qA!vJ%&'&%"F&   !n ͥ %'MZǭ #&'('!D ͦ  r %%'h3#'''% L&!r%$&&%m $''&$52  q2%&&%#a$&&&#M!pD"&&Cԥ  $%&%"?+fO&%&$ : $$$"J" s2 "&&&#N!#$$"LYT%&%$ I ""! Mp? "%&%#=""!MN\.õ$%&%" 0٧ !! AlI#&%#J"!!K +f6Ķ %%%# J !! GaB5!$#"@) !  $5d63"##! ,5ŵ!! L@4/.$ K  ! D$A "#" I! L   O!"!:)64 Ȼ!! 5,R O* !""  D%PS"$"KO  +<! MM$   R   F30  U# $0J%$$U+!!! L 6'&--+# S1 ""#!JE6753!J9 Ľ!""!5U䰚#:A=:[0  "! Q4 :?;50G##"!Z7ŏ!:=;4Q6Ǻ  !! ^; ʑ#8=:4[) #"" Z> Γ$8=:48E ""6VAҔ,4;97*Y1sD7˯0:=;9' Y6][,;ؖ$1<;92T8 rE %ٹ07;:7+I@%г iJ?>ߡ18982& -K( BRA99-3876/ 9D1J-/.uѲֶ$08985.S9+F %'tչ"18985+Z4'o5Ӹ-6663,'M. f<߲*5553, M=( [2ٰ-4753+ Z2!R$G'Җ-4865/$V5,57)<# Ӑ"15753+G;/P)#: ϝ&1333-'1F0?0&  ي(0321.$[2$ O$ Ԧ",3221+!X6*J*I  ',-..,)! X1)F)-.#)-./.,) 6E1# H&<%)*+*)& L8/I"G#'())'%V5,HK #&&''%# Y3% GI#֭ҥ#%&''%#L6/$FB  %,///.,)! 1C3)E8' 䠿#.15420*#Z4.IGݩ$.7::963'W93 8.ә/=@@?=5%HB5" JC&;BEDA:)]:3# ;D0FNMLF<" ^80 4l#@MQOLD.@F8+|;JMLJD6 S?6)?`۞6AHFEC<.\:5'<'5ޑ+9===<93( [732A< ͇)499:975.' T44s+"ɀ$023431/,"G80nC #%)***)(%1@rB  ي    Q2 3B&앰㋿  ##$%%%$#"! U19 N莭˧ "#%&''''&$#  X+A U勮  $%')***)('%#  Y+ CX䊭 &'*+,-,++)'$" Y)8!AF㉭ !'+,-...-+*(%#\#BaB ⅲ!)-.123321/-+)& P>B+e'㑩 ͨ !(,01344321/-*'![#@n@ ㈴#+/0234321/-+%$M7>cS&䑭 ێ ")-12454320.,)#[!6w?ߊ ޢ$).2233320/,*$#Q55v=䊮 Ѐ #*.23565532/-*'$SBBmO2䉭',154665430.,)#PECoB䊬 ш  '+01344320/-*'$VKGTY8 猭 Ӡ  (,01333320/-*'TV"D gJ%叫 呺"',0012210/.+)X[, ? n@掮 ֛ "'+,.00100.t_L( ? d@%抵 (+/02334320W<HWF+ #)-1123321reS2D=O/񐹼ɼ頽 #',-/12221\O..(  ^0ԩ!%*..0111oi\I(F Z3 %*+-/01a]R:! B! S)ʴ #',,.0b_YM6 D# L"횴"'++-a^YR?'E#1- 헵"&'*|b]YSI:'G%?"  !'sb\ZSNG7(M#Aݼ b`XWTNID>3%]!C qUTQKGB;/54F vRSPMFA7-N@ ^YQPNHD?9/!C,  nOONKIC?:3(P cDGFEC@=73.'  U' O9=>>>=<:752,($l-  R.245554320-+)#"l/ ߂ F&*,-./..-,*)&$!h0  ="%'()))))'&$# -_4ᆨ 딿4 "$%%%%%## KQ3艦 듾 4W>2ݟ) !#$$%$$#"!jC5 aG=+%   ._@56  hF== ꊳ  !"""!! T)5$ ᖟ  !!!! 9 L2*! G   W3+!߂C' 9 Q5-߀;" <SC8- ق7  @`E?4&ހ! G"#" XNC8(݀5 ?(&%#" >]E<(ސ  9**('%# qH@.݀)  R,.-,*'%sOF1   ,<4320.,*nWM;!݀   V45420.+)uQH0݀#  V2421/-+(CgM<%݀!  K2320/-+)&hUI7 р!  3=2321/-+)'$rMD/ޖ$  H53310/.+*'%#QZH9'߄   Y3654310.,*';iNE3 ˇ  S45554310.,*'%rNF6 偩 ݶ6>45544310.,*'%qPG8%뎧" W256665430/-*(&nSI>'⊱  dzQ4556665431/-+)&#iQG8$+ N::;<<<;:87531.,)uQI:$ + V<=>?@??><;9742/,;mN@(, ެ풿Y:=??@??>=;9752/,)eXH7* ᓽ\;>@AAAA@?=;9741.+%rNA, Ғ_;?ABBBBA@>=:752,+("pF/ 㚽Ӊ8K@CEFFEEDB@>;9630*)#p 1 ဩԀ`?CEFGGGFDCA>;932,($ " F$ ݀ƧQDDEGHHHGFDB@=:71-)%!  D! ݀ƀbBEGIJJIHFDB?<932,'#6 E+!ܐXEEHJKKKJIFDA>;82.*%!1 N%р:YLNOPPPNMJGE?>84/+& 3 Q-) ێ:PGIKLMMLKIFDA>;51-($5 V5.$׀DQJLNOOONMJHE?>840+&!% S5.( ؀@RKLNPPONMKHEB<;50+'!-O;1+!׀EQKMOPPPOMKIF@<;40+% 1 H?4.' ّLOKMOPPPOMKHEB<83/*$AH94.$ ۀEHDIIKLLKJHFC@=:40+& -1T<70%׀SLKMOPQPOMKHE?;73.)#-[960)"ݏKCCEHJKKJIGEC@:93/+&!)d>:4)! ؀RIIKMOOONLJGE?;:4/*$%`>:4.' ۀEA?EFHIIIHGEC@:93/+&4eB?9/' ӀGIFKKLMMLKIGDB<;51-(@A:0&րjNPRSSRQOMJGA=94/)#%JG;71*$ ޗPAAFFGHHGFDC@=:71-)%7]D>7-%؀jHLNPPONMKHEB<;40+&* [:5.' ݀XACHHIJIIHFDB?=73/+4 `95+" ۊ'ZHKMNNNMLJHEB?954-9 ^74*!˃4D>@CDEFFEDCA?=:710;#^>7.%ӂ=;9741.3*#3L72( 񎲯H-3479:;;;;:97641/,--$" Z63,!™D)-/246788877531/-+H$$! K?40)#ʀ3((*,./111110/.-+*=+&$! ]960)#ӀC!%')+,-----,+*)'H!$! [52-Ӏ>"%'(**++++**)'&$0+"! =B3/ޓ"$!"$&''()))('&%$#B  U5ㆪ@ !#$%&&''&&%#"!C Y舰$)"$%&''''''&%$#!B 2ϗ7%$%&'((((''%$#" > ?%%'(()))(''&%#" ; 񑹻H$'))))))(''%$#!@ 显K$())))))('&%#"4f ҦN*---,++))'&$#!o G,,--,++*('%#"M_ %83..--,+*('%#"sQ 󒷷#R-//.-,*)'&$S`OK 𾟴 Q00/.-,*)'%#tPMG뇰 P3310.-+)'%"sMK퉲* S.0/.-+)'%##pLJ 퍴5R,.-+*(&$" "nIF鍴-B+,+)'&#" 8aH玲504**('%#!7\E狲?!$%%%%%%$$#"! H.-+)'%# `K 𕱲C###$$###"! (7*)(&$" i쐷D$&''''&&%$#" K&(&%#!]E 񔲵@+**++**)('&%#!C)(&$" bꏶ82--..--,+*)'&$ ?$%$"\'B35443210/-+*M)*'%". ĠD4222100.-,*(&K&'%#  S45443310/-+)'K#%#  򬫶 S477765320.,*7%%" 񾣵E@9::987531/-+)2$$! ŝ[<==<;:86420.+9+&$! 򚲴LD@?>=;:8641/L((%# &󒷷/O??>=;97641/@,'%" +c?A@?=;:7530!P%&# 򑶶bACBA?=;9741.'+(%" (ƟYHFECA?=;852] '&# Ľ cJIHFDB@=:743,+%$ fDFECA><:75 *&# jFHFDB@=:I~-%  )󜰶 JUJJHFCA>Pd$" 'Ğ dQNKJGDAPfc " ش%ǘ sOPMKHETi9'!(󘱳 jNNLIGDAlg(" 󒶵 SVMLIGDAlxg'$(摴 pMMKIFC@h2!&!𕮰 lPMLJGDAqf)#  bVPNLIF@i+("-搲 nNOMJGDAW}/)$ " 󎴲 pMMKHEBw4(,&"a ]VOMJGDA;.+&!_L lQNMJGA@:/)%!WRF포 jSOMJGA@:/70,($qL 헸 TXNMGGA@:K1-,_]P%  pMMJGD>:?3.*wSOI pNNKHE?>8"=/UhTOI jRNLICB?9V0z[TNG$ ,lNNKED>b(4/yVRKD eUPNHGD>A54}ZWMHA oOPJIF@<<5]YRKD:ݙ !qOOLIC?%A`\VLG=8 `XQLKED>b`YOGB8 iUQLKEA@zUWNE=3)̀  !! Z_TOKGCSQTI;2$р  !!"####"!3mRNJFBiKKA2%;  !"#$$%%%$$#"!tRNJE\}eGH:, !"$$%&&&%%$##!sROKFkf\WG:+¼  "#$%%&&&%%$#kXRMhme`2 „ "&*+.023455554320/-+)'%#qPKj{h_U:dz %+/4589;<====<;98642/-*'%"BZEhv`WIo"薩 !(-1569:<=====;:97530.+)&# `Fms`VoY%+0458;<=>?>>=<;97530.+(""bspaWD߀'+059:<>?@A@@?=<:8641/,)&# EytbUFs6⽀&+1569;=>???>=<:9742/-''$!kdvm!͸ (049=ABDEFGFEDCA@=;9630*)&#JbZ,̸ !*25;?CDFGGHGFEDB@=;852/,)# X|^MǼ#,48>BCFGIIIIGFEC@>;852/)("!J:wf"ξ%/4;@EEHIKKKJIGECA>;821.+%!  S-fGǺ %-5:?CGGIJKKJIGFDB?<932/)(" U1._ɼ+2;?EIIKMNNMLKIGEB?<960/)%$ S/,p2̵ "+3;?CGGIJKKJIHFDA?<933-,&" T3.rwb̽ !)27=AEFHIJJJIGFDA?<9630*)# Y85wP= Ȼ %.39>BCFGHIHHGFCB?=:741+*'! `BBDFFGFFECA?=;852/)(%iE}m_PyDԙ%-17<@ADFGGGGFEDB?=;853-,)#`UJh`LdO ဍ ")059=>@BCDDDCB@?=:8530-*'rQuj_J:f*䀜 %)/489<>@@AAA@?><:8641.,Uboyh\J8j4#)/378:<>??@?>=<;97420-xXzui^J8j=! %+/3779;=====<;:9753To{{{iaR@tG* !',1569;=>???>=<;:865z{{oeWH6m>"Ȳ %*.2669;<====<;:975z{{ti_O@.j2ˀ #(-12579:;<<;;:987z{{{lcXI;ZRـ &*./55789::::987z{{{qg]SE7l( #'+//2467888877z{{{ukbXM?z:쀞 !'+/035789::::z{{{{{qg_VLBv #'+,/135677srjz{{{tjaYPG`$$   $%(+-/01gfz{{{tjeZRJ!D2(  #&(*``]z{{tmf_XNW92) "df\[Yz{{sle^WPIC6-(ƀ h_YXWTz{unha[QLX:4*&€ h`\ZYVTz{slf_YO\73-&IJ SfXYWUSPzuoib[UZ62+%ŀ 61+%ǀ qNQQPNMKHwplf_Y U<60*#Ā \XSRRQOMKIGrmgaZEF83,& Ā lOPPONLKIGDrlf`1_85/)"ƌ ?\LMMLKJHFDB^if`_;82+%ŀdHJJJIHGEDB@=jeY #^@95.)#ƀ(ZEGGGGFDCA@=;lc#!:U?;5/)#ȏ U>ABBBA@@?=<:8fb YA;61+% Ȁ"R=@AAAA@@>=;:86c"# a@;50+%ɀ"M9<=>>>==<;:864@}$%" +Y?<60+& З P589:::;::876431c&%'%"XIA;61+% ЀD34567777765421/.++)&$!gHD?93.(#ЀK)+-.012221100/-,+_(%" ]IB=73-(#Ѐ/.(*,-./00000//--+*H$&$" UNE?:50*% ДA!%')*+,,----,,+*)!G''%#" 5_EC>93.)$Հ+!!#%&'())))))(('&3/'&%#!mIFA<71,&"Ҁ9 !#$%%&&&&&%%$L$'&$"!@`JGC>83.(#Ӏ" G"#"! 7aGE@<72-(#Ԁ F!#"! fKGB=94/*%ב ,)!! jFD?;61,'ڀ 7# DUFA=83/*݀ ;`FB=94/+ߑ <EMB=94/+Ά '+Y@<840+  # b?<840憭 ( `>;73錯   [>:92앰 H  Z:760퍵 Q ]865XCC66[W77\Z]K;;;=C6,GX6W4/J8H93Z<;1U1 $V>=7M2/\?>;85;4,+  ^FB@=: >2+)瘾# \KEC@:9?0*(藽 XPHFC=<6?.(&铽 PVLGFC=95<-%$!ᓺ" >dONKED>951,$싷! fRNLIF@?951G# ) oMMJGA@:62.;#!显$ I]MLIF@?951-C jRNLFE?>840+'=֧/ pMMGGA@:62.*%0+ Q[MLIF@<;51-)$jPMKHE?;76/+'#3qLMJGA@:62.*%!ـ1N[MLICB<840,($Հ&lONKHB>=73.*&!Ӏ 4lKKHBA;73/+'#ʀ .oMMJGA=951-)%  ǀ /kNMJDC=951-)$  Ā 7jNMJD@<;40,(# ٰ =fQMHGA=943,(#  YRJHB>:61-)%   mJJG@<84/+'" ¡ RWLGC?;62-($ 苮 #lLIEA<83/*%! 놀  X eLHD?;61-(# 剀!!""""!!!+hMJEA<83.)$   !!!!!! z0E>:50+%! р  #%&())))))('&%sQ?ABBBBA@>=<db\z{!0*  %)'/5;?@CEGHIIIHFECAnhc]z{:"& ѿO-6;AEFIKMNNNMMKIGSnjd^|{g%M4:?EIMMOPQQQPONLJupjd^Yzf F<?BDEFGGGFEC]lic]WQK%4-'  Հ9#(-1599;=>>?>>=c|if`[UOJD:72+% р3$(,0024677888jueb]YSNH>;N22/,@HC<:0E720-VZ997H10P5K=8>>+Q:7B6L5U:7#G3SX;; O0\>=:S-_A=<9P&  ZIC>38- gCD4K1,ç  fHGDS.,' 9]IE7<1,(錷  mKK( P3/+'敧. U[P U41-)㕤_XM U52.)%࢚* jUO R73/*&"ҁ3!!"#####"!!oU M<51,'"Ҁ8 !#$%%&&&%%%$#uT GA51-(#Ԁ#% #%')*+,,,,,+++)'&y 2L94/+& Ҁ="%(*+-.....--,+)('n Y;72-(#ʀG%)+-/0111110/.-,*(B< ^860+% ƀE*,.02334443321/.,*(v!W?94/)$ À=..1346677765431/.+)m !a;83-'" %=346889999876431/-*(/OC84.)# ݱW:=>@@@@?>=;:7530.+(+ UE=71+% _>@ABCBBA@><:8630-*"%RG=81+$ ALBDEFEEDBA?=;852/-'< TI>92,% `GGHIIHGFDB@=;853-)(BOK?:3,%  lHLLLKJIGEC@=;821+*$DQL@:3,& 値 sPSSRQPMKIF@?982.*&AgB>70)悡 qRSSRQOMKHEB?954.*&;`IC<5/%军 mUUUTRPNKICB?951-)%+hD@92+ Ѐ j\YXWUSPMJGD>:54-)%GE;6/% Ԁ Vi\\ZXUROLFE?;62-)$D?:/' π #$'_`^[YSONGC>950+&!?<2* Ѐ "&'*bnba^[UTMIE@;61,&!w:5,!€#'++.0gfc]YUPKFB<71,& u1-"€ %)--0245gga]YTOIE?93-' R-% #(-.13577exhd`[WQLGA;5.'! !&,1569;==>>>=kgb]WQJC<2) F! À"',-03567777hd_[VPJE>71'k"þ !*.49==@ABCBBA@>=wnd_YSIA8- ѽ ',38<=@ABCCCBA@>0$ ?е &.38<@@BCDCCBA@>;9741ceWQG>4% zAͩ "*25;<974..rXRKA6'%i@ ",48<@ACDEEEDCA?=;9630-*uQMC9./i=〠'05:>BBDEFFEECB@=;963-,)HbLG<2$ @d<ీ "*38=ABEFGGGFECA?=;852,+("!bKE:1& M,X/ ހ(05;4)=_Ӏ'/7;@ACEFFFFDC@><:741.('!]:1'JV<̊(19=AEEFGGGFECA?=:741+'&  Z5-# 09`͹ '08=BCEGHHGGEDB?=:741+*$  Q3*! SPBι&09>BFFHIIIHGEC@=;85/+'&  ?2'N8cȾ%1:BEFIJKKJIGEC@>;85/+'# @";85/.($  @FCb3з ,5=AEFGHHHGEDA?<:43-,&" :HEbBλ!.8>CGGIIIIGFDB?<963-)%! 1NERP˾"/9ADEHIJIIGFDA?<932,+$  ,VF;54-)$ XT%ŀ $4@GHJKLLKIGEB<;54-)$Z_8р&6?EIIJKJIGEC@=:40,'" xfI"Ѕ "2;CFGIIIHFEB?<93/+'"pawS)Ϗ'0:BEFHHGFDB@=:43.)$,ZmqU0 ӂ*5҃#-7>ADCAAA@?<;850/)&" ( #Sy^<Յ'1<=@@;>>>=<97520+*% ' K@yN!ԇ*3:>A@;==<;:9742/*'$  # Q{J#ډ#5;@BA9<<;:97530/*&# 1 IÏ  $*-//00000.-,*(%#  E%!  Hߑ  !##$##""!   R430(! 1$8З!!""#$#$""!  L11.& *=즴  ! ""!!  J030-'! B  ! ! D./30+& .$1㨛   D25430*#0+ 귺/307653/+5 9ǚ9*03531-&3 4 ͛$)-5552/ 5 !% ͮ $!()5554/ (6נ   !(*6574 :#͢&!"#"")011- H Υ$  ',000 J"! ȧѹ( ###" "(*++ 6 ̭ۧ* !"#!  !%((" 3:-! ٩$!#$$" $$%# ;#B$ ͫ*#%&&&    .A' ଼( / >&%B.$ܯ &   $   7'$ ;1&⻎-0 <&#'*е&  ;$;&"2ƞ"3 A 7"!1# ͦ(/  .9! 8##4!% - ?. 1"  1 "- <2 6#! #&- 43/#,(#! ) &;)( /! !" $=%'$ & &#: #"  + ʼ $6" '! ' )-  *# &/% /! )" /1  , ! 0 /  ;''&%#!/   D,-,+)&"!   L120.,'#&I Q5642-)!/F2  P9:73/& 3?3 1O>;7/Q& ^A>:'5D71 VH@;/P-# 1[D<@8$' dG9HP%*$ \N: H.,'Ѷ Y4 H/,'ʹ!!!!!]$M/,(ܬ""####! X=P-,'!Ъ"#$%%$$" )C P.+'"Φ !%%''&%$"! ?/ X42) #'(***)(%">G72,%"'++,,+*'$I#Q.,& ߑ#(--.-,*'! D&"F,,+)'&%"   +2**)'&$"H,-,+)'%#!#B/..-+)(%#  18000.-+(&#!EL3! "((***(('%%"! -%   ¿ƿ ! 0'CA22258:::::887750/*+(*N`K<<;<;:8744Trcfilnnnnllifeda^\YWTQKID@;750*&!/N8$  -H-"$%''((''%%$" $- Ĺ% ZF,%',34575554421/,+*'%$! -   (@:)'/1478:;;;;;:8:874521+*''% $I?Syjcehknoqooonnlkhfeb_\WUROJHC>:61/.1^P=542/./.'%  #%$$$$$"!! ½$, Y<&#+0678::::::::8754-,+('$ &=- #   ½ſ+&<1""%+/1244447<;;<;87542/.+(#!1=0*.Wi}mc`diikiiiiihfeda^[YTROLGEB;:PkZKCDDB?A;:441*(#! '   #/:C5-/167<:::::87754..,''$"EF8-)*'''(%$  !>1%$%+,.6558;:8778;8752-.+(%$"1G;0+'('%5Zyb\\_bdeeebba_\[YWQQNKFDDbn[RMLKKIKHC>>;65.,*' '* ¿¿ ) (W<3*.1478:::777541/.+('%(LL9211//12-)'%   !    06)$(0214><:88:87757<852/.+('(CE8/+,*((;641+*$"   * =;;42125775521//,*(%$"AJ80+,+**(+,'!!     733(#%'*455=>;87887545=<61/.+*'%1E:/*((HRE:7XhZY`\YY[[YWUTRQNKHGA?AVdRFGDDB?><>?971/*(%       )7*$%0=85777554421/,+*$-KH80//.,,'%%,+#   >4 !&''''->F:6457442118?70.,+(-BC60.,+*((D_iYKHLOa^XTUUTQONKIGDBJg^OJHHGEB?<;8;<71-+(#"   1 !=4)$+;:4422211.,6PN?;:8:8542/,**//'#!       4* #=D:42444441/.+*''3EN@:4552211HTF<9:8754;XQB>IQLFEBBVh]SNNLNKHHEDA>9:??73.,*$"!     ./8-")GVJ?;>?A??><;874219;4.,*$"!      ! #-6D90//222///..>G@63221.1><40FE=;652/,*'$!  ¿  $3#1.#$B;0/.../EA944271245IMF=<;<;:442/.)(#!!2.,,9LE:65442/,3MOB9:87542-+*'%"   !  ¿ɿľ     !3* #<8-***('%-7.**2>6-,++*'$!  !#    !    *!-.+(*+++.,+.II=:68?SOGCA?A?>;8541+,'#$6&$-&7;-)((''/B<4..,++3=60++*('*:1+'%$!(  ")  ¿    ,0.6)$%$$""15-)(%%$""2),( ($ * "*  (  1<$54.../2HPFA=>A???JTMFDBA?>;:711.)'! #  *;--?3****(%%+;7,)('%$"-'2+  "&     ¿    *(+ "-.'!!"&..& (  1+$2)   !  6  "&%/;5<771/.)'$ .13,''%%%%$!'5+" ('4-#  #    % #%''#*02(#"!!("  /3%0/'%"""!  &   %+ #89;OHEDEGHHGEEEBAKSKFDA??:852/,*$   9*0*$ !!)' #%5*$     $ )$ ' +)3*#!!!.( +/''1*$"!"!       0E+*>;6=NIDDDEGEEEJXPJHGEDA?<:74..)$" #) -  "#  -') "  &!$$ ,D/#2*#! 1(1/%!"1+$  &    1' (2+$$$%''*?C:8DJDDTRMKIIIHGEB?>;850.+(%  $  $  $& )$ 2( ¿ !   #)  <5( !"""! )54(%?;0-+++*(%$!*%,1 .$ "%  !>7*+++,..++**'*62=JQNC@AABA?><;652/,*'! * $         &( 0$ (!          *   ))/7*$",2/*,GJ=::::::7552/.)(#!%)C;,'%%$$3<3)$$$"!!   9J4(+,212442222/2<81/,,*'%(3*(<::44.,*'$"HMD93211.,,@K@55=>;8541/,+('! ,)-64122244222149:31/,*'%"%,&+,  )   (- "    ɽ   ' & (48QD:;<>AAFJHEDDBB?><:752/*((N\H;988=WYMGGEEB?IHC>>;:741+*'!  # >5***+675221/...12/)(''/+$        " 0# $ $, ľ  * %00"!$MUFAADBBDEDGIGEBA?>9857:3..?[P?=F^`SNNLLKIHGEHHE@><752/*&%  7 <@/-+,..3850/.,+*+35.)(%"!  #     "  / ,  ľ $%   $.0#"BZIDDDIHIIHHIKKIGEBBED>9852-,+@]H@XaXONOONLKHGGHHC>>;650.)'!  #2 8F5-//1247854221250...+(%"  þ  ! 2#  $ þž'!  $3/'PTGDEGLLLNORQQNLKIHHHE@?:874.**0YRKf_SNOQQQNLKKLGEDA>9750.)$   + 5, 5J93247::8877542241/.,'%$!  þ   )) %"  (  *54$!%EgWIIKPRRRRRRQONLKIHGE><:741.):`dmcUSUUWWTUURQNKIHEB=;83.,'# ',! $?# 4S<55577775421//,,*$"  "2  53!   # )&9D/*++01111/6egTMLNOOOONLKHGDA>;852/Mr^]_bbdbba_^[YXURQKIGA=;83.*&!  4+ '5D&!"""!!!+K9,)(((''$"! $'               ! " (%           !!(       #      "!                      !"                 & &                    "          &       %)0(  "/%   0& ".(  &:("/(   5    .               . "  !  & %% "!# # !(%(+  %&     !        #"#"&  39 ,#"3.( (@8) (8"+6)2,) "2@F.ѻ,2&(%3:3#<:9,6(,"(.(!"<<3&%&&&   !9= !(    "<.     "2#   0      & !   "   (     "  #    %&    " "    .("  #"#  ".,#(#  "  %".8+3# ))).E."8)&+( "9<.  "33  #)+#"<9.?3 "  !+ (<:(3)& )3/"&"#( +2!"# "!"& !"3% !5#  <6(  0:   )6(+&!.%(  6335.&# ! 0.3# !& " 53/   % !(.   (%     ,#(%  ! C "8   3 6 !<ݾ +3,) +%"+!5/! <.Ұ8" #") 5. .έ!8#&"!&!  92+ &ʶ3?. & "9( 3B&52   .",E,.(  (36".(5+ ).(!3(&   9?.& "%&  ). &"# 8/! "  " " %     !    ! # ")  !!/0+ !##8/( "0%(3 +( ؽ6&  "("<.޻,?"6 2. "CI. 6(!趶0?"(#"3(κ 0.  !?@%"/"?:!.+.3 .?J.(  != ÷&6 ((!λ!.+"22E(ѷ3+" /+Ļ/9@8& #  ,(.90!!)+( "A2);B6 (Top]OancQ?HZD0@\eNHg|y^@LmoA\w[%MG'ʺ Ĩ٭ŻI/齷1X`H#>b_Y^[TS`s}kC=Ymy}{oYZr}rS37UiruxtW-#79Ȫ᱋9R54RoxhF1:SZB,7Ocs}~{y{xmdejlokd[LA?DHHGKU`hnstplow}}wk`]bhpy}xj[PIA4"#$#ɿ $/7:;>CHJIGGILQ\ktwy|~~}{{|}~~|wsqssokiihgfeda^^bgjkhb\VPMJF>525<94.++/2453-$¿#(-17<@BCEGIKMNPU[bimopqsuvwwy{}~~|ywvsnkjkkjhfd`[UQOLIEB?<97532/,)&$"    !"$&(+,./0//.-,+++,./1345555543210/....-,,-/01110/-++*(%###"! !!   !"####"! !#$%&()*+,,+***+,,,,,,,,,,+**+,-,,,,+)((('%#####"!  (2 38+$,$#m! =5?6Y@:*f,#=,+KFXd$3 :.#j+Kp@D6<*G,d2'NU!+9]%,KTH  G :% $*/%!!3'6##' +$+'9C8C(1%#'F@ 6* Ͻ( # (  *$ۧԿ⼱ʫǮĿ$(( %+?.% !3+/ . #,$ ! %  (# 91'A2+F!<1PM(Kqe[R2FtB:V,8R$%Y9>C8>6(-Ԥ˒˹Ȣ峵2&c8"UxR?hKKV@h``qqttqq[[jjwkanfE^jGN[W3E.$ " ֬ #,.(3EHQWHANbqtpsz}}~~{uvveSWcbWTPFEIE8' º &12=H@58=;66BNOSdsx{~~{zzxttz~~}||{z{~~}||{tldZW]_UMNQMA5' ȹ¾!#"#(&(0,').16865;@?7113458?IOOQUWUOGEKSXZ]beeeb][\YW]gib\YXY]\VTX]`^XOIJOQRVYWTROMJC=>GOQOLHEC<1+0557<<973*"!"#''$!##"!"$##'%! " ƻ   #!"#! $*/38>9204871)! ǿ "%&(,157779=DJKKNRUXZ[[]`ehmqrrvz|}~~|yvrmijkjfa_^\YVOHFECAA?94352+%    $$)&$+-.('0229716729=;@>8>CCF@7>C@HNECHHECDG?@OHCRO?EMJFBIL<@SI>LH@8:7372/51*,)',*&)%%&         #2  '' %      ' $ # 6( ',6.+.,#Ar==:.#VN 2D?*QA5:/N*G %cgU(G=1XV(C3==3Q%C j /\*#!= H\D '$ !*]/F%2*9H#,'26,# Q . #  ٽ       ' **  #%!  *'//$.!'#%1'251 (NM=1@858.6<'+J6 b.5C*5#:2 6''/2 5! !  ֿͮĺԽDzöκ   6<.5D*@/!D625J*2(\8+DC*D:G=5=X5?_<.H9#U15N9GkHJV=!K#=23D ښ`( so"f W8G"4jUC7Ѐ'(.]K/F@n,bet#swЦ}8#>JXش &ƨ*uB( b *(^c7=ƻq0 H(%&"}4>L9=GL: 4Ïǐ0gC9BkGuO]]H'ɘ䀦駬o#LXc%CC:AA%1N˵AcB5CAly(*褖묆(B,G> <"EJz# O> oKeYDZ"aocJ*':<0'|b瀀<صOK@]/%݀aھz,NB!hѽ%ɿ@YxڂS*NK<ãϺg~jC.'C||h&"# +/! ''ѿ(*31⺻#5Cw3!@Z@b4=(]":Y+ *Y8&=9G0 磶<3Y^}Eq(!Ҁ>%L}P\zËB@5SW% N8n&9aFF'9Ǎ͟!C8}H~,# =/SQJ=!9X09%#A""*0KF(!&NG 4,e7=b~CLJְπ8a,B7*C!ҾֽQ5'fE0!ZUA!q49 YpTaU8\q:؝򕀤ڱB' ,>FSCxACLB74! H3KG7Kf/!*E'耨K0ϸ 9w+ B٩C4<3ޱ3F!<`H'a,#:,!3Ú˔ =K1aj9n,1g3Sڭ, +&7C8ͿG4TУ˚'@9 l <4߾BOy:ﰦɀ>wNL9FNg"%,ؐ%XyF NzE˶룸CBN<%='N֣Ь⚘^8+ .>5<(T T!Xȯϱٵ+,S  !ԀQ 8c70aTA}J"''8@4ںЀȞ" 9L^P!f#4]8ǽ/j17%"*:*ϴ碖Ь"H@B<UH,,,.ǿ7/ &ɵ˵F YW\111"oA'ݨڶ ֽ=gELBe@&F.ﲽ ˻̺CF`|t8]#* ̵9 +'N%h\o'ֿ ɣ%>,'KS/C0B:!%1*:릏•р 4Wc<#3 1C 1(YW.#𯋀  'o3 % .>Pݺ. W}l`8LH*(ҤϽ(#( . 8 :H%< B" "Q<'" ݝlj(&(8 F%0.%5+ ,4oc^+Kpn,(,և!Q &4/* # NBíCZQ0FC:% ԧԬ转3F` '/kL1Jɻ1:! #N<'@ ,>YBZ./:Y&ۭ̺ԛ QW8 S1%(Ѭ°C77 ,NXQپ/1P1#浸4%& C'#7ݻ ,X Ի1(8:   /  .C%C !PC 4. E<43W  ɺ*9(+!LW4 8 ɻ(.0(վԞ'.5@ '(*4+13Ľ 0 !   /+  'L< %%19""訿 &('%" 0   /+". :'  &.0L#      #1 !( !   '8 %1*5ݽ %( #  !#  %' &    5*1 +   *.!&('  53 '!"3  %   /7  #" %* !   *0*1 #  &(  '8/'                                                                   H6+J(* : H sFP_( ,,$RG;Pj,M'%$XtO_(;/ 0`:Tc0Pz(r[@g?Xg46o+_(_ Y_@ Z'" ? ?(J79 0 P7 o(oN[JD[@+( 3((  t+0xGHD/) =-)(  4'*? /45,/ ;0$@SDs+GG,G)7/'%     0&,B/*' " 7?%5/ / ($4 *@30 &3++@&Z 03  )"      !/$3Ѿ3K).+ ",*0,0!/2 %$     !! $  &#  , &! 3 6'(.++ *6  !*  -" /    1 :%H 6"% - $ ?$ -K## 7' 2 8+-!#% 8 <Q3   O( H1[ 31S]+B*C%+ 4U8)    0G+/<*κ 54/R, 3 - !)%*,9 #7(7%0.ۿ&)!) /.1W*8 '`)1/3$ ͺ"N+)W ' ( W' 0  #)/6,-4  7"1" ?$++ 0*9&%>?'2&. >A= # . .X1$55 ) Y" E #7#!! Xο1& % 4 OM') )6> ^D@* 2 V ;? ʷ@< ,  C.J"!0Q>8B7&6 .F`&.+; ^/G;!-.OUB7D =#+_DHUP; .- /-^ F(=DTB[L2&P7d V1 E LC+\÷; " 4 P=%,\I3&5"B27/G 8+c]<, 4*YbE59߉#=/+ c$+7'<.;0& . $?!#!eF+ *18 ,#4-(3 /V.S!$++++$ . $$A R/'F\*/c"D L R! *. J<6.*0C J1'5#X )%# -+ T%%  !"F9"G (*:M, 8 ; ' D  ! <' )="1 7$) `BX?9M-" 8F %0 ˽2 $ 2$*0 P "̼/ X3="JAZ' EB '6!F+. E  $)CH@ (_'0/!*/(!I0/ B]%0(93.??'+.M8*58c('X,7 /# *$B7"T 3-(!#:06.E !K #74-+ # P$-XM 6.3C# [6/  2+ 4%58,=C* E +- +.(.% 7@ + \>*,?A VZ51 4' C 03(c!0*;1, ] ,  0N3\ 4&/ Q&? 8)4Թ5$*;&.1 B HQ  ?* %#2-!%-5 U 2=>&:2"" %)2e#BNJ: *"6 (%5 ; (A/+޷S'  ,H*  F-%)"BK% 1B` (#J9 %-2# " ;2!+4 4)3- '#  4 * * 5-% ? &>'% '@" .4 I'R]K ,""\''>!,"  KV# $@)$ %  !#  I * V +,5)  +#2F!0*0K&$.%* ! ;*& ;  ' '92A K75 $!. !$2?#.+5. (@!"1' 0+" *7(   $!28-  08-'&*$ A    C  6 # /1/,$4' +41 2-!! "# ,8 ! G/ D1/$># (*(/+%4   "+%;4  $%,3- E =  ! 8*-:. #(  " !# #&K *)]#) 43 6I$&"5`; +#+ >  ?8'* 12! #  %'< 1  ) 4  %" ; %8$ '  ',&+' &  $E )*'$ 6   # %  % "3 0 $  / 5 8! ,2  8  U&! #F-+ 1+ 7 & "$(  # : ! C!.;R 0$7 &   &-(- *    , D)'  & "   ) ,!+ "#"  0  "  */ &" ? '%% ,/ 0  " "   "( %# )   )( !>(#"&   % > . ",  " % :   - ,+ ' +  *  &$('(      .!#%&   #/ "  & "  5 1     ( +  %  +'  .'   '  &&#     +  "        - $   $     %     $   (   *    (      !#     & &!  / ' '2      "              "    !       )           #            -   '                                                                                                                                                                         ಠ1HJG% NLѺF*fpx򟖕˨<&!fG5:8%Ϗk`(F=/++OsoecJ숉ɐ3>#+3!877:+>3*!+GX<=lSO8}=0H<־>pƱLľ(w:lgSZɀ!= ﴤ%=3 (/ ڀ  ؀Bf\ulk0eAUGqu e`Jwj&a|(ԾgB˚Z+X\>f&3BZxj>F#\ŸYGN`` CÖԀß /π*B!Yɔ>Q ˝(Q%7lxu/5>!`,|<5%jkN`A +0Gگ5/ B ЫիìТظݍЉͯ€௠Ľ潟&0 7 5/`*&1>0/ T Z<^Jf+7AQ>L1QSO7Zuq%# 7=!3TQ`0=!OA *`S5Lf/<:!AN!a5&QQS`fjUA%3Yew=1LGaH,,JB*H/G<0(#/`G!+7XO1#5QS#,8\T=oa`GB3N8(>0(/0*B,5<,%*3H&1+505!%ڭڸȽоľԹ车ȧ۱įߨຟͽͿĺвIJϸȯϱ !# *  31!#  #%%<:&%/,!1FC*TA%A#NQ+FJN\^F1,5573!<:110!1 57!(%&%(7+5B0/A(,*(< 7, *%#7,8,=7/& (!+!%*(  & &0*70*+& %<˭ݿ߸±¸ĽĸѿĽº͹ڿϽɾϿտѽѺݿ      !# !                                *49<>>>>==<;9740-)%!  ,;CEFGGGGFEDCBBA@?><:864310.-+)'%#! &6>AGKKFBB@6$  &'()-5CMMB2)/9AFHE7,AKRTL@741--0694+$#%*/0-.5;:. .ZeaWNNRVVQIFJMIA;8789<@DFD?:6/$!Ⱦ,5/! ̹65,)-1125;7 2GONGA@@9' $5862+# $&""")23343/*('$!%(.:IKD=:5/(#$($%)($""%/=FE0 &$!!   Ӿ"%AE>3)$&.683+#!,5@FC<5253*'&&)0A@?>5&&"  "!źƿǿ2;9:6$20)&(,/22.,//+(%!!$+497349>*ʽ  )>JMKGFGGHIJLPTTQONNLIHHF?5./4773.'##%)..( !! !!#)020+*/44.)(*'˺ +252($+,+(! 4>>;9:93)"/BHA:86213541.-.011148::9::61...)"&%     !ܽĻ  .467888:=@@@BDCBDHJG=401454/'! #(,.,$!#"!  $$" ȺȽ$CLNONMNOLE9-%/=:1+-39<7'  !( Ż@TUQPPPPPOPQRSUWXUQNNNH?87;>>;4,(*/4884+%&)*)***+/6;<98;AB>73453/(  (/34- %&"  ! "(.221259989:5-&$%" "&)+++,+(%&)*($#$&'(((*+-/120*&%$    ĸŷ  ´ ".1358:=?ADHJIEA@@=7-''*,*% %))#$'ʹȿ#8CE?&-.* +OXUSSTUUTSTWY\^_]YVTSQJC@BDDA;4137;>@>70/13333335;:<@CFHIFB>==91)')+*($ "%),.*"ƺ# 5:3 2SZWTTUVURPQUZ\^`_[VSTTOGBACCA=9547;@BB=5136766657=FLLIGJNNHA>>>:6311/*# $-8>;- (01, %)*()-.' '*,....-*),/.+((*,+)&&*.1111.)&&'$  %(%"#(*& ˲%%   ξ0<>=9424:?BDFD?:9981)&')('$ !%)+) ýȸ' 2;60-031% EYYUTUUSPMPTY[\^^ZTQRTQIB>>??>;7469=@B>7126765668=FMNKHINPKD?>>;62/-,,**-1464&'052("$#! %(((*)$ %),.//0/-+,/0.+++,*'%&(+-/11/)&&(("  '+)%&+0/("  ɷ$%   %0661)$$)18;?A@;65661)#!"#$"!%'$ͽƸ5??96;ELLD;3' DYYUSQPNMLNQUWYZZWSPQRQJ@:9@?;64563+! $&%! %)+( ŵ̿¿)CKPSRPOQOG9-87-$BTWTOLJKKKJLPSTTTTRONOOI>66:>>;50.16;>>:2.0344578;@HMMIGJNOH@;;;73/.//-'µ" %-4897- " $((&&(%  !*-/000/,+.23/*%#"#"!"&)++,--*())%$%" ")02/,-24/'  ͽ!$$    $$$%-8<;::976674+"!&**& #'++%˻¾ƺ :NUXXVRQQOB! 7AA>941-$ (@RVQJGFHIIHHLNOPQSROMLKF=658<=;60-/37;=:3--1345799=EKMJGIMNIA;:9840.-)!ɻ '/*" &.4782%  %&%#%'% ! '+-../.-+,00+$ ""!!$'))+--+))+( "')'# &-20,,030)"ľó !$! ѯ &(,145679<=<9653.(%%(**&!"&*,'ŹýͿÿ'MVWYZYURM@*(-$94&#.;@@>:533)7FOQLGDEGIHGFHJKMQTSPLIGE@967:;950++.27;;5-,0356888:AIMLHHKNKD<9:962,$$11*!!*1671"  "$$#%)*(# $'*,,--,**,,& !##! !#%'+.012320,'"!$&%""+11.,.21+$ żɸ  %#    帪,3310247:>?>:7653-&$&))&  %*+˽8QXY[\[VPB2)! =C8)"'1898620, (;DLQOJHIJJJIGGJNRUXWSMFA=81*)+,+(#!&+/0,%"%*-../028@FHECEHHC<:<87885/*)'γ˻   &./,&$''"     ²½˼ 4IOQSUTOHEDFC5   CJOPTZ\U@2DOUTQOOONLD:7;AEHIA7-()--'"" !&*,,**.489:;;=CKSWTOOTXVPJGB4;A><92+*.49;93($*-..,$ %+./-' !##!  &-2321/-/466321000..04>FIG?5.-/0+"     (-+&" ໥ò   $(-.-)ŷ"-,**($ #',-)" #"   乯ʼĽķ"9CFHMPKB91%  D_^XRH?>DIIFD>*2ITYZWSPNJHECDHIDBEHF=4/.-' &1651,.8ADB=5-*,/02567;DNSROPTWTK:()'+3:::>BCBB@:1-/00134469:72/11.(# $+120,/5:::;;71*%"$'()*+-0342/01/,***%)02/(    %,,& ȷ#/686/%#%#!"&+/0*ž"67,($#)-..*$  Ŭξ½Ȼǿ%BNMG@9& .[lokcVKDEJKF8*HZabca]ZZZXQF?;;?CHNNE:532,#%+-)$"&+/242*&'+.01359@JUXUQRTP<" "*2:BEB<<::;82.*(&'((*/479850/10-*()*(!,2561&   򹧪ȷ  *286-"#)+***+,,& ,0.*('&&"#')*'   淧ǹ˸ľ'CNLB5&¹1HYfmlf\PHGF: Fdljigd_\]]]\XSNIEEIRXYRF<:84-**-.,'" "'-241)"$*01347:@HPUTPNN?AJD5' "',.08@@;9?GKLHA4(%*14566557751/00-($! $.69767:;:::840,)''(+.2567775431-)((('% !(,/131* ""! !ū  "-44+ %&%#!ļ¿ %042-)&%&&%  ײĿ¿/9;94.ſǿ!FNQ\hqtsk^R>  7aoplkkid^[[\][XUQLGHQ\`\PB:84-((,.+'" !%*.22-))/45678:>ELOMLD&>LLF:+"!%*+,/4755:CLRTN=+#&/676433455420-*'# %,25668::98:;83/,*)*,046678865673-('''$%)+-13.%  $''# Ȼ)+   ,790"&('$ #13464/)$   ũķĹ#8<:2ż&OZ\^biptwvmV  5`psqmjknle_[[\\YUSQONQUVRJA=:6-'&(+*($ $*-032.+-2456789>FNQD9>?CFB4'!$)++,020-/;HPUUL9*'-4776422343210,(&$#$(.2568;<:78<<72/-,-.037899:755883,&$$"$+---+'   #*02*ž $**#  #,254+!$'&(4568:5! ۴ɿĿ #*'IW`dbagpv{{rC   6\nssqmjknoke`\ZYXTOLMPPLE<657:92("#'**'#!#(+.241--021259>CIL= 7?ADILH;,##(,-,/33/-2=JTVPB4-/5897532320--130)# !%+15667:;::=><830./1247:<=;7337972,'%$!%+-,'!  !%+1- ż!$&(&  %/7<<4(" ¸*153)!   ҵǹ'ALX`b``enw{tV%   ;74211148;===<855662/,*'! &'$!   "'$!$''" !)2:?A<1$ÿ!%&&"  Ų´%($&0@;/Ļ    Դ!3-  &N[ZRF=;@FIIJI=!  #>OW\cghfb^\]_`]TE85:@DED=.!!+5@IJC<72,+142.*'&%!!%$!#)/464.+-14449::;>CHLLF8*"#)./1474006@INOI>3,,0331+$ !"#$#  #'*,,/2346;>=8400123467885-%"" "'$!#   ¯ $&&"  "))##+4;=;0¼!  ٵ¾-EG>. #(#  %HRWZXND?@BED@9- -KX_bbbeikjgdb``ZJ92220,# $+* !49:953/)" "'+/1/++.1-377888:>DIKH>3.14779<@?:881*%#$&$!$&%" "'-3884124)#?B?=;:9:>DIMLF9/+,1337<>:68=BGIID:0+($",0,'%%'((%" &,../2446:>?=;;;97542/+*+*&" !"!$%""%&&!   ҳ $'$#',1 !%)(#"#" » þĿ /9=BC8469999:=BFHD<2,-38:>=;70,-000.*&$%&#%++)'# ữ   !!(,&ƾ "$%')+*'%#!   պĿ22ÿ5?<511,9RXY[[\ZRHAAC@- 6QXXWVWY[\^adfeb`^YG  9KKHD;.$"%('# !"#%),/3774. 2A>9422368;=AEGE=3+*-369=AA<88=BGJIA6'  !'*.10,+,-+&#*./0246:?CCA><<<90,.2443/)$#$" (,-,)$  侯ÿ   "  !(+#ظ %()))('#    ٻþ3=?65NTTTQQRVZ]]]aeeb^[U@#EMLKG?3'   #(-26774, 0@DB=9741012698;@EHID:) "%&'*--+)&!$(+0468:?B@<88883/034432.&!$&(*)$  dz !$! "$պ #&(())'#ƻ ϯ!5<@CA9(ӹ)/-02-(" /KSW[agbPB:71# 4LOQTTPMNQUY[\^`cdb^O':HKLKF?7.$ ! %,38;:73-%,>A>@DC>950-,.159>@?7,$#(.259>>968=BFHF=0  !!! !%'%"!%+26777:;;:8750.047751&  "$&&#  "#û !" ˾! #$'*+*&żü  רĿ0?DD>/ շ¿/30! 3KTX]eh]K>523, 7ONKLPTUPNORVYZ\_bcc`S2 6BGJKIC=94,"!"! "(07=@?9653.' "8JPI>76;><851,)()-38;<5*!!(-049;9448?DED>4(   "#%(+-036887752,)+056/  !"$#   !&$ !"  !   ºý !$#!$(**'  ണ3@D@0Ⱥ#13+"FQUZbhdR9.055",RTNIHJOTTQOPSWZ\_bca_\M) >FDABFGE@;71$!####%+4=DEB=:9:;:95.&&1?HKMONH>51365210-)&%'*/584*%).4862039@DC=4*   #'+.3541111,&',.(       $%       !$$#!$()$ IJ3@@1ؽ (* =OTY`geUB3035/CTSNIEDFJLNNNPSWZ]aca^YJ;FHFC@?AB=:72( $&&&(+18AHIFCA?>>>?@BIQTSPLKKHA70.01.,,./.,)),155.#"&*/574138=BDB;0!    "%'*/4530/0.)())!   "!""     ¹   !$%'(% !%))ľì.B@4'*00' !KZ^cf`VKB:686(=IIHE@>=?CHLNPRUWZ]^\ZR" 7GIHGFA<9;??;4,& "%'(*/49@EIHHJKJFCBBEPX[XRLIIHC:3/,)&#%*0344411352) #(+,.35558>CEEA7# ##   !#&&(+/24443/)')*  ""%()'!  !%'& ҿ  #'**'!"'*0@:5.!!-22) <]fhf^WNFC@:5*4@>;8667:=BGKPUZZVSQQN& 2EJIGFB=9AB>5+$"$""%).114:BINPND4!!&%"   $)+,./12222-&!  &*++' %'&$!!%(($ #&*+'   #(*(#ӻ½%/21) ƾ¿"-22.=X]ZZZUKC@AC?5$4951/28?FILPVXXY[ZH,DJKGCCGLOTZZVVX\\TB.%'+*(()($ #*28?FKLF6("$(+/235;BINRQMC6*%&&$"   !%(,021/.//+!  ",561+"!&'&$""#'(& %*-+# ſ   #%& ׽ .55/%ɿ 154+3ORUZ\YQGBBDFE=,4961//28>CHKNPPSW[X= 5AB@>=:5/+.5;>><;=@ACHLMJGEGMW\]][ZZZQ7$--(&'&# $+7AINMD4# %*0469=@DIMPNF;1*'&$!  !#&)-27975333-"%"$,6>A:0&##""$%&'''  "+24/  ˾  %'))(# ϼĿ #175,# ƾ26. ')#:HKOUZ[TKDCFIJHB.5851..17>CB@ADHMSY^V+5CB?===:2%"+5<>?@ADGIJKKKJKNRUUVWX[\YO;#&.0/,)$ !#)3@INK;%$(-269<>AEHJJF;0*)*(%!  !"$%(-4;@@=:74&"(*%! !$)1:CIKB1% "%'('!  &.58+ Ʒ !&)++&#"!˿ľ ! !.21,% ;FE?;:80# 8GJMQUXUMEACGJKIC.(551..16;;9:=AFJMQWXE;DA=:9;;5) !+6<>@CGKNPQNIINW[XTQOPRTUPB'+42-(%! !!$)2?HH?-!%)-259=>@DGHE=3+(('&$  "%&&(.59:869<1 Ŀ!&)'##%)-2:DIIGF>1(#"  Ϳ  $,460! ׺ "&'$#%%$ӿ½ %)& (153,$ #:GKKHDBDGE85HLNQVXVPHCCEILNMH4 +/./13674469>ELRUUVL":CB>;9996-$"%-7=@BGLQSUUROTX[ZWSNE<:==3 .84.)%!!$'*-27<>;2& #&*/2689=BFHG@5+'&'%#!  #&('%%+04:??0  &)%"#&,29BHIGEEEA90%    &,252%"#  ! ԭ!$!!%()%˿!%*+½#0353-$ Ͽ"7DHJJKLMLKJ<(BIMQVZ[UKCADHLNQOJ;-0-*+042246:@JSWYYN! 8@@=;98872(#%)1:=@DIPTWXZ_a^[YWSD'   "/31-($!%+28>BB>6.($%&(*.13569?DHIC7*#!"##   !%&" #(.6=@A9¾ (+(&(/7@GMMIEBCB?92"'-254, %% $ڰ #')*&Ž  !%+/"½$.3772) ˺,9?DILMLJLPUS4 :AELTY[YQIDCGKMQTTL< #--+++)-489?IQUX[T$  7>=;988874,##(-6=?@CIPW]fgdbbb]M*  (11.*$%)/6=CGF>3+&$')+-./259=CFGB8+  %,37;<=;#!,/--18@HMPMHC@@=:5" "-461$!%$ ϱ "%'))% Ծ !%&$!)/!Ǿ )/5::3("%#ǹ .>A@AFKNOOPRUR//9?ELU[ZTKFEHLMPSWWQ>03/)$',26;97655651*%%)-5=@BELU_figda^V=)340,)%" "$'+/4:@CCA<5,&&)+,.4:<<=?AB>6,!  %/57:=??2)11016BA@@?@@>80("  (2;@A@?>8'"" $,110136799861*   "  о ٺ ¿ !,9EMQTVXYYXTI=62.+'   "3DOVYYXVUTSQQRTUUUTRPMMORUUTQOMMOQQPMJE@==@BBAA@@AA@@@@AAAAABCDED?5.)&'),3897654443-&" "&()))))('''&%$"##$""$%%%%$"   "! """"##$$%%$" !#$$$$##!    ½ #',28>CGF>1,,,,,+*'%&((''&#   )3;@CEFFGJLMJE?<;?FKMLJHFEGHIHGEB=:89:;;;<=<<;<<=====>>@AB>5/+)*+.16:;9877764.'# !""!!&+-..-,+++,,,+*'"  !""! !        $&$ %'()**(%"   #&'''()*+,,+*(%$$%&(++****++,-..//0233/($#$&),05:<=<<<>>;6/)&%%&''%##%+02210.../111/+%              "!       "(**+,-,+'""')))(''(*,,+("                      ###                                                                                           ƲĽ(#      ;\_\ZXUVX\]VKEFJB;71..153' !$& &! '+" %*//$ݫ&))+/-$  )9<61//23$'@LJ>*#%" ʲ"&       8X\`b^\YY\]YOGGKLD;5005;CNZZTRY^[YZZXW\cbS2   '1. 9URC53=IQSQJ;019>=:3) Ժ¹  "'(#  ##$,00*&2;AA:448:4# >UPC=AC<+¿ %+# #*'"#,59:8-  Ť¾$$#)2448=@><=??90,-021'#" !"$$"#*373,#)..+" د 6<6*&'))'(+,# !).486))NYZYWX[^_]\]_]WQNPSUTND95:FNPMGB?:8777657=AA=;>CD8 #94--1466/#&('! %,#$&'()+./.,,--,****)&$&,2663/,++-5=<3*# "$&'),-+%    "!޹¼"(-01235788889850-.121.)$ (.0.)&""#" "##   ȿƿ)-,*))('''&&&" .IVYZZZZZ[\[YVUUVVTSTXZZXVSPMJF?96543233431/.+& 289889:84.($###!!%(&/6655332221000/.,++,02221115:<;60)# #%%# ʺ !.58899::::::97667887653336:<<962,%! $'('%"  #'))(((((('&%#"   ,;EKNPQRSRQQPPPPQRTWXXXURMG?70*%""+16897531/-+)&$" !#$&&&%%%&&%  (,./000/../00112210000231.*%   !"""  Ŀ#.59;<<=>>>>;98789::::;<=?@@>;5/*&#   "%%" !!!!! ¾   "$#"""  '.368:;;;:987532357888641,)'&%#    #*5=?@??>>>>=:866554210/-*&! ü$(**(%  """!!"(--(&%%$"  ù &*-.,& &))))(&$#"   !"  '-/1332/)%)-+)(&$#! &(()+-.-+*&! ͼ       #,00,% "&+./137:7-%     #!)8>>>?@ACDDA=968:840../11.*$    "      %/69=??><:950.-*'$    !"(6>BC@<8669;<<;;<<;::6433220-*('&#!   ! !$&''%#!! !"" #&()))'%###%()'  %(*/;ABA??@@ABA?=>@BDB=6369;<<;752, Ļ "$%%&')) "$$"! #&'&$ $.,$$%#  !!"$$#  )/1100136883,)'&'()('((%!  "$%##%&%      !!  !$%$  #(-//01358:;:965555431//.-,-/000.(  !%%$#! !$'(&!      !$&'&#            &.210//01468;>?=8312578865545555642-)&$"!                "! !"#""#&('%   !)+'""*032/,*+-/0.,'"                    !%%    %,,($$'++)&!                    *,(%%&'(($                ##""""!                                                                                                       %+,)%#&))(()+-021*#*0/*$ɽ*.04=FHD:1( 0DLS\ce]QIF?+ Ź)*,/37;@HLG@=><6*¸'.20'"(-/.,*)(%ֶɻ&59;954531.*'&%" "!'.27=: 0015><-  ޾!*-+$ſ#%%%&(*.27;AFGEBAACEEA;51/..121-%%/212453.+)(&#  %*,,)$""(26788/ú,540/1465/($"ϿĻBX[ZZ_ejjgec`[YYWRD3,18867;98;AFF@9:FNPOG #"$% ")16652/("$" $;CFFC:, $7GQWZ_fgd_XRNLJGEBA@><:::962/-,++.48:;=@DFB-  յ&CIMV]``_^]]^`a_^a_VOJB;6213BA;58BLQPJB92/05;8+.+&$$#!!&-0.)%%(*-//,'&ESWSI9! *NYUMEABFHFB?>=:769<:2! Ŀƿľ$+/341*%&+00.) ;@,ͻ ./.+).8EPUTPPV\_`_ZOJE=6322243/+& $*29:5.(%$%(+-+##$"  ü-469;;9863.+.0.*$054.$.78;@C@:774+$! O`hic\[^`^][ZXQF><>@BDEDA<7433223)%AFCCGP[a^XWZ]`bb_ZJ% 9GHD@==@@?;843321/.+&!"#&),+% *+  -3468;<<;:889::5' ž 9JE;4236764/*$"#$7NOIB??ADEDA=:98763*$%*.,'$$$%#"! ö+661.1:EJGBADFHJLMI:)/0/,)&$$#   ï%+,)"ſÿ¾7PVTNGB?;768<90&*8:.$--5GWbghea]YUSRQRSRG=99:::877750-+*(&3EKMNPRTYaebZWZ_dd]@  7ED?9520./00/-++,)"  û ! &39<=>><:85-9GGB<;?DD;* $,,(""*8FMMMOTXXVUUVURNHC>:62/...-*'%#"  ! !"%')**)$ !&0;DFDA@CHLI,#"  ĭ %$ $%&')))'# ̼Ŀ¿)6750*(+/,$'$!&2;>?DNY`ba`ab`\XVTSSRPNMLID>;9740-+)(''&&'(*,,+-../0.(%&*3?KRRNKMRTF-;93-(%" Ŷ &394*#%+/012442-&0?@>:40044%¿'/+ "+-(! :T`cb^ZVUUTROMKJHD@<;:740-+(&%$! !"#"#&()*)# #)2=FIGA4,-,+(%!  ʶ (054.'##%&'()*)&$"! %,.,( ÿ!"  6R[ZVSRSTTSRPOLHB=;9630.+)(((&&')+,+,.,&! !#&,5>DD74=96453/*%"   Ѿ )5>DGFDA><:75566520..,("  && !     2FPUVVVUTSQNKIFDB@?><:987520-,,--./+%!"#%&()-28;8$ +64100/,*(&%%$#"!Ż -6;<<:99889:;;:85320-'   þ .=FKNMLKJHEB?=;97644320.,,+,,-./.)$"!!!!"#%()&2::8652/,(&%$#"!  ź *39<==>>>?@@@@>=;9752/+(&$"!!  ÿ   !5ENSUTRONMKJHGFEECBBA@>;9753577640+))*+++++("-9<:87654333320.-,+(#%,0356788:;<===<;9631/-+)&#!   -;DIKKIGEDCBA?=;976666543222442/+('&%#!  %5;;975420..-,+*)('&"ǿ!'+-/12456788765320/-+)'%#"""#""!   #0:AEHJKKKJJJKJIGFEDCB@>>>>=<:8630.--,+*)&"%29;:::<==<;98766542.)$"   !""$%%$ '06:<===<:740,(#   ӽ)FUZ\^_`_^[XSPOONMJFB=:742000.+(%%%%&'''%# ƹ ')*+*'""$ 2ACA><;:851.*'&&(+/368:;:2,9@CDCDDDB@=94/*$   0Nfrvwvuspnkihea\WSPOOOONLJFA=9642.*&%%%$" ):50+'#  Ӽ'57899:;<<<:658:<<<=?BDD@1$32.($  #'*-./.' ,;:8779;>BFGGHKMOQSRPMJF8ƿ   !(/46540A>96446:?CGKOSW[^`bb_XQK=  "%'*--,,-...)  "!2:<<<=>@ACGJMOPKFFHKLJ?%)'$#""#$%&(())**%"$$$$$$&" "$&&),/-,/.------.02469;>@B@:;>@@@><:851&   Ż   0420.-++++,/36778997322221* "$&% ¿ '/59<<34DEB;2,,-13447;>A>(+9@DFD?8)!#')(&'&BJA9532356668&6:976542100/.-+('),05;@CGGA<<==;0&&""&+..-,(! #&(*+,,*+485/+)&%"#)/6:<<;;;<:50,(!   #,122.½    !   #$$&''!׿-45430(¿   -.%  %4::889;@EKQVVK&  =JJHEDCCDDDEFHJMQRGAABBAACB<))5;>ADGIIIHE@=82-)#!"$&&'()*+,-.033/+'&(-/.+'$!"%&(*,-+('(*-15;BGJLMMMLJD:0&"(/1/,($   !"$%'*,-,*%    #'(&$! ƴ  ͼ!""$%(,02222,"־(2664-%Ż¿+49:4% )39<>=8%.Y_SKJIIKNQRRPNLJD@>;;<<<<==65CEDB@?CHMOQRSRPLB72.($$'*,-..-,+*)'%"!!"&)''*131/-*(&$!  !"$&()($"#   !"$'*-/0.,-/0/-,.26642/+&! #%# #(**&! "%(,0/%ÿü $(+)'*,' (450----*#ɿ.7;<:4'  !#&(*-./, -BDB@>>>?@BDDA>?BEHFA=;@BDA:66676+ ,HQOLIE@<<@EHHC;5334442.*(,4:=>?ADGHGEB@=;:742/,*'!  "*/12440%   "#$%'*/121.+(&#  !"""! "+/0/-+)'# ½ .6996/!  $++*)(('%$# CMKGDCBCDEFHIJLLNPRSRLFCC=+ 6><:8775/),1332232222237;87789989?CCA?<:7531/,*($  (/24442, #! !"%')*,--,*(%#  %.3431/-+)%Ӿ&%" !#&))##,35430*!    )FX^__^[VOLJJIIIIJJJHE@720///012110134445665321,&#   )01/../00///014:<:0 þ$)+/5:=:4Ƚ!3769ALQND9& ɻ+16LSND==CINMB0ʾ,552/+'!#0>D=#,#̸˺E]aZPJKMKC3'&+*$ !%+4;<83.177/!ĸ>X[SIGG<1.2420*ŷ# ")#û*;:2+-9FJD946;=BILIA5.1786541.06=A?:4/,)),187.'(-56Ⱦý#'')052$ ˻(01,%"$&Ľ"8AIT[ZTLE@AGMQRTRLC837>@<50132//3;CLPMC) %.3569, !%$Ƹ'>GIIMRVY\^[UNHB932/(&-30& !+7DLKD;9AJQW]]T, #$'))+3<>84:BEFHHF@5Ƚ !'-+½):LYU3  $1:91)#"(2<7442,*,,개KRPV]\QFCDGFA<7339=<;=<:;BLTVTPI>7:6"BCED9,AIMG8/17=ENQCĝ  ɻ'463-$$7FMKA54=FMOPSWWTQNLMTY> +=;:@KRSQMG>:>EGB=?EFB@DD)ƹ+79:<7 )*-3;?BBA=CIKMOPRTUTSUWUP9#(,3&%567:@B=75;BB>=@EJLLGDCDHOQKA:891ÿ =IJB<@JQTUUSOLIIF?:>L^gg_N@AHMTY[VC*1.-5BQ]dd`clw}yiP"ļ  %-../1359-(-18=?ACB@@FKLHB>?BEGIGEGMQTRI@611.ɶѼ *048*7;51/05>AGMNNOQPNMNQSUULA>BKSVUJ057=@@@==6/.2688645:<89=;2ȼϿ߻-32146þDNJDBEMQRUY\[WTSTSQSW^ce[LCDJQUUOD7.()?A>>CNNE><@EKQVXUQNPT[`U, м!*ĺ):>ACDGIIGGJONG<68>CFFC>=;9=CC;) :D1̻ƻͺ!*.121>XPFDJPNLNQQQT^ghbXUX`e_SJFGJLNQND;888533227?FF@99=FID?BKSVURPORY`g]4ջ #ྺ 23258:<>@A@?>;6215;AED8,-39?DC9! $ Ⱦû¯(3::4,6B;79>EKSY[[[^chid\Z]\SKD>=?CGIG>4049865666;BFC<9>?ABB@@AB>60/4;BB9568<@CC=0 Ϻǿð&067774:C@=<=?CJV`b`aefb[Y\`\WRLFDEGIJH@746851/..4@KLF>;?JQMFELTVRNLMPRJ"  ¬   ѵÿ%02589:=ABA@A@;405>FE;2+(,3;:>JQKBAHS[]YTRTT8   dz  컷+/1479;>@@@BGHC:7:BBBA;3015:==6( ĵ "(*--)&ս1><@LX^bfihdbehdXOLJJLJC<8:>AEHE?97630257:>CC>76AMLC::CNQMGBB8  ǵ¾11257:?CC?:;><749>;JMPUZ][XVY[VH@@DIJF?;;=@CGGB94699632105;>;53:@@;79BLOJ9 &$   к#1479;>BDDBA@>3(&*0453/,-159;92) #,.+)*-025:=<3½Ľ  !Ȼ4GNRUWWVVTNIEBCDEDB>:768:<=:63232/....02430/4;><869>A>4! -6,! 翴7<=>BEFECA<4-)&(+.//-+*,159:6-$ ##$&*.258:<>;*μ .@JPSTRNHEECBAABBA?=::;;<<<:731/-,,+**+,-,-28<<:9:;:84.& (75-%! ų 28:<>?@?91.+*)*+,,*((*,,.0.*$ "&(*,/368:;:6-½ /BKNJEBAA@?=;:98654334689875310/.-*('((*,17;<;:988874/(  /:;6/*&#!  .7;<<<91--,,,,,-..,*))**)'$  "$&(*-0356752," 3?DEEDCA@?>=;975321234555543210/..-,,,,,.25665542/-*'$! +2420.-,*'#   ø,4884-**+,,,,+)''''(('&#   !$&()+,./1220-*% (/368898766543222333322333220/.,,+,,-/024566531.+(%"  %)++*)'&$"   ¹ (./,('((('%#"    !"$%')+,-----,*($     ").24445675/#5@DDA=:<@@=98;;6+#'18<<70,/563* ,66+#** ؾ;F=BMG;43224:BD?5.+,14. 4C@6.)».IQNB. (6AEB9115860&+*&'&+>B?6.$ ¾ſ1GMMHB>@DD?)*?C=3*"2??<98630) (9<87BC<1&"!%AIB/+0+$!"%*.0+  )--+& ۻ '/*""*6AJF163.++,.01/*+17:;<>6"%,/*&()¾5=BD@:641+%"!4HPJ@6%ɾ AXTF=;;=>;3-,+-16FLKE;( $&,7BEB;/# %&-:CGB4&#-;CFGH<˽#$#!"&#Žÿ $/=KOI;+#$($"('(*++,29;4*+54# .89885+"!(/597&  $%!#',00/.+'" $'%$/79877768;<87;=;99:<>?C@!&:90#"((()(# &*)"鳜  )45542,%!%,26972-+.0,%!"%'(()),28=AA;54:<4,,01/0-¿/?B=0ʸ #-45+487663027=BFIIC80021*#"%()(&$)4>DIJF>:;:3+('&$":GH=)ɽ½!)4;:-287664115;AFJNK@4243,%"$(++*&#%*07>@<764/+(&$$EOOF5¿%/64) ,2/-+(#!$*048<<931351*%'+..-)&(/:DJKF>7200/.*;NSN>#  %-34+)20-,*'%%*/48=?=73365/)(,/0/,((-7BJMIA6-,00.)0KUSF)"$).0+$0.,**(&&).27<@@;64551+),011.*),6AJONE9,+130& !BSWM1 " $),)0.,++)(')-159>@>95441+().11/,)+3>GNNH:+)030" 0ITP5 !"  #'% --*)))''(,026;>?<7542,'',/0.,)*1:DKNJ=,'-1.9LN7   "!! *+('''&%&)-048=>>;752-(&).00.+,19AINL@0'*/* ;F2 $$  ""! %,)'''&%%(,/16:=>=;74/)&(-01/--17?FKLC4)'+% 4) (4 """!  +)'&'&%$'+-038;==>;71*%&+/11/-17=CHJE9+%%(<6 ""!!  (+'%&&%$%),.159;<>?<5,&%)/221005;@EHF=/$$?B2#$!!!  +'%$%%$$&+-/269;=@A<1($(.3553139>BEF@3% >H?) !+,)# +*%#$$$#%)-.047:BEB8,'-6:;9525:>ADC:)EID:0.4;>=9537;?CE@.8OOD2$ '.0.+&  02+%####$(,013556:BII@5039>?<7459>CEB14PRI8' $+0/,("  *50)$####&+0245557?GKF;328=@>:658=BFD4/PUN?,!!)./-)$  44.(%###%*/2466559DJIA737<@@<857A@<879>CE3GTVQC0"")-.,*% ɽ3741+'$#%*/3699747AJJC<89=AB?:89=BC2CRVTI8'"'-/-+'" ˼/8640+&$%).259;965=GKF>9:=@BA=99=A@*>PTUN?-$&,/.+($  ̼(87530*%$'-148;;858DKHA;:@A@<:;=6 5JQTSJ:+%)/0-*&" !Ͼ696542-(&)/369<;86;EKG@;<>@A@=;;;0 1GPSTN@0'(.1/+'# ! Ͽ2:75541,()-258<<:79AIIB=<>@@@=;:8&.CMRTQE5)(-11-)$ !!+;86554/+),048;=<87>GID>;94,@KPSRJ;,',12/*%  "  ;:65552-+,/36:==:8AA@=;8/*ACA>;8*+9DLQSPE5))/43/*$ !5=855553/-/357;==;;@FHD>=@DD@<8&-7@HORRJ;,'-352-' ³/>9545541./2579<=;;>EHE?9%!06=743443101479;<<:;AGHC=<@EFD=+&887=ELPQJ:,(-352.)!ʹ<@953444311369<=<::?FIE>=:9DHIE70HG@@FLNNI=, ',+(#ù+83,**,,*()+/268:867>EE=636=BC;&84++2;AEF?/#,.,'! ƺ/A<754551,*)**-2761/5@EA;2MWWRJEEGFB;5,""*03/'Ŀ '+&""%())))*,6AFFA@FKJD@@>851$ &;FHD<64431352($)+-3:7,úAJGC@=<>BDEDDDHMPNEAEEA=<@EFD9   ):DFC=7569=?;.$'-11/*!Ⱥ 0676532227>DFCBDDB@?=;::::7.1BJIB:2*%"!$-3664112369;>=81+('$4<>=<<<=?A@>>@CDB@?:.#!$&&"".330+&&-67557777862.,*'#  ý&3;@DFD@@ABDEEB:431-*(('# $+/25663*!#-59998789;;82,& $/35:?BCB@;3/0231.*&#! '-010*# !%+2;@BCFJMMJEA?;60*'$ (17;==<::;<<;85.%  $&(($ #&+049>ADFHGD@<830/.*# ",267656789:93'  !#%'(&$"  #(/56779=AEFD@<72.--,'"%&%$$%&'''&$ "$" ""#%*15544456:>AA?<731220*$  "$%%$   "!!!"%*36654433358:;;9533541+%  !#$$"  "#&-7::9888789::998511453/+&"    !$,5998777667875420,,05641.+'%"    !%,6:9866776787532/+(+1431.+($!       (156533455566520-)%%*./-,*)'$!      %-24321234457641.)%$',..,*)'$!     %,13320012345530,'"!"&)*'$!   #(+,+**+,-/122/+%"%'&"    $())('()*+.00.+$"#"   !###""#$%'*++("      #$#"""#$&)++)$     !! !$&''#  $-2443320,*)&#  .BIF@=CLMIGFB<:;9872-)&!!+8:5489. )0* +251*%'-0.,' Ǽ&.-'%$ ɿ  '/567;EMQTK(.9<::?@8/**)(((&"#-33, ʿ ο.:;878:867:989<<6.(''& (8@EHE?:6545:>56@>856:766640-*#%'# '5?A=81++02, (-18;4.0479<><64:A14986656779?A?8562%(1/)!Ź !-9ADCBDFIF)%IKD>952/,+*,5AJKF?<@GLJ<""&#!)1117AGGB9$%+'$"*)()%'"ûǮ#*,*,3:=?< 5<=81($*11-,+&#(4>A??>:9@GG@EG+路(''-.-(%14(ۼ#+  ྷ;@8*ɽο#' .>GHFA;8=DC''000,% (9B5&,?D@=2   !140)!!+5973) %%"')&%,6T_XONH"Ļ+8:5&$"#+/& %+.3@LNMJ)ͽ0>D@3+6KUVMA;/(,#&)#   +21* $-.).?GFDFJKKBɺ˼/97/((*%$&  /EQ\_[URPRUTM-/1)! #&$#-1) 'HMNNB3̸ǻ(*# ,1()?SWM+ܷ½ ',.049?FOSW^^W=,0-(&(,,"(20% 4MWT< #$&').687786+踵λ,1,#  %BRSA޼#(+.27>HUZWSROF ʼϾ %00)#! ,0+#&?QUI ̼ʾ %)+,/28IVWTRPJŶƲ*,''%8OYT!  '.5;CLUWWVTSRM2(-*! %9C@˫!&)++,0:DFEBBDC7л $01) %.*'.(+EW]A #).26?&طö (-)" $"%5:.+?NH '057SX- !)18GE8)'0?F%Ż!#(,1;FMPPMHFF;ս)8=:0% $+) &',4Ƿ"/69CFEC@>?B@'19>BA:448;70298/( 46",..4?GNUZYUQMMON>˸").1.&!!%*$ *:ǻս %+6FNSY]]ZWVVX[V0 (,130($%*.+)1:70!1O=Ķǻ $"&29=DKNMKIHIJH4ʿ!'+)"!#" ڿ 51ηƹ '16>LTY_dgea]WTRQGѽþ),0560(%'-.)*373' AJ#Ⱥֽ˾%,8?BFKNNLIGEEGDշ˻ %'=S< &-9@DIPVYXVUSSUU=˿'().2.%!%(#!C<׿ мķ %18=AEIKIGDA>>>2𹣠ɾ "+.*# $+.*)2;:-X]5ĸ "0;CHLPUZ[[ZXVUTO"ܽк$&! +.9J5տôĹ%,26;BFFFDBBEF,߹ɹ%0-+/7;7/&$',( +24PI "ż(8>CGIJLNMLJGEFG9𾦦í##('"+ AE,Ӻ »&-28<@GNRTTRQSWRظ*%!"(-0,$!(*$'50GWN1"*ǽ$.37;>AEHHHGDEIHկѸ %!$! &>@1 !Ŷ)8=BFILPSTROJHLN5뻨dz3/%#&,24.(&'(#(.$BMH0#*ҽƵ*16&72ξн*48=ADGKNONLJLOIγؽ+4*" !%('"%EOG/15"Խλ',168:<>><95476ȩʶ' BTP=5@4Ŷʳ/7>DGHGGHHIGGJJ0迭̳1)#"  .IJ=$#51 ï̼"',0259<==;999'깤ɴ34)%%  )MUL7#??6ҹ,18=?BEGFEDBBB8 ѵ2:. =>?:ἫDZ,=5$ &%,%:NNA,2<8,ɵ±",279:+ +*%ɫ'-2458>DGGECA@5۹?@0! )* /NUM<$885#鿮Ϳ #*/2458=AB@=;:5꽧ʻ29)   "8FD7" ,/-$ìʿ!+0467:@EGFCAA@1 ձȳ.?5!&% $1)=PSJ8,42,׵$),..04:@@>;97.㵥ů5.   ($1FMH8!!00.  (,/24:AED@=<;7)ҷ®??,&&! ,- +BLJ=( +-+$ʬ&+.0269854330'޴ȼ/6&   '.$%=:740%¨ƾ.F>,$ ë"$8DD8$ " ծǺ6ABABEFEB90,,(ݱ=>.%&#,&%9FH>,  !$($˻/BC@ADB?=94463% 6=. "(ǧ+:?9+  "*ò(&!%-259:88:92ֶ6JA.  #0,# #0?GD9)!"'+ŹϽ /3..374/+(&&&"٧::, ƨ (8;1! %//дö"%%-366216;;3 ȴ  5:/# Ͳ  1:8* +/ؾ%2+'*03431.,,+$ ̩!  *83(Ȭ  +65+ !)#˶Ҿ(**/5750*%$*5;/ú+91 !35." ó (7:2! #+1.޽ &.441*#!&(#ʴ21"!)&Ž.+ )@MJ5!18=7л²! &-4970)%(088%0@A6$ (*! Ĵ!  0<=1  "6=>:ܻñ ',/,& !.86'1:6'"ö  *;@7%".7:+÷ʴ#',/11-'"!)7>5 1<ϺŮ!%(+.+%!(.1' +140$  ƾ !!0@E@3" 092%4@FIGA>ALUWQE<=AB=840( ,781+)'$"  !!!"#$'(&"˼(1&!)) ޼!(2=D?67BPWR9)&"" ".41%!*4@E=-'0=BA;-༰Ļ #&  Ǿ"&).6>:$$@L<+-=EB:-ո*;7.)&#!%/661+).89ü$0:=03CG>/+5@FGC3!4DIC60391#͹Ⱦ!+4."&6EMNMB791%%!%,4:80)&(,.þ'.)!&+8EB0 ",6;6/ĺ $.30*)07=>'ĺ+31% #'3B@)$4=;3"ĸž'?;*$&.33137;??) %0.#"/AD20=;1Ǽ˽ #!,58753331&9:.!+5Ŀ**&57(&2>B8½ 2,ϻ",7><:ALSQF%"57." #.?E4%3??*¼65*%/8>;1*-471¸.3*%8HF3(+4@LN8-! ʶ%.43,-=MQH.17+.;2 "38&ɿ51(4?HH>36=A?,½1=9-#!")E<1,*#!'ӻ$+7ELHCFPXYQ+$9=5+'&&.DOD/$ !,& %0:=824=IPP6*-%.FVQ>1.&  !'2AHD=;ALRP< 293)$(-191.1599,2:6*! "7SYI82(¾ þ $+6<8/+.9DH> (.("8A5! +.4=A9-'+4<@9 /:9.%&)).=D:/)#-55,$#)395%15.$!#"$5E@/#*28BMNF:23?5&!$%(7SYJ<)%-4=FJE?@HV^^R2 -AHC:7=@>FX[J9! -8?GPTQHCFOVWN7)11+(*++4GPE5  #,5@JOMC:;BKNI:2;;2))-/6GTK9"ż  #0;AA:34;DIF:!+56-!1FJ=*ɾ伪 #-34.'%)240*!!  ,,κ -9AC>6249>?<0#172%&8=0žҽ +584,(+39;90%063' ,>G<$  1BMROF>;>CED=#6DIF9.,,,4ESTA 2AKPRRV]dge_J6@DB8--227FSO6   !2DQSMFDINQPL<1?EG?2,,,/>LM8 7JPLDACHKKH<!-261'%(),7EG2ƾ6A?847H> !5?0 1Ya[QLMOQQM?ELLKF90--,5@: 7E;IWSJDEGIIF;7>=:5+$%'(.:6 (5-̿.@@7126=DF9 5>>;5)%$ 0.ż¸.CE=542/.-& 4==:2! ­)+»»"D>- %IUSI@<98:8*JVY[XN>1.-,-0 .>ING4 BUYUTX]``]P, 7DGJJC5))---2) &APX]WEAUXQJGIJKI>" 7DGKOK?1**(')%!?MSWSC2KQLEBCEED<&&59=C@4% 4CGLH9062,+07=?9"'7;=B@3! IJ&4697+ ȼķ7C@82/+('$Ͻ!269=>2 #1121(̼%42+&'))(%ž4<@EF<' ϵ ,;;;<4ɻξ)=>7213420)-AHKPSL8" 8EECD@(Ǻ4MOH@<;852- 4FMQV\ZK8.)"'DQPLKG0*IOKFGPWYVPC) .684.(BHD;53200-&  ,9EPWSD4+!8IPLE?8$¾?HG@;1$"/QYXQKE4 AKKC<:;=?@;3)  +8CE7457896.$ "05- $!*MQKB9-'ERTNGEGIIGC<642,% #>?+#/BOE."0@LPI>5-5EJF=9:<=;72,++&.8'*:HC.'6BF>2)%&;C@84479861+(&!# "3A?+-71/.-#)8BA7) !/-*3;1&)&!öɽ#51% %3AFC6'輥&*16+  %371#ſ!)$"%$!  (5800:;,"#Žʽ"22-*-01450'ī (497:DD5$&/0, ŷ9A<547531.' ž*0-06# *;JH;3U_\UTUTNG=/# ! )8;<71381+9;1ƻ@IE<31587/$ -DEA;6:CA1#"&.;<1Ź=LI<.*-0/)  ܾ3676201.#!$-20ǻDYUF;:<<91'ܺ131-%#+1(!/:;'ĸĺ$9:4-**+)$ ¾7;71($-71"!0<>,Ļſ2JLD;4221,% =B=9/(,52&!/95.+490"'18<3ɺž$NZSG=50../,$ɼ 5E=74,%-5/"%28-  "!"4@A91)#! %=FA:1$! !'#!1=@:2*$   %?JF=3&"%$&#$1<@>80)$!+<>7-!   )2774.(# -76/# $(*+(# %+(   %$! $,)    !&(&"  *,#  ##  "   "$$    #'#,2- $&'(*+.0110////01233330&0;@A@>93*  ",49<<94.'"#&'&#!'-01/)ÿ *1478851,'#!',0120,(#*38::72( &6?CDA;/'+,-..-,+)'%$%(,27?ACGLPRRPJC<62-'"!&-489851,)&#"!!   %('%!ʼ )7<@DGGC=8667752137;=<:9:<=:4-(&&%!!*2651+&!ƻ%+-0560'")03457;@CB<4* 0;;4*" #('"!',-*%"$+5<=9546984/**.3651..1464-żŻ'=IOVZUKABB<2)'-/("-;GNMIGGHFCBB>2!7??;653,"û¾*7=:1# !",7=<6//7@D@6-)(),-)"û)0259<<7200-&",7@FB:1++153,%"$+...1671%Ž:;- '0453.**-0/*&(185+$$$)152+&)1:;4,($ ü'>A:59DF>0%!'1772*&),.0/( "'(')06:;6* # $*-*&#"!,9EE7('08?A=6.'',,))+'ƽŽ9AA=5.)$ #096.)*09BGGB<IG=1,1333,Ƚ-@EA5)+28>A;. "4AB=<==;?DC=78<91'"1/*#60"#2>CHE7%',2;@<30258994($$#&.7?C9)$%'88׾!%)494& *1:>5& &2:7-# )/.(! "  )4:=8-" 02!)HH@4ǿǻ '076." #%! %)++)&'-40% '6A:¿ 4:0$!#  #'1:>8/+,//048640̻$,./0021' )8DG@3-17768?CB@;44:=8) ý6@C<)%+1552--/*%*6<=BD>:?GE=51!ƾ0>7( +39>A<0&$##073.-,+2?FD;8:70+(%'.6>B=%ĺ)!(1:?;0'%!"172-*&%)02-$#''"$/PTOKID>@E9-6;3 %0::0()-()9HHA>;65<9ý0<<0*5?KPJ<330).CA2!!6EJOQK:3*##(#*/.)¾(26>HIA6220/7BC=<>>=?C@8/+)$"',0366, %)/0!ž÷*-06844?E>3-'! '+( !%),-*" ',0782$Ǿƺ''*01,,11,)'"#,20)%%%#!!(05/"$.5:>>9,$;>7,%#! #''%%&%%(-10-($ #'492!*06<>=;84/*'$!!##" !"$&''$  1:><4*'*156520///-++*)&" -;<:9:==<<<;50/169;;95457653.'" 4GIFDDC?944689998656779:410/.,$+@FHJKID?==;731149<==;<>@>;98851,'"ÿ7CFHGDBABB@<8666654469:7301342-'$$$0=ABBA>:9<>><;:;<;92+)))(&%&'&#  ! 6?@ABCB>:78985236;??;4//.+%! ""!;@<;<>AA?<;;;952136899;<<71,(&&$! :>>?@A@=989:9743478988:>@<3,)**($*=>=>@@>;:;<;84347:;;<=@A?:2+))(%#! 2@BBB@=:9;<=;8679<<;;=@B@90)&&%"   3ACCCB?<;;;:74348;<;::960,)())'$ ,?@@ABC@<:9;<:743689850..-*'%%%%#  =C@??AA?<:99986558;;:850-+)&%%%$!3A@?@BB@<988864348;<<;:95/*&$$$$!>@A@=:99975457;<<;;<:4-)&%%$"ÿ5@?>?@>;98:<;8557:<<;;;71,)&&&&$ :@>>?@?=;;<<:7547:<<;971.,)'&&%# ¿!?A?>?@?<;;<<;74358;;:84/-,)&%%%# #?A?>@@@=:9;<;85458;;:950-,)&%%%# ?@@=:9:<;85458;;:971-+(&%%%# 6@?>?@?=:9;<<96468;<;95.,+)&$$$# 4@?>>??=;;<<;96458;<;81-,,)&%%$#!4@?=>??><<<<;96458:<;6/,,,*'%%%$!4@?=>??=<<<<;96457:<;7/+,,*'%%%$!/@@>>??>=<<<;96557:;;81,,,*(&%%$" )@@>>??>>=<<;:75579;;81,+,*(&%%$#!%?@>>>@@?=<<;:75569;:6.*+,*(&%%%#!&?@>>>@A@><<;:75569;:4,*+,*(&%%%$!$?A?=>@A@><<;:86569;:4,*+,+(&%$%$" =A?>>@AA><;;:86568::4,*+++)&%%%$" ;A?>>@BA><;;:86558::4,**++)'%%%$" 9A@>>ABA><;;:96557::3+)*++*'&%%$#  9B@>?BCA?<;;:96557:92+)*++*(&%%%#! )@A?@BCB?<;;;97557991+)*+,*(&%%%#! /@AACCB@=;;;:7557991+)*+,+)'&%%$" "$4ABCDB@=;::97556991+))+,,*'%%%$" "%2ACCCC@=:::98546970*))+,,*'%%%$" "%"!>DDDC@=::::8556981+))+--*'%%%%" "%&2CEEDA=::::86569;6.))+--+(&&&&#! "%'$ҿ#AGGFA:4123579<@DD?51231,&!ѹ3:;;97679962.-/12-$!#'(&#  $"ؾ!EKID=73111/-,.1573*&'('$  #!ܾEPPNKGCAABA?<:864/%"$%'+-.-+(&')-- ¾ :KNNLIFEEEDA>=>?@?:2132/("%+02*#;?ABA>;8620137<>=80.257643455434576/ '@B?:50/2689:;>AA=4*'(**('&''&# #')%)IRTRMG@<;:62125770)(+..+'$##!!#ͼ'?CDCA><<=>>@CEFDC<1,)$»1CCA><9878889:=>?=6.-15764332,"麰*@EKNMKKKIE@;:<@B@6,(),-*&""##"! #'*%ν(?BCCB>953124:CJOPH<6430-+-/0-*''*/2.ľ-375-*)'$###"!!"! !%&嵪9JKKKIFB@CFFEEFHF@=<=>?@?;630,&  Ÿ!258>B@==@DJNMKJF@=<<>AB@<74468852.,$þ(77652-(%%')+/6;;559;=@BA=84224431//)ľ2333320.-..+(%" )130,,4<>=950-,%.3,(''('&()(%&*-("  %((*'BLLKHB;4'#%)($  ˳EPNMLIB:5457875/   ӶKY[ZZYWTOIEDC@:3*'&(+-./* ׷DTVVUSRRRSVYXSKA978860(%()(%$$&% ̱AHEDEJUUNGEIOSPFACEFFFDB@=83/.*"!&->FKHEEHHFDDGMH>;=@@@ABBBCCA@?=83133"+97410//.-3>CA:2002:ABBDD@;769<;60,+!,.2442.)&'+/+,1.**/34310355663#16)" $)+)&&'& $(('&%$%0@DEC?:3%#    ׿8HHIIIC=:87771"  ׸ BWXSMIJLJGEGC6*#!"%(*+*'%  ܹ=WZXUTUXVQNNLD;8889962-'%&'$  +IVZZXWVSNMOPG><>@BCA=::<;82)"ÿELJHHHJIFCCD?<<<:9<>?>?BDB>:620-*'(%ȿ¾ 5:6445=CA>?A<62111231./8@@;75689841.&0.04641.,+*"!,00/--/1-'%)1564213&0B8-++)))++)#%,-'" &,03-=@??@>4& DMKF@<;;<;6-'    ݺ AQNKJJJIHHF@>8.&# "$̾6OPMKJIHGGE@=:77:<9/";FFFDA?==;4/+'&(,.011.&! !"º/BCDGGFEDA92.+)*-////.,-,)$ 07EF@:7-" !! ȵ%KUWTOJGEA955520-( ֶ@QTSPNNMKC:50,(),,++*)%! !"  ෯5NSQNKJKJE=840,)&# "%&&%#!  껫,JQPLKKMMG>6.*+..,)'%%$##%'(($=NUTPMLKG>7.((*+*)(())'%"!!"! ܾ0AFILOQQMB:4,()**)''()('&%%%" !*FOPMJIIF?964.)'&&&')*)(&%&&$ ̼BMQRQPNI?62.)())'$##$%&''&&$!ɲ"KTSOLKKJB:2(##$&&&'(('%#! !"! ҶIVVSPMKH?2'#%'**($"#%''&%$#!!  ܹ>SUSPMLJC9.%#$&''&%&''%"  õ/NUURNKIB:4+%%&('$#$&(('%#" !#"ͺ4QVTQNLKD<61($%''%$%(**(&%%$#!!!˷9TXVRNKHB:72*%&'&#"#'**(%$#"!  5QUTQNLJD;5+##&((%#$%&'&%$##" ƴ1QWVRNKIC<4($%'((%#$&''%"!""" ʴ.PWVSOLJC;5*##&)(&$$%'&$" ""! dz2RXVSOKHA:70%"$'&$##%''%" !##! ! ó6RWVSOLH@:72'#$'&$##%')(&$###! !9RWVSOKG@;81&"$&&$#$'*,*&#"##"9RVVSOKF>:80%"$&%$##%),*&#""#! 뾲@SVUSOKE=:80%"#%%$##$'*)&#""#! ߸HTVUSOJB;:92&""$$$#"$'))&#""#!ҳ)MTUUSOJ@:983'!"#$$#"$'**&#""#"β&KTUUSOH=8884(!!"$$##%(+*&#!"#"Ӵ ITUUSPG<8884(! !$$##%)+*'#!"""صGSUUTND:8884( !$$$#%)+*'#""#"ٵ"ISUUSL@98885* !$%$#$(+*'$""""β0OTTTSK>87886* #$$#%)+*'$!!"" >RSSTRJ>87886* #$$$&)+*($!!"! 亯ARSSTRI=87885* #$$%&)+*($"!"! 亯@RSSTRH=87884) #%$%&)++($"!"! ắCSSSSPE<87883* #%$%&)*+(%"!!! ۷FTSRRKB<87873, #$$%&(*+(%"!!!ֶETSROG@<98863,!"$%&'(*+)%"!!!ݸ ?SSRNF@<98752,!"$&''(*+)%"!!!估8RTRLD@<:8642/&!$&''(**)&#!!! ±2PTQJC@=:75331-% !$&''(**)&#!!  IJ.OTOGB@=:64331/,$!$&''(**)&#!!  ȳ$MTOFB@>:633310,$!$''(()*)&#!!  ӶESPFB@>:533310.(#%'((()*)'$! 彴9QPGB@>9533320.-(&'''()*)'$"  ȶ+NQIDC@;75543100-((((((('%" !! ڻGPIDB?:75431.,,*%$%%%'(('%" ¼4MJEC@<975432121+))(''''&# ؿCKFC?;854332232,**+**++*(%#!!  *BA>:741/011111,)***+,,,)&#""!  ;@=962/-,,,+**(%&''()*)&! 7C@:62/./010//,(''%%%&&%#! !!!$@A=:620011/..-*+,,,,,*($! 4B@=841000/--)&'((()**(%"!#$#!'@A>:631220/-(&'('&'))'$! !!;@=9521220.,(%')++,./-)$! !" 7@=83/.0110.)&'(((())'#"$$"*<:61-,--,*)&!"$&&()*(%" !!!<>:521232/-'"#$#""#$$!  #<=:40//00/.*')+*))))'# %?A=95455421*%&''%&'))&" !   =A=842455540+,--,,-.-(#8?<84345665.(*,-,,-..+'$###",861--.0232*&)++***+,*'$#$%$.:82.,,,,,)!"%'(()*+*'&%&&$ ,651-++-01-% #%&$##$$"! 3<:61,)*,,*"!$%$#$&&%!  5=;6200243/& !" !#%#  :A?:4126873)%'+,)'&%$"   ;BA>:77::84)&(+,+)'(('$!    !:@@<7569:95,(+.0/../.,($#"  (;@>:6456542*&)-.-,,.00.+(&" ,78851015885*#%())+-..,)(''!39863/0010/+"#)+)()+-,)&%$ 26763100010-# #$#""$%&&%#  /999751/...-* !$$#####"    :<<==;9744330(  "$$"   2>><;:99887773' "&((&$#!!  ¿ 5@?>?@@><97775+##&)*)''(('$   3<;9:>@?=;:9:81((*++*+,,,+(! 7>=<;=><:765681)(*,--.///-+%586568:8677776/%%*-///....,%!(89756787421000+#$&(*+++,++(!! (67556898630//0,# #%&&)***(!!+:;98:<<;853100,!!$&&%$%%# !#->@>>>=<;9643342)#"!#$#""$$" !0@A?????>:521232,#"%())'#!! !*<>>@BCCA>;877873)&(**(''()'" :???====<;;;;;:7.()+,,++,-+#$&"0;>@?>>>=96457772*)+-,+*+,+$!*-,$,;<;8899987667651)&)+*)((**%')'# )AEC@?>>;62123575.'()**)+-.) ')(& 7CB>=>?>;8667641,$$'())*,/," (*)'$#>A><=>=:86677640(%'))*,02/#'+)'%! ;FC@??><97888763-(()('(,11(%&$#"#.EECBBB?<9:;<;974..//..031((+)%#"=ECCDDA=:9:;:8760-..-.255-!$('%%&( >CCDDB>;:<<;8762...--144.# ((%#$%%!:656886554/***,1674)"''%&'''%" 9CA<8778753452-,,-0452)%&%%&''&% $?A=9788864464.,,-0474*#%&&&&%##¾/A?;9898645772/--/354,!"%&''&%$$ 5?<99996557830..0464- !&'&&%$%&&þ8?<::8644784/../365.#$'''&%$%'"ξ":<;;:855784.-.0255/$ %''&%%'('8=;:97557960../1340%#&''&&'))ÿ 2==;:8557:71/.0133/$$''&&'))!ɾ 9=<:867:=91../1230&"''&&'()' 1==;9668<:2//0122/& %''&'()'ÿ 1==;9767;92//0122/& %''&&((&ÿ3==;9767971//0122-% $'''''('.<=;9767861//0121,$ "&''(()(&;=<9868:71//0121+# &(((()( /==;9879:60//0011+#  &((((('7><:987893///0010)#!!&''''(':><:987771./0001.&"!!&'''''&;?<:98765/-/0000,%"! %'''''&!:988897/,.//.+%"$" "$&'&%$ÿ1CB=:888896.,.//-'""$# "$&&&%;DA=:888883,+-//,%!#$# !$&&%$(ADA=9888880*+-//+$!$%#  !#%&%=DC@<9888980)*-/.*$"$%#   "$% ÿ8BBB@<9878990)),..*#"$%#"!!$# ÿ-?AAB@<9778:8/(),.-'!"$%#!"  ";@@AA@=9889:8.(),-+# "$%###  2@@?@A@=:889;9.()+,("!"$%#!#$" >A??@A@=:89:<:0((+-(#!"$%# $%$#"3BA?>@AA>;99:<:1)(+-("!"$%$&)'$#!>@AA>;99;<;4)(,-&"!"$$(,*('$! (@B@>>@AA?<::;=<4**-+%!!"#'..+('&"2AB@>>@BB@=::;=<6-,.*$!!"%,1.+('%"8AB@>>@BCA=;:<>=:2--*$!!")02/+('&# ;AA@>>@CDA>;:;>?=5.-*$!!%-22/+('&$ӾĿ#?ACDB><:;?A?90-)$"#)032/+(''&ͽ#;@A@??ACCA><<>@@@;3-($"%,022/+'&&%Խ9@AA@@ACDC@>>@@A@=7/)$$).1220+(''&" 4ACBA@ACCB@?????>=:3+%%,/022/+('''#ž1ACB@@ABCBAA@??>><;7,%&+-.00.*('&&#Ƚ/BDCBABDEEEB@@?==<<9/&'+,.//-)'%%$"ɼ*AEDCBCDFGEB@@?>>==<5)'+,-..-+('&%#վ:DDBAACFGFCA@@??>=>:.(+-.//.+('&%#ʿ)ADBBBEHHFCA@???>=>>6,,-.//.+)'%$" =>@<1---/0.,)'%$!1BCBBEGGECA@??@?>>?=3-,-./.,*'%#! ;DDDGHIGECA?>>=<<>=4.,--..,)'%$" @EFGHHFCA@??@?==>?7-++,--+(&$#! .EHIJIHFCA@@A?>=>@;0,,-..-*'%$" :GIHHGECAABBA?>?@;/+,,--,)'%$# ;#DJJJHFDA@BB@?>?@:,),-//.+(&%# ƽ,EIIGFCA@BB@>=>?<-%)-...,)'&%" ""ƾ0HKIFC@?@@?>==?>/"$+./.,*'&%! "$#1HKHD@@@@?=<<><.'+--+)'&$!!##! :IHD@?@@?><<=;,$+--+(%$!!##" ſBKHCBBAA?==>:)(,-,)'%#  !"!(FIEDCBA@==>;*#+-,)&$#  "#"!ʺ3GGEDCB@>=>:*&./,)&$!"""! =HGEDCA?>>8(!+0.+(%#! !##"! ˵(CGECBA@?>5%!(//,)&#" !#$###""㺲 6EEDCA?=<1  $,/-*'%#"  #&&%%%%$ƴ#@EDCA><8*"',+)'$#"  #%''&'('#ٹ 4DEDA><5$ $*-+($#!#&'&%&((%¶ >EEB>;/ "&)(&#"" "%'&&&()%ͷ9EFC?8'!!$()&$#! #%%%&()% ׸3EGE@5!!!!%'&#"! #$$$%&'$ߺ)CHE?/!##"$((&#!#%%$$&'$ AIF<&!#$#$'(&$#!!$%$#$&&#´ @HD6 !"$$##')&%$" "$&&&&'(%´&BG?- !"$%##(*('%# "%''''((%!쿶.CC7& !#$""'*('%#! #&((''(('#彺6CJF;0+*)"#+11.+)'$! #$%#0HID9.*)(#"*/0.,*('$!  "$$@HFB8.*))% (.00.,)(&$!!"1CFE@5.+**( (-...-+)('%" !=EFEA7/+*))$%,..//.,*'&$! +BDEEB:1-++*( !+---...-*(&%";DBCDB:1,+++*&)-.--../-+('&$ "ACABCB;2-+***(!%,.....//.,)('&" .CB??AA<3,*)**)%"(+-...///.,)''&$ 3CB?@BCA8/*)))),.**,..../0/-*(&&$7DA?@CDC>3,***+152,,----...,)'&&$9CA>?ADD?6-***-5872-,,,-./.,)'%$!;DB?>@CCA8.**+178871-,,,-..,)'%#! 9EB@>@CCA;1*),4888970,,,-..-*&#!! 7EC@>@BCB>7-)/79889:6.++,./-*%"!" 3DC?>@CDB?;4.29:889;;4-+,./-)$!!"".DD@=?CDC@=93599889<=:1,,..-(#!"""'CD@>@CDCA=;88::879;==80,./,'#!!"" ?EA>?BDDA><<=<:878;=><5...+'#""#"8EC?>ACCA><>B?:878:=><70--*&#""## ÿ(CD?>ACCA>=81-,*'$""##!þ=E@>ACCA>=@HI@977:=>=;5.+)'$""$$" þ,BB?ACDB?=<91+)'$""#$"ÿ 9BAACDB?<>GLF<77:<>=<80+)'$""##"">BCDDB?==DKF<779<==<8/*)(%""##! /BDDDB@=FIA879;==<9/**(&$#$$#!""?GFB><=BF>879<==<7-**)&$#$$"!"" &CGC?==@B=889;==<6,**)'$#$$"!""  7FD@>>>=;889;==<5,**)'%$$$!!"" Ŀ@EB?>=85689;==<6-***(%$$$"!"""ο1CC@?<4.279;==;3,***(&%%%#!"! #$üž>6-)()+,-..0232/-,,,+'#',/0)ÿ 377644;?@;0)()*,.//02320-,,,+(%',.0*377669>@@=2*''(+.../1330.,,,+(&(+.0(ľ$4788:?@@@>9-&%'+././1331.,++*($&+..#*5789>AA@@?<3'$&+.../1331.,,,*(%$)--,678:?BA@@?=8-%',./.02431/-,+*(%$(-.""589;@CBA@?<71)'+...02442/-,,+(%#',/)28:=CCB@@>:74/),.//024420-,+*)%!"+/- 08:@EDB@@=9643/,-./023320-,+*)&!&.- .8;BFDB@?<965553////1232/-++*)&"!+--8;AFDB@>;96557960./1221/-++*(&"',+7:@EEC@>;98668;=5/.0121/-++*(&""+"#7;AFEC@<;98667:=;4001220-,+*)&!&' 3;BGFC?<;:8778:<>:201220.,+*)'"!'.;CGFC?<;:87789;>>811220.,+*)'"!&:CHGD?<;988779;=?=51221/-++)'! 6BGFC>;:998778:;::987789;=?=6210/-+*)& ;FGC>;:::97779:<>>;420/-+*)%!/EHC?<:::97678:;=?>831/-+*($ #?IE@=;;:98678:;<>@<51/-+*(" #"*FFA><<;:8779:<<>@>720-+*' !' ɿ1ED@=<;:8778:<<>@@:41.,*%  %+ž9CA>=<;9778:<<=@A<51.,)# !! #+)о-BB@=<;9778:<==@A>72/,'!!!!")-;B@><;9778:<==?A>72/+%  ""!"(0)ʼ'?A>=;9767:<==?@=62/*#  ""!"(122@@><9767:<==>?;52.("  ""!"'04,˼9@?=:878:<=>>>941,'"  """"'04/ؾ7@@>;978:<=>><630+&" !  ""!"(141 4@A><978:<>>>942/+&"!!  ""!#+242 »*?A@=988:<>><632/,'#!!!  "##&.342)ʼ:A@=:88:<><5110/,(#"""! "#$*0453- мA@=:85-,/0/--./.+'#"#"#,12100233(Ǽ 6A@?=:72+,/00.-...+(%#"! !(.12100132 =A@><:6/*,/0/.-./.+(&#"!"',.01100131ٿ)?A?=<:6.+,.0/.--..,)'%##),--/100012. Ӿ5A@>=<:5+*+.//.--.-+)'&$(--,-/000011#Ǿ(AB>=<<;2*)*-...,---+('&',/-,,.00//0+=DA=<=>;1))*,....---+(&'-0/,+,-/0//.,DE@==?>:0)(*,.../.--+('*140,++-./..&9/)()+-..//.-+(*1542/+*,-.-# :EEDBA??>:0*()+-.../.,*),35420-*+--*%AEEECA?>>;1*))+,-..//-**045421.++,,"5CEFEDA?>>;2*()*,-.../.,+255421/-++( ?EFFFCA?>><3+((*+-...//..455321/.-*.BEFFFDB?>>=5,)(*+-.-..//1564421/..*0CFFFFDB@>>=8.)()+,--../037643210/.'ǿ3EGFFFEB@>>>;1*))*,---./058753210/*" ľ 9FGFFFEC@>>><5+(()+---./06:853310,%;GGFFFEC@>>>=9.)()+---./17;953321+$½6GHFFFECA?>>><3)()+---./06<:64341)# Ľ/FHFFFFDA?>>>=8-()+----.05<;74550'" ƽ,FHFFFFDB?>>>=:3*)+----.04:;7565-$! ƽ,FHFFFFEB@>>>=:7/*+,-,-.028;8774,$! ǽ)FHFFFFEB@>>>=;95/,,-,-./16::874-%! ̽?HGFFGEC@?>>=;9860-,,,./029;985-%!! 2FHGGGEC@?>>=;99970,,,-//17:985,$!!"̽BHGGGFC@?>>=;99:;6.,,-./048874+$!!";GGGGFCA?>>=;99:<;2,+,./004774,$!!"Ǽ#BHHHGDA?>>=<:9:<=8/+,./0//476/&"!!!Ľ-EIIGDA?>>=<:9:<=<3,+-01/,.572)"!!  ÿ 7HJHEA?>>><:9:<==8/,-02/**164*#  !CJIFB?>>><:9:;==;3--01/*)-55-$ 5IJFC@>>><;::;==<6/-01.*(*372'! =JHDA?>>=;::;==<92./0.+))065-!!! Ľ;HFB@?>=;:9;<=<;50//-+))-46.#!"û4EDA@?=<:9:<==<81.--+*),34/' !"  ! 3CCA@><:9:<==<92-,-,*)+020+# !"! " ؽ 2BCB@=:9:<===:2,,,,***-11/*$""! ""ϻ0BDA>;:;<=>=:2-,,,+**+120/,&#" !"#!ʻ/BC?<;;<==<83.,--,+(*13111-&# !##!ż6BA=;<=><:83.---,*(+132121*$! !#$" ڿ=B?=<==;:82.--,,)(+1432231(" !#$# ˻,@@>=<;::82.--,*((,2532344.$!!#$#!9A?=;:::70---,)'(-45433452("!#$$" ɺ0@?<::::6.-..,(')/56433564,#"#%%#! ռ"<>;::;:4-,..,(&)177533465/&"#%%$! 4<;;;;91,,..,(&)2775444651)#$%&$" Ǽ5<;:;;6.+,-.,)'+5875434541+%$%&%"!¼ 9<;:;:3,+,-.-*)/6886434432-&$%&%#! 9<:::7.++,...+,26886433322.'$$%%$"ý8=;::5-++,-...156876432223/($$&&%"ž":=:982,++,-./1566776431122,%#$%&%#3><:96.+++,-.17866776410020(##$&&%#Ǿ :><971+*++,-07<:6567630.01/(#"$&'%#¾'<><96.**+++-2;><756652../1.'""$&'&"->><96/**+++-5>?<877640..//)#""$&'&! ֿ5?>;96/****+09??=:8652/--.+$"""$&'&Ƚ1>?=:84-))*+-5<:73*()*+.7=?>=<:51/.-,*$!!""#%%Ž;B@=;:72)&(*+/8=>??=:61/.,+'! """#$$0BB?=;973+&()+08<>@@=852/.,(! """"$ɾ)CD@><;964-'')+2995432-$ !!! 8GGB><<=;63.'&).6:<@A>85332-!!!&CHFB><<=;73.(&(-5:>A@=84320(  :FGEA><<=<84/(&(,4;?@@<8530)#   )BGFDA><<<<951*&(,6=?@>;841*$!  9DFFDA>;;<<:73-((/9=>>=:83+%""  &@EEEDA>;;<<:861**19=>>=:70&""" ̿2CDDECA=:;<<:875/-2:=>><:4)#"#"  ž 9DDDDC@=;;<<:8894.18<==;8.&###" ¾=DDCDC@=;<=<:9:<:107<<<:3*%###" ?DDCCB@><<==;;<==826;<;8/(%$##" >DCCCCA><===>=<=>=66:;93,(&$$#" =DCBCCA?=>>??><=>?;8::70+(&%$#" ;BBBCCA?>>@A@>==>@?;;94-*)'%$#" 9BCBCCB@?@BB@>==>@@?>91+*)'%$#"!7ABCCCBAABBB@>==>@@@A:0+*)'%$#"!ÿ2@CCCCCBBCBB@>==>@@?>:/**)(%$#"! ¾*?CCCCDDDCCB@?==>?@?=9/***(&$#"!  :CDCDDEEDBB@?==>?@?<7/***(&$#""! ! *BEDEFGFDBB@?>==?@?;60-+*(&$##"! "¿:EFFGHFDCBA?>==?@?<722-*(&$###" "#*CGHIIGECBA@>==>??<832.*(&%$$#"! "# 6FIJJHECBA@?>=>?>=;61-*)'%$$#"! "#"¾ 8ILKHECBA@?>=>?>=<93.+)(&%$$#"!!"""! =>>===;4/,*('%$$#"! !! ԾDMKGDBA@?>=====><80,*)'&$$#"! !!! ˻)HLIEBA@?>=<<<=>><5-*)(&%$$#!!!!! Ź2IJFCBA@>=;;<>>>=:3,*(&$$$# !!!!! 6HGDBA@><::<>>>><81+(&%$$"!!!!!  ٻ7FFDBA=:9:=>?>?><7.(&%%$!!""!!!ͷ:EEC@<:9;=>??@?=;3*&%%$!!""!!"! >FD@<::;=????===8.'%%#!  !"""""# Թ.BC@=;:;=?@?=<=><4*&$#!  "##""#$"ĺ6BA?<:;=?@?;;=>>9.'$#"  "##""#$$  ۿ"=B@=;;=?@>;;=>>;3)$#"! "###"#$%"ǻ 6BA>;<>@@<;;=>><6,$#"!  "#$#"#%%# Խ)@B?<<>?><;<=??>9/%##"  "$$###$&&$»?=<<<=??>;2'##" #$$###%&'&!ʼ 4BA>=>>==<<>@@?<4)$#" !#%%$##%')'#־)@A>=>>==<=>@@?<5*%$"! !#%%$##%()($ $?B?>@?====>@@?<6,%$#! !#%%$##%)*(% º=B@@A>====>@@?<7-&$#! "%%%##&)*(% ĺ@@?=80'$#! "$%%$$&)*(%!ƻ:CEC<<====>@@?=90'$#! "$%%$$'**)%!Ȼ;DGA;;=>==>@@?=90'$#! "$%%$$')*)%!Ż!>GHA:;=>==>@@?=90&$#! !$%%$%')*)&!ù'BJI@:;====>?@?=90&$#! !#$$$%(**)%!/HMH=9;=====?@?=90'$#!!#$$$%(**(% ׺6LMG<9;<====>??=7-'$#!!"$$$%(**(%ҷ>MMG=9:<====>??=5,'%#!  "#$#$')*(%ų)GOMH?9:;<=<=>>><3+(&#! !###$')*($ἱ9LOLH@99;<<<==>>:0*('$!!"###&))'#ѵ"BMNKG@99:<<<<=>>8.)('%"  "###%()'Ǵ 2EMMKG@98:;<<<=><3,)''&$  !"""$'(%߿(>FKLJHC;89;;<<<<7/+)''&%" !"""$&˼;AFKKIHF?99:;;;<:3-*)''&%$  !!!!#"û 5ABFJJIHGC:89:;;;6/,*)'&&%$" !! (@BBFJJIHGD<89:;;80,+*)'&%%$"  ¼5CB@DIIIHGGA:9:;91,+,+)'&%%$#! >FC?AGIIHGGF@::93,*+,+)'&%%$#"  û)CGD??FIIHHGGE?94,)*+,+)'&%%$#"!Ľ 6FGD@?EIIIHGFGC9/*)*+,,)'&%%%#"!ſ=FGE@=AGIIIGGGE9-))*+,,*'&%%%#! ÿĽ=FGEA==DIJIGGGD;0*))+,,*(&%%%#  ¿º>FGEB=;@GJIHGE@;80*)+,,*(&%%%#ý?FGEC>;=FJKIFB<:;80**,,*(&&&%!!@FFEC@;;<@GID;89;;::82-+)'%#!Ǿ1DGGEC?<;<@EB:89;;::;:4-)&$"!Ϳ'BGGGD?<;;;986311343/--,,+*'$" ԾCJEB>:     "&-22/,&"$),+,/341,)(-485-! "*/0/,'&*/0/-++*&  *,("%(%  !   !## "031/01, !, !-99.! 3GNF7*"JQC ,0039==9.*.% %/;DFB:1'(3620*# &152-+,3=HLH<'¼-/&#+331597-潳ºľ   #380 %;BADEA95449@CEEA3"#@RP@(<@=2'(051%$&% "()& *6+¿$C4$0$.0)(*;?:3/-& &/4. 1:6'Ѻ '96(!&3BNMC;8878;>@@;+  '6<5%%5BJH=2+&"%.8;2׼Ȼ"" $>9,3) 1IK<+%+7BKJ@4+$66# &79/$ӽ 1HB- 2EF<2*,) ؼ'( -2'ջڵ0?- -@9"(¸ȰCA* *AH:,)ó0ME-5IL;!'4,׽9NC,#7EC1,0# ̼ɶ AO@)%8B=*00!źij#PR<(!.;?6"*%ӽ5UM6%!!#(3<9+ ̽ɺCXI2%%(*08;5' ĸJTA+$(*-3870&!!!ƽ&ON7%$*,/352,''(%""%&#Լ6PD-!&+-021,'%''! ɷĽ ?L:$&*+./+'##$ FG2!"(*+-+'$"##ѻž6LB+!%)*++(%$%&$ȷ¼@J9%"(*++*&$%&%!" õ(FD0"$)*++'$###" !&& Լý5H<("&))*(#!  #!ǶAE3$#()*)% !׿ľ2E?,#&)**)$ "!ϻ½>F9(%(*++'" #% ƷĿ%BB1%&()*)$   "" վý 8E;+%()))&    "̹"@B4('))**%  #$ŸĿ2D>.'())*(""$&$ վ½0())((&   "%$żľ:B8+)*)))%#&(%¾½$A@3***(((" $%(($ ſ2B:-*+)((%!$&(&"¾>@2*++(&% !"%'% 0B:-*,+('% $%()'!þ;A5*+-)&%!&&(*+)" &@<.(--(%# !%%'*+(þ 7A4)).*%""#$(*+'#?<-(-.)$!$#&*--&ÿ2A6)).,&"%&%).10% ;=.&+/*#%$%*03..@6'%-.' "#"&-34,:>.$(/,%$"#*265( &?9(#+/)"$%#&.694 ¿4>1#%..'&#"(29:/">:( (/+" # "-7<9'ľ2?2"",/) %#!(4<>6¼;;*%.-% "%"#-9?=/ ž,>5"*0+ %#!&3=A:%ü:<+ ,.&# +8@@4+>7#&/-" %$ &3?D?+Ǿ 6=.*/) !&""+9BC9ú"=9&!..$ %%!%2>EB1ʿ 5>0%.+$ (8CF="Ǽ#=;(,0' $%!$0?FE6ù1?4".-(%")7CFA'ʽ:<+'/( $'$%/=FF:ƺ/@6 *,%$!'5CHD.:?/#.) "(%%.<'"+$'&(3@HH8ɻ 4A7 ()))(.9DJE&ø<>, (&+*+2=FH;̾+?9" "$ *,+.7BIF*Ǻ9@0" !**+2=FJ?·*@<& #)-,/7AHH0̽ 3@5 #-..2:CIBŹ:=*)/016>GI7/@7*./3:CJE ʼ:A/ '0126>FK;Ź&>;# .2238@HF)ο 0?3'2446- .6658=EH6ɻ!;9#4878;BIF(ĺ 1?0 +7879>FJ=;=%4:88;AHH0ʽ)>5,9:88CHD)ʾ 1>-5><:<@EH>ƾ6: *;=:9;;?DHC$28$;@<;=AFH9 ƿ!:3 3@?;11 3AA=;>AFG4"5":B@<<=@DG:3&!:B?;:<@DC*#0 /AD@<<>CG> ,$ 8CB>;:9EC?;:?ED- ƾ 4BDA=:;BF= &ھ 'D@" ۾';CDB=9;BF9ʼ0?CC@<9>DC* %8BCB?::@F> ϼ /D@!н-;BBB?;;AE7ƻ  %4?BBA>;=CB)ֿ-:@@@>;9>C:ɺ&2=AAA?<<>C=ͼ&1;@??@>@>>?<"Ѿ(08??>??>?B7ǻ",4=@??@@?A?)(/7>>=>@?@B:̽ &-2:?><>@?@@/º  #*.4<><=?@@A: ν %,18>><>ABBA3 ƻ!#).39=;;>AAA<%"%(-06<=;BC@3ǻ%(,.37999CEA2ƹ$&)-156558?DD<'Ӿ"$'+/36656:BEC7ɹ#$(+056546=CE>-Ծ!"$(,266458@ED:#ͺ""%).57535:BEA2ø!!"&*066436=DE=* ѻ"!"&,485348@EC6Ķ ! "&.67325;CF@/ս! #)386226=EE;%˸  #+684238@FC4" %197324;DF>+ ͷ '595126>ED8Ķ"!.993139BFB0ּ!$3:6114;DE<&ɷ!*8:5126?FC5ؽ!/:82039BF?*ϸ! &6;6115=EE9ö!,9:3027AGB0 Ժ "3<8203;DF<$ƶ!(7;5015?FC4۾! -881.17AE='Ծ$ !4=8203;DE7ǻ##*781,-2=C>+Է,51*(+2;=2ϼ  05.((-7?;)#'56/*+1ED5 '-)!.CID>:# +59756;@=/ ǿͽ !)7GPI. %'%""*9F@! #$!!*11-+-7CE6#/550,-360 '363018@=)%**+,2=F?$ !"%$$&+6?>4(!"(* +3520/360㼶!*47789;<6#Į¼!  "&-8>>:659>:#Ÿ &/0..1:EH<ſ %,.---./,#$.6B>)Ȼ5- './04433,ܾ&4  (-.28;=;* 3- !,/06J0  )002:A?4%KB"+//3=A;+Ӽ1 ý0I: !#%*./0:@;%ͽBH* $$',//4=?4Ļ/I< "%&*..07@='о@I.$&'+..1;A6ƻ(D=  &')-./5??,ѽ:E/ $'(+..09@9Ǻ(C=')*-..39ʺ ::&*+,-.2:>/0>2  ),---/5<:͹"68" $,-.--07=/ĵ.:5 '-..-.3:9һ*1% "+/0.-/6:31"Ů ,3 $2<>84-ָ  #70 *7?=73!ʲ .7  !/<@;5* ܿ  $<6&5??92ѵ *9',:A>8+ Į  99#3>A<5պ +=-)8A@9)ʲ  ;A& .5 &=4 %5@B=,ζ 6C++:BB8ı  %>;"1>C>)Ӻ 6H4 '6BB8ȴ  =A -=DA,־1H: $4AE:̷  =E%  *:CB*±0J@!0>D9Ϻ 8H.  '6CC+ų+GE -=F=Ҽ:K5  $3BC)ǵ*HK&  )9D;վ 3I;  !1@D,ʷ 'EM- '8E= 6LC  .>D+͹ 'DO7  $4B<Ĵ 0HE   +/#?OH"  +:9 ̹0HN9   09-õ!=PM- &35" м )BM?  +5.ȷ '-& ö$?OI,  (* о6LTD   (' ǹ 'BSQ5  % 3KVK+  #(  ͽ9NR=$%ȼ/HVP4'# ½;QWE$ %̿*EXV='' 1JVL.)# &BVXE% #) 3MZR6($!>U[L.$-" 'DWU?** 9QZO5-$*FXXE& (+ 5O[S< /( RXK1".# ,GWUC' .-  3LVN4!1( 'ASTE' *.  5KUN8.(  $?QUH, *0"  +ESP;.+;MRH- %.$ .EQO;+*  9LRJ0 '/% #"#@OO>-,%(" 5IPJ1 !.& '&&@NN? ), $)# ؼ2HPK4#1(  ++½:LPB ,/"*1*ݼ .EOL7 /) -/!ĺ:KPC#(." &0,ܸ +DPN:2,.2%ö4IPH')2'*41湻%?NO>0.-4)ȵ3GPJ,!2(%12䷷"=LPC12!,4-Ȳ ,CPM3 5,&25$8IPF!,3%*30ϳ +AMN92.".3&5GPI)+7)(20Ҳ$ 34"".4*²1DOL0!6-%01ڵ#9IOB+4%)1(İ-AMN681#-0߶4FOG+9*(0, г)LL192!"*)ຳ#4EOE,:+#(˳ *;JM755$%$㼰 !2BMH%';/ !%д&6GN=69($#Ƴ  -=KK,<3""ڹ%4DMC.:+ ɲ+:IL4;6&ི !/@LF,=0! ո'6FL;7:*Ĵ!.=KH%#<3$ع%4DL? 6<. Ǵ(9GJ-"=9)" .?JC1>3% Ѹ #&5EJ388)" +;HD,<4& Ը  1CJ8;=1# Ͷ%$(:KK%*?:,! (# /BL@ 6>4( Ϸ%' %7HJ,&=;1$Ʒ% 'A8+ Ͻ(&&:ID/?<1% ¹ %(!(=G08=6+ к$!/BC(86-#ƶ"(#&;I95=90% ջ%&!!2GM"%:;4+!Ƿ# #9JA/74-& Ӷ "")@I% 583,$ Ͷ%$ %9KE 1>=7." "%#!!.CM29@;2( ѹ 2ED*893+!÷3B,8?=5,!ڼ*<>-@D?6+ͻ/;+8DC;1%ݾ04'8=:3+ ͺ  .%5AD>5,!ʽ(-%9CB9/"ջ!,&+:>91( ŷ $+ %5?A:3*پ $$,9@>71) ѻ !"3?B<4+ݾ *9B@81(η  )4>B=73)¸  0;EE=82'  %1=B=61) ɹ -9CC:4.$,4=C>74/&ҽ$29AA:41*!  +4;A>73.% !18>?:52, ʽ 07;?>964+ (5:=@<863)079>?:860# %48:?=986- !299<>;885* ʽ  *7:9>?:983(0868><886.! %465;>9775)&  0757=;6782$ (586;>95770"%,424<;6575* "" #.1.7=83461$-+1/2;;5256. ɺ #+ %.1/8>92265,ƾ,$',+.:=61362&ս %/ &&&3=:2045. Ÿ3. %&%,9=60154*׹"4"$$&3><3/274(͸02 !(8>91/360!㾷$8$-<=5/054+δ6<!!%6>91.252&漰:/".=?70/461"ٶ0= 3?<4/045-ñ>7  %9@91.253' ڴ3F.# 1>=5//350¬=?# &:A;2.156.湮'D4 ,>@70.264%̮;E!4A=4/0460츫%I?"(<@90.155* Ϋ5I.#3B@5./364"ÿBD  #:B<2.046.ܯ0K8+@B80/265&¨BL* 5B=3.0461ᯧ$IB *>C:0-156+ ̩7K5 1B@5..263GH" 9D<1-046. Щ4NA ,?A6..265$@K2 !7C>2-.361ݮþ'JF" '=C9/-055(¦ QC% 0=<2+,14/׬ſ IO8&8?8.*-24(Ħ4PH--<=3+*/30ⱥFQ=$ 4>9/*,13)ȧÿ/OM5!(8<3,*.21鶥>RF-"" 1<9/*+/3,Ԭÿ%KO;&"$6<5-*,12!򽧮 KF;2(693-+-1* ׼+EIB9+ /871,,/0ɻ9HH@6 &595/+-1.»$@GC;- +783.+.0%;6EF@7!!2972-,0.ž"=ED=/ )7950,-0'ÿ0BGC:$ 1983.,./½8CE@2$4962-,/*-?DD;& -9951../Ŀ6ADA3#3:730-.+ ž(-'5:842/.(ƿ+8BC7% ,79640.-Ľ#3>D>. #3:9630.'+7AB7'*7:7420-ſ!2=D@0"!1996420* »(4?B8) &497531."0:B?0# .9:7431+ ý*4>A8)%398542/ 0:B?2% ,7:7543.¾(2<@9+!"/785431$½!/8>=2% )597444.*3;>8+"".785453&08>=4'!)3975562Ž )29<8,#!+475456+Ͼ 17<;3&'1774573Ż +49;6,##+375368,Ѿ28;:4(#  )0674596ƹ*4895-# #+154369/ս28:72' (/463486ȸ*7:94,#  $,154369/ؿ3:<82(""*0464488!̸(7;93,# #,144247/ 2;<70' )0343254Ѻ&8=;3*"  #-254236- Ŵ1=4*" ,243111(ɴ .C<-! (2651.) ٻ%8CC8',474/)δ+, *5960' ׹ %8EF6$ -683+ ɯ,?IB/$187/!Ὺ2EJ=( +7:6+ӵ #:JI7# 0::1! Ǭ,CLC-%4;7)ܹ6JL<& *7:1ϰ #?NI5  2<:+©.HPE. &6=5ڷ:NN<% ,::* ʭ(EQI31;3徧5MQD+'9<+ ֳBSP=& .<7 Ǫ/KTJ3 4<)޸>RSC)&85 Я(HVP:" 0:* ¨8QWK3 !55 ۶#DUTB('5( ɬ 4NXO8 ,.㼦@UXH. #2( ӱ.LZVB' &+ ĩ=SYO6 (" ܶ)IYXE*  "̮ 8R[T<" !#  徨 FY\N4" ճ3O[XD)!#   ŬBW\Q8!!  ݹ,M\[I.!# α2* $ý0:EQSH80%%(Ҿ*4;FOL>3+*&Ĺ(58>HLC5+ -<6&ܼ#389AJH<- !+9A;.ҹ(369DJD5$.8A>3%.559BC94LPMHA6'Ѹ #39:>@5EQSOHB9* ҵ(9>?>4@LONHB:, Ṵ6BEB85HJLKE>2  )>GE:&)EGEEC@7%Ѻ!;JLA(BE?>@@;,˵ 2FNI1߳HNF=959@A9%Ƭ7MTHű/PL>12;?;+ް,DSN)ѮľNPC318>=3뱬 #:NQ<鯮FTK;25=?8%2HSB𶱼%ITN>128>;$٫ )=MJ >MNB2.289-#4GJɯ7IMD5027:1 -?H ͱ5DKI<22691 (8F4㹴-AHJB63575͵ # $1==$=DFB83343!ݺ$$%-9:ƶ;ACC;6665%羹&(',59̸;BB@99997-Ĺ&,,.47 ŷ"AEB?97996"'+-.24"ϵ @HD>74897+Ż $,0255$ٳ¿>LH@738<:0˽ #*0477-⯱¾4NNE:14<=6տ!)/6<=3'MTL@309>9ؾ%'+4<@8)ISPD6*2;4 ѽ%'*2HE&?LSQD0)+ʾ,3,*0;GE*:FORL:+!+50+.7CI ɤ%6AJOOB1$ "54.-5@I+ۯ5=FMPH9+451-19DC 18AINL>22640/5?Fͭ.5Ҹ368@GE=;573343592/57<).94255577˸0448@E>4@<4/265-ķ12124;CC@?60/40;01/027?1?B:2-12ǹ-20014;C5D@8205Ÿ&11//05='>A:523ź-321028:3@>9556Ĺ#142113;79><867Ź+343114< 9<:9<>ɽɿ.45421/.'778:<2"2555.%'# $44731/㿻 3561&%)) "24633'Ώ$4660))+ 46+12,14)濺34*'))+%5%,1-*03,24*)+*+9F742+(.0'߾0-(*+*+-B3-1'&,-) /2,,+*+!2K=-5-'*+)00+*))+$7QG$%(*(ǵ03,))**+ 'RP#!%(' ͵.2*'(**)%QS-!%% ٻ0+((+++FUJ!" ʼ*)'')*)!/QQ.$&')+*'?QF#'')*)!%KL, &()**%7H8! "%&(+* 5>4.'#&)++ *55/$""'))&+84+##())(:80$#!"''&) <>5)$& #''&,3D:.# "& %%'.($D=3)#!%" %&,42GD91%$'""'/53CI@8(#)3%*2426NE;,!"($>(%,1/-8SJ=.)G@01-*;WO>/ (" FA92*'?[T@.*(!P?$>3*&ʿ?\XC,*+¿$R< =3*&ý M\WE,+4V<;6-(û(T\VH/0ȼ7W?78.&º & T[UI/2Ǻ;W9(692#-/XYTJ.2ŷ=V8 "175(տ(,VWSH-2õAV3'48*ٿ*QTQ4.1DU/"16 ˾ DRRO,/3迷HP"/4 ȼ(KNNG)/Ի/P7!"+.:HJJ .-ǹZ`R45ƹ#13) Ͽ9N]Y&29 ,53"潿)4>QQ%-868+ȷ.14C? &20;7ٺ 62.0 $-!:;+:6-$&3=5̶ @:04.$*<9)ظ(A=2L<"#1!ܽ::,%==4&RJ-*6(78/»5;(PO8&:.:6+ƽ!071 KL= !81 .=5(Ŀ&+.#&DE;!22#Ǹ>7! +.$η=D6-/)4860 &(%к7@600 94/)  "!# о5<5)3.$>2&! /4)3623@5%%%  %*+46,Կ; 250% (-'ĩ+@B<(3/'$,*ۿ"0AE' 44*"+ü!'ר1A;-92$$ !(/?==2"$&趬)2/A=/ # ҷ$ =@:+ ¶ A@8( !䵵1ED;+ "&"Ⲳ#1GH>+ -' 䰮 "&.GMA, .+Я%' .GOD. /-ѱ&&-IRI3 ڽ#0,׵%*IQI5 ˹.(Ѹ "%%HOH4 %/&ڼ $%$DJD0Ƕ,0%տ &&!"?GC1!ʶ%/%('#!8A?/!#ֶ02'(*(!5<<-$$۵!2(*+' 168+#$#䵸1)&).* 056/""$$' -)' .,-54,##'˶%))$.-%$65)#"'**'//&45-#&!)*) *0. 48/$#!׼"))0.+.95&$ ()'*/096)%!&).0038-! #&''%0/!85(! '!&(! //*.8/&%'**0- 34*%" ()).-'3,'"! "(*%.+,1*'"()+--%.,*' % *(*#/* ()*("#))+-)$(')$$+)*,-*((*,&& ,(-,,!#+.&'*&/-+ -1)") %&'2-+ ͽ.2)!$) %&$+5-)ľ /4*$'+*, .7%$.! 05,)), -.081 +-/5/,+. 10296,(ɻ,511-/03382'+ٿ'6330227261-&&74424"3:-2-/. "76445/1<*/0+/ 77566/0<%(*,)0&7;7988,A516: к$%01")-7<@7168Թ $) ,-!($#1;B9/26ָ"&&)$% .A;114չ % &!(3 )A=1/0 ۹ $&$%&$G@(C>1-.'뺬%&()˾@S<3E?0&&$!(+,)OX>RWSPD:+ վ̷ !)-.!HXVPA2! úƷ$)4'2ISPF5# $+6:ABD@/ ̾+59- 0>==7& ƽ'7@<."8>=3  5CB=5:;5& ɽ7-(  *-7ALG41*# (- 15'81'!'2#.0134 18.'$#,8"#.016=$(3-+#%2: ),/141 41/+!!-9 ),038) 242'&58"-3655$68.")57.'.561)9B6'!16/'Ŀ)263') 5;/"+42,!065)#$'E9(!'00+'ǽ)67,#'- 10%%-.*)'ɽ070$"'%,9+%+*&')"޾"3,$!#+ *&+,&&(('/%"#%) ,-),%$&)& Ͼ -&"!#&%1.'#%()####%)12(##&)& ""$$/8'!#$''""$% 4-"#$&(% "$!%;*"$%'&! $",2%#%&'$ .:1&$%'&!  (5/'&)'$  $751-+*&"  6:40,,*$  &8731.-& 9=6584-"8:6993/,"=B:8>CD6' 1E@8;FI=/$>F>:ALF6+".HD61-+05;-ƽ;B4-/3=D<50,.288!:7--048;630,.8@: ٿ/?;0.147=82.-2>B3>D5,.231110116BE-ļ2;7-/12.,10149ECƾ&089./20)%-1:>BH7 !+9202/&!'/9BGJ6Ž*8601.'$(2>INI'Ž(561/+&$"*ON9 *362,**)($$=PK-˾6<95*&(*)&&:ME!¿%AE>6("&*+))2E<$DJG=-!$+,*,-62 3HJHA0"#+0//+(%?B;841,58<==?DB>8/%  (:439ROA/$!"ǽ,))25>NH;+#$%!$*%+9;AJA2&#%$ ھ &*#.=@DG8+%&2*!ε&("4AEFKL9( %77'Ѷ! .COH1 -;8' ɳ!"5ISD)"4<5);OV;"+7;5ͼ .BUO3#5::/ ȴ!'5IVF,):=: ò +:QN?%4>?3н%0DOJ6):@;' ɵ"!(7DMD+1<>0ï $#+2FO?$)693*м %8MN9'$/422*ɵ+CRN8'&.,03.6PYL2%&(+28 Źѽ 'C^]D+ #(.:6غɶ6WcV8!#)6=)Źվ0L`]A$ (5?6ɺ *@V[E-&2:7ɾ +:LUI9($174( +5BNIB4%!-40+,5IML5$ +485" и$2AOS@, %1::% ٹ(9PYF4 &48$IJ2LTL># #26& #һ &CLKE+ *.%'+' ̼9CGG3'%+',.*% -6?B90' !'--(ȼ#29=<=3  %-.,!ĸ$.6:?=+ *.-%̺%,4AE6*  '.-&&ö ",:H@5 )-()&Լ%2FGA0 &+'+,#Ǻ ) !*.10* 7U]R0 &,021& ҵ"DZZA" !)/211î,Q]S5 &-114% ӷ@Y\E"!)/242Ư,N]W9 &,027(ٺ 5V^K&!).155ɲ"F[[<&,027(彫,O]T* '-067ֶ 8V]I $*-15- ˰!>WY8 %"(+.33ĭ +DXP# )))+,/1* ۼ4GR> ,,/-,/-!Ӻ# (9B=85/& )25+.@E?64. "/81 4FJB72*'37#"8ILA40("/97*=LND5-&19, 0@MNE3(-78 #5BNOF1"03' )9CNNG0*51 ".=A?@9! '* #3;9:@=9;:2 !#&8@A>A>682% *;DF@A?58. /?ILB@?34' 0BMKC@@<2   $/BKHDBF;! &.8BFINK< &2=EHQPH8 !"2?FMTOE1  !$#5AGNTL=#ǽ  %&"&8CFJSL4Ǻ )&((%(8DGMUJ, ¶ !%')*'.;AEOSB ̾ !%),,,6=@FRM1ǹ !&+.34=ACHTJ(  "&(,109AB@GG* ľ)+ "&&&*17?EBB-κ &' %1,%#$'%4EHEC/̺.:0!"(/58+#!$"'7A<)ɵ*7:,"+1586("&..ͽ %2<6')169:4$#$(˸,7<1$&0589/ $"IJ!08:-#*1598* $ ̻(1<7( )17<:-!" ù'2;1" *06:6&*4:+ (.168."Ƚ  /=7E;1$ ƿ $1;0#)38;<8+ )59,",7:::9&  -:5'#/7:<=3  %.60#&282 '.5+!%-3:>8&    )291&" +0'  $/<=/! ,2*  (2@9+#$03$%  .9A6$'23$" %4?@/ +* 0$ (8@>$"!.# -;D>%'!0$  0<@:$) .$ (:BE=  ʽ$/%/=EI;þ22# 2>EG4 34%$5BJG/ 51%(8CEC. 64& 0=FKF& ļ73&#2?DGD %<8*$5?FMD(=6)$4@LPA .=4(&5@LP=/@9**7CQP<,?>4' *7CP+-@A;- )8JR"0A@5(*:MIN3/ ?E<.$-DL)6. $@A6)"-CB18.0A>3' 4F:247<9-% .  (.0-(0586+#!!$#''),!+-35/& 7=990&#'0,+01*"!78::,$ 22,*.-%59793'%:62-*+(ົ5976603732.*+&,67654- )2333/)% и455543*2+,243-&# ϻ 464322, 81.132)$ ̻!:951//HG8-.660%༽:<73., KP?-)081%༸ 5=<81*(TRE6,.48,ȸ*8;:6-LSF92034-˷"1::61&KQG:4477* %197'#>JE:349=5¸!(58&"=HF:338:4ø #*3 -7>=8239<.Ž"(-09;2-147;$"5254+',6:10(.B:30'#'08"42' ̿::8 ;DCAFE=.')-3%ؼ5AC> .7AE>0'&*2·*?C@ /8=C@6.$&/(Ǿ0;AA+.9:==94&!)"ļ#8<> .;::998,!%&ÿ&9;:2ɾ.=;85680%##7:76ȿ0B?84891*% 4962 +FD:3890+( 뾼8:52#DJ@79;3+)#Ĺ-;61! 0IE:8=7-)#ٻ:721=G@;?<2)"/732#DC=A>6*$ξ 133/5EABA9-",(233 ?CGD;0'( -23# -AFH@6+6%124 9CHC;0!2 +13#>JG?7(5 %.04"-CIC=4" )3%,12 &4FGB=41'*/4+" 7DCA?- 5 )27 +9CCE>'5 &061 ,=<7++(& "Ž''#A=97-!%-0$2 ÿ%49950()02ͻ4  #)99841252(-7 -28755691# 4ļ$/ 3768:;2&&-ǿ -,6899:6) ,$# ο(94:99981!!11((8:97;8* ., " ¼$7 7978;<3$6!û;46556;6$:#û 11"544574*8*%ſ(65234/..$߸-157310--1*2 163-,.-+*! 0 ! **!;-+//*+%#!$291+//+&)&)$ . 6=/+/.((+ & 3>1+/0)&2%, />:111+*515*#  *'*2$75&ķ(%5BJUQ< Ļ&>3"97)% 1CMWT/"ǹ *>)"99(㼶$.DPXS ˺,< ;9 ٹ!-FRWL ˿0> <9¶ "6JRT6 "46>6㵴9JRN!&.*>=0⳱ *:FQAڿ*7>9ů 3="»$(*<8!:><<2+%# ƽ &%790ž+>=:81-"!!Խ%%295%ͼ2@=:6+'!û%!9805C;7.!λ$ 8;5ù (:<:3%㼺 "/?;1۷ ",;:6+ƹ@B9 !%!7?91# ɽ9DCϴ"'''@=2)ø.>E1㿴'' 9B6+"ĸ6?Cվ &&&.A<.$ -;@'%#=?2(  !5<9&%9=1)$ ˹&1;=(&?>/%#!ؼ$/9<,-%FD3" ɻ&,4: )50&HG9#(*-41;2&DH<'+,,)6A1+DF=,,/++BB2-?D;) -/+"HH ,8A8,(#,/+!PM /4<7%%1%00*3UQ/360 '-43/ ƿ?W?.24%"&&591¼FP&*/-$*483öC8))( %,!38/ 7 50)$%('%15>D8.% !!(02ſSPD4  1 $*/&վ@[ZP7 %"(+/0 ȼN\\U9 ../55 $NX[Q4 $$23;2ۼ 5MUVM/067=Ҿ!@ȿ $ :FKI/"$ ն6:@2 =?B@#"!̴7;@9 ,A?<4!#$ ̵%7=@- 2EC;' %*ѷ !7@?4D@5!,ξ":EB,9D@4 +!+=GC;C?1 '&+>IC >EB2 )!=IB@GE5  ÿ14B?"BGE4 ̿8 2<: ,B@:# Ļ 3'4:58D@6   º%3 &152?ID8$  ¸,,(-/+BJD6" ⺶*1 *--->MI9 2+--)?OL?" DZ .$+-,:QPG-¯$%'-,2SRK5Ѱ '(--,+PRK2 𳬬-,-29 ISI8 ,/-.CBRI:)/1/-B,@QL;, ê010. AC0MH8,㭨&5321?E$IJ;, /8754 ;JGI<*!׼ ҫ*67722I7;I>.# ⯪*6<:*EK CE4' +AB;.CD'E>/$  Ӭ9=:0$!!ش3C=:125=4) %%Ʒ;>;:(881%$(#ĸ!8:;;+.<5+ !'*'!ܼ*6;<>@91&$).. ɼ ,6<>D"<6+! '--,Ż",7=A>7;4($,.,&ؼ(-9>@78.$ )/-.̽(-:>C"&93)#+/+#$39<>=56-#'--) ÿ%29<@D 12*!"+.,(ľ-6; &'(+% ־*5677BD?#+-'"ѷ 17868A?7$'&)%ƻ"388617>8 %#()&ú"6:951:A""*)$п.9<3',;<%+(#Ϳ1=9)%1?C*0,%87+&)7C= (00)# 2-)&(6E=#(,/,$ ++('+ ,.,' !>9*"2@:*.,,01>.%.;A ',-25>:**5>5%*,55' 57& &.85(½"(-93( *?2"%%*1.+к$&,:0)%&<1+(()'+*µ /9/*(7A6*'$!),ܴ06.+*&$DH7) %,& DZ+--,+.GD1  ))(+--.'AJA%%(!խ +./0-#DC/ !&$ ˯!,13." B2354-#$%  *;>3  '4523843(ʹ0;@;, )7634:4.IJ7AA6# .973793,Ծ!>B=- 2;727:1"ƺξ+FB7&5<509<-¶˾0E@0!7<40=<(п3I<(!9=53><"н-A4&;<45@@$κ 2A/):;46?9˸ /;* ,9:69?:ǹ +1& .6978<5Ƽ*0(#"18;:9=4dz '&($!39:;65-˷#)/)!4<9952+˻(41 !5?863,,!Ǵ-65&"4@<.,('ʺ+69-$4B>.)&&² &7;6!&1=<0 !!º #4:9,"(0:<3! ƽ  #.987# $).395# #(379+$',.-54& '$/7:8+*,-*22+ !+$#+4;C7.-,(*-) %+'#2>FA3-+)&)'⿽'+**/?HN=-(&!׶.2-)")?JPD1'$ д/70($%;MRH7' Ǹ+76*&!$9NRL>. &45-'&&3IPM@2 $-22-+*2DNLA6$ֶ &+221349CJA7% Ư "(267843>HA3$ܷ %/9=;4.4CA2#Ӯ $+;B=4--8>1ͬ""#*;E>2+*/8,© !%# &+=83&"!!ź2985'# (:?>9-$! ջ59:4'$%0:+## ƹ; *699-%&,7;?>7&"!ܷȽ /364($*3;<==0%" ưƽ%135,&'-@A;;:-%#껰ž,334)%)6HG=95*'#"޻/34,"#):IKB9*&&$#Ϲ $032##*@KLE1&%%#&/2*!!'1ELME.%#"! ־#%./"")GIA3*)'"Ǿ "$%#" #2?EE;4+(+,ɽ#$:CEF>4/(*1)#!1AHGB40'(33"μ##8FJF91*&17/$/?IK?2.$.64+Ѹ&5BJC4/'.46.ɵ!+9DA82-/24,$#0<;853003/(Ϸ #(556895/0*)&ỵ"%-/26>=1-$%+ɶ  %&'.4AA4,!!,,忸 $"'0AE8,! *2'й#!"/?D<+!&1+µ!.;A=, %-+Ӻ  ,7=8+#!$)+%ɾ '083*&$#%)( %,1('((%$$'% !&'#'++(##&'   # %-/+$!#'*( ǽ &04,'# &33 ƽ  #,1,)%!&47-ƿ %*+*'$)273    "&))'-366+ '),67660!  !(-;:742)"%2@<841.%Ⱦ %  8B=;631.Ƚ" 9@>=8:33+Ⱦ # 0;>><;242% (6=?B>454' $ ".9>E?786+  &3=GB<<6-$ *9HB>?7,) !3EBAD:-++?AFG>2,   !8>GJG90%-8ELH<5'" ".CMJA4)$ %9IME=/'"  2EJE>2+$  'D@95$!2==BD>;0  +?@=@B?<# ":B?=A@A3ſ  0@@>=BC;# ':??==B>) ż %2===<@B2̿  ,6;<=;B>' Ż  (159;:94 Ϳ '  !135:;84%ĺ   *246:980 ͽ   -347961%Ź   "123782% н % +2256/ Ƹ$$ 02142'п&! '3123.˹+,+0/32&ĵ*1'"-,04,˻(3/(+*,)ʼ'23) +.+++20!"*& (01( #$!+1-  #",/% ! &,%-+  56(&+$ 5:3##*) /<9-&(" &==5)"%$8@:1&"!#$  )9>;4,& ο 3;<7.)" +8<92-)  '4;;6/,'  -8<93.)   %4:95/*    $5:83-$  -7850,  #%,6530  *".344,  ,( ,56) */" .72  %1+47%  %11"$94 (!.3.1>/"!+. *02)6; (,4#,1/ );/ #.8.׽(/2+%'!1D>־#+11$ "$CD2ù!/3/ !  5B?ɼ$02+2;(º02&  +& Ǿ0-!    Ŀ !2/"10 $%  ¼-% 1(&2;ɺ$25$&  "0E<¸0;8  @MH?) ĺ0&Ƚ '99  >GFB>;Ƚ 7-  3BC@>?ο$ #9??A-־   2>CC&ڽ  '?C3%   >D0!,   == +#    4<)&   690/ !4901  18 ӽ22! 34Ҿ22   13 2/!   -302,   01.'1( /3/+('1% 02-)%'.% 20)%"**" !//&!'&#22,-'!!&#!!FB+(%û!%# .LH1%' Ϳ""(ED*$*¿   0,-3%  %!75("*&95*" *# %;6+&+ 66% ")/1   %  !   "  " *% # .6  " 3? &   :G0(/   0*H9 /3  >:$23 ľ!"6 3# 42 )<7 !0  +B=1 !3 "A@81 6< 7;97/$ ;>5 $0253)& ;AB1' !.0  - >@B?%22+/* 7@A9$609#' %=B, +8,)3- 5>" !5$+/! ': * ('  )%)%    #(&  ( %+* ,' 3 '.. :( 0'// &B/ .0 $0/ +B1 6431(9. 9. 1/ )(# ;0)% #(80   08+     03  #  %  74   %  +>4     >7  "?696  82 01#   ,(   (- +1,$"& 0' ɿ"7 /.)( ($43Ľ&<,+($,),(77-:7 !/)Ⱦ)*18:+77"21&'/9:!12(%15 ##9- *,- &/70 $)&/0  &* .  ") *   ' $  "" '6 #$0:6%  "+;90)  % 7<5'%0 ,- :6+--/7Ǻ 48- ') 391 ͷ *, $,83'ֺ/$#54+",@& -/ $$;@$  # /;<  392#Ӽ)2/.* (ݼ#2 74,)) (+ʼ1-/72  #%)'*".,98.'%, $,*"931&! * 5&*2!&  %$/! )%! 3 " 20+,  2+!/0.!'% ##-- 1-  % %% #( %4-%$% -1,% #$ '--,  ! *-+   (,) " (.* $ '')/-"   $ '! *5+   #"'64 &! !67 ,( ( 48) /+#*, 3821/).2 -86/ /2-11(698-4/43'6;<$ -2.52 '8:=%*1-36  &:<;7!(1#*/2  &>?;4 &0((-2 /BA<1$/''*. ! /DE?7.&(),  /DJA9.( ˿)') /DME9-)ξ)))# .DNF;)'')*+  /DNG8& $)+, !5DLF2!*** !":DKE/(.- "'?GIB.'1*ž#*8CF?" 1#ȼ%+5>?9 #1ƻ%)#7<<4"&$Ƚ&%/67+ # ˿&+,#** #  /9%%  $E@" )# " BN<&! ).PS<"'   !ASQ9 ''  $$!FNF71)# Խ! AJD82' ̹ *?@70#Ź4>=5*  "3,*#+*$! # &'"$$ '%#   '&,&#(' ,! %  '(.&%  #*' (#  * %!)'&  '& *  !(( (0 (! ,2  (%3* &' *8(" !1: &! ,9$   %# 39!  '% .72 +." $01,  **-31    !4'"+-, #%*-,   !( (-(    %,-#   (-)   "*,'  ! ',)# "&'*% $$*(" )&(#  "!('"!  !)!%)$   &! &'#$ )'$! $(&"!(+&$ !'' ((&$"%(!)+'(*(*'''&++(+.%-.'(/485*!&3-%)5951'/3+'.:73/&%71).<<42.$ 06.*2<822," &;5,.;;743*! (82--24232*! 69/''24561'! )92" '3434/'#$16*!)4443.' "6/ #+4201-)(%'$1&$)2//0-*.39--/"$,31/.+,067,'$(,,,,*,6>9#/* $(00,))/;@3/3%!#"$')+,3@C.$+' " )*,07BA "((! ',48>E6(" ""+4=CG5 '&!!$.9DIF(  $&" (9GKB# %%#!';LL9 "%#!!#FIE?'Ŀ&).?IKE<'Ľ$$-@KHC8%û# #-?LHB3% ĺ!"(-:LK?-"  Ļ %.2:IE9)" '47=F>0"!"ֽ  )8KG@1!(0.+'/7ABF>,%-+-) (139FE7'"*''*ſ'/+0@IB3%%%$)%ÿ(#&8HJ?,#&( #!0CNH4"$)#  $;KL<% $'& Ļ 3CHA. %&&ͽ )8CC7%#$&$!#/=D@2+'&'#  %5CH>4*&+#  *?GF@3+0& # 5>CH>71#  ƽ-4AMHC4"  ź"(;NVP6!  ̽ 5J^Y>( !$ø)E]^F/  )/# ʻ#@WYI7'&4. :PRMA/!21' ̽1DJMI@+ !263)Ŷ!5=HLK4# *374!ϸ#1@NR?+ $099$ ع'8OXE3 %37#IJ1KSK=" "15%"ѻ %BKJD* )-$&*&˼8BFF2&$*&+-)$ ,5>A8/&  &,,'Ǽ"18<;<2 $,-+ ĸ                 ʿ $+05899:9740-(! #.9CMTZ^``_\XRKC;3+$ #)08?FLQVY[[[^aa`]XRKC;2)!  $+./1236:=>>==:8851,&  &,12.*% »   %)+--* ʿ $*07974/*# #-7?FHFD@;742/*%  (3:>BEFFDA=4)  !""   "##   !#%*048973-%    ¹Ľ¹ɽ    ,7AGHE@8-  !,49<:4.)"   ".8>?<5//.,+,047:<<;70+$  .BR^fhg_SB1&!*5>EGE?5)%%&)-0343.' %.3661)(5DS_gie^Q@+  +5<=:4,%;O_kpogXF3 !*-/+&() ! Ʈ)17:5*Žɻɾ ˻)592$Ƹ+@NQH7# ïſ*E?/2=>9, $10-(*441,"%/-'Ȼ!#(,*&  )?ID6# Ͽ  !/;B=, !3<4&7BC7&   *35-0JZYJ-ij .3' DZ ý%@UYM1%*( %161#   ! 0@FA3ڻ +@GB1 &5<9,"  !,DV^[M<+-."ž4>;/"+148CNROD2 )?II?(޿ $4<7361----.11+   !1@?=5#8OVTF0(9EH8%.9?A<71(! &&"$1;<3* 3ETVSM?. #H_h\>!%  !'2?QO;  "*% 0JUTI6$&-.) 9/(%'&!  &@LJ9/:B?5#  ,CPRG823/()& -64.((#  $-4,̼:LVSB%«(-(*.* -@E:!ɻ 2=7, #  $66*'( ƽ 6C?+&.)Ծ  //  "  &9>3"""0:8%޿"%&3<=2 &8?:( #=OTJ?.   8JV^TJ?)6M^gaG&'20(  (5:8,/=?- ':>3 %65& $+%Ǣ(&#-(ݺ'?F8)23ḙ,796) Ǿ 9II:# '(% -J^aE" "3?:&*;G@, 4@?1(/-""*27,/6.%Icm[7"$   *97(%)!  "! %%  ɹ$Լɾ ϳ*. ɾ㼮+ $  [\P:*, (Ms{d4 N]P4 ,EMB%1EUN+δNe^= "4MW`W20NO5 '&8@-1>2-912KJH?$/3/>OTR7 =L>&     .?;*  !"-6+Ÿ8E8>A%25ǭ/JL81HRJ8(+ TXH" $& "&()*%&DNA!.bsCҶ2@=+ $-(!>G8 %'!)  #+˹*)$*"    " ,6' "4;   3D8$)!*14+   ) 㼲   ,&    ,0ۻ08%  %+#   .)- '."#.:9- ڽ$#;4 3C2   ,8H@ƾ*6-%! IZR6   &" #8D5!"=B0 #$ -H@5>;(  27&+,'8B0 16+ о";1 BD  $:3     '5& ((3D1 !-" #+-() ׽;G6   1- ( DYA       ,4*/)!GW@ EM- 1B6&6  !-3+@aR)ǹ'-  8. /@0 5VdFο 112%AaL šCVD 3:/L5 6G: Ҷ &70$DE" %" )HA &,)&#JS6  )8%1)$#!(*     5S9󯗷#+ ,A2'2ⷫ/%м#, 034SB 7I*:>0$":I4 -"& û &! $(" "  .#0!##  53*"15! 9$)$'!*'D5 (3.ƴ+6(#-$'# 4="#0&(( ';4     (*=+ !7) )25'NU< "" <9 ΰ,7JDֶEG% )   $!)'.ۻ 41ӹ '!&,+ +'  %&A4 ;9=<)@0    +,+>%# $  :. ,%  (Ⱥ"WL+A ߻H-䭵%+   "A2, $  &, -%&;-/3 '1=<)'&E;"      #  #& ((ɿ"9ݼ  31  -  ),      " #,- &%   *+Թ)) !    "  .+  22  &# -,  09;9KF ɱ 63 6')/  5DШA0$9) $% +,  !&/    !   ($ $ ) 6),)    *4+' "+- '$ &!   '!/&;-"- )) '+  (%  !         ! $.  $)$ 10) $      #.                     "             $                                                 (                                                                           %'90)-   ,<3.OL/EI() G&D6𶛣̛ $>,% 5$ پ&> 2' 36'>A)-H"&9"2ί»ܞ %8<'"@N&3 0F '=1%5 ؿ $D!H;%+#&%  ̪ 0#$3!%6.FUKKUU7",!ɱ갬ǨĔ5 8M ܻ.6 $DE"H!)/2O4;.ϳ$**)C4 )24!/'.'9ߪ೺+$,H:4>=HB:3' "&ּ㫳Ω>0+B_L0DabVJ#(6>9*"ͧ׹7''2-55:&G-!%1$+P>*-FR3ಮֹ  01*V]C3e? 'P*5$٬DZ'5" &=<57JC4 % # &  %-", 3E&&A;5  %-.**5)͔"&WH  09 1(. ?'<      #5E#2&9"& M@(CB ԚŶ鲲) G5%@I%?/_Z-3OM)  贃 %1,G -MM,GH%6<  #/"(!  /'& !򶑶 -P5 3 =Q$5Q7"*:F繹׻!G,$  !  " $2 ) .޿ &#!;7#*4+>7"1E(4 <2 ' ˭3Ac= XP rN 5W,,#  Ĺ+&%/ D33FI0 ,#)  82!& +ب$#- /&*3"&EE :K '> ' ' " 5& ?H6>)694!-0P"#,W=R^L+)KL   4 )(0  OP= @# ֯56"&$2)86,ȴAM1(F(, ׳ӭ" AI0%.0!&BK%ç559; ;);# -  &1 + L1D14NLJ)'!"/ 3 %4E3 # ڰ " ޽.1įVA88?+8X`A!3 &J-4 !8A_:#781-& ļ0BG: Qw:1F! #T?&)$ 󱓸+'4> // 0'* ҺE4  %1<8*9Ż53>,A8 ղ AN<׷ ;4  # ,!/& )<- ("- (18-!ø)/ž&<=, ׶$BH1)B=($*ް01jl&  $"(:/61A  >  6C7>8! @8%# ͣ %/=-69BF& X' 09* !" ϼ G98@#2*ɿȽī (9F%*NG/;0-$ 謾 L#.(5&N@<5 !1  &72ư". 24.6 $-   :GC  ʱ##)8& +.)@^A#   #* 28 (7. /,!) J1 CI վ O:(<:*E,!$!NT0- 4) 0B 5371.ۮ#&*+NEB3ɷ $MMVM & &  %1E7'& * # &, *&E>( Ŵ .@05""& ÿ +H-*>1%(J0  :J&=L-36 ("  !&    "6,!53<7#+3&,%&()(!$ ͭ   /70BQ?,=( ټ¥Я ( 7Q.-,8$  $Wd:( +S3  * ̢¼:ij>I( 'CS(WU+90$ 6#  & 5+&! ',4 7A,ж1)"7@2 # ݴǵ7#,7*  :6)24 #;3-02.0! 52&7/&  +VbH++R3.(4  8;/ !;I<   ʲ*4>JC+=M¿(,*1$)("-=/*,C( ' "%ֶ,-DEG6.52C!  +ɳƻ ".00BD.3>?0+3*  ,%& )*HiT40$C 51  "79>:3&!=C) /43Cԯ ο  TI  5 *,B6-;*  !Aɸ,0A"  ֯)F0!2 ѧ9K** 3M%8N=. ޸4 &%  **9K> *358.7 ڼ91  ! #1<0 0('A+#; <. ͳ¯"1AA43 8'4: 3$%,&  4ޱ (&-%.7(*,HG!/+  >49CFK&!+! 5D0$ ,#% 2˲ζ'64( E#8>(&#  $--*   ս %O6%;56%39  ! *NMLH,1:E0  쾯O*&.26>ER@:?  !#!2F % Ġ !)%%*>OO88L9#&* /=700EC<' &ܶdzθ ''3*0""(ٶ'BTP/?! יŶ"*;BL;1881/**$Ů!#*.+8JN< ,% 2 ,P<(14   -:67   #8!% ż) &1=#"¼3!+  *.%(4н + -)2,.7ȸ(2=RC)1'!1$  +! '1   *(CE%"%+ѷ ''$TXJ8"  );C%%9 "2A()ǽ=<(?V9'206! 2&.!?:$6A'詥   @qX90853,ګò$!! *4ߡ3)'K?(,WA*#%˴ &"0$ )$:K -%Iv]bqZ35D0飮ط׸ & 6<( @)Ǿ,(">1(>'*3"!$%ͪ(/A- @b2  Ĵ@>* ,1"ļ2$,(164 # %2'/3/+0G & ®'- /#K932"&  "5B ߵ5MV:?Z7'42Ȥ$]X?C=E5$+3' ζĸ=1!" !,>?>K6 A9%#(  50$ B1-I==@+4.;><1*8!ȸ-.  $&#9>$/ *#6,dz@;?-.Q7' ٷ((9DB8$! 0 QR>BH% ܯ#& 1+ᡪ F< #( !*bJ'չ .1#,A10 #>L?  ' ٺ &#'4;7!#띿$ X*;;˷:? 5{W / ʻA8"& F0)) .&3 #&&ȿӶȿ BTD< +="*[G+.* ,' '& !; )4& )9($ %0ι(/SC  /. !<85B7 )* *IF>@,&.<1&üԽ $QA)8? 2/ )%F+&5 97$!649<*+* 0H=CA02ʵ  6[.+6=5 R.((ù.3 '/*'*ߠϷƫ$8 )BA5%!!-$% ڲɻKM17B64,"; ,. "3,#  #;# 5+$/?1í7 +B4  ,:&!"#%  -8>CE< :3 !ڹ 謡4/"@9$ 3-4A3 緺 "H@.8 5$)@[/( ѹ & 6H   볣D- /2/% 74غ3)2G4<+,𿥻11 &)3, Կ2*37+4&$"5) θԾ5-=7)3 7 !,AG>9Φ BY9  /. 6((W"%/ /@ &E"!  #.(ŷ#(ʫ< )$#.C ")/'5H;=-Ь$ͧ辿 ɪ$9@>A6"#(23!5ſ &"0   ɪ RGE: '>)3S)%A0-' /#@+ ϶ <- !  3. 3/'!7!#4@. B5_V/"˭=E&.,l@,21O  CE"Ĕ  " -/EE- I7    0W4+-/*ޚ ū0L@ #25%6(<8Ʒ( +();3 ! /% *#ϼ( -4)05Ҿ3/ % ' E\8E0  Ǭ 4* 3 /%=;  ' '' >IREF:.4 " %\Y:%!! +,8(  '0F* ̺>I. "9" )/ .9 ˵ ##"'$-  4 (, $ +')" ( ,68"0&0#-< 01  $6徴 !!, . ! ٹɼ:"  %&# % 2%+ ,?  * #4.'?  # $ ;$ 04D? /  .) *&-&,    -   ,.GH"ƹ "5A0 )&/Ƚ.I+#" (' .),9A/ٽ"75'"Ѹ .:BCERS$"<)$Ű*7,"; (5 )! .?1ծȾ-; VE'%6E!+6) #C-(1?1,г#!"(3*)6 - 66 Į  ):5з%&/%8-"Ԭ%#=MJ8''."$.<5μ & -. #,!$# EqU>7K?0 *ū%=GQA㢪&0',:. $jI2;55! ̺-//K6>8*)ګJUFB=´ &@C%!%  ! +'!ӹ?676 !E8'%7'(  -l_2'+%9& 6$ "+>$ .# 1*, ?/ ü96 !߻ )#$4?  $ ̬'9 OK)9C? ա58CH=     Ŗ+1(-$* 4)/ "% 2 ѷ!(7A"(0'ɦ跹4'9I/(+I#)]V8#5$! #  ֳ-#, C??#>S?MD(7;?%갤ݳ,< /@'4VT&#'#$(2Źƹ ܶ9 6-#;V@4-&GM -  T4 E$'-/"B&9-!$  #U&4ۻ8,2KO> '*: 3, / ŷ$`I%8-*&6 )"Ϲ%;2I.('@%  ( '%>9 .E/<ް<8¢),>9/-(*8&# -1'5KH% #++1 &#! .&  #<5,+ &,.*! 6@:4 ,4 ' 8-/G; %0GD4  ʿ ', #!.*) $-% &$  %02042  !$'(#$%( "&                             !       **# 77"ؽ;@! 4 6* #(6*&(%&4@A=5'#?=/N2 2q' -H37@Ѭ$@R64F$ #+31,*  5Oa_M;- 7OT@8H (.5l.O9_#J4ή Yu@0!#:613&:WccR-F`N8: /:!-/W27,ۭ/>_A쭭<:  :QJ0&F@1-(D, )/ 87 #/: *-ݻ $  *8* )# "#" .*      !( &0#   $  -) 1-"$%= ߼ǿǿȻ˿û # /, F*ׯ"?ϯ9 ¸˨µὤӺȿ 1(6)ߩH1ɣ襛ϡťа³Ͻ  ջ -&   鸰颓С۶ˮijĹ' ߼#˴ ûҰãšнǰ͹̹ г 0ɷûѽĹų̿˹´ Ⱥɽ                                                                      ")&$$"  &JUC佳381 $& :*'>#C==2    />;*@ZX3CD6 (*>V!ƢPKJk,Ƞ>m4#!̽D\]F 'BSTA؝=l]&3M&̣"ZKYu&F~[%5 .3Ϻ5QbaHܨ)APK0߾)]f:&-C',* &F/ `zT;.# 1- ׮.DNMA&̠(?=335,齦 $*%AN)<='+GZO1'+¿-$ +BIB04A@2þ$# '" %$ '3* ?F3/23(""$#     ##!89(=4"&8B32DB.!$       " #1. &/#2<3,?6"1?6#+$'GH'6@5 $38.-.("%1:5 !& $     '%'>=$IYD׳G\J HR8!.2/(%+-*& "     ,93˻.V]>ǥ"YkMб#JS;082& $--"!  ! %AF/ϲ!O]Dٹ=L= #47.! %'""#      -6*#1/ &1/% !      #(           !       !% $%       "# #        !#   ! "#        !$#($ %$     ! %' #&     !                       '%#"      +=?- Ķ :ZZ:Ӳ*A;14! %%+12* #'(#+0) 1C@'ͬ0f}h/竒JT81C>#Ķ228ENM:ѽ+8>=92&ι 9Yf]?ͼ'15+潣?o|c)㪖%NO)ƹ%9@6" ƣ)BIP\d]C亢-Rgk_I, ů)PmxiB Ѡ:RTE0Ǽ-UdT.Ӿ +1+)%$&*)!ѵ6M]kskMߩ 8_w{kL$ȟ7Q`d\G$ɡDfpa?%45( 0CH:dz9UgnfM$񾖀 Geur\:Ĥ#RoufH"ֹ +ERM: (7>6";R]XAֻDbpkT.ط?X`V<%..'   " /:=5!û*AON?%ʸ"7BA5!         (//%&(#                       #( %          ///-.2$        )3+7?0'?<%       *- !=B-/C=% $"        !21 ,=:"')    %.)%*#      !%! #&       $$ "($   #$ %"#% '*" &#      #!$ %%#,+ ),& #&   "!"#*' !.0'%..#!** &% #   !$",,")1/" *1- ',& #%   &$ &,('-(&*$ "# "# !                                                           &        $         (& !)         $'+)(%        *-)'"!' !%*'   #)#"'!"  "#*+!  #"$#    ,+(0'  *"&  *(%$&$   )'    ! " ((   !   !!  &   $,#$      (-,+))((""  !"*?882     *!-*%)$',-! !'&(9<5'       ')&#((-%   $(&,322,/("   ,+   )/;7/6=:0  "42<2)3+'( $ #&&') $!.<7863.1%  3/0/%)(   "4.' 56;FBMF+! $0D?<::3(  "1=8'  0+80.'/$ +A>JF4&   '# 0A\Q3% 47)#,3(    $.% (2?LA-& .02($ 5 "  6F:6   %( $2;O]E2&03% &   %&%$  ,&.' &! #(&$  ,,  0.$$".# "¸ 575  :5%($6 $*&83(-1F?==1 2,/( $-1  ,; & ܸ@QM  0   +>2($+% " '/  !% +% 'ɰ &C>*;/ $ JB10! !,% ˬ 4)$,A 98?+RU2  K=꟮/ -#$,$6% ޴ +87@6 ʲ0(%&2%ƹԴ 4&0PP. *&B+4"5:NE.ξ $',+.+6  <5=1 %'8Y1 F53+% #F/1F( 9 !"F2! ($@', Ƽ  P@6( 7D#';S-"  !-62-/ $/A2%"  ,/ *:  +"3B- %: A2@;Ⱥ $282 5$ !,6  5  7  B3 , "76  3)  !,6* '-484' ư+2*#F/#$ 2 :6(*) O%% >' c>2)AH&ɼݸ )8*) :, $ .% RIۺ!. '!:B'-$$ 8!) &[ 13*%ð=<' 3C Pg3ܼ㳹"!AVV-Ϧ8H, %?2+9MM  볾//?#8 "8)9X? /*JS/'T)D!! 98& ' G" DǺ-$ 4  ".H+/뭼T<$,3,F B̿48?NT ' @3NC" $.+!!% (Ǿ 91 &49:4ՠPG995 ?G"+1, 5XT C4#,2/9%.(ٻD?ǧDK )O";687,DMV€<(S) D,З)[1!E:;Vl#7A-,O̙&(ߺy6n@/_'P16]9ܷ9$+6,kH\莓'*8>+I'+X' ?ƥ(M:(N;.ޮ!R) C$S B>#%( : &'l  Q* .V )$,+C) #/$ @$!A/׷S=  J3 'B0#=80BA 2u9'"B >%(B +P`گH: =&ҵ?: ; > 5U 6.e% )2Ap"G#;  lp'1. H #0 !0-  * 6.R> ɰ,$2 5SCAE/  59P02X' Mڵ.8& ZA-',F H<43)K.&ºjޯC$ s(/0 / l2 /LqICB _jT( DRX+N -Jh3o,E1=G%WZD+1*<(3 9$D<SCܳ'1( )9aMl8㯺 & -C 68*  !2g ;Ѿ.x)P2fM1MX[##93VQ7GW9<#4K9@Uon/\EI -C  32ԫ4 Eg,3%%U۞>kD9*!(UKJ(J:=. ,'. R'8^4- PS .)} E,Ak D\$' /\ 5Gc M.y7`#K $lQg;+*="r-8):#m,<$"ͷ _NՉ%$YKB5 .J0L3D$. ӭ.23ӼyoD"޵Oĺռ_IׂAO9EZ + G]N 9*R:W gT #bT Қ>N%&4A+#QQE  &+F'('&Y*D< p4 D!p*qL28D@60HQw0SV[E=j#2QQ1k(L]/c{Ag$%OGd.'M$&h $?@,7P&E=>U'3qý>2jئG$<C"6a?RCA9Mn) &ɢ](iߗh, kb 61$@VK ^\+<c`G<5@MߝErFJ, :? FVo2KoiTgrKL(!n<\'K4 )d J7# '7s0,@ٳ&*# .61* 9I;Cϗ#/V1 Q ! ^QJ92&83> F'$%Ye!`> D4VI4b ` =2 C' 0MT!C#p/-'+7E S! <] mi KԹ}&l nU{L/+E'8M FCh5݆'"?E>_Ϝ ,DS "gN0A.ӍL4 m6$3=3CiP-5+@EY ]4&$d * V9$@%WP$Ǹ,2&&!E<1;? "."PG6N(#& e).1 B7$4Q" ,9 -N8$"R ( &"4W1$)  ^*V; #0 J" .#'J'!X   2 + S &CT*A)3;.L! F@ qRF="H kF)4]NA?M 1B   0 2  2'?@0))/MdXN^4!5el :Q"}/;T;0t . D*H/ :.%0H6E hIYߦiORT#cx,WiB?\P77IMJ)GEI'4,?9 - -, F M0 d<c4l^t>>-"^;?%GB >,-^8M<97T & +%+/:/e<0:_ 9I 3*QND+D-CH}F(=&2 JMD0'0I /O$A/7 EG1-nU/9GN, R])m"3*,/Q<-28,D_&8//7 8,*< *+"<:0<3^8=" 9)4;XH2]GK*eXX)L,&AS Jb"9K=e4/e54XH/hIoV _(J=9k&I ;R&;+'GB&!;)G/KM "- 4  %   0    @< 9  5& ! " " 9", "!   ! !  #*    , %/ ,  '*   6 ; )+A 5 '!) 0;,"/. !L*35:?T X)3*<+F+'1+9 C!9C/M"N-y?_/(ú>07EIB55(59 F$!&@/\;k&4j/Cn9F6˼P4;QF;-4C;>.05/"5<3 %d3`"&^!QB"Ѷ7%/(8+ '5!H>" "-' ( 5  * *$U0):%"+I4(&!B ;( V "!+.#A/5&#0 16+>.")'5; )?$#:) $13 -" !0     $ &  ! *# $    !% !#&3(('1,'!6  $.'   . # )*: 1!# )  &0 ! % 6%'   $    % $  )/   $   ""#   -    ! # A )  =    ,2 + "0 &0#!!! &:- !      - #&)"$   #  #    '    0  *  " # *!" , $    ! 2#    ) -  ,  #%  # %*#""* %   1  * -"     )                           "      7 % !$   &!  #    $      % #$ $      #      "      +    !)& &   $    .    " !                    "                                                             &! &!;/,,(! ;0IB36Bn? W(\s$ "/$(羷ǝ읪ͮ\P0=(/Z\B߀Ѐ`&ހ!,ZvMqmW/5?B99!P/рs;RgI&qBdc_PV`B?M;5 E6}BL{\Tc_I/0?V`d`I3/0?vCH xmML;B 5?,"`sR_RI9!,iI?EEViwB9`E,Ǔ"!$(6qigR`m}Z?WincsgZ3jM5ggqgiI35ZTZn!ʍʪI!/ߠPRgWWqsq\}j\xsmMTW005?dM!CBPZ/,HsI!?B00+/;C+ ?j5CC`scdsxP\TdE5RRPn=wP?V5?/WMHI丽30 踰߉"?=+WR&((?PR?90 ! 䮀ذ;0 ˽ +!PV!+dc"E+$"!/!/$/ZLL3=&/;ECW0?C/63T0?!! 5 /طóǝглؤ˷ ߪ ЮЏ޷ŸڸǙŅܾԝ;;(6/ 3I$&5?IWqmRPi}gC660VjjEdR$?V`djBi}s{qcH+96&$!6;0I5Hs_36BHdI&!L9ܮ쾦ͷ C=63+35& +Pn(="";;!ǽЦߤì ⮬î н9H\L?TVIqqdq{jL`wi`vE/dccPR6\j0?dv{c05WZ;,/ +5 &HI!&&$+ǃ ˦0Ѕʦ?L3&E`(?{IT{Z`cZZgV0Ljm}MVZTj\cs_gnM0gE;?P?RE/5!9! /"&+3?j06mwwq}mssnH$3"Ю侠dzڮ誴øئʦ =+; "HM?9&6V=!+ ?I"+($(&C,R?H?HPWv{d\`n\Z{jL;L`_\_96`\;"&HL?L5"3$  (?5  ("0+;;ڮʷš߰/0"6B ?("&ǷгѦʒܾø÷䷮ô  &;0+$;I /PB +!+?;556P_PMV9,HPZ=MRTM?gB+Pd5 ;I!/$"0 9CE&$0 /(;(سêг "5E9 ;=6&(PVI5;PR5"/3/`9,(/E?$&5(3C=شdz߾߷쾤Ǯ˷؝!,   ($3&զ !, ,+&/+3;T_`ZI0`{IHv}snRHI\\LWv{\I0WZ6WB"ؾ$!=?;9/33&=50EL,0&,(;/"/`n\vws}Vicv\mc0+&\V0& !  &5/qM =;,ʳæ񾒜依êŝû9=!&9=(?TVc5$,LddM!;V3(093+/=((,$/LM\LW`dcL5\c!&WI&"&;L9&ǽ!ԗ &+&!+/LRIL`msIEivxmd\?BI_i,6WZLB&!5(!(侗ͷ/?3&LsWT,&?m\Hic\c?is\VdR!&qR + 䦬ǮǮޮ! MI!+qm\}cTwxg9TvM;6""+656$ &0HP0&;LZ"LZR66+"P}E5!˽&!Ǭ " & (, ߾à˴3 &0Emm{VVRB/`_PC\vcCTnBWwnvmMi}_d`nT\0$!&TcE خ䷩쾀ǰ($0WE&3TPPؾѸЪԳзСԷê˽ ;0 /qm(6qsB+3iZ,,"=xgHWxg\nc!6d9  6( ! +R$&iwT/?dM9HmW3"55+( ةЖ񾳪ʪǀ߾Í  $/M5$&6IHCMc=isH`qsjxwsE`vvj0 $((  ةû뷳 аԳʾˡ$!"3(&&0/6Zg0 /qs_vsL60EddB"6=!+?5"?,$5" ػ誸Í˳߻Իžǰ  39( &=+ZH`md=6\WZmnV3?Pn}{nv}mjdjdqxj_M;V\CVxcLCB$&WB6B 0!ʳîѾо! $! "+E($&(( ,= + &3,! /  +!߳ԾʻئûæڦԾծ䮠æ 65!HPHL,&mi_\xwxs{{T3?MTjB+BԤسշ߮ (3;B9Pqj9!?ij=5H;6HL3"+˪Ԧʰػŝ߾?C=R\\RECdv}}{V`mw{xsv_\vsZH;HWdmV5?96(6_M3&6WICI55M9&IWcTL9/IELvi=!&+$/ &$ظԸ辸خ0ð˽ԸطѾ  ߽طǸø3,(((3Mmwx{dqnm}w}sx}s}{jvwjVE666LB 5"ھųо!"ǩ˦ǝʸлʹʡܾHM$,HILE,$`sL;PZTHWvqc0,gsVZcL\scV\ddn{gPTq}nZ=3?VM5ǝž+30/5&0!  "35+CRB6B!"$33"&R0 & /;$! (C  "&3CI;(+&HnmiM!?mI"?m{ggcqjIEVZ\ZBMRÖ,   36$,5,,6BPC/56!  6;+"/3!(5=?53E0=3  &M5";=;9EC+ +?EHLM5/?I?69T`TH_gL!6HB,&,09?;(";;+"&;9$$ ",$  ѳŸ߮55I96BLMHCLCIHTVEB3!/9з߾˸ھ /!&5$5Z; ?L0$?H=5/LC33HWM33(+?EZWI6"9LE!/9(3060&I_B"+?0/PcB&,;0,! ((,$   ѳŻԻ !  !59!,+ =0 +/  ˸óŮ?Eذ  /$39(5PP=6?BCLWTPI(/igR9,53;++PdZTLHP``Z__V\L,+MZC;?PB6Eq}jTMMVHEM_cMWV0 VcL=EB$&5?,վ(&,HEBC=;?M\VI5330C9/,"9ǽНؙ LcB?RC90,=66WZ=EWMCBTnRVdmmWTn{nqsv}qRP}c&=TWE(/IE/0=E93!&0$ žǻԻÝ &&!/6$=HBPV9!";B3/+(($++"&,"(" /$ &5! ܾʾԻǻ !+3(6MgiLCIZnsqmgZ\vwwVVqwjqxscWiwLVdgj_ZisWdcH;T}jmn{{cVm}}dc\Tmwj_gsV=5;E?+$"ЩǻǴ߾ ܮվ÷øųԻ˾ $!"?C3;?5,"/6==,!+?5!,6?RiV05?35\\MWi_HTgdZing{wisj\i}jZEELMI?5;H;59$$36+,;9++/66$&(PZ5,+(;L=!ЬھôûŸؾ߾˷/( ""$&&""3(!=\E30390"&3, 6=$(+/366""( 30 & +(&&0(!ЪԦ ",,!(,""/;B( &E("  !,$ 6PE!+59+&/$! (&  Ǯ  ,  (//++6;6($"+($,9=3(/CE,!6C3$"   ",6=C+ !&3CB0"!/HWC"9LEII! ($,=;CH;33(/;W`TPLE6Lic9+;IMV_ZMC95(6H0!"&&   ! Űŷ˻ ǻ  $(+5(",53?=(!&+$$ $(&0/$" &+ ( ?=/,,,"&;I?LW?(3_}wcdsgRP`x{qdVZZZimi\WZm}jTECWdV90?PPMIE90""9HPC,HR=0/3;IE506?, 00ո""6=! ! $!& ,+ !$+IL6;CBEdcTMM\ZHEg}wgZW\RB9Mv_9!&?MRWM=;IZc\dgVTVgn_PMTR=;MZC0CT;"$,=C0 (!  ʸô˾Ծųھûǽ!!$"5(&( $9;,"CLBHZVHHPRHLC;;6?E=3/0( && ; $$/99599=EPTdmZT\_WI?Wi`\mwsiqvZHIPiwjgd_ZMLLRijR6CWREPL;3=IPI?CE96HTR_T9CE=(&0( ؾ˸ýý˷  ($$+/+&390(,!$+5HB$!    Ž ,96$ "& ";( (,+"0&;3(?dncRPTPHVc\EERTB3/5HE/ ô  !&+ ,?IC3&+EW_RB;HWWPLE60/(!&0?; "6$,535EI9;EMHEMW_gd\L9&"/3,   ˾ܾؾǾý  $&,/( &90&$(0;9====$&/&$/, $ +,(0,$/99(&,$ &,$         &/$  !(&3,&,! (""/;63+!$,/;9$!$"!    ($ !     !!$"(//5==CB=;60+9E?& !"   Ǿ  " "$ "!""   "!"""      ϧzq}?v}IoPtsO{o{so HotDMoMoK,%պC K=coxg׊cs%n͑) "n [jze}n s}s)}lqx?ss:$ctz'ovoItsDIsn\[\:M58%  ɬȑ޸ $).17:?CFIMPTVY[\`bceghhjjllnnnnnlnnnnqontsgotot}xnx}tq}{zv{zvxxvvtssqong\RI?7.% Ŀ "%),0378<=ADRTDIM\`P[Vh`nsn`nqsoxsstnolqq}}xt{xoVtx\+hlO^nb,"[OoeH=\='?%%  ÿ1 "%).3HW::FVAIV\FPY^VnooonnocFRho`nqqnv}vnszslv}tns{zoDottHovsnqqoj^bYRHC:3,'  ɛ׮ê˒ϧļ "%+,05?no5AnnnoqY^onnoo^OtsTnsqotsnsqonTnqnHOVDqnCVg[noqnoV+g\R"858F"㬷ҳФͩƝļȿտ˷謬н  $',5:3?DC[YYRnj\hnqoooqttosxvqsxtttoqonq``oqolcRbo^K87bH .3   Գ׳ɸ˼ତɮ׽ "%0+1 7):0$)%M:5=1P%%+$"?Oe^V^osn^nlIYFW=KD?:MO0:T[MCOH=McMFK)DTM51 ,87+ +" "7 Ƚͱ׳ɽð˺ ) 5 )00'<<% )A35D5$?^P11<)$333.0+8,"+'),+,.?F81"$ $.?<5?I+ø,nnW\& T ٮlaMCC{ $.l߼Lj}}lѸ!ߏ)x*@".8T $Hf ~ ~}iE_1W1M8  .@"2Hø,)Ԛs1#'\&#$JT  $d@kZ}i}i^H6-{ &8$#''@"{is}WMMC8 _isiWE3ɀ,n!3T JT C &C_ 'x*)#$J iˀdHֶ s f\&x*\&$. {_{$6ZK Y[SA+ 8{ MCfJT C1EsM C qq8_CC sal>ødH߼O8.q8{_i1M8J \&\&#. ݒd,nddødd ;8 qqqqqqT T T .AvOOV3RE2i11MT J 8_iM &T f'6-' _is3ɸ߼øøO $. _&  #$ J MWْʜ,ͭddøøOq#++@" _ .qqq+d@vO3RL=x*  siT  _&s};1M82!CID/߈ vvvvv!øWT Jq8& .f CM}E ǀ,ͭHdEiq'+8H<2#&&C$JT T ..:d@A=n56-@" is1 _&&& 1;;s @"+8LT3RE/fM}O3ǒOO͸Ůs q8_ C8 {s;ۈՒZø,ͭͭΚq'4+84) ۤ8 {{{ 'n5?EE?R1 qM&C&&&&& 1Eۚ 4!C=G!C9.f C1)3ɸZŒ Юǒla&8J@")x*$8i C__&߈ ZŒʈ՚_T .q iWM_& C$x*n546-_Ms1M&C8 T {C8.@"/9=946-@" _i O ҈Ո)Ԯǒ Фٚ {T _& 1E)lllшaW 8.T {{{{{{ {{_& M M .ff _& &C{ {___{ _& s;aa;sM{{{& &C{{{{{_&&&&&&&& 11M&&&& C{ .T _& &&C{ {{__{ {_ sW;;;;WM&&&&CCC&&&&&&CCCCCC&&&&&&&&&&&&&&&CCC&&&&&&&&&&&&&CCCCCCCCC&&&&CCC&& &CC&& &&CCC&&&&&&CCC&&&&&&&&&&&&&&CCC&&&&&&CCC&&&&&&&&&&&&&&CCC&&&&&&&&&&CCC&&&&&&&CCCCCC&&&&&&&& &&&&&&&CCC&&&&&&&&&&&&&&CCCCCC&&&&&&CCCCCC&& &&&CCC& &&CCCCC&&&&&CCCC&i &&&&CC&&i&&&C&CCCCiiiiiii&CCCCC&CCC&&&&CCC&&&&&&CCC     "16-$Ͻ' #,DI1 $ !! #9#);GGDOZHμ $ /97-,1,>]]- ú $* ŐGru@+++3F^qiG$,! ղܭ0(Ⱦ!%*(#-,2F>49;>1κž4-׸!#2=1((ǻ ">?C?3'Ư /;1   $ .4! *- پ "$'##-$ ,LS=%!)39>?6" &A9#  ,9&ٿ 0<.&ɾ  "/)8C3! 8UR=22-$$" ο  /C=/$  /6&   4:70(%! +;B:& Ʒ  !,BUUI:'&ǻԻ +3-% !?<$Ծ 7SK.Ͻ >9%02 '0!!1/ Ͳ- GfZ;'0)8#Ų ɵ4 "#! % !%"  *#%)     "6- !ο              /2 ˸    /2 %/"%2'Ƹƹ  ' 4@4""'74%  ̮7TT2¾ ''/ *4,%E< ®̥/E,97 9YG%츛 7 %9Tp[ *ݮ'"%7 4'%@OLسƴ,7 '2@'/<' *E@ªӾ 42 ݩ*% ڸ ؾ2GGT[, ¯  4'%'7<س ˳*9*%O@"JQ'dzй'% ̹94ڹ%9LBس ''*"ڽڽ2* %9J'ƽ%"%̸ "  22 Ʃ "    '4/9J'  Ӹ  ,/*7̽ *2  "*42','"/B* "  %  /9%    ,,7""/<ؽ7Ӵ *'4, *'   9B ®<" *G' '"  " 7E4   ̾//,2" 94%LB*'ؾ   @̮%''**촴/<7 ,,  , ' %  BG4,4/ *% %  ؾ % ̽2,  '*7 ¹ 7OQ',* % ''  ̹ /" "/*" ,9, ½,J7 % %'4@  'д + (&05>5 +´ 04&-5! !9B( ¹ !!4 +- >C( خ  羽  (0 :QC( ! ݞ(&4-9(&M>ش ! ڮн0# !0(L>   #(#&      !     +-        "&" :I,  ж +:1KXC  "ï2F(&#2$ 5S< 3B6&&Ħ 0O5 %1AB$$E6ʲ.& ɶ+#켲+>;3'ȳ#/#8@'  ܽ'9, 0<- Ǭ+>>GC!'⾚-+*2+$))!!ͺ/;) #( /+ 迠7Zqa1ڸ   "5LD(ü   #5,58@N>($!  '"%&/O`SB'и  'ҵ !+ *:1.%մ (  ݴ'/;3 ˥Ѧ ',& . "%5 #5< # !1+  '% û  + 2+        ("    &"  !0"         !!  # (ӿ 0  ""       - ')     "   !   '      *ϻ   &           0$ /+    #  ,    #!   ͹#     .D@   '* /;0 )     (62, ) !Ҿ   /. '" ֹ.& ׿## 7(-     뽽(  3@'#)    #) % +  "  +#&  %( *"                   #   +' $ $  !       !   !( )``Ѐ_D,3*AH9`$_xH;xKG`)?0H耀 ̬ߴS0-/f_Tll`0D'#60/xS**Q_/!EMQuP]kMuYoE#]{kG?]DPYq_/' h_#?A';;!#Ӻ٣箔ƣƀ 9EB'lM8Z/-\u/Eu59iH9cADiVeu#-\i;!2-NoQ95/,;6/?5/ !)  ꫮ'/ -< DS9 -f9*G9DSE/\9JA9-Y?-;-#?##'  ߵǵǝә;ӫ #89 8-,T\-*>98Z\-8\T]9KE-8;lE#8Z<# #ֽӝؽ꥟ƾپ& DP! 3H\\0Zx/8P;u\/8cQJ98MM8e\'9B-,<3 ! Ǹĸ֚Ǿҽӽɟ- -2$ 63!68 2!,,J*!#- !$!$-    ! Ӹɻ W, 6]>,!?>ES_,*WkN0AY,*kB2keJTBHKQ, E;$$!Ϯľʾծ ',3!>HG*-, # ,!*>2 *, A8 '>B&*<'88 ! $̾եʸʾ  -#*6  56*& 3 3?-$ -! ,ľϲ  *, *A  #   '0*& E<,M6 'Kl6 DY; !!;, ;  ;- / մ᫻ʩ $),!<05*?l*-9JE9NAA#)&JAGSA5TA $ !?A 뵷Ʒ᫥'K'')3`0)kuAGfK9qfHTZ?J\VAMMeVB,&5,AE>*!  ̺֯Ơ 3* )3>`H; )? 696!;D #!  $$ 3 &   >/#9 2'*  ķ      A !'/!  /3#3)!  & #* $-   # 2)  )$/B-!-!35 !6A)'0'$     Ͼ ! !* 8<       , 0,  !#;  -)&!&;&6' )2&;&6#'     !'           #!3         $             $   ?3 $D9!$B& $29&-/$*-* $)!  ۾ҵ     9**-/& 6<#' -A*$23& /,$'0&  $!5/ !$ 59$$/*/*$*&'**B823'$55/ !    #$)-*# $)$          !  !,-&'* 2*0)$ )&$-)$#-,-62 2?-,2-'-!$#-   ־! &#! *#&!$,*# ! ##             ,#    ' #&!$ $'## )#,//;# $ ־  $&&&3*0&&#!-'$!&*## &#    ! #)!   & ## &!&)#!##  #     0'!#32'&&*,#$/,)/9<6/)& 6GG8# )GB) )' !   &/!!''$'$$ '>3!-!*6& -*  &$$                                 )  # !    #)#'$!'''!$/'!!!*'                                                                                                                                    = ,CH!!/ !'8"UW=c=9FƕeT=4πe`〩#H5→qPрeJF Ƭ J/#> H/ì9(  8'OF¿>EC9o,' PP'OuF5a趀HƀZa>(`̀Fl4zK݀Cݫ">H^ҀU"݀.`l.T`e'1=\(P="9(H'9A/:#'=Ѭ9!.9ٵ.,HجK C: FJ"(l݀APԙAAA>AJP9= ȑ.F>'F (U>'!*!CJ4'"4*F/,(' Hc4!>Qe4" jp:Q8UH! =( (  #*="Fѿ,P:!85#"\K("('4'4a.jcZuH薶:^`"jZKƀ\l/CpK^ FAƆ5H>5ҝEkp^"ћ^ C #/9!A/,:=Kٿ(k ÝJ"AA>(5*(>,('O(:8̯1:!,`̺K1!,/g5"(C##'"!95* :""=H"'ٵ*> #!5' #" 451*/9:""=ݫ(15            ! * .*1" #!8  # "  *"  " 1,:1#**, !       (!!( #/"             '!                                     '      $   !!!"""###$#$%$%&%&'&'('((()))***++++,,,---...///0//03319+C   !!!!""""####$$$$%%$%&&%&''&&''''()(()))))****--+/'9!  !!!!!!!"""""""######$$$$$$$%%%%'%&($/  û41,51351** !&,    R@EJDKG?L  &²   PBHHFJ6N Ӵƹ  (QAJGD4F+ĺý&#"%%&'%#" .cU[RFRM  󫻞 FS6NW]  #!    Q769^1   "!  0@0A2    %"  M/8B  ȹ   ( #% (@P  Թ   R && -QF"  DL( *IL1   'J>L  %KE  "&IF8U  .Y    %4 UD  I5   $).P?  ! T    %, DL<  $A !$!"@ QF8 &    !&PDFK$  $ڸ    !*O?P>S    ˾"   !(DW !     +!$  "_! DIBKFQ Ͻ  #    T DJ@NAV Ӱϼ   ' !   D DJ@OAX  Ŷμ 4 $"   #$ LGAP?[  ˽ K  %  !MECNAX"!     ƿ ]   " & U?GMBZ%  #a     /,Q@IKEX"   6Y.$   " >M@KJFW   Ҿ IJG# ' JFEJKHX   2  ԱҽY;V "     (Q@JHLJV':  Ǹо 4Y9[$  , CICKIMLO  -5 MN@T<    $  S@JHNIRDʵ 3.'   1PFKJR "Ⱦ 7Q?OFRGZ,ٲ #2,,    PHGPDZ + PCILHRE^ݽ-,,2    &YANNE[.д-4   ( AJDOFRHV<Ũ 2'-3   " GNEONIX4׶¾&34.  ! X>MKJPM?(,*+1   "ٶ;MFMLNQL0ٺŶ44,;'     #?Q?SGOQ#0鷰",+)1   ̽\O 'ط65 #  IIR--&+AHEf" " %κ $'* #  IX4"$)''@TSO_I ƿ*#+   A-/!,0AWNV\f^  Ę  !((   7544;RRXda`p ܣ 0  <;-747OV_a_fIb$ ! ӷ +   $sB)>2JcYcYIXL_A $گ    4SF B08IeZNLSOUSWY %״ (T=QF2PWGNMNSQVXRf %׵ձ   Q?LC S/IPHRLQRUU[Tg4 &ָݸ     MI?T7  =@PKNPPRSXU]VaR (ѹ     JGGGQ;MMJQMSQRTYV^XaY 'ްϸ      CLBNLD ]GMQNUQTVYZ[_\I &۱վӸ ϱ緷   3Q@Stj$!VKNQQTSVWY^XhG@! &ٵſ е   %TLismuh UPLUOVTXW[]]a4D8 %ֶܱ  ”  YYsmow^MVPNVQWVXX\\cH6DF &͓ܵ  뀯  Tqfti{\JNTUMXQYWX[ZbY5E;N  #孨/     Vx`ujwbBZCOXMYSZXZ\[cC7J8Q( $&# ˌ¹ Ixbpkw_IN\&PZLZS[X\ZbS7BD@I? %؀.     -4nkhmrf@\9PK]N[VZ[[\`=>D@GAR  ֊- ҉ !    5"_scnngDO;9O׶ I_M]V\]ZbO5F@BI?W  퍞)"     -,'CtgiqcH?<>@?! E`O]W]\^_:=DBDHBS5  ,( 厣 2$.+hpbrd?:cR][\_^9=C?GCHJGW  ˄'&!(Ļ  +++-mlfm-9=:=B:P  #;gQ^][fJ4E=CEGGNE[! 䋟.!&/닦ù  */$Mrei05=8@;E:R!8gR_[^`8=B?DCJFNFU=  )&"%(ь   3'+inb8/?4?<>F9W#4hS_[bO3D>BCEJHMKOT ʃ&$#$*   2#Buc;/<5:F9Y%5eW\_^>:C=DBFIJKPI\퐙*$$!-    5"Yw7286:8>??E=X %$.gXZdR5A>@CCFILKRJ\-%'* Ȳû ! --pN#?0:79?>CADR# "+e[Ze?:B=CBDFIMISH\4務Ͽ("!( ´ĺ  Gd#874;6II&)fZ]]3A??CBFGIMLNT0-."& ꠿  W:(=0;69;?>C;O  \gG8>??BAGCL8,&+,*9臚( ¶ûƵ    !744:7;==?A>L $  ?p89@=C?DBJ7(&)).'<ˀȾ ö¼ϴ   " :398:?;A>BG )( 7R4>=@@BAI7&"&*'0'9ƻ բɳ    "&:78;=BB#%#*),.+=ѻǿ 82   !' ,*<8>;B:L"" "$#(1;,>B@&%#"%(*)0(A늌 1/4'õ  ! %& && $@:  ""$&')+)4 /"#%%#'*'/*5$Î !&"*&C ٭ý     9488<8M:,* 4 -( (  "#%&)(,,-0."" (%%*(,-.6Ֆ $#'&,>۪Ⱥ    73698<:KK%"40''-+!#*   #$&')*,,/1)$# &"$)(*/):ڳ!$"#*!6)Աƺ   92577;;>FV4$1!.)2!+ !!$$&'(-)3)@f&#&$,&1(9̗٘$!&!, :ѷ 433669<;>FQM2$(/*0,* "!%$'&+(0+4]>E *&(-*2&񤣰Ү%!%%(&3ӷ  141659::?;GJ*0!0)/.-*  #"%%&*&/)9j;DN /#,,,6$%!*$/#׹   (6/64899=;B7 4' 2$)-+/-5$"&$)(+-)dE:T% ,&-(8ٟҫ* +"4޶ƿ   6/35698<9D,-+2 1$+-)2'&#$(&+++nH7U($&  &/#9鴚ʚ (($8ľ  ,4/5588;8B$".2$ ', 3"8&#%(&0"`Z-S6$#"+ &+-)ЙԻ (+":Ṽ   5/355898@"!'31 4!-%6($(+$eb2JB$!'$, .2ᰙլ 1!: +4/64787>!$-90%$8 *#-!Qq9@H,#!$&&)*  Aђѧ %*0 3115477; !$%8)!.:%+"XmI;D@" '$)(,* "稚Ҡ +1  502557:! $#+6 -%,(!EqU?F8"%#'(++/.7 ܊¾ԩ "&  %(5039 !##'$/ ,@]OlD:BA3""$$'(*,-3,;`   ,)6-; !##(&)-$SQRa5B>D+%##%'(*-1.5/;頄 +' "&'%81)!#%($.$ר =1VWH8A=E$%$#%')*.004-@ a( &%&("8*  !&%')$8Ƣ 74.@Y4%''1%#!(%(+Ӻ  ID?K18&*=>?E'%%#&(,+///:𕀖̾ FG@KD 583$-%"'#)#ت M?@HAJ>,:Xչ 7570!+ &.˰  F?@EBGEG9=@F4% #%'+(1': π  IB?HBGDؿ .:189 +%0ìE?L=' 672=+*$#0޴ ?@:D?EDBK0 *1EDBDBK)!,+PM@J/(.ھ 53191 &/'0$ԯ 4A3A:AAADCFE %+%ASUYM"#'''++  (%&$I2A==F1!#2 -413:  .,*2߻/B3@9??AADBHA'*'5QZSaC,&%5 󞾶 &"!")E1A;=D/$%+ (4.351  %,1!Ϩ +A1?9>=?AAECI?(*&7RVYZ`0#%4  *$ $H/><:F(!"&$ #5,5/:   7ڮ  B0<9<==@AAECJ<*)'6PV[[^P*3 Τ*##6-?7?BBFCK:*)(5TW\Z_^8;/$".)*9:>! &1  2+01/8 ԯ߾ 4"-,:;:>>@BBFCK;+)(8QZZ]]^\ ,!"  .b/&.-6 ! '/   0)//024 ǴкĨ6 ,*+/9=<>@BBFCJ;,)*CRV^TdO  Ķ+$ %VDMJS!##"* ''&,)-.-4 ƿԻ1 ()(-*.,6?=ABBFCJ<-(-MPZYYd   ӣʲŶƿ)# LICQ;0  !%1(#%()*,+0, # ӽصν,!%)'+)*+.-8?=B@EAH=,%8MK\Ng4  dzȯ(% S=EI!")!/  !!&3' '%)*)-*3 #լμʵ+"&$)')'(++.:<=>A?E=(&AIQO\:,+  ȣ$IDC5+!&''1 ""'!/##"'%)*+,..4&ԫð -"&#)')*()+,-3>=>B?E> $5DIOVM."-'0  ƻÛ'CE9$&$'**1$ )12&$#%&'**-,1. %ȧĺ'"'!(%()*()+,..9@=A@CB!(BDMOZ 4-&+/(Ҫ˷ȷ%CA! #%&(-*2  " (:< #!$$%'))-+5!  ҽɿþ)!%!'%'()+)*,,/.3@=@AAF!4I@NY(-*&),*2 ȹ͢=) $!"%(+(1!)F5 " "#&'(*,/ Ϫʻúٹ$!& (%()*,--/+,//1:?@ACD/AFCYJ'%$)'+--01 ʿƿ#/! !#&(,*2" !":?:  !"$&&*,,/ ĢҸ"!!%%&()+,-/-*+-.2>IA==Zg!$'!))*-+2# Ҳ˽ʡ!! "#'++0.3)! !?<=B!"$%')*/)6! ֭Ƹʠ$!"&')*+--/.,,,.09=??^F7?ZYWNRSRRSTNTQXJ*$# .ҷŻ !.../6XWUNRQRPTP)638("!!"%&()--/2/=׹Ȼ½ʿ !!'9;6D[UXZOPQPRQRSRNZ:(9$,˻ǽ׭½ .8(--@MOZPMPOQNU,+:.<*  ""%&(+,-0.0Ǽȿž  &976>NGNOW\RMPOPQORQSR.-9+ !'Ǿɲ .32/#8CCLNXMLNNLS8#/,38/""%'),+/.¶%8276HRHLLNW[VKNONQMQMWL%636%'ֿʾҾǤǿʴ .0,4+(@>>KHQUHLMIRA$0(-/83 "#&','1%Ѵʽ %6/52@PHPKJMMXZWKLNNNOOMS708.<.dzΫˮ .+,.0-4>9=CKGSMFMGMH$.-&/*95 #$&*'1˸Ͼ 1/128LHJKQJILNYWWILMLMOLPF-;48.Eĸճ $"+,+/676:9?HFIOEHIGM+&1'+,,65 "#%'*#θ ,3.HFFKGPODLJQXVVHJLJMLMM33:7:/ŷؽ ###**4A.777 -+*()--52 "!!* ӿ(A?B@7@@=F1,'+$&+)/252  ۶ '-#/+//8F@FTI@ECDHSPSRADCFCM7  ϼܲ %,)<.%+(-,2>>>@?3=?:B8)()%$*(,/6, ܻ۱â (/#'.*1-CBCFRPPSC@CCCI=& ݲ'*1*",%+*2><<><0;<:>="#)'&"')(/0$;ګ»Ǭ +-/*.//>JQB=B@BDPONSF>BBBEA'ްü ,$"(&)''7;:;<:-;9::>)*&& &&)+"֧¼ļȶ/"$0)0.2OM9?>@?DPNNRF;A?ABE&ްƽü  %%'*"*'(:899;5,<5:7<0(&"!$%) ҥƽſ'*/*-//JF6?;?=GNLMPD9?>@?D$ױɼľ $&%%''.9486;/-:29596&&"!'  ̣ɾ + '-*/8?8;;;<=JLKLOA8><@6<8AMIKKN98<:>;CȻʿ !)  %".@42443)3123439'$# 幥߷ %!,(98%27889HIHJKG299:<:? ) "$9:9005-,0/21327-  䰫   %&17$-,493AIFJGM;/;5;9;<  *$-=5>..4+,-.0/2124  ߩο  ,3")+)258HDGGHE.474:6<4  ֲ  ",586=0-5&,+,/-0013   צ !/&)',,8DDDFEH3-53485<+%è 7457:03.#-',+..//(  Х  $$&%*(-DCBFBI8*203373= )߬" 24577=0 *&))*-+1$)  ɨ %$$((@B?E>&.,-1.417/ ௨#"-&  ('25=O'(!&$''+#$*潤'&&;7?@>C<%++)../216'  Ĥ &=,"0EH= $!$#%'  !( 鱥 !+/56#&498;#%!%$&')+'",$ۦ =B ';37='(1ѣ) )8;:")393 ! #"%%'(&%, -.  *545:-/  Ȥ + 284@4%*5'! !!##&'!) 1 (0539/+ "&𾫿 &"!6279>6%. ! ##"#%˧&!11481'!   !#) !5%1539:>7   "" ֦ 1-372!' ! !!-*-8088;A   "  ݦ¶ #  #../54'   '$󪽾&2 /4173>,  "(!  ⨾#!* 2+/16  #"%"'* 113363% '&% 詽Ļ% !   1*/03  "!% úľ)" 3.237#"  $#&%*  ҷ(,+/-5!# ުǸ½Ľ K 9*06%!  !#$$& 󨽽Ŀ #  /)+..0    ɱȺ .      ý!  "    芴&12HSI3G/  +#     ɽ#"       65L>7%5C@(",     ʾɶ* $        򸘺 )0:9?!!&H:M  # #($   ݭ̽˹  4      78A&!"8H@_*%"# ,     Ԯͼ  *+       1K+/LPKWO # &     ˲̼ȸǾ &      1($"&3GDRX^d%    ̽Ɣ ! .(,*/DGK]^\p$   ˾թ ' # 2%---BKRWZeL_6  ѷü  '   `;$4,=YPWTJUM[L  ֳ    G;;+0?ZTHGNOSSS`  Ӹ    L2I @-ERBHIIOQSXPf" #ֻг  ENGTXKJSLUPTUYZZ^\O "    "#+    #&**/+*ȿ #' "&'+,0+#(*,0347:0 "(/4>=9BAE/"#+$#($+-17>9K*򠨨 *39DI>0#'*-0379759=>ADB(ܮ  '0:@Њ#-9DOMQW>-"$(+0358<@ABAFE<Ӭ*8@=GQWQZ[ac0ND(  #(-37:BDN(:ْ &3=JJOXV@:9("&*-0479=@>I8<ѭ *-/=BNWR[^iV0FIIOR`$: 7BF  &# "/*0ϲͳ''*7IIKKXQ"0$'0K1&#'' (''0ֵǾ  "#04=BEZ>1FED*83377+$=ܠ  (,"37@FKK\@/ $7N+ '$5"' :᤼ '/8ABF[A1G=>B@IE+99/,-:ɠ '5=,EBDBW##&',9J(+#,, A՘º (&/9@FM^@0D>>@DAKI,003/ƿ¿(5IKAG>>  5"/=K8"$( +** '/BKW`\34<8@=5=AAQ ɗϵ  '5G@g' #5,-IES +5(-0" ȭ  $0('38899*79BB" '7>V "58 D:JE #$ 311ɜɲƹ '*7$&*7=@KT\Z:AE+/4,E-묵  &:@ *#373,87T31 &1'7 ĺ #,/1('3<:BMRZQ:349=1=  ֥ö  #$9& $1B-7D48=I''5*4 ݡ "*+1<-78FOVB5#44:Bɷ  1  (#*4DJT>*-@1#,A,9ȼ'& "&#+GI8I,+1:0 ީȼ *3488IEI> '"#+=,-1A"  -͌"$-"/=AR>>D,B@>/&A Ǭıƿ  59  ꬻƹ  "0>A<:I4 '=˝+30( ,7=75AO>KAI麮  '9GG>JEW 3/K@>J(+ #4>X34 ֠Ƿ 8BV'  ,,EN^n  ¬ "7å(3>>N" &7 *0O*+޾Ŀ ,8JG "  :>WZ# ж 044A<  47$A,, $-/T  "&+3J>*  &#G #*E 3*##@@ & 'F   & "(:8$ $*  -F#    9  " ,1J '0  @/ $'   $   +/K+/ 4 $ݮ"+E+ '   ' (1AD 8(  *#A $  4  '& '77F/1+  /90-(   3#0 "8<>0'/@   '8I$-+$"+=, ("85@    "9# $17M  ,1<8-E9#"34 ѷ,1 #">+-E #4  $/3F:֥ (/<<=:B $#44  ܨձ"'9$"$0G*F"  #:   $+7:N(#-:4EEE$#0@ õϯ  +1>'+E* $&+,9K 볲 &,,7@FX> ,#A"'Լ +80D+ -"&J  (+A, #(,*8Iȶ '/+8@EX@$(>(ޤӷ '"(90@E,$*= &0>  / $(-+:<ö'/,8AD[B- *>0Ȳ̯پ +(+53>M$",/    $&4A "/ $',,B*Ŀз (//9BFXB1(*<<  ˾,,054AIB8 *  +-1D  3 '$,,G$ӶӾ  ,,39DGXB1005IǬݼ-0379>IQ#/*  $*91E  0*--D ɳĺȻ #-,79EG[A/785Iݻϻ "/475=DIV=& (*A8= $/ (,4: *Ӽٲ˶(,/98II^>17@=9˾Ӿ'-::4=ME`> ' *-B@-"1  "'(://Ϭɤ,+38:KJ_984IA# Ķ *-D83DKMa*ɾ+3@E1$+(D'¹ܵ /,77@MNc/<3R7 ˲ (5G48IG`B 0 01D> /' */B "ǭ &/078FKV`#&9:O'"#ڤ¾ϳ #+=I1@IO`@$/3O 9 $ '':8-þ(337=KN_V-8G=& $/EE3GG_< +  ''F< "> "&+A, ѿ0719BNRdI4=G,' Ģ(8IA9GRT ̷&1K *: (1F#dzƪ #941@FSWd7 :D9& Ȫ 1=K@>K^-$  +A7""0/# 07< $Ʊõ -=,9DNXZ_+(D<,ӢƲ*8BN@B\I"$7>", "=  ,/3< " #931BIXS`V"9@-# 38JM@O^#"  /A"*> $*+>3 귬÷",47KRW[kQ(= ݓď $8DRSM`+ *3  1 &4B "-8AQ 粮 0@DIRT^ai:0  "1@KVQ\< $/ ,#*F* (9:QB筠 ,5GMMV^_kX(  ,:JSRVQ » &ީ",  ",*7G *1BBT-唤 &4@QQR^adl4   遠 (5EQQN_& ̥ /(**,Q '3(  ﮼- '޵& #(    &, &#+ 㮺-&-':O@E:-3@( "14D$   (#**+𻱵(&̼ +AKG:(7&=#  '$1@:@   ' &((   Ī$  0>@B$&0(@73A&,    , &   ڤѾ"&,9//$,8&(03 "'&   "*(&0  س -+$*(A1# 1&5   $ 7'$"*<     '4*E$,& +(&<"  3&*&$*'>     #7:> **+5+  $   /#--#'#4':  *1B8#+4B' $ *"-+'+ #&00J'   /&-@- &3<@7  # #$'3$($'-+@=O4 ༾ $  $-8"-735' * '  "$3((#44=E=SDڻƶ #*& $-,-(#"/ / $  " '"3-3B9AMKTJ Ǿ  "#*#+##(4"#4  $$ &&*/94>F>GMJN\̳  4 #(&,-(8*5 ' $#*-48:0<@FAJGXD5 Ӷ"    $$&&&+18=,  ( "$*,05B7#:>G@GIM95G¿   '" $-04<=J    ('&$',/:9G7*=@I=JI-G07麳  ""#*-57>>JF ˷ '3(-41735:AK-*9@FG>5K-49 򵪻    "+/39@EBD@&#¼ '-+,55#/:BE-=>&/@  ݲϱƻ &,488>@G@F& /$'þ"+33:BKNAEIT@/(/(+(" ȷƿ  &&13$/-37/79<=@E@@M9#/'̼˹÷Ⱦ "'-7=AII[>5K=IOW8,*$5&"(ֿ &-/88+99DBAEF:9ú ",$,57&(̶ &-7<>QJ8JIFKIMQ1>GFGVD/$,7'//> (# ⺾ $#+4=DJZQ7FFEEIGMQ<5=,-ɡ'4DOEMAO&&$,1"$4A& + $ݮ #-9@>JO^J3DAB>FEKIG3+/统˿ #/9DS_>I 4#$9AB + $  ŸêӮȼ($-9EJQN^F/=*  2#* "C-"5٬(,1%$ 4< . ?(Lֲ"1-+-κ@&@ Mh'#L% ٲ)71 # &(!-5/1$ů8!0, (?(,%@@X@ ު65X1͒ # E! @  I./ؚ&*Æ51 0Y?Z?Ҭ-DTliL!ص #੔S@!dfV,QUK% '* (* ЕJHi]ޱ 6gb&݅VYİ0 qD?ehXGAN# 6#ڿ@ -ZIh& @T2ΆʸdKv|,Fmoь24x- ۷#8eeą 0dZ2Ȳ=*,ଯ`^}2&$!`tA担;s(")$$<\7 4K)#2(@@贿@6K HCL*' \v, 2 1it,me.be'8?熆nY@0ӳ(wׄ\,Y$@C\)۪0Ixࠌ /"FHp!y6َ2 S1v4\J*,4'Pl DžL8*#򬈄?Tp@0&p|,2X$h~M !hl:F@(E,h$ӆl LW[lcƆIK -釅4[E3<NJz#D?Ljt$3kR0ܦ Dbye'"p]8\L,]`FRЅM-N χPQE:3W􇆆\S@C #J1$\pQ=&??%膉*- DG؅(o'3.Bx$&аtlNqFѮ ,THUxukЎ@~78`@exN'ͮKAlw$Ģ3TSH;@$$=XL𦅄!KTL\4𧆕"hПֹ' )S@DF Akni8ԵĿ[t YmV0 U%ǹ_@vpԢ'HUS,G.u/W: #B " 쐅`=Q". AX-Q, ˉQ!Q'5zpGsz!А@0 -JȦQ6 sh7!R?)&Htg3W6R~<أ\pYpMΠ "h4ӆ'f?|V*Ϝ/:/*P@D` ԈCJ%.t vX@5x`-IE-?5$ّlq- ͸iI⅜1/T}z*˅Euo'ī$0PZ) !aK}-,چ@IH}A϶,Xh@Q雅`pÓ@g9E4U/Y9η+J쎆1FF!8%;m6uj1LDdžxr.L¸4U/I@h %?Q)ݑ-dڵ%]g>;LBҼÞ@2 [4(7B1@$">!"@! L.!5\E ) ɕWJ'@.綢;|ȐwR@"6WzLcu$!5Ρ#P3BQ--4(*ʔnj= 앆RhX' (hL$e ٱԅ:@0?͊3a\xXP lbĕ!5@hSE)@n ,lݐP?9,?L* ti@q ԅ5=sqK \ (d2-F !g$?{h̴֠Pl#uSdž^)JT믌TLņ5( p󆅅['0`0-7V0I¿[P2Q%LI$::EE哆%Hi) "Ry~$ ,}~գ @<ˋ L !"@P솅1LMsu?Y,%YШK:dYUҳ CV  \cA >PɊ@ MAI(B+`hxP<m;H( C$hy&։Lx.@xXhc6@擅M_$¼׸O`?-KRK:¨V!Uᆅzwj$ )& Bߞ $.!Fc\$VheLЌ.`\%,Cb@趐;qP #@"0> .2.?;P̧8Ex܅ž({lŅ^,IQ9(V 4-ى(j(B *EU쒼dt.B󘅯#X7ɹ齓@~ؖSƍ yL텅ђw6l5Hń?z5Պ@Q /M@ ,mEʹ |نrp)#I8Y$hb+tXPĤ <?Ƅݵ臺yB (ա Pw%ۧjy@ Į65&!&:ۄ)g>G8 3Y$ϴ5cKRTPjv(6Ȇ[mL坻8flHt0ל?r`P@2GJа PA pSH*(NXQ3# )ps0>BpŔ pzu魟:䚅Xx򝌅?jͰUkؓ8 bɨq}5ȌD@ ( ”/2CAnܲ%Lǜ Tr L.PQS/%"φc ) 86б/P<Й2@ӌqPﺨ-R3L Eh+(68뤬-5)%3 슆 K~+&O~H⣗xI+$;- (/Zk5 ,9طFt!(  I4$  L !ђT,r ?DŽ@ vy`x9 >h)" !Ǹbx9G`5VF21pzБO9xH8څj DgɆ ?!n-͆%`#-sK‡t{Qbp]7@*謖"'@\K? D#ХCw 5{u0È$?@.ڐ}ap.=$ 0|,@lPF VYV͹ e)\ENG,ײtoHlφ!"* J혅 =[ng H (. 1•Ht",UZ ¿@`bxb曐CF-ʲ!HE)³?m\.ѩђGX҆U} URך,X|M@$UFg|vT -;NR6mR1I^K9ֆqxG+ٓ-Qa K,᠄\r<ª (x("Q|Ѕ/Bꅋ ;]$!poγT9FR?PಒCfsƳ)Ok(!]Cؿhr"9Cƪ3T*\ X]*AɕhJ!,5܄1Z"&,9"ꕅHhҹ ;Ծ% 4`31<3 $Sz\ (I\?UFY Û>HQfV;hyHꬸO2P7֬¿%IU(:0̿ "?# 䝅@+8:􄍎*!nQ% (􌠈/xG*9^c:0h5εL}X4ఱ!A,eB- ҹ&@@2 < .t.0i@WXIa0.*$J"tM:@X>+ˠȶ T4?X  $&E铄(hM (XLʧSW-*- *Ga(8E`隬0cS5* R㣥 hzPrR-ә,pjR[ JNp j]4 8bG䝅;ȳV[Q= h hn㑠026hG8?Ή%4Y$˹e]m@8⎆ EU]DpӤLe\?ӷ )!1 PLA"S<I?*T;+Gw>q|HM%)IPk@Ά[/&`G$-&\V-ᷪbMNJeB!UʹQ<۶Tl΅`@ 0B0Ѩ  U$RtQх!ٿ1Qhf -6ܤ0 ;&Ѩ.-?I Pp ׾"X>0!ô0fQx͆af|I:S-xc 3H 76Ј .hyEً +Dtg9ۆ"?!3SԜ ,CDTjN l|$҅\w'&+#YjǧʿaT0 ?ӶIU\^9365&͑Dlp6,+8? Ж?>F19(80lcas zqE8(䈅,Hbq`Ȟa3ՆW:*u]nؐPOL+!ՑJ@!k_?HT ^-AHS`N؝Q[@5 10 +&"ۄ@(0QˤYK|F׺zvސ^v4㍆@ GQPїFpE*0 څcg'ҰJby粰D0X_WW8P)М F<Բ"3 4֭jTƌ1'^X6ӠϪ?ض(tzx1⼸ A,`Ҡo 4ѪI}4텰),& -U@v+⤥ް* - ǐ*hj*{ȅ 51@Bֆ7IL}갛-%?H0 %"P+E dzHĬ6XWfGoNх(+Op"ި[.T /*1+RD -(?OP 0a,J2֦0żey^t8 H3$նt|R2[@ b4屴@ Ӻs^@ڏ0LU" %5(ڻ=5ɆN5e],걖`P15 ?1G"!@`RZkH@A-آ'IcK?NN8? *!V(%S@H-.(†@Ґ@8@ЙPHW!ƮZfeIIJ$9ص   9?m (R'.ԯ0YIC 1z F٬h[й0ఱ,g Ӷ :E"࿩Pdm [E澳 f%\[dm?]42XN噥‡hl #y ,I@džPC܅5?x(L̴I?ІFBКE|<=-Ů/znά $x|4 (kk? ]]d͆Xa`AL44qQ冠0Q34?X @B%ݠ@X :ܸ4.Է#QnH'>坄:{ ȉQd5mamLܐjt(أԝfxm- ϸ!ET0 &8"ʿ .F@ ༹ ()`IXђ h!*=6?A˅Wˆ!Z$jT$'x@*d^ DڳIJMoJ -:6A]kMžƭl9Đd?iFAp㐆H@&`[>CIQcӧ,1a2 D%G14?Ǵ,)1 ߣ.(Օ5P*u81 Bȅx@$Id5Զ0ߦU 11 +,& @9Y&#0*ɡ8Qq-21&Iē=~U"Ѝ j8+(@'3+󸥅fy`C+&8ņ  1Xd@%h@Խ '*# 2a#ǛݞW? >e.!!&孆ܼNovc2 NTDM *`Y03ɯ$K@ݗH@FY܌(Q)ݢU}H7İraŇI|nyUmU P𥈅\}8 6̠0H>U: q`J! 8%( 0$ 7y ű>v ƽм $jڹ>P$(LYA@*⍛\?1 ðPg"x@*Ͽ 04J<眥]0" Vr/ 塋l;M"e] \Qѣ-F"0-̰?+ä(@l@2 иMĤNNGE3&)Qv5 {GO =@44+:Ÿ1ED8+dϮ.+@0 1L߮(`]3x-̳FjXNȨ&0jن2h 9(h 0!Ql|u2)$ 0`p=æ A 0 +L:֯@d9\Pk$ 49ܑxd /m#|\,³$ՋTs`2& ǩQ`4?  P1`P 9Ydؠ( y;Ʌ셪/*4h!ลFC PL|b(婑CM:#!\ @)) %뿢 .4 5xHЄ ,pC@Jl`) ࡠ!iᚤ"<Æ z1 ^𝅆v3,f/뒅5H(V4r>JՅYZ)H1 0%;^ i: 5Dc* %Άbҹ1 C[cJ 琅pd<Ņ$@E4@4(A†?8@B   &* 4N.lp` Y`/+ݧ[z)_ 0lttiѰ䪿ֳb:/ۨ*P~2Gp!J&%ѽ-08(ڦ–hx\ Bq08_չ?xn 6S8yNQ9Hf),">U3&PI\=@0!X@PI0CИ-WD MI䅆q8MhXNe㭅EOM?ǕF*J&0 /<œ5#$B6H.-$Nʒ&X3 ^9+Ĉ/7+܍Ew@r? y]u$' @A5\i5aXW8@ 88`Aʅ/k?QdG!ȽB(Ʌ}N=:$d(`@ !#'赲Lv,/ @F 鱺5SCB]݆>d'0f0 ("ҦlPaFԩ0?CBד(Х$y)!"&@ IȮl<굅$$ECȔ a2ء`%diɾD<ݥ!<. ,(#6 ج:}KB$? I%RV۪S@*?R2並F$.&ݼX#}0ZZFǠ` õ!Lbo&:i@䇆\wԫĘHڙ0XK0G).Hs:ȌMw$$L[G ɴت7;9qpD P@)?S]񞋠N+ݤ$MCs1 Tᘺ窗"TCA' ཊ& ?KqW-@ HD  `@ܶF|w4͆@t@,F@2|@4x@XG /7\d@$߭,;$$ؤ+@`戜1|9ȅ63ܼ7t`P|7T,Ʉd10`;߬!@@Ֆ@S %Ցcf-0?&򤧦WTي w ԜŤ?Ӆ,ӨNJ0ㆄܺWٹ=ԩ6`ъ'tmpĹ @D  HDL;$6H@ϔHk. Ѽ-p,ƭUW兌HHx Ȗ (Omﰺ&.6?Z0ͩ-'48Į4Ķ)h˅`z걉Ⱡq甦 8`p0D#dL4(tR,젖12D@/d,ᝅ)=D )FಠҪ"eJ<[+S9!  䨹"#ʤMsU6ҠgPiػ9/ 1)F~s#ʴ.RᝆdEksBPV@.ؤ,jkӑptR̅.!@@0WKРD^qT4S?E(NNu~^?M\& (bV),(L^ 6?NBKZ 'b?ՐI7هFM.q@ ,aѪ5~B'Ӡ n< %PK.` Xv֕\a7 OO4Էච8z@1 0P#˿Kd=@+ً4ܫ %A°:4ꐠ}f 3P7)CH4tl腄:ZDдKE848)8pd81 1 ڠ5S4ڄ0//54  NvIĻ.T&Ԇ*~]+⺤ J @H3ҳElL @v9!*3$Pm*yn0 (>1̙0uK!f/ f1ЄY_֩5п:G񐅄|~CJ/Ě,! @. Х@lWֱtp년0|j&Ψ)'hACȘ s8\@ hkŒ "[G䅆 0H3wem<2I hoLh"(+& Kiآؿm]J@D= LOЪ@|3 Q`1NP[㿢Ŭ o`&"Ք$ rRȓ\H 1@  EE(@,Ъ ˦2}a匫`EXY @<(멆Ë;.VM䊆KYT &x4 *අtoD,P8 `u+NF6A"ଝ 33ĺ4- ؼXT8]<ƆWK * ְᶹ0eQ1ȷ-> 5@RӨ, 3`. ݶ4E@% +(&@& TlCjVE& ̴/|ZD, 9x2׶ؿJnL@-ݠ19(@ Ơ @M!(6* 0"PoM ê ,3: S8υY٥!II˾S/ըUmA|^QyLŴ2݆.8nی =5cg0˲ PWN0lVƴ$06/ȱ?[h7?R(ܛ) N a󝆄I6Xdžæ4e Lfi߹@`Z𿮹(B~v8@HT@ ,,Y&0Hb+yu$ꥼPyx5 Lb*Щ8d15!ٰQp6g# 1IH< %謜<dbH̋Ѵ&f` Ԙ XpUF!/兠^l3/ +[u.-3Ʃۼ,D>*)`o; Pr;guR,@ȑQWP'ݿ0xt8Da b]@ɸ`^LL8@ ȨѦ5a-D Eq]/ ȹ?jxE96no'$E$ҤdζW\,@-92&!*ۥ~j eR򶽻 =6/ثpr.2kJ힟Ѱ"`YUAֺDsj& BXߵ#XPP& %&,@j|D L7̷ -  JEH(@n r`,㞈][.* ӵ&WjE:@ұ2ia@3@+ "bc3 Ѽ(RbIo20T\[L.ˤΐ2\d J@3  @B ̴ͼ!dE(@ ;/0ɾ0PA(T, Q3)佶,i<ϒ# ) HUE̴n5#Aȼ?໐0P@6$ϲаUW 6?T@ 1PZ礬,$@sc{Nͤ@ 6WA & ZB4xnHZ-AWӠ˯lE*sx%TNA1*OθDe_)K~;"DY98[&䧙FQ/%#5`5)Vo$; 62/W$]b)ʹٶ!1Ԝ/yQΘnbY%QsP,̉ڿ K\up&N@صdK3 ?WcZ I-ܪ8G 8<`@EjTͦB8%) H!춥Љ V6ԧ! Jv@<̆ԎXOl@݊,$Jaj3Ŕ؆3~ v03L4ع ]`A@\*Π26C @ -ea=\% 0I:Æ(".4dS ܺ, ,+$,OpW J @PD%!3)t)YHІ( `q<䳐I`G@}Lգ DMB'N3ڎ4_цD\(245.-  !&쿢 .E82 '< (˿#DA#@( @< #= AzE\|D%ҥ[`M~D-Lg@C"4h#41̴$,V-(4T^9xEUaXz[w)п  @I< >"Fζ`XŶɒ/0߸s_@JcVV̿񾎯*H[$m{D@,L 48lR5S 31 + 0ʿaOV}8S4Ć0@ Pk9Э |_8^Bz?4B ڱ !Y",M 6X$DK֓ .+)'%#ô/jS@ բ@xyNTt9جPn@qL˯梆;~J/綞 XT\i2?dEDEμ#)ʜ$X&V/%&P@:(ՠ̪9`?Ŭ <';K(*7 N9ſ \@ʒ:"ۈ -Mh( $P"-0 H . 5\7+ /1 -%ܸ $&:4)\).Dָ 2?Uū "ؿ@0 MF(7 Y?ΠgRԆ-B )'8B,?B )+*A/- 8C@yS ()$H:DHuDؐ e;TeXKڤ$ $$+7즥 5 l>'YK) ο 4J @.Կ2h`v 5*93*Գ83$12)#̿&E еQV41-0"/, %ӵD%,cB*&P5ֹ/9%%?E 2=( )"(:! $- -*3), &.(JAD2, # 94ʦH`.6&   @"&7+&0  .IK`L.8,)"1  &@ @&"  3!Z$N`,5  0( ʿ*L6+! )?*8   ' *IϿ  (  -$ .@ D $ (   $       3*+*       $4G)."         , ) $ $  2 )!    ſ(    & (          ,                         ##  #!  1<5!%97% $5@7/5/! #',2,˼0Yj^7Mu{\!亱*2-+7:%Gsw\0Mjb: 6<( !(ϸRob@ #CNA%"2S\Q4 +HXV;Ƚ%%  :_dK' *+$   #Zyl< ,;FE3-4' NxwN#+..2.Ӽ '/, Ϳ!WuqK #/?G@)· ,.%\{n:6JG;- ϼ17.! ޹SpmT5 38)(,! 3aoZ2 8F:'+ -DD2!Ĺ*Yk_<.<9"%8;,;m|b1 -::'&0+4QXJ4#% )0" .QYH(  $  (, 4NTE-   #&>[_L1 #& '& ƶMr|iA 0FD, !@NE( (74# Bdm[># ƺIdj^H-#*.* 69+ 3Tc[A '! &$Ż!M`[E-,/#̿-IM=# ">U^S2 '+( +=C<' ø2b{y^7%>C35HH9»C]cV>  $7>9. ¹0:8*ʳMr|gEƶD\YD%ѼAXYG,±$>RZQ9   -Qb[F' &9=2 )=B8(Ĺ<[jcI$(67-*:9)̼*[sr_B"̶ 3ILA3"270$Զ RotfJ(ǵ(:@8, !C[_J'*5/(DND-ʷ-Uoq\< ! (75"!)78&  *21!# ˷%HYZSE/ϸ"1@KK9 "25,!DRN=) $((()$Ǿ 4\qqY1ǿ '=F@/ "35*ųAn|oV:۹7HG=1!Ų-86, ϷEdpgN' %4;8- -0, ˾BboeH#(+  160  4FH7!2:3 #/(Ѿ,@D@?;1ѹ ".64&,8=:. )APQC&Ƚ 06.¾/UheO2տ $470%!'% -L\WA#$(*-0/%  &23+ɾ+>LUSE)ٺ0@C7ǵ2BC;. ")# &;B6-=A>:96' Ŵ1>;)ú?VZL3ɷ)ETSE.¼ $6=:,Qt}jJ'˱$CONE9& ɵ #/2-$Ŀ5VfbH" ,DJA0 #& ƹ2Ue`N7 ϶ .DOQJ9ļ%052$ Hho`B л;SYRB.Ѳ-?GF=,̲3JUSF- ⾥BYb`XE&Բ0CPTK5þ '8<1:JJ<(ӿ %7AFFB6 ɿ &., Ǿ /CHHE<(޹5N^dX=ȵ7HNB(ɹ(YwzfE#Ĩ8PXVM=&® .LWYP:¸!-0' )?B3 +?EA6(Ѿ"+/.) ȿ.WjeO1¸7EC6'#680#±(Vmm^M:!ղ0=5,  3GJ:#'   ӿC`h^O@.Ѷ .576.#-2.#ؼJo|wiV=å/9@@9( *G^e\C$ Ŷ"+0131( 'MegV@, չ#)/22) 7Zno^D)ֻ.66/$-551$гDgusiY@β +1551(       "$# )AF<0+)! $/4,$ 3S^T@/& Һ!(.)%#ƾBcqm]E+ҵ%-/-+& 3M\]Q;$Ϻ */1/' 0]yydJ5&ʫ%0:A@1 %4?@2   !8@;3353$³%9B<* " ͽ Cjyuj^N3 ة,H]f^H+  %-.,( *9@;0# $68, ('мFZZQIHD1 ߹'8<-#AOK8"  !0CD;47=4Ϲ 7FD3 ! 0LXRB2$º "" %  -;?<6/( 4FQOA-ɿ-Zu|ti\F 67O^_L+&0)Aaj`M7" ƺ!'-)  FaeVF=9.'7B=& %J`aQ@4+ӵ!,496( #)+&ݿ6\ouyufB۲)ARVK4  %496-"'2:=6) ?PNFDD<Ŭ7NZR5 /0!Hk{ylYA"ɡ "9KUSC& ")NefWB.ͱ#/9BC9#  4Wf_M<0# © /?KJ: ɿ0Xotl_Q=𿝏/HYZK0 0Q_XJ=4)ɬ )?OO<)&ƾDaj_N?4%߶ /CLG3 +Vmn^I8(Ы 0ERPA&DbpkZF1ض1BNPF/ ʾ Bj{yncU>巙5P]YE)0CMLB/'--*&! DQK@=AB1ï*DMA' -0 ï Bepg^\W@ݰ2KXL- %8;,¯!Ww{naYP5ț#:P[S9 6LTM?2' )38;6&/BKTai`?޷GgpdO9# )PgpofU;Զ4FJA1!  Qmqf\ZT?伦!ARO9 ӹ*Vp{||we<B]icN3&,+&&)( .4.% !   0>?98=;,½/DI<# #% MeifdeY6ָ ޽ .L[U?$ .93#ô9[moj`I'ػ3DLF3 ɾ ;\ig_\YI'ϴ0FL@/" 7U`[WYXG"ĭ=SWI1 ӶAT_jw|kB ٴ9TZO<-  7P_fdXD+Ҷ1@D@6*  %DV\\]\Q5 Ĵ4AC<4/* (>Q\be`O3˸ #7EJKHA3 &>PbnumS/ẞ*IZcigZ@",5AGB2 ƹ)2;BB;0&    +597798+ö/GRPJB8(2DWl|w]8ū 2HLNQM<   3GX\RA/ư*;GNLB2" &9/% !*-*+.21' .?<3& "5EOXbcW?"ɻ  09@JUZQ;ǯ1DUbjfW@( +>Tiro]H+#KQQPNF5Ƕ+?O[ejeWA'ø%5I_qwtcM*Ĭ8XkxyqcJ* ͹ %2;ABDD@2ȶ 9L]hnpdM/̼$5DTclhV=Ը*AUbgbUC/&6H[kupcQ6Ҿ-?JMOOK?, )5=@BCFID6ŷ"=Thrsl[B% $*3D[mofZM4پ2HRVVXRD2"+7@LZdg`M4dz1OenmeWC+%0  ,G^mpkdW@  +=FIOQI6$ #-5=FMPOI7 &>Rbkj^N:'ȼ !1G]jpogV<Ǯ 4O`iqul\E+&-:K]ijcaV>!¬9KU[`YL9& %HSVPG>2 +>Uejhh`O7ظ(@R^oqgZG/ ,AXejmmcQ=# ΰ 5EXgojaP;'2NafeikbP5˰&8L`nmdTA/ο"0FVXTSYYJ3Ҿ*BXbaZSK;#ļ!,?QYTPSVN;& $7FJJIC9-̿ +@QXTIFI=$"&1:6*  +H_aWQSN;ɼ%.(ƾ ).($"" ¿-DOPPWWF.  +10&"#CTVQQWT@%˿#2>HPM?3(ľ 4HJIJPTK6&  "/0*&%$ 3;<:;DD2   +0( *2457?F;)%9IUSHB>3ǹ 3::FC=9,$   )5@FKE?81" "/5?B==<,"  !++18/0.$          !  "(.47;861' #'*+)&   #%&)**)&$         "&**)&"                  !"""%&!!# "    ()-2420.-,,,*(%!   ',9AA?;72.*)++& $$%0;@IQPNI?;8521-"   ).-0AKPV_[ZRGECA:6+  $(&+=HHP_MDBKJB=;1   !&($#0=BMRLGCAA;0(" # )+7DONPN?E?A6(% %'),3.-6224>@OFELHE/" $ٽ#3254+8.03)% /:B@62$%,?QQMD8*  ,4A;?;&"9CC<4!%ʽ  #5FEG:*2 3C<7"  ,"" #6?QUG2#, 6;A;˿)"#B5#0GR[_H9=1-(ϼ"%*'-/*1FQRVQH:,ĵ&"'>QWYWMC6$½'(%1FOLLJKK@GE(%5>A7.-,13ENQHDB,ƺ(*12=Ukk[J??)$ľɱ(ICDMK='"6DPUZK6& ¾.7?66A>;1,(5>EG5!&! *0,'49BA4/13;?-  *2(+55/'")0* 05-&'--(! )5=8' /1& *43-!#*$,;5($&) '8:0(! "77-!*.&# 1KQ@'  (<=5 ĵ &?<)!  %Bcrc?׷  $),.8>.  ) !9@(  /Hak];(3-"/<=  )# 46! &.%%5?;( $$$AQC*ʹ&HVNHD*ξ "0!  '85$%1+)#KfdR8((/ %,120ķ@PH/ (3:-2@B;;(%ܸ3<>EKXQD+ʷ+3FE7( !7HQNA7+" *+ح*>?;8:@=7( )-&ն/=LI:) '=OUN@4)  '0*΢8E?2(&)-0* "2@@2컜 )/ݹ*10&ʰ 9U`ZI?6+  /)5HOE) ..!(,---(:HJ?.&!"$5CD=6/((# ÿ3CNMB60("3;;;85/$ ̿ @[dWOE1" '3>8)0SjrfW@% .EQXJ- (FWVD) #7:1) ͷNjumW=&   û-RcV@.  /:0+%!   8SbcWE+   "FXUA*)61*%  /J\^WJ0Ƕ&31%  &*!  3CK?!  "'0BMN;$  " 8LQN=% &)&CevqX: "  ,Kbg]J.   /K^_WF/    ?[h_L7 $% #/4.! !   л8NRG/    EbkX0 "))   (FWXL8/, ,0% IJ2\qs]; %(' ;VccP5''#  0;=1ۼ?ZaO2" &*(   *+")+!  ô4l||p< &85!  !1;9."  '46/  )*   &'#/:7*   "" &$   +:;1# 14' )7>7#Ҽ-S`XB%)5+@RS9,EK>-AOB,DG@5$ ƥ%McgbWG. 彟;O][K1  'CNRO= %379( -CNM@2  7QZQ7  EetjO+ (/*6S]N. )8@8% !%  (8B@3!5OVH)$6CE8" +IctpW.Ǵ&LXYR< ,.'6O]XB)Ƚ %'*$# ).."!**!'/2+"  "(!   &,' $"  -BJ>ȿ!7FK?* ',.)  *-  (3.%(:IMF8µ1KXYO;   !5>?=11?C8 Ŀ ->NMA7) "+- *>LOL3ý $5:;3#5N[[M1ǯ 0J\d`M13GRO@*  !',+ $8LW[UE- $(#"%%! '8C?3!    &AVa_R>ͯ/SksiM, &)'   ! /NfnfP0ò";MRMC4##-1.%   &)#  )E]g`M0 ų"6  !*10-)""))'     !.1( 0EU^YRF3  !$$!$#$'&'$      $)$ " $'*#    "))$   %-35/& !4CE<2#"&&,.*# ##    #  *5,1*(/)  $%+##+'$'($    "' !$%#!!    !%+$ %&03(&%  )2,.%(% "%()(" #+&    %+,# #)/+! '#"  & !" )492# #482(# "   "(  "#     &) &0-& &""                                                            gltron-0.70/music/Makefile.am0000644000076400001440000000012407573055726011617 dist_pkgdata_DATA = song_revenge_of_cats.it pkgdatadir = @datadir@/@PACKAGE@/music gltron-0.70/music/Makefile.in0000644000076400001440000001323407767023244011631 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ pkgdatadir = @datadir@/@PACKAGE@/music dist_pkgdata_DATA = song_revenge_of_cats.it subdir = music mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = DATA = $(dist_pkgdata_DATA) DIST_COMMON = $(dist_pkgdata_DATA) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign music/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: install-dist_pkgdataDATA: $(dist_pkgdata_DATA) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f"; \ $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f; \ done uninstall-dist_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " rm -f $(DESTDIR)$(pkgdatadir)/$$f"; \ rm -f $(DESTDIR)$(pkgdatadir)/$$f; \ done tags: TAGS TAGS: DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = .. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-dist_pkgdataDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-dist_pkgdataDATA uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am info info-am install \ install-am install-data install-data-am \ install-dist_pkgdataDATA install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ uninstall uninstall-am uninstall-dist_pkgdataDATA \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gltron-0.70/scripts/0000777000076400001440000000000007767023550010214 5gltron-0.70/scripts/config.lua0000644000076400001440000000530507766301732012103 -- global tables settings = { } artpacks = { } tracks = { } -- debugginb settings.debug_output = 1 -- game -- game rules settings.speed = 8.5 settings.booster_on = 1 settings.booster_min = 1.0 settings.booster_max = 6.5 settings.booster_use = 1.0 settings.booster_decrease = 0.8 settings.booster_regenerate = 0.4 settings.wall_accel_on = 0 settings.wall_accel_limit = 20.0 settings.wall_accel_use = 1.0 settings.wall_accel_decrease = 0.8 settings.ai_level = 2 settings.grid_size = 720 settings.erase_crashed = 1 settings.map_ratio_w = 0.333 settings.map_ratio_h = 0.333 settings.ai_player1 = 0 settings.ai_player2 = 1 settings.ai_player3 = 1 settings.ai_player4 = 1 -- game settings settings.fast_finish = 1 settings.camType = 1 settings.display_type = 3 -- video settings.artpacks = { } settings.current_artpack = "classic" -- detail settings settings.mipmap_filter = 3 settings.alpha_trails = 0 settings.show_glow = 1 settings.show_recognizer = 1 settings.show_impact = 1 settings.lod = 1 settings.show_fps = 0 settings.show_console = 1 settings.show_ai_status = 1 settings.show_scores = 1 -- screen options settings.width = 800 settings.height = 600 settings.windowMode = 1 -- other settings (not available via menu) settings.show_gl_logo = 1 settings.fov = 105 settings.znear = 0.5 settings.light_cycles = 1 settings.turn_cycle = 1 settings.line_spacing = 20 settings.softwareRendering = 0 settings.antialias_lines = 1 settings.bitdepth_32 = 0 settings.use_stencil = 0 settings.mouse_warp = 0 settings.model_backwards = 0 settings.screenSaver = 0 settings.joy_threshold = 0.10 -- audio settings.tracks = { } settings.current_track = "revenge_of_cats.it" -- music & fx settings settings.playEffects = 1 settings.playMusic = 1 settings.fxVolume = 0.2 settings.musicVolume = 0.5 -- keys settings.keys = { { -- player 1 left = 97, -- lower case 'a' right = 115, -- lower case 's' glance_left = 113, -- lower case 'q' glance_right = 119, -- lower case 'w' boost = 101, -- lower case 'd' }, { -- player 2 left = 106, -- lower case 'j' right = 107, -- lower case 'k' glance_left = 117, -- lower case 'u' glance_right = 105, -- lower case 'i' boost = 108, -- lower case 'l' }, { -- player 3 left = 276, -- cursor left right = 275, -- cursor right glance_left = 127, -- 'del' glance_right = 279, -- 'end' boost = 274, -- cursor down }, { -- player 4 left = 260, -- keypad 4 right = 262, -- keypad 6 glance_left = 263, -- keypad 7 glance_right = 265, -- keypad 9 boost = 261, -- keypad 5 } } -- these tables are not serialized to RCNAME (yet) -- some values are set in artpack.lua video = {} video.settings = {} gltron-0.70/scripts/save.lua0000644000076400001440000000143507453607755011603 -- dump global environment function savevar (n,v) if v == nil then return end if type(v)=="userdata" or type(v)=="function" then return end -- if type(v)=="userdata" or type(v)=="function" then write("\t-- ") end -- don't print lua constants if strsub(n, 1, 1) == "_" then return end write("settings.", n," = ") if type(v) == "string" then write(format("%q",v)) elseif type(v) == "table" then if v.__visited__ ~= nil then write(v.__visited__) else write("{ }\n") v.__visited__ = n for r,f in v do if r ~= "__visited__" then if type(r) == 'string' then savevar(n.."."..r,f) else savevar(n.."["..r.."]",f) end end end end else write(tostring(v)) end write("\n") end function save () foreach(settings,savevar) end gltron-0.70/scripts/menu.lua0000644000076400001440000004522607767020343011605 MenuC = { type = { menu = 1, list = 2, slider = 3, key = 4, string = 5, -- not used yet number = 6, -- not used yet action = 7 }, keys = { player1 = {}, player2 = {}, player3 = {}, player4 = {} } } Menu = { -- menu after startup current = "RootMenu", active = 1, -- Menu definitions RootMenu = { type = MenuC.type.menu, caption = "" }, GameMenu = { type = MenuC.type.menu, caption = "Game" }, GameRulesMenu = { type = MenuC.type.menu, caption = "Game Rules" }, GameSettingsMenu = { type = MenuC.type.menu, caption = "Play Settings" }, PlayerConfigMenu = { type = MenuC.type.menu, caption = "Configure Players" }, KeyConfigMenu = { type = MenuC.type.menu, caption = "Configure Keys" }, JoyConfigMenu = { type = MenuC.type.menu, caption = "Configure Joystick" }, Player1_KeyMenu = { type = MenuC.type.menu, caption = "Player 1" }, Player2_KeyMenu = { type = MenuC.type.menu, caption = "Player 2" }, Player3_KeyMenu = { type = MenuC.type.menu, caption = "Player 3" }, Player4_KeyMenu = { type = MenuC.type.menu, caption = "Player 4" }, VideoMenu = { type = MenuC.type.menu, caption = "Video" }, TextureMenu = { type = MenuC.type.menu, caption = "Texture Options" }, DetailsMenu = { type = MenuC.type.menu, caption = "Detail Options" }, ScreenMenu = { type = MenuC.type.menu, caption = "Screen Options" }, AudioMenu = { type = MenuC.type.menu, caption = "Audio" }, -- Item definitions -- RootMenu Quit = { type = MenuC.type.action, caption = "Quit", action = function() c_quitGame(); end }, -- Game StartGame = { type = MenuC.type.action, caption = "Start Game", action = function() Menu.current = "RootMenu"; c_startGame(); end }, ResetScores = { type = MenuC.type.action, caption = "Reset Scores", action = function() c_resetScores(); end }, -- Game Rules GameType = { type = MenuC.type.list, caption = "Game type", labels = { "classic", "booster", "wall accell.", "both" }, values = { 0, 1, 2, 3 }, read = function() value = 0; if(settings.booster_on == 1) then value = value + 1; end; if(settings.wall_accel_on == 1) then value = value + 2; end; return value; end, store = function (value) if(value >= 2) then settings.wall_accel_on = 1; else settings.wall_accel_on = 0; end; if(value == 1 or value == 3) then settings.booster_on = 1; else settings.booster_on = 0; end; script_print("booster: " .. settings.booster_on); script_print("wall accel: " .. settings.wall_accel_on); end }, GameSpeed = { type = MenuC.type.list, caption = "Game speed", labels = { "boring", "normal", "fast", "crazy" }, values = { 5.0, 6.5, 8.5, 12.0 }, read = function() return settings.speed; end, store = function (value) settings.speed = value; c_resetGame(); end }, BotSkill = { type = MenuC.type.list, caption = "Bot Skill", labels = { "dumb", "normal", "strong", "the MCP himself" }, values = { 0, 1, 2, 3 }, read = function() return settings.ai_level; end, store = function (value) settings.ai_level = value; end }, ArenaSize = { type = MenuC.type.list, caption = "Arena Size", labels = { "tiny", "medium", "big", "vast", "extreme" }, values = { 160, 240, 480, 720, 1200 }, read = function() return settings.grid_size; end, store = function (value) settings.grid_size = value; c_resetGame(); end }, EraseDeadPlayers = { type = MenuC.type.list, caption = "Erase dead players", labels = { "off", "on" }, values = { 0, 1 }, read = function() return settings.erase_crashed; end, store = function(value) settings.erase_crashed = value; c_resetGame(); end }, -- GameSettings FastFinish = { type = MenuC.type.list, caption = "Fast finish", labels = { "off", "on" }, values = { 0, 1 }, read = function() return settings.fast_finish; end, store = function(value) settings.fast_finish = value; end }, CameraMode = { type = MenuC.type.list, caption = "Camera mode", labels = { "circling", "behind", "cockpit", "mouse" }, values = { 0, 1, 2, 3 }, read = function() return settings.camType; end, store = function(value) settings.camType = value; c_resetCamera(); end }, Viewports = { type = MenuC.type.list, caption = "Viewports", labels = { "single", "split", "4 player", "auto" }, values = { 0, 1, 2, 3 }, read = function() return settings.display_type; end, store = function(value) settings.display_type = value; end }, Map = { type = MenuC.type.list, caption = "2D Map", labels = { "none", "small", "medium", "huge" }, values = { 0, 0.333, 0.5, 0.9 }, read = function() return settings.map_ratio_w; end, store = function(value) settings.map_ratio_w = value; settings.map_ratio_h = value; end }, -- Player Player1 = { type = MenuC.type.list, caption = "Player 1", labels = { "Human", "Computer", "None" }, values = { 0, 1, 2 }, read = function() return settings.ai_player1; end, store = function(value) settings.ai_player1 = value; c_resetGame(); end }, Player2 = { type = MenuC.type.list, caption = "Player 2", labels = { "Human", "Computer", "None" }, values = { 0, 1, 2 }, read = function() return settings.ai_player2; end, store = function(value) settings.ai_player2 = value; c_resetGame(); end }, Player3 = { type = MenuC.type.list, caption = "Player 3", labels = { "Human", "Computer", "None" }, values = { 0, 1, 2 }, read = function() return settings.ai_player3; end, store = function(value) settings.ai_player3 = value; c_resetGame(); end }, Player4 = { type = MenuC.type.list, caption = "Player 4", labels = { "Human", "Computer", "None" }, values = { 0, 1, 2 }, read = function() return settings.ai_player4; end, store = function(value) settings.ai_player4 = value; c_resetGame(); end }, -- PlayerX_Key Player1_Left = { type = MenuC.type.key, caption = "Turn Left", player = 1, event = "left" }, Player1_Right = { type = MenuC.type.key, caption = "Turn Right", player = 1, event = "right" }, Player1_GlanceLeft = { type = MenuC.type.key, caption = "Glance Left", player = 1, event = "glance_left" }, Player1_GlanceRight = { type = MenuC.type.key, caption = "Glance Right", player = 1, event = "glance_right" }, Player1_Booster = { type = MenuC.type.key, caption = "Booster", player = 1, event = "boost" }, Player2_Left = { type = MenuC.type.key, caption = "Turn Left", player = 2, event = "left" }, Player2_Right = { type = MenuC.type.key, caption = "Turn Right", player = 2, event = "right" }, Player2_GlanceLeft = { type = MenuC.type.key, caption = "Glance Left", player = 2, event = "glance_left" }, Player2_GlanceRight = { type = MenuC.type.key, caption = "Glance Right", player = 2, event = "glance_right" }, Player2_Booster = { type = MenuC.type.key, caption = "Booster", player = 2, event = "boost" }, Player3_Left = { type = MenuC.type.key, caption = "Turn Left", player = 3, event = "left" }, Player3_Right = { type = MenuC.type.key, caption = "Turn Right", player = 3, event = "right" }, Player3_GlanceLeft = { type = MenuC.type.key, caption = "Glance Left", player = 3, event = "glance_left" }, Player3_GlanceRight = { type = MenuC.type.key, caption = "Glance Right", player = 3, event = "glance_right" }, Player3_Booster = { type = MenuC.type.key, caption = "Booster", player = 3, event = "boost" }, Player4_Left = { type = MenuC.type.key, caption = "Turn Left", player = 4, event = "left" }, Player4_Right = { type = MenuC.type.key, caption = "Turn Right", player = 4, event = "right" }, Player4_GlanceLeft = { type = MenuC.type.key, caption = "Glance Left", player = 4, event = "glance_left" }, Player4_GlanceRight = { type = MenuC.type.key, caption = "Glance Right", player = 4, event = "glance_right" }, Player4_Booster = { type = MenuC.type.key, caption = "Booster", player = 4, event = "boost" }, -- Joystick Joy_Threshold = { type = MenuC.type.slider, caption = "Threshold", right = JoyThresholdUp, left = JoyThresholdDown, read = function() return format("%.0f%%", settings.joy_threshold * 100); end }, -- TODO: fill in the rest of the items -- Video Artpack = { type = MenuC.type.slider, caption = "Artpack", right = nextArtpack, left = previousArtpack, action = nextArtpack, read = function() return settings.current_artpack; end }, -- Details Filtering = { type = MenuC.type.list, caption = "Mipmap filter", labels = { "nearest", "linear", "mipmap", "trilinear" }, values = { 0, 1, 2, 3 }, read = function() return settings.mipmap_filter; end, store = function(value) settings.mipmap_filter = value c_reloadArtpack() end }, AlphaTrails = { type = MenuC.type.list, caption = "Transparent trails", labels = { "off", "on" }, values = { 0, 1 }, read = function() return settings.alpha_trails; end, store = function(value) settings.alpha_trails = value; end }, Halos = { type = MenuC.type.list, caption = "Halos", labels = { "off", "on" }, values = { 0, 1 }, read = function() return settings.show_glow; end, store = function(value) settings.show_glow = value; end }, Lightcycles = { type = MenuC.type.list, caption = "Lightcycles", labels = { "off", "on" }, values = { 0, 1 }, read = function() return settings.show_model; end, store = function(value) settings.show_model = value; end }, Recognizer = { type = MenuC.type.list, caption = "Recognizers", labels = { "off", "on" }, values = { 0, 1 }, read = function() return settings.show_recognizer; end, store = function(value) settings.show_recognizer = value; end }, Lod = { type = MenuC.type.list, caption = "Cycle Detail", labels = { "ugly", "low", "high", "ultra-high" }, values = { 3, 2, 1, 0 }, read = function() return settings.lod; end, store = function(value) settings.lod = value; end }, ShadowStyle = { type = MenuC.type.list, caption = "Shadow Type", labels = { "stencil", "normal" }, values = { 1, 0 }, read = function() return settings.use_stencil; end, store = function(value) settings.use_stencil = value; c_video_restart(); end }, -- Status Display FPS_Counter = { type = MenuC.type.list, caption = "FPS counter", labels = { "off", "on" }, values = { 0, 1 }, read = function() return settings.show_fps; end, store = function(value) settings.show_fps = value; end }, AI_Status = { type = MenuC.type.list, caption = "AI status", labels = { "off", "on" }, values = { 0, 1 }, read = function() return settings.show_ai_status; end, store = function(value) settings.show_ai_status = value; end }, Scores = { type = MenuC.type.list, caption = "Scores", labels = { "off", "on" }, values = { 0, 1 }, read = function() return settings.show_scores; end, store = function(value) settings.show_scores = value; end }, -- Screen _320x240 = { type = MenuC.type.action, caption = "320 x 240", action = function() settings.width = 320; settings.height = 240; c_video_restart(); end }, _512x384 = { type = MenuC.type.action, caption = "512 x 384", action = function() settings.width = 512; settings.height = 384; c_video_restart(); end }, _640x480 = { type = MenuC.type.action, caption = "640 x 480", action = function() settings.width = 640; settings.height = 480; c_video_restart(); end }, _800x600 = { type = MenuC.type.action, caption = "800 x 600", action = function() settings.width = 800; settings.height = 600; c_video_restart(); end }, _1024x768 = { type = MenuC.type.action, caption = "1024 x 768", action = function() settings.width = 1024; settings.height = 768; c_video_restart(); end }, _1280x1024 = { type = MenuC.type.action, caption = "1280 x 1024", action = function() settings.width = 1280; settings.height = 1024; c_video_restart(); end }, _1600x1200 = { type = MenuC.type.action, caption = "1600 x 1200", action = function() settings.width = 1600; settings.height = 1200; c_video_restart(); end }, WindowMode = { type = MenuC.type.list, caption = "Windowed", labels = { "off", "on" }, values = { 0, 1 }, read = function() return settings.windowMode; end, store = function(value) settings.windowMode = value; c_video_restart(); end }, TimeDemo = { type = MenuC.type.action, caption = "Time Demo", action = function() c_timedemo(); end }, -- Audio Music = { type = MenuC.type.list, caption = "Music", labels = { "off", "on" }, read = function() return settings.playMusic; end, values = { 0, 1 }, store = function(value) settings.playMusic = value; c_update_settings_cache() ; end }, FX = { type = MenuC.type.list, caption = "Sound FX", labels = { "off", "on" }, values = { 0, 1 }, read = function() return settings.playEffects; end, store = function(value) settings.playEffects = value; end }, Music_Volume = { type = MenuC.type.slider, caption = "Music Volume", right = function() MusicVolumeUp(); end, left = function() MusicVolumeDown(); end, read = function() return format("%.0f%%", settings.musicVolume * 100); end }, FX_Volume = { type = MenuC.type.slider, caption = "FX Volume", right = function() FXVolumeUp(); end, left = function() FXVolumeDown(); end, read = function() return format("%.0f%%", settings.fxVolume * 100); end }, Song = { type = MenuC.type.slider, caption = "Song", right = function() nextTrack(); end, left = function() previousTrack(); end, action = function() nextTrack(); end, read = function() _,_,name = strfind(settings.current_track, "(.*)%..+") if name then return name else return settings.current_track end end } } Menu.SetParent = function ( menu ) -- script_print("processing menu '" .. menu .. "'") local _,entry for _,entry in Menu[menu].items do if Menu[entry] == nil then script_print("menu '" .. entry .. "' does not exist") else Menu[entry].parent = menu -- script_print("processing item '" .. entry .. "'") if Menu[entry].type == MenuC.type.menu then Menu.SetParent( entry ) end end end end Menu.SetNames = function () local name,v for name,v in Menu do if type(v) == "table" then v.name = name end end end Menu.GotoParent = function () Menu.current = Menu[Menu.current].parent Menu.active = 1 end Menu.Action = function () local menu = Menu[Menu.current].items[Menu.active] local type = Menu[ menu ].type script_print("calling action of '" .. menu .. "', type " .. type ) MenuAction[ type ]( menu ) end Menu.Left = function () local menu = Menu[Menu.current].items[Menu.active] local type = Menu[ menu ].type if type == MenuC.type.slider then script_print("calling left of '" .. menu .. "'") Menu[ menu ].left() else -- script_print("calling action of '" .. menu .. "', type " .. type ) -- MenuAction[ type ]( menu ) end end Menu.Right = function () local menu = Menu[Menu.current].items[Menu.active] local type = Menu[ menu ].type if type == MenuC.type.slider then script_print("calling right of '" .. menu .. "'") Menu[ menu ].right() else -- script_print("calling action of '" .. menu .. "', type " .. type ) -- MenuAction[ type ]( menu ) end end Menu.Next = function () if Menu.active < getn(Menu[Menu.current].items) then Menu.active = Menu.active + 1 else Menu.active = 1 end end Menu.Previous = function () if Menu.active > 1 then Menu.active = Menu.active - 1 else Menu.active = getn(Menu[Menu.current].items) end end -- Menu entries Menu.RootMenu.items = { "GameMenu", "VideoMenu", "AudioMenu", "Quit" } Menu.GameMenu.items = { "StartGame", "ResetScores", "GameRulesMenu", "GameSettingsMenu", "PlayerConfigMenu", "KeyConfigMenu", "JoyConfigMenu" } Menu.GameRulesMenu.items = { "GameType", "GameSpeed", "BotSkill", "ArenaSize", "EraseDeadPlayers" } Menu.GameSettingsMenu.items = { "FastFinish", "CameraMode", "Viewports", "Map" } Menu.PlayerConfigMenu.items = { "Player1", "Player2", "Player3", "Player4" } Menu.KeyConfigMenu.items = { "Player1_KeyMenu", "Player2_KeyMenu", "Player3_KeyMenu", "Player4_KeyMenu" } Menu.JoyConfigMenu.items = { "Joy_Threshold" } Menu.Player1_KeyMenu.items = { "Player1_Left", "Player1_Right", "Player1_GlanceLeft", "Player1_GlanceRight", "Player1_Booster", } Menu.Player2_KeyMenu.items = { "Player2_Left", "Player2_Right", "Player2_GlanceLeft", "Player2_GlanceRight", "Player2_Booster", } Menu.Player3_KeyMenu.items = { "Player3_Left", "Player3_Right", "Player3_GlanceLeft", "Player3_GlanceRight", "Player3_Booster", } Menu.Player4_KeyMenu.items = { "Player4_Left", "Player4_Right", "Player4_GlanceLeft", "Player4_GlanceRight", "Player4_Booster", } Menu.VideoMenu.items = { "Artpack", "DetailsMenu", "ScreenMenu" --, "TimeDemo" } Menu.DetailsMenu.items = { "Filtering", "AlphaTrails", "Halos", -- "Lightcycles", "Recognizer", "Lod", "ShadowStyle", "FPS_Counter", "AI_Status", "Scores" } Menu.ScreenMenu.items = { "_320x240", "_512x384", "_640x480", "_800x600", "_1024x768", "_1280x1024", "_1600x1200", "WindowMode" } Menu.AudioMenu.items = { "Music", "FX", "Music_Volume", "FX_Volume", "Song" } -- initialization code Menu.SetNames() Menu.SetParent( "RootMenu" ) gltron-0.70/scripts/basics.lua0000644000076400001440000000016407446571056012103 function script_print(...) write("[script] ") for i=1,arg.n do write(arg[i]) end write("\n") end gltron-0.70/scripts/menu_functions.lua0000644000076400001440000000413007665574214013672 GetMenuValue = {} MenuAction = {} GetMenuValue[ MenuC.type.menu ] = function ( menu ) -- return "(menu)" return "" end MenuAction[ MenuC.type.menu ] = function ( menu ) Menu.current = menu Menu.active = 1 end GetMenuValue[ MenuC.type.list ] = function ( menu ) local value if Menu[menu].read then value = Menu[menu].read() end if not value then value = "undef" end -- script_print(menu .. " --> " .. value ) local i for i=1,getn(Menu[menu].values) do if Menu[menu].values[i] == value then return Menu[menu].labels[i] end end return "unknown (" .. value .. ")" end MenuAction[ MenuC.type.list ] = function ( menu ) local value if Menu[menu].read then value = Menu[menu].read() else value = "undef" end local nValues = getn(Menu[menu].values) local i for i=1,nValues do if Menu[menu].values[i] == value then if i < nValues then value = Menu[menu].values[i + 1] else value = Menu[menu].values[1] end return Menu[menu].store( value ) end end return Menu[menu].store( Menu[menu].values[1] ) end MenuAction[ MenuC.type.action ] = function ( menu ) Menu[menu].action() end GetMenuValue[ MenuC.type.slider ] = function ( menu ) return Menu[menu].read() end MenuAction[ MenuC.type.slider ] = function( menu ) if Menu[menu].action then Menu[menu].action() end end MenuAction[ MenuC.type.key ] = function ( menu ) local player = Menu[menu].player local event = Menu[menu].event configure_player = player configure_event = event c_configureKeyboard() end GetMenuValue[ MenuC.type.key ] = function ( menu ) local player = Menu[menu].player local event = Menu[menu].event return c_getKeyName( settings.keys[ player ][ event ] ) end GetMenuValue[ MenuC.type.action ] = function ( menu ) -- return "(action)" return "" end GetMenuValueWidth = function ( menu ) return strlen( GetMenuValue[ Menu[menu].type ]( menu ) ) end GetMenuValueString = function ( menu ) -- write(format("GetMenuValueString: '%s'\n", menu)); return GetMenuValue[ Menu[menu].type ]( menu ) end gltron-0.70/scripts/audio.lua0000644000076400001440000000276107664103411011731 function setupSoundTrack() local i,name for i,name in tracks do print("[scripting audio] found track '", name, "'") if name == settings.current_track then current_track_index = i return end end settings.current_track = tracks[1] current_track_index = 1 end function nextTrack() if current_track_index < getn(tracks) then current_track_index = current_track_index + 1 else current_track_index = 1 end settings.current_track = tracks[ current_track_index ] c_reloadTrack() end function previousTrack() if current_track_index > 1 then current_track_index = current_track_index - 1 else current_track_index = getn(tracks) end settings.current_track = tracks[ current_track_index ] c_reloadTrack() end function MusicVolumeUp() settings.musicVolume = settings.musicVolume + 0.05 if settings.musicVolume > 1.0 then settings.musicVolume = 1.0 end c_update_audio_volume() end function MusicVolumeDown() settings.musicVolume = settings.musicVolume - 0.05 if settings.musicVolume < 0.0 then settings.musicVolume = 0.0 end c_update_audio_volume() end function FXVolumeUp() settings.fxVolume = settings.fxVolume + 0.05 if settings.fxVolume > 1.0 then settings.fxVolume = 1.0 end c_update_audio_volume() end function FXVolumeDown() settings.fxVolume = settings.fxVolume - 0.05 if settings.fxVolume < 0.0 then settings.fxVolume = 0.0 end c_update_audio_volume() end gltron-0.70/scripts/video.lua0000644000076400001440000000150707453610015011732 -- very similiar to setupSoundTracks() in audio.lua function setupArtpacks() local i,name for i,name in artpacks do if name == settings.current_artpack then current_artpack_index = i return end end settings.current_artpack = artpacks[1] current_artpack_index = 1 end function nextArtpack() if current_artpack_index < getn(artpacks) then current_artpack_index = current_artpack_index + 1 else current_artpack_index = 1 end settings.current_artpack = artpacks[ current_artpack_index ] c_reloadArtpack() end function previousArtpack() if current_artpack_index > 1 then current_artpack_index = current_artpack_index - 1 else current_artpack_index = getn(artpacks) end settings.current_artpack = artpacks[ current_artpack_index ] c_reloadArtpack() end gltron-0.70/scripts/joystick.lua0000644000076400001440000000053107605651062012465 function JoyThresholdUp() settings.joy_threshold = settings.joy_threshold + 0.05 if settings.joy_threshold > 0.95 then settings.joy_threshold = 0.95 end end function JoyThresholdDown() settings.joy_threshold = settings.joy_threshold - 0.05 if settings.joy_threshold < 0.0 then settings.joy_threshold = 0.0 end end gltron-0.70/scripts/main.lua0000644000076400001440000000274407766632325011573 -- loop until RETURN_QUIT code is sent RETURN_GAME_LAUNCH = 0 RETURN_GAME_END = 1 RETURN_GAME_PAUSE = 2 RETURN_GAME_UNPAUSE = 3 RETURN_GAME_CREDITS = 4 RETURN_GAME_ESCAPE = 5 RETURN_GUI_PROMPT = 6 RETURN_TIMEDEMO = 7 RETURN_TIMEDEMO_ABORT = 8 RETURN_CREDITS = 9 RETURN_QUIT = 10 RETURN_GUI_ESCAPE = 11 RETURN_PROMPT_ESCAPE = 12 RETURN_PAUSE_ESCAPE = 13 -- enable below to run in timedemo-only mode if(nil) then SetCallback("timedemo") SystemMainLoop() exit() end callback = "gui" next_callback = {} next_callback[ RETURN_GAME_LAUNCH ] = "pause" next_callback[ RETURN_GAME_END ] = "pause" next_callback[ RETURN_GAME_PAUSE ] = "pause" next_callback[ RETURN_GAME_UNPAUSE ] = "game" next_callback[ RETURN_CREDITS ] = "credits" next_callback[ RETURN_GAME_CREDITS ] = "credits" next_callback[ RETURN_GAME_ESCAPE ] = "gui" next_callback[ RETURN_GUI_ESCAPE ] = "pause" next_callback[ RETURN_PROMPT_ESCAPE ] = "gui" next_callback[ RETURN_PAUSE_ESCAPE ] = "gui" next_callback[ RETURN_GUI_PROMPT ] = "configure" next_callback[ RETURN_TIMEDEMO ] = nil next_callback[ RETURN_TIMEDEMO_ABORT ] = nil next_callback[ RETURN_QUIT ] = nil while 1 do SetCallback(callback) -- write(format("[lua] setting callback '%s'\n", callback)) status = SystemMainLoop() -- write(format("[lua] system returned (%d)\n", status)) if(next_callback[ status ]) then callback = next_callback[ status ] else if(status == 10) then write(format("[lua] unhandled callback (%d)\n", status)) exit() end end end gltron-0.70/scripts/artpack.lua0000644000076400001440000000172707766301732012267 -- menu colors menu_item = { 1, 1, 1, 1 } menu_item_active1 = { .5, 1, 0, 1 } menu_item_active2 = { 1, 0, 0, 1 } -- texture settings video.settings.show_floor_texture = 1 video.settings.show_wall = 1 video.settings.show_crash_texture = 1 video.settings.show_skybox = 1 video.settings.show_decals = 1 video.settings.stretch_textures = 1 -- lightcycle colors model_diffuse_0 = { 1.000, 0.550, 0.140, 1.000 } model_diffuse_1 = { 0.750, 0.020, 0.020, 1.000 } model_diffuse_2 = { 0.120, 0.520, 0.600, 1.000 } model_diffuse_3 = { 0.800, 0.800, 0.800, 1.000 } model_specular_0 = { 0.500, 0.500, 0.000, 1.000 } model_specular_1 = { 0.750, 0.020, 0.020, 1.000 } model_specular_2 = { 0.120, 0.520, 0.600, 1.000 } model_specular_3 = { 1.000, 1.000, 1.000, 1.000 } trail_diffuse_0 = { 1.000, 0.850, 0.140, 0.600 } trail_diffuse_1 = { 0.750, 0.020, 0.020, 0.600 } trail_diffuse_2 = { 0.120, 0.520, 0.600, 0.600 } trail_diffuse_3 = { 0.700, 0.700, 0.700, 0.600 } clear_color = { 0, 0, 0, 0 } gltron-0.70/scripts/Makefile.am0000644000076400001440000000025707675153322012167 dist_pkgdata_DATA = config.lua save.lua menu.lua basics.lua menu_functions.lua audio.lua video.lua joystick.lua main.lua artpack.lua pkgdatadir = @datadir@/@PACKAGE@/scripts gltron-0.70/scripts/Makefile.in0000644000076400001440000001337307767023246012206 # Makefile.in generated automatically by automake 1.5 from Makefile.am. # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_HEADER = $(INSTALL_DATA) transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : host_alias = @host_alias@ host_triplet = @host@ AMTAR = @AMTAR@ AWK = @AWK@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ DEPDIR = @DEPDIR@ EXEEXT = @EXEEXT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ NETWORK_OBJS = @NETWORK_OBJS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SOUND_OBJS = @SOUND_OBJS@ VERSION = @VERSION@ am__include = @am__include@ am__quote = @am__quote@ install_sh = @install_sh@ pkgdatadir = @datadir@/@PACKAGE@/scripts dist_pkgdata_DATA = config.lua save.lua menu.lua basics.lua menu_functions.lua audio.lua video.lua joystick.lua main.lua artpack.lua subdir = scripts mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_SOURCES = DATA = $(dist_pkgdata_DATA) DIST_COMMON = $(dist_pkgdata_DATA) Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign scripts/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && \ CONFIG_HEADERS= CONFIG_LINKS= \ CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status uninstall-info-am: install-dist_pkgdataDATA: $(dist_pkgdata_DATA) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f"; \ $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgdatadir)/$$f; \ done uninstall-dist_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " rm -f $(DESTDIR)$(pkgdatadir)/$$f"; \ rm -f $(DESTDIR)$(pkgdatadir)/$$f; \ done tags: TAGS TAGS: DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = .. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ $(mkinstalldirs) "$(distdir)/$$dir"; \ fi; \ if test -d $$d/$$file; then \ cp -pR $$d/$$file $(distdir) \ || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-dist_pkgdataDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic uninstall-am: uninstall-dist_pkgdataDATA uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am info info-am install \ install-am install-data install-data-am \ install-dist_pkgdataDATA install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ uninstall uninstall-am uninstall-dist_pkgdataDATA \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: